pillow-2.3.0/0000755000175000001440000000000012274164154011703 5ustar dokouserspillow-2.3.0/README.rst0000644000175000001440000000131612257506326013375 0ustar dokousersPillow ====== *Python Imaging Library (Fork)* Pillow is the "friendly" PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow .. image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version .. image:: https://pypip.in/d/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Number of PyPI downloads The documentation is hosted at http://pillow.readthedocs.org/. It contains installation instructions, tutorials, reference, compatibility details, and more. pillow-2.3.0/outline.c0000644000175000001440000001116212257506326013531 0ustar dokousers/* * THIS IS WORK IN PROGRESS. * * The Python Imaging Library. * * "arrow" outline stuff. the contents of this module * will be merged with the path module and the rest of * the arrow graphics package, but not before PIL 1.1. * use at your own risk. * * history: * 99-01-10 fl Added to PIL (experimental) * * Copyright (c) Secret Labs AB 1999. * Copyright (c) Fredrik Lundh 1999. * * See the README file for information on usage and redistribution. */ #include "Python.h" #include "Imaging.h" /* -------------------------------------------------------------------- */ /* Class */ typedef struct { PyObject_HEAD ImagingOutline outline; } OutlineObject; static PyTypeObject OutlineType; #define PyOutline_Check(op) (Py_TYPE(op) == &OutlineType) static OutlineObject* _outline_new(void) { OutlineObject *self; if (PyType_Ready(&OutlineType) < 0) return NULL; self = PyObject_New(OutlineObject, &OutlineType); if (self == NULL) return NULL; self->outline = ImagingOutlineNew(); return self; } static void _outline_dealloc(OutlineObject* self) { ImagingOutlineDelete(self->outline); PyObject_Del(self); } ImagingOutline PyOutline_AsOutline(PyObject* outline) { if (PyOutline_Check(outline)) return ((OutlineObject*) outline)->outline; return NULL; } /* -------------------------------------------------------------------- */ /* Factories */ PyObject* PyOutline_Create(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":outline")) return NULL; return (PyObject*) _outline_new(); } /* -------------------------------------------------------------------- */ /* Methods */ static PyObject* _outline_move(OutlineObject* self, PyObject* args) { float x0, y0; if (!PyArg_ParseTuple(args, "ff", &x0, &y0)) return NULL; ImagingOutlineMove(self->outline, x0, y0); Py_INCREF(Py_None); return Py_None; } static PyObject* _outline_line(OutlineObject* self, PyObject* args) { float x1, y1; if (!PyArg_ParseTuple(args, "ff", &x1, &y1)) return NULL; ImagingOutlineLine(self->outline, x1, y1); Py_INCREF(Py_None); return Py_None; } static PyObject* _outline_curve(OutlineObject* self, PyObject* args) { float x1, y1, x2, y2, x3, y3; if (!PyArg_ParseTuple(args, "ffffff", &x1, &y1, &x2, &y2, &x3, &y3)) return NULL; ImagingOutlineCurve(self->outline, x1, y1, x2, y2, x3, y3); Py_INCREF(Py_None); return Py_None; } static PyObject* _outline_close(OutlineObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":close")) return NULL; ImagingOutlineClose(self->outline); Py_INCREF(Py_None); return Py_None; } static PyObject* _outline_transform(OutlineObject* self, PyObject* args) { double a[6]; if (!PyArg_ParseTuple(args, "(dddddd)", a+0, a+1, a+2, a+3, a+4, a+5)) return NULL; ImagingOutlineTransform(self->outline, a); Py_INCREF(Py_None); return Py_None; } static struct PyMethodDef _outline_methods[] = { {"line", (PyCFunction)_outline_line, 1}, {"curve", (PyCFunction)_outline_curve, 1}, {"move", (PyCFunction)_outline_move, 1}, {"close", (PyCFunction)_outline_close, 1}, {"transform", (PyCFunction)_outline_transform, 1}, {NULL, NULL} /* sentinel */ }; static PyTypeObject OutlineType = { PyVarObject_HEAD_INIT(NULL, 0) "Outline", /*tp_name*/ sizeof(OutlineObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_outline_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ _outline_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; pillow-2.3.0/docs/0000755000175000001440000000000012274164154012633 5ustar dokouserspillow-2.3.0/docs/LICENSE0000644000175000001440000000237712257506326013653 0ustar dokousersThe Python Imaging Library (PIL) is Copyright © 1997-2011 by Secret Labs AB Copyright © 1995-2011 by Fredrik Lundh By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. pillow-2.3.0/docs/guides.rst0000644000175000001440000000020012257506326014637 0ustar dokousersGuides ====== .. toctree:: :maxdepth: 2 handbook/overview handbook/tutorial handbook/concepts porting-pil-to-pillow pillow-2.3.0/docs/PIL.rst0000644000175000001440000000611312257506326014014 0ustar dokousersPIL Package (autodoc of remaining modules) ========================================== Reference for modules whose documentation has not yet been ported or written can be found here. :mod:`BdfFontFile` Module ------------------------- .. automodule:: PIL.BdfFontFile :members: :undoc-members: :show-inheritance: :mod:`ContainerIO` Module ------------------------- .. automodule:: PIL.ContainerIO :members: :undoc-members: :show-inheritance: :mod:`ExifTags` Module ---------------------- .. automodule:: PIL.ExifTags :members: :undoc-members: :show-inheritance: :mod:`FontFile` Module ---------------------- .. automodule:: PIL.FontFile :members: :undoc-members: :show-inheritance: :mod:`GdImageFile` Module ------------------------- .. automodule:: PIL.GdImageFile :members: :undoc-members: :show-inheritance: :mod:`GimpGradientFile` Module ------------------------------ .. automodule:: PIL.GimpGradientFile :members: :undoc-members: :show-inheritance: :mod:`GimpPaletteFile` Module ----------------------------- .. automodule:: PIL.GimpPaletteFile :members: :undoc-members: :show-inheritance: :mod:`ImageCms` Module ---------------------- .. automodule:: PIL.ImageCms :members: :undoc-members: :show-inheritance: .. intentionally skipped documenting this because it's not documented anywhere :mod:`ImageDraw2` Module ------------------------ .. automodule:: PIL.ImageDraw2 :members: :undoc-members: :show-inheritance: .. intentionally skipped documenting this because it's deprecated :mod:`ImageFileIO` Module ------------------------- .. automodule:: PIL.ImageFileIO :members: :undoc-members: :show-inheritance: :mod:`ImageShow` Module ----------------------- .. automodule:: PIL.ImageShow :members: :undoc-members: :show-inheritance: :mod:`ImageTransform` Module ---------------------------- .. automodule:: PIL.ImageTransform :members: :undoc-members: :show-inheritance: :mod:`JpegPresets` Module ------------------------- .. automodule:: PIL.JpegPresets :members: :undoc-members: :show-inheritance: :mod:`OleFileIO` Module ----------------------- .. automodule:: PIL.OleFileIO :members: :undoc-members: :show-inheritance: :mod:`PaletteFile` Module ------------------------- .. automodule:: PIL.PaletteFile :members: :undoc-members: :show-inheritance: :mod:`PcfFontFile` Module ------------------------- .. automodule:: PIL.PcfFontFile :members: :undoc-members: :show-inheritance: :mod:`TarIO` Module ------------------- .. automodule:: PIL.TarIO :members: :undoc-members: :show-inheritance: :mod:`TiffTags` Module ---------------------- .. automodule:: PIL.TiffTags :members: :undoc-members: :show-inheritance: :mod:`WalImageFile` Module -------------------------- .. automodule:: PIL.WalImageFile :members: :undoc-members: :show-inheritance: :mod:`_binary` Module --------------------- .. automodule:: PIL._binary :members: :undoc-members: :show-inheritance: pillow-2.3.0/docs/COPYING0000644000175000001440000000236312257506326013674 0ustar dokousersThe Python Imaging Library is Copyright (c) 1997-2009 by Secret Labs AB Copyright (c) 1995-2009 by Fredrik Lundh By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.pillow-2.3.0/docs/_build/0000755000175000001440000000000012274164154014071 5ustar dokouserspillow-2.3.0/docs/_build/.gitignore0000644000175000001440000000010012257506326016052 0ustar dokousers# Empty file, to make the directory available in the repository pillow-2.3.0/docs/about.rst0000644000175000001440000000326512257506326014507 0ustar dokousersAbout Pillow ============ Goals ----- The fork authors' goal is to foster active development of PIL through: - Continuous integration testing via `Travis CI`_ - Publicized development activity on `GitHub`_ - Regular releases to the `Python Package Index`_ - Solicitation for community contributions and involvement on `Image-SIG`_ .. _Travis CI: https://travis-ci.org/python-imaging/Pillow .. _GitHub: https://github.com/python-imaging/Pillow .. _Python Package Index: https://pypi.python.org/pypi/Pillow .. _Image-SIG: http://mail.python.org/mailman/listinfo/image-sig Why a fork? ----------- PIL is not setuptools compatible. Please see `this Image-SIG post`_ for a more detailed explanation. Also, PIL's current bi-yearly (or greater) release schedule is too infrequent to accomodate the large number and frequency of issues reported. .. _this Image-SIG post: https://mail.python.org/pipermail/image-sig/2010-August/006480.html What about the official PIL? ---------------------------- .. note:: Prior to Pillow 2.0.0, very few image code changes were made. Pillow 2.0.0 added Python 3 support and includes many bug fixes from many contributors. As more time passes since the last PIL release, the likelyhood of a new PIL release decreases. However, we've yet to hear an official "PIL is dead" announcement. So if you still want to support PIL, please `report issues here first`_, then `open the corresponding Pillow tickets here`_. .. _report issues here first: https://bitbucket.org/effbot/pil-2009-raclette/issues .. _open the corresponding Pillow tickets here: https://github.com/python-imaging/Pillow/issues Please provide a link to the PIL ticket so we can track the issue(s) upstream. pillow-2.3.0/docs/index.rst0000644000175000001440000000414712261036742014477 0ustar dokousersPillow: a modern fork of PIL ============================ Pillow is the "friendly" PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow .. image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version .. image:: https://pypip.in/d/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Number of PyPI downloads To start using Pillow, read the :doc:`installation instructions `. If you can't find the information you need, try the old `PIL Handbook`_, but be aware that it was last updated for PIL 1.1.5. You can download archives and old versions from `PyPI `_. You can get the source and contribute at https://github.com/python-imaging/Pillow. .. _PIL Handbook: http://effbot.org/imagingbook/pil-index.htm .. toctree:: :maxdepth: 2 installation about guides reference/index.rst handbook/appendices original-readme Support Pillow! =============== PIL needs you! Please help us maintain the Python Imaging Library here: - `GitHub `_ - `Freenode `_ - `Image-SIG `_ Financial --------- Pillow is a volunteer effort led by Alex Clark. If you can't help with development please consider helping us financially. Your assistance would be very much appreciated! .. note:: Contributors please add your name and donation preference here. ======================================= ======================================= **Developer** **Preference** ======================================= ======================================= Alex Clark (fork author) http://gittip.com/aclark4life ======================================= ======================================= Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` pillow-2.3.0/docs/porting-pil-to-pillow.rst0000644000175000001440000000135012257506326017556 0ustar dokousersPorting existing PIL-based code to Pillow ========================================= Pillow is a functional drop-in replacement for the Python Imaging Library. To run your existing PIL-compatible code with Pillow, it needs to be modified to import the ``Imaging`` module from the ``PIL`` namespace *instead* of the global namespace. Change this:: import Image to this:: from PIL import Image The :py:mod:`_imaging` module has been moved. You can now import it like this:: from PIL.Image import core as _imaging The image plugin loading mechanisim has changed. Pillow no longer automatically imports any file in the Python path with a name ending in :file:`ImagePlugin.py`. You will need to import your image plugin manually. pillow-2.3.0/docs/handbook/0000755000175000001440000000000012274164154014420 5ustar dokouserspillow-2.3.0/docs/handbook/tutorial.rst0000644000175000001440000003776012257506326017034 0ustar dokousersTutorial ======== Using the Image class --------------------- The most important class in the Python Imaging Library is the :py:class:`~PIL.Image.Image` class, defined in the module with the same name. You can create instances of this class in several ways; either by loading images from files, processing other images, or creating images from scratch. To load an image from a file, use the :py:func:`~PIL.Image.open` function in the :py:mod:`~PIL.Image` module:: >>> from PIL import Image >>> im = Image.open("lena.ppm") If successful, this function returns an :py:class:`~PIL.Image.Image` object. You can now use instance attributes to examine the file contents:: >>> from __future__ import print_function >>> print(im.format, im.size, im.mode) PPM (512, 512) RGB The :py:attr:`~PIL.Image.Image.format` attribute identifies the source of an image. If the image was not read from a file, it is set to None. The size attribute is a 2-tuple containing width and height (in pixels). The :py:attr:`~PIL.Image.Image.mode` attribute defines the number and names of the bands in the image, and also the pixel type and depth. Common modes are “L” (luminance) for greyscale images, “RGB” for true color images, and “CMYK” for pre-press images. If the file cannot be opened, an :py:exc:`IOError` exception is raised. Once you have an instance of the :py:class:`~PIL.Image.Image` class, you can use the methods defined by this class to process and manipulate the image. For example, let’s display the image we just loaded:: >>> im.show() .. note:: The standard version of :py:meth:`~PIL.Image.Image.show` is not very efficient, since it saves the image to a temporary file and calls the :command:`xv` utility to display the image. If you don’t have :command:`xv` installed, it won’t even work. When it does work though, it is very handy for debugging and tests. The following sections provide an overview of the different functions provided in this library. Reading and writing images -------------------------- The Python Imaging Library supports a wide variety of image file formats. To read files from disk, use the :py:func:`~PIL.Image.open` function in the :py:mod:`~PIL.Image` module. You don’t have to know the file format to open a file. The library automatically determines the format based on the contents of the file. To save a file, use the :py:meth:`~PIL.Image.Image.save` method of the :py:class:`~PIL.Image.Image` class. When saving files, the name becomes important. Unless you specify the format, the library uses the filename extension to discover which file storage format to use. Convert files to JPEG ^^^^^^^^^^^^^^^^^^^^^ :: from __future__ import print_function import os, sys from PIL import Image for infile in sys.argv[1:]: f, e = os.path.splitext(infile) outfile = f + ".jpg" if infile != outfile: try: Image.open(infile).save(outfile) except IOError: print("cannot convert", infile) A second argument can be supplied to the :py:meth:`~PIL.Image.Image.save` method which explicitly specifies a file format. If you use a non-standard extension, you must always specify the format this way: Create JPEG thumbnails ^^^^^^^^^^^^^^^^^^^^^^ :: from __future__ import print_function import os, sys from PIL import Image size = (128, 128) for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".thumbnail" if infile != outfile: try: im = Image.open(infile) im.thumbnail(size) im.save(outfile, "JPEG") except IOError: print("cannot create thumbnail for", infile) It is important to note that the library doesn’t decode or load the raster data unless it really has to. When you open a file, the file header is read to determine the file format and extract things like mode, size, and other properties required to decode the file, but the rest of the file is not processed until later. This means that opening an image file is a fast operation, which is independent of the file size and compression type. Here’s a simple script to quickly identify a set of image files: Identify Image Files ^^^^^^^^^^^^^^^^^^^^ :: from __future__ import print_function import sys from PIL import Image for infile in sys.argv[1:]: try: im = Image.open(infile) print(infile, im.format, "%dx%d" % im.size, im.mode) except IOError: pass Cutting, pasting, and merging images ------------------------------------ The :py:class:`~PIL.Image.Image` class contains methods allowing you to manipulate regions within an image. To extract a sub-rectangle from an image, use the :py:meth:`~PIL.Image.Image.crop` method. Copying a subrectangle from an image ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: box = (100, 100, 400, 400) region = im.crop(box) The region is defined by a 4-tuple, where coordinates are (left, upper, right, lower). The Python Imaging Library uses a coordinate system with (0, 0) in the upper left corner. Also note that coordinates refer to positions between the pixels, so the region in the above example is exactly 300x300 pixels. The region could now be processed in a certain manner and pasted back. Processing a subrectangle, and pasting it back ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: region = region.transpose(Image.ROTATE_180) im.paste(region, box) When pasting regions back, the size of the region must match the given region exactly. In addition, the region cannot extend outside the image. However, the modes of the original image and the region do not need to match. If they don’t, the region is automatically converted before being pasted (see the section on :ref:`color-transforms` below for details). Here’s an additional example: Rolling an image ^^^^^^^^^^^^^^^^ :: def roll(image, delta): "Roll an image sideways" xsize, ysize = image.size delta = delta % xsize if delta == 0: return image part1 = image.crop((0, 0, delta, ysize)) part2 = image.crop((delta, 0, xsize, ysize)) image.paste(part2, (0, 0, xsize-delta, ysize)) image.paste(part1, (xsize-delta, 0, xsize, ysize)) return image For more advanced tricks, the paste method can also take a transparency mask as an optional argument. In this mask, the value 255 indicates that the pasted image is opaque in that position (that is, the pasted image should be used as is). The value 0 means that the pasted image is completely transparent. Values in-between indicate different levels of transparency. The Python Imaging Library also allows you to work with the individual bands of an multi-band image, such as an RGB image. The split method creates a set of new images, each containing one band from the original multi-band image. The merge function takes a mode and a tuple of images, and combines them into a new image. The following sample swaps the three bands of an RGB image: Splitting and merging bands ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: r, g, b = im.split() im = Image.merge("RGB", (b, g, r)) Note that for a single-band image, :py:meth:`~PIL.Image.Image.split` returns the image itself. To work with individual color bands, you may want to convert the image to “RGB” first. Geometrical transforms ---------------------- The :py:class:`PIL.Image.Image` class contains methods to :py:meth:`~PIL.Image.Image.resize` and :py:meth:`~PIL.Image.Image.rotate` an image. The former takes a tuple giving the new size, the latter the angle in degrees counter-clockwise. Simple geometry transforms ^^^^^^^^^^^^^^^^^^^^^^^^^^ :: out = im.resize((128, 128)) out = im.rotate(45) # degrees counter-clockwise To rotate the image in 90 degree steps, you can either use the :py:meth:`~PIL.Image.Image.rotate` method or the :py:meth:`~PIL.Image.Image.transpose` method. The latter can also be used to flip an image around its horizontal or vertical axis. Transposing an image ^^^^^^^^^^^^^^^^^^^^ :: out = im.transpose(Image.FLIP_LEFT_RIGHT) out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.ROTATE_90) out = im.transpose(Image.ROTATE_180) out = im.transpose(Image.ROTATE_270) There’s no difference in performance or result between ``transpose(ROTATE)`` and corresponding :py:meth:`~PIL.Image.Image.rotate` operations. A more general form of image transformations can be carried out via the :py:meth:`~PIL.Image.Image.transform` method. .. _color-transforms: Color transforms ---------------- The Python Imaging Library allows you to convert images between different pixel representations using the :py:meth:`~PIL.Image.Image.convert` method. Converting between modes ^^^^^^^^^^^^^^^^^^^^^^^^ :: im = Image.open("lena.ppm").convert("L") The library supports transformations between each supported mode and the “L” and “RGB” modes. To convert between other modes, you may have to use an intermediate image (typically an “RGB” image). Image enhancement ----------------- The Python Imaging Library provides a number of methods and modules that can be used to enhance images. Filters ^^^^^^^ The :py:mod:`~PIL.ImageFilter` module contains a number of pre-defined enhancement filters that can be used with the :py:meth:`~PIL.Image.Image.filter` method. Applying filters ~~~~~~~~~~~~~~~~ :: from PIL import ImageFilter out = im.filter(ImageFilter.DETAIL) Point Operations ^^^^^^^^^^^^^^^^ The :py:meth:`~PIL.Image.Image.point` method can be used to translate the pixel values of an image (e.g. image contrast manipulation). In most cases, a function object expecting one argument can be passed to the this method. Each pixel is processed according to that function: Applying point transforms ~~~~~~~~~~~~~~~~~~~~~~~~~ :: # multiply each pixel by 1.2 out = im.point(lambda i: i * 1.2) Using the above technique, you can quickly apply any simple expression to an image. You can also combine the :py:meth:`~PIL.Image.Image.point` and :py:meth:`~PIL.Image.Image.paste` methods to selectively modify an image: Processing individual bands ~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: # split the image into individual bands source = im.split() R, G, B = 0, 1, 2 # select regions where red is less than 100 mask = source[R].point(lambda i: i < 100 and 255) # process the green band out = source[G].point(lambda i: i * 0.7) # paste the processed band back, but only where red was < 100 source[G].paste(out, None, mask) # build a new multiband image im = Image.merge(im.mode, source) Note the syntax used to create the mask:: imout = im.point(lambda i: expression and 255) Python only evaluates the portion of a logical expression as is necessary to determine the outcome, and returns the last value examined as the result of the expression. So if the expression above is false (0), Python does not look at the second operand, and thus returns 0. Otherwise, it returns 255. Enhancement ^^^^^^^^^^^ For more advanced image enhancement, you can use the classes in the :py:mod:`~PIL.ImageEnhance` module. Once created from an image, an enhancement object can be used to quickly try out different settings. You can adjust contrast, brightness, color balance and sharpness in this way. Enhancing images ~~~~~~~~~~~~~~~~ :: from PIL import ImageEnhance enh = ImageEnhance.Contrast(im) enh.enhance(1.3).show("30% more contrast") Image sequences --------------- The Python Imaging Library contains some basic support for image sequences (also called animation formats). Supported sequence formats include FLI/FLC, GIF, and a few experimental formats. TIFF files can also contain more than one frame. When you open a sequence file, PIL automatically loads the first frame in the sequence. You can use the seek and tell methods to move between different frames: Reading sequences ^^^^^^^^^^^^^^^^^ :: from PIL import Image im = Image.open("animation.gif") im.seek(1) # skip to the second frame try: while 1: im.seek(im.tell()+1) # do something to im except EOFError: pass # end of sequence As seen in this example, you’ll get an :py:exc:`EOFError` exception when the sequence ends. Note that most drivers in the current version of the library only allow you to seek to the next frame (as in the above example). To rewind the file, you may have to reopen it. The following iterator class lets you to use the for-statement to loop over the sequence: A sequence iterator class ^^^^^^^^^^^^^^^^^^^^^^^^^ :: class ImageSequence: def __init__(self, im): self.im = im def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError: raise IndexError # end of sequence for frame in ImageSequence(im): # ...do something to frame... Postscript printing ------------------- The Python Imaging Library includes functions to print images, text and graphics on Postscript printers. Here’s a simple example: Drawing Postscript ^^^^^^^^^^^^^^^^^^ :: from PIL import Image from PIL import PSDraw im = Image.open("lena.ppm") title = "lena" box = (1*72, 2*72, 7*72, 10*72) # in points ps = PSDraw.PSDraw() # default is sys.stdout ps.begin_document(title) # draw the image (75 dpi) ps.image(box, im, 75) ps.rectangle(box) # draw centered title ps.setfont("HelveticaNarrow-Bold", 36) w, h, b = ps.textsize(title) ps.text((4*72-w/2, 1*72-h), title) ps.end_document() More on reading images ---------------------- As described earlier, the :py:func:`~PIL.Image.open` function of the :py:mod:`~PIL.Image` module is used to open an image file. In most cases, you simply pass it the filename as an argument:: im = Image.open("lena.ppm") If everything goes well, the result is an :py:class:`PIL.Image.Image` object. Otherwise, an :exc:`IOError` exception is raised. You can use a file-like object instead of the filename. The object must implement :py:meth:`~file.read`, :py:meth:`~file.seek` and :py:meth:`~file.tell` methods, and be opened in binary mode. Reading from an open file ^^^^^^^^^^^^^^^^^^^^^^^^^ :: fp = open("lena.ppm", "rb") im = Image.open(fp) To read an image from string data, use the :py:class:`~StringIO.StringIO` class: Reading from a string ^^^^^^^^^^^^^^^^^^^^^ :: import StringIO im = Image.open(StringIO.StringIO(buffer)) Note that the library rewinds the file (using ``seek(0)``) before reading the image header. In addition, seek will also be used when the image data is read (by the load method). If the image file is embedded in a larger file, such as a tar file, you can use the :py:class:`~PIL.ContainerIO` or :py:class:`~PIL.TarIO` modules to access it. Reading from a tar archive ^^^^^^^^^^^^^^^^^^^^^^^^^^ :: from PIL import TarIO fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm") im = Image.open(fp) Controlling the decoder ----------------------- Some decoders allow you to manipulate the image while reading it from a file. This can often be used to speed up decoding when creating thumbnails (when speed is usually more important than quality) and printing to a monochrome laser printer (when only a greyscale version of the image is needed). The :py:meth:`~PIL.Image.Image.draft` method manipulates an opened but not yet loaded image so it as closely as possible matches the given mode and size. This is done by reconfiguring the image decoder. Reading in draft mode ^^^^^^^^^^^^^^^^^^^^^ :: from __future__ import print_function im = Image.open(file) print("original =", im.mode, im.size) im.draft("L", (100, 100)) print("draft =", im.mode, im.size) This prints something like:: original = RGB (512, 512) draft = L (128, 128) Note that the resulting image may not exactly match the requested mode and size. To make sure that the image is not larger than the given size, use the thumbnail method instead. pillow-2.3.0/docs/handbook/image-file-formats.rst0000644000175000001440000004114612257511054020624 0ustar dokousers.. _image-file-formats: Image file formats ================== The Python Imaging Library supports a wide variety of raster file formats. Nearly 30 different file formats can be identified and read by the library. Write support is less extensive, but most common interchange and presentation formats are supported. The :py:meth:`~PIL.Image.Image.open` function identifies files from their contents, not their names, but the :py:meth:`~PIL.Image.Image.save` method looks at the name to determine which format to use, unless the format is given explicitly. Fully supported formats ----------------------- BMP ^^^ PIL reads and writes Windows and OS/2 BMP files containing ``1``, ``L``, ``P``, or ``RGB`` data. 16-colour images are read as ``P`` images. Run-length encoding is not supported. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **compression** Set to ``bmp_rle`` if the file is run-length encoded. EPS ^^^ PIL identifies EPS files containing image data, and can read files that contain embedded raster images (ImageData descriptors). If Ghostscript is available, other EPS files can be read as well. The EPS driver can also write EPS images. If Ghostscript is available, you can call the :py:meth:`~PIL.Image.Image.load` method with the following parameter to affect how Ghostscript renders the EPS **scale** Affects the scale of the resultant rasterized image. If the EPS suggests that the image be rendered at 100px x 100px, setting this parameter to 2 will make the Ghostscript render a 200px x 200px image instead. The relative position of the bounding box is maintained:: im = Image.open(...) im.size #(100,100) im.load(scale=2) im.size #(200,200) GIF ^^^ PIL reads GIF87a and GIF89a versions of the GIF file format. The library writes run-length encoded GIF87a files. Note that GIF files are always read as grayscale (``L``) or palette mode (``P``) images. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **background** Default background color (a palette color index). **duration** Time between frames in an animation (in milliseconds). **transparency** Transparency color index. This key is omitted if the image is not transparent. **version** Version (either ``GIF87a`` or ``GIF89a``). Reading sequences ~~~~~~~~~~~~~~~~~ The GIF loader supports the :py:meth:`~file.seek` and :py:meth:`~file.tell` methods. You can seek to the next frame (``im.seek(im.tell() + 1``), or rewind the file by seeking to the first frame. Random access is not supported. Reading local images ~~~~~~~~~~~~~~~~~~~~ The GIF loader creates an image memory the same size as the GIF file’s *logical screen size*, and pastes the actual pixel data (the *local image*) into this image. If you only want the actual pixel rectangle, you can manipulate the :py:attr:`~PIL.Image.Image.size` and :py:attr:`~PIL.Image.Image.tile` attributes before loading the file:: im = Image.open(...) if im.tile[0][0] == "gif": # only read the first "local image" from this GIF file tag, (x0, y0, x1, y1), offset, extra = im.tile[0] im.size = (x1 - x0, y1 - y0) im.tile = [(tag, (0, 0) + im.size, offset, extra)] IM ^^ IM is a format used by LabEye and other applications based on the IFUNC image processing library. The library reads and writes most uncompressed interchange versions of this format. IM is the only format that can store all internal PIL formats. JPEG ^^^^ PIL reads JPEG, JFIF, and Adobe JPEG files containing ``L``, ``RGB``, or ``CMYK`` data. It writes standard and progressive JFIF files. Using the :py:meth:`~PIL.Image.Image.draft` method, you can speed things up by converting ``RGB`` images to ``L``, and resize images to 1/2, 1/4 or 1/8 of their original size while loading them. The :py:meth:`~PIL.Image.Image.draft` method also configures the JPEG decoder to trade some quality for speed. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **jfif** JFIF application marker found. If the file is not a JFIF file, this key is not present. **adobe** Adobe application marker found. If the file is not an Adobe JPEG file, this key is not present. **progression** Indicates that this is a progressive JPEG file. The :py:meth:`~PIL.Image.Image.save` method supports the following options: **quality** The image quality, on a scale from 1 (worst) to 95 (best). The default is 75. Values above 95 should be avoided; 100 disables portions of the JPEG compression algorithm, and results in large files with hardly any gain in = image quality. **optimize** If present, indicates that the encoder should make an extra pass over the image in order to select optimal encoder settings. **progressive** If present, indicates that this image should be stored as a progressive JPEG file. .. note:: To enable JPEG support, you need to build and install the IJG JPEG library before building the Python Imaging Library. See the distribution README for details. MSP ^^^ PIL identifies and reads MSP files from Windows 1 and 2. The library writes uncompressed (Windows 1) versions of this format. PCX ^^^ PIL reads and writes PCX files containing ``1``, ``L``, ``P``, or ``RGB`` data. PNG ^^^ PIL identifies, reads, and writes PNG files containing ``1``, ``L``, ``P``, ``RGB``, or ``RGBA`` data. Interlaced files are supported as of v1.1.7. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties, when appropriate: **gamma** Gamma, given as a floating point number. **transparency** Transparency color index. This key is omitted if the image is not a transparent palette image. The :py:meth:`~PIL.Image.Image.save` method supports the following options: **optimize** If present, instructs the PNG writer to make the output file as small as possible. This includes extra processing in order to find optimal encoder settings. **transparency** For ``P``, ``L``, and ``RGB`` images, this option controls what color image to mark as transparent. **bits (experimental)** For ``P`` images, this option controls how many bits to store. If omitted, the PNG writer uses 8 bits (256 colors). **dictionary (experimental)** Set the ZLIB encoder dictionary. .. note:: To enable PNG support, you need to build and install the ZLIB compression library before building the Python Imaging Library. See the distribution README for details. PPM ^^^ PIL reads and writes PBM, PGM and PPM files containing ``1``, ``L`` or ``RGB`` data. SPIDER ^^^^^^ PIL reads and writes SPIDER image files of 32-bit floating point data ("F;32F"). PIL also reads SPIDER stack files containing sequences of SPIDER images. The :py:meth:`~file.seek` and :py:meth:`~file.tell` methods are supported, and random access is allowed. The :py:meth:`~PIL.Image.Image.open` method sets the following attributes: **format** Set to ``SPIDER`` **istack** Set to 1 if the file is an image stack, else 0. **nimages** Set to the number of images in the stack. A convenience method, :py:meth:`~PIL.Image.Image.convert2byte`, is provided for converting floating point data to byte data (mode ``L``):: im = Image.open('image001.spi').convert2byte() Writing files in SPIDER format ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The extension of SPIDER files may be any 3 alphanumeric characters. Therefore the output format must be specified explicitly:: im.save('newimage.spi', format='SPIDER') For more information about the SPIDER image processing package, see the `SPIDER home page`_ at `Wadsworth Center`_. .. _SPIDER home page: http://www.wadsworth.org/spider_doc/spider/docs/master.html .. _Wadsworth Center: http://www.wadsworth.org/ TIFF ^^^^ PIL reads and writes TIFF files. It can read both striped and tiled images, pixel and plane interleaved multi-band images, and either uncompressed, or Packbits, LZW, or JPEG compressed images. If you have libtiff and its headers installed, PIL can read and write many more kinds of compressed TIFF files. If not, PIL will always write uncompressed files. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **compression** Compression mode. **dpi** Image resolution as an (xdpi, ydpi) tuple, where applicable. You can use the :py:attr:`~PIL.Image.Image.tag` attribute to get more detailed information about the image resolution. .. versionadded:: 1.1.5 In addition, the :py:attr:`~PIL.Image.Image.tag` attribute contains a dictionary of decoded TIFF fields. Values are stored as either strings or tuples. Note that only short, long and ASCII tags are correctly unpacked by this release. Saving Tiff Images ~~~~~~~~~~~~~~~~~~ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments: **tiffinfo** A :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory` object or dict object containing tiff tags and values. The TIFF field type is autodetected for Numeric and string values, any other types require using an :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory` object and setting the type in :py:attr:`~PIL.TiffImagePlugin.ImageFileDirectory.tagtype` with the appropriate numerical value from ``TiffTags.TYPES``. .. versionadded:: 2.3.0 **compression** A string containing the desired compression method for the file. (valid only with libtiff installed) Valid compression methods are: ``[None, "tiff_ccitt", "group3", "group4", "tiff_jpeg", "tiff_adobe_deflate", "tiff_thunderscan", "tiff_deflate", "tiff_sgilog", "tiff_sgilog24", "tiff_raw_16"]`` These arguments to set the tiff header fields are an alternative to using the general tags available through tiffinfo. **description** **software** **date time** **artist** **copyright** Strings **resolution unit** A string of "inch", "centimeter" or "cm" **resolution** **x resolution** **y resolution** **dpi** Either a Float, Integer, or 2 tuple of (numerator, denominator). Resolution implies an equal x and y resolution, dpi also implies a unit of inches. WebP ^^^^ PIL reads and writes WebP files. The specifics of PIL's capabilities with this format are currently undocumented. The :py:meth:`~PIL.Image.Image.save` method supports the following options: **lossless** If present, instructs the WEBP writer to use lossless compression. **quality** Integer, 1-100, Defaults to 80. Sets the quality level for lossy compression. **icc_procfile** The ICC Profile to include in the saved file. Only supported if the system webp library was built with webpmux support. **exif** The exif data to include in the saved file. Only supported if the system webp library was built with webpmux support. XBM ^^^ PIL reads and writes X bitmap files (mode ``1``). XV Thumbnails ^^^^^^^^^^^^^ PIL can read XV thumbnail files. Read-only formats ----------------- CUR ^^^ CUR is used to store cursors on Windows. The CUR decoder reads the largest available cursor. Animated cursors are not supported. DCX ^^^ DCX is a container file format for PCX files, defined by Intel. The DCX format is commonly used in fax applications. The DCX decoder can read files containing ``1``, ``L``, ``P``, or ``RGB`` data. When the file is opened, only the first image is read. You can use :py:meth:`~file.seek` or :py:mod:`~PIL.ImageSequence` to read other images. FLI, FLC ^^^^^^^^ PIL reads Autodesk FLI and FLC animations. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **duration** The delay (in milliseconds) between each frame. FPX ^^^ PIL reads Kodak FlashPix files. In the current version, only the highest resolution image is read from the file, and the viewing transform is not taken into account. .. note:: To enable full FlashPix support, you need to build and install the IJG JPEG library before building the Python Imaging Library. See the distribution README for details. GBR ^^^ The GBR decoder reads GIMP brush files. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **description** The brush name. GD ^^ PIL reads uncompressed GD files. Note that this file format cannot be automatically identified, so you must use :py:func:`PIL.GdImageFile.open` to read such a file. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **transparency** Transparency color index. This key is omitted if the image is not transparent. ICO ^^^ ICO is used to store icons on Windows. The largest available icon is read. IMT ^^^ PIL reads Image Tools images containing ``L`` data. IPTC/NAA ^^^^^^^^ PIL provides limited read support for IPTC/NAA newsphoto files. MCIDAS ^^^^^^ PIL identifies and reads 8-bit McIdas area files. MIC (read only) PIL identifies and reads Microsoft Image Composer (MIC) files. When opened, the first sprite in the file is loaded. You can use :py:meth:`~file.seek` and :py:meth:`~file.tell` to read other sprites from the file. PCD ^^^ PIL reads PhotoCD files containing ``RGB`` data. By default, the 768x512 resolution is read. You can use the :py:meth:`~PIL.Image.Image.draft` method to read the lower resolution versions instead, thus effectively resizing the image to 384x256 or 192x128. Higher resolutions cannot be read by the Python Imaging Library. PSD ^^^ PIL identifies and reads PSD files written by Adobe Photoshop 2.5 and 3.0. SGI ^^^ PIL reads uncompressed ``L``, ``RGB``, and ``RGBA`` files. TGA ^^^ PIL reads 24- and 32-bit uncompressed and run-length encoded TGA files. WAL ^^^ .. versionadded:: 1.1.4 PIL reads Quake2 WAL texture files. Note that this file format cannot be automatically identified, so you must use the open function in the :py:mod:`~PIL.WalImageFile` module to read files in this format. By default, a Quake2 standard palette is attached to the texture. To override the palette, use the putpalette method. XPM ^^^ PIL reads X pixmap files (mode ``P``) with 256 colors or less. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: **transparency** Transparency color index. This key is omitted if the image is not transparent. Write-only formats ------------------ PALM ^^^^ PIL provides write-only support for PALM pixmap files. The format code is ``Palm``, the extension is ``.palm``. PDF ^^^ PIL can write PDF (Acrobat) images. Such images are written as binary PDF 1.1 files, using either JPEG or HEX encoding depending on the image mode (and whether JPEG support is available or not). PIXAR (read only) PIL provides limited support for PIXAR raster files. The library can identify and read “dumped” RGB files. The format code is ``PIXAR``. Identify-only formats --------------------- BUFR ^^^^ .. versionadded:: 1.1.3 PIL provides a stub driver for BUFR files. To add read or write support to your application, use :py:func:`PIL.BufrStubImagePlugin.register_handler`. FITS ^^^^ .. versionadded:: 1.1.5 PIL provides a stub driver for FITS files. To add read or write support to your application, use :py:func:`PIL.FitsStubImagePlugin.register_handler`. GRIB ^^^^ .. versionadded:: 1.1.5 PIL provides a stub driver for GRIB files. The driver requires the file to start with a GRIB header. If you have files with embedded GRIB data, or files with multiple GRIB fields, your application has to seek to the header before passing the file handle to PIL. To add read or write support to your application, use :py:func:`PIL.GribStubImagePlugin.register_handler`. HDF5 ^^^^ .. versionadded:: 1.1.5 PIL provides a stub driver for HDF5 files. To add read or write support to your application, use :py:func:`PIL.Hdf5StubImagePlugin.register_handler`. MPEG ^^^^ PIL identifies MPEG files. WMF ^^^ PIL can identify placable WMF files. In PIL 1.1.4 and earlier, the WMF driver provides some limited rendering support, but not enough to be useful for any real application. In PIL 1.1.5 and later, the WMF driver is a stub driver. To add WMF read or write support to your application, use :py:func:`PIL.WmfImagePlugin.register_handler` to register a WMF handler. :: from PIL import Image from PIL import WmfImagePlugin class WmfHandler: def open(self, im): ... def load(self, im): ... return image def save(self, im, fp, filename): ... wmf_handler = WmfHandler() WmfImagePlugin.register_handler(wmf_handler) im = Image.open("sample.wmf") pillow-2.3.0/docs/handbook/writing-your-own-file-decoder.rst0000644000175000001440000002607112257506326022762 0ustar dokousersWriting your own file decoder ============================= The Python Imaging Library uses a plug-in model which allows you to add your own decoders to the library, without any changes to the library itself. Such plug-ins usually have names like :file:`XxxImagePlugin.py`, where ``Xxx`` is a unique format name (usually an abbreviation). .. warning:: Pillow >= 2.1.0 no longer automatically imports any file in the Python path with a name ending in :file:`ImagePlugin.py`. You will need to import your decoder manually. A decoder plug-in should contain a decoder class, based on the :py:class:`PIL.ImageFile.ImageFile` base class. This class should provide an :py:meth:`_open` method, which reads the file header and sets up at least the :py:attr:`~PIL.Image.Image.mode` and :py:attr:`~PIL.Image.Image.size` attributes. To be able to load the file, the method must also create a list of :py:attr:`tile` descriptors. The class must be explicitly registered, via a call to the :py:mod:`~PIL.Image` module. For performance reasons, it is important that the :py:meth:`_open` method quickly rejects files that do not have the appropriate contents. Example ------- The following plug-in supports a simple format, which has a 128-byte header consisting of the words “SPAM” followed by the width, height, and pixel size in bits. The header fields are separated by spaces. The image data follows directly after the header, and can be either bi-level, greyscale, or 24-bit true color. **SpamImagePlugin.py**:: from PIL import Image, ImageFile import string class SpamImageFile(ImageFile.ImageFile): format = "SPAM" format_description = "Spam raster image" def _open(self): # check header header = self.fp.read(128) if header[:4] != "SPAM": raise SyntaxError, "not a SPAM file" header = string.split(header) # size in pixels (width, height) self.size = int(header[1]), int(header[2]) # mode setting bits = int(header[3]) if bits == 1: self.mode = "1" elif bits == 8: self.mode = "L" elif bits == 24: self.mode = "RGB" else: raise SyntaxError, "unknown number of bits" # data descriptor self.tile = [ ("raw", (0, 0) + self.size, 128, (self.mode, 0, 1)) ] Image.register_open("SPAM", SpamImageFile) Image.register_extension("SPAM", ".spam") Image.register_extension("SPAM", ".spa") # dos version The format handler must always set the :py:attr:`~PIL.Image.Image.size` and :py:attr:`~PIL.Image.Image.mode` attributes. If these are not set, the file cannot be opened. To simplify the decoder, the calling code considers exceptions like :py:exc:`SyntaxError`, :py:exc:`KeyError`, and :py:exc:`IndexError`, as a failure to identify the file. Note that the decoder must be explicitly registered using :py:func:`PIL.Image.register_open`. Although not required, it is also a good idea to register any extensions used by this format. The :py:attr:`tile` attribute ----------------------------- To be able to read the file as well as just identifying it, the :py:attr:`tile` attribute must also be set. This attribute consists of a list of tile descriptors, where each descriptor specifies how data should be loaded to a given region in the image. In most cases, only a single descriptor is used, covering the full image. The tile descriptor is a 4-tuple with the following contents:: (decoder, region, offset, parameters) The fields are used as follows: **decoder** Specifies which decoder to use. The ``raw`` decoder used here supports uncompressed data, in a variety of pixel formats. For more information on this decoder, see the description below. **region** A 4-tuple specifying where to store data in the image. **offset** Byte offset from the beginning of the file to image data. **parameters** Parameters to the decoder. The contents of this field depends on the decoder specified by the first field in the tile descriptor tuple. If the decoder doesn’t need any parameters, use None for this field. Note that the :py:attr:`tile` attribute contains a list of tile descriptors, not just a single descriptor. The ``raw`` decoder The ``raw`` decoder is used to read uncompressed data from an image file. It can be used with most uncompressed file formats, such as PPM, BMP, uncompressed TIFF, and many others. To use the raw decoder with the :py:func:`PIL.Image.fromstring` function, use the following syntax:: image = Image.fromstring( mode, size, data, "raw", raw mode, stride, orientation ) When used in a tile descriptor, the parameter field should look like:: (raw mode, stride, orientation) The fields are used as follows: **raw mode** The pixel layout used in the file, and is used to properly convert data to PIL’s internal layout. For a summary of the available formats, see the table below. **stride** The distance in bytes between two consecutive lines in the image. If 0, the image is assumed to be packed (no padding between lines). If omitted, the stride defaults to 0. **orientation** Whether the first line in the image is the top line on the screen (1), or the bottom line (-1). If omitted, the orientation defaults to 1. The **raw mode** field is used to determine how the data should be unpacked to match PIL’s internal pixel layout. PIL supports a large set of raw modes; for a complete list, see the table in the :py:mod:`Unpack.c` module. The following table describes some commonly used **raw modes**: +-----------+-----------------------------------------------------------------+ | mode | description | +===========+=================================================================+ | ``1`` | 1-bit bilevel, stored with the leftmost pixel in the most | | | significant bit. 0 means black, 1 means white. | +-----------+-----------------------------------------------------------------+ | ``1;I`` | 1-bit inverted bilevel, stored with the leftmost pixel in the | | | most significant bit. 0 means white, 1 means black. | +-----------+-----------------------------------------------------------------+ | ``1;R`` | 1-bit reversed bilevel, stored with the leftmost pixel in the | | | least significant bit. 0 means black, 1 means white. | +-----------+-----------------------------------------------------------------+ | ``L`` | 8-bit greyscale. 0 means black, 255 means white. | +-----------+-----------------------------------------------------------------+ | ``L;I`` | 8-bit inverted greyscale. 0 means white, 255 means black. | +-----------+-----------------------------------------------------------------+ | ``P`` | 8-bit palette-mapped image. | +-----------+-----------------------------------------------------------------+ | ``RGB`` | 24-bit true colour, stored as (red, green, blue). | +-----------+-----------------------------------------------------------------+ | ``BGR`` | 24-bit true colour, stored as (blue, green, red). | +-----------+-----------------------------------------------------------------+ | ``RGBX`` | 24-bit true colour, stored as (blue, green, red, pad). | +-----------+-----------------------------------------------------------------+ | ``RGB;L`` | 24-bit true colour, line interleaved (first all red pixels, the | | | all green pixels, finally all blue pixels). | +-----------+-----------------------------------------------------------------+ Note that for the most common cases, the raw mode is simply the same as the mode. The Python Imaging Library supports many other decoders, including JPEG, PNG, and PackBits. For details, see the :file:`decode.c` source file, and the standard plug-in implementations provided with the library. Decoding floating point data ---------------------------- PIL provides some special mechanisms to allow you to load a wide variety of formats into a mode ``F`` (floating point) image memory. You can use the ``raw`` decoder to read images where data is packed in any standard machine data type, using one of the following raw modes: ============ ======================================= mode description ============ ======================================= ``F`` 32-bit native floating point. ``F;8`` 8-bit unsigned integer. ``F;8S`` 8-bit signed integer. ``F;16`` 16-bit little endian unsigned integer. ``F;16S`` 16-bit little endian signed integer. ``F;16B`` 16-bit big endian unsigned integer. ``F;16BS`` 16-bit big endian signed integer. ``F;16N`` 16-bit native unsigned integer. ``F;16NS`` 16-bit native signed integer. ``F;32`` 32-bit little endian unsigned integer. ``F;32S`` 32-bit little endian signed integer. ``F;32B`` 32-bit big endian unsigned integer. ``F;32BS`` 32-bit big endian signed integer. ``F;32N`` 32-bit native unsigned integer. ``F;32NS`` 32-bit native signed integer. ``F;32F`` 32-bit little endian floating point. ``F;32BF`` 32-bit big endian floating point. ``F;32NF`` 32-bit native floating point. ``F;64F`` 64-bit little endian floating point. ``F;64BF`` 64-bit big endian floating point. ``F;64NF`` 64-bit native floating point. ============ ======================================= The bit decoder --------------- If the raw decoder cannot handle your format, PIL also provides a special “bit” decoder that can be used to read various packed formats into a floating point image memory. To use the bit decoder with the fromstring function, use the following syntax:: image = fromstring( mode, size, data, "bit", bits, pad, fill, sign, orientation ) When used in a tile descriptor, the parameter field should look like:: (bits, pad, fill, sign, orientation) The fields are used as follows: **bits** Number of bits per pixel (2-32). No default. **pad** Padding between lines, in bits. This is either 0 if there is no padding, or 8 if lines are padded to full bytes. If omitted, the pad value defaults to 8. **fill** Controls how data are added to, and stored from, the decoder bit buffer. **fill=0** Add bytes to the LSB end of the decoder buffer; store pixels from the MSB end. **fill=1** Add bytes to the MSB end of the decoder buffer; store pixels from the MSB end. **fill=2** Add bytes to the LSB end of the decoder buffer; store pixels from the LSB end. **fill=3** Add bytes to the MSB end of the decoder buffer; store pixels from the LSB end. If omitted, the fill order defaults to 0. **sign** If non-zero, bit fields are sign extended. If zero or omitted, bit fields are unsigned. **orientation** Whether the first line in the image is the top line on the screen (1), or the bottom line (-1). If omitted, the orientation defaults to 1. pillow-2.3.0/docs/handbook/concepts.rst0000644000175000001440000000772112257506326017001 0ustar dokousersConcepts ======== The Python Imaging Library handles *raster images*; that is, rectangles of pixel data. Bands ----- An image can consist of one or more bands of data. The Python Imaging Library allows you to store several bands in a single image, provided they all have the same dimensions and depth. To get the number and names of bands in an image, use the :py:meth:`~PIL.Image.Image.getbands` method. Mode ---- The :term:`mode` of an image defines the type and depth of a pixel in the image. The current release supports the following standard modes: * ``1`` (1-bit pixels, black and white, stored with one pixel per byte) * ``L`` (8-bit pixels, black and white) * ``P`` (8-bit pixels, mapped to any other mode using a color palette) * ``RGB`` (3x8-bit pixels, true color) * ``RGBA`` (4x8-bit pixels, true color with transparency mask) * ``CMYK`` (4x8-bit pixels, color separation) * ``YCbCr`` (3x8-bit pixels, color video format) * ``I`` (32-bit signed integer pixels) * ``F`` (32-bit floating point pixels) PIL also provides limited support for a few special modes, including ``LA`` (L with alpha), ``RGBX`` (true color with padding) and ``RGBa`` (true color with premultiplied alpha). However, PIL doesn’t support user-defined modes; if you to handle band combinations that are not listed above, use a sequence of Image objects. You can read the mode of an image through the :py:attr:`~PIL.Image.Image.mode` attribute. This is a string containing one of the above values. Size ---- You can read the image size through the :py:attr:`~PIL.Image.Image.size` attribute. This is a 2-tuple, containing the horizontal and vertical size in pixels. Coordinate System ----------------- The Python Imaging Library uses a Cartesian pixel coordinate system, with (0,0) in the upper left corner. Note that the coordinates refer to the implied pixel corners; the centre of a pixel addressed as (0, 0) actually lies at (0.5, 0.5). Coordinates are usually passed to the library as 2-tuples (x, y). Rectangles are represented as 4-tuples, with the upper left corner given first. For example, a rectangle covering all of an 800x600 pixel image is written as (0, 0, 800, 600). Palette ------- The palette mode (``P``) uses a color palette to define the actual color for each pixel. Info ---- You can attach auxiliary information to an image using the :py:attr:`~PIL.Image.Image.info` attribute. This is a dictionary object. How such information is handled when loading and saving image files is up to the file format handler (see the chapter on :ref:`image-file-formats`). Most handlers add properties to the :py:attr:`~PIL.Image.Image.info` attribute when loading an image, but ignore it when saving images. Filters ------- For geometry operations that may map multiple input pixels to a single output pixel, the Python Imaging Library provides four different resampling *filters*. ``NEAREST`` Pick the nearest pixel from the input image. Ignore all other input pixels. ``BILINEAR`` Use linear interpolation over a 2x2 environment in the input image. Note that in the current version of PIL, this filter uses a fixed input environment when downsampling. ``BICUBIC`` Use cubic interpolation over a 4x4 environment in the input image. Note that in the current version of PIL, this filter uses a fixed input environment when downsampling. ``ANTIALIAS`` Calculate the output pixel value using a high-quality resampling filter (a truncated sinc) on all pixels that may contribute to the output value. In the current version of PIL, this filter can only be used with the resize and thumbnail methods. .. versionadded:: 1.1.3 Note that in the current version of PIL, the ``ANTIALIAS`` filter is the only filter that behaves properly when downsampling (that is, when converting a large image to a small one). The ``BILINEAR`` and ``BICUBIC`` filters use a fixed input environment, and are best used for scale-preserving geometric transforms and upsamping. pillow-2.3.0/docs/handbook/appendices.rst0000644000175000001440000000015112257506326017264 0ustar dokousersAppendices ========== .. toctree:: :maxdepth: 2 image-file-formats writing-your-own-file-decoder pillow-2.3.0/docs/handbook/overview.rst0000644000175000001440000000341512257506326017025 0ustar dokousersOverview ======== The **Python Imaging Library** adds image processing capabilities to your Python interpreter. This library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities. The core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool. Let’s look at a few possible uses of this library. Image Archives -------------- The Python Imaging Library is ideal for for image archival and batch processing applications. You can use the library to create thumbnails, convert between file formats, print images, etc. The current version identifies and reads a large number of formats. Write support is intentionally restricted to the most commonly used interchange and presentation formats. Image Display ------------- The current release includes Tk :py:class:`~PIL.ImageTk.PhotoImage` and :py:class:`~PIL.ImageTk.BitmapImage` interfaces, as well as a :py:mod:`Windows DIB interface ` that can be used with PythonWin and other Windows-based toolkits. Many other GUI toolkits come with some kind of PIL support. For debugging, there’s also a :py:meth:`show` method which saves an image to disk, and calls an external display utility. Image Processing ---------------- The library contains basic image processing functionality, including point operations, filtering with a set of built-in convolution kernels, and colour space conversions. The library also supports image resizing, rotation and arbitrary affine transforms. There’s a histogram method allowing you to pull some statistics out of an image. This can be used for automatic contrast enhancement, and for global statistical analysis. pillow-2.3.0/docs/plugins.rst0000644000175000001440000001435412257506326015057 0ustar dokousersPlugin reference ================ :mod:`ArgImagePlugin` Module ---------------------------- .. automodule:: PIL.ArgImagePlugin :members: :undoc-members: :show-inheritance: :mod:`BmpImagePlugin` Module ---------------------------- .. automodule:: PIL.BmpImagePlugin :members: :undoc-members: :show-inheritance: :mod:`BufrStubImagePlugin` Module --------------------------------- .. automodule:: PIL.BufrStubImagePlugin :members: :undoc-members: :show-inheritance: :mod:`CurImagePlugin` Module ---------------------------- .. automodule:: PIL.CurImagePlugin :members: :undoc-members: :show-inheritance: :mod:`DcxImagePlugin` Module ---------------------------- .. automodule:: PIL.DcxImagePlugin :members: :undoc-members: :show-inheritance: :mod:`EpsImagePlugin` Module ---------------------------- .. automodule:: PIL.EpsImagePlugin :members: :undoc-members: :show-inheritance: :mod:`FitsStubImagePlugin` Module --------------------------------- .. automodule:: PIL.FitsStubImagePlugin :members: :undoc-members: :show-inheritance: :mod:`FliImagePlugin` Module ---------------------------- .. automodule:: PIL.FliImagePlugin :members: :undoc-members: :show-inheritance: :mod:`FpxImagePlugin` Module ---------------------------- .. automodule:: PIL.FpxImagePlugin :members: :undoc-members: :show-inheritance: :mod:`GbrImagePlugin` Module ---------------------------- .. automodule:: PIL.GbrImagePlugin :members: :undoc-members: :show-inheritance: :mod:`GifImagePlugin` Module ---------------------------- .. automodule:: PIL.GifImagePlugin :members: :undoc-members: :show-inheritance: :mod:`GribStubImagePlugin` Module --------------------------------- .. automodule:: PIL.GribStubImagePlugin :members: :undoc-members: :show-inheritance: :mod:`Hdf5StubImagePlugin` Module --------------------------------- .. automodule:: PIL.Hdf5StubImagePlugin :members: :undoc-members: :show-inheritance: :mod:`IcnsImagePlugin` Module ----------------------------- .. automodule:: PIL.IcnsImagePlugin :members: :undoc-members: :show-inheritance: :mod:`IcoImagePlugin` Module ---------------------------- .. automodule:: PIL.IcoImagePlugin :members: :undoc-members: :show-inheritance: :mod:`ImImagePlugin` Module --------------------------- .. automodule:: PIL.ImImagePlugin :members: :undoc-members: :show-inheritance: :mod:`ImtImagePlugin` Module ---------------------------- .. automodule:: PIL.ImtImagePlugin :members: :undoc-members: :show-inheritance: :mod:`IptcImagePlugin` Module ----------------------------- .. automodule:: PIL.IptcImagePlugin :members: :undoc-members: :show-inheritance: :mod:`JpegImagePlugin` Module ----------------------------- .. automodule:: PIL.JpegImagePlugin :members: :undoc-members: :show-inheritance: :mod:`McIdasImagePlugin` Module ------------------------------- .. automodule:: PIL.McIdasImagePlugin :members: :undoc-members: :show-inheritance: :mod:`MicImagePlugin` Module ---------------------------- .. automodule:: PIL.MicImagePlugin :members: :undoc-members: :show-inheritance: :mod:`MpegImagePlugin` Module ----------------------------- .. automodule:: PIL.MpegImagePlugin :members: :undoc-members: :show-inheritance: :mod:`MspImagePlugin` Module ---------------------------- .. automodule:: PIL.MspImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PalmImagePlugin` Module ----------------------------- .. automodule:: PIL.PalmImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PcdImagePlugin` Module ---------------------------- .. automodule:: PIL.PcdImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PcxImagePlugin` Module ---------------------------- .. automodule:: PIL.PcxImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PdfImagePlugin` Module ---------------------------- .. automodule:: PIL.PdfImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PixarImagePlugin` Module ------------------------------ .. automodule:: PIL.PixarImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PngImagePlugin` Module ---------------------------- .. automodule:: PIL.PngImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PpmImagePlugin` Module ---------------------------- .. automodule:: PIL.PpmImagePlugin :members: :undoc-members: :show-inheritance: :mod:`PsdImagePlugin` Module ---------------------------- .. automodule:: PIL.PsdImagePlugin :members: :undoc-members: :show-inheritance: :mod:`SgiImagePlugin` Module ---------------------------- .. automodule:: PIL.SgiImagePlugin :members: :undoc-members: :show-inheritance: :mod:`SpiderImagePlugin` Module ------------------------------- .. automodule:: PIL.SpiderImagePlugin :members: :undoc-members: :show-inheritance: :mod:`SunImagePlugin` Module ---------------------------- .. automodule:: PIL.SunImagePlugin :members: :undoc-members: :show-inheritance: :mod:`TgaImagePlugin` Module ---------------------------- .. automodule:: PIL.TgaImagePlugin :members: :undoc-members: :show-inheritance: :mod:`TiffImagePlugin` Module ----------------------------- .. automodule:: PIL.TiffImagePlugin :members: :undoc-members: :show-inheritance: :mod:`WebPImagePlugin` Module ----------------------------- .. automodule:: PIL.WebPImagePlugin :members: :undoc-members: :show-inheritance: :mod:`WmfImagePlugin` Module ---------------------------- .. automodule:: PIL.WmfImagePlugin :members: :undoc-members: :show-inheritance: :mod:`XVThumbImagePlugin` Module -------------------------------- .. automodule:: PIL.XVThumbImagePlugin :members: :undoc-members: :show-inheritance: :mod:`XbmImagePlugin` Module ---------------------------- .. automodule:: PIL.XbmImagePlugin :members: :undoc-members: :show-inheritance: :mod:`XpmImagePlugin` Module ---------------------------- .. automodule:: PIL.XpmImagePlugin :members: :undoc-members: :show-inheritance: pillow-2.3.0/docs/Guardfile0000644000175000001440000000054412257506326014465 0ustar dokousers#!/usr/bin/env python from livereload.task import Task from livereload.compiler import shell Task.add('*.rst', shell('make html')) Task.add('*/*.rst', shell('make html')) Task.add('_static/*.css', shell('make clean html')) Task.add('_templates/*', shell('make clean html')) Task.add('Makefile', shell('make html')) Task.add('conf.py', shell('make html')) pillow-2.3.0/docs/_templates/0000755000175000001440000000000012274164154014770 5ustar dokouserspillow-2.3.0/docs/_templates/sidebarhelp.html0000644000175000001440000000101512257506326020137 0ustar dokousers

Need help?

You can seek realtime assistance via IRC at irc://irc.freenode.net#pil. You can also post to the Image-SIG mailing list. And, of course, there's Stack Overflow.

If you've discovered a bug, you can open an issue on Github.

pillow-2.3.0/docs/_templates/.gitignore0000644000175000001440000000010012257506326016751 0ustar dokousers# Empty file, to make the directory available in the repository pillow-2.3.0/docs/original-readme.rst0000644000175000001440000002640012257506326016430 0ustar dokousersOriginal PIL README =================== What follows is the original PIL 1.1.7 README file contents. :: The Python Imaging Library $Id$ Release 1.1.7 (November 15, 2009) ==================================================================== The Python Imaging Library 1.1.7 ==================================================================== Contents -------- + Introduction + Support Options - Commercial support - Free support + Software License + Build instructions (all platforms) - Additional notes for Mac OS X - Additional notes for Windows -------------------------------------------------------------------- Introduction -------------------------------------------------------------------- The Python Imaging Library (PIL) adds image processing capabilities to your Python environment. This library provides extensive file format support, an efficient internal representation, and powerful image processing capabilities. This source kit has been built and tested with Python 2.0 and newer, on Windows, Mac OS X, and major Unix platforms. Large parts of the library also work on 1.5.2 and 1.6. The main distribution site for this software is: http://www.pythonware.com/products/pil/ That site also contains information about free and commercial support options, PIL add-ons, answers to frequently asked questions, and more. Development versions (alphas, betas) are available here: http://effbot.org/downloads/ The PIL handbook is not included in this distribution; to get the latest version, check: http://www.pythonware.com/library/ http://effbot.org/books/imagingbook/ (drafts) For installation and licensing details, see below. -------------------------------------------------------------------- Support Options -------------------------------------------------------------------- + Commercial Support Secret Labs (PythonWare) offers support contracts for companies using the Python Imaging Library in commercial applications, and in mission- critical environments. The support contract includes technical support, bug fixes, extensions to the PIL library, sample applications, and more. For the full story, check: http://www.pythonware.com/products/pil/support.htm + Free Support For support and general questions on the Python Imaging Library, send e-mail to the Image SIG mailing list: image-sig@python.org You can join the Image SIG by sending a mail to: image-sig-request@python.org Put "subscribe" in the message body to automatically subscribe to the list, or "help" to get additional information. Alternatively, you can send your questions to the Python mailing list, python-list@python.org, or post them to the newsgroup comp.lang.python. DO NOT SEND SUPPORT QUESTIONS TO PYTHONWARE ADDRESSES. -------------------------------------------------------------------- Software License -------------------------------------------------------------------- The Python Imaging Library is Copyright (c) 1997-2009 by Secret Labs AB Copyright (c) 1995-2009 by Fredrik Lundh By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------- Build instructions (all platforms) -------------------------------------------------------------------- For a list of changes in this release, see the CHANGES document. 0. If you're in a hurry, try this: $ tar xvfz Imaging-1.1.7.tar.gz $ cd Imaging-1.1.7 $ python setup.py install If you prefer to know what you're doing, read on. 1. Prerequisites. If you need any of the features described below, make sure you have the necessary libraries before building PIL. feature library ----------------------------------------------------------------- JPEG support libjpeg (6a or 6b) http://www.ijg.org http://www.ijg.org/files/jpegsrc.v6b.tar.gz ftp://ftp.uu.net/graphics/jpeg/ PNG support zlib (1.2.3 or later is recommended) http://www.gzip.org/zlib/ OpenType/TrueType freetype2 (2.3.9 or later is recommended) support http://www.freetype.org http://freetype.sourceforge.net CMS support littleCMS (1.1.5 or later is recommended) support http://www.littlecms.com/ If you have a recent Linux version, the libraries provided with the operating system usually work just fine. If some library is missing, installing a prebuilt version (jpeg-devel, zlib-devel, etc) is usually easier than building from source. For example, for Ubuntu 9.10 (karmic), you can install the following libraries: sudo apt-get install libjpeg62-dev sudo apt-get install zlib1g-dev sudo apt-get install libfreetype6-dev sudo apt-get install liblcms1-dev If you're using Mac OS X, you can use the 'fink' tool to install missing libraries (also see the Mac OS X section below). Similar tools are available for many other platforms. 2. To build under Python 1.5.2, you need to install the stand-alone version of the distutils library: http://www.python.org/sigs/distutils-sig/download.html You can fetch distutils 1.0.2 from the Python source repository: svn export http://svn.python.org/projects/python/tags/Distutils-1_0_2/Lib/distutils/ For newer releases, the distutils library is included in the Python standard library. NOTE: Version 1.1.7 is not fully compatible with 1.5.2. Some more recent additions to the library may not work, but the core functionality is available. 3. If you didn't build Python from sources, make sure you have Python's build support files on your machine. If you've down- loaded a prebuilt package (e.g. a Linux RPM), you probably need additional developer packages. Look for packages named "python-dev", "python-devel", or similar. For example, for Ubuntu 9.10 (karmic), use the following command: sudo apt-get install python-dev 4. When you have everything you need, unpack the PIL distribution (the file Imaging-1.1.7.tar.gz) in a suitable work directory: $ cd MyExtensions # example $ gunzip Imaging-1.1.7.tar.gz $ tar xvf Imaging-1.1.7.tar 5. Build the library. We recommend that you do an in-place build, and run the self test before installing. $ cd Imaging-1.1.7 $ python setup.py build_ext -i $ python selftest.py During the build process, the setup.py will display a summary report that lists what external components it found. The self- test will display a similar report, with what external components the tests found in the actual build files: ---------------------------------------------------------------- PIL 1.1.7 SETUP SUMMARY ---------------------------------------------------------------- *** TKINTER support not available (Tcl/Tk 8.5 libraries needed) --- JPEG support available --- ZLIB (PNG/ZIP) support available --- FREETYPE support available ---------------------------------------------------------------- Make sure that the optional components you need are included. If the build script won't find a given component, you can edit the setup.py file and set the appropriate ROOT variable. For details, see instructions in the file. If the build script finds the component, but the tests cannot identify it, try rebuilding *all* modules: $ python setup.py clean $ python setup.py build_ext -i 6. If the setup.py and selftest.py commands finish without any errors, you're ready to install the library: $ python setup.py install (depending on how Python has been installed on your machine, you might have to log in as a superuser to run the 'install' command, or use the 'sudo' command to run 'install'.) -------------------------------------------------------------------- Additional notes for Mac OS X -------------------------------------------------------------------- On Mac OS X you will usually install additional software such as libjpeg or freetype with the "fink" tool, and then it ends up in "/sw". If you have installed the libraries elsewhere, you may have to tweak the "setup.py" file before building. -------------------------------------------------------------------- Additional notes for Windows -------------------------------------------------------------------- On Windows, you need to tweak the ROOT settings in the "setup.py" file, to make it find the external libraries. See comments in the file for details. Make sure to build PIL and the external libraries with the same runtime linking options as was used for the Python interpreter (usually /MD, under Visual Studio). Note that most Python distributions for Windows include libraries compiled for Microsoft Visual Studio. You can get the free Express edition of Visual Studio from: http://www.microsoft.com/Express/ To build extensions using other tool chains, see the "Using non-Microsoft compilers on Windows" section in the distutils handbook: http://www.python.org/doc/current/inst/non-ms-compilers.html For additional information on how to build extensions using the popular MinGW compiler, see: http://mingw.org (compiler) http://sebsauvage.net/python/mingw.html (build instructions) http://sourceforge.net/projects/gnuwin32 (prebuilt libraries) pillow-2.3.0/docs/reference/0000755000175000001440000000000012274164154014571 5ustar dokouserspillow-2.3.0/docs/reference/ImageQt.rst0000644000175000001440000000125612257510366016657 0ustar dokousers.. py:module:: PIL.ImageQt .. py:currentmodule:: PIL.ImageQt :py:mod:`ImageQt` Module ======================== The :py:mod:`ImageQt` module contains support for creating PyQt4 or PyQt5 QImage objects from PIL images. .. versionadded:: 1.1.6 .. py:class:: ImageQt.ImageQt(image) Creates an :py:class:`~PIL.ImageQt.ImageQt` object from a PIL :py:class:`~PIL.Image.Image` object. This class is a subclass of QtGui.QImage, which means that you can pass the resulting objects directly to PyQt4/5 API functions and methods. This operation is currently supported for mode 1, L, P, RGB, and RGBA images. To handle other modes, you need to convert the image first. pillow-2.3.0/docs/reference/ImageGrab.rst0000644000175000001440000000201312257506326017137 0ustar dokousers.. py:module:: PIL.ImageGrab .. py:currentmodule:: PIL.ImageGrab :py:mod:`ImageGrab` Module (Windows-only) ========================================= The :py:mod:`ImageGrab` module can be used to copy the contents of the screen or the clipboard to a PIL image memory. .. note:: The current version works on Windows only. .. versionadded:: 1.1.3 .. py:function:: PIL.ImageGrab.grab(bbox=None) Take a snapshot of the screen. The pixels inside the bounding box are returned as an "RGB" image. If the bounding box is omitted, the entire screen is copied. .. versionadded:: 1.1.3 :param bbox: What region to copy. Default is the entire screen. :return: An image .. py:function:: PIL.ImageGrab.grabclipboard() Take a snapshot of the clipboard image, if any. .. versionadded:: 1.1.4 :return: An image, a list of filenames, or None if the clipboard does not contain image data or filenames. Note that if a list is returned, the filenames may not represent image files. pillow-2.3.0/docs/reference/index.rst0000644000175000001440000000046512257506326016441 0ustar dokousersReference ========= .. toctree:: :maxdepth: 2 Image ImageChops ImageColor ImageDraw ImageEnhance ImageFile ImageFilter ImageFont ImageGrab ImageMath ImageOps ImagePalette ImagePath ImageQt ImageSequence ImageStat ImageTk ImageWin PSDraw ../PIL pillow-2.3.0/docs/reference/Image.rst0000644000175000001440000001261312257506326016352 0ustar dokousers.. py:module:: PIL.Image .. py:currentmodule:: PIL.Image :py:mod:`Image` Module ====================== The :py:mod:`~PIL.Image` module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including functions to load images from files, and to create new images. Examples -------- The following script loads an image, rotates it 45 degrees, and displays it using an external viewer (usually xv on Unix, and the paint program on Windows). Open, rotate, and display an image (using the default viewer) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: python from PIL import Image im = Image.open("bride.jpg") im.rotate(45).show() The following script creates nice 128x128 thumbnails of all JPEG images in the current directory. Create thumbnails ^^^^^^^^^^^^^^^^^ .. code-block:: python from PIL import Image import glob, os size = 128, 128 for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) im = Image.open(infile) im.thumbnail(size, Image.ANTIALIAS) im.save(file + ".thumbnail", "JPEG") Functions --------- .. autofunction:: open Image processing ^^^^^^^^^^^^^^^^ .. autofunction:: alpha_composite .. autofunction:: blend .. autofunction:: composite .. autofunction:: eval .. autofunction:: merge Constructing images ^^^^^^^^^^^^^^^^^^^ .. autofunction:: new .. autofunction:: fromarray .. autofunction:: frombytes .. autofunction:: fromstring .. autofunction:: frombuffer Registering plugins ^^^^^^^^^^^^^^^^^^^ .. note:: These functions are for use by plugin authors. Application authors can ignore them. .. autofunction:: register_open .. autofunction:: register_mime .. autofunction:: register_save .. autofunction:: register_extension The Image Class --------------- .. autoclass:: PIL.Image.Image An instance of the :py:class:`~PIL.Image.Image` class has the following methods. Unless otherwise stated, all methods return a new instance of the :py:class:`~PIL.Image.Image` class, holding the resulting image. .. automethod:: PIL.Image.Image.convert The following example converts an RGB image (linearly calibrated according to ITU-R 709, using the D65 luminant) to the CIE XYZ color space: .. code-block:: python rgb2xyz = ( 0.412453, 0.357580, 0.180423, 0, 0.212671, 0.715160, 0.072169, 0, 0.019334, 0.119193, 0.950227, 0 ) out = im.convert("RGB", rgb2xyz) .. automethod:: PIL.Image.Image.copy .. automethod:: PIL.Image.Image.crop .. automethod:: PIL.Image.Image.draft .. automethod:: PIL.Image.Image.filter .. automethod:: PIL.Image.Image.getbands .. automethod:: PIL.Image.Image.getbbox .. automethod:: PIL.Image.Image.getcolors .. automethod:: PIL.Image.Image.getdata .. automethod:: PIL.Image.Image.getextrema .. automethod:: PIL.Image.Image.getpixel .. automethod:: PIL.Image.Image.histogram .. automethod:: PIL.Image.Image.offset .. automethod:: PIL.Image.Image.paste .. automethod:: PIL.Image.Image.point .. automethod:: PIL.Image.Image.putalpha .. automethod:: PIL.Image.Image.putdata .. automethod:: PIL.Image.Image.putpalette .. automethod:: PIL.Image.Image.putpixel .. automethod:: PIL.Image.Image.quantize .. automethod:: PIL.Image.Image.resize .. automethod:: PIL.Image.Image.rotate .. automethod:: PIL.Image.Image.save .. automethod:: PIL.Image.Image.seek .. automethod:: PIL.Image.Image.show .. automethod:: PIL.Image.Image.split .. automethod:: PIL.Image.Image.tell .. automethod:: PIL.Image.Image.thumbnail .. automethod:: PIL.Image.Image.tobitmap .. automethod:: PIL.Image.Image.tostring .. automethod:: PIL.Image.Image.transform .. automethod:: PIL.Image.Image.transpose .. automethod:: PIL.Image.Image.verify .. automethod:: PIL.Image.Image.fromstring .. deprecated:: 2.0 .. automethod:: PIL.Image.Image.load Attributes ---------- Instances of the :py:class:`Image` class have the following attributes: .. py:attribute:: format The file format of the source file. For images created by the library itself (via a factory function, or by running a method on an existing image), this attribute is set to ``None``. :type: :py:class:`string` or ``None`` .. py:attribute:: mode Image mode. This is a string specifying the pixel format used by the image. Typical values are “1”, “L”, “RGB”, or “CMYK.” See :doc:`../handbook/concepts` for a full list. :type: :py:class:`string` .. py:attribute:: size Image size, in pixels. The size is given as a 2-tuple (width, height). :type: ``(width, height)`` .. py:attribute:: palette Colour palette table, if any. If mode is “P”, this should be an instance of the :py:class:`~PIL.ImagePalette.ImagePalette` class. Otherwise, it should be set to ``None``. :type: :py:class:`~PIL.ImagePalette.ImagePalette` or ``None`` .. py:attribute:: info A dictionary holding data associated with the image. This dictionary is used by file handlers to pass on various non-image information read from the file. See documentation for the various file handlers for details. Most methods ignore the dictionary when returning new images; since the keys are not standardized, it’s not possible for a method to know if the operation affects the dictionary. If you need the information later on, keep a reference to the info dictionary returned from the open method. :type: :py:class:`dict` pillow-2.3.0/docs/reference/ImageFilter.rst0000644000175000001440000000223512257506326017517 0ustar dokousers.. py:module:: PIL.ImageFilter .. py:currentmodule:: PIL.ImageFilter :py:mod:`ImageFilter` Module ============================ The :py:mod:`ImageFilter` module contains definitions for a pre-defined set of filters, which can be be used with the :py:meth:`Image.filter() ` method. Example: Filter an image ------------------------ .. code-block:: python from PIL import ImageFilter im1 = im.filter(ImageFilter.BLUR) im2 = im.filter(ImageFilter.MinFilter(3)) im3 = im.filter(ImageFilter.MinFilter) # same as MinFilter(3) Filters ------- The current version of the library provides the following set of predefined image enhancement filters: * **BLUR** * **CONTOUR** * **DETAIL** * **EDGE_ENHANCE** * **EDGE_ENHANCE_MORE** * **EMBOSS** * **FIND_EDGES** * **SMOOTH** * **SMOOTH_MORE** * **SHARPEN** .. autoclass:: PIL.ImageFilter.GaussianBlur .. autoclass:: PIL.ImageFilter.UnsharpMask .. autoclass:: PIL.ImageFilter.Kernel .. autoclass:: PIL.ImageFilter.RankFilter .. autoclass:: PIL.ImageFilter.MedianFilter .. autoclass:: PIL.ImageFilter.MinFilter .. autoclass:: PIL.ImageFilter.MaxFilter .. autoclass:: PIL.ImageFilter.ModeFilter pillow-2.3.0/docs/reference/ImageWin.rst0000644000175000001440000000131612257506326017026 0ustar dokousers.. py:module:: PIL.ImageWin .. py:currentmodule:: PIL.ImageWin :py:mod:`ImageWin` Module (Windows-only) ======================================== The :py:mod:`ImageWin` module contains support to create and display images on Windows. ImageWin can be used with PythonWin and other user interface toolkits that provide access to Windows device contexts or window handles. For example, Tkinter makes the window handle available via the winfo_id method: .. code-block:: python from PIL import ImageWin dib = ImageWin.Dib(...) hwnd = ImageWin.HWND(widget.winfo_id()) dib.draw(hwnd, xy) .. autoclass:: PIL.ImageWin.Dib :members: .. autoclass:: PIL.ImageWin.HDC .. autoclass:: PIL.ImageWin.HWND pillow-2.3.0/docs/reference/ImagePath.rst0000644000175000001440000000451712257506326017173 0ustar dokousers.. py:module:: PIL.ImagePath .. py:currentmodule:: PIL.ImagePath :py:mod:`ImagePath` Module ========================== The :py:mod:`ImagePath` module is used to store and manipulate 2-dimensional vector data. Path objects can be passed to the methods on the :py:mod:`~PIL.ImageDraw` module. .. py:class:: PIL.ImagePath.Path A path object. The coordinate list can be any sequence object containing either 2-tuples [(x, y), …] or numeric values [x, y, …]. You can also create a path object from another path object. In 1.1.6 and later, you can also pass in any object that implements Python’s buffer API. The buffer should provide read access, and contain C floats in machine byte order. The path object implements most parts of the Python sequence interface, and behaves like a list of (x, y) pairs. You can use len(), item access, and slicing as usual. However, the current version does not support slice assignment, or item and slice deletion. :param xy: A sequence. The sequence can contain 2-tuples [(x, y), ...] or a flat list of numbers [x, y, ...]. .. py:method:: PIL.ImagePath.Path.compact(distance=2) Compacts the path, by removing points that are close to each other. This method modifies the path in place, and returns the number of points left in the path. **distance** is measured as `Manhattan distance`_ and defaults to two pixels. .. _Manhattan distance: http://en.wikipedia.org/wiki/Manhattan_distance .. py:method:: PIL.ImagePath.Path.getbbox() Gets the bounding box of the path. :return: ``(x0, y0, x1, y1)`` .. py:method:: PIL.ImagePath.Path.map(function) Maps the path through a function. .. py:method:: PIL.ImagePath.Path.tolist(flat=0) Converts the path to a Python list [(x, y), …]. :param flat: By default, this function returns a list of 2-tuples [(x, y), ...]. If this argument is :keyword:`True`, it returns a flat list [x, y, ...] instead. :return: A list of coordinates. See **flat**. .. py:method:: PIL.ImagePath.Path.transform(matrix) Transforms the path in place, using an affine transform. The matrix is a 6-tuple (a, b, c, d, e, f), and each point is mapped as follows: .. code-block:: python xOut = xIn * a + yIn * b + c yOut = xIn * d + yIn * e + f pillow-2.3.0/docs/reference/ImageDraw.rst0000644000175000001440000001731412257506326017173 0ustar dokousers.. py:module:: PIL.ImageDraw .. py:currentmodule:: PIL.ImageDraw :py:mod:`ImageDraw` Module ========================== The :py:mod:`ImageDraw` module provide simple 2D graphics for :py:class:`~PIL.Image.Image` objects. You can use this module to create new images, annotate or retouch existing images, and to generate graphics on the fly for web use. For a more advanced drawing library for PIL, see the `aggdraw module`_. .. _aggdraw module: http://effbot.org/zone/aggdraw-index.htm Example: Draw a gray cross over an image ---------------------------------------- .. code-block:: python from PIL import Image, ImageDraw im = Image.open("lena.pgm") draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) del draw # write to stdout im.save(sys.stdout, "PNG") Concepts -------- Coordinates ^^^^^^^^^^^ The graphics interface uses the same coordinate system as PIL itself, with (0, 0) in the upper left corner. Colors ^^^^^^ To specify colors, you can use numbers or tuples just as you would use with :py:meth:`PIL.Image.Image.new` or :py:meth:`PIL.Image.Image.putpixel`. For “1”, “L”, and “I” images, use integers. For “RGB” images, use a 3-tuple containing integer values. For “F” images, use integer or floating point values. For palette images (mode “P”), use integers as color indexes. In 1.1.4 and later, you can also use RGB 3-tuples or color names (see below). The drawing layer will automatically assign color indexes, as long as you don’t draw with more than 256 colors. Color Names ^^^^^^^^^^^ See :ref:`color-names` for the color names supported by Pillow. Fonts ^^^^^ PIL can use bitmap fonts or OpenType/TrueType fonts. Bitmap fonts are stored in PIL’s own format, where each font typically consists of a two files, one named .pil and the other usually named .pbm. The former contains font metrics, the latter raster data. To load a bitmap font, use the load functions in the :py:mod:`~PIL.ImageFont` module. To load a OpenType/TrueType font, use the truetype function in the :py:mod:`~PIL.ImageFont` module. Note that this function depends on third-party libraries, and may not available in all PIL builds. Functions --------- .. py:class:: PIL.ImageDraw.Draw(im, mode=None) Creates an object that can be used to draw in the given image. Note that the image will be modified in place. Methods ------- .. py:method:: PIL.ImageDraw.Draw.arc(xy, start, end, fill=None) Draws an arc (a portion of a circle outline) between the start and end angles, inside the given bounding box. :param xy: Four points to define the bounding box. Sequence of either ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. :param outline: Color to use for the outline. .. py:method:: PIL.ImageDraw.Draw.bitmap(xy, bitmap, fill=None) Draws a bitmap (mask) at the given position, using the current fill color for the non-zero portions. The bitmap should be a valid transparency mask (mode “1”) or matte (mode “L” or “RGBA”). This is equivalent to doing ``image.paste(xy, color, bitmap)``. To paste pixel data into an image, use the :py:meth:`~PIL.Image.Image.paste` method on the image itself. .. py:method:: PIL.ImageDraw.Draw.chord(xy, start, end, fill=None, outline=None) Same as :py:meth:`~PIL.ImageDraw.Draw.arc`, but connects the end points with a straight line. :param xy: Four points to define the bounding box. Sequence of either ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. .. py:method:: PIL.ImageDraw.Draw.ellipse(xy, fill=None, outline=None) Draws an ellipse inside the given bounding box. :param xy: Four points to define the bounding box. Sequence of either ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. .. py:method:: PIL.ImageDraw.Draw.line(xy, fill=None, width=0) Draws a line between the coordinates in the **xy** list. :param xy: Sequence of either 2-tuples like ``[(x, y), (x, y), ...]`` or numeric values like ``[x, y, x, y, ...]``. :param fill: Color to use for the line. :param width: The line width, in pixels. Note that line joins are not handled well, so wide polylines will not look good. .. versionadded:: 1.1.5 .. note:: This option was broken until version 1.1.6. .. py:method:: PIL.ImageDraw.Draw.pieslice(xy, start, end, fill=None, outline=None) Same as arc, but also draws straight lines between the end points and the center of the bounding box. :param xy: Four points to define the bounding box. Sequence of either ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. .. py:method:: PIL.ImageDraw.Draw.point(xy, fill=None) Draws points (individual pixels) at the given coordinates. :param xy: Sequence of either 2-tuples like ``[(x, y), (x, y), ...]`` or numeric values like ``[x, y, x, y, ...]``. :param fill: Color to use for the point. .. py:method:: PIL.ImageDraw.Draw.polygon(xy, fill=None, outline=None) Draws a polygon. The polygon outline consists of straight lines between the given coordinates, plus a straight line between the last and the first coordinate. :param xy: Sequence of either 2-tuples like ``[(x, y), (x, y), ...]`` or numeric values like ``[x, y, x, y, ...]``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. .. py:method:: PIL.ImageDraw.Draw.rectangle(xy, fill=None, outline=None) Draws a rectangle. :param xy: Four points to define the bounding box. Sequence of either ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. The second point is just outside the drawn rectangle. :param outline: Color to use for the outline. :param fill: Color to use for the fill. .. py:method:: PIL.ImageDraw.Draw.shape(shape, fill=None, outline=None) .. warning:: This method is experimental. Draw a shape. .. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None) Draws the string at the given position. :param xy: Top left corner of the text. :param text: Text to be drawn. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param fill: Color to use for the text. .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None) Return the size of the given string, in pixels. :param text: Text to be measured. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. Legacy API ---------- The :py:class:`~PIL.ImageDraw.Draw` class contains a constructor and a number of methods which are provided for backwards compatibility only. For this to work properly, you should either use options on the drawing primitives, or these methods. Do not mix the old and new calling conventions. .. py:function:: PIL.ImageDraw.ImageDraw(image) :rtype: :py:class:`~PIL.ImageDraw.Draw` .. py:method:: PIL.ImageDraw.Draw.setink(ink) .. deprecated:: 1.1.5 Sets the color to use for subsequent draw and fill operations. .. py:method:: PIL.ImageDraw.Draw.setfill(fill) .. deprecated:: 1.1.5 Sets the fill mode. If the mode is 0, subsequently drawn shapes (like polygons and rectangles) are outlined. If the mode is 1, they are filled. .. py:method:: PIL.ImageDraw.Draw.setfont(font) .. deprecated:: 1.1.5 Sets the default font to use for the text method. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. pillow-2.3.0/docs/reference/ImageOps.rst0000644000175000001440000000132012257506326017025 0ustar dokousers.. py:module:: PIL.ImageOps .. py:currentmodule:: PIL.ImageOps :py:mod:`ImageOps` Module ========================== The :py:mod:`ImageOps` module contains a number of ‘ready-made’ image processing operations. This module is somewhat experimental, and most operators only work on L and RGB images. Only bug fixes have been added since the Pillow fork. .. versionadded:: 1.1.3 .. autofunction:: autocontrast .. autofunction:: colorize .. autofunction:: crop .. autofunction:: deform .. autofunction:: equalize .. autofunction:: expand .. autofunction:: fit .. autofunction:: flip .. autofunction:: grayscale .. autofunction:: invert .. autofunction:: mirror .. autofunction:: posterize .. autofunction:: solarize pillow-2.3.0/docs/reference/ImageEnhance.rst0000644000175000001440000000165012257506326017633 0ustar dokousers.. py:module:: PIL.ImageEnhance .. py:currentmodule:: PIL.ImageEnhance :py:mod:`ImageEnhance` Module ============================= The :py:mod:`ImageEnhance` module contains a number of classes that can be used for image enhancement. Example: Vary the sharpness of an image --------------------------------------- .. code-block:: python from PIL import ImageEnhance enhancer = ImageEnhance.Sharpness(image) for i in range(8): factor = i / 4.0 enhancer.enhance(factor).show("Sharpness %f" % factor) Also see the :file:`enhancer.py` demo program in the :file:`Scripts/` directory. Classes ------- All enhancement classes implement a common interface, containing a single method: .. autoclass:: PIL.ImageEnhance._Enhance :members: .. autoclass:: PIL.ImageEnhance.Color .. autoclass:: PIL.ImageEnhance.Contrast .. autoclass:: PIL.ImageEnhance.Brightness .. autoclass:: PIL.ImageEnhance.Sharpness pillow-2.3.0/docs/reference/ImageTk.rst0000644000175000001440000000063212257506326016647 0ustar dokousers.. py:module:: PIL.ImageTk .. py:currentmodule:: PIL.ImageTk :py:mod:`ImageTk` Module ======================== The :py:mod:`ImageTk` module contains support to create and modify Tkinter BitmapImage and PhotoImage objects from PIL images. For examples, see the demo programs in the Scripts directory. .. autoclass:: PIL.ImageTk.BitmapImage :members: .. autoclass:: PIL.ImageTk.PhotoImage :members: pillow-2.3.0/docs/reference/PSDraw.rst0000644000175000001440000000045512257506326016471 0ustar dokousers.. py:module:: PIL.PSDraw .. py:currentmodule:: PIL.PSDraw :py:mod:`PSDraw` Module ======================= The :py:mod:`PSDraw` module provides simple print support for Postscript printers. You can print text, graphics and images through this module. .. autoclass:: PIL.PSDraw.PSDraw :members: pillow-2.3.0/docs/reference/ImageColor.rst0000644000175000001440000000306012257506326017345 0ustar dokousers.. py:module:: PIL.ImageColor .. py:currentmodule:: PIL.ImageColor :py:mod:`ImageColor` Module =========================== The :py:mod:`ImageColor` module contains color tables and converters from CSS3-style color specifiers to RGB tuples. This module is used by :py:meth:`PIL.Image.Image.new` and the :py:mod:`~PIL.ImageDraw` module, among others. .. _color-names: Color Names ----------- The ImageColor module supports the following string formats: * Hexadecimal color specifiers, given as ``#rgb`` or ``#rrggbb``. For example, ``#ff0000`` specifies pure red. * RGB functions, given as ``rgb(red, green, blue)`` where the color values are integers in the range 0 to 255. Alternatively, the color values can be given as three percentages (0% to 100%). For example, ``rgb(255,0,0)`` and ``rgb(100%,0%,0%)`` both specify pure red. * Hue-Saturation-Lightness (HSL) functions, given as ``hsl(hue, saturation%, lightness%)`` where hue is the color given as an angle between 0 and 360 (red=0, green=120, blue=240), saturation is a value between 0% and 100% (gray=0%, full color=100%), and lightness is a value between 0% and 100% (black=0%, normal=50%, white=100%). For example, ``hsl(0,100%,50%)`` is pure red. * Common HTML color names. The :py:mod:`~PIL.ImageColor` module provides some 140 standard color names, based on the colors supported by the X Window system and most web browsers. color names are case insensitive. For example, ``red`` and ``Red`` both specify pure red. Functions --------- .. autofunction:: getrgb .. autofunction:: getcolor pillow-2.3.0/docs/reference/ImageFile.rst0000644000175000001440000000161112257506326017146 0ustar dokousers.. py:module:: PIL.ImageFile .. py:currentmodule:: PIL.ImageFile :py:mod:`ImageFile` Module ========================== The :py:mod:`ImageFile` module provides support functions for the image open and save functions. In addition, it provides a :py:class:`Parser` class which can be used to decode an image piece by piece (e.g. while receiving it over a network connection). This class implements the same consumer interface as the standard **sgmllib** and **xmllib** modules. Example: Parse an image ----------------------- .. code-block:: python from PIL import ImageFile fp = open("lena.pgm", "rb") p = ImageFile.Parser() while 1: s = fp.read(1024) if not s: break p.feed(s) im = p.close() im.save("copy.jpg") :py:class:`~PIL.ImageFile.Parser` --------------------------------- .. autoclass:: PIL.ImageFile.Parser() :members: pillow-2.3.0/docs/reference/ImageChops.rst0000644000175000001440000000303712257506326017347 0ustar dokousers.. py:module:: PIL.ImageChops .. py:currentmodule:: PIL.ImageChops :py:mod:`ImageChops` ("Channel Operations") Module ================================================== The :py:mod:`ImageChops` module contains a number of arithmetical image operations, called channel operations (“chops”). These can be used for various purposes, including special effects, image compositions, algorithmic painting, and more. For more pre-made operations, see :py:mod:`ImageOps`. At this time, most channel operations are only implemented for 8-bit images (e.g. “L” and “RGB”). Functions --------- Most channel operations take one or two image arguments and returns a new image. Unless otherwise noted, the result of a channel operation is always clipped to the range 0 to MAX (which is 255 for all modes supported by the operations in this module). .. autofunction:: PIL.ImageChops.add .. autofunction:: PIL.ImageChops.add_modulo .. autofunction:: PIL.ImageChops.blend .. autofunction:: PIL.ImageChops.composite .. autofunction:: PIL.ImageChops.constant .. autofunction:: PIL.ImageChops.darker .. autofunction:: PIL.ImageChops.difference .. autofunction:: PIL.ImageChops.duplicate .. autofunction:: PIL.ImageChops.invert .. autofunction:: PIL.ImageChops.lighter .. autofunction:: PIL.ImageChops.logical_and .. autofunction:: PIL.ImageChops.logical_or .. autofunction:: PIL.ImageChops.multiply .. autofunction:: PIL.ImageChops.offset .. autofunction:: PIL.ImageChops.screen .. autofunction:: PIL.ImageChops.subtract .. autofunction:: PIL.ImageChops.subtract_modulo pillow-2.3.0/docs/reference/ImageMath.rst0000644000175000001440000001012412257506326017157 0ustar dokousers.. py:module:: PIL.ImageMath .. py:currentmodule:: PIL.ImageMath :py:mod:`ImageMath` Module ========================== The :py:mod:`ImageMath` module can be used to evaluate “image expressions”. The module provides a single eval function, which takes an expression string and one or more images. Example: Using the :py:mod:`~PIL.ImageMath` module -------------------------------------------------- .. code-block:: python import Image, ImageMath im1 = Image.open("image1.jpg") im2 = Image.open("image2.jpg") out = ImageMath.eval("convert(min(a, b), 'L')", a=im1, b=im2) out.save("result.png") .. py:function:: eval(expression, environment) Evaluate expression in the given environment. In the current version, :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band images, use the :py:meth:`~PIL.Image.Image.split` method or :py:func:`~PIL.Image.merge` function. :param expression: A string which uses the standard Python expression syntax. In addition to the standard operators, you can also use the functions described below. :param environment: A dictionary that maps image names to Image instances. You can use one or more keyword arguments instead of a dictionary, as shown in the above example. Note that the names must be valid Python identifiers. :return: An image, an integer value, a floating point value, or a pixel tuple, depending on the expression. Expression syntax ----------------- Expressions are standard Python expressions, but they’re evaluated in a non-standard environment. You can use PIL methods as usual, plus the following set of operators and functions: Standard Operators ^^^^^^^^^^^^^^^^^^ You can use standard arithmetical operators for addition (+), subtraction (-), multiplication (*), and division (/). The module also supports unary minus (-), modulo (%), and power (**) operators. Note that all operations are done with 32-bit integers or 32-bit floating point values, as necessary. For example, if you add two 8-bit images, the result will be a 32-bit integer image. If you add a floating point constant to an 8-bit image, the result will be a 32-bit floating point image. You can force conversion using the :py:func:`~PIL.ImageMath.convert`, :py:func:`~PIL.ImageMath.float`, and :py:func:`~PIL.ImageMath.int` functions described below. Bitwise Operators ^^^^^^^^^^^^^^^^^ The module also provides operations that operate on individual bits. This includes and (&), or (|), and exclusive or (^). You can also invert (~) all pixel bits. Note that the operands are converted to 32-bit signed integers before the bitwise operation is applied. This means that you’ll get negative values if you invert an ordinary greyscale image. You can use the and (&) operator to mask off unwanted bits. Bitwise operators don’t work on floating point images. Logical Operators ^^^^^^^^^^^^^^^^^ Logical operators like :keyword:`and`, :keyword:`or`, and :keyword:`not` work on entire images, rather than individual pixels. An empty image (all pixels zero) is treated as false. All other images are treated as true. Note that :keyword:`and` and :keyword:`or` return the last evaluated operand, while not always returns a boolean value. Built-in Functions ^^^^^^^^^^^^^^^^^^ These functions are applied to each individual pixel. .. py:currentmodule:: None .. py:function:: abs(image) Absolute value. .. py:function:: convert(image, mode) Convert image to the given mode. The mode must be given as a string constant. .. py:function:: float(image) Convert image to 32-bit floating point. This is equivalent to convert(image, “F”). .. py:function:: int(image) Convert image to 32-bit integer. This is equivalent to convert(image, “I”). Note that 1-bit and 8-bit images are automatically converted to 32-bit integers if necessary to get a correct result. .. py:function:: max(image1, image2) Maximum value. .. py:function:: min(image1, image2) Minimum value. pillow-2.3.0/docs/reference/ImageStat.rst0000644000175000001440000000215412257506326017205 0ustar dokousers.. py:module:: PIL.ImageStat .. py:currentmodule:: PIL.ImageStat :py:mod:`ImageStat` Module ========================== The :py:mod:`ImageStat` module calculates global statistics for an image, or for a region of an image. .. py:class:: PIL.ImageStat.Stat(image_or_list, mask=None) Calculate statistics for the given image. If a mask is included, only the regions covered by that mask are included in the statistics. You can also pass in a previously calculated histogram. :param image: A PIL image, or a precalculated histogram. :param mask: An optional mask. .. py:attribute:: extrema Min/max values for each band in the image. .. py:attribute:: count Total number of pixels. .. py:attribute:: sum Sum of all pixels. .. py:attribute:: sum2 Squared sum of all pixels. .. py:attribute:: pixel Average pixel level. .. py:attribute:: median Median pixel level. .. py:attribute:: rms RMS (root-mean-square). .. py:attribute:: var Variance. .. py:attribute:: stddev Standard deviation. pillow-2.3.0/docs/reference/ImageSequence.rst0000644000175000001440000000130212257506326020034 0ustar dokousers.. py:module:: PIL.ImageSequence .. py:currentmodule:: PIL.ImageSequence :py:mod:`ImageSequence` Module ============================== The :py:mod:`ImageSequence` module contains a wrapper class that lets you iterate over the frames of an image sequence. Extracting frames from an animation ----------------------------------- .. code-block:: python from PIL import Image, ImageSequence im = Image.open("animation.fli") index = 1 for frame in ImageSequence.Iterator(im): frame.save("frame%d.png" % index) index = index + 1 The :py:class:`~PIL.ImageSequence.Iterator` class ------------------------------------------------- .. autoclass:: PIL.ImageSequence.Iterator pillow-2.3.0/docs/reference/ImageFont.rst0000644000175000001440000000402612257506326017200 0ustar dokousers.. py:module:: PIL.ImageFont .. py:currentmodule:: PIL.ImageFont :py:mod:`ImageFont` Module ========================== The :py:mod:`ImageFont` module defines a class with the same name. Instances of this class store bitmap fonts, and are used with the :py:meth:`PIL.ImageDraw.Draw.text` method. PIL uses its own font file format to store bitmap fonts. You can use the :command`pilfont` utility to convert BDF and PCF font descriptors (X window font formats) to this format. Starting with version 1.1.4, PIL can be configured to support TrueType and OpenType fonts (as well as other font formats supported by the FreeType library). For earlier versions, TrueType support is only available as part of the imToolkit package Example ------- .. code-block:: python from PIL import ImageFont, ImageDraw draw = ImageDraw.Draw(image) # use a bitmap font font = ImageFont.load("arial.pil") draw.text((10, 10), "hello", font=font) # use a truetype font font = ImageFont.truetype("arial.ttf", 15) draw.text((10, 25), "world", font=font) Functions --------- .. autofunction:: PIL.ImageFont.load .. autofunction:: PIL.ImageFont.load_path .. autofunction:: PIL.ImageFont.truetype .. autofunction:: PIL.ImageFont.load_default Methods ------- .. py:method:: PIL.ImageFont.ImageFont.getsize(text) :return: (width, height) .. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='') Create a bitmap for the text. If the font uses antialiasing, the bitmap should have mode “L” and use a maximum value of 255. Otherwise, it should have mode “1”. :param text: Text to render. :param mode: Used by some graphics drivers to indicate what mode the driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the :py:mod:`PIL.Image.core` interface module. pillow-2.3.0/docs/reference/ImagePalette.rst0000644000175000001440000000131412257506326017665 0ustar dokousers.. py:module:: PIL.ImagePalette .. py:currentmodule:: PIL.ImagePalette :py:mod:`ImagePalette` Module ============================= The :py:mod:`ImagePalette` module contains a class of the same name to represent the color palette of palette mapped images. .. note:: This module was never well-documented. It hasn't changed since 2001, though, so it's probably safe for you to read the source code and puzzle out the internals if you need to. The :py:class:`~PIL.ImagePalette.ImagePalette` class has several methods, but they are all marked as "experimental." Read that as you will. The ``[source]`` link is there for a reason. .. autoclass:: PIL.ImagePalette.ImagePalette :members: pillow-2.3.0/docs/conf.py0000644000175000001440000000350412257506326014136 0ustar dokousers# -*- coding: utf-8 -*- import os import sys sys.path.insert(0, os.path.abspath('../')) import PIL ### general configuration ### needs_sphinx = '1.0' extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.intersphinx'] intersphinx_mapping = {'http://docs.python.org/2/': None} source_suffix = '.rst' templates_path = ['_templates'] #source_encoding = 'utf-8-sig' master_doc = 'index' project = u'Pillow (PIL fork)' copyright = (u'1997-2011 by Secret Labs AB,' u' 1995-2011 by Fredrik Lundh, 2010-2013 Alex Clark') # The short X.Y version. version = PIL.PILLOW_VERSION # The full version, including alpha/beta/rc tags. release = version # currently excluding autodoc'd plugs exclude_patterns = ['_build', 'plugins.rst'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' ### HTML output ### from better import better_theme_path html_theme_path = [better_theme_path] html_theme = 'better' html_title = "Pillow v{release} (PIL fork)".format(release=release) html_short_title = "Home" html_static_path = ['_static'] html_theme_options = {} html_sidebars = { '**': ['localtoc.html', 'sourcelink.html', 'sidebarhelp.html', 'searchbox.html'], 'index': ['globaltoc.html', 'sidebarhelp.html', 'searchbox.html'], } # Output file base name for HTML help builder. htmlhelp_basename = 'Pillowdoc' ### LaTeX output (RtD PDF output as well) ### latex_elements = {} latex_documents = [ ('index', 'Pillow.tex', u'Pillow (PIL fork) Documentation', u'Author', 'manual'), ] # skip_api_docs setting will skip PIL.rst if True. Used for working on the # guides; makes livereload basically instantaneous. def setup(app): app.add_config_value('skip_api_docs', False, True) skip_api_docs = False if skip_api_docs: exclude_patterns += ['PIL.rst'] pillow-2.3.0/docs/_static/0000755000175000001440000000000012274164154014261 5ustar dokouserspillow-2.3.0/docs/_static/.gitignore0000644000175000001440000000010012257506326016242 0ustar dokousers# Empty file, to make the directory available in the repository pillow-2.3.0/docs/installation.rst0000644000175000001440000002124612257506326016075 0ustar dokousersInstallation ============ .. warning:: Pillow >= 2.1.0 no longer supports "import _imaging". Please use "from PIL.Image import core as _imaging" instead. .. warning:: Pillow >= 1.0 no longer supports "import Image". Please use "from PIL import Image" instead. .. warning:: PIL and Pillow currently cannot co-exist in the same environment. If you want to use Pillow, please remove PIL first. .. note:: Pillow >= 2.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3. .. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. Simple installation ------------------- .. note:: The following instructions will install Pillow with support for most formats. See :ref:`external-libraries` for the features you would gain by installing the external libraries first. This page probably also include specific instructions for your platform. You can install Pillow with :command:`pip`:: $ pip install Pillow Or :command:`easy_install` (for installing `Python Eggs `_, as :command:`pip` does not support them):: $ easy_install Pillow Or download the `compressed archive from PyPI`_, extract it, and inside it run:: $ python setup.py install .. _compressed archive from PyPI: https://pypi.python.org/pypi/Pillow .. _external-libraries: External libraries ------------------ Many of Pillow's features require external libraries: * **libjpeg** provides JPEG functionality. * Pillow has been tested with libjpeg versions **6b**, **8**, and **9** * **zlib** provides access to compressed PNGs * **libtiff** provides group4 tiff functionality * Pillow has been tested with libtiff versions **3.x** and **4.0** * **libfreetype** provides type related services * **littlecms** provides color management * Pillow version 2.2.1 and below uses liblcms1, Pillow 2.3.0 and above uses liblcms2. Tested with **1.19** and **2.2**. * **libwebp** provides the Webp format. * Pillow has been tested with version **0.1.3**, which does not read transparent webp files. Version **0.3.0** supports transparency. * **tcl/tk** provides support for tkinter bitmap and photo images. If the prerequisites are installed in the standard library locations for your machine (e.g. :file:`/usr` or :file:`/usr/local`), no additional configuration should be required. If they are installed in a non-standard location, you may need to configure setuptools to use those locations (i.e. by editing :file:`setup.py` and/or :file:`setup.cfg`). Once you have installed the prerequisites, run:: $ pip install Pillow Linux installation ------------------ .. note:: Fedora, Debian/Ubuntu, and ArchLinux include Pillow (instead of PIL) with their distributions. Consider using those instead of installing manually. .. note:: You *do not* need to install all of the external libraries to get Pillow's basics to work. **We do not provide binaries for Linux.** If you didn't build Python from source, make sure you have Python's development libraries installed. In Debian or Ubuntu:: $ sudo apt-get install python-dev python-setuptools Or for Python 3:: $ sudo apt-get install python3-dev python3-setuptools In Fedora, the command is:: $ sudo yum install python-devel Prerequisites are installed on **Ubuntu 10.04 LTS** with:: $ sudo apt-get install libtiff4-dev libjpeg62-dev zlib1g-dev \ libfreetype6-dev tcl8.5-dev tk8.5-dev Prerequisites are installed with on **Ubuntu 12.04 LTS** or **Raspian Wheezy 7.0** with:: $ sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev Prerequisites are installed on **Fedora 20** with:: $ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel \ lcms2-devel libwebp-devel tcl-devel tk-devel Mac OS X installation --------------------- .. note:: You *do not* need to install all of the external libraries to get Pillow's basics to work. **We do not provide binaries for OS X**, so you'll need XCode to install Pillow. (XCode 4.2 on 10.6 will work with the Official Python binary distribution. Otherwise, use whatever XCode you used to compile Python.) The easiest way to install the prerequisites is via `Homebrew `_. After you install Homebrew, run:: $ brew install libtiff libjpeg webp littlecms If you've built your own Python, then you should be able to install Pillow using:: $ pip install Pillow Windows installation -------------------- We provide binaries for Windows in the form of Python Eggs and `Python Wheels `_: Python Eggs ^^^^^^^^^^^ .. note:: :command:`pip` does not support Python Eggs; use :command:`easy_install` instead. :: $ easy_install Pillow Python Wheels ^^^^^^^^^^^^^ .. Note:: Experimental. Requires setuptools >=0.8 and pip >=1.4.1 :: $ pip install --use-wheel Pillow Platform support ---------------- Current platform support for Pillow. Binary distributions are contributed for each release on a volunteer basis, but the source should compile and run everywhere platform support is listed. In general, we aim to support all current versions of Linux, OS X, and Windows. .. note:: Contributors please test on your platform, edit this document, and send a pull request. +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ |**Operating system** |**Supported**|**Tested Python versions** |**Tested Pillow versions** |**Tested processors** | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | CentOS 6.3 |Yes | 2.7,3.3 | |x86 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Mac OS X 10.8 Mountain Lion |Yes | 2.6,2.7,3.2,3.3 | |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Mac OS X 10.7 Lion |Yes | 2.6,2.7,3.2,3.3 | 2.2.0 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Redhat Linux 6 |Yes | 2.6 | |x86 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Ubuntu Linux 10.04 LTS |Yes | 2.6 | 2.2.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS |Yes | 2.6,2.7,3.2,3.3,PyPy2.1 | 2.2.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Raspian Wheezy |Yes | 2.7,3.2 | 2.2.0 |arm | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Gentoo Linux |Yes | 2.7,3.2 | 2.1.0 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Windows 7 Pro |Yes | 2.7,3.2,3.3 | 2.2.1 |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Windows Server 2008 R2 Enterprise|Yes | 3.3 | |x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ | Windows 8 Pro |Yes | 2.6,2.7,3.2,3.3,3.4a3 | 2.2.0 |x86,x86-64 | +----------------------------------+-------------+------------------------------+------------------------------+-----------------------+ pillow-2.3.0/docs/requirements.txt0000644000175000001440000000054212257506326016122 0ustar dokousers# requirements for working on docs # install pillow from master if you're into that, but RtD needs this pillow>=2.2.1 Jinja2==2.7.1 MarkupSafe==0.18 Pygments==1.6 Sphinx==1.1.3 docopt==0.6.1 docutils==0.11 wsgiref==0.1.2 sphinx-better-theme==0.1.5 # livereload not strictly necessary but really useful (make livehtml) tornado==3.1.1 livereload==1.0.1 pillow-2.3.0/docs/Makefile0000644000175000001440000001301612257506326014276 0ustar dokousers# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PillowPILfork.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PillowPILfork.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/PillowPILfork" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PillowPILfork" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." livehtml: html livereload $(BUILDDIR)/html -p 33233 pillow-2.3.0/docs/make.bat0000644000175000001440000001176612257506326014255 0ustar dokousers@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PillowPILfork.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PillowPILfork.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end pillow-2.3.0/docs/BUILDME0000644000175000001440000000035712257506326013646 0ustar dokousers# $Id$ # quick build (for lazy programmers). for more information on the # build process, see the README file. if [ "$1" = "clean" ]; then python setup.py clean rm -f *.so PIL/*.so fi python setup.py build_ext -i python selftest.py pillow-2.3.0/_imagingcms.c0000644000175000001440000005153212260205272014322 0ustar dokousers/* * pyCMS * a Python / PIL interface to the littleCMS ICC Color Management System * Copyright (C) 2002-2003 Kevin Cazabon * kevin@cazabon.com * http://www.cazabon.com * Adapted/reworked for PIL by Fredrik Lundh * Copyright (c) 2009 Fredrik Lundh * * pyCMS home page: http://www.cazabon.com/pyCMS * littleCMS home page: http://www.littlecms.com * (littleCMS is Copyright (C) 1998-2001 Marti Maria) * * Originally released under LGPL. Graciously donated to PIL in * March 2009, for distribution under the standard PIL license */ #define COPYRIGHTINFO "\ pyCMS\n\ a Python / PIL interface to the littleCMS ICC Color Management System\n\ Copyright (C) 2002-2003 Kevin Cazabon\n\ kevin@cazabon.com\n\ http://www.cazabon.com\n\ " #include "Python.h" #include "lcms2.h" #include "Imaging.h" #include "py3.h" #ifdef WIN32 #include #include #include #endif #define PYCMSVERSION "1.0.0 pil" /* version history */ /* 1.0.0 pil Integrating littleCMS2 0.1.0 pil integration & refactoring 0.0.2 alpha: Minor updates, added interfaces to littleCMS features, Jan 6, 2003 - fixed some memory holes in how transforms/profiles were created and passed back to Python due to improper destructor setup for PyCObjects - added buildProofTransformFromOpenProfiles() function - eliminated some code redundancy, centralizing several common tasks with internal functions 0.0.1 alpha: First public release Dec 26, 2002 */ /* known to-do list with current version: Verify that PILmode->littleCMStype conversion in findLCMStype is correct for all PIL modes (it probably isn't for the more obscure ones) Add support for creating custom RGB profiles on the fly Add support for checking presence of a specific tag in a profile Add support for other littleCMS features as required */ /* INTENT_PERCEPTUAL 0 INTENT_RELATIVE_COLORIMETRIC 1 INTENT_SATURATION 2 INTENT_ABSOLUTE_COLORIMETRIC 3 */ /* -------------------------------------------------------------------- */ /* wrapper classes */ /* a profile represents the ICC characteristics for a specific device */ typedef struct { PyObject_HEAD cmsHPROFILE profile; } CmsProfileObject; static PyTypeObject CmsProfile_Type; #define CmsProfile_Check(op) (Py_TYPE(op) == &CmsProfile_Type) static PyObject* cms_profile_new(cmsHPROFILE profile) { CmsProfileObject* self; self = PyObject_New(CmsProfileObject, &CmsProfile_Type); if (!self) return NULL; self->profile = profile; return (PyObject*) self; } static PyObject* cms_profile_open(PyObject* self, PyObject* args) { cmsHPROFILE hProfile; char* sProfile; if (!PyArg_ParseTuple(args, "s:profile_open", &sProfile)) return NULL; hProfile = cmsOpenProfileFromFile(sProfile, "r"); if (!hProfile) { PyErr_SetString(PyExc_IOError, "cannot open profile file"); return NULL; } return cms_profile_new(hProfile); } static PyObject* cms_profile_fromstring(PyObject* self, PyObject* args) { cmsHPROFILE hProfile; char* pProfile; int nProfile; #if PY_VERSION_HEX >= 0x03000000 if (!PyArg_ParseTuple(args, "y#:profile_frombytes", &pProfile, &nProfile)) return NULL; #else if (!PyArg_ParseTuple(args, "s#:profile_fromstring", &pProfile, &nProfile)) return NULL; #endif hProfile = cmsOpenProfileFromMem(pProfile, nProfile); if (!hProfile) { PyErr_SetString(PyExc_IOError, "cannot open profile from string"); return NULL; } return cms_profile_new(hProfile); } static void cms_profile_dealloc(CmsProfileObject* self) { (void) cmsCloseProfile(self->profile); PyObject_Del(self); } /* a transform represents the mapping between two profiles */ typedef struct { PyObject_HEAD char mode_in[8]; char mode_out[8]; cmsHTRANSFORM transform; } CmsTransformObject; static PyTypeObject CmsTransform_Type; #define CmsTransform_Check(op) (Py_TYPE(op) == &CmsTransform_Type) static PyObject* cms_transform_new(cmsHTRANSFORM transform, char* mode_in, char* mode_out) { CmsTransformObject* self; self = PyObject_New(CmsTransformObject, &CmsTransform_Type); if (!self) return NULL; self->transform = transform; strcpy(self->mode_in, mode_in); strcpy(self->mode_out, mode_out); return (PyObject*) self; } static void cms_transform_dealloc(CmsTransformObject* self) { cmsDeleteTransform(self->transform); PyObject_Del(self); } /* -------------------------------------------------------------------- */ /* internal functions */ static const char* findICmode(cmsColorSpaceSignature cs) { switch (cs) { case cmsSigXYZData: return "XYZ"; case cmsSigLabData: return "LAB"; case cmsSigLuvData: return "LUV"; case cmsSigYCbCrData: return "YCbCr"; case cmsSigYxyData: return "YXY"; case cmsSigRgbData: return "RGB"; case cmsSigGrayData: return "L"; case cmsSigHsvData: return "HSV"; case cmsSigHlsData: return "HLS"; case cmsSigCmykData: return "CMYK"; case cmsSigCmyData: return "CMY"; default: return ""; /* other TBA */ } } static cmsUInt32Number findLCMStype(char* PILmode) { if (strcmp(PILmode, "RGB") == 0) { return TYPE_RGBA_8; } else if (strcmp(PILmode, "RGBA") == 0) { return TYPE_RGBA_8; } else if (strcmp(PILmode, "RGBX") == 0) { return TYPE_RGBA_8; } else if (strcmp(PILmode, "RGBA;16B") == 0) { return TYPE_RGBA_16; } else if (strcmp(PILmode, "CMYK") == 0) { return TYPE_CMYK_8; } else if (strcmp(PILmode, "L") == 0) { return TYPE_GRAY_8; } else if (strcmp(PILmode, "L;16") == 0) { return TYPE_GRAY_16; } else if (strcmp(PILmode, "L;16B") == 0) { return TYPE_GRAY_16_SE; } else if (strcmp(PILmode, "YCCA") == 0) { return TYPE_YCbCr_8; } else if (strcmp(PILmode, "YCC") == 0) { return TYPE_YCbCr_8; } else if (strcmp(PILmode, "LAB") == 0) { // LabX equvalent like ALab, but not reversed -- no #define in lcms2 return (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)); } else { /* take a wild guess... but you probably should fail instead. */ return TYPE_GRAY_8; /* so there's no buffer overrun... */ } } static int pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) { int i; if (im->xsize > imOut->xsize || im->ysize > imOut->ysize) return -1; Py_BEGIN_ALLOW_THREADS for (i = 0; i < im->ysize; i++) cmsDoTransform(hTransform, im->image[i], imOut->image[i], im->xsize); Py_END_ALLOW_THREADS return 0; } static cmsHTRANSFORM _buildTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, char *sInMode, char *sOutMode, int iRenderingIntent, cmsUInt32Number cmsFLAGS) { cmsHTRANSFORM hTransform; Py_BEGIN_ALLOW_THREADS /* create the transform */ hTransform = cmsCreateTransform(hInputProfile, findLCMStype(sInMode), hOutputProfile, findLCMStype(sOutMode), iRenderingIntent, cmsFLAGS); Py_END_ALLOW_THREADS if (!hTransform) PyErr_SetString(PyExc_ValueError, "cannot build transform"); return hTransform; /* if NULL, an exception is set */ } static cmsHTRANSFORM _buildProofTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, cmsHPROFILE hProofProfile, char *sInMode, char *sOutMode, int iRenderingIntent, int iProofIntent, cmsUInt32Number cmsFLAGS) { cmsHTRANSFORM hTransform; Py_BEGIN_ALLOW_THREADS /* create the transform */ hTransform = cmsCreateProofingTransform(hInputProfile, findLCMStype(sInMode), hOutputProfile, findLCMStype(sOutMode), hProofProfile, iRenderingIntent, iProofIntent, cmsFLAGS); Py_END_ALLOW_THREADS if (!hTransform) PyErr_SetString(PyExc_ValueError, "cannot build proof transform"); return hTransform; /* if NULL, an exception is set */ } /* -------------------------------------------------------------------- */ /* Python callable functions */ static PyObject * buildTransform(PyObject *self, PyObject *args) { CmsProfileObject *pInputProfile; CmsProfileObject *pOutputProfile; char *sInMode; char *sOutMode; int iRenderingIntent = 0; int cmsFLAGS = 0; cmsHTRANSFORM transform = NULL; if (!PyArg_ParseTuple(args, "O!O!ss|ii:buildTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &sInMode, &sOutMode, &iRenderingIntent, &cmsFLAGS)) return NULL; transform = _buildTransform(pInputProfile->profile, pOutputProfile->profile, sInMode, sOutMode, iRenderingIntent, cmsFLAGS); if (!transform) return NULL; return cms_transform_new(transform, sInMode, sOutMode); } static PyObject * buildProofTransform(PyObject *self, PyObject *args) { CmsProfileObject *pInputProfile; CmsProfileObject *pOutputProfile; CmsProfileObject *pProofProfile; char *sInMode; char *sOutMode; int iRenderingIntent = 0; int iProofIntent = 0; int cmsFLAGS = 0; cmsHTRANSFORM transform = NULL; if (!PyArg_ParseTuple(args, "O!O!O!ss|iii:buildProofTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &CmsProfile_Type, &pProofProfile, &sInMode, &sOutMode, &iRenderingIntent, &iProofIntent, &cmsFLAGS)) return NULL; transform = _buildProofTransform(pInputProfile->profile, pOutputProfile->profile, pProofProfile->profile, sInMode, sOutMode, iRenderingIntent, iProofIntent, cmsFLAGS); if (!transform) return NULL; return cms_transform_new(transform, sInMode, sOutMode); } static PyObject * cms_transform_apply(CmsTransformObject *self, PyObject *args) { Py_ssize_t idIn; Py_ssize_t idOut; Imaging im; Imaging imOut; int result; if (!PyArg_ParseTuple(args, "nn:apply", &idIn, &idOut)) return NULL; im = (Imaging) idIn; imOut = (Imaging) idOut; result = pyCMSdoTransform(im, imOut, self->transform); return Py_BuildValue("i", result); } /* -------------------------------------------------------------------- */ /* Python-Callable On-The-Fly profile creation functions */ static PyObject * createProfile(PyObject *self, PyObject *args) { char *sColorSpace; cmsHPROFILE hProfile; cmsFloat64Number dColorTemp = 0.0; cmsCIExyY whitePoint; cmsBool result; if (!PyArg_ParseTuple(args, "s|d:createProfile", &sColorSpace, &dColorTemp)) return NULL; if (strcmp(sColorSpace, "LAB") == 0) { if (dColorTemp > 0.0) { result = cmsWhitePointFromTemp(&whitePoint, dColorTemp); if (!result) { PyErr_SetString(PyExc_ValueError, "ERROR: Could not calculate white point from color temperature provided, must be float in degrees Kelvin"); return NULL; } hProfile = cmsCreateLab2Profile(&whitePoint); } else { hProfile = cmsCreateLab2Profile(NULL); } } else if (strcmp(sColorSpace, "XYZ") == 0) { hProfile = cmsCreateXYZProfile(); } else if (strcmp(sColorSpace, "sRGB") == 0) { hProfile = cmsCreate_sRGBProfile(); } else { hProfile = NULL; } if (!hProfile) { PyErr_SetString(PyExc_ValueError, "failed to create requested color space"); return NULL; } return cms_profile_new(hProfile); } /* -------------------------------------------------------------------- */ /* profile methods */ static PyObject * cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) { cmsBool result; int intent; int direction; if (!PyArg_ParseTuple(args, "ii:is_intent_supported", &intent, &direction)) return NULL; result = cmsIsIntentSupported(self->profile, intent, direction); /* printf("cmsIsIntentSupported(%p, %d, %d) => %d\n", self->profile, intent, direction, result); */ return PyInt_FromLong(result != 0); } #ifdef WIN32 static PyObject * cms_get_display_profile_win32(PyObject* self, PyObject* args) { char filename[MAX_PATH]; cmsUInt32Number filename_size; BOOL ok; int handle = 0; int is_dc = 0; if (!PyArg_ParseTuple(args, "|ii:get_display_profile", &handle, &is_dc)) return NULL; filename_size = sizeof(filename); if (is_dc) { ok = GetICMProfile((HDC) handle, &filename_size, filename); } else { HDC dc = GetDC((HWND) handle); ok = GetICMProfile(dc, &filename_size, filename); ReleaseDC((HWND) handle, dc); } if (ok) return PyUnicode_FromStringAndSize(filename, filename_size-1); Py_INCREF(Py_None); return Py_None; } #endif /* -------------------------------------------------------------------- */ /* Python interface setup */ static PyMethodDef pyCMSdll_methods[] = { {"profile_open", cms_profile_open, 1}, {"profile_frombytes", cms_profile_fromstring, 1}, {"profile_fromstring", cms_profile_fromstring, 1}, /* profile and transform functions */ {"buildTransform", buildTransform, 1}, {"buildProofTransform", buildProofTransform, 1}, {"createProfile", createProfile, 1}, /* platform specific tools */ #ifdef WIN32 {"get_display_profile_win32", cms_get_display_profile_win32, 1}, #endif {NULL, NULL} }; static struct PyMethodDef cms_profile_methods[] = { {"is_intent_supported", (PyCFunction) cms_profile_is_intent_supported, 1}, {NULL, NULL} /* sentinel */ }; static PyObject* _profile_getattr(CmsProfileObject* self, cmsInfoType field) { // UNDONE -- check that I'm getting the right fields on these. // return PyUnicode_DecodeFSDefault(cmsTakeProductName(self->profile)); //wchar_t buf[256]; -- UNDONE need wchar_t for unicode version. char buf[256]; cmsUInt32Number written; written = cmsGetProfileInfoASCII(self->profile, field, "en", "us", buf, 256); if (written) { return PyUnicode_FromString(buf); } // UNDONE suppressing error here by sending back blank string. return PyUnicode_FromString(""); } static PyObject* cms_profile_getattr_product_desc(CmsProfileObject* self, void* closure) { // description was Description != 'Copyright' || or "%s - %s" (manufacturer, model) in 1.x return _profile_getattr(self, cmsInfoDescription); } /* use these four for the individual fields. */ static PyObject* cms_profile_getattr_product_description(CmsProfileObject* self, void* closure) { return _profile_getattr(self, cmsInfoDescription); } static PyObject* cms_profile_getattr_product_model(CmsProfileObject* self, void* closure) { return _profile_getattr(self, cmsInfoModel); } static PyObject* cms_profile_getattr_product_manufacturer(CmsProfileObject* self, void* closure) { return _profile_getattr(self, cmsInfoManufacturer); } static PyObject* cms_profile_getattr_product_copyright(CmsProfileObject* self, void* closure) { return _profile_getattr(self, cmsInfoCopyright); } static PyObject* cms_profile_getattr_rendering_intent(CmsProfileObject* self, void* closure) { return PyInt_FromLong(cmsGetHeaderRenderingIntent(self->profile)); } static PyObject* cms_profile_getattr_pcs(CmsProfileObject* self, void* closure) { return PyUnicode_DecodeFSDefault(findICmode(cmsGetPCS(self->profile))); } static PyObject* cms_profile_getattr_color_space(CmsProfileObject* self, void* closure) { return PyUnicode_DecodeFSDefault(findICmode(cmsGetColorSpace(self->profile))); } /* FIXME: add more properties (creation_datetime etc) */ static struct PyGetSetDef cms_profile_getsetters[] = { { "product_desc", (getter) cms_profile_getattr_product_desc }, { "product_description", (getter) cms_profile_getattr_product_description }, { "product_manufacturer", (getter) cms_profile_getattr_product_manufacturer }, { "product_model", (getter) cms_profile_getattr_product_model }, { "product_copyright", (getter) cms_profile_getattr_product_copyright }, { "rendering_intent", (getter) cms_profile_getattr_rendering_intent }, { "pcs", (getter) cms_profile_getattr_pcs }, { "color_space", (getter) cms_profile_getattr_color_space }, { NULL } }; static PyTypeObject CmsProfile_Type = { PyVarObject_HEAD_INIT(NULL, 0) "CmsProfile", sizeof(CmsProfileObject), 0, /* methods */ (destructor) cms_profile_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ cms_profile_methods, /*tp_methods*/ 0, /*tp_members*/ cms_profile_getsetters, /*tp_getset*/ }; static struct PyMethodDef cms_transform_methods[] = { {"apply", (PyCFunction) cms_transform_apply, 1}, {NULL, NULL} /* sentinel */ }; static PyObject* cms_transform_getattr_inputMode(CmsTransformObject* self, void* closure) { return PyUnicode_FromString(self->mode_in); } static PyObject* cms_transform_getattr_outputMode(CmsTransformObject* self, void* closure) { return PyUnicode_FromString(self->mode_out); } static struct PyGetSetDef cms_transform_getsetters[] = { { "inputMode", (getter) cms_transform_getattr_inputMode }, { "outputMode", (getter) cms_transform_getattr_outputMode }, { NULL } }; static PyTypeObject CmsTransform_Type = { PyVarObject_HEAD_INIT(NULL, 0) "CmsTransform", sizeof(CmsTransformObject), 0, /* methods */ (destructor) cms_transform_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ cms_transform_methods, /*tp_methods*/ 0, /*tp_members*/ cms_transform_getsetters, /*tp_getset*/ }; static int setup_module(PyObject* m) { PyObject *d; PyObject *v; d = PyModule_GetDict(m); /* Ready object types */ PyType_Ready(&CmsProfile_Type); PyType_Ready(&CmsTransform_Type); d = PyModule_GetDict(m); v = PyUnicode_FromFormat("%d.%d", LCMS_VERSION / 100, LCMS_VERSION % 100); PyDict_SetItemString(d, "littlecms_version", v); return 0; } #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__imagingcms(void) { PyObject* m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_imagingcms", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ pyCMSdll_methods, /* m_methods */ }; m = PyModule_Create(&module_def); if (setup_module(m) < 0) return NULL; return m; } #else PyMODINIT_FUNC init_imagingcms(void) { PyObject *m = Py_InitModule("_imagingcms", pyCMSdll_methods); setup_module(m); } #endif pillow-2.3.0/setup.cfg0000644000175000001440000000007312261041654013517 0ustar dokousers[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 pillow-2.3.0/_imagingmath.c0000644000175000001440000001614112257506326014500 0ustar dokousers/* * The Python Imaging Library * * a simple math add-on for the Python Imaging Library * * history: * 1999-02-15 fl Created * 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 * * Copyright (c) 1999-2005 by Secret Labs AB * Copyright (c) 2005 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #include "Python.h" #include "Imaging.h" #include "py3.h" #include "math.h" #include "float.h" #define MAX_INT32 2147483647.0 #define MIN_INT32 -2147483648.0 #if defined(_MSC_VER) && _MSC_VER < 1500 /* python 2.1/2.2/2.3 = VC98 = VER 1200 */ /* python 2.4/2.5 = VS.NET 2003 = VER 1310 */ /* python 2.6 = VS 9.0 = VER 1500 */ #define powf(a, b) ((float) pow((double) (a), (double) (b))) #endif #define UNOP(name, op, type)\ void name(Imaging out, Imaging im1)\ {\ int x, y;\ for (y = 0; y < out->ysize; y++) {\ type* p0 = (type*) out->image[y];\ type* p1 = (type*) im1->image[y];\ for (x = 0; x < out->xsize; x++) {\ *p0 = op(type, *p1);\ p0++; p1++;\ }\ }\ } #define BINOP(name, op, type)\ void name(Imaging out, Imaging im1, Imaging im2)\ {\ int x, y;\ for (y = 0; y < out->ysize; y++) {\ type* p0 = (type*) out->image[y];\ type* p1 = (type*) im1->image[y];\ type* p2 = (type*) im2->image[y];\ for (x = 0; x < out->xsize; x++) {\ *p0 = op(type, *p1, *p2);\ p0++; p1++; p2++;\ }\ }\ } #define NEG(type, v1) -(v1) #define INVERT(type, v1) ~(v1) #define ADD(type, v1, v2) (v1)+(v2) #define SUB(type, v1, v2) (v1)-(v2) #define MUL(type, v1, v2) (v1)*(v2) #define MIN(type, v1, v2) ((v1)<(v2))?(v1):(v2) #define MAX(type, v1, v2) ((v1)>(v2))?(v1):(v2) #define AND(type, v1, v2) (v1)&(v2) #define OR(type, v1, v2) (v1)|(v2) #define XOR(type, v1, v2) (v1)^(v2) #define LSHIFT(type, v1, v2) (v1)<<(v2) #define RSHIFT(type, v1, v2) (v1)>>(v2) #define ABS_I(type, v1) abs((v1)) #define ABS_F(type, v1) fabs((v1)) /* -------------------------------------------------------------------- * some day, we should add FPE protection mechanisms. see pyfpe.h for * details. * * PyFPE_START_PROTECT("Error in foobar", return 0) * PyFPE_END_PROTECT(result) */ #define DIV_I(type, v1, v2) ((v2)!=0)?(v1)/(v2):0 #define DIV_F(type, v1, v2) ((v2)!=0.0F)?(v1)/(v2):0.0F #define MOD_I(type, v1, v2) ((v2)!=0)?(v1)%(v2):0 #define MOD_F(type, v1, v2) ((v2)!=0.0F)?fmod((v1),(v2)):0.0F static int powi(int x, int y) { double v = pow(x, y) + 0.5; if (errno == EDOM) return 0; if (v < MIN_INT32) v = MIN_INT32; else if (v > MAX_INT32) v = MAX_INT32; return (int) v; } #define POW_I(type, v1, v2) powi(v1, v2) #define POW_F(type, v1, v2) powf(v1, v2) /* FIXME: EDOM handling */ #define DIFF_I(type, v1, v2) abs((v1)-(v2)) #define DIFF_F(type, v1, v2) fabs((v1)-(v2)) #define EQ(type, v1, v2) (v1)==(v2) #define NE(type, v1, v2) (v1)!=(v2) #define LT(type, v1, v2) (v1)<(v2) #define LE(type, v1, v2) (v1)<=(v2) #define GT(type, v1, v2) (v1)>(v2) #define GE(type, v1, v2) (v1)>=(v2) UNOP(abs_I, ABS_I, INT32) UNOP(neg_I, NEG, INT32) BINOP(add_I, ADD, INT32) BINOP(sub_I, SUB, INT32) BINOP(mul_I, MUL, INT32) BINOP(div_I, DIV_I, INT32) BINOP(mod_I, MOD_I, INT32) BINOP(pow_I, POW_I, INT32) BINOP(diff_I, DIFF_I, INT32) UNOP(invert_I, INVERT, INT32) BINOP(and_I, AND, INT32) BINOP(or_I, OR, INT32) BINOP(xor_I, XOR, INT32) BINOP(lshift_I, LSHIFT, INT32) BINOP(rshift_I, RSHIFT, INT32) BINOP(min_I, MIN, INT32) BINOP(max_I, MAX, INT32) BINOP(eq_I, EQ, INT32) BINOP(ne_I, NE, INT32) BINOP(lt_I, LT, INT32) BINOP(le_I, LE, INT32) BINOP(gt_I, GT, INT32) BINOP(ge_I, GE, INT32) UNOP(abs_F, ABS_F, FLOAT32) UNOP(neg_F, NEG, FLOAT32) BINOP(add_F, ADD, FLOAT32) BINOP(sub_F, SUB, FLOAT32) BINOP(mul_F, MUL, FLOAT32) BINOP(div_F, DIV_F, FLOAT32) BINOP(mod_F, MOD_F, FLOAT32) BINOP(pow_F, POW_F, FLOAT32) BINOP(diff_F, DIFF_F, FLOAT32) BINOP(min_F, MIN, FLOAT32) BINOP(max_F, MAX, FLOAT32) BINOP(eq_F, EQ, FLOAT32) BINOP(ne_F, NE, FLOAT32) BINOP(lt_F, LT, FLOAT32) BINOP(le_F, LE, FLOAT32) BINOP(gt_F, GT, FLOAT32) BINOP(ge_F, GE, FLOAT32) static PyObject * _unop(PyObject* self, PyObject* args) { Imaging out; Imaging im1; void (*unop)(Imaging, Imaging); Py_ssize_t op, i0, i1; if (!PyArg_ParseTuple(args, "nnn", &op, &i0, &i1)) return NULL; out = (Imaging) i0; im1 = (Imaging) i1; unop = (void*) op; unop(out, im1); Py_INCREF(Py_None); return Py_None; } static PyObject * _binop(PyObject* self, PyObject* args) { Imaging out; Imaging im1; Imaging im2; void (*binop)(Imaging, Imaging, Imaging); Py_ssize_t op, i0, i1, i2; if (!PyArg_ParseTuple(args, "nnnn", &op, &i0, &i1, &i2)) return NULL; out = (Imaging) i0; im1 = (Imaging) i1; im2 = (Imaging) i2; binop = (void*) op; binop(out, im1, im2); Py_INCREF(Py_None); return Py_None; } static PyMethodDef _functions[] = { {"unop", _unop, 1}, {"binop", _binop, 1}, {NULL, NULL} }; static void install(PyObject *d, char* name, void* value) { PyObject *v = PyInt_FromSsize_t((Py_ssize_t) value); if (!v || PyDict_SetItemString(d, name, v)) PyErr_Clear(); Py_XDECREF(v); } static int setup_module(PyObject* m) { PyObject* d = PyModule_GetDict(m); install(d, "abs_I", abs_I); install(d, "neg_I", neg_I); install(d, "add_I", add_I); install(d, "sub_I", sub_I); install(d, "diff_I", diff_I); install(d, "mul_I", mul_I); install(d, "div_I", div_I); install(d, "mod_I", mod_I); install(d, "min_I", min_I); install(d, "max_I", max_I); install(d, "pow_I", pow_I); install(d, "invert_I", invert_I); install(d, "and_I", and_I); install(d, "or_I", or_I); install(d, "xor_I", xor_I); install(d, "lshift_I", lshift_I); install(d, "rshift_I", rshift_I); install(d, "eq_I", eq_I); install(d, "ne_I", ne_I); install(d, "lt_I", lt_I); install(d, "le_I", le_I); install(d, "gt_I", gt_I); install(d, "ge_I", ge_I); install(d, "abs_F", abs_F); install(d, "neg_F", neg_F); install(d, "add_F", add_F); install(d, "sub_F", sub_F); install(d, "diff_F", diff_F); install(d, "mul_F", mul_F); install(d, "div_F", div_F); install(d, "mod_F", mod_F); install(d, "min_F", min_F); install(d, "max_F", max_F); install(d, "pow_F", pow_F); install(d, "eq_F", eq_F); install(d, "ne_F", ne_F); install(d, "lt_F", lt_F); install(d, "le_F", le_F); install(d, "gt_F", gt_F); install(d, "ge_F", ge_F); return 0; } #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__imagingmath(void) { PyObject* m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_imagingmath", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ _functions, /* m_methods */ }; m = PyModule_Create(&module_def); if (setup_module(m) < 0) return NULL; return m; } #else PyMODINIT_FUNC init_imagingmath(void) { PyObject* m = Py_InitModule("_imagingmath", _functions); setup_module(m); } #endif pillow-2.3.0/_imagingtk.c0000644000175000001440000000345212257506326014166 0ustar dokousers/* * The Python Imaging Library. * * tkinter hooks * * history: * 99-07-26 fl created * 99-08-15 fl moved to its own support module * * Copyright (c) Secret Labs AB 1999. * * See the README file for information on usage and redistribution. */ #include "Python.h" #include "Imaging.h" #include "tk.h" /* must link with Tk/tkImaging.c */ extern void TkImaging_Init(Tcl_Interp* interp); /* copied from _tkinter.c (this isn't as bad as it may seem: for new versions, we use _tkinter's interpaddr hook instead, and all older versions use this structure layout) */ typedef struct { PyObject_HEAD Tcl_Interp* interp; } TkappObject; static PyObject* _tkinit(PyObject* self, PyObject* args) { Tcl_Interp* interp; Py_ssize_t arg; int is_interp; if (!PyArg_ParseTuple(args, "ni", &arg, &is_interp)) return NULL; if (is_interp) interp = (Tcl_Interp*) arg; else { TkappObject* app; /* Do it the hard way. This will break if the TkappObject layout changes */ app = (TkappObject*) arg; interp = app->interp; } /* This will bomb if interp is invalid... */ TkImaging_Init(interp); Py_INCREF(Py_None); return Py_None; } static PyMethodDef functions[] = { /* Tkinter interface stuff */ {"tkinit", (PyCFunction)_tkinit, 1}, {NULL, NULL} /* sentinel */ }; #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__imagingtk(void) { static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_imagingtk", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ functions, /* m_methods */ }; return PyModule_Create(&module_def); } #else PyMODINIT_FUNC init_imagingtk(void) { Py_InitModule("_imagingtk", functions); } #endif pillow-2.3.0/PIL/0000755000175000001440000000000012274164154012327 5ustar dokouserspillow-2.3.0/PIL/__init__.py0000644000175000001440000000276012257506564014453 0ustar dokousers# # The Python Imaging Library. # $Id$ # # package placeholder # # Copyright (c) 1999 by Secret Labs AB. # # See the README file for information on usage and redistribution. # # ;-) VERSION = '1.1.7' # PIL version PILLOW_VERSION = '2.3.0' # Pillow _plugins = ['ArgImagePlugin', 'BmpImagePlugin', 'BufrStubImagePlugin', 'CurImagePlugin', 'DcxImagePlugin', 'EpsImagePlugin', 'FitsStubImagePlugin', 'FliImagePlugin', 'FpxImagePlugin', 'GbrImagePlugin', 'GifImagePlugin', 'GribStubImagePlugin', 'Hdf5StubImagePlugin', 'IcnsImagePlugin', 'IcoImagePlugin', 'ImImagePlugin', 'ImtImagePlugin', 'IptcImagePlugin', 'JpegImagePlugin', 'McIdasImagePlugin', 'MicImagePlugin', 'MpegImagePlugin', 'MspImagePlugin', 'PalmImagePlugin', 'PcdImagePlugin', 'PcxImagePlugin', 'PdfImagePlugin', 'PixarImagePlugin', 'PngImagePlugin', 'PpmImagePlugin', 'PsdImagePlugin', 'SgiImagePlugin', 'SpiderImagePlugin', 'SunImagePlugin', 'TgaImagePlugin', 'TiffImagePlugin', 'WebPImagePlugin', 'WmfImagePlugin', 'XbmImagePlugin', 'XpmImagePlugin', 'XVThumbImagePlugin'] pillow-2.3.0/PIL/XVThumbImagePlugin.py0000644000175000001440000000346412257506326016371 0ustar dokousers# # The Python Imaging Library. # $Id$ # # XV Thumbnail file handler by Charles E. "Gene" Cash # (gcash@magicnet.net) # # see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, # available from ftp://ftp.cis.upenn.edu/pub/xv/ # # history: # 98-08-15 cec created (b/w only) # 98-12-09 cec added color palette # 98-12-28 fl added to PIL (with only a few very minor modifications) # # To do: # FIXME: make save work (this requires quantization support) # __version__ = "0.1" from PIL import Image, ImageFile, ImagePalette, _binary o8 = _binary.o8 # standard color palette for thumbnails (RGB332) PALETTE = b"" for r in range(8): for g in range(8): for b in range(4): PALETTE = PALETTE + (o8((r*255)//7)+o8((g*255)//7)+o8((b*255)//3)) ## # Image plugin for XV thumbnail images. class XVThumbImageFile(ImageFile.ImageFile): format = "XVThumb" format_description = "XV thumbnail image" def _open(self): # check magic s = self.fp.read(6) if s != b"P7 332": raise SyntaxError("not an XV thumbnail file") # Skip to beginning of next line self.fp.readline() # skip info comments while True: s = self.fp.readline() if not s: raise SyntaxError("Unexpected EOF reading XV thumbnail file") if s[0] != b'#': break # parse header line (already read) s = s.strip().split() self.mode = "P" self.size = int(s[0:1]), int(s[1:2]) self.palette = ImagePalette.raw("RGB", PALETTE) self.tile = [ ("raw", (0, 0)+self.size, self.fp.tell(), (self.mode, 0, 1) )] # -------------------------------------------------------------------- Image.register_open("XVThumb", XVThumbImageFile) pillow-2.3.0/PIL/ImageSequence.py0000644000175000001440000000165112257506326015421 0ustar dokousers# # The Python Imaging Library. # $Id$ # # sequence support classes # # history: # 1997-02-20 fl Created # # Copyright (c) 1997 by Secret Labs AB. # Copyright (c) 1997 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # ## class Iterator: """ This class implements an iterator object that can be used to loop over an image sequence. You can use the ``[]`` operator to access elements by index. This operator will raise an :py:exc:`IndexError` if you try to access a nonexistent frame. :param im: An image object. """ def __init__(self, im): if not hasattr(im, "seek"): raise AttributeError("im must have seek method") self.im = im def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError: raise IndexError # end of sequence pillow-2.3.0/PIL/PalmImagePlugin.py0000644000175000001440000002252412257506326015723 0ustar dokousers# # The Python Imaging Library. # $Id$ # ## # Image plugin for Palm pixmap images (output only). ## __version__ = "1.0" from PIL import Image, ImageFile, _binary _Palm8BitColormapValues = ( ( 255, 255, 255 ), ( 255, 204, 255 ), ( 255, 153, 255 ), ( 255, 102, 255 ), ( 255, 51, 255 ), ( 255, 0, 255 ), ( 255, 255, 204 ), ( 255, 204, 204 ), ( 255, 153, 204 ), ( 255, 102, 204 ), ( 255, 51, 204 ), ( 255, 0, 204 ), ( 255, 255, 153 ), ( 255, 204, 153 ), ( 255, 153, 153 ), ( 255, 102, 153 ), ( 255, 51, 153 ), ( 255, 0, 153 ), ( 204, 255, 255 ), ( 204, 204, 255 ), ( 204, 153, 255 ), ( 204, 102, 255 ), ( 204, 51, 255 ), ( 204, 0, 255 ), ( 204, 255, 204 ), ( 204, 204, 204 ), ( 204, 153, 204 ), ( 204, 102, 204 ), ( 204, 51, 204 ), ( 204, 0, 204 ), ( 204, 255, 153 ), ( 204, 204, 153 ), ( 204, 153, 153 ), ( 204, 102, 153 ), ( 204, 51, 153 ), ( 204, 0, 153 ), ( 153, 255, 255 ), ( 153, 204, 255 ), ( 153, 153, 255 ), ( 153, 102, 255 ), ( 153, 51, 255 ), ( 153, 0, 255 ), ( 153, 255, 204 ), ( 153, 204, 204 ), ( 153, 153, 204 ), ( 153, 102, 204 ), ( 153, 51, 204 ), ( 153, 0, 204 ), ( 153, 255, 153 ), ( 153, 204, 153 ), ( 153, 153, 153 ), ( 153, 102, 153 ), ( 153, 51, 153 ), ( 153, 0, 153 ), ( 102, 255, 255 ), ( 102, 204, 255 ), ( 102, 153, 255 ), ( 102, 102, 255 ), ( 102, 51, 255 ), ( 102, 0, 255 ), ( 102, 255, 204 ), ( 102, 204, 204 ), ( 102, 153, 204 ), ( 102, 102, 204 ), ( 102, 51, 204 ), ( 102, 0, 204 ), ( 102, 255, 153 ), ( 102, 204, 153 ), ( 102, 153, 153 ), ( 102, 102, 153 ), ( 102, 51, 153 ), ( 102, 0, 153 ), ( 51, 255, 255 ), ( 51, 204, 255 ), ( 51, 153, 255 ), ( 51, 102, 255 ), ( 51, 51, 255 ), ( 51, 0, 255 ), ( 51, 255, 204 ), ( 51, 204, 204 ), ( 51, 153, 204 ), ( 51, 102, 204 ), ( 51, 51, 204 ), ( 51, 0, 204 ), ( 51, 255, 153 ), ( 51, 204, 153 ), ( 51, 153, 153 ), ( 51, 102, 153 ), ( 51, 51, 153 ), ( 51, 0, 153 ), ( 0, 255, 255 ), ( 0, 204, 255 ), ( 0, 153, 255 ), ( 0, 102, 255 ), ( 0, 51, 255 ), ( 0, 0, 255 ), ( 0, 255, 204 ), ( 0, 204, 204 ), ( 0, 153, 204 ), ( 0, 102, 204 ), ( 0, 51, 204 ), ( 0, 0, 204 ), ( 0, 255, 153 ), ( 0, 204, 153 ), ( 0, 153, 153 ), ( 0, 102, 153 ), ( 0, 51, 153 ), ( 0, 0, 153 ), ( 255, 255, 102 ), ( 255, 204, 102 ), ( 255, 153, 102 ), ( 255, 102, 102 ), ( 255, 51, 102 ), ( 255, 0, 102 ), ( 255, 255, 51 ), ( 255, 204, 51 ), ( 255, 153, 51 ), ( 255, 102, 51 ), ( 255, 51, 51 ), ( 255, 0, 51 ), ( 255, 255, 0 ), ( 255, 204, 0 ), ( 255, 153, 0 ), ( 255, 102, 0 ), ( 255, 51, 0 ), ( 255, 0, 0 ), ( 204, 255, 102 ), ( 204, 204, 102 ), ( 204, 153, 102 ), ( 204, 102, 102 ), ( 204, 51, 102 ), ( 204, 0, 102 ), ( 204, 255, 51 ), ( 204, 204, 51 ), ( 204, 153, 51 ), ( 204, 102, 51 ), ( 204, 51, 51 ), ( 204, 0, 51 ), ( 204, 255, 0 ), ( 204, 204, 0 ), ( 204, 153, 0 ), ( 204, 102, 0 ), ( 204, 51, 0 ), ( 204, 0, 0 ), ( 153, 255, 102 ), ( 153, 204, 102 ), ( 153, 153, 102 ), ( 153, 102, 102 ), ( 153, 51, 102 ), ( 153, 0, 102 ), ( 153, 255, 51 ), ( 153, 204, 51 ), ( 153, 153, 51 ), ( 153, 102, 51 ), ( 153, 51, 51 ), ( 153, 0, 51 ), ( 153, 255, 0 ), ( 153, 204, 0 ), ( 153, 153, 0 ), ( 153, 102, 0 ), ( 153, 51, 0 ), ( 153, 0, 0 ), ( 102, 255, 102 ), ( 102, 204, 102 ), ( 102, 153, 102 ), ( 102, 102, 102 ), ( 102, 51, 102 ), ( 102, 0, 102 ), ( 102, 255, 51 ), ( 102, 204, 51 ), ( 102, 153, 51 ), ( 102, 102, 51 ), ( 102, 51, 51 ), ( 102, 0, 51 ), ( 102, 255, 0 ), ( 102, 204, 0 ), ( 102, 153, 0 ), ( 102, 102, 0 ), ( 102, 51, 0 ), ( 102, 0, 0 ), ( 51, 255, 102 ), ( 51, 204, 102 ), ( 51, 153, 102 ), ( 51, 102, 102 ), ( 51, 51, 102 ), ( 51, 0, 102 ), ( 51, 255, 51 ), ( 51, 204, 51 ), ( 51, 153, 51 ), ( 51, 102, 51 ), ( 51, 51, 51 ), ( 51, 0, 51 ), ( 51, 255, 0 ), ( 51, 204, 0 ), ( 51, 153, 0 ), ( 51, 102, 0 ), ( 51, 51, 0 ), ( 51, 0, 0 ), ( 0, 255, 102 ), ( 0, 204, 102 ), ( 0, 153, 102 ), ( 0, 102, 102 ), ( 0, 51, 102 ), ( 0, 0, 102 ), ( 0, 255, 51 ), ( 0, 204, 51 ), ( 0, 153, 51 ), ( 0, 102, 51 ), ( 0, 51, 51 ), ( 0, 0, 51 ), ( 0, 255, 0 ), ( 0, 204, 0 ), ( 0, 153, 0 ), ( 0, 102, 0 ), ( 0, 51, 0 ), ( 17, 17, 17 ), ( 34, 34, 34 ), ( 68, 68, 68 ), ( 85, 85, 85 ), ( 119, 119, 119 ), ( 136, 136, 136 ), ( 170, 170, 170 ), ( 187, 187, 187 ), ( 221, 221, 221 ), ( 238, 238, 238 ), ( 192, 192, 192 ), ( 128, 0, 0 ), ( 128, 0, 128 ), ( 0, 128, 0 ), ( 0, 128, 128 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 ), ( 0, 0, 0 )) # so build a prototype image to be used for palette resampling def build_prototype_image(): image = Image.new("L", (1,len(_Palm8BitColormapValues),)) image.putdata(list(range(len(_Palm8BitColormapValues)))) palettedata = () for i in range(len(_Palm8BitColormapValues)): palettedata = palettedata + _Palm8BitColormapValues[i] for i in range(256 - len(_Palm8BitColormapValues)): palettedata = palettedata + (0, 0, 0) image.putpalette(palettedata) return image Palm8BitColormapImage = build_prototype_image() # OK, we now have in Palm8BitColormapImage, a "P"-mode image with the right palette # # -------------------------------------------------------------------- _FLAGS = { "custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000, } _COMPRESSION_TYPES = { "none": 0xFF, "rle": 0x01, "scanline": 0x00, } o8 = _binary.o8 o16b = _binary.o16be # # -------------------------------------------------------------------- ## # (Internal) Image save plugin for the Palm format. def _save(im, fp, filename, check=0): if im.mode == "P": # we assume this is a color Palm image with the standard colormap, # unless the "info" dict has a "custom-colormap" field rawmode = "P" bpp = 8 version = 1 elif im.mode == "L" and "bpp" in im.encoderinfo and im.encoderinfo["bpp"] in (1, 2, 4): # this is 8-bit grayscale, so we shift it to get the high-order bits, and invert it because # Palm does greyscale from white (0) to black (1) bpp = im.encoderinfo["bpp"] im = im.point(lambda x, shift=8-bpp, maxval=(1 << bpp)-1: maxval - (x >> shift)) # we ignore the palette here im.mode = "P" rawmode = "P;" + str(bpp) version = 1 elif im.mode == "L" and "bpp" in im.info and im.info["bpp"] in (1, 2, 4): # here we assume that even though the inherent mode is 8-bit grayscale, only # the lower bpp bits are significant. We invert them to match the Palm. bpp = im.info["bpp"] im = im.point(lambda x, maxval=(1 << bpp)-1: maxval - (x & maxval)) # we ignore the palette here im.mode = "P" rawmode = "P;" + str(bpp) version = 1 elif im.mode == "1": # monochrome -- write it inverted, as is the Palm standard rawmode = "1;I" bpp = 1 version = 0 else: raise IOError("cannot write mode %s as Palm" % im.mode) if check: return check # # make sure image data is available im.load() # write header cols = im.size[0] rows = im.size[1] rowbytes = ((cols + (16//bpp - 1)) / (16 // bpp)) * 2; transparent_index = 0 compression_type = _COMPRESSION_TYPES["none"] flags = 0; if im.mode == "P" and "custom-colormap" in im.info: flags = flags & _FLAGS["custom-colormap"] colormapsize = 4 * 256 + 2; colormapmode = im.palette.mode colormap = im.getdata().getpalette() else: colormapsize = 0 if "offset" in im.info: offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4; else: offset = 0 fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) fp.write(o8(bpp)) fp.write(o8(version)) fp.write(o16b(offset)) fp.write(o8(transparent_index)) fp.write(o8(compression_type)) fp.write(o16b(0)) # reserved by Palm # now write colormap if necessary if colormapsize > 0: fp.write(o16b(256)) for i in range(256): fp.write(o8(i)) if colormapmode == 'RGB': fp.write(o8(colormap[3 * i]) + o8(colormap[3 * i + 1]) + o8(colormap[3 * i + 2])) elif colormapmode == 'RGBA': fp.write(o8(colormap[4 * i]) + o8(colormap[4 * i + 1]) + o8(colormap[4 * i + 2])) # now convert data to raw form ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, rowbytes, 1))]) fp.flush() # # -------------------------------------------------------------------- Image.register_save("Palm", _save) Image.register_extension("Palm", ".palm") Image.register_mime("Palm", "image/palm") pillow-2.3.0/PIL/GimpGradientFile.py0000644000175000001440000000614512257506326016063 0ustar dokousers# # Python Imaging Library # $Id$ # # stuff to read (and render) GIMP gradient files # # History: # 97-08-23 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # from math import pi, log, sin, sqrt from PIL._binary import o8 # -------------------------------------------------------------------- # Stuff to translate curve segments to palette values (derived from # the corresponding code in GIMP, written by Federico Mena Quintero. # See the GIMP distribution for more information.) # EPSILON = 1e-10 def linear(middle, pos): if pos <= middle: if middle < EPSILON: return 0.0 else: return 0.5 * pos / middle else: pos = pos - middle middle = 1.0 - middle if middle < EPSILON: return 1.0 else: return 0.5 + 0.5 * pos / middle def curved(middle, pos): return pos ** (log(0.5) / log(max(middle, EPSILON))) def sine(middle, pos): return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 def sphere_increasing(middle, pos): return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) def sphere_decreasing(middle, pos): return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) SEGMENTS = [ linear, curved, sine, sphere_increasing, sphere_decreasing ] class GradientFile: gradient = None def getpalette(self, entries = 256): palette = [] ix = 0 x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] for i in range(entries): x = i / float(entries-1) while x1 < x: ix = ix + 1 x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] w = x1 - x0 if w < EPSILON: scale = segment(0.5, 0.5) else: scale = segment((xm - x0) / w, (x - x0) / w) # expand to RGBA r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) # add to palette palette.append(r + g + b + a) return b"".join(palette), "RGBA" ## # File handler for GIMP's gradient format. class GimpGradientFile(GradientFile): def __init__(self, fp): if fp.readline()[:13] != b"GIMP Gradient": raise SyntaxError("not a GIMP gradient file") count = int(fp.readline()) gradient = [] for i in range(count): s = fp.readline().split() w = [float(x) for x in s[:11]] x0, x1 = w[0], w[2] xm = w[1] rgb0 = w[3:7] rgb1 = w[7:11] segment = SEGMENTS[int(s[11])] cspace = int(s[12]) if cspace != 0: raise IOError("cannot handle HSV colour space") gradient.append((x0, x1, xm, rgb0, rgb1, segment)) self.gradient = gradient pillow-2.3.0/PIL/MpegImagePlugin.py0000644000175000001440000000345312257506326015722 0ustar dokousers# # The Python Imaging Library. # $Id$ # # MPEG file handling # # History: # 95-09-09 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1995. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, ImageFile from PIL._binary import i8 # # Bitstream parser class BitStream: def __init__(self, fp): self.fp = fp self.bits = 0 self.bitbuffer = 0 def next(self): return i8(self.fp.read(1)) def peek(self, bits): while self.bits < bits: c = self.next() if c < 0: self.bits = 0 continue self.bitbuffer = (self.bitbuffer << 8) + c self.bits = self.bits + 8 return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 def skip(self, bits): while self.bits < bits: self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) self.bits = self.bits + 8 self.bits = self.bits - bits def read(self, bits): v = self.peek(bits) self.bits = self.bits - bits return v ## # Image plugin for MPEG streams. This plugin can identify a stream, # but it cannot read it. class MpegImageFile(ImageFile.ImageFile): format = "MPEG" format_description = "MPEG" def _open(self): s = BitStream(self.fp) if s.read(32) != 0x1B3: raise SyntaxError("not an MPEG file") self.mode = "RGB" self.size = s.read(12), s.read(12) # -------------------------------------------------------------------- # Registry stuff Image.register_open("MPEG", MpegImageFile) Image.register_extension("MPEG", ".mpg") Image.register_extension("MPEG", ".mpeg") Image.register_mime("MPEG", "video/mpeg") pillow-2.3.0/PIL/FpxImagePlugin.py0000644000175000001440000001405212257506326015564 0ustar dokousers# # THIS IS WORK IN PROGRESS # # The Python Imaging Library. # $Id$ # # FlashPix support for PIL # # History: # 97-01-25 fl Created (reads uncompressed RGB images only) # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, ImageFile from PIL.OleFileIO import * # we map from colour field tuples to (mode, rawmode) descriptors MODES = { # opacity (0x00007ffe): ("A", "L"), # monochrome (0x00010000,): ("L", "L"), (0x00018000, 0x00017ffe): ("RGBA", "LA"), # photo YCC (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), (0x00028000, 0x00028001, 0x00028002, 0x00027ffe): ("RGBA", "YCCA;P"), # standard RGB (NIFRGB) (0x00030000, 0x00030001, 0x00030002): ("RGB","RGB"), (0x00038000, 0x00038001, 0x00038002, 0x00037ffe): ("RGBA","RGBA"), } # # -------------------------------------------------------------------- def _accept(prefix): return prefix[:8] == MAGIC ## # Image plugin for the FlashPix images. class FpxImageFile(ImageFile.ImageFile): format = "FPX" format_description = "FlashPix" def _open(self): # # read the OLE directory and see if this is a likely # to be a FlashPix file try: self.ole = OleFileIO(self.fp) except IOError: raise SyntaxError("not an FPX file; invalid OLE file") if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": raise SyntaxError("not an FPX file; bad root CLSID") self._open_index(1) def _open_index(self, index = 1): # # get the Image Contents Property Set prop = self.ole.getproperties([ "Data Object Store %06d" % index, "\005Image Contents" ]) # size (highest resolution) self.size = prop[0x1000002], prop[0x1000003] size = max(self.size) i = 1 while size > 64: size = size / 2 i = i + 1 self.maxid = i - 1 # mode. instead of using a single field for this, flashpix # requires you to specify the mode for each channel in each # resolution subimage, and leaves it to the decoder to make # sure that they all match. for now, we'll cheat and assume # that this is always the case. id = self.maxid << 16 s = prop[0x2000002|id] colors = [] for i in range(i32(s, 4)): # note: for now, we ignore the "uncalibrated" flag colors.append(i32(s, 8+i*4) & 0x7fffffff) self.mode, self.rawmode = MODES[tuple(colors)] # load JPEG tables, if any self.jpeg = {} for i in range(256): id = 0x3000001|(i << 16) if id in prop: self.jpeg[i] = prop[id] # print len(self.jpeg), "tables loaded" self._open_subimage(1, self.maxid) def _open_subimage(self, index = 1, subimage = 0): # # setup tile descriptors for a given subimage stream = [ "Data Object Store %06d" % index, "Resolution %04d" % subimage, "Subimage 0000 Header" ] fp = self.ole.openstream(stream) # skip prefix p = fp.read(28) # header stream s = fp.read(36) size = i32(s, 4), i32(s, 8) tilecount = i32(s, 12) tilesize = i32(s, 16), i32(s, 20) channels = i32(s, 24) offset = i32(s, 28) length = i32(s, 32) # print size, self.mode, self.rawmode if size != self.size: raise IOError("subimage mismatch") # get tile descriptors fp.seek(28 + offset) s = fp.read(i32(s, 12) * length) x = y = 0 xsize, ysize = size xtile, ytile = tilesize self.tile = [] for i in range(0, len(s), length): compression = i32(s, i+8) if compression == 0: self.tile.append(("raw", (x,y,x+xtile,y+ytile), i32(s, i) + 28, (self.rawmode))) elif compression == 1: # FIXME: the fill decoder is not implemented self.tile.append(("fill", (x,y,x+xtile,y+ytile), i32(s, i) + 28, (self.rawmode, s[12:16]))) elif compression == 2: internal_color_conversion = i8(s[14]) jpeg_tables = i8(s[15]) rawmode = self.rawmode if internal_color_conversion: # The image is stored as usual (usually YCbCr). if rawmode == "RGBA": # For "RGBA", data is stored as YCbCrA based on # negative RGB. The following trick works around # this problem : jpegmode, rawmode = "YCbCrK", "CMYK" else: jpegmode = None # let the decoder decide else: # The image is stored as defined by rawmode jpegmode = rawmode self.tile.append(("jpeg", (x,y,x+xtile,y+ytile), i32(s, i) + 28, (rawmode, jpegmode))) # FIXME: jpeg tables are tile dependent; the prefix # data must be placed in the tile descriptor itself! if jpeg_tables: self.tile_prefix = self.jpeg[jpeg_tables] else: raise IOError("unknown/invalid compression") x = x + xtile if x >= xsize: x, y = 0, y + ytile if y >= ysize: break # isn't really required self.stream = stream self.fp = None def load(self): if not self.fp: self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) ImageFile.ImageFile.load(self) # # -------------------------------------------------------------------- Image.register_open("FPX", FpxImageFile, _accept) Image.register_extension("FPX", ".fpx") pillow-2.3.0/PIL/TgaImagePlugin.py0000644000175000001440000001151712257506326015545 0ustar dokousers# # The Python Imaging Library. # $Id$ # # TGA file handling # # History: # 95-09-01 fl created (reads 24-bit files only) # 97-01-04 fl support more TGA versions, including compressed images # 98-07-04 fl fixed orientation and alpha layer bugs # 98-09-11 fl fixed orientation for runlength decoder # # Copyright (c) Secret Labs AB 1997-98. # Copyright (c) Fredrik Lundh 1995-97. # # See the README file for information on usage and redistribution. # __version__ = "0.3" from PIL import Image, ImageFile, ImagePalette, _binary # # -------------------------------------------------------------------- # Read RGA file i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le MODES = { # map imagetype/depth to rawmode (1, 8): "P", (3, 1): "1", (3, 8): "L", (2, 16): "BGR;5", (2, 24): "BGR", (2, 32): "BGRA", } def _accept(prefix): return prefix[0:1] == b"\0" ## # Image plugin for Targa files. class TgaImageFile(ImageFile.ImageFile): format = "TGA" format_description = "Targa" def _open(self): # process header s = self.fp.read(18) id = i8(s[0]) colormaptype = i8(s[1]) imagetype = i8(s[2]) depth = i8(s[16]) flags = i8(s[17]) self.size = i16(s[12:]), i16(s[14:]) # validate header fields if id != 0 or colormaptype not in (0, 1) or\ self.size[0] <= 0 or self.size[1] <= 0 or\ depth not in (1, 8, 16, 24, 32): raise SyntaxError("not a TGA file") # image mode if imagetype in (3, 11): self.mode = "L" if depth == 1: self.mode = "1" # ??? elif imagetype in (1, 9): self.mode = "P" elif imagetype in (2, 10): self.mode = "RGB" if depth == 32: self.mode = "RGBA" else: raise SyntaxError("unknown TGA mode") # orientation orientation = flags & 0x30 if orientation == 0x20: orientation = 1 elif not orientation: orientation = -1 else: raise SyntaxError("unknown TGA orientation") self.info["orientation"] = orientation if imagetype & 8: self.info["compression"] = "tga_rle" if colormaptype: # read palette start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:]) if mapdepth == 16: self.palette = ImagePalette.raw("BGR;16", b"\0"*2*start + self.fp.read(2*size)) elif mapdepth == 24: self.palette = ImagePalette.raw("BGR", b"\0"*3*start + self.fp.read(3*size)) elif mapdepth == 32: self.palette = ImagePalette.raw("BGRA", b"\0"*4*start + self.fp.read(4*size)) # setup tile descriptor try: rawmode = MODES[(imagetype&7, depth)] if imagetype & 8: # compressed self.tile = [("tga_rle", (0, 0)+self.size, self.fp.tell(), (rawmode, orientation, depth))] else: self.tile = [("raw", (0, 0)+self.size, self.fp.tell(), (rawmode, 0, orientation))] except KeyError: pass # cannot decode # # -------------------------------------------------------------------- # Write TGA file o8 = _binary.o8 o16 = _binary.o16le o32 = _binary.o32le SAVE = { "1": ("1", 1, 0, 3), "L": ("L", 8, 0, 3), "P": ("P", 8, 1, 1), "RGB": ("BGR", 24, 0, 2), "RGBA": ("BGRA", 32, 0, 2), } def _save(im, fp, filename, check=0): try: rawmode, bits, colormaptype, imagetype = SAVE[im.mode] except KeyError: raise IOError("cannot write mode %s as TGA" % im.mode) if check: return check if colormaptype: colormapfirst, colormaplength, colormapentry = 0, 256, 24 else: colormapfirst, colormaplength, colormapentry = 0, 0, 0 if im.mode == "RGBA": flags = 8 else: flags = 0 orientation = im.info.get("orientation", -1) if orientation > 0: flags = flags | 0x20 fp.write(b"\000" + o8(colormaptype) + o8(imagetype) + o16(colormapfirst) + o16(colormaplength) + o8(colormapentry) + o16(0) + o16(0) + o16(im.size[0]) + o16(im.size[1]) + o8(bits) + o8(flags)) if colormaptype: fp.write(im.im.getpalette("RGB", "BGR")) ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, 0, orientation))]) # # -------------------------------------------------------------------- # Registry Image.register_open("TGA", TgaImageFile, _accept) Image.register_save("TGA", _save) Image.register_extension("TGA", ".tga") pillow-2.3.0/PIL/BmpImagePlugin.py0000644000175000001440000001503012257506326015542 0ustar dokousers# # The Python Imaging Library. # $Id$ # # BMP file handler # # Windows (and OS/2) native bitmap storage format. # # history: # 1995-09-01 fl Created # 1996-04-30 fl Added save # 1997-08-27 fl Fixed save of 1-bit images # 1998-03-06 fl Load P images as L where possible # 1998-07-03 fl Load P images as 1 where possible # 1998-12-29 fl Handle small palettes # 2002-12-30 fl Fixed load of 1-bit palette images # 2003-04-21 fl Fixed load of 1-bit monochrome images # 2003-04-23 fl Added limited support for BI_BITFIELDS compression # # Copyright (c) 1997-2003 by Secret Labs AB # Copyright (c) 1995-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.7" from PIL import Image, ImageFile, ImagePalette, _binary i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le o8 = _binary.o8 o16 = _binary.o16le o32 = _binary.o32le # # -------------------------------------------------------------------- # Read BMP file BIT2MODE = { # bits => mode, rawmode 1: ("P", "P;1"), 4: ("P", "P;4"), 8: ("P", "P"), 16: ("RGB", "BGR;15"), 24: ("RGB", "BGR"), 32: ("RGB", "BGRX") } def _accept(prefix): return prefix[:2] == b"BM" ## # Image plugin for the Windows BMP format. class BmpImageFile(ImageFile.ImageFile): format = "BMP" format_description = "Windows Bitmap" def _bitmap(self, header = 0, offset = 0): if header: self.fp.seek(header) read = self.fp.read # CORE/INFO s = read(4) s = s + ImageFile._safe_read(self.fp, i32(s)-4) if len(s) == 12: # OS/2 1.0 CORE bits = i16(s[10:]) self.size = i16(s[4:]), i16(s[6:]) compression = 0 lutsize = 3 colors = 0 direction = -1 elif len(s) in [40, 64]: # WIN 3.1 or OS/2 2.0 INFO bits = i16(s[14:]) self.size = i32(s[4:]), i32(s[8:]) compression = i32(s[16:]) lutsize = 4 colors = i32(s[32:]) direction = -1 if i8(s[11]) == 0xff: # upside-down storage self.size = self.size[0], 2**32 - self.size[1] direction = 0 else: raise IOError("Unsupported BMP header type (%d)" % len(s)) if not colors: colors = 1 << bits # MODE try: self.mode, rawmode = BIT2MODE[bits] except KeyError: raise IOError("Unsupported BMP pixel depth (%d)" % bits) if compression == 3: # BI_BITFIELDS compression mask = i32(read(4)), i32(read(4)), i32(read(4)) if bits == 32 and mask == (0xff0000, 0x00ff00, 0x0000ff): rawmode = "BGRX" elif bits == 16 and mask == (0x00f800, 0x0007e0, 0x00001f): rawmode = "BGR;16" elif bits == 16 and mask == (0x007c00, 0x0003e0, 0x00001f): rawmode = "BGR;15" else: # print bits, map(hex, mask) raise IOError("Unsupported BMP bitfields layout") elif compression != 0: raise IOError("Unsupported BMP compression (%d)" % compression) # LUT if self.mode == "P": palette = [] greyscale = 1 if colors == 2: indices = (0, 255) else: indices = list(range(colors)) for i in indices: rgb = read(lutsize)[:3] if rgb != o8(i)*3: greyscale = 0 palette.append(rgb) if greyscale: if colors == 2: self.mode = rawmode = "1" else: self.mode = rawmode = "L" else: self.mode = "P" self.palette = ImagePalette.raw( "BGR", b"".join(palette) ) if not offset: offset = self.fp.tell() self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, ((self.size[0]*bits+31)>>3)&(~3), direction))] self.info["compression"] = compression def _open(self): # HEAD s = self.fp.read(14) if s[:2] != b"BM": raise SyntaxError("Not a BMP file") offset = i32(s[10:]) self._bitmap(offset=offset) class DibImageFile(BmpImageFile): format = "DIB" format_description = "Windows Bitmap" def _open(self): self._bitmap() # # -------------------------------------------------------------------- # Write BMP file SAVE = { "1": ("1", 1, 2), "L": ("L", 8, 256), "P": ("P", 8, 256), "RGB": ("BGR", 24, 0), } def _save(im, fp, filename, check=0): try: rawmode, bits, colors = SAVE[im.mode] except KeyError: raise IOError("cannot write mode %s as BMP" % im.mode) if check: return check stride = ((im.size[0]*bits+7)//8+3)&(~3) header = 40 # or 64 for OS/2 version 2 offset = 14 + header + colors * 4 image = stride * im.size[1] # bitmap header fp.write(b"BM" + # file type (magic) o32(offset+image) + # file size o32(0) + # reserved o32(offset)) # image data offset # bitmap info header fp.write(o32(header) + # info header size o32(im.size[0]) + # width o32(im.size[1]) + # height o16(1) + # planes o16(bits) + # depth o32(0) + # compression (0=uncompressed) o32(image) + # size of bitmap o32(1) + o32(1) + # resolution o32(colors) + # colors used o32(colors)) # colors important fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) if im.mode == "1": for i in (0, 255): fp.write(o8(i) * 4) elif im.mode == "L": for i in range(256): fp.write(o8(i) * 4) elif im.mode == "P": fp.write(im.im.getpalette("RGB", "BGRX")) ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, stride, -1))]) # # -------------------------------------------------------------------- # Registry Image.register_open(BmpImageFile.format, BmpImageFile, _accept) Image.register_save(BmpImageFile.format, _save) Image.register_extension(BmpImageFile.format, ".bmp") pillow-2.3.0/PIL/McIdasImagePlugin.py0000644000175000001440000000330312257506326016164 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Basic McIdas support for PIL # # History: # 1997-05-05 fl Created (8-bit images only) # 2009-03-08 fl Added 16/32-bit support. # # Thanks to Richard Jones and Craig Swank for specs and samples. # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # __version__ = "0.2" import struct from PIL import Image, ImageFile def _accept(s): return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" ## # Image plugin for McIdas area images. class McIdasImageFile(ImageFile.ImageFile): format = "MCIDAS" format_description = "McIdas area file" def _open(self): # parse area file directory s = self.fp.read(256) if not _accept(s) or len(s) != 256: raise SyntaxError("not an McIdas area file") self.area_descriptor_raw = s self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) # get mode if w[11] == 1: mode = rawmode = "L" elif w[11] == 2: # FIXME: add memory map support mode = "I"; rawmode = "I;16B" elif w[11] == 4: # FIXME: add memory map support mode = "I"; rawmode = "I;32B" else: raise SyntaxError("unsupported McIdas format") self.mode = mode self.size = w[10], w[9] offset = w[34] + w[15] stride = w[15] + w[10]*w[11]*w[14] self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] # -------------------------------------------------------------------- # registry Image.register_open("MCIDAS", McIdasImageFile, _accept) # no default extension pillow-2.3.0/PIL/TiffImagePlugin.py0000644000175000001440000012044512257510072015714 0ustar dokousers# # The Python Imaging Library. # $Id$ # # TIFF file handling # # TIFF is a flexible, if somewhat aged, image file format originally # defined by Aldus. Although TIFF supports a wide variety of pixel # layouts and compression methods, the name doesn't really stand for # "thousands of incompatible file formats," it just feels that way. # # To read TIFF data from a stream, the stream must be seekable. For # progressive decoding, make sure to use TIFF files where the tag # directory is placed first in the file. # # History: # 1995-09-01 fl Created # 1996-05-04 fl Handle JPEGTABLES tag # 1996-05-18 fl Fixed COLORMAP support # 1997-01-05 fl Fixed PREDICTOR support # 1997-08-27 fl Added support for rational tags (from Perry Stoll) # 1998-01-10 fl Fixed seek/tell (from Jan Blom) # 1998-07-15 fl Use private names for internal variables # 1999-06-13 fl Rewritten for PIL 1.0 (1.0) # 2000-10-11 fl Additional fixes for Python 2.0 (1.1) # 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) # 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) # 2001-12-18 fl Added workaround for broken Matrox library # 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) # 2003-05-19 fl Check FILLORDER tag # 2003-09-26 fl Added RGBa support # 2004-02-24 fl Added DPI support; fixed rational write support # 2005-02-07 fl Added workaround for broken Corel Draw 10 files # 2006-01-09 fl Added support for float/double tags (from Russell Nelson) # # Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. # Copyright (c) 1995-1997 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from __future__ import print_function __version__ = "1.3.5" from PIL import Image, ImageFile from PIL import ImagePalette from PIL import _binary from PIL._util import isStringType import warnings import array, sys import collections import itertools import os # Set these to true to force use of libtiff for reading or writing. READ_LIBTIFF = False WRITE_LIBTIFF= False II = b"II" # little-endian (intel-style) MM = b"MM" # big-endian (motorola-style) i8 = _binary.i8 o8 = _binary.o8 if sys.byteorder == "little": native_prefix = II else: native_prefix = MM # # -------------------------------------------------------------------- # Read TIFF files il16 = _binary.i16le il32 = _binary.i32le ol16 = _binary.o16le ol32 = _binary.o32le ib16 = _binary.i16be ib32 = _binary.i32be ob16 = _binary.o16be ob32 = _binary.o32be # a few tag names, just to make the code below a bit more readable IMAGEWIDTH = 256 IMAGELENGTH = 257 BITSPERSAMPLE = 258 COMPRESSION = 259 PHOTOMETRIC_INTERPRETATION = 262 FILLORDER = 266 IMAGEDESCRIPTION = 270 STRIPOFFSETS = 273 SAMPLESPERPIXEL = 277 ROWSPERSTRIP = 278 STRIPBYTECOUNTS = 279 X_RESOLUTION = 282 Y_RESOLUTION = 283 PLANAR_CONFIGURATION = 284 RESOLUTION_UNIT = 296 SOFTWARE = 305 DATE_TIME = 306 ARTIST = 315 PREDICTOR = 317 COLORMAP = 320 TILEOFFSETS = 324 EXTRASAMPLES = 338 SAMPLEFORMAT = 339 JPEGTABLES = 347 COPYRIGHT = 33432 IPTC_NAA_CHUNK = 33723 # newsphoto properties PHOTOSHOP_CHUNK = 34377 # photoshop properties ICCPROFILE = 34675 EXIFIFD = 34665 XMP = 700 # https://github.com/fiji/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java IMAGEJ_META_DATA_BYTE_COUNTS = 50838 IMAGEJ_META_DATA = 50839 COMPRESSION_INFO = { # Compression => pil compression name 1: "raw", 2: "tiff_ccitt", 3: "group3", 4: "group4", 5: "tiff_lzw", 6: "tiff_jpeg", # obsolete 7: "jpeg", 8: "tiff_adobe_deflate", 32771: "tiff_raw_16", # 16-bit padding 32773: "packbits", 32809: "tiff_thunderscan", 32946: "tiff_deflate", 34676: "tiff_sgilog", 34677: "tiff_sgilog24", } COMPRESSION_INFO_REV = dict([(v,k) for (k,v) in COMPRESSION_INFO.items()]) OPEN_INFO = { # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, # ExtraSamples) => mode, rawmode (II, 0, 1, 1, (1,), ()): ("1", "1;I"), (II, 0, 1, 2, (1,), ()): ("1", "1;IR"), (II, 0, 1, 1, (8,), ()): ("L", "L;I"), (II, 0, 1, 2, (8,), ()): ("L", "L;IR"), (II, 1, 1, 1, (1,), ()): ("1", "1"), (II, 1, 1, 2, (1,), ()): ("1", "1;R"), (II, 1, 1, 1, (8,), ()): ("L", "L"), (II, 1, 1, 1, (8,8), (2,)): ("LA", "LA"), (II, 1, 1, 2, (8,), ()): ("L", "L;R"), (II, 1, 1, 1, (12,), ()): ("I;16", "I;12"), (II, 1, 1, 1, (16,), ()): ("I;16", "I;16"), (II, 1, 2, 1, (16,), ()): ("I;16S", "I;16S"), (II, 1, 1, 1, (32,), ()): ("I", "I;32N"), (II, 1, 2, 1, (32,), ()): ("I", "I;32S"), (II, 1, 3, 1, (32,), ()): ("F", "F;32F"), (II, 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"), (II, 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"), (II, 2, 1, 1, (8,8,8,8), ()): ("RGBA", "RGBA"), # missing ExtraSamples (II, 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"), (II, 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"), (II, 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"), (II, 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10 (II, 3, 1, 1, (1,), ()): ("P", "P;1"), (II, 3, 1, 2, (1,), ()): ("P", "P;1R"), (II, 3, 1, 1, (2,), ()): ("P", "P;2"), (II, 3, 1, 2, (2,), ()): ("P", "P;2R"), (II, 3, 1, 1, (4,), ()): ("P", "P;4"), (II, 3, 1, 2, (4,), ()): ("P", "P;4R"), (II, 3, 1, 1, (8,), ()): ("P", "P"), (II, 3, 1, 1, (8,8), (2,)): ("PA", "PA"), (II, 3, 1, 2, (8,), ()): ("P", "P;R"), (II, 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"), (II, 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"), (II, 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"), (MM, 0, 1, 1, (1,), ()): ("1", "1;I"), (MM, 0, 1, 2, (1,), ()): ("1", "1;IR"), (MM, 0, 1, 1, (8,), ()): ("L", "L;I"), (MM, 0, 1, 2, (8,), ()): ("L", "L;IR"), (MM, 1, 1, 1, (1,), ()): ("1", "1"), (MM, 1, 1, 2, (1,), ()): ("1", "1;R"), (MM, 1, 1, 1, (8,), ()): ("L", "L"), (MM, 1, 1, 1, (8,8), (2,)): ("LA", "LA"), (MM, 1, 1, 2, (8,), ()): ("L", "L;R"), (MM, 1, 1, 1, (16,), ()): ("I;16B", "I;16B"), (MM, 1, 2, 1, (16,), ()): ("I;16BS", "I;16BS"), (MM, 1, 2, 1, (32,), ()): ("I;32BS", "I;32BS"), (MM, 1, 3, 1, (32,), ()): ("F", "F;32BF"), (MM, 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"), (MM, 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"), (MM, 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"), (MM, 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"), (MM, 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"), (MM, 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10 (MM, 3, 1, 1, (1,), ()): ("P", "P;1"), (MM, 3, 1, 2, (1,), ()): ("P", "P;1R"), (MM, 3, 1, 1, (2,), ()): ("P", "P;2"), (MM, 3, 1, 2, (2,), ()): ("P", "P;2R"), (MM, 3, 1, 1, (4,), ()): ("P", "P;4"), (MM, 3, 1, 2, (4,), ()): ("P", "P;4R"), (MM, 3, 1, 1, (8,), ()): ("P", "P"), (MM, 3, 1, 1, (8,8), (2,)): ("PA", "PA"), (MM, 3, 1, 2, (8,), ()): ("P", "P;R"), (MM, 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"), (MM, 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"), (MM, 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"), } PREFIXES = [b"MM\000\052", b"II\052\000", b"II\xBC\000"] def _accept(prefix): return prefix[:4] in PREFIXES ## # Wrapper for TIFF IFDs. class ImageFileDirectory(collections.MutableMapping): """ This class represents a TIFF tag directory. To speed things up, we don't decode tags unless they're asked for. Exposes a dictionary interface of the tags in the directory ImageFileDirectory[key] = value value = ImageFileDirectory[key] Also contains a dictionary of tag types as read from the tiff image file, 'ImageFileDirectory.tagtype' Data Structures: 'public' * self.tagtype = {} Key: numerical tiff tag number Value: integer corresponding to the data type from `TiffTags.TYPES` 'internal' * self.tags = {} Key: numerical tiff tag number Value: Decoded data, Generally a tuple. * If set from __setval__ -- always a tuple * Numeric types -- always a tuple * String type -- not a tuple, returned as string * Undefined data -- not a tuple, returned as bytes * Byte -- not a tuple, returned as byte. * self.tagdata = {} Key: numerical tiff tag number Value: undecoded byte string from file Tags will be found in either self.tags or self.tagdata, but not both. The union of the two should contain all the tags from the Tiff image file. External classes shouldn't reference these unless they're really sure what they're doing. """ def __init__(self, prefix=II): """ :prefix: 'II'|'MM' tiff endianness """ self.prefix = prefix[:2] if self.prefix == MM: self.i16, self.i32 = ib16, ib32 self.o16, self.o32 = ob16, ob32 elif self.prefix == II: self.i16, self.i32 = il16, il32 self.o16, self.o32 = ol16, ol32 else: raise SyntaxError("not a TIFF IFD") self.reset() def reset(self): #: Tags is an incomplete dictionary of the tags of the image. #: For a complete dictionary, use the as_dict method. self.tags = {} self.tagdata = {} self.tagtype = {} # added 2008-06-05 by Florian Hoech self.next = None def __str__(self): return str(self.as_dict()) def as_dict(self): """Return a dictionary of the image's tags.""" return dict(self.items()) def named(self): """Returns the complete tag dictionary, with named tags where posible.""" from PIL import TiffTags result = {} for tag_code, value in self.items(): tag_name = TiffTags.TAGS.get(tag_code, tag_code) result[tag_name] = value return result # dictionary API def __len__(self): return len(self.tagdata) + len(self.tags) def __getitem__(self, tag): try: return self.tags[tag] except KeyError: data = self.tagdata[tag] # unpack on the fly type = self.tagtype[tag] size, handler = self.load_dispatch[type] self.tags[tag] = data = handler(self, data) del self.tagdata[tag] return data def getscalar(self, tag, default=None): try: value = self[tag] if len(value) != 1: if tag == SAMPLEFORMAT: # work around broken (?) matrox library # (from Ted Wright, via Bob Klimek) raise KeyError # use default raise ValueError("not a scalar") return value[0] except KeyError: if default is None: raise return default def __contains__(self, tag): return tag in self.tags or tag in self.tagdata if bytes is str: def has_key(self, tag): return tag in self def __setitem__(self, tag, value): # tags are tuples for integers # tags are not tuples for byte, string, and undefined data. # see load_* if not isinstance(value, tuple): value = (value,) self.tags[tag] = value def __delitem__(self, tag): self.tags.pop(tag, self.tagdata.pop(tag, None)) def __iter__(self): return itertools.chain(self.tags.__iter__(), self.tagdata.__iter__()) def items(self): keys = list(self.__iter__()) values = [self[key] for key in keys] return zip(keys, values) # load primitives load_dispatch = {} def load_byte(self, data): return data load_dispatch[1] = (1, load_byte) def load_string(self, data): if data[-1:] == b'\0': data = data[:-1] return data.decode('latin-1', 'replace') load_dispatch[2] = (1, load_string) def load_short(self, data): l = [] for i in range(0, len(data), 2): l.append(self.i16(data, i)) return tuple(l) load_dispatch[3] = (2, load_short) def load_long(self, data): l = [] for i in range(0, len(data), 4): l.append(self.i32(data, i)) return tuple(l) load_dispatch[4] = (4, load_long) def load_rational(self, data): l = [] for i in range(0, len(data), 8): l.append((self.i32(data, i), self.i32(data, i+4))) return tuple(l) load_dispatch[5] = (8, load_rational) def load_float(self, data): a = array.array("f", data) if self.prefix != native_prefix: a.byteswap() return tuple(a) load_dispatch[11] = (4, load_float) def load_double(self, data): a = array.array("d", data) if self.prefix != native_prefix: a.byteswap() return tuple(a) load_dispatch[12] = (8, load_double) def load_undefined(self, data): # Untyped data return data load_dispatch[7] = (1, load_undefined) def load(self, fp): # load tag dictionary self.reset() i16 = self.i16 i32 = self.i32 for i in range(i16(fp.read(2))): ifd = fp.read(12) tag, typ = i16(ifd), i16(ifd, 2) if Image.DEBUG: from PIL import TiffTags tagname = TiffTags.TAGS.get(tag, "unknown") typname = TiffTags.TYPES.get(typ, "unknown") print("tag: %s (%d)" % (tagname, tag), end=' ') print("- type: %s (%d)" % (typname, typ), end=' ') try: dispatch = self.load_dispatch[typ] except KeyError: if Image.DEBUG: print("- unsupported type", typ) continue # ignore unsupported type size, handler = dispatch size = size * i32(ifd, 4) # Get and expand tag value if size > 4: here = fp.tell() fp.seek(i32(ifd, 8)) data = ImageFile._safe_read(fp, size) fp.seek(here) else: data = ifd[8:8+size] if len(data) != size: warnings.warn("Possibly corrupt EXIF data. Expecting to read %d bytes but only got %d. Skipping tag %s" % (size, len(data), tag)) continue self.tagdata[tag] = data self.tagtype[tag] = typ if Image.DEBUG: if tag in (COLORMAP, IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, ICCPROFILE, XMP): print("- value: " % size) else: print("- value:", self[tag]) self.next = i32(fp.read(4)) # save primitives def save(self, fp): o16 = self.o16 o32 = self.o32 fp.write(o16(len(self.tags))) # always write in ascending tag order tags = sorted(self.tags.items()) directory = [] append = directory.append offset = fp.tell() + len(self.tags) * 12 + 4 stripoffsets = None # pass 1: convert tags to binary format for tag, value in tags: typ = None if tag in self.tagtype: typ = self.tagtype[tag] if Image.DEBUG: print ("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) if typ == 1: # byte data if isinstance(value, tuple): data = value = value[-1] else: data = value elif typ == 7: # untyped data data = value = b"".join(value) elif isStringType(value[0]): # string data if isinstance(value, tuple): value = value[-1] typ = 2 # was b'\0'.join(str), which led to \x00a\x00b sorts # of strings which I don't see in in the wild tiffs # and doesn't match the tiff spec: 8-bit byte that # contains a 7-bit ASCII code; the last byte must be # NUL (binary zero). Also, I don't think this was well # excersized before. data = value = b"" + value.encode('ascii', 'replace') + b"\0" else: # integer data if tag == STRIPOFFSETS: stripoffsets = len(directory) typ = 4 # to avoid catch-22 elif tag in (X_RESOLUTION, Y_RESOLUTION) or typ==5: # identify rational data fields typ = 5 if isinstance(value[0], tuple): # long name for flatten value = tuple(itertools.chain.from_iterable(value)) elif not typ: typ = 3 for v in value: if v >= 65536: typ = 4 if typ == 3: data = b"".join(map(o16, value)) else: data = b"".join(map(o32, value)) if Image.DEBUG: from PIL import TiffTags tagname = TiffTags.TAGS.get(tag, "unknown") typname = TiffTags.TYPES.get(typ, "unknown") print("save: %s (%d)" % (tagname, tag), end=' ') print("- type: %s (%d)" % (typname, typ), end=' ') if tag in (COLORMAP, IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, ICCPROFILE, XMP): size = len(data) print("- value: " % size) else: print("- value:", value) # figure out if data fits into the directory if len(data) == 4: append((tag, typ, len(value), data, b"")) elif len(data) < 4: append((tag, typ, len(value), data + (4-len(data))*b"\0", b"")) else: count = len(value) if typ == 5: count = count // 2 # adjust for rational data field append((tag, typ, count, o32(offset), data)) offset = offset + len(data) if offset & 1: offset = offset + 1 # word padding # update strip offset data to point beyond auxiliary data if stripoffsets is not None: tag, typ, count, value, data = directory[stripoffsets] assert not data, "multistrip support not yet implemented" value = o32(self.i32(value) + offset) directory[stripoffsets] = tag, typ, count, value, data # pass 2: write directory to file for tag, typ, count, value, data in directory: if Image.DEBUG > 1: print(tag, typ, count, repr(value), repr(data)) fp.write(o16(tag) + o16(typ) + o32(count) + value) # -- overwrite here for multi-page -- fp.write(b"\0\0\0\0") # end of directory # pass 3: write auxiliary data to file for tag, typ, count, value, data in directory: fp.write(data) if len(data) & 1: fp.write(b"\0") return offset ## # Image plugin for TIFF files. class TiffImageFile(ImageFile.ImageFile): format = "TIFF" format_description = "Adobe TIFF" def _open(self): "Open the first image in a TIFF file" # Header ifh = self.fp.read(8) if ifh[:4] not in PREFIXES: raise SyntaxError("not a TIFF file") # image file directory (tag dictionary) self.tag = self.ifd = ImageFileDirectory(ifh[:2]) # setup frame pointers self.__first = self.__next = self.ifd.i32(ifh, 4) self.__frame = -1 self.__fp = self.fp if Image.DEBUG: print ("*** TiffImageFile._open ***") print ("- __first:", self.__first) print ("- ifh: ", ifh) # and load the first frame self._seek(0) def seek(self, frame): "Select a given frame as current image" if frame < 0: frame = 0 self._seek(frame) def tell(self): "Return the current frame number" return self._tell() def _seek(self, frame): self.fp = self.__fp if frame < self.__frame: # rewind file self.__frame = -1 self.__next = self.__first while self.__frame < frame: if not self.__next: raise EOFError("no more images in TIFF file") self.fp.seek(self.__next) self.tag.load(self.fp) self.__next = self.tag.next self.__frame = self.__frame + 1 self._setup() def _tell(self): return self.__frame def _decoder(self, rawmode, layer, tile=None): "Setup decoder contexts" args = None if rawmode == "RGB" and self._planar_configuration == 2: rawmode = rawmode[layer] compression = self._compression if compression == "raw": args = (rawmode, 0, 1) elif compression == "jpeg": args = rawmode, "" if JPEGTABLES in self.tag: # Hack to handle abbreviated JPEG headers self.tile_prefix = self.tag[JPEGTABLES] elif compression == "packbits": args = rawmode elif compression == "tiff_lzw": args = rawmode if 317 in self.tag: # Section 14: Differencing Predictor self.decoderconfig = (self.tag[PREDICTOR][0],) if ICCPROFILE in self.tag: self.info['icc_profile'] = self.tag[ICCPROFILE] return args def _load_libtiff(self): """ Overload method triggered when we detect a compressed tiff Calls out to libtiff """ pixel = Image.Image.load(self) if self.tile is None: raise IOError("cannot load this image") if not self.tile: return pixel self.load_prepare() if not len(self.tile) == 1: raise IOError("Not exactly one tile") d, e, o, a = self.tile[0] d = Image._getdecoder(self.mode, 'libtiff', a, self.decoderconfig) try: d.setimage(self.im, e) except ValueError: raise IOError("Couldn't set the image") if hasattr(self.fp, "getvalue"): # We've got a stringio like thing passed in. Yay for all in memory. # The decoder needs the entire file in one shot, so there's not # a lot we can do here other than give it the entire file. # unless we could do something like get the address of the underlying # string for stringio. # # Rearranging for supporting byteio items, since they have a fileno # that returns an IOError if there's no underlying fp. Easier to deal # with here by reordering. if Image.DEBUG: print ("have getvalue. just sending in a string from getvalue") n,e = d.decode(self.fp.getvalue()) elif hasattr(self.fp, "fileno"): # we've got a actual file on disk, pass in the fp. if Image.DEBUG: print ("have fileno, calling fileno version of the decoder.") self.fp.seek(0) n,e = d.decode(b"fpfp") # 4 bytes, otherwise the trace might error out else: # we have something else. if Image.DEBUG: print ("don't have fileno or getvalue. just reading") # UNDONE -- so much for that buffer size thing. n, e = d.decode(self.fp.read()) self.tile = [] self.readonly = 0 self.fp = None # might be shared if e < 0: raise IOError(e) self.load_end() return Image.Image.load(self) def _setup(self): "Setup this image object based on current tags" if 0xBC01 in self.tag: raise IOError("Windows Media Photo files not yet supported") getscalar = self.tag.getscalar # extract relevant tags self._compression = COMPRESSION_INFO[getscalar(COMPRESSION, 1)] self._planar_configuration = getscalar(PLANAR_CONFIGURATION, 1) # photometric is a required tag, but not everyone is reading # the specification photo = getscalar(PHOTOMETRIC_INTERPRETATION, 0) fillorder = getscalar(FILLORDER, 1) if Image.DEBUG: print("*** Summary ***") print("- compression:", self._compression) print("- photometric_interpretation:", photo) print("- planar_configuration:", self._planar_configuration) print("- fill_order:", fillorder) # size xsize = getscalar(IMAGEWIDTH) ysize = getscalar(IMAGELENGTH) self.size = xsize, ysize if Image.DEBUG: print("- size:", self.size) format = getscalar(SAMPLEFORMAT, 1) # mode: check photometric interpretation and bits per pixel key = ( self.tag.prefix, photo, format, fillorder, self.tag.get(BITSPERSAMPLE, (1,)), self.tag.get(EXTRASAMPLES, ()) ) if Image.DEBUG: print("format key:", key) try: self.mode, rawmode = OPEN_INFO[key] except KeyError: if Image.DEBUG: print("- unsupported format") raise SyntaxError("unknown pixel mode") if Image.DEBUG: print("- raw mode:", rawmode) print("- pil mode:", self.mode) self.info["compression"] = self._compression xres = getscalar(X_RESOLUTION, (1, 1)) yres = getscalar(Y_RESOLUTION, (1, 1)) if xres and not isinstance(xres, tuple): xres = (xres, 1.) if yres and not isinstance(yres, tuple): yres = (yres, 1.) if xres and yres: xres = xres[0] / (xres[1] or 1) yres = yres[0] / (yres[1] or 1) resunit = getscalar(RESOLUTION_UNIT, 1) if resunit == 2: # dots per inch self.info["dpi"] = xres, yres elif resunit == 3: # dots per centimeter. convert to dpi self.info["dpi"] = xres * 2.54, yres * 2.54 else: # No absolute unit of measurement self.info["resolution"] = xres, yres # build tile descriptors x = y = l = 0 self.tile = [] if STRIPOFFSETS in self.tag: # striped image offsets = self.tag[STRIPOFFSETS] h = getscalar(ROWSPERSTRIP, ysize) w = self.size[0] if READ_LIBTIFF or self._compression in ["tiff_ccitt", "group3", "group4", "tiff_jpeg", "tiff_adobe_deflate", "tiff_thunderscan", "tiff_deflate", "tiff_sgilog", "tiff_sgilog24", "tiff_raw_16"]: ## if Image.DEBUG: ## print "Activating g4 compression for whole file" # Decoder expects entire file as one tile. # There's a buffer size limit in load (64k) # so large g4 images will fail if we use that # function. # # Setup the one tile for the whole image, then # replace the existing load function with our # _load_libtiff function. self.load = self._load_libtiff # To be nice on memory footprint, if there's a # file descriptor, use that instead of reading # into a string in python. # libtiff closes the file descriptor, so pass in a dup. try: fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) except IOError: # io.BytesIO have a fileno, but returns an IOError if # it doesn't use a file descriptor. fp = False # libtiff handles the fillmode for us, so 1;IR should # actually be 1;I. Including the R double reverses the # bits, so stripes of the image are reversed. See # https://github.com/python-imaging/Pillow/issues/279 if fillorder == 2: key = ( self.tag.prefix, photo, format, 1, self.tag.get(BITSPERSAMPLE, (1,)), self.tag.get(EXTRASAMPLES, ()) ) if Image.DEBUG: print("format key:", key) # this should always work, since all the # fillorder==2 modes have a corresponding # fillorder=1 mode self.mode, rawmode = OPEN_INFO[key] # libtiff always returns the bytes in native order. # we're expecting image byte order. So, if the rawmode # contains I;16, we need to convert from native to image # byte order. if self.mode in ('I;16B', 'I;16') and 'I;16' in rawmode: rawmode = 'I;16N' # Offset in the tile tuple is 0, we go from 0,0 to # w,h, and we only do this once -- eds a = (rawmode, self._compression, fp ) self.tile.append( (self._compression, (0, 0, w, ysize), 0, a)) a = None else: for i in range(len(offsets)): a = self._decoder(rawmode, l, i) self.tile.append( (self._compression, (0, min(y, ysize), w, min(y+h, ysize)), offsets[i], a)) if Image.DEBUG: print ("tiles: ", self.tile) y = y + h if y >= self.size[1]: x = y = 0 l = l + 1 a = None elif TILEOFFSETS in self.tag: # tiled image w = getscalar(322) h = getscalar(323) a = None for o in self.tag[TILEOFFSETS]: if not a: a = self._decoder(rawmode, l) # FIXME: this doesn't work if the image size # is not a multiple of the tile size... self.tile.append( (self._compression, (x, y, x+w, y+h), o, a)) x = x + w if x >= self.size[0]: x, y = 0, y + h if y >= self.size[1]: x = y = 0 l = l + 1 a = None else: if Image.DEBUG: print("- unsupported data organization") raise SyntaxError("unknown data organization") # fixup palette descriptor if self.mode == "P": palette = [o8(a // 256) for a in self.tag[COLORMAP]] self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) # # -------------------------------------------------------------------- # Write TIFF files # little endian is default except for image modes with explict big endian byte-order SAVE_INFO = { # mode => rawmode, byteorder, photometrics, sampleformat, bitspersample, extra "1": ("1", II, 1, 1, (1,), None), "L": ("L", II, 1, 1, (8,), None), "LA": ("LA", II, 1, 1, (8,8), 2), "P": ("P", II, 3, 1, (8,), None), "PA": ("PA", II, 3, 1, (8,8), 2), "I": ("I;32S", II, 1, 2, (32,), None), "I;16": ("I;16", II, 1, 1, (16,), None), "I;16S": ("I;16S", II, 1, 2, (16,), None), "F": ("F;32F", II, 1, 3, (32,), None), "RGB": ("RGB", II, 2, 1, (8,8,8), None), "RGBX": ("RGBX", II, 2, 1, (8,8,8,8), 0), "RGBA": ("RGBA", II, 2, 1, (8,8,8,8), 2), "CMYK": ("CMYK", II, 5, 1, (8,8,8,8), None), "YCbCr": ("YCbCr", II, 6, 1, (8,8,8), None), "LAB": ("LAB", II, 8, 1, (8,8,8), None), "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), "I;16B": ("I;16B", MM, 1, 1, (16,), None), "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), } def _cvt_res(value): # convert value to TIFF rational number -- (numerator, denominator) if isinstance(value, collections.Sequence): assert(len(value) % 2 == 0) return value if isinstance(value, int): return (value, 1) value = float(value) return (int(value * 65536), 65536) def _save(im, fp, filename): try: rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] except KeyError: raise IOError("cannot write mode %s as TIFF" % im.mode) ifd = ImageFileDirectory(prefix) compression = im.encoderinfo.get('compression',im.info.get('compression','raw')) libtiff = WRITE_LIBTIFF or compression in ["tiff_ccitt", "group3", "group4", "tiff_jpeg", "tiff_adobe_deflate", "tiff_thunderscan", "tiff_deflate", "tiff_sgilog", "tiff_sgilog24", "tiff_raw_16"] # required for color libtiff images ifd[PLANAR_CONFIGURATION] = getattr(im, '_planar_configuration', 1) # -- multi-page -- skip TIFF header on subsequent pages if not libtiff and fp.tell() == 0: # tiff header (write via IFD to get everything right) # PIL always starts the first IFD at offset 8 fp.write(ifd.prefix + ifd.o16(42) + ifd.o32(8)) ifd[IMAGEWIDTH] = im.size[0] ifd[IMAGELENGTH] = im.size[1] # write any arbitrary tags passed in as an ImageFileDirectory info = im.encoderinfo.get("tiffinfo",{}) if Image.DEBUG: print ("Tiffinfo Keys: %s"% info.keys) keys = list(info.keys()) for key in keys: ifd[key] = info.get(key) try: ifd.tagtype[key] = info.tagtype[key] except: pass # might not be an IFD, Might not have populated type # additions written by Greg Couch, gregc@cgl.ucsf.edu # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com if hasattr(im, 'tag'): # preserve tags from original TIFF image file for key in (RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION, IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, XMP): if key in im.tag: ifd[key] = im.tag[key] ifd.tagtype[key] = im.tag.tagtype.get(key, None) # preserve ICC profile (should also work when saving other formats # which support profiles as TIFF) -- 2008-06-06 Florian Hoech if "icc_profile" in im.info: ifd[ICCPROFILE] = im.info["icc_profile"] if "description" in im.encoderinfo: ifd[IMAGEDESCRIPTION] = im.encoderinfo["description"] if "resolution" in im.encoderinfo: ifd[X_RESOLUTION] = ifd[Y_RESOLUTION] \ = _cvt_res(im.encoderinfo["resolution"]) if "x resolution" in im.encoderinfo: ifd[X_RESOLUTION] = _cvt_res(im.encoderinfo["x resolution"]) if "y resolution" in im.encoderinfo: ifd[Y_RESOLUTION] = _cvt_res(im.encoderinfo["y resolution"]) if "resolution unit" in im.encoderinfo: unit = im.encoderinfo["resolution unit"] if unit == "inch": ifd[RESOLUTION_UNIT] = 2 elif unit == "cm" or unit == "centimeter": ifd[RESOLUTION_UNIT] = 3 else: ifd[RESOLUTION_UNIT] = 1 if "software" in im.encoderinfo: ifd[SOFTWARE] = im.encoderinfo["software"] if "date time" in im.encoderinfo: ifd[DATE_TIME] = im.encoderinfo["date time"] if "artist" in im.encoderinfo: ifd[ARTIST] = im.encoderinfo["artist"] if "copyright" in im.encoderinfo: ifd[COPYRIGHT] = im.encoderinfo["copyright"] dpi = im.encoderinfo.get("dpi") if dpi: ifd[RESOLUTION_UNIT] = 2 ifd[X_RESOLUTION] = _cvt_res(dpi[0]) ifd[Y_RESOLUTION] = _cvt_res(dpi[1]) if bits != (1,): ifd[BITSPERSAMPLE] = bits if len(bits) != 1: ifd[SAMPLESPERPIXEL] = len(bits) if extra is not None: ifd[EXTRASAMPLES] = extra if format != 1: ifd[SAMPLEFORMAT] = format ifd[PHOTOMETRIC_INTERPRETATION] = photo if im.mode == "P": lut = im.im.getpalette("RGB", "RGB;L") ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut) # data orientation stride = len(bits) * ((im.size[0]*bits[0]+7)//8) ifd[ROWSPERSTRIP] = im.size[1] ifd[STRIPBYTECOUNTS] = stride * im.size[1] ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression,1) # no compression by default if libtiff: if Image.DEBUG: print ("Saving using libtiff encoder") print (ifd.items()) _fp = 0 if hasattr(fp, "fileno"): fp.seek(0) _fp = os.dup(fp.fileno()) blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] # ICC Profile crashes. atts={} # bits per sample is a single short in the tiff directory, not a list. atts[BITSPERSAMPLE] = bits[0] # Merge the ones that we have with (optional) more bits from # the original file, e.g x,y resolution so that we can # save(load('')) == original file. for k,v in itertools.chain(ifd.items(), getattr(im, 'ifd', {}).items()): if k not in atts and k not in blocklist: if type(v[0]) == tuple and len(v) > 1: # A tuple of more than one rational tuples # flatten to floats, following tiffcp.c->cpTag->TIFF_RATIONAL atts[k] = [float(elt[0])/float(elt[1]) for elt in v] continue if type(v[0]) == tuple and len(v) == 1: # A tuple of one rational tuples # flatten to floats, following tiffcp.c->cpTag->TIFF_RATIONAL atts[k] = float(v[0][0])/float(v[0][1]) continue if type(v) == tuple and len(v) > 2: # List of ints? if type(v[0]) in (int, float): atts[k] = list(v) continue if type(v) == tuple and len(v) == 2: # one rational tuple # flatten to float, following tiffcp.c->cpTag->TIFF_RATIONAL atts[k] = float(v[0])/float(v[1]) continue if type(v) == tuple and len(v) == 1: v = v[0] # drop through if isStringType(v): atts[k] = bytes(v.encode('ascii', 'replace')) + b"\0" continue else: # int or similar atts[k] = v if Image.DEBUG: print (atts) # libtiff always expects the bytes in native order. # we're storing image byte order. So, if the rawmode # contains I;16, we need to convert from native to image # byte order. if im.mode in ('I;16B', 'I;16'): rawmode = 'I;16N' a = (rawmode, compression, _fp, filename, atts) # print (im.mode, compression, a, im.encoderconfig) e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig) e.setimage(im.im, (0,0)+im.size) while 1: l, s, d = e.encode(16*1024) # undone, change to self.decodermaxblock if not _fp: fp.write(d) if s: break if s < 0: raise IOError("encoder error %d when writing image file" % s) else: offset = ifd.save(fp) ImageFile._save(im, fp, [ ("raw", (0,0)+im.size, offset, (rawmode, stride, 1)) ]) # -- helper for multi-page save -- if "_debug_multipage" in im.encoderinfo: #just to access o32 and o16 (using correct byte order) im._debug_multipage = ifd # # -------------------------------------------------------------------- # Register Image.register_open("TIFF", TiffImageFile, _accept) Image.register_save("TIFF", _save) Image.register_extension("TIFF", ".tif") Image.register_extension("TIFF", ".tiff") Image.register_mime("TIFF", "image/tiff") pillow-2.3.0/PIL/WmfImagePlugin.py0000644000175000001440000000777512257506326015576 0ustar dokousers# # The Python Imaging Library # $Id$ # # WMF stub codec # # history: # 1996-12-14 fl Created # 2004-02-22 fl Turned into a stub driver # 2004-02-23 fl Added EMF support # # Copyright (c) Secret Labs AB 1997-2004. All rights reserved. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # __version__ = "0.2" from PIL import Image, ImageFile, _binary _handler = None if str != bytes: long = int ## # Install application-specific WMF image handler. # # @param handler Handler object. def register_handler(handler): global _handler _handler = handler if hasattr(Image.core, "drawwmf"): # install default handler (windows only) class WmfHandler: def open(self, im): im.mode = "RGB" self.bbox = im.info["wmf_bbox"] def load(self, im): im.fp.seek(0) # rewind return Image.frombytes( "RGB", im.size, Image.core.drawwmf(im.fp.read(), im.size, self.bbox), "raw", "BGR", (im.size[0]*3 + 3) & -4, -1 ) register_handler(WmfHandler()) # -------------------------------------------------------------------- word = _binary.i16le def short(c, o=0): v = word(c, o) if v >= 32768: v = v - 65536 return v dword = _binary.i32le # # -------------------------------------------------------------------- # Read WMF file def _accept(prefix): return ( prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" ) ## # Image plugin for Windows metafiles. class WmfStubImageFile(ImageFile.StubImageFile): format = "WMF" format_description = "Windows Metafile" def _open(self): # check placable header s = self.fp.read(80) if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": # placeable windows metafile # get units per inch inch = word(s, 14) # get bounding box x0 = short(s, 6); y0 = short(s, 8) x1 = short(s, 10); y1 = short(s, 12) # normalize size to 72 dots per inch size = (x1 - x0) * 72 // inch, (y1 - y0) * 72 // inch self.info["wmf_bbox"] = x0, y0, x1, y1 self.info["dpi"] = 72 # print self.mode, self.size, self.info # sanity check (standard metafile header) if s[22:26] != b"\x01\x00\t\x00": raise SyntaxError("Unsupported WMF file format") elif dword(s) == 1 and s[40:44] == b" EMF": # enhanced metafile # get bounding box x0 = dword(s, 8); y0 = dword(s, 12) x1 = dword(s, 16); y1 = dword(s, 20) # get frame (in 0.01 millimeter units) frame = dword(s, 24), dword(s, 28), dword(s, 32), dword(s, 36) # normalize size to 72 dots per inch size = x1 - x0, y1 - y0 # calculate dots per inch from bbox and frame xdpi = 2540 * (x1 - y0) // (frame[2] - frame[0]) ydpi = 2540 * (y1 - y0) // (frame[3] - frame[1]) self.info["wmf_bbox"] = x0, y0, x1, y1 if xdpi == ydpi: self.info["dpi"] = xdpi else: self.info["dpi"] = xdpi, ydpi else: raise SyntaxError("Unsupported file format") self.mode = "RGB" self.size = size loader = self._load() if loader: loader.open(self) def _load(self): return _handler def _save(im, fp, filename): if _handler is None or not hasattr("_handler", "save"): raise IOError("WMF save handler not installed") _handler.save(im, fp, filename) # # -------------------------------------------------------------------- # Registry stuff Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) Image.register_save(WmfStubImageFile.format, _save) Image.register_extension(WmfStubImageFile.format, ".wmf") Image.register_extension(WmfStubImageFile.format, ".emf") pillow-2.3.0/PIL/GbrImagePlugin.py0000644000175000001440000000305312257506326015540 0ustar dokousers# # The Python Imaging Library # $Id$ # # load a GIMP brush file # # History: # 96-03-14 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile, _binary i32 = _binary.i32be def _accept(prefix): return i32(prefix) >= 20 and i32(prefix[4:8]) == 1 ## # Image plugin for the GIMP brush format. class GbrImageFile(ImageFile.ImageFile): format = "GBR" format_description = "GIMP brush file" def _open(self): header_size = i32(self.fp.read(4)) version = i32(self.fp.read(4)) if header_size < 20 or version != 1: raise SyntaxError("not a GIMP brush") width = i32(self.fp.read(4)) height = i32(self.fp.read(4)) bytes = i32(self.fp.read(4)) if width <= 0 or height <= 0 or bytes != 1: raise SyntaxError("not a GIMP brush") comment = self.fp.read(header_size - 20)[:-1] self.mode = "L" self.size = width, height self.info["comment"] = comment # Since the brush is so small, we read the data immediately self.data = self.fp.read(width * height) def load(self): if not self.data: return # create an image out of the brush data block self.im = Image.core.new(self.mode, self.size) self.im.frombytes(self.data) self.data = b"" # # registry Image.register_open("GBR", GbrImageFile, _accept) Image.register_extension("GBR", ".gbr") pillow-2.3.0/PIL/GifImagePlugin.py0000644000175000001440000003265612257506326015546 0ustar dokousers# # The Python Imaging Library. # $Id$ # # GIF file handling # # History: # 1995-09-01 fl Created # 1996-12-14 fl Added interlace support # 1996-12-30 fl Added animation support # 1997-01-05 fl Added write support, fixed local colour map bug # 1997-02-23 fl Make sure to load raster data in getdata() # 1997-07-05 fl Support external decoder (0.4) # 1998-07-09 fl Handle all modes when saving (0.5) # 1998-07-15 fl Renamed offset attribute to avoid name clash # 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) # 2001-04-17 fl Added palette optimization (0.7) # 2002-06-06 fl Added transparency support for save (0.8) # 2004-02-24 fl Disable interlacing for small images # # Copyright (c) 1997-2004 by Secret Labs AB # Copyright (c) 1995-2004 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.9" from PIL import Image, ImageFile, ImagePalette, _binary # -------------------------------------------------------------------- # Helpers i8 = _binary.i8 i16 = _binary.i16le o8 = _binary.o8 o16 = _binary.o16le # -------------------------------------------------------------------- # Identify/read GIF files def _accept(prefix): return prefix[:6] in [b"GIF87a", b"GIF89a"] ## # Image plugin for GIF images. This plugin supports both GIF87 and # GIF89 images. class GifImageFile(ImageFile.ImageFile): format = "GIF" format_description = "Compuserve GIF" global_palette = None def data(self): s = self.fp.read(1) if s and i8(s): return self.fp.read(i8(s)) return None def _open(self): # Screen s = self.fp.read(13) if s[:6] not in [b"GIF87a", b"GIF89a"]: raise SyntaxError("not a GIF file") self.info["version"] = s[:6] self.size = i16(s[6:]), i16(s[8:]) self.tile = [] flags = i8(s[10]) bits = (flags & 7) + 1 if flags & 128: # get global palette self.info["background"] = i8(s[11]) # check if palette contains colour indices p = self.fp.read(3<= 3 and i8(block[0]) == 1: self.info["loop"] = i16(block[1:3]) while self.data(): pass elif s == b",": # # local image # s = self.fp.read(9) # extent x0, y0 = i16(s[0:]), i16(s[2:]) x1, y1 = x0 + i16(s[4:]), y0 + i16(s[6:]) flags = i8(s[8]) interlace = (flags & 64) != 0 if flags & 128: bits = (flags & 7) + 1 self.palette =\ ImagePalette.raw("RGB", self.fp.read(3<%s" % (file, filename)) else: os.system("ppmquant 256 %s | ppmtogif >%s" % (file, filename)) try: os.unlink(file) except: pass # -------------------------------------------------------------------- # GIF utilities def getheader(im, palette=None, info=None): """Return a list of strings representing a GIF header""" optimize = info and info.get("optimize", 0) # Header Block # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp header = [ b"GIF87a" + # signature + version o16(im.size[0]) + # canvas width o16(im.size[1]) # canvas height ] if im.mode == "P": if palette and isinstance(palette, bytes): sourcePalette = palette[:768] else: sourcePalette = im.im.getpalette("RGB")[:768] else: # L-mode if palette and isinstance(palette, bytes): sourcePalette = palette[:768] else: sourcePalette = bytearray([i//3 for i in range(768)]) usedPaletteColors = paletteBytes = None if optimize: usedPaletteColors = [] # check which colors are used i = 0 for count in im.histogram(): if count: usedPaletteColors.append(i) i += 1 # create the new palette if not every color is used if len(usedPaletteColors) < 256: paletteBytes = b"" newPositions = {} i = 0 # pick only the used colors from the palette for oldPosition in usedPaletteColors: paletteBytes += sourcePalette[oldPosition*3:oldPosition*3+3] newPositions[oldPosition] = i i += 1 # replace the palette color id of all pixel with the new id imageBytes = bytearray(im.tobytes()) for i in range(len(imageBytes)): imageBytes[i] = newPositions[imageBytes[i]] im.frombytes(bytes(imageBytes)) if not paletteBytes: paletteBytes = sourcePalette # Logical Screen Descriptor # calculate the palette size for the header import math colorTableSize = int(math.ceil(math.log(len(paletteBytes)//3, 2)))-1 if colorTableSize < 0: colorTableSize = 0 # size of global color table + global color table flag header.append(o8(colorTableSize + 128)) # background + reserved/aspect header.append(o8(0) + o8(0)) # end of Logical Screen Descriptor # add the missing amount of bytes # the palette has to be 2< 0: paletteBytes += o8(0) * 3 * actualTargetSizeDiff # Header + Logical Screen Descriptor + Global Color Table header.append(paletteBytes) return header, usedPaletteColors def getdata(im, offset = (0, 0), **params): """Return a list of strings representing this image. The first string is a local image header, the rest contains encoded image data.""" class collector: data = [] def write(self, data): self.data.append(data) im.load() # make sure raster data is available fp = collector() try: im.encoderinfo = params # local image header fp.write(b"," + o16(offset[0]) + # offset o16(offset[1]) + o16(im.size[0]) + # size o16(im.size[1]) + o8(0) + # flags o8(8)) # bits ImageFile._save(im, fp, [("gif", (0,0)+im.size, 0, RAWMODE[im.mode])]) fp.write(b"\0") # end of image data finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry Image.register_open(GifImageFile.format, GifImageFile, _accept) Image.register_save(GifImageFile.format, _save) Image.register_extension(GifImageFile.format, ".gif") Image.register_mime(GifImageFile.format, "image/gif") # # Uncomment the following line if you wish to use NETPBM/PBMPLUS # instead of the built-in "uncompressed" GIF encoder # Image.register_save(GifImageFile.format, _save_netpbm) pillow-2.3.0/PIL/PpmImagePlugin.py0000644000175000001440000000677112257506326015574 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PPM support for PIL # # History: # 96-03-24 fl Created # 98-03-06 fl Write RGBA images (as RGB, that is) # # Copyright (c) Secret Labs AB 1997-98. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # __version__ = "0.2" import string from PIL import Image, ImageFile # # -------------------------------------------------------------------- b_whitespace = string.whitespace try: import locale locale_lang,locale_enc = locale.getlocale() if locale_enc is None: locale_lang,locale_enc = locale.getdefaultlocale() b_whitespace = b_whitespace.decode(locale_enc) except: pass b_whitespace = b_whitespace.encode('ascii','ignore') MODES = { # standard b"P4": "1", b"P5": "L", b"P6": "RGB", # extensions b"P0CMYK": "CMYK", # PIL extensions (for test purposes only) b"PyP": "P", b"PyRGBA": "RGBA", b"PyCMYK": "CMYK" } def _accept(prefix): return prefix[0:1] == b"P" and prefix[1] in b"0456y" ## # Image plugin for PBM, PGM, and PPM images. class PpmImageFile(ImageFile.ImageFile): format = "PPM" format_description = "Pbmplus image" def _token(self, s = b""): while True: # read until next whitespace c = self.fp.read(1) if not c or c in b_whitespace: break s = s + c return s def _open(self): # check magic s = self.fp.read(1) if s != b"P": raise SyntaxError("not a PPM file") mode = MODES[self._token(s)] if mode == "1": self.mode = "1" rawmode = "1;I" else: self.mode = rawmode = mode for ix in range(3): while True: while True: s = self.fp.read(1) if s not in b_whitespace: break if s != b"#": break s = self.fp.readline() s = int(self._token(s)) if ix == 0: xsize = s elif ix == 1: ysize = s if mode == "1": break self.size = xsize, ysize self.tile = [("raw", (0, 0, xsize, ysize), self.fp.tell(), (rawmode, 0, 1))] # ALTERNATIVE: load via builtin debug function # self.im = Image.core.open_ppm(self.filename) # self.mode = self.im.mode # self.size = self.im.size # # -------------------------------------------------------------------- def _save(im, fp, filename): if im.mode == "1": rawmode, head = "1;I", b"P4" elif im.mode == "L": rawmode, head = "L", b"P5" elif im.mode == "RGB": rawmode, head = "RGB", b"P6" elif im.mode == "RGBA": rawmode, head = "RGB", b"P6" else: raise IOError("cannot write mode %s as PPM" % im.mode) fp.write(head + ("\n%d %d\n" % im.size).encode('ascii')) if head != b"P4": fp.write(b"255\n") ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, 0, 1))]) # ALTERNATIVE: save via builtin debug function # im._dump(filename) # # -------------------------------------------------------------------- Image.register_open("PPM", PpmImageFile, _accept) Image.register_save("PPM", _save) Image.register_extension("PPM", ".pbm") Image.register_extension("PPM", ".pgm") Image.register_extension("PPM", ".ppm") pillow-2.3.0/PIL/ExifTags.py0000644000175000001440000001211012257506326014410 0ustar dokousers# # The Python Imaging Library. # $Id$ # # EXIF tags # # Copyright (c) 2003 by Secret Labs AB # # See the README file for information on usage and redistribution. # ## # This module provides constants and clear-text names for various # well-known EXIF tags. ## ## # Maps EXIF tags to tag names. TAGS = { # possibly incomplete 0x00fe: "NewSubfileType", 0x00ff: "SubfileType", 0x0100: "ImageWidth", 0x0101: "ImageLength", 0x0102: "BitsPerSample", 0x0103: "Compression", 0x0106: "PhotometricInterpretation", 0x0107: "Threshholding", 0x0108: "CellWidth", 0x0109: "CellLenght", 0x010a: "FillOrder", 0x010d: "DocumentName", 0x011d: "PageName", 0x010e: "ImageDescription", 0x010f: "Make", 0x0110: "Model", 0x0111: "StripOffsets", 0x0112: "Orientation", 0x0115: "SamplesPerPixel", 0x0116: "RowsPerStrip", 0x0117: "StripByteConunts", 0x0118: "MinSampleValue", 0x0119: "MaxSampleValue", 0x011a: "XResolution", 0x011b: "YResolution", 0x011c: "PlanarConfiguration", 0x0120: "FreeOffsets", 0x0121: "FreeByteCounts", 0x0122: "GrayResponseUnit", 0x0123: "GrayResponseCurve", 0x0128: "ResolutionUnit", 0x012d: "TransferFunction", 0x0131: "Software", 0x0132: "DateTime", 0x013b: "Artist", 0x013c: "HostComputer", 0x013e: "WhitePoint", 0x013f: "PrimaryChromaticities", 0x0140: "ColorMap", 0x0152: "ExtraSamples", 0x0201: "JpegIFOffset", 0x0202: "JpegIFByteCount", 0x0211: "YCbCrCoefficients", 0x0211: "YCbCrCoefficients", 0x0212: "YCbCrSubSampling", 0x0213: "YCbCrPositioning", 0x0213: "YCbCrPositioning", 0x0214: "ReferenceBlackWhite", 0x0214: "ReferenceBlackWhite", 0x1000: "RelatedImageFileFormat", 0x1001: "RelatedImageLength", 0x1001: "RelatedImageWidth", 0x828d: "CFARepeatPatternDim", 0x828e: "CFAPattern", 0x828f: "BatteryLevel", 0x8298: "Copyright", 0x829a: "ExposureTime", 0x829d: "FNumber", 0x8769: "ExifOffset", 0x8773: "InterColorProfile", 0x8822: "ExposureProgram", 0x8824: "SpectralSensitivity", 0x8825: "GPSInfo", 0x8827: "ISOSpeedRatings", 0x8828: "OECF", 0x8829: "Interlace", 0x882a: "TimeZoneOffset", 0x882b: "SelfTimerMode", 0x9000: "ExifVersion", 0x9003: "DateTimeOriginal", 0x9004: "DateTimeDigitized", 0x9101: "ComponentsConfiguration", 0x9102: "CompressedBitsPerPixel", 0x9201: "ShutterSpeedValue", 0x9202: "ApertureValue", 0x9203: "BrightnessValue", 0x9204: "ExposureBiasValue", 0x9205: "MaxApertureValue", 0x9206: "SubjectDistance", 0x9207: "MeteringMode", 0x9208: "LightSource", 0x9209: "Flash", 0x920a: "FocalLength", 0x920b: "FlashEnergy", 0x920c: "SpatialFrequencyResponse", 0x920d: "Noise", 0x9211: "ImageNumber", 0x9212: "SecurityClassification", 0x9213: "ImageHistory", 0x9214: "SubjectLocation", 0x9215: "ExposureIndex", 0x9216: "TIFF/EPStandardID", 0x927c: "MakerNote", 0x9286: "UserComment", 0x9290: "SubsecTime", 0x9291: "SubsecTimeOriginal", 0x9292: "SubsecTimeDigitized", 0xa000: "FlashPixVersion", 0xa001: "ColorSpace", 0xa002: "ExifImageWidth", 0xa003: "ExifImageHeight", 0xa004: "RelatedSoundFile", 0xa005: "ExifInteroperabilityOffset", 0xa20b: "FlashEnergy", 0xa20c: "SpatialFrequencyResponse", 0xa20e: "FocalPlaneXResolution", 0xa20f: "FocalPlaneYResolution", 0xa210: "FocalPlaneResolutionUnit", 0xa214: "SubjectLocation", 0xa215: "ExposureIndex", 0xa217: "SensingMethod", 0xa300: "FileSource", 0xa301: "SceneType", 0xa302: "CFAPattern", 0xa401: "CustomRendered", 0xa402: "ExposureMode", 0xa403: "WhiteBalance", 0xa404: "DigitalZoomRatio", 0xa405: "FocalLengthIn35mmFilm", 0xa406: "SceneCaptureType", 0xa407: "GainControl", 0xa408: "Contrast", 0xa409: "Saturation", 0xa40a: "Sharpness", 0xa40b: "DeviceSettingDescription", 0xa40c: "SubjectDistanceRange", 0xa420: "ImageUniqueID", 0xa430: "CameraOwnerName", 0xa431: "BodySerialNumber", 0xa432: "LensSpecification", 0xa433: "LensMake", 0xa434: "LensModel", 0xa435: "LensSerialNumber", 0xa500: "Gamma", } ## # Maps EXIF GPS tags to tag names. GPSTAGS = { 0: "GPSVersionID", 1: "GPSLatitudeRef", 2: "GPSLatitude", 3: "GPSLongitudeRef", 4: "GPSLongitude", 5: "GPSAltitudeRef", 6: "GPSAltitude", 7: "GPSTimeStamp", 8: "GPSSatellites", 9: "GPSStatus", 10: "GPSMeasureMode", 11: "GPSDOP", 12: "GPSSpeedRef", 13: "GPSSpeed", 14: "GPSTrackRef", 15: "GPSTrack", 16: "GPSImgDirectionRef", 17: "GPSImgDirection", 18: "GPSMapDatum", 19: "GPSDestLatitudeRef", 20: "GPSDestLatitude", 21: "GPSDestLongitudeRef", 22: "GPSDestLongitude", 23: "GPSDestBearingRef", 24: "GPSDestBearing", 25: "GPSDestDistanceRef", 26: "GPSDestDistance", 27: "GPSProcessingMethod", 28: "GPSAreaInformation", 29: "GPSDateStamp", 30: "GPSDifferential", 31: "GPSHPositioningError", } pillow-2.3.0/PIL/PixarImagePlugin.py0000644000175000001440000000311412257506326016107 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PIXAR raster support for PIL # # history: # 97-01-29 fl Created # # notes: # This is incomplete; it is based on a few samples created with # Photoshop 2.5 and 3.0, and a summary description provided by # Greg Coats . Hopefully, "L" and # "RGBA" support will be added in future versions. # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, ImageFile, _binary # # helpers i16 = _binary.i16le i32 = _binary.i32le ## # Image plugin for PIXAR raster images. class PixarImageFile(ImageFile.ImageFile): format = "PIXAR" format_description = "PIXAR raster image" def _open(self): # assuming a 4-byte magic label (FIXME: add "_accept" hook) s = self.fp.read(4) if s != b"\200\350\000\000": raise SyntaxError("not a PIXAR file") # read rest of header s = s + self.fp.read(508) self.size = i16(s[418:420]), i16(s[416:418]) # get channel/depth descriptions mode = i16(s[424:426]), i16(s[426:428]) if mode == (14, 2): self.mode = "RGB" # FIXME: to be continued... # create tile descriptor (assuming "dumped") self.tile = [("raw", (0,0)+self.size, 1024, (self.mode, 0, 1))] # # -------------------------------------------------------------------- Image.register_open("PIXAR", PixarImageFile) # # FIXME: what's the standard extension? pillow-2.3.0/PIL/IcoImagePlugin.py0000644000175000001440000001626112257506326015545 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Windows Icon support for PIL # # History: # 96-05-27 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # # This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis . # https://code.google.com/p/casadebender/wiki/Win32IconImagePlugin # # Icon format references: # * http://en.wikipedia.org/wiki/ICO_(file_format) # * http://msdn.microsoft.com/en-us/library/ms997538.aspx __version__ = "0.1" from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary from math import log, ceil # # -------------------------------------------------------------------- i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le _MAGIC = b"\0\0\1\0" def _accept(prefix): return prefix[:4] == _MAGIC class IcoFile: def __init__(self, buf): """ Parse image from file-like object containing ico file data """ # check magic s = buf.read(6) if not _accept(s): raise SyntaxError("not an ICO file") self.buf = buf self.entry = [] # Number of items in file self.nb_items = i16(s[4:]) # Get headers for each item for i in range(self.nb_items): s = buf.read(16) icon_header = { 'width': i8(s[0]), 'height': i8(s[1]), 'nb_color': i8(s[2]), # Number of colors in image (0 if >=8bpp) 'reserved': i8(s[3]), 'planes': i16(s[4:]), 'bpp': i16(s[6:]), 'size': i32(s[8:]), 'offset': i32(s[12:]) } # See Wikipedia for j in ('width', 'height'): if not icon_header[j]: icon_header[j] = 256 # See Wikipedia notes about color depth. # We need this just to differ images with equal sizes icon_header['color_depth'] = (icon_header['bpp'] or (icon_header['nb_color'] != 0 and ceil(log(icon_header['nb_color'],2))) or 256) icon_header['dim'] = (icon_header['width'], icon_header['height']) icon_header['square'] = icon_header['width'] * icon_header['height'] self.entry.append(icon_header) self.entry = sorted(self.entry, key=lambda x: x['color_depth']) # ICO images are usually squares # self.entry = sorted(self.entry, key=lambda x: x['width']) self.entry = sorted(self.entry, key=lambda x: x['square']) self.entry.reverse() def sizes(self): """ Get a list of all available icon sizes and color depths. """ return set((h['width'], h['height']) for h in self.entry) def getimage(self, size, bpp=False): """ Get an image from the icon """ for (i, h) in enumerate(self.entry): if size == h['dim'] and (bpp == False or bpp == h['color_depth']): return self.frame(i) return self.frame(0) def frame(self, idx): """ Get an image from frame idx """ header = self.entry[idx] self.buf.seek(header['offset']) data = self.buf.read(8) self.buf.seek(header['offset']) if data[:8] == PngImagePlugin._MAGIC: # png frame im = PngImagePlugin.PngImageFile(self.buf) else: # XOR + AND mask bmp frame im = BmpImagePlugin.DibImageFile(self.buf) # change tile dimension to only encompass XOR image im.size = (im.size[0], int(im.size[1] / 2)) d, e, o, a = im.tile[0] im.tile[0] = d, (0,0) + im.size, o, a # figure out where AND mask image starts mode = a[0] bpp = 8 for k in BmpImagePlugin.BIT2MODE.keys(): if mode == BmpImagePlugin.BIT2MODE[k][1]: bpp = k break if 32 == bpp: # 32-bit color depth icon image allows semitransparent areas # PIL's DIB format ignores transparency bits, recover them # The DIB is packed in BGRX byte order where X is the alpha channel # Back up to start of bmp data self.buf.seek(o) # extract every 4th byte (eg. 3,7,11,15,...) alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] # convert to an 8bpp grayscale image mask = Image.frombuffer( 'L', # 8bpp im.size, # (w, h) alpha_bytes, # source chars 'raw', # raw decoder ('L', 0, -1) # 8bpp inverted, unpadded, reversed ) else: # get AND image from end of bitmap w = im.size[0] if (w % 32) > 0: # bitmap row data is aligned to word boundaries w += 32 - (im.size[0] % 32) # the total mask data is padded row size * height / bits per char and_mask_offset = o + int(im.size[0] * im.size[1] * (bpp / 8.0)) total_bytes = int((w * im.size[1]) / 8) self.buf.seek(and_mask_offset) maskData = self.buf.read(total_bytes) # convert raw data to image mask = Image.frombuffer( '1', # 1 bpp im.size, # (w, h) maskData, # source chars 'raw', # raw decoder ('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed ) # now we have two images, im is XOR image and mask is AND image # apply mask image as alpha channel im = im.convert('RGBA') im.putalpha(mask) return im ## # Image plugin for Windows Icon files. class IcoImageFile(ImageFile.ImageFile): """ PIL read-only image support for Microsoft Windows .ico files. By default the largest resolution image in the file will be loaded. This can be changed by altering the 'size' attribute before calling 'load'. The info dictionary has a key 'sizes' that is a list of the sizes available in the icon file. Handles classic, XP and Vista icon formats. This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis . https://code.google.com/p/casadebender/wiki/Win32IconImagePlugin """ format = "ICO" format_description = "Windows Icon" def _open(self): self.ico = IcoFile(self.fp) self.info['sizes'] = self.ico.sizes() self.size = self.ico.entry[0]['dim'] self.load() def load(self): im = self.ico.getimage(self.size) # if tile is PNG, it won't really be loaded yet im.load() self.im = im.im self.mode = im.mode self.size = im.size # # -------------------------------------------------------------------- Image.register_open("ICO", IcoImageFile, _accept) Image.register_extension("ICO", ".ico") pillow-2.3.0/PIL/ImageChops.py0000644000175000001440000001405012257506326014722 0ustar dokousers# # The Python Imaging Library. # $Id$ # # standard channel operations # # History: # 1996-03-24 fl Created # 1996-08-13 fl Added logical operations (for "1" images) # 2000-10-12 fl Added offset method (from Image.py) # # Copyright (c) 1997-2000 by Secret Labs AB # Copyright (c) 1996-2000 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image def constant(image, value): """Fill a channel with a given grey level. :rtype: :py:class:`~PIL.Image.Image` """ return Image.new("L", image.size, value) def duplicate(image): """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. :rtype: :py:class:`~PIL.Image.Image` """ return image.copy() def invert(image): """ Invert an image (channel). .. code-block:: python out = MAX - image :rtype: :py:class:`~PIL.Image.Image` """ image.load() return image._new(image.im.chop_invert()) def lighter(image1, image2): """ Compares the two images, pixel by pixel, and returns a new image containing the lighter values. .. code-block:: python out = max(image1, image2) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_lighter(image2.im)) def darker(image1, image2): """ Compares the two images, pixel by pixel, and returns a new image containing the darker values. .. code-block:: python out = min(image1, image2) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_darker(image2.im)) def difference(image1, image2): """ Returns the absolute value of the pixel-by-pixel difference between the two images. .. code-block:: python out = abs(image1 - image2) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_difference(image2.im)) def multiply(image1, image2): """ Superimposes two images on top of each other. If you multiply an image with a solid black image, the result is black. If you multiply with a solid white image, the image is unaffected. .. code-block:: python out = image1 * image2 / MAX :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_multiply(image2.im)) def screen(image1, image2): """ Superimposes two inverted images on top of each other. .. code-block:: python out = MAX - ((MAX - image1) * (MAX - image2) / MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_screen(image2.im)) def add(image1, image2, scale=1.0, offset=0): """ Adds two images, dividing the result by scale and adding the offset. If omitted, scale defaults to 1.0, and offset to 0.0. .. code-block:: python out = ((image1 + image2) / scale + offset) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_add(image2.im, scale, offset)) def subtract(image1, image2, scale=1.0, offset=0): """ Subtracts two images, dividing the result by scale and adding the offset. If omitted, scale defaults to 1.0, and offset to 0.0. .. code-block:: python out = ((image1 - image2) / scale + offset) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) def add_modulo(image1, image2): """Add two images, without clipping the result. .. code-block:: python out = ((image1 + image2) % MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_add_modulo(image2.im)) def subtract_modulo(image1, image2): """Subtract two images, without clipping the result. .. code-block:: python out = ((image1 - image2) % MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_subtract_modulo(image2.im)) def logical_and(image1, image2): """Logical AND between two images. .. code-block:: python out = ((image1 and image2) % MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_and(image2.im)) def logical_or(image1, image2): """Logical OR between two images. .. code-block:: python out = ((image1 or image2) % MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_or(image2.im)) def logical_xor(image1, image2): """Logical XOR between two images. .. code-block:: python out = ((bool(image1) != bool(image2)) % MAX) :rtype: :py:class:`~PIL.Image.Image` """ image1.load() image2.load() return image1._new(image1.im.chop_xor(image2.im)) def blend(image1, image2, alpha): """Blend images using constant transparency weight. Alias for :py:meth:`PIL.Image.Image.blend`. :rtype: :py:class:`~PIL.Image.Image` """ return Image.blend(image1, image2, alpha) def composite(image1, image2, mask): """Create composite using transparency mask. Alias for :py:meth:`PIL.Image.Image.composite`. :rtype: :py:class:`~PIL.Image.Image` """ return Image.composite(image1, image2, mask) def offset(image, xoffset, yoffset=None): """Returns a copy of the image where data has been offset by the given distances. Data wraps around the edges. If **yoffset** is omitted, it is assumed to be equal to **xoffset**. :param xoffset: The horizontal distance. :param yoffset: The vertical distance. If omitted, both distances are set to the same value. :rtype: :py:class:`~PIL.Image.Image` """ if yoffset is None: yoffset = xoffset image.load() return image._new(image.im.offset(xoffset, yoffset)) pillow-2.3.0/PIL/ImageCms.py0000644000175000001440000010422412257506326014373 0ustar dokousers# # The Python Imaging Library. # $Id$ # # optional color managment support, based on Kevin Cazabon's PyCMS # library. # # History: # 2009-03-08 fl Added to PIL. # # Copyright (C) 2002-2003 Kevin Cazabon # Copyright (c) 2009 by Fredrik Lundh # # See the README file for information on usage and redistribution. See # below for the original description. # from __future__ import print_function DESCRIPTION = """ pyCMS a Python / PIL interface to the littleCMS ICC Color Management System Copyright (C) 2002-2003 Kevin Cazabon kevin@cazabon.com http://www.cazabon.com pyCMS home page: http://www.cazabon.com/pyCMS littleCMS home page: http://www.littlecms.com (littleCMS is Copyright (C) 1998-2001 Marti Maria) Originally released under LGPL. Graciously donated to PIL in March 2009, for distribution under the standard PIL license The pyCMS.py module provides a "clean" interface between Python/PIL and pyCMSdll, taking care of some of the more complex handling of the direct pyCMSdll functions, as well as error-checking and making sure that all relevant data is kept together. While it is possible to call pyCMSdll functions directly, it's not highly recommended. Version History: 1.0.0 pil Oct 2013 Port to LCMS 2. 0.1.0 pil mod March 10, 2009 Renamed display profile to proof profile. The proof profile is the profile of the device that is being simulated, not the profile of the device which is actually used to display/print the final simulation (that'd be the output profile) - also see LCMSAPI.txt input colorspace -> using 'renderingIntent' -> proof colorspace -> using 'proofRenderingIntent' -> output colorspace Added LCMS FLAGS support. Added FLAGS["SOFTPROOFING"] as default flag for buildProofTransform (otherwise the proof profile/intent would be ignored). 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms 0.0.2 alpha Jan 6, 2002 Added try/except statements arount type() checks of potential CObjects... Python won't let you use type() on them, and raises a TypeError (stupid, if you ask me!) Added buildProofTransformFromOpenProfiles() function. Additional fixes in DLL, see DLL code for details. 0.0.1 alpha first public release, Dec. 26, 2002 Known to-do list with current version (of Python interface, not pyCMSdll): none """ VERSION = "1.0.0 pil" # --------------------------------------------------------------------. from PIL import Image from PIL import _imagingcms from PIL._util import isStringType core = _imagingcms # # intent/direction values INTENT_PERCEPTUAL = 0 INTENT_RELATIVE_COLORIMETRIC = 1 INTENT_SATURATION = 2 INTENT_ABSOLUTE_COLORIMETRIC = 3 DIRECTION_INPUT = 0 DIRECTION_OUTPUT = 1 DIRECTION_PROOF = 2 # # flags FLAGS = { "MATRIXINPUT": 1, "MATRIXOUTPUT": 2, "MATRIXONLY": (1|2), "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot "NOPRELINEARIZATION": 16, # Don't create prelinearization tables on precalculated transforms (internal use) "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) "NOTCACHE": 64, # Inhibit 1-pixel cache "NOTPRECALC": 256, "NULLTRANSFORM": 512, # Don't transform anyway "HIGHRESPRECALC": 1024, # Use more memory to give better accurancy "LOWRESPRECALC": 2048, # Use less memory to minimize resouces "WHITEBLACKCOMPENSATION": 8192, "BLACKPOINTCOMPENSATION": 8192, "GAMUTCHECK": 4096, # Out of Gamut alarm "SOFTPROOFING": 16384, # Do softproofing "PRESERVEBLACK": 32768, # Black preservation "NODEFAULTRESOURCEDEF": 16777216, # CRD special "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16 # Gridpoints } _MAX_FLAG = 0 for flag in FLAGS.values(): if isinstance(flag, int): _MAX_FLAG = _MAX_FLAG | flag # --------------------------------------------------------------------. # Experimental PIL-level API # --------------------------------------------------------------------. ## # Profile. class ImageCmsProfile: def __init__(self, profile): # accepts a string (filename), a file-like object, or a low-level # profile object if isStringType(profile): self._set(core.profile_open(profile), profile) elif hasattr(profile, "read"): self._set(core.profile_frombytes(profile.read())) else: self._set(profile) # assume it's already a profile def _set(self, profile, filename=None): self.profile = profile self.filename = filename if profile: self.product_name = None #profile.product_name self.product_info = None #profile.product_info else: self.product_name = None self.product_info = None ## # Transform. This can be used with the procedural API, or with the # standard {@link Image.point} method. class ImageCmsTransform(Image.ImagePointHandler): def __init__(self, input, output, input_mode, output_mode, intent=INTENT_PERCEPTUAL, proof=None, proof_intent=INTENT_ABSOLUTE_COLORIMETRIC, flags=0): if proof is None: self.transform = core.buildTransform( input.profile, output.profile, input_mode, output_mode, intent, flags ) else: self.transform = core.buildProofTransform( input.profile, output.profile, proof.profile, input_mode, output_mode, intent, proof_intent, flags ) # Note: inputMode and outputMode are for pyCMS compatibility only self.input_mode = self.inputMode = input_mode self.output_mode = self.outputMode = output_mode def point(self, im): return self.apply(im) def apply(self, im, imOut=None): im.load() if imOut is None: imOut = Image.new(self.output_mode, im.size, None) result = self.transform.apply(im.im.id, imOut.im.id) return imOut def apply_in_place(self, im): im.load() if im.mode != self.output_mode: raise ValueError("mode mismatch") # wrong output mode result = self.transform.apply(im.im.id, im.im.id) return im ## # (experimental) Fetches the profile for the current display device. # @return None if the profile is not known. def get_display_profile(handle=None): import sys if sys.platform == "win32": from PIL import ImageWin if isinstance(handle, ImageWin.HDC): profile = core.get_display_profile_win32(handle, 1) else: profile = core.get_display_profile_win32(handle or 0) else: try: get = _imagingcms.get_display_profile except AttributeError: return None else: profile = get() return ImageCmsProfile(profile) # --------------------------------------------------------------------. # pyCMS compatible layer # --------------------------------------------------------------------. ## # (pyCMS) Exception class. This is used for all errors in the pyCMS API. class PyCMSError(Exception): pass ## # (pyCMS) Applies an ICC transformation to a given image, mapping from # inputProfile to outputProfile. # # If the input or output profiles specified are not valid filenames, a # PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, # a PyCMSError will be raised. If an error occurs during application of # the profiles, a PyCMSError will be raised. If outputMode is not a mode # supported by the outputProfile (or by pyCMS), a PyCMSError will be # raised. # # This function applies an ICC transformation to im from inputProfile's # color space to outputProfile's color space using the specified rendering # intent to decide how to handle out-of-gamut colors. # # OutputMode can be used to specify that a color mode conversion is to # be done using these profiles, but the specified profiles must be able # to handle that mode. I.e., if converting im from RGB to CMYK using # profiles, the input profile must handle RGB data, and the output # profile must handle CMYK data. # # @param im An open PIL image object (i.e. Image.new(...) or Image.open(...), etc.) # @param inputProfile String, as a valid filename path to the ICC input profile # you wish to use for this image, or a profile object # @param outputProfile String, as a valid filename path to the ICC output # profile you wish to use for this image, or a profile object # @param renderingIntent Integer (0-3) specifying the rendering intent you wish # to use for the transform # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @param outputMode A valid PIL mode for the output image (i.e. "RGB", "CMYK", # etc.). Note: if rendering the image "inPlace", outputMode MUST be the # same mode as the input, or omitted completely. If omitted, the outputMode # will be the same as the mode of the input image (im.mode) # @param inPlace Boolean (1 = True, None or 0 = False). If True, the original # image is modified in-place, and None is returned. If False (default), a # new Image object is returned with the transform applied. # @param flags Integer (0-...) specifying additional flags # @return Either None or a new PIL image object, depending on value of inPlace # @exception PyCMSError def profileToProfile(im, inputProfile, outputProfile, renderingIntent=INTENT_PERCEPTUAL, outputMode=None, inPlace=0, flags=0): if outputMode is None: outputMode = im.mode if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <=3): raise PyCMSError("renderingIntent must be an integer between 0 and 3") if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) try: if not isinstance(inputProfile, ImageCmsProfile): inputProfile = ImageCmsProfile(inputProfile) if not isinstance(outputProfile, ImageCmsProfile): outputProfile = ImageCmsProfile(outputProfile) transform = ImageCmsTransform( inputProfile, outputProfile, im.mode, outputMode, renderingIntent, flags=flags ) if inPlace: transform.apply_in_place(im) imOut = None else: imOut = transform.apply(im) except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) return imOut ## # (pyCMS) Opens an ICC profile file. # # The PyCMSProfile object can be passed back into pyCMS for use in creating # transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). # # If profileFilename is not a vaild filename for an ICC profile, a PyCMSError # will be raised. # # @param profileFilename String, as a valid filename path to the ICC profile you # wish to open, or a file-like object. # @return A CmsProfile class object. # @exception PyCMSError def getOpenProfile(profileFilename): try: return ImageCmsProfile(profileFilename) except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Builds an ICC transform mapping from the inputProfile to the # outputProfile. Use applyTransform to apply the transform to a given # image. # # If the input or output profiles specified are not valid filenames, a # PyCMSError will be raised. If an error occurs during creation of the # transform, a PyCMSError will be raised. # # If inMode or outMode are not a mode supported by the outputProfile (or # by pyCMS), a PyCMSError will be raised. # # This function builds and returns an ICC transform from the inputProfile # to the outputProfile using the renderingIntent to determine what to do # with out-of-gamut colors. It will ONLY work for converting images that # are in inMode to images that are in outMode color format (PIL mode, # i.e. "RGB", "RGBA", "CMYK", etc.). # # Building the transform is a fair part of the overhead in # ImageCms.profileToProfile(), so if you're planning on converting multiple # images using the same input/output settings, this can save you time. # Once you have a transform object, it can be used with # ImageCms.applyProfile() to convert images without the need to re-compute # the lookup table for the transform. # # The reason pyCMS returns a class object rather than a handle directly # to the transform is that it needs to keep track of the PIL input/output # modes that the transform is meant for. These attributes are stored in # the "inMode" and "outMode" attributes of the object (which can be # manually overridden if you really want to, but I don't know of any # time that would be of use, or would even work). # # @param inputProfile String, as a valid filename path to the ICC input profile # you wish to use for this transform, or a profile object # @param outputProfile String, as a valid filename path to the ICC output # profile you wish to use for this transform, or a profile object # @param inMode String, as a valid PIL mode that the appropriate profile also # supports (i.e. "RGB", "RGBA", "CMYK", etc.) # @param outMode String, as a valid PIL mode that the appropriate profile also # supports (i.e. "RGB", "RGBA", "CMYK", etc.) # @param renderingIntent Integer (0-3) specifying the rendering intent you # wish to use for the transform # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @param flags Integer (0-...) specifying additional flags # @return A CmsTransform class object. # @exception PyCMSError def buildTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent=INTENT_PERCEPTUAL, flags=0): if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <=3): raise PyCMSError("renderingIntent must be an integer between 0 and 3") if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) try: if not isinstance(inputProfile, ImageCmsProfile): inputProfile = ImageCmsProfile(inputProfile) if not isinstance(outputProfile, ImageCmsProfile): outputProfile = ImageCmsProfile(outputProfile) return ImageCmsTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags) except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Builds an ICC transform mapping from the inputProfile to the # outputProfile, but tries to simulate the result that would be # obtained on the proofProfile device. # # If the input, output, or proof profiles specified are not valid # filenames, a PyCMSError will be raised. # # If an error occurs during creation of the transform, a PyCMSError will # be raised. # # If inMode or outMode are not a mode supported by the outputProfile # (or by pyCMS), a PyCMSError will be raised. # # This function builds and returns an ICC transform from the inputProfile # to the outputProfile, but tries to simulate the result that would be # obtained on the proofProfile device using renderingIntent and # proofRenderingIntent to determine what to do with out-of-gamut # colors. This is known as "soft-proofing". It will ONLY work for # converting images that are in inMode to images that are in outMode # color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). # # Usage of the resulting transform object is exactly the same as with # ImageCms.buildTransform(). # # Proof profiling is generally used when using an output device to get a # good idea of what the final printed/displayed image would look like on # the proofProfile device when it's quicker and easier to use the # output device for judging color. Generally, this means that the # output device is a monitor, or a dye-sub printer (etc.), and the simulated # device is something more expensive, complicated, or time consuming # (making it difficult to make a real print for color judgement purposes). # # Soft-proofing basically functions by adjusting the colors on the # output device to match the colors of the device being simulated. However, # when the simulated device has a much wider gamut than the output # device, you may obtain marginal results. # # @param inputProfile String, as a valid filename path to the ICC input profile # you wish to use for this transform, or a profile object # @param outputProfile String, as a valid filename path to the ICC output # (monitor, usually) profile you wish to use for this transform, or a # profile object # @param proofProfile String, as a valid filename path to the ICC proof profile # you wish to use for this transform, or a profile object # @param inMode String, as a valid PIL mode that the appropriate profile also # supports (i.e. "RGB", "RGBA", "CMYK", etc.) # @param outMode String, as a valid PIL mode that the appropriate profile also # supports (i.e. "RGB", "RGBA", "CMYK", etc.) # @param renderingIntent Integer (0-3) specifying the rendering intent you # wish to use for the input->proof (simulated) transform # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @param proofRenderingIntent Integer (0-3) specifying the rendering intent you # wish to use for proof->output transform # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @param flags Integer (0-...) specifying additional flags # @return A CmsTransform class object. # @exception PyCMSError def buildProofTransform(inputProfile, outputProfile, proofProfile, inMode, outMode, renderingIntent=INTENT_PERCEPTUAL, proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC, flags=FLAGS["SOFTPROOFING"]): if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <=3): raise PyCMSError("renderingIntent must be an integer between 0 and 3") if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) try: if not isinstance(inputProfile, ImageCmsProfile): inputProfile = ImageCmsProfile(inputProfile) if not isinstance(outputProfile, ImageCmsProfile): outputProfile = ImageCmsProfile(outputProfile) if not isinstance(proofProfile, ImageCmsProfile): proofProfile = ImageCmsProfile(proofProfile) return ImageCmsTransform(inputProfile, outputProfile, inMode, outMode, renderingIntent, proofProfile, proofRenderingIntent, flags) except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) buildTransformFromOpenProfiles = buildTransform buildProofTransformFromOpenProfiles = buildProofTransform ## # (pyCMS) Applies a transform to a given image. # # If im.mode != transform.inMode, a PyCMSError is raised. # # If inPlace == TRUE and transform.inMode != transform.outMode, a # PyCMSError is raised. # # If im.mode, transfer.inMode, or transfer.outMode is not supported by # pyCMSdll or the profiles you used for the transform, a PyCMSError is # raised. # # If an error occurs while the transform is being applied, a PyCMSError # is raised. # # This function applies a pre-calculated transform (from # ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) to an # image. The transform can be used for multiple images, saving # considerable calcuation time if doing the same conversion multiple times. # # If you want to modify im in-place instead of receiving a new image as # the return value, set inPlace to TRUE. This can only be done if # transform.inMode and transform.outMode are the same, because we can't # change the mode in-place (the buffer sizes for some modes are # different). The default behavior is to return a new Image object of # the same dimensions in mode transform.outMode. # # @param im A PIL Image object, and im.mode must be the same as the inMode # supported by the transform. # @param transform A valid CmsTransform class object # @param inPlace Bool (1 == True, 0 or None == False). If True, im is modified # in place and None is returned, if False, a new Image object with the # transform applied is returned (and im is not changed). The default is False. # @return Either None, or a new PIL Image object, depending on the value of inPlace # @exception PyCMSError def applyTransform(im, transform, inPlace=0): try: if inPlace: transform.apply_in_place(im) imOut = None else: imOut = transform.apply(im) except (TypeError, ValueError) as v: raise PyCMSError(v) return imOut ## # (pyCMS) Creates a profile. # # If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised # # If using LAB and colorTemp != a positive integer, a PyCMSError is raised. # # If an error occurs while creating the profile, a PyCMSError is raised. # # Use this function to create common profiles on-the-fly instead of # having to supply a profile on disk and knowing the path to it. It # returns a normal CmsProfile object that can be passed to # ImageCms.buildTransformFromOpenProfiles() to create a transform to apply # to images. # # @param colorSpace String, the color space of the profile you wish to create. # Currently only "LAB", "XYZ", and "sRGB" are supported. # @param colorTemp Positive integer for the white point for the profile, in # degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 # illuminant if omitted (5000k). colorTemp is ONLY applied to LAB profiles, # and is ignored for XYZ and sRGB. # @return A CmsProfile class object # @exception PyCMSError def createProfile(colorSpace, colorTemp=-1): if colorSpace not in ["LAB", "XYZ", "sRGB"]: raise PyCMSError("Color space not supported for on-the-fly profile creation (%s)" % colorSpace) if colorSpace == "LAB": try: colorTemp = float(colorTemp) except: raise PyCMSError("Color temperature must be numeric, \"%s\" not valid" % colorTemp) try: return core.createProfile(colorSpace, colorTemp) except (TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the internal product name for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised If an error occurs while trying to obtain the # name tag, a PyCMSError is raised. # # Use this function to obtain the INTERNAL name of the profile (stored # in an ICC tag in the profile itself), usually the one used when the # profile was originally created. Sometimes this tag also contains # additional information supplied by the creator. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal name of the profile as stored in an # ICC tag. # @exception PyCMSError def getProfileName(profile): try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) # do it in python, not c. # // name was "%s - %s" (model, manufacturer) || Description , # // but if the Model and Manufacturer were the same or the model # // was long, Just the model, in 1.x model = profile.profile.product_model manufacturer = profile.profile.product_manufacturer if not (model or manufacturer): return profile.profile.product_description+"\n" if not manufacturer or len(model) > 30: return model + "\n" return "%s - %s\n" % (model, manufacturer) except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the internal product information for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the info tag, a PyCMSError # is raised # # Use this function to obtain the information stored in the profile's # info tag. This often contains details about the profile, and how it # was created, as supplied by the creator. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal profile information stored in an ICC # tag. # @exception PyCMSError def getProfileInfo(profile): try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) # add an extra newline to preserve pyCMS compatibility # Python, not C. the white point bits weren't working well, so skipping. # // info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint description = profile.profile.product_description cpright = profile.profile.product_copyright arr = [] for elt in (description, cpright): if elt: arr.append(elt) return "\r\n\r\n".join(arr)+"\r\n\r\n" except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the copyright for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the copyright tag, a PyCMSError # is raised # # Use this function to obtain the information stored in the profile's # copyright tag. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal profile information stored in an ICC # tag. # @exception PyCMSError def getProfileCopyright(profile): try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) return profile.profile.product_copyright + "\n" except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the manufacturer for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the manufacturer tag, a PyCMSError # is raised # # Use this function to obtain the information stored in the profile's # manufacturer tag. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal profile information stored in an ICC # tag. # @exception PyCMSError def getProfileManufacturer(profile): try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) return profile.profile.product_manufacturer + "\n" except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the model for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the model tag, a PyCMSError # is raised # # Use this function to obtain the information stored in the profile's # model tag. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal profile information stored in an ICC # tag. # @exception PyCMSError def getProfileModel(profile): try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) return profile.profile.product_model + "\n" except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the description for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the description tag, a PyCMSError # is raised # # Use this function to obtain the information stored in the profile's # description tag. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return A string containing the internal profile information stored in an ICC # tag. # @exception PyCMSError def getProfileDescription(profile): try: # add an extra newline to preserve pyCMS compatibility if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) return profile.profile.product_description + "\n" except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Gets the default intent name for the given profile. # # If profile isn't a valid CmsProfile object or filename to a profile, # a PyCMSError is raised. # # If an error occurs while trying to obtain the default intent, a # PyCMSError is raised. # # Use this function to determine the default (and usually best optomized) # rendering intent for this profile. Most profiles support multiple # rendering intents, but are intended mostly for one type of conversion. # If you wish to use a different intent than returned, use # ImageCms.isIntentSupported() to verify it will work first. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @return Integer 0-3 specifying the default rendering intent for this profile. # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @exception PyCMSError def getDefaultIntent(profile): try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) return profile.profile.rendering_intent except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Checks if a given intent is supported. # # Use this function to verify that you can use your desired # renderingIntent with profile, and that profile can be used for the # input/output/proof profile as you desire. # # Some profiles are created specifically for one "direction", can cannot # be used for others. Some profiles can only be used for certain # rendering intents... so it's best to either verify this before trying # to create a transform with them (using this function), or catch the # potential PyCMSError that will occur if they don't support the modes # you select. # # @param profile EITHER a valid CmsProfile object, OR a string of the filename # of an ICC profile. # @param intent Integer (0-3) specifying the rendering intent you wish to use # with this profile # # INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) # INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) # INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) # INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) # # see the pyCMS documentation for details on rendering intents and what they do. # @param direction Integer specifing if the profile is to be used for input, # output, or proof # # INPUT = 0 (or use ImageCms.DIRECTION_INPUT) # OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) # PROOF = 2 (or use ImageCms.DIRECTION_PROOF) # # @return 1 if the intent/direction are supported, -1 if they are not. # @exception PyCMSError def isIntentSupported(profile, intent, direction): try: if not isinstance(profile, ImageCmsProfile): profile = ImageCmsProfile(profile) # FIXME: I get different results for the same data w. different # compilers. Bug in LittleCMS or in the binding? if profile.profile.is_intent_supported(intent, direction): return 1 else: return -1 except (AttributeError, IOError, TypeError, ValueError) as v: raise PyCMSError(v) ## # (pyCMS) Fetches versions. def versions(): import sys return ( VERSION, core.littlecms_version, sys.version.split()[0], Image.VERSION ) # -------------------------------------------------------------------- if __name__ == "__main__": # create a cheap manual from the __doc__ strings for the functions above from PIL import ImageCms print(__doc__) for f in dir(pyCMS): print("="*80) print("%s" %f) try: exec ("doc = ImageCms.%s.__doc__" %(f)) if "pyCMS" in doc: # so we don't get the __doc__ string for imported modules print(doc) except AttributeError: pass pillow-2.3.0/PIL/IptcImagePlugin.py0000644000175000001440000001702012257506326015724 0ustar dokousers# # The Python Imaging Library. # $Id$ # # IPTC/NAA file handling # # history: # 1995-10-01 fl Created # 1998-03-09 fl Cleaned up and added to PIL # 2002-06-18 fl Added getiptcinfo helper # # Copyright (c) Secret Labs AB 1997-2002. # Copyright (c) Fredrik Lundh 1995. # # See the README file for information on usage and redistribution. # from __future__ import print_function __version__ = "0.3" from PIL import Image, ImageFile, _binary import os, tempfile i8 = _binary.i8 i16 = _binary.i16be i32 = _binary.i32be o8 = _binary.o8 COMPRESSION = { 1: "raw", 5: "jpeg" } PAD = o8(0) * 4 # # Helpers def i(c): return i32((PAD + c)[-4:]) def dump(c): for i in c: print("%02x" % i8(i), end=' ') print() ## # Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields # from TIFF and JPEG files, use the getiptcinfo function. class IptcImageFile(ImageFile.ImageFile): format = "IPTC" format_description = "IPTC/NAA" def getint(self, key): return i(self.info[key]) def field(self): # # get a IPTC field header s = self.fp.read(5) if not len(s): return None, 0 tag = i8(s[1]), i8(s[2]) # syntax if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: raise SyntaxError("invalid IPTC/NAA file") # field size size = i8(s[3]) if size > 132: raise IOError("illegal field length in IPTC/NAA file") elif size == 128: size = 0 elif size > 128: size = i(self.fp.read(size-128)) else: size = i16(s[3:]) return tag, size def _is_raw(self, offset, size): # # check if the file can be mapped # DISABLED: the following only slows things down... return 0 self.fp.seek(offset) t, sz = self.field() if sz != size[0]: return 0 y = 1 while True: self.fp.seek(sz, 1) t, s = self.field() if t != (8, 10): break if s != sz: return 0 y = y + 1 return y == size[1] def _open(self): # load descriptive fields while True: offset = self.fp.tell() tag, size = self.field() if not tag or tag == (8,10): break if size: tagdata = self.fp.read(size) else: tagdata = None if tag in list(self.info.keys()): if isinstance(self.info[tag], list): self.info[tag].append(tagdata) else: self.info[tag] = [self.info[tag], tagdata] else: self.info[tag] = tagdata # print tag, self.info[tag] # mode layers = i8(self.info[(3,60)][0]) component = i8(self.info[(3,60)][1]) if (3,65) in self.info: id = i8(self.info[(3,65)][0])-1 else: id = 0 if layers == 1 and not component: self.mode = "L" elif layers == 3 and component: self.mode = "RGB"[id] elif layers == 4 and component: self.mode = "CMYK"[id] # size self.size = self.getint((3,20)), self.getint((3,30)) # compression try: compression = COMPRESSION[self.getint((3,120))] except KeyError: raise IOError("Unknown IPTC image compression") # tile if tag == (8,10): if compression == "raw" and self._is_raw(offset, self.size): self.tile = [(compression, (offset, size + 5, -1), (0, 0, self.size[0], self.size[1]))] else: self.tile = [("iptc", (compression, offset), (0, 0, self.size[0], self.size[1]))] def load(self): if len(self.tile) != 1 or self.tile[0][0] != "iptc": return ImageFile.ImageFile.load(self) type, tile, box = self.tile[0] encoding, offset = tile self.fp.seek(offset) # Copy image data to temporary file outfile = tempfile.mktemp() o = open(outfile, "wb") if encoding == "raw": # To simplify access to the extracted file, # prepend a PPM header o.write("P5\n%d %d\n255\n" % self.size) while True: type, size = self.field() if type != (8, 10): break while size > 0: s = self.fp.read(min(size, 8192)) if not s: break o.write(s) size = size - len(s) o.close() try: try: # fast self.im = Image.core.open_ppm(outfile) except: # slightly slower im = Image.open(outfile) im.load() self.im = im.im finally: try: os.unlink(outfile) except: pass Image.register_open("IPTC", IptcImageFile) Image.register_extension("IPTC", ".iim") ## # Get IPTC information from TIFF, JPEG, or IPTC file. # # @param im An image containing IPTC data. # @return A dictionary containing IPTC information, or None if # no IPTC information block was found. def getiptcinfo(im): from PIL import TiffImagePlugin, JpegImagePlugin import io data = None if isinstance(im, IptcImageFile): # return info dictionary right away return im.info elif isinstance(im, JpegImagePlugin.JpegImageFile): # extract the IPTC/NAA resource try: app = im.app["APP13"] if app[:14] == "Photoshop 3.0\x00": app = app[14:] # parse the image resource block offset = 0 while app[offset:offset+4] == "8BIM": offset = offset + 4 # resource code code = JpegImagePlugin.i16(app, offset) offset = offset + 2 # resource name (usually empty) name_len = i8(app[offset]) name = app[offset+1:offset+1+name_len] offset = 1 + offset + name_len if offset & 1: offset = offset + 1 # resource data block size = JpegImagePlugin.i32(app, offset) offset = offset + 4 if code == 0x0404: # 0x0404 contains IPTC/NAA data data = app[offset:offset+size] break offset = offset + size if offset & 1: offset = offset + 1 except (AttributeError, KeyError): pass elif isinstance(im, TiffImagePlugin.TiffImageFile): # get raw data from the IPTC/NAA tag (PhotoShop tags the data # as 4-byte integers, so we cannot use the get method...) try: data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] except (AttributeError, KeyError): pass if data is None: return None # no properties # create an IptcImagePlugin object without initializing it class FakeImage: pass im = FakeImage() im.__class__ = IptcImageFile # parse the IPTC information chunk im.info = {} im.fp = io.BytesIO(data) try: im._open() except (IndexError, KeyError): pass # expected failure return im.info pillow-2.3.0/PIL/_util.py0000644000175000001440000000063612257506326014024 0ustar dokousersimport os if bytes is str: def isStringType(t): return isinstance(t, basestring) def isPath(f): return isinstance(f, basestring) else: def isStringType(t): return isinstance(t, str) def isPath(f): return isinstance(f, (bytes, str)) # Checks if an object is a string, and that it points to a directory. def isDirectory(f): return isPath(f) and os.path.isdir(f) pillow-2.3.0/PIL/ImageOps.py0000644000175000001440000003166512257506326014422 0ustar dokousers# # The Python Imaging Library. # $Id$ # # standard image operations # # History: # 2001-10-20 fl Created # 2001-10-23 fl Added autocontrast operator # 2001-12-18 fl Added Kevin's fit operator # 2004-03-14 fl Fixed potential division by zero in equalize # 2005-05-05 fl Fixed equalize for low number of values # # Copyright (c) 2001-2004 by Secret Labs AB # Copyright (c) 2001-2004 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image from PIL._util import isStringType import operator from functools import reduce # # helpers def _border(border): if isinstance(border, tuple): if len(border) == 2: left, top = right, bottom = border elif len(border) == 4: left, top, right, bottom = border else: left = top = right = bottom = border return left, top, right, bottom def _color(color, mode): if isStringType(color): from PIL import ImageColor color = ImageColor.getcolor(color, mode) return color def _lut(image, lut): if image.mode == "P": # FIXME: apply to lookup table, not image data raise NotImplementedError("mode P support coming soon") elif image.mode in ("L", "RGB"): if image.mode == "RGB" and len(lut) == 256: lut = lut + lut + lut return image.point(lut) else: raise IOError("not supported for this image mode") # # actions def autocontrast(image, cutoff=0, ignore=None): """ Maximize (normalize) image contrast. This function calculates a histogram of the input image, removes **cutoff** percent of the lightest and darkest pixels from the histogram, and remaps the image so that the darkest pixel becomes black (0), and the lightest becomes white (255). :param image: The image to process. :param cutoff: How many percent to cut off from the histogram. :param ignore: The background pixel value (use None for no background). :return: An image. """ histogram = image.histogram() lut = [] for layer in range(0, len(histogram), 256): h = histogram[layer:layer+256] if ignore is not None: # get rid of outliers try: h[ignore] = 0 except TypeError: # assume sequence for ix in ignore: h[ix] = 0 if cutoff: # cut off pixels from both ends of the histogram # get number of pixels n = 0 for ix in range(256): n = n + h[ix] # remove cutoff% pixels from the low end cut = n * cutoff // 100 for lo in range(256): if cut > h[lo]: cut = cut - h[lo] h[lo] = 0 else: h[lo] = h[lo] - cut cut = 0 if cut <= 0: break # remove cutoff% samples from the hi end cut = n * cutoff // 100 for hi in range(255, -1, -1): if cut > h[hi]: cut = cut - h[hi] h[hi] = 0 else: h[hi] = h[hi] - cut cut = 0 if cut <= 0: break # find lowest/highest samples after preprocessing for lo in range(256): if h[lo]: break for hi in range(255, -1, -1): if h[hi]: break if hi <= lo: # don't bother lut.extend(list(range(256))) else: scale = 255.0 / (hi - lo) offset = -lo * scale for ix in range(256): ix = int(ix * scale + offset) if ix < 0: ix = 0 elif ix > 255: ix = 255 lut.append(ix) return _lut(image, lut) def colorize(image, black, white): """ Colorize grayscale image. The **black** and **white** arguments should be RGB tuples; this function calculates a color wedge mapping all black pixels in the source image to the first color, and all white pixels to the second color. :param image: The image to colorize. :param black: The color to use for black input pixels. :param white: The color to use for white input pixels. :return: An image. """ assert image.mode == "L" black = _color(black, "RGB") white = _color(white, "RGB") red = []; green = []; blue = [] for i in range(256): red.append(black[0]+i*(white[0]-black[0])//255) green.append(black[1]+i*(white[1]-black[1])//255) blue.append(black[2]+i*(white[2]-black[2])//255) image = image.convert("RGB") return _lut(image, red + green + blue) def crop(image, border=0): """ Remove border from image. The same amount of pixels are removed from all four sides. This function works on all image modes. .. seealso:: :py:meth:`~PIL.Image.Image.crop` :param image: The image to crop. :param border: The number of pixels to remove. :return: An image. """ left, top, right, bottom = _border(border) return image.crop( (left, top, image.size[0]-right, image.size[1]-bottom) ) def deform(image, deformer, resample=Image.BILINEAR): """ Deform the image. :param image: The image to deform. :param deformer: A deformer object. Any object that implements a **getmesh** method can be used. :param resample: What resampling filter to use. :return: An image. """ return image.transform( image.size, Image.MESH, deformer.getmesh(image), resample ) def equalize(image, mask=None): """ Equalize the image histogram. This function applies a non-linear mapping to the input image, in order to create a uniform distribution of grayscale values in the output image. :param image: The image to equalize. :param mask: An optional mask. If given, only the pixels selected by the mask are included in the analysis. :return: An image. """ if image.mode == "P": image = image.convert("RGB") h = image.histogram(mask) lut = [] for b in range(0, len(h), 256): histo = [_f for _f in h[b:b+256] if _f] if len(histo) <= 1: lut.extend(list(range(256))) else: step = (reduce(operator.add, histo) - histo[-1]) // 255 if not step: lut.extend(list(range(256))) else: n = step // 2 for i in range(256): lut.append(n // step) n = n + h[i+b] return _lut(image, lut) def expand(image, border=0, fill=0): """ Add border to the image :param image: The image to expand. :param border: Border width, in pixels. :param fill: Pixel fill value (a color value). Default is 0 (black). :return: An image. """ "Add border to image" left, top, right, bottom = _border(border) width = left + image.size[0] + right height = top + image.size[1] + bottom out = Image.new(image.mode, (width, height), _color(fill, image.mode)) out.paste(image, (left, top)) return out def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): """ Returns a sized and cropped version of the image, cropped to the requested aspect ratio and size. This function was contributed by Kevin Cazabon. :param size: The requested output size in pixels, given as a (width, height) tuple. :param method: What resampling method to use. Default is :py:attr:`PIL.Image.NEAREST`. :param bleed: Remove a border around the outside of the image (from all four edges. The value is a decimal percentage (use 0.01 for one percent). The default value is 0 (no border). :param centering: Control the cropping position. Use (0.5, 0.5) for center cropping (e.g. if cropping the width, take 50% off of the left side, and therefore 50% off the right side). (0.0, 0.0) will crop from the top left corner (i.e. if cropping the width, take all of the crop off of the right side, and if cropping the height, take all of it off the bottom). (1.0, 0.0) will crop from the bottom left corner, etc. (i.e. if cropping the width, take all of the crop off the left side, and if cropping the height take none from the top, and therefore all off the bottom). :return: An image. """ # by Kevin Cazabon, Feb 17/2000 # kevin@cazabon.com # http://www.cazabon.com # ensure inputs are valid if not isinstance(centering, list): centering = [centering[0], centering[1]] if centering[0] > 1.0 or centering[0] < 0.0: centering [0] = 0.50 if centering[1] > 1.0 or centering[1] < 0.0: centering[1] = 0.50 if bleed > 0.49999 or bleed < 0.0: bleed = 0.0 # calculate the area to use for resizing and cropping, subtracting # the 'bleed' around the edges # number of pixels to trim off on Top and Bottom, Left and Right bleedPixels = ( int((float(bleed) * float(image.size[0])) + 0.5), int((float(bleed) * float(image.size[1])) + 0.5) ) liveArea = (0, 0, image.size[0], image.size[1]) if bleed > 0.0: liveArea = ( bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1, image.size[1] - bleedPixels[1] - 1 ) liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1]) # calculate the aspect ratio of the liveArea liveAreaAspectRatio = float(liveSize[0])/float(liveSize[1]) # calculate the aspect ratio of the output image aspectRatio = float(size[0]) / float(size[1]) # figure out if the sides or top/bottom will be cropped off if liveAreaAspectRatio >= aspectRatio: # liveArea is wider than what's needed, crop the sides cropWidth = int((aspectRatio * float(liveSize[1])) + 0.5) cropHeight = liveSize[1] else: # liveArea is taller than what's needed, crop the top and bottom cropWidth = liveSize[0] cropHeight = int((float(liveSize[0])/aspectRatio) + 0.5) # make the crop leftSide = int(liveArea[0] + (float(liveSize[0]-cropWidth) * centering[0])) if leftSide < 0: leftSide = 0 topSide = int(liveArea[1] + (float(liveSize[1]-cropHeight) * centering[1])) if topSide < 0: topSide = 0 out = image.crop( (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight) ) # resize the image and return it return out.resize(size, method) def flip(image): """ Flip the image vertically (top to bottom). :param image: The image to flip. :return: An image. """ return image.transpose(Image.FLIP_TOP_BOTTOM) def grayscale(image): """ Convert the image to grayscale. :param image: The image to convert. :return: An image. """ return image.convert("L") def invert(image): """ Invert (negate) the image. :param image: The image to invert. :return: An image. """ lut = [] for i in range(256): lut.append(255-i) return _lut(image, lut) def mirror(image): """ Flip image horizontally (left to right). :param image: The image to mirror. :return: An image. """ return image.transpose(Image.FLIP_LEFT_RIGHT) def posterize(image, bits): """ Reduce the number of bits for each color channel. :param image: The image to posterize. :param bits: The number of bits to keep for each channel (1-8). :return: An image. """ lut = [] mask = ~(2**(8-bits)-1) for i in range(256): lut.append(i & mask) return _lut(image, lut) def solarize(image, threshold=128): """ Invert all pixel values above a threshold. :param image: The image to posterize. :param threshold: All pixels above this greyscale level are inverted. :return: An image. """ lut = [] for i in range(256): if i < threshold: lut.append(i) else: lut.append(255-i) return _lut(image, lut) # -------------------------------------------------------------------- # PIL USM components, from Kevin Cazabon. def gaussian_blur(im, radius=None): """ PIL_usm.gblur(im, [radius])""" if radius is None: radius = 5.0 im.load() return im.im.gaussian_blur(radius) gblur = gaussian_blur def unsharp_mask(im, radius=None, percent=None, threshold=None): """ PIL_usm.usm(im, [radius, percent, threshold])""" if radius is None: radius = 5.0 if percent is None: percent = 150 if threshold is None: threshold = 3 im.load() return im.im.unsharp_mask(radius, percent, threshold) usm = unsharp_mask pillow-2.3.0/PIL/SgiImagePlugin.py0000644000175000001440000000406612257506326015555 0ustar dokousers# # The Python Imaging Library. # $Id$ # # SGI image file handling # # See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. # # # History: # 1995-09-10 fl Created # # Copyright (c) 2008 by Karsten Hiddemann. # Copyright (c) 1997 by Secret Labs AB. # Copyright (c) 1995 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # __version__ = "0.2" from PIL import Image, ImageFile, _binary i8 = _binary.i8 i16 = _binary.i16be i32 = _binary.i32be def _accept(prefix): return i16(prefix) == 474 ## # Image plugin for SGI images. class SgiImageFile(ImageFile.ImageFile): format = "SGI" format_description = "SGI Image File Format" def _open(self): # HEAD s = self.fp.read(512) if i16(s) != 474: raise SyntaxError("not an SGI image file") # relevant header entries compression = i8(s[2]) # bytes, dimension, zsize layout = i8(s[3]), i16(s[4:]), i16(s[10:]) # determine mode from bytes/zsize if layout == (1, 2, 1) or layout == (1, 1, 1): self.mode = "L" elif layout == (1, 3, 3): self.mode = "RGB" elif layout == (1, 3, 4): self.mode = "RGBA" else: raise SyntaxError("unsupported SGI image mode") # size self.size = i16(s[6:]), i16(s[8:]) # decoder info if compression == 0: offset = 512 pagesize = self.size[0]*self.size[1]*layout[0] self.tile = [] for layer in self.mode: self.tile.append(("raw", (0,0)+self.size, offset, (layer,0,-1))) offset = offset + pagesize elif compression == 1: self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, -1))] # # registry Image.register_open("SGI", SgiImageFile, _accept) Image.register_extension("SGI", ".bw") Image.register_extension("SGI", ".rgb") Image.register_extension("SGI", ".rgba") Image.register_extension("SGI", ".sgi") # really? pillow-2.3.0/PIL/ImageMath.py0000644000175000001440000001625012257506326014543 0ustar dokousers# # The Python Imaging Library # $Id$ # # a simple math add-on for the Python Imaging Library # # History: # 1999-02-15 fl Original PIL Plus release # 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 # 2005-09-12 fl Fixed int() and float() for Python 2.4.1 # # Copyright (c) 1999-2005 by Secret Labs AB # Copyright (c) 2005 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image from PIL import _imagingmath import sys try: import builtins except ImportError: import __builtin__ builtins = __builtin__ VERBOSE = 0 def _isconstant(v): return isinstance(v, int) or isinstance(v, float) class _Operand: # wraps an image operand, providing standard operators def __init__(self, im): self.im = im def __fixup(self, im1): # convert image to suitable mode if isinstance(im1, _Operand): # argument was an image. if im1.im.mode in ("1", "L"): return im1.im.convert("I") elif im1.im.mode in ("I", "F"): return im1.im else: raise ValueError("unsupported mode: %s" % im1.im.mode) else: # argument was a constant if _isconstant(im1) and self.im.mode in ("1", "L", "I"): return Image.new("I", self.im.size, im1) else: return Image.new("F", self.im.size, im1) def apply(self, op, im1, im2=None, mode=None): im1 = self.__fixup(im1) if im2 is None: # unary operation out = Image.new(mode or im1.mode, im1.size, None) im1.load() try: op = getattr(_imagingmath, op+"_"+im1.mode) except AttributeError: raise TypeError("bad operand type for '%s'" % op) _imagingmath.unop(op, out.im.id, im1.im.id) else: # binary operation im2 = self.__fixup(im2) if im1.mode != im2.mode: # convert both arguments to floating point if im1.mode != "F": im1 = im1.convert("F") if im2.mode != "F": im2 = im2.convert("F") if im1.mode != im2.mode: raise ValueError("mode mismatch") if im1.size != im2.size: # crop both arguments to a common size size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1])) if im1.size != size: im1 = im1.crop((0, 0) + size) if im2.size != size: im2 = im2.crop((0, 0) + size) out = Image.new(mode or im1.mode, size, None) else: out = Image.new(mode or im1.mode, im1.size, None) im1.load(); im2.load() try: op = getattr(_imagingmath, op+"_"+im1.mode) except AttributeError: raise TypeError("bad operand type for '%s'" % op) _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) return _Operand(out) # unary operators def __bool__(self): # an image is "true" if it contains at least one non-zero pixel return self.im.getbbox() is not None if bytes is str: # Provide __nonzero__ for pre-Py3k __nonzero__ = __bool__ del __bool__ def __abs__(self): return self.apply("abs", self) def __pos__(self): return self def __neg__(self): return self.apply("neg", self) # binary operators def __add__(self, other): return self.apply("add", self, other) def __radd__(self, other): return self.apply("add", other, self) def __sub__(self, other): return self.apply("sub", self, other) def __rsub__(self, other): return self.apply("sub", other, self) def __mul__(self, other): return self.apply("mul", self, other) def __rmul__(self, other): return self.apply("mul", other, self) def __truediv__(self, other): return self.apply("div", self, other) def __rtruediv__(self, other): return self.apply("div", other, self) def __mod__(self, other): return self.apply("mod", self, other) def __rmod__(self, other): return self.apply("mod", other, self) def __pow__(self, other): return self.apply("pow", self, other) def __rpow__(self, other): return self.apply("pow", other, self) if bytes is str: # Provide __div__ and __rdiv__ for pre-Py3k __div__ = __truediv__ __rdiv__ = __rtruediv__ del __truediv__ del __rtruediv__ # bitwise def __invert__(self): return self.apply("invert", self) def __and__(self, other): return self.apply("and", self, other) def __rand__(self, other): return self.apply("and", other, self) def __or__(self, other): return self.apply("or", self, other) def __ror__(self, other): return self.apply("or", other, self) def __xor__(self, other): return self.apply("xor", self, other) def __rxor__(self, other): return self.apply("xor", other, self) def __lshift__(self, other): return self.apply("lshift", self, other) def __rshift__(self, other): return self.apply("rshift", self, other) # logical def __eq__(self, other): return self.apply("eq", self, other) def __ne__(self, other): return self.apply("ne", self, other) def __lt__(self, other): return self.apply("lt", self, other) def __le__(self, other): return self.apply("le", self, other) def __gt__(self, other): return self.apply("gt", self, other) def __ge__(self, other): return self.apply("ge", self, other) # conversions def imagemath_int(self): return _Operand(self.im.convert("I")) def imagemath_float(self): return _Operand(self.im.convert("F")) # logical def imagemath_equal(self, other): return self.apply("eq", self, other, mode="I") def imagemath_notequal(self, other): return self.apply("ne", self, other, mode="I") def imagemath_min(self, other): return self.apply("min", self, other) def imagemath_max(self, other): return self.apply("max", self, other) def imagemath_convert(self, mode): return _Operand(self.im.convert(mode)) ops = {} for k, v in list(globals().items()): if k[:10] == "imagemath_": ops[k[10:]] = v def eval(expression, _dict={}, **kw): """ Evaluates an image expression. :param expression: A string containing a Python-style expression. :param options: Values to add to the evaluation context. You can either use a dictionary, or one or more keyword arguments. :return: The evaluated expression. This is usually an image object, but can also be an integer, a floating point value, or a pixel tuple, depending on the expression. """ # build execution namespace args = ops.copy() args.update(_dict) args.update(kw) for k, v in list(args.items()): if hasattr(v, "im"): args[k] = _Operand(v) out = builtins.eval(expression, args) try: return out.im except AttributeError: return out pillow-2.3.0/PIL/Image.py0000644000175000001440000021333112257512376013732 0ustar dokousers# # The Python Imaging Library. # $Id$ # # the Image class wrapper # # partial release history: # 1995-09-09 fl Created # 1996-03-11 fl PIL release 0.0 (proof of concept) # 1996-04-30 fl PIL release 0.1b1 # 1999-07-28 fl PIL release 1.0 final # 2000-06-07 fl PIL release 1.1 # 2000-10-20 fl PIL release 1.1.1 # 2001-05-07 fl PIL release 1.1.2 # 2002-03-15 fl PIL release 1.1.3 # 2003-05-10 fl PIL release 1.1.4 # 2005-03-28 fl PIL release 1.1.5 # 2006-12-02 fl PIL release 1.1.6 # 2009-11-15 fl PIL release 1.1.7 # # Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. # Copyright (c) 1995-2009 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from __future__ import print_function from PIL import VERSION, PILLOW_VERSION, _plugins import warnings class _imaging_not_installed: # module placeholder def __getattr__(self, id): raise ImportError("The _imaging C module is not installed") try: # give Tk a chance to set up the environment, in case we're # using an _imaging module linked against libtcl/libtk (use # __import__ to hide this from naive packagers; we don't really # depend on Tk unless ImageTk is used, and that module already # imports Tkinter) __import__("FixTk") except ImportError: pass try: # If the _imaging C module is not present, you can still use # the "open" function to identify files, but you cannot load # them. Note that other modules should not refer to _imaging # directly; import Image and use the Image.core variable instead. from PIL import _imaging as core if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " " version of Pillow or PIL") except ImportError as v: core = _imaging_not_installed() # Explanations for ways that we know we might have an import error if str(v).startswith("Module use of python"): # The _imaging C module is present, but not compiled for # the right version (windows only). Print a warning, if # possible. warnings.warn( "The _imaging extension was built for another version " "of Python.", RuntimeWarning ) elif str(v).startswith("The _imaging extension"): warnings.warn(str(v), RuntimeWarning) elif "Symbol not found: _PyUnicodeUCS2_FromString" in str(v): warnings.warn( "The _imaging extension was built for Python with UCS2 support; " "recompile PIL or build Python --without-wide-unicode. ", RuntimeWarning ) elif "Symbol not found: _PyUnicodeUCS4_FromString" in str(v): warnings.warn( "The _imaging extension was built for Python with UCS4 support; " "recompile PIL or build Python --with-wide-unicode. ", RuntimeWarning ) # Fail here anyway. Don't let people run with a mostly broken Pillow. raise try: import builtins except ImportError: import __builtin__ builtins = __builtin__ from PIL import ImageMode from PIL._binary import i8, o8 from PIL._util import isPath, isStringType import os, sys # type stuff import collections import numbers def isImageType(t): """ Checks if an object is an image object. .. warning:: This function is for internal use only. :param t: object to check if it's an image :returns: True if the object is an image """ return hasattr(t, "im") # # Debug level DEBUG = 0 # # Constants (also defined in _imagingmodule.c!) NONE = 0 # transpose FLIP_LEFT_RIGHT = 0 FLIP_TOP_BOTTOM = 1 ROTATE_90 = 2 ROTATE_180 = 3 ROTATE_270 = 4 # transforms AFFINE = 0 EXTENT = 1 PERSPECTIVE = 2 QUAD = 3 MESH = 4 # resampling filters NONE = 0 NEAREST = 0 ANTIALIAS = 1 # 3-lobed lanczos LINEAR = BILINEAR = 2 CUBIC = BICUBIC = 3 # dithers NONE = 0 NEAREST = 0 ORDERED = 1 # Not yet implemented RASTERIZE = 2 # Not yet implemented FLOYDSTEINBERG = 3 # default # palettes/quantizers WEB = 0 ADAPTIVE = 1 MEDIANCUT = 0 MAXCOVERAGE = 1 FASTOCTREE = 2 # categories NORMAL = 0 SEQUENCE = 1 CONTAINER = 2 if hasattr(core, 'DEFAULT_STRATEGY'): DEFAULT_STRATEGY = core.DEFAULT_STRATEGY FILTERED = core.FILTERED HUFFMAN_ONLY = core.HUFFMAN_ONLY RLE = core.RLE FIXED = core.FIXED # -------------------------------------------------------------------- # Registries ID = [] OPEN = {} MIME = {} SAVE = {} EXTENSION = {} # -------------------------------------------------------------------- # Modes supported by this version _MODEINFO = { # NOTE: this table will be removed in future versions. use # getmode* functions or ImageMode descriptors instead. # official modes "1": ("L", "L", ("1",)), "L": ("L", "L", ("L",)), "I": ("L", "I", ("I",)), "F": ("L", "F", ("F",)), "P": ("RGB", "L", ("P",)), "RGB": ("RGB", "L", ("R", "G", "B")), "RGBX": ("RGB", "L", ("R", "G", "B", "X")), "RGBA": ("RGB", "L", ("R", "G", "B", "A")), "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), "LAB": ("RGB", "L", ("L", "A", "B")), # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and # BGR;24. Use these modes only if you know exactly what you're # doing... } if sys.byteorder == 'little': _ENDIAN = '<' else: _ENDIAN = '>' _MODE_CONV = { # official modes "1": ('|b1', None), # broken "L": ('|u1', None), "I": (_ENDIAN + 'i4', None), "F": (_ENDIAN + 'f4', None), "P": ('|u1', None), "RGB": ('|u1', 3), "RGBX": ('|u1', 4), "RGBA": ('|u1', 4), "CMYK": ('|u1', 4), "YCbCr": ('|u1', 3), "LAB": ('|u1', 3), # UNDONE - unsigned |u1i1i1 # I;16 == I;16L, and I;32 == I;32L "I;16": ('u2', None), "I;16L": ('i2', None), "I;16LS": ('u4', None), "I;32L": ('i4', None), "I;32LS": ('= 1: return try: from PIL import BmpImagePlugin except ImportError: pass try: from PIL import GifImagePlugin except ImportError: pass try: from PIL import JpegImagePlugin except ImportError: pass try: from PIL import PpmImagePlugin except ImportError: pass try: from PIL import PngImagePlugin except ImportError: pass # try: # import TiffImagePlugin # except ImportError: # pass _initialized = 1 def init(): """ Explicitly initializes the Python Imaging Library. This function loads all available file format drivers. """ global _initialized if _initialized >= 2: return 0 for plugin in _plugins: try: if DEBUG: print ("Importing %s"%plugin) __import__("PIL.%s"%plugin, globals(), locals(), []) except ImportError: if DEBUG: print("Image: failed to import", end=' ') print(plugin, ":", sys.exc_info()[1]) if OPEN or SAVE: _initialized = 2 return 1 # -------------------------------------------------------------------- # Codec factories (used by tobytes/frombytes and ImageFile.load) def _getdecoder(mode, decoder_name, args, extra=()): # tweak arguments if args is None: args = () elif not isinstance(args, tuple): args = (args,) try: # get decoder decoder = getattr(core, decoder_name + "_decoder") # print(decoder, mode, args + extra) return decoder(mode, *args + extra) except AttributeError: raise IOError("decoder %s not available" % decoder_name) def _getencoder(mode, encoder_name, args, extra=()): # tweak arguments if args is None: args = () elif not isinstance(args, tuple): args = (args,) try: # get encoder encoder = getattr(core, encoder_name + "_encoder") # print(encoder, mode, args + extra) return encoder(mode, *args + extra) except AttributeError: raise IOError("encoder %s not available" % encoder_name) # -------------------------------------------------------------------- # Simple expression analyzer def coerce_e(value): return value if isinstance(value, _E) else _E(value) class _E: def __init__(self, data): self.data = data def __add__(self, other): return _E((self.data, "__add__", coerce_e(other).data)) def __mul__(self, other): return _E((self.data, "__mul__", coerce_e(other).data)) def _getscaleoffset(expr): stub = ["stub"] data = expr(_E(stub)).data try: (a, b, c) = data # simplified syntax if (a is stub and b == "__mul__" and isinstance(c, numbers.Number)): return c, 0.0 if (a is stub and b == "__add__" and isinstance(c, numbers.Number)): return 1.0, c except TypeError: pass try: ((a, b, c), d, e) = data # full syntax if (a is stub and b == "__mul__" and isinstance(c, numbers.Number) and d == "__add__" and isinstance(e, numbers.Number)): return c, e except TypeError: pass raise ValueError("illegal expression") # -------------------------------------------------------------------- # Implementation wrapper class Image: """ This class represents an image object. To create :py:class:`~PIL.Image.Image` objects, use the appropriate factory functions. There's hardly ever any reason to call the Image constructor directly. * :py:func:`~PIL.Image.open` * :py:func:`~PIL.Image.new` * :py:func:`~PIL.Image.frombytes` """ format = None format_description = None def __init__(self): # FIXME: take "new" parameters / other image? # FIXME: turn mode and size into delegating properties? self.im = None self.mode = "" self.size = (0, 0) self.palette = None self.info = {} self.category = NORMAL self.readonly = 0 def _new(self, im): new = Image() new.im = im new.mode = im.mode new.size = im.size new.palette = self.palette if im.mode == "P" and not new.palette: from PIL import ImagePalette new.palette = ImagePalette.ImagePalette() try: new.info = self.info.copy() except AttributeError: # fallback (pre-1.5.2) new.info = {} for k, v in self.info: new.info[k] = v return new _makeself = _new # compatibility def _copy(self): self.load() self.im = self.im.copy() self.readonly = 0 def _dump(self, file=None, format=None): import tempfile if not file: file = tempfile.mktemp() self.load() if not format or format == "PPM": self.im.save_ppm(file) else: file = file + "." + format self.save(file, format) return file def __repr__(self): return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( self.__class__.__module__, self.__class__.__name__, self.mode, self.size[0], self.size[1], id(self) ) def __getattr__(self, name): if name == "__array_interface__": # numpy array interface support new = {} shape, typestr = _conv_type_shape(self) new['shape'] = shape new['typestr'] = typestr new['data'] = self.tobytes() return new raise AttributeError(name) def tobytes(self, encoder_name="raw", *args): """ Return image as a bytes object :param encoder_name: What encoder to use. The default is to use the standard "raw" encoder. :param args: Extra arguments to the encoder. :rtype: A bytes object. """ # may pass tuple instead of argument list if len(args) == 1 and isinstance(args[0], tuple): args = args[0] if encoder_name == "raw" and args == (): args = self.mode self.load() # unpack data e = _getencoder(self.mode, encoder_name, args) e.setimage(self.im) bufsize = max(65536, self.size[0] * 4) # see RawEncode.c data = [] while True: l, s, d = e.encode(bufsize) data.append(d) if s: break if s < 0: raise RuntimeError("encoder error %d in tobytes" % s) return b"".join(data) # Declare tostring as alias to tobytes def tostring(self, *args, **kw): warnings.warn( 'tostring() is deprecated. Please call tobytes() instead.', DeprecationWarning, stacklevel=2, ) return self.tobytes(*args, **kw) def tobitmap(self, name="image"): """ Returns the image converted to an X11 bitmap. .. note:: This method only works for mode "1" images. :param name: The name prefix to use for the bitmap variables. :returns: A string containing an X11 bitmap. :raises ValueError: If the mode is not "1" """ self.load() if self.mode != "1": raise ValueError("not a bitmap") data = self.tobytes("xbm") return b"".join([("#define %s_width %d\n" % (name, self.size[0])).encode('ascii'), ("#define %s_height %d\n"% (name, self.size[1])).encode('ascii'), ("static char %s_bits[] = {\n" % name).encode('ascii'), data, b"};"]) def frombytes(self, data, decoder_name="raw", *args): """ Loads this image with pixel data from a bytes object. This method is similar to the :py:func:`~PIL.Image.frombytes` function, but loads data into this image instead of creating a new image object. """ # may pass tuple instead of argument list if len(args) == 1 and isinstance(args[0], tuple): args = args[0] # default format if decoder_name == "raw" and args == (): args = self.mode # unpack data d = _getdecoder(self.mode, decoder_name, args) d.setimage(self.im) s = d.decode(data) if s[0] >= 0: raise ValueError("not enough image data") if s[1] != 0: raise ValueError("cannot decode image data") def fromstring(self, *args, **kw): """Deprecated alias to frombytes. .. deprecated:: 2.0 """ warnings.warn('fromstring() is deprecated. Please call frombytes() instead.', DeprecationWarning) return self.frombytes(*args, **kw) def load(self): """ Allocates storage for the image and loads the pixel data. In normal cases, you don't need to call this method, since the Image class automatically loads an opened image when it is accessed for the first time. :returns: An image access object. """ if self.im and self.palette and self.palette.dirty: # realize palette self.im.putpalette(*self.palette.getdata()) self.palette.dirty = 0 self.palette.mode = "RGB" self.palette.rawmode = None if "transparency" in self.info: if isinstance(self.info["transparency"], int): self.im.putpalettealpha(self.info["transparency"], 0) else: self.im.putpalettealphas(self.info["transparency"]) self.palette.mode = "RGBA" if self.im: return self.im.pixel_access(self.readonly) def verify(self): """ Verifies the contents of a file. For data read from a file, this method attempts to determine if the file is broken, without actually decoding the image data. If this method finds any problems, it raises suitable exceptions. If you need to load the image after using this method, you must reopen the image file. """ pass def convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): """ Returns a converted copy of this image. For the "P" mode, this method translates pixels through the palette. If mode is omitted, a mode is chosen so that all information in the image and the palette can be represented without a palette. The current version supports all possible conversions between "L", "RGB" and "CMYK." The **matrix** argument only supports "L" and "RGB". When translating a color image to black and white (mode "L"), the library uses the ITU-R 601-2 luma transform:: L = R * 299/1000 + G * 587/1000 + B * 114/1000 The default method of converting a greyscale ("L") or "RGB" image into a bilevel (mode "1") image uses Floyd-Steinberg dither to approximate the original image luminosity levels. If dither is NONE, all non-zero values are set to 255 (white). To use other thresholds, use the :py:meth:`~PIL.Image.Image.point` method. :param mode: The requested mode. :param matrix: An optional conversion matrix. If given, this should be 4- or 16-tuple containing floating point values. :param dither: Dithering method, used when converting from mode "RGB" to "P" or from "RGB" or "L" to "1". Available methods are NONE or FLOYDSTEINBERG (default). :param palette: Palette to use when converting from mode "RGB" to "P". Available palettes are WEB or ADAPTIVE. :param colors: Number of colors to use for the ADAPTIVE palette. Defaults to 256. :rtype: :py:class:`~PIL.Image.Image` :returns: An :py:class:`~PIL.Image.Image` object. """ if not mode: # determine default mode if self.mode == "P": self.load() if self.palette: mode = self.palette.mode else: mode = "RGB" else: return self.copy() self.load() if matrix: # matrix conversion if mode not in ("L", "RGB"): raise ValueError("illegal conversion") im = self.im.convert_matrix(mode, matrix) return self._new(im) if mode == "P" and palette == ADAPTIVE: im = self.im.quantize(colors) return self._new(im) # colorspace conversion if dither is None: dither = FLOYDSTEINBERG # Use transparent conversion to promote from transparent color to an alpha channel. if self.mode in ("L", "RGB") and mode == "RGBA" and "transparency" in self.info: return self._new(self.im.convert_transparent(mode, self.info['transparency'])) try: im = self.im.convert(mode, dither) except ValueError: try: # normalize source image and try again im = self.im.convert(getmodebase(self.mode)) im = im.convert(mode, dither) except KeyError: raise ValueError("illegal conversion") return self._new(im) def quantize(self, colors=256, method=0, kmeans=0, palette=None): # methods: # 0 = median cut # 1 = maximum coverage # 2 = fast octree # NOTE: this functionality will be moved to the extended # quantizer interface in a later version of PIL. self.load() if palette: # use palette from reference image palette.load() if palette.mode != "P": raise ValueError("bad mode for palette image") if self.mode != "RGB" and self.mode != "L": raise ValueError( "only RGB or L mode images can be quantized to a palette" ) im = self.im.convert("P", 1, palette.im) return self._makeself(im) im = self.im.quantize(colors, method, kmeans) return self._new(im) def copy(self): """ Copies this image. Use this method if you wish to paste things into an image, but still retain the original. :rtype: :py:class:`~PIL.Image.Image` :returns: An :py:class:`~PIL.Image.Image` object. """ self.load() im = self.im.copy() return self._new(im) def crop(self, box=None): """ Returns a rectangular region from this image. The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate. This is a lazy operation. Changes to the source image may or may not be reflected in the cropped image. To break the connection, call the :py:meth:`~PIL.Image.Image.load` method on the cropped copy. :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. :rtype: :py:class:`~PIL.Image.Image` :returns: An :py:class:`~PIL.Image.Image` object. """ self.load() if box is None: return self.copy() # lazy operation return _ImageCrop(self, box) def draft(self, mode, size): """ Configures the image file loader so it returns a version of the image that as closely as possible matches the given mode and size. For example, you can use this method to convert a color JPEG to greyscale while loading it, or to extract a 128x192 version from a PCD file. Note that this method modifies the :py:class:`~PIL.Image.Image` object in place. If the image has already been loaded, this method has no effect. :param mode: The requested mode. :param size: The requested size. """ pass def _expand(self, xmargin, ymargin=None): if ymargin is None: ymargin = xmargin self.load() return self._new(self.im.expand(xmargin, ymargin, 0)) def filter(self, filter): """ Filters this image using the given filter. For a list of available filters, see the :py:mod:`~PIL.ImageFilter` module. :param filter: Filter kernel. :returns: An :py:class:`~PIL.Image.Image` object. """ self.load() if isinstance(filter, collections.Callable): filter = filter() if not hasattr(filter, "filter"): raise TypeError("filter argument should be ImageFilter.Filter instance or class") if self.im.bands == 1: return self._new(filter.filter(self.im)) # fix to handle multiband images since _imaging doesn't ims = [] for c in range(self.im.bands): ims.append(self._new(filter.filter(self.im.getband(c)))) return merge(self.mode, ims) def getbands(self): """ Returns a tuple containing the name of each band in this image. For example, **getbands** on an RGB image returns ("R", "G", "B"). :returns: A tuple containing band names. :rtype: tuple """ return ImageMode.getmode(self.mode).bands def getbbox(self): """ Calculates the bounding box of the non-zero regions in the image. :returns: The bounding box is returned as a 4-tuple defining the left, upper, right, and lower pixel coordinate. If the image is completely empty, this method returns None. """ self.load() return self.im.getbbox() def getcolors(self, maxcolors=256): """ Returns a list of colors used in this image. :param maxcolors: Maximum number of colors. If this number is exceeded, this method returns None. The default limit is 256 colors. :returns: An unsorted list of (count, pixel) values. """ self.load() if self.mode in ("1", "L", "P"): h = self.im.histogram() out = [] for i in range(256): if h[i]: out.append((h[i], i)) if len(out) > maxcolors: return None return out return self.im.getcolors(maxcolors) def getdata(self, band = None): """ Returns the contents of this image as a sequence object containing pixel values. The sequence object is flattened, so that values for line one follow directly after the values of line zero, and so on. Note that the sequence object returned by this method is an internal PIL data type, which only supports certain sequence operations. To convert it to an ordinary sequence (e.g. for printing), use **list(im.getdata())**. :param band: What band to return. The default is to return all bands. To return a single band, pass in the index value (e.g. 0 to get the "R" band from an "RGB" image). :returns: A sequence-like object. """ self.load() if band is not None: return self.im.getband(band) return self.im # could be abused def getextrema(self): """ Gets the the minimum and maximum pixel values for each band in the image. :returns: For a single-band image, a 2-tuple containing the minimum and maximum pixel value. For a multi-band image, a tuple containing one 2-tuple for each band. """ self.load() if self.im.bands > 1: extrema = [] for i in range(self.im.bands): extrema.append(self.im.getband(i).getextrema()) return tuple(extrema) return self.im.getextrema() def getim(self): """ Returns a capsule that points to the internal image memory. :returns: A capsule object. """ self.load() return self.im.ptr def getpalette(self): """ Returns the image palette as a list. :returns: A list of color values [r, g, b, ...], or None if the image has no palette. """ self.load() try: if bytes is str: return [i8(c) for c in self.im.getpalette()] else: return list(self.im.getpalette()) except ValueError: return None # no palette def getpixel(self, xy): """ Returns the pixel value at a given position. :param xy: The coordinate, given as (x, y). :returns: The pixel value. If the image is a multi-layer image, this method returns a tuple. """ self.load() return self.im.getpixel(xy) def getprojection(self): """ Get projection to x and y axes :returns: Two sequences, indicating where there are non-zero pixels along the X-axis and the Y-axis, respectively. """ self.load() x, y = self.im.getprojection() return [i8(c) for c in x], [i8(c) for c in y] def histogram(self, mask=None, extrema=None): """ Returns a histogram for the image. The histogram is returned as a list of pixel counts, one for each pixel value in the source image. If the image has more than one band, the histograms for all bands are concatenated (for example, the histogram for an "RGB" image contains 768 values). A bilevel image (mode "1") is treated as a greyscale ("L") image by this method. If a mask is provided, the method returns a histogram for those parts of the image where the mask image is non-zero. The mask image must have the same size as the image, and be either a bi-level image (mode "1") or a greyscale image ("L"). :param mask: An optional mask. :returns: A list containing pixel counts. """ self.load() if mask: mask.load() return self.im.histogram((0, 0), mask.im) if self.mode in ("I", "F"): if extrema is None: extrema = self.getextrema() return self.im.histogram(extrema) return self.im.histogram() def offset(self, xoffset, yoffset=None): """ .. deprecated:: 2.0 .. note:: New code should use :py:func:`PIL.ImageChops.offset`. Returns a copy of the image where the data has been offset by the given distances. Data wraps around the edges. If **yoffset** is omitted, it is assumed to be equal to **xoffset**. :param xoffset: The horizontal distance. :param yoffset: The vertical distance. If omitted, both distances are set to the same value. :returns: An :py:class:`~PIL.Image.Image` object. """ if warnings: warnings.warn( "'offset' is deprecated; use 'ImageChops.offset' instead", DeprecationWarning, stacklevel=2 ) from PIL import ImageChops return ImageChops.offset(self, xoffset, yoffset) def paste(self, im, box=None, mask=None): """ Pastes another image into this image. The box argument is either a 2-tuple giving the upper left corner, a 4-tuple defining the left, upper, right, and lower pixel coordinate, or None (same as (0, 0)). If a 4-tuple is given, the size of the pasted image must match the size of the region. If the modes don't match, the pasted image is converted to the mode of this image (see the :py:meth:`~PIL.Image.Image.convert` method for details). Instead of an image, the source can be a integer or tuple containing pixel values. The method then fills the region with the given color. When creating RGB images, you can also use color strings as supported by the ImageColor module. If a mask is given, this method updates only the regions indicated by the mask. You can use either "1", "L" or "RGBA" images (in the latter case, the alpha band is used as mask). Where the mask is 255, the given image is copied as is. Where the mask is 0, the current value is preserved. Intermediate values can be used for transparency effects. Note that if you paste an "RGBA" image, the alpha band is ignored. You can work around this by using the same image as both source image and mask. :param im: Source image or pixel value (integer or tuple). :param box: An optional 4-tuple giving the region to paste into. If a 2-tuple is used instead, it's treated as the upper left corner. If omitted or None, the source is pasted into the upper left corner. If an image is given as the second argument and there is no third, the box defaults to (0, 0), and the second argument is interpreted as a mask image. :param mask: An optional mask image. :returns: An :py:class:`~PIL.Image.Image` object. """ if isImageType(box) and mask is None: # abbreviated paste(im, mask) syntax mask = box; box = None if box is None: # cover all of self box = (0, 0) + self.size if len(box) == 2: # lower left corner given; get size from image or mask if isImageType(im): size = im.size elif isImageType(mask): size = mask.size else: # FIXME: use self.size here? raise ValueError( "cannot determine region size; use 4-item box" ) box = box + (box[0]+size[0], box[1]+size[1]) if isStringType(im): from PIL import ImageColor im = ImageColor.getcolor(im, self.mode) elif isImageType(im): im.load() if self.mode != im.mode: if self.mode != "RGB" or im.mode not in ("RGBA", "RGBa"): # should use an adapter for this! im = im.convert(self.mode) im = im.im self.load() if self.readonly: self._copy() if mask: mask.load() self.im.paste(im, box, mask.im) else: self.im.paste(im, box) def point(self, lut, mode=None): """ Maps this image through a lookup table or function. :param lut: A lookup table, containing 256 (or 65336 if self.mode=="I" and mode == "L") values per band in the image. A function can be used instead, it should take a single argument. The function is called once for each possible pixel value, and the resulting table is applied to all bands of the image. :param mode: Output mode (default is same as input). In the current version, this can only be used if the source image has mode "L" or "P", and the output has mode "1" or the source image mode is "I" and the output mode is "L". :returns: An :py:class:`~PIL.Image.Image` object. """ self.load() if isinstance(lut, ImagePointHandler): return lut.point(self) if callable(lut): # if it isn't a list, it should be a function if self.mode in ("I", "I;16", "F"): # check if the function can be used with point_transform # UNDONE wiredfool -- I think this prevents us from ever doing # a gamma function point transform on > 8bit images. scale, offset = _getscaleoffset(lut) return self._new(self.im.point_transform(scale, offset)) # for other modes, convert the function to a table lut = [lut(i) for i in range(256)] * self.im.bands if self.mode == "F": # FIXME: _imaging returns a confusing error message for this case raise ValueError("point operation not supported for this mode") return self._new(self.im.point(lut, mode)) def putalpha(self, alpha): """ Adds or replaces the alpha layer in this image. If the image does not have an alpha layer, it's converted to "LA" or "RGBA". The new layer must be either "L" or "1". :param alpha: The new alpha layer. This can either be an "L" or "1" image having the same size as this image, or an integer or other color value. """ self.load() if self.readonly: self._copy() if self.mode not in ("LA", "RGBA"): # attempt to promote self to a matching alpha mode try: mode = getmodebase(self.mode) + "A" try: self.im.setmode(mode) except (AttributeError, ValueError): # do things the hard way im = self.im.convert(mode) if im.mode not in ("LA", "RGBA"): raise ValueError # sanity check self.im = im self.mode = self.im.mode except (KeyError, ValueError): raise ValueError("illegal image mode") if self.mode == "LA": band = 1 else: band = 3 if isImageType(alpha): # alpha layer if alpha.mode not in ("1", "L"): raise ValueError("illegal image mode") alpha.load() if alpha.mode == "1": alpha = alpha.convert("L") else: # constant alpha try: self.im.fillband(band, alpha) except (AttributeError, ValueError): # do things the hard way alpha = new("L", self.size, alpha) else: return self.im.putband(alpha.im, band) def putdata(self, data, scale=1.0, offset=0.0): """ Copies pixel data to this image. This method copies data from a sequence object into the image, starting at the upper left corner (0, 0), and continuing until either the image or the sequence ends. The scale and offset values are used to adjust the sequence values: **pixel = value*scale + offset**. :param data: A sequence object. :param scale: An optional scale value. The default is 1.0. :param offset: An optional offset value. The default is 0.0. """ self.load() if self.readonly: self._copy() self.im.putdata(data, scale, offset) def putpalette(self, data, rawmode="RGB"): """ Attaches a palette to this image. The image must be a "P" or "L" image, and the palette sequence must contain 768 integer values, where each group of three values represent the red, green, and blue values for the corresponding pixel index. Instead of an integer sequence, you can use an 8-bit string. :param data: A palette sequence (either a list or a string). """ from PIL import ImagePalette if self.mode not in ("L", "P"): raise ValueError("illegal image mode") self.load() if isinstance(data, ImagePalette.ImagePalette): palette = ImagePalette.raw(data.rawmode, data.palette) else: if not isinstance(data, bytes): if bytes is str: data = "".join(chr(x) for x in data) else: data = bytes(data) palette = ImagePalette.raw(rawmode, data) self.mode = "P" self.palette = palette self.palette.mode = "RGB" self.load() # install new palette def putpixel(self, xy, value): """ Modifies the pixel at the given position. The color is given as a single numerical value for single-band images, and a tuple for multi-band images. Note that this method is relatively slow. For more extensive changes, use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` module instead. See: * :py:meth:`~PIL.Image.Image.paste` * :py:meth:`~PIL.Image.Image.putdata` * :py:mod:`~PIL.ImageDraw` :param xy: The pixel coordinate, given as (x, y). :param value: The pixel value. """ self.load() if self.readonly: self._copy() return self.im.putpixel(xy, value) def resize(self, size, resample=NEAREST): """ Returns a resized copy of this image. :param size: The requested size in pixels, as a 2-tuple: (width, height). :param filter: An optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 environment), :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation in a 4x4 environment), or :py:attr:`PIL.Image.ANTIALIAS` (a high-quality downsampling filter). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. :returns: An :py:class:`~PIL.Image.Image` object. """ if resample not in (NEAREST, BILINEAR, BICUBIC, ANTIALIAS): raise ValueError("unknown resampling filter") self.load() if self.mode in ("1", "P"): resample = NEAREST if self.mode == 'RGBA': return self.convert('RGBa').resize(size, resample).convert('RGBA') if resample == ANTIALIAS: # requires stretch support (imToolkit & PIL 1.1.3) try: im = self.im.stretch(size, resample) except AttributeError: raise ValueError("unsupported resampling filter") else: im = self.im.resize(size, resample) return self._new(im) def rotate(self, angle, resample=NEAREST, expand=0): """ Returns a rotated copy of this image. This method returns a copy of this image, rotated the given number of degrees counter clockwise around its centre. :param angle: In degrees counter clockwise. :param filter: An optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set :py:attr:`PIL.Image.NEAREST`. :param expand: Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image. If false or omitted, make the output image the same size as the input image. :returns: An :py:class:`~PIL.Image.Image` object. """ if expand: import math angle = -angle * math.pi / 180 matrix = [ math.cos(angle), math.sin(angle), 0.0, -math.sin(angle), math.cos(angle), 0.0 ] def transform(x, y, matrix=matrix): (a, b, c, d, e, f) = matrix return a*x + b*y + c, d*x + e*y + f # calculate output size w, h = self.size xx = [] yy = [] for x, y in ((0, 0), (w, 0), (w, h), (0, h)): x, y = transform(x, y) xx.append(x) yy.append(y) w = int(math.ceil(max(xx)) - math.floor(min(xx))) h = int(math.ceil(max(yy)) - math.floor(min(yy))) # adjust center x, y = transform(w / 2.0, h / 2.0) matrix[2] = self.size[0] / 2.0 - x matrix[5] = self.size[1] / 2.0 - y return self.transform((w, h), AFFINE, matrix, resample) if resample not in (NEAREST, BILINEAR, BICUBIC): raise ValueError("unknown resampling filter") self.load() if self.mode in ("1", "P"): resample = NEAREST return self._new(self.im.rotate(angle, resample)) def save(self, fp, format=None, **params): """ Saves this image under the given filename. If no format is specified, the format to use is determined from the filename extension, if possible. Keyword options can be used to provide additional instructions to the writer. If a writer doesn't recognise an option, it is silently ignored. The available options are described later in this handbook. You can use a file object instead of a filename. In this case, you must always specify the format. The file object must implement the **seek**, **tell**, and **write** methods, and be opened in binary mode. :param file: File name or file object. :param format: Optional format override. If omitted, the format to use is determined from the filename extension. If a file object was used instead of a filename, this parameter should always be used. :param options: Extra parameters to the image writer. :returns: None :exception KeyError: If the output format could not be determined from the file name. Use the format option to solve this. :exception IOError: If the file could not be written. The file may have been created, and may contain partial data. """ if isPath(fp): filename = fp else: if hasattr(fp, "name") and isPath(fp.name): filename = fp.name else: filename = "" # may mutate self! self.load() self.encoderinfo = params self.encoderconfig = () preinit() ext = os.path.splitext(filename)[1].lower() if not format: try: format = EXTENSION[ext] except KeyError: init() try: format = EXTENSION[ext] except KeyError: raise KeyError(ext) # unknown extension try: save_handler = SAVE[format.upper()] except KeyError: init() save_handler = SAVE[format.upper()] # unknown format if isPath(fp): fp = builtins.open(fp, "wb") close = 1 else: close = 0 try: save_handler(self, fp, filename) finally: # do what we can to clean up if close: fp.close() def seek(self, frame): """ Seeks to the given frame in this sequence file. If you seek beyond the end of the sequence, the method raises an **EOFError** exception. When a sequence file is opened, the library automatically seeks to frame 0. Note that in the current version of the library, most sequence formats only allows you to seek to the next frame. See :py:meth:`~PIL.Image.Image.tell`. :param frame: Frame number, starting at 0. :exception EOFError: If the call attempts to seek beyond the end of the sequence. """ # overridden by file handlers if frame != 0: raise EOFError def show(self, title=None, command=None): """ Displays this image. This method is mainly intended for debugging purposes. On Unix platforms, this method saves the image to a temporary PPM file, and calls the **xv** utility. On Windows, it saves the image to a temporary BMP file, and uses the standard BMP display utility to show it (usually Paint). :param title: Optional title to use for the image window, where possible. :param command: command used to show the image """ _show(self, title=title, command=command) def split(self): """ Split this image into individual bands. This method returns a tuple of individual image bands from an image. For example, splitting an "RGB" image creates three new images each containing a copy of one of the original bands (red, green, blue). :returns: A tuple containing bands. """ self.load() if self.im.bands == 1: ims = [self.copy()] else: ims = [] for i in range(self.im.bands): ims.append(self._new(self.im.getband(i))) return tuple(ims) def tell(self): """ Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. :returns: Frame number, starting with 0. """ return 0 def thumbnail(self, size, resample=NEAREST): """ Make this image into a thumbnail. This method modifies the image to contain a thumbnail version of itself, no larger than the given size. This method calculates an appropriate thumbnail size to preserve the aspect of the image, calls the :py:meth:`~PIL.Image.Image.draft` method to configure the file reader (where applicable), and finally resizes the image. Note that the bilinear and bicubic filters in the current version of PIL are not well-suited for thumbnail generation. You should use :py:attr:`PIL.Image.ANTIALIAS` unless speed is much more important than quality. Also note that this function modifies the :py:class:`~PIL.Image.Image` object in place. If you need to use the full resolution image as well, apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original image. :param size: Requested size. :param resample: Optional resampling filter. This can be one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.ANTIALIAS` (best quality). If omitted, it defaults to :py:attr:`PIL.Image.NEAREST` (this will be changed to ANTIALIAS in a future version). :returns: None """ # FIXME: the default resampling filter will be changed # to ANTIALIAS in future versions # preserve aspect ratio x, y = self.size if x > size[0]: y = int(max(y * size[0] / x, 1)); x = int(size[0]) if y > size[1]: x = int(max(x * size[1] / y, 1)); y = int(size[1]) size = x, y if size == self.size: return self.draft(None, size) self.load() try: im = self.resize(size, resample) except ValueError: if resample != ANTIALIAS: raise im = self.resize(size, NEAREST) # fallback self.im = im.im self.mode = im.mode self.size = size self.readonly = 0 # FIXME: the different tranform methods need further explanation # instead of bloating the method docs, add a separate chapter. def transform(self, size, method, data=None, resample=NEAREST, fill=1): """ Transforms this image. This method creates a new image with the given size, and the same mode as the original, and copies data to the new image using the given transform. :param size: The output size. :param method: The transformation method. This is one of :py:attr:`PIL.Image.EXTENT` (cut out a rectangular subregion), :py:attr:`PIL.Image.AFFINE` (affine transform), :py:attr:`PIL.Image.PERSPECTIVE` (perspective transform), :py:attr:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or :py:attr:`PIL.Image.MESH` (map a number of source quadrilaterals in one operation). :param data: Extra data to the transformation method. :param resample: Optional resampling filter. It can be one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set to :py:attr:`PIL.Image.NEAREST`. :returns: An :py:class:`~PIL.Image.Image` object. """ if self.mode == 'RGBA': return self.convert('RGBa').transform(size, method, data, resample, fill).convert('RGBA') if isinstance(method, ImageTransformHandler): return method.transform(size, self, resample=resample, fill=fill) if hasattr(method, "getdata"): # compatibility w. old-style transform objects method, data = method.getdata() if data is None: raise ValueError("missing method data") im = new(self.mode, size, None) if method == MESH: # list of quads for box, quad in data: im.__transformer(box, self, QUAD, quad, resample, fill) else: im.__transformer((0, 0)+size, self, method, data, resample, fill) return im def __transformer(self, box, image, method, data, resample=NEAREST, fill=1): # FIXME: this should be turned into a lazy operation (?) w = box[2]-box[0] h = box[3]-box[1] if method == AFFINE: # change argument order to match implementation data = (data[2], data[0], data[1], data[5], data[3], data[4]) elif method == EXTENT: # convert extent to an affine transform x0, y0, x1, y1 = data xs = float(x1 - x0) / w ys = float(y1 - y0) / h method = AFFINE data = (x0 + xs/2, xs, 0, y0 + ys/2, 0, ys) elif method == PERSPECTIVE: # change argument order to match implementation data = (data[2], data[0], data[1], data[5], data[3], data[4], data[6], data[7]) elif method == QUAD: # quadrilateral warp. data specifies the four corners # given as NW, SW, SE, and NE. nw = data[0:2]; sw = data[2:4]; se = data[4:6]; ne = data[6:8] x0, y0 = nw; As = 1.0 / w; At = 1.0 / h data = (x0, (ne[0]-x0)*As, (sw[0]-x0)*At, (se[0]-sw[0]-ne[0]+x0)*As*At, y0, (ne[1]-y0)*As, (sw[1]-y0)*At, (se[1]-sw[1]-ne[1]+y0)*As*At) else: raise ValueError("unknown transformation method") if resample not in (NEAREST, BILINEAR, BICUBIC): raise ValueError("unknown resampling filter") image.load() self.load() if image.mode in ("1", "P"): resample = NEAREST self.im.transform2(box, image.im, method, data, resample, fill) def transpose(self, method): """ Transpose image (flip or rotate in 90 degree steps) :param method: One of :py:attr:`PIL.Image.FLIP_LEFT_RIGHT`, :py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`, :py:attr:`PIL.Image.ROTATE_180`, or :py:attr:`PIL.Image.ROTATE_270`. :returns: Returns a flipped or rotated copy of this image. """ self.load() im = self.im.transpose(method) return self._new(im) # -------------------------------------------------------------------- # Lazy operations class _ImageCrop(Image): def __init__(self, im, box): Image.__init__(self) x0, y0, x1, y1 = box if x1 < x0: x1 = x0 if y1 < y0: y1 = y0 self.mode = im.mode self.size = x1-x0, y1-y0 self.__crop = x0, y0, x1, y1 self.im = im.im def load(self): # lazy evaluation! if self.__crop: self.im = self.im.crop(self.__crop) self.__crop = None if self.im: return self.im.pixel_access(self.readonly) # FIXME: future versions should optimize crop/paste # sequences! # -------------------------------------------------------------------- # Abstract handlers. class ImagePointHandler: # used as a mixin by point transforms (for use with im.point) pass class ImageTransformHandler: # used as a mixin by geometry transforms (for use with im.transform) pass # -------------------------------------------------------------------- # Factories # # Debugging def _wedge(): "Create greyscale wedge (for debugging only)" return Image()._new(core.wedge("L")) def new(mode, size, color=0): """ Creates a new image with the given mode and size. :param mode: The mode to use for the new image. :param size: A 2-tuple, containing (width, height) in pixels. :param color: What color to use for the image. Default is black. If given, this should be a single integer or floating point value for single-band modes, and a tuple for multi-band modes (one value per band). When creating RGB images, you can also use color strings as supported by the ImageColor module. If the color is None, the image is not initialised. :returns: An :py:class:`~PIL.Image.Image` object. """ if color is None: # don't initialize return Image()._new(core.new(mode, size)) if isStringType(color): # css3-style specifier from PIL import ImageColor color = ImageColor.getcolor(color, mode) return Image()._new(core.fill(mode, size, color)) def frombytes(mode, size, data, decoder_name="raw", *args): """ Creates a copy of an image memory from pixel data in a buffer. In its simplest form, this function takes three arguments (mode, size, and unpacked pixel data). You can also use any pixel decoder supported by PIL. For more information on available decoders, see the section **Writing Your Own File Decoder**. Note that this function decodes pixel data only, not entire images. If you have an entire image in a string, wrap it in a :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. :param mode: The image mode. :param size: The image size. :param data: A byte buffer containing raw data for the given mode. :param decoder_name: What decoder to use. :param args: Additional parameters for the given decoder. :returns: An :py:class:`~PIL.Image.Image` object. """ # may pass tuple instead of argument list if len(args) == 1 and isinstance(args[0], tuple): args = args[0] if decoder_name == "raw" and args == (): args = mode im = new(mode, size) im.frombytes(data, decoder_name, args) return im def fromstring(*args, **kw): """Deprecated alias to frombytes. .. deprecated:: 2.0 """ warnings.warn( 'fromstring() is deprecated. Please call frombytes() instead.', DeprecationWarning, stacklevel=2 ) return frombytes(*args, **kw) def frombuffer(mode, size, data, decoder_name="raw", *args): """ Creates an image memory referencing pixel data in a byte buffer. This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data in the byte buffer, where possible. This means that changes to the original buffer object are reflected in this image). Not all modes can share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". Note that this function decodes pixel data only, not entire images. If you have an entire image file in a string, wrap it in a **BytesIO** object, and use :py:func:`~PIL.Image.open` to load it. In the current version, the default parameters used for the "raw" decoder differs from that used for :py:func:`~PIL.Image.fromstring`. This is a bug, and will probably be fixed in a future release. The current release issues a warning if you do this; to disable the warning, you should provide the full set of parameters. See below for details. :param mode: The image mode. :param size: The image size. :param data: A bytes or other buffer object containing raw data for the given mode. :param decoder_name: What decoder to use. :param args: Additional parameters for the given decoder. For the default encoder ("raw"), it's recommended that you provide the full set of parameters:: frombuffer(mode, size, data, "raw", mode, 0, 1) :returns: An :py:class:`~PIL.Image.Image` object. .. versionadded:: 1.1.4 """ "Load image from bytes or buffer" # may pass tuple instead of argument list if len(args) == 1 and isinstance(args[0], tuple): args = args[0] if decoder_name == "raw": if args == (): if warnings: warnings.warn( "the frombuffer defaults may change in a future release; " "for portability, change the call to read:\n" " frombuffer(mode, size, data, 'raw', mode, 0, 1)", RuntimeWarning, stacklevel=2 ) args = mode, 0, -1 # may change to (mode, 0, 1) post-1.1.6 if args[0] in _MAPMODES: im = new(mode, (1,1)) im = im._new( core.map_buffer(data, size, decoder_name, None, 0, args) ) im.readonly = 1 return im return frombytes(mode, size, data, decoder_name, args) def fromarray(obj, mode=None): """ Creates an image memory from an object exporting the array interface (using the buffer protocol). If obj is not contiguous, then the tobytes method is called and :py:func:`~PIL.Image.frombuffer` is used. :param obj: Object with array interface :param mode: Mode to use (will be determined from type if None) :returns: An image memory. .. versionadded:: 1.1.6 """ arr = obj.__array_interface__ shape = arr['shape'] ndim = len(shape) try: strides = arr['strides'] except KeyError: strides = None if mode is None: try: typekey = (1, 1) + shape[2:], arr['typestr'] mode, rawmode = _fromarray_typemap[typekey] except KeyError: # print typekey raise TypeError("Cannot handle this data type") else: rawmode = mode if mode in ["1", "L", "I", "P", "F"]: ndmax = 2 elif mode == "RGB": ndmax = 3 else: ndmax = 4 if ndim > ndmax: raise ValueError("Too many dimensions.") size = shape[1], shape[0] if strides is not None: if hasattr(obj, 'tobytes'): obj = obj.tobytes() else: obj = obj.tostring() return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) _fromarray_typemap = { # (shape, typestr) => mode, rawmode # first two members of shape are set to one # ((1, 1), "|b1"): ("1", "1"), # broken ((1, 1), "|u1"): ("L", "L"), ((1, 1), "|i1"): ("I", "I;8"), ((1, 1), "i2"): ("I", "I;16B"), ((1, 1), "i4"): ("I", "I;32B"), ((1, 1), "f4"): ("F", "F;32BF"), ((1, 1), "f8"): ("F", "F;64BF"), ((1, 1, 3), "|u1"): ("RGB", "RGB"), ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), } # shortcuts _fromarray_typemap[((1, 1), _ENDIAN + "i4")] = ("I", "I") _fromarray_typemap[((1, 1), _ENDIAN + "f4")] = ("F", "F") def open(fp, mode="r"): """ Opens and identifies the given image file. This is a lazy operation; this function identifies the file, but the actual image data is not read from the file until you try to process the data (or call the :py:meth:`~PIL.Image.Image.load` method). See :py:func:`~PIL.Image.new`. :param file: A filename (string) or a file object. The file object must implement :py:meth:`~file.read`, :py:meth:`~file.seek`, and :py:meth:`~file.tell` methods, and be opened in binary mode. :param mode: The mode. If given, this argument must be "r". :returns: An :py:class:`~PIL.Image.Image` object. :exception IOError: If the file cannot be found, or the image cannot be opened and identified. """ if mode != "r": raise ValueError("bad mode") if isPath(fp): filename = fp fp = builtins.open(fp, "rb") else: filename = "" prefix = fp.read(16) preinit() for i in ID: try: factory, accept = OPEN[i] if not accept or accept(prefix): fp.seek(0) return factory(fp, filename) except (SyntaxError, IndexError, TypeError): #import traceback #traceback.print_exc() pass if init(): for i in ID: try: factory, accept = OPEN[i] if not accept or accept(prefix): fp.seek(0) return factory(fp, filename) except (SyntaxError, IndexError, TypeError): #import traceback #traceback.print_exc() pass raise IOError("cannot identify image file") # # Image processing. def alpha_composite(im1, im2): """ Alpha composite im2 over im1. :param im1: The first image. :param im2: The second image. Must have the same mode and size as the first image. :returns: An :py:class:`~PIL.Image.Image` object. """ im1.load() im2.load() return im1._new(core.alpha_composite(im1.im, im2.im)) def blend(im1, im2, alpha): """ Creates a new image by interpolating between two input images, using a constant alpha.:: out = image1 * (1.0 - alpha) + image2 * alpha :param im1: The first image. :param im2: The second image. Must have the same mode and size as the first image. :param alpha: The interpolation alpha factor. If alpha is 0.0, a copy of the first image is returned. If alpha is 1.0, a copy of the second image is returned. There are no restrictions on the alpha value. If necessary, the result is clipped to fit into the allowed output range. :returns: An :py:class:`~PIL.Image.Image` object. """ im1.load() im2.load() return im1._new(core.blend(im1.im, im2.im, alpha)) def composite(image1, image2, mask): """ Create composite image by blending images using a transparency mask. :param image1: The first image. :param image2: The second image. Must have the same mode and size as the first image. :param mask: A mask image. This image can can have mode "1", "L", or "RGBA", and must have the same size as the other two images. """ image = image2.copy() image.paste(image1, None, mask) return image def eval(image, *args): """ Applies the function (which should take one argument) to each pixel in the given image. If the image has more than one band, the same function is applied to each band. Note that the function is evaluated once for each possible pixel value, so you cannot use random components or other generators. :param image: The input image. :param function: A function object, taking one integer argument. :returns: An :py:class:`~PIL.Image.Image` object. """ return image.point(args[0]) def merge(mode, bands): """ Merge a set of single band images into a new multiband image. :param mode: The mode to use for the output image. :param bands: A sequence containing one single-band image for each band in the output image. All bands must have the same size. :returns: An :py:class:`~PIL.Image.Image` object. """ if getmodebands(mode) != len(bands) or "*" in mode: raise ValueError("wrong number of bands") for im in bands[1:]: if im.mode != getmodetype(mode): raise ValueError("mode mismatch") if im.size != bands[0].size: raise ValueError("size mismatch") im = core.new(mode, bands[0].size) for i in range(getmodebands(mode)): bands[i].load() im.putband(bands[i].im, i) return bands[0]._new(im) # -------------------------------------------------------------------- # Plugin registry def register_open(id, factory, accept=None): """ Register an image file plugin. This function should not be used in application code. :param id: An image format identifier. :param factory: An image file factory method. :param accept: An optional function that can be used to quickly reject images having another format. """ id = id.upper() ID.append(id) OPEN[id] = factory, accept def register_mime(id, mimetype): """ Registers an image MIME type. This function should not be used in application code. :param id: An image format identifier. :param mimetype: The image MIME type for this format. """ MIME[id.upper()] = mimetype def register_save(id, driver): """ Registers an image save function. This function should not be used in application code. :param id: An image format identifier. :param driver: A function to save images in this format. """ SAVE[id.upper()] = driver def register_extension(id, extension): """ Registers an image extension. This function should not be used in application code. :param id: An image format identifier. :param extension: An extension used for this format. """ EXTENSION[extension.lower()] = id.upper() # -------------------------------------------------------------------- # Simple display support. User code may override this. def _show(image, **options): # override me, as necessary _showxv(image, **options) def _showxv(image, title=None, **options): from PIL import ImageShow ImageShow.show(image, title, **options) pillow-2.3.0/PIL/PcfFontFile.py0000644000175000001440000001403212257506326015042 0ustar dokousers# # THIS IS WORK IN PROGRESS # # The Python Imaging Library # $Id$ # # portable compiled font file parser # # history: # 1997-08-19 fl created # 2003-09-13 fl fixed loading of unicode fonts # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1997-2003 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from PIL import Image from PIL import FontFile from PIL import _binary # -------------------------------------------------------------------- # declarations PCF_MAGIC = 0x70636601 # "\x01fcp" PCF_PROPERTIES = (1<<0) PCF_ACCELERATORS = (1<<1) PCF_METRICS = (1<<2) PCF_BITMAPS = (1<<3) PCF_INK_METRICS = (1<<4) PCF_BDF_ENCODINGS = (1<<5) PCF_SWIDTHS = (1<<6) PCF_GLYPH_NAMES = (1<<7) PCF_BDF_ACCELERATORS = (1<<8) BYTES_PER_ROW = [ lambda bits: ((bits+7) >> 3), lambda bits: ((bits+15) >> 3) & ~1, lambda bits: ((bits+31) >> 3) & ~3, lambda bits: ((bits+63) >> 3) & ~7, ] i8 = _binary.i8 l16 = _binary.i16le l32 = _binary.i32le b16 = _binary.i16be b32 = _binary.i32be def sz(s, o): return s[o:s.index(b"\0", o)] ## # Font file plugin for the X11 PCF format. class PcfFontFile(FontFile.FontFile): name = "name" def __init__(self, fp): magic = l32(fp.read(4)) if magic != PCF_MAGIC: raise SyntaxError("not a PCF file") FontFile.FontFile.__init__(self) count = l32(fp.read(4)) self.toc = {} for i in range(count): type = l32(fp.read(4)) self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) self.fp = fp self.info = self._load_properties() metrics = self._load_metrics() bitmaps = self._load_bitmaps(metrics) encoding = self._load_encoding() # # create glyph structure for ch in range(256): ix = encoding[ch] if ix is not None: x, y, l, r, w, a, d, f = metrics[ix] glyph = (w, 0), (l, d-y, x+l, d), (0, 0, x, y), bitmaps[ix] self.glyph[ch] = glyph def _getformat(self, tag): format, size, offset = self.toc[tag] fp = self.fp fp.seek(offset) format = l32(fp.read(4)) if format & 4: i16, i32 = b16, b32 else: i16, i32 = l16, l32 return fp, format, i16, i32 def _load_properties(self): # # font properties properties = {} fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) nprops = i32(fp.read(4)) # read property description p = [] for i in range(nprops): p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) if nprops & 3: fp.seek(4 - (nprops & 3), 1) # pad data = fp.read(i32(fp.read(4))) for k, s, v in p: k = sz(data, k) if s: v = sz(data, v) properties[k] = v return properties def _load_metrics(self): # # font metrics metrics = [] fp, format, i16, i32 = self._getformat(PCF_METRICS) append = metrics.append if (format & 0xff00) == 0x100: # "compressed" metrics for i in range(i16(fp.read(2))): left = i8(fp.read(1)) - 128 right = i8(fp.read(1)) - 128 width = i8(fp.read(1)) - 128 ascent = i8(fp.read(1)) - 128 descent = i8(fp.read(1)) - 128 xsize = right - left ysize = ascent + descent append( (xsize, ysize, left, right, width, ascent, descent, 0) ) else: # "jumbo" metrics for i in range(i32(fp.read(4))): left = i16(fp.read(2)) right = i16(fp.read(2)) width = i16(fp.read(2)) ascent = i16(fp.read(2)) descent = i16(fp.read(2)) attributes = i16(fp.read(2)) xsize = right - left ysize = ascent + descent append( (xsize, ysize, left, right, width, ascent, descent, attributes) ) return metrics def _load_bitmaps(self, metrics): # # bitmap data bitmaps = [] fp, format, i16, i32 = self._getformat(PCF_BITMAPS) nbitmaps = i32(fp.read(4)) if nbitmaps != len(metrics): raise IOError("Wrong number of bitmaps") offsets = [] for i in range(nbitmaps): offsets.append(i32(fp.read(4))) bitmapSizes = [] for i in range(4): bitmapSizes.append(i32(fp.read(4))) byteorder = format & 4 # non-zero => MSB bitorder = format & 8 # non-zero => MSB padindex = format & 3 bitmapsize = bitmapSizes[padindex] offsets.append(bitmapsize) data = fp.read(bitmapsize) pad = BYTES_PER_ROW[padindex] mode = "1;R" if bitorder: mode = "1" for i in range(nbitmaps): x, y, l, r, w, a, d, f = metrics[i] b, e = offsets[i], offsets[i+1] bitmaps.append( Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x)) ) return bitmaps def _load_encoding(self): # map character code to bitmap index encoding = [None] * 256 fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2)) firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2)) default = i16(fp.read(2)) nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) for i in range(nencoding): encodingOffset = i16(fp.read(2)) if encodingOffset != 0xFFFF: try: encoding[i+firstCol] = encodingOffset except IndexError: break # only load ISO-8859-1 glyphs return encoding pillow-2.3.0/PIL/ImageDraw.py0000644000175000001440000002661212257506326014552 0ustar dokousers# # The Python Imaging Library # $Id$ # # drawing interface operations # # History: # 1996-04-13 fl Created (experimental) # 1996-08-07 fl Filled polygons, ellipses. # 1996-08-13 fl Added text support # 1998-06-28 fl Handle I and F images # 1998-12-29 fl Added arc; use arc primitive to draw ellipses # 1999-01-10 fl Added shape stuff (experimental) # 1999-02-06 fl Added bitmap support # 1999-02-11 fl Changed all primitives to take options # 1999-02-20 fl Fixed backwards compatibility # 2000-10-12 fl Copy on write, when necessary # 2001-02-18 fl Use default ink for bitmap/text also in fill mode # 2002-10-24 fl Added support for CSS-style color strings # 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing # 2002-12-11 fl Refactored low-level drawing API (work in progress) # 2004-08-26 fl Made Draw() a factory function, added getdraw() support # 2004-09-04 fl Added width support to line primitive # 2004-09-10 fl Added font mode handling # 2006-06-19 fl Added font bearing support (getmask2) # # Copyright (c) 1997-2006 by Secret Labs AB # Copyright (c) 1996-2006 by Fredrik Lundh # # See the README file for information on usage and redistribution. # import numbers from PIL import Image, ImageColor from PIL._util import isStringType try: import warnings except ImportError: warnings = None ## # A simple 2D drawing interface for PIL images. #

# Application code should use the Draw factory, instead of # directly. class ImageDraw: ## # Create a drawing instance. # # @param im The image to draw in. # @param mode Optional mode to use for color values. For RGB # images, this argument can be RGB or RGBA (to blend the # drawing into the image). For all other modes, this argument # must be the same as the image mode. If omitted, the mode # defaults to the mode of the image. def __init__(self, im, mode=None): im.load() if im.readonly: im._copy() # make it writable blend = 0 if mode is None: mode = im.mode if mode != im.mode: if mode == "RGBA" and im.mode == "RGB": blend = 1 else: raise ValueError("mode mismatch") if mode == "P": self.palette = im.palette else: self.palette = None self.im = im.im self.draw = Image.core.draw(self.im, blend) self.mode = mode if mode in ("I", "F"): self.ink = self.draw.draw_ink(1, mode) else: self.ink = self.draw.draw_ink(-1, mode) if mode in ("1", "P", "I", "F"): # FIXME: fix Fill2 to properly support matte for I+F images self.fontmode = "1" else: self.fontmode = "L" # aliasing is okay for other modes self.fill = 0 self.font = None ## # Set the default pen color. def setink(self, ink): # compatibility if warnings: warnings.warn( "'setink' is deprecated; use keyword arguments instead", DeprecationWarning, stacklevel=2 ) if isStringType(ink): ink = ImageColor.getcolor(ink, self.mode) if self.palette and not isinstance(ink, numbers.Number): ink = self.palette.getcolor(ink) self.ink = self.draw.draw_ink(ink, self.mode) ## # Set the default background color. def setfill(self, onoff): # compatibility if warnings: warnings.warn( "'setfill' is deprecated; use keyword arguments instead", DeprecationWarning, stacklevel=2 ) self.fill = onoff ## # Set the default font. def setfont(self, font): # compatibility self.font = font ## # Get the current default font. def getfont(self): if not self.font: # FIXME: should add a font repository from PIL import ImageFont self.font = ImageFont.load_default() return self.font def _getink(self, ink, fill=None): if ink is None and fill is None: if self.fill: fill = self.ink else: ink = self.ink else: if ink is not None: if isStringType(ink): ink = ImageColor.getcolor(ink, self.mode) if self.palette and not isinstance(ink, numbers.Number): ink = self.palette.getcolor(ink) ink = self.draw.draw_ink(ink, self.mode) if fill is not None: if isStringType(fill): fill = ImageColor.getcolor(fill, self.mode) if self.palette and not isinstance(fill, numbers.Number): fill = self.palette.getcolor(fill) fill = self.draw.draw_ink(fill, self.mode) return ink, fill ## # Draw an arc. def arc(self, xy, start, end, fill=None): ink, fill = self._getink(fill) if ink is not None: self.draw.draw_arc(xy, start, end, ink) ## # Draw a bitmap. def bitmap(self, xy, bitmap, fill=None): bitmap.load() ink, fill = self._getink(fill) if ink is None: ink = fill if ink is not None: self.draw.draw_bitmap(xy, bitmap.im, ink) ## # Draw a chord. def chord(self, xy, start, end, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_chord(xy, start, end, fill, 1) if ink is not None: self.draw.draw_chord(xy, start, end, ink, 0) ## # Draw an ellipse. def ellipse(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_ellipse(xy, fill, 1) if ink is not None: self.draw.draw_ellipse(xy, ink, 0) ## # Draw a line, or a connected sequence of line segments. def line(self, xy, fill=None, width=0): ink, fill = self._getink(fill) if ink is not None: self.draw.draw_lines(xy, ink, width) ## # (Experimental) Draw a shape. def shape(self, shape, fill=None, outline=None): # experimental shape.close() ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_outline(shape, fill, 1) if ink is not None: self.draw.draw_outline(shape, ink, 0) ## # Draw a pieslice. def pieslice(self, xy, start, end, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_pieslice(xy, start, end, fill, 1) if ink is not None: self.draw.draw_pieslice(xy, start, end, ink, 0) ## # Draw one or more individual pixels. def point(self, xy, fill=None): ink, fill = self._getink(fill) if ink is not None: self.draw.draw_points(xy, ink) ## # Draw a polygon. def polygon(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_polygon(xy, fill, 1) if ink is not None: self.draw.draw_polygon(xy, ink, 0) ## # Draw a rectangle. def rectangle(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_rectangle(xy, fill, 1) if ink is not None: self.draw.draw_rectangle(xy, ink, 0) ## # Draw text. def text(self, xy, text, fill=None, font=None, anchor=None): ink, fill = self._getink(fill) if font is None: font = self.getfont() if ink is None: ink = fill if ink is not None: try: mask, offset = font.getmask2(text, self.fontmode) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: mask = font.getmask(text, self.fontmode) except TypeError: mask = font.getmask(text) self.draw.draw_bitmap(xy, mask, ink) ## # Get the size of a given string, in pixels. def textsize(self, text, font=None): if font is None: font = self.getfont() return font.getsize(text) ## # A simple 2D drawing interface for PIL images. # # @param im The image to draw in. # @param mode Optional mode to use for color values. For RGB # images, this argument can be RGB or RGBA (to blend the # drawing into the image). For all other modes, this argument # must be the same as the image mode. If omitted, the mode # defaults to the mode of the image. def Draw(im, mode=None): try: return im.getdraw(mode) except AttributeError: return ImageDraw(im, mode) # experimental access to the outline API try: Outline = Image.core.outline except: Outline = None ## # (Experimental) A more advanced 2D drawing interface for PIL images, # based on the WCK interface. # # @param im The image to draw in. # @param hints An optional list of hints. # @return A (drawing context, drawing resource factory) tuple. def getdraw(im=None, hints=None): # FIXME: this needs more work! # FIXME: come up with a better 'hints' scheme. handler = None if not hints or "nicest" in hints: try: from PIL import _imagingagg as handler except ImportError: pass if handler is None: from PIL import ImageDraw2 as handler if im: im = handler.Draw(im) return im, handler ## # (experimental) Fills a bounded region with a given color. # # @param image Target image. # @param xy Seed position (a 2-item coordinate tuple). # @param value Fill color. # @param border Optional border value. If given, the region consists of # pixels with a color different from the border color. If not given, # the region consists of pixels having the same color as the seed # pixel. def floodfill(image, xy, value, border=None): "Fill bounded region." # based on an implementation by Eric S. Raymond pixel = image.load() x, y = xy try: background = pixel[x, y] if background == value: return # seed point already has fill color pixel[x, y] = value except IndexError: return # seed point outside image edge = [(x, y)] if border is None: while edge: newedge = [] for (x, y) in edge: for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): try: p = pixel[s, t] except IndexError: pass else: if p == background: pixel[s, t] = value newedge.append((s, t)) edge = newedge else: while edge: newedge = [] for (x, y) in edge: for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): try: p = pixel[s, t] except IndexError: pass else: if p != value and p != border: pixel[s, t] = value newedge.append((s, t)) edge = newedge pillow-2.3.0/PIL/ImtImagePlugin.py0000644000175000001440000000425212257506326015561 0ustar dokousers# # The Python Imaging Library. # $Id$ # # IM Tools support for PIL # # history: # 1996-05-27 fl Created (read 8-bit images only) # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) # # Copyright (c) Secret Labs AB 1997-2001. # Copyright (c) Fredrik Lundh 1996-2001. # # See the README file for information on usage and redistribution. # __version__ = "0.2" import re from PIL import Image, ImageFile # # -------------------------------------------------------------------- field = re.compile(br"([a-z]*) ([^ \r\n]*)") ## # Image plugin for IM Tools images. class ImtImageFile(ImageFile.ImageFile): format = "IMT" format_description = "IM Tools" def _open(self): # Quick rejection: if there's not a LF among the first # 100 bytes, this is (probably) not a text header. if not b"\n" in self.fp.read(100): raise SyntaxError("not an IM file") self.fp.seek(0) xsize = ysize = 0 while True: s = self.fp.read(1) if not s: break if s == b'\x0C': # image data begins self.tile = [("raw", (0,0)+self.size, self.fp.tell(), (self.mode, 0, 1))] break else: # read key/value pair # FIXME: dangerous, may read whole file s = s + self.fp.readline() if len(s) == 1 or len(s) > 100: break if s[0] == b"*": continue # comment m = field.match(s) if not m: break k, v = m.group(1,2) if k == "width": xsize = int(v) self.size = xsize, ysize elif k == "height": ysize = int(v) self.size = xsize, ysize elif k == "pixel" and v == "n8": self.mode = "L" # # -------------------------------------------------------------------- Image.register_open("IMT", ImtImageFile) # # no extension registered (".im" is simply too common) pillow-2.3.0/PIL/ImageTransform.py0000644000175000001440000000546412257506326015632 0ustar dokousers# # The Python Imaging Library. # $Id$ # # transform wrappers # # History: # 2002-04-08 fl Created # # Copyright (c) 2002 by Secret Labs AB # Copyright (c) 2002 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image class Transform(Image.ImageTransformHandler): def __init__(self, data): self.data = data def getdata(self): return self.method, self.data def transform(self, size, image, **options): # can be overridden method, data = self.getdata() return image.transform(size, method, data, **options) ## # Define an affine image transform. #

# This function takes a 6-tuple (a, b, c, d, e, f) which # contain the first two rows from an affine transform matrix. For # each pixel (x, y) in the output image, the new value is # taken from a position (a x + b y + c, # d x + e y + f) in the input image, rounded to # nearest pixel. #

# This function can be used to scale, translate, rotate, and shear the # original image. # # @def AffineTransform(matrix) # @param matrix A 6-tuple (a, b, c, d, e, f) containing # the first two rows from an affine transform matrix. # @see Image#Image.transform class AffineTransform(Transform): method = Image.AFFINE ## # Define a transform to extract a subregion from an image. #

# Maps a rectangle (defined by two corners) from the image to a # rectangle of the given size. The resulting image will contain # data sampled from between the corners, such that (x0, y0) # in the input image will end up at (0,0) in the output image, # and (x1, y1) at size. #

# This method can be used to crop, stretch, shrink, or mirror an # arbitrary rectangle in the current image. It is slightly slower than # crop, but about as fast as a corresponding resize # operation. # # @def ExtentTransform(bbox) # @param bbox A 4-tuple (x0, y0, x1, y1) which specifies # two points in the input image's coordinate system. # @see Image#Image.transform class ExtentTransform(Transform): method = Image.EXTENT ## # Define an quad image transform. #

# Maps a quadrilateral (a region defined by four corners) from the # image to a rectangle of the given size. # # @def QuadTransform(xy) # @param xy An 8-tuple (x0, y0, x1, y1, x2, y2, y3, y3) which # contain the upper left, lower left, lower right, and upper right # corner of the source quadrilateral. # @see Image#Image.transform class QuadTransform(Transform): method = Image.QUAD ## # Define an mesh image transform. A mesh transform consists of one # or more individual quad transforms. # # @def MeshTransform(data) # @param data A list of (bbox, quad) tuples. # @see Image#Image.transform class MeshTransform(Transform): method = Image.MESH pillow-2.3.0/PIL/MspImagePlugin.py0000644000175000001440000000417512257506326015573 0ustar dokousers# # The Python Imaging Library. # $Id$ # # MSP file handling # # This is the format used by the Paint program in Windows 1 and 2. # # History: # 95-09-05 fl Created # 97-01-03 fl Read/write MSP images # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1995-97. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, ImageFile, _binary # # read MSP files i16 = _binary.i16le def _accept(prefix): return prefix[:4] in [b"DanM", b"LinS"] ## # Image plugin for Windows MSP images. This plugin supports both # uncompressed (Windows 1.0). class MspImageFile(ImageFile.ImageFile): format = "MSP" format_description = "Windows Paint" def _open(self): # Header s = self.fp.read(32) if s[:4] not in [b"DanM", b"LinS"]: raise SyntaxError("not an MSP file") # Header checksum sum = 0 for i in range(0, 32, 2): sum = sum ^ i16(s[i:i+2]) if sum != 0: raise SyntaxError("bad MSP checksum") self.mode = "1" self.size = i16(s[4:]), i16(s[6:]) if s[:4] == b"DanM": self.tile = [("raw", (0,0)+self.size, 32, ("1", 0, 1))] else: self.tile = [("msp", (0,0)+self.size, 32+2*self.size[1], None)] # # write MSP files (uncompressed only) o16 = _binary.o16le def _save(im, fp, filename): if im.mode != "1": raise IOError("cannot write mode %s as MSP" % im.mode) # create MSP header header = [0] * 16 header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 header[2], header[3] = im.size header[4], header[5] = 1, 1 header[6], header[7] = 1, 1 header[8], header[9] = im.size sum = 0 for h in header: sum = sum ^ h header[12] = sum # FIXME: is this the right field? # header for h in header: fp.write(o16(h)) # image body ImageFile._save(im, fp, [("raw", (0,0)+im.size, 32, ("1", 0, 1))]) # # registry Image.register_open("MSP", MspImageFile, _accept) Image.register_save("MSP", _save) Image.register_extension("MSP", ".msp") pillow-2.3.0/PIL/Hdf5StubImagePlugin.py0000644000175000001440000000301212257506326016445 0ustar dokousers# # The Python Imaging Library # $Id$ # # HDF5 stub adapter # # Copyright (c) 2000-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile _handler = None ## # Install application-specific HDF5 image handler. # # @param handler Handler object. def register_handler(handler): global _handler _handler = handler # -------------------------------------------------------------------- # Image adapter def _accept(prefix): return prefix[:8] == b"\x89HDF\r\n\x1a\n" class HDF5StubImageFile(ImageFile.StubImageFile): format = "HDF5" format_description = "HDF5" def _open(self): offset = self.fp.tell() if not _accept(self.fp.read(8)): raise SyntaxError("Not an HDF file") self.fp.seek(offset) # make something up self.mode = "F" self.size = 1, 1 loader = self._load() if loader: loader.open(self) def _load(self): return _handler def _save(im, fp, filename): if _handler is None or not hasattr("_handler", "save"): raise IOError("HDF5 save handler not installed") _handler.save(im, fp, filename) # -------------------------------------------------------------------- # Registry Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) Image.register_save(HDF5StubImageFile.format, _save) Image.register_extension(HDF5StubImageFile.format, ".h5") Image.register_extension(HDF5StubImageFile.format, ".hdf") pillow-2.3.0/PIL/PcdImagePlugin.py0000644000175000001440000000342012257506326015532 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PCD file handling # # History: # 96-05-10 fl Created # 96-05-27 fl Added draft mode (128x192, 256x384) # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, ImageFile, _binary i8 = _binary.i8 ## # Image plugin for PhotoCD images. This plugin only reads the 768x512 # image from the file; higher resolutions are encoded in a proprietary # encoding. class PcdImageFile(ImageFile.ImageFile): format = "PCD" format_description = "Kodak PhotoCD" def _open(self): # rough self.fp.seek(2048) s = self.fp.read(2048) if s[:4] != b"PCD_": raise SyntaxError("not a PCD file") orientation = i8(s[1538]) & 3 if orientation == 1: self.tile_post_rotate = 90 # hack elif orientation == 3: self.tile_post_rotate = -90 self.mode = "RGB" self.size = 768, 512 # FIXME: not correct for rotated images! self.tile = [("pcd", (0,0)+self.size, 96*2048, None)] def draft(self, mode, size): if len(self.tile) != 1: return d, e, o, a = self.tile[0] if size: scale = max(self.size[0] / size[0], self.size[1] / size[1]) for s, o in [(4,0*2048), (2,0*2048), (1,96*2048)]: if scale >= s: break # e = e[0], e[1], (e[2]-e[0]+s-1)/s+e[0], (e[3]-e[1]+s-1)/s+e[1] # self.size = ((self.size[0]+s-1)/s, (self.size[1]+s-1)/s) self.tile = [(d, e, o, a)] return self # # registry Image.register_open("PCD", PcdImageFile) Image.register_extension("PCD", ".pcd") pillow-2.3.0/PIL/BufrStubImagePlugin.py0000644000175000001440000000273412257506326016567 0ustar dokousers# # The Python Imaging Library # $Id$ # # BUFR stub adapter # # Copyright (c) 1996-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile _handler = None ## # Install application-specific BUFR image handler. # # @param handler Handler object. def register_handler(handler): global _handler _handler = handler # -------------------------------------------------------------------- # Image adapter def _accept(prefix): return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" class BufrStubImageFile(ImageFile.StubImageFile): format = "BUFR" format_description = "BUFR" def _open(self): offset = self.fp.tell() if not _accept(self.fp.read(8)): raise SyntaxError("Not a BUFR file") self.fp.seek(offset) # make something up self.mode = "F" self.size = 1, 1 loader = self._load() if loader: loader.open(self) def _load(self): return _handler def _save(im, fp, filename): if _handler is None or not hasattr("_handler", "save"): raise IOError("BUFR save handler not installed") _handler.save(im, fp, filename) # -------------------------------------------------------------------- # Registry Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) Image.register_save(BufrStubImageFile.format, _save) Image.register_extension(BufrStubImageFile.format, ".bufr") pillow-2.3.0/PIL/GribStubImagePlugin.py0000644000175000001440000000273512257506326016555 0ustar dokousers# # The Python Imaging Library # $Id$ # # GRIB stub adapter # # Copyright (c) 1996-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile _handler = None ## # Install application-specific GRIB image handler. # # @param handler Handler object. def register_handler(handler): global _handler _handler = handler # -------------------------------------------------------------------- # Image adapter def _accept(prefix): return prefix[0:4] == b"GRIB" and prefix[7] == b'\x01' class GribStubImageFile(ImageFile.StubImageFile): format = "GRIB" format_description = "GRIB" def _open(self): offset = self.fp.tell() if not _accept(self.fp.read(8)): raise SyntaxError("Not a GRIB file") self.fp.seek(offset) # make something up self.mode = "F" self.size = 1, 1 loader = self._load() if loader: loader.open(self) def _load(self): return _handler def _save(im, fp, filename): if _handler is None or not hasattr("_handler", "save"): raise IOError("GRIB save handler not installed") _handler.save(im, fp, filename) # -------------------------------------------------------------------- # Registry Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) Image.register_save(GribStubImageFile.format, _save) Image.register_extension(GribStubImageFile.format, ".grib") pillow-2.3.0/PIL/ImageGrab.py0000644000175000001440000000214712257506326014525 0ustar dokousers# # The Python Imaging Library # $Id$ # # screen grabber (windows only) # # History: # 2001-04-26 fl created # 2001-09-17 fl use builtin driver, if present # 2002-11-19 fl added grabclipboard support # # Copyright (c) 2001-2002 by Secret Labs AB # Copyright (c) 2001-2002 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image try: # built-in driver (1.1.3 and later) grabber = Image.core.grabscreen except AttributeError: # stand-alone driver (pil plus) import _grabscreen grabber = _grabscreen.grab def grab(bbox=None): size, data = grabber() im = Image.frombytes( "RGB", size, data, # RGB, 32-bit line padding, origo in lower left corner "raw", "BGR", (size[0]*3 + 3) & -4, -1 ) if bbox: im = im.crop(bbox) return im def grabclipboard(): debug = 0 # temporary interface data = Image.core.grabclipboard(debug) if isinstance(data, bytes): from PIL import BmpImagePlugin import io return BmpImagePlugin.DibImageFile(io.BytesIO(data)) return data pillow-2.3.0/PIL/TarIO.py0000644000175000001440000000230612257506326013662 0ustar dokousers# # The Python Imaging Library. # $Id$ # # read files from within a tar file # # History: # 95-06-18 fl Created # 96-05-28 fl Open files in binary mode # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1995-96. # # See the README file for information on usage and redistribution. # from PIL import ContainerIO ## # A file object that provides read access to a given member of a TAR # file. class TarIO(ContainerIO.ContainerIO): ## # Create file object. # # @param tarfile Name of TAR file. # @param file Name of member file. def __init__(self, tarfile, file): fh = open(tarfile, "rb") while True: s = fh.read(512) if len(s) != 512: raise IOError("unexpected end of tar file") name = s[:100].decode('utf-8') i = name.find('\0') if i == 0: raise IOError("cannot find subfile") if i > 0: name = name[:i] size = int(s[124:135], 8) if file == name: break fh.seek((size + 511) & (~511), 1) # Open region ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) pillow-2.3.0/PIL/ImageFilter.py0000644000175000001440000001444512257506326015103 0ustar dokousers# # The Python Imaging Library. # $Id$ # # standard filters # # History: # 1995-11-27 fl Created # 2002-06-08 fl Added rank and mode filters # 2003-09-15 fl Fixed rank calculation in rank filter; added expand call # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1995-2002 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from functools import reduce class Filter(object): pass class Kernel(Filter): """ Create a convolution kernel. The current version only supports 3x3 and 5x5 integer and floating point kernels. In the current version, kernels can only be applied to "L" and "RGB" images. :param size: Kernel size, given as (width, height). In the current version, this must be (3,3) or (5,5). :param kernel: A sequence containing kernel weights. :param scale: Scale factor. If given, the result for each pixel is divided by this value. the default is the sum of the kernel weights. :param offset: Offset. If given, this value is added to the result, after it has been divided by the scale factor. """ def __init__(self, size, kernel, scale=None, offset=0): if scale is None: # default scale is sum of kernel scale = reduce(lambda a,b: a+b, kernel) if size[0] * size[1] != len(kernel): raise ValueError("not enough coefficients in kernel") self.filterargs = size, scale, offset, kernel def filter(self, image): if image.mode == "P": raise ValueError("cannot filter palette images") return image.filter(*self.filterargs) class BuiltinFilter(Kernel): def __init__(self): pass class RankFilter(Filter): """ Create a rank filter. The rank filter sorts all pixels in a window of the given size, and returns the **rank**'th value. :param size: The kernel size, in pixels. :param rank: What pixel value to pick. Use 0 for a min filter, ``size * size / 2`` for a median filter, ``size * size - 1`` for a max filter, etc. """ name = "Rank" def __init__(self, size, rank): self.size = size self.rank = rank def filter(self, image): if image.mode == "P": raise ValueError("cannot filter palette images") image = image.expand(self.size//2, self.size//2) return image.rankfilter(self.size, self.rank) class MedianFilter(RankFilter): """ Create a median filter. Picks the median pixel value in a window with the given size. :param size: The kernel size, in pixels. """ name = "Median" def __init__(self, size=3): self.size = size self.rank = size*size//2 class MinFilter(RankFilter): """ Create a min filter. Picks the lowest pixel value in a window with the given size. :param size: The kernel size, in pixels. """ name = "Min" def __init__(self, size=3): self.size = size self.rank = 0 class MaxFilter(RankFilter): """ Create a max filter. Picks the largest pixel value in a window with the given size. :param size: The kernel size, in pixels. """ name = "Max" def __init__(self, size=3): self.size = size self.rank = size*size-1 class ModeFilter(Filter): """ Create a mode filter. Picks the most frequent pixel value in a box with the given size. Pixel values that occur only once or twice are ignored; if no pixel value occurs more than twice, the original pixel value is preserved. :param size: The kernel size, in pixels. """ name = "Mode" def __init__(self, size=3): self.size = size def filter(self, image): return image.modefilter(self.size) class GaussianBlur(Filter): """Gaussian blur filter. :param radius: Blur radius. """ name = "GaussianBlur" def __init__(self, radius=2): self.radius = radius def filter(self, image): return image.gaussian_blur(self.radius) class UnsharpMask(Filter): """Unsharp mask filter. See Wikipedia's entry on `digital unsharp masking`_ for an explanation of the parameters. .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking """ name = "UnsharpMask" def __init__(self, radius=2, percent=150, threshold=3): self.radius = radius self.percent = percent self.threshold = threshold def filter(self, image): return image.unsharp_mask(self.radius, self.percent, self.threshold) class BLUR(BuiltinFilter): name = "Blur" filterargs = (5, 5), 16, 0, ( 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 ) class CONTOUR(BuiltinFilter): name = "Contour" filterargs = (3, 3), 1, 255, ( -1, -1, -1, -1, 8, -1, -1, -1, -1 ) class DETAIL(BuiltinFilter): name = "Detail" filterargs = (3, 3), 6, 0, ( 0, -1, 0, -1, 10, -1, 0, -1, 0 ) class EDGE_ENHANCE(BuiltinFilter): name = "Edge-enhance" filterargs = (3, 3), 2, 0, ( -1, -1, -1, -1, 10, -1, -1, -1, -1 ) class EDGE_ENHANCE_MORE(BuiltinFilter): name = "Edge-enhance More" filterargs = (3, 3), 1, 0, ( -1, -1, -1, -1, 9, -1, -1, -1, -1 ) class EMBOSS(BuiltinFilter): name = "Emboss" filterargs = (3, 3), 1, 128, ( -1, 0, 0, 0, 1, 0, 0, 0, 0 ) class FIND_EDGES(BuiltinFilter): name = "Find Edges" filterargs = (3, 3), 1, 0, ( -1, -1, -1, -1, 8, -1, -1, -1, -1 ) class SMOOTH(BuiltinFilter): name = "Smooth" filterargs = (3, 3), 13, 0, ( 1, 1, 1, 1, 5, 1, 1, 1, 1 ) class SMOOTH_MORE(BuiltinFilter): name = "Smooth More" filterargs = (5, 5), 100, 0, ( 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 5, 44, 5, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1, 1 ) class SHARPEN(BuiltinFilter): name = "Sharpen" filterargs = (3, 3), 16, 0, ( -2, -2, -2, -2, 32, -2, -2, -2, -2 ) pillow-2.3.0/PIL/ImageStat.py0000644000175000001440000000741112257506326014564 0ustar dokousers# # The Python Imaging Library. # $Id$ # # global image statistics # # History: # 1996-04-05 fl Created # 1997-05-21 fl Added mask; added rms, var, stddev attributes # 1997-08-05 fl Added median # 1998-07-05 hk Fixed integer overflow error # # Notes: # This class shows how to implement delayed evaluation of attributes. # To get a certain value, simply access the corresponding attribute. # The __getattr__ dispatcher takes care of the rest. # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996-97. # # See the README file for information on usage and redistribution. # from PIL import Image import operator, math from functools import reduce class Stat: def __init__(self, image_or_list, mask = None): try: if mask: self.h = image_or_list.histogram(mask) else: self.h = image_or_list.histogram() except AttributeError: self.h = image_or_list # assume it to be a histogram list if not isinstance(self.h, list): raise TypeError("first argument must be image or list") self.bands = list(range(len(self.h) // 256)) def __getattr__(self, id): "Calculate missing attribute" if id[:4] == "_get": raise AttributeError(id) # calculate missing attribute v = getattr(self, "_get" + id)() setattr(self, id, v) return v def _getextrema(self): "Get min/max values for each band in the image" def minmax(histogram): n = 255 x = 0 for i in range(256): if histogram[i]: n = min(n, i) x = max(x, i) return n, x # returns (255, 0) if there's no data in the histogram v = [] for i in range(0, len(self.h), 256): v.append(minmax(self.h[i:])) return v def _getcount(self): "Get total number of pixels in each layer" v = [] for i in range(0, len(self.h), 256): v.append(reduce(operator.add, self.h[i:i+256])) return v def _getsum(self): "Get sum of all pixels in each layer" v = [] for i in range(0, len(self.h), 256): sum = 0.0 for j in range(256): sum = sum + j * self.h[i+j] v.append(sum) return v def _getsum2(self): "Get squared sum of all pixels in each layer" v = [] for i in range(0, len(self.h), 256): sum2 = 0.0 for j in range(256): sum2 = sum2 + (j ** 2) * float(self.h[i+j]) v.append(sum2) return v def _getmean(self): "Get average pixel level for each layer" v = [] for i in self.bands: v.append(self.sum[i] / self.count[i]) return v def _getmedian(self): "Get median pixel level for each layer" v = [] for i in self.bands: s = 0 l = self.count[i]//2 b = i * 256 for j in range(256): s = s + self.h[b+j] if s > l: break v.append(j) return v def _getrms(self): "Get RMS for each layer" v = [] for i in self.bands: v.append(math.sqrt(self.sum2[i] / self.count[i])) return v def _getvar(self): "Get variance for each layer" v = [] for i in self.bands: n = self.count[i] v.append((self.sum2[i]-(self.sum[i]**2.0)/n)/n) return v def _getstddev(self): "Get standard deviation for each layer" v = [] for i in self.bands: v.append(math.sqrt(self.var[i])) return v Global = Stat # compatibility pillow-2.3.0/PIL/ImageTk.py0000644000175000001440000002156312257506326014233 0ustar dokousers# # The Python Imaging Library. # $Id$ # # a Tk display interface # # History: # 96-04-08 fl Created # 96-09-06 fl Added getimage method # 96-11-01 fl Rewritten, removed image attribute and crop method # 97-05-09 fl Use PyImagingPaste method instead of image type # 97-05-12 fl Minor tweaks to match the IFUNC95 interface # 97-05-17 fl Support the "pilbitmap" booster patch # 97-06-05 fl Added file= and data= argument to image constructors # 98-03-09 fl Added width and height methods to Image classes # 98-07-02 fl Use default mode for "P" images without palette attribute # 98-07-02 fl Explicitly destroy Tkinter image objects # 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) # 99-07-26 fl Automatically hook into Tkinter (if possible) # 99-08-15 fl Hook uses _imagingtk instead of _imaging # # Copyright (c) 1997-1999 by Secret Labs AB # Copyright (c) 1996-1997 by Fredrik Lundh # # See the README file for information on usage and redistribution. # try: import tkinter except ImportError: import Tkinter tkinter = Tkinter del Tkinter from PIL import Image # -------------------------------------------------------------------- # Check for Tkinter interface hooks _pilbitmap_ok = None def _pilbitmap_check(): global _pilbitmap_ok if _pilbitmap_ok is None: try: im = Image.new("1", (1,1)) tkinter.BitmapImage(data="PIL:%d" % im.im.id) _pilbitmap_ok = 1 except tkinter.TclError: _pilbitmap_ok = 0 return _pilbitmap_ok # -------------------------------------------------------------------- # PhotoImage class PhotoImage: """ A Tkinter-compatible photo image. This can be used everywhere Tkinter expects an image object. If the image is an RGBA image, pixels having alpha 0 are treated as transparent. The constructor takes either a PIL image, or a mode and a size. Alternatively, you can use the **file** or **data** options to initialize the photo image object. :param image: Either a PIL image, or a mode string. If a mode string is used, a size must also be given. :param size: If the first argument is a mode string, this defines the size of the image. :keyword file: A filename to load the image from (using ``Image.open(file)``). :keyword data: An 8-bit string containing image data (as loaded from an image file). """ def __init__(self, image=None, size=None, **kw): # Tk compatibility: file or data if image is None: if "file" in kw: image = Image.open(kw["file"]) del kw["file"] elif "data" in kw: from io import BytesIO image = Image.open(BytesIO(kw["data"])) del kw["data"] if hasattr(image, "mode") and hasattr(image, "size"): # got an image instead of a mode mode = image.mode if mode == "P": # palette mapped data image.load() try: mode = image.palette.mode except AttributeError: mode = "RGB" # default size = image.size kw["width"], kw["height"] = size else: mode = image image = None if mode not in ["1", "L", "RGB", "RGBA"]: mode = Image.getmodebase(mode) self.__mode = mode self.__size = size self.__photo = tkinter.PhotoImage(**kw) self.tk = self.__photo.tk if image: self.paste(image) def __del__(self): name = self.__photo.name self.__photo.name = None try: self.__photo.tk.call("image", "delete", name) except: pass # ignore internal errors def __str__(self): """ Get the Tkinter photo image identifier. This method is automatically called by Tkinter whenever a PhotoImage object is passed to a Tkinter method. :return: A Tkinter photo image identifier (a string). """ return str(self.__photo) def width(self): """ Get the width of the image. :return: The width, in pixels. """ return self.__size[0] def height(self): """ Get the height of the image. :return: The height, in pixels. """ return self.__size[1] def paste(self, im, box=None): """ Paste a PIL image into the photo image. Note that this can be very slow if the photo image is displayed. :param im: A PIL image. The size must match the target region. If the mode does not match, the image is converted to the mode of the bitmap image. :param box: A 4-tuple defining the left, upper, right, and lower pixel coordinate. If None is given instead of a tuple, all of the image is assumed. """ # convert to blittable im.load() image = im.im if image.isblock() and im.mode == self.__mode: block = image else: block = image.new_block(self.__mode, im.size) image.convert2(block, image) # convert directly between buffers tk = self.__photo.tk try: tk.call("PyImagingPhoto", self.__photo, block.id) except tkinter.TclError as v: # activate Tkinter hook try: from PIL import _imagingtk try: _imagingtk.tkinit(tk.interpaddr(), 1) except AttributeError: _imagingtk.tkinit(id(tk), 0) tk.call("PyImagingPhoto", self.__photo, block.id) except (ImportError, AttributeError, tkinter.TclError): raise # configuration problem; cannot attach to Tkinter # -------------------------------------------------------------------- # BitmapImage class BitmapImage: """ A Tkinter-compatible bitmap image. This can be used everywhere Tkinter expects an image object. The given image must have mode "1". Pixels having value 0 are treated as transparent. Options, if any, are passed on to Tkinter. The most commonly used option is **foreground**, which is used to specify the color for the non-transparent parts. See the Tkinter documentation for information on how to specify colours. :param image: A PIL image. """ def __init__(self, image=None, **kw): # Tk compatibility: file or data if image is None: if "file" in kw: image = Image.open(kw["file"]) del kw["file"] elif "data" in kw: from io import BytesIO image = Image.open(BytesIO(kw["data"])) del kw["data"] self.__mode = image.mode self.__size = image.size if _pilbitmap_check(): # fast way (requires the pilbitmap booster patch) image.load() kw["data"] = "PIL:%d" % image.im.id self.__im = image # must keep a reference else: # slow but safe way kw["data"] = image.tobitmap() self.__photo = tkinter.BitmapImage(**kw) def __del__(self): name = self.__photo.name self.__photo.name = None try: self.__photo.tk.call("image", "delete", name) except: pass # ignore internal errors def width(self): """ Get the width of the image. :return: The width, in pixels. """ return self.__size[0] def height(self): """ Get the height of the image. :return: The height, in pixels. """ return self.__size[1] def __str__(self): """ Get the Tkinter bitmap image identifier. This method is automatically called by Tkinter whenever a BitmapImage object is passed to a Tkinter method. :return: A Tkinter bitmap image identifier (a string). """ return str(self.__photo) def getimage(photo): """Copies the contents of a PhotoImage to a PIL image memory.""" photo.tk.call("PyImagingPhotoGet", photo) # -------------------------------------------------------------------- # Helper for the Image.show method. def _show(image, title): class UI(tkinter.Label): def __init__(self, master, im): if im.mode == "1": self.image = BitmapImage(im, foreground="white", master=master) else: self.image = PhotoImage(im, master=master) tkinter.Label.__init__(self, master, image=self.image, bg="black", bd=0) if not tkinter._default_root: raise IOError("tkinter not initialized") top = tkinter.Toplevel() if title: top.title(title) UI(top, image).pack() pillow-2.3.0/PIL/ImageFile.py0000644000175000001440000003634112257506326014534 0ustar dokousers# # The Python Imaging Library. # $Id$ # # base class for image file handlers # # history: # 1995-09-09 fl Created # 1996-03-11 fl Fixed load mechanism. # 1996-04-15 fl Added pcx/xbm decoders. # 1996-04-30 fl Added encoders. # 1996-12-14 fl Added load helpers # 1997-01-11 fl Use encode_to_file where possible # 1997-08-27 fl Flush output in _save # 1998-03-05 fl Use memory mapping for some modes # 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" # 1999-05-31 fl Added image parser # 2000-10-12 fl Set readonly flag on memory-mapped images # 2002-03-20 fl Use better messages for common decoder errors # 2003-04-21 fl Fall back on mmap/map_buffer if map is not available # 2003-10-30 fl Added StubImageFile class # 2004-02-25 fl Made incremental parser more robust # # Copyright (c) 1997-2004 by Secret Labs AB # Copyright (c) 1995-2004 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image from PIL._util import isPath import traceback, os, sys import io MAXBLOCK = 65536 SAFEBLOCK = 1024*1024 LOAD_TRUNCATED_IMAGES = False ERRORS = { -1: "image buffer overrun error", -2: "decoding error", -3: "unknown error", -8: "bad configuration", -9: "out of memory error" } def raise_ioerror(error): try: message = Image.core.getcodecstatus(error) except AttributeError: message = ERRORS.get(error) if not message: message = "decoder error %d" % error raise IOError(message + " when reading image file") # # -------------------------------------------------------------------- # Helpers def _tilesort(t): # sort on offset return t[2] # # -------------------------------------------------------------------- # ImageFile base class class ImageFile(Image.Image): "Base class for image file format handlers." def __init__(self, fp=None, filename=None): Image.Image.__init__(self) self.tile = None self.readonly = 1 # until we know better self.decoderconfig = () self.decodermaxblock = MAXBLOCK if isPath(fp): # filename self.fp = open(fp, "rb") self.filename = fp else: # stream self.fp = fp self.filename = filename try: self._open() except IndexError as v: # end of data if Image.DEBUG > 1: traceback.print_exc() raise SyntaxError(v) except TypeError as v: # end of data (ord) if Image.DEBUG > 1: traceback.print_exc() raise SyntaxError(v) except KeyError as v: # unsupported mode if Image.DEBUG > 1: traceback.print_exc() raise SyntaxError(v) except EOFError as v: # got header but not the first frame if Image.DEBUG > 1: traceback.print_exc() raise SyntaxError(v) if not self.mode or self.size[0] <= 0: raise SyntaxError("not identified by this driver") def draft(self, mode, size): "Set draft mode" pass def verify(self): "Check file integrity" # raise exception if something's wrong. must be called # directly after open, and closes file when finished. self.fp = None def load(self): "Load image data based on tile list" pixel = Image.Image.load(self) if self.tile is None: raise IOError("cannot load this image") if not self.tile: return pixel self.map = None readonly = 0 if self.filename and len(self.tile) == 1 and not hasattr(sys, 'pypy_version_info'): # As of pypy 2.1.0, memory mapping was failing here. # try memory mapping d, e, o, a = self.tile[0] if d == "raw" and a[0] == self.mode and a[0] in Image._MAPMODES: try: if hasattr(Image.core, "map"): # use built-in mapper self.map = Image.core.map(self.filename) self.map.seek(o) self.im = self.map.readimage( self.mode, self.size, a[1], a[2] ) else: # use mmap, if possible import mmap file = open(self.filename, "r+") size = os.path.getsize(self.filename) # FIXME: on Unix, use PROT_READ etc self.map = mmap.mmap(file.fileno(), size) self.im = Image.core.map_buffer( self.map, self.size, d, e, o, a ) readonly = 1 except (AttributeError, EnvironmentError, ImportError): self.map = None self.load_prepare() # look for read/seek overrides try: read = self.load_read except AttributeError: read = self.fp.read try: seek = self.load_seek except AttributeError: seek = self.fp.seek if not self.map: # sort tiles in file order self.tile.sort(key=_tilesort) try: # FIXME: This is a hack to handle TIFF's JpegTables tag. prefix = self.tile_prefix except AttributeError: prefix = b"" for d, e, o, a in self.tile: d = Image._getdecoder(self.mode, d, a, self.decoderconfig) seek(o) try: d.setimage(self.im, e) except ValueError: continue b = prefix t = len(b) while True: try: s = read(self.decodermaxblock) except IndexError as ie: # truncated png/gif if LOAD_TRUNCATED_IMAGES: break else: raise IndexError(ie) if not s: # truncated jpeg self.tile = [] # JpegDecode needs to clean things up here either way # If we don't destroy the decompressor, we have a memory leak. d.cleanup() if LOAD_TRUNCATED_IMAGES: break else: raise IOError("image file is truncated (%d bytes not processed)" % len(b)) b = b + s n, e = d.decode(b) if n < 0: break b = b[n:] t = t + n self.tile = [] self.readonly = readonly self.fp = None # might be shared if (not LOAD_TRUNCATED_IMAGES or t == 0) and not self.map and e < 0: # still raised if decoder fails to return anything raise_ioerror(e) # post processing if hasattr(self, "tile_post_rotate"): # FIXME: This is a hack to handle rotated PCD's self.im = self.im.rotate(self.tile_post_rotate) self.size = self.im.size self.load_end() return Image.Image.load(self) def load_prepare(self): # create image memory if necessary if not self.im or\ self.im.mode != self.mode or self.im.size != self.size: self.im = Image.core.new(self.mode, self.size) # create palette (optional) if self.mode == "P": Image.Image.load(self) def load_end(self): # may be overridden pass # may be defined for contained formats # def load_seek(self, pos): # pass # may be defined for blocked formats (e.g. PNG) # def load_read(self, bytes): # pass class StubImageFile(ImageFile): """ Base class for stub image loaders. A stub loader is an image loader that can identify files of a certain format, but relies on external code to load the file. """ def _open(self): raise NotImplementedError( "StubImageFile subclass must implement _open" ) def load(self): loader = self._load() if loader is None: raise IOError("cannot find loader for this %s file" % self.format) image = loader.load(self) assert image is not None # become the other object (!) self.__class__ = image.__class__ self.__dict__ = image.__dict__ def _load(self): "(Hook) Find actual image loader." raise NotImplementedError( "StubImageFile subclass must implement _load" ) class Parser: """ Incremental image parser. This class implements the standard feed/close consumer interface. In Python 2.x, this is an old-style class. """ incremental = None image = None data = None decoder = None finished = 0 def reset(self): """ (Consumer) Reset the parser. Note that you can only call this method immediately after you've created a parser; parser instances cannot be reused. """ assert self.data is None, "cannot reuse parsers" def feed(self, data): """ (Consumer) Feed data to the parser. :param data: A string buffer. :exception IOError: If the parser failed to parse the image file. """ # collect data if self.finished: return if self.data is None: self.data = data else: self.data = self.data + data # parse what we have if self.decoder: if self.offset > 0: # skip header skip = min(len(self.data), self.offset) self.data = self.data[skip:] self.offset = self.offset - skip if self.offset > 0 or not self.data: return n, e = self.decoder.decode(self.data) if n < 0: # end of stream self.data = None self.finished = 1 if e < 0: # decoding error self.image = None raise_ioerror(e) else: # end of image return self.data = self.data[n:] elif self.image: # if we end up here with no decoder, this file cannot # be incrementally parsed. wait until we've gotten all # available data pass else: # attempt to open this file try: try: fp = io.BytesIO(self.data) im = Image.open(fp) finally: fp.close() # explicitly close the virtual file except IOError: # traceback.print_exc() pass # not enough data else: flag = hasattr(im, "load_seek") or hasattr(im, "load_read") if flag or len(im.tile) != 1: # custom load code, or multiple tiles self.decode = None else: # initialize decoder im.load_prepare() d, e, o, a = im.tile[0] im.tile = [] self.decoder = Image._getdecoder( im.mode, d, a, im.decoderconfig ) self.decoder.setimage(im.im, e) # calculate decoder offset self.offset = o if self.offset <= len(self.data): self.data = self.data[self.offset:] self.offset = 0 self.image = im def close(self): """ (Consumer) Close the stream. :returns: An image object. :exception IOError: If the parser failed to parse the image file either because it cannot be identified or cannot be decoded. """ # finish decoding if self.decoder: # get rid of what's left in the buffers self.feed(b"") self.data = self.decoder = None if not self.finished: raise IOError("image was incomplete") if not self.image: raise IOError("cannot parse this image") if self.data: # incremental parsing not possible; reopen the file # not that we have all data try: fp = io.BytesIO(self.data) self.image = Image.open(fp) finally: self.image.load() fp.close() # explicitly close the virtual file return self.image # -------------------------------------------------------------------- def _save(im, fp, tile, bufsize=0): """Helper to save image based on tile list :param im: Image object. :param fp: File object. :param tile: Tile list. :param bufsize: Optional buffer size """ im.load() if not hasattr(im, "encoderconfig"): im.encoderconfig = () tile.sort(key=_tilesort) # FIXME: make MAXBLOCK a configuration parameter # It would be great if we could have the encoder specifiy what it needs # But, it would need at least the image size in most cases. RawEncode is # a tricky case. bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c try: fh = fp.fileno() fp.flush() except (AttributeError, io.UnsupportedOperation): # compress to Python file-compatible object for e, b, o, a in tile: e = Image._getencoder(im.mode, e, a, im.encoderconfig) if o > 0: fp.seek(o, 0) e.setimage(im.im, b) while True: l, s, d = e.encode(bufsize) fp.write(d) if s: break if s < 0: raise IOError("encoder error %d when writing image file" % s) else: # slight speedup: compress to real file object for e, b, o, a in tile: e = Image._getencoder(im.mode, e, a, im.encoderconfig) if o > 0: fp.seek(o, 0) e.setimage(im.im, b) s = e.encode_to_file(fh, bufsize) if s < 0: raise IOError("encoder error %d when writing image file" % s) try: fp.flush() except: pass def _safe_read(fp, size): """ Reads large blocks in a safe way. Unlike fp.read(n), this function doesn't trust the user. If the requested size is larger than SAFEBLOCK, the file is read block by block. :param fp: File handle. Must implement a read method. :param size: Number of bytes to read. :returns: A string containing up to size bytes of data. """ if size <= 0: return b"" if size <= SAFEBLOCK: return fp.read(size) data = [] while size > 0: block = fp.read(min(size, SAFEBLOCK)) if not block: break data.append(block) size = size - len(block) return b"".join(data) pillow-2.3.0/PIL/IcnsImagePlugin.py0000644000175000001440000001413212257506326015722 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Mac OS X icns file decoder, based on icns.py by Bob Ippolito. # # history: # 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. # # Copyright (c) 2004 by Bob Ippolito. # Copyright (c) 2004 by Secret Labs. # Copyright (c) 2004 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile, _binary import struct i8 = _binary.i8 HEADERSIZE = 8 def nextheader(fobj): return struct.unpack('>4sI', fobj.read(HEADERSIZE)) def read_32t(fobj, start_length, size): # The 128x128 icon seems to have an extra header for some reason. (start, length) = start_length fobj.seek(start) sig = fobj.read(4) if sig != b'\x00\x00\x00\x00': raise SyntaxError('Unknown signature, expecting 0x00000000') return read_32(fobj, (start + 4, length - 4), size) def read_32(fobj, start_length, size): """ Read a 32bit RGB icon resource. Seems to be either uncompressed or an RLE packbits-like scheme. """ (start, length) = start_length fobj.seek(start) sizesq = size[0] * size[1] if length == sizesq * 3: # uncompressed ("RGBRGBGB") indata = fobj.read(length) im = Image.frombuffer("RGB", size, indata, "raw", "RGB", 0, 1) else: # decode image im = Image.new("RGB", size, None) for band_ix in range(3): data = [] bytesleft = sizesq while bytesleft > 0: byte = fobj.read(1) if not byte: break byte = i8(byte) if byte & 0x80: blocksize = byte - 125 byte = fobj.read(1) for i in range(blocksize): data.append(byte) else: blocksize = byte + 1 data.append(fobj.read(blocksize)) bytesleft = bytesleft - blocksize if bytesleft <= 0: break if bytesleft != 0: raise SyntaxError( "Error reading channel [%r left]" % bytesleft ) band = Image.frombuffer( "L", size, b"".join(data), "raw", "L", 0, 1 ) im.im.putband(band.im, band_ix) return {"RGB": im} def read_mk(fobj, start_length, size): # Alpha masks seem to be uncompressed (start, length) = start_length fobj.seek(start) band = Image.frombuffer( "L", size, fobj.read(size[0]*size[1]), "raw", "L", 0, 1 ) return {"A": band} class IcnsFile: SIZES = { (128, 128): [ (b'it32', read_32t), (b't8mk', read_mk), ], (48, 48): [ (b'ih32', read_32), (b'h8mk', read_mk), ], (32, 32): [ (b'il32', read_32), (b'l8mk', read_mk), ], (16, 16): [ (b'is32', read_32), (b's8mk', read_mk), ], } def __init__(self, fobj): """ fobj is a file-like object as an icns resource """ # signature : (start, length) self.dct = dct = {} self.fobj = fobj sig, filesize = nextheader(fobj) if sig != 'icns': raise SyntaxError('not an icns file') i = HEADERSIZE while i < filesize: sig, blocksize = nextheader(fobj) i = i + HEADERSIZE blocksize = blocksize - HEADERSIZE dct[sig] = (i, blocksize) fobj.seek(blocksize, 1) i = i + blocksize def itersizes(self): sizes = [] for size, fmts in self.SIZES.items(): for (fmt, reader) in fmts: if fmt in self.dct: sizes.append(size) break return sizes def bestsize(self): sizes = self.itersizes() if not sizes: raise SyntaxError("No 32bit icon resources found") return max(sizes) def dataforsize(self, size): """ Get an icon resource as {channel: array}. Note that the arrays are bottom-up like windows bitmaps and will likely need to be flipped or transposed in some way. """ dct = {} for code, reader in self.SIZES[size]: desc = self.dct.get(code) if desc is not None: dct.update(reader(self.fobj, desc, size)) return dct def getimage(self, size=None): if size is None: size = self.bestsize() channels = self.dataforsize(size) im = channels.get("RGB").copy() try: im.putalpha(channels["A"]) except KeyError: pass return im ## # Image plugin for Mac OS icons. class IcnsImageFile(ImageFile.ImageFile): """ PIL read-only image support for Mac OS .icns files. Chooses the best resolution, but will possibly load a different size image if you mutate the size attribute before calling 'load'. The info dictionary has a key 'sizes' that is a list of sizes that the icns file has. """ format = "ICNS" format_description = "Mac OS icns resource" def _open(self): self.icns = IcnsFile(self.fp) self.mode = 'RGBA' self.size = self.icns.bestsize() self.info['sizes'] = self.icns.itersizes() # Just use this to see if it's loaded or not yet. self.tile = ('',) def load(self): Image.Image.load(self) if not self.tile: return self.load_prepare() # This is likely NOT the best way to do it, but whatever. im = self.icns.getimage(self.size) self.im = im.im self.mode = im.mode self.size = im.size self.fp = None self.icns = None self.tile = () self.load_end() Image.register_open("ICNS", IcnsImageFile, lambda x: x[:4] == b'icns') Image.register_extension("ICNS", '.icns') if __name__ == '__main__': import os, sys im = Image.open(open(sys.argv[1], "rb")) im.save("out.png") os.startfile("out.png") pillow-2.3.0/PIL/PcxImagePlugin.py0000644000175000001440000001103312257506326015555 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PCX file handling # # This format was originally used by ZSoft's popular PaintBrush # program for the IBM PC. It is also supported by many MS-DOS and # Windows applications, including the Windows PaintBrush program in # Windows 3. # # history: # 1995-09-01 fl Created # 1996-05-20 fl Fixed RGB support # 1997-01-03 fl Fixed 2-bit and 4-bit support # 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) # 1999-02-07 fl Added write support # 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust # 2002-07-30 fl Seek from to current position, not beginning of file # 2003-06-03 fl Extract DPI settings (info["dpi"]) # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1995-2003 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # __version__ = "0.6" from PIL import Image, ImageFile, ImagePalette, _binary i8 = _binary.i8 i16 = _binary.i16le o8 = _binary.o8 def _accept(prefix): return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] ## # Image plugin for Paintbrush images. class PcxImageFile(ImageFile.ImageFile): format = "PCX" format_description = "Paintbrush" def _open(self): # header s = self.fp.read(128) if not _accept(s): raise SyntaxError("not a PCX file") # image bbox = i16(s,4), i16(s,6), i16(s,8)+1, i16(s,10)+1 if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: raise SyntaxError("bad PCX image size") # format version = i8(s[1]) bits = i8(s[3]) planes = i8(s[65]) stride = i16(s,66) self.info["dpi"] = i16(s,12), i16(s,14) if bits == 1 and planes == 1: mode = rawmode = "1" elif bits == 1 and planes in (2, 4): mode = "P" rawmode = "P;%dL" % planes self.palette = ImagePalette.raw("RGB", s[16:64]) elif version == 5 and bits == 8 and planes == 1: mode = rawmode = "L" # FIXME: hey, this doesn't work with the incremental loader !!! self.fp.seek(-769, 2) s = self.fp.read(769) if len(s) == 769 and i8(s[0]) == 12: # check if the palette is linear greyscale for i in range(256): if s[i*3+1:i*3+4] != o8(i)*3: mode = rawmode = "P" break if mode == "P": self.palette = ImagePalette.raw("RGB", s[1:]) self.fp.seek(128) elif version == 5 and bits == 8 and planes == 3: mode = "RGB" rawmode = "RGB;L" else: raise IOError("unknown PCX mode") self.mode = mode self.size = bbox[2]-bbox[0], bbox[3]-bbox[1] bbox = (0, 0) + self.size self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] # -------------------------------------------------------------------- # save PCX files SAVE = { # mode: (version, bits, planes, raw mode) "1": (2, 1, 1, "1"), "L": (5, 8, 1, "L"), "P": (5, 8, 1, "P"), "RGB": (5, 8, 3, "RGB;L"), } o16 = _binary.o16le def _save(im, fp, filename, check=0): try: version, bits, planes, rawmode = SAVE[im.mode] except KeyError: raise ValueError("Cannot save %s images as PCX" % im.mode) if check: return check # bytes per plane stride = (im.size[0] * bits + 7) // 8 # under windows, we could determine the current screen size with # "Image.core.display_mode()[1]", but I think that's overkill... screen = im.size dpi = 100, 100 # PCX header fp.write( o8(10) + o8(version) + o8(1) + o8(bits) + o16(0) + o16(0) + o16(im.size[0]-1) + o16(im.size[1]-1) + o16(dpi[0]) + o16(dpi[1]) + b"\0"*24 + b"\xFF"*24 + b"\0" + o8(planes) + o16(stride) + o16(1) + o16(screen[0]) + o16(screen[1]) + b"\0"*54 ) assert fp.tell() == 128 ImageFile._save(im, fp, [("pcx", (0,0)+im.size, 0, (rawmode, bits*planes))]) if im.mode == "P": # colour palette fp.write(o8(12)) fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes elif im.mode == "L": # greyscale palette fp.write(o8(12)) for i in range(256): fp.write(o8(i)*3) # -------------------------------------------------------------------- # registry Image.register_open("PCX", PcxImageFile, _accept) Image.register_save("PCX", _save) Image.register_extension("PCX", ".pcx") pillow-2.3.0/PIL/ImageWin.py0000644000175000001440000001676012257506326014415 0ustar dokousers# # The Python Imaging Library. # $Id$ # # a Windows DIB display interface # # History: # 1996-05-20 fl Created # 1996-09-20 fl Fixed subregion exposure # 1997-09-21 fl Added draw primitive (for tzPrint) # 2003-05-21 fl Added experimental Window/ImageWindow classes # 2003-09-05 fl Added fromstring/tostring methods # # Copyright (c) Secret Labs AB 1997-2003. # Copyright (c) Fredrik Lundh 1996-2003. # # See the README file for information on usage and redistribution. # import warnings from PIL import Image class HDC: """ Wraps a HDC integer. The resulting object can be passed to the :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` methods. """ def __init__(self, dc): self.dc = dc def __int__(self): return self.dc class HWND: """ Wraps a HWND integer. The resulting object can be passed to the :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` methods, instead of a DC. """ def __init__(self, wnd): self.wnd = wnd def __int__(self): return self.wnd class Dib: """ A Windows bitmap with the given mode and size. The mode can be one of "1", "L", "P", or "RGB". If the display requires a palette, this constructor creates a suitable palette and associates it with the image. For an "L" image, 128 greylevels are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together with 20 greylevels. To make sure that palettes work properly under Windows, you must call the **palette** method upon certain events from Windows. :param image: Either a PIL image, or a mode string. If a mode string is used, a size must also be given. The mode can be one of "1", "L", "P", or "RGB". :param size: If the first argument is a mode string, this defines the size of the image. """ def __init__(self, image, size=None): if hasattr(image, "mode") and hasattr(image, "size"): mode = image.mode size = image.size else: mode = image image = None if mode not in ["1", "L", "P", "RGB"]: mode = Image.getmodebase(mode) self.image = Image.core.display(mode, size) self.mode = mode self.size = size if image: self.paste(image) def expose(self, handle): """ Copy the bitmap contents to a device context. :param handle: Device context (HDC), cast to a Python integer, or a HDC or HWND instance. In PythonWin, you can use the :py:meth:`CDC.GetHandleAttrib` to get a suitable handle. """ if isinstance(handle, HWND): dc = self.image.getdc(handle) try: result = self.image.expose(dc) finally: self.image.releasedc(handle, dc) else: result = self.image.expose(handle) return result def draw(self, handle, dst, src=None): """ Same as expose, but allows you to specify where to draw the image, and what part of it to draw. The destination and source areas are given as 4-tuple rectangles. If the source is omitted, the entire image is copied. If the source and the destination have different sizes, the image is resized as necessary. """ if not src: src = (0,0) + self.size if isinstance(handle, HWND): dc = self.image.getdc(handle) try: result = self.image.draw(dc, dst, src) finally: self.image.releasedc(handle, dc) else: result = self.image.draw(handle, dst, src) return result def query_palette(self, handle): """ Installs the palette associated with the image in the given device context. This method should be called upon **QUERYNEWPALETTE** and **PALETTECHANGED** events from Windows. If this method returns a non-zero value, one or more display palette entries were changed, and the image should be redrawn. :param handle: Device context (HDC), cast to a Python integer, or an HDC or HWND instance. :return: A true value if one or more entries were changed (this indicates that the image should be redrawn). """ if isinstance(handle, HWND): handle = self.image.getdc(handle) try: result = self.image.query_palette(handle) finally: self.image.releasedc(handle, handle) else: result = self.image.query_palette(handle) return result def paste(self, im, box=None): """ Paste a PIL image into the bitmap image. :param im: A PIL image. The size must match the target region. If the mode does not match, the image is converted to the mode of the bitmap image. :param box: A 4-tuple defining the left, upper, right, and lower pixel coordinate. If None is given instead of a tuple, all of the image is assumed. """ im.load() if self.mode != im.mode: im = im.convert(self.mode) if box: self.image.paste(im.im, box) else: self.image.paste(im.im) def frombytes(self, buffer): """ Load display memory contents from byte data. :param buffer: A buffer containing display data (usually data returned from tobytes) """ return self.image.frombytes(buffer) def tobytes(self): """ Copy display memory contents to bytes object. :return: A bytes object containing display data. """ return self.image.tobytes() ## # Deprecated aliases to frombytes & tobytes. def fromstring(self, *args, **kw): warnings.warn( 'fromstring() is deprecated. Please call frombytes() instead.', DeprecationWarning, stacklevel=2 ) return self.frombytes(*args, **kw) def tostring(self): warnings.warn( 'tostring() is deprecated. Please call tobytes() instead.', DeprecationWarning, stacklevel=2 ) return self.tobytes() ## # Create a Window with the given title size. class Window: def __init__(self, title="PIL", width=None, height=None): self.hwnd = Image.core.createwindow( title, self.__dispatcher, width or 0, height or 0 ) def __dispatcher(self, action, *args): return getattr(self, "ui_handle_" + action)(*args) def ui_handle_clear(self, dc, x0, y0, x1, y1): pass def ui_handle_damage(self, x0, y0, x1, y1): pass def ui_handle_destroy(self): pass def ui_handle_repair(self, dc, x0, y0, x1, y1): pass def ui_handle_resize(self, width, height): pass def mainloop(self): Image.core.eventloop() ## # Create an image window which displays the given image. class ImageWindow(Window): def __init__(self, image, title="PIL"): if not isinstance(image, Dib): image = Dib(image) self.image = image width, height = image.size Window.__init__(self, title, width=width, height=height) def ui_handle_repair(self, dc, x0, y0, x1, y1): self.image.draw(dc, (x0, y0, x1, y1)) pillow-2.3.0/PIL/ContainerIO.py0000644000175000001440000000504712257506326015063 0ustar dokousers# # The Python Imaging Library. # $Id$ # # a class to read from a container file # # History: # 1995-06-18 fl Created # 1995-09-07 fl Added readline(), readlines() # # Copyright (c) 1997-2001 by Secret Labs AB # Copyright (c) 1995 by Fredrik Lundh # # See the README file for information on usage and redistribution. # ## # A file object that provides read access to a part of an existing # file (for example a TAR file). class ContainerIO: ## # Create file object. # # @param file Existing file. # @param offset Start of region, in bytes. # @param length Size of region, in bytes. def __init__(self, file, offset, length): self.fh = file self.pos = 0 self.offset = offset self.length = length self.fh.seek(offset) ## # Always false. def isatty(self): return 0 ## # Move file pointer. # # @param offset Offset in bytes. # @param mode Starting position. Use 0 for beginning of region, 1 # for current offset, and 2 for end of region. You cannot move # the pointer outside the defined region. def seek(self, offset, mode = 0): if mode == 1: self.pos = self.pos + offset elif mode == 2: self.pos = self.length + offset else: self.pos = offset # clamp self.pos = max(0, min(self.pos, self.length)) self.fh.seek(self.offset + self.pos) ## # Get current file pointer. # # @return Offset from start of region, in bytes. def tell(self): return self.pos ## # Read data. # # @def read(bytes=0) # @param bytes Number of bytes to read. If omitted or zero, # read until end of region. # @return An 8-bit string. def read(self, n = 0): if n: n = min(n, self.length - self.pos) else: n = self.length - self.pos if not n: # EOF return "" self.pos = self.pos + n return self.fh.read(n) ## # Read a line of text. # # @return An 8-bit string. def readline(self): s = "" while True: c = self.read(1) if not c: break s = s + c if c == "\n": break return s ## # Read multiple lines of text. # # @return A list of 8-bit strings. def readlines(self): l = [] while True: s = self.readline() if not s: break l.append(s) return l pillow-2.3.0/PIL/WalImageFile.py0000644000175000001440000001262412257506326015176 0ustar dokousers# -*- coding: iso-8859-1 -*- # # The Python Imaging Library. # $Id$ # # WAL file handling # # History: # 2003-04-23 fl created # # Copyright (c) 2003 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # # NOTE: This format cannot be automatically recognized, so the reader # is not registered for use with Image.open(). To open a WEL file, use # the WalImageFile.open() function instead. # This reader is based on the specification available from: # http://www.flipcode.com/tutorials/tut_q2levels.shtml # and has been tested with a few sample files found using google. from __future__ import print_function from PIL import Image, _binary try: import builtins except ImportError: import __builtin__ builtins = __builtin__ i32 = _binary.i32le ## # Load texture from a Quake2 WAL texture file. #

# By default, a Quake2 standard palette is attached to the texture. # To override the palette, use the putpalette method. # # @param filename WAL file name, or an opened file handle. # @return An image instance. def open(filename): # FIXME: modify to return a WalImageFile instance instead of # plain Image object ? if hasattr(filename, "read"): fp = filename else: fp = builtins.open(filename, "rb") # read header fields header = fp.read(32+24+32+12) size = i32(header, 32), i32(header, 36) offset = i32(header, 40) # load pixel data fp.seek(offset) im = Image.frombytes("P", size, fp.read(size[0] * size[1])) im.putpalette(quake2palette) im.format = "WAL" im.format_description = "Quake2 Texture" # strings are null-terminated im.info["name"] = header[:32].split(b"\0", 1)[0] next_name = header[56:56+32].split(b"\0", 1)[0] if next_name: im.info["next_name"] = next_name return im quake2palette = ( # default palette taken from piffo 0.93 by Hans Hggstrm b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" ) if __name__ == "__main__": im = open("../hacks/sample.wal") print(im.info, im.mode, im.size) im.save("../out.png") pillow-2.3.0/PIL/TiffTags.py0000644000175000001440000001127212257506326014415 0ustar dokousers# # The Python Imaging Library. # $Id$ # # TIFF tags # # This module provides clear-text names for various well-known # TIFF tags. the TIFF codec works just fine without it. # # Copyright (c) Secret Labs AB 1999. # # See the README file for information on usage and redistribution. # ## # This module provides constants and clear-text names for various # well-known TIFF tags. ## ## # Map tag numbers (or tag number, tag value tuples) to tag names. TAGS = { 254: "NewSubfileType", 255: "SubfileType", 256: "ImageWidth", 257: "ImageLength", 258: "BitsPerSample", 259: "Compression", (259, 1): "Uncompressed", (259, 2): "CCITT 1d", (259, 3): "Group 3 Fax", (259, 4): "Group 4 Fax", (259, 5): "LZW", (259, 6): "JPEG", (259, 32773): "PackBits", 262: "PhotometricInterpretation", (262, 0): "WhiteIsZero", (262, 1): "BlackIsZero", (262, 2): "RGB", (262, 3): "RGB Palette", (262, 4): "Transparency Mask", (262, 5): "CMYK", (262, 6): "YCbCr", (262, 8): "CieLAB", (262, 32803): "CFA", # TIFF/EP, Adobe DNG (262, 32892): "LinearRaw", # Adobe DNG 263: "Thresholding", 264: "CellWidth", 265: "CellHeight", 266: "FillOrder", 269: "DocumentName", 270: "ImageDescription", 271: "Make", 272: "Model", 273: "StripOffsets", 274: "Orientation", 277: "SamplesPerPixel", 278: "RowsPerStrip", 279: "StripByteCounts", 280: "MinSampleValue", 281: "MaxSampleValue", 282: "XResolution", 283: "YResolution", 284: "PlanarConfiguration", (284, 1): "Contigous", (284, 2): "Separate", 285: "PageName", 286: "XPosition", 287: "YPosition", 288: "FreeOffsets", 289: "FreeByteCounts", 290: "GrayResponseUnit", 291: "GrayResponseCurve", 292: "T4Options", 293: "T6Options", 296: "ResolutionUnit", 297: "PageNumber", 301: "TransferFunction", 305: "Software", 306: "DateTime", 315: "Artist", 316: "HostComputer", 317: "Predictor", 318: "WhitePoint", 319: "PrimaryChromaticies", 320: "ColorMap", 321: "HalftoneHints", 322: "TileWidth", 323: "TileLength", 324: "TileOffsets", 325: "TileByteCounts", 332: "InkSet", 333: "InkNames", 334: "NumberOfInks", 336: "DotRange", 337: "TargetPrinter", 338: "ExtraSamples", 339: "SampleFormat", 340: "SMinSampleValue", 341: "SMaxSampleValue", 342: "TransferRange", 347: "JPEGTables", # obsolete JPEG tags 512: "JPEGProc", 513: "JPEGInterchangeFormat", 514: "JPEGInterchangeFormatLength", 515: "JPEGRestartInterval", 517: "JPEGLosslessPredictors", 518: "JPEGPointTransforms", 519: "JPEGQTables", 520: "JPEGDCTables", 521: "JPEGACTables", 529: "YCbCrCoefficients", 530: "YCbCrSubSampling", 531: "YCbCrPositioning", 532: "ReferenceBlackWhite", # XMP 700: "XMP", 33432: "Copyright", # various extensions (should check specs for "official" names) 33723: "IptcNaaInfo", 34377: "PhotoshopInfo", # Exif IFD 34665: "ExifIFD", # ICC Profile 34675: "ICCProfile", # Adobe DNG 50706: "DNGVersion", 50707: "DNGBackwardVersion", 50708: "UniqueCameraModel", 50709: "LocalizedCameraModel", 50710: "CFAPlaneColor", 50711: "CFALayout", 50712: "LinearizationTable", 50713: "BlackLevelRepeatDim", 50714: "BlackLevel", 50715: "BlackLevelDeltaH", 50716: "BlackLevelDeltaV", 50717: "WhiteLevel", 50718: "DefaultScale", 50741: "BestQualityScale", 50719: "DefaultCropOrigin", 50720: "DefaultCropSize", 50778: "CalibrationIlluminant1", 50779: "CalibrationIlluminant2", 50721: "ColorMatrix1", 50722: "ColorMatrix2", 50723: "CameraCalibration1", 50724: "CameraCalibration2", 50725: "ReductionMatrix1", 50726: "ReductionMatrix2", 50727: "AnalogBalance", 50728: "AsShotNeutral", 50729: "AsShotWhiteXY", 50730: "BaselineExposure", 50731: "BaselineNoise", 50732: "BaselineSharpness", 50733: "BayerGreenSplit", 50734: "LinearResponseLimit", 50735: "CameraSerialNumber", 50736: "LensInfo", 50737: "ChromaBlurRadius", 50738: "AntiAliasStrength", 50740: "DNGPrivateData", 50741: "MakerNoteSafety", #ImageJ 50838: "ImageJMetaDataByteCounts", # private tag registered with Adobe 50839: "ImageJMetaData", # private tag registered with Adobe } ## # Map type numbers to type names. TYPES = { 1: "byte", 2: "ascii", 3: "short", 4: "long", 5: "rational", 6: "signed byte", 7: "undefined", 8: "signed short", 9: "signed long", 10: "signed rational", 11: "float", 12: "double", } pillow-2.3.0/PIL/SpiderImagePlugin.py0000644000175000001440000002161512257506326016260 0ustar dokousers# # The Python Imaging Library. # # SPIDER image file handling # # History: # 2004-08-02 Created BB # 2006-03-02 added save method # 2006-03-13 added support for stack images # # Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. # Copyright (c) 2004 by William Baxter. # Copyright (c) 2004 by Secret Labs AB. # Copyright (c) 2004 by Fredrik Lundh. # ## # Image plugin for the Spider image format. This format is is used # by the SPIDER software, in processing image data from electron # microscopy and tomography. ## # # SpiderImagePlugin.py # # The Spider image format is used by SPIDER software, in processing # image data from electron microscopy and tomography. # # Spider home page: # http://www.wadsworth.org/spider_doc/spider/docs/spider.html # # Details about the Spider image format: # http://www.wadsworth.org/spider_doc/spider/docs/image_doc.html # from __future__ import print_function from PIL import Image, ImageFile import os, struct, sys def isInt(f): try: i = int(f) if f-i == 0: return 1 else: return 0 except: return 0 iforms = [1,3,-11,-12,-21,-22] # There is no magic number to identify Spider files, so just check a # series of header locations to see if they have reasonable values. # Returns no.of bytes in the header, if it is a valid Spider header, # otherwise returns 0 def isSpiderHeader(t): h = (99,) + t # add 1 value so can use spider header index start=1 # header values 1,2,5,12,13,22,23 should be integers for i in [1,2,5,12,13,22,23]: if not isInt(h[i]): return 0 # check iform iform = int(h[5]) if not iform in iforms: return 0 # check other header values labrec = int(h[13]) # no. records in file header labbyt = int(h[22]) # total no. of bytes in header lenbyt = int(h[23]) # record length in bytes #print "labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt) if labbyt != (labrec * lenbyt): return 0 # looks like a valid header return labbyt def isSpiderImage(filename): fp = open(filename,'rb') f = fp.read(92) # read 23 * 4 bytes fp.close() bigendian = 1 t = struct.unpack('>23f',f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: bigendian = 0 t = struct.unpack('<23f',f) # little-endian hdrlen = isSpiderHeader(t) return hdrlen class SpiderImageFile(ImageFile.ImageFile): format = "SPIDER" format_description = "Spider 2D image" def _open(self): # check header n = 27 * 4 # read 27 float values f = self.fp.read(n) try: self.bigendian = 1 t = struct.unpack('>27f',f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: self.bigendian = 0 t = struct.unpack('<27f',f) # little-endian hdrlen = isSpiderHeader(t) if hdrlen == 0: raise SyntaxError("not a valid Spider file") except struct.error: raise SyntaxError("not a valid Spider file") h = (99,) + t # add 1 value : spider header index starts at 1 iform = int(h[5]) if iform != 1: raise SyntaxError("not a Spider 2D image") self.size = int(h[12]), int(h[2]) # size in pixels (width, height) self.istack = int(h[24]) self.imgnumber = int(h[27]) if self.istack == 0 and self.imgnumber == 0: # stk=0, img=0: a regular 2D image offset = hdrlen self.nimages = 1 elif self.istack > 0 and self.imgnumber == 0: # stk>0, img=0: Opening the stack for the first time self.imgbytes = int(h[12]) * int(h[2]) * 4 self.hdrlen = hdrlen self.nimages = int(h[26]) # Point to the first image in the stack offset = hdrlen * 2 self.imgnumber = 1 elif self.istack == 0 and self.imgnumber > 0: # stk=0, img>0: an image within the stack offset = hdrlen + self.stkoffset self.istack = 2 # So Image knows it's still a stack else: raise SyntaxError("inconsistent stack header values") if self.bigendian: self.rawmode = "F;32BF" else: self.rawmode = "F;32F" self.mode = "F" self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] self.__fp = self.fp # FIXME: hack # 1st image index is zero (although SPIDER imgnumber starts at 1) def tell(self): if self.imgnumber < 1: return 0 else: return self.imgnumber - 1 def seek(self, frame): if self.istack == 0: return if frame >= self.nimages: raise EOFError("attempt to seek past end of file") self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) self.fp = self.__fp self.fp.seek(self.stkoffset) self._open() # returns a byte image after rescaling to 0..255 def convert2byte(self, depth=255): (min, max) = self.getextrema() m = 1 if max != min: m = depth / (max-min) b = -m * min return self.point(lambda i, m=m, b=b: i * m + b).convert("L") # returns a ImageTk.PhotoImage object, after rescaling to 0..255 def tkPhotoImage(self): from PIL import ImageTk return ImageTk.PhotoImage(self.convert2byte(), palette=256) # -------------------------------------------------------------------- # Image series # given a list of filenames, return a list of images def loadImageSeries(filelist=None): " create a list of Image.images for use in montage " if filelist == None or len(filelist) < 1: return imglist = [] for img in filelist: if not os.path.exists(img): print("unable to find %s" % img) continue try: im = Image.open(img).convert2byte() except: if not isSpiderImage(img): print(img + " is not a Spider image file") continue im.info['filename'] = img imglist.append(im) return imglist # -------------------------------------------------------------------- # For saving images in Spider format def makeSpiderHeader(im): nsam,nrow = im.size lenbyt = nsam * 4 # There are labrec records in the header labrec = 1024 / lenbyt if 1024%lenbyt != 0: labrec += 1 labbyt = labrec * lenbyt hdr = [] nvalues = labbyt / 4 for i in range(nvalues): hdr.append(0.0) if len(hdr) < 23: return [] # NB these are Fortran indices hdr[1] = 1.0 # nslice (=1 for an image) hdr[2] = float(nrow) # number of rows per slice hdr[5] = 1.0 # iform for 2D image hdr[12] = float(nsam) # number of pixels per line hdr[13] = float(labrec) # number of records in file header hdr[22] = float(labbyt) # total number of bytes in header hdr[23] = float(lenbyt) # record length in bytes # adjust for Fortran indexing hdr = hdr[1:] hdr.append(0.0) # pack binary data into a string hdrstr = [] for v in hdr: hdrstr.append(struct.pack('f',v)) return hdrstr def _save(im, fp, filename): if im.mode[0] != "F": im = im.convert('F') hdr = makeSpiderHeader(im) if len(hdr) < 256: raise IOError("Error creating Spider header") # write the SPIDER header try: fp = open(filename, 'wb') except: raise IOError("Unable to open %s for writing" % filename) fp.writelines(hdr) rawmode = "F;32NF" #32-bit native floating point ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode,0,1))]) fp.close() def _save_spider(im, fp, filename): # get the filename extension and register it with Image fn, ext = os.path.splitext(filename) Image.register_extension("SPIDER", ext) _save(im, fp, filename) # -------------------------------------------------------------------- Image.register_open("SPIDER", SpiderImageFile) Image.register_save("SPIDER", _save_spider) if __name__ == "__main__": if not sys.argv[1:]: print("Syntax: python SpiderImagePlugin.py Spiderimage [outfile]") sys.exit() filename = sys.argv[1] if not isSpiderImage(filename): print("input image must be in Spider format") sys.exit() outfile = "" if len(sys.argv[1:]) > 1: outfile = sys.argv[2] im = Image.open(filename) print("image: " + str(im)) print("format: " + str(im.format)) print("size: " + str(im.size)) print("mode: " + str(im.mode)) print("max, min: ", end=' ') print(im.getextrema()) if outfile != "": # perform some image operation im = im.transpose(Image.FLIP_LEFT_RIGHT) print("saving a flipped version of %s as %s " % (os.path.basename(filename), outfile)) im.save(outfile, "SPIDER") pillow-2.3.0/PIL/GimpPaletteFile.py0000644000175000001440000000247012257506326015721 0ustar dokousers# # Python Imaging Library # $Id$ # # stuff to read GIMP palette files # # History: # 1997-08-23 fl Created # 2004-09-07 fl Support GIMP 2.0 palette files. # # Copyright (c) Secret Labs AB 1997-2004. All rights reserved. # Copyright (c) Fredrik Lundh 1997-2004. # # See the README file for information on usage and redistribution. # import re from PIL._binary import o8 ## # File handler for GIMP's palette format. class GimpPaletteFile: rawmode = "RGB" def __init__(self, fp): self.palette = [o8(i)*3 for i in range(256)] if fp.readline()[:12] != b"GIMP Palette": raise SyntaxError("not a GIMP palette file") i = 0 while i <= 255: s = fp.readline() if not s: break # skip fields and comment lines if re.match(b"\w+:|#", s): continue if len(s) > 100: raise SyntaxError("bad palette file") v = tuple(map(int, s.split()[:3])) if len(v) != 3: raise ValueError("bad palette entry") if 0 <= i <= 255: self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) i = i + 1 self.palette = b"".join(self.palette) def getpalette(self): return self.palette, self.rawmode pillow-2.3.0/PIL/GdImageFile.py0000644000175000001440000000420412257506326015000 0ustar dokousers# # The Python Imaging Library. # $Id$ # # GD file handling # # History: # 1996-04-12 fl Created # # Copyright (c) 1997 by Secret Labs AB. # Copyright (c) 1996 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # # NOTE: This format cannot be automatically recognized, so the # class is not registered for use with Image.open(). To open a # gd file, use the GdImageFile.open() function instead. # THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This # implementation is provided for convenience and demonstrational # purposes only. __version__ = "0.1" from PIL import ImageFile, ImagePalette, _binary from PIL._util import isPath try: import builtins except ImportError: import __builtin__ builtins = __builtin__ i16 = _binary.i16be ## # Image plugin for the GD uncompressed format. Note that this format # is not supported by the standard Image.open function. To use # this plugin, you have to import the GdImageFile module and # use the GdImageFile.open function. class GdImageFile(ImageFile.ImageFile): format = "GD" format_description = "GD uncompressed images" def _open(self): # Header s = self.fp.read(775) self.mode = "L" # FIXME: "P" self.size = i16(s[0:2]), i16(s[2:4]) # transparency index tindex = i16(s[5:7]) if tindex < 256: self.info["transparent"] = tindex self.palette = ImagePalette.raw("RGB", s[7:]) self.tile = [("raw", (0,0)+self.size, 775, ("L", 0, -1))] ## # Load texture from a GD image file. # # @param filename GD file name, or an opened file handle. # @param mode Optional mode. In this version, if the mode argument # is given, it must be "r". # @return An image instance. # @exception IOError If the image could not be read. def open(fp, mode = "r"): if mode != "r": raise ValueError("bad mode") if isPath(fp): filename = fp fp = builtins.open(fp, "rb") else: filename = "" try: return GdImageFile(fp, filename) except SyntaxError: raise IOError("cannot identify this image file") pillow-2.3.0/PIL/MicImagePlugin.py0000644000175000001440000000417512257506326015544 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Microsoft Image Composer support for PIL # # Notes: # uses TiffImagePlugin.py to read the actual image streams # # History: # 97-01-20 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, TiffImagePlugin from PIL.OleFileIO import * # # -------------------------------------------------------------------- def _accept(prefix): return prefix[:8] == MAGIC ## # Image plugin for Microsoft's Image Composer file format. class MicImageFile(TiffImagePlugin.TiffImageFile): format = "MIC" format_description = "Microsoft Image Composer" def _open(self): # read the OLE directory and see if this is a likely # to be a Microsoft Image Composer file try: self.ole = OleFileIO(self.fp) except IOError: raise SyntaxError("not an MIC file; invalid OLE file") # find ACI subfiles with Image members (maybe not the # best way to identify MIC files, but what the... ;-) self.images = [] for file in self.ole.listdir(): if file[1:] and file[0][-4:] == ".ACI" and file[1] == "Image": self.images.append(file) # if we didn't find any images, this is probably not # an MIC file. if not self.images: raise SyntaxError("not an MIC file; no image entries") self.__fp = self.fp self.frame = 0 if len(self.images) > 1: self.category = Image.CONTAINER self.seek(0) def seek(self, frame): try: filename = self.images[frame] except IndexError: raise EOFError("no such frame") self.fp = self.ole.openstream(filename) TiffImagePlugin.TiffImageFile._open(self) self.frame = frame def tell(self): return self.frame # # -------------------------------------------------------------------- Image.register_open("MIC", MicImageFile, _accept) Image.register_extension("MIC", ".mic") pillow-2.3.0/PIL/ImageQt.py0000644000175000001440000000516312257510366014236 0ustar dokousers# # The Python Imaging Library. # $Id$ # # a simple Qt image interface. # # history: # 2006-06-03 fl: created # 2006-06-04 fl: inherit from QImage instead of wrapping it # 2006-06-05 fl: removed toimage helper; move string support to ImageQt # 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) # # Copyright (c) 2006 by Secret Labs AB # Copyright (c) 2006 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image from PIL._util import isPath try: from PyQt5.QtGui import QImage, qRgba except: from PyQt4.QtGui import QImage, qRgba ## # (Internal) Turns an RGB color into a Qt compatible color integer. def rgb(r, g, b, a=255): # use qRgb to pack the colors, and then turn the resulting long # into a negative integer with the same bitpattern. return (qRgba(r, g, b, a) & 0xffffffff) ## # An PIL image wrapper for Qt. This is a subclass of PyQt4's QImage # class. # # @param im A PIL Image object, or a file name (given either as Python # string or a PyQt string object). class ImageQt(QImage): def __init__(self, im): data = None colortable = None # handle filename, if given instead of image name if hasattr(im, "toUtf8"): # FIXME - is this really the best way to do this? im = unicode(im.toUtf8(), "utf-8") if isPath(im): im = Image.open(im) if im.mode == "1": format = QImage.Format_Mono elif im.mode == "L": format = QImage.Format_Indexed8 colortable = [] for i in range(256): colortable.append(rgb(i, i, i)) elif im.mode == "P": format = QImage.Format_Indexed8 colortable = [] palette = im.getpalette() for i in range(0, len(palette), 3): colortable.append(rgb(*palette[i:i+3])) elif im.mode == "RGB": data = im.tobytes("raw", "BGRX") format = QImage.Format_RGB32 elif im.mode == "RGBA": try: data = im.tobytes("raw", "BGRA") except SystemError: # workaround for earlier versions r, g, b, a = im.split() im = Image.merge("RGBA", (b, g, r, a)) format = QImage.Format_ARGB32 else: raise ValueError("unsupported image mode %r" % im.mode) # must keep a reference, or Qt will crash! self.__data = data or im.tobytes() QImage.__init__(self, self.__data, im.size[0], im.size[1], format) if colortable: self.setColorTable(colortable) pillow-2.3.0/PIL/WebPImagePlugin.py0000644000175000001440000000355112257506326015666 0ustar dokousersfrom PIL import Image from PIL import ImageFile from io import BytesIO from PIL import _webp _VALID_WEBP_MODES = { "RGB": True, "RGBA": True, } _VP8_MODES_BY_IDENTIFIER = { b"VP8 ": "RGB", b"VP8X": "RGBA", b"VP8L": "RGBA", # lossless } def _accept(prefix): is_riff_file_format = prefix[:4] == b"RIFF" is_webp_file = prefix[8:12] == b"WEBP" is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER return is_riff_file_format and is_webp_file and is_valid_vp8_mode class WebPImageFile(ImageFile.ImageFile): format = "WEBP" format_description = "WebP image" def _open(self): data, width, height, self.mode, icc_profile, exif = _webp.WebPDecode(self.fp.read()) self.info["icc_profile"] = icc_profile self.info["exif"] = exif self.size = width, height self.fp = BytesIO(data) self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] def _getexif(self): from PIL.JpegImagePlugin import _getexif return _getexif(self) def _save(im, fp, filename): image_mode = im.mode if im.mode not in _VALID_WEBP_MODES: raise IOError("cannot write mode %s as WEBP" % image_mode) lossless = im.encoderinfo.get("lossless", False) quality = im.encoderinfo.get("quality", 80) icc_profile = im.encoderinfo.get("icc_profile", "") exif = im.encoderinfo.get("exif", "") data = _webp.WebPEncode( im.tobytes(), im.size[0], im.size[1], lossless, float(quality), im.mode, icc_profile, exif ) if data is None: raise IOError("cannot write file as WEBP (encoder returned None)") fp.write(data) Image.register_open("WEBP", WebPImageFile, _accept) Image.register_save("WEBP", _save) Image.register_extension("WEBP", ".webp") Image.register_mime("WEBP", "image/webp") pillow-2.3.0/PIL/JpegPresets.py0000644000175000001440000003005612257506326015142 0ustar dokousers""" JPEG quality settings equivalent to the Photoshop settings. More presets can be added to the presets dict if needed. Can be use when saving JPEG file. To apply the preset, specify:: quality="preset_name" To apply only the quantization table:: qtables="preset_name" To apply only the subsampling setting:: subsampling="preset_name" Example:: im.save("image_name.jpg", quality="web_high") Subsampling ----------- Subsampling is the practice of encoding images by implementing less resolution for chroma information than for luma information. (ref.: http://en.wikipedia.org/wiki/Chroma_subsampling) Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and 4:1:1 (or 4:2:0?). You can get the subsampling of a JPEG with the `JpegImagePlugin.get_subsampling(im)` function. Quantization tables ------------------- They are values use by the DCT (Discrete cosine transform) to remove *unnecessary* information from the image (the lossy part of the compression). (ref.: http://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, http://en.wikipedia.org/wiki/JPEG#Quantization) You can get the quantization tables of a JPEG with:: im.quantization This will return a dict with a number of arrays. You can pass this dict directly as the qtables argument when saving a JPEG. The tables format between im.quantization and quantization in presets differ in 3 ways: 1. The base container of the preset is a list with sublists instead of dict. dict[0] -> list[0], dict[1] -> list[1], ... 2. Each table in a preset is a list instead of an array. 3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). You can convert the dict format to the preset format with the `JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. Libjpeg ref.: http://www.jpegcameras.com/libjpeg/libjpeg-3.html """ presets = { 'web_low': {'subsampling': 2, # "4:1:1" 'quantization': [ [20, 16, 25, 39, 50, 46, 62, 68, 16, 18, 23, 38, 38, 53, 65, 68, 25, 23, 31, 38, 53, 65, 68, 68, 39, 38, 38, 53, 65, 68, 68, 68, 50, 38, 53, 65, 68, 68, 68, 68, 46, 53, 65, 68, 68, 68, 68, 68, 62, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68], [21, 25, 32, 38, 54, 68, 68, 68, 25, 28, 24, 38, 54, 68, 68, 68, 32, 24, 32, 43, 66, 68, 68, 68, 38, 38, 43, 53, 68, 68, 68, 68, 54, 54, 66, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68] ]}, 'web_medium': {'subsampling': 2, # "4:1:1" 'quantization': [ [16, 11, 11, 16, 23, 27, 31, 30, 11, 12, 12, 15, 20, 23, 23, 30, 11, 12, 13, 16, 23, 26, 35, 47, 16, 15, 16, 23, 26, 37, 47, 64, 23, 20, 23, 26, 39, 51, 64, 64, 27, 23, 26, 37, 51, 64, 64, 64, 31, 23, 35, 47, 64, 64, 64, 64, 30, 30, 47, 64, 64, 64, 64, 64], [17, 15, 17, 21, 20, 26, 38, 48, 15, 19, 18, 17, 20, 26, 35, 43, 17, 18, 20, 22, 26, 30, 46, 53, 21, 17, 22, 28, 30, 39, 53, 64, 20, 20, 26, 30, 39, 48, 64, 64, 26, 26, 30, 39, 48, 63, 64, 64, 38, 35, 46, 53, 64, 64, 64, 64, 48, 43, 53, 64, 64, 64, 64, 64] ]}, 'web_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, 4, 5, 5, 6, 8, 10, 12, 12, 4, 5, 5, 6, 10, 12, 14, 19, 6, 6, 6, 11, 12, 15, 19, 28, 9, 8, 10, 12, 16, 20, 27, 31, 11, 10, 12, 15, 20, 27, 31, 31, 12, 12, 14, 19, 27, 31, 31, 31, 16, 12, 19, 28, 31, 31, 31, 31], [ 7, 7, 13, 24, 26, 31, 31, 31, 7, 12, 16, 21, 31, 31, 31, 31, 13, 16, 17, 31, 31, 31, 31, 31, 24, 21, 31, 31, 31, 31, 31, 31, 26, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31] ]}, 'web_very_high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 4, 5, 7, 9, 2, 2, 2, 4, 5, 7, 9, 12, 3, 3, 4, 5, 8, 10, 12, 12, 4, 4, 5, 7, 10, 12, 12, 12, 5, 5, 7, 9, 12, 12, 12, 12, 6, 6, 9, 12, 12, 12, 12, 12], [ 3, 3, 5, 9, 13, 15, 15, 15, 3, 4, 6, 11, 14, 12, 12, 12, 5, 6, 9, 14, 12, 12, 12, 12, 9, 11, 14, 12, 12, 12, 12, 12, 13, 14, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12] ]}, 'web_maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 2, 2, 3, 3, 3, 1, 1, 2, 2, 3, 3, 3, 3], [ 1, 1, 1, 2, 2, 3, 3, 3, 1, 1, 1, 2, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] ]}, 'low': {'subsampling': 2, # "4:1:1" 'quantization': [ [18, 14, 14, 21, 30, 35, 34, 17, 14, 16, 16, 19, 26, 23, 12, 12, 14, 16, 17, 21, 23, 12, 12, 12, 21, 19, 21, 23, 12, 12, 12, 12, 30, 26, 23, 12, 12, 12, 12, 12, 35, 23, 12, 12, 12, 12, 12, 12, 34, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12], [20, 19, 22, 27, 20, 20, 17, 17, 19, 25, 23, 14, 14, 12, 12, 12, 22, 23, 14, 14, 12, 12, 12, 12, 27, 14, 14, 12, 12, 12, 12, 12, 20, 14, 12, 12, 12, 12, 12, 12, 20, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, 'medium': {'subsampling': 2, # "4:1:1" 'quantization': [ [12, 8, 8, 12, 17, 21, 24, 17, 8, 9, 9, 11, 15, 19, 12, 12, 8, 9, 10, 12, 19, 12, 12, 12, 12, 11, 12, 21, 12, 12, 12, 12, 17, 15, 19, 12, 12, 12, 12, 12, 21, 19, 12, 12, 12, 12, 12, 12, 24, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12], [13, 11, 13, 16, 20, 20, 17, 17, 11, 14, 14, 14, 14, 12, 12, 12, 13, 14, 14, 14, 12, 12, 12, 12, 16, 14, 14, 12, 12, 12, 12, 12, 20, 14, 12, 12, 12, 12, 12, 12, 20, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, 'high': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 6, 4, 4, 6, 9, 11, 12, 16, 4, 5, 5, 6, 8, 10, 12, 12, 4, 5, 5, 6, 10, 12, 12, 12, 6, 6, 6, 11, 12, 12, 12, 12, 9, 8, 10, 12, 12, 12, 12, 12, 11, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 12, 12, 12, 12, 12, 12, 12], [ 7, 7, 13, 24, 20, 20, 17, 17, 7, 12, 16, 14, 14, 12, 12, 12, 13, 16, 14, 14, 12, 12, 12, 12, 24, 14, 14, 12, 12, 12, 12, 12, 20, 14, 12, 12, 12, 12, 12, 12, 20, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12, 17, 12, 12, 12, 12, 12, 12, 12] ]}, 'maximum': {'subsampling': 0, # "4:4:4" 'quantization': [ [ 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 4, 5, 7, 9, 2, 2, 2, 4, 5, 7, 9, 12, 3, 3, 4, 5, 8, 10, 12, 12, 4, 4, 5, 7, 10, 12, 12, 12, 5, 5, 7, 9, 12, 12, 12, 12, 6, 6, 9, 12, 12, 12, 12, 12], [ 3, 3, 5, 9, 13, 15, 15, 15, 3, 4, 6, 10, 14, 12, 12, 12, 5, 6, 9, 14, 12, 12, 12, 12, 9, 10, 14, 12, 12, 12, 12, 12, 13, 14, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12, 15, 12, 12, 12, 12, 12, 12, 12] ]}, }pillow-2.3.0/PIL/ImageMode.py0000644000175000001440000000242012257506326014530 0ustar dokousers# # The Python Imaging Library. # $Id$ # # standard mode descriptors # # History: # 2006-03-20 fl Added # # Copyright (c) 2006 by Secret Labs AB. # Copyright (c) 2006 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # # mode descriptor cache _modes = {} ## # Wrapper for mode strings. class ModeDescriptor: def __init__(self, mode, bands, basemode, basetype): self.mode = mode self.bands = bands self.basemode = basemode self.basetype = basetype def __str__(self): return self.mode ## # Gets a mode descriptor for the given mode. def getmode(mode): if not _modes: # initialize mode cache from PIL import Image # core modes for m, (basemode, basetype, bands) in Image._MODEINFO.items(): _modes[m] = ModeDescriptor(m, bands, basemode, basetype) # extra experimental modes _modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") _modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") # mapping modes _modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") _modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") _modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") return _modes[mode] pillow-2.3.0/PIL/ImageFileIO.py0000644000175000001440000000177612257506326014770 0ustar dokousers# # The Python Imaging Library. # $Id$ # # kludge to get basic ImageFileIO functionality # # History: # 1998-08-06 fl Recreated # # Copyright (c) Secret Labs AB 1998-2002. # # See the README file for information on usage and redistribution. # """ The **ImageFileIO** module can be used to read an image from a socket, or any other stream device. Deprecated. New code should use the :class:`PIL.ImageFile.Parser` class in the :mod:`PIL.ImageFile` module instead. .. seealso:: modules :class:`PIL.ImageFile.Parser` """ from io import BytesIO class ImageFileIO(BytesIO): def __init__(self, fp): """ Adds buffering to a stream file object, in order to provide **seek** and **tell** methods required by the :func:`PIL.Image.Image.open` method. The stream object must implement **read** and **close** methods. :param fp: Stream file handle. .. seealso:: modules :func:`PIL.Image.open` """ data = fp.read() BytesIO.__init__(self, data) pillow-2.3.0/PIL/JpegImagePlugin.py0000644000175000001440000004710012257506326015714 0ustar dokousers# # The Python Imaging Library. # $Id$ # # JPEG (JFIF) file handling # # See "Digital Compression and Coding of Continous-Tone Still Images, # Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) # # History: # 1995-09-09 fl Created # 1995-09-13 fl Added full parser # 1996-03-25 fl Added hack to use the IJG command line utilities # 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug # 1996-05-28 fl Added draft support, JFIF version (0.1) # 1996-12-30 fl Added encoder options, added progression property (0.2) # 1997-08-27 fl Save mode 1 images as BW (0.3) # 1998-07-12 fl Added YCbCr to draft and save methods (0.4) # 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) # 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) # 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) # 2003-04-25 fl Added experimental EXIF decoder (0.5) # 2003-06-06 fl Added experimental EXIF GPSinfo decoder # 2003-09-13 fl Extract COM markers # 2009-09-06 fl Added icc_profile support (from Florian Hoech) # 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) # 2009-03-08 fl Added subsampling support (from Justin Huff). # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1995-1996 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # __version__ = "0.6" import array, struct from PIL import Image, ImageFile, _binary from PIL.JpegPresets import presets from PIL._util import isStringType i8 = _binary.i8 o8 = _binary.o8 i16 = _binary.i16be i32 = _binary.i32be # # Parser def Skip(self, marker): n = i16(self.fp.read(2))-2 ImageFile._safe_read(self.fp, n) def APP(self, marker): # # Application marker. Store these in the APP dictionary. # Also look for well-known application markers. n = i16(self.fp.read(2))-2 s = ImageFile._safe_read(self.fp, n) app = "APP%d" % (marker&15) self.app[app] = s # compatibility self.applist.append((app, s)) if marker == 0xFFE0 and s[:4] == b"JFIF": # extract JFIF information self.info["jfif"] = version = i16(s, 5) # version self.info["jfif_version"] = divmod(version, 256) # extract JFIF properties try: jfif_unit = i8(s[7]) jfif_density = i16(s, 8), i16(s, 10) except: pass else: if jfif_unit == 1: self.info["dpi"] = jfif_density self.info["jfif_unit"] = jfif_unit self.info["jfif_density"] = jfif_density elif marker == 0xFFE1 and s[:5] == b"Exif\0": # extract Exif information (incomplete) self.info["exif"] = s # FIXME: value will change elif marker == 0xFFE2 and s[:5] == b"FPXR\0": # extract FlashPix information (incomplete) self.info["flashpix"] = s # FIXME: value will change elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": # Since an ICC profile can be larger than the maximum size of # a JPEG marker (64K), we need provisions to split it into # multiple markers. The format defined by the ICC specifies # one or more APP2 markers containing the following data: # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) # Marker sequence number 1, 2, etc (1 byte) # Number of markers Total of APP2's used (1 byte) # Profile data (remainder of APP2 data) # Decoders should use the marker sequence numbers to # reassemble the profile, rather than assuming that the APP2 # markers appear in the correct sequence. self.icclist.append(s) elif marker == 0xFFEE and s[:5] == b"Adobe": self.info["adobe"] = i16(s, 5) # extract Adobe custom properties try: adobe_transform = i8(s[1]) except: pass else: self.info["adobe_transform"] = adobe_transform def COM(self, marker): # # Comment marker. Store these in the APP dictionary. n = i16(self.fp.read(2))-2 s = ImageFile._safe_read(self.fp, n) self.app["COM"] = s # compatibility self.applist.append(("COM", s)) def SOF(self, marker): # # Start of frame marker. Defines the size and mode of the # image. JPEG is colour blind, so we use some simple # heuristics to map the number of layers to an appropriate # mode. Note that this could be made a bit brighter, by # looking for JFIF and Adobe APP markers. n = i16(self.fp.read(2))-2 s = ImageFile._safe_read(self.fp, n) self.size = i16(s[3:]), i16(s[1:]) self.bits = i8(s[0]) if self.bits != 8: raise SyntaxError("cannot handle %d-bit layers" % self.bits) self.layers = i8(s[5]) if self.layers == 1: self.mode = "L" elif self.layers == 3: self.mode = "RGB" elif self.layers == 4: self.mode = "CMYK" else: raise SyntaxError("cannot handle %d-layer images" % self.layers) if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: self.info["progressive"] = self.info["progression"] = 1 if self.icclist: # fixup icc profile self.icclist.sort() # sort by sequence number if i8(self.icclist[0][13]) == len(self.icclist): profile = [] for p in self.icclist: profile.append(p[14:]) icc_profile = b"".join(profile) else: icc_profile = None # wrong number of fragments self.info["icc_profile"] = icc_profile self.icclist = None for i in range(6, len(s), 3): t = s[i:i+3] # 4-tuples: id, vsamp, hsamp, qtable self.layer.append((t[0], i8(t[1])//16, i8(t[1])&15, i8(t[2]))) def DQT(self, marker): # # Define quantization table. Support baseline 8-bit tables # only. Note that there might be more than one table in # each marker. # FIXME: The quantization tables can be used to estimate the # compression quality. n = i16(self.fp.read(2))-2 s = ImageFile._safe_read(self.fp, n) while len(s): if len(s) < 65: raise SyntaxError("bad quantization table marker") v = i8(s[0]) if v//16 == 0: self.quantization[v&15] = array.array("b", s[1:65]) s = s[65:] else: return # FIXME: add code to read 16-bit tables! # raise SyntaxError, "bad quantization table element size" # # JPEG marker table MARKER = { 0xFFC0: ("SOF0", "Baseline DCT", SOF), 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), 0xFFC2: ("SOF2", "Progressive DCT", SOF), 0xFFC3: ("SOF3", "Spatial lossless", SOF), 0xFFC4: ("DHT", "Define Huffman table", Skip), 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), 0xFFC7: ("SOF7", "Differential spatial", SOF), 0xFFC8: ("JPG", "Extension", None), 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), 0xFFD0: ("RST0", "Restart 0", None), 0xFFD1: ("RST1", "Restart 1", None), 0xFFD2: ("RST2", "Restart 2", None), 0xFFD3: ("RST3", "Restart 3", None), 0xFFD4: ("RST4", "Restart 4", None), 0xFFD5: ("RST5", "Restart 5", None), 0xFFD6: ("RST6", "Restart 6", None), 0xFFD7: ("RST7", "Restart 7", None), 0xFFD8: ("SOI", "Start of image", None), 0xFFD9: ("EOI", "End of image", None), 0xFFDA: ("SOS", "Start of scan", Skip), 0xFFDB: ("DQT", "Define quantization table", DQT), 0xFFDC: ("DNL", "Define number of lines", Skip), 0xFFDD: ("DRI", "Define restart interval", Skip), 0xFFDE: ("DHP", "Define hierarchical progression", SOF), 0xFFDF: ("EXP", "Expand reference component", Skip), 0xFFE0: ("APP0", "Application segment 0", APP), 0xFFE1: ("APP1", "Application segment 1", APP), 0xFFE2: ("APP2", "Application segment 2", APP), 0xFFE3: ("APP3", "Application segment 3", APP), 0xFFE4: ("APP4", "Application segment 4", APP), 0xFFE5: ("APP5", "Application segment 5", APP), 0xFFE6: ("APP6", "Application segment 6", APP), 0xFFE7: ("APP7", "Application segment 7", APP), 0xFFE8: ("APP8", "Application segment 8", APP), 0xFFE9: ("APP9", "Application segment 9", APP), 0xFFEA: ("APP10", "Application segment 10", APP), 0xFFEB: ("APP11", "Application segment 11", APP), 0xFFEC: ("APP12", "Application segment 12", APP), 0xFFED: ("APP13", "Application segment 13", APP), 0xFFEE: ("APP14", "Application segment 14", APP), 0xFFEF: ("APP15", "Application segment 15", APP), 0xFFF0: ("JPG0", "Extension 0", None), 0xFFF1: ("JPG1", "Extension 1", None), 0xFFF2: ("JPG2", "Extension 2", None), 0xFFF3: ("JPG3", "Extension 3", None), 0xFFF4: ("JPG4", "Extension 4", None), 0xFFF5: ("JPG5", "Extension 5", None), 0xFFF6: ("JPG6", "Extension 6", None), 0xFFF7: ("JPG7", "Extension 7", None), 0xFFF8: ("JPG8", "Extension 8", None), 0xFFF9: ("JPG9", "Extension 9", None), 0xFFFA: ("JPG10", "Extension 10", None), 0xFFFB: ("JPG11", "Extension 11", None), 0xFFFC: ("JPG12", "Extension 12", None), 0xFFFD: ("JPG13", "Extension 13", None), 0xFFFE: ("COM", "Comment", COM) } def _accept(prefix): return prefix[0:1] == b"\377" ## # Image plugin for JPEG and JFIF images. class JpegImageFile(ImageFile.ImageFile): format = "JPEG" format_description = "JPEG (ISO 10918)" def _open(self): s = self.fp.read(1) if i8(s[0]) != 255: raise SyntaxError("not a JPEG file") # Create attributes self.bits = self.layers = 0 # JPEG specifics (internal) self.layer = [] self.huffman_dc = {} self.huffman_ac = {} self.quantization = {} self.app = {} # compatibility self.applist = [] self.icclist = [] while True: s = s + self.fp.read(1) i = i16(s) if i in MARKER: name, description, handler = MARKER[i] # print hex(i), name, description if handler is not None: handler(self, i) if i == 0xFFDA: # start of scan rawmode = self.mode if self.mode == "CMYK": rawmode = "CMYK;I" # assume adobe conventions self.tile = [("jpeg", (0,0) + self.size, 0, (rawmode, ""))] # self.__offset = self.fp.tell() break s = self.fp.read(1) elif i == 0 or i == 65535: # padded marker or junk; move on s = "\xff" else: raise SyntaxError("no marker found") def draft(self, mode, size): if len(self.tile) != 1: return d, e, o, a = self.tile[0] scale = 0 if a[0] == "RGB" and mode in ["L", "YCbCr"]: self.mode = mode a = mode, "" if size: scale = max(self.size[0] // size[0], self.size[1] // size[1]) for s in [8, 4, 2, 1]: if scale >= s: break e = e[0], e[1], (e[2]-e[0]+s-1)//s+e[0], (e[3]-e[1]+s-1)//s+e[1] self.size = ((self.size[0]+s-1)//s, (self.size[1]+s-1)//s) scale = s self.tile = [(d, e, o, a)] self.decoderconfig = (scale, 1) return self def load_djpeg(self): # ALTERNATIVE: handle JPEGs via the IJG command line utilities import tempfile, os file = tempfile.mktemp() os.system("djpeg %s >%s" % (self.filename, file)) try: self.im = Image.core.open_ppm(file) finally: try: os.unlink(file) except: pass self.mode = self.im.mode self.size = self.im.size self.tile = [] def _getexif(self): return _getexif(self) def _getexif(self): # Extract EXIF information. This method is highly experimental, # and is likely to be replaced with something better in a future # version. from PIL import TiffImagePlugin import io def fixup(value): if len(value) == 1: return value[0] return value # The EXIF record consists of a TIFF file embedded in a JPEG # application marker (!). try: data = self.info["exif"] except KeyError: return None file = io.BytesIO(data[6:]) head = file.read(8) exif = {} # process dictionary info = TiffImagePlugin.ImageFileDirectory(head) info.load(file) for key, value in info.items(): exif[key] = fixup(value) # get exif extension try: file.seek(exif[0x8769]) except KeyError: pass else: info = TiffImagePlugin.ImageFileDirectory(head) info.load(file) for key, value in info.items(): exif[key] = fixup(value) # get gpsinfo extension try: file.seek(exif[0x8825]) except KeyError: pass else: info = TiffImagePlugin.ImageFileDirectory(head) info.load(file) exif[0x8825] = gps = {} for key, value in info.items(): gps[key] = fixup(value) return exif # -------------------------------------------------------------------- # stuff to save JPEG files RAWMODE = { "1": "L", "L": "L", "RGB": "RGB", "RGBA": "RGB", "RGBX": "RGB", "CMYK": "CMYK;I", # assume adobe conventions "YCbCr": "YCbCr", } zigzag_index = ( 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63) samplings = { (1, 1, 1, 1, 1, 1): 0, (2, 1, 1, 1, 1, 1): 1, (2, 2, 1, 1, 1, 1): 2, } def convert_dict_qtables(qtables): qtables = [qtables[key] for key in xrange(len(qtables)) if qtables.has_key(key)] for idx, table in enumerate(qtables): qtables[idx] = [table[i] for i in zigzag_index] return qtables def get_sampling(im): sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] return samplings.get(sampling, -1) def _save(im, fp, filename): try: rawmode = RAWMODE[im.mode] except KeyError: raise IOError("cannot write mode %s as JPEG" % im.mode) info = im.encoderinfo dpi = info.get("dpi", (0, 0)) quality = info.get("quality", 0) subsampling = info.get("subsampling", -1) qtables = info.get("qtables") if quality == "keep": quality = 0 subsampling = "keep" qtables = "keep" elif quality in presets: preset = presets[quality] quality = 0 subsampling = preset.get('subsampling', -1) qtables = preset.get('quantization') elif not isinstance(quality, int): raise ValueError("Invalid quality setting") else: if subsampling in presets: subsampling = presets[subsampling].get('subsampling', -1) if qtables in presets: qtables = presets[qtables].get('quantization') if subsampling == "4:4:4": subsampling = 0 elif subsampling == "4:2:2": subsampling = 1 elif subsampling == "4:1:1": subsampling = 2 elif subsampling == "keep": if im.format != "JPEG": raise ValueError("Cannot use 'keep' when original image is not a JPEG") subsampling = get_sampling(im) def validate_qtables(qtables): if qtables is None: return qtables if isStringType(qtables): try: lines = [int(num) for line in qtables.splitlines() for num in line.split('#', 1)[0].split()] except ValueError: raise ValueError("Invalid quantization table") else: qtables = [lines[s:s+64] for s in xrange(0, len(lines), 64)] if isinstance(qtables, (tuple, list, dict)): if isinstance(qtables, dict): qtables = convert_dict_qtables(qtables) elif isinstance(qtables, tuple): qtables = list(qtables) if not (0 < len(qtables) < 5): raise ValueError("None or too many quantization tables") for idx, table in enumerate(qtables): try: if len(table) != 64: raise table = array.array('b', table) except TypeError: raise ValueError("Invalid quantization table") else: qtables[idx] = list(table) return qtables if qtables == "keep": if im.format != "JPEG": raise ValueError("Cannot use 'keep' when original image is not a JPEG") qtables = getattr(im, "quantization", None) qtables = validate_qtables(qtables) extra = b"" icc_profile = info.get("icc_profile") if icc_profile: ICC_OVERHEAD_LEN = 14 MAX_BYTES_IN_MARKER = 65533 MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN markers = [] while icc_profile: markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] i = 1 for marker in markers: size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) extra = extra + (b"\xFF\xE2" + size + b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) + marker) i = i + 1 # get keyword arguments im.encoderconfig = ( quality, # "progressive" is the official name, but older documentation # says "progression" # FIXME: issue a warning if the wrong form is used (post-1.1.7) "progressive" in info or "progression" in info, info.get("smooth", 0), "optimize" in info, info.get("streamtype", 0), dpi[0], dpi[1], subsampling, qtables, extra, info.get("exif", b"") ) # if we optimize, libjpeg needs a buffer big enough to hold the whole image in a shot. # Guessing on the size, at im.size bytes. (raw pizel size is channels*size, this # is a value that's been used in a django patch. # https://github.com/jdriscoll/django-imagekit/issues/50 bufsize=0 if "optimize" in info or "progressive" in info or "progression" in info: bufsize = im.size[0]*im.size[1] # The exif info needs to be written as one block, + APP1, + one spare byte. # Ensure that our buffer is big enough bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif",b"")) + 5 ) ImageFile._save(im, fp, [("jpeg", (0,0)+im.size, 0, rawmode)], bufsize) def _save_cjpeg(im, fp, filename): # ALTERNATIVE: handle JPEGs via the IJG command line utilities. import os file = im._dump() os.system("cjpeg %s >%s" % (file, filename)) try: os.unlink(file) except: pass # -------------------------------------------------------------------q- # Registry stuff Image.register_open("JPEG", JpegImageFile, _accept) Image.register_save("JPEG", _save) Image.register_extension("JPEG", ".jfif") Image.register_extension("JPEG", ".jpe") Image.register_extension("JPEG", ".jpg") Image.register_extension("JPEG", ".jpeg") Image.register_mime("JPEG", "image/jpeg") pillow-2.3.0/PIL/PngImagePlugin.py0000644000175000001440000004552612257511240015554 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PNG support code # # See "PNG (Portable Network Graphics) Specification, version 1.0; # W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). # # history: # 1996-05-06 fl Created (couldn't resist it) # 1996-12-14 fl Upgraded, added read and verify support (0.2) # 1996-12-15 fl Separate PNG stream parser # 1996-12-29 fl Added write support, added getchunks # 1996-12-30 fl Eliminated circular references in decoder (0.3) # 1998-07-12 fl Read/write 16-bit images as mode I (0.4) # 2001-02-08 fl Added transparency support (from Zircon) (0.5) # 2001-04-16 fl Don't close data source in "open" method (0.6) # 2004-02-24 fl Don't even pretend to support interlaced files (0.7) # 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) # 2004-09-20 fl Added PngInfo chunk container # 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) # 2008-08-13 fl Added tRNS support for RGB images # 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) # 2009-03-08 fl Added zTXT support (from Lowell Alleman) # 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) # # Copyright (c) 1997-2009 by Secret Labs AB # Copyright (c) 1996 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from __future__ import print_function __version__ = "0.9" import re from PIL import Image, ImageFile, ImagePalette, _binary import zlib i8 = _binary.i8 i16 = _binary.i16be i32 = _binary.i32be is_cid = re.compile(b"\w\w\w\w").match _MAGIC = b"\211PNG\r\n\032\n" _MODES = { # supported bits/color combinations, and corresponding modes/rawmodes (1, 0): ("1", "1"), (2, 0): ("L", "L;2"), (4, 0): ("L", "L;4"), (8, 0): ("L", "L"), (16,0): ("I", "I;16B"), (8, 2): ("RGB", "RGB"), (16,2): ("RGB", "RGB;16B"), (1, 3): ("P", "P;1"), (2, 3): ("P", "P;2"), (4, 3): ("P", "P;4"), (8, 3): ("P", "P"), (8, 4): ("LA", "LA"), (16,4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available (8, 6): ("RGBA", "RGBA"), (16,6): ("RGBA", "RGBA;16B"), } _simple_palette = re.compile(b'^\xff+\x00\xff*$') # -------------------------------------------------------------------- # Support classes. Suitable for PNG and related formats like MNG etc. class ChunkStream: def __init__(self, fp): self.fp = fp self.queue = [] if not hasattr(Image.core, "crc32"): self.crc = self.crc_skip def read(self): "Fetch a new chunk. Returns header information." if self.queue: cid, pos, len = self.queue[-1] del self.queue[-1] self.fp.seek(pos) else: s = self.fp.read(8) cid = s[4:] pos = self.fp.tell() len = i32(s) if not is_cid(cid): raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) return cid, pos, len def close(self): self.queue = self.crc = self.fp = None def push(self, cid, pos, len): self.queue.append((cid, pos, len)) def call(self, cid, pos, len): "Call the appropriate chunk handler" if Image.DEBUG: print("STREAM", cid, pos, len) return getattr(self, "chunk_" + cid.decode('ascii'))(pos, len) def crc(self, cid, data): "Read and verify checksum" crc1 = Image.core.crc32(data, Image.core.crc32(cid)) crc2 = i16(self.fp.read(2)), i16(self.fp.read(2)) if crc1 != crc2: raise SyntaxError("broken PNG file"\ "(bad header checksum in %s)" % cid) def crc_skip(self, cid, data): "Read checksum. Used if the C module is not present" self.fp.read(4) def verify(self, endchunk = b"IEND"): # Simple approach; just calculate checksum for all remaining # blocks. Must be called directly after open. cids = [] while True: cid, pos, len = self.read() if cid == endchunk: break self.crc(cid, ImageFile._safe_read(self.fp, len)) cids.append(cid) return cids # -------------------------------------------------------------------- # PNG chunk container (for use with save(pnginfo=)) class PngInfo: def __init__(self): self.chunks = [] def add(self, cid, data): self.chunks.append((cid, data)) def add_text(self, key, value, zip=0): # The tEXt chunk stores latin-1 text if not isinstance(key, bytes): key = key.encode('latin-1', 'strict') if not isinstance(value, bytes): value = value.encode('latin-1', 'replace') if zip: import zlib self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) else: self.add(b"tEXt", key + b"\0" + value) # -------------------------------------------------------------------- # PNG image stream (IHDR/IEND) class PngStream(ChunkStream): def __init__(self, fp): ChunkStream.__init__(self, fp) # local copies of Image attributes self.im_info = {} self.im_text = {} self.im_size = (0,0) self.im_mode = None self.im_tile = None self.im_palette = None def chunk_iCCP(self, pos, len): # ICC profile s = ImageFile._safe_read(self.fp, len) # according to PNG spec, the iCCP chunk contains: # Profile name 1-79 bytes (character string) # Null separator 1 byte (null character) # Compression method 1 byte (0) # Compressed profile n bytes (zlib with deflate compression) i = s.find(b"\0") if Image.DEBUG: print("iCCP profile name", s[:i]) print("Compression method", i8(s[i])) comp_method = i8(s[i]) if comp_method != 0: raise SyntaxError("Unknown compression method %s in iCCP chunk" % comp_method) try: icc_profile = zlib.decompress(s[i+2:]) except zlib.error: icc_profile = None # FIXME self.im_info["icc_profile"] = icc_profile return s def chunk_IHDR(self, pos, len): # image header s = ImageFile._safe_read(self.fp, len) self.im_size = i32(s), i32(s[4:]) try: self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))] except: pass if i8(s[12]): self.im_info["interlace"] = 1 if i8(s[11]): raise SyntaxError("unknown filter category") return s def chunk_IDAT(self, pos, len): # image data self.im_tile = [("zip", (0,0)+self.im_size, pos, self.im_rawmode)] self.im_idat = len raise EOFError def chunk_IEND(self, pos, len): # end of PNG image raise EOFError def chunk_PLTE(self, pos, len): # palette s = ImageFile._safe_read(self.fp, len) if self.im_mode == "P": self.im_palette = "RGB", s return s def chunk_tRNS(self, pos, len): # transparency s = ImageFile._safe_read(self.fp, len) if self.im_mode == "P": if _simple_palette.match(s): i = s.find(b"\0") if i >= 0: self.im_info["transparency"] = i else: self.im_info["transparency"] = s elif self.im_mode == "L": self.im_info["transparency"] = i16(s) elif self.im_mode == "RGB": self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) return s def chunk_gAMA(self, pos, len): # gamma setting s = ImageFile._safe_read(self.fp, len) self.im_info["gamma"] = i32(s) / 100000.0 return s def chunk_pHYs(self, pos, len): # pixels per unit s = ImageFile._safe_read(self.fp, len) px, py = i32(s), i32(s[4:]) unit = i8(s[8]) if unit == 1: # meter dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) self.im_info["dpi"] = dpi elif unit == 0: self.im_info["aspect"] = px, py return s def chunk_tEXt(self, pos, len): # text s = ImageFile._safe_read(self.fp, len) try: k, v = s.split(b"\0", 1) except ValueError: k = s; v = b"" # fallback for broken tEXt tags if k: if bytes is not str: k = k.decode('latin-1', 'strict') v = v.decode('latin-1', 'replace') self.im_info[k] = self.im_text[k] = v return s def chunk_zTXt(self, pos, len): # compressed text s = ImageFile._safe_read(self.fp, len) try: k, v = s.split(b"\0", 1) except ValueError: k = s; v = b"" if v: comp_method = i8(v[0]) else: comp_method = 0 if comp_method != 0: raise SyntaxError("Unknown compression method %s in zTXt chunk" % comp_method) import zlib try: v = zlib.decompress(v[1:]) except zlib.error: v = b"" if k: if bytes is not str: k = k.decode('latin-1', 'strict') v = v.decode('latin-1', 'replace') self.im_info[k] = self.im_text[k] = v return s # -------------------------------------------------------------------- # PNG reader def _accept(prefix): return prefix[:8] == _MAGIC ## # Image plugin for PNG images. class PngImageFile(ImageFile.ImageFile): format = "PNG" format_description = "Portable network graphics" def _open(self): if self.fp.read(8) != _MAGIC: raise SyntaxError("not a PNG file") # # Parse headers up to the first IDAT chunk self.png = PngStream(self.fp) while True: # # get next chunk cid, pos, len = self.png.read() try: s = self.png.call(cid, pos, len) except EOFError: break except AttributeError: if Image.DEBUG: print(cid, pos, len, "(unknown)") s = ImageFile._safe_read(self.fp, len) self.png.crc(cid, s) # # Copy relevant attributes from the PngStream. An alternative # would be to let the PngStream class modify these attributes # directly, but that introduces circular references which are # difficult to break if things go wrong in the decoder... # (believe me, I've tried ;-) self.mode = self.png.im_mode self.size = self.png.im_size self.info = self.png.im_info self.text = self.png.im_text # experimental self.tile = self.png.im_tile if self.png.im_palette: rawmode, data = self.png.im_palette self.palette = ImagePalette.raw(rawmode, data) self.__idat = len # used by load_read() def verify(self): "Verify PNG file" if self.fp is None: raise RuntimeError("verify must be called directly after open") # back up to beginning of IDAT block self.fp.seek(self.tile[0][2] - 8) self.png.verify() self.png.close() self.fp = None def load_prepare(self): "internal: prepare to read PNG file" if self.info.get("interlace"): self.decoderconfig = self.decoderconfig + (1,) ImageFile.ImageFile.load_prepare(self) def load_read(self, bytes): "internal: read more image data" while self.__idat == 0: # end of chunk, skip forward to next one self.fp.read(4) # CRC cid, pos, len = self.png.read() if cid not in [b"IDAT", b"DDAT"]: self.png.push(cid, pos, len) return b"" self.__idat = len # empty chunks are allowed # read more data from this chunk if bytes <= 0: bytes = self.__idat else: bytes = min(bytes, self.__idat) self.__idat = self.__idat - bytes return self.fp.read(bytes) def load_end(self): "internal: finished reading image data" self.png.close() self.png = None # -------------------------------------------------------------------- # PNG writer o8 = _binary.o8 o16 = _binary.o16be o32 = _binary.o32be _OUTMODES = { # supported PIL modes, and corresponding rawmodes/bits/color combinations "1": ("1", b'\x01\x00'), "L;1": ("L;1", b'\x01\x00'), "L;2": ("L;2", b'\x02\x00'), "L;4": ("L;4", b'\x04\x00'), "L": ("L", b'\x08\x00'), "LA": ("LA", b'\x08\x04'), "I": ("I;16B", b'\x10\x00'), "P;1": ("P;1", b'\x01\x03'), "P;2": ("P;2", b'\x02\x03'), "P;4": ("P;4", b'\x04\x03'), "P": ("P", b'\x08\x03'), "RGB": ("RGB", b'\x08\x02'), "RGBA":("RGBA", b'\x08\x06'), } def putchunk(fp, cid, *data): "Write a PNG chunk (including CRC field)" data = b"".join(data) fp.write(o32(len(data)) + cid) fp.write(data) hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) fp.write(o16(hi) + o16(lo)) class _idat: # wrap output from the encoder in IDAT chunks def __init__(self, fp, chunk): self.fp = fp self.chunk = chunk def write(self, data): self.chunk(self.fp, b"IDAT", data) def _save(im, fp, filename, chunk=putchunk, check=0): # save an image to disk (called by the save method) mode = im.mode if mode == "P": # # attempt to minimize storage requirements for palette images if "bits" in im.encoderinfo: # number of bits specified by user colors = 1 << im.encoderinfo["bits"] else: # check palette contents if im.palette: colors = len(im.palette.getdata()[1])//3 else: colors = 256 if colors <= 2: bits = 1 elif colors <= 4: bits = 2 elif colors <= 16: bits = 4 else: bits = 8 if bits != 8: mode = "%s;%d" % (mode, bits) # encoder options if "dictionary" in im.encoderinfo: dictionary = im.encoderinfo["dictionary"] else: dictionary = b"" im.encoderconfig = ("optimize" in im.encoderinfo, im.encoderinfo.get("compress_level", -1), im.encoderinfo.get("compress_type", -1), dictionary) # get the corresponding PNG mode try: rawmode, mode = _OUTMODES[mode] except KeyError: raise IOError("cannot write mode %s as PNG" % mode) if check: return check # # write minimal PNG file fp.write(_MAGIC) chunk(fp, b"IHDR", o32(im.size[0]), o32(im.size[1]), # 0: size mode, # 8: depth/type b'\0', # 10: compression b'\0', # 11: filter category b'\0') # 12: interlace flag if im.mode == "P": palette_byte_number = (2 ** bits) * 3 palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] while len(palette_bytes) < palette_byte_number: palette_bytes += b'\0' chunk(fp, b"PLTE", palette_bytes) transparency = im.encoderinfo.get('transparency',im.info.get('transparency', None)) if transparency: if im.mode == "P": # limit to actual palette size alpha_bytes = 2**bits if isinstance(transparency, bytes): chunk(fp, b"tRNS", transparency[:alpha_bytes]) else: transparency = max(0, min(255, transparency)) alpha = b'\xFF' * transparency + b'\0' chunk(fp, b"tRNS", alpha[:alpha_bytes]) elif im.mode == "L": transparency = max(0, min(65535, transparency)) chunk(fp, b"tRNS", o16(transparency)) elif im.mode == "RGB": red, green, blue = transparency chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) else: if "transparency" in im.encoderinfo: # don't bother with transparency if it's an RGBA # and it's in the info dict. It's probably just stale. raise IOError("cannot use transparency for this mode") else: if im.mode == "P" and im.im.getpalettemode() == "RGBA": alpha = im.im.getpalette("RGBA", "A") alpha_bytes = 2**bits chunk(fp, b"tRNS", alpha[:alpha_bytes]) if 0: # FIXME: to be supported some day chunk(fp, b"gAMA", o32(int(gamma * 100000.0))) dpi = im.encoderinfo.get("dpi") if dpi: chunk(fp, b"pHYs", o32(int(dpi[0] / 0.0254 + 0.5)), o32(int(dpi[1] / 0.0254 + 0.5)), b'\x01') info = im.encoderinfo.get("pnginfo") if info: for cid, data in info.chunks: chunk(fp, cid, data) # ICC profile writing support -- 2008-06-06 Florian Hoech if "icc_profile" in im.info: # ICC profile # according to PNG spec, the iCCP chunk contains: # Profile name 1-79 bytes (character string) # Null separator 1 byte (null character) # Compression method 1 byte (0) # Compressed profile n bytes (zlib with deflate compression) try: import ICCProfile p = ICCProfile.ICCProfile(im.info["icc_profile"]) name = p.tags.desc.get("ASCII", p.tags.desc.get("Unicode", p.tags.desc.get("Macintosh", p.tags.desc.get("en", {}).get("US", "ICC Profile")))).encode("latin1", "replace")[:79] except ImportError: name = b"ICC Profile" data = name + b"\0\0" + zlib.compress(im.info["icc_profile"]) chunk(fp, b"iCCP", data) ImageFile._save(im, _idat(fp, chunk), [("zip", (0,0)+im.size, 0, rawmode)]) chunk(fp, b"IEND", b"") try: fp.flush() except: pass # -------------------------------------------------------------------- # PNG chunk converter def getchunks(im, **params): """Return a list of PNG chunks representing this image.""" class collector: data = [] def write(self, data): pass def append(self, chunk): self.data.append(chunk) def append(fp, cid, *data): data = b"".join(data) hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) crc = o16(hi) + o16(lo) fp.append((cid, data, crc)) fp = collector() try: im.encoderinfo = params _save(im, fp, None, append) finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry Image.register_open("PNG", PngImageFile, _accept) Image.register_save("PNG", _save) Image.register_extension("PNG", ".png") Image.register_mime("PNG", "image/png") pillow-2.3.0/PIL/XpmImagePlugin.py0000644000175000001440000000601612257506326015574 0ustar dokousers# # The Python Imaging Library. # $Id$ # # XPM File handling # # History: # 1996-12-29 fl Created # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) # # Copyright (c) Secret Labs AB 1997-2001. # Copyright (c) Fredrik Lundh 1996-2001. # # See the README file for information on usage and redistribution. # __version__ = "0.2" import re from PIL import Image, ImageFile, ImagePalette from PIL._binary import i8, o8 # XPM header xpm_head = re.compile(b"\"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)") def _accept(prefix): return prefix[:9] == b"/* XPM */" ## # Image plugin for X11 pixel maps. class XpmImageFile(ImageFile.ImageFile): format = "XPM" format_description = "X11 Pixel Map" def _open(self): if not _accept(self.fp.read(9)): raise SyntaxError("not an XPM file") # skip forward to next string while True: s = self.fp.readline() if not s: raise SyntaxError("broken XPM file") m = xpm_head.match(s) if m: break self.size = int(m.group(1)), int(m.group(2)) pal = int(m.group(3)) bpp = int(m.group(4)) if pal > 256 or bpp != 1: raise ValueError("cannot read this XPM file") # # load palette description palette = [b"\0\0\0"] * 256 for i in range(pal): s = self.fp.readline() if s[-2:] == b'\r\n': s = s[:-2] elif s[-1:] in b'\r\n': s = s[:-1] c = i8(s[1]) s = s[2:-2].split() for i in range(0, len(s), 2): if s[i] == b"c": # process colour key rgb = s[i+1] if rgb == b"None": self.info["transparency"] = c elif rgb[0:1] == b"#": # FIXME: handle colour names (see ImagePalette.py) rgb = int(rgb[1:], 16) palette[c] = o8((rgb >> 16) & 255) +\ o8((rgb >> 8) & 255) +\ o8(rgb & 255) else: # unknown colour raise ValueError("cannot read this XPM file") break else: # missing colour key raise ValueError("cannot read this XPM file") self.mode = "P" self.palette = ImagePalette.raw("RGB", b"".join(palette)) self.tile = [("raw", (0, 0)+self.size, self.fp.tell(), ("P", 0, 1))] def load_read(self, bytes): # # load all image data in one chunk xsize, ysize = self.size s = [None] * ysize for i in range(ysize): s[i] = self.fp.readline()[1:xsize+1].ljust(xsize) self.fp = None return b"".join(s) # # Registry Image.register_open("XPM", XpmImageFile, _accept) Image.register_extension("XPM", ".xpm") Image.register_mime("XPM", "image/xpm") pillow-2.3.0/PIL/ImageColor.py0000644000175000001440000001762512257506326014737 0ustar dokousers# # The Python Imaging Library # $Id$ # # map CSS3-style colour description strings to RGB # # History: # 2002-10-24 fl Added support for CSS-style color strings # 2002-12-15 fl Added RGBA support # 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 # 2004-07-19 fl Fixed gray/grey spelling issues # 2009-03-05 fl Fixed rounding error in grayscale calculation # # Copyright (c) 2002-2004 by Secret Labs AB # Copyright (c) 2002-2004 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image import re ## # Convert color string to RGB tuple. # # @param color A CSS3-style colour string. # @return An RGB-tuple. # @exception ValueError If the color string could not be interpreted # as an RGB value. def getrgb(color): """ Convert a color string to an RGB tuple. If the string cannot be parsed, this function raises a :py:exc:`ValueError` exception. .. versionadded:: 1.1.4 :param color: A color string :return: ``(red, green, blue)`` """ try: rgb = colormap[color] except KeyError: try: # fall back on case-insensitive lookup rgb = colormap[color.lower()] except KeyError: rgb = None # found color in cache if rgb: if isinstance(rgb, tuple): return rgb colormap[color] = rgb = getrgb(rgb) return rgb # check for known string formats m = re.match("#\w\w\w$", color) if m: return ( int(color[1]*2, 16), int(color[2]*2, 16), int(color[3]*2, 16) ) m = re.match("#\w\w\w\w\w\w$", color) if m: return ( int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) ) m = re.match("rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) if m: return ( int(m.group(1)), int(m.group(2)), int(m.group(3)) ) m = re.match("rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) if m: return ( int((int(m.group(1)) * 255) / 100.0 + 0.5), int((int(m.group(2)) * 255) / 100.0 + 0.5), int((int(m.group(3)) * 255) / 100.0 + 0.5) ) m = re.match("hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) if m: from colorsys import hls_to_rgb rgb = hls_to_rgb( float(m.group(1)) / 360.0, float(m.group(3)) / 100.0, float(m.group(2)) / 100.0, ) return ( int(rgb[0] * 255 + 0.5), int(rgb[1] * 255 + 0.5), int(rgb[2] * 255 + 0.5) ) m = re.match("rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) if m: return ( int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) ) raise ValueError("unknown color specifier: %r" % color) def getcolor(color, mode): """ Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a greyscale value if the mode is not color or a palette image. If the string cannot be parsed, this function raises a :py:exc:`ValueError` exception. .. versionadded:: 1.1.4 :param color: A color string :return: ``(red, green, blue)`` """ # same as getrgb, but converts the result to the given mode color = getrgb(color) if mode == "RGB": return color if mode == "RGBA": if len(color) == 3: color = (color + (255,)) r, g, b, a = color return r, g, b, a if Image.getmodebase(mode) == "L": r, g, b = color return (r*299 + g*587 + b*114)//1000 return color colormap = { # X11 colour table (from "CSS3 module: Color working draft"), with # gray/grey spelling issues fixed. This is a superset of HTML 4.0 # colour names used in CSS 1. "aliceblue": "#f0f8ff", "antiquewhite": "#faebd7", "aqua": "#00ffff", "aquamarine": "#7fffd4", "azure": "#f0ffff", "beige": "#f5f5dc", "bisque": "#ffe4c4", "black": "#000000", "blanchedalmond": "#ffebcd", "blue": "#0000ff", "blueviolet": "#8a2be2", "brown": "#a52a2a", "burlywood": "#deb887", "cadetblue": "#5f9ea0", "chartreuse": "#7fff00", "chocolate": "#d2691e", "coral": "#ff7f50", "cornflowerblue": "#6495ed", "cornsilk": "#fff8dc", "crimson": "#dc143c", "cyan": "#00ffff", "darkblue": "#00008b", "darkcyan": "#008b8b", "darkgoldenrod": "#b8860b", "darkgray": "#a9a9a9", "darkgrey": "#a9a9a9", "darkgreen": "#006400", "darkkhaki": "#bdb76b", "darkmagenta": "#8b008b", "darkolivegreen": "#556b2f", "darkorange": "#ff8c00", "darkorchid": "#9932cc", "darkred": "#8b0000", "darksalmon": "#e9967a", "darkseagreen": "#8fbc8f", "darkslateblue": "#483d8b", "darkslategray": "#2f4f4f", "darkslategrey": "#2f4f4f", "darkturquoise": "#00ced1", "darkviolet": "#9400d3", "deeppink": "#ff1493", "deepskyblue": "#00bfff", "dimgray": "#696969", "dimgrey": "#696969", "dodgerblue": "#1e90ff", "firebrick": "#b22222", "floralwhite": "#fffaf0", "forestgreen": "#228b22", "fuchsia": "#ff00ff", "gainsboro": "#dcdcdc", "ghostwhite": "#f8f8ff", "gold": "#ffd700", "goldenrod": "#daa520", "gray": "#808080", "grey": "#808080", "green": "#008000", "greenyellow": "#adff2f", "honeydew": "#f0fff0", "hotpink": "#ff69b4", "indianred": "#cd5c5c", "indigo": "#4b0082", "ivory": "#fffff0", "khaki": "#f0e68c", "lavender": "#e6e6fa", "lavenderblush": "#fff0f5", "lawngreen": "#7cfc00", "lemonchiffon": "#fffacd", "lightblue": "#add8e6", "lightcoral": "#f08080", "lightcyan": "#e0ffff", "lightgoldenrodyellow": "#fafad2", "lightgreen": "#90ee90", "lightgray": "#d3d3d3", "lightgrey": "#d3d3d3", "lightpink": "#ffb6c1", "lightsalmon": "#ffa07a", "lightseagreen": "#20b2aa", "lightskyblue": "#87cefa", "lightslategray": "#778899", "lightslategrey": "#778899", "lightsteelblue": "#b0c4de", "lightyellow": "#ffffe0", "lime": "#00ff00", "limegreen": "#32cd32", "linen": "#faf0e6", "magenta": "#ff00ff", "maroon": "#800000", "mediumaquamarine": "#66cdaa", "mediumblue": "#0000cd", "mediumorchid": "#ba55d3", "mediumpurple": "#9370db", "mediumseagreen": "#3cb371", "mediumslateblue": "#7b68ee", "mediumspringgreen": "#00fa9a", "mediumturquoise": "#48d1cc", "mediumvioletred": "#c71585", "midnightblue": "#191970", "mintcream": "#f5fffa", "mistyrose": "#ffe4e1", "moccasin": "#ffe4b5", "navajowhite": "#ffdead", "navy": "#000080", "oldlace": "#fdf5e6", "olive": "#808000", "olivedrab": "#6b8e23", "orange": "#ffa500", "orangered": "#ff4500", "orchid": "#da70d6", "palegoldenrod": "#eee8aa", "palegreen": "#98fb98", "paleturquoise": "#afeeee", "palevioletred": "#db7093", "papayawhip": "#ffefd5", "peachpuff": "#ffdab9", "peru": "#cd853f", "pink": "#ffc0cb", "plum": "#dda0dd", "powderblue": "#b0e0e6", "purple": "#800080", "red": "#ff0000", "rosybrown": "#bc8f8f", "royalblue": "#4169e1", "saddlebrown": "#8b4513", "salmon": "#fa8072", "sandybrown": "#f4a460", "seagreen": "#2e8b57", "seashell": "#fff5ee", "sienna": "#a0522d", "silver": "#c0c0c0", "skyblue": "#87ceeb", "slateblue": "#6a5acd", "slategray": "#708090", "slategrey": "#708090", "snow": "#fffafa", "springgreen": "#00ff7f", "steelblue": "#4682b4", "tan": "#d2b48c", "teal": "#008080", "thistle": "#d8bfd8", "tomato": "#ff6347", "turquoise": "#40e0d0", "violet": "#ee82ee", "wheat": "#f5deb3", "white": "#ffffff", "whitesmoke": "#f5f5f5", "yellow": "#ffff00", "yellowgreen": "#9acd32", } pillow-2.3.0/PIL/ImImagePlugin.py0000644000175000001440000002345712257506326015405 0ustar dokousers# # The Python Imaging Library. # $Id$ # # IFUNC IM file handling for PIL # # history: # 1995-09-01 fl Created. # 1997-01-03 fl Save palette images # 1997-01-08 fl Added sequence support # 1997-01-23 fl Added P and RGB save support # 1997-05-31 fl Read floating point images # 1997-06-22 fl Save floating point images # 1997-08-27 fl Read and save 1-bit images # 1998-06-25 fl Added support for RGB+LUT images # 1998-07-02 fl Added support for YCC images # 1998-07-15 fl Renamed offset attribute to avoid name clash # 1998-12-29 fl Added I;16 support # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) # 2003-09-26 fl Added LA/PA support # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1995-2001 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # __version__ = "0.7" import re from PIL import Image, ImageFile, ImagePalette from PIL._binary import i8, o8 # -------------------------------------------------------------------- # Standard tags COMMENT = "Comment" DATE = "Date" EQUIPMENT = "Digitalization equipment" FRAMES = "File size (no of images)" LUT = "Lut" NAME = "Name" SCALE = "Scale (x,y)" SIZE = "Image size (x*y)" MODE = "Image type" TAGS = { COMMENT:0, DATE:0, EQUIPMENT:0, FRAMES:0, LUT:0, NAME:0, SCALE:0, SIZE:0, MODE:0 } OPEN = { # ifunc93/p3cfunc formats "0 1 image": ("1", "1"), "L 1 image": ("1", "1"), "Greyscale image": ("L", "L"), "Grayscale image": ("L", "L"), "RGB image": ("RGB", "RGB;L"), "RLB image": ("RGB", "RLB"), "RYB image": ("RGB", "RLB"), "B1 image": ("1", "1"), "B2 image": ("P", "P;2"), "B4 image": ("P", "P;4"), "X 24 image": ("RGB", "RGB"), "L 32 S image": ("I", "I;32"), "L 32 F image": ("F", "F;32"), # old p3cfunc formats "RGB3 image": ("RGB", "RGB;T"), "RYB3 image": ("RGB", "RYB;T"), # extensions "LA image": ("LA", "LA;L"), "RGBA image": ("RGBA", "RGBA;L"), "RGBX image": ("RGBX", "RGBX;L"), "CMYK image": ("CMYK", "CMYK;L"), "YCC image": ("YCbCr", "YCbCr;L"), } # ifunc95 extensions for i in ["8", "8S", "16", "16S", "32", "32F"]: OPEN["L %s image" % i] = ("F", "F;%s" % i) OPEN["L*%s image" % i] = ("F", "F;%s" % i) for i in ["16", "16L", "16B"]: OPEN["L %s image" % i] = ("I;%s" % i, "I;%s" % i) OPEN["L*%s image" % i] = ("I;%s" % i, "I;%s" % i) for i in ["32S"]: OPEN["L %s image" % i] = ("I", "I;%s" % i) OPEN["L*%s image" % i] = ("I", "I;%s" % i) for i in range(2, 33): OPEN["L*%s image" % i] = ("F", "F;%s" % i) # -------------------------------------------------------------------- # Read IM directory split = re.compile(br"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") def number(s): try: return int(s) except ValueError: return float(s) ## # Image plugin for the IFUNC IM file format. class ImImageFile(ImageFile.ImageFile): format = "IM" format_description = "IFUNC Image Memory" def _open(self): # Quick rejection: if there's not an LF among the first # 100 bytes, this is (probably) not a text header. if not b"\n" in self.fp.read(100): raise SyntaxError("not an IM file") self.fp.seek(0) n = 0 # Default values self.info[MODE] = "L" self.info[SIZE] = (512, 512) self.info[FRAMES] = 1 self.rawmode = "L" while True: s = self.fp.read(1) # Some versions of IFUNC uses \n\r instead of \r\n... if s == b"\r": continue if not s or s == b'\0' or s == b'\x1A': break # FIXME: this may read whole file if not a text file s = s + self.fp.readline() if len(s) > 100: raise SyntaxError("not an IM file") if s[-2:] == b'\r\n': s = s[:-2] elif s[-1:] == b'\n': s = s[:-1] try: m = split.match(s) except re.error as v: raise SyntaxError("not an IM file") if m: k, v = m.group(1,2) # Don't know if this is the correct encoding, but a decent guess # (I guess) k = k.decode('latin-1', 'replace') v = v.decode('latin-1', 'replace') # Convert value as appropriate if k in [FRAMES, SCALE, SIZE]: v = v.replace("*", ",") v = tuple(map(number, v.split(","))) if len(v) == 1: v = v[0] elif k == MODE and v in OPEN: v, self.rawmode = OPEN[v] # Add to dictionary. Note that COMMENT tags are # combined into a list of strings. if k == COMMENT: if k in self.info: self.info[k].append(v) else: self.info[k] = [v] else: self.info[k] = v if k in TAGS: n = n + 1 else: raise SyntaxError("Syntax error in IM header: " + s.decode('ascii', 'replace')) if not n: raise SyntaxError("Not an IM file") # Basic attributes self.size = self.info[SIZE] self.mode = self.info[MODE] # Skip forward to start of image data while s and s[0:1] != b'\x1A': s = self.fp.read(1) if not s: raise SyntaxError("File truncated") if LUT in self.info: # convert lookup table to palette or lut attribute palette = self.fp.read(768) greyscale = 1 # greyscale palette linear = 1 # linear greyscale palette for i in range(256): if palette[i] == palette[i+256] == palette[i+512]: if i8(palette[i]) != i: linear = 0 else: greyscale = 0 if self.mode == "L" or self.mode == "LA": if greyscale: if not linear: self.lut = [i8(c) for c in palette[:256]] else: if self.mode == "L": self.mode = self.rawmode = "P" elif self.mode == "LA": self.mode = self.rawmode = "PA" self.palette = ImagePalette.raw("RGB;L", palette) elif self.mode == "RGB": if not greyscale or not linear: self.lut = [i8(c) for c in palette] self.frame = 0 self.__offset = offs = self.fp.tell() self.__fp = self.fp # FIXME: hack if self.rawmode[:2] == "F;": # ifunc95 formats try: # use bit decoder (if necessary) bits = int(self.rawmode[2:]) if bits not in [8, 16, 32]: self.tile = [("bit", (0,0)+self.size, offs, (bits, 8, 3, 0, -1))] return except ValueError: pass if self.rawmode in ["RGB;T", "RYB;T"]: # Old LabEye/3PC files. Would be very surprised if anyone # ever stumbled upon such a file ;-) size = self.size[0] * self.size[1] self.tile = [("raw", (0,0)+self.size, offs, ("G", 0, -1)), ("raw", (0,0)+self.size, offs+size, ("R", 0, -1)), ("raw", (0,0)+self.size, offs+2*size, ("B", 0, -1))] else: # LabEye/IFUNC files self.tile = [("raw", (0,0)+self.size, offs, (self.rawmode, 0, -1))] def seek(self, frame): if frame < 0 or frame >= self.info[FRAMES]: raise EOFError("seek outside sequence") if self.frame == frame: return self.frame = frame if self.mode == "1": bits = 1 else: bits = 8 * len(self.mode) size = ((self.size[0] * bits + 7) // 8) * self.size[1] offs = self.__offset + frame * size self.fp = self.__fp self.tile = [("raw", (0,0)+self.size, offs, (self.rawmode, 0, -1))] def tell(self): return self.frame # # -------------------------------------------------------------------- # Save IM files SAVE = { # mode: (im type, raw mode) "1": ("0 1", "1"), "L": ("Greyscale", "L"), "LA": ("LA", "LA;L"), "P": ("Greyscale", "P"), "PA": ("LA", "PA;L"), "I": ("L 32S", "I;32S"), "I;16": ("L 16", "I;16"), "I;16L": ("L 16L", "I;16L"), "I;16B": ("L 16B", "I;16B"), "F": ("L 32F", "F;32F"), "RGB": ("RGB", "RGB;L"), "RGBA": ("RGBA", "RGBA;L"), "RGBX": ("RGBX", "RGBX;L"), "CMYK": ("CMYK", "CMYK;L"), "YCbCr": ("YCC", "YCbCr;L") } def _save(im, fp, filename, check=0): try: type, rawmode = SAVE[im.mode] except KeyError: raise ValueError("Cannot save %s images as IM" % im.mode) try: frames = im.encoderinfo["frames"] except KeyError: frames = 1 if check: return check fp.write(("Image type: %s image\r\n" % type).encode('ascii')) if filename: fp.write(("Name: %s\r\n" % filename).encode('ascii')) fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode('ascii')) fp.write(("File size (no of images): %d\r\n" % frames).encode('ascii')) if im.mode == "P": fp.write(b"Lut: 1\r\n") fp.write(b"\000" * (511-fp.tell()) + b"\032") if im.mode == "P": fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, 0, -1))]) # # -------------------------------------------------------------------- # Registry Image.register_open("IM", ImImageFile) Image.register_save("IM", _save) Image.register_extension("IM", ".im") pillow-2.3.0/PIL/OleFileIO.py0000644000175000001440000003770412257506326014465 0ustar dokousers# # THIS IS WORK IN PROGRESS # # The Python Imaging Library # $Id$ # # stuff to deal with OLE2 Structured Storage files. this module is # used by PIL to read Image Composer and FlashPix files, but can also # be used to read other files of this type. # # History: # 1997-01-20 fl Created # 1997-01-22 fl Fixed 64-bit portability quirk # 2003-09-09 fl Fixed typo in OleFileIO.loadfat (noted by Daniel Haertle) # 2004-02-29 fl Changed long hex constants to signed integers # # Notes: # FIXME: sort out sign problem (eliminate long hex constants) # FIXME: change filename to use "a/b/c" instead of ["a", "b", "c"] # FIXME: provide a glob mechanism function (using fnmatchcase) # # Literature: # # "FlashPix Format Specification, Appendix A", Kodak and Microsoft, # September 1996. # # Quotes: # # "If this document and functionality of the Software conflict, # the actual functionality of the Software represents the correct # functionality" -- Microsoft, in the OLE format specification # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # from __future__ import print_function import io import sys from PIL import _binary from PIL._util import isPath if str is not bytes: long = int i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le MAGIC = b'\320\317\021\340\241\261\032\341' # # -------------------------------------------------------------------- # property types VT_EMPTY=0; VT_NULL=1; VT_I2=2; VT_I4=3; VT_R4=4; VT_R8=5; VT_CY=6; VT_DATE=7; VT_BSTR=8; VT_DISPATCH=9; VT_ERROR=10; VT_BOOL=11; VT_VARIANT=12; VT_UNKNOWN=13; VT_DECIMAL=14; VT_I1=16; VT_UI1=17; VT_UI2=18; VT_UI4=19; VT_I8=20; VT_UI8=21; VT_INT=22; VT_UINT=23; VT_VOID=24; VT_HRESULT=25; VT_PTR=26; VT_SAFEARRAY=27; VT_CARRAY=28; VT_USERDEFINED=29; VT_LPSTR=30; VT_LPWSTR=31; VT_FILETIME=64; VT_BLOB=65; VT_STREAM=66; VT_STORAGE=67; VT_STREAMED_OBJECT=68; VT_STORED_OBJECT=69; VT_BLOB_OBJECT=70; VT_CF=71; VT_CLSID=72; VT_VECTOR=0x1000; # map property id to name (for debugging purposes) VT = {} for k, v in list(vars().items()): if k[:3] == "VT_": VT[v] = k # # -------------------------------------------------------------------- # Some common document types (root.clsid fields) WORD_CLSID = "00020900-0000-0000-C000-000000000046" # # -------------------------------------------------------------------- class _OleStream(io.BytesIO): """OLE2 Stream Returns a read-only file object which can be used to read the contents of a OLE stream. To open a stream, use the openstream method in the OleFile class. This function can be used with either ordinary streams, or ministreams, depending on the offset, sectorsize, and fat table arguments. """ # FIXME: should store the list of sects obtained by following # the fat chain, and load new sectors on demand instead of # loading it all in one go. def __init__(self, fp, sect, size, offset, sectorsize, fat): data = [] while sect != -2: # 0xFFFFFFFEL: fp.seek(offset + sectorsize * sect) data.append(fp.read(sectorsize)) sect = fat[sect] data = b"".join(data) # print len(data), size io.BytesIO.__init__(self, data[:size]) # # -------------------------------------------------------------------- # FIXME: should add a counter in here to avoid looping forever # if the tree is broken. class _OleDirectoryEntry: """OLE2 Directory Entry Encapsulates a stream directory entry. Note that the constructor builds a tree of all subentries, so we only have to call it with the root object. """ def __init__(self, sidlist, sid): # store directory parameters. the caller provides # a complete list of directory entries, as read from # the directory stream. name, type, sect, size, sids, clsid = sidlist[sid] self.sid = sid self.name = name self.type = type # 1=storage 2=stream self.sect = sect self.size = size self.clsid = clsid # process child nodes, if any self.kids = [] sid = sidlist[sid][4][2] if sid != -1: # the directory entries are organized as a red-black tree. # the following piece of code does an ordered traversal of # such a tree (at least that's what I hope ;-) stack = [self.sid] # start at leftmost position left, right, child = sidlist[sid][4] while left != -1: # 0xFFFFFFFFL: stack.append(sid) sid = left left, right, child = sidlist[sid][4] while sid != self.sid: self.kids.append(_OleDirectoryEntry(sidlist, sid)) # try to move right left, right, child = sidlist[sid][4] if right != -1: # 0xFFFFFFFFL: # and then back to the left sid = right while True: left, right, child = sidlist[sid][4] if left == -1: # 0xFFFFFFFFL: break stack.append(sid) sid = left else: # couldn't move right; move up instead while True: ptr = stack[-1] del stack[-1] left, right, child = sidlist[ptr][4] if right != sid: break sid = right left, right, child = sidlist[sid][4] if right != ptr: sid = ptr # in the OLE file, entries are sorted on (length, name). # for convenience, we sort them on name instead. self.kids.sort() def __cmp__(self, other): "Compare entries by name" return cmp(self.name, other.name) def dump(self, tab = 0): "Dump this entry, and all its subentries (for debug purposes only)" TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", "(property)", "(root)"] print(" "*tab + repr(self.name), TYPES[self.type], end=' ') if self.type in (2, 5): print(self.size, "bytes", end=' ') print() if self.type in (1, 5) and self.clsid: print(" "*tab + "{%s}" % self.clsid) for kid in self.kids: kid.dump(tab + 2) # # -------------------------------------------------------------------- ## # This class encapsulates the interface to an OLE 2 structured # storage file. Use the {@link listdir} and {@link openstream} # methods to access the contents of this file. class OleFileIO: """OLE container object This class encapsulates the interface to an OLE 2 structured storage file. Use the listdir and openstream methods to access the contents of this file. Object names are given as a list of strings, one for each subentry level. The root entry should be omitted. For example, the following code extracts all image streams from a Microsoft Image Composer file:: ole = OleFileIO("fan.mic") for entry in ole.listdir(): if entry[1:2] == "Image": fin = ole.openstream(entry) fout = open(entry[0:1], "wb") while 1: s = fin.read(8192) if not s: break fout.write(s) You can use the viewer application provided with the Python Imaging Library to view the resulting files (which happens to be standard TIFF files). """ def __init__(self, filename = None): if filename: self.open(filename) ## # Open an OLE2 file. def open(self, filename): """Open an OLE2 file""" if isPath(filename): self.fp = open(filename, "rb") else: self.fp = filename header = self.fp.read(512) if len(header) != 512 or header[:8] != MAGIC: raise IOError("not an OLE2 structured storage file") # file clsid (probably never used, so we don't store it) clsid = self._clsid(header[8:24]) # FIXME: could check version and byte order fields self.sectorsize = 1 << i16(header, 30) self.minisectorsize = 1 << i16(header, 32) self.minisectorcutoff = i32(header, 56) # Load file allocation tables self.loadfat(header) # Load direcory. This sets both the sidlist (ordered by id) # and the root (ordered by hierarchy) members. self.loaddirectory(i32(header, 48)) self.ministream = None self.minifatsect = i32(header, 60) def loadfat(self, header): # Load the FAT table. The header contains a sector numbers # for the first 109 FAT sectors. Additional sectors are # described by DIF blocks (FIXME: not yet implemented) sect = header[76:512] fat = [] for i in range(0, len(sect), 4): ix = i32(sect, i) if ix == -2 or ix == -1: # ix == 0xFFFFFFFEL or ix == 0xFFFFFFFFL: break s = self.getsect(ix) fat = fat + [i32(s, i) for i in range(0, len(s), 4)] self.fat = fat def loadminifat(self): # Load the MINIFAT table. This is stored in a standard sub- # stream, pointed to by a header field. s = self._open(self.minifatsect).read() self.minifat = [i32(s, i) for i in range(0, len(s), 4)] def getsect(self, sect): # Read given sector self.fp.seek(512 + self.sectorsize * sect) return self.fp.read(self.sectorsize) def _unicode(self, s): # Map unicode string to Latin 1 if bytes is str: # Old version tried to produce a Latin-1 str return s.decode('utf-16').encode('latin-1', 'replace') else: # Provide actual Unicode string return s.decode('utf-16') def loaddirectory(self, sect): # Load the directory. The directory is stored in a standard # substream, independent of its size. # read directory stream fp = self._open(sect) # create list of sid entries self.sidlist = [] while True: entry = fp.read(128) if not entry: break type = i8(entry[66]) name = self._unicode(entry[0:0+i16(entry, 64)]) ptrs = i32(entry, 68), i32(entry, 72), i32(entry, 76) sect, size = i32(entry, 116), i32(entry, 120) clsid = self._clsid(entry[80:96]) self.sidlist.append((name, type, sect, size, ptrs, clsid)) # create hierarchical list of directory entries self.root = _OleDirectoryEntry(self.sidlist, 0) def dumpdirectory(self): # Dump directory (for debugging only) self.root.dump() def _clsid(self, clsid): if clsid == "\0" * len(clsid): return "" return (("%08X-%04X-%04X-%02X%02X-" + "%02X" * 6) % ((i32(clsid, 0), i16(clsid, 4), i16(clsid, 6)) + tuple(map(i8, clsid[8:16])))) def _list(self, files, prefix, node): # listdir helper prefix = prefix + [node.name] for entry in node.kids: if entry.kids: self._list(files, prefix, entry) else: files.append(prefix[1:] + [entry.name]) def _find(self, filename): # openstream helper node = self.root for name in filename: for kid in node.kids: if kid.name == name: break else: raise IOError("file not found") node = kid return node.sid def _open(self, start, size = 0x7FFFFFFF): # openstream helper. if size < self.minisectorcutoff: # ministream object if not self.ministream: self.loadminifat() self.ministream = self._open(self.sidlist[0][2]) return _OleStream(self.ministream, start, size, 0, self.minisectorsize, self.minifat) # standard stream return _OleStream(self.fp, start, size, 512, self.sectorsize, self.fat) ## # Returns a list of streams stored in this file. def listdir(self): """Return a list of streams stored in this file""" files = [] self._list(files, [], self.root) return files ## # Opens a stream as a read-only file object. def openstream(self, filename): """Open a stream as a read-only file object""" slot = self._find(filename) name, type, sect, size, sids, clsid = self.sidlist[slot] if type != 2: raise IOError("this file is not a stream") return self._open(sect, size) ## # Gets a list of properties described in substream. def getproperties(self, filename): """Return properties described in substream""" fp = self.openstream(filename) data = {} # header s = fp.read(28) clsid = self._clsid(s[8:24]) # format id s = fp.read(20) fmtid = self._clsid(s[:16]) fp.seek(i32(s, 16)) # get section s = "****" + fp.read(i32(fp.read(4))-4) for i in range(i32(s, 4)): id = i32(s, 8+i*8) offset = i32(s, 12+i*8) type = i32(s, offset) # test for common types first (should perhaps use # a dictionary instead?) if type == VT_I2: value = i16(s, offset+4) if value >= 32768: value = value - 65536 elif type == VT_UI2: value = i16(s, offset+4) elif type in (VT_I4, VT_ERROR): value = i32(s, offset+4) elif type == VT_UI4: value = i32(s, offset+4) # FIXME elif type in (VT_BSTR, VT_LPSTR): count = i32(s, offset+4) value = s[offset+8:offset+8+count-1] elif type == VT_BLOB: count = i32(s, offset+4) value = s[offset+8:offset+8+count] elif type == VT_LPWSTR: count = i32(s, offset+4) value = self._unicode(s[offset+8:offset+8+count*2]) elif type == VT_FILETIME: value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32) # FIXME: this is a 64-bit int: "number of 100ns periods # since Jan 1,1601". Should map this to Python time value = value // 10000000 # seconds elif type == VT_UI1: value = i8(s[offset+4]) elif type == VT_CLSID: value = self._clsid(s[offset+4:offset+20]) elif type == VT_CF: count = i32(s, offset+4) value = s[offset+8:offset+8+count] else: value = None # everything else yields "None" # FIXME: add support for VT_VECTOR #print "%08x" % id, repr(value), #print "(%s)" % VT[i32(s, offset) & 0xFFF] data[id] = value return data # # -------------------------------------------------------------------- # This script can be used to dump the directory of any OLE2 structured # storage file. if __name__ == "__main__": import sys for file in sys.argv[1:]: try: ole = OleFileIO(file) print("-" * 68) print(file) print("-" * 68) ole.dumpdirectory() for file in ole.listdir(): if file[-1][0] == "\005": print(file) props = ole.getproperties(file) props = sorted(props.items()) for k, v in props: print(" ", k, v) except IOError as v: print("***", "cannot read", file, "-", v) pillow-2.3.0/PIL/ImageDraw2.py0000644000175000001440000000616412257506326014634 0ustar dokousers# # The Python Imaging Library # $Id$ # # WCK-style drawing interface operations # # History: # 2003-12-07 fl created # 2005-05-15 fl updated; added to PIL as ImageDraw2 # 2005-05-15 fl added text support # 2005-05-20 fl added arc/chord/pieslice support # # Copyright (c) 2003-2005 by Secret Labs AB # Copyright (c) 2003-2005 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image, ImageColor, ImageDraw, ImageFont, ImagePath class Pen: def __init__(self, color, width=1, opacity=255): self.color = ImageColor.getrgb(color) self.width = width class Brush: def __init__(self, color, opacity=255): self.color = ImageColor.getrgb(color) class Font: def __init__(self, color, file, size=12): # FIXME: add support for bitmap fonts self.color = ImageColor.getrgb(color) self.font = ImageFont.truetype(file, size) class Draw: def __init__(self, image, size=None, color=None): if not hasattr(image, "im"): image = Image.new(image, size, color) self.draw = ImageDraw.Draw(image) self.image = image self.transform = None def flush(self): return self.image def render(self, op, xy, pen, brush=None): # handle color arguments outline = fill = None; width = 1 if isinstance(pen, Pen): outline = pen.color width = pen.width elif isinstance(brush, Pen): outline = brush.color width = brush.width if isinstance(brush, Brush): fill = brush.color elif isinstance(pen, Brush): fill = pen.color # handle transformation if self.transform: xy = ImagePath.Path(xy) xy.transform(self.transform) # render the item if op == "line": self.draw.line(xy, fill=outline, width=width) else: getattr(self.draw, op)(xy, fill=fill, outline=outline) def settransform(self, offset): (xoffset, yoffset) = offset self.transform = (1, 0, xoffset, 0, 1, yoffset) def arc(self, xy, start, end, *options): self.render("arc", xy, start, end, *options) def chord(self, xy, start, end, *options): self.render("chord", xy, start, end, *options) def ellipse(self, xy, *options): self.render("ellipse", xy, *options) def line(self, xy, *options): self.render("line", xy, *options) def pieslice(self, xy, start, end, *options): self.render("pieslice", xy, start, end, *options) def polygon(self, xy, *options): self.render("polygon", xy, *options) def rectangle(self, xy, *options): self.render("rectangle", xy, *options) def symbol(self, xy, symbol, *options): raise NotImplementedError("not in this version") def text(self, xy, text, font): if self.transform: xy = ImagePath.Path(xy) xy.transform(self.transform) self.draw.text(xy, text, font=font.font, fill=font.color) def textsize(self, text, font): return self.draw.textsize(text, font=font.font) pillow-2.3.0/PIL/FliImagePlugin.py0000644000175000001440000000657712257506326015556 0ustar dokousers# # The Python Imaging Library. # $Id$ # # FLI/FLC file handling. # # History: # 95-09-01 fl Created # 97-01-03 fl Fixed parser, setup decoder tile # 98-07-15 fl Renamed offset attribute to avoid name clash # # Copyright (c) Secret Labs AB 1997-98. # Copyright (c) Fredrik Lundh 1995-97. # # See the README file for information on usage and redistribution. # __version__ = "0.2" from PIL import Image, ImageFile, ImagePalette, _binary i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le o8 = _binary.o8 # # decoder def _accept(prefix): return i16(prefix[4:6]) in [0xAF11, 0xAF12] ## # Image plugin for the FLI/FLC animation format. Use the seek # method to load individual frames. class FliImageFile(ImageFile.ImageFile): format = "FLI" format_description = "Autodesk FLI/FLC Animation" def _open(self): # HEAD s = self.fp.read(128) magic = i16(s[4:6]) if not (magic in [0xAF11, 0xAF12] and i16(s[14:16]) in [0, 3] and # flags s[20:22] == b"\x00\x00"): # reserved raise SyntaxError("not an FLI/FLC file") # image characteristics self.mode = "P" self.size = i16(s[8:10]), i16(s[10:12]) # animation speed duration = i32(s[16:20]) if magic == 0xAF11: duration = (duration * 1000) / 70 self.info["duration"] = duration # look for palette palette = [(a,a,a) for a in range(256)] s = self.fp.read(16) self.__offset = 128 if i16(s[4:6]) == 0xF100: # prefix chunk; ignore it self.__offset = self.__offset + i32(s) s = self.fp.read(16) if i16(s[4:6]) == 0xF1FA: # look for palette chunk s = self.fp.read(6) if i16(s[4:6]) == 11: self._palette(palette, 2) elif i16(s[4:6]) == 4: self._palette(palette, 0) palette = [o8(r)+o8(g)+o8(b) for (r,g,b) in palette] self.palette = ImagePalette.raw("RGB", b"".join(palette)) # set things up to decode first frame self.frame = -1 self.__fp = self.fp self.seek(0) def _palette(self, palette, shift): # load palette i = 0 for e in range(i16(self.fp.read(2))): s = self.fp.read(2) i = i + i8(s[0]) n = i8(s[1]) if n == 0: n = 256 s = self.fp.read(n * 3) for n in range(0, len(s), 3): r = i8(s[n]) << shift g = i8(s[n+1]) << shift b = i8(s[n+2]) << shift palette[i] = (r, g, b) i = i + 1 def seek(self, frame): if frame != self.frame + 1: raise ValueError("cannot seek to frame %d" % frame) self.frame = frame # move to next frame self.fp = self.__fp self.fp.seek(self.__offset) s = self.fp.read(4) if not s: raise EOFError framesize = i32(s) self.decodermaxblock = framesize self.tile = [("fli", (0,0)+self.size, self.__offset, None)] self.__offset = self.__offset + framesize def tell(self): return self.frame # # registry Image.register_open("FLI", FliImageFile, _accept) Image.register_extension("FLI", ".fli") Image.register_extension("FLI", ".flc") pillow-2.3.0/PIL/ImageFont.py0000644000175000001440000004270312257506326014562 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PIL raster font management # # History: # 1996-08-07 fl created (experimental) # 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 # 1999-02-06 fl rewrote most font management stuff in C # 1999-03-17 fl take pth files into account in load_path (from Richard Jones) # 2001-02-17 fl added freetype support # 2001-05-09 fl added TransposedFont wrapper class # 2002-03-04 fl make sure we have a "L" or "1" font # 2002-12-04 fl skip non-directory entries in the system path # 2003-04-29 fl add embedded default font # 2003-09-27 fl added support for truetype charmap encodings # # Todo: # Adapt to PILFONT2 format (16-bit fonts, compressed, single file) # # Copyright (c) 1997-2003 by Secret Labs AB # Copyright (c) 1996-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from __future__ import print_function from PIL import Image from PIL._util import isDirectory, isPath import os, sys try: import warnings except ImportError: warnings = None class _imagingft_not_installed: # module placeholder def __getattr__(self, id): raise ImportError("The _imagingft C module is not installed") try: from PIL import _imagingft as core except ImportError: core = _imagingft_not_installed() # FIXME: add support for pilfont2 format (see FontFile.py) # -------------------------------------------------------------------- # Font metrics format: # "PILfont" LF # fontdescriptor LF # (optional) key=value... LF # "DATA" LF # binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) # # To place a character, cut out srcbox and paste at dstbox, # relative to the character position. Then move the character # position according to dx, dy. # -------------------------------------------------------------------- class ImageFont: "PIL font wrapper" def _load_pilfont(self, filename): file = open(filename, "rb") for ext in (".png", ".gif", ".pbm"): try: fullname = os.path.splitext(filename)[0] + ext image = Image.open(fullname) except: pass else: if image and image.mode in ("1", "L"): break else: raise IOError("cannot find glyph data file") self.file = fullname return self._load_pilfont_data(file, image) def _load_pilfont_data(self, file, image): # read PILfont header if file.readline() != b"PILfont\n": raise SyntaxError("Not a PILfont file") d = file.readline().split(b";") self.info = [] # FIXME: should be a dictionary while True: s = file.readline() if not s or s == b"DATA\n": break self.info.append(s) # read PILfont metrics data = file.read(256*20) # check image if image.mode not in ("1", "L"): raise TypeError("invalid font image mode") image.load() self.font = Image.core.font(image.im, data) # delegate critical operations to internal type self.getsize = self.font.getsize self.getmask = self.font.getmask ## # Wrapper for FreeType fonts. Application code should use the # truetype factory function to create font objects. class FreeTypeFont: "FreeType font wrapper (requires _imagingft service)" def __init__(self, font=None, size=10, index=0, encoding="", file=None): # FIXME: use service provider instead if file: if warnings: warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) font = file if isPath(font): self.font = core.getfont(font, size, index, encoding) else: self.font_bytes = font.read() self.font = core.getfont("", size, index, encoding, self.font_bytes) def getname(self): return self.font.family, self.font.style def getmetrics(self): return self.font.ascent, self.font.descent def getsize(self, text): return self.font.getsize(text)[0] def getoffset(self, text): return self.font.getsize(text)[1] def getmask(self, text, mode=""): return self.getmask2(text, mode)[0] def getmask2(self, text, mode="", fill=Image.core.fill): size, offset = self.font.getsize(text) im = fill("L", size, 0) self.font.render(text, im.id, mode=="1") return im, offset ## # Wrapper that creates a transposed font from any existing font # object. # # @param font A font object. # @param orientation An optional orientation. If given, this should # be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, # Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270. class TransposedFont: "Wrapper for writing rotated or mirrored text" def __init__(self, font, orientation=None): self.font = font self.orientation = orientation # any 'transpose' argument, or None def getsize(self, text): w, h = self.font.getsize(text) if self.orientation in (Image.ROTATE_90, Image.ROTATE_270): return h, w return w, h def getmask(self, text, mode=""): im = self.font.getmask(text, mode) if self.orientation is not None: return im.transpose(self.orientation) return im def load(filename): """ Load a font file. This function loads a font object from the given bitmap font file, and returns the corresponding font object. :param filename: Name of font file. :return: A font object. :exception IOError: If the file could not be read. """ f = ImageFont() f._load_pilfont(filename) return f def truetype(font=None, size=10, index=0, encoding="", filename=None): """ Load a TrueType or OpenType font file, and create a font object. This function loads a font object from the given file, and creates a font object for a font of the given size. This function requires the _imagingft service. :param filename: A truetype font file. Under Windows, if the file is not found in this filename, the loader also looks in Windows :file:`fonts/` directory. :param size: The requested size, in points. :param index: Which font face to load (default is first available face). :param encoding: Which font encoding to use (default is Unicode). Common encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. :return: A font object. :exception IOError: If the file could not be read. """ if filename: if warnings: warnings.warn('filename parameter deprecated, please use font parameter instead.', DeprecationWarning) font = filename try: return FreeTypeFont(font, size, index, encoding) except IOError: if sys.platform == "win32": # check the windows font repository # NOTE: must use uppercase WINDIR, to work around bugs in # 1.5.2's os.environ.get() windir = os.environ.get("WINDIR") if windir: filename = os.path.join(windir, "fonts", font) return FreeTypeFont(filename, size, index, encoding) raise def load_path(filename): """ Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a bitmap font along the Python path. :param filename: Name of font file. :return: A font object. :exception IOError: If the file could not be read. """ for dir in sys.path: if isDirectory(dir): if not isinstance(filename, str): if bytes is str: filename = filename.encode("utf-8") else: filename = filename.decode("utf-8") try: return load(os.path.join(dir, filename)) except IOError: pass raise IOError("cannot find font file") def load_default(): """Load a "better than nothing" default font. .. versionadded:: 1.1.4 :return: A font object. """ from io import BytesIO import base64 f = ImageFont() f._load_pilfont_data( # courB08 BytesIO(base64.decodestring(b''' UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// +QAGAAIAzgAKANUAEw== ''')), Image.open(BytesIO(base64.decodestring(b''' iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR w7IkEbzhVQAAAABJRU5ErkJggg== ''')))) return f if __name__ == "__main__": # create font data chunk for embedding import base64, os, sys font = "../Images/courB08" print(" f._load_pilfont_data(") print(" # %s" % os.path.basename(font)) print(" BytesIO(base64.decodestring(b'''") base64.encode(open(font + ".pil", "rb"), sys.stdout) print("''')), Image.open(BytesIO(base64.decodestring(b'''") base64.encode(open(font + ".pbm", "rb"), sys.stdout) print("'''))))") pillow-2.3.0/PIL/XbmImagePlugin.py0000644000175000001440000000462412257506326015561 0ustar dokousers# # The Python Imaging Library. # $Id$ # # XBM File handling # # History: # 1995-09-08 fl Created # 1996-11-01 fl Added save support # 1997-07-07 fl Made header parser more tolerant # 1997-07-22 fl Fixed yet another parser bug # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) # 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) # 2004-02-24 fl Allow some whitespace before first #define # # Copyright (c) 1997-2004 by Secret Labs AB # Copyright (c) 1996-1997 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.6" import re from PIL import Image, ImageFile # XBM header xbm_head = re.compile( b"\s*#define[ \t]+[^_]*_width[ \t]+(?P[0-9]+)[\r\n]+" b"#define[ \t]+[^_]*_height[ \t]+(?P[0-9]+)[\r\n]+" b"(?P" b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" b")?" b"[\\000-\\377]*_bits\\[\\]" ) def _accept(prefix): return prefix.lstrip()[:7] == b"#define" ## # Image plugin for X11 bitmaps. class XbmImageFile(ImageFile.ImageFile): format = "XBM" format_description = "X11 Bitmap" def _open(self): m = xbm_head.match(self.fp.read(512)) if m: xsize = int(m.group("width")) ysize = int(m.group("height")) if m.group("hotspot"): self.info["hotspot"] = ( int(m.group("xhot")), int(m.group("yhot")) ) self.mode = "1" self.size = xsize, ysize self.tile = [("xbm", (0, 0)+self.size, m.end(), None)] def _save(im, fp, filename): if im.mode != "1": raise IOError("cannot write mode %s as XBM" % im.mode) fp.write(("#define im_width %d\n" % im.size[0]).encode('ascii')) fp.write(("#define im_height %d\n" % im.size[1]).encode('ascii')) hotspot = im.encoderinfo.get("hotspot") if hotspot: fp.write(("#define im_x_hot %d\n" % hotspot[0]).encode('ascii')) fp.write(("#define im_y_hot %d\n" % hotspot[1]).encode('ascii')) fp.write(b"static char im_bits[] = {\n") ImageFile._save(im, fp, [("xbm", (0,0)+im.size, 0, None)]) fp.write(b"};\n") Image.register_open("XBM", XbmImageFile, _accept) Image.register_save("XBM", _save) Image.register_extension("XBM", ".xbm") Image.register_mime("XBM", "image/xbm") pillow-2.3.0/PIL/BdfFontFile.py0000644000175000001440000000642512257506326015034 0ustar dokousers# # The Python Imaging Library # $Id$ # # bitmap distribution font (bdf) file parser # # history: # 1996-05-16 fl created (as bdf2pil) # 1997-08-25 fl converted to FontFile driver # 2001-05-25 fl removed bogus __init__ call # 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) # 2003-04-22 fl more robustification (from Graham Dumpleton) # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1997-2003 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from PIL import Image from PIL import FontFile # -------------------------------------------------------------------- # parse X Bitmap Distribution Format (BDF) # -------------------------------------------------------------------- bdf_slant = { "R": "Roman", "I": "Italic", "O": "Oblique", "RI": "Reverse Italic", "RO": "Reverse Oblique", "OT": "Other" } bdf_spacing = { "P": "Proportional", "M": "Monospaced", "C": "Cell" } def bdf_char(f): # skip to STARTCHAR while True: s = f.readline() if not s: return None if s[:9] == b"STARTCHAR": break id = s[9:].strip().decode('ascii') # load symbol properties props = {} while True: s = f.readline() if not s or s[:6] == b"BITMAP": break i = s.find(b" ") props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') # load bitmap bitmap = [] while True: s = f.readline() if not s or s[:7] == b"ENDCHAR": break bitmap.append(s[:-1]) bitmap = b"".join(bitmap) [x, y, l, d] = [int(s) for s in props["BBX"].split()] [dx, dy] = [int(s) for s in props["DWIDTH"].split()] bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y) try: im = Image.frombytes("1", (x, y), bitmap, "hex", "1") except ValueError: # deal with zero-width characters im = Image.new("1", (x, y)) return id, int(props["ENCODING"]), bbox, im ## # Font file plugin for the X11 BDF format. class BdfFontFile(FontFile.FontFile): def __init__(self, fp): FontFile.FontFile.__init__(self) s = fp.readline() if s[:13] != b"STARTFONT 2.1": raise SyntaxError("not a valid BDF file") props = {} comments = [] while True: s = fp.readline() if not s or s[:13] == b"ENDPROPERTIES": break i = s.find(b" ") props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') if s[:i] in [b"COMMENT", b"COPYRIGHT"]: if s.find(b"LogicalFontDescription") < 0: comments.append(s[i+1:-1].decode('ascii')) font = props["FONT"].split("-") font[4] = bdf_slant[font[4].upper()] font[11] = bdf_spacing[font[11].upper()] ascent = int(props["FONT_ASCENT"]) descent = int(props["FONT_DESCENT"]) fontname = ";".join(font[1:]) # print "#", fontname # for i in comments: # print "#", i font = [] while True: c = bdf_char(fp) if not c: break id, ch, (xy, dst, src), im = c if ch >= 0 and ch < len(self.glyph): self.glyph[ch] = xy, dst, src, im pillow-2.3.0/PIL/PdfImagePlugin.py0000644000175000001440000001331512257506326015541 0ustar dokousers# # The Python Imaging Library. # $Id$ # # PDF (Acrobat) file handling # # History: # 1996-07-16 fl Created # 1997-01-18 fl Fixed header # 2004-02-21 fl Fixes for 1/L/CMYK images, etc. # 2004-02-24 fl Fixes for 1 and P images. # # Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. # Copyright (c) 1996-1997 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # ## # Image plugin for PDF images (output only). ## __version__ = "0.4" from PIL import Image, ImageFile from PIL._binary import i8 import io # # -------------------------------------------------------------------- # object ids: # 1. catalogue # 2. pages # 3. image # 4. page # 5. page contents def _obj(fp, obj, **dict): fp.write("%d 0 obj\n" % obj) if dict: fp.write("<<\n") for k, v in dict.items(): if v is not None: fp.write("/%s %s\n" % (k, v)) fp.write(">>\n") def _endobj(fp): fp.write("endobj\n") ## # (Internal) Image save plugin for the PDF format. def _save(im, fp, filename): resolution = im.encoderinfo.get("resolution", 72.0) # # make sure image data is available im.load() xref = [0]*(5+1) # placeholders class TextWriter: def __init__(self, fp): self.fp = fp def __getattr__(self, name): return getattr(self.fp, name) def write(self, value): self.fp.write(value.encode('latin-1')) fp = TextWriter(fp) fp.write("%PDF-1.2\n") fp.write("% created by PIL PDF driver " + __version__ + "\n") # # Get image characteristics width, height = im.size # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports # Flatedecode (zip compression). bits = 8 params = None if im.mode == "1": filter = "/ASCIIHexDecode" colorspace = "/DeviceGray" procset = "/ImageB" # grayscale bits = 1 elif im.mode == "L": filter = "/DCTDecode" # params = "<< /Predictor 15 /Columns %d >>" % (width-2) colorspace = "/DeviceGray" procset = "/ImageB" # grayscale elif im.mode == "P": filter = "/ASCIIHexDecode" colorspace = "[ /Indexed /DeviceRGB 255 <" palette = im.im.getpalette("RGB") for i in range(256): r = i8(palette[i*3]) g = i8(palette[i*3+1]) b = i8(palette[i*3+2]) colorspace = colorspace + "%02x%02x%02x " % (r, g, b) colorspace = colorspace + b"> ]" procset = "/ImageI" # indexed color elif im.mode == "RGB": filter = "/DCTDecode" colorspace = "/DeviceRGB" procset = "/ImageC" # color images elif im.mode == "CMYK": filter = "/DCTDecode" colorspace = "/DeviceCMYK" procset = "/ImageC" # color images else: raise ValueError("cannot save mode %s" % im.mode) # # catalogue xref[1] = fp.tell() _obj(fp, 1, Type = "/Catalog", Pages = "2 0 R") _endobj(fp) # # pages xref[2] = fp.tell() _obj(fp, 2, Type = "/Pages", Count = 1, Kids = "[4 0 R]") _endobj(fp) # # image op = io.BytesIO() if filter == "/ASCIIHexDecode": if bits == 1: # FIXME: the hex encoder doesn't support packed 1-bit # images; do things the hard way... data = im.tostring("raw", "1") im = Image.new("L", (len(data), 1), None) im.putdata(data) ImageFile._save(im, op, [("hex", (0,0)+im.size, 0, im.mode)]) elif filter == "/DCTDecode": Image.SAVE["JPEG"](im, op, filename) elif filter == "/FlateDecode": ImageFile._save(im, op, [("zip", (0,0)+im.size, 0, im.mode)]) elif filter == "/RunLengthDecode": ImageFile._save(im, op, [("packbits", (0,0)+im.size, 0, im.mode)]) else: raise ValueError("unsupported PDF filter (%s)" % filter) xref[3] = fp.tell() _obj(fp, 3, Type = "/XObject", Subtype = "/Image", Width = width, # * 72.0 / resolution, Height = height, # * 72.0 / resolution, Length = len(op.getvalue()), Filter = filter, BitsPerComponent = bits, DecodeParams = params, ColorSpace = colorspace) fp.write("stream\n") fp.fp.write(op.getvalue()) fp.write("\nendstream\n") _endobj(fp) # # page xref[4] = fp.tell() _obj(fp, 4) fp.write("<<\n/Type /Page\n/Parent 2 0 R\n"\ "/Resources <<\n/ProcSet [ /PDF %s ]\n"\ "/XObject << /image 3 0 R >>\n>>\n"\ "/MediaBox [ 0 0 %d %d ]\n/Contents 5 0 R\n>>\n" %\ (procset, int(width * 72.0 /resolution) , int(height * 72.0 / resolution))) _endobj(fp) # # page contents op = TextWriter(io.BytesIO()) op.write("q %d 0 0 %d 0 0 cm /image Do Q\n" % (int(width * 72.0 / resolution), int(height * 72.0 / resolution))) xref[5] = fp.tell() _obj(fp, 5, Length = len(op.fp.getvalue())) fp.write("stream\n") fp.fp.write(op.fp.getvalue()) fp.write("\nendstream\n") _endobj(fp) # # trailer startxref = fp.tell() fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) for x in xref[1:]: fp.write("%010d 00000 n \n" % x) fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) fp.write("startxref\n%d\n%%%%EOF\n" % startxref) fp.flush() # # -------------------------------------------------------------------- Image.register_save("PDF", _save) Image.register_extension("PDF", ".pdf") Image.register_mime("PDF", "application/pdf") pillow-2.3.0/PIL/EpsImagePlugin.py0000644000175000001440000002603312257506326015560 0ustar dokousers# # The Python Imaging Library. # $Id$ # # EPS file handling # # History: # 1995-09-01 fl Created (0.1) # 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) # 1996-08-22 fl Don't choke on floating point BoundingBox values # 1996-08-23 fl Handle files from Macintosh (0.3) # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) # 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) # # Copyright (c) 1997-2003 by Secret Labs AB. # Copyright (c) 1995-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.5" import re import io from PIL import Image, ImageFile, _binary # # -------------------------------------------------------------------- i32 = _binary.i32le o32 = _binary.o32le split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") gs_windows_binary = None import sys if sys.platform.startswith('win'): import shutil if hasattr(shutil, 'which'): which = shutil.which else: # Python < 3.3 import distutils.spawn which = distutils.spawn.find_executable for binary in ('gswin32c', 'gswin64c', 'gs'): if which(binary) is not None: gs_windows_binary = binary break else: gs_windows_binary = False def Ghostscript(tile, size, fp, scale=1): """Render an image using Ghostscript""" # Unpack decoder tile decoder, tile, offset, data = tile[0] length, bbox = data #Hack to support hi-res rendering scale = int(scale) or 1 orig_size = size orig_bbox = bbox size = (size[0] * scale, size[1] * scale) bbox = [bbox[0], bbox[1], bbox[2] * scale, bbox[3] * scale] #print("Ghostscript", scale, size, orig_size, bbox, orig_bbox) import tempfile, os, subprocess file = tempfile.mktemp() # Build ghostscript command command = ["gs", "-q", # quite mode "-g%dx%d" % size, # set output geometry (pixels) "-r%d" % (72*scale), # set input DPI (dots per inch) "-dNOPAUSE -dSAFER", # don't pause between pages, safe mode "-sDEVICE=ppmraw", # ppm driver "-sOutputFile=%s" % file,# output file ] if gs_windows_binary is not None: if gs_windows_binary is False: raise WindowsError('Unable to locate Ghostscript on paths') command[0] = gs_windows_binary # push data through ghostscript try: gs = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) # adjust for image origin if bbox[0] != 0 or bbox[1] != 0: gs.stdin.write(("%d %d translate\n" % (-bbox[0], -bbox[1])).encode('ascii')) fp.seek(offset) while length > 0: s = fp.read(8192) if not s: break length = length - len(s) gs.stdin.write(s) gs.stdin.close() status = gs.wait() if status: raise IOError("gs failed (status %d)" % status) im = Image.core.open_ppm(file) finally: try: os.unlink(file) except: pass return im class PSFile: """Wrapper that treats either CR or LF as end of line.""" def __init__(self, fp): self.fp = fp self.char = None def __getattr__(self, id): v = getattr(self.fp, id) setattr(self, id, v) return v def seek(self, offset, whence=0): self.char = None self.fp.seek(offset, whence) def read(self, count): return self.fp.read(count).decode('latin-1') def tell(self): pos = self.fp.tell() if self.char: pos = pos - 1 return pos def readline(self): s = b"" if self.char: c = self.char self.char = None else: c = self.fp.read(1) while c not in b"\r\n": s = s + c c = self.fp.read(1) if c == b"\r": self.char = self.fp.read(1) if self.char == b"\n": self.char = None return s.decode('latin-1') + "\n" def _accept(prefix): return prefix[:4] == b"%!PS" or i32(prefix) == 0xC6D3D0C5 ## # Image plugin for Encapsulated Postscript. This plugin supports only # a few variants of this format. class EpsImageFile(ImageFile.ImageFile): """EPS File Parser for the Python Imaging Library""" format = "EPS" format_description = "Encapsulated Postscript" def _open(self): # FIXME: should check the first 512 bytes to see if this # really is necessary (platform-dependent, though...) fp = PSFile(self.fp) # HEAD s = fp.read(512) if s[:4] == "%!PS": offset = 0 fp.seek(0, 2) length = fp.tell() elif i32(s) == 0xC6D3D0C5: offset = i32(s[4:]) length = i32(s[8:]) fp.seek(offset) else: raise SyntaxError("not an EPS file") fp.seek(offset) box = None self.mode = "RGB" self.size = 1, 1 # FIXME: huh? # # Load EPS header s = fp.readline() while s: if len(s) > 255: raise SyntaxError("not an EPS file") if s[-2:] == '\r\n': s = s[:-2] elif s[-1:] == '\n': s = s[:-1] try: m = split.match(s) except re.error as v: raise SyntaxError("not an EPS file") if m: k, v = m.group(1, 2) self.info[k] = v if k == "BoundingBox": try: # Note: The DSC spec says that BoundingBox # fields should be integers, but some drivers # put floating point values there anyway. box = [int(float(s)) for s in v.split()] self.size = box[2] - box[0], box[3] - box[1] self.tile = [("eps", (0,0) + self.size, offset, (length, box))] except: pass else: m = field.match(s) if m: k = m.group(1) if k == "EndComments": break if k[:8] == "PS-Adobe": self.info[k[:8]] = k[9:] else: self.info[k] = "" elif s[0:1] == '%': # handle non-DSC Postscript comments that some # tools mistakenly put in the Comments section pass else: raise IOError("bad EPS header") s = fp.readline() if s[:1] != "%": break # # Scan for an "ImageData" descriptor while s[0] == "%": if len(s) > 255: raise SyntaxError("not an EPS file") if s[-2:] == '\r\n': s = s[:-2] elif s[-1:] == '\n': s = s[:-1] if s[:11] == "%ImageData:": [x, y, bi, mo, z3, z4, en, id] =\ s[11:].split(None, 7) x = int(x); y = int(y) bi = int(bi) mo = int(mo) en = int(en) if en == 1: decoder = "eps_binary" elif en == 2: decoder = "eps_hex" else: break if bi != 8: break if mo == 1: self.mode = "L" elif mo == 2: self.mode = "LAB" elif mo == 3: self.mode = "RGB" else: break if id[:1] == id[-1:] == '"': id = id[1:-1] # Scan forward to the actual image data while True: s = fp.readline() if not s: break if s[:len(id)] == id: self.size = x, y self.tile2 = [(decoder, (0, 0, x, y), fp.tell(), 0)] return s = fp.readline() if not s: break if not box: raise IOError("cannot determine EPS bounding box") def load(self, scale=1): # Load EPS via Ghostscript if not self.tile: return self.im = Ghostscript(self.tile, self.size, self.fp, scale) self.mode = self.im.mode self.size = self.im.size self.tile = [] # # -------------------------------------------------------------------- def _save(im, fp, filename, eps=1): """EPS Writer for the Python Imaging Library.""" # # make sure image data is available im.load() # # determine postscript image mode if im.mode == "L": operator = (8, 1, "image") elif im.mode == "RGB": operator = (8, 3, "false 3 colorimage") elif im.mode == "CMYK": operator = (8, 4, "false 4 colorimage") else: raise ValueError("image mode is not supported") class NoCloseStream: def __init__(self, fp): self.fp = fp def __getattr__(self, name): return getattr(self.fp, name) def close(self): pass base_fp = fp fp = io.TextIOWrapper(NoCloseStream(fp), encoding='latin-1') if eps: # # write EPS header fp.write("%!PS-Adobe-3.0 EPSF-3.0\n") fp.write("%%Creator: PIL 0.1 EpsEncode\n") #fp.write("%%CreationDate: %s"...) fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size) fp.write("%%Pages: 1\n") fp.write("%%EndComments\n") fp.write("%%Page: 1 1\n") fp.write("%%ImageData: %d %d " % im.size) fp.write("%d %d 0 1 1 \"%s\"\n" % operator) # # image header fp.write("gsave\n") fp.write("10 dict begin\n") fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) fp.write("%d %d scale\n" % im.size) fp.write("%d %d 8\n" % im.size) # <= bits fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) fp.write("{ currentfile buf readhexstring pop } bind\n") fp.write(operator[2] + "\n") fp.flush() ImageFile._save(im, base_fp, [("eps", (0,0)+im.size, 0, None)]) fp.write("\n%%%%EndBinary\n") fp.write("grestore end\n") fp.flush() # # -------------------------------------------------------------------- Image.register_open(EpsImageFile.format, EpsImageFile, _accept) Image.register_save(EpsImageFile.format, _save) Image.register_extension(EpsImageFile.format, ".ps") Image.register_extension(EpsImageFile.format, ".eps") Image.register_mime(EpsImageFile.format, "application/postscript") pillow-2.3.0/PIL/ArgImagePlugin.py0000644000175000001440000003025712257506326015545 0ustar dokousers# # THIS IS WORK IN PROGRESS # # The Python Imaging Library. # $Id$ # # ARG animation support code # # history: # 1996-12-30 fl Created # 1996-01-06 fl Added safe scripting environment # 1996-01-10 fl Added JHDR, UHDR and sYNC support # 2005-03-02 fl Removed AAPP and ARUN support # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996-97. # # See the README file for information on usage and redistribution. # from __future__ import print_function __version__ = "0.4" from PIL import Image, ImageFile, ImagePalette from PIL.PngImagePlugin import i8, i16, i32, ChunkStream, _MODES MAGIC = b"\212ARG\r\n\032\n" # -------------------------------------------------------------------- # ARG parser class ArgStream(ChunkStream): "Parser callbacks for ARG data" def __init__(self, fp): ChunkStream.__init__(self, fp) self.eof = 0 self.im = None self.palette = None self.__reset() def __reset(self): # reset decoder state (called on init and sync) self.count = 0 self.id = None self.action = ("NONE",) self.images = {} self.names = {} def chunk_AHDR(self, offset, bytes): "AHDR -- animation header" # assertions if self.count != 0: raise SyntaxError("misplaced AHDR chunk") s = self.fp.read(bytes) self.size = i32(s), i32(s[4:]) try: self.mode, self.rawmode = _MODES[(i8(s[8]), i8(s[9]))] except: raise SyntaxError("unknown ARG mode") if Image.DEBUG: print("AHDR size", self.size) print("AHDR mode", self.mode, self.rawmode) return s def chunk_AFRM(self, offset, bytes): "AFRM -- next frame follows" # assertions if self.count != 0: raise SyntaxError("misplaced AFRM chunk") self.show = 1 self.id = 0 self.count = 1 self.repair = None s = self.fp.read(bytes) if len(s) >= 2: self.id = i16(s) if len(s) >= 4: self.count = i16(s[2:4]) if len(s) >= 6: self.repair = i16(s[4:6]) else: self.repair = None if Image.DEBUG: print("AFRM", self.id, self.count) return s def chunk_ADEF(self, offset, bytes): "ADEF -- store image" # assertions if self.count != 0: raise SyntaxError("misplaced ADEF chunk") self.show = 0 self.id = 0 self.count = 1 self.repair = None s = self.fp.read(bytes) if len(s) >= 2: self.id = i16(s) if len(s) >= 4: self.count = i16(s[2:4]) if Image.DEBUG: print("ADEF", self.id, self.count) return s def chunk_NAME(self, offset, bytes): "NAME -- name the current image" # assertions if self.count == 0: raise SyntaxError("misplaced NAME chunk") name = self.fp.read(bytes) self.names[self.id] = name return name def chunk_AEND(self, offset, bytes): "AEND -- end of animation" if Image.DEBUG: print("AEND") self.eof = 1 raise EOFError("end of ARG file") def __getmodesize(self, s, full=1): size = i32(s), i32(s[4:]) try: mode, rawmode = _MODES[(i8(s[8]), i8(s[9]))] except: raise SyntaxError("unknown image mode") if full: if i8(s[12]): pass # interlace not yet supported if i8(s[11]): raise SyntaxError("unknown filter category") return size, mode, rawmode def chunk_PAST(self, offset, bytes): "PAST -- paste one image into another" # assertions if self.count == 0: raise SyntaxError("misplaced PAST chunk") if self.repair is not None: # we must repair the target image before we # start pasting # brute force; a better solution would be to # update only the dirty rectangles in images[id]. # note that if images[id] doesn't exist, it must # be created self.images[self.id] = self.images[self.repair].copy() self.repair = None s = self.fp.read(bytes) im = self.images[i16(s)] x, y = i32(s[2:6]), i32(s[6:10]) bbox = x, y, im.size[0]+x, im.size[1]+y if im.mode in ["RGBA"]: # paste with transparency # FIXME: should handle P+transparency as well self.images[self.id].paste(im, bbox, im) else: # paste without transparency self.images[self.id].paste(im, bbox) self.action = ("PAST",) self.__store() return s def chunk_BLNK(self, offset, bytes): "BLNK -- create blank image" # assertions if self.count == 0: raise SyntaxError("misplaced BLNK chunk") s = self.fp.read(bytes) size, mode, rawmode = self.__getmodesize(s, 0) # store image (FIXME: handle colour) self.action = ("BLNK",) self.im = Image.core.fill(mode, size, 0) self.__store() return s def chunk_IHDR(self, offset, bytes): "IHDR -- full image follows" # assertions if self.count == 0: raise SyntaxError("misplaced IHDR chunk") # image header s = self.fp.read(bytes) size, mode, rawmode = self.__getmodesize(s) # decode and store image self.action = ("IHDR",) self.im = Image.core.new(mode, size) self.decoder = Image.core.zip_decoder(rawmode) self.decoder.setimage(self.im, (0,0) + size) self.data = b"" return s def chunk_DHDR(self, offset, bytes): "DHDR -- delta image follows" # assertions if self.count == 0: raise SyntaxError("misplaced DHDR chunk") s = self.fp.read(bytes) size, mode, rawmode = self.__getmodesize(s) # delta header diff = i8(s[13]) offs = i32(s[14:18]), i32(s[18:22]) bbox = offs + (offs[0]+size[0], offs[1]+size[1]) if Image.DEBUG: print("DHDR", diff, bbox) # FIXME: decode and apply image self.action = ("DHDR", diff, bbox) # setup decoder self.im = Image.core.new(mode, size) self.decoder = Image.core.zip_decoder(rawmode) self.decoder.setimage(self.im, (0,0) + size) self.data = b"" return s def chunk_JHDR(self, offset, bytes): "JHDR -- JPEG image follows" # assertions if self.count == 0: raise SyntaxError("misplaced JHDR chunk") # image header s = self.fp.read(bytes) size, mode, rawmode = self.__getmodesize(s, 0) # decode and store image self.action = ("JHDR",) self.im = Image.core.new(mode, size) self.decoder = Image.core.jpeg_decoder(rawmode) self.decoder.setimage(self.im, (0,0) + size) self.data = b"" return s def chunk_UHDR(self, offset, bytes): "UHDR -- uncompressed image data follows (EXPERIMENTAL)" # assertions if self.count == 0: raise SyntaxError("misplaced UHDR chunk") # image header s = self.fp.read(bytes) size, mode, rawmode = self.__getmodesize(s, 0) # decode and store image self.action = ("UHDR",) self.im = Image.core.new(mode, size) self.decoder = Image.core.raw_decoder(rawmode) self.decoder.setimage(self.im, (0,0) + size) self.data = b"" return s def chunk_IDAT(self, offset, bytes): "IDAT -- image data block" # pass compressed chunks through the decoder s = self.fp.read(bytes) self.data = self.data + s n, e = self.decoder.decode(self.data) if n < 0: # end of image if e < 0: raise IOError("decoder error %d" % e) else: self.data = self.data[n:] return s def chunk_DEND(self, offset, bytes): return self.chunk_IEND(offset, bytes) def chunk_JEND(self, offset, bytes): return self.chunk_IEND(offset, bytes) def chunk_UEND(self, offset, bytes): return self.chunk_IEND(offset, bytes) def chunk_IEND(self, offset, bytes): "IEND -- end of image" # we now have a new image. carry out the operation # defined by the image header. # won't need these anymore del self.decoder del self.data self.__store() return self.fp.read(bytes) def __store(self): # apply operation cid = self.action[0] if cid in ["BLNK", "IHDR", "JHDR", "UHDR"]: # store self.images[self.id] = self.im elif cid == "DHDR": # paste cid, mode, bbox = self.action im0 = self.images[self.id] im1 = self.im if mode == 0: im1 = im1.chop_add_modulo(im0.crop(bbox)) im0.paste(im1, bbox) self.count = self.count - 1 if self.count == 0 and self.show: self.im = self.images[self.id] raise EOFError # end of this frame def chunk_PLTE(self, offset, bytes): "PLTE -- palette data" s = self.fp.read(bytes) if self.mode == "P": self.palette = ImagePalette.raw("RGB", s) return s def chunk_sYNC(self, offset, bytes): "SYNC -- reset decoder" if self.count != 0: raise SyntaxError("misplaced sYNC chunk") s = self.fp.read(bytes) self.__reset() return s # -------------------------------------------------------------------- # ARG reader def _accept(prefix): return prefix[:8] == MAGIC ## # Image plugin for the experimental Animated Raster Graphics format. class ArgImageFile(ImageFile.ImageFile): format = "ARG" format_description = "Animated raster graphics" def _open(self): if Image.warnings: Image.warnings.warn( "The ArgImagePlugin driver is obsolete, and will be removed " "from a future release of PIL. If you rely on this module, " "please contact the PIL authors.", RuntimeWarning ) if self.fp.read(8) != MAGIC: raise SyntaxError("not an ARG file") self.arg = ArgStream(self.fp) # read and process the first chunk (AHDR) cid, offset, bytes = self.arg.read() if cid != "AHDR": raise SyntaxError("expected an AHDR chunk") s = self.arg.call(cid, offset, bytes) self.arg.crc(cid, s) # image characteristics self.mode = self.arg.mode self.size = self.arg.size def load(self): if self.arg.im is None: self.seek(0) # image data self.im = self.arg.im self.palette = self.arg.palette # set things up for further processing Image.Image.load(self) def seek(self, frame): if self.arg.eof: raise EOFError("end of animation") self.fp = self.arg.fp while True: # # process chunks cid, offset, bytes = self.arg.read() if self.arg.eof: raise EOFError("end of animation") try: s = self.arg.call(cid, offset, bytes) except EOFError: break except "glurk": # AttributeError if Image.DEBUG: print(cid, bytes, "(unknown)") s = self.fp.read(bytes) self.arg.crc(cid, s) self.fp.read(4) # ship extra CRC def tell(self): return 0 def verify(self): "Verify ARG file" # back up to first chunk self.fp.seek(8) self.arg.verify(self) self.arg.close() self.fp = None # # -------------------------------------------------------------------- Image.register_open("ARG", ArgImageFile, _accept) Image.register_extension("ARG", ".arg") Image.register_mime("ARG", "video/x-arg") pillow-2.3.0/PIL/ImagePalette.py0000644000175000001440000001324012257506326015244 0ustar dokousers# # The Python Imaging Library. # $Id$ # # image palette object # # History: # 1996-03-11 fl Rewritten. # 1997-01-03 fl Up and running. # 1997-08-23 fl Added load hack # 2001-04-16 fl Fixed randint shadow bug in random() # # Copyright (c) 1997-2001 by Secret Labs AB # Copyright (c) 1996-1997 by Fredrik Lundh # # See the README file for information on usage and redistribution. # import array from PIL import Image, ImageColor class ImagePalette: "Color palette for palette mapped images" def __init__(self, mode = "RGB", palette = None): self.mode = mode self.rawmode = None # if set, palette contains raw data self.palette = palette or list(range(256))*len(self.mode) self.colors = {} self.dirty = None if len(self.mode)*256 != len(self.palette): raise ValueError("wrong palette size") def getdata(self): """ Get palette contents in format suitable # for the low-level ``im.putpalette`` primitive. .. warning:: This method is experimental. """ if self.rawmode: return self.rawmode, self.palette return self.mode + ";L", self.tobytes() def tobytes(self): """Convert palette to bytes. .. warning:: This method is experimental. """ if self.rawmode: raise ValueError("palette contains raw palette data") if isinstance(self.palette, bytes): return self.palette arr = array.array("B", self.palette) if hasattr(arr, 'tobytes'): #py3k has a tobytes, tostring is deprecated. return arr.tobytes() return arr.tostring() # Declare tostring as an alias for tobytes tostring = tobytes def getcolor(self, color): """Given an rgb tuple, allocate palette entry. .. warning:: This method is experimental. """ if self.rawmode: raise ValueError("palette contains raw palette data") if isinstance(color, tuple): try: return self.colors[color] except KeyError: # allocate new color slot if isinstance(self.palette, bytes): self.palette = [int(x) for x in self.palette] index = len(self.colors) if index >= 256: raise ValueError("cannot allocate more than 256 colors") self.colors[color] = index self.palette[index] = color[0] self.palette[index+256] = color[1] self.palette[index+512] = color[2] self.dirty = 1 return index else: raise ValueError("unknown color specifier: %r" % color) def save(self, fp): """Save palette to text file. .. warning:: This method is experimental. """ if self.rawmode: raise ValueError("palette contains raw palette data") if isinstance(fp, str): fp = open(fp, "w") fp.write("# Palette\n") fp.write("# Mode: %s\n" % self.mode) for i in range(256): fp.write("%d" % i) for j in range(i, len(self.palette), 256): fp.write(" %d" % self.palette[j]) fp.write("\n") fp.close() # -------------------------------------------------------------------- # Internal def raw(rawmode, data): palette = ImagePalette() palette.rawmode = rawmode palette.palette = data palette.dirty = 1 return palette # -------------------------------------------------------------------- # Factories def _make_linear_lut(black, white): lut = [] if black == 0: for i in range(256): lut.append(white*i//255) else: raise NotImplementedError # FIXME return lut def _make_gamma_lut(exp, mode="RGB"): lut = [] for i in range(256): lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) return lut def new(mode, data): return Image.core.new_palette(mode, data) def negative(mode="RGB"): palette = list(range(256)) palette.reverse() return ImagePalette(mode, palette * len(mode)) def random(mode="RGB"): from random import randint palette = [] for i in range(256*len(mode)): palette.append(randint(0, 255)) return ImagePalette(mode, palette) def sepia(white="#fff0c0"): r, g, b = ImageColor.getrgb(white) r = _make_linear_lut(0, r) g = _make_linear_lut(0, g) b = _make_linear_lut(0, b) return ImagePalette("RGB", r + g + b) def wedge(mode="RGB"): return ImagePalette(mode, list(range(256)) * len(mode)) def load(filename): # FIXME: supports GIMP gradients only fp = open(filename, "rb") lut = None if not lut: try: from PIL import GimpPaletteFile fp.seek(0) p = GimpPaletteFile.GimpPaletteFile(fp) lut = p.getpalette() except (SyntaxError, ValueError): #import traceback #traceback.print_exc() pass if not lut: try: from PIL import GimpGradientFile fp.seek(0) p = GimpGradientFile.GimpGradientFile(fp) lut = p.getpalette() except (SyntaxError, ValueError): #import traceback #traceback.print_exc() pass if not lut: try: from PIL import PaletteFile fp.seek(0) p = PaletteFile.PaletteFile(fp) lut = p.getpalette() except (SyntaxError, ValueError): import traceback traceback.print_exc() pass if not lut: raise IOError("cannot load palette") return lut # data, rawmode pillow-2.3.0/PIL/PsdImagePlugin.py0000644000175000001440000001631312257506326015557 0ustar dokousers# # The Python Imaging Library # $Id$ # # Adobe PSD 2.5/3.0 file handling # # History: # 1995-09-01 fl Created # 1997-01-03 fl Read most PSD images # 1997-01-18 fl Fixed P and CMYK support # 2001-10-21 fl Added seek/tell support (for layers) # # Copyright (c) 1997-2001 by Secret Labs AB. # Copyright (c) 1995-2001 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.4" from PIL import Image, ImageFile, ImagePalette, _binary MODES = { # (photoshop mode, bits) -> (pil mode, required channels) (0, 1): ("1", 1), (0, 8): ("L", 1), (1, 8): ("L", 1), (2, 8): ("P", 1), (3, 8): ("RGB", 3), (4, 8): ("CMYK", 4), (7, 8): ("L", 1), # FIXME: multilayer (8, 8): ("L", 1), # duotone (9, 8): ("LAB", 3) } # # helpers i8 = _binary.i8 i16 = _binary.i16be i32 = _binary.i32be # --------------------------------------------------------------------. # read PSD images def _accept(prefix): return prefix[:4] == b"8BPS" ## # Image plugin for Photoshop images. class PsdImageFile(ImageFile.ImageFile): format = "PSD" format_description = "Adobe Photoshop" def _open(self): read = self.fp.read # # header s = read(26) if s[:4] != b"8BPS" or i16(s[4:]) != 1: raise SyntaxError("not a PSD file") psd_bits = i16(s[22:]) psd_channels = i16(s[12:]) psd_mode = i16(s[24:]) mode, channels = MODES[(psd_mode, psd_bits)] if channels > psd_channels: raise IOError("not enough channels") self.mode = mode self.size = i32(s[18:]), i32(s[14:]) # # color mode data size = i32(read(4)) if size: data = read(size) if mode == "P" and size == 768: self.palette = ImagePalette.raw("RGB;L", data) # # image resources self.resources = [] size = i32(read(4)) if size: # load resources end = self.fp.tell() + size while self.fp.tell() < end: signature = read(4) id = i16(read(2)) name = read(i8(read(1))) if not (len(name) & 1): read(1) # padding data = read(i32(read(4))) if (len(data) & 1): read(1) # padding self.resources.append((id, name, data)) if id == 1039: # ICC profile self.info["icc_profile"] = data # # layer and mask information self.layers = [] size = i32(read(4)) if size: end = self.fp.tell() + size size = i32(read(4)) if size: self.layers = _layerinfo(self.fp) self.fp.seek(end) # # image descriptor self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) # keep the file open self._fp = self.fp self.frame = 0 def seek(self, layer): # seek to given layer (1..max) if layer == self.frame: return try: if layer <= 0: raise IndexError name, mode, bbox, tile = self.layers[layer-1] self.mode = mode self.tile = tile self.frame = layer self.fp = self._fp return name, bbox except IndexError: raise EOFError("no such layer") def tell(self): # return layer number (0=image, 1..max=layers) return self.frame def load_prepare(self): # create image memory if necessary if not self.im or\ self.im.mode != self.mode or self.im.size != self.size: self.im = Image.core.fill(self.mode, self.size, 0) # create palette (optional) if self.mode == "P": Image.Image.load(self) def _layerinfo(file): # read layerinfo block layers = [] read = file.read for i in range(abs(i16(read(2)))): # bounding box y0 = i32(read(4)); x0 = i32(read(4)) y1 = i32(read(4)); x1 = i32(read(4)) # image info info = [] mode = [] types = list(range(i16(read(2)))) if len(types) > 4: continue for i in types: type = i16(read(2)) if type == 65535: m = "A" else: m = "RGBA"[type] mode.append(m) size = i32(read(4)) info.append((m, size)) # figure out the image mode mode.sort() if mode == ["R"]: mode = "L" elif mode == ["B", "G", "R"]: mode = "RGB" elif mode == ["A", "B", "G", "R"]: mode = "RGBA" else: mode = None # unknown # skip over blend flags and extra information filler = read(12) name = "" size = i32(read(4)) combined = 0 if size: length = i32(read(4)) if length: mask_y = i32(read(4)); mask_x = i32(read(4)) mask_h = i32(read(4)) - mask_y; mask_w = i32(read(4)) - mask_x file.seek(length - 16, 1) combined += length + 4 length = i32(read(4)) if length: file.seek(length, 1) combined += length + 4 length = i8(read(1)) if length: # Don't know the proper encoding, Latin-1 should be a good guess name = read(length).decode('latin-1', 'replace') combined += length + 1 file.seek(size - combined, 1) layers.append((name, mode, (x0, y0, x1, y1))) # get tiles i = 0 for name, mode, bbox in layers: tile = [] for m in mode: t = _maketile(file, m, bbox, 1) if t: tile.extend(t) layers[i] = name, mode, bbox, tile i = i + 1 return layers def _maketile(file, mode, bbox, channels): tile = None read = file.read compression = i16(read(2)) xsize = bbox[2] - bbox[0] ysize = bbox[3] - bbox[1] offset = file.tell() if compression == 0: # # raw compression tile = [] for channel in range(channels): layer = mode[channel] if mode == "CMYK": layer = layer + ";I" tile.append(("raw", bbox, offset, layer)) offset = offset + xsize*ysize elif compression == 1: # # packbits compression i = 0 tile = [] bytecount = read(channels * ysize * 2) offset = file.tell() for channel in range(channels): layer = mode[channel] if mode == "CMYK": layer = layer + ";I" tile.append( ("packbits", bbox, offset, layer) ) for y in range(ysize): offset = offset + i16(bytecount[i:i+2]) i = i + 2 file.seek(offset) if offset & 1: read(1) # padding return tile # -------------------------------------------------------------------- # registry Image.register_open("PSD", PsdImageFile, _accept) Image.register_extension("PSD", ".psd") pillow-2.3.0/PIL/ImageEnhance.py0000644000175000001440000000531012257506326015206 0ustar dokousers# # The Python Imaging Library. # $Id$ # # image enhancement classes # # For a background, see "Image Processing By Interpolation and # Extrapolation", Paul Haeberli and Douglas Voorhies. Available # at http://www.sgi.com/grafica/interp/index.html # # History: # 1996-03-23 fl Created # 2009-06-16 fl Fixed mean calculation # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFilter, ImageStat class _Enhance: def enhance(self, factor): """ Returns an enhanced image. :param factor: A floating point value controlling the enhancement. Factor 1.0 always returns a copy of the original image, lower factors mean less color (brightness, contrast, etc), and higher values more. There are no restrictions on this value. :rtype: :py:class:`~PIL.Image.Image` """ return Image.blend(self.degenerate, self.image, factor) class Color(_Enhance): """Adjust image color balance. This class can be used to adjust the colour balance of an image, in a manner similar to the controls on a colour TV set. An enhancement factor of 0.0 gives a black and white image. A factor of 1.0 gives the original image. """ def __init__(self, image): self.image = image self.degenerate = image.convert("L").convert(image.mode) class Contrast(_Enhance): """Adjust image contrast. This class can be used to control the contrast of an image, similar to the contrast control on a TV set. An enhancement factor of 0.0 gives a solid grey image. A factor of 1.0 gives the original image. """ def __init__(self, image): self.image = image mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) self.degenerate = Image.new("L", image.size, mean).convert(image.mode) class Brightness(_Enhance): """Adjust image brightness. This class can be used to control the brighntess of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image. """ def __init__(self, image): self.image = image self.degenerate = Image.new(image.mode, image.size, 0) class Sharpness(_Enhance): """Adjust image sharpness. This class can be used to adjust the sharpness of an image. An enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image, and a factor of 2.0 gives a sharpened image. """ def __init__(self, image): self.image = image self.degenerate = image.filter(ImageFilter.SMOOTH) pillow-2.3.0/PIL/FontFile.py0000644000175000001440000000650312257506326014415 0ustar dokousers# # The Python Imaging Library # $Id$ # # base class for raster font file parsers # # history: # 1997-06-05 fl created # 1997-08-19 fl restrict image width # # Copyright (c) 1997-1998 by Secret Labs AB # Copyright (c) 1997-1998 by Fredrik Lundh # # See the README file for information on usage and redistribution. # import os from PIL import Image, _binary import marshal try: import zlib except ImportError: zlib = None WIDTH = 800 def puti16(fp, values): # write network order (big-endian) 16-bit sequence for v in values: if v < 0: v = v + 65536 fp.write(_binary.o16be(v)) ## # Base class for raster font file handlers. class FontFile: bitmap = None def __init__(self): self.info = {} self.glyph = [None] * 256 def __getitem__(self, ix): return self.glyph[ix] def compile(self): "Create metrics and bitmap" if self.bitmap: return # create bitmap large enough to hold all data h = w = maxwidth = 0 lines = 1 for glyph in self: if glyph: d, dst, src, im = glyph h = max(h, src[3] - src[1]) w = w + (src[2] - src[0]) if w > WIDTH: lines = lines + 1 w = (src[2] - src[0]) maxwidth = max(maxwidth, w) xsize = maxwidth ysize = lines * h if xsize == 0 and ysize == 0: return "" self.ysize = h # paste glyphs into bitmap self.bitmap = Image.new("1", (xsize, ysize)) self.metrics = [None] * 256 x = y = 0 for i in range(256): glyph = self[i] if glyph: d, dst, src, im = glyph xx, yy = src[2] - src[0], src[3] - src[1] x0, y0 = x, y x = x + xx if x > WIDTH: x, y = 0, y + h x0, y0 = x, y x = xx s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 self.bitmap.paste(im.crop(src), s) # print chr(i), dst, s self.metrics[i] = d, dst, s def save1(self, filename): "Save font in version 1 format" self.compile() # font data self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") # font metrics fp = open(os.path.splitext(filename)[0] + ".pil", "wb") fp.write(b"PILfont\n") fp.write((";;;;;;%d;\n" % self.ysize).encode('ascii')) # HACK!!! fp.write(b"DATA\n") for id in range(256): m = self.metrics[id] if not m: puti16(fp, [0] * 10) else: puti16(fp, m[0] + m[1] + m[2]) fp.close() def save2(self, filename): "Save font in version 2 format" # THIS IS WORK IN PROGRESS self.compile() data = marshal.dumps((self.metrics, self.info)) if zlib: data = b"z" + zlib.compress(data, 9) else: data = b"u" + data fp = open(os.path.splitext(filename)[0] + ".pil", "wb") fp.write(b"PILfont2\n" + self.name + "\n" + "DATA\n") fp.write(data) self.bitmap.save(fp, "PNG") fp.close() save = save1 # for now pillow-2.3.0/PIL/ImageShow.py0000644000175000001440000001106512257506326014571 0ustar dokousers# # The Python Imaging Library. # $Id$ # # im.show() drivers # # History: # 2008-04-06 fl Created # # Copyright (c) Secret Labs AB 2008. # # See the README file for information on usage and redistribution. # from __future__ import print_function from PIL import Image import os, sys if(sys.version_info >= (3, 3)): from shlex import quote else: from pipes import quote _viewers = [] def register(viewer, order=1): try: if issubclass(viewer, Viewer): viewer = viewer() except TypeError: pass # raised if viewer wasn't a class if order > 0: _viewers.append(viewer) elif order < 0: _viewers.insert(0, viewer) ## # Displays a given image. # # @param image An image object. # @param title Optional title. Not all viewers can display the title. # @param **options Additional viewer options. # @return True if a suitable viewer was found, false otherwise. def show(image, title=None, **options): for viewer in _viewers: if viewer.show(image, title=title, **options): return 1 return 0 ## # Base class for viewers. class Viewer: # main api def show(self, image, **options): # save temporary image to disk if image.mode[:4] == "I;16": # @PIL88 @PIL101 # "I;16" isn't an 'official' mode, but we still want to # provide a simple way to show 16-bit images. base = "L" # FIXME: auto-contrast if max() > 255? else: base = Image.getmodebase(image.mode) if base != image.mode and image.mode != "1": image = image.convert(base) return self.show_image(image, **options) # hook methods format = None def get_format(self, image): # return format name, or None to save as PGM/PPM return self.format def get_command(self, file, **options): raise NotImplementedError def save_image(self, image): # save to temporary file, and return filename return image._dump(format=self.get_format(image)) def show_image(self, image, **options): # display given image return self.show_file(self.save_image(image), **options) def show_file(self, file, **options): # display given file os.system(self.get_command(file, **options)) return 1 # -------------------------------------------------------------------- if sys.platform == "win32": class WindowsViewer(Viewer): format = "BMP" def get_command(self, file, **options): return ("start /wait %s && ping -n 2 127.0.0.1 >NUL " "&& del /f %s" % (quote(file), quote(file))) register(WindowsViewer) elif sys.platform == "darwin": class MacViewer(Viewer): format = "BMP" def get_command(self, file, **options): # on darwin open returns immediately resulting in the temp # file removal while app is opening command = "open -a /Applications/Preview.app" command = "(%s %s; sleep 20; rm -f %s)&" % (command, quote(file), quote(file)) return command register(MacViewer) else: # unixoids def which(executable): path = os.environ.get("PATH") if not path: return None for dirname in path.split(os.pathsep): filename = os.path.join(dirname, executable) if os.path.isfile(filename): # FIXME: make sure it's executable return filename return None class UnixViewer(Viewer): def show_file(self, file, **options): command, executable = self.get_command_ex(file, **options) command = "(%s %s; rm -f %s)&" % (command, quote(file), quote(file)) os.system(command) return 1 # implementations class DisplayViewer(UnixViewer): def get_command_ex(self, file, **options): command = executable = "display" return command, executable if which("display"): register(DisplayViewer) class XVViewer(UnixViewer): def get_command_ex(self, file, title=None, **options): # note: xv is pretty outdated. most modern systems have # imagemagick's display command instead. command = executable = "xv" if title: command = command + " -name %s" % quote(title) return command, executable if which("xv"): register(XVViewer) if __name__ == "__main__": # usage: python ImageShow.py imagefile [title] print(show(Image.open(sys.argv[1]), *sys.argv[2:])) pillow-2.3.0/PIL/_binary.py0000644000175000001440000000213112257506326014323 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Binary input/output support routines. # # Copyright (c) 1997-2003 by Secret Labs AB # Copyright (c) 1995-2003 by Fredrik Lundh # Copyright (c) 2012 by Brian Crowell # # See the README file for information on usage and redistribution. # if bytes is str: def i8(c): return ord(c) def o8(i): return chr(i&255) else: def i8(c): return c if c.__class__ is int else c[0] def o8(i): return bytes((i&255,)) # Input, le = little endian, be = big endian def i16le(c, o=0): return i8(c[o]) | (i8(c[o+1])<<8) def i32le(c, o=0): return i8(c[o]) | (i8(c[o+1])<<8) | (i8(c[o+2])<<16) | (i8(c[o+3])<<24) def i16be(c, o=0): return (i8(c[o])<<8) | i8(c[o+1]) def i32be(c, o=0): return (i8(c[o])<<24) | (i8(c[o+1])<<16) | (i8(c[o+2])<<8) | i8(c[o+3]) # Output, le = little endian, be = big endian def o16le(i): return o8(i) + o8(i>>8) def o32le(i): return o8(i) + o8(i>>8) + o8(i>>16) + o8(i>>24) def o16be(i): return o8(i>>8) + o8(i) def o32be(i): return o8(i>>24) + o8(i>>16) + o8(i>>8) + o8(i) pillow-2.3.0/PIL/PaletteFile.py0000644000175000001440000000212112257506326015075 0ustar dokousers# # Python Imaging Library # $Id$ # # stuff to read simple, teragon-style palette files # # History: # 97-08-23 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # from PIL._binary import o8 ## # File handler for Teragon-style palette files. class PaletteFile: rawmode = "RGB" def __init__(self, fp): self.palette = [(i, i, i) for i in range(256)] while True: s = fp.readline() if not s: break if s[0:1] == b"#": continue if len(s) > 100: raise SyntaxError("bad palette file") v = [int(x) for x in s.split()] try: [i, r, g, b] = v except ValueError: [i, r] = v g = b = r if 0 <= i <= 255: self.palette[i] = o8(r) + o8(g) + o8(b) self.palette = b"".join(self.palette) def getpalette(self): return self.palette, self.rawmode pillow-2.3.0/PIL/DcxImagePlugin.py0000644000175000001440000000341012257506326015541 0ustar dokousers# # The Python Imaging Library. # $Id$ # # DCX file handling # # DCX is a container file format defined by Intel, commonly used # for fax applications. Each DCX file consists of a directory # (a list of file offsets) followed by a set of (usually 1-bit) # PCX files. # # History: # 1995-09-09 fl Created # 1996-03-20 fl Properly derived from PcxImageFile. # 1998-07-15 fl Renamed offset attribute to avoid name clash # 2002-07-30 fl Fixed file handling # # Copyright (c) 1997-98 by Secret Labs AB. # Copyright (c) 1995-96 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # __version__ = "0.2" from PIL import Image, _binary from PIL.PcxImagePlugin import PcxImageFile MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? i32 = _binary.i32le def _accept(prefix): return i32(prefix) == MAGIC ## # Image plugin for the Intel DCX format. class DcxImageFile(PcxImageFile): format = "DCX" format_description = "Intel DCX" def _open(self): # Header s = self.fp.read(4) if i32(s) != MAGIC: raise SyntaxError("not a DCX file") # Component directory self._offset = [] for i in range(1024): offset = i32(self.fp.read(4)) if not offset: break self._offset.append(offset) self.__fp = self.fp self.seek(0) def seek(self, frame): if frame >= len(self._offset): raise EOFError("attempt to seek outside DCX directory") self.frame = frame self.fp = self.__fp self.fp.seek(self._offset[frame]) PcxImageFile._open(self) def tell(self): return self.frame Image.register_open("DCX", DcxImageFile, _accept) Image.register_extension("DCX", ".dcx") pillow-2.3.0/PIL/CurImagePlugin.py0000644000175000001440000000361612257506326015564 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Windows Cursor support for PIL # # notes: # uses BmpImagePlugin.py to read the bitmap data. # # history: # 96-05-27 fl Created # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # __version__ = "0.1" from PIL import Image, BmpImagePlugin, _binary # # -------------------------------------------------------------------- i8 = _binary.i8 i16 = _binary.i16le i32 = _binary.i32le def _accept(prefix): return prefix[:4] == b"\0\0\2\0" ## # Image plugin for Windows Cursor files. class CurImageFile(BmpImagePlugin.BmpImageFile): format = "CUR" format_description = "Windows Cursor" def _open(self): offset = self.fp.tell() # check magic s = self.fp.read(6) if not _accept(s): raise SyntaxError("not an CUR file") # pick the largest cursor in the file m = b"" for i in range(i16(s[4:])): s = self.fp.read(16) if not m: m = s elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): m = s #print "width", i8(s[0]) #print "height", i8(s[1]) #print "colors", i8(s[2]) #print "reserved", i8(s[3]) #print "hotspot x", i16(s[4:]) #print "hotspot y", i16(s[6:]) #print "bytes", i32(s[8:]) #print "offset", i32(s[12:]) # load as bitmap self._bitmap(i32(m[12:]) + offset) # patch up the bitmap height self.size = self.size[0], self.size[1]//2 d, e, o, a = self.tile[0] self.tile[0] = d, (0,0)+self.size, o, a return # # -------------------------------------------------------------------- Image.register_open("CUR", CurImageFile, _accept) Image.register_extension("CUR", ".cur") pillow-2.3.0/PIL/tests.py0000644000175000001440000000043212257506326014044 0ustar dokousersimport unittest class PillowTests(unittest.TestCase): """ Can we start moving the test suite here? """ def test_suite_should_move_here(self): """ Great idea! """ assert True is True if __name__ == '__main__': unittest.main() pillow-2.3.0/PIL/PSDraw.py0000644000175000001440000001531712257506326014052 0ustar dokousers# # The Python Imaging Library # $Id$ # # simple postscript graphics interface # # History: # 1996-04-20 fl Created # 1999-01-10 fl Added gsave/grestore to image method # 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) # # Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. # Copyright (c) 1996 by Fredrik Lundh. # # See the README file for information on usage and redistribution. # from __future__ import print_function from PIL import EpsImagePlugin ## # Simple Postscript graphics interface. class PSDraw: """ Sets up printing to the given file. If **file** is omitted, :py:attr:`sys.stdout` is assumed. """ def __init__(self, fp=None): if not fp: import sys fp = sys.stdout self.fp = fp def begin_document(self, id = None): """Set up printing of a document. (Write Postscript DSC header.)""" # FIXME: incomplete self.fp.write("%!PS-Adobe-3.0\n" "save\n" "/showpage { } def\n" "%%EndComments\n" "%%BeginDocument\n") #self.fp.write(ERROR_PS) # debugging! self.fp.write(EDROFF_PS) self.fp.write(VDI_PS) self.fp.write("%%EndProlog\n") self.isofont = {} def end_document(self): """Ends printing. (Write Postscript DSC footer.)""" self.fp.write("%%EndDocument\n" "restore showpage\n" "%%End\n") if hasattr(self.fp, "flush"): self.fp.flush() def setfont(self, font, size): """ Selects which font to use. :param font: A Postscript font name :param size: Size in points. """ if font not in self.isofont: # reencode font self.fp.write("/PSDraw-%s ISOLatin1Encoding /%s E\n" %\ (font, font)) self.isofont[font] = 1 # rough self.fp.write("/F0 %d /PSDraw-%s F\n" % (size, font)) def setink(self, ink): """ .. warning:: This has been in the PIL API for ages but was never implemented. """ print("*** NOT YET IMPLEMENTED ***") def line(self, xy0, xy1): """ Draws a line between the two points. Coordinates are given in Postscript point coordinates (72 points per inch, (0, 0) is the lower left corner of the page). """ xy = xy0 + xy1 self.fp.write("%d %d %d %d Vl\n" % xy) def rectangle(self, box): """ Draws a rectangle. :param box: A 4-tuple of integers whose order and function is currently undocumented. Hint: the tuple is passed into this format string: .. code-block:: python %d %d M %d %d 0 Vr\n """ self.fp.write("%d %d M %d %d 0 Vr\n" % box) def text(self, xy, text): """ Draws text at the given position. You must use :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. """ text = "\\(".join(text.split("(")) text = "\\)".join(text.split(")")) xy = xy + (text,) self.fp.write("%d %d M (%s) S\n" % xy) def image(self, box, im, dpi = None): """Draw a PIL image, centered in the given box.""" # default resolution depends on mode if not dpi: if im.mode == "1": dpi = 200 # fax else: dpi = 100 # greyscale # image size (on paper) x = float(im.size[0] * 72) / dpi y = float(im.size[1] * 72) / dpi # max allowed size xmax = float(box[2] - box[0]) ymax = float(box[3] - box[1]) if x > xmax: y = y * xmax / x; x = xmax if y > ymax: x = x * ymax / y; y = ymax dx = (xmax - x) / 2 + box[0] dy = (ymax - y) / 2 + box[1] self.fp.write("gsave\n%f %f translate\n" % (dx, dy)) if (x, y) != im.size: # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) sx = x / im.size[0] sy = y / im.size[1] self.fp.write("%f %f scale\n" % (sx, sy)) EpsImagePlugin._save(im, self.fp, None, 0) self.fp.write("\ngrestore\n") # -------------------------------------------------------------------- # Postscript driver # # EDROFF.PS -- Postscript driver for Edroff 2 # # History: # 94-01-25 fl: created (edroff 2.04) # # Copyright (c) Fredrik Lundh 1994. # EDROFF_PS = """\ /S { show } bind def /P { moveto show } bind def /M { moveto } bind def /X { 0 rmoveto } bind def /Y { 0 exch rmoveto } bind def /E { findfont dup maxlength dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def dup /FontName exch def currentdict end definefont pop } bind def /F { findfont exch scalefont dup setfont [ exch /setfont cvx ] cvx bind def } bind def """ # # VDI.PS -- Postscript driver for VDI meta commands # # History: # 94-01-25 fl: created (edroff 2.04) # # Copyright (c) Fredrik Lundh 1994. # VDI_PS = """\ /Vm { moveto } bind def /Va { newpath arcn stroke } bind def /Vl { moveto lineto stroke } bind def /Vc { newpath 0 360 arc closepath } bind def /Vr { exch dup 0 rlineto exch dup neg 0 exch rlineto exch neg 0 rlineto 0 exch rlineto 100 div setgray fill 0 setgray } bind def /Tm matrix def /Ve { Tm currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath Tm setmatrix } bind def /Vf { currentgray exch setgray fill setgray } bind def """ # # ERROR.PS -- Error handler # # History: # 89-11-21 fl: created (pslist 1.10) # ERROR_PS = """\ /landscape false def /errorBUF 200 string def /errorNL { currentpoint 10 sub exch pop 72 exch moveto } def errordict begin /handleerror { initmatrix /Courier findfont 10 scalefont setfont newpath 72 720 moveto $error begin /newerror false def (PostScript Error) show errorNL errorNL (Error: ) show /errorname load errorBUF cvs show errorNL errorNL (Command: ) show /command load dup type /stringtype ne { errorBUF cvs } if show errorNL errorNL (VMstatus: ) show vmstatus errorBUF cvs show ( bytes available, ) show errorBUF cvs show ( bytes used at level ) show errorBUF cvs show errorNL errorNL (Operand stargck: ) show errorNL /ostargck load { dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL } forall errorNL (Execution stargck: ) show errorNL /estargck load { dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL } forall end showpage } def end """ pillow-2.3.0/PIL/SunImagePlugin.py0000644000175000001440000000362512257506326015600 0ustar dokousers# # The Python Imaging Library. # $Id$ # # Sun image file handling # # History: # 1995-09-10 fl Created # 1996-05-28 fl Fixed 32-bit alignment # 1998-12-29 fl Import ImagePalette module # 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) # # Copyright (c) 1997-2001 by Secret Labs AB # Copyright (c) 1995-1996 by Fredrik Lundh # # See the README file for information on usage and redistribution. # __version__ = "0.3" from PIL import Image, ImageFile, ImagePalette, _binary i16 = _binary.i16be i32 = _binary.i32be def _accept(prefix): return i32(prefix) == 0x59a66a95 ## # Image plugin for Sun raster files. class SunImageFile(ImageFile.ImageFile): format = "SUN" format_description = "Sun Raster File" def _open(self): # HEAD s = self.fp.read(32) if i32(s) != 0x59a66a95: raise SyntaxError("not an SUN raster file") offset = 32 self.size = i32(s[4:8]), i32(s[8:12]) depth = i32(s[12:16]) if depth == 1: self.mode, rawmode = "1", "1;I" elif depth == 8: self.mode = rawmode = "L" elif depth == 24: self.mode, rawmode = "RGB", "BGR" else: raise SyntaxError("unsupported mode") compression = i32(s[20:24]) if i32(s[24:28]) != 0: length = i32(s[28:32]) offset = offset + length self.palette = ImagePalette.raw("RGB;L", self.fp.read(length)) if self.mode == "L": self.mode = rawmode = "P" stride = (((self.size[0] * depth + 7) // 8) + 3) & (~3) if compression == 1: self.tile = [("raw", (0,0)+self.size, offset, (rawmode, stride))] elif compression == 2: self.tile = [("sun_rle", (0,0)+self.size, offset, rawmode)] # # registry Image.register_open("SUN", SunImageFile, _accept) Image.register_extension("SUN", ".ras") pillow-2.3.0/PIL/FitsStubImagePlugin.py0000644000175000001440000000316512257506326016575 0ustar dokousers# # The Python Imaging Library # $Id$ # # FITS stub adapter # # Copyright (c) 1998-2003 by Fredrik Lundh # # See the README file for information on usage and redistribution. # from PIL import Image, ImageFile _handler = None ## # Install application-specific FITS image handler. # # @param handler Handler object. def register_handler(handler): global _handler _handler = handler # -------------------------------------------------------------------- # Image adapter def _accept(prefix): return prefix[:6] == b"SIMPLE" class FITSStubImageFile(ImageFile.StubImageFile): format = "FITS" format_description = "FITS" def _open(self): offset = self.fp.tell() if not _accept(self.fp.read(6)): raise SyntaxError("Not a FITS file") # FIXME: add more sanity checks here; mandatory header items # include SIMPLE, BITPIX, NAXIS, etc. self.fp.seek(offset) # make something up self.mode = "F" self.size = 1, 1 loader = self._load() if loader: loader.open(self) def _load(self): return _handler def _save(im, fp, filename): if _handler is None or not hasattr("_handler", "save"): raise IOError("FITS save handler not installed") _handler.save(im, fp, filename) # -------------------------------------------------------------------- # Registry Image.register_open(FITSStubImageFile.format, FITSStubImageFile, _accept) Image.register_save(FITSStubImageFile.format, _save) Image.register_extension(FITSStubImageFile.format, ".fit") Image.register_extension(FITSStubImageFile.format, ".fits") pillow-2.3.0/PIL/ImagePath.py0000644000175000001440000000231712257506326014545 0ustar dokousers# # The Python Imaging Library # $Id$ # # path interface # # History: # 1996-11-04 fl Created # 2002-04-14 fl Added documentation stub class # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # from PIL import Image # the Python class below is overridden by the C implementation. class Path: def __init__(self, xy): pass ## # Compacts the path, by removing points that are close to each # other. This method modifies the path in place. def compact(self, distance=2): pass ## # Gets the bounding box. def getbbox(self): pass ## # Maps the path through a function. def map(self, function): pass ## # Converts the path to Python list. # # @param flat By default, this function returns a list of 2-tuples # [(x, y), ...]. If this argument is true, it returns a flat # list [x, y, ...] instead. # @return A list of coordinates. def tolist(self, flat=0): pass ## # Transforms the path. def transform(self, matrix): pass # override with C implementation Path = Image.core.path pillow-2.3.0/py3.h0000644000175000001440000000402312257506326012570 0ustar dokousers/* Python3 definition file to consistently map the code to Python 2.6 or Python 3. PyInt and PyLong were merged into PyLong in Python 3, so all PyInt functions are mapped to PyLong. PyString, on the other hand, was split into PyBytes and PyUnicode. We map both back onto PyString, so use PyBytes or PyUnicode where appropriate. The only exception to this is _imagingft.c, where PyUnicode is left alone. */ #if PY_VERSION_HEX >= 0x03000000 #define PY_ARG_BYTES_LENGTH "y#" /* Map PyInt -> PyLong */ #define PyInt_AsLong PyLong_AsLong #define PyInt_Check PyLong_Check #define PyInt_FromLong PyLong_FromLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_FromSsize_t PyLong_FromSsize_t #else /* PY_VERSION_HEX < 0x03000000 */ #define PY_ARG_BYTES_LENGTH "s#" #if !defined(KEEP_PY_UNICODE) /* Map PyUnicode -> PyString */ #undef PyUnicode_AsString #undef PyUnicode_AS_STRING #undef PyUnicode_Check #undef PyUnicode_FromStringAndSize #undef PyUnicode_FromString #undef PyUnicode_FromFormat #undef PyUnicode_DecodeFSDefault #define PyUnicode_AsString PyString_AsString #define PyUnicode_AS_STRING PyString_AS_STRING #define PyUnicode_Check PyString_Check #define PyUnicode_FromStringAndSize PyString_FromStringAndSize #define PyUnicode_FromString PyString_FromString #define PyUnicode_FromFormat PyString_FromFormat #define PyUnicode_DecodeFSDefault PyString_FromString #endif /* Map PyBytes -> PyString */ #define PyBytesObject PyStringObject #define PyBytes_AsString PyString_AsString #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_Check PyString_Check #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromString PyString_FromString #define _PyBytes_Resize _PyString_Resize #endif /* PY_VERSION_HEX < 0x03000000 */ pillow-2.3.0/display.c0000644000175000001440000005303412257506326013523 0ustar dokousers/* * The Python Imaging Library. * * display support (and other windows-related stuff) * * History: * 1996-05-13 fl Windows DIB support * 1996-05-21 fl Added palette stuff * 1996-05-28 fl Added display_mode stuff * 1997-09-21 fl Added draw primitive * 2001-09-17 fl Added ImagingGrabScreen (from _grabscreen.c) * 2002-05-12 fl Added ImagingListWindows * 2002-11-19 fl Added clipboard support * 2002-11-25 fl Added GetDC/ReleaseDC helpers * 2003-05-21 fl Added create window support (including window callback) * 2003-09-05 fl Added fromstring/tostring methods * 2009-03-14 fl Added WMF support (from pilwmf) * * Copyright (c) 1997-2003 by Secret Labs AB. * Copyright (c) 1996-1997 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Python.h" #include "Imaging.h" #include "py3.h" /* -------------------------------------------------------------------- */ /* Windows DIB support */ #ifdef WIN32 #include "ImDib.h" typedef struct { PyObject_HEAD ImagingDIB dib; } ImagingDisplayObject; static PyTypeObject ImagingDisplayType; static ImagingDisplayObject* _new(const char* mode, int xsize, int ysize) { ImagingDisplayObject *display; if (PyType_Ready(&ImagingDisplayType) < 0) return NULL; display = PyObject_New(ImagingDisplayObject, &ImagingDisplayType); if (display == NULL) return NULL; display->dib = ImagingNewDIB(mode, xsize, ysize); if (!display->dib) { Py_DECREF(display); return NULL; } return display; } static void _delete(ImagingDisplayObject* display) { if (display->dib) ImagingDeleteDIB(display->dib); PyObject_Del(display); } static PyObject* _expose(ImagingDisplayObject* display, PyObject* args) { int hdc; if (!PyArg_ParseTuple(args, "i", &hdc)) return NULL; ImagingExposeDIB(display->dib, hdc); Py_INCREF(Py_None); return Py_None; } static PyObject* _draw(ImagingDisplayObject* display, PyObject* args) { int hdc; int dst[4]; int src[4]; if (!PyArg_ParseTuple(args, "i(iiii)(iiii)", &hdc, dst+0, dst+1, dst+2, dst+3, src+0, src+1, src+2, src+3)) return NULL; ImagingDrawDIB(display->dib, hdc, dst, src); Py_INCREF(Py_None); return Py_None; } extern Imaging PyImaging_AsImaging(PyObject *op); static PyObject* _paste(ImagingDisplayObject* display, PyObject* args) { Imaging im; PyObject* op; int xy[4]; xy[0] = xy[1] = xy[2] = xy[3] = 0; if (!PyArg_ParseTuple(args, "O|(iiii)", &op, xy+0, xy+1, xy+2, xy+3)) return NULL; im = PyImaging_AsImaging(op); if (!im) return NULL; if (xy[2] <= xy[0]) xy[2] = xy[0] + im->xsize; if (xy[3] <= xy[1]) xy[3] = xy[1] + im->ysize; ImagingPasteDIB(display->dib, im, xy); Py_INCREF(Py_None); return Py_None; } static PyObject* _query_palette(ImagingDisplayObject* display, PyObject* args) { int hdc; int status; if (!PyArg_ParseTuple(args, "i", &hdc)) return NULL; status = ImagingQueryPaletteDIB(display->dib, hdc); return Py_BuildValue("i", status); } static PyObject* _getdc(ImagingDisplayObject* display, PyObject* args) { int window; HDC dc; if (!PyArg_ParseTuple(args, "i", &window)) return NULL; dc = GetDC((HWND) window); if (!dc) { PyErr_SetString(PyExc_IOError, "cannot create dc"); return NULL; } return Py_BuildValue("i", (int) dc); } static PyObject* _releasedc(ImagingDisplayObject* display, PyObject* args) { int window, dc; if (!PyArg_ParseTuple(args, "ii", &window, &dc)) return NULL; ReleaseDC((HWND) window, (HDC) dc); Py_INCREF(Py_None); return Py_None; } static PyObject* _frombytes(ImagingDisplayObject* display, PyObject* args) { char* ptr; int bytes; #if PY_VERSION_HEX >= 0x03000000 if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes)) return NULL; #else if (!PyArg_ParseTuple(args, "s#:fromstring", &ptr, &bytes)) return NULL; #endif if (display->dib->ysize * display->dib->linesize != bytes) { PyErr_SetString(PyExc_ValueError, "wrong size"); return NULL; } memcpy(display->dib->bits, ptr, bytes); Py_INCREF(Py_None); return Py_None; } static PyObject* _tobytes(ImagingDisplayObject* display, PyObject* args) { #if PY_VERSION_HEX >= 0x03000000 if (!PyArg_ParseTuple(args, ":tobytes")) return NULL; #else if (!PyArg_ParseTuple(args, ":tostring")) return NULL; #endif return PyBytes_FromStringAndSize( display->dib->bits, display->dib->ysize * display->dib->linesize ); } static struct PyMethodDef methods[] = { {"draw", (PyCFunction)_draw, 1}, {"expose", (PyCFunction)_expose, 1}, {"paste", (PyCFunction)_paste, 1}, {"query_palette", (PyCFunction)_query_palette, 1}, {"getdc", (PyCFunction)_getdc, 1}, {"releasedc", (PyCFunction)_releasedc, 1}, {"frombytes", (PyCFunction)_frombytes, 1}, {"tobytes", (PyCFunction)_tobytes, 1}, {"fromstring", (PyCFunction)_frombytes, 1}, {"tostring", (PyCFunction)_tobytes, 1}, {NULL, NULL} /* sentinel */ }; static PyObject* _getattr_mode(ImagingDisplayObject* self, void* closure) { return Py_BuildValue("s", self->dib->mode); } static PyObject* _getattr_size(ImagingDisplayObject* self, void* closure) { return Py_BuildValue("ii", self->dib->xsize, self->dib->ysize); } static struct PyGetSetDef getsetters[] = { { "mode", (getter) _getattr_mode }, { "size", (getter) _getattr_size }, { NULL } }; static PyTypeObject ImagingDisplayType = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingDisplay", /*tp_name*/ sizeof(ImagingDisplayObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_delete, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ getsetters, /*tp_getset*/ }; PyObject* PyImaging_DisplayWin32(PyObject* self, PyObject* args) { ImagingDisplayObject* display; char *mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) return NULL; display = _new(mode, xsize, ysize); if (display == NULL) return NULL; return (PyObject*) display; } PyObject* PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) { char *mode; int size[2]; mode = ImagingGetModeDIB(size); return Py_BuildValue("s(ii)", mode, size[0], size[1]); } /* -------------------------------------------------------------------- */ /* Windows screen grabber */ PyObject* PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) { int width, height; HBITMAP bitmap; BITMAPCOREHEADER core; HDC screen, screen_copy; PyObject* buffer; /* step 1: create a memory DC large enough to hold the entire screen */ screen = CreateDC("DISPLAY", NULL, NULL, NULL); screen_copy = CreateCompatibleDC(screen); width = GetDeviceCaps(screen, HORZRES); height = GetDeviceCaps(screen, VERTRES); bitmap = CreateCompatibleBitmap(screen, width, height); if (!bitmap) goto error; if (!SelectObject(screen_copy, bitmap)) goto error; /* step 2: copy bits into memory DC bitmap */ if (!BitBlt(screen_copy, 0, 0, width, height, screen, 0, 0, SRCCOPY)) goto error; /* step 3: extract bits from bitmap */ buffer = PyBytes_FromStringAndSize(NULL, height * ((width*3 + 3) & -4)); if (!buffer) return NULL; core.bcSize = sizeof(core); core.bcWidth = width; core.bcHeight = height; core.bcPlanes = 1; core.bcBitCount = 24; if (!GetDIBits(screen_copy, bitmap, 0, height, PyBytes_AS_STRING(buffer), (BITMAPINFO*) &core, DIB_RGB_COLORS)) goto error; DeleteObject(bitmap); DeleteDC(screen_copy); DeleteDC(screen); return Py_BuildValue("(ii)N", width, height, buffer); error: PyErr_SetString(PyExc_IOError, "screen grab failed"); DeleteDC(screen_copy); DeleteDC(screen); return NULL; } static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) { PyObject* window_list = (PyObject*) lParam; PyObject* item; PyObject* title; RECT inner, outer; int title_size; int status; /* get window title */ title_size = GetWindowTextLength(hwnd); if (title_size > 0) { title = PyUnicode_FromStringAndSize(NULL, title_size); if (title) GetWindowText(hwnd, PyUnicode_AS_UNICODE(title), title_size+1); } else title = PyUnicode_FromString(""); if (!title) return 0; /* get bounding boxes */ GetClientRect(hwnd, &inner); GetWindowRect(hwnd, &outer); item = Py_BuildValue( "nN(iiii)(iiii)", (Py_ssize_t) hwnd, title, inner.left, inner.top, inner.right, inner.bottom, outer.left, outer.top, outer.right, outer.bottom ); if (!item) return 0; status = PyList_Append(window_list, item); Py_DECREF(item); if (status < 0) return 0; return 1; } PyObject* PyImaging_ListWindowsWin32(PyObject* self, PyObject* args) { PyObject* window_list; window_list = PyList_New(0); if (!window_list) return NULL; EnumWindows(list_windows_callback, (LPARAM) window_list); if (PyErr_Occurred()) { Py_DECREF(window_list); return NULL; } return window_list; } /* -------------------------------------------------------------------- */ /* Windows clipboard grabber */ PyObject* PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args) { int clip; HANDLE handle; int size; void* data; PyObject* result; int verbose = 0; /* debugging; will be removed in future versions */ if (!PyArg_ParseTuple(args, "|i", &verbose)) return NULL; clip = OpenClipboard(NULL); /* FIXME: check error status */ if (verbose) { UINT format = EnumClipboardFormats(0); char buffer[200]; char* result; while (format != 0) { if (GetClipboardFormatName(format, buffer, sizeof buffer) > 0) result = buffer; else switch (format) { case CF_BITMAP: result = "CF_BITMAP"; break; case CF_DIB: result = "CF_DIB"; break; case CF_DIF: result = "CF_DIF"; break; case CF_ENHMETAFILE: result = "CF_ENHMETAFILE"; break; case CF_HDROP: result = "CF_HDROP"; break; case CF_LOCALE: result = "CF_LOCALE"; break; case CF_METAFILEPICT: result = "CF_METAFILEPICT"; break; case CF_OEMTEXT: result = "CF_OEMTEXT"; break; case CF_OWNERDISPLAY: result = "CF_OWNERDISPLAY"; break; case CF_PALETTE: result = "CF_PALETTE"; break; case CF_PENDATA: result = "CF_PENDATA"; break; case CF_RIFF: result = "CF_RIFF"; break; case CF_SYLK: result = "CF_SYLK"; break; case CF_TEXT: result = "CF_TEXT"; break; case CF_WAVE: result = "CF_WAVE"; break; case CF_TIFF: result = "CF_TIFF"; break; case CF_UNICODETEXT: result = "CF_UNICODETEXT"; break; default: sprintf(buffer, "[%d]", format); result = buffer; break; } printf("%s (%d)\n", result, format); format = EnumClipboardFormats(format); } } handle = GetClipboardData(CF_DIB); if (!handle) { /* FIXME: add CF_HDROP support to allow cut-and-paste from the explorer */ CloseClipboard(); Py_INCREF(Py_None); return Py_None; } size = GlobalSize(handle); data = GlobalLock(handle); #if 0 /* calculate proper size for string formats */ if (format == CF_TEXT || format == CF_OEMTEXT) size = strlen(data); else if (format == CF_UNICODETEXT) size = wcslen(data) * 2; #endif result = PyBytes_FromStringAndSize(data, size); GlobalUnlock(handle); CloseClipboard(); return result; } /* -------------------------------------------------------------------- */ /* Windows class */ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 522 #endif static int mainloop = 0; static void callback_error(const char* handler) { PyObject* sys_stderr; sys_stderr = PySys_GetObject("stderr"); if (sys_stderr) { PyFile_WriteString("*** ImageWin: error in ", sys_stderr); PyFile_WriteString((char*) handler, sys_stderr); PyFile_WriteString(":\n", sys_stderr); } PyErr_Print(); PyErr_Clear(); } static LRESULT CALLBACK windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; PyObject* callback = NULL; PyObject* result; PyThreadState* threadstate; PyThreadState* current_threadstate; HDC dc; RECT rect; LRESULT status = 0; /* set up threadstate for messages that calls back into python */ switch (message) { case WM_CREATE: mainloop++; break; case WM_DESTROY: mainloop--; /* fall through... */ case WM_PAINT: case WM_SIZE: callback = (PyObject*) GetWindowLong(wnd, 0); if (callback) { threadstate = (PyThreadState*) GetWindowLong(wnd, sizeof(PyObject*)); current_threadstate = PyThreadState_Swap(NULL); PyEval_RestoreThread(threadstate); } else return DefWindowProc(wnd, message, wParam, lParam); } /* process message */ switch (message) { case WM_PAINT: /* redraw (part of) window. this generates a WCK-style damage/clear/repair cascade */ BeginPaint(wnd, &ps); dc = GetDC(wnd); GetWindowRect(wnd, &rect); /* in screen coordinates */ result = PyObject_CallFunction( callback, "siiii", "damage", ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom ); if (result) Py_DECREF(result); else callback_error("window damage callback"); result = PyObject_CallFunction( callback, "siiiii", "clear", (int) dc, 0, 0, rect.right-rect.left, rect.bottom-rect.top ); if (result) Py_DECREF(result); else callback_error("window clear callback"); result = PyObject_CallFunction( callback, "siiiii", "repair", (int) dc, 0, 0, rect.right-rect.left, rect.bottom-rect.top ); if (result) Py_DECREF(result); else callback_error("window repair callback"); ReleaseDC(wnd, dc); EndPaint(wnd, &ps); break; case WM_SIZE: /* resize window */ result = PyObject_CallFunction( callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam) ); if (result) { InvalidateRect(wnd, NULL, 1); Py_DECREF(result); } else callback_error("window resize callback"); break; case WM_DESTROY: /* destroy window */ result = PyObject_CallFunction(callback, "s", "destroy"); if (result) Py_DECREF(result); else callback_error("window destroy callback"); Py_DECREF(callback); break; default: status = DefWindowProc(wnd, message, wParam, lParam); } if (callback) { /* restore thread state */ PyEval_SaveThread(); PyThreadState_Swap(threadstate); } return status; } PyObject* PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) { HWND wnd; WNDCLASS windowClass; char* title; PyObject* callback; int width = 0, height = 0; if (!PyArg_ParseTuple(args, "sO|ii", &title, &callback, &width, &height)) return NULL; if (width <= 0) width = CW_USEDEFAULT; if (height <= 0) height = CW_USEDEFAULT; /* register toplevel window class */ windowClass.style = CS_CLASSDC; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = sizeof(PyObject*) + sizeof(PyThreadState*); windowClass.hInstance = GetModuleHandle(NULL); /* windowClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); */ windowClass.hbrBackground = NULL; windowClass.lpszMenuName = NULL; windowClass.lpszClassName = "pilWindow"; windowClass.lpfnWndProc = windowCallback; windowClass.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1)); windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); /* CROSS? */ RegisterClass(&windowClass); /* FIXME: check return status */ wnd = CreateWindowEx( 0, windowClass.lpszClassName, title, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, HWND_DESKTOP, NULL, NULL, NULL ); if (!wnd) { PyErr_SetString(PyExc_IOError, "failed to create window"); return NULL; } /* register window callback */ Py_INCREF(callback); SetWindowLongPtr(wnd, 0, (LONG_PTR) callback); SetWindowLongPtr(wnd, sizeof(callback), (LONG_PTR) PyThreadState_Get()); Py_BEGIN_ALLOW_THREADS ShowWindow(wnd, SW_SHOWNORMAL); SetForegroundWindow(wnd); /* to make sure it's visible */ Py_END_ALLOW_THREADS return Py_BuildValue("n", (Py_ssize_t) wnd); } PyObject* PyImaging_EventLoopWin32(PyObject* self, PyObject* args) { MSG msg; Py_BEGIN_ALLOW_THREADS while (mainloop && GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Py_END_ALLOW_THREADS Py_INCREF(Py_None); return Py_None; } /* -------------------------------------------------------------------- */ /* windows WMF renderer */ #define GET32(p,o) ((DWORD*)(p+o))[0] PyObject * PyImaging_DrawWmf(PyObject* self, PyObject* args) { HBITMAP bitmap; HENHMETAFILE meta; BITMAPCOREHEADER core; HDC dc; RECT rect; PyObject* buffer = NULL; char* ptr; char* data; int datasize; int width, height; int x0, y0, x1, y1; if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH"(ii)(iiii):_load", &data, &datasize, &width, &height, &x0, &x1, &y0, &y1)) return NULL; /* step 1: copy metafile contents into METAFILE object */ if (datasize > 22 && GET32(data, 0) == 0x9ac6cdd7) { /* placeable windows metafile (22-byte aldus header) */ meta = SetWinMetaFileBits(datasize-22, data+22, NULL, NULL); } else if (datasize > 80 && GET32(data, 0) == 1 && GET32(data, 40) == 0x464d4520) { /* enhanced metafile */ meta = SetEnhMetaFileBits(datasize, data); } else { /* unknown meta format */ meta = NULL; } if (!meta) { PyErr_SetString(PyExc_IOError, "cannot load metafile"); return NULL; } /* step 2: create bitmap */ core.bcSize = sizeof(core); core.bcWidth = width; core.bcHeight = height; core.bcPlanes = 1; core.bcBitCount = 24; dc = CreateCompatibleDC(NULL); bitmap = CreateDIBSection( dc, (BITMAPINFO*) &core, DIB_RGB_COLORS, &ptr, NULL, 0 ); if (!bitmap) { PyErr_SetString(PyExc_IOError, "cannot create bitmap"); goto error; } if (!SelectObject(dc, bitmap)) { PyErr_SetString(PyExc_IOError, "cannot select bitmap"); goto error; } /* step 3: render metafile into bitmap */ rect.left = rect.top = 0; rect.right = width; rect.bottom = height; /* FIXME: make background transparent? configurable? */ FillRect(dc, &rect, GetStockObject(WHITE_BRUSH)); if (!PlayEnhMetaFile(dc, meta, &rect)) { PyErr_SetString(PyExc_IOError, "cannot render metafile"); goto error; } /* step 4: extract bits from bitmap */ GdiFlush(); buffer = PyBytes_FromStringAndSize(ptr, height * ((width*3 + 3) & -4)); error: DeleteEnhMetaFile(meta); if (bitmap) DeleteObject(bitmap); DeleteDC(dc); return buffer; } #endif /* WIN32 */ pillow-2.3.0/CHANGES.rst0000644000175000001440000023000012260450372013473 0ustar dokousersChangelog (Pillow) ================== 2.3.0 (2014-01-01) ------------------ - Stop leaking filename parameter passed to getfont [jpharvey] - Report availability of LIBTIFF during setup and selftest [cgohlke] - Fix msvc build error C1189: "No Target Architecture" [cgohlke] - Fix memory leak in font_getsize [wiredfool] - Correctly prioritize include and library paths [ohanar] - Image.point fixes for numpy.array and docs [wiredfool] - Save the transparency header by default for PNGs [wiredfool] - Support for PNG tRNS header when converting from RGB->RGBA [wiredfool] - PyQT5 Support [wiredfool] - Updates for saving color tiffs w/compression using libtiff [wiredfool] - 2gigapix image fixes and redux [wiredfool] - Save arbitrary tags in Tiff image files [wiredfool] - Quote filenames and title before using on command line [tmccombs] - Fixed Viewer.show to return properly [tmccombs] - Documentation fixes [wiredfool] - Fixed memory leak saving images as webp when webpmux is available [cezarsa] - Fix compiling with FreeType 2.5.1 [stromnov] - Adds directories for NetBSD. [deepy] - Support RGBA TIFF with missing ExtraSamples tag [cgohlke] - Lossless WEBP Support [wiredfool] - Take compression as an option in the save call for tiffs [wiredfool] - Add support for saving lossless WebP. Just pass 'lossless=True' to save() [liftoff] - LCMS support upgraded from version 1 to version 2, fixes #343 [wiredfool] - Added more raw decoder 16 bit pixel formats [svanheulen] - Document remaining Image* modules listed in PIL handbook [irksep] - Document ImageEnhance, ImageFile, ImageFilter, ImageFont, ImageGrab, ImageMath, and ImageOps [irksep] - Port and update docs for Image, ImageChops, ImageColor, and ImageDraw [irksep] - Move or copy content from README.rst to docs/ [irksep] - Respect CFLAGS/LDFLAGS when searching for headers/libs [iElectric] - Port PIL Handbook tutorial and appendices [irksep] - Alpha Premultiplication support for transform and resize [wiredfool] - Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 [wiredfool] 2.2.2 (2013-12-11) ------------------ - Fix #427: compiling with FreeType 2.5.1 [stromnov] 2.2.1 (2013-10-02) ------------------ - Fix #356: Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) [wiredfool] 2.2.0 (2013-10-02) ------------------ - Fix #254: Bug in image transformations resulting from uninitialized memory [nikmolnar] - Fix for encoding of b_whitespace, similar to closed issue #272 [mhogg] - Fix #273: Add numpy array interface support for 16 and 32 bit integer modes [cgohlke] - Partial fix for #290: Add preliminary support for TIFF tags. [wiredfool] - Fix #251 and #326: circumvent classification of pngtest_bad.png as malware [cgohlke] - Add typedef uint64_t for MSVC. [cgohlke] - Fix #329: setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. [nu774] - Fix #328: _imagingcms.c: include windef.h to fix build issue on MSVC [nu774] - Automatically discover homebrew include/ and lib/ paths on OSX [donspaulding] - Fix bytes which should be bytearray [manisandro] - Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build if specified as environment variables. [seanupton] - Fix #312 + gif optimize improvement [d-schmidt] - Be more tolerant of tag read failures [ericbuehl] - Fix #318: Catch truncated zTXt errors. [vytisb] - Fix IOError when saving progressive JPEGs. [e98cuenc] - Add RGBA support to ImageColor [yoavweiss] - Fix #304: test for `str`, not `"utf-8"`. [mjpieters] - Fix missing import os in _util.py. [mnowotka] - Added missing exif tags. [freyes] - Fail on all import errors, fixes #298. [macfreek, wiredfool] - Fixed Windows fallback (wasn't using correct file in Windows fonts). [lmollea] - Moved ImageFile and ImageFileIO comments to docstrings. [freyes] - Restore compatibility with ISO C. [cgohlke] - Use correct format character for C int type. [cgohlke] - Allocate enough memory to hold pointers in encode.c. [cgohlke] - Fix #279, fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff. [wiredfool] - Moved Image module comments to docstrings. [freyes] - Add 16-bit TIFF support, fixes #274. [wiredfool] - Ignore high ascii characters in string.whitespace, fixes #272. [wiredfool] - Added clean/build to tox to make it behave like travis. [freyes] - Adding support for metadata in webp images. [heynemann] 2.1.0 (2013-07-02) ------------------ - Add /usr/bin/env python shebangs to all scripts in /Scripts. - Add several TIFF decoders and encoders. - Added support for alpha transparent webp images. - Adding Python 3 support for StringIO. - Adding Python3 basestring compatibility without changing basestring. - Fix webp encode errors on win-amd64. - Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1. - Better support for ICO images. - Changed PY_VERSION_HEX, fixes #166. - Changes to put everything under the PIL namespace. [wiredfool] - Changing StringIO to BytesIO. - Cleanup whitespace. [Arfrever] - Don't skip 'import site' on initialization when running tests for inplace builds. [cgohlke] - Enable warnings for test suite. - Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) - Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6 - Fix #193: remove double typedef declaration. - Fix msvc compile errors (#230). - Fix rendered characters have been chipped for some TrueType fonts. - Fix usage of pilfont.py script. - Fresh start for docs, generated by sphinx-apidoc. - Introduce --enable-x and fail if it is given and x is not available. - Partial work to add a wrapper for WebPGetFeatures to correctly support #204. - Significant performance improvement of `alpha_composite` function. - Support explicitly disabling features via --disable-* options. - Support selftest.py --installed, fixes #263. - Transparent WebP Support, #204 - Use PyCapsule for py3.1, fixes #237. - Workaround for: http://bugs.python.org/16754 in 3.2.x < 3.2.4 and 3.3.0. 2.0.0 (2013-03-15) ------------------ - Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) [fluggo] - Add PyPy support (experimental, please see: https://github.com/python-imaging/Pillow/issues/67) - Add WebP support. [lqs] - Add Tiff G3/G4 support (experimental) [wiredfool] - Backport PIL's PNG/Zip improvements. [olt] - Various 64 bit and Windows fixes. [cgohlke] - Add testing suite. [cgohlke, fluggo] - Added support for PNG images with transparency palette. [d-schmidt] - Many other bug fixes and enhancements by many other people (see commit log and/or docs/CONTRIBUTORS.txt). - Special thanks to Christoph Gohlke and Eric Soroos for rallying around the effort to get a release out for PyCon 2013. 1.7.8 (2012-11-01) ------------------ - Removed doctests.py that made tests of other packages fail. [thomasdesvenain] - Fix opening psd files with RGBA layers when A mode is not of type 65535 but 3. Fixes #3 [thomasdesvenain] 1.7.7 (2012-04-04) ------------------ - UNDEF more types before including windows headers [mattip] 1.7.6 (2012-01-20) ------------------ - Bug fix: freetype not found on Mac OS X with case-sensitive filesystem [gjo] - Bug fix: Backport fix to split() after open() (regression introduced in PIL 1.1.7). [sfllaw] 1.7.5 (2011-09-07) ------------------ - Fix for sys.platform = "linux3" [blueyed] - Package cleanup and additional documentation [aclark] 1.7.4 (2011-07-21) ------------------ - Fix brown bag release [aclark] 1.7.3 (2011-07-20) ------------------ - Fix : resize need int values, append int conversion in thumbnail method [harobed] 1.7.2 (2011-06-02) ------------------ - Bug fix: Python 2.4 compat [aclark] 1.7.1 (2011-05-31) ------------------ - More multi-arch support [SteveM, regebro, barry, aclark] 1.7.0 (2011-05-27) ------------------ - Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu [aclark] 1.6 (12/01/2010) ---------------- - Bug fix: /usr/x11/include should be added to include_dirs not library_dirs [elro] - Doc fixes 1.5 (11/28/2010) ---------------- - Module and package fixes 1.4 (11/28/2010) ---------------- - Doc fixes 1.3 (11/28/2010) ---------------- - Add support for /lib64 and /usr/lib64 library directories on Linux - Doc fixes 1.2 (08/02/2010) ---------------- - On OS X also check for freetype2 in the X11 path [jezdez] - Doc fixes [aclark] 1.1 (07/31/2010) ---------------- - Removed setuptools_hg requirement - Doc fixes 1.0 (07/30/2010) ---------------- - Forked PIL based on Hanno Schlichting's re-packaging (http://dist.plone.org/thirdparty/PIL-1.1.7.tar.gz) - Remove support for importing from the standard namespace .. Note:: What follows is the original PIL 1.1.7 CHANGES file contents :: -*- coding: utf-8 -*- The Python Imaging Library $Id$ ACKNOWLEDGEMENTS: PIL wouldn't be what it is without the help of: David Ascher, Phil Austin, Douglas Bagnall, Larry Bates, Anthony Baxter, William Baxter, Denis Benoit, Jan Blom, Duncan Booth, Alexey Borzenkov, Jeff Breidenbach, Roger Burnham, Zac Burns, Gene Cash, Kevin Cazabon, Fred Clare, Greg Coats, Chris Cogdon, Greg Couch, Bill Crutchfield, Abel Deuring, Tim Docker, Fred Drake, Graham Dumpleton, Matthew Ellis, Eric Etheridge, Daniel Fetchinson, Robin Friedrich, Pier Paolo Glave, Federico Di Gregorio, Markus Gritsch, Daniel Haertle, Greg Hamilton, Mark Hammond, Bernhard Herzog, Rob Hooft, Bob Ippolito, Jack Jansen, Bill Janssen, Edward Jones, Richard Jones, Håkan Karlsson, Robert Kern, David Kirtley, Bob Klimek, Matthias Klose, Andrew Kuchling, Magnus Källström, Victor Lacina, Ben Last, Hamish Lawson, Cesare Leonardi, Andrew MacIntyre, Jan Matejek, Naveen Michaud-Agrawal, Gordon McMillan, Skip Montanaro, Fredrik Nehr, Russell Nelson, Luciano Nocera, Travis Oliphant, Piet van Oostrum, Richard Oudkerk, Paul Pharr, Andres Polit, Conrado Porto Lopes Gouvêa, Eric Raymond, Victor Reijs, Bertil Reinhammar, Nicholas Riley, Don Rozenberg, Toby Sargeant, Barry Scott, Les Schaffer, Joel Shprentz, Klamer Shutte, Gene Skonicki, Niki Spahiev, D. Alan Stewart, Perry Stoll, Paul Svensson, Ulrik Svensson, Miki Tebeka, Michael van Tellingen, Ivan Tkatchev, Dan Torop, Adam Twardoch, Rune Uhlin, Dmitry Vasiliev, Sasha Voynow, Charles Waldman, Collin Winter, Dan Wolfe, Ka-Ping Yee, and many others (if your name should be on this list, let me know.) *** Changes from release 1.1.6 to 1.1.7 *** This section may not be fully complete. For changes since this file was last updated, see the repository revision history: http://bitbucket.org/effbot/pil-2009-raclette/changesets/ (1.1.7 final) + Set GIF loop info property to the number of iterations if a NETSCAPE loop extension is present, instead of always setting it to 1 (from Valentino Volonghi). (1.1.7c1 released) + Improved PNG compression (from Alexey Borzenkov). + Read interlaced PNG files (from Conrado Porto Lopes Gouvêa) + Added various TGA improvements from Alexey Borzenkov, including support for specifying image orientation. + Bumped block threshold to 16 megabytes, made size estimation a bit more accurate. This speeds up allocation of large images. + Fixed rounding error in ImagingDrawWideLine. "gormish" writes: ImagingDrawWideLine() in Draw.c has a bug in every version I've seen, which leads to different width lines depending on the order of the points in the line. This is especially bad at some angles where a 'width=2' line can completely disappear. + Added support for RGBA mode to the SGI module (based on code by Karsten Hiddemann). + Handle repeated IPTC tags (adapted from a patch by Eric Bruning). Eric writes: According to the specification, some IPTC tags can be repeated, e.g., tag 2:25 (keywords). PIL 1.1.6 only retained the last instance of that tag. Below is a patch to store all tags. If there are multiple tag instances, they are stored in a (python) list. Single tag instances remain as strings. + Fixed potential crash in ImageFilter for small target images (reported by Zac Burns and Daniel Fetchinson). + Use BMP instead of JPEG as temporary show format on Mac OS X. + Fixed putpixel/new for I;16 with colors > 255. + Added integer power support to ImagingMath. + Added limited support for I;16L mode (explicit little endian). + Moved WMF support into Image.core; enable WMF rendering by default if renderer is available. + Mark the ARG plugin as obsolete. + Added version query mechanism to ImageCms and ImageFont, for debugging. + Added (experimental) ImageCms function for fetching the ICC profile for the current display (currently Windows only). Added HWND/HDC support to ImageCms.get_display_profile(). + Added WMF renderer (Windows only). + Added ImagePointHandler and ImageTransformHandler mixins; made ImageCmsTransform work with im.point. + Fixed potential endless loop in the XVThumbnail reader (from Nikolai Ugelvik). + Added Kevin Cazabon's pyCMS package. The C code has been moved to _imagingcms.c, the Python interface module is installed as PIL.ImageCMS. Added support for in-memory ICC profiles. Unified buildTransform and buildTransformFromOpenProfiles. The profile can now be either a filename, a profile object, or a file-like object containing an in-memory profile. Additional fixes from Florian Böch: Very nice - it just needs LCMS flags support so we can use black point compensation and softproofing :) See attached patches. They also fix a naming issue which could cause confusion - display profile (ImageCms wording) actually means proof profile (lcms wording), so I changed variable names and docstrings where applicable. Patches are tested under Python 2.6. + Improved support for layer names in PSD files (from Sylvain Baubeau) Sylvain writes: I needed to be able to retrieve the names of the layers in a PSD files. But PsdImagePlugin.py didn't do the job so I wrote this very small patch. + Improved RGBA support for ImageTk for 8.4 and newer (from Con Radchenko). This replaces the slow run-length based encoding model with true compositing at the Tk level. + Added support for 16- and 32-bit images to McIdas loader. Based on file samples and stand-alone reader code provided by Craig Swank. + Added ImagePalette support to putpalette. + Fixed problem with incremental parsing of PNG files. + Make selftest.py report non-zero status on failure (from Mark Sienkiewicz) + Add big endian save support and multipage infrastructure to the TIFF writer (from Sebastian Haase). + Handle files with GPS IFD but no basic EXIF IFD (reported by Kurt Schwehr). + Added zTXT support (from Andrew Kuchling via Lowell Alleman). + Fixed potential infinite loop bug in ImageFont (from Guilherme Polo). + Added sample ICC profiles (from Kevin Cazabon) + Fixed array interface for I, F, and RGBA/RGBX images. + Added Chroma subsampling support for JPEG (from Justin Huff). Justin writes: Attached is a patch (against PIL 1.1.6) to provide control over the chroma subsampling done by the JPEG encoder. This is often useful for reducing compression artifacts around edges of clipart and text. + Added USM/Gaussian Blur code from Kevin Cazabon. + Fixed bug w. uninitialized image data when cropping outside the source image. + Use ImageShow to implement the Image.show method. Most notably, this picks the 'display' utility when available. It also allows application code to register new display utilities via the ImageShow registry. + Release the GIL in the PNG compressor (from Michael van Tellingen). + Revised JPEG CMYK handling. Always assume Adobe behaviour, both when reading and writing (based on a patch by Kevin Cazabon, and test data by Tim V. and Charlie Clark, and additional debugging by Michael van Tellingen). + Support for preserving ICC profiles (by Florian Böch via Tim Hatch). Florian writes: It's a beta, so still needs some testing, but should allow you to: - retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF. Existing code doesn't need to be changed. - access embedded profiles in JPEG, PNG, PSD, TIFF. It also includes patches for TIFF to retain IPTC, Photoshop and XMP metadata when saving as TIFF again, read/write TIFF resolution information correctly, and to correct inverted CMYK JPEG files. + Fixed potential memory leak in median cut quantizer (from Evgeny Salmin). + Fixed OverflowError when reading upside-down BMP images. + Added resolution save option for PDF files. Andreas Kostyrka writes: I've included a patched PdfImagePlugin.py based on 1.1.6 as included in Ubuntu, that supports a "resolution" save option. Not great, but it makes the PDF saving more useful by allowing PDFs that are not exactly 72dpi. + Look for Tcl/Tk include files in version-specific include directory (from Encolpe Degoute). + Fixed grayscale rounding error in ImageColor.getcolor (from Tim Hatch). + Fixed calculation of mean value in ImageEnhance.Contrast (reported by "roop" and Scott David Daniels). + Fixed truetype positioning when first character has a negative left bearing (from Ned Batchelder): Ned writes: In PIL 1.1.6, ImageDraw.text will position the string incorrectly if the first character has a negative left bearing. To see the problem, show a string like "///" in an italic font. The first slash will be clipped at the left, and the string will be mis-positioned. + Fixed resolution unit bug in tiff reader/writer (based on code by Florian Höch, Gary Bloom, and others). + Added simple transparency support for RGB images (reported by Sebastian Spaeth). + Added support for Unicode filenames in ImageFont.truetype (from Donn Ingle). + Fixed potential crash in ImageFont.getname method (from Donn Ingle). + Fixed encoding issue in PIL/WalImageFile (from Santiago M. Mola). *** Changes from release 1.1.5 to 1.1.6 *** (1.1.6 released) + Fixed some 64-bit compatibility warnings for Python 2.5. + Added threading support for the Sane driver (from Abel Deuring). (1.1.6b2 released) + Added experimental "floodfill" function to the ImageDraw module (based on code by Eric Raymond). + The default arguments for "frombuffer" doesn't match "fromstring" and the documentation; this is a bug, and will most likely be fixed in a future version. In this release, PIL prints a warning message instead. To silence the warning, change any calls of the form "frombuffer(mode, size, data)" to frombuffer(mode, size, data, "raw", mode, 0, 1) + Added "fromarray" function, which takes an object implementing the NumPy array interface and creates a PIL Image from it. (from Travis Oliphant). + Added NumPy array interface support (__array_interface__) to the Image class (based on code by Travis Oliphant). This allows you to easily convert between PIL image memories and NumPy arrays: import numpy, Image im = Image.open('lena.jpg') a = numpy.asarray(im) # a is readonly im = Image.fromarray(a) + Fixed CMYK polarity for JPEG images, by treating all images as "Adobe CMYK" images. (thanks to Cesare Leonardi and Kevin Cazabon for samples, debugging, and patches). (1.1.6b1 released) + Added 'expand' option to the Image 'rotate' method. If true, the output image is made large enough to hold the entire rotated image. + Changed the ImageDraw 'line' method to always draw the last pixel in a polyline, independent of line angle. + Fixed bearing calculation and clipping in the ImageFont truetype renderer; this could lead to clipped text, or crashes in the low- level _imagingft module. (based on input from Adam Twardoch and others). + Added ImageQt wrapper module, for converting PIL Image objects to QImage objects in an efficient way. + Fixed 'getmodebands' to return the number of bands also for "PA" and "LA" modes. Added 'getmodebandnames' helper that return the band names. (1.1.6a2 released) + Added float/double support to the TIFF loader (from Russell Nelson). + Fixed broken use of realloc() in path.c (from Jan Matejek) + Added save support for Spider images (from William Baxter). + Fixed broken 'paste' and 'resize' operations in pildriver (from Bill Janssen). + Added support for duplex scanning to the Sane interface (Abel Deuring). (1.1.6a1 released) + Fixed a memory leak in "convert(mode)", when converting from L to P. + Added pixel access object. The "load" method now returns a access object that can be used to directly get and set pixel values, using ordinary [x, y] notation: pixel = im.load() v = pixel[x, y] pixel[x, y] = v If you're accessing more than a few pixels, this is a lot faster than using getpixel/putpixel. + Fixed building on Cygwin (from Miki Tebeka). + Fixed "point(callable)" on unloaded images (reported by Håkan Karlsson). + Fixed size bug in ImageWin.ImageWindow constructor (from Victor Reijs) + Fixed ImageMath float() and int() operations for Python 2.4 (reported by Don Rozenberg). + Fixed "RuntimeError: encoder error -8 in tostring" problem for wide "RGB", "I", and "F" images. + Fixed line width calculation. (1.1.6a0 released) + Fixed byte order issue in Image.paste(ink) (from Ka-Ping Yee). + Fixed off-by-0.5 errors in the ANTIALIAS code (based on input from Douglas Bagnall). + Added buffer interface support to the Path constructor. If a buffer is provided, it is assumed to contain a flat array of float coordinates (e.g. array.array('f', seq)). + Added new ImageMath module. + Fixed ImageOps.equalize when used with a small number of distinct values (reported by David Kirtley). + Fixed potential integer division in PSDraw.image (from Eric Etheridge). *** Changes from release 1.1 to 1.1.5 *** (1.1.5c2 and 1.1.5 final released) + Added experimental PERSPECTIVE transform method (from Jeff Breiden- bach). (1.1.5c1 released) + Make sure "thumbnail" never generates zero-wide or zero-high images (reported by Gene Skonicki) + Fixed a "getcolors" bug that could result in a zero count for some colors (reported by Richard Oudkerk). + Changed default "convert" palette to avoid "rounding errors" when round-tripping white source pixels (reported by Henryk Gerlach and Jeff Epler). (1.1.5b3 released) + Don't crash in "quantize" method if the number of colors requested is larger than 256. This release raises a ValueError exception; future versions may return a mode "RGB" image instead (reported by Richard Oudkerk). + Added WBMP read/write support (based on code by Duncan Booth). (1.1.5b2 released) + Added DPI read/write support to the PNG codec. The decoder sets the info["dpi"] attribute for PNG files with appropriate resolution settings. The encoder uses the "dpi" option (based on code by Niki Spahiev). + Added limited support for "point" mappings from mode "I" to mode "L". Only 16-bit values are supported (other values are clipped), the lookup table must contain exactly 65536 entries, and the mode argument must be set to "L". + Added support for Mac OS X icns files (based on code by Bob Ippolito). + Added "ModeFilter" support to the ImageFilter module. + Added support for Spider images (from William Baxter). See the comments in PIL/SpiderImagePlugin.py for more information on this format. (1.1.5b1 released) + Added new Sane release (from Ralph Heinkel). See the Sane/README and Sane/CHANGES files for more information. + Added experimental PngInfo chunk container to the PngImageFile module. This can be used to add arbitrary chunks to a PNG file. Create a PngInfo instance, use "add" or "add_text" to add chunks, and pass the instance as the "pnginfo" option when saving the file. + Added "getpalette" method. This returns the palette as a list, or None if the image has no palette. To modify the palette, use "getpalette" to fetch the current palette, modify the list, and put it back using "putpalette". + Added optional flattening to the ImagePath "tolist" method. tolist() or tolist(0) returns a list of 2-tuples, as before. tolist(1) returns a flattened list instead. (1.1.5a5 released) + Fixed BILINEAR/BICUBIC/ANTIALIAS filtering for mode "LA". + Added "getcolors()" method. This is similar to the existing histo- gram method, but looks at color values instead of individual layers, and returns an unsorted list of (count, color) tuples. By default, the method returns None if finds more than 256 colors. If you need to look for more colors, you can pass in a limit (this is used to allocate internal tables, so you probably don't want to pass in too large values). + Build improvements: Fixed building under AIX, improved detection of FreeType2 and Mac OS X framework libraries, and more. Many thanks to everyone who helped test the new "setup.py" script! (1.1.5a4 released) + The "save" method now looks for a file format driver before creating the file. + Don't use antialiased truetype fonts when drawing in mode "P", "I", and "F" images. + Rewrote the "setup.py" file. The new version scans for available support libraries, and configures both the libImaging core library and the bindings in one step. To use specific versions of the libraries, edit the ROOT variables in the setup.py file. + Removed threaded "show" viewer; use the old "show" implementation instead (Windows). + Added deprecation warnings to Image.offset, ImageDraw.setink, and ImageDraw.setfill. + Added width option to ImageDraw.line(). The current implementation works best for straight lines; it does not support line joins, so polylines won't look good. + ImageDraw.Draw is now a factory function instead of a class. If you need to create custom draw classes, inherit from the ImageDraw class. All other code should use the factory function. + Fixed loading of certain PCX files (problem reported by Greg Hamilton, who also provided samples). + Changed _imagingft.c to require FreeType 2.1 or newer. The module can still be built with earlier versions; see comments in _imagingft.c for details. (1.1.5a3 released) + Added 'getim' method, which returns a PyCObject wrapping an Imaging pointer. The description string is set to IMAGING_MAGIC. See Imaging.h for pointer and string declarations. + Fixed reading of TIFF JPEG images (problem reported by Ulrik Svensson). + Made ImageColor work under Python 1.5.2 + Fixed division by zero "equalize" on very small images (from Douglas Bagnall). (1.1.5a2 released) + The "paste" method now supports the alternative "paste(im, mask)" syntax (in this case, the box defaults to im's bounding box). + The "ImageFile.Parser" class now works also for PNG files with more than one IDAT block. + Added DPI read/write to the TIFF codec, and fixed writing of rational values. The decoder sets the info["dpi"] attribute for TIFF files with appropriate resolution settings. The encoder uses the "dpi" option. + Disable interlacing for small (or narrow) GIF images, to work around what appears to be a hard-to-find bug in PIL's GIF encoder. + Fixed writing of mode "P" PDF images. Made mode "1" PDF images smaller. + Made the XBM reader a bit more robust; the file may now start with a few whitespace characters. + Added support for enhanced metafiles to the WMF driver. The separate PILWMF kit lets you render both placeable WMF files and EMF files as raster images. See http://effbot.org/downloads#pilwmf (1.1.5a1 released) + Replaced broken WMF driver with a WMF stub plugin (see below). + Fixed writing of mode "1", "L", and "CMYK" PDF images (based on input from Nicholas Riley and others). + Fixed adaptive palette conversion for zero-width or zero-height images (from Chris Cogdon) + Fixed reading of PNG images from QuickTime 6 (from Paul Pharr) + Added support for StubImageFile plugins, including stub plugins for BUFR, FITS, GRIB, and HDF5 files. A stub plugin can identify a given file format, but relies on application code to open and save files in that format. + Added optional "encoding" argument to the ImageFont.truetype factory. This argument can be used to specify non-Unicode character maps for fonts that support that. For example, to draw text using the Microsoft Symbol font, use: font = ImageFont.truetype("symbol.ttf", 16, encoding="symb") draw.text((0, 0), unichr(0xF000 + 0xAA)) (note that the symbol font uses characters in the 0xF000-0xF0FF range) Common encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. + Made "putalpha" a bit more robust; you can now attach an alpha layer to a plain "L" or "RGB" image, and you can also specify constant alphas instead of alpha layers (using integers or colour names). + Added experimental "LA" mode support. An "LA" image is an "L" image with an attached transparency layer. Note that support for "LA" is not complete; some operations may fail or produce unexpected results. + Added "RankFilter", "MinFilter", "MedianFilter", and "MaxFilter" classes to the ImageFilter module. + Improved support for applications using multiple threads; PIL now releases the global interpreter lock for many CPU-intensive operations (based on work by Kevin Cazabon). + Ignore Unicode characters in the PCF loader (from Andres Polit) + Fixed typo in OleFileIO.loadfat, which could affect loading of FlashPix and Image Composer images (Daniel Haertle) + Fixed building on platforms that have Freetype but don't have Tcl/Tk (Jack Jansen, Luciano Nocera, Piet van Oostrum and others) + Added EXIF GPSInfo read support for JPEG files. To extract GPSInfo information, open the file, extract the exif dictionary, and check for the key 0x8825 (GPSInfo). If present, it contains a dictionary mapping GPS keys to GPS values. For a list of keys, see the EXIF specification. The "ExifTags" module contains a GPSTAGS dictionary mapping GPS tags to tag names. + Added DPI read support to the PCX and DCX codecs (info["dpi"]). + The "show" methods now uses a built-in image viewer on Windows. This viewer creates an instance of the ImageWindow class (see below) and keeps it running in a separate thread. NOTE: This was disabled in 1.1.5a4. + Added experimental "Window" and "ImageWindow" classes to the ImageWin module. These classes allow you to create a WCK-style toplevel window, and use it to display raster data. + Fixed some Python 1.5.2 issues (to build under 1.5.2, use the Makefile.pre.in/Setup.in approach) + Added support for the TIFF FillOrder tag. PIL can read mode "1", "L", "P" and "RGB" images with non-standard FillOrder (based on input from Jeff Breidenbach). (1.1.4 final released) + Fixed ImageTk build problem on Unix. (1.1.4b2 released) + Improved building on Mac OS X (from Jack Jansen). + Improved building on Windows with MinGW (from Klamer Shutte). + If no font is specified, ImageDraw now uses the embedded default font. Use the "load" or "truetype" methods to load a real font. + Added embedded default font to the ImageFont module (currently an 8-pixel Courier font, taken from the X window distribution). (1.1.4b1 released) + Added experimental EXIF support for JPEG files. To extract EXIF information from a JPEG file, open the file as usual, and call the "_getexif" method. If successful, this method returns a dictionary mapping EXIF TIFF tags to values. If the file does not contain EXIF data, the "_getexif" method returns None. The "ExifTags" module contains a dictionary mapping tags to tag names. This interface will most likely change in future versions. + Fixed a bug when using the "transparency" option with the GIF writer. + Added limited support for "bitfield compression" in BMP files and DIB buffers, for 15-bit, 16-bit, and 32-bit images. This also fixes a problem with ImageGrab module when copying screen- dumps from the clipboard on 15/16/32-bit displays. + Added experimental WAL (Quake 2 textures) loader. To use this loader, import WalImageFile and call the "open" method in that module. (1.1.4a4 released) + Added updated SANE driver (Andrew Kuchling, Abel Deuring) + Use Python's "mmap" module on non-Windows platforms to read some uncompressed formats using memory mapping. Also added a "frombuffer" function that allows you to access the contents of an existing string or buffer object as if it were an image object. + Fixed a memory leak that could appear when processing mode "P" images (from Pier Paolo Glave) + Ignore Unicode characters in the BDF loader (from Graham Dumpleton) (1.1.4a3 released; windows only) + Added experimental RGBA-on-RGB drawing support. To use RGBA colours on an RGB image, pass "RGBA" as the second string to the ImageDraw.Draw constructor. + Added support for non-ASCII strings (Latin-1) and Unicode to the truetype font renderer. + The ImageWin "Dib" object can now be constructed directly from an image object. + The ImageWin module now allows you use window handles as well as device contexts. To use a window handle, wrap the handle in an ImageWin.HWND object, and pass in this object instead of the device context. (1.1.4a2 released) + Improved support for 16-bit unsigned integer images (mode "I;16"). This includes TIFF reader support, and support for "getextrema" and "point" (from Klamer Shutte). + Made the BdfFontFile reader a bit more robust (from Kevin Cazabon and Dmitry Vasiliev) + Changed TIFF writer to always write Compression tag, even when using the default compression (from Greg Couch). + Added "show" support for Mac OS X (from Dan Wolfe). + Added clipboard support to the "ImageGrab" module (Windows only). The "grabclipboard" function returns an Image object, a list of filenames (not in 1.1.4), or None if neither was found. (1.1.4a1 released) + Improved support for drawing RGB data in palette images. You can now use RGB tuples or colour names (see below) when drawing in a mode "P" image. The drawing layer automatically assigns color indexes, as long as you don't use more than 256 unique colours. + Moved self test from MiniTest/test.py to ./selftest.py. + Added support for CSS3-style color strings to most places that accept colour codes/tuples. This includes the "ImageDraw" module, the Image "new" function, and the Image "paste" method. Colour strings can use one of the following formats: "#f00", "#ff0000", "rgb(255,0,0)", "rgb(100%,0%,0%)", "hsl(0, 100%, 50%)", or "red" (most X11-style colour names are supported). See the documentation for the "ImageColor" module for more information. + Fixed DCX decoder (based on input from Larry Bates) + Added "IptcImagePlugin.getiptcinfo" helper to extract IPTC/NAA newsphoto properties from JPEG, TIFF, or IPTC files. + Support for TrueType/OpenType fonts has been added to the standard distribution. You need the freetype 2.0 library. + Made the PCX reader a bit more robust when reading 2-bit and 4-bit PCX images with odd image sizes. + Added "Kernel" class to the ImageFilter module. This class allows you to filter images with user-defined 3x3 and 5x5 convolution kernels. + Added "putdata" support for mode "I", "F" and "RGB". + The GIF writer now supports the transparency option (from Denis Benoit). + A HTML version of the module documentation is now shipped with the source code distribution. You'll find the files in the Doc subdirectory. + Added support for Palm pixmaps (from Bill Janssen). This change was listed for 1.1.3, but the "PalmImagePlugin" driver didn't make it into the distribution. + Improved decoder error messages. (1.1.3 final released) + Made setup.py look for old versions of zlib. For some back- ground, see: http://www.gzip.org/zlib/advisory-2002-03-11.txt (1.1.3c2 released) + Added setup.py file (tested on Unix and Windows). You still need to build libImaging/imaging.lib in the traditional way, but the setup.py script takes care of the rest. The old Setup.in/Makefile.pre.in build method is still supported. + Fixed segmentation violation in ANTIALIAS filter (an internal buffer wasn't properly allocated). (1.1.3c1 released) + Added ANTIALIAS downsampling filter for high-quality "resize" and "thumbnail" operations. Also added filter option to the "thumbnail" operation; the default value is NEAREST, but this will most likely change in future versions. + Fixed plugin loader to be more robust if the __file__ variable isn't set. + Added seek/tell support (for layers) to the PhotoShop loader. Layer 0 is the main image. + Added new (but experimental) "ImageOps" module, which provides shortcuts for commonly used operations on entire images. + Don't mess up when loading PNG images if the decoder leaves data in the output buffer. This could cause internal errors on some PNG images, with some versions of ZLIB. (Bug report and patch provided by Bernhard Herzog.) + Don't mess up on Unicode filenames. + Don't mess up when drawing on big endian platforms. + Made the TIFF loader a bit more robust; it can now read some more slightly broken TIFF files (based on input from Ted Wright, Bob Klimek, and D. Alan Stewart) + Added OS/2 EMX build files (from Andrew MacIntyre) + Change "ImageFont" to reject image files if they don't have the right mode. Older versions could leak memory for "P" images. (Bug reported by Markus Gritsch). + Renamed some internal functions to avoid potential build problem on Mac OS X. + Added DL_EXPORT where relevant (for Cygwin, based on input from Robert Yodlowski) + (re)moved bogus __init__ call in BdfFontFile (bug spotted by Fred Clare) + Added "ImageGrab" support (Windows only) + Added support for XBM hotspots (based on code contributed by Bernhard Herzog). + Added write support for more TIFF tags, namely the Artist, Copyright, DateTime, ResolutionUnit, Software, XResolution and YResolution tags (from Greg Couch) + Added TransposedFont wrapper to ImageFont module + Added "optimize" flag to GIF encoder. If optimize is present and non-zero, PIL will work harder to create a small file. + Raise "EOFError" (not IndexError) when reading beyond the end of a TIFF sequence. + Support rewind ("seek(0)") for GIF and TIFF sequences. + Load grayscale GIF images as mode "L" + Added DPI read/write support to the JPEG codec. The decoder sets the info["dpi"] attribute for JPEG files with JFIF dpi settings. The encoder uses the "dpi" option: im = Image.open("file.jpg") dpi = im.info["dpi"] # raises KeyError if DPI not known im.save("out.jpg", dpi=dpi) Note that PIL doesn't always preserve the "info" attribute for normal image operations. (1.1.2c1 and 1.1.2 final released) + Adapted to Python 2.1. Among other things, all uses of the "regex" module has been repleased with "re". + Fixed attribute error when reading large PNG files (this bug was introduced in maintenance code released after the 1.1.1 release) + Ignore non-string objects in sys.path + Fixed Image.transform(EXTENT) for negative xoffsets + Fixed loading of image plugins if PIL is installed as a package. (The plugin loader now always looks in the directory where the Image.py module itself is found, even if that directory isn't on the standard search path) + The Png plugin has been added to the list of preloaded standard formats + Fixed bitmap/text drawing in fill mode. + Fixed "getextrema" to work also for multiband images. + Added transparency support for L and P images to the PNG codec. + Improved support for read-only images. The "load" method now sets the "readonly" attribute for memory-mapped images. Operations that modifies an image in place (such as "paste" and drawing operations) creates an in-memory copy of the image, if necessary. (before this change, any attempt to modify a memory-mapped image resulted in a core dump...) + Added special cases for lists everywhere PIL expects a sequence. This should speed up things like "putdata" and drawing operations. + The Image.offset method is deprecated. Use the ImageChops.offset function instead. + Changed ImageChops operators to copy palette and info dictionary from the first image argument. (1.1.1 released) + Additional fixes for Python 1.6/2.0, including TIFF "save" bug. + Changed "init" to properly load plugins when PIL is used as a package. + Fixed broken "show" method (on Unix) *** Changes from release 1.0 to 1.1 *** + Adapted to Python 1.6 ("append" and other method changes) + Fixed Image.paste when pasting with solid colour and matte layers ("L" or "RGBA" masks) (bug reported by Robert Kern) + To make it easier to distribute prebuilt versions of PIL, the tkinit binding stuff has been moved to a separate extension module, named "_imagingtk". *** Changes from release 0.3b2 to 1.0 final *** + If there's no 16-bit integer (like on a Cray T3E), set INT16 to the smallest integer available. Most of the library works just fine anyway (from Bill Crutchfield) + Tweaks to make drawing work on big-endian platforms. (1.0c2 released) + If PIL is built with the WITH_TKINTER flag, ImageTk can automatically hook into a standard Tkinter build. You no longer need to build your own Tkinter to use the ImageTk module. The old way still works, though. For more information, see Tk/install.txt. + Some tweaks to ImageTk to support multiple Tk interpreters (from Greg Couch). + ImageFont "load_path" now scans directory mentioned in .pth files (from Richard Jones). (1.0c1 released) + The TIFF plugin has been rewritten. The new plugin fully supports all major PIL image modes (including F and I). + The ImageFile module now includes a Parser class, which can be used to incrementally decode an image file (while down- loading it from the net, for example). See the handbook for details. + "show" now converts non-standard modes to "L" or "RGB" (as appropriate), rather than writing weird things to disk for "xv" to choke upon. (bug reported by Les Schaffer). (1.0b2 released) + Major speedups for rotate, transform(EXTENT), and transform(AFFINE) when using nearest neighbour resampling. + Modified ImageDraw to be compatible with the Arrow graphics interface. See the handbook for details. + PIL now automatically loads file codecs when used as a package (from The Dragon De Monsyne). Also included an __init__.py file in the standard distribution. + The GIF encoder has been modified to produce much smaller files. PIL now uses a run-length encoding method to encode GIF files. On a random selection of GIF images grabbed from the web, this version makes the images about twice as large as the original LZW files, where the earlier version made them over 5 times larger. YMMV, of course. + Added PCX write support (works with "1", "P", "L", and "RGB") + Added "bitmap" and "textsize" methods to ImageDraw. + Improved font rendering code. Fixed a bug or two, and moved most of the time critical stuff to C. + Removed "bdf2pil.py". Use "pilfont.py" instead! + Improved 16-bit support (still experimental, though). The following methods now support "I;16" and "I;16B" images: "getpixel", "copy", "convert" (to and from mode "I"), "resize", "rotate", and "transform" with nearest neighbour filters, and "save" using the IM format. The "new" and "open" functions also work as expected. On Windows, 16-bit files are memory mapped. NOTE: ALL other operations are still UNDEFINED on 16-bit images. + The "paste" method now supports constant sources. Just pass a colour value (a number or a tuple, depending on the target image mode) instead of the source image. This was in fact implemented in an inefficient way in earlier versions (the "paste" method generated a temporary source image if you passed it a colour instead of an image). In this version, this is handled on the C level instead. + Added experimental "RGBa" mode support. An "RGBa" image is an RGBA image where the colour components have have been premultipled with the alpha value. PIL allows you to convert an RGBA image to an RGBa image, and to paste RGBa images on top of RGB images. Since this saves a bunch of multiplications and shifts, it is typically about twice as fast an ordinary RGBA paste. + Eliminated extra conversion step when pasting "RGBA" or "RGBa" images on top of "RGB" images. + Fixed Image.BICUBIC resampling for "RGB" images. + Fixed PCX image file handler to properly read 8-bit PCX files (bug introduced in 1.0b1, reported by Bernhard Herzog) + Fixed PSDraw "image" method to restore the coordinate system. + Fixed "blend" problem when applied to images that was not already loaded (reported by Edward C. Jones) + Fixed -f option to "pilconvert.py" (from Anthony Baxter) (1.0b1 released) + Added Toby J. Sargeant's quantization package. To enable quantization, use the "palette" option to "convert": imOut = im.convert("P", palette=Image.ADAPTIVE) This can be used with "L", "P", and "RGB" images. In this version, dithering cannot be used with adaptive palettes. Note: ADAPTIVE currently maps to median cut quantization with 256 colours. The quantization package also contains a maximum coverage quantizer, which will be supported by future versions of PIL. + Added Eric S. Raymond's "pildriver" image calculator to the distribution. See the docstring for more information. + The "offset" method no longer dumps core if given positive offsets (from Charles Waldman). + Fixed a resource leak that could cause ImageWin to run out of GDI resources (from Roger Burnham). + Added "arc", "chord", and "pieslice" methods to ImageDraw (inspired by code contributed by Richard Jones). + Added experimental 16-bit support, via modes "I;16" (little endian data) and "I;16B" (big endian). Only a few methods properly support such images (see above). + Added XV thumbnail file handler (from Gene Cash). + Fixed BMP image file handler to handle palette images with small palettes (from Rob Hooft). + Fixed Sun raster file handler for palette images (from Charles Waldman). + Improved various internal error messages. + Fixed Path constructor to handle arbitrary sequence objects. This also affects the ImageDraw class (from Richard Jones). + Fixed a bug in JpegDecode that caused PIL to report "decoder error -2" for some progressive JPEG files (reported by Magnus Källström, who also provided samples). + Fixed a bug in JpegImagePlugin that caused PIL to hang when loading JPEG files using 16-bit quantization tables. + The Image "transform" method now supports Image.QUAD transforms. The data argument is an 8-tuple giving the upper left, lower left, lower right, and upper right corner of the source quadri- lateral. Also added Image.MESH transform which takes a list of quadrilaterals. + The Image "resize", "rotate", and "transform" methods now support Image.BILINEAR (2x2) and Image.BICUBIC (4x4) resampling filters. Filters can be used with all transform methods. + The ImageDraw "rectangle" method now includes both the right and the bottom edges when drawing filled rectangles. + The TGA decoder now works properly for runlength encoded images which have more than one byte per pixel. + "getbands" on an YCbCr image now returns ("Y", "Cb", "Cr") + Some file drivers didn't handle the optional "modify" argument to the load method. This resulted in exceptions when you used "paste" (and other methods that modify an image in place) on a newly opened file. *** Changes from release 0.2 (b5) to 0.3 (b2) *** (0.3b2 released) The test suite includes 825 individual tests. + An Image "getbands" method has been added. It returns a tuple containing the individual band names for this image. To figure out how many bands an image has, use "len(im.getbands())". + An Image "putpixel" method has been added. + The Image "point" method can now be used to convert "L" images to any other format, via a lookup table. That table should contain 256 values for each band in the output image. + Some file drivers (including FLI/FLC, GIF, and IM) accidently overwrote the offset method with an internal attribute. All drivers have been updated to use private attributes where possible. + The Image "histogram" method now works for "I" and "F" images. For these modes, PIL divides the range between the min and max values used in the image into 256 bins. You can also pass in your own min and max values via the "extrema" option: h = im.histogram(extrema=(0, 255)) + An Image "getextrema" method has been added. It returns the min and max values used in the image. In this release, this works for single band images only. + Changed the PNG driver to load and save mode "I" images as 16-bit images. When saving, values outside the range 0..65535 are clipped. + Fixed ImageFont.py to work with the new "pilfont" compiler. + Added JPEG "save" and "draft" support for mode "YCbCr" images. Note that if you save an "YCbCr" image as a JPEG file and read it back, it is read as an RGB file. To get around this, you can use the "draft" method: im = Image.open("color.jpg") im.draft("YCbCr", im.size) + Read "RGBA" TGA images. Also fixed the orientation bug; all images should now come out the right way. + Changed mode name (and internal representation) from "YCrCb" to "YCbCr" (!) *** WARNING: MAY BREAK EXISTING CODE *** (0.3b1 released) The test suite includes 750 individual tests. + The "pilfont" package is now included in the standard PIL distribution. The pilfont utility can be used to convert X BDF and PCF raster font files to a format understood by the ImageFont module. + GIF files are now interlaced by default. To write a non-interlaced file, pass interlace=0 to the "save" method. + The default string format has changed for the "fromstring" and "tostring" methods. *** WARNING: MAY BREAK EXISTING CODE *** NOTE: If no extra arguments are given, the first line in the string buffer is the top line of the image, instead of the bottom line. For RGB images, the string now contains 3 bytes per pixel instead of 4. These changes were made to make the methods compatible with the "fromstring" factory function. To get the old behaviour, use the following syntax: data = im.tostring("raw", "RGBX", 0, -1) im.fromstring(data, "raw", "RGBX", 0, -1) + "new" no longer gives a MemoryError if the width or height is zero (this only happened on platforms where malloc(0) or calloc(0) returns NULL). + "new" now adds a default palette object to "P" images. + You can now convert directly between all modes supported by PIL. When converting colour images to "P", PIL defaults to a "web" palette and dithering. When converting greyscale images to "1", PIL uses a thresholding and dithering. + Added a "dither" option to "convert". By default, "convert" uses floyd-steinberg error diffusion for "P" and "1" targets, so this option is only used to *disable* dithering. Allowed values are NONE (no dithering) or FLOYDSTEINBERG (default). imOut = im.convert("P", dither=Image.NONE) + Added a full set of "I" decoders. You can use "fromstring" (and file decoders) to read any standard integer type as an "I" image. + Added some support for "YCbCr" images (creation, conversion from/to "L" and "RGB", IM YCC load/save) + "getpixel" now works properly with fractional coordinates. + ImageDraw "setink" now works with "I", "F", "RGB", "RGBA", "RGBX", "CMYK", and "YCbCr" images. + ImImagePlugin no longer attaches palettes to "RGB" images. + Various minor fixes. (0.3a4 released) + Added experimental IPTC/NAA support. + Eliminated AttributeError exceptions after "crop" (from Skip Montanaro) + Reads some uncompressed formats via memory mapping (this is currently supported on Win32 only) + Fixed some last minute glitches in the last alpha release (Types instead of types in Image.py, version numbers, etc.) + Eliminated some more bogus compiler warnings. + Various fixes to make PIL compile and run smoother on Macs (from Jack Jansen). + Fixed "fromstring" and "tostring" for mode "I" images. (0.3a3 released) The test suite includes 530 individual tests. + Eliminated unexpected side-effect in "paste" with matte. "paste" now works properly also if compiled with "gcc". + Adapted to Python 1.5 (build issues only) + Fixed the ImageDraw "point" method to draw also the last point (!). + Added "I" and "RGBX" support to Image.new. + The plugin path is now properly prepended to the module search path when a plugin module is imported. + Added "draw" method to the ImageWin.Dib class. This is used by Topaz to print images on Windows printers. + "convert" now supports conversions from "P" to "1" and "F". + "paste" can now take a colour instead of an image as the first argument. The colour must match the colour argument given to the new function, and match the mode of the target image. + Fixed "paste" to allow a mask also for mode "F" images. + The BMP driver now saves mode "1" images. When loading images, the mode is set to "L" for 8-bit files with greyscale palettes, and to "P" for other 8-bit files. + The IM driver now reads and saves "1" images (file modes "0 1" or "L 1"). + The JPEG and GIF drivers now saves "1" images. For JPEG, the image is saved as 8-bit greyscale (it will load as mode "L"). For GIF, the image will be loaded as a "P" image. + Fixed a potential buffer overrun in the GIF encoder. (0.3a2 released) The test suite includes 400 individual tests. + Improvements to the test suite revealed a number of minor bugs, which are all fixed. Note that crop/paste, 32-bit ImageDraw, and ImageFont are still weak spots in this release. + Added "putpalette" method to the Image class. You can use this to add or modify the palette for "P" and "L" images. If a palette is added to an "L" image, it is automatically converted to a "P" image. + Fixed ImageDraw to properly handle 32-bit image memories ("RGB", "RGBA", "CMYK", "F") + Fixed "fromstring" and "tostring" not to mess up the mode attribute in default mode. + Changed ImPlatform.h to work on CRAY's (don't have one at home, so I haven't tried it). The previous version assumed that either "short" or "int" were 16-bit wide. PIL still won't compile on platforms where neither "short", "int" nor "long" are 32-bit wide. + Added file= and data= keyword arguments to PhotoImage and BitmapImage. This allows you to use them as drop-in replacements for the corre- sponding Tkinter classes. + Removed bogus references to the crack coder (ImagingCrack). (0.3a1 released) + Make sure image is loaded in "tostring". + Added floating point packer (native 32-bit floats only). *** Changes from release 0.1b1 to 0.2 (b5) *** + Modified "fromstring" and "tostring" methods to use file codecs. Also added "fromstring" factory method to create an image directly from data in a string. + Added support for 32-bit floating point images (mode "F"). You can convert between "L" and "F" images, and apply a subset of the available image processing methods on the "F" image. You can also read virtually any data format into a floating point image memory; see the section on "Decoding Floating Point Data" in the handbook for more information. (0.2b5 released; on windows only) + Fixed the tobitmap() method to work properly for small bitmaps. + Added RMS and standard deviation to the ImageStat.Stat class. Also modified the constructor to take an optional feature mask, and also to accept either an image or a list containing the histogram data. + The BitmapImage code in ImageTk can now use a special bitmap decoder, which has to be patched into Tk. See the "Tk/pilbitmap.txt" file for details. If not installed, bitmaps are transferred to Tk as XBM strings. + The PhotoImage code in ImageTk now uses a Tcl command ("PyImagingPaste") instead of a special image type. This gives somewhat better performance, and also allows PIL to support transparency. *** WARNING: TKAPPINIT MUST BE MODIFIED *** + ImageTk now honours the alpha layer in RGBA images. Only fully transparent pixels are made transparent (that is, the alpha layer is treated as a mask). To treat the alpha laters as a matte, you must paste the image on the background before handing it over to ImageTk. + Added McIdas reader (supports 8-bit images only). + PIL now preloads drivers for BMP, GIF, JPEG, PPM, and TIFF. As long as you only load and save these formats, you don't have to wait for a full scan for drivers. To force scanning, call the Image.init() function. + The "seek" and "tell" methods are now always available, also for single-frame images. + Added optional mask argument to histogram method. The mask may be an "1" or "L" image with the same size as the original image. Only pixels where the mask is non-zero are included in the histogram. + The "paste" method now allows you to specify only the lower left corner (a 2-tuple), instead of the full region (a 4-tuple). + Reverted to old plugin scanning model; now scans all directory names in the path when looking for plugins. + Added PIXAR raster support. Only uncompressed ("dumped") RGB images can currently be read (based on information provided by Greg Coats). + Added FlashPix (FPX) read support. Reads all pixel formats, but only the highest resolution is read, and the viewing transform is currently ignored. + Made PNG encoding somewhat more efficient in "optimize" mode; a bug in 0.2b4 didn't enable all predictor filters when optimized storage were requested. + Added Microsoft Image Composer (MIC) read support. When opened, the first sprite in the file is loaded. You can use the seek method to load additional sprites from the file. + Properly reads "P" and "CMYK" PSD images. + "pilconvert" no longer optimizes by default; use the -o option to make the file as small as possible (at the expense of speed); use the -q option to set the quality when compressing to JPEG. + Fixed "crop" not to drop the palette for "P" images. + Added and verified FLC support. + Paste with "L" or "RGBA" alpha is now several times faster on most platforms. + Changed Image.new() to initialize the image to black, as described in the handbook. To get an uninitialized image, use None as the colour. + Fixed the PDF encoder to produce a valid header; Acrobat no longer complains when you load PDF images created by PIL. + PIL only scans fully-qualified directory names in the path when looking for plugins. *** WARNING: MAY BREAK EXISTING CODE *** + Faster implementation of "save" used when filename is given, or when file object has "fileno" and "flush" methods. + Don't crash in "crop" if region extends outside the source image. + Eliminated a massive memory leak in the "save" function. + The GIF decoder doesn't crash if the code size is set to an illegal value. This could happen since another bug didn't handle local palettes properly if they didn't have the same size as the global palette (not very common). + Added predictor support (TIFF 6.0 section 14) to the TIFF decoder. + Fixed palette and padding problems in BMP driver. Now properly writes "1", "L", "P" and "RGB" images. + Fixed getpixel()/getdata() to return correct pixel values. + Added PSD (PhotoShop) read support. Reads both uncompressed and compressed images of most types. + Added GIF write support (writes "uncompressed" GIF files only, due to unresolvable licensing issues). The "gifmaker.py" script can be used to create GIF animations. + Reads 8-bit "L" and "P" TGA images. Also reads 16-bit "RGB" images. + Added FLI read support. This driver has only been tested on a few FLI samples. + Reads 2-bit and 4-bit PCX images. + Added MSP read and write support. Both version 1 and 2 can be read, but only version 1 (uncompressed) files are written. + Fixed a bug in the FLI/FLC identification code that caused the driver to raise an exception when parsing valid FLI/FLC files. + Improved performance when loading file format plugins, and when opening files. + Added GIF animation support, via the "seek" and "tell" methods. You can use "player.py" to play an animated GIF file. + Removed MNG support, since the spec is changing faster than I can change the code. I've added support for the experimental ARG format instead. Contact me for more information on this format. + Added keyword options to the "save" method. The following options are currently supported: format option description -------------------------------------------------------- JPEG optimize minimize output file at the expense of compression speed. JPEG progressive enable progressive output. the option value is ignored. JPEG quality set compression quality (1-100). the default value is 75. JPEG smooth smooth dithered images. value is strengh (1-100). default is off (0). PNG optimize minimize output file at the expense of compression speed. Expect more options in future releases. Also note that file writers silently ignore unknown options. + Plugged memory leaks in the PNG and TIFF decoders. + Added PNG write support. + (internal) RGB unpackers and converters now set the pad byte to 255 (full opacity). + Properly handles the "transparency" property for GIF, PNG and XPM files. + Added a "putalpha" method, allowing you to attach a "1" or "L" image as the alpha layer to an "RGBA" image. + Various improvements to the sample scripts: "pilconvert" Carries out some extra tricks in order to make the resulting file as small as possible. "explode" (NEW) Split an image sequence into individual frames. "gifmaker" (NEW) Convert a sequence file into a GIF animation. Note that the GIF encoder create "uncompressed" GIF files, so animations created by this script are rather large (typically 2-5 times the compressed sizes). "image2py" (NEW) Convert a single image to a python module. See comments in this script for details. "player" If multiple images are given on the command line, they are interpreted as frames in a sequence. The script assumes that they all have the same size. Also note that this script now can play FLI/FLC and GIF animations. This player can also execute embedded Python animation applets (ARG format only). "viewer" Transparent images ("P" with transparency property, and "RGBA") are superimposed on the standard Tk back- ground. + Fixed colour argument to "new". For multilayer images, pass a tuple: (Red, Green, Blue), (Red, Green, Blue, Alpha), or (Cyan, Magenta, Yellow, Black). + Added XPM (X pixmap) read support. (0.2b3 released) + Added MNG (multi-image network graphics) read support. "Ming" is a proposed animation standard, based on the PNG file format. You can use the "player" sample script to display some flavours of this format. The MNG standard is still under development, as is this driver. More information, including sample files, can be found at + Added a "verify" method to images loaded from file. This method scans the file for errors, without actually decoding the image data, and raises a suitable exception if it finds any problems. Currently implemented for PNG and MNG files only. + Added support for interlaced GIF images. + Added PNG read support -- if linked with the ZLIB compression library, PIL reads all kinds of PNG images, except interlaced files. + Improved PNG identification support -- doesn't mess up on unknown chunks, identifies all possible PNG modes, and verifies checksum on PNG header chunks. + Added an experimental reader for placable Windows Meta Files (WMF). This reader is still very incomplete, but it illustrates how PIL's drawing capabilities can be used to render vector and metafile formats. + Added restricted drivers for images from Image Tools (greyscale only) and LabEye/IFUNC (common interchange modes only). + Some minor improvements to the sample scripts provided in the "Scripts" directory. + The test images have been moved to the "Images" directory. (0.2b2 released) (0.2b1 released; Windows only) + Fixed filling of complex polygons. The ImageDraw "line" and "polygon" methods also accept Path objects. + The ImageTk "PhotoImage" object can now be constructed directly from an image. You can also pass the object itself to Tkinter, instead of using the "image" attribute. Finally, using "paste" on a displayed image automatically updates the display. + The ImageTk "BitmapImage" object allows you to create transparent overlays from 1-bit images. You can pass the object itself to Tkinter. The constructor takes the same arguments as the Tkinter BitmapImage class; use the "foreground" option to set the colour of the overlay. + Added a "putdata" method to the Image class. This can be used to load a 1-layer image with data from a sequence object or a string. An optional floating point scale and offset can be used to adjust the data to fit into the 8-bit pixel range. Also see the "getdata" method. + Added the EXTENT method to the Image "transform" method. This can be used to quickly crop, stretch, shrink, or mirror a subregion from another image. + Adapted to Python 1.4. + Added a project makefile for Visual C++ 4.x. This allows you to easily build a dynamically linked version of PIL for Windows 95 and NT. + A Tk "booster" patch for Windows is available. It gives dramatic performance improvements for some displays. Has been tested with Tk 4.2 only, but is likely to work with Tk 4.1 as well. See the Tk subdirectory for details. + You can now save 1-bit images in the XBM format. In addition, the Image class now provides a "tobitmap" method which returns a string containing an XBM representation of the image. Quite handy to use with Tk. + More conversions, including "RGB" to "1" and more. (0.2a1 released) + Where earlier versions accepted lists, this version accepts arbitrary Python sequences (including strings, in some cases). A few resource leaks were plugged in the process. + The Image "paste" method now allows the box to extend outside the target image. The size of the box, the image to be pasted, and the optional mask must still match. + The ImageDraw module now supports filled polygons, outlined and filled ellipses, and text. Font support is rudimentary, though. + The Image "point" method now takes an optional mode argument, allowing you to convert the image while translating it. Currently, this can only be used to convert "L" or "P" images to "1" images (creating thresholded images or "matte" masks). + An Image "getpixel" method has been added. For single band images, it returns the pixel value at a given position as an integer. For n-band images, it returns an n-tuple of integers. + An Image "getdata" method has been added. It returns a sequence object representing the image as a 1-dimensional array. Only len() and [] can be used with this sequence. This method returns a reference to the existing image data, so changes in the image will be immediately reflected in the sequence object. + Fixed alignment problems in the Windows BMP writer. + If converting an "RGB" image to "RGB" or "L", you can give a second argument containing a colour conversion matrix. + An Image "getbbox" method has been added. It returns the bounding box of data in an image, considering the value 0 as background. + An Image "offset" method has been added. It returns a new image where the contents of the image have been offset the given distance in X and/or Y direction. Data wraps between edges. + Saves PDF images. The driver creates a binary PDF 1.1 files, using JPEG compression for "L", "RGB", and "CMYK" images, and hex encoding (same as for PostScript) for other formats. + The "paste" method now accepts "1" masks. Zero means transparent, any other pixel value means opaque. This is faster than using an "L" transparency mask. + Properly writes EPS files (and properly prints images to postscript printers as well). + Reads 4-bit BMP files, as well as 4 and 8-bit Windows ICO and CUR files. Cursor animations are not supported. + Fixed alignment problems in the Sun raster loader. + Added "draft" and "thumbnail" methods. The draft method is used to optimize loading of JPEG and PCD files, the thumbnail method is used to create a thumbnail representation of an image. + Added Windows display support, via the ImageWin class (see the handbook for details). + Added raster conversion for EPS files. This requires GNU or Aladdin Ghostscript, and probably works on UNIX only. + Reads PhotoCD (PCD) images. The base resolution (768x512) can be read from a PhotoCD file. + Eliminated some compiler warnings. Bindings now compile cleanly in C++ mode. Note that the Imaging library itself must be compiled in C mode. + Added "bdf2pil.py", which converts BDF fonts into images with associated metrics. This is definitely work in progress. For info, see description in script for details. + Fixed a bug in the "ImageEnhance.py" module. + Fixed a bug in the netpbm save hack in "GifImagePlugin.py" + Fixed 90 and 270 degree rotation of rectangular images. + Properly reads 8-bit TIFF palette-color images. + Reads plane separated RGB and CMYK TIFF images. + Added driver debug mode. This is enabled by setting Image.DEBUG to a non-zero value. Try the -D option to "pilfile.py" and see what happens. + Don't crash on "atend" constructs in PostScript files. + Only the Image module imports _imaging directly. Other modules should refer to the binding module as "Image.core". *** Changes from release 0.0 to 0.1 (b1) *** + A handbook is available (distributed separately). + The coordinate system is changed so that (0,0) is now located in the upper left corner. This is in compliancy with ISO 12087 and 90% of all other image processing and graphics libraries. + Modes "1" (bilevel) and "P" (palette) have been introduced. Note that bilevel images are stored with one byte per pixel. + The Image "crop" and "paste" methods now accepts None as the box argument, to refer to the full image (self, that is). + The Image "crop" method now works properly. + The Image "point" method is now available. You can use either a lookup table or a function taking one argument. + The Image join function has been renamed to "merge". + An Image "composite" function has been added. It is identical to copy() followed by paste(mask). + An Image "eval" function has been added. It is currently identical to point(function); that is, only a single image can be processed. + A set of channel operations has been added. See the "ImageChops" module, test_chops.py, and the handbook for details. + Added the "pilconvert" utility, which converts image files. Note that the number of output formats are still quite restricted. + Added the "pilfile" utility, which quickly identifies image files (without loading them, in most cases). + Added the "pilprint" utility, which prints image files to Postscript printers. + Added a rudimentary version of the "pilview" utility, which is simple image viewer based on Tk. Only File/Exit and Image/Next works properly. + An interface to Tk has been added. See "Lib/ImageTk.py" and README for details. + An interface to Jack Jansen's Img library has been added (thanks to Jack). This allows you to read images through the Img extensions file format handlers. See the file "Lib/ImgExtImagePlugin.py" for details. + Postscript printing is provided through the PSDraw module. See the handbook for details. pillow-2.3.0/_imagingft.c0000644000175000001440000004007412260450326014152 0ustar dokousers/* * PIL FreeType Driver * * a FreeType 2.X driver for PIL * * history: * 2001-02-17 fl Created (based on old experimental freetype 1.0 code) * 2001-04-18 fl Fixed some egcs compiler nits * 2002-11-08 fl Added unicode support; more font metrics, etc * 2003-05-20 fl Fixed compilation under 1.5.2 and newer non-unicode builds * 2003-09-27 fl Added charmap encoding support * 2004-05-15 fl Fixed compilation for FreeType 2.1.8 * 2004-09-10 fl Added support for monochrome bitmaps * 2006-06-18 fl Fixed glyph bearing calculation * 2007-12-23 fl Fixed crash in family/style attribute fetch * 2008-01-02 fl Handle Unicode filenames properly * * Copyright (c) 1998-2007 by Secret Labs AB */ #include "Python.h" #include "Imaging.h" #if !defined(USE_FREETYPE_2_0) /* undef/comment out to use freetype 2.0 */ #define USE_FREETYPE_2_1 #endif #if defined(USE_FREETYPE_2_1) /* freetype 2.1 and newer */ #include #include FT_FREETYPE_H #else /* freetype 2.0 */ #include #endif #include FT_GLYPH_H #define KEEP_PY_UNICODE #include "py3.h" #if !defined(FT_LOAD_TARGET_MONO) #define FT_LOAD_TARGET_MONO FT_LOAD_MONOCHROME #endif /* -------------------------------------------------------------------- */ /* error table */ #undef FTERRORS_H #undef __FTERRORS_H__ #define FT_ERRORDEF( e, v, s ) { e, s }, #define FT_ERROR_START_LIST { #define FT_ERROR_END_LIST { 0, 0 } }; struct { int code; const char* message; } ft_errors[] = #if defined(USE_FREETYPE_2_1) #include FT_ERRORS_H #else #include #endif /* -------------------------------------------------------------------- */ /* font objects */ static FT_Library library; typedef struct { PyObject_HEAD FT_Face face; } FontObject; static PyTypeObject Font_Type; /* round a 26.6 pixel coordinate to the nearest larger integer */ #define PIXEL(x) ((((x)+63) & -64)>>6) static PyObject* geterror(int code) { int i; for (i = 0; ft_errors[i].message; i++) if (ft_errors[i].code == code) { PyErr_SetString(PyExc_IOError, ft_errors[i].message); return NULL; } PyErr_SetString(PyExc_IOError, "unknown freetype error"); return NULL; } static PyObject* getfont(PyObject* self_, PyObject* args, PyObject* kw) { /* create a font object from a file name and a size (in pixels) */ FontObject* self; int error; char* filename = NULL; int size; int index = 0; unsigned char* encoding; unsigned char* font_bytes; int font_bytes_size = 0; static char* kwlist[] = { "filename", "size", "index", "encoding", "font_bytes", NULL }; if (!library) { PyErr_SetString( PyExc_IOError, "failed to initialize FreeType library" ); return NULL; } if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|iss#", kwlist, Py_FileSystemDefaultEncoding, &filename, &size, &index, &encoding, &font_bytes, &font_bytes_size)) return NULL; self = PyObject_New(FontObject, &Font_Type); if (!self) { if (filename) PyMem_Free(filename); return NULL; } if (filename && font_bytes_size <= 0) { error = FT_New_Face(library, filename, index, &self->face); } else { error = FT_New_Memory_Face(library, (FT_Byte*)font_bytes, font_bytes_size, index, &self->face); } if (!error) error = FT_Set_Pixel_Sizes(self->face, 0, size); if (!error && encoding && strlen((char*) encoding) == 4) { FT_Encoding encoding_tag = FT_MAKE_TAG( encoding[0], encoding[1], encoding[2], encoding[3] ); error = FT_Select_Charmap(self->face, encoding_tag); } if (filename) PyMem_Free(filename); if (error) { PyObject_Del(self); return geterror(error); } return (PyObject*) self; } static int font_getchar(PyObject* string, int index, FT_ULong* char_out) { if (PyUnicode_Check(string)) { Py_UNICODE* p = PyUnicode_AS_UNICODE(string); int size = PyUnicode_GET_SIZE(string); if (index >= size) return 0; *char_out = p[index]; return 1; } #if PY_VERSION_HEX < 0x03000000 if (PyString_Check(string)) { unsigned char* p = (unsigned char*) PyString_AS_STRING(string); int size = PyString_GET_SIZE(string); if (index >= size) return 0; *char_out = (unsigned char) p[index]; return 1; } #endif return 0; } static PyObject* font_getsize(FontObject* self, PyObject* args) { int i, x, y_max, y_min; FT_ULong ch; FT_Face face; int xoffset, yoffset; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; /* calculate size and bearing for a given string */ PyObject* string; if (!PyArg_ParseTuple(args, "O:getsize", &string)) return NULL; #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else if (!PyUnicode_Check(string) && !PyString_Check(string)) { #endif PyErr_SetString(PyExc_TypeError, "expected string"); return NULL; } face = NULL; xoffset = yoffset = 0; y_max = y_min = 0; for (x = i = 0; font_getchar(string, i, &ch); i++) { int index, error; FT_BBox bbox; FT_Glyph glyph; face = self->face; index = FT_Get_Char_Index(face, ch); if (kerning && last_index && index) { FT_Vector delta; FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, &delta); x += delta.x; } error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT); if (error) return geterror(error); if (i == 0) xoffset = face->glyph->metrics.horiBearingX; x += face->glyph->metrics.horiAdvance; FT_Get_Glyph(face->glyph, &glyph); FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); if (bbox.yMax > y_max) y_max = bbox.yMax; if (bbox.yMin < y_min) y_min = bbox.yMin; /* find max distance of baseline from top */ if (face->glyph->metrics.horiBearingY > yoffset) yoffset = face->glyph->metrics.horiBearingY; last_index = index; FT_Done_Glyph(glyph); } if (face) { int offset; /* left bearing */ if (xoffset < 0) x -= xoffset; else xoffset = 0; /* right bearing */ offset = face->glyph->metrics.horiAdvance - face->glyph->metrics.width - face->glyph->metrics.horiBearingX; if (offset < 0) x -= offset; /* difference between the font ascender and the distance of * the baseline from the top */ yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); } return Py_BuildValue( "(ii)(ii)", PIXEL(x), PIXEL(y_max - y_min), PIXEL(xoffset), yoffset ); } static PyObject* font_getabc(FontObject* self, PyObject* args) { FT_ULong ch; FT_Face face; double a, b, c; /* calculate ABC values for a given string */ PyObject* string; if (!PyArg_ParseTuple(args, "O:getabc", &string)) return NULL; #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else if (!PyUnicode_Check(string) && !PyString_Check(string)) { #endif PyErr_SetString(PyExc_TypeError, "expected string"); return NULL; } if (font_getchar(string, 0, &ch)) { int index, error; face = self->face; index = FT_Get_Char_Index(face, ch); error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT); if (error) return geterror(error); a = face->glyph->metrics.horiBearingX / 64.0; b = face->glyph->metrics.width / 64.0; c = (face->glyph->metrics.horiAdvance - face->glyph->metrics.horiBearingX - face->glyph->metrics.width) / 64.0; } else a = b = c = 0.0; return Py_BuildValue("ddd", a, b, c); } static PyObject* font_render(FontObject* self, PyObject* args) { int i, x, y; Imaging im; int index, error, ascender; int load_flags; unsigned char *source; FT_ULong ch; FT_GlyphSlot glyph; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; /* render string into given buffer (the buffer *must* have the right size, or this will crash) */ PyObject* string; Py_ssize_t id; int mask = 0; int temp; int xx, x0, x1; if (!PyArg_ParseTuple(args, "On|i:render", &string, &id, &mask)) return NULL; #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else if (!PyUnicode_Check(string) && !PyString_Check(string)) { #endif PyErr_SetString(PyExc_TypeError, "expected string"); return NULL; } im = (Imaging) id; load_flags = FT_LOAD_RENDER; if (mask) load_flags |= FT_LOAD_TARGET_MONO; ascender = 0; for (i = 0; font_getchar(string, i, &ch); i++) { index = FT_Get_Char_Index(self->face, ch); error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); glyph = self->face->glyph; temp = (glyph->bitmap.rows - glyph->bitmap_top); if (temp > ascender) ascender = temp; } for (x = i = 0; font_getchar(string, i, &ch); i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -PIXEL(self->face->glyph->metrics.horiBearingX); index = FT_Get_Char_Index(self->face, ch); if (kerning && last_index && index) { FT_Vector delta; FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, &delta); x += delta.x >> 6; } error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); glyph = self->face->glyph; source = (unsigned char*) glyph->bitmap.buffer; xx = x + glyph->bitmap_left; x0 = 0; x1 = glyph->bitmap.width; if (xx < 0) x0 = -xx; if (xx + x1 > im->xsize) x1 = im->xsize - xx; if (mask) { /* use monochrome mask (on palette images, etc) */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; int i, j, m = 128; for (i = j = 0; j < x1; j++) { if (j >= x0 && (source[i] & m)) target[j] = 255; if (!(m >>= 1)) { m = 128; i++; } } } source += glyph->bitmap.pitch; } } else { /* use antialiased rendering */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; unsigned char *target = im->image8[yy] + xx; for (i = x0; i < x1; i++) { if (target[i] < source[i]) target[i] = source[i]; } } source += glyph->bitmap.pitch; } } x += PIXEL(glyph->metrics.horiAdvance); last_index = index; } Py_RETURN_NONE; } static void font_dealloc(FontObject* self) { FT_Done_Face(self->face); PyObject_Del(self); } static PyMethodDef font_methods[] = { {"render", (PyCFunction) font_render, METH_VARARGS}, {"getsize", (PyCFunction) font_getsize, METH_VARARGS}, {"getabc", (PyCFunction) font_getabc, METH_VARARGS}, {NULL, NULL} }; static PyObject* font_getattr_family(FontObject* self, void* closure) { #if PY_VERSION_HEX >= 0x03000000 if (self->face->family_name) return PyUnicode_FromString(self->face->family_name); #else if (self->face->family_name) return PyString_FromString(self->face->family_name); #endif Py_RETURN_NONE; } static PyObject* font_getattr_style(FontObject* self, void* closure) { #if PY_VERSION_HEX >= 0x03000000 if (self->face->style_name) return PyUnicode_FromString(self->face->style_name); #else if (self->face->style_name) return PyString_FromString(self->face->style_name); #endif Py_RETURN_NONE; } static PyObject* font_getattr_ascent(FontObject* self, void* closure) { return PyInt_FromLong(PIXEL(self->face->size->metrics.ascender)); } static PyObject* font_getattr_descent(FontObject* self, void* closure) { return PyInt_FromLong(-PIXEL(self->face->size->metrics.descender)); } static PyObject* font_getattr_glyphs(FontObject* self, void* closure) { return PyInt_FromLong(self->face->num_glyphs); } static struct PyGetSetDef font_getsetters[] = { { "family", (getter) font_getattr_family }, { "style", (getter) font_getattr_style }, { "ascent", (getter) font_getattr_ascent }, { "descent", (getter) font_getattr_descent }, { "glyphs", (getter) font_getattr_glyphs }, { NULL } }; static PyTypeObject Font_Type = { PyVarObject_HEAD_INIT(NULL, 0) "Font", sizeof(FontObject), 0, /* methods */ (destructor)font_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ font_methods, /*tp_methods*/ 0, /*tp_members*/ font_getsetters, /*tp_getset*/ }; static PyMethodDef _functions[] = { {"getfont", (PyCFunction) getfont, METH_VARARGS|METH_KEYWORDS}, {NULL, NULL} }; static int setup_module(PyObject* m) { PyObject* d; PyObject* v; int major, minor, patch; d = PyModule_GetDict(m); /* Ready object type */ PyType_Ready(&Font_Type); if (FT_Init_FreeType(&library)) return 0; /* leave it uninitalized */ FT_Library_Version(library, &major, &minor, &patch); #if PY_VERSION_HEX >= 0x03000000 v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch); #else v = PyString_FromFormat("%d.%d.%d", major, minor, patch); #endif PyDict_SetItemString(d, "freetype2_version", v); return 0; } #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__imagingft(void) { PyObject* m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_imagingft", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ _functions, /* m_methods */ }; m = PyModule_Create(&module_def); if (setup_module(m) < 0) return NULL; return m; } #else PyMODINIT_FUNC init_imagingft(void) { PyObject* m = Py_InitModule("_imagingft", _functions); setup_module(m); } #endif pillow-2.3.0/_imaging.c0000644000175000001440000026651712257511054013636 0ustar dokousers/* * The Python Imaging Library. * * the imaging library bindings * * history: * 1995-09-24 fl Created * 1996-03-24 fl Ready for first public release (release 0.0) * 1996-03-25 fl Added fromstring (for Jack's "img" library) * 1996-03-28 fl Added channel operations * 1996-03-31 fl Added point operation * 1996-04-08 fl Added new/new_block/new_array factories * 1996-04-13 fl Added decoders * 1996-05-04 fl Added palette hack * 1996-05-12 fl Compile cleanly as C++ * 1996-05-19 fl Added matrix conversions, gradient fills * 1996-05-27 fl Added display_mode * 1996-07-22 fl Added getbbox, offset * 1996-07-23 fl Added sequence semantics * 1996-08-13 fl Added logical operators, point mode * 1996-08-16 fl Modified paste interface * 1996-09-06 fl Added putdata methods, use abstract interface * 1996-11-01 fl Added xbm encoder * 1996-11-04 fl Added experimental path stuff, draw_lines, etc * 1996-12-10 fl Added zip decoder, crc32 interface * 1996-12-14 fl Added modulo arithmetics * 1996-12-29 fl Added zip encoder * 1997-01-03 fl Added fli and msp decoders * 1997-01-04 fl Added experimental sun_rle and tga_rle decoders * 1997-01-05 fl Added gif encoder, getpalette hack * 1997-02-23 fl Added histogram mask * 1997-05-12 fl Minor tweaks to match the IFUNC95 interface * 1997-05-21 fl Added noise generator, spread effect * 1997-06-05 fl Added mandelbrot generator * 1997-08-02 fl Modified putpalette to coerce image mode if necessary * 1998-01-11 fl Added INT32 support * 1998-01-22 fl Fixed draw_points to draw the last point too * 1998-06-28 fl Added getpixel, getink, draw_ink * 1998-07-12 fl Added getextrema * 1998-07-17 fl Added point conversion to arbitrary formats * 1998-09-21 fl Added support for resampling filters * 1998-09-22 fl Added support for quad transform * 1998-12-29 fl Added support for arcs, chords, and pieslices * 1999-01-10 fl Added some experimental arrow graphics stuff * 1999-02-06 fl Added draw_bitmap, font acceleration stuff * 2001-04-17 fl Fixed some egcs compiler nits * 2001-09-17 fl Added screen grab primitives (win32) * 2002-03-09 fl Added stretch primitive * 2002-03-10 fl Fixed filter handling in rotate * 2002-06-06 fl Added I, F, and RGB support to putdata * 2002-06-08 fl Added rankfilter * 2002-06-09 fl Added support for user-defined filter kernels * 2002-11-19 fl Added clipboard grab primitives (win32) * 2002-12-11 fl Added draw context * 2003-04-26 fl Tweaks for Python 2.3 beta 1 * 2003-05-21 fl Added createwindow primitive (win32) * 2003-09-13 fl Added thread section hooks * 2003-09-15 fl Added expand helper * 2003-09-26 fl Added experimental LA support * 2004-02-21 fl Handle zero-size images in quantize * 2004-06-05 fl Added ptr attribute (used to access Imaging objects) * 2004-06-05 fl Don't crash when fetching pixels from zero-wide images * 2004-09-17 fl Added getcolors * 2004-10-04 fl Added modefilter * 2005-10-02 fl Added access proxy * 2006-06-18 fl Always draw last point in polyline * * Copyright (c) 1997-2006 by Secret Labs AB * Copyright (c) 1995-2006 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #define PILLOW_VERSION "2.3.0" #include "Python.h" #ifdef HAVE_LIBZ #include "zlib.h" #endif #include "Imaging.h" #include "py3.h" /* Configuration stuff. Feel free to undef things you don't need. */ #define WITH_IMAGECHOPS /* ImageChops support */ #define WITH_IMAGEDRAW /* ImageDraw support */ #define WITH_MAPPING /* use memory mapping to read some file formats */ #define WITH_IMAGEPATH /* ImagePath stuff */ #define WITH_ARROW /* arrow graphics stuff (experimental) */ #define WITH_EFFECTS /* special effects */ #define WITH_QUANTIZE /* quantization support */ #define WITH_RANKFILTER /* rank filter */ #define WITH_MODEFILTER /* mode filter */ #define WITH_THREADING /* "friendly" threading support */ #define WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask module */ #define WITH_DEBUG /* extra debugging interfaces */ /* PIL Plus extensions */ #undef WITH_CRACKCODE /* pil plus */ #undef VERBOSE #define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) #define B16(p, i) ((((int)p[(i)]) << 8) + p[(i)+1]) #define L16(p, i) ((((int)p[(i)+1]) << 8) + p[(i)]) #define S16(v) ((v) < 32768 ? (v) : ((v) - 65536)) /* -------------------------------------------------------------------- */ /* OBJECT ADMINISTRATION */ /* -------------------------------------------------------------------- */ typedef struct { PyObject_HEAD Imaging image; ImagingAccess access; } ImagingObject; static PyTypeObject Imaging_Type; #ifdef WITH_IMAGEDRAW typedef struct { /* to write a character, cut out sxy from glyph data, place at current position plus dxy, and advance by (dx, dy) */ int dx, dy; int dx0, dy0, dx1, dy1; int sx0, sy0, sx1, sy1; } Glyph; typedef struct { PyObject_HEAD ImagingObject* ref; Imaging bitmap; int ysize; int baseline; Glyph glyphs[256]; } ImagingFontObject; static PyTypeObject ImagingFont_Type; typedef struct { PyObject_HEAD ImagingObject* image; UINT8 ink[4]; int blend; } ImagingDrawObject; static PyTypeObject ImagingDraw_Type; #endif typedef struct { PyObject_HEAD ImagingObject* image; int readonly; } PixelAccessObject; static PyTypeObject PixelAccess_Type; PyObject* PyImagingNew(Imaging imOut) { ImagingObject* imagep; if (!imOut) return NULL; imagep = PyObject_New(ImagingObject, &Imaging_Type); if (imagep == NULL) { ImagingDelete(imOut); return NULL; } #ifdef VERBOSE printf("imaging %p allocated\n", imagep); #endif imagep->image = imOut; imagep->access = ImagingAccessNew(imOut); return (PyObject*) imagep; } static void _dealloc(ImagingObject* imagep) { #ifdef VERBOSE printf("imaging %p deleted\n", imagep); #endif if (imagep->access) ImagingAccessDelete(imagep->image, imagep->access); ImagingDelete(imagep->image); PyObject_Del(imagep); } #define PyImaging_Check(op) (Py_TYPE(op) == &Imaging_Type) Imaging PyImaging_AsImaging(PyObject *op) { if (!PyImaging_Check(op)) { PyErr_BadInternalCall(); return NULL; } return ((ImagingObject *)op)->image; } /* -------------------------------------------------------------------- */ /* THREAD HANDLING */ /* -------------------------------------------------------------------- */ void ImagingSectionEnter(ImagingSectionCookie* cookie) { #ifdef WITH_THREADING *cookie = (PyThreadState *) PyEval_SaveThread(); #endif } void ImagingSectionLeave(ImagingSectionCookie* cookie) { #ifdef WITH_THREADING PyEval_RestoreThread((PyThreadState*) *cookie); #endif } /* -------------------------------------------------------------------- */ /* BUFFER HANDLING */ /* -------------------------------------------------------------------- */ /* Python compatibility API */ int PyImaging_CheckBuffer(PyObject* buffer) { #if PY_VERSION_HEX >= 0x03000000 return PyObject_CheckBuffer(buffer); #else return PyObject_CheckBuffer(buffer) || PyObject_CheckReadBuffer(buffer); #endif } int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view) { /* must call check_buffer first! */ #if PY_VERSION_HEX >= 0x03000000 return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); #else /* Use new buffer protocol if available (mmap doesn't support this in 2.7, go figure) */ if (PyObject_CheckBuffer(buffer)) { return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); } /* Pretend we support the new protocol; PyBuffer_Release happily ignores calling bf_releasebuffer on objects that don't support it */ view->buf = NULL; view->len = 0; view->readonly = 1; view->format = NULL; view->ndim = 0; view->shape = NULL; view->strides = NULL; view->suboffsets = NULL; view->itemsize = 0; view->internal = NULL; Py_INCREF(buffer); view->obj = buffer; return PyObject_AsReadBuffer(buffer, (void *) &view->buf, &view->len); #endif } /* -------------------------------------------------------------------- */ /* EXCEPTION REROUTING */ /* -------------------------------------------------------------------- */ /* error messages */ static const char* must_be_sequence = "argument must be a sequence"; static const char* wrong_mode = "unrecognized image mode"; static const char* wrong_raw_mode = "unrecognized raw mode"; static const char* outside_image = "image index out of range"; static const char* outside_palette = "palette index out of range"; static const char* wrong_palette_size = "invalid palette size"; static const char* no_palette = "image has no palette"; static const char* readonly = "image is readonly"; /* static const char* no_content = "image has no content"; */ void * ImagingError_IOError(void) { PyErr_SetString(PyExc_IOError, "error when accessing file"); return NULL; } void * ImagingError_MemoryError(void) { return PyErr_NoMemory(); } void * ImagingError_Mismatch(void) { PyErr_SetString(PyExc_ValueError, "images do not match"); return NULL; } void * ImagingError_ModeError(void) { PyErr_SetString(PyExc_ValueError, "image has wrong mode"); return NULL; } void * ImagingError_ValueError(const char *message) { PyErr_SetString( PyExc_ValueError, (message) ? (char*) message : "unrecognized argument value" ); return NULL; } void ImagingError_Clear(void) { PyErr_Clear(); } /* -------------------------------------------------------------------- */ /* HELPERS */ /* -------------------------------------------------------------------- */ static int getbands(const char* mode) { Imaging im; int bands; /* FIXME: add primitive to libImaging to avoid extra allocation */ im = ImagingNew(mode, 0, 0); if (!im) return -1; bands = im->bands; ImagingDelete(im); return bands; } #define TYPE_UINT8 (0x100|sizeof(UINT8)) #define TYPE_INT32 (0x200|sizeof(INT32)) #define TYPE_FLOAT32 (0x300|sizeof(FLOAT32)) #define TYPE_DOUBLE (0x400|sizeof(double)) static void* getlist(PyObject* arg, int* length, const char* wrong_length, int type) { int i, n; void* list; if (!PySequence_Check(arg)) { PyErr_SetString(PyExc_TypeError, must_be_sequence); return NULL; } n = PyObject_Length(arg); if (length && wrong_length && n != *length) { PyErr_SetString(PyExc_ValueError, wrong_length); return NULL; } list = malloc(n * (type & 0xff)); if (!list) return PyErr_NoMemory(); switch (type) { case TYPE_UINT8: if (PyList_Check(arg)) { for (i = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(arg, i); int temp = PyInt_AsLong(op); ((UINT8*)list)[i] = CLIP(temp); } } else { for (i = 0; i < n; i++) { PyObject *op = PySequence_GetItem(arg, i); int temp = PyInt_AsLong(op); Py_XDECREF(op); ((UINT8*)list)[i] = CLIP(temp); } } break; case TYPE_INT32: if (PyList_Check(arg)) { for (i = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(arg, i); int temp = PyInt_AsLong(op); ((INT32*)list)[i] = temp; } } else { for (i = 0; i < n; i++) { PyObject *op = PySequence_GetItem(arg, i); int temp = PyInt_AsLong(op); Py_XDECREF(op); ((INT32*)list)[i] = temp; } } break; case TYPE_FLOAT32: if (PyList_Check(arg)) { for (i = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(arg, i); double temp = PyFloat_AsDouble(op); ((FLOAT32*)list)[i] = (FLOAT32) temp; } } else { for (i = 0; i < n; i++) { PyObject *op = PySequence_GetItem(arg, i); double temp = PyFloat_AsDouble(op); Py_XDECREF(op); ((FLOAT32*)list)[i] = (FLOAT32) temp; } } break; case TYPE_DOUBLE: if (PyList_Check(arg)) { for (i = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(arg, i); double temp = PyFloat_AsDouble(op); ((double*)list)[i] = temp; } } else { for (i = 0; i < n; i++) { PyObject *op = PySequence_GetItem(arg, i); double temp = PyFloat_AsDouble(op); Py_XDECREF(op); ((double*)list)[i] = temp; } } break; } if (length) *length = n; PyErr_Clear(); return list; } static inline PyObject* getpixel(Imaging im, ImagingAccess access, int x, int y) { union { UINT8 b[4]; INT16 h; INT32 i; FLOAT32 f; } pixel; if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return NULL; } access->get_pixel(im, x, y, &pixel); switch (im->type) { case IMAGING_TYPE_UINT8: switch (im->bands) { case 1: return PyInt_FromLong(pixel.b[0]); case 2: return Py_BuildValue("BB", pixel.b[0], pixel.b[1]); case 3: return Py_BuildValue("BBB", pixel.b[0], pixel.b[1], pixel.b[2]); case 4: return Py_BuildValue("BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]); } break; case IMAGING_TYPE_INT32: return PyInt_FromLong(pixel.i); case IMAGING_TYPE_FLOAT32: return PyFloat_FromDouble(pixel.f); case IMAGING_TYPE_SPECIAL: if (strncmp(im->mode, "I;16", 4) == 0) return PyInt_FromLong(pixel.h); break; } /* unknown type */ Py_INCREF(Py_None); return Py_None; } static char* getink(PyObject* color, Imaging im, char* ink) { int r, g, b, a; double f; /* fill ink buffer (four bytes) with something that can be cast to either UINT8 or INT32 */ switch (im->type) { case IMAGING_TYPE_UINT8: /* unsigned integer */ if (im->bands == 1) { /* unsigned integer, single layer */ r = PyInt_AsLong(color); if (r == -1 && PyErr_Occurred()) return NULL; ink[0] = CLIP(r); ink[1] = ink[2] = ink[3] = 0; } else { a = 255; #if PY_VERSION_HEX >= 0x03000000 if (PyLong_Check(color)) { r = (int) PyLong_AsLong(color); #else if (PyInt_Check(color) || PyLong_Check(color)) { if (PyInt_Check(color)) r = PyInt_AS_LONG(color); else r = (int) PyLong_AsLong(color); #endif /* compatibility: ABGR */ a = (UINT8) (r >> 24); b = (UINT8) (r >> 16); g = (UINT8) (r >> 8); r = (UINT8) r; } else { if (im->bands == 2) { if (!PyArg_ParseTuple(color, "i|i", &r, &a)) return NULL; g = b = r; } else { if (!PyArg_ParseTuple(color, "iii|i", &r, &g, &b, &a)) return NULL; } } ink[0] = CLIP(r); ink[1] = CLIP(g); ink[2] = CLIP(b); ink[3] = CLIP(a); } return ink; case IMAGING_TYPE_INT32: /* signed integer */ r = PyInt_AsLong(color); if (r == -1 && PyErr_Occurred()) return NULL; *(INT32*) ink = r; return ink; case IMAGING_TYPE_FLOAT32: /* floating point */ f = PyFloat_AsDouble(color); if (f == -1.0 && PyErr_Occurred()) return NULL; *(FLOAT32*) ink = (FLOAT32) f; return ink; case IMAGING_TYPE_SPECIAL: if (strncmp(im->mode, "I;16", 4) == 0) { r = PyInt_AsLong(color); if (r == -1 && PyErr_Occurred()) return NULL; ink[0] = (UINT8) r; ink[1] = (UINT8) (r >> 8); ink[2] = ink[3] = 0; return ink; } } PyErr_SetString(PyExc_ValueError, wrong_mode); return NULL; } /* -------------------------------------------------------------------- */ /* FACTORIES */ /* -------------------------------------------------------------------- */ static PyObject* _fill(PyObject* self, PyObject* args) { char* mode; int xsize, ysize; PyObject* color; char buffer[4]; Imaging im; xsize = ysize = 256; color = NULL; if (!PyArg_ParseTuple(args, "s|(ii)O", &mode, &xsize, &ysize, &color)) return NULL; im = ImagingNew(mode, xsize, ysize); if (!im) return NULL; if (color) { if (!getink(color, im, buffer)) { ImagingDelete(im); return NULL; } } else buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; (void) ImagingFill(im, buffer); return PyImagingNew(im); } static PyObject* _new(PyObject* self, PyObject* args) { char* mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) return NULL; return PyImagingNew(ImagingNew(mode, xsize, ysize)); } static PyObject* _new_array(PyObject* self, PyObject* args) { char* mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) return NULL; return PyImagingNew(ImagingNewArray(mode, xsize, ysize)); } static PyObject* _new_block(PyObject* self, PyObject* args) { char* mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) return NULL; return PyImagingNew(ImagingNewBlock(mode, xsize, ysize)); } static PyObject* _getcount(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":getcount")) return NULL; return PyInt_FromLong(ImagingNewCount); } static PyObject* _linear_gradient(PyObject* self, PyObject* args) { char* mode; if (!PyArg_ParseTuple(args, "s", &mode)) return NULL; return PyImagingNew(ImagingFillLinearGradient(mode)); } static PyObject* _radial_gradient(PyObject* self, PyObject* args) { char* mode; if (!PyArg_ParseTuple(args, "s", &mode)) return NULL; return PyImagingNew(ImagingFillRadialGradient(mode)); } static PyObject* _open_ppm(PyObject* self, PyObject* args) { char* filename; if (!PyArg_ParseTuple(args, "s", &filename)) return NULL; return PyImagingNew(ImagingOpenPPM(filename)); } static PyObject* _alpha_composite(ImagingObject* self, PyObject* args) { ImagingObject* imagep1; ImagingObject* imagep2; if (!PyArg_ParseTuple(args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) return NULL; return PyImagingNew(ImagingAlphaComposite(imagep1->image, imagep2->image)); } static PyObject* _blend(ImagingObject* self, PyObject* args) { ImagingObject* imagep1; ImagingObject* imagep2; double alpha; alpha = 0.5; if (!PyArg_ParseTuple(args, "O!O!|d", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2, &alpha)) return NULL; return PyImagingNew(ImagingBlend(imagep1->image, imagep2->image, (float) alpha)); } /* -------------------------------------------------------------------- */ /* METHODS */ /* -------------------------------------------------------------------- */ static PyObject* _convert(ImagingObject* self, PyObject* args) { char* mode; int dither = 0; ImagingObject *paletteimage = NULL; if (!PyArg_ParseTuple(args, "s|iO", &mode, &dither, &paletteimage)) return NULL; if (paletteimage != NULL) { if (!PyImaging_Check(paletteimage)) { PyObject_Print((PyObject *)paletteimage, stderr, 0); PyErr_SetString(PyExc_ValueError, "palette argument must be image with mode 'P'"); return NULL; } if (paletteimage->image->palette == NULL) { PyErr_SetString(PyExc_ValueError, "null palette"); return NULL; } } return PyImagingNew(ImagingConvert(self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither)); } static PyObject* _convert2(ImagingObject* self, PyObject* args) { ImagingObject* imagep1; ImagingObject* imagep2; if (!PyArg_ParseTuple(args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) return NULL; if (!ImagingConvert2(imagep1->image, imagep2->image)) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _convert_matrix(ImagingObject* self, PyObject* args) { char* mode; float m[12]; if (!PyArg_ParseTuple(args, "s(ffff)", &mode, m+0, m+1, m+2, m+3)) { PyErr_Clear(); if (!PyArg_ParseTuple(args, "s(ffffffffffff)", &mode, m+0, m+1, m+2, m+3, m+4, m+5, m+6, m+7, m+8, m+9, m+10, m+11)) return NULL; } return PyImagingNew(ImagingConvertMatrix(self->image, mode, m)); } static PyObject* _convert_transparent(ImagingObject* self, PyObject* args) { char* mode; int r,g,b; if (PyArg_ParseTuple(args, "s(iii)", &mode, &r, &g, &b)) { return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, g, b)); } PyErr_Clear(); if (PyArg_ParseTuple(args, "si", &mode, &r)) { return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, 0, 0)); } return NULL; } static PyObject* _copy(ImagingObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, "")) return NULL; return PyImagingNew(ImagingCopy(self->image)); } static PyObject* _copy2(ImagingObject* self, PyObject* args) { ImagingObject* imagep1; ImagingObject* imagep2; if (!PyArg_ParseTuple(args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) return NULL; if (!ImagingCopy2(imagep1->image, imagep2->image)) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _crop(ImagingObject* self, PyObject* args) { int x0, y0, x1, y1; if (!PyArg_ParseTuple(args, "(iiii)", &x0, &y0, &x1, &y1)) return NULL; return PyImagingNew(ImagingCrop(self->image, x0, y0, x1, y1)); } static PyObject* _expand(ImagingObject* self, PyObject* args) { int x, y; int mode = 0; if (!PyArg_ParseTuple(args, "ii|i", &x, &y, &mode)) return NULL; return PyImagingNew(ImagingExpand(self->image, x, y, mode)); } static PyObject* _filter(ImagingObject* self, PyObject* args) { PyObject* imOut; int kernelsize; FLOAT32* kerneldata; int xsize, ysize; float divisor, offset; PyObject* kernel = NULL; if (!PyArg_ParseTuple(args, "(ii)ffO", &xsize, &ysize, &divisor, &offset, &kernel)) return NULL; /* get user-defined kernel */ kerneldata = getlist(kernel, &kernelsize, NULL, TYPE_FLOAT32); if (!kerneldata) return NULL; if (kernelsize != xsize * ysize) { free(kerneldata); return ImagingError_ValueError("bad kernel size"); } imOut = PyImagingNew( ImagingFilter(self->image, xsize, ysize, kerneldata, offset, divisor) ); free(kerneldata); return imOut; } #ifdef WITH_UNSHARPMASK static PyObject* _gaussian_blur(ImagingObject* self, PyObject* args) { Imaging imIn; Imaging imOut; float radius = 0; if (!PyArg_ParseTuple(args, "f", &radius)) return NULL; imIn = self->image; imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; if (!ImagingGaussianBlur(imIn, imOut, radius)) return NULL; return PyImagingNew(imOut); } #endif static PyObject* _getpalette(ImagingObject* self, PyObject* args) { PyObject* palette; int palettesize = 256; int bits; ImagingShuffler pack; char* mode = "RGB"; char* rawmode = "RGB"; if (!PyArg_ParseTuple(args, "|ss", &mode, &rawmode)) return NULL; if (!self->image->palette) { PyErr_SetString(PyExc_ValueError, no_palette); return NULL; } pack = ImagingFindPacker(mode, rawmode, &bits); if (!pack) { PyErr_SetString(PyExc_ValueError, wrong_raw_mode); return NULL; } palette = PyBytes_FromStringAndSize(NULL, palettesize * bits / 8); if (!palette) return NULL; pack((UINT8*) PyBytes_AsString(palette), self->image->palette->palette, palettesize); return palette; } static PyObject* _getpalettemode(ImagingObject* self, PyObject* args) { if (!self->image->palette) { PyErr_SetString(PyExc_ValueError, no_palette); return NULL; } return PyUnicode_FromString(self->image->palette->mode); } static inline int _getxy(PyObject* xy, int* x, int *y) { PyObject* value; if (!PyTuple_Check(xy) || PyTuple_GET_SIZE(xy) != 2) goto badarg; value = PyTuple_GET_ITEM(xy, 0); if (PyInt_Check(value)) *x = PyInt_AS_LONG(value); else if (PyFloat_Check(value)) *x = (int) PyFloat_AS_DOUBLE(value); else goto badval; value = PyTuple_GET_ITEM(xy, 1); if (PyInt_Check(value)) *y = PyInt_AS_LONG(value); else if (PyFloat_Check(value)) *y = (int) PyFloat_AS_DOUBLE(value); else goto badval; return 0; badarg: PyErr_SetString( PyExc_TypeError, "argument must be sequence of length 2" ); return -1; badval: PyErr_SetString( PyExc_TypeError, "an integer is required" ); return -1; } static PyObject* _getpixel(ImagingObject* self, PyObject* args) { PyObject* xy; int x, y; if (PyTuple_GET_SIZE(args) != 1) { PyErr_SetString( PyExc_TypeError, "argument 1 must be sequence of length 2" ); return NULL; } xy = PyTuple_GET_ITEM(args, 0); if (_getxy(xy, &x, &y)) return NULL; if (self->access == NULL) { Py_INCREF(Py_None); return Py_None; } return getpixel(self->image, self->access, x, y); } static PyObject* _histogram(ImagingObject* self, PyObject* args) { ImagingHistogram h; PyObject* list; int i; union { UINT8 u[2]; INT32 i[2]; FLOAT32 f[2]; } extrema; void* ep; int i0, i1; double f0, f1; PyObject* extremap = NULL; ImagingObject* maskp = NULL; if (!PyArg_ParseTuple(args, "|OO!", &extremap, &Imaging_Type, &maskp)) return NULL; if (extremap) { ep = &extrema; switch (self->image->type) { case IMAGING_TYPE_UINT8: if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) return NULL; /* FIXME: clip */ extrema.u[0] = i0; extrema.u[1] = i1; break; case IMAGING_TYPE_INT32: if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) return NULL; extrema.i[0] = i0; extrema.i[1] = i1; break; case IMAGING_TYPE_FLOAT32: if (!PyArg_ParseTuple(extremap, "dd", &f0, &f1)) return NULL; extrema.f[0] = (FLOAT32) f0; extrema.f[1] = (FLOAT32) f1; break; default: ep = NULL; break; } } else ep = NULL; h = ImagingGetHistogram(self->image, (maskp) ? maskp->image : NULL, ep); if (!h) return NULL; /* Build an integer list containing the histogram */ list = PyList_New(h->bands * 256); for (i = 0; i < h->bands * 256; i++) { PyObject* item; item = PyInt_FromLong(h->histogram[i]); if (item == NULL) { Py_DECREF(list); list = NULL; break; } PyList_SetItem(list, i, item); } ImagingHistogramDelete(h); return list; } #ifdef WITH_MODEFILTER static PyObject* _modefilter(ImagingObject* self, PyObject* args) { int size; if (!PyArg_ParseTuple(args, "i", &size)) return NULL; return PyImagingNew(ImagingModeFilter(self->image, size)); } #endif static PyObject* _offset(ImagingObject* self, PyObject* args) { int xoffset, yoffset; if (!PyArg_ParseTuple(args, "ii", &xoffset, &yoffset)) return NULL; return PyImagingNew(ImagingOffset(self->image, xoffset, yoffset)); } static PyObject* _paste(ImagingObject* self, PyObject* args) { int status; char ink[4]; PyObject* source; int x0, y0, x1, y1; ImagingObject* maskp = NULL; if (!PyArg_ParseTuple(args, "O(iiii)|O!", &source, &x0, &y0, &x1, &y1, &Imaging_Type, &maskp)) return NULL; if (PyImaging_Check(source)) status = ImagingPaste( self->image, PyImaging_AsImaging(source), (maskp) ? maskp->image : NULL, x0, y0, x1, y1 ); else { if (!getink(source, self->image, ink)) return NULL; status = ImagingFill2( self->image, ink, (maskp) ? maskp->image : NULL, x0, y0, x1, y1 ); } if (status < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _point(ImagingObject* self, PyObject* args) { static const char* wrong_number = "wrong number of lut entries"; int n, i; int bands; Imaging im; PyObject* list; char* mode; if (!PyArg_ParseTuple(args, "Oz", &list, &mode)) return NULL; if (mode && !strcmp(mode, "F")) { FLOAT32* data; /* map from 8-bit data to floating point */ n = 256; data = getlist(list, &n, wrong_number, TYPE_FLOAT32); if (!data) return NULL; im = ImagingPoint(self->image, mode, (void*) data); free(data); } else if (!strcmp(self->image->mode, "I") && mode && !strcmp(mode, "L")) { UINT8* data; /* map from 16-bit subset of 32-bit data to 8-bit */ /* FIXME: support arbitrary number of entries (requires API change) */ n = 65536; data = getlist(list, &n, wrong_number, TYPE_UINT8); if (!data) return NULL; im = ImagingPoint(self->image, mode, (void*) data); free(data); } else { INT32* data; UINT8 lut[1024]; if (mode) { bands = getbands(mode); if (bands < 0) return NULL; } else bands = self->image->bands; /* map to integer data */ n = 256 * bands; data = getlist(list, &n, wrong_number, TYPE_INT32); if (!data) return NULL; if (mode && !strcmp(mode, "I")) im = ImagingPoint(self->image, mode, (void*) data); else if (mode && bands > 1) { for (i = 0; i < 256; i++) { lut[i*4] = CLIP(data[i]); lut[i*4+1] = CLIP(data[i+256]); lut[i*4+2] = CLIP(data[i+512]); if (n > 768) lut[i*4+3] = CLIP(data[i+768]); } im = ImagingPoint(self->image, mode, (void*) lut); } else { /* map individual bands */ for (i = 0; i < n; i++) lut[i] = CLIP(data[i]); im = ImagingPoint(self->image, mode, (void*) lut); } free(data); } return PyImagingNew(im); } static PyObject* _point_transform(ImagingObject* self, PyObject* args) { double scale = 1.0; double offset = 0.0; if (!PyArg_ParseTuple(args, "|dd", &scale, &offset)) return NULL; return PyImagingNew(ImagingPointTransform(self->image, scale, offset)); } static PyObject* _putdata(ImagingObject* self, PyObject* args) { Imaging image; // i & n are # pixels, require py_ssize_t. x can be as large as n. y, just because. Py_ssize_t n, i, x, y; PyObject* data; double scale = 1.0; double offset = 0.0; if (!PyArg_ParseTuple(args, "O|dd", &data, &scale, &offset)) return NULL; if (!PySequence_Check(data)) { PyErr_SetString(PyExc_TypeError, must_be_sequence); return NULL; } image = self->image; n = PyObject_Length(data); if (n > (Py_ssize_t) (image->xsize * image->ysize)) { PyErr_SetString(PyExc_TypeError, "too many data entries"); return NULL; } if (image->image8) { if (PyBytes_Check(data)) { unsigned char* p; p = (unsigned char*) PyBytes_AS_STRING(data); if (scale == 1.0 && offset == 0.0) /* Plain string data */ for (i = y = 0; i < n; i += image->xsize, y++) { x = n - i; if (x > (int) image->xsize) x = image->xsize; memcpy(image->image8[y], p+i, x); } else /* Scaled and clipped string data */ for (i = x = y = 0; i < n; i++) { image->image8[y][x] = CLIP((int) (p[i] * scale + offset)); if (++x >= (int) image->xsize) x = 0, y++; } } else { if (scale == 1.0 && offset == 0.0) { /* Clipped data */ if (PyList_Check(data)) { for (i = x = y = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(data, i); image->image8[y][x] = (UINT8) CLIP(PyInt_AsLong(op)); if (++x >= (int) image->xsize) x = 0, y++; } } else { for (i = x = y = 0; i < n; i++) { PyObject *op = PySequence_GetItem(data, i); image->image8[y][x] = (UINT8) CLIP(PyInt_AsLong(op)); Py_XDECREF(op); if (++x >= (int) image->xsize) x = 0, y++; } } } else { if (PyList_Check(data)) { /* Scaled and clipped data */ for (i = x = y = 0; i < n; i++) { PyObject *op = PyList_GET_ITEM(data, i); image->image8[y][x] = CLIP( (int) (PyFloat_AsDouble(op) * scale + offset)); if (++x >= (int) image->xsize) x = 0, y++; } } else { for (i = x = y = 0; i < n; i++) { PyObject *op = PySequence_GetItem(data, i); image->image8[y][x] = CLIP( (int) (PyFloat_AsDouble(op) * scale + offset)); Py_XDECREF(op); if (++x >= (int) image->xsize) x = 0, y++; } } } PyErr_Clear(); /* Avoid weird exceptions */ } } else { /* 32-bit images */ switch (image->type) { case IMAGING_TYPE_INT32: for (i = x = y = 0; i < n; i++) { PyObject *op = PySequence_GetItem(data, i); IMAGING_PIXEL_INT32(image, x, y) = (INT32) (PyFloat_AsDouble(op) * scale + offset); Py_XDECREF(op); if (++x >= (int) image->xsize) x = 0, y++; } PyErr_Clear(); /* Avoid weird exceptions */ break; case IMAGING_TYPE_FLOAT32: for (i = x = y = 0; i < n; i++) { PyObject *op = PySequence_GetItem(data, i); IMAGING_PIXEL_FLOAT32(image, x, y) = (FLOAT32) (PyFloat_AsDouble(op) * scale + offset); Py_XDECREF(op); if (++x >= (int) image->xsize) x = 0, y++; } PyErr_Clear(); /* Avoid weird exceptions */ break; default: for (i = x = y = 0; i < n; i++) { union { char ink[4]; INT32 inkint; } u; PyObject *op = PySequence_GetItem(data, i); if (!op || !getink(op, image, u.ink)) { Py_DECREF(op); return NULL; } /* FIXME: what about scale and offset? */ image->image32[y][x] = u.inkint; Py_XDECREF(op); if (++x >= (int) image->xsize) x = 0, y++; } PyErr_Clear(); /* Avoid weird exceptions */ break; } } Py_INCREF(Py_None); return Py_None; } #ifdef WITH_QUANTIZE static PyObject* _quantize(ImagingObject* self, PyObject* args) { int colours = 256; int method = 0; int kmeans = 0; if (!PyArg_ParseTuple(args, "|iii", &colours, &method, &kmeans)) return NULL; if (!self->image->xsize || !self->image->ysize) { /* no content; return an empty image */ return PyImagingNew( ImagingNew("P", self->image->xsize, self->image->ysize) ); } return PyImagingNew(ImagingQuantize(self->image, colours, method, kmeans)); } #endif static PyObject* _putpalette(ImagingObject* self, PyObject* args) { ImagingShuffler unpack; int bits; char* rawmode; UINT8* palette; int palettesize; if (!PyArg_ParseTuple(args, "s"PY_ARG_BYTES_LENGTH, &rawmode, &palette, &palettesize)) return NULL; if (strcmp(self->image->mode, "L") != 0 && strcmp(self->image->mode, "P")) { PyErr_SetString(PyExc_ValueError, wrong_mode); return NULL; } unpack = ImagingFindUnpacker("RGB", rawmode, &bits); if (!unpack) { PyErr_SetString(PyExc_ValueError, wrong_raw_mode); return NULL; } if ( palettesize * 8 / bits > 256) { PyErr_SetString(PyExc_ValueError, wrong_palette_size); return NULL; } ImagingPaletteDelete(self->image->palette); strcpy(self->image->mode, "P"); self->image->palette = ImagingPaletteNew("RGB"); unpack(self->image->palette->palette, palette, palettesize * 8 / bits); Py_INCREF(Py_None); return Py_None; } static PyObject* _putpalettealpha(ImagingObject* self, PyObject* args) { int index; int alpha = 0; if (!PyArg_ParseTuple(args, "i|i", &index, &alpha)) return NULL; if (!self->image->palette) { PyErr_SetString(PyExc_ValueError, no_palette); return NULL; } if (index < 0 || index >= 256) { PyErr_SetString(PyExc_ValueError, outside_palette); return NULL; } strcpy(self->image->palette->mode, "RGBA"); self->image->palette->palette[index*4+3] = (UINT8) alpha; Py_INCREF(Py_None); return Py_None; } static PyObject* _putpalettealphas(ImagingObject* self, PyObject* args) { int i; UINT8 *values; int length; if (!PyArg_ParseTuple(args, "s#", &values, &length)) return NULL; if (!self->image->palette) { PyErr_SetString(PyExc_ValueError, no_palette); return NULL; } if (length > 256) { PyErr_SetString(PyExc_ValueError, outside_palette); return NULL; } strcpy(self->image->palette->mode, "RGBA"); for (i=0; iimage->palette->palette[i*4+3] = (UINT8) values[i]; } Py_INCREF(Py_None); return Py_None; } static PyObject* _putpixel(ImagingObject* self, PyObject* args) { Imaging im; char ink[4]; int x, y; PyObject* color; if (!PyArg_ParseTuple(args, "(ii)O", &x, &y, &color)) return NULL; im = self->image; if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return NULL; } if (!getink(color, im, ink)) return NULL; if (self->access) self->access->put_pixel(im, x, y, ink); Py_INCREF(Py_None); return Py_None; } #ifdef WITH_RANKFILTER static PyObject* _rankfilter(ImagingObject* self, PyObject* args) { int size, rank; if (!PyArg_ParseTuple(args, "ii", &size, &rank)) return NULL; return PyImagingNew(ImagingRankFilter(self->image, size, rank)); } #endif static PyObject* _resize(ImagingObject* self, PyObject* args) { Imaging imIn; Imaging imOut; int xsize, ysize; int filter = IMAGING_TRANSFORM_NEAREST; if (!PyArg_ParseTuple(args, "(ii)|i", &xsize, &ysize, &filter)) return NULL; imIn = self->image; imOut = ImagingNew(imIn->mode, xsize, ysize); if (imOut) (void) ImagingResize(imOut, imIn, filter); return PyImagingNew(imOut); } static PyObject* _rotate(ImagingObject* self, PyObject* args) { Imaging imOut; Imaging imIn; double theta; int filter = IMAGING_TRANSFORM_NEAREST; if (!PyArg_ParseTuple(args, "d|i", &theta, &filter)) return NULL; imIn = self->image; theta = fmod(theta, 360.0); if (theta < 0.0) theta += 360; if (filter && imIn->type != IMAGING_TYPE_SPECIAL) { /* Rotate with resampling filter */ imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); (void) ImagingRotate(imOut, imIn, theta, filter); } else if (theta == 90.0 || theta == 270.0) { /* Use fast version */ imOut = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); if (imOut) { if (theta == 90.0) (void) ImagingRotate90(imOut, imIn); else (void) ImagingRotate270(imOut, imIn); } } else { imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (imOut) { if (theta == 0.0) /* No rotation: simply copy the input image */ (void) ImagingCopy2(imOut, imIn); else if (theta == 180.0) /* Use fast version */ (void) ImagingRotate180(imOut, imIn); else /* Use ordinary version */ (void) ImagingRotate(imOut, imIn, theta, 0); } } return PyImagingNew(imOut); } #define IS_RGB(mode)\ (!strcmp(mode, "RGB") || !strcmp(mode, "RGBA") || !strcmp(mode, "RGBX")) static PyObject* im_setmode(ImagingObject* self, PyObject* args) { /* attempt to modify the mode of an image in place */ Imaging im; char* mode; int modelen; if (!PyArg_ParseTuple(args, "s#:setmode", &mode, &modelen)) return NULL; im = self->image; /* move all logic in here to the libImaging primitive */ if (!strcmp(im->mode, mode)) { ; /* same mode; always succeeds */ } else if (IS_RGB(im->mode) && IS_RGB(mode)) { /* color to color */ strcpy(im->mode, mode); im->bands = modelen; if (!strcmp(mode, "RGBA")) (void) ImagingFillBand(im, 3, 255); } else { /* trying doing an in-place conversion */ if (!ImagingConvertInPlace(im, mode)) return NULL; } if (self->access) ImagingAccessDelete(im, self->access); self->access = ImagingAccessNew(im); Py_INCREF(Py_None); return Py_None; } static PyObject* _stretch(ImagingObject* self, PyObject* args) { Imaging imIn; Imaging imTemp; Imaging imOut; int xsize, ysize; int filter = IMAGING_TRANSFORM_NEAREST; if (!PyArg_ParseTuple(args, "(ii)|i", &xsize, &ysize, &filter)) return NULL; imIn = self->image; /* two-pass resize: minimize size of intermediate image */ if ((Py_ssize_t) imIn->xsize * ysize < (Py_ssize_t) xsize * imIn->ysize) imTemp = ImagingNew(imIn->mode, imIn->xsize, ysize); else imTemp = ImagingNew(imIn->mode, xsize, imIn->ysize); if (!imTemp) return NULL; /* first pass */ if (!ImagingStretch(imTemp, imIn, filter)) { ImagingDelete(imTemp); return NULL; } imOut = ImagingNew(imIn->mode, xsize, ysize); if (!imOut) { ImagingDelete(imTemp); return NULL; } /* second pass */ if (!ImagingStretch(imOut, imTemp, filter)) { ImagingDelete(imOut); ImagingDelete(imTemp); return NULL; } ImagingDelete(imTemp); return PyImagingNew(imOut); } static PyObject* _transform2(ImagingObject* self, PyObject* args) { static const char* wrong_number = "wrong number of matrix entries"; Imaging imIn; Imaging imOut; int n; double *a; ImagingObject* imagep; int x0, y0, x1, y1; int method; PyObject* data; int filter = IMAGING_TRANSFORM_NEAREST; int fill = 1; if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii", &x0, &y0, &x1, &y1, &Imaging_Type, &imagep, &method, &data, &filter, &fill)) return NULL; switch (method) { case IMAGING_TRANSFORM_AFFINE: n = 6; break; case IMAGING_TRANSFORM_PERSPECTIVE: n = 8; break; case IMAGING_TRANSFORM_QUAD: n = 8; break; default: n = -1; /* force error */ } a = getlist(data, &n, wrong_number, TYPE_DOUBLE); if (!a) return NULL; imOut = self->image; imIn = imagep->image; /* FIXME: move transform dispatcher into libImaging */ switch (method) { case IMAGING_TRANSFORM_AFFINE: imOut = ImagingTransformAffine( imOut, imIn, x0, y0, x1, y1, a, filter, 1 ); break; case IMAGING_TRANSFORM_PERSPECTIVE: imOut = ImagingTransformPerspective( imOut, imIn, x0, y0, x1, y1, a, filter, 1 ); break; case IMAGING_TRANSFORM_QUAD: imOut = ImagingTransformQuad( imOut, imIn, x0, y0, x1, y1, a, filter, 1 ); break; default: (void) ImagingError_ValueError("bad transform method"); } free(a); if (!imOut) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _transpose(ImagingObject* self, PyObject* args) { Imaging imIn; Imaging imOut; int op; if (!PyArg_ParseTuple(args, "i", &op)) return NULL; imIn = self->image; switch (op) { case 0: /* flip left right */ case 1: /* flip top bottom */ case 3: /* rotate 180 */ imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); break; case 2: /* rotate 90 */ case 4: /* rotate 270 */ imOut = ImagingNew(imIn->mode, imIn->ysize, imIn->xsize); break; default: PyErr_SetString(PyExc_ValueError, "No such transpose operation"); return NULL; } if (imOut) switch (op) { case 0: (void) ImagingFlipLeftRight(imOut, imIn); break; case 1: (void) ImagingFlipTopBottom(imOut, imIn); break; case 2: (void) ImagingRotate90(imOut, imIn); break; case 3: (void) ImagingRotate180(imOut, imIn); break; case 4: (void) ImagingRotate270(imOut, imIn); break; } return PyImagingNew(imOut); } #ifdef WITH_UNSHARPMASK static PyObject* _unsharp_mask(ImagingObject* self, PyObject* args) { Imaging imIn; Imaging imOut; float radius; int percent, threshold; if (!PyArg_ParseTuple(args, "fii", &radius, &percent, &threshold)) return NULL; imIn = self->image; imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; if (!ImagingUnsharpMask(imIn, imOut, radius, percent, threshold)) return NULL; return PyImagingNew(imOut); } #endif /* -------------------------------------------------------------------- */ static PyObject* _isblock(ImagingObject* self, PyObject* args) { return PyInt_FromLong((long) self->image->block); } static PyObject* _getbbox(ImagingObject* self, PyObject* args) { int bbox[4]; if (!ImagingGetBBox(self->image, bbox)) { Py_INCREF(Py_None); return Py_None; } return Py_BuildValue("iiii", bbox[0], bbox[1], bbox[2], bbox[3]); } static PyObject* _getcolors(ImagingObject* self, PyObject* args) { ImagingColorItem* items; int i, colors; PyObject* out; int maxcolors = 256; if (!PyArg_ParseTuple(args, "i:getcolors", &maxcolors)) return NULL; items = ImagingGetColors(self->image, maxcolors, &colors); if (!items) return NULL; if (colors > maxcolors) { out = Py_None; Py_INCREF(out); } else { out = PyList_New(colors); for (i = 0; i < colors; i++) { ImagingColorItem* v = &items[i]; PyObject* item = Py_BuildValue( "iN", v->count, getpixel(self->image, self->access, v->x, v->y) ); PyList_SetItem(out, i, item); } } free(items); return out; } static PyObject* _getextrema(ImagingObject* self, PyObject* args) { union { UINT8 u[2]; INT32 i[2]; FLOAT32 f[2]; } extrema; int status; status = ImagingGetExtrema(self->image, &extrema); if (status < 0) return NULL; if (status) switch (self->image->type) { case IMAGING_TYPE_UINT8: return Py_BuildValue("BB", extrema.u[0], extrema.u[1]); case IMAGING_TYPE_INT32: return Py_BuildValue("ii", extrema.i[0], extrema.i[1]); case IMAGING_TYPE_FLOAT32: return Py_BuildValue("dd", extrema.f[0], extrema.f[1]); } Py_INCREF(Py_None); return Py_None; } static PyObject* _getprojection(ImagingObject* self, PyObject* args) { unsigned char* xprofile; unsigned char* yprofile; PyObject* result; xprofile = malloc(self->image->xsize); yprofile = malloc(self->image->ysize); if (xprofile == NULL || yprofile == NULL) { free(xprofile); free(yprofile); return PyErr_NoMemory(); } ImagingGetProjection(self->image, (unsigned char *)xprofile, (unsigned char *)yprofile); result = Py_BuildValue(PY_ARG_BYTES_LENGTH PY_ARG_BYTES_LENGTH, xprofile, self->image->xsize, yprofile, self->image->ysize); free(xprofile); free(yprofile); return result; } /* -------------------------------------------------------------------- */ static PyObject* _getband(ImagingObject* self, PyObject* args) { int band; if (!PyArg_ParseTuple(args, "i", &band)) return NULL; return PyImagingNew(ImagingGetBand(self->image, band)); } static PyObject* _fillband(ImagingObject* self, PyObject* args) { int band; int color; if (!PyArg_ParseTuple(args, "ii", &band, &color)) return NULL; if (!ImagingFillBand(self->image, band, color)) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _putband(ImagingObject* self, PyObject* args) { ImagingObject* imagep; int band; if (!PyArg_ParseTuple(args, "O!i", &Imaging_Type, &imagep, &band)) return NULL; if (!ImagingPutBand(self->image, imagep->image, band)) return NULL; Py_INCREF(Py_None); return Py_None; } /* -------------------------------------------------------------------- */ #ifdef WITH_IMAGECHOPS static PyObject* _chop_invert(ImagingObject* self, PyObject* args) { return PyImagingNew(ImagingNegative(self->image)); } static PyObject* _chop_lighter(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopLighter(self->image, imagep->image)); } static PyObject* _chop_darker(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopDarker(self->image, imagep->image)); } static PyObject* _chop_difference(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopDifference(self->image, imagep->image)); } static PyObject* _chop_multiply(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopMultiply(self->image, imagep->image)); } static PyObject* _chop_screen(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopScreen(self->image, imagep->image)); } static PyObject* _chop_add(ImagingObject* self, PyObject* args) { ImagingObject* imagep; float scale; int offset; scale = 1.0; offset = 0; if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, &scale, &offset)) return NULL; return PyImagingNew(ImagingChopAdd(self->image, imagep->image, scale, offset)); } static PyObject* _chop_subtract(ImagingObject* self, PyObject* args) { ImagingObject* imagep; float scale; int offset; scale = 1.0; offset = 0; if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, &scale, &offset)) return NULL; return PyImagingNew(ImagingChopSubtract(self->image, imagep->image, scale, offset)); } static PyObject* _chop_and(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopAnd(self->image, imagep->image)); } static PyObject* _chop_or(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopOr(self->image, imagep->image)); } static PyObject* _chop_xor(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopXor(self->image, imagep->image)); } static PyObject* _chop_add_modulo(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopAddModulo(self->image, imagep->image)); } static PyObject* _chop_subtract_modulo(ImagingObject* self, PyObject* args) { ImagingObject* imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) return NULL; return PyImagingNew(ImagingChopSubtractModulo(self->image, imagep->image)); } #endif /* -------------------------------------------------------------------- */ #ifdef WITH_IMAGEDRAW static PyObject* _font_new(PyObject* self_, PyObject* args) { ImagingFontObject *self; int i, y0, y1; static const char* wrong_length = "descriptor table has wrong size"; ImagingObject* imagep; unsigned char* glyphdata; int glyphdata_length; if (!PyArg_ParseTuple(args, "O!"PY_ARG_BYTES_LENGTH, &Imaging_Type, &imagep, &glyphdata, &glyphdata_length)) return NULL; if (glyphdata_length != 256 * 20) { PyErr_SetString(PyExc_ValueError, wrong_length); return NULL; } self = PyObject_New(ImagingFontObject, &ImagingFont_Type); if (self == NULL) return NULL; /* glyph bitmap */ self->bitmap = imagep->image; y0 = y1 = 0; /* glyph glyphs */ for (i = 0; i < 256; i++) { self->glyphs[i].dx = S16(B16(glyphdata, 0)); self->glyphs[i].dy = S16(B16(glyphdata, 2)); self->glyphs[i].dx0 = S16(B16(glyphdata, 4)); self->glyphs[i].dy0 = S16(B16(glyphdata, 6)); self->glyphs[i].dx1 = S16(B16(glyphdata, 8)); self->glyphs[i].dy1 = S16(B16(glyphdata, 10)); self->glyphs[i].sx0 = S16(B16(glyphdata, 12)); self->glyphs[i].sy0 = S16(B16(glyphdata, 14)); self->glyphs[i].sx1 = S16(B16(glyphdata, 16)); self->glyphs[i].sy1 = S16(B16(glyphdata, 18)); if (self->glyphs[i].dy0 < y0) y0 = self->glyphs[i].dy0; if (self->glyphs[i].dy1 > y1) y1 = self->glyphs[i].dy1; glyphdata += 20; } self->baseline = -y0; self->ysize = y1 - y0; /* keep a reference to the bitmap object */ Py_INCREF(imagep); self->ref = imagep; return (PyObject*) self; } static void _font_dealloc(ImagingFontObject* self) { Py_XDECREF(self->ref); PyObject_Del(self); } static inline int textwidth(ImagingFontObject* self, const unsigned char* text) { int xsize; for (xsize = 0; *text; text++) xsize += self->glyphs[*text].dx; return xsize; } static PyObject* _font_getmask(ImagingFontObject* self, PyObject* args) { Imaging im; Imaging bitmap; int x, b; int status; Glyph* glyph; unsigned char* text; char* mode = ""; if (!PyArg_ParseTuple(args, "s|s:getmask", &text, &mode)) return NULL; im = ImagingNew(self->bitmap->mode, textwidth(self, text), self->ysize); if (!im) return NULL; b = 0; (void) ImagingFill(im, &b); b = self->baseline; for (x = 0; *text; text++) { glyph = &self->glyphs[*text]; bitmap = ImagingCrop( self->bitmap, glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1 ); if (!bitmap) goto failed; status = ImagingPaste( im, bitmap, NULL, glyph->dx0+x, glyph->dy0+b, glyph->dx1+x, glyph->dy1+b ); ImagingDelete(bitmap); if (status < 0) goto failed; x = x + glyph->dx; b = b + glyph->dy; } return PyImagingNew(im); failed: ImagingDelete(im); return NULL; } static PyObject* _font_getsize(ImagingFontObject* self, PyObject* args) { unsigned char* text; if (!PyArg_ParseTuple(args, "s:getsize", &text)) return NULL; return Py_BuildValue("ii", textwidth(self, text), self->ysize); } static struct PyMethodDef _font_methods[] = { {"getmask", (PyCFunction)_font_getmask, 1}, {"getsize", (PyCFunction)_font_getsize, 1}, {NULL, NULL} /* sentinel */ }; /* -------------------------------------------------------------------- */ static PyObject* _draw_new(PyObject* self_, PyObject* args) { ImagingDrawObject *self; ImagingObject* imagep; int blend = 0; if (!PyArg_ParseTuple(args, "O!|i", &Imaging_Type, &imagep, &blend)) return NULL; self = PyObject_New(ImagingDrawObject, &ImagingDraw_Type); if (self == NULL) return NULL; /* keep a reference to the image object */ Py_INCREF(imagep); self->image = imagep; self->ink[0] = self->ink[1] = self->ink[2] = self->ink[3] = 0; self->blend = blend; return (PyObject*) self; } static void _draw_dealloc(ImagingDrawObject* self) { Py_XDECREF(self->image); PyObject_Del(self); } extern int PyPath_Flatten(PyObject* data, double **xy); static PyObject* _draw_ink(ImagingDrawObject* self, PyObject* args) { INT32 ink = 0; PyObject* color; char* mode = NULL; /* not used in this release */ if (!PyArg_ParseTuple(args, "O|s", &color, &mode)) return NULL; if (!getink(color, self->image->image, (char*) &ink)) return NULL; return PyInt_FromLong((int) ink); } static PyObject* _draw_arc(ImagingDrawObject* self, PyObject* args) { int x0, y0, x1, y1; int ink; int start, end; int op = 0; if (!PyArg_ParseTuple(args, "(iiii)iii|i", &x0, &y0, &x1, &y1, &start, &end, &ink)) return NULL; if (ImagingDrawArc(self->image->image, x0, y0, x1, y1, start, end, &ink, op) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_bitmap(ImagingDrawObject* self, PyObject* args) { double *xy; int n; PyObject *data; ImagingObject* bitmap; int ink; if (!PyArg_ParseTuple(args, "OO!i", &data, &Imaging_Type, &bitmap, &ink)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; if (n != 1) { PyErr_SetString(PyExc_TypeError, "coordinate list must contain exactly 1 coordinate" ); return NULL; } n = ImagingDrawBitmap( self->image->image, (int) xy[0], (int) xy[1], bitmap->image, &ink, self->blend ); free(xy); if (n < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_chord(ImagingDrawObject* self, PyObject* args) { int x0, y0, x1, y1; int ink, fill; int start, end; if (!PyArg_ParseTuple(args, "(iiii)iiii", &x0, &y0, &x1, &y1, &start, &end, &ink, &fill)) return NULL; if (ImagingDrawChord(self->image->image, x0, y0, x1, y1, start, end, &ink, fill, self->blend) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_ellipse(ImagingDrawObject* self, PyObject* args) { double* xy; int n; PyObject* data; int ink; int fill = 0; if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, "coordinate list must contain exactly 2 coordinates" ); return NULL; } n = ImagingDrawEllipse(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], &ink, fill, self->blend ); free(xy); if (n < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_line(ImagingDrawObject* self, PyObject* args) { int x0, y0, x1, y1; int ink; if (!PyArg_ParseTuple(args, "(ii)(ii)i", &x0, &y0, &x1, &y1, &ink)) return NULL; if (ImagingDrawLine(self->image->image, x0, y0, x1, y1, &ink, self->blend) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_lines(ImagingDrawObject* self, PyObject* args) { double *xy; int i, n; PyObject *data; int ink; int width = 0; if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &width)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; if (width <= 1) { double *p = NULL; for (i = 0; i < n-1; i++) { p = &xy[i+i]; if (ImagingDrawLine( self->image->image, (int) p[0], (int) p[1], (int) p[2], (int) p[3], &ink, self->blend) < 0) { free(xy); return NULL; } } if (p) /* draw last point */ ImagingDrawPoint( self->image->image, (int) p[2], (int) p[3], &ink, self->blend ); } else { for (i = 0; i < n-1; i++) { double *p = &xy[i+i]; if (ImagingDrawWideLine( self->image->image, (int) p[0], (int) p[1], (int) p[2], (int) p[3], &ink, width, self->blend) < 0) { free(xy); return NULL; } } } free(xy); Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_point(ImagingDrawObject* self, PyObject* args) { int x, y; int ink; if (!PyArg_ParseTuple(args, "(ii)i", &x, &y, &ink)) return NULL; if (ImagingDrawPoint(self->image->image, x, y, &ink, self->blend) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_points(ImagingDrawObject* self, PyObject* args) { double *xy; int i, n; PyObject *data; int ink; if (!PyArg_ParseTuple(args, "Oi", &data, &ink)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; for (i = 0; i < n; i++) { double *p = &xy[i+i]; if (ImagingDrawPoint(self->image->image, (int) p[0], (int) p[1], &ink, self->blend) < 0) { free(xy); return NULL; } } free(xy); Py_INCREF(Py_None); return Py_None; } #ifdef WITH_ARROW /* from outline.c */ extern ImagingOutline PyOutline_AsOutline(PyObject* outline); static PyObject* _draw_outline(ImagingDrawObject* self, PyObject* args) { ImagingOutline outline; PyObject* outline_; int ink; int fill = 0; if (!PyArg_ParseTuple(args, "Oi|i", &outline_, &ink, &fill)) return NULL; outline = PyOutline_AsOutline(outline_); if (!outline) { PyErr_SetString(PyExc_TypeError, "expected outline object"); return NULL; } if (ImagingDrawOutline(self->image->image, outline, &ink, fill, self->blend) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } #endif static PyObject* _draw_pieslice(ImagingDrawObject* self, PyObject* args) { int x0, y0, x1, y1; int ink, fill; int start, end; if (!PyArg_ParseTuple(args, "(iiii)iiii", &x0, &y0, &x1, &y1, &start, &end, &ink, &fill)) return NULL; if (ImagingDrawPieslice(self->image->image, x0, y0, x1, y1, start, end, &ink, fill, self->blend) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_polygon(ImagingDrawObject* self, PyObject* args) { double *xy; int *ixy; int n, i; PyObject* data; int ink; int fill = 0; if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; if (n < 2) { PyErr_SetString(PyExc_TypeError, "coordinate list must contain at least 2 coordinates" ); return NULL; } /* Copy list of vertices to array */ ixy = (int*) malloc(n * 2 * sizeof(int)); for (i = 0; i < n; i++) { ixy[i+i] = (int) xy[i+i]; ixy[i+i+1] = (int) xy[i+i+1]; } free(xy); if (ImagingDrawPolygon(self->image->image, n, ixy, &ink, fill, self->blend) < 0) { free(ixy); return NULL; } free(ixy); Py_INCREF(Py_None); return Py_None; } static PyObject* _draw_rectangle(ImagingDrawObject* self, PyObject* args) { double* xy; int n; PyObject* data; int ink; int fill = 0; if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) return NULL; n = PyPath_Flatten(data, &xy); if (n < 0) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, "coordinate list must contain exactly 2 coordinates" ); return NULL; } n = ImagingDrawRectangle(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], &ink, fill, self->blend ); free(xy); if (n < 0) return NULL; Py_INCREF(Py_None); return Py_None; } static struct PyMethodDef _draw_methods[] = { #ifdef WITH_IMAGEDRAW /* Graphics (ImageDraw) */ {"draw_line", (PyCFunction)_draw_line, 1}, {"draw_lines", (PyCFunction)_draw_lines, 1}, #ifdef WITH_ARROW {"draw_outline", (PyCFunction)_draw_outline, 1}, #endif {"draw_polygon", (PyCFunction)_draw_polygon, 1}, {"draw_rectangle", (PyCFunction)_draw_rectangle, 1}, {"draw_point", (PyCFunction)_draw_point, 1}, {"draw_points", (PyCFunction)_draw_points, 1}, {"draw_arc", (PyCFunction)_draw_arc, 1}, {"draw_bitmap", (PyCFunction)_draw_bitmap, 1}, {"draw_chord", (PyCFunction)_draw_chord, 1}, {"draw_ellipse", (PyCFunction)_draw_ellipse, 1}, {"draw_pieslice", (PyCFunction)_draw_pieslice, 1}, {"draw_ink", (PyCFunction)_draw_ink, 1}, #endif {NULL, NULL} /* sentinel */ }; #endif static PyObject* pixel_access_new(ImagingObject* imagep, PyObject* args) { PixelAccessObject *self; int readonly = 0; if (!PyArg_ParseTuple(args, "|i", &readonly)) return NULL; self = PyObject_New(PixelAccessObject, &PixelAccess_Type); if (self == NULL) return NULL; /* keep a reference to the image object */ Py_INCREF(imagep); self->image = imagep; self->readonly = readonly; return (PyObject*) self; } static void pixel_access_dealloc(PixelAccessObject* self) { Py_XDECREF(self->image); PyObject_Del(self); } static PyObject * pixel_access_getitem(PixelAccessObject *self, PyObject *xy) { int x, y; if (_getxy(xy, &x, &y)) return NULL; return getpixel(self->image->image, self->image->access, x, y); } static int pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) { Imaging im = self->image->image; char ink[4]; int x, y; if (self->readonly) { (void) ImagingError_ValueError(readonly); return -1; } if (_getxy(xy, &x, &y)) return -1; if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return -1; } if (!color) /* FIXME: raise exception? */ return 0; if (!getink(color, im, ink)) return -1; self->image->access->put_pixel(im, x, y, ink); return 0; } /* -------------------------------------------------------------------- */ /* EFFECTS (experimental) */ /* -------------------------------------------------------------------- */ #ifdef WITH_EFFECTS static PyObject* _effect_mandelbrot(ImagingObject* self, PyObject* args) { int xsize = 512; int ysize = 512; double extent[4]; int quality = 100; extent[0] = -3; extent[1] = -2.5; extent[2] = 2; extent[3] = 2.5; if (!PyArg_ParseTuple(args, "|(ii)(dddd)i", &xsize, &ysize, &extent[0], &extent[1], &extent[2], &extent[3], &quality)) return NULL; return PyImagingNew(ImagingEffectMandelbrot(xsize, ysize, extent, quality)); } static PyObject* _effect_noise(ImagingObject* self, PyObject* args) { int xsize, ysize; float sigma = 128; if (!PyArg_ParseTuple(args, "(ii)|f", &xsize, &ysize, &sigma)) return NULL; return PyImagingNew(ImagingEffectNoise(xsize, ysize, sigma)); } static PyObject* _effect_spread(ImagingObject* self, PyObject* args) { int dist; if (!PyArg_ParseTuple(args, "i", &dist)) return NULL; return PyImagingNew(ImagingEffectSpread(self->image, dist)); } #endif /* -------------------------------------------------------------------- */ /* UTILITIES */ /* -------------------------------------------------------------------- */ static PyObject* _crc32(PyObject* self, PyObject* args) { unsigned char* buffer; int bytes; int hi, lo; UINT32 crc; hi = lo = 0; if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH"|(ii)", &buffer, &bytes, &hi, &lo)) return NULL; crc = ((UINT32) (hi & 0xFFFF) << 16) + (lo & 0xFFFF); crc = ImagingCRC32(crc, (unsigned char *)buffer, bytes); return Py_BuildValue("ii", (crc >> 16) & 0xFFFF, crc & 0xFFFF); } static PyObject* _getcodecstatus(PyObject* self, PyObject* args) { int status; char* msg; if (!PyArg_ParseTuple(args, "i", &status)) return NULL; switch (status) { case IMAGING_CODEC_OVERRUN: msg = "buffer overrun"; break; case IMAGING_CODEC_BROKEN: msg = "broken data stream"; break; case IMAGING_CODEC_UNKNOWN: msg = "unrecognized data stream contents"; break; case IMAGING_CODEC_CONFIG: msg = "codec configuration error"; break; case IMAGING_CODEC_MEMORY: msg = "out of memory"; break; default: Py_RETURN_NONE; } return PyUnicode_FromString(msg); } /* -------------------------------------------------------------------- */ /* DEBUGGING HELPERS */ /* -------------------------------------------------------------------- */ #ifdef WITH_DEBUG static PyObject* _save_ppm(ImagingObject* self, PyObject* args) { char* filename; if (!PyArg_ParseTuple(args, "s", &filename)) return NULL; if (!ImagingSavePPM(self->image, filename)) return NULL; Py_INCREF(Py_None); return Py_None; } #endif /* -------------------------------------------------------------------- */ /* methods */ static struct PyMethodDef methods[] = { /* Put commonly used methods first */ {"getpixel", (PyCFunction)_getpixel, 1}, {"putpixel", (PyCFunction)_putpixel, 1}, {"pixel_access", (PyCFunction)pixel_access_new, 1}, /* Standard processing methods (Image) */ {"convert", (PyCFunction)_convert, 1}, {"convert2", (PyCFunction)_convert2, 1}, {"convert_matrix", (PyCFunction)_convert_matrix, 1}, {"convert_transparent", (PyCFunction)_convert_transparent, 1}, {"copy", (PyCFunction)_copy, 1}, {"copy2", (PyCFunction)_copy2, 1}, #ifdef WITH_CRACKCODE {"crackcode", (PyCFunction)_crackcode, 1}, #endif {"crop", (PyCFunction)_crop, 1}, {"expand", (PyCFunction)_expand, 1}, {"filter", (PyCFunction)_filter, 1}, {"histogram", (PyCFunction)_histogram, 1}, #ifdef WITH_MODEFILTER {"modefilter", (PyCFunction)_modefilter, 1}, #endif {"offset", (PyCFunction)_offset, 1}, {"paste", (PyCFunction)_paste, 1}, {"point", (PyCFunction)_point, 1}, {"point_transform", (PyCFunction)_point_transform, 1}, {"putdata", (PyCFunction)_putdata, 1}, #ifdef WITH_QUANTIZE {"quantize", (PyCFunction)_quantize, 1}, #endif #ifdef WITH_RANKFILTER {"rankfilter", (PyCFunction)_rankfilter, 1}, #endif {"resize", (PyCFunction)_resize, 1}, {"rotate", (PyCFunction)_rotate, 1}, {"stretch", (PyCFunction)_stretch, 1}, {"transpose", (PyCFunction)_transpose, 1}, {"transform2", (PyCFunction)_transform2, 1}, {"isblock", (PyCFunction)_isblock, 1}, {"getbbox", (PyCFunction)_getbbox, 1}, {"getcolors", (PyCFunction)_getcolors, 1}, {"getextrema", (PyCFunction)_getextrema, 1}, {"getprojection", (PyCFunction)_getprojection, 1}, {"getband", (PyCFunction)_getband, 1}, {"putband", (PyCFunction)_putband, 1}, {"fillband", (PyCFunction)_fillband, 1}, {"setmode", (PyCFunction)im_setmode, 1}, {"getpalette", (PyCFunction)_getpalette, 1}, {"getpalettemode", (PyCFunction)_getpalettemode, 1}, {"putpalette", (PyCFunction)_putpalette, 1}, {"putpalettealpha", (PyCFunction)_putpalettealpha, 1}, {"putpalettealphas", (PyCFunction)_putpalettealphas, 1}, #ifdef WITH_IMAGECHOPS /* Channel operations (ImageChops) */ {"chop_invert", (PyCFunction)_chop_invert, 1}, {"chop_lighter", (PyCFunction)_chop_lighter, 1}, {"chop_darker", (PyCFunction)_chop_darker, 1}, {"chop_difference", (PyCFunction)_chop_difference, 1}, {"chop_multiply", (PyCFunction)_chop_multiply, 1}, {"chop_screen", (PyCFunction)_chop_screen, 1}, {"chop_add", (PyCFunction)_chop_add, 1}, {"chop_subtract", (PyCFunction)_chop_subtract, 1}, {"chop_add_modulo", (PyCFunction)_chop_add_modulo, 1}, {"chop_subtract_modulo", (PyCFunction)_chop_subtract_modulo, 1}, {"chop_and", (PyCFunction)_chop_and, 1}, {"chop_or", (PyCFunction)_chop_or, 1}, {"chop_xor", (PyCFunction)_chop_xor, 1}, #endif #ifdef WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask extension */ {"gaussian_blur", (PyCFunction)_gaussian_blur, 1}, {"unsharp_mask", (PyCFunction)_unsharp_mask, 1}, #endif #ifdef WITH_EFFECTS /* Special effects */ {"effect_spread", (PyCFunction)_effect_spread, 1}, #endif /* Misc. */ {"new_array", (PyCFunction)_new_array, 1}, {"new_block", (PyCFunction)_new_block, 1}, #ifdef WITH_DEBUG {"save_ppm", (PyCFunction)_save_ppm, 1}, #endif {NULL, NULL} /* sentinel */ }; /* attributes */ static PyObject* _getattr_mode(ImagingObject* self, void* closure) { return PyUnicode_FromString(self->image->mode); } static PyObject* _getattr_size(ImagingObject* self, void* closure) { return Py_BuildValue("ii", self->image->xsize, self->image->ysize); } static PyObject* _getattr_bands(ImagingObject* self, void* closure) { return PyInt_FromLong(self->image->bands); } static PyObject* _getattr_id(ImagingObject* self, void* closure) { return PyInt_FromSsize_t((Py_ssize_t) self->image); } static PyObject* _getattr_ptr(ImagingObject* self, void* closure) { #if (PY_VERSION_HEX >= 0x02070000 && PY_VERSION_HEX < 0x03000000) || PY_VERSION_HEX >= 0x03010000 return PyCapsule_New(self->image, IMAGING_MAGIC, NULL); #else return PyCObject_FromVoidPtrAndDesc(self->image, IMAGING_MAGIC, NULL); #endif } static struct PyGetSetDef getsetters[] = { { "mode", (getter) _getattr_mode }, { "size", (getter) _getattr_size }, { "bands", (getter) _getattr_bands }, { "id", (getter) _getattr_id }, { "ptr", (getter) _getattr_ptr }, { NULL } }; /* basic sequence semantics */ static Py_ssize_t image_length(ImagingObject *self) { Imaging im = self->image; return (Py_ssize_t) im->xsize * im->ysize; } static PyObject * image_item(ImagingObject *self, Py_ssize_t i) { int x, y; Imaging im = self->image; if (im->xsize > 0) { x = i % im->xsize; y = i / im->xsize; } else x = y = 0; /* leave it to getpixel to raise an exception */ return getpixel(im, self->access, x, y); } static PySequenceMethods image_as_sequence = { (lenfunc) image_length, /*sq_length*/ (binaryfunc) NULL, /*sq_concat*/ (ssizeargfunc) NULL, /*sq_repeat*/ (ssizeargfunc) image_item, /*sq_item*/ (ssizessizeargfunc) NULL, /*sq_slice*/ (ssizeobjargproc) NULL, /*sq_ass_item*/ (ssizessizeobjargproc) NULL, /*sq_ass_slice*/ }; /* type description */ static PyTypeObject Imaging_Type = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingCore", /*tp_name*/ sizeof(ImagingObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ &image_as_sequence, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ getsetters, /*tp_getset*/ }; #ifdef WITH_IMAGEDRAW static PyTypeObject ImagingFont_Type = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingFont", /*tp_name*/ sizeof(ImagingFontObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_font_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ _font_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; static PyTypeObject ImagingDraw_Type = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingDraw", /*tp_name*/ sizeof(ImagingDrawObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_draw_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ _draw_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; #endif static PyMappingMethods pixel_access_as_mapping = { (lenfunc) NULL, /*mp_length*/ (binaryfunc) pixel_access_getitem, /*mp_subscript*/ (objobjargproc) pixel_access_setitem, /*mp_ass_subscript*/ }; /* type description */ static PyTypeObject PixelAccess_Type = { PyVarObject_HEAD_INIT(NULL, 0) "PixelAccess", sizeof(PixelAccessObject), 0, /* methods */ (destructor)pixel_access_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ &pixel_access_as_mapping, /*tp_as_mapping */ 0 /*tp_hash*/ }; /* -------------------------------------------------------------------- */ /* FIXME: this is something of a mess. Should replace this with pluggable codecs, but not before PIL 1.2 */ /* Decoders (in decode.c) */ extern PyObject* PyImaging_BitDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_FliDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_GifDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_HexDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_TiffLzwDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_MspDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcxDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_RawDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_XbmDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_ZipDecoderNew(PyObject* self, PyObject* args); /* Encoders (in encode.c) */ extern PyObject* PyImaging_EpsEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_GifEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_JpegEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcxEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_RawEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_XbmEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_ZipEncoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args); /* Display support etc (in display.c) */ #ifdef WIN32 extern PyObject* PyImaging_CreateWindowWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_DisplayWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_DisplayModeWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_GrabScreenWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_ListWindowsWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_EventLoopWin32(PyObject* self, PyObject* args); extern PyObject* PyImaging_DrawWmf(PyObject* self, PyObject* args); #endif /* Experimental path stuff (in path.c) */ extern PyObject* PyPath_Create(ImagingObject* self, PyObject* args); /* Experimental outline stuff (in outline.c) */ extern PyObject* PyOutline_Create(ImagingObject* self, PyObject* args); extern PyObject* PyImaging_Mapper(PyObject* self, PyObject* args); extern PyObject* PyImaging_MapBuffer(PyObject* self, PyObject* args); static PyMethodDef functions[] = { /* Object factories */ {"alpha_composite", (PyCFunction)_alpha_composite, 1}, {"blend", (PyCFunction)_blend, 1}, {"fill", (PyCFunction)_fill, 1}, {"new", (PyCFunction)_new, 1}, {"getcount", (PyCFunction)_getcount, 1}, /* Functions */ {"convert", (PyCFunction)_convert2, 1}, {"copy", (PyCFunction)_copy2, 1}, /* Codecs */ {"bit_decoder", (PyCFunction)PyImaging_BitDecoderNew, 1}, {"eps_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, {"fli_decoder", (PyCFunction)PyImaging_FliDecoderNew, 1}, {"gif_decoder", (PyCFunction)PyImaging_GifDecoderNew, 1}, {"gif_encoder", (PyCFunction)PyImaging_GifEncoderNew, 1}, {"hex_decoder", (PyCFunction)PyImaging_HexDecoderNew, 1}, {"hex_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, /* EPS=HEX! */ #ifdef HAVE_LIBJPEG {"jpeg_decoder", (PyCFunction)PyImaging_JpegDecoderNew, 1}, {"jpeg_encoder", (PyCFunction)PyImaging_JpegEncoderNew, 1}, #endif {"tiff_lzw_decoder", (PyCFunction)PyImaging_TiffLzwDecoderNew, 1}, #ifdef HAVE_LIBTIFF {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, 1}, {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, 1}, #endif {"msp_decoder", (PyCFunction)PyImaging_MspDecoderNew, 1}, {"packbits_decoder", (PyCFunction)PyImaging_PackbitsDecoderNew, 1}, {"pcd_decoder", (PyCFunction)PyImaging_PcdDecoderNew, 1}, {"pcx_decoder", (PyCFunction)PyImaging_PcxDecoderNew, 1}, {"pcx_encoder", (PyCFunction)PyImaging_PcxEncoderNew, 1}, {"raw_decoder", (PyCFunction)PyImaging_RawDecoderNew, 1}, {"raw_encoder", (PyCFunction)PyImaging_RawEncoderNew, 1}, {"sun_rle_decoder", (PyCFunction)PyImaging_SunRleDecoderNew, 1}, {"tga_rle_decoder", (PyCFunction)PyImaging_TgaRleDecoderNew, 1}, {"xbm_decoder", (PyCFunction)PyImaging_XbmDecoderNew, 1}, {"xbm_encoder", (PyCFunction)PyImaging_XbmEncoderNew, 1}, #ifdef HAVE_LIBZ {"zip_decoder", (PyCFunction)PyImaging_ZipDecoderNew, 1}, {"zip_encoder", (PyCFunction)PyImaging_ZipEncoderNew, 1}, #endif /* Memory mapping */ #ifdef WITH_MAPPING #ifdef WIN32 {"map", (PyCFunction)PyImaging_Mapper, 1}, #endif {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, #endif /* Display support */ #ifdef WIN32 {"display", (PyCFunction)PyImaging_DisplayWin32, 1}, {"display_mode", (PyCFunction)PyImaging_DisplayModeWin32, 1}, {"grabscreen", (PyCFunction)PyImaging_GrabScreenWin32, 1}, {"grabclipboard", (PyCFunction)PyImaging_GrabClipboardWin32, 1}, {"createwindow", (PyCFunction)PyImaging_CreateWindowWin32, 1}, {"eventloop", (PyCFunction)PyImaging_EventLoopWin32, 1}, {"listwindows", (PyCFunction)PyImaging_ListWindowsWin32, 1}, {"drawwmf", (PyCFunction)PyImaging_DrawWmf, 1}, #endif /* Utilities */ {"crc32", (PyCFunction)_crc32, 1}, {"getcodecstatus", (PyCFunction)_getcodecstatus, 1}, /* Debugging stuff */ {"open_ppm", (PyCFunction)_open_ppm, 1}, /* Special effects (experimental) */ #ifdef WITH_EFFECTS {"effect_mandelbrot", (PyCFunction)_effect_mandelbrot, 1}, {"effect_noise", (PyCFunction)_effect_noise, 1}, {"linear_gradient", (PyCFunction)_linear_gradient, 1}, {"radial_gradient", (PyCFunction)_radial_gradient, 1}, {"wedge", (PyCFunction)_linear_gradient, 1}, /* Compatibility */ #endif /* Drawing support stuff */ #ifdef WITH_IMAGEDRAW {"font", (PyCFunction)_font_new, 1}, {"draw", (PyCFunction)_draw_new, 1}, #endif /* Experimental path stuff */ #ifdef WITH_IMAGEPATH {"path", (PyCFunction)PyPath_Create, 1}, #endif /* Experimental arrow graphics stuff */ #ifdef WITH_ARROW {"outline", (PyCFunction)PyOutline_Create, 1}, #endif {NULL, NULL} /* sentinel */ }; static int setup_module(PyObject* m) { PyObject* d = PyModule_GetDict(m); /* Ready object types */ if (PyType_Ready(&Imaging_Type) < 0) return -1; #ifdef WITH_IMAGEDRAW if (PyType_Ready(&ImagingFont_Type) < 0) return -1; if (PyType_Ready(&ImagingDraw_Type) < 0) return -1; #endif if (PyType_Ready(&PixelAccess_Type) < 0) return -1; ImagingAccessInit(); #ifdef HAVE_LIBJPEG { extern const char* ImagingJpegVersion(void); PyDict_SetItemString(d, "jpeglib_version", PyUnicode_FromString(ImagingJpegVersion())); } #endif #ifdef HAVE_LIBZ /* zip encoding strategies */ PyModule_AddIntConstant(m, "DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY); PyModule_AddIntConstant(m, "FILTERED", Z_FILTERED); PyModule_AddIntConstant(m, "HUFFMAN_ONLY", Z_HUFFMAN_ONLY); PyModule_AddIntConstant(m, "RLE", Z_RLE); PyModule_AddIntConstant(m, "FIXED", Z_FIXED); { extern const char* ImagingZipVersion(void); PyDict_SetItemString(d, "zlib_version", PyUnicode_FromString(ImagingZipVersion())); } #endif PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(PILLOW_VERSION)); return 0; } #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__imaging(void) { PyObject* m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_imaging", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ functions, /* m_methods */ }; m = PyModule_Create(&module_def); if (setup_module(m) < 0) return NULL; return m; } #else PyMODINIT_FUNC init_imaging(void) { PyObject* m = Py_InitModule("_imaging", functions); setup_module(m); } #endif pillow-2.3.0/.gitattributes0000644000175000001440000000001512257506326014574 0ustar dokousers*.ppm binary pillow-2.3.0/Tk/0000755000175000001440000000000012274164154012261 5ustar dokouserspillow-2.3.0/Tk/install.txt0000644000175000001440000000261112257506326014472 0ustar dokousers==================================================================== Using PIL With Tkinter ==================================================================== Starting with 1.0 final (release candidate 2 and later, to be precise), PIL can attach itself to Tkinter in flight. As a result, you no longer need to rebuild the Tkinter extension to be able to use PIL. However, if you cannot get the this to work on your platform, you can do it in the old way: * Adding Tkinter support 1. Compile Python's _tkinter.c with the WITH_APPINIT and WITH_PIL flags set, and link it with tkImaging.c and tkappinit.c. To do this, copy the former to the Modules directory, and edit the _tkinter line in Setup (or Setup.in) according to the instructions in that file. NOTE: if you have an old Python version, the tkappinit.c file is not included by default. If this is the case, you will have to add the following lines to tkappinit.c, after the MOREBUTTONS stuff: { extern void TkImaging_Init(Tcl_Interp* interp); TkImaging_Init(interp); } This registers a Tcl command called "PyImagingPhoto", which is use to communicate between PIL and Tk's PhotoImage handler. You must also change the _tkinter line in Setup (or Setup.in) to something like: _tkinter _tkinter.c tkImaging.c tkappinit.c -DWITH_APPINIT -I/usr/local/include -L/usr/local/lib -ltk8.0 -ltcl8.0 -lX11 pillow-2.3.0/Tk/tkImaging.c0000644000175000001440000001677312257506326014357 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * TK interface for Python Imaging objects * * Copies (parts of) a named display memory to a photo image object. * Also contains code to create an display memory. Under Tk, a * display memory is simply an "L" or "RGB" image memory that is * allocated in a single block. * * To use this module, import the _imagingtk module (ImageTk does * this for you). * * If you're using Python in an embedded context, you can add the * following lines to your Tcl_AppInit function (in tkappinit.c) * instead. Put them after the calls to Tcl_Init and Tk_Init: * * { * extern void TkImaging_Init(Tcl_Interp* interp); * TkImaging_Init(interp); * } * * This registers a Tcl command called "PyImagingPhoto", which is used * to communicate between PIL and Tk's PhotoImage handler. * * Compile and link tkImaging.c with tkappinit.c and _tkinter (see the * Setup file for details on how to use tkappinit.c). Note that * _tkinter.c must be compiled with WITH_APPINIT. * * History: * 1995-09-12 fl Created * 1996-04-08 fl Ready for release * 1997-05-09 fl Use command instead of image type * 2001-03-18 fl Initialize alpha layer pointer (struct changed in 8.3) * 2003-04-23 fl Fixed building for Tk 8.4.1 and later (Jack Jansen) * 2004-06-24 fl Fixed building for Tk 8.4.6 and later. * * Copyright (c) 1997-2004 by Secret Labs AB * Copyright (c) 1995-2004 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #define TK (TK_MAJOR_VERSION*10 + TK_MINOR_VERSION) /* This is needed for (at least) Tk 8.4.6 and later, to avoid warnings for the Tcl_CreateCommand command. */ #define USE_COMPAT_CONST #include "Imaging.h" #include "tk.h" #include static Imaging ImagingFind(const char* name) { Py_ssize_t id; /* FIXME: use CObject instead? */ id = atol(name); if (!id) return NULL; return (Imaging) id; } static int PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, int argc, char **argv) { Imaging im; Tk_PhotoHandle photo; Tk_PhotoImageBlock block; if (argc != 3) { Tcl_AppendResult(interp, "usage: ", argv[0], " destPhoto srcImage", (char *) NULL); return TCL_ERROR; } /* get Tcl PhotoImage handle */ photo = Tk_FindPhoto(interp, argv[1]); if (photo == NULL) { Tcl_AppendResult( interp, "destination photo must exist", (char *) NULL ); return TCL_ERROR; } /* get PIL Image handle */ im = ImagingFind(argv[2]); if (!im) { Tcl_AppendResult(interp, "bad name", (char*) NULL); return TCL_ERROR; } if (!im->block) { Tcl_AppendResult(interp, "bad display memory", (char*) NULL); return TCL_ERROR; } /* Active region */ #if 0 if (src_xoffset + xsize > im->xsize) xsize = im->xsize - src_xoffset; if (src_yoffset + ysize > im->ysize) ysize = im->ysize - src_yoffset; if (xsize < 0 || ysize < 0 || src_xoffset >= im->xsize || src_yoffset >= im->ysize) return TCL_OK; #endif /* Mode */ if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { block.pixelSize = 1; block.offset[0] = block.offset[1] = block.offset[2] = 0; } else if (strncmp(im->mode, "RGB", 3) == 0) { block.pixelSize = 4; block.offset[0] = 0; block.offset[1] = 1; block.offset[2] = 2; if (strcmp(im->mode, "RGBA") == 0) block.offset[3] = 3; /* alpha (or reserved, under 8.2) */ else block.offset[3] = 0; /* no alpha */ } else { Tcl_AppendResult(interp, "Bad mode", (char*) NULL); return TCL_ERROR; } block.width = im->xsize; block.height = im->ysize; block.pitch = im->linesize; block.pixelPtr = (unsigned char*) im->block; #if 0 block.pixelPtr = (unsigned char*) im->block + src_yoffset * im->linesize + src_xoffset * im->pixelsize; #endif #if TK < 84 /* < 8.4.0 */ if (strcmp(im->mode, "RGBA") == 0) { /* Copy non-transparent pixels to photo image */ int x, y; Tk_PhotoImageBlock run; /* Clear current contents */ Tk_PhotoBlank(photo); /* Setup run descriptor */ run.height = 1; run.pitch = block.pitch; run.pixelSize = block.pixelSize; run.offset[0] = 0; run.offset[1] = 1; run.offset[2] = 2; run.offset[3] = 0; /* no alpha (or reserved, under 8.2) */ /* Copy opaque runs to photo image */ for (y = 0; y < block.height; y++) { unsigned char* p = block.pixelPtr + y*block.pitch; unsigned char* s = p; int w = 0; for (x = 0; x < block.width; x++) { if (p[3]) { /* opaque: add pixel to current run */ if (w == 0) s = p; w = w + 1; } else if (s) { /* copy run to photo image */ if (w > 0) { run.width = w; run.pixelPtr = s; Tk_PhotoPutBlock(photo, &run, x-w, y, run.width, 1); } w = 0; } p += block.pixelSize; } if (w > 0) { /* copy final run, if any */ run.width = w; run.pixelPtr = s; Tk_PhotoPutBlock(photo, &run, x-w, y, run.width, 1); } } } else /* Copy opaque block to photo image, and leave the rest to TK */ Tk_PhotoPutBlock(photo, &block, 0, 0, block.width, block.height); #else /* Tk 8.4 and newer */ #if TK < 85 /* Tk 8.4 */ Tk_PhotoPutBlock(photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET); if (strcmp(im->mode, "RGBA") == 0) /* Tk workaround: we need apply ToggleComplexAlphaIfNeeded */ /* (fixed in Tk 8.5a3) */ Tk_PhotoSetSize(photo, block.width, block.height); #else /* Tk 8.5 */ Tk_PhotoPutBlock(interp, photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET); #endif #endif return TCL_OK; } static int PyImagingPhotoGet(ClientData clientdata, Tcl_Interp* interp, int argc, char **argv) { Tk_PhotoHandle photo; Tk_PhotoImageBlock block; if (argc != 2) { Tcl_AppendResult(interp, "usage: ", argv[0], " srcPhoto", (char *) NULL); return TCL_ERROR; } /* get Tcl PhotoImage handle */ photo = Tk_FindPhoto(interp, argv[1]); if (photo == NULL) { Tcl_AppendResult( interp, "source photo must exist", (char *) NULL ); return TCL_ERROR; } Tk_PhotoGetImage(photo, &block); printf("pixelPtr = %p\n", block.pixelPtr); printf("width = %d\n", block.width); printf("height = %d\n", block.height); printf("pitch = %d\n", block.pitch); printf("pixelSize = %d\n", block.pixelSize); printf("offset = %d %d %d %d\n", block.offset[0], block.offset[1], block.offset[2], block.offset[3]); Tcl_AppendResult( interp, "this function is not yet supported", (char *) NULL ); return TCL_ERROR; } void TkImaging_Init(Tcl_Interp* interp) { Tcl_CreateCommand(interp, "PyImagingPhoto", PyImagingPhotoPut, (ClientData) 0, (Tcl_CmdDeleteProc*) NULL); Tcl_CreateCommand(interp, "PyImagingPhotoGet", PyImagingPhotoGet, (ClientData) 0, (Tcl_CmdDeleteProc*) NULL); } pillow-2.3.0/Tk/pilbitmap.txt0000644000175000001440000001076112257506326015012 0ustar dokousers==================================================================== The PIL Bitmap Booster Patch ==================================================================== The pilbitmap booster patch greatly improves performance of the ImageTk.BitmapImage constructor. Unfortunately, the design of Tk doesn't allow us to do this from the tkImaging interface module, so you have to patch the Tk sources. Once installed, the ImageTk module will automatically detect this patch. (Note: this patch has been tested with Tk 8.0 on Win32 only, but it should work just fine on other platforms as well). 1. To the beginning of TkGetBitmapData (in generic/tkImgBmap.c), add the following stuff: ------------------------------------------------------------------------ int width, height, numBytes, hotX, hotY; char *p, *end, *expandedFileName; ParseInfo pi; char *data = NULL; Tcl_DString buffer; /* ==================================================================== */ /* The pilbitmap booster patch -- patch section */ /* ==================================================================== */ char *PILGetBitmapData(); if (string) { /* Is this a PIL bitmap reference? */ data = PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr); if (data) return data; } /* ==================================================================== */ pi.string = string; if (string == NULL) { if (Tcl_IsSafe(interp)) { ------------------------------------------------------------------------ 2. Append the following to the same file (you may wish to include Imaging.h instead of copying the struct declaration...) ------------------------------------------------------------------------ /* ==================================================================== */ /* The pilbitmap booster patch -- code section */ /* ==================================================================== */ /* Imaging declaration boldly copied from Imaging.h (!) */ typedef struct ImagingInstance *Imaging; /* a.k.a. ImagingImage :-) */ typedef unsigned char UINT8; typedef int INT32; struct ImagingInstance { /* Format */ char mode[4+1]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK") */ int type; /* Always 0 in this version */ int depth; /* Always 8 in this version */ int bands; /* Number of bands (1, 3, or 4) */ int xsize; /* Image dimension. */ int ysize; /* Colour palette (for "P" images only) */ void* palette; /* Data pointers */ UINT8 **image8; /* Set for 8-bit image (pixelsize=1). */ INT32 **image32; /* Set for 32-bit image (pixelsize=4). */ /* Internals */ char **image; /* Actual raster data. */ char *block; /* Set if data is allocated in a single block. */ int pixelsize; /* Size of a pixel, in bytes (1 or 4) */ int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ /* Virtual methods */ void (*im_delete)(Imaging *); }; /* The pilbitmap booster patch allows you to pass PIL images to the Tk bitmap decoder. Passing images this way is much more efficient than using the "tobitmap" method. */ char * PILGetBitmapData(string, widthPtr, heightPtr, hotXPtr, hotYPtr) char *string; int *widthPtr, *heightPtr; int *hotXPtr, *hotYPtr; { char* data; char* p; int y; Imaging im; if (strncmp(string, "PIL:", 4) != 0) return NULL; im = (Imaging) atol(string + 4); if (strcmp(im->mode, "1") != 0 && strcmp(im->mode, "L") != 0) return NULL; data = p = (char *) ckalloc((unsigned) ((im->xsize+7)/8) * im->ysize); for (y = 0; y < im->ysize; y++) { char* in = im->image8[y]; int i, m, b; b = 0; m = 1; for (i = 0; i < im->xsize; i++) { if (in[i] != 0) b |= m; m <<= 1; if (m == 256){ *p++ = b; b = 0; m = 1; } } if (m != 1) *p++ = b; } *widthPtr = im->xsize; *heightPtr = im->ysize; *hotXPtr = -1; *hotYPtr = -1; return data; } /* ==================================================================== */ ------------------------------------------------------------------------ 3. Recompile Tk and relink the _tkinter module (where necessary). ==================================================================== Last updated: 97-05-17/fl pillow-2.3.0/Tk/booster.txt0000644000175000001440000000750612257506326014511 0ustar dokousers==================================================================== The Photoimage Booster Patch (for Windows 95/NT) ==================================================================== This patch kit boosts performance for 16/24-bit displays. The first patch is required on Tk 4.2 (where it fixes the problems for 16-bit displays) and later versions, with the exception for Tk 8.0b1 where Sun added something similar themselves, only to remove it in 8.0b2. By installing both patches, Tk's PhotoImage handling becomes much faster on both 16-bit and 24-bit displays. The patch has been tested with Tk 4.2 and 8.0. Here's a benchmark, made with a sample program which loads two 512x512 greyscale PGM's, and two 512x512 colour PPM's, and displays each of them in a separate toplevel windows. Tcl/Tk was compiled with Visual C 4.0, and run on a P100 under Win95. Image load times are not included in the timings: 8-bit 16-bit 24-bit -------------------------------------------------------------------- 1. original 4.2 code 5.52 s 8.57 s 3.79 s 2. booster patch 5.49 s 1.87 s 1.82 s speedup None 4.6x 2.1x ==================================================================== Here's the patches: 1. For portability and speed, the best thing under Windows is to treat 16-bit displays as if they were 24-bit. The Windows device drivers take care of the rest. ---------------------------------------------------------------- If you have Tk 4.1 or Tk 8.0b1, you don't have to apply this patch! It only applies to Tk 4.2, Tk 8.0a[12] and Tk 8.0b2. ---------------------------------------------------------------- In win/tkWinImage.c, change the following line in XCreateImage: imagePtr->bits_per_pixel = depth; to /* ==================================================================== */ /* The tk photo image booster patch -- patch section 1 */ /* ==================================================================== */ if (visual->class == TrueColor) /* true colour is stored as 3 bytes: (blue, green, red) */ imagePtr->bits_per_pixel = 24; else imagePtr->bits_per_pixel = depth; /* ==================================================================== */ 2. The DitherInstance implementation is not good. It's especially bad on highend truecolour displays. IMO, it should be rewritten from scratch (some other day...). Anyway, the following band-aid makes the situation a little bit better under Windows. This hack trades some marginal quality (no dithering on 16-bit displays) for a dramatic performance boost. Requires patch 1, unless you're using Tk 4.1 or Tk 8.0b1. In generic/tkImgPhoto.c, add the #ifdef section to the DitherInstance function: for (; height > 0; height -= nLines) { if (nLines > height) { nLines = height; } dstLinePtr = (unsigned char *) imagePtr->data; yEnd = yStart + nLines; /* ==================================================================== */ /* The tk photo image booster patch -- patch section 2 */ /* ==================================================================== */ #ifdef __WIN32__ if (colorPtr->visualInfo.class == TrueColor && instancePtr->gamma == 1.0) { /* Windows hicolor/truecolor booster */ for (y = yStart; y < yEnd; ++y) { destBytePtr = dstLinePtr; srcPtr = srcLinePtr; for (x = xStart; x < xEnd; ++x) { destBytePtr[0] = srcPtr[2]; destBytePtr[1] = srcPtr[1]; destBytePtr[2] = srcPtr[0]; destBytePtr += 3; srcPtr += 3; } srcLinePtr += lineLength; dstLinePtr += bytesPerLine; } } else #endif /* ==================================================================== */ for (y = yStart; y < yEnd; ++y) { srcPtr = srcLinePtr; errPtr = errLinePtr; destBytePtr = dstLinePtr; ==================================================================== last updated: 97-07-03/fl pillow-2.3.0/path.c0000644000175000001440000003745312257506326013021 0ustar dokousers/* * The Python Imaging Library. * * 2D path utilities * * history: * 1996-11-04 fl Added to PIL (incomplete) * 1996-11-05 fl Added sequence semantics * 1997-02-28 fl Fixed getbbox * 1997-06-12 fl Added id attribute * 1997-06-14 fl Added slicing and setitem * 1998-12-29 fl Improved sequence handling (from Richard Jones) * 1999-01-10 fl Fixed IndexError test for 1.5 (from Fred Drake) * 2000-10-12 fl Added special cases for tuples and lists * 2002-10-27 fl Added clipping boilerplate * 2004-09-19 fl Added tolist(flat) variant * 2005-05-06 fl Added buffer interface support to path constructor * * notes: * FIXME: fill in remaining slots in the sequence api * * Copyright (c) 1997-2005 by Secret Labs AB * Copyright (c) 1997-2005 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #include "Python.h" #include #include "py3.h" /* compatibility wrappers (defined in _imaging.c) */ extern int PyImaging_CheckBuffer(PyObject* buffer); extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); /* -------------------------------------------------------------------- */ /* Class */ /* -------------------------------------------------------------------- */ typedef struct { PyObject_HEAD Py_ssize_t count; double *xy; int index; /* temporary use, e.g. in decimate */ } PyPathObject; static PyTypeObject PyPathType; static double* alloc_array(Py_ssize_t count) { double* xy; if (count < 0) { PyErr_NoMemory(); return NULL; } xy = malloc(2 * count * sizeof(double) + 1); if (!xy) PyErr_NoMemory(); return xy; } static PyPathObject* path_new(Py_ssize_t count, double* xy, int duplicate) { PyPathObject *path; if (duplicate) { /* duplicate path */ double* p = alloc_array(count); if (!p) return NULL; memcpy(p, xy, count * 2 * sizeof(double)); xy = p; } if (PyType_Ready(&PyPathType) < 0) return NULL; path = PyObject_New(PyPathObject, &PyPathType); if (path == NULL) return NULL; path->count = count; path->xy = xy; return path; } static void path_dealloc(PyPathObject* path) { free(path->xy); PyObject_Del(path); } /* -------------------------------------------------------------------- */ /* Helpers */ /* -------------------------------------------------------------------- */ #define PyPath_Check(op) (Py_TYPE(op) == &PyPathType) int PyPath_Flatten(PyObject* data, double **pxy) { int i, j, n; double *xy; if (PyPath_Check(data)) { /* This was another path object. */ PyPathObject *path = (PyPathObject*) data; xy = alloc_array(path->count); if (!xy) return -1; memcpy(xy, path->xy, 2 * path->count * sizeof(double)); *pxy = xy; return path->count; } if (PyImaging_CheckBuffer(data)) { /* Assume the buffer contains floats */ Py_buffer buffer; if (PyImaging_GetBuffer(data, &buffer) == 0) { int n = buffer.len / (2 * sizeof(float)); float *ptr = (float*) buffer.buf; xy = alloc_array(n); if (!xy) return -1; for (i = 0; i < n+n; i++) xy[i] = ptr[i]; *pxy = xy; PyBuffer_Release(&buffer); return n; } PyErr_Clear(); } if (!PySequence_Check(data)) { PyErr_SetString(PyExc_TypeError, "argument must be sequence"); return -1; } j = 0; n = PyObject_Length(data); /* Just in case __len__ breaks (or doesn't exist) */ if (PyErr_Occurred()) return -1; /* Allocate for worst case */ xy = alloc_array(n); if (!xy) return -1; /* Copy table to path array */ if (PyList_Check(data)) { for (i = 0; i < n; i++) { double x, y; PyObject *op = PyList_GET_ITEM(data, i); if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { free(xy); return -1; } } } else if (PyTuple_Check(data)) { for (i = 0; i < n; i++) { double x, y; PyObject *op = PyTuple_GET_ITEM(data, i); if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { free(xy); return -1; } } } else { for (i = 0; i < n; i++) { double x, y; PyObject *op = PySequence_GetItem(data, i); if (!op) { /* treat IndexError as end of sequence */ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_IndexError)) { PyErr_Clear(); break; } else { free(xy); return -1; } } if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { Py_DECREF(op); free(xy); return -1; } Py_DECREF(op); } } if (j & 1) { PyErr_SetString(PyExc_ValueError, "wrong number of coordinates"); free(xy); return -1; } *pxy = xy; return j/2; } /* -------------------------------------------------------------------- */ /* Factories */ /* -------------------------------------------------------------------- */ PyObject* PyPath_Create(PyObject* self, PyObject* args) { PyObject* data; Py_ssize_t count; double *xy; if (PyArg_ParseTuple(args, "n:Path", &count)) { /* number of vertices */ xy = alloc_array(count); if (!xy) return NULL; } else { /* sequence or other path */ PyErr_Clear(); if (!PyArg_ParseTuple(args, "O", &data)) return NULL; count = PyPath_Flatten(data, &xy); if (count < 0) return NULL; } return (PyObject*) path_new(count, xy, 0); } /* -------------------------------------------------------------------- */ /* Methods */ /* -------------------------------------------------------------------- */ static PyObject* path_compact(PyPathObject* self, PyObject* args) { /* Simple-minded method to shorten path. A point is removed if the city block distance to the previous point is less than the given distance */ int i, j; double *xy; double cityblock = 2.0; if (!PyArg_ParseTuple(args, "|d:compact", &cityblock)) return NULL; xy = self->xy; /* remove bogus vertices */ for (i = j = 1; i < self->count; i++) { if (fabs(xy[j+j-2]-xy[i+i]) + fabs(xy[j+j-1]-xy[i+i+1]) >= cityblock) { xy[j+j] = xy[i+i]; xy[j+j+1] = xy[i+i+1]; j++; } } i = self->count - j; self->count = j; /* shrink coordinate array */ self->xy = realloc(self->xy, 2 * self->count * sizeof(double)); return Py_BuildValue("i", i); /* number of removed vertices */ } static PyObject* path_clip_polygon(PyPathObject* self, PyObject* args) { /* Clip path representing a single polygon */ PyErr_SetString(PyExc_RuntimeError, "not yet implemented"); return NULL; } static PyObject* path_clip_polyline(PyPathObject* self, PyObject* args) { /* Clip path representing a single polyline (outline) */ PyErr_SetString(PyExc_RuntimeError, "not yet implemented"); return NULL; } static PyObject* path_getbbox(PyPathObject* self, PyObject* args) { /* Find bounding box */ int i; double *xy; double x0, y0, x1, y1; if (!PyArg_ParseTuple(args, ":getbbox")) return NULL; xy = self->xy; x0 = x1 = xy[0]; y0 = y1 = xy[1]; for (i = 1; i < self->count; i++) { if (xy[i+i] < x0) x0 = xy[i+i]; if (xy[i+i] > x1) x1 = xy[i+i]; if (xy[i+i+1] < y0) y0 = xy[i+i+1]; if (xy[i+i+1] > y1) y1 = xy[i+i+1]; } return Py_BuildValue("dddd", x0, y0, x1, y1); } static PyObject* path_getitem(PyPathObject* self, int i) { if (i < 0) i = self->count + i; if (i < 0 || i >= self->count) { PyErr_SetString(PyExc_IndexError, "path index out of range"); return NULL; } return Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); } static PyObject* path_getslice(PyPathObject* self, Py_ssize_t ilow, Py_ssize_t ihigh) { /* adjust arguments */ if (ilow < 0) ilow = 0; else if (ilow >= self->count) ilow = self->count; if (ihigh < 0) ihigh = 0; if (ihigh < ilow) ihigh = ilow; else if (ihigh > self->count) ihigh = self->count; return (PyObject*) path_new(ihigh - ilow, self->xy + ilow * 2, 1); } static Py_ssize_t path_len(PyPathObject* self) { return self->count; } static PyObject* path_map(PyPathObject* self, PyObject* args) { /* Map coordinate set through function */ int i; double *xy; PyObject* function; if (!PyArg_ParseTuple(args, "O:map", &function)) return NULL; xy = self->xy; /* apply function to coordinate set */ for (i = 0; i < self->count; i++) { double x = xy[i+i]; double y = xy[i+i+1]; PyObject* item = PyObject_CallFunction(function, "dd", x, y); if (!item || !PyArg_ParseTuple(item, "dd", &x, &y)) { Py_XDECREF(item); return NULL; } xy[i+i] = x; xy[i+i+1] = y; Py_DECREF(item); } Py_INCREF(Py_None); return Py_None; } static int path_setitem(PyPathObject* self, int i, PyObject* op) { double* xy; if (i < 0 || i >= self->count) { PyErr_SetString(PyExc_IndexError, "path assignment index out of range"); return -1; } if (op == NULL) { PyErr_SetString(PyExc_TypeError, "cannot delete from path"); return -1; } xy = &self->xy[i+i]; if (!PyArg_ParseTuple(op, "dd", &xy[0], &xy[1])) return -1; return 0; } static PyObject* path_tolist(PyPathObject* self, PyObject* args) { PyObject *list; int i; int flat = 0; if (!PyArg_ParseTuple(args, "|i:tolist", &flat)) return NULL; if (flat) { list = PyList_New(self->count*2); for (i = 0; i < self->count*2; i++) { PyObject* item; item = PyFloat_FromDouble(self->xy[i]); if (!item) goto error; PyList_SetItem(list, i, item); } } else { list = PyList_New(self->count); for (i = 0; i < self->count; i++) { PyObject* item; item = Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); if (!item) goto error; PyList_SetItem(list, i, item); } } return list; error: Py_DECREF(list); return NULL; } static PyObject* path_transform(PyPathObject* self, PyObject* args) { /* Apply affine transform to coordinate set */ int i; double *xy; double a, b, c, d, e, f; double wrap = 0.0; if (!PyArg_ParseTuple(args, "(dddddd)|d:transform", &a, &b, &c, &d, &e, &f, &wrap)) return NULL; xy = self->xy; /* transform the coordinate set */ if (b == 0.0 && d == 0.0) /* scaling */ for (i = 0; i < self->count; i++) { xy[i+i] = a*xy[i+i]+c; xy[i+i+1] = e*xy[i+i+1]+f; } else /* affine transform */ for (i = 0; i < self->count; i++) { double x = xy[i+i]; double y = xy[i+i+1]; xy[i+i] = a*x+b*y+c; xy[i+i+1] = d*x+e*y+f; } /* special treatment of geographical map data */ if (wrap != 0.0) for (i = 0; i < self->count; i++) xy[i+i] = fmod(xy[i+i], wrap); Py_INCREF(Py_None); return Py_None; } static struct PyMethodDef methods[] = { {"getbbox", (PyCFunction)path_getbbox, 1}, {"tolist", (PyCFunction)path_tolist, 1}, {"clip_polygon", (PyCFunction)path_clip_polygon, 1}, {"clip_polyline", (PyCFunction)path_clip_polyline, 1}, {"compact", (PyCFunction)path_compact, 1}, {"map", (PyCFunction)path_map, 1}, {"transform", (PyCFunction)path_transform, 1}, {NULL, NULL} /* sentinel */ }; static PyObject* path_getattr_id(PyPathObject* self, void* closure) { return Py_BuildValue("n", (Py_ssize_t) self->xy); } static struct PyGetSetDef getsetters[] = { { "id", (getter) path_getattr_id }, { NULL } }; static PyObject* path_subscript(PyPathObject* self, PyObject* item) { if (PyIndex_Check(item)) { Py_ssize_t i; i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; return path_getitem(self, i); } if (PySlice_Check(item)) { int len = 4; Py_ssize_t start, stop, step, slicelength; #if PY_VERSION_HEX >= 0x03020000 if (PySlice_GetIndicesEx(item, len, &start, &stop, &step, &slicelength) < 0) return NULL; #else if (PySlice_GetIndicesEx((PySliceObject*)item, len, &start, &stop, &step, &slicelength) < 0) return NULL; #endif if (slicelength <= 0) { double *xy = alloc_array(0); return (PyObject*) path_new(0, xy, 0); } else if (step == 1) { return path_getslice(self, start, stop); } else { PyErr_SetString(PyExc_TypeError, "slice steps not supported"); return NULL; } } else { PyErr_Format(PyExc_TypeError, "Path indices must be integers, not %.200s", Py_TYPE(&item)->tp_name); return NULL; } } static PySequenceMethods path_as_sequence = { (lenfunc)path_len, /*sq_length*/ (binaryfunc)0, /*sq_concat*/ (ssizeargfunc)0, /*sq_repeat*/ (ssizeargfunc)path_getitem, /*sq_item*/ (ssizessizeargfunc)path_getslice, /*sq_slice*/ (ssizeobjargproc)path_setitem, /*sq_ass_item*/ (ssizessizeobjargproc)0, /*sq_ass_slice*/ }; static PyMappingMethods path_as_mapping = { (lenfunc)path_len, (binaryfunc)path_subscript, NULL }; static PyTypeObject PyPathType = { PyVarObject_HEAD_INIT(NULL, 0) "Path", /*tp_name*/ sizeof(PyPathObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)path_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ &path_as_sequence, /*tp_as_sequence */ &path_as_mapping, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ getsetters, /*tp_getset*/ }; pillow-2.3.0/setup.py0000644000175000001440000005571312260205362013420 0ustar dokousers# > pyroma . # ------------------------------ # Checking . # Found Pillow # ------------------------------ # Final rating: 10/10 # Your cheese is so fresh most people think it's a cream: Mascarpone # ------------------------------ from __future__ import print_function import glob import os import platform as plat import re import struct import sys from distutils.command.build_ext import build_ext from distutils import sysconfig from setuptools import Extension, setup, find_packages _IMAGING = ( "decode", "encode", "map", "display", "outline", "path") _LIB_IMAGING = ( "Access", "AlphaComposite", "Antialias", "Bands", "BitDecode", "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crc32", "Crop", "Dib", "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", "Histo", "JpegDecode", "JpegEncode", "LzwDecode", "Matrix", "ModeFilter", "MspDecode", "Negative", "Offset", "Pack", "PackDecode", "Palette", "Paste", "Quant", "QuantOctree", "QuantHash", "QuantHeap", "PcdDecode", "PcxDecode", "PcxEncode", "Point", "RankFilter", "RawDecode", "RawEncode", "Storage", "SunRleDecode", "TgaRleDecode", "Unpack", "UnpackYCC", "UnsharpMask", "XbmDecode", "XbmEncode", "ZipDecode", "ZipEncode", "TiffDecode") def _add_directory(path, dir, where=None): if dir is None: return dir = os.path.realpath(dir) if os.path.isdir(dir) and dir not in path: if where is None: path.append(dir) else: path.insert(where, dir) def _find_include_file(self, include): for directory in self.compiler.include_dirs: if os.path.isfile(os.path.join(directory, include)): return 1 return 0 def _find_library_file(self, library): # Fix for 3.2.x <3.2.4, 3.3.0, shared lib extension is the python shared # lib extension, not the system shared lib extension: e.g. .cpython-33.so # vs .so. See Python bug http://bugs.python.org/16754 if 'cpython' in self.compiler.shared_lib_extension: existing = self.compiler.shared_lib_extension self.compiler.shared_lib_extension = "." + existing.split('.')[-1] ret = self.compiler.find_library_file( self.compiler.library_dirs, library) self.compiler.shared_lib_extension = existing return ret else: return self.compiler.find_library_file( self.compiler.library_dirs, library) def _lib_include(root): # map root to (root/lib, root/include) return os.path.join(root, "lib"), os.path.join(root, "include") def _read(file): return open(file, 'rb').read() try: import _tkinter except ImportError: _tkinter = None NAME = 'Pillow' VERSION = '2.3.0' TCL_ROOT = None JPEG_ROOT = None ZLIB_ROOT = None TIFF_ROOT = None FREETYPE_ROOT = None LCMS_ROOT = None class pil_build_ext(build_ext): class feature: zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = webpmux = None required = [] def require(self, feat): return feat in self.required def want(self, feat): return getattr(self, feat) is None def __iter__(self): for x in dir(self): if x[1] != '_': yield x feature = feature() user_options = build_ext.user_options + [ ('disable-%s' % x, None, 'Disable support for %s' % x) for x in feature ] + [ ('enable-%s' % x, None, 'Enable support for %s' % x) for x in feature ] def initialize_options(self): build_ext.initialize_options(self) for x in self.feature: setattr(self, 'disable_%s' % x, None) setattr(self, 'enable_%s' % x, None) def finalize_options(self): build_ext.finalize_options(self) for x in self.feature: if getattr(self, 'disable_%s' % x): setattr(self.feature, x, False) if getattr(self, 'enable_%s' % x): raise ValueError( 'Conflicting options: --enable-%s and --disable-%s' % (x, x)) if getattr(self, 'enable_%s' % x): self.feature.required.append(x) def build_extensions(self): global TCL_ROOT library_dirs = [] include_dirs = [] _add_directory(include_dirs, "libImaging") # # add configured kits for root in (TCL_ROOT, JPEG_ROOT, TIFF_ROOT, ZLIB_ROOT, FREETYPE_ROOT, LCMS_ROOT): if isinstance(root, type(())): lib_root, include_root = root else: lib_root = include_root = root _add_directory(library_dirs, lib_root) _add_directory(include_dirs, include_root) # respect CFLAGS/LDFLAGS for k in ('CFLAGS', 'LDFLAGS'): if k in os.environ: for match in re.finditer(r'-I([^\s]+)', os.environ[k]): _add_directory(include_dirs, match.group(1)) for match in re.finditer(r'-L([^\s]+)', os.environ[k]): _add_directory(library_dirs, match.group(1)) # include, rpath, if set as environment variables: for k in ('C_INCLUDE_PATH', 'CPATH', 'INCLUDE'): if k in os.environ: for d in os.environ[k].split(os.path.pathsep): _add_directory(include_dirs, d) for k in ('LD_RUN_PATH', 'LIBRARY_PATH', 'LIB'): if k in os.environ: for d in os.environ[k].split(os.path.pathsep): _add_directory(library_dirs, d) prefix = sysconfig.get_config_var("prefix") if prefix: _add_directory(library_dirs, os.path.join(prefix, "lib")) _add_directory(include_dirs, os.path.join(prefix, "include")) # # add platform directories if sys.platform == "cygwin": # pythonX.Y.dll.a is in the /usr/lib/pythonX.Y/config directory _add_directory(library_dirs, os.path.join( "/usr/lib", "python%s" % sys.version[:3], "config")) elif sys.platform == "darwin": # attempt to make sure we pick freetype2 over other versions _add_directory(include_dirs, "/sw/include/freetype2") _add_directory(include_dirs, "/sw/lib/freetype2/include") # fink installation directories _add_directory(library_dirs, "/sw/lib") _add_directory(include_dirs, "/sw/include") # darwin ports installation directories _add_directory(library_dirs, "/opt/local/lib") _add_directory(include_dirs, "/opt/local/include") # freetype2 ships with X11 _add_directory(library_dirs, "/usr/X11/lib") _add_directory(include_dirs, "/usr/X11/include") # if homebrew is installed, use its lib and include directories import subprocess try: prefix = subprocess.check_output(['brew', '--prefix']) if prefix: prefix = prefix.strip() _add_directory(library_dirs, os.path.join(prefix, 'lib')) _add_directory(include_dirs, os.path.join(prefix, 'include')) except: pass # homebrew not installed elif sys.platform.startswith("linux"): for platform_ in (plat.processor(), plat.architecture()[0]): if not platform_: continue if platform_ in ["x86_64", "64bit"]: _add_directory(library_dirs, "/lib64") _add_directory(library_dirs, "/usr/lib64") _add_directory(library_dirs, "/usr/lib/x86_64-linux-gnu") break elif platform_ in ["i386", "i686", "32bit"]: _add_directory(library_dirs, "/usr/lib/i386-linux-gnu") break else: raise ValueError( "Unable to identify Linux platform: `%s`" % platform_) # XXX Kludge. Above /\ we brute force support multiarch. Here we # try Barry's more general approach. Afterward, something should # work ;-) self.add_multiarch_paths() elif sys.platform.startswith("netbsd"): _add_directory(library_dirs, "/usr/pkg/lib") _add_directory(include_dirs, "/usr/pkg/include") # FIXME: check /opt/stuff directories here? # # locate tkinter libraries if _tkinter: TCL_VERSION = _tkinter.TCL_VERSION[:3] if _tkinter and not TCL_ROOT: # we have Tkinter but the TCL_ROOT variable was not set; # try to locate appropriate Tcl/Tk libraries PYVERSION = sys.version[0] + sys.version[2] TCLVERSION = TCL_VERSION[0] + TCL_VERSION[2] roots = [ # common installation directories, mostly for Windows # (for Unix-style platforms, we'll check in well-known # locations later) os.path.join("/py" + PYVERSION, "Tcl"), os.path.join("/python" + PYVERSION, "Tcl"), "/Tcl", "/Tcl" + TCLVERSION, "/Tcl" + TCL_VERSION, os.path.join(os.environ.get("ProgramFiles", ""), "Tcl"), ] for TCL_ROOT in roots: TCL_ROOT = os.path.abspath(TCL_ROOT) if os.path.isfile(os.path.join(TCL_ROOT, "include", "tk.h")): # FIXME: use distutils logging (?) print("--- using Tcl/Tk libraries at", TCL_ROOT) print("--- using Tcl/Tk version", TCL_VERSION) TCL_ROOT = _lib_include(TCL_ROOT) break else: TCL_ROOT = None # add standard directories # look for tcl specific subdirectory (e.g debian) if _tkinter: tcl_dir = "/usr/include/tcl" + TCL_VERSION if os.path.isfile(os.path.join(tcl_dir, "tk.h")): _add_directory(include_dirs, tcl_dir) # standard locations _add_directory(library_dirs, "/usr/local/lib") _add_directory(include_dirs, "/usr/local/include") _add_directory(library_dirs, "/usr/lib") _add_directory(include_dirs, "/usr/include") # # insert new dirs *before* default libs, to avoid conflicts # between Python PYD stub libs and real libraries self.compiler.library_dirs = library_dirs + self.compiler.library_dirs self.compiler.include_dirs = include_dirs + self.compiler.include_dirs # # look for available libraries feature = self.feature if feature.want('zlib'): if _find_include_file(self, "zlib.h"): if _find_library_file(self, "z"): feature.zlib = "z" elif sys.platform == "win32" and _find_library_file(self, "zlib"): feature.zlib = "zlib" # alternative name if feature.want('jpeg'): if _find_include_file(self, "jpeglib.h"): if _find_library_file(self, "jpeg"): feature.jpeg = "jpeg" elif ( sys.platform == "win32" and _find_library_file(self, "libjpeg")): feature.jpeg = "libjpeg" # alternative name if feature.want('tiff'): if _find_library_file(self, "tiff"): feature.tiff = "tiff" if sys.platform == "win32" and _find_library_file(self, "libtiff"): feature.tiff = "libtiff" if sys.platform == "darwin" and _find_library_file(self, "libtiff"): feature.tiff = "libtiff" if feature.want('freetype'): if _find_library_file(self, "freetype"): # look for freetype2 include files freetype_version = 0 for dir in self.compiler.include_dirs: if os.path.isfile(os.path.join(dir, "ft2build.h")): freetype_version = 21 dir = os.path.join(dir, "freetype2") break dir = os.path.join(dir, "freetype2") if os.path.isfile(os.path.join(dir, "ft2build.h")): freetype_version = 21 break if os.path.isdir(os.path.join(dir, "freetype")): freetype_version = 20 break if freetype_version: feature.freetype = "freetype" feature.freetype_version = freetype_version if dir: _add_directory(self.compiler.include_dirs, dir, 0) if feature.want('lcms'): if _find_include_file(self, "lcms2.h"): if _find_library_file(self, "lcms2"): feature.lcms = "lcms" if _tkinter and _find_include_file(self, "tk.h"): # the library names may vary somewhat (e.g. tcl84 or tcl8.4) version = TCL_VERSION[0] + TCL_VERSION[2] if feature.want('tcl'): if _find_library_file(self, "tcl" + version): feature.tcl = "tcl" + version elif _find_library_file(self, "tcl" + TCL_VERSION): feature.tcl = "tcl" + TCL_VERSION if feature.want('tk'): if _find_library_file(self, "tk" + version): feature.tk = "tk" + version elif _find_library_file(self, "tk" + TCL_VERSION): feature.tk = "tk" + TCL_VERSION if feature.want('webp'): if (_find_include_file(self, "webp/encode.h") and _find_include_file(self, "webp/decode.h")): if _find_library_file(self, "webp"): # in googles precompiled zip it is call "libwebp" feature.webp = "webp" if feature.want('webpmux'): if (_find_include_file(self, "webp/mux.h") and _find_include_file(self, "webp/demux.h")): if _find_library_file(self, "webpmux") and _find_library_file(self, "webpdemux"): feature.webpmux = "webpmux" for f in feature: if not getattr(feature, f) and feature.require(f): raise ValueError( '--enable-%s requested but %s not found, aborting.' % (f, f)) # # core library files = ["_imaging.c"] for file in _IMAGING: files.append(file + ".c") for file in _LIB_IMAGING: files.append(os.path.join("libImaging", file + ".c")) libs = [] defs = [] if feature.jpeg: libs.append(feature.jpeg) defs.append(("HAVE_LIBJPEG", None)) if feature.zlib: libs.append(feature.zlib) defs.append(("HAVE_LIBZ", None)) if feature.tiff: libs.append(feature.tiff) defs.append(("HAVE_LIBTIFF", None)) if sys.platform == "win32": libs.extend(["kernel32", "user32", "gdi32"]) if struct.unpack("h", "\0\1".encode('ascii'))[0] == 1: defs.append(("WORDS_BIGENDIAN", None)) exts = [(Extension( "PIL._imaging", files, libraries=libs, define_macros=defs))] # # additional libraries if feature.freetype: defs = [] if feature.freetype_version == 20: defs.append(("USE_FREETYPE_2_0", None)) exts.append(Extension( "PIL._imagingft", ["_imagingft.c"], libraries=["freetype"], define_macros=defs)) if os.path.isfile("_imagingtiff.c") and feature.tiff: exts.append(Extension( "PIL._imagingtiff", ["_imagingtiff.c"], libraries=["tiff"])) if os.path.isfile("_imagingcms.c") and feature.lcms: extra = [] if sys.platform == "win32": extra.extend(["user32", "gdi32"]) exts.append(Extension( "PIL._imagingcms", ["_imagingcms.c"], libraries=["lcms2"] + extra)) if os.path.isfile("_webp.c") and feature.webp: libs = ["webp"] defs = [] if feature.webpmux: defs.append(("HAVE_WEBPMUX", None)) libs.append("webpmux") libs.append("webpdemux") exts.append(Extension( "PIL._webp", ["_webp.c"], libraries=libs, define_macros=defs)) if sys.platform == "darwin": # locate Tcl/Tk frameworks frameworks = [] framework_roots = [ "/Library/Frameworks", "/System/Library/Frameworks"] for root in framework_roots: if ( os.path.exists(os.path.join(root, "Tcl.framework")) and os.path.exists(os.path.join(root, "Tk.framework"))): print("--- using frameworks at %s" % root) frameworks = ["-framework", "Tcl", "-framework", "Tk"] dir = os.path.join(root, "Tcl.framework", "Headers") _add_directory(self.compiler.include_dirs, dir, 0) dir = os.path.join(root, "Tk.framework", "Headers") _add_directory(self.compiler.include_dirs, dir, 1) break if frameworks: exts.append(Extension( "PIL._imagingtk", ["_imagingtk.c", "Tk/tkImaging.c"], extra_compile_args=frameworks, extra_link_args=frameworks)) feature.tcl = feature.tk = 1 # mark as present elif feature.tcl and feature.tk: exts.append(Extension( "PIL._imagingtk", ["_imagingtk.c", "Tk/tkImaging.c"], libraries=[feature.tcl, feature.tk])) if os.path.isfile("_imagingmath.c"): exts.append(Extension("PIL._imagingmath", ["_imagingmath.c"])) self.extensions[:] = exts build_ext.build_extensions(self) # # sanity and security checks unsafe_zlib = None if feature.zlib: unsafe_zlib = self.check_zlib_version(self.compiler.include_dirs) self.summary_report(feature, unsafe_zlib) def summary_report(self, feature, unsafe_zlib): print("-" * 68) print("PIL SETUP SUMMARY") print("-" * 68) print("version Pillow %s" % VERSION) v = sys.version.split("[") print("platform %s %s" % (sys.platform, v[0].strip())) for v in v[1:]: print(" [%s" % v.strip()) print("-" * 68) options = [ (feature.tcl and feature.tk, "TKINTER"), (feature.jpeg, "JPEG"), (feature.zlib, "ZLIB (PNG/ZIP)"), (feature.tiff, "LIBTIFF"), (feature.freetype, "FREETYPE2"), (feature.lcms, "LITTLECMS2"), (feature.webp, "WEBP"), (feature.webpmux, "WEBPMUX"), ] all = 1 for option in options: if option[0]: print("--- %s support available" % option[1]) else: print("*** %s support not available" % option[1]) if option[1] == "TKINTER" and _tkinter: version = _tkinter.TCL_VERSION print("(Tcl/Tk %s libraries needed)" % version) all = 0 if feature.zlib and unsafe_zlib: print("") print("*** Warning: zlib", unsafe_zlib) print("may contain a security vulnerability.") print("*** Consider upgrading to zlib 1.2.3 or newer.") print("*** See: http://www.kb.cert.org/vuls/id/238678") print(" http://www.kb.cert.org/vuls/id/680620") print(" http://www.gzip.org/zlib/advisory-2002-03-11.txt") print("") print("-" * 68) if not all: print("To add a missing option, make sure you have the required") print("library, and set the corresponding ROOT variable in the") print("setup.py script.") print("") print("To check the build, run the selftest.py script.") print("") def check_zlib_version(self, include_dirs): # look for unsafe versions of zlib for dir in include_dirs: zlibfile = os.path.join(dir, "zlib.h") if os.path.isfile(zlibfile): break else: return for line in open(zlibfile).readlines(): m = re.match('#define\s+ZLIB_VERSION\s+"([^"]*)"', line) if not m: continue if m.group(1) < "1.2.3": return m.group(1) # http://hg.python.org/users/barry/rev/7e8deab93d5a def add_multiarch_paths(self): # Debian/Ubuntu multiarch support. # https://wiki.ubuntu.com/MultiarchSpec # self.build_temp tmpfile = os.path.join(self.build_temp, 'multiarch') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) ret = os.system( 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % tmpfile) try: if ret >> 8 == 0: fp = open(tmpfile, 'r') multiarch_path_component = fp.readline().strip() _add_directory( self.compiler.library_dirs, '/usr/lib/' + multiarch_path_component) _add_directory( self.compiler.include_dirs, '/usr/include/' + multiarch_path_component) finally: os.unlink(tmpfile) setup( name=NAME, version=VERSION, description='Python Imaging Library (Fork)', long_description=( _read('README.rst') + b'\n' + _read('CHANGES.rst')).decode('utf-8'), author='Alex Clark (fork author)', author_email='aclark@aclark.net', url='http://python-imaging.github.io/', classifiers=[ "Development Status :: 6 - Mature", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera", "Topic :: Multimedia :: Graphics :: Capture :: Scanners", "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Multimedia :: Graphics :: Viewers", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", ], cmdclass={"build_ext": pil_build_ext}, ext_modules=[Extension("PIL._imaging", ["_imaging.c"])], include_package_data=True, packages=find_packages(), scripts=glob.glob("Scripts/pil*.py"), test_suite='PIL.tests', keywords=["Imaging",], license='Standard PIL License', zip_safe=True, ) pillow-2.3.0/selftest.py0000644000175000001440000001404112260205362014076 0ustar dokousers# minimal sanity check from __future__ import print_function import sys import os if "--installed" in sys.argv: sys_path_0 = sys.path[0] del sys.path[0] from PIL import Image, ImageDraw, ImageFilter, ImageMath if "--installed" in sys.argv: sys.path.insert(0, sys_path_0) ROOT = "." try: Image.core.ping except ImportError as v: print("***", v) sys.exit() except AttributeError: pass def _info(im): im.load() return im.format, im.mode, im.size def testimage(): """ PIL lets you create in-memory images with various pixel types: >>> im = Image.new("1", (128, 128)) # monochrome >>> _info(im) (None, '1', (128, 128)) >>> _info(Image.new("L", (128, 128))) # grayscale (luminance) (None, 'L', (128, 128)) >>> _info(Image.new("P", (128, 128))) # palette (None, 'P', (128, 128)) >>> _info(Image.new("RGB", (128, 128))) # truecolor (None, 'RGB', (128, 128)) >>> _info(Image.new("I", (128, 128))) # 32-bit integer (None, 'I', (128, 128)) >>> _info(Image.new("F", (128, 128))) # 32-bit floating point (None, 'F', (128, 128)) Or open existing files: >>> im = Image.open(os.path.join(ROOT, "Images/lena.gif")) >>> _info(im) ('GIF', 'P', (128, 128)) >>> _info(Image.open(os.path.join(ROOT, "Images/lena.ppm"))) ('PPM', 'RGB', (128, 128)) >>> try: ... _info(Image.open(os.path.join(ROOT, "Images/lena.jpg"))) ... except IOError as v: ... print(v) ('JPEG', 'RGB', (128, 128)) PIL doesn't actually load the image data until it's needed, or you call the "load" method: >>> im = Image.open(os.path.join(ROOT, "Images/lena.ppm")) >>> print(im.im) # internal image attribute None >>> a = im.load() >>> type(im.im) # doctest: +ELLIPSIS <... '...ImagingCore'> You can apply many different operations on images. Most operations return a new image: >>> im = Image.open(os.path.join(ROOT, "Images/lena.ppm")) >>> _info(im.convert("L")) (None, 'L', (128, 128)) >>> _info(im.copy()) (None, 'RGB', (128, 128)) >>> _info(im.crop((32, 32, 96, 96))) (None, 'RGB', (64, 64)) >>> _info(im.filter(ImageFilter.BLUR)) (None, 'RGB', (128, 128)) >>> im.getbands() ('R', 'G', 'B') >>> im.getbbox() (0, 0, 128, 128) >>> len(im.getdata()) 16384 >>> im.getextrema() ((61, 255), (26, 234), (44, 223)) >>> im.getpixel((0, 0)) (223, 162, 133) >>> len(im.getprojection()) 2 >>> len(im.histogram()) 768 >>> _info(im.point(list(range(256))*3)) (None, 'RGB', (128, 128)) >>> _info(im.resize((64, 64))) (None, 'RGB', (64, 64)) >>> _info(im.rotate(45)) (None, 'RGB', (128, 128)) >>> [_info(ch) for ch in im.split()] [(None, 'L', (128, 128)), (None, 'L', (128, 128)), (None, 'L', (128, 128))] >>> len(im.convert("1").tobitmap()) 10456 >>> len(im.tobytes()) 49152 >>> _info(im.transform((512, 512), Image.AFFINE, (1,0,0,0,1,0))) (None, 'RGB', (512, 512)) >>> _info(im.transform((512, 512), Image.EXTENT, (32,32,96,96))) (None, 'RGB', (512, 512)) The ImageDraw module lets you draw stuff in raster images: >>> im = Image.new("L", (128, 128), 64) >>> d = ImageDraw.ImageDraw(im) >>> d.line((0, 0, 128, 128), fill=128) >>> d.line((0, 128, 128, 0), fill=128) >>> im.getextrema() (64, 128) In 1.1.4, you can specify colors in a number of ways: >>> xy = 0, 0, 128, 128 >>> im = Image.new("RGB", (128, 128), 0) >>> d = ImageDraw.ImageDraw(im) >>> d.rectangle(xy, "#f00") >>> im.getpixel((0, 0)) (255, 0, 0) >>> d.rectangle(xy, "#ff0000") >>> im.getpixel((0, 0)) (255, 0, 0) >>> d.rectangle(xy, "rgb(255,0,0)") >>> im.getpixel((0, 0)) (255, 0, 0) >>> d.rectangle(xy, "rgb(100%,0%,0%)") >>> im.getpixel((0, 0)) (255, 0, 0) >>> d.rectangle(xy, "hsl(0, 100%, 50%)") >>> im.getpixel((0, 0)) (255, 0, 0) >>> d.rectangle(xy, "red") >>> im.getpixel((0, 0)) (255, 0, 0) In 1.1.6, you can use the ImageMath module to do image calculations. >>> im = ImageMath.eval("float(im + 20)", im=im.convert("L")) >>> im.mode, im.size ('F', (128, 128)) PIL can do many other things, but I'll leave that for another day. If you're curious, check the handbook, available from: http://www.pythonware.com Cheers /F """ def check_module(feature, module): try: __import__(module) except ImportError: print("***", feature, "support not installed") else: print("---", feature, "support ok") def check_codec(feature, codec): if codec + "_encoder" not in dir(Image.core): print("***", feature, "support not installed") else: print("---", feature, "support ok") if __name__ == "__main__": # check build sanity exit_status = 0 print("-"*68) print("Pillow", Image.PILLOW_VERSION, "TEST SUMMARY ") print("-"*68) print("Python modules loaded from", os.path.dirname(Image.__file__)) print("Binary modules loaded from", os.path.dirname(Image.core.__file__)) print("-"*68) check_module("PIL CORE", "PIL._imaging") check_module("TKINTER", "PIL._imagingtk") check_codec("JPEG", "jpeg") check_codec("ZLIB (PNG/ZIP)", "zip") check_codec("LIBTIFF", "libtiff") check_module("FREETYPE2", "PIL._imagingft") check_module("LITTLECMS2", "PIL._imagingcms") check_module("WEBP", "PIL._webp") try: from PIL import _webp if _webp.WebPDecoderBuggyAlpha(): print("***", "Transparent WEBP", "support not installed") else: print("---", "Transparent WEBP", "support ok") except Exception: pass print("-"*68) # use doctest to make sure the test program behaves as documented! import doctest import selftest print("Running selftest:") status = doctest.testmod(selftest) if status[0]: print("*** %s tests of %d failed." % status) exit_status = 1 else: print("--- %s tests passed." % status[1]) sys.exit(exit_status) pillow-2.3.0/tox.ini0000644000175000001440000000070112257506326013216 0ustar dokousers# Tox (http://tox.testrun.org/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. [tox] envlist = py26, py27, py32, py33 [testenv] commands = {envpython} setup.py clean {envpython} setup.py build_ext --inplace {envpython} selftest.py {envpython} Tests/run.py --installed pillow-2.3.0/Scripts/0000755000175000001440000000000012274164154013332 5ustar dokouserspillow-2.3.0/Scripts/viewer.py0000644000175000001440000000167112257506326015214 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # from __future__ import print_function try: from tkinter import * except ImportError: from Tkinter import * from PIL import Image, ImageTk # # an image viewer class UI(Label): def __init__(self, master, im): if im.mode == "1": # bitmap image self.image = ImageTk.BitmapImage(im, foreground="white") Label.__init__(self, master, image=self.image, bg="black", bd=0) else: # photo image self.image = ImageTk.PhotoImage(im) Label.__init__(self, master, image=self.image, bd=0) # # script interface if __name__ == "__main__": import sys if not sys.argv[1:]: print("Syntax: python viewer.py imagefile") sys.exit(1) filename = sys.argv[1] root = Tk() root.title(filename) im = Image.open(filename) UI(root, im).pack() root.mainloop() pillow-2.3.0/Scripts/explode.py0000644000175000001440000000460012257506326015346 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # split an animation into a number of frame files # from __future__ import print_function from PIL import Image import os, sys class Interval: def __init__(self, interval = "0"): self.setinterval(interval) def setinterval(self, interval): self.hilo = [] for s in interval.split(","): if not s.strip(): continue try: v = int(s) if v < 0: lo, hi = 0, -v else: lo = hi = v except ValueError: i = s.find("-") lo, hi = int(s[:i]), int(s[i+1:]) self.hilo.append((hi, lo)) if not self.hilo: self.hilo = [(sys.maxsize, 0)] def __getitem__(self, index): for hi, lo in self.hilo: if hi >= index >= lo: return 1 return 0 # -------------------------------------------------------------------- # main program html = 0 if sys.argv[1:2] == ["-h"]: html = 1 del sys.argv[1] if not sys.argv[2:]: print() print("Syntax: python explode.py infile template [range]") print() print("The template argument is used to construct the names of the") print("individual frame files. The frames are numbered file001.ext,") print("file002.ext, etc. You can insert %d to control the placement") print("and syntax of the frame number.") print() print("The optional range argument specifies which frames to extract.") print("You can give one or more ranges like 1-10, 5, -15 etc. If") print("omitted, all frames are extracted.") sys.exit(1) infile = sys.argv[1] outfile = sys.argv[2] frames = Interval(",".join(sys.argv[3:])) try: # check if outfile contains a placeholder outfile % 1 except TypeError: file, ext = os.path.splitext(outfile) outfile = file + "%03d" + ext ix = 1 im = Image.open(infile) if html: file, ext = os.path.splitext(outfile) html = open(file+".html", "w") html.write("\n\n") while True: if frames[ix]: im.save(outfile % ix) print(outfile % ix) if html: html.write("
\n" % outfile % ix) try: im.seek(ix) except EOFError: break ix = ix + 1 if html: html.write("\n\n") pillow-2.3.0/Scripts/pilfont.py0000644000175000001440000000200012257506326015351 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # PIL raster font compiler # # history: # 1997-08-25 fl created # 2002-03-10 fl use "from PIL import" # from __future__ import print_function VERSION = "0.4" import glob, sys # drivers from PIL import BdfFontFile from PIL import PcfFontFile if len(sys.argv) <= 1: print("PILFONT", VERSION, "-- PIL font compiler.") print() print("Usage: pilfont fontfiles...") print() print("Convert given font files to the PIL raster font format.") print("This version of pilfont supports X BDF and PCF fonts.") sys.exit(1) files = [] for f in sys.argv[1:]: files = files + glob.glob(f) for f in files: print(f + "...", end=' ') try: fp = open(f, "rb") try: p = PcfFontFile.PcfFontFile(fp) except SyntaxError: fp.seek(0) p = BdfFontFile.BdfFontFile(fp) p.save(f) except (SyntaxError, IOError): print("failed") else: print("OK") pillow-2.3.0/Scripts/pildriver.py0000644000175000001440000003636312257506326015721 0ustar dokousers#!/usr/bin/env python """PILdriver, an image-processing calculator using PIL. An instance of class PILDriver is essentially a software stack machine (Polish-notation interpreter) for sequencing PIL image transformations. The state of the instance is the interpreter stack. The only method one will normally invoke after initialization is the `execute' method. This takes an argument list of tokens, pushes them onto the instance's stack, and then tries to clear the stack by successive evaluation of PILdriver operators. Any part of the stack not cleaned off persists and is part of the evaluation context for the next call of the execute method. PILDriver doesn't catch any exceptions, on the theory that these are actually diagnostic information that should be interpreted by the calling code. When called as a script, the command-line arguments are passed to a PILDriver instance. If there are no command-line arguments, the module runs an interactive interpreter, each line of which is split into space-separated tokens and passed to the execute method. In the method descriptions below, a first line beginning with the string `usage:' means this method can be invoked with the token that follows it. Following <>-enclosed arguments describe how the method interprets the entries on the stack. Each argument specification begins with a type specification: either `int', `float', `string', or `image'. All operations consume their arguments off the stack (use `dup' to keep copies around). Use `verbose 1' to see the stack state displayed before each operation. Usage examples: `show crop 0 0 200 300 open test.png' loads test.png, crops out a portion of its upper-left-hand corner and displays the cropped portion. `save rotated.png rotate 30 open test.tiff' loads test.tiff, rotates it 30 degrees, and saves the result as rotated.png (in PNG format). """ # by Eric S. Raymond # $Id$ # TO DO: # 1. Add PILFont capabilities, once that's documented. # 2. Add PILDraw operations. # 3. Add support for composing and decomposing multiple-image files. # from __future__ import print_function from PIL import Image class PILDriver: verbose = 0 def do_verbose(self): """usage: verbose Set verbosity flag from top of stack. """ self.verbose = int(self.do_pop()) # The evaluation stack (internal only) stack = [] # Stack of pending operations def push(self, item): "Push an argument onto the evaluation stack." self.stack = [item] + self.stack def top(self): "Return the top-of-stack element." return self.stack[0] # Stack manipulation (callable) def do_clear(self): """usage: clear Clear the stack. """ self.stack = [] def do_pop(self): """usage: pop Discard the top element on the stack. """ top = self.stack[0] self.stack = self.stack[1:] return top def do_dup(self): """usage: dup Duplicate the top-of-stack item. """ if hasattr(self, 'format'): # If it's an image, do a real copy dup = self.stack[0].copy() else: dup = self.stack[0] self.stack = [dup] + self.stack def do_swap(self): """usage: swap Swap the top-of-stack item with the next one down. """ self.stack = [self.stack[1], self.stack[0]] + self.stack[2:] # Image module functions (callable) def do_new(self): """usage: new : Create and push a greyscale image of given size and color. """ xsize = int(self.do_pop()) ysize = int(self.do_pop()) color = int(self.do_pop()) self.push(Image.new("L", (xsize, ysize), color)) def do_open(self): """usage: open Open the indicated image, read it, push the image on the stack. """ self.push(Image.open(self.do_pop())) def do_blend(self): """usage: blend Replace two images and an alpha with the blended image. """ image1 = self.do_pop() image2 = self.do_pop() alpha = float(self.do_pop()) self.push(Image.blend(image1, image2, alpha)) def do_composite(self): """usage: composite Replace two images and a mask with their composite. """ image1 = self.do_pop() image2 = self.do_pop() mask = self.do_pop() self.push(Image.composite(image1, image2, mask)) def do_merge(self): """usage: merge [ [ []]] Merge top-of stack images in a way described by the mode. """ mode = self.do_pop() bandlist = [] for band in mode: bandlist.append(self.do_pop()) self.push(Image.merge(mode, bandlist)) # Image class methods def do_convert(self): """usage: convert Convert the top image to the given mode. """ mode = self.do_pop() image = self.do_pop() self.push(image.convert(mode)) def do_copy(self): """usage: copy Make and push a true copy of the top image. """ self.dup() def do_crop(self): """usage: crop Crop and push a rectangular region from the current image. """ left = int(self.do_pop()) upper = int(self.do_pop()) right = int(self.do_pop()) lower = int(self.do_pop()) image = self.do_pop() self.push(image.crop((left, upper, right, lower))) def do_draft(self): """usage: draft Configure the loader for a given mode and size. """ mode = self.do_pop() xsize = int(self.do_pop()) ysize = int(self.do_pop()) self.push(self.draft(mode, (xsize, ysize))) def do_filter(self): """usage: filter Process the top image with the given filter. """ from PIL import ImageFilter filter = eval("ImageFilter." + self.do_pop().upper()) image = self.do_pop() self.push(image.filter(filter)) def do_getbbox(self): """usage: getbbox Push left, upper, right, and lower pixel coordinates of the top image. """ bounding_box = self.do_pop().getbbox() self.push(bounding_box[3]) self.push(bounding_box[2]) self.push(bounding_box[1]) self.push(bounding_box[0]) def do_getextrema(self): """usage: extrema Push minimum and maximum pixel values of the top image. """ extrema = self.do_pop().extrema() self.push(extrema[1]) self.push(extrema[0]) def do_offset(self): """usage: offset Offset the pixels in the top image. """ xoff = int(self.do_pop()) yoff = int(self.do_pop()) image = self.do_pop() self.push(image.offset(xoff, yoff)) def do_paste(self): """usage: paste Paste figure image into ground with upper left at given offsets. """ figure = self.do_pop() xoff = int(self.do_pop()) yoff = int(self.do_pop()) ground = self.do_pop() if figure.mode == "RGBA": ground.paste(figure, (xoff, yoff), figure) else: ground.paste(figure, (xoff, yoff)) self.push(ground) def do_resize(self): """usage: resize Resize the top image. """ ysize = int(self.do_pop()) xsize = int(self.do_pop()) image = self.do_pop() self.push(image.resize((xsize, ysize))) def do_rotate(self): """usage: rotate Rotate image through a given angle """ angle = int(self.do_pop()) image = self.do_pop() self.push(image.rotate(angle)) def do_save(self): """usage: save Save image with default options. """ filename = self.do_pop() image = self.do_pop() image.save(filename) def do_save2(self): """usage: save2 Save image with specified options. """ filename = self.do_pop() options = self.do_pop() image = self.do_pop() image.save(filename, None, options) def do_show(self): """usage: show Display and pop the top image. """ self.do_pop().show() def do_thumbnail(self): """usage: thumbnail Modify the top image in the stack to contain a thumbnail of itself. """ ysize = int(self.do_pop()) xsize = int(self.do_pop()) self.top().thumbnail((xsize, ysize)) def do_transpose(self): """usage: transpose Transpose the top image. """ transpose = self.do_pop().upper() image = self.do_pop() self.push(image.transpose(transpose)) # Image attributes def do_format(self): """usage: format Push the format of the top image onto the stack. """ self.push(self.do_pop().format) def do_mode(self): """usage: mode Push the mode of the top image onto the stack. """ self.push(self.do_pop().mode) def do_size(self): """usage: size Push the image size on the stack as (y, x). """ size = self.do_pop().size self.push(size[0]) self.push(size[1]) # ImageChops operations def do_invert(self): """usage: invert Invert the top image. """ from PIL import ImageChops self.push(ImageChops.invert(self.do_pop())) def do_lighter(self): """usage: lighter Pop the two top images, push an image of the lighter pixels of both. """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.lighter(image1, image2)) def do_darker(self): """usage: darker Pop the two top images, push an image of the darker pixels of both. """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.darker(image1, image2)) def do_difference(self): """usage: difference Pop the two top images, push the difference image """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.difference(image1, image2)) def do_multiply(self): """usage: multiply Pop the two top images, push the multiplication image. """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() self.push(ImageChops.multiply(image1, image2)) def do_screen(self): """usage: screen Pop the two top images, superimpose their inverted versions. """ from PIL import ImageChops image2 = self.do_pop() image1 = self.do_pop() self.push(ImageChops.screen(image1, image2)) def do_add(self): """usage: add Pop the two top images, produce the scaled sum with offset. """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() scale = float(self.do_pop()) offset = int(self.do_pop()) self.push(ImageChops.add(image1, image2, scale, offset)) def do_subtract(self): """usage: subtract Pop the two top images, produce the scaled difference with offset. """ from PIL import ImageChops image1 = self.do_pop() image2 = self.do_pop() scale = float(self.do_pop()) offset = int(self.do_pop()) self.push(ImageChops.subtract(image1, image2, scale, offset)) # ImageEnhance classes def do_color(self): """usage: color Enhance color in the top image. """ from PIL import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Color(image) self.push(enhancer.enhance(factor)) def do_contrast(self): """usage: contrast Enhance contrast in the top image. """ from PIL import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Contrast(image) self.push(enhancer.enhance(factor)) def do_brightness(self): """usage: brightness Enhance brightness in the top image. """ from PIL import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Brightness(image) self.push(enhancer.enhance(factor)) def do_sharpness(self): """usage: sharpness Enhance sharpness in the top image. """ from PIL import ImageEnhance factor = float(self.do_pop()) image = self.do_pop() enhancer = ImageEnhance.Sharpness(image) self.push(enhancer.enhance(factor)) # The interpreter loop def execute(self, list): "Interpret a list of PILDriver commands." list.reverse() while len(list) > 0: self.push(list[0]) list = list[1:] if self.verbose: print("Stack: " + repr(self.stack)) top = self.top() if not isinstance(top, str): continue; funcname = "do_" + top if not hasattr(self, funcname): continue else: self.do_pop() func = getattr(self, funcname) func() if __name__ == '__main__': import sys try: import readline except ImportError: pass # not available on all platforms # If we see command-line arguments, interpret them as a stack state # and execute. Otherwise go interactive. driver = PILDriver() if len(sys.argv[1:]) > 0: driver.execute(sys.argv[1:]) else: print("PILDriver says hello.") while True: try: if sys.version_info[0] >= 3: line = input('pildriver> '); else: line = raw_input('pildriver> '); except EOFError: print("\nPILDriver says goodbye.") break driver.execute(line.split()) print(driver.stack) # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: pillow-2.3.0/Scripts/gifmaker.py0000644000175000001440000000575612257506326015510 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # convert sequence format to GIF animation # # history: # 97-01-03 fl created # # Copyright (c) Secret Labs AB 1997. All rights reserved. # Copyright (c) Fredrik Lundh 1997. # # See the README file for information on usage and redistribution. # # # For special purposes, you can import this module and call # the makedelta or compress functions yourself. For example, # if you have an application that generates a sequence of # images, you can convert it to a GIF animation using some- # thing like the following code: # # import Image # import gifmaker # # sequence = [] # # # generate sequence # for i in range(100): # im = # sequence.append(im) # # # write GIF animation # fp = open("out.gif", "wb") # gifmaker.makedelta(fp, sequence) # fp.close() # # Alternatively, use an iterator to generate the sequence, and # write data directly to a socket. Or something... # from __future__ import print_function from PIL import Image, ImageChops from PIL.GifImagePlugin import getheader, getdata # -------------------------------------------------------------------- # sequence iterator class image_sequence: def __init__(self, im): self.im = im def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError: raise IndexError # end of sequence # -------------------------------------------------------------------- # straightforward delta encoding def makedelta(fp, sequence): """Convert list of image frames to a GIF animation file""" frames = 0 previous = None for im in sequence: # # FIXME: write graphics control block before each frame if not previous: # global header for s in getheader(im) + getdata(im): fp.write(s) else: # delta frame delta = ImageChops.subtract_modulo(im, previous) bbox = delta.getbbox() if bbox: # compress difference for s in getdata(im.crop(bbox), offset = bbox[:2]): fp.write(s) else: # FIXME: what should we do in this case? pass previous = im.copy() frames = frames + 1 fp.write(";") return frames # -------------------------------------------------------------------- # main hack def compress(infile, outfile): # open input image, and force loading of first frame im = Image.open(infile) im.load() # open output file fp = open(outfile, "wb") seq = image_sequence(im) makedelta(fp, seq) fp.close() if __name__ == "__main__": import sys if len(sys.argv) < 3: print("GIFMAKER -- create GIF animations") print("Usage: gifmaker infile outfile") sys.exit(1) compress(sys.argv[1], sys.argv[2]) pillow-2.3.0/Scripts/README0000644000175000001440000000531112257506326014214 0ustar dokousers------- Scripts ------- This directory contains a number of more or less trivial utilities and demo programs. Comments and contributions are welcome. -------------------------------------------------------------------- pildriver.py (by Eric S. Raymond) A class implementing an image-processing calculator for scripts. Parses lists of commnds (or, called interactively, command-line arguments) into image loads, transformations, and saves. -------------------------------------------------------------------- viewer.py A simple image viewer. Can display all file formats handled by PIL. Transparent images are properly handled. -------------------------------------------------------------------- thresholder.py A simple utility that demonstrates how a transparent 1-bit overlay can be used to show the current thresholding of an 8-bit image. -------------------------------------------------------------------- enhancer.py Illustrates the ImageEnhance module. Drag the sliders to modify the images. This might be very slow on some platforms, depending on the Tk version. -------------------------------------------------------------------- painter.py Illustrates how a painting program could be based on PIL and Tk. Press the left mouse button and drag over the image to remove the colour. Some clever tricks have been used to get decent performance when updating the screen; see the sources for details. -------------------------------------------------------------------- player.py A simple image sequence player. You can use either a sequence format like FLI/FLC, GIF, or ARG, or give a number of images which are interpreted as frames in a sequence. All frames must have the same size. -------------------------------------------------------------------- gifmaker.py Convert a sequence file to a GIF animation. Note that the GIF encoder provided with this release of PIL writes uncompressed GIF files only, so the resulting animations are rather large compared with these created by other tools. -------------------------------------------------------------------- explode.py Split a sequence file into individual frames. -------------------------------------------------------------------- image2py.py Convert an image to a Python module containing an IMAGE variable. Note that the module using the module must include JPEG and ZIP decoders, unless the -u option is used. -------------------------------------------------------------------- olesummary.py Uses the OleFileIO module to dump the summary information from an OLE structured storage file. This works with most OLE files, including Word documents, FlashPix images, etc. Note that datetime fields currently show the number of seconds since January 1st, 1601. pillow-2.3.0/Scripts/pilconvert.py0000644000175000001440000000443512257506326016101 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library. # $Id$ # # convert image files # # History: # 0.1 96-04-20 fl Created # 0.2 96-10-04 fl Use draft mode when converting images # 0.3 96-12-30 fl Optimize output (PNG, JPEG) # 0.4 97-01-18 fl Made optimize an option (PNG, JPEG) # 0.5 98-12-30 fl Fixed -f option (from Anthony Baxter) # from __future__ import print_function import site import getopt, string, sys from PIL import Image def usage(): print("PIL Convert 0.5/1998-12-30 -- convert image files") print("Usage: pilconvert [option] infile outfile") print() print("Options:") print() print(" -c convert to format (default is given by extension)") print() print(" -g convert to greyscale") print(" -p convert to palette image (using standard palette)") print(" -r convert to rgb") print() print(" -o optimize output (trade speed for size)") print(" -q set compression quality (0-100, JPEG only)") print() print(" -f list supported file formats") sys.exit(1) if len(sys.argv) == 1: usage() try: opt, argv = getopt.getopt(sys.argv[1:], "c:dfgopq:r") except getopt.error as v: print(v) sys.exit(1) format = None convert = None options = { } for o, a in opt: if o == "-f": Image.init() id = sorted(Image.ID) print("Supported formats (* indicates output format):") for i in id: if i in Image.SAVE: print(i+"*", end=' ') else: print(i, end=' ') sys.exit(1) elif o == "-c": format = a if o == "-g": convert = "L" elif o == "-p": convert = "P" elif o == "-r": convert = "RGB" elif o == "-o": options["optimize"] = 1 elif o == "-q": options["quality"] = string.atoi(a) if len(argv) != 2: usage() try: im = Image.open(argv[0]) if convert and im.mode != convert: im.draft(convert, im.size) im = im.convert(convert) if format: im.save(argv[1], format, **options) else: im.save(argv[1], **options) except: print("cannot convert image", end=' ') print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) pillow-2.3.0/Scripts/painter.py0000644000175000001440000000373012257506326015353 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # this demo script illustrates pasting into an already displayed # photoimage. note that the current version of Tk updates the whole # image everytime we paste, so to get decent performance, we split # the image into a set of tiles. # try: from tkinter import * except ImportError: from Tkinter import * from PIL import Image, ImageTk import sys # # painter widget class PaintCanvas(Canvas): def __init__(self, master, image): Canvas.__init__(self, master, width=image.size[0], height=image.size[1]) # fill the canvas self.tile = {} self.tilesize = tilesize = 32 xsize, ysize = image.size for x in range(0, xsize, tilesize): for y in range(0, ysize, tilesize): box = x, y, min(xsize, x+tilesize), min(ysize, y+tilesize) tile = ImageTk.PhotoImage(image.crop(box)) self.create_image(x, y, image=tile, anchor=NW) self.tile[(x,y)] = box, tile self.image = image self.bind("", self.paint) def paint(self, event): xy = event.x - 10, event.y - 10, event.x + 10, event.y + 10 im = self.image.crop(xy) # process the image in some fashion im = im.convert("L") self.image.paste(im, xy) self.repair(xy) def repair(self, box): # update canvas dx = box[0] % self.tilesize dy = box[1] % self.tilesize for x in range(box[0]-dx, box[2]+1, self.tilesize): for y in range(box[1]-dy, box[3]+1, self.tilesize): try: xy, tile = self.tile[(x, y)] tile.paste(self.image.crop(xy)) except KeyError: pass # outside the image self.update_idletasks() # # main root = Tk() im = Image.open(sys.argv[1]) if im.mode != "RGB": im = im.convert("RGB") PaintCanvas(root, im).pack() root.mainloop() pillow-2.3.0/Scripts/pilprint.py0000644000175000001440000000451312257506326015552 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library. # $Id$ # # print image files to postscript printer # # History: # 0.1 1996-04-20 fl Created # 0.2 1996-10-04 fl Use draft mode when converting. # 0.3 2003-05-06 fl Fixed a typo or two. # from __future__ import print_function VERSION = "pilprint 0.3/2003-05-05" from PIL import Image from PIL import PSDraw letter = ( 1.0*72, 1.0*72, 7.5*72, 10.0*72 ) def description(file, image): import os title = os.path.splitext(os.path.split(file)[1])[0] format = " (%dx%d " if image.format: format = " (" + image.format + " %dx%d " return title + format % image.size + image.mode + ")" import getopt, os, sys if len(sys.argv) == 1: print("PIL Print 0.2a1/96-10-04 -- print image files") print("Usage: pilprint files...") print("Options:") print(" -c colour printer (default is monochrome)") print(" -p print via lpr (default is stdout)") print(" -P same as -p but use given printer") sys.exit(1) try: opt, argv = getopt.getopt(sys.argv[1:], "cdpP:") except getopt.error as v: print(v) sys.exit(1) printer = None # print to stdout monochrome = 1 # reduce file size for most common case for o, a in opt: if o == "-d": # debug: show available drivers Image.init() print(Image.ID) sys.exit(1) elif o == "-c": # colour printer monochrome = 0 elif o == "-p": # default printer channel printer = "lpr" elif o == "-P": # printer channel printer = "lpr -P%s" % a for file in argv: try: im = Image.open(file) title = description(file, im) if monochrome and im.mode not in ["1", "L"]: im.draft("L", im.size) im = im.convert("L") if printer: fp = os.popen(printer, "w") else: fp = sys.stdout ps = PSDraw.PSDraw(fp) ps.begin_document() ps.setfont("Helvetica-Narrow-Bold", 18) ps.text((letter[0], letter[3]+24), title) ps.setfont("Helvetica-Narrow-Bold", 8) ps.text((letter[0], letter[1]-30), VERSION) ps.image(letter, im) ps.end_document() except: print("cannot print image", end=' ') print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) pillow-2.3.0/Scripts/enhancer.py0000644000175000001440000000261412257506326015474 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # this demo script creates four windows containing an image and a slider. # drag the slider to modify the image. # try: from tkinter import * except ImportError: from Tkinter import * from PIL import Image, ImageTk, ImageEnhance import sys # # enhancer widget class Enhance(Frame): def __init__(self, master, image, name, enhancer, lo, hi): Frame.__init__(self, master) # set up the image self.tkim = ImageTk.PhotoImage(image.mode, image.size) self.enhancer = enhancer(image) self.update("1.0") # normalize # image window Label(self, image=self.tkim).pack() # scale s = Scale(self, label=name, orient=HORIZONTAL, from_=lo, to=hi, resolution=0.01, command=self.update) s.set(self.value) s.pack() def update(self, value): self.value = eval(value) self.tkim.paste(self.enhancer.enhance(self.value)) # # main root = Tk() im = Image.open(sys.argv[1]) im.thumbnail((200, 200)) Enhance(root, im, "Color", ImageEnhance.Color, 0.0, 4.0).pack() Enhance(Toplevel(), im, "Sharpness", ImageEnhance.Sharpness, -2.0, 2.0).pack() Enhance(Toplevel(), im, "Brightness", ImageEnhance.Brightness, -1.0, 3.0).pack() Enhance(Toplevel(), im, "Contrast", ImageEnhance.Contrast, -1.0, 3.0).pack() root.mainloop() pillow-2.3.0/Scripts/player.py0000644000175000001440000000537712257506326015216 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # from __future__ import print_function try: from tkinter import * except ImportError: from Tkinter import * from PIL import Image, ImageTk import sys Image.DEBUG = 0 # -------------------------------------------------------------------- # experimental: support ARG animation scripts import ArgImagePlugin def applet_hook(animation, images): app = animation(animation_display, images) app.run() ArgImagePlugin.APPLET_HOOK = applet_hook class AppletDisplay: def __init__(self, ui): self.__ui = ui def paste(self, im, bbox): self.__ui.image.paste(im, bbox) def update(self): self.__ui.update_idletasks() # -------------------------------------------------------------------- # an image animation player class UI(Label): def __init__(self, master, im): if isinstance(im, list): # list of images self.im = im[1:] im = self.im[0] else: # sequence self.im = im if im.mode == "1": self.image = ImageTk.BitmapImage(im, foreground="white") else: self.image = ImageTk.PhotoImage(im) # APPLET SUPPORT (very crude, and not 100% safe) global animation_display animation_display = AppletDisplay(self) Label.__init__(self, master, image=self.image, bg="black", bd=0) self.update() try: duration = im.info["duration"] except KeyError: duration = 100 self.after(duration, self.next) def next(self): if isinstance(self.im, list): try: im = self.im[0] del self.im[0] self.image.paste(im) except IndexError: return # end of list else: try: im = self.im im.seek(im.tell() + 1) self.image.paste(im) except EOFError: return # end of file try: duration = im.info["duration"] except KeyError: duration = 100 self.after(duration, self.next) self.update_idletasks() # -------------------------------------------------------------------- # script interface if __name__ == "__main__": if not sys.argv[1:]: print("Syntax: python player.py imagefile(s)") sys.exit(1) filename = sys.argv[1] root = Tk() root.title(filename) if len(sys.argv) > 2: # list of images print("loading...") im = [] for filename in sys.argv[1:]: im.append(Image.open(filename)) else: # sequence im = Image.open(filename) UI(root, im).pack() root.mainloop() pillow-2.3.0/Scripts/thresholder.py0000644000175000001440000000335012257506326016232 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library # $Id$ # # this demo script illustrates how a 1-bit BitmapImage can be used # as a dynamically updated overlay # try: from tkinter import * except ImportError: from Tkinter import * from PIL import Image, ImageTk import sys # # an image viewer class UI(Frame): def __init__(self, master, im, value = 128): Frame.__init__(self, master) self.image = im self.value = value self.canvas = Canvas(self, width=im.size[0], height=im.size[1]) self.backdrop = ImageTk.PhotoImage(im) self.canvas.create_image(0, 0, image=self.backdrop, anchor=NW) self.canvas.pack() scale = Scale(self, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.update, length=256) scale.set(value) scale.bind("", self.redraw) scale.pack() # uncomment the following line for instant feedback (might # be too slow on some platforms) # self.redraw() def update(self, value): self.value = eval(value) self.redraw() def redraw(self, event = None): # create overlay (note the explicit conversion to mode "1") im = self.image.point(lambda v,t=self.value: v>=t, "1") self.overlay = ImageTk.BitmapImage(im, foreground="green") # update canvas self.canvas.delete("overlay") self.canvas.create_image(0, 0, image=self.overlay, anchor=NW, tags="overlay") # -------------------------------------------------------------------- # main root = Tk() im = Image.open(sys.argv[1]) if im.mode != "L": im = im.convert("L") # im.thumbnail((320,200)) UI(root, im).pack() root.mainloop() pillow-2.3.0/Scripts/pilfile.py0000644000175000001440000000503712257506326015337 0ustar dokousers#!/usr/bin/env python # # The Python Imaging Library. # $Id$ # # a utility to identify image files # # this script identifies image files, extracting size and # pixel mode information for known file formats. Note that # you don't need the PIL C extension to use this module. # # History: # 0.0 1995-09-01 fl Created # 0.1 1996-05-18 fl Modified options, added debugging mode # 0.2 1996-12-29 fl Added verify mode # 0.3 1999-06-05 fl Don't mess up on class exceptions (1.5.2 and later) # 0.4 2003-09-30 fl Expand wildcards on Windows; robustness tweaks # from __future__ import print_function import site import getopt, glob, sys from PIL import Image if len(sys.argv) == 1: print("PIL File 0.4/2003-09-30 -- identify image files") print("Usage: pilfile [option] files...") print("Options:") print(" -f list supported file formats") print(" -i show associated info and tile data") print(" -v verify file headers") print(" -q quiet, don't warn for unidentified/missing/broken files") sys.exit(1) try: opt, args = getopt.getopt(sys.argv[1:], "fqivD") except getopt.error as v: print(v) sys.exit(1) verbose = quiet = verify = 0 for o, a in opt: if o == "-f": Image.init() id = sorted(Image.ID) print("Supported formats:") for i in id: print(i, end=' ') sys.exit(1) elif o == "-i": verbose = 1 elif o == "-q": quiet = 1 elif o == "-v": verify = 1 elif o == "-D": Image.DEBUG = Image.DEBUG + 1 def globfix(files): # expand wildcards where necessary if sys.platform == "win32": out = [] for file in files: if glob.has_magic(file): out.extend(glob.glob(file)) else: out.append(file) return out return files for file in globfix(args): try: im = Image.open(file) print("%s:" % file, im.format, "%dx%d" % im.size, im.mode, end=' ') if verbose: print(im.info, im.tile, end=' ') print() if verify: try: im.verify() except: if not quiet: print("failed to verify image", end=' ') print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) except IOError as v: if not quiet: print(file, "failed:", v) except: import traceback if not quiet: print(file, "failed:", "unexpected error") traceback.print_exc(file=sys.stdout) pillow-2.3.0/Images/0000755000175000001440000000000012274164154013110 5ustar dokouserspillow-2.3.0/Images/lena.xpm0000644000175000001440000004231112257506326014560 0ustar dokousers/* XPM */ static char * lena_xpm[] = { "128 128 44 1", " c None", ". c #CC9966", "+ c #663333", "@ c #996666", "# c #CC6666", "$ c #CC9999", "% c #FFCC99", "& c #996633", "* c #FF9966", "= c #663366", "- c #FFCCCC", "; c #CCCC99", "> c #FF9999", ", c #993333", "' c #333333", ") c #CCCCCC", "! c #996699", "~ c #CC6633", "{ c #666666", "] c #999999", "^ c #666699", "/ c #330000", "( c #663300", "_ c #330033", ": c #999966", "< c #FFFFCC", "[ c #333366", "} c #660033", "| c #CC99CC", "1 c #9999CC", "2 c #660000", "3 c #FFFFFF", "4 c #CCCC66", "5 c #FFCC66", "6 c #666633", "7 c #993366", "8 c #FFFF99", "9 c #993300", "0 c #333300", "a c #FF99CC", "b c #CCCCFF", "c c #CC9933", "d c #CC6699", "e c #000000", ".....*...*.%*..#&@#&@&#&#&#.&#.#.#.#.#.#..#.*.#...#..#.#.#.#..#..#..#..#..#.#.#@#.>..>...*..*...*....%%%%.&&.@.#.@.#..&#.~.#&#$.", ">%*..*.*..*%.*.&#@&#@#&#&#&#*&.#.#.#.#.*#..#&.~.#.#.#.&.#.#.#.#.#.#&.#..#&.@.@&#&#.>.*.*...*..*..*...%%%%%&&~@#&#.@&##.&#.#.@.>@", "...>...*.*.>.%*&#,&#&#&@&#.&#.#.#.#.~.#.#.~.>.#.#..~.#*.~.&*.#.*&*.#..#&.#.##.#@&#.$.>.>.*..*..*.....%%;%%@&@.#.@.#..&#..&#.#@+(", ".*...*...%*.*.>&&@@#@&##&#.#&#.~.#.#.#.#.##.#&*.~.#..#.#.#.#.#.#.#.#~.#.#.#&.#&@#&#.>.....*..*..*.*...%%%%%&.&@.#&#.#.#.#$.$&+++", "..>.*.*.*.%.>.~&#&#&#.@&#&#&.#.#.#..#.~.~.*.~>&>.#.#*.#.#.~.~.#.#.~.#.*&*.#.#.#.#&#..>.>*..>..*.......%%<%%$&#.#&$&#.&#.&>@,++2+", ".*.%...%*.*..*.#&@#@&##&#&#&#&#.&.#*.#.#.#.#*.~*#.~.#~.~*#.#*#.*.#.#.#.#&.#.#.#&@.##.*..%*..*..*>.*.....%%%%&&&.#~.#.#.#.$&+++++", "..>.*.*.%*.*..*#&,&#@&#&#&#.#.~#.~.&>.~.~#*&#~#.~>#.~$~$&.~..#.#~.~.~.#.#.#.#&$#&#&$.>.>..%*.>....*.....%%%-.@#&.#&#.#.$$,++++++", "..*.*%.*%.*.>..#&@#&##&#&#&#&.#.#.#.~.#.*.#.*.~.~.#.#.~.##&#.~.#.##.#*&*~.#.#&#.@#&>.>%.*>.%..*.>..*.*..%%%%%&&&.#.&#&#.@++++'=+", ".*...*.*.*.*.*.~#@&#@&#&#&.#~.#&*&*&#.~#.~*#~#.#*#.~.#&>..#.#.#...#.#.#.#.#..#.#&#.#..>...*.*..%*..>...>.%<%-%@.&#.#.$@@++++++=+", ".%.*%.%*.%.*.*.&&,&#&#@&#&#.#&.#&*#.~.*.#..#.*~.#.##..#&..&*&#.##.~.#~.#~.#~#.#.@#@.#..>.>..*.*..>.*.*....%%%%.&&#.#&$,++++=+='+", "*>.*.*..**..*>.#,@#@#&#&##&#&#*&>&*#.#~.#~.#.#.#*#.&#&.#@#.@..#..@.#..#.#~..#.#&#&#.>.>...*.$..*.*...*.*.>%%%-%&&@&$#@++/++'++=+", "..%*.%*...*.*.*&,&#&@#&#&&#.#.#.#&.~#.#.#.~.#.#..#$#$.$...$&@.@.#.@.##.#.##.##.#.@#.#..*.>.%*.>...>.#.#....%%<-.&#.@&+++=+=+=+=+", "*.*.*.*.*%*.*.*&#,@#&##&##&~#&*&*#*&*&*&*@.#.~.#$..$.$.-$%$-%$.@.@.&..#*#.#*&#&##&#.#.>...*....*>.*.*.*.~..%%%%%@@.@++++++=+=++=", "%..%*..*.*.*..*&&&,@#&##&#.#.#.#.#.#.#.#.#.#.#..@>@.$$$;$%$.$-$%$.#@.#..#.##.##.#@&#$.>.>.>.*>.....*.~.*....%<%<.$+++/+=+=++=/++", "*.*..~.~.%*.*.*# #&,&#&#&#~.#~.~#.#*&*#..@.#.$.$$.$.$;$;$%$%$-.$.&@#.#~.##.#&##.#.#....*...*.>*.#..#.~....<%%-&+++++'=+[++=++", ".%*.*.&*.*%*.*. @#&#&#.#&#.##.~.#.#..>.#.$&#$@.$$:$$;$;$;$;-;-$.@&#$#.#&###&@.#..#.>..>.>..~..*#*.*.~...%%<-@+++=++=++=++=+", "*.%*&,&*.*.*.* @#&##&#.~&*&>~.#.>@#&.@#.@$.@$.$.$.$;$;%-;.)%-%$&@.##.#.@.##&#.>.*.#.#.*&*.*.*.#.#..*...-%-+++/+{++_++=+}+", "*.>.~&~..%*.*. &#&#&#&#.##&.#~#&*&##.@.#&$#.@.$.$;$.%).;-;$;$)%$&@&@#.##,@@.#..>.>..>.>.~.*.#.#>.>.#.*.-$+/+=+=+=++=+=+_+", ".*.&#(#.**.%*. @#&#&##.#&*#.#..##.#&#@.$.$@>$$.$.$%]%;$;;-;)%)%--&@&@&#&#&##.#..*.#.#..>..~.*..#.*...#..++='+++=++=+'+++@", "%.#&~&~..*c*.* #@&#&#&#.#&*&#*#.&#.#.#@##.&.@.$$.$%$$;$%]%)$;$;-<-%@&@$&##@&#.>.>.#.#&#.*.*.*.>*.~.*..>++++=+=++'=+++=++$", "*.~&,&#.*%.*.*. &#@#&#.#&#.#.#.#&#&#&@.#..@$#.#.@.$.]%;-;-;$;$;-;)--<$@#&,@&##.*.*.>.#&#&$..*.#.*.#.*$.$&++/+++='=+}+=++@$$", ".#@&,&#.*.*%*.*& @&#&#@&#.#.#.~&*.#&#.##&@@.#.@.#.$.$.$.$%$;$)-3))-;;-;-&@@@#@#&#.>.*.#.@(,$#...*#.**.*..@++++!'+}+=+=+@+@@$.", ".&,&#&&>.*..*.#&#@,&#@&#&#&#&#&#.#.##&#&#.#.#&$.#.$.@.$.$$-$;$$%)%-;-;3;)<-)&@&@&,#.~.*>.>#&,+.@**.*.~>.#.>.+++'+++=+=+=++@@@.$.", "&#&#&,#..*%*.*.,&,@@#@#&##&#.#&#&#.&~#.##&#&#.#$.#.>.#.$.;.$$;-;-)-);)-)<)%3-++@@&@#.*.*..>@,+@@..#*.*~**.>+++_+='++=+=+=++@.$..", "&,@,&@&>.*.%.>.#&+&#&@&#&#&#&#.#.#.#&#~.#.#.$&#.#..#.$.$.$$.-;--)%)););););-<-&+,@~@*.**>.#&+2+@>*.*#.*.#>&2+++=++=++_+++@@$$...", "&#&@,#&>.%**.*.&,@,&@#&@@#&#.#&#.~#.#&#&#&#&#.@.#.$.@.@.$.$;-$-;-;-)-;-);-);-)-$+@&#.*..*.>@++++@.#.**.>*$,+/=+=++'=+'+=+@$$.$..", "@,#&@&#.*..%.>.#&@@,@##&#&##&#.#.#&#&#&#.##.#.$.$.#..#.@$.--;%)$-)%));)<))<)-<)%@+@.#.**.>.#++++#@.>&#.>.@++++=+'+++=+++@$.@..-.", "@&@,&,&>..**.*.#&,&#&@&@#&#&#.#&>&#&#.#&#.#.#.#.#.>@.@.$%).-$;-;$-;-%)-)%)-;)%)-$+@&.*..*.#@+++++.@...$.#++}=+=+=+=+++++$$$.$...", ",#@,@&#..*...>&#@+&@,@#&#&#.#&#&%#&.#&##.#.#.#.#...#&$.-.-;$;$-;)-))-;-;-;)-;3;3-@@&$.*.*.>&++++/@.-%%$$+++++++=+'+=+++$.$..$.$.", "@,&#@,&#%.%*.*.&,@,&#&#&#&#&#.#.>&#&#.#&#&#.#.@.#@@..$%$%$.-;$;-;-;-;--)--;)-;);-$(#..*.>.>@++/++--;-<<)/'+[+=+++=++'+@$&$.$%.$.", "@,@&,&..*.*%..>&,&@@,@#@#&#&#&#%>&#&#.#.#.#.#.#..&@.$%$%]%).-;$;-;$)%$;-%)-;))<)3-@@...*..#@++=@-)%)%)-<{+[++{+=+='}+@:$.$..$.>.", "@&#@#,&#.%.*.*.&,@,@&&#&@#&#.#&%>&#&#&#&#.#.#.@>&#.$%$.-.$;$;-;$;$;-)--)-;-)%);)))%@..*.*..@++]-]$<);<)-]'='=++++=@++$.$..$..$.$", "#&,&#&#.**%.%*#&,&&##&#&#&##&&#%.#&#&#&>&#&.#..#&-*$.$.-$-.)$.-$;$-.;-;.-)%;);-;-)).$...*>&&+$)$))--;)%)$+'+=+=++'}'$$$.$.%$....", "#&@#,~&*...*..*&@,@&&#&##&#.#&.%*&#&#.#.#.#.&#.&.>%.$.$.;-$%$).-$;-$;--);$);-);)-))-$.>..~@.%;;-;));-;3-{+'+++=+=++@@$$..$...$$.", "@&#&##&*.*5.%*.#,&@,&#&#&##&#&>%#&#~@#&#@.##.@.>..#.$%$-$.).$;$;%$;-.;-%)%$;-;-;);-;%$....%--$3)-;-));-)++=+[+/++/+@$.$$..$%>..>", "~@#&,&#*.%*.*.*&@,&#&#&#&#&#@&%.#&#&~.#&#.&#.#..>.$.%$.%$.-;$.$$%$.-;$.$;$;$;-;-)$)-%$.$-%-;%;-;-)-;-3%)'+'++=+=++@$$$.%$..$..$.", "@&###&#.*.5.%.>&,@@&#&#,&#@~&#%..~#&#&#&#$&#..>..#.>$.$.$%$.-;%.-.$%$%)%$;-)%$);%).]%-%%$.-;-);-)%)%;-3-+'=+_++++@$$.$.$..$.>..$", "~@&#~#&*..%**.*.,(#,&#&##&#&#&%.>.*&#&#.#.#.#.#..#...$.-.$.$..$.%;$.%$.-;$%)$;$$;$;-;$)%-;-$%)-;-;-)-;-]++'+'=+++@.$$.$.>...$.>.", "#&#&,&#.*..%.*.#@@&@&#&#&##&#&-%..#.#&#&#.#.$..#.$.>.$.$.-;%$%.-..$;.).$%$-.-$;$;$;$;$;-);-;)-;-)%$%)%-{+_=+=+'+@$$..$.%$.>..$.$", ",@&##,~*.5*%*.*&,@,##&,&#&#@&~%.**.~&#&#&#.#.#..>.$.$%$.$.$.$.$.$%$.$%$%$;$:-$-.$%$;-;-;$)-)%)-;-$:$.)-+'+'=+++@@.$.$.$...$.>.>.", "&#,&#&#.*..%.*.#,&@&#&#&#&#&#&%..*&*#&#&>$.#$.#..$.#.$.-$.-.-..-..$%$.-$;-$$%]$;-;%)%))););$)%)%-.$@;$$++=++=++@$.$.$..$%.$..$.$", "@&#&#&#..*.*.*.&@,@#&#&,#&#&&#%.*.*.&#.#.#.#&$.#.>.$.$.$.$$.$$$.$$$%$$%$.$;$$.$$;$%$;)%)-);-;-;-.).$$-'+'+='+'@@.$..-.>.$...$...", "&#@,#~#*.%5%.%*#+,&@,#&#&##&#.%*.*.*~&#.>@#.>..#&$.#$$$$$.$$@@$$$.$$$$:$$-.$;-;-%;)%)$;);-)-;--$;@.@;-++=+=+++@$.$.$..$..>$..$>.", ",&#&#&&*.*.*.*.~@@,&#&#&#&#&,.%%..*..#.#.#.#.>.#.$#..$&@@@@@$$@$-$$]-$$+.{$%-$;-%$;-;-;-)-;--;-.$@:@-$/++_+=++@$.$..$.$.$..$..$.", "@&#,##~.*.%.%*>&,@@,&#,&#&#&,.*.*.**.&#.#$#$.#.@*@.$>@$$@@@+$)@!]+@@@++{+$;$:-%]%)%$;-);;--;-%$@&+@%-+'+=++++@$$.$.>.%.$.$..$..$", "&#&&#&#*..5*..*&,@,@&#&#,#&#&&%%%*.*.#.#&#.#.$.#.$#.@$@@@{!@!@!+=$=@'+++@$$-$%-;)-;).)%-%)%$.@&@&$%)+++'+==++.$.$%$.$$.$.%$.$...", "#&#@~#..*.*%%*.#@+#@#&#&&#&,&~%%5*.~.~&#.$#$&#..#.$#$@$@!@={=!!@[@[@=e+)$;-;);$%;$-;-);$<$&@6+@&]$-(++++=++++$$.$.$%.$..$....$..", "&#&#&##*.%..*..~#+&#&,###&#&#(%%%...>&@#.#.#.#.@>.@#$@@+@+=+!{=!!=+!++)@-]%$%)%$;)$;$%)%@]&@&@.$.)+++'++=+=+@$.$%.$.$.-.$.$$..$.", "@#&##&#.**%.%*.#&,@,@&#&,#&#&#.%5....#@>#$&#.$#.$$@$@=!==+=]!_+=@[+{+$$)%$);$;;-$-;---@@@@.:%.-$-++++=+=+++@$.#.$.%.$.$.$.$.$$.$", "&&#&#~#...5*%*.&,@,@#@#&#&#&&,&%%%%..@.$.,.#@&$@,$@+}@='=/={+=]!_!/!$]%$;).-$;$;)-$;.@{@@$-$..%%+/'++=+'=++@$$.%..$.%..$%$.$.$.$", "#&#&#&#**.*..**#@,&@,@#@#&##.#&%%%..#$##&#.&$.$$+@+!@=+!={=+={=@@_]$@-;$%$;$;$;$;-.$(+@${@:%.--+++++=+=++++@..$.$%.$.$%$.$.$.$$.", "#&###&#.%.%*%...,@,#&#&,#&,&#&#&%%%.&..#$#.>@#@@@@=@=+=!+_'+=+='!!{@)$--;$;$;$%;$)%]&@@@$@$$%.(+++++'+_+=+@$.$%..$%.$..$.%$.$..$", "#&@&#,&**.%.*%*&,@&@,#@&#&#&#&&9%%.>.#@..@.@.@@@@@@=_=+=@_+=@@!+!]@$).;$.-.$;$;-;-%-.@@@@@:-@++++++=@+'+++@@@.$.%$..$..$.$.$.$.$", "#&##&###..*%.*.~@,+#@&###~#&#.#&.%%.&.,.#&#$@$@+=+@=+=^@[+++=++!@]@)$%).).)$.).-;$;%.+@@@$@.6+/++++++=+=+@$&$%..$.$.-.$..$..$...", "&#&#&,&*.%.%*%*#&,@&#,@&@&#&#~&#&-%#.#&#&>.@@@}+=+={!==@!+'+'+@+$1$)$%$.$$.-;-%;-%-%$@++=@]$+/+=+{=+=/+++@$$.$.%.%..$.%$.%$..$.$", "#&@##&#.*%*.....,@,@@&##,#&#&>&#&%%&#&.@.@>@@+!+='+==+![$!+++@@$]$-$;$;$%$.$;$%-;-%%%$++@+$]+++=+++++'+++$@$.$.$.$$%.$.$.$%.$...", "&#&#&,&#..%.%*>&,@(##@#&#&#&#.#&#->.&#&>&@++!+=+=+=+[=+=@++/@$$$$]$).$..$;$-%-;%-%;%.$@+}{$$+'+=+={+=+++@@$.$..$...$..%.$.$..$.$", "&#&##&#*.*%*...#&@,@&#@#&##.#~&#..-&#..#$@@++++^+==+^=@!'=/@$$$-$$$-;-.$.$%$%$%-%--%%#@+}@]$@++=++=+++++$@.$.$..$.$.$.$;..;.$...", "@&#@#,&...%.%*.#&@,@#&#&#&#~$~#.##%#.@.$@++!_=@={+=+=='=+@{@.$;$)&$%$.$.-$%$%-;%)%%%-%@+++@${+={=++=+++@$$.$..:.$.$:$.$.$$.$.$$.", "&@&#&,#*.*%*%*.&,@@&@#@##&#&#.&#&$@.@.#@+!++@'+=+'=+=+=@'@$:$.$%-:-$.$.%>%$-.-%%-;-%%>@@+/@$++=+={++'++@@$$.$%$.;..$..$..$.$:..$", "#&#@#&@....%.%>&#(@#@&#&#&#&##*#@&#.#$@@+@_!_=+{=+={==+/+@@$.$;$$$..$%>.$>%$%-;.-%%)%-$+}+@)@++={+=++++$..$;$...$$..$:@.$:$.$$$.", "@&#&#~##..*%.*.&@@,&#@#@##~#.&#.>++&$.@+=+=@=+=++++='+^+]@-;-..-%$@&&#.>%>-.$%-;-)%%%$#++++-@+@+=+[+++@$@.$..$;..$.$.$.@.$$.@.$$", "&#@,@,&*.%..%%>~@(@@&#&#&@&##.*.#+2$@@@+!=^!'={+_+=@!@_+@:-.).;-.$.$.,(#.>$%$%%%$;-%.@@++++%@+=+{+=+++@$$.$....$;.$:.$.$.$.$$@.@", "@&&#&#@#.*%.*..&#@,@#&#&#~#&#&>.$@(@@@+@++=!+=+'@/=/@+'$@)$%$.-&@$$$.$&,&#.>.$;%%$@@&@#@+++]$++=+=+'++.@.$%$.$..$%.$.$.$:$$$:$@$", "##&#@9&..*%*%%*.,+#&#&#&#&@&>..>.$@++!=^!!/^+^+=1'+=++@:-.;-$%@@@+++++$.#.>.%%-;-$@+++@++++$@@++=+=++@$@.$.$..$..$$.$.$.$.$.@$:$", "&#&#&#,>...%.*..&,@,&#&&#&#..$..$+@+=@!@^]=@=+'+_!'+0+$.$;-%-+(+,++@@2+#.#*>.%-;@+++++}+++{$@@+++'+++@..$.$.$..$...$.$.$.$$$$$@$", "&,@,@(&.**%*.%*&,@,@&#,.,&#-.$.@$++^+^_=!@_'+==/^+_++@:.-.-%+@,++@++--(@~.#.>%%$++@@a+++=++$]@=+==+++.@$.$.$.$.$.>$.$.$$.@.:@@.@", "#&#&#,,...*%.*..@,&##&#&#@+,$$$(+/@=+=!+^1+[+'+='=+'+@$$.%-&@&,&@+@@$-#@#&#..)%6@+@@$7++++@@$@@++=+++$..$.$.$..$..$.$.$.$.@.$:$.", "@&#@,&@#.%.%*%.~#,&#&@.,+&@--%+++{!'=!=^+!+==+=+=+'+$..$;-&&$$@@&$.--%.$~#*.>%-@.$#$$,@+++!{$@@+=+'+@:$.$.$.$.$.$..$.$.@$:$.@..;", "#@#&@,&#.*5.%*..&@#&##.+#$$$@++@@'}'={=!!!'/'=+'=+++@-$%-&@...*$#$@&@$-.#.#.$%;$.$.@,+@}++@@|{++++++@$.$.$..$....$.@.$.@.@.;.%%%", "#&@,@,&#.*%*%.*.,,&#&#$#$$+@=+'+1$!==^={$1+=++=++/+$]$.-&&*#>.$.$.$.-.#.>.#*$-%-$.##@#@++++@$@+=+=+@.@...$.$.$.$.$.$.@.$.$.$%;.%", ",@#&,+,.>.%*%.*.&#&#.@&$@!+!+==@!{^'==!!!!{+='/='+@@$--#&#...>.>.$.$.$%#*#.*$%-.$.$.#$,@+++@$@@++++@$.-$..$.$.$....$.:@&$%%%%%.%", "@&+@,&+...%.*%.#,#,@##$#$$|={={^{!+_=]={@$!+++=+++@$$%$&@.#*>.>%$%%$%$..>.#.>%--.*>##@@+}+{+|$+++++@....$..$...$.$.@.@.;%.;%.;5%", "@,&,@+,#.*%*%.*.&,&#.$@$+=+='=!+!{[='==!^/@!'++/+@]$--(,#.~.*..>.>.%$%>.*#*#$%-%$...>##+++++$]+++++$@.$..$.$$.$.@:$...$.-%.%%.;%", "@,@+,&+...*%*%.~#&,@@#$+!@^=!'!1'_+==+=+++]@+=+++$$$)++&#&>~>.>%%%$%..$.*.#..---..>.#$#+++++-$++++@.$...$...$.@...@.@.%;%%;%%%%%", "@+@@,+,@>%..%*..,#&#&@@$!{=!==!{=='+[+{=++$@@'/+$&--@+/@~#*~.>.$>%.%>.>.>*#~$%%-.>.#.#@,++++$$++++@$.$..$.$.$.:$.$.:..%%.%;.;%;%", ",@(+,+&#..*%.%*&,@#@@$$+@!]={^@!{+=='_++++$@$@+/@$-)+/@@#.~**.>..>%$%..*#.~.#$-%...>$#++7+++1$++++@.$.%..$.@.$.@.$&$.;%%4%%%%;%%", "+,@@+,+&>.%*.*..&@&#$$+!@^===!1]|'+=+}{@+@$$+++]@%$+++/&###~#..>...>.>..#*#..%--.>..>@,+++++$$++++$.$.$...$.$.:$.@...%.%.%4;%%;-", "@@+,+,+..*.%*%*#,,@@@$@+!{={1{=$=/'+=+@+]@+@/'/$@%@'++@@~*~**>.$*>%..$*.~.#*@.-<..$#.@+++!+/$$@++@$....$...$.$.@.@.$%%454%%%;-%)", ",@+@,++#$%*%.%..,@.#@@@=@!==!=^][+='/=@$@.++++$@:$+/+/@+@#*#*.*$..>.>..##*.#..--...>@,}++@+/$$$+(@@$.$..$.$.$.$.$@..%%%%4%;%;%)%", "@,@++(,....*%*..#,@@@$+@!{=@^+!!{|+={++=+@+/+@;$-@+'++@,#&*#.#.>*>.%>*#.*#.#.$%-.>.@$+++=++++$$/+.$.$.$..$.$:$...@.%%.4%%%;%%;%;", ",@,@,@+.>.%..%*&&&,@@@@!@=_!='!!]1+={}'+!++++$-$]+/+++@@&#*~*>.>.>.>.$*.#&#&#&>.*..#@+=++++++$$+&$..$.$.$.$.@.$.$..;%%%4;%%;%-%%", "@,@,+&@...%*%*.>#+#@$@+!+=]=!=]!|!'+!@/++/@@@$6-++=+/+#@~#.#*~>*.#*.*.>.*..#.$%$.>$@+}+=@++++-@+@.$.>.$..@..$:@.@..%%4%%%;%;%;;%", "@+@@+,@.$*.%.%..&+&#@$+{!@=_{=!!{!!'@^++!@$$@@$+'+++++#@$~#*#.#.>.>>.>.#.>.%%-%$..#@++++!+@+($$@#.$.$..$.$.$..$..$.%%%;%;%%;-;-;", ",@,+@+#..%.*%*.##,@@$@!+!{==={={=1@={@/+]$$$@@@+++=@++@&#.~*~**.#...*..>..>-.%>.>$.++=++@+++/$.@...$.$..$..@.$.@..%%.%5%;%;-%<%;", "++@+,+@.>.%.*%..&@@#@$+@!+!'==!!^!1+@'+@@$-@@]+++@++++#+##.#.#*.*.>.>.*.>..%$%%$.$@/+=+7@@++($@@$.$...$.@.:$.:.@..%%%;%<%%<;%-;%", "+,@+@,&$..*%.*.#&,@@@!+!+[=@^@[+^={|++.)$-+@$++{+=+!+++&#.~***#.#*.~.#..*$*>%$.$#@+++++=+@,++@:....$.$..$.$.@.$.@.%%%5;%;;%;%;-<", "++,++@,.>%.%%%.#&@#@$@=+!'===!{=^!!{@)@-%@@@+/+@}++++++@##.#~.**.#&#.~#.#&.#.,&@>$++++++}@++(@@@.$....$...$..@....%%%%%%%%;-<%;%", "+++@+@&$..*%*%*.@$,@@@@=+={^'|!{!!{+@$&3$&]$++=+++=+=+,+&#~.#*#.*>*~#.~~>&#.>$.$$}+}'+=+@@+@+&$.$..$..$.@.$:$.]@&%%;%4%;%;%<-;%<", "@++++@&>..%*.%.#&$+$@@'=+_=@=]=!^!={]$$;@$$++'/=+++@+++@@&#~.~.#.#.*#*#.*>%-*#$>@+++++++}@2@+&$.$..$..$:.$..$..$&%%%%%<%<%;%%;%%", "++7+,+@..>.%%*..#+@@d+@='='=^@[@^^@!$]$$@-+++++++=++=+@,,@~@~#*~.*>.~.#*#.>.>.>@+_+=+++@+@+@2+$..$..$..$.$:@:$@:@;%;8%;%;%-;%;%;", "=++++@&#.%.*%>..,@$@@+!+=$[@b{!{=^!]@$$$-+@+}{=+++++@++@,@#&#.#.#.#*#*#.#~##$#$,+=++{++@7@}@++.$..$..$.$.$.$.$.@.%%%%;%<%;%)%%%%", "+++++#@..*%.%*..@,$@@+!'_=='|^@1!+1@@{$-@++=++++++=+{+@++&#&#&>.#*.>..#.>..>.>@@/=+++++@+@+@++.$...$..$.$.$@:$@:@;%<%%<%%<%%;%;%", "+=++@@@#..*%.%>.@+@@+@@='@[=$^!]!^+1$+]$+++++=+=++++=+++++,#&##.#.#.>*.>.>$%$.++=+[+{++@+#+#++$.$..$.$.$:$.$$$.@&;<%;%;;%-<%%%%%", "+++++@..>.%*%..#@,@@=+^+=^+^]='1|]=]$@@+=+=++'+++++=+'+++&+,,&#.#....>.>%$.>$#(++=+++++@@+7@@(-.$.$..@.$.$@:@$@].-%;<%<%;%%)%;%%", "+=}++@@...%.*%*.@+@+++!+'='_!]={!!]!!{!+'=+=+='@+++++=@+++(+(,#&#.#>..%.>%$.$@+++'={'++@+@+@@+.$..$:$.@$.$.$.@:@:%<%;%%<%;%%%%..", "+++++#@#.*.%*%.#+@$@=@==+='=]|={!^|{|$1@_+'}{@}@_+'+=+++@+#+,+,(#&&#.#>.%$.$.@++=++++++@!@+#++%$&@.@.$.]$$@$]@$&.;%%4%;%%%-$$+++", "++++++&$>.>..*..@-+$+'@={=+{!]=={!^!]!{)!'=++=+@+=+++=+=++++&#.#.#.>...$*.$%$.@+'='@{=+@+!+@@($.@.@&$@.@.@.$.@]@%%<%%%%;%;.(++++", "++++}@,&$%*%*$*.-++===+=+=+_{|]=[!$^@^!+]@'=@++=+++=+'+@++,@#@#$#.#.>.*.$..$%$;-@+'++++!@@@+@($.&@.@.@@@.]@@.@&$;%%4%8%%%.@++++@", "@@+++++#.>.%.%>.+@]++_{='!{+[@^@|]^!^@^|]!++='+@=+'=++=++++@@#.#.#.#.#..>.$.-%----]/'++++7@+@+.$.$&$&@&@@&@@@@@&%;%%%%%;$&(++@@@", "@!@@+@+&..**%*..@++='+=@_+^@='|^!!{^@1@^$+1+@+=+++++=++=@++,@#.#.#.>..>...%.-.-;-)--+++@+@@+,@.@.$.@.$@.@@&@&$&@%;%;%;%.&+(@,+@,", "$]@@@++,.$%..%>.$@++_+|{=]+^+={={==!{!]!{={{=++=+=+'=++++@+@&#$##.#.#.~.>.$.%%$%%)%3;@'+++@++@$.@.$.$.@.@@@&@&@&%4%%%%$(+(@&@,@@", "@$$$@@2@.*.*%*..$@+=+_+=@_@'!{=$={'!^$!]=$_$+'/@=+=++'=++@+,@.#..#.*.>..*.%%$%.;$%;-%-$+{+@++.$.$.@.@.@$&$@&$.@&%%<;%%@(@@@+&@&@", "{$]$@@+@$%.%*.>.@)/'={=+='=+=+[{==!{!{1@1+)=+=+{+'+=@+++@@++#.##.#.#..#..>...$%%;%-;%<)@++@++$$.$.:$.$.$@.@@&$&%;%%%;.@(@&#@#@,@", "+@|$$@(,..>%*%..@@+/=+='=+{='=+={[+=!!]|]!+{$+/=+=++=++@@@#(@#&$*.#.*#.*..%.%.%-%;%;-%--{++++$.$.$@.@$@.$#.@.&$%%%;%%@(@@,@.@&&&", "'@]$$@++...%.%*.$@+=/!+=+=@=+_{==@^{+^!@|{=|)=++{+=+{+}+@@@(,.#.#.*>.*.>.>..-..%$%-;%<;--+@++.@$..:$..$.@.@.#..%%%%%.&,@&@#@,@#@", "++]$$$+&.*%*%*.$$+'=+[='_'$'='_@^{!!!{!]|'=@-+/!+=++=+++#@#2@.#.#.#.~>.*..>..%$%;%;%-;-%)++++$..$..@$@.@$.@&..%%%<%%$&@&#@@&@&&@", "''$]$@++$%.%.%*.$++'=+=+=@!'+=+='=+{!'!1!@={|'+@{=+++++@@@&2&#.#*~.*..#.>.%$..%.%$;%%;-<-)++($.@.$...$@.@.@.$%%%%%%.&&,@&##@#@@@", "++!$$$(+..*%*...@+_@_+[+[@@_{='=+[={!=@^$^@!{+_+++=++++#&#@(#.#..#*#.*.*.>..%$.-.%-;-%)-;3/0@@...@.$@.$@.@..%%%;%%%$&#&#@&@,@@#&", "''])$@(+..%.%*..@'+'+[+=@[++=+=+='+=]=!]|]!@^++=++@++++@#.#,~.*#*..#*#.#..>.$%.%$;%-%;-<--@+@.$..$...@.@$&@%<%%%%%%&&&#&#@,@&@@@", "/+@]$$+($.%*%%*.@@==/='=+]='+'='=+^='!{|=]|$@{++=+++},@#.@(&##..~**..#*.>.>.>.$%.-;%)%--;-)(]..@..@$.$.@.@:%;%4%%%$&#&&#.&#@@@+@", "''!)$]+,..%..*..$++'+=+[+!@_!+_+='!+=@!1$_'[+=]$@=+++@@#.>,&&*#.#.~*#.*#.>.$.%$.-.-;-;-;-<$+&]..$..@.@:@.@.%%%%<%*.&&#&#@,&@,@@@", "++{$$$@($.*%*%.>@'+=+'=+'='+'=+'=+^'^^@^@1+=+++@+@@++&#@.#(##.#*.*$*.#.*#*.*$..%.%%%-;-;-;-(@.$..@.$:$$.@...%%8%%.#.&&#&@@#@@@,@", "_/!]$]@+.>%.%*..$++=++{=++=+=+=+{=+^+^]1+^@'/={++++2+#&#@#+&#.*.#.~.**#*.>.*..$..$;%%-<-%)-:$.@.$..$@.@:@...%.%%%.~#&#&@,@@@+@@@", "+'+$]$+&&.*%*%.>$@+'+=+'={={+=+=+[+^='!^+^@|'++=++++@&#..#&#.#*.*.#*#.*.#*.>.%.%.%.-;%);-<--:@.@&$.$$].$&.....%%%.&#&@,&@,@#@@+@", "_+{$$]@+$..%.*..$@}'++='+=+='='+!'_$!'={[@^@=++/++++#@##@2&#.#*#.*.*.~>~.*..>..$..%$%-%-)%-<@&@&@&@.@$@.$....4%%.#&,&@,@&@@+@@@+", "+/=]$$&&&>%*.%..@@+=+'}=+{=++=+_=@!{!={=={!+'_{+=+++#&$*@(#.#.>.*#.#.*.#.#*...%.%.%.;-;-;-;-.@&+(@@@@@@$...&.%%%.@&@,&@@@@@&@@++", "+'+]$)@+...*%*..@++'=+'='=+[+='+'_+^$|{!]='=++=+/++@#.##2&#.#.*#*.*.*#.**.*.>*.$.$%$%;-%<--<$6@&@&+({(@+&$..%%%..,+&@,@@,@@@@@++", "+++$$).(..%*%.%.@=+++=++='={+=+==+=={|!^@=+^/=+/+++#@#&,(#.#.*#.*#.*#*.#.#*...*.%..%$%;-;-%--&@@@@@++++(+%%.%%%.@(@+@&@@@+@@@+++", "{@{]$]$+&..*%*.&$@_'+'='+=+='=++='=+_{$^!{='=/+=++@#$#&2#.#.>.~*.*.*.#*#*.#.>.>..$%.%-%-;3;-%{&@&@@@@++(,%>.%<.&++,@+@@(@@@@@+@+", "@@@$$;$&@%%.%%.&$+++=+=+='=@=+[/=+='=!_@!{_++[+++@#@~,(,.#.#.*.~*#.**..*.*.*...*..$%.;-;-%-;-$@&@@&@@++(+.%-.>&(+@+@@@@+@@@@@@++", "+{@]$]$&&.*.*%%&@=+=+'='+='='=@='!+=+^@^+='=+/+++@@#(2,~#.#.#*#.*.~.#*~.#*#.#*.$*.$%$.%-;)%-<-6@@@@6@@+@&>%%$&+(+@+@@+@+@@@@{+@+", "@@@$$.]&@.%.%...@++'=+=+=+=++={}+!'!'=@1+=++++}+@(,(#~..~#.*.**~*.**.*>.*.~.*.>..>.%.-;%-;-%--+@&@@@@&@&#.>.&,&+@+@@@@+@@&@@++++", "+@{@)$$&..*%*%..{++=+{='='=^+!@='!+=]={!{='=++++,(#&&#~#.*##.#*.#.#*.*.~.#*.#.**...$%.$;%)%);-:@@@&@@@&@&..,@(@&+@@@@++@@@@@@+++", "+'@@$)$&@..%%%.#++_+=+=+!+=@[+=@={!_+={!@++++/+,@&.#*.*~#..~.#****.~.#*.*..*.*#.>>.%$%%$%)%----+6@@@&@@.##&~@#@+@@@+@+@@]@@++{++", "+++{$-)$..%*.%.@++++'+{='='@={=$=+!'^$_+^+_+++@$&#&~&~*.~#*#*.~.~.*.*.#*.#*#.*.*..>..$;%;-;;-;-+@&@@&$&#&&#&#&@@@@+@+@@.@@@+++++", "++'@)-.$&$.%%%%&+'=+==+=+=={=@={@[@='={!$@+++,@,.&.#*&~~.*&.#*#*#*~.*.*.*..*>.*>.>.%.%$;%)%--;-@&@&@@.@.#&#.#&@@+@+@@@@@@@++++!@", "++++-))$...>.%.@++_++{={'=@_+=+={=]+_@[/^@+@+@#@#.~.~*.~*#*#*.~.*.*.**.*.#*.*#.*.>.$..$;$%);--)$6@&@&#.@*&#.#@,@+@@+@@$@@@++++@@"}; pillow-2.3.0/Images/transparent.png0000644000175000001440000006365212257506326016175 0ustar dokousersPNG  IHDRsRGBbKGD pHYs  tIME !- IDATxi]gz&﷜sV+U$ER}mn7og 3`#/`00 q;8cݭn)Q EIbn]mo~*R@V[|/.R~{wy=-eݲ[vn-eݲo~xրܲ57w 7""ȕm,S*:!X萒g m˗5Kno ۋZkm`I]f,Ch\KP]Uy7Ni TbLׯ\Y8qU}Irށ7-|;U6fvmy~:D%fhscBYiLH)@9p=t>F&sJUͧnx w7 sl7S#vV~| op^JdJ!.:<%0{y(PD"QTaφptWW \Mn6Lc= 1P(DER*DD]XJC"cU5srJjCc|>UܮB/L/r=U IH;`l淐E7򭵂VWS}w=?~[=xdp "F}@ C)]0A(eaLF))4RZim;"z X?E'oד~@!ҹ>f3{.m:׷)HӜT52U*ĎH]Ir`p3'r,Ν{@F\vkkoEƏ1Ojn<]ԧ} F^{hs3~]4H)x04̻z JuBhA$A1"{D\JFv:ٝ&."n뇭d3dNU Gfa,+R<D-$ʫJj%tRAȋ =q뱷ʓNܣn%|Oh=}*˦xeGf?_i3g꺖41/QNI&-^Q`v *,*@D@Ģs/l? aEabOtz'MOiޗlvĊݻih!HD/ uHhJ.PWT$W! ·-H *gp;[K>G >$RB 6S\JWFu&qH1ca̒sR-"#Dd/ %D B3f5GOh#{_# _XXTV}LYFZ?Ί%JDh('h6Oc,lcR38xeBw-܅Noa44ZJKVPvmF;@Sm4%9D~>H)b `0E`I!츔6 HRĔ}!~~ӋR.AQDjw$&(Rʔj}ǹ&Zx됲Sʨ1|e{m3G{GO:,&nuB" ,i$#Mx rnZ} 9XRtIdPpޯ|~b'x gm\ޛ Bd$iP6@Y(8AD|&Qd3w\vdY[3gH 8p@`-{ e֪Ge"u{O/ ͥ0cž(x(usrjRL+`DRr bJ$HJy>ED@1H{a8p1lĥ>sxa 8%@$"THrfyw/8vqC>?C>!#AUWAfnjBiJUbҕ7u?4M )H!ffw{W+(N8۳ZVjYe yC$#YHf)YYx@ Yl/p#bsqb9ٞLW҈)Db*2TQNSd9Z#Z<Es'OswQzRJd9F-1ߐݏ!CJ!(d;ғOj~{fgVG tYc l*aDU!D*Ufs3M4"DP  1^ocJ쓆ͧ9pC qz{A{l=Hpvl[, rNU7ffl3%ubOlxXe:,+jh؏E[N>DNW=x-{J}Ҙ@sst?a 3V;2cu}=1E1_ɤwv\bTJpZR5CT,NDmcH[nggپX;M9kc\!*ZJ)i)x !~  ڀ*D8zTn~৩J @1&3Yh(׬:E4  E8:OE*^cP'~]BՓ/}䶣ʲGܨ:{%\))1D1ֱݮZ<۔gχ?Wݟ[6QZL,Dá 1RI),H7CfG Ѷ7t=.̡A>;k=)J  +򵭭O}SDKԇ"ŏ+RwHV#x)pC*B pP$AIB(|?eҏ|%@|c3+ΌͲ<#۲hkи#r|0לּW-a#{ "ߝz8~1 oLjN܇v|U^UիpxΝ?%>^{m$;; H^׷f~Hyܢtǁ{%:tD3UUV m5$JRew>sB1pI_7c bGwairR*_tu U T.Hj|ԕ~~O4Ո ID)WtsKD6 ǐ$Śjms9s{P>Zz"A!!"? lFJ5Z/̎7`Rrk7+50eYhJv{ɌF]=tQQ'Ee8x@IWilWۨ\ xIMhb{_ATǂwyd2[-nlЭ:qi;߻{qz(c V 9:B*axl:?HUv[ ##3JJR-YֶTuQ[[NRURU5F#æy{iYY%i~)DnCdF^:G `(Q|`yyi{{s!.ݑ(e=<=3 oX4 ҈s)zCshJkZMn}$F|$(y-\wN42br_|E. H AaI*w hg]BZ2˜x99,PӔivcβLY;;~Rlѧ&2O]d2B«wm7 fsfb!45 Rb@D㝇/z +s$?ƽEVf/=݃qo&ͤ!۞?x{A/dW7Ɯi/nV ~r͂]gL%׋?Pj3D%LwB$c4YcAdtCz ϯ0bMSgLYiLD5AטN[(6r(u=esьQvv)KYfBJ ""eLud2LcE7я_٩_!MBffMT^دTDKUw˜z#i:?4e0@01!9l C$nfLYFX'?ޓZL˩\_;Վt:t.v8ëM{!A,BwڤRRDC+xmtn``i  <UwE272,˔FU fA ,5pSQiYl7w B=HF?bmm%بÙ36̅Q AJ4 syB6-Ęw{3p<ۤ2[q -!I)I2Jϟnt겦>W|rg!{ mۦX8zRذ$JIMdyArʩA5ƶЮ2O'a ,%r!"HZkmNowT^ * AEҶ1 "b7 'KK=zB??g*sj[_\7p"ñ֐YQy:U*SbWohIm:]ʳLё#];vˋF<8Ͻ^N)Uѹ5s@2cfEYֆ9 ^9ѽ'(F)iB;xj@`DXsÊ4++^qx >eci=Q9Jj|$ zlL6N!(]{t+k24XFͫv IMY,>z[i3=C<>ssP>P9ucEpߵkβ]VkCc:]u,-8~|g*ieeNLvmk)U tJ䐒f敖s+AлB"-c)C V Z;ADe"Fi.*VuSкRE#4߳#\ :Ne14>5iJ<3N]pAf5wVyo(pw@7ZzT-"pBLQ1g妎$*Y 'T A'o|й%ka܄f"*iZa:uI^;'<֨i( `dlАU!,($&һwqzH1k"GznRM5m&r.4!XqsZJ 3r'(@>6?'x@Nr9qR7(̈<S .l# Ժz45AU!011Byzf "ysu`X"D"h-scB5P%j0pFu,]f5l+BBP2h?~ۿ=\ '2lŜVY8ݝd;BfGHLe ̰ѹ6R !1#H1-_O"<I"@7-r`bhEH8D P)*G:ԭYfXkfp&o7͒UƬdDY@yhƤ3",7_{gEѫjQEhe6~?'kooެsu6'D( 5 Erx;8nVz|+tkL(Hm LVֆwutRMqMnqFM+hHH0 XEx$ 4Dj4]ILnRʹhz9+j-Zt]k4R3P; jSJ$p6.}9?3 ~딞̏yqQEs1JTQ ŔЮ^ |"e~eI& Gv-~{Anܭv/%0@ H}Fʺ!F(׹]m`ۦcZdI,#!ܣzch] Aܫug Y/3##<38cĕ ~| xh!|hCJEYnbA[e{R/B{e($,S1(D9i3o h;v޶U[eĜZ4 nE1q+ݟb3@੧. %<'Yd7(<(S 4~9NyCĪn~v14D )ImLlHjg6Ԭ Q`DdC[1~ԤҰw8PhI?"G XaDG>ct_ StGp-D0R 15.)<')7Opc8; j-(fWXl81ƻJE.ڶ]m5-.8#t0@C(23${T̬@k=Ԣ/"04L>{Ufzn`? >!Pk3"E(˴seek#|uJsw޹`7i76sY6& spn@Kh]c佩N-^gK/z\U}HQ,[5p&#Xhhoqs>l4 VVPf9J I+hND0jȽÝ':(C?441Hnhg*oY29Մ&CsڑDm1]S%MB‰I'  )@Af#!7e{? |`Cuk~"ΌHogVj4 @w9RT̑Q$B SQeGrYҮ@'WOɓf0(K_ӧx4a&, D5bJǻ+߇NEٮy CfP! K sƠu<?kqmsuԻX51vqB*%{%Sm&H.Tf{i0vw]_tZ*N1c4 (!~|_5d Sy>FzP&bLs!vWK6bwWcssU@OvZ0{x8TˌX-b0b<.4Fs8挍9uw \㌢v kwD!Itq ga`GEΌAZHG?èE+\]__\Xlm_Y)"XOˋObe)J.LH\OiSRDu@y_{ge6SM%\B!堬59 ib۶핹ޑ#bLkL|9\񐛶;n` }YOmȻlG'A9׺VW8xРe\!1VV=ˤvw) (2Q"Qf dfh "KJU˲dmY̑&;;!noy)yq?;ًi++h|wAd2 P]ޗӧeg58)|W2XM55 ނcS]Z6gFc@wϧu, W%Ϙfwva43Qvj.FRb%U d-cƠόC Yy_*U_/٬+.?~=C7:!dJ%c+68YpƩ'gP"u^Go؃F|RjL brj|X[t㮻V`\ߐ$Z$ )G@¹ Tq܂(E`~ 4m"Z%67/BSR)%]P(ֈDB|~~ E* =[`^A"F fg$X\Z3?M!l]kuP'N9Xf;BM@ IIb/*d* 7I< t/_Ǚ;9;,.`@OAII}@э" hC!Ph*Qx߀+PJAJ YͲ'bkG^_Ȼ׀8+:t1×D(DX,  Ct;|o잟Ǚʼn/܅'Sq(!XF`7MkND$%&tfKD1.z/|!)1կy4XJLdzhjzでWC!"H!g6(ښbC9)2 iaxL qAxŸ)}F"3UBਔuS4Jшbh}JPJ[MGg~%@h h\uv):AXsd+0XWu~1 %bܳHM4FFs$j5ML4*}@]J(3R'yasX&ɟs0؝eR3{>|̫{(RС= (ts Lfi=?߳+Tߒn (1/c6210& H1ႄ`<JMùt/23:1PIp" >yB`$žN<$k(;3#D 覅 k1YM)m Ӑ,Gnrd>+t}@޳S1˂pǼ0\d-Eq>o-?$sfRy8n7ebsr2S/-YMڳZw-'_K;* k5 ŋXZk#G@N--A1MϙDF H!R ZkAVC9` CK"Vvnb5Ha]=C@.5{͟}m{XS H/aقF.rfW4z:EJO1168J\\x #wBo~3)s٬Ry[pR/PgY$Ձ]h˙/L]|}@d3eWss& {FC2h% \ܓ7F HO!%JARx۪4obA b<"5=ti)D x+_)'''T;sa-wR4Rk"{ IDATkDŽyֲݕs }ҦnMJL0)$-,ݺ4_[?P~;u< ?s]\XMkmm8U7w0F̮5(v !-ݚV 0ח^v{#I|Kx>V@\f0xvVRpZM\?ڿ߰ȜO}j}]!/cffHI394MGz4e.b{fI3m ۲Ƴ'fvB .%GK?ض~uj`w=O?ĜYPXZ-,+]<(j$x1ĸ$ .Zc[=(;?K]<,õc  ³6]vy?#}W3ї4hlAvұEyx{_Y9*̡<@.1!onn"wxx߿G+4E$|;^Қ4Oo[-6ȭ$e!.9TBB=ZGй0\J9L\ȏ{njAW4kDa[>M==[%|O31;7;_;Ȟ>+_M11vZ8R3A-Xԁ˸cԎQ$#,^]b0@ ~g.ŞTp)lHelOM3ohd>=IJ&jJݦiZ|?Zb\݇+7P_BJ~: ÐPJ! C4 ;\ QT/iBưC^.eƼFEKVpꝖ%;-mB;"BJ"qU$wUd|] bzzm'~beg,}#I?4Xy7fg0 .I(';EQd U)ڱ>fd]oMADQ{IGμU(Gt0999J{_YII]n:mnnN}Moˬܚ)E͎xrRЎx3cBVǢA3ptܘIwfchisN\c$冓ّ`E ^vִ%ۡsߟ99ut4be3 :Fz - )5* ~TeOckpIhkhaȑ:Vbϭޯ>p`h6) CDQF1~p'GB)1xaHceO \nZDy#JM/Ux+"]y`0`nہ|f/ 7؁+dlgbŪa`1K]Y t߿&.߸?YgLE @7ϳsort+ǖ1GW.sEoSÞ(vEJ RȤD<9Yy`hnUQǘ9Zk3c'K?֋K=r?Ўt%v7 bBƪb ;xDZuV1|l|zSdh|XÓ{$ 3"R}@ŮRλ] "+ܪmrQ6w#xp[ҔлzY.c&Af;w L3PwIX0DnJY"6Rw+E̐"c#B5jYݚAu|Q+Y}/qO JXq5Q.eؙuĸg]h1˒6dNDJaVp8V*POŒZ+KosQ %_{c@CgE=BQ \<ヘ ;>0pv~zTN%Zk <ճ]9vvR]#gvg fF=M!'&R y30zeAK^Em4`c#ʺqe@{E{΍*ܲ*`҃ND4O>]I <;*/\n[z8 ]}"J! ::!HJ#=6Ǐ>( VމᰰHx@JmvS㲩qDaX|ˢi 4L4ރ^T `*B.BDP0MNpsњsjo+fF=2.qyz,V.\ 2瘟sct 7܀f_K9Bm Ҳt۲q ݶTZ!ԫ$qה -}4ɭ@4 nJ-!|KJn uDk%rll ' Rn)y`)!UAz@3R?,.O!pM7aϝwRTPx\e_ F} ¡#"cε&';39}5$csT,S4?a--)DQ˱gRk8Ԟ4}]wcE;rkbbk9ym > .%_nc6kk'XZ¥ AΝV)/Μ)K2pBe<7͵գL٤ gd 1^)D`pr!{ l@]w{LY/s_ɿ9&0pKNn<Ja ™Mx!pE=:/9O]I\o J7OO#_j-5%!@ %٢xM@^,/qMJ4;P@䡐"`=#eFc$}216x?ӘB9ώiLMMaו0qꂳ7갔޺p'a08lzl)Rʂ<+n>yrt=ލs!v=#>r! ¦sh iSOPR{ucT- FDl^Fƀz) #3DM GFt ,i"s b#7fZbF#ECJD`|i<NBEo`NDѿ]t"Mqfq7qǶE%l eRX1ˡD˔[;FN }[80+PL-Z7 [ Ց;͏wBB%0nCJ Efp47zdcIJ |>kqDh`bW;qŋՙ .,l{&% :RbG XL]K  "n:Xx& 9!ñŭ'?r ك}/}( ҧYhSla^yJ0oXK,ù})ʌu.~ __-O?Y MDJس`-}v3!W)lnnBj9['13^bGZRH:=Ɏq~|OK`vv333]ϩ |t߾ +Zk|hP!m̌~.˰р{ACJ~\rku! 3NJ\UXf;qc" 8ISԌ{ 1bWA#v5GCJGϭA,HoS\=N `<3`ED&Z#s\E< ?@Q/2XG ѐ"(Ï*03-ЍZkhaR ?#s0[wyB6 MdB`{ 1e bAB /JIC&4.Tѣ "u1-XʧE >_\6ϙ1sۚ',Ο#CD/n}ϊ ʼQ}[>DfY^bGW όYnjI)1SFpԚz=#Ou䇓?"GeA;;gijAxpgBtI|'yޞ=l3טtR~?gfDT2;-m5''ؓDb/`qwǗ.~#¨k4D #^M)A̰`jW=Kqg+rTsGb5y@m١5QGmdYkw|chh(<˥<6fzd[^a'Ş, _5Dmi_%(m:<0Rn-bF=Dg}Ƥ2Ԩ+I rϯ YͭHKsӚVT/ "ԅ0|ʂT&P  R;nNP_5\J0)IyZ{x/HJ"EBEo2n}q<^kZJ!LSOΜ9oVfgZmڻVI!:O"T( ȑ@!‡]L稩&T F(ϝr.'|kQ75uassvY@VR(M/~Rd٦[=u*<'h6Ela^ϴց2iܰ6i TD9DTʆ岃;g0k 3=}E49yE "%f<~lĄI$Y ןAh?b94]yN n-IvE5"g4JCNZDP@Ma e6gze#OVl{D re2(j)hDRchZp.áQ2fA $٤ͧI)LL̡պx-`i .^΅ L|_ D0lEB k0ghaawxxR :Qh gJZ<.kkѨk˽\DTkd,975A >[{sVk,OMMg$6Vf (gHkHJi4]xl+R4 D_X86vdË15mmB8 ZBH i0R LLB asAдJ6}u+!JD k99E/A2J_] 91Dt@nYku2 CDBx<p֪ VV1" D3sЗIwI8W5'0 "s(i]u Jzu*<喿OXwPt^VKO2f aKiW"3N~^I9.U9?/L|wH)+h]Md&U#I0I*G9/4dXIu"X0J),wUĨ<,WNՈ!!"h'㺵eDRD{HJb /--_-[ zbW.Ф4AY|9y 犝[TD)3bCf ;. @kXkEc?`v0Ɛ"RȍG E.//VG*TPB *TPB *TPB *TPB *TPB *TPB *TPB A$YQcmIENDB`pillow-2.3.0/Images/lena.fli0000644000175000001440000003776312257506326014545 0ustar dokousers?(t? :0J-M(L#I 6E#+\H!=W"Q#X! ^&;\)/\*4V-.[+9S.7Y+ES-DY,>Q-Nv)f-+b2-p0$j5r12e5Bd5Gi59e4Oh5>l8$a9>c99`9D[9Y`9Ps96m<6p?Yz?EtAIrAP?2mAerDEkD[mFNBAhGhDAzICH1M.N9MKK-fPɰW7D7d} 0 + Aa]]YXm˷k?HHM]YLY^LkEǥ|l]pp綊qtI+I/hKKK>0݀W}W菉" ++`al^YXmˢ|?;?MZYlLaa]qavV9 f%fP>K=!ݗہ:c'4 al^YXmˢ|?;GMZlY^^Ea⭦\LgR3b+(@@@%~hfjɯR:tt4 +% Ual^YXYmˢ|G;GMZYlLk|^a[]r)V*+@Kz%f/@Kbה7'Vjc *' alZYXXmˢ|?;?MZYmL^kaEorppgsstVI@(f/%(fQWRiIT &T al]YXXmˢ|?;?MZYY^^kkaE㻣xlpqsV-P+=Ib/fjRUVjW +}  al]YYXYˢ|?;?M\ZYLlk|kN㻏Lpstt+f-->P%bPjRUb=D' * .}Ŀ al]ZYFYˠ?;?M\ZYYkk^kNooakxaV< +(>>@f0 I=v& Ijc' *: i} Ŀaa]ZYLYˠ?;?M\\ZZLmYmkkkaaNr|rgsI9 %>-$K=: ttƧv)9=ɰ.+    aa]ZZLYР|?;?M\\ZZYm||kLrarvH3)b@%@->%P"csəƾJ Qɰ"!(0+ c a]]ZZLYР|?;?M\\ZZYYmxxkkaars<9+//%%(>PP!CծJ =.##+']ZZLY̠|?;HM\\ZYmxkk]qrU)+9/@/%/j'ہԦ{) T.##C ]ZZL^̠|8AH\]Ym||lpqv`b @//@-/=:}ۯծ{< 44(/ s]ZZL^Ѡ8AH\]Ymx\`t +f+0+z@%W۾Ӧ{< CC+(+ ' ]ZZL^Ѡ8AM\Z]YYm||mgvs K%0%/Pjc濾OOrr_1 Uc+(/ Uv g]]ZZLYѠ8AM\ZYYm||kq1At >h/+# +f@@׿樤55^֏O;1 4ʁ+(/ s ]ZZL^ѷM;M\\]Y^kJcVb-@#= QdaLL}Wg{V) 4++%v^^]GGLL΢Ž?;H\^llLLx^aѽثt*@(K>hPPz" }7RC4''s4<* .i: D^LZGMLL?;GGL^x5av'I@>~hKzP/@~% 3A3:iMc ) *0*dLLMGG5N?;GM^l5]qꤍ}.@>$K~%$!W R3C,Mx)V)  :I)%'^LG55??G]^llL]M,8Q->-Bz//!DվOvOM1'CspxmWRAJ`QjVI4} ]MM?5߻κL?Z]Lxx,,;_ =P%-K-h2z%%/%/ʯ[qMvېmW11 QQQI d ]]\MM?5кY?Zl^,_ݕb.Q/BB$SKf%#:c[rvdd؛q\;;1 :QQ.'}} \\M?5кLFYll9+#0z2>Bh~z/ɁN[ضÆն\_J1*QQ:C\MM??,5к5ZLYp]qsbf/%P@2$-B~hfb tUak͛ظؾϚ游q;1.0t:  c MM??;,5κL]qq{{>$$@fPz$~22f0 8lϸϣ_."t.. wH?;,,Ž5GGp{t(--2S2z2>f@jt# sc8l轵ϻ_"ɕ 'ĭH;,,ŽY?G\qs=P@-~~h$$/%+ tj  '8lһ_1ݴ C򮮨AA;,,pŽ5GM\qUCfh2~2BS%%/%.t dݙ" MmϽһq; ɴ cĭ A31,pŽ5GqH_f~~SBh~@%%'C= }4?m罻q1 쓔ĭ A31,Ž5\qq:=f>B$BS~#%%Ijc':i} !. ;mٽ\1)) C4ĭAA;11,ŽG,H_sQ+PS$h~S2%I:c4 } 22hSz/%=C4  c A;enq;*= 'v H;;118Ч]MqJ{9IfKSB$S~2Q+b i `?eu͵n껻{ * 4ݕ  H;18鷎5M?_{bIfz-$~~~/=bʀ# J\mkxalϻ< +&4ݕ 7짧 J;AO߷^,q;{V+@(~2BB~B~jj+bj + 'JMm᩵긻s 9&ݕ'g;11AOѷL,?{{@@f-2BS~2hz/=Q *tT' * J\mީ긣J +I)3 ʓC ;1;11AOѷL?;_t9=z22h2~fQQ Ti4 + _Mm깦&+I)3cy 1AOѷM\H{Vt+ffKB2SBhhP0'stT" 9++ &`?l϶_ +9)3 }y 13AOѷ5,{Jst+f2hBS22S$~44C. Q I3HẒϸ{3 +*<&&} ))3AMѷ8H{`t=@$22hSB2hSf:ہcct I +93?ZnEnnkNgg{ *< d} )33R\ѷMAstI=//BB$SBSSh/QU  *+* 3;Mk蚄Ӊ *)<J7y)&AOѷq{3st=+BB2h$hhS2Pc * ++3A?^ñV  ))<J7ƧAOѼM3`st=/%$hh$BSc.+ +*ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmVP8 p *,>BJ(%' b8T `X7AOwW|}{c}>T'S͗~z85F&zZa=猴MLVRЩlM ϫ6ohL: S H4$wboe j>:J;@\A4HA/Br[GQoSiu9)"6'f>y|4{ yͻ$~ x440F .+Pm^ئ'vRϯLC]IiRa#n9 e/ђ oQ!SFG7 Pm5Qx2n=TُZ/֗G*I)Iܱ载JĆn8JXYOw?gdtJaOIl:fx:0jrޭ&r.%B7ŹU gs8́)AŒZ,L{#E>8]k hW 9ٳL ^mUcKNBNŠmR.9ĎW-Rb vV'Άp?!cyR1sTkIv{fvtg=7Hiva*(Q=ݬ}Y@ Xn8Cc~_i#TRÝ'$_Fh~g} = fcz-/ c(XPf\7^.ނ=gY }yth1W3bO/+ }Ǵt( ^}pW3kLT E޹ qA=oR{TW7RIYތtSଃ/G3)o=m-L-3 jҨMfy:6 ex,^4~%CŮM8#Eh5nAׄjK@/܃@ x.P^t C= GE+(H(LgMdGD}ݥIYޮ_\دl=O CSUc<\? =|FHSX-W m@(FL{JLQ&wГy_^-w'"䟚ݥ{s$ωl< G:TwDGnVZn9z]&p4a|Mhne=&d+ Y>bFcc]rjXWF]Wd4&}oGժu dr~]nV!OÐ@W-o[8qK,nVTd|M5S*lezD4B8ZJ6pN]/a~wṴNӈoIlXQ\8?T4 (d80igFTG-K떣|5#KM4 f[~,{!㐇n/u M8r2ՇTULLFǙ\兏YX:hW47q "aRg3Xmcp& MXL6C1a{wWo3cM}tD/s#Dc/Gg-Vfe W£-e7;gF1ϼm8a`6P s=q}~ mM>ߟcS=ShqpM) ^) ͓tt1XѸ3M,,<]IAYű\/1Bf35 4ӪTg)?G{~ő `fRX8~&,sSWÝٓg8gv5) #v= |5FhFc1 ˁrmnz)D/=D+R $j5ډ6W@.C2 䈟 9|;Ӵg/!ҒN/X,;ʢ OBXJKLj kai6 a}U=C 2愙$r 0yO7~.%9pz:Wn# jS /fUݬ%gp3t? -˪)@dʹIܲo7}]R_".^\J'mC d u/@1BѦF1;%oru|HR\Cp6>IXV'Ǥh]l1f1\Vc  *q 9EdPq:d`5L13Gsf|pceZj$,=,Dҥf%7-)vNG]ӃrQršCo:ʘ 6]g{ٕ%yTKhopN$e?l2`$+:'R!< ̻&f6GgPN`r(0.ڱK }EAĿ{;Tqw!iC5f8'U }dX^9U\Y)sV3E;Lec.%_LֱW ݽd_bM{%ҾWF`Gݴbi1PTULkKʧ|R;7:Vm.زdhog%ҠZ:+˫hQbEZaLM>Л>T7Q`:PlM.i'Ґ\bZE/[4MWwGX$V5Bzc]8`SDoVSAſ&6M R_ͽb-tw\0ڄ@5Uxq%I4oHQ3G[jvq!:OXXZމpӥr ǃ8zf'>}v'\xeQ &Krv+ sd1v7hol?%]q"xc#1; \(i?#'cѷ(K*7ˈ@c]K'u#?-[q!M`YK!l r16?Ti*ٜ|@˅$ cob %~;v.2܊VaVROԗLȢA,`?o1O{nz?^ZɫRXvǻ)tSTB9=9[`x_~gVčTlψũk0e4|S)hdoEսcR=-ozzL$CMAqoBQCXTiMcQzfD*ޔ-C5+--ҙq?UiҞׅ׭H @ԣ[KF\aʚYÝ[ :YwwPf?"p1/G1\@a֖ 蹳L6qFk-`qSEU 're+Zz[b^!2w ˢ_kx2iJ4fG* 8?ݍ7w+ ޔLNߕ`f7.2 Sy.JE'C{Ķ[&dbSx% ѦsiÒV~{ƴq/ڼ4K[q2+&cq"bł,Az1gD]_\x!2ldeG;!v=IL ujB-x8Y>@[\iADiل*6{  YHa每}5X6_}/]^0&D e2?D] !{ M3 Ң+5ߑm^6p$_Y B8d)z?;:)ޘل ݑV0ۆ5LC|wF%HodU!ȼ%(-۩f BJjiw3!f톼" h 3h)hp븿)[Sm]DrLvPoo_3I7?C'` W}ٽbϷMwǍ1Gr$1}cVpqƈF.ەfHajtYpFէR#8}?X7;T<|qջi! gf}|HMyׄw068koԲ}zP"]&$]C5 M.< T3FR&h;XFz- Ep8iV^Ġ[V}N)_3]LEKs[qOVc% NX+$C{D4@\~|cewM2><|ogsVQ="ߜ}P4F33-~7f@@R:!TjgTx&:IKUs ĥV9OG?I2hlO;<p|K1^fCBiɮIkM5T?^'%( FnGLCF}n.^wxl,v:")hLf!]/ۨ!oMODߖ|&]崂ռ@:D_G TPbUlX!]qG4=[bILLcLlm KRv(("dq5\y 2x*J-@ c-, -VY'ǴYP9pr3FLnLdL?)^G'C[BDꡎ .s.ǜ4]R/zfXEXIFMM* (1 2ԇi  ' 'Adobe Photoshop CS6 (Macintosh)2013:07:04 17:24:410221,nv(~/HH Adobe_CMAdobed            x" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?.ocĞdhn۵!E@YCF5srPk@F~rY$~Gv.-:f[k1nc$T΁?}0-o.XXL7dǎRtkT屠eZWA1} Mhes[_\C*졁6h><|tUVA kGoіn&`y8H ֵꍽoWbm`k.duDZ[\ꅲ78w-˟].1[+CԎ&e0lkKNV~/3 @:Pzߊ?7R](躧87zeog7;t߫dՐuMknn09uͷ.+8S-ެ]OՏ?(-8ain~9YDJDzLyɬD_Z=;/?!x1/h u\MOu]f3jdKٮoK{1CkIrј*2$V=Z^ߢ\wsozN:ʭgNnr-t LՠNE) D9;vI)dQY֎5S;0 q)!FA~n61`>xjN86۰M_=qW/$:A׍]MtDRư&V0k4u9m.y]mucYmW.tY_ҭ _p: ayhs Ow*V:}$9j\beG$H ^#2eDnNʝ(n.N3=QZE-եnhX(ȳ/wm-.-:HoMCc \1ߦDt>N)/["m ?yszT{q0Xl|hi{GMU*,ߓsƲ vRؿVqm9ZY9|'$?-쮫߿nd߿y,lvz5- i=۲ A;~Xκ]^=[=H.nm`jH}'9]i.aeLzw70$Q?WFB@wtiƭٝ>v&5,g5Wg9.&CN>qu3R==3Oܮ_鹽Nƛd1 IfngF>шkKs!mm_gwF_շON 鞋kkhl9s6]B 28[_Z3}]2[S.Ͳ7-Ƴ5qy{H3eMvYפ޻"M1 y :J1ƉnUhΧmh3&ht8[\nUkAUplюGwVv6784l<"tU`tףs]-Q;~Y=Gjv)]n<3oVkw\[j{3O.v7Q3MsMFUem'Rfskgbn~b~V%M85Fu_ &]ik̚~l#cH,{;1ߌkdzې*d3q{?Y_tX:^sTkvwW.$O־ݘ'# Ig쾙ժkDZ !K][/ZmOվ31Ưv{լ's߃eu"ۅ'kV3?YzSZI~+C}[K JlpgaĪ2')P4&NGN1KukZ7g-}{7zY}iiiϹk^WC]>|7zy6VN%/?ܖFks*:'ϥ"K%I` $l~LbouηoG l{=s]\˺Y϶̊licvI=8ezKZCn>ܛ,w?"f@b2k۝c6eLLûv+Z ~?qJNMÚ]إ2O}l@Qӯ(1ҏP镵k 6{vugP- N" u_ޤR0o~ fJklk[YBuyXG7840U-UXH5 M0<@ X"NU&~$;,v,,@I:7Su1P6 mMַL˲Zmt~`PoqtDUNf[AU6nߐOY__׳"Ɂn}TcՐ1ꥭp swv[d9p3iƷc?ݛM?hɺi`kXnn-_5YþQӰ;h.!s#cYW]/L}RZMzn=ZWk΍:.vT-pW&[K쵿= eYGR{X{eqo U'x Q;[C:ىwb/_j-Cbr6s-qel8CC?h+v?쾴 ug0͟kw灔j&֘% i}7+h$ZcuXz;h$5G}T(ۜY*!wXLܺ^al<ܭ0=Q2rCPsY9tk_sq=I>R)sz~EuzK|{,#PYXt#Tu5̝uy1<ןJUð("eC1&t:0dTt3fE\iPV3*lvF4} ~5ܧkcjŧkM~[?kALUA$lǫ8u _`[^(;]}5[V%U&kqO)O<2_UL o6H]yN^;ZIn|G~ct_[U? @#n5'u7mϲs*{-A౪~{IFgf=xù׹6VuQmBik7coѩ }/H%`?~m`#&:C]uwّMbS1N+Cnsc7{ sESmmfeQ-{1զc9QOg!b'u:uϤ[Km:} v+YM11?rNEnkO >R7{ t>;JA.f]ub n!4Ք>hZ\i֓?=d>XX/{7t8¶^y'S"I'mѨfZGP`~T 8eE@nID )9_͵0l?c>YEA0sZč$ꃪn55 N^Cjڨ/"@->Bm3>c dlnq}wM@ClD~g{t1s,6:Z?uEtUu18V+ lmo;Yp}DDZSn;=' U֗mrƱkhslmCFw)w6y]_Oq.:ReZ#V }AkfUGi֙4\#~TݟN6}!{I/hcܫme Oinݏ^/cC}NuwљX %?7U}j!Bͯ(?;(.3{\cѸ1?ܾS<`NLjn/suMkk#m+>ҋkc\Xk4׶kO,s,\}~Kgytw;I0/LnY;: (OW~Ӫο%BEw.nJ3f١s Įm[|xxlXٹ⩼tV.V{@Td*ـ9ud,; mk4|4~ܹ, wU3r.wP!V10YtFu.]=r`[K,'ӲhY[ÛcvWc{7>nI]95jfC%aNaə>38CZ4~\CO[weeV2.{Qբ!Ϣ߳1 rs8xL\-=S,\CeDJ]VvwVwv(Mv!:~ Xe@nQc^Ipca@>O h*͜O MV X`D 7P^}ȕC v[SCl2OzxƋMQmGl/&uBl\J]@`u$-iC ydh.Y%'UznM ~uVifD乣}/;>ٹq(e^/UoZӊ}?t>պ=G.Iu\wͿB":Od}ʹ}˗IYN^6z ` e$uc/Qi r[\]QDOw` 8%|^ +T4p+֔XMP pillow-2.3.0/Images/courB08.bdf0000644000175000001440000005302512257506326015016 0ustar dokousersSTARTFONT 2.1 COMMENT $XConsortium: courB08.bdf,v 1.5 94/04/10 21:46:11 gildea Exp $ COMMENT COMMENT Copyright 1984, 1987 Adobe Systems, Inc. COMMENT Portions Copyright 1988 Digital Equipment Corporation COMMENT COMMENT Adobe is a registered trademark of Adobe Systems, Inc. Permission COMMENT to use these trademarks is hereby granted only in association with the COMMENT images described in this file. COMMENT COMMENT Permission to use, copy, modify, and distribute this software and COMMENT its documentation for any purpose and without fee is hereby granted, COMMENT provided that the above copyright notices appear in all copies and COMMENT that both those copyright notices and this permission notice appear COMMENT in supporting documentation, and that the names of Adobe Systems and COMMENT Digital Equipment Corporation not be used in advertising or COMMENT publicity pertaining to distribution of the software without COMMENT specific, written prior permission. Adobe Systems and Digital COMMENT Equipment Corporation make no representations about the suitability COMMENT of this software for any purpose. It is provided "as is" without COMMENT express or implied warranty. COMMENT COMMENT ADOBE SYSTEMS AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL COMMENT WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED COMMENT WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ADOBE COMMENT SYSTEMS AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY SPECIAL, COMMENT INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER COMMENT RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF COMMENT CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN COMMENT CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. COMMENT COMMENT FONT -Adobe-Courier-Bold-R-Normal--11-80-100-100-M-60-ISO8859-1 SIZE 8 100 100 FONTBOUNDINGBOX 8 11 -1 -2 STARTPROPERTIES 22 COMMENT Begin LogicalFontDescription FONTNAME_REGISTRY "" FAMILY_NAME "Courier" FOUNDRY "Adobe" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 11 POINT_SIZE 80 RESOLUTION_X 100 RESOLUTION_Y 100 SPACING "M" AVERAGE_WIDTH 60 CHARSET_REGISTRY "ISO8859" CHARSET_ENCODING "1" COMMENT END LogicalFontDescription CHARSET_COLLECTIONS "ASCII ISO8859-1 ADOBE-STANDARD" FACE_NAME "Courier Bold" COPYRIGHT "Copyright (c) 1987 Adobe Systems, Inc., Portions Copyright 1988 Digital Equipment Corp." COMMENT ***** end of inserted font properties FONT_ASCENT 8 FONT_DESCENT 2 CAP_HEIGHT 6 X_HEIGHT 5 ENDPROPERTIES CHARS 194 STARTCHAR space ENCODING 32 SWIDTH 600 0 DWIDTH 6 0 BBX 1 1 0 0 BITMAP 00 ENDCHAR STARTCHAR exclam ENCODING 33 SWIDTH 600 0 DWIDTH 6 0 BBX 2 6 1 0 BITMAP C0 C0 C0 C0 00 C0 ENDCHAR STARTCHAR quotedbl ENCODING 34 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 3 BITMAP A0 A0 A0 ENDCHAR STARTCHAR numbersign ENCODING 35 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 -1 BITMAP 50 50 F8 50 50 F8 50 50 ENDCHAR STARTCHAR dollar ENCODING 36 SWIDTH 600 0 DWIDTH 6 0 BBX 5 9 0 -1 BITMAP 20 78 C8 F0 78 18 D8 F0 20 ENDCHAR STARTCHAR percent ENCODING 37 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP E0 A8 F0 20 78 A8 38 ENDCHAR STARTCHAR ampersand ENCODING 38 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP 38 60 30 7C D8 7C ENDCHAR STARTCHAR quoteright ENCODING 39 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 4 BITMAP 60 40 80 ENDCHAR STARTCHAR parenleft ENCODING 40 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 1 -1 BITMAP 20 40 C0 C0 C0 C0 40 20 ENDCHAR STARTCHAR parenright ENCODING 41 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 1 -1 BITMAP 80 40 60 60 60 60 40 80 ENDCHAR STARTCHAR asterisk ENCODING 42 SWIDTH 600 0 DWIDTH 6 0 BBX 4 4 0 3 BITMAP 20 F0 60 90 ENDCHAR STARTCHAR plus ENCODING 43 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 1 BITMAP 20 20 F8 20 20 ENDCHAR STARTCHAR comma ENCODING 44 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 -2 BITMAP 60 40 80 ENDCHAR STARTCHAR minus ENCODING 45 SWIDTH 600 0 DWIDTH 6 0 BBX 5 1 0 3 BITMAP F8 ENDCHAR STARTCHAR period ENCODING 46 SWIDTH 600 0 DWIDTH 6 0 BBX 2 1 1 0 BITMAP C0 ENDCHAR STARTCHAR slash ENCODING 47 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 10 10 20 20 40 40 80 80 ENDCHAR STARTCHAR zero ENCODING 48 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 D8 D8 D8 D8 70 ENDCHAR STARTCHAR one ENCODING 49 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 30 F0 30 30 30 30 FC ENDCHAR STARTCHAR two ENCODING 50 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 18 30 60 D8 F8 ENDCHAR STARTCHAR three ENCODING 51 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 18 70 18 D8 70 ENDCHAR STARTCHAR four ENCODING 52 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 18 38 58 D8 FC 18 18 ENDCHAR STARTCHAR five ENCODING 53 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP F8 C0 F0 D8 18 98 F0 ENDCHAR STARTCHAR six ENCODING 54 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 C0 F0 D8 D8 70 ENDCHAR STARTCHAR seven ENCODING 55 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP F8 D8 18 30 30 60 60 ENDCHAR STARTCHAR eight ENCODING 56 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 D8 70 D8 D8 70 ENDCHAR STARTCHAR nine ENCODING 57 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 70 D8 D8 78 18 D8 70 ENDCHAR STARTCHAR colon ENCODING 58 SWIDTH 600 0 DWIDTH 6 0 BBX 2 4 1 0 BITMAP C0 00 00 C0 ENDCHAR STARTCHAR semicolon ENCODING 59 SWIDTH 600 0 DWIDTH 6 0 BBX 3 6 0 -2 BITMAP 60 00 00 60 40 80 ENDCHAR STARTCHAR less ENCODING 60 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 0 1 BITMAP 30 60 C0 60 30 ENDCHAR STARTCHAR equal ENCODING 61 SWIDTH 600 0 DWIDTH 6 0 BBX 4 3 0 2 BITMAP F0 00 F0 ENDCHAR STARTCHAR greater ENCODING 62 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 1 BITMAP C0 60 30 60 C0 ENDCHAR STARTCHAR question ENCODING 63 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 70 98 30 60 00 60 ENDCHAR STARTCHAR at ENCODING 64 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 -1 BITMAP 70 C8 98 A8 A8 9C C0 70 ENDCHAR STARTCHAR A ENCODING 65 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP 78 38 28 7C 6C EE ENDCHAR STARTCHAR B ENCODING 66 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP F8 6C 78 6C 6C F8 ENDCHAR STARTCHAR C ENCODING 67 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 78 D8 C0 C0 D8 70 ENDCHAR STARTCHAR D ENCODING 68 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP F8 6C 6C 6C 6C F8 ENDCHAR STARTCHAR E ENCODING 69 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP FC 60 78 60 6C FC ENDCHAR STARTCHAR F ENCODING 70 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP FC 60 78 60 60 F0 ENDCHAR STARTCHAR G ENCODING 71 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 70 D8 C0 F8 D8 78 ENDCHAR STARTCHAR H ENCODING 72 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP EE 6C 7C 6C 6C EE ENDCHAR STARTCHAR I ENCODING 73 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 0 0 BITMAP F0 60 60 60 60 F0 ENDCHAR STARTCHAR J ENCODING 74 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP 3C 18 18 D8 D8 70 ENDCHAR STARTCHAR K ENCODING 75 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP EC 68 70 78 6C F6 ENDCHAR STARTCHAR L ENCODING 76 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP F0 60 60 60 6C FC ENDCHAR STARTCHAR M ENCODING 77 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP C4 6C 6C 7C 54 D4 ENDCHAR STARTCHAR N ENCODING 78 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP EE 74 74 6C 6C E4 ENDCHAR STARTCHAR O ENCODING 79 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR P ENCODING 80 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP F8 6C 6C 78 60 F0 ENDCHAR STARTCHAR Q ENCODING 81 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 -1 BITMAP 70 D8 D8 D8 D8 70 18 ENDCHAR STARTCHAR R ENCODING 82 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP F8 6C 6C 78 6C F6 ENDCHAR STARTCHAR S ENCODING 83 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 78 C8 F0 38 98 F0 ENDCHAR STARTCHAR T ENCODING 84 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP FC B4 30 30 30 78 ENDCHAR STARTCHAR U ENCODING 85 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP EE 6C 6C 6C 6C 38 ENDCHAR STARTCHAR V ENCODING 86 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP EE 6C 28 38 38 10 ENDCHAR STARTCHAR W ENCODING 87 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP D6 54 54 7C 38 28 ENDCHAR STARTCHAR X ENCODING 88 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 0 0 BITMAP CC 78 30 30 78 CC ENDCHAR STARTCHAR Y ENCODING 89 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP E6 66 3C 18 18 3C ENDCHAR STARTCHAR Z ENCODING 90 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP F8 D8 30 60 D8 F8 ENDCHAR STARTCHAR bracketleft ENCODING 91 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 1 -1 BITMAP E0 C0 C0 C0 C0 C0 C0 E0 ENDCHAR STARTCHAR backslash ENCODING 92 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 0 -1 BITMAP 80 80 40 40 20 20 10 10 ENDCHAR STARTCHAR bracketright ENCODING 93 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 1 -1 BITMAP E0 60 60 60 60 60 60 E0 ENDCHAR STARTCHAR asciicircum ENCODING 94 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 0 4 BITMAP 20 70 D8 ENDCHAR STARTCHAR underscore ENCODING 95 SWIDTH 600 0 DWIDTH 6 0 BBX 6 1 0 -2 BITMAP FC ENDCHAR STARTCHAR quoteleft ENCODING 96 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 4 BITMAP C0 40 20 ENDCHAR STARTCHAR a ENCODING 97 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP 70 D8 78 D8 FC ENDCHAR STARTCHAR b ENCODING 98 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 -1 0 BITMAP E0 60 78 6C 6C 6C F8 ENDCHAR STARTCHAR c ENCODING 99 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 0 BITMAP 70 D8 C0 D8 70 ENDCHAR STARTCHAR d ENCODING 100 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 38 18 78 D8 D8 D8 7C ENDCHAR STARTCHAR e ENCODING 101 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 0 BITMAP 70 D8 F8 C0 78 ENDCHAR STARTCHAR f ENCODING 102 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 38 60 F8 60 60 60 F8 ENDCHAR STARTCHAR g ENCODING 103 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 -2 BITMAP 6C D8 D8 D8 78 18 F0 ENDCHAR STARTCHAR h ENCODING 104 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 -1 0 BITMAP E0 60 78 6C 6C 6C 6C ENDCHAR STARTCHAR i ENCODING 105 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 30 00 F0 30 30 30 FC ENDCHAR STARTCHAR j ENCODING 106 SWIDTH 600 0 DWIDTH 6 0 BBX 4 9 0 -2 BITMAP 30 00 F0 30 30 30 30 30 E0 ENDCHAR STARTCHAR k ENCODING 107 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP E0 60 6C 78 70 78 6E ENDCHAR STARTCHAR l ENCODING 108 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP F0 30 30 30 30 30 FC ENDCHAR STARTCHAR m ENCODING 109 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 -1 0 BITMAP F8 7C 54 54 54 ENDCHAR STARTCHAR n ENCODING 110 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 -1 0 BITMAP D8 6C 6C 6C 6C ENDCHAR STARTCHAR o ENCODING 111 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 0 BITMAP 70 D8 D8 D8 70 ENDCHAR STARTCHAR p ENCODING 112 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 -1 -2 BITMAP F8 6C 6C 6C 78 60 F0 ENDCHAR STARTCHAR q ENCODING 113 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 -2 BITMAP 6C D8 D8 D8 78 18 3C ENDCHAR STARTCHAR r ENCODING 114 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP DC 74 60 60 F0 ENDCHAR STARTCHAR s ENCODING 115 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP 78 E0 78 1C F8 ENDCHAR STARTCHAR t ENCODING 116 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 60 60 F8 60 60 6C 38 ENDCHAR STARTCHAR u ENCODING 117 SWIDTH 600 0 DWIDTH 6 0 BBX 7 5 -1 0 BITMAP EC 6C 6C 6C 3E ENDCHAR STARTCHAR v ENCODING 118 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 -1 0 BITMAP EC 6C 38 38 10 ENDCHAR STARTCHAR w ENCODING 119 SWIDTH 600 0 DWIDTH 6 0 BBX 7 5 -1 0 BITMAP D6 54 7C 3C 28 ENDCHAR STARTCHAR x ENCODING 120 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP EC 78 30 78 DC ENDCHAR STARTCHAR y ENCODING 121 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 -2 BITMAP EE 6C 6C 28 38 30 E0 ENDCHAR STARTCHAR z ENCODING 122 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 0 BITMAP F8 B0 60 D8 F8 ENDCHAR STARTCHAR braceleft ENCODING 123 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 30 60 60 C0 60 60 60 30 ENDCHAR STARTCHAR bar ENCODING 124 SWIDTH 600 0 DWIDTH 6 0 BBX 1 7 2 -1 BITMAP 80 80 80 80 80 80 80 ENDCHAR STARTCHAR braceright ENCODING 125 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 0 -1 BITMAP C0 60 60 30 60 60 60 C0 ENDCHAR STARTCHAR asciitilde ENCODING 126 SWIDTH 600 0 DWIDTH 6 0 BBX 5 2 0 3 BITMAP 68 B0 ENDCHAR STARTCHAR exclamdown ENCODING 161 SWIDTH 600 0 DWIDTH 6 0 BBX 2 7 1 -2 BITMAP C0 00 C0 C0 C0 C0 C0 ENDCHAR STARTCHAR cent ENCODING 162 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 -1 BITMAP 20 20 78 C8 C0 78 20 20 ENDCHAR STARTCHAR sterling ENCODING 163 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 38 68 20 F8 20 64 F8 ENDCHAR STARTCHAR currency ENCODING 164 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 1 BITMAP 88 70 50 70 88 ENDCHAR STARTCHAR yen ENCODING 165 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP CC 48 FC 30 FC 30 78 ENDCHAR STARTCHAR brokenbar ENCODING 166 SWIDTH 600 0 DWIDTH 6 0 BBX 1 9 2 -2 BITMAP 80 80 80 80 00 80 80 80 80 ENDCHAR STARTCHAR section ENCODING 167 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 -1 BITMAP 78 48 60 90 48 30 90 F0 ENDCHAR STARTCHAR dieresis ENCODING 168 SWIDTH 600 0 DWIDTH 6 0 BBX 3 1 1 5 BITMAP A0 ENDCHAR STARTCHAR copyright ENCODING 169 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 30 48 B4 A4 B4 48 30 ENDCHAR STARTCHAR ordfeminine ENCODING 170 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 2 BITMAP E0 10 D0 00 F0 ENDCHAR STARTCHAR guillemotleft ENCODING 171 SWIDTH 600 0 DWIDTH 6 0 BBX 7 5 -1 0 BITMAP 36 6C D8 6C 36 ENDCHAR STARTCHAR logicalnot ENCODING 172 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 0 2 BITMAP F8 08 08 ENDCHAR STARTCHAR hyphen ENCODING 173 SWIDTH 600 0 DWIDTH 6 0 BBX 5 1 0 3 BITMAP F8 ENDCHAR STARTCHAR registered ENCODING 174 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 0 0 BITMAP 38 44 BA B2 AA 44 38 ENDCHAR STARTCHAR macron ENCODING 175 SWIDTH 600 0 DWIDTH 6 0 BBX 4 1 0 5 BITMAP F0 ENDCHAR STARTCHAR degree ENCODING 176 SWIDTH 600 0 DWIDTH 6 0 BBX 4 3 0 4 BITMAP 60 90 60 ENDCHAR STARTCHAR plusminus ENCODING 177 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 0 0 BITMAP 20 20 F8 20 00 F8 ENDCHAR STARTCHAR twosuperior ENCODING 178 SWIDTH 600 0 DWIDTH 6 0 BBX 3 4 1 3 BITMAP 60 A0 40 E0 ENDCHAR STARTCHAR threesuperior ENCODING 179 SWIDTH 600 0 DWIDTH 6 0 BBX 3 4 1 3 BITMAP E0 40 20 C0 ENDCHAR STARTCHAR acute ENCODING 180 SWIDTH 600 0 DWIDTH 6 0 BBX 2 2 2 5 BITMAP 40 80 ENDCHAR STARTCHAR mu ENCODING 181 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 -2 BITMAP EC 6C 6C 6C 7E 40 40 ENDCHAR STARTCHAR paragraph ENCODING 182 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 -1 BITMAP 7C A8 A8 68 28 28 28 6C ENDCHAR STARTCHAR periodcentered ENCODING 183 SWIDTH 600 0 DWIDTH 6 0 BBX 2 1 1 3 BITMAP C0 ENDCHAR STARTCHAR cedilla ENCODING 184 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 -2 BITMAP 40 20 C0 ENDCHAR STARTCHAR onesuperior ENCODING 185 SWIDTH 600 0 DWIDTH 6 0 BBX 3 4 1 3 BITMAP C0 40 40 E0 ENDCHAR STARTCHAR ordmasculine ENCODING 186 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 2 BITMAP 60 90 60 00 F0 ENDCHAR STARTCHAR guillemotright ENCODING 187 SWIDTH 600 0 DWIDTH 6 0 BBX 7 5 -1 0 BITMAP D8 6C 36 6C D8 ENDCHAR STARTCHAR onequarter ENCODING 188 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP C0 44 48 F4 2C 5E 04 ENDCHAR STARTCHAR onehalf ENCODING 189 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP C0 44 48 F6 2A 44 0E ENDCHAR STARTCHAR threequarters ENCODING 190 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP E0 44 28 D4 2C 5E 04 ENDCHAR STARTCHAR questiondown ENCODING 191 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 -2 BITMAP 30 00 30 30 60 C8 70 ENDCHAR STARTCHAR Agrave ENCODING 192 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 20 10 00 78 38 28 7C 6C EE ENDCHAR STARTCHAR Aacute ENCODING 193 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 10 20 00 78 38 28 7C 6C EE ENDCHAR STARTCHAR Acircumflex ENCODING 194 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 10 28 00 78 38 28 7C 6C EE ENDCHAR STARTCHAR Atilde ENCODING 195 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 34 48 00 78 38 28 7C 6C EE ENDCHAR STARTCHAR Adieresis ENCODING 196 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 28 00 78 38 28 7C 6C EE ENDCHAR STARTCHAR Aring ENCODING 197 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 30 48 30 78 38 28 7C 6C EE ENDCHAR STARTCHAR AE ENCODING 198 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP 7E 3A 6C 78 DA DE ENDCHAR STARTCHAR Ccedilla ENCODING 199 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 -2 BITMAP 78 D8 C0 C0 D8 70 10 60 ENDCHAR STARTCHAR Egrave ENCODING 200 SWIDTH 600 0 DWIDTH 6 0 BBX 6 9 -1 0 BITMAP 20 10 00 FC 64 78 60 6C FC ENDCHAR STARTCHAR Eacute ENCODING 201 SWIDTH 600 0 DWIDTH 6 0 BBX 6 9 -1 0 BITMAP 10 20 00 FC 64 78 60 6C FC ENDCHAR STARTCHAR Ecircumflex ENCODING 202 SWIDTH 600 0 DWIDTH 6 0 BBX 6 9 -1 0 BITMAP 20 50 00 FC 64 78 60 6C FC ENDCHAR STARTCHAR Edieresis ENCODING 203 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 -1 0 BITMAP 50 00 FC 64 78 60 6C FC ENDCHAR STARTCHAR Igrave ENCODING 204 SWIDTH 600 0 DWIDTH 6 0 BBX 4 9 0 0 BITMAP 40 20 00 F0 60 60 60 60 F0 ENDCHAR STARTCHAR Iacute ENCODING 205 SWIDTH 600 0 DWIDTH 6 0 BBX 4 9 0 0 BITMAP 20 40 00 F0 60 60 60 60 F0 ENDCHAR STARTCHAR Icircumflex ENCODING 206 SWIDTH 600 0 DWIDTH 6 0 BBX 4 9 0 0 BITMAP 40 A0 00 F0 60 60 60 60 F0 ENDCHAR STARTCHAR Idieresis ENCODING 207 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 0 0 BITMAP A0 00 F0 60 60 60 60 F0 ENDCHAR STARTCHAR Eth ENCODING 208 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP F8 6C F4 64 6C F8 ENDCHAR STARTCHAR Ntilde ENCODING 209 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 34 48 00 EE 64 74 7C 6C EC ENDCHAR STARTCHAR Ograve ENCODING 210 SWIDTH 600 0 DWIDTH 6 0 BBX 5 9 0 0 BITMAP 40 20 00 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR Oacute ENCODING 211 SWIDTH 600 0 DWIDTH 6 0 BBX 5 9 0 0 BITMAP 20 40 00 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR Ocircumflex ENCODING 212 SWIDTH 600 0 DWIDTH 6 0 BBX 5 9 0 0 BITMAP 20 50 00 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR Otilde ENCODING 213 SWIDTH 600 0 DWIDTH 6 0 BBX 5 9 0 0 BITMAP 68 90 00 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR Odieresis ENCODING 214 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 50 00 70 D8 D8 D8 D8 70 ENDCHAR STARTCHAR multiply ENCODING 215 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 1 BITMAP 88 50 20 50 88 ENDCHAR STARTCHAR Oslash ENCODING 216 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP 3A 6C 7C 6C 6C B8 ENDCHAR STARTCHAR Ugrave ENCODING 217 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 20 10 00 EE 6C 6C 6C 6C 38 ENDCHAR STARTCHAR Uacute ENCODING 218 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 08 10 00 EE 6C 6C 6C 6C 38 ENDCHAR STARTCHAR Ucircumflex ENCODING 219 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 10 28 00 EE 6C 6C 6C 6C 38 ENDCHAR STARTCHAR Udieresis ENCODING 220 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 28 00 EE 6C 6C 6C 6C 38 ENDCHAR STARTCHAR Yacute ENCODING 221 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 0 BITMAP 04 08 00 E6 66 3C 18 18 3C ENDCHAR STARTCHAR Thorn ENCODING 222 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 -1 0 BITMAP E0 78 6C 6C 78 E0 ENDCHAR STARTCHAR germandbls ENCODING 223 SWIDTH 600 0 DWIDTH 6 0 BBX 7 6 -1 0 BITMAP 38 68 7C 66 66 EC ENDCHAR STARTCHAR agrave ENCODING 224 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 20 10 00 70 98 78 D8 FC ENDCHAR STARTCHAR aacute ENCODING 225 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 10 20 00 70 98 78 D8 FC ENDCHAR STARTCHAR acircumflex ENCODING 226 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 20 50 00 70 98 78 D8 FC ENDCHAR STARTCHAR atilde ENCODING 227 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 68 90 00 70 98 78 D8 FC ENDCHAR STARTCHAR adieresis ENCODING 228 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 50 00 70 98 78 D8 FC ENDCHAR STARTCHAR aring ENCODING 229 SWIDTH 600 0 DWIDTH 6 0 BBX 6 9 0 0 BITMAP 30 48 30 00 70 98 78 D8 FC ENDCHAR STARTCHAR ae ENCODING 230 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 -1 0 BITMAP 6C B4 7C B0 DC ENDCHAR STARTCHAR ccedilla ENCODING 231 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 -2 BITMAP 70 D8 C0 D8 70 10 60 ENDCHAR STARTCHAR egrave ENCODING 232 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 40 20 00 70 D8 F8 C0 78 ENDCHAR STARTCHAR eacute ENCODING 233 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 20 40 00 70 D8 F8 C0 78 ENDCHAR STARTCHAR ecircumflex ENCODING 234 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 20 50 00 70 D8 F8 C0 78 ENDCHAR STARTCHAR edieresis ENCODING 235 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 50 00 70 D8 F8 C0 78 ENDCHAR STARTCHAR igrave ENCODING 236 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 20 10 00 70 30 30 30 FC ENDCHAR STARTCHAR iacute ENCODING 237 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 10 20 00 70 30 30 30 FC ENDCHAR STARTCHAR icircumflex ENCODING 238 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 0 BITMAP 20 50 00 70 30 30 30 FC ENDCHAR STARTCHAR idieresis ENCODING 239 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 50 00 70 30 30 30 FC ENDCHAR STARTCHAR eth ENCODING 240 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP D0 60 B0 78 D8 D8 D8 70 ENDCHAR STARTCHAR ntilde ENCODING 241 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 34 48 00 D8 6C 6C 6C 6E ENDCHAR STARTCHAR ograve ENCODING 242 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 40 20 00 70 D8 D8 D8 70 ENDCHAR STARTCHAR oacute ENCODING 243 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 20 40 00 70 D8 D8 D8 70 ENDCHAR STARTCHAR ocircumflex ENCODING 244 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 20 50 00 70 D8 D8 D8 70 ENDCHAR STARTCHAR otilde ENCODING 245 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 0 0 BITMAP 68 90 00 70 D8 D8 D8 70 ENDCHAR STARTCHAR odieresis ENCODING 246 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 0 BITMAP 50 00 70 D8 D8 D8 70 ENDCHAR STARTCHAR divide ENCODING 247 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 0 1 BITMAP 20 00 F8 00 20 ENDCHAR STARTCHAR oslash ENCODING 248 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 -1 BITMAP 08 70 D8 F8 D8 70 80 ENDCHAR STARTCHAR ugrave ENCODING 249 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 20 10 00 EC 6C 6C 6C 3E ENDCHAR STARTCHAR uacute ENCODING 250 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 10 20 00 EC 6C 6C 6C 3E ENDCHAR STARTCHAR ucircumflex ENCODING 251 SWIDTH 600 0 DWIDTH 6 0 BBX 7 8 -1 0 BITMAP 10 28 00 EC 6C 6C 6C 3E ENDCHAR STARTCHAR udieresis ENCODING 252 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP 28 00 EC 6C 6C 6C 3E ENDCHAR STARTCHAR yacute ENCODING 253 SWIDTH 600 0 DWIDTH 6 0 BBX 7 10 -1 -2 BITMAP 08 10 00 EE 6C 6C 28 38 30 F0 ENDCHAR STARTCHAR thorn ENCODING 254 SWIDTH 600 0 DWIDTH 6 0 BBX 6 9 -1 -2 BITMAP E0 60 78 6C 6C 6C 78 60 F0 ENDCHAR STARTCHAR ydieresis ENCODING 255 SWIDTH 600 0 DWIDTH 6 0 BBX 7 9 -1 -2 BITMAP 28 00 EE 6C 6C 28 38 30 F0 ENDCHAR STARTCHAR trademark ENCODING 8482 SWIDTH 600 0 DWIDTH 6 0 BBX 7 4 -1 3 BITMAP F6 5E 5A 5A ENDCHAR STARTCHAR perthousand ENCODING 8240 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 60 A8 D0 60 6C B4 D8 ENDCHAR STARTCHAR oe ENCODING 339 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP 6C B4 BC B0 6C ENDCHAR STARTCHAR fl ENCODING 64258 SWIDTH 600 0 DWIDTH 6 0 BBX 7 7 -1 0 BITMAP 3C 6C FC 6C 6C 6C FE ENDCHAR ENDFONT pillow-2.3.0/Images/lena.tar0000644000175000001440000014400012257506326014540 0ustar dokouserslena.jpg0000644000175000017500000001126412035116460011461 0ustar jamesjamesJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222Python Imaging Library" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?0E2JM>i5,FX{Wc4BOWIY01uɭ+`6uEz\3Qi#qZVVpb:)SEh̘\Tf&xid;.tgfm%a?to=j`I4V/2m7f2Y:[|Gj9bݣxoQFK}L7Gf֖I20:Vƞc4 z51vfs\ vs׈o5rq^xTHt%&,T*sB "u:D{@u{Ԏ4OX}nqɞki =CƴrxCh,c.GNI%Rw#ޛ!}*;uV;ʩ$tfUn}j#-coڶ];@<aC%뫩8.GSϭtV!M;ֱseF+V+Ig6r>2;?JQ{os :05g<*ʛC<.zIs-$'T~.}yK1އPksϫgti剮xÚ=5̎Y_mm3z= e]~eϦqk5R{).3,o5T0:jzYGfiO'ƇeFz-/NT"@'s?e^J++t4ڊ0z~Z"*7hCu3#M؃]}Ι7WWGwcb>jgTXV1x|6Ck&3/O$WIotbH>#V9%88nS pcN|r~#NB(tHx$Ve` ~_6/n2f2V5yuS9/tkwc*TfIlҸTӝ畊B:3{gc B(YAhgiU8JY<ыqSܜwJ}io)aFC#ϧNwH{k+G6q#+dec際+=NMr-sZډPoH a_:y7IF,']u.,&p5+3,;0ӍHy^p)EɕYuцc8>twak}Kc4krrwgB9he8Wax3qq]ÞvC:dVVǟZsjѵKyR,yu88qZgd5g'ڷ 61c*z+=>6Flr1ٵxyQٓl.WBWw,J'n$wV F8 q{o}9"I4$'b#P9oCU[߱vp8Fݪ y/I=q;~^4d/( +u?{vԨXI.nv,Al@ry IZǛR $o'T99EnXM4.d<SM-kc w[]ؖ >V9#ڰoN>nm"Wܱb011#8W~9^#A\tk˟}DŽבa1ʌ)5tҚIVv,K+ny7GWH儺>!8Q߈-i˟y'8'5@F.Uf |X>X9(aKWˢ*Ald$,x\ c̋P'P")@G*?*dmq6edoǥ^ԭd HJd՚^ Q_R.,xn0Xss57,ͽ  =Op3~'c5(+/Cȫ%۩p>r?]>&\t62s4} [CW`vX2NAҺ==،#ݳR f sf)#ۏ62Y9\[SkD-yC^r:$v ܘאX7[rskӖF5~V ,O7(ݙԊVgvbk.Xd"Az[h!\4ԙ:Ve6J5,ZmC!~h.g3q{tkp[b4c/s0ֽ>Q8eyO I)ݍ8WsUboGgѲ~R}1 z槿Y,0ܨ`AUW d6p,~arW4[Zú[v\).9x7K_ ͩbo0@2 [M*Eᄁ^e|?WZL"LzV=I}Ssk㼹,˹|zW02+mDe$gkgu.d Ŋvh+keݏI隒>o(xlzsQWgHҤC+c'^h&٤m/:uHtQ訇Q-G7O|\~yVIIetQY|F2)'5IrGt9/vvpDƒ@1ĀJrI>|ME\JMMabRGSK*DQ@$ hfR|C$eЮ⻉~$WO9ּ9S1*.O\ҽ #4:hBWGj9*ClO HrrsfʐbJ2 3#uֆ"<0=?4],Q)9$率ƽhh-N`o# RsOls\3WXU/C5{D ٷɒ }yԚ-ܓ-"۴sGSUSUra9ՁL#xk g@P#npBċwW"i+bsvD*6"'P+S6S0j$9;H;Y9dtkV:<.Q$ib;]?=#޲A8B 0c~'y< h !QFF`LWgr8M$)U[ɷ'`$+`+Szlw[ T_qk>XNީEiR^\gˉ8U}&AxnoppbkḸ>6W'#(=h+j*0De1H[kzpki!?r/:#h(Xg txuˌ{c.&!\m]mEA괘T Ƕ)!g,SeINr')*cՊhiVEQ$_pyO5Y\\6 w<j?5TonnGSU5W zuRIGQB7MJ(d* i0i)X#J0_5xj7cԧ $LA ^E*) { %uc 񲽵qC9>ի96V5~;?1vW?맪Mr|H v_WNEw}x?8#}8-\:E]o.lV "cҫ+E7M/S_4|#1!aTnm| +%+.?«jS*1]0lena.png0000644000175000017500000011153312035116460011465 0ustar jamesjamesPNG  IHDRL\"IDATx,.Ca}wmK[Wj$ahb@.D=ֲSd Z}:0x{y, 3 [[شKqԌ֚B%Y4$P$S4V L$I򿐤PDo"R!%!Fd~5OͮF" !$ $o0]t{C __\]w;r9E^d wďqoz;yzzm̎OtN@ Dǎ@M׀uHPHP0Z,WnJ- ̌F-$ja;"2ozmv3M 9""ma+8&̮Kgk!$?͟`ƾ8LӨZו$mۖe?y ٦$PhQdqP~<>]./7DJADj6ngM18]f5}C7z5 q F }DD9Xࠂwy3 \3"YdӄI`t@ BC :d&Z:nfSD9 `qሎZ\qp8uvL2 , bOET?O_dTJAKR-_!,]Avd읮x}(ꖐD;ۄ "0v*+υiw IKK]Ha8fv@E w4O !M|EV2i Z[׵6!25 cE5˲`0M]-y9ۛ]DpdQ[Nw??ϯO/LMJCA((ѝ7q!x ]kgż@#IFS$Ruy#T guI?do,:`) eXTLD&Aҁ,K[k8Nf ̒%XU{j[^nmaIO0cHH!Fif"QаGf=@Ezh0D hB$Z&ދ~RԜR:6F_؜A #0z.hvڰ_Na2}T1NP Dg' 4t{  B  wl{Mj8Ҙp9ed&qj e$ u\$N)3n ID F9vEve_l7W]K(~Ben6֓n8@5(ag>8g|1` p!0f4v-=>PL3LTZ+ z xNI)H6noO/:xr/mΑLKn@ C8@ ]6QtKP]ؙz$Hb$~W-3kٮMvWܵ rֽvpxIQzI3YjśHUۍ0=/q^ѭ xqDD(+6+$27rtK:+lk@ ߟp`5DZ44dB2$~LJQݭ< EBumϙ?aB2bj)'ɷP(5MFZLZg>v>iJ2LPL0BLX%;L6fG|izQ fvl:.ƚieߧrjTbJ3tҧ W"c^o?>!rs}p'6궢,^x֛ndXMKQ {oVW"ŋHۃKmĜC C2I, tsΦ(až{q!}4sATDe@88!pI:mjY1P:y] vQBH)AOũmp9 A+K_(bTr8nQ˟iiI=3?_/]\-BH#`Q/L;OA m (H(BH)B8ĥ.pw1>l ̪ZD$,37I$X+H*–?AQiR])yO5|&sUlp^{wKC|03.Y4vyn]U@KB.UZ!Z2UM] ZPͪ:vbSWw};]~Z'̀65ы|TMJA SUmv@EO@AaJ\TI^ј9"p8jamn(v 5&A1νEn˓D`.e`hrLfs ,L4J 8u{u}6#>jI- LX?;U9 ,Ġ.ɬRkݽﷷ7aswfflNy8)̓PI._4KNA D߄B2B&;HXB`uY4s[.<T,~~8cMhQPAɥ"fjĩPsJ, TO#m7TG:cR*ŚiZXBiU|^"M xϯǷi~x:5Ta0IZD׉V ERFQS$`0E{:??fu`,% iԶքf\{o44عAЮ6@bJd|# sGu}]]W2˱?m-Y0pYD ,">e6@um΀UXXL.l1E!B믟x1ɰ`u`dk-4zv ]k: ^㼨]p=a/ݎG"  JT(ZTHaU dD*\iq?m~~<~?1NmZ6*pW5/1 fZ_LNQg FИXSXS+Gؠ r\f,V~= rvc`hz9@nĔ2#RB9KH;7,}ŘQkݵ~XXD$C:D9#a#I9҄~VӉ`JZbTUܪ뾚<9ϣ1}x\1٪ٜ_K}E;ݤi4Msfq-?!3QnW6uƨc!(޹@ʲdf313"j2KG,ơ[R酌^<9F]%{\j>{/vRNWU7ClRamclu-ɜ B$R$%VF%,i"2UEVuUmLE&q <=N@g^혀B nAhˁhi L?vvbi^} n{vqA ( L"hCDk=9 x{l֟(DtN0=8lڪZ;IKDy>+˻czy D 117MVm*j У"T>RZkS;x|Z+1Zɲ̓Q2/O{DQ/`WLMNAFAD9kxIw.23H=U.:}&=|آpȢ3s> 9h,C)%c4MuR1Q 5$PXtU${ihdME=>&z8-w[xd[t=+[d.8SΒ "3q *Tb +HAc,K׶GQzCkseYht @DAmPY.VT;OAΝawEpeBHW6X#Qe3s-ƐXT;8U;j}r!FQDH_;~N=cR4(ʪn3@`|:Cn8" Ǻm0:2A(m0JCat˺PrH5dF\d>a ;YJjά1MϑnND:^9w>or2e 5#J\ۍ^\7y/gtDMNP mIi(ЂWb{`];%$/mOU0Ҍ4ߌUtq&̌dEQ1'@AdEU:$|J|z^fTY { #ugZ2EX]sLC2hy߶n!΃sE`{l^_>[,Q'bҷBȬuucuS @ #$!U}뺯תּ(E1CP$8*q^bd;N0Eq>F((|&` Ē(au=0d(,M^q=i˯)#؂ p3$W'1 @yN)SZ뜋iJ,)1j^9會Ԯ뺾8Rc8YEHb 9q,7NL:huB\ $$4+y7BhrGGFZ0媹_@J)Ji۶Yu]7#(&iT4+t]4 Fu.˲iR"ϋ4"m;k]}`dFjՏ#@qgw1w1@B\m~$E&E}RqzYeV|g`(c֢֩i};lN@w|c+vd x*$ .M1^š +7DP)*޿R J0g|Dy,_0 si.9R :[|4ϴR(@ąRjUɔ HDѣ@ozspnۻ6:~Oٱ}Uda֒EYVJ/JMF ,W} ?/oZMpZB$0|DpZW7uHiK8~LJAE5әB@ܹB])$]Ub'>c8f `xRGG=M[$2 ÐRbrYĜ۶i0QnqS.B&Mt֚H)1ր`tQVcǔq6S>}~a)Z ʨŒܝ]ǧg]\pByz_>6X,$x!"50ۻsR ڇVL;O1k%QwQRP"R"$?nMj̧笇Qsp&q#|9֚S%!niE!B3@ BSRZVmB GMsQu޺GYp`J =CbA !!B.vYYw bHRYRJ)@ds9BUďO.Lfg}r6_~}6:j]NcR NRBW%sP*7ۛk2k*eZk`P4JCAEgfg%#!PFSmoP6Q01ow_8z!tTyaHވ8;Z -ƑH !*slaS_zD,5͗m[C]Na<#"9|wpX^j¾af򄎉Jl̀#T*a%Wod]0&xg6k[)`_eZê<5]Rv HR˳(jطsd)1_L=N@2Ę"ƈ !C\BÕ8E$(Ĭ}(f4r ]F'øQH0"l1PjeY6MS59ODޑrQ`2d7]ǥSͅZcQmi~E*ra:"3BC9C =99tl7OϗWeɵR7Z R\ɶwz"g8D::wƻvXSƥΒwgrv>KNgGt\J !ql{l?,NAE1=  ((hB\\_5l41AFy =Ub{{NFDHܚAUM H|Pz[2"`{cle?䜻ϫ {^evE\L5P웰YT?:>g&2gDbP͐ 1qIfIt>9nwGhaT뺮*0\^_>^dB Lo,}g%p59<5{7]\MǢ /Lb4"bD;N@Eߛ=("T B.k'=R` WWWG:DD`Bk@c=x7j1|N4R"I4/-hq`1J.mʲ,ʨHBz{Eryu~qzF)l,g2}@?SCzs `Ym]O8U0*c],iAS۲4M1*FfZsυ >2nWY?>~^`wޮ>[e?Ul~YU@LSߔY\Kr (Ve)oMxvy:SZAH+M,J`FgIzIojBP )tH$俏ᜏ*"(3 5B&D"* 33 CFȄspYĔu Ә3<xd)ƓsӵMHDzcb9 jnWAλd9i ECŸ!8|jJ){4r|6T_^SAm ΅6f>?۫ZP4D".#jj9 ަg;aLMj@ 5v&fWH -zKBnxf$MNJt=>=-,7"e(y{-дX+3 -qۑx(@2"W R 2CRJ5Mu]j?cQjZZIGmڙD8+cDR)0S8;ǔB',&"=mOIc2z(:'_[^p8P" !rJ*c$}Y?yU,1dͥU+dEbCT"E"V՜݁<7Q iRiǧa9~ va0~~B-($ ^QXu(4%#!w`Xj^_TN1 E8L ]š-? @mqXD y9~eIe3Bl݀ 2Gì&Ҫ;~̼bN:^TD(m}6r`)HE"#Q,r-[h 1粏%zw9oj"?ߒ?1Xv;Z)fާx{^o qZ1y D<-i \[NALsѐMt{!Q QQ[8z'.X"W1YW@ C)UDdmֹ2Lj9c4]7Ou79"*E2FY ߿)QZCH%3LarL„9V }g*WqnnnNbe`LKef<﷛v~~ _ǾWU7|Uϼoj fVOW|hu0t@׷]^74N0׭;*'TBKqjgcs0}aOι`1yKJ "rνdt/hq ҴY%""c\>Dk9WJ5MSUH)EDc2ޏպ~lM!lBe7֘7"8J&9!D)ee!WE]Wi@|Qv BbBLeP>F^VJVƘV:WpkwGx;&x?\KOA{:CVa5ij?k?IyY!;ao}t}4;]>oMVa[ZkrnO@o@IiZk{>uUI(X.VS'O]dI0骜v.sݏhf<_lp<^34tZ,Ic̸x)\/" ZOHDIJ I؎t8<W7N;|+2&. #$  \%\J@g7&USPp 7ţS=TZ5%M> ?1t%OWepPZ/c$hXHJ񮗎9gk~zY,ʲD I+k6CV횐Xsx{40EM&y^l?X6P,y[fJBW2Gt21EaIA2yK),Zs.__%q&>>B32  m]{B(~Bk$ZO#q LJ@\Ҧ4дF.JTuQ UPdfθ־/n ey*)1c|Ũu1k cT9w\D(I`FwB(h@)%ð'ݝx&}7*+Td9!>i> 7 on/.:Ozx|vUk͂``)F+c4Un7O:/oQvZuh"d:F䖘D2&X?tJQsνwƦfF0DPE (A ѢwSH (qFνŕv=V9f`QmaXeD9 R $Ns"U6Ն\q+=S/jFϯã83Jƽt*Ri#utӋ^à NNnn..6sUk'Xx*Hp78Ik;rZk43uXTU(.Zj5c̪ fAm]AC5L\NP@}j"Kc@?#q,LLh%\zmoŅ~v39c E%X>-NsmP}H)=Qjb2a)-}s}ۃ̐ H4Q>=>7jQ8 +k՚\Aw{݇wM''ya6 K-^C1BR!#($@LȹJ5%Vs{b1ch6;uTuĽ$RGR֦ HD4w[ X } TN@gvnS`ԟ#;/4GB@BP@K]/HIf&s9"d(Nw_e L)Hym~cL OYfZ)Uw)q4[dBJ~q-+'qLRJof+* I̟;h{MG7wB6(TXe~J59ޢh|A[/n{9/dVA3K:/41@zcE4{׀]Z#{\FbvzyOJ,l8r@ xRs-|:ۇ[|Nn4iz«7;V)'fӽߥtqM&~|hjN~a `eʀCe̳aP wu;Q*+1C@XH2}txsS|ҶS0Q4 ,a>Hʟk ` LKKQƙqfRȔ0چHЮ(?ӪU((]$q9_#ҏxw>2+ `) HSJ( u]WUp0aݬhצhx)qfV732NZt&{-z}S$i窵;Q$J*ސPV,a\>)V*WAtxBoHE#{' c1c#w6APx-8vȦiZ7;ӯQ 7Lqe4X0N$e4P$P "Y%PlNPcmʢ^V"QyV.\}A_@EBL CKũ '3_W~&*B;%QfQ(s' #3pG;ػwNK&qal*r SM@+)"8CF DT VY03a DN@Eg_#N詠KçtP!1,ˎ=ko)F9mwKքm6fM*Ѹdu[Yk,EFo$?tU bBQ$0˲sY ~.9mEYgEha<8:x{] V4,˸\Aas,j2ZI{x=]G $ѦEH;RjKuoPB1& k*M"F54\N@ow) Cx'PxnT&U bEOoC+L&Lfxq "ɵ8,tlc65[8%`E4@)UnRE8=~tُ(.h^ZoL4趣h,Y,~?_l"dl2A=ޔvkWnY@2҉A8 5ZHJ92ጚfc,ak eAju%Zk0!1v&sZKQk)R s BȂ8L # sB4JQΧ36()KEQn h="*! 2hEH4_xy@}Ѽ _ү֠Z)w"h4ZBxHr3Vʞ\1b3^)^v/j+{#I -ln;{Ѵo,n" ^yk$sl+y}u{iƒqJo+?6vbEK!N9n:;.V(U97%ә?xaH) !$Pf|5(\B 4" ĈiJSP0" 4$ٽNPsu|}BHJ@P; Rx ):tRRbNM"Z169>Ƨ" ]FYk4J/3I,Y(-I *$u*/4Ձ Y]`,o}p27{/ nkFߍm0$4ݽ?~^WβlzwIrrUr; v=_|r31&Pq㇕xC֥XG%|et}1eLG wy&[Vsx2\˒!xcl#~ndŞbǼdL5`kQQHHuzv\JF$a#f,./ N͙=uöiugwψFlz t{#2\M>]LRl۲m2JHm7.riJ #kXs~'F5Kofͪx8'1&XNGvnwpfd/u|隲,r>oiلVwkiRJ7a(G1 (`^3hkԫf{{78AH.B~w{A"[M'X%:1 tDr5j8fIp'"f6 Vv(!wh7Y"|?ۈTbmad`A2*,Q`cU*1ﻔV9[b |-QФRr.: MBZJ\ӄRTJ@F'3e6mlVZw1EB셈xQ)fET1>|(R_ ?ZPIe%Z.x5 F/yW7>''Lϯ(2*kdu<:Z"(֛4^&׸>;=m?'e#kD6 TCմLC[a/HW< hYTרkM4]yUd@0M͋4 zmZt!86Nc$DUJHp}Txz !@ ^~׳ p@Ho,J@F3tEU/(nm]AMQ RP(vҙ%]qæpXc/!@K(#0fи &c1"}~om_N_+!*Q7NNߧJ)BEW/O-8=E \ΣН<2cdyVUU]{Iy:e%Tllh h!KɃmX+ df)moMedB(DlV5IG*=6MqԞXTʿgIQR:nw'Fǭ.Ih!A=(76""\]N@Z > VhךoPBMܩk3 ㎋~]ܛs<_u]#-~m6h4ÝUU+˲~Nb˰eNƗgMϋxruw;}y-+^AQ<`dt:[wm*TԪbQ^Fc%;WskιXvAcXJ<;1+8d=cgwZ RH0&`+ r MF1m!`"<=KAfn1AIF"_%ZKZԒ?&!_ev,6\73B@Z2`Jg(6Wro0}}O6JLg"|(Wq$NGH=s`w7NZll$.QDFwzrTĺGCMDXk jn0!R@s6T+-U^VθdFQsFnωEd\,^@U8=>l8.̠Q2~\ș@LJ@d[ZKZY|7KFܵ *If ,Y||ibƪ8"։uT5²=R[ి>?_1&]%q<)pi$͗G'zZ2sgOAg?dW@5\F)ƟߩWO,CV\i}al^diX 4 BV(,Lus뗹%EZ:7b砧&niʬQAD)q\ ʒV:"(qP=_O4MJ#AWSIk`NxAA\sʽi\{Cf&FbLR ǃ||\HAD-Rv[~)=`&I b^u Ui &ۛLJyUÝӥyv@h_¦_GbI1Zem 27Y'%H.hzL"JңA iù K4GMFIH<nܐCՋtG`:? h;UE۠6$P_9G.pmݖ6_b^V @)ȸ0J)gmJODN@ܙii)TPLHW00.\w7Jܘ(P!ס}s|JP*j/%B"*Dc8=#40[dl֫ˋQ `M2N#:/ dt5D!ۢl{O^ F 6t||"`T0#$hq1Qzh^rg4nHq C> n/d[U_K$'eӮʲႄxmi8uUB  -( TMN@yiv҉6K+Ҹ23UNa .^ hu>\BĻ=;1&ضM)~5hVQI1r0Lt4c{P}6Zq YM8yY|nnp$N[&N~SDQl6)EQlK)I$i ]æ~bܺGl2ǫU=y(.+~9Z4MBL˲Ƙ|Ik{\18/ cM)P%+kΏDJڔB2*BZz" @L;N@wg7~)F%#H|rtp $ą 9J!!~,źGg@D-P#6E2BU;"j r$nzQeY6͞__Fh4z|xBN8|zA7S7W~4\y~=*%*0 =`F@4EQQA" e$kq$43IBJRb#aoeiYpn{AXnQͪ, !>G#Rn[Z7H[u Jϱ=&( [1JP5^dJ@ݬ٪ 4^ ^9[IѪm61;W?1zr4h?/ c42$̲^U]V+cLQieMtp]Fy~MZݾ|x_.I(秗ϏxϼNgﬕR'r:3@CH5Jm~6,HYܴպJ" qd[eI7td9g]LQ ApDG,=y׋ʑB!^AVLN@g˖Ӛ{ I@A[@w3o0d. @O c0X`X4LYE(?1nۭVXm^T(ٜRUb\ա(6yؚT-z9)gfS%$ZwDoMMp-sƶz. glȠg~QDdl" #Ʈ_DN@FN ֆB# ]h7pod wFB@ "cqLۙR|sssp@∋ 3o~^Zv{i$@#?6[ە8m)%<ϲJ֓y٭\^]p螝:wAXݯ}D)ˆ~ZVPp  5-r>yǏ#4^PC( &@ƋrIa:go]7A9ࢮIL#9E4۟1ly p$1ZFT42h߿j4/jJm(8 htr|:j.nMo?;KwJvqxߑ-eX `:JDCj|YYmE%kRpEyOnjronr GO:n~\nöe2vS"rU7H5vA 5"0"W,I HJYk@ΌZ`fLN@F>KSU *х>|ԄD2O;u11N򭾜CZL\*DJ)~O!Դi b1 :h+wUv(ΓϲlPʗ74 ,I$c IN BQ2jm6{4u(cck-A8,d4i:Oϒ1I}W!C.Uԍ2RrZ)@=]7`?W8C1`͇n|`SB9B@npJ!Lk縔^\# ,NA]Ĭ z#\b< ]֝mWԥ"@c eYVFԑAPD:>׻Z.Yj]lQlfb1 <t4]דp8z[}77"YJbwžLB .1B !fc)Q5YM'~6;}x|ޙ(XC,SbbHM92 'D$ 2Q7epCUXCI k`dDh CU4PW?Obq2TU5I`v}mUΨ(GD"NZpށ #*նzYmΞ+Y1vF1M3THhs#hGH -V,M6MT Zߒ*"ADMN0O~ j++*!׀ $(Q:NYK<4O})<g-Ї,m ˯wU}:93]-UUVEukIXMQeYfc!HI<8>8nZ[۹q$B.Ĉ" ޼8|~T'TI&3)sRfc5"")@hm(#0s Edх9!IAPzJt|J@/LNPgmVS` D;Ĉ))͸(_ٜ|`>PyPk>HgXkL{8l6|W7b1NWv=˻Ϗ/ךi /)˓f>\_$':{V" kL?4f>`"9D)BMt8-R{$#Ь4FKzZ1ȹFEE:"DE!A7*{$P4uX F lyU ?DIOA_wOH14$^<\IcTDաRG#@ @"Wm@MԮq~~Rnex<^ޯbp3\.y;I/Un_L m=ܖeY"jkiݹwVCfٕjN8Bsqq*$Fmt6GH`Bsr"V j͙ 8Js 54HE'v@D=zO\H$ 51Q 0 EGiLN@ϞRQWРXxQ}d2|7$0X؉K/>1& =^y3~fe㱪ݹ,fY{^1GUNΆﯺ(JO"RlV4,v#Mf Z!a`ɓdc7Nz*9o-5֡yd]{7zk"inu6>$BI-M_[LDeLȂFԿqVuHsu =L *(۶_4KN@DgeD bg _(QQ؉3,LPzON%b+B `BN @w<-W0J/PwZ"Ͼ6Y/,/ >1-ʳq{a vH)%etpMs6f7D-"\UXU[+bfIBQ w(  t'aey:ӠuD2EH#"Q7S4Hk%L#aRA18 }$I/QOV;āh?@APMKcPN;3o7Ne1etB0cJy*+K˭Ru.oǧ7w S sh$jsuIޠu{oP8?Z-˒0kF{oeud"aAJ@ 0(X }~zJ~}zqDsHp"d4{_?Aua<94Ԇ%7sjӏ̫EF!@4"sN !CR*)%ο!"oo3$q(PND˩8D}ă^tչ~xxF$KJAtWuL'Ì!܈Dƥ7GpN oDQĈ"1dzEu3&c)gden0ihzvuS$IƩvkW7jmmnuxyq.'h$J9ٱg@'lڋ8Jj˶@R2T톮&Ƌ9:??x>4MPGB:,yvfltyN^JI3 T"`Y0,be. ) =޽߾۩ͷ8$J1F'6jxA/`ⳉ@q/hƂTpWh3L$.-|JTeK5ze{bR&GBR:'gd0DQ, TTJ GN^\hcW{OZR^@ 13CN8`5)ˍFRS㬇flR2@9<@,d RmLo/D~?,rkAS(  ZJi*1hf "mt&$_a&ZqKrDH+6%ou6o./5$KN@g㣥(T% /4Kt׊[tmJDMЖfe/2R:%˲Te1Y-"19z=jn":Md:A>&`{w/MzB^U!v8v:[[͍FǓ(>F\EQx x xF8mɵZF%u!K(,H9aQ%-qA}s}d3zs)+RQ(qޣ( RjkVF)g^}~zB(Z+γl>7tZ˂g@AR׫QP*.>Aw7if&_w>z{};-W&4%RJlp ۻFl6WUBEL//&r9Ǒ0 <#Ao EP!D2dc ڒ$ɲ,D!4!tu,1&+x2j+7ZG:|}rv::[|i&*DA)Ң)yݲ,۶-r,dL%''ZW4t\볬(i&JkS7~a0P4JQſ;wsG)7.,ڶZT/&=M @2\D¢?;k1 gs;?4M&Ʌ;Fa-?9Mt"\.O}V?0ǗZmw.ϯ&#w)M pn_Ff9X,YEqE(:Jq4϶Cv*+Rag 8C2%gT -`4f~,oi0)w7h<ɓ}|)n 4sH]hKB[ımm!+,ӸR e2}4jjF:\ف#A4.A曝ٮݮ.!qRD$H'nA%\@HFQ?;?7g~)B ^c!O Y(?t:'gGssYAen72wJ(M꽗 kU`0 ԓ4Ͽvպ8o6w[;@ns8g$BTǓHZk )k2 U9SNF< "J1oPݽm}i*hQq矿Ӣ,JSX( "0ƊU;UmnSPEf^lb<h4$_;M?L[N@Σ3}< |cD@܍aWQ4&JXMBt^~p?=>=d08-Z Uxͫ,ˣ( 1,8n4M/g~"`n~],9˪~u(a.(B$ҢQ]W4=q(|: acƲ,ϳݠBӞaBw\ ˱ F @5022AϡΦꆋh0ƌ1 Qo!{pB(T}t\:˦8l⍪ljԶDp>4пD]N@N;'AT1lĠF(E ̝񡊻89wGZ8F6Eڳ,ijz3^1,Ku9FUv'gZ.U{~eteJʝj& 0tQQIx'"$\z @םgh=\Ν֏?m_T`%c+j2ǧ*"?MSD;j;JY߅QQSե&Au1"j\)J ARJ"jd?LN@ E<#MZɢl7BYt$UBDI2c/X֕e{WMJJq +!D$q>l^QZk@ p8WZC4uK57 Z81$oac,[ߝ !4hMb8qqt8s4ѡ@C(G@Ȃ'0Mlߘ &u w]V-y4f< d_`][{d4Bk 8HD]R@g& Y8=?'@ $KaƇBtwǸrYZ銽x*˫_|vi^$}a8g`0:R?urXшڝ$iqe1/ w5#]6JzDj Z4SD8@+ENB8Ƿf%eHʼ,Rqi-!?'~wy@hSdhua)U%B-RDn0^%-hVX95 A#b^I?e5 is([oK4(cB<ϵa5X, D~to7qq1h]]WɲlZY.nGi"bQJ6Nƣq<$gx/ϫ*$Iá}9l?a,eY 24M(6unSI)~'uug5E*K;K/mo{ 2DB݅<>=holm˲s7 %ΜQHzӹB[wQB8 %p<R15 \QN@gfaeY(+#G {ޡ'0f$!%C 1&~:O@)5癯m̌2eY !1Z8u]d銈_o(p8l[8Ins5<i<.l,Uy; S̙2Eëv7׭hl8Q$KT)%Gǫ8G}  ,s傇 Z74f,x`4\N@wN_@cGL ?&,uA,t^.~ᜓ9A1&Z8M$9jJ(?U5*,iK16MScd2Yk]G)Wq!eC]O/eg#VX,Шԕy^y3@p_D?ظys /?YΧ {NޜwE~ն;}u2gX@ijxDyDZ3* SD Biq:T'8w!qss!4XVX,U(fSUU!k` NS1,֘j#"TH@QcPpE4M"\>f3"\$I\1(mP阚D #Ϗjn t]Ҷ~p”\uol~h{{׷/DKN0@u6\(gqKnJ"Hq,L3{0/(@G-*8ay܆|<!H9cRJʂJ*!D^ EQ\?M)ΧF9}}Ӟ J1D)!"2dI)2c\UU4jumf|r{ZR %a:yL&!uQ,8uqwNKZ !·Dؿ}ɮC;:D )aJ%xd9gAYwӘz)mFKG N!!7&vn:vi;ʄ!e"8{En?4[N0DGB% x BN.ql__u13:)ELQii.KCsb1GfF,,p=8($J0N] Ƙ͜RbXnnr,۶:Ia߷4e\d'.+kƜbxzy&fgQ#i9^ >|2e$"@ WA,3 !1S0 3pIuy|t?z+[aa1G8m m3kf춝SڦCV''s{rT@?LKNA{근'#CHdCĸ EȉUA;`'9?^UWEYZQ""EFQ`4""G Ҭ*Z)50,D/"6'y6u0zݾhnJ`#6M{xk1k׮{M8<nd'm۫ł^?GJ=V@]uĹNˢY^_/ge黝,}!Lj8>TOE@Gy5& C&x4 {cT~#,qQfG go;%E1.u߇&f\^WU[E2qJ ~|A 80XTJ 4J1d27tiCW\Ϣҽn|BAnDj+SE:_P"2>>^D$0zc=BXqFx u!sRUfZK)'r/:U [(RFe."5x6(UЀF7 âh~j]D2 ! I=1XkhLSJιﺶ֜]n%$z @^^Am(d ; վi\pZAH/\IN@Et;`3\ # %D($E{%U*D =:0BDJAmYuQu]7#k(\4M]8ܿx.qvrzm9/R( (X(X h,#>~./oZ1",hߚ`!g 񕂁w ^'tQ*ؘq1MG9ah,%6NT|xy]|}ex0Rfٔsڬ]G cTo|QkDJ@F&؅ q[ .څ\ (P*6ҴKw19ݮ_cR׽A)%g#m@BۭAp!`h4}'.!XU mBtX'g{6-s 75R9O7_Aqq>4Z9[3.l I5e(' y-H# ҈m$D$u؀cH) o' w?*fxF@}xy_ݭ>>1ӓIBHUTE4ͯsM9ʴ.X$y#H<_esR:kaQdvqR@L(;6_nwXoNuV[8gOϏK_.n{b)a3uYF B EY4] Nh$Oj=ll|$)RQr`&{@QLI? G{iZ.SX=̥AMvJkjCn D,Bc>?4KJAgzQ0B^ >^CnD1!I].:^ZzQO=j+ωlQ DQr xdצ^z9!PJA~?nRӗaYUW׷7>h~txu2 ΑnǽnY*j]2z9+U@@K,On7,?:̘BR9L0BNL kZI^gO;)z>[odUUjIk:dKn0EDIUO+hYL*̑Avз9!b!RuMcsJUUeԈ\P0\oӨ6r#9{? UJ9jl[3- LjZ?v϶k5˙➻RI\i*xAp#ݤa B@i$ePJ& O( hH4rJ]K{_`$#T8Zr%%Xq [P2̵!H [k(W96LN0w$vmjűB^O38"4Oۻ,$aG;s2}1z K"Xȴ+?䎈!Eb!̲iei97n.E^~xz|9oS7.1[: ֺjng;7[+aB|5v(Hy #H:MO0R"s36q*J,:usT  I@.Y& ӎj~1-!Li4ϯ(1*g_d]N0ԶM uC/!yYSLpdK3}a Mȿ1C*ض{]Jj]׺caŲ=#1o"W):V1EW/>e7Eޘkqrdpom|uwphp]݋Yr[XF[L`LhOgOhPmUgRiQmPoWsR{WxTxT~^Ё[[Wρ]ρZӄ]˅n~\ԁZҁV҃]؁VӃ^~VЁ[ςa҆e҂[ց^}VyU~Ẃc~YӁX|\́Z|[~^υgՀYЂ^σ_΂aЁ\}XЀ[Ђb}Z̀cЁb~W}Ý`{Z{bybnZlSh\wlψnٓquwzz~ndhߘgޝjcoޚpۛmޘfۖiٗo֓kޝmˁ٢ݟ֕ץjdMkXvWy[|Tx`zZt]k}_Ҁ`ԋg^RgIYW'7X/DZ-8a1:f6=hfzkjvmrmwijo`ٍ_pMYM\J`LjQlQiMeIeMfPjPgNrQwPxT{\ǁ]YyR͂]΁ZЃÝaȀĝdσaӁYтZцfֆc}X{UӂaуcЅl{V}TxS|\{^^}_|\|W|Xр^^ԁ]́`ρ]чez]ɀZ΄bρ\}Y}]W}\^Ѕ`}]w`{bnWpZlZsbσhהyݜ|w{ysޟrrnfgnkߝvۜvژlڕcהfّl֔ky՘ٟޤˌnNkTuTuUz\xdxVx]|`ȃ`ъgYIT/DW-D^3D\*7e5Bj5A^2Y-?Z,>e6Ba.:`3Bd4=Z,6hgxzyxoirndlja؈\fKSDZGYJpedLePeQeQbPcHkMrRx\x[}_vWxW{WȀf{[yU|c}\|\{W~Ỳ^c|X}Wуbс^υmԁczW}[zT~YzPtRySvVxQsTyV~[a̓f́dρc~Y~`̀dρd|VˁdzZUˁ]{WxVx_uYu^t^lVr^̂iԋlԓzٕsܞ{xޟwݚsrtߚhgߙlޚkߙfߙmݘlڕkِjڏ`׌]֍_ˈڤާޥƅdOkRqYoS|`ʃaaQ[.>W-AW*:\3C`3B`4@`7Ib,:_-:Z);ljyt|gqfwefkk]ۈYjQRE`O`LcOjUbJbIfMfOhRkSw^xSvSY{Zc|[ʂg{WÝeщsZh}\Ѕg~YҀbԃdҁ]|Vфc~U~]Y~bzfɃuȫȨyhvX|UvTz\z]y[ǀac]͂b|[^΁d}Pʂdσà_y`w]nToRk\s_ƁkӊkՒtؘyۘtܖmޝxߜ|ܛsjߜqmhcߝqߙhdٕo֌aڐdڎ]ُcԐmmЋݦ߫י՚bjSkSo]}[^OY+:U+;U)?`1D\1Bk>Jb3Ci7H_/;_/;]1?rnprua[ޓbmemsshߋ\oR[PWG_LdPeOhQeOjNeMkMsUpRvSxUxV}W}VV~]ρ^~Z]҅hYyZҁb{]τd[ЄbՄX}V}eˑ̟ΡղѴضƴԼԯջs[sYʁgyY{Xǃl~g΂a}]{XЁi~a~_~`xRw\s\rckWpa|^؊gבn֑s׏nܗrۖqݙspܕhmޖilegۖlߖgۏ^֏a׏fڏ\֌]ԍgՑdă٨ޤˉkQpW|`\LT%8X1HX0D`0>c7Ab6@a8Gf>La-:[):c/b2;i;H_-8d3?^4F\+8c1:\*6],9gruqYفN{LيZhdmolg܄VkOM@UG[FaM_H_IdMbLgOfOkRpQtUzTyRyZzV~[~]zYX|[ҁ\\}Z{^фkɄq͕x_ĉqƏz~Ȕ˔|͔tɓŐʑv͞Ӣ{ղׯҺҷլټջȥİoUsZ|ce{_x_ЀcwXw]y[oSrXpQiSm]oS`׌iٓlܕw֒oۓoڔs֕w٘uܝmܔhܔiڒhܗkّb܎`ݑhڑm؍g،aَ`َdٍ^Ջ_х^uکާڗxXX,AQ';U&8W0Ae9Ce1>h8G`3<[2E`/Ag9Fa8L[,=_.:jhkgYnBlKۇ[fsmnknXoOYKLHVK\SngdJaLaIfKhTnUqPvRv[|\zZyPzQzVЀ_сiс_̀ayWӇk֕qʐuj„n~mvhj|srƐ̤ǜǬѦұɧԩװѶܷįůjZlRpVzcy]zas[zav^t]sUp_lYfNpZ}j׈gܒnޔmُjۓj۔kۓuۓnܗokٍaۍ`׏fܒfېfܑaڑh׍e،eڍ]ێZ܍]ڏ_։_؎dɊܠ孾pLT-AY-EX/?a2@j8Gc4Ei=K`.?X+@d3Ac5Fb1A^-:g29roa_xIRAqKی\erjmm_܌^lIJDTIVG]K]NaJjNfOfPjUoZsZsLrSrRuR{]}`vY|\}azWz\ymRzevUzg|hzf|ąlt‹włeńkͥǟԡyӰ׷ۺԽڹ޿ִŸٿǫlYkTubvWs]uWs[sVpTpWjPh^lU`،mߔmܔnݓjܐmڒkגqےoݓlޙoېdهZ`ތ\ۗlލ]َ`ڍiՊ`ێbՌdؒjّj،`؏_mۥwK&=U*=W*:Z.?j;Gc5Ag4@\,:T(=^->^/:V+7_.;f6AW'4uhڄR^EJDqMۉVmmiuel߇YjOF>M?[NZKbRaNaOeReMdIjOqZrStZuSxWw_v[π^b}[{ZyWrPoZv\u\pxmzd}lÈvt̑xĉtɉkNJq˗~ӣ}ӲҳԦ|ӸֶܾٷབྷڿãźìǺȰӽfTjYiRoUpXr\r_p[iYjNaPoY_ߎcnݘtiۏm֎jӎi֏l܍iڔqߓfڏfޏdސcݐaۑiٍeސc،cُeܐhݏ_܎`܎aޔjޕfˆuU';V*@T,CZ.d3>f4>g6A_1>Q(;e;Ga1?U,?c5En@LkNHULWKYJfX~bܐllohmjӇji\f19^0EaXwZۋfnޑlߎbߏc_ݍ`ߎhfmxAET%9\3AY*Y,@n:BY.;X5D].<]4EmHYR`ytȑwјunԞy[JWNYH^QVCZPjNڊ[ftxv}cوjjPNJKFWIaN`QdRcN`HdOiYgRq[sSsPt[wZ{_uZ{XsXnTnUpWrWoRn`}tpuygye^Ҋfǐ|ǎqёnŇlϏjˑx΋tΑzݲĕŦʪʰʴͼϰŨþ̼̯Ǧıǚj\JAM?YM_L}[܍hznlnj؈fdKk08R)dQԈkݑjdaَhތ`ލhihftRX+j5\0Di9OjeȑwƍsɒuО֥٣~UG[H^N]LVH]UudڈUio}zpa݄UhTLFKA\QaKe]hZhMcObNaMpWmTnPwTvWoXrP|W^JaMkQsWlUjVtXmYulx_~dȏnǍ{ΆkʉkҔxȆlǀpÅhχg͉brܲ޿ƴƵݺùİ®пѽŰ̼Ͷϸʱкпt;SIvX܍grlouݗuՆciUw:?]-=_.;[(7s45aJ{SՎkڊ\ކU܌`iyLW)9V+<_0Aa2=f0=c6i5@c7AP(?}KU̖ĊpǓ{ӡzӟvԢ}أyYHXIZO[NXFQEjOؑkdjrsvi܋\nVOFOKVH]NaK`GeOaPgTm]mSmYoRtYmPk^Ȁ`TiYfUsYnSsTlTu^vZ}Wi̅lυeЎiƂh΀]щnďyyhn^zpߵ⽙߼ผݯշǰŷɽ۽ʶȷʾ̹κֿθнȚXPJFpL܈afkߗqguևdgRx>K`.C](4^,6S".p=EϿչپӿؓob/AU*<[.@^1=f1=h9Ff;Gh9K`8H^-8^0Gh8Hb1;[/=d7KyїyŇpÍwԣӠxӟ|ҟ՞yXK\LYK[O]RUFkOՌhlww䦈mc؉^fHEBPGVFXG^J^NbL]IeWmVeOjOmSpOeOϊ`efUiPmUq]|UmWsW{jiZʁi΁_ώn~nЈap̆jxWyfrfʙܲݯ亓جׯƱԯţŰīIJ˸¦ŷ̻ܿòн϶ȼ̹úGAnWԇlqlhskֈhkSr;A[)7Z'8U'8Q.AγմնпԱL&AQ,CZ-Ah3@d3?gAKa2?`1?d5Cb4Dc4Gja3>d1=V.A_0[2Dd5Cc0:_/9\.=d6Jm8Cf3^.8[,=d2Cf4?W*6Z-BuӛȏzЙףzҠ՝|֞јzӝ֛yјzҙvdM`FcOdPaH`IqHߌ]ߘipsssmߎ]nKOCMCYKbTbKaG`IhP`IeLkOlLlRYKڥ᥄zThQmVbMaPqQqZ_YyY|cfU{[ubД֚ښnғqЗxxl۠ئ؟رۤӢפ׼޸Ӕ{ۻ۩ү࿪ڲױܼ׮߿۬װ׵߽ػԷپĶ׼įĸӵѼƽرߓ`iïԫֵױԿϴȴʸDZʷιͼѿ޺L'@W2G\2Da2A^0>]+:Z-:d3@c8Io>N^cϓ|Д~Βx֞}֠֠}֞~ӟ~֠{њ}̖јzіxgNdPgQgKaH`HqMۊ_lgkuushoQJc3A^->k>Pj7?a3].Aa5Aa2?[)7a0;Y-=Pay|ӗ{Ғr͗Ԟ֠ӢٟաҜҞҝ~ѝԞ}ԛs֚qbI_LWHaLbMbLpKۊXfvuuvi`jMMENG\FdSdTbI^IbOaM`FhMfF`GeM{{cݒjٌe}Xk\]NhQkMˌqՍkρ`Їgϋc~f֏q֐n̑ϏvԜuʘۢx֕~Ӓw٦ڞxܚۭڟ~إ۠Օ}ݱۣ՝f̞׫֮٨ܯث۸دէҬԭմʠѧʥбܺIJαȶñܾİűȲȵ̺ͼͺϻșׯ}kҡܷ˹N%9W)5c8D^0:U+:f6>\-:n?R`hՕxԗ˓؞գӟ~֚wӝҝ՞zҙx՜rМ~ҟ{Ӝ~њ{^G]I]J^H[HaOnLߍ[fuppqkekRSKRNXK`K\L^J^HcMaDgNdHcM]I}Q}ޛzڑqyVчfv[cIdN׋iՎpԇhʃgǃdɂfוxևa͎zՑjʋsАxԖxҐuӔ|ܡyٙ~ٕ֝t՞ћѢۥ۫юpŕ׬ۭۡӟٱخӤק֢֨ӜǗʟݭ⼋è͵Ǭî­ŰŪȵʺ̸˵ʹҺʛШĉt٩͗иS.@Y1K[1=a8@];MY*;c2@\/EyG\v֚|ΐ{ΖӞ}ӠОқњxӞӡ՞Л}ϝwΚyΙv՚w]FcO_JbNaJfIvVߌ\mtsx{hkqRK@J@XG_NfRaK]D`HcMbMcL`FWG^~s]RڂS_uObGэi֊j˃hǁd|`~kٓoυcזuВv|pĉ~Ӗyьjؔuڡڙ~ԕɏϝuvX^˖ך{ݣ٢ؤ|ќݥ؛ҠӢТЫј{ėڹٲ̳ãڻոۿůDzƯ˷̺˺ʴͽǴΥŌzϚjl`بI$=V+?a8J]3AX.?iBPc1=d6Jae֘yє̓yҝנؠy՞Ӛzњtԛ~՞}ӜК|П{Ӝ}НԜs]JbNcJdPcLhQuRZospxluZkKKAPGZFbS_K^F_F`LfN_GbH]FTFؒNÇnTY[^ۈVoa΁ax_̃iˑ|ňuڎkъqҏl{fDŽn͌vЊ`ԖyҔ}ӖSZ}mgUYjj_aʐ̙\ct٠ة‰~ררxh7LʛƎڪڻdzȪƭڽİƲȳưȴ͸ɲ̹йҿһҧƙzQJcWտoL"6Y-?`18[(7_0Cl9?\1Ei7Ltٜw̒ϗ~ԟ{٢|֠ӚzНњ|Ԝzҟ|Ӝ~Ԛ|Лwѝ|ϜΜ|dTcTdSbLaPeLwRWisqw|ncqRLCKATEbQ^HcLdOeLhOaGbJ`BVDPËe\YcXo^t\{er{oȉuЇcЇi͏u}n΂eɇtʆmύtהzӑsq͊qxmjk]hZeoE\֦أqE_\krqai_2KlEb^nR,I̜彙СԵŪܾƬñõŭɺɸʲɶη̻˵θϳΞXDTH\NxkڹT,AT)<_/=a.9X)7f3=^/:X0FdgҖЕ͔֢ӟ֝Ӟ՟zКwќ|Ӛ{Ϝ|ҜzΛЛ~̙ЙyԚy^KgQbQ_MeMmEtL[brlspgisOPHK@TJ]JdP_GcMfRaL`JbHdMXDcExjjVً\[vaq_tYÀljaȂj͉nȄnҎqʀdȄm҈iȅlȉwӑzʎemĉ~q{dityegpYpmHed;\c;ZtNoX.?P'AS4VL,NԘtӥȸȫèìūįDZȴȯɺмͻϿȫ|PRF`RZI`Pq_ݴѲD5R-@[0Bb3Ba3>V+8i9CY.Ve^3Id]5M?1E&Bͳu̱ũĦƪ©ĩݾåñ׿ۿī°͸ɬһͮ\MRGTEVH\Niaʗ湘˨a03U'=X,=c3A`.=^-?c2_1?`4A`5Cd3>_,;[-SfA[U_c@RZ-EqFYX+@oFjM\a1Ec8UsgQ'Ata@4_lٝlnݴǦٷԱջ׵ѵЯմظ°Ĥг~PSpBJv~xަyvr鷒͟a.1U';\-8_.;l8Ab7?a1;^-7d4>`>O\7KpmғsϒxӞף~֥ԤӦ֣ԣҞҟѝΟ͝Μ͝˛ʙ}Ζt͖ykViWfRdKdGfGrNVjrotuyauPNFGCWH\IcObJ_KbMaJeM`KfLeF`FZLܱڥ䭄qYIӌo̅oʉ{b^zh{bzny`σkՊoϊv|h:Gc4Ad5D]+6f28X0Ae:N|Ǐxʑ|֤|ڧ~ק֤بסѣҢӡ~Ѡ͜ҝΜ̙͛͟͝ΘjSmWiPgUbL\CoNۊ^aw|son`uRJ?NGNH[J_NaJgQaKbM^GcPiLhNiQbLWKݵ}谀}wS{_͆prf{c΀d~jvcrq̇w|vpfg[ii>XZlY.EQ&AoB`huP$8a2P^1=[.@a/Db5Nf>TW-NpQWn~⼒Ῡª׺ѵϱԷԮѨ׷պչֻ׵Ī竉SRooRTezkvǓ婁 ⷃV,<\.9U%4b3?h5@k9Ap?G^1;U)8\+>c6Bb8NXXsqК֨٨ע~ԥբ֢ԣ֡ўңҢНќ|Ϛ͝}ʘ{Ǖ~˖|jWjViRcMgS_NiM֊`mypuqkgxYKCF[/CqH_vkm~ӣ٦գףץաԣ֣ա|Ӡϛ|ќyџ~͝Нx̝˘zϛ|ȕqXkVkS_J`KZFgJڃUgxkxyvdwVIDHDXJUGeObP_L_J^MbLcLjPqXyeoS_OЂPٔčwwd|d_T{hzg}yȇpτkqr̃nqusAVf;Qh9SaqCZ\2KZ3PpB^evK_X-?]/@`4FZ.>W1D\4Mh|}XjҪխֵҰ̩ѴϮӰײаͪĥ뿩ĭŮġwaHHSmvP_ÊzSBT$5S):^/@f;Ji8?m;Bi6Ba0W+AU]plјo4AY,<[/i4;rDRe8Dj4@]-;_0>`/=e5D_.Ftnv}q–ӤդץԤզ}Πՠѣ֥ӣ}ҡҟzӣџѠѝzНИq͗vjVhRbOfUdQ]JjOه_j{uzvuhuQRJK=OC]N_JbQeNfW_KiSeNlRnTsRmUgIcK͍֚gSgNoZwmp]΄qmY{g{hhnR%;[oZ.>W)@].B]5OwPlqHZb8SSo`9\|Pi~W{O);F!7e_ĞӤ׮ڿҪ΢ɟѵհߢ笉컞ǪäȩǨ˭϶ͳ촏lJJE\/APQwDQ͝]0HY3E]-:c1:f1>f6Ej8Bh3;g6F\'4f19X1?uHTuuƐx˛}ēv˘Ԥ֩ӥӤ|Ң~գҤբԠћyРҠ~ϝ{͟~Ιz̖wʔ{cNlXiVdNbO[EcN؆^hrz|srdzZPJQITD]MeOkUl[cJhOhYfMgT{RrXvTlN`P贃jPwimQh^͂dw\PSxHQIQ[_\.D[nU*Ea2>_0A`4Af69Z-EhiĐo|iΘwўʗyė˓~˘}͜ϞѢ}ӟzԣСңРԤ~М{ћzҜwҝ}Θ~̕}lTgQeOgRgT[EfHԅajzwusnepWSMSJUE^ScOfUjWgQbJaQcNԆbrQqQtWsSmZS伕tPoPr\}hȄyׅkg[Y[`4GT&:f9Wo@K[.Ik>QlAUa7KX)AqG_g7SfX{[,?k@_C9Y]Єl̒ܪۭ׫ѦؾӳѬ̦ؑn訄䮑ĪɹʲͱһѷӺɨzWBa.;Q":vJRϤ]6IfI`i8Di:Fh=Fl>Gr^/X-;RWȓrɘ~צ|ңѣϜ}ɜ~̜{ɗ}ɛs~ŒuǑuǓxʚ~͟Ϛyʙ|Ν~Λ֛{ϔwfPcQfQcN]H[BdK؊ag}쫀ꮆtuuvWTLOHYR_OgSgZeSmXeSgRlSpZsWpTkIoLfGӌfʁQtQXՌxlmr8DXrO$Ck?TmIrf;VU(>l=VSgZ(;a7Mf?Td:L_1EoEl}RuH7a}ڠpsbzۜzۯֹں׷˧Νܝែ䥂鮑笄賙붛Ůɵǩ˪ͯϴҴѮ︗tTPFU,BR(APZ٭HO_,:d=Ok<@m?Ji?Ja5]3AnASsmŒ}ԣsئԢНuΠԤҦӥϡ͞|ǘvwsÓz|ēДqɚ|dQfP_LdPeM`F_KՂYrw{뱂xplwUPJRNZO`ShQfV`OcM_QgYkQrPuWuYwYٖpݥ[S#4U&:mgy]qRb.FpFRN$@\4MqS&4h8H]0Ch?UV)=[,C`3Kf6IX/Bi8T[wQ(?yr_Pŷۥܹ̙ӤܿͯG@eQtc|hؓ䥍뵘뵒걎벑췚áᄀšȦɨͰ̪뮈oRt7?Y&3P%9_tݹ^Zn>Gc8Ji=LrIRh[2J]a|jȗzѢҝzԞyϝ}Ϟ|ϝzӠў~С̚z͛͞vǙĕy|v‰qiTfPfPaF`C^K\HՄ[wv{o{pkv^RNOHRK]LeTbKbPeTjMfHkRsXoUrSz[ooVo=G[(AڃPUISRb5LT.S}YzoS'=g;XmLZc:NW0AV'9P%8lnMr[T)D`:EĀeʛݪܹཛྷ͚ػíɑoֈkޖzהx}eKB=;XMҍt鯐紘箌쯊¨ęß鹏f^UH@C=X'6O*AsCU٬ÌwY-?}HLm;Cn>I\4C]0vKgS(?^7HyL_P!0\)6U*ClqX1=E 8Ҟsz߲ƭҨֱƩlO~_Ҋnӊn{^ӉldXVGYNw]壁骊ꮍ칚춙궏mY_[h^lVrNZCs:@Q(sHUÙp_yDLf;@me1;c0;S&>RXr̘|֤}ՠ~ӜϚv՜r͜zјvΞΝxϝ|ИrϘzʘwʜxə}ʛʚƖ~zÕ}`J_P^Q\LZLQCXIт\jzvnv{ezTMEOGTETE^JcJ_H_JaJ\HaZӥfސ[uizb2AIHH"CxY|NmfeA:|Wtg>R}^rV,EL#6U)BxS&:]'7K);K#:ɕg۹ܤ|߷̷޿۽Jh.5l29h5Ac-8rNano[-9\(9V=ׇ`Ղc܍pu꧄レ̰ʥuXf4A_2CGHv=@d/=kJQ(AmdŠnvՠҞvМϗxϗyΗtәnԢӞϛyΝ}ЙwƖxΜ|Ȗv˖{ȚǙ}|z{x{dM\K]F`LYGPES?ׂVgol~]yOHCNFYIePaI^HgPdJ\EWH~Ić~fܑkd][̐sGOK*EoPtb=V}_L&@nHlbpQ)=Z->]7Mf>HW,AV(6d2C^.>Z,@b8WQ&Eul`ܤtීڸȶŠPIN?i6e19j7Ce1a-5h/7f6AW*RX}t̗ћ}ӞҞ}ΘoМ{ϙx͖~Ҝ}њuʗxϚ|Ηy̗ʔnÔyÒwyz|ru~w~ɣdLdQaK`O[MM@QF|Optyz{zkyRVGYLaJhMjSnThOC5n4BUiӯ캎^3JO&M`/:g6EM#4W8[̛{ԖtٹƺeO{]}j׋oʅtZOn`Œκ綋ܑmpX}Wx\Ձcލs驈ʰYKǀty״ҏD<{>Eq5>Z/Bb3EW_Z`ˢ}JTSW`1>[-8[0>j9?\/Bf_kÌwԞΛ|ϜzϗwЛ{ӘsϗyϙwИvћs̘v˘zΕw̒sĕÔ{{qqxyϢڭ}෌hPhUfOXCVHRGK<ՁUhv}﹂voӀUVJYIdKiLpTqSӛxV'9ni֙{ƊƓtOa`/b4EtBG|hčpϝ|ѝz͚ЗxǗ{ϖ|ϗuʝʗy͖t̜͗wʓmƌvvzutx֧ݴ丄潄辉iVbPaNXKUFMAH:|Sjxv|wmՁOSCS@`JdHnOiNՊTƋȨxERmE[~RcT';[3OZ6\ĜpZ5R`:NlEc[jva4?W-CX);`2@[-:^.?X+9G0J":ӛsŌzڦٱȱ\GcHӄgيtݒy{ܑqݏp۔yݐoԉtؔ|ەzܟڔ؜{b؉pׁdقm祍һҹڪڕ{Ӈpςo}dgR_J[D|?@W(9b2BOUNXbktAAl8?X&6pDEY)4KPËsuϜzѡ˔tΘy͖yʕ|ʖx˓r͗zȓw͖xȓrʓwȒwǑtwluvϜy߳缅亄齀鼀aM^HWIPGREC=D;|UctwaQVJZG^EiLnQmPoWיxpgjgc8Qfc>VP.Ni:Y\|uiF^uPoT+H`7TuRunNbwpm_0@X,Dܹjv\__1;U%4e:?T(=f\{u͜Н}ϛx͖pΘw˗|͘xʕw̕yɕwǔȕwvď}opجŒ鿄羇~꽂YEWJTJODM?A9EBzNnuwu{riҁ]VDP?YAcFpYoXufk˪iC]`9Qe9S{MnhXL"9Q+F^8Z{zWgDg{i@Xp@JY+>`3BX,9T,CU,CU(;|RÌ㴌ѻD;jNxZҀh܋rᖁ}檋奇豖䫒嬒魑橐⭔ޜ~ܓ~ێoډjbz[}˷⸝ݨݚ}ݍmۆj~cz`dMo/5f-6j06zBFm:C߯ux{IIpAOW)8c1:_->ziqɏtӟxΝϖv̕u˚ȕ|ȗ|ɒxŒx˔vƒuÐru}uvuتčŃ}꿄}VHWLOIROK>~>;A?zWc諁}w|mӀYPGN?YDkfщkŀotBK`Rh?Xc7OtQwvNmtQuaT*D[6Ih?[rsLTK'Fzuh]4G\.>W/FT.DO*Cvplٴ¬ϱT%7MAoKy`ׄgوir{处讓벓笔簕簌鲗孌ᥐۓxޕy܌u܅a܃iߑvʶ㸛ऎកܐyچvՄk}^gMt>Gm;Eh4Bm7Bc/Dⴕf6Bg4:`5@`/9h4?Žuuјyӡz͞zʙzɗɓv͕sȔxÔwĒxÑzwđtÑytpqեzʼnć€|迅’ƘUJOEIDOIJCy;6>?{Uptvy{ﰁ_|QXHQG]HnamVo`ytxMaXv^|rF\^6R`^6Um]8UY0HZ.E[/HV)@_4LyIWi:Me5>P'Dlcic\/BY4JS)AN&7[2GÃfÄtὣM'Cr=Cl9?k5?c-?ڬ˨a/:[)7e5?_1=VNɓn‡oԠzРzΘtɜƖw˗~ɒvĖ~ǑuɓÏyyusΞ纃|}Ą‚鿎Ɛɞ˩JGFBOKJDC`3B_3C[0DX5I\.C~C?p:EqcXzuN+DH 6M!9csdĩĮvP(;k17UHtRx\ڂh݅aqzm袀겒鰄筑筋{㟃ݎhތhۉe{Y݀Xې|麧㻦ުߞڐrىoۄjvZTGg3>g1;m3R&6uADr9o3:o/3vXj{x{we~OQAMCZGdbzWisGh\|^d8Zbu^{\Y5@J$8W-Ha2CV.Da2H^o[ZznuZt;^,|?=i.;i/6wYlux{c}WPAKI|ofljuluE`[s\vNizPoa:^yX5Y_^0Qi>SY0LkDRS*EBMD}\rt}|{oՃ`TGMCYGcIoajqan^u}xxMmI&N__yUzyW}}b~L#;f`dojtYsmJ$9S)dXYCoRx[~[ځ`ކkދqpruw|堁{ttoڎz܀[߀ZցfՎ߾缡䦆ݛՑ}ӄmxXX,;X1GU-D]3AIHs=Aj6ҠzTQcґbʔrԜu̝˜~͘}ΝŐwÔwȖȒoʓp~rxz̗s뼁z{ȏќќΘ͚ѝӧҧҭӧԱLAI@E?I@|>=GCh`ьsz詁jx~tmԃ\VHSFTE\Kӗ|mPk|Rll>M[0B[0Ra9Ng@awQseyVnyk>X`rRYL%5M'@Ɛ~ϴͬZNuem?9W(<^+9h3>k:@mmL|`؁\~]߅gfmߊmblqޕwsvܓuݓoږyࠃ宔ͳ婒ξ绖ܜڌpΉvofZ->V0FW.?a5Jj=KPIJB{DAe2>X'>IH^Vˈtݜvz뱄~|o؃SSFFEsn^ZiRjyqDWkg:I_2JaAVw\sQe]yhGhuMrqV2Rw@)EqCRņyϼȫ¯O=\PȵT/FT)>k`e2?m9>f4>UM]*3a*:VKSJ`CyQ}WXރ`^gg܆erݏo݈`܋k܏oِtݑrtjly砇夈Ջj΄rΉvY/FX.>a6DX/C_3@v>CPHF>}ABd/8X&<zub|`Ր_̔lϚuϚu̚x˛~Ǖ}ƓvɘxÓ|wƑtƓ{tvooڦtzʈѠӛњӤЙϠҤѪծӫԬѪm5=q78x<V,?PH]*7b.:n=>{B=a+4_/>FCNF`IwW؁]ڄa|R߃Xއchik]=YAqF|MyOuNqGjEnO|K؉gC8jNlTےu|fT/JW-AX,?W-;b8Fh3>x<:ROk2=zC@\&8e`̓Zّ\͐o͚uΚu͜}ɕyǕ{Ɣv’}yŔvur’t‘ysiުsƅΔӤԢѝљНџҥӧձԮԯ٪j:Eo:@z<;|A@z?DYTfWЎo}ux{{j҅aTQ˗NGe`ĉSd}Tq]7LkCW\9RnF`{T`=[c|Xuj^}uaB^|Rnݑeۄjټj^thsW/=_-7V3Bi58_,9i39i68p>Cx=@d.Bw8:VQ[CpRwTzPրW܃`݇`fnsفb؁[sWnLvW|X݁ezZ}n吀囑݅vԋu܊n֌j\0FV3I`7CV-Fa2=zFIk7?LLRIe0@a]X+;PPԈVَ`̗|МvΘtɗuǕxɗ|}Ó•~x|vnvy̐ӘңјНњӢҤҦԯ֧լթԪh8Dp7<{@@A>x:?SPbRΊnrꮌsrzp}}vǖHDQMƍgXcla1MnASO&8P'D|Piw]`EcV3Tlk^z\7YbcsYÝ[NɌyټP-C[9Kc5CW,=\-8s<=a.;i58t?CHGd0;D?RIGAgKtUuQ|S~Tڄfۋjksm܂Z؀\ނXy]kꝆﱔقwՐx܌i[JY.GX.?e4@Z):d5l9>h6A~LI_4FVSOH}EE`DnNrPwP`Ӂd؁eއbދkp܋i܆a]|Tރab|꓁upԕܗyʆmW*@U/FV-A_0C\,=b-4f17E=w=CRLDC^Yh8CuFTΝ֡ؓfʚv̞yʛz͛xȖx˛|Ț}ĕyy~~srr{c}֣֢ԡћ֨֨ը֧֮Оϛ͔ˑΙc3?g5>p::o9=q69]LUKτdܘs|x|lՁTREEQѦ`Ynl_1Nq|Y+?X2Ng[0NnOv}Vuza>[cChxpwާk穈m9FY5L\4Gf6Ag4:X-Bj58c4@r=Cf9CvBEq?B_/>QRRMw@CT>eIeEnLvZ{W؂`׃cۇhޏrގqۅhۂ]V~WuVv[rX{\ࠅڏ{Ӑor6:U+CQ%<\/Be6CyDEk7=o9>WIEB]Qt>=UGl6Bj;IҫڡՔiʛtřt͜˙vȗuǖvΝvƘ|Řyxw{y}lwdÅکأ՟թ֧٫ٴңΗ͔̗МРϚ_2Bg1Ag1:e/9}?>iPfZ΃iۓin검zxyׂUVO?HabT^g:Ur]1DE"A|_~iA]O0\ߔvbHb`[wqvoi–w{]S.DZ4HX->g7i7A\5Gg6?e0:`.=^,;k9i7@j;Bm6=I>:2WCbGjP{[\ֆe؋pىgڎlq{ݖs~䥌魐x䢄ޕ{ӕsV&9I@W0IY1E]6In[,Bծܥz̛|ˠ~ǜyɜȖy|țŖƘy{Ŕxq{kugǑ۬ڣ֤եԥԟӥ֧ԦңϗΑС͘\2@d7C[-?U0DXPgTeUІcޓjzzv찅|rրSTHIFdZ[\`8IW0LzQ_e:LO1RWp\:TiCegAW_=Y”|v[˕hD_kktCRg7JW/E\3G\1El;Ek9AZ/Bk9BW(7m=@^.=`/>n8;v:9h7>l8D?u99u4.K=[=nP|W~Y׉kڐwۓ|z{穉壇穈奋樊अړyNJuS';r>FS3HT/J\4Ip>A\,;m7;`/:aTNNI@OHSCYUZ+F׮ٝwȕ|ˢ˛vŚŖxĕ|ēv“yĘ~ŕuzz|xt{lrϜܯؠԢӠ֧բ֢ԠН͗Θ̘͙Ǝ],?d5A^1B\->yCDaLrS҆`ߖmu{w}~lօXNE|BF\Yb:Ic8JQ1Hesb8O[0Ki@[S.GD!JimGhkiqsSek`qERZ8L[0D[0CV/Dj;D{BDV-?F@a2=`2@[,:]-7h6@c2:d2;md)1??\HtTtU}aтkގlܒoޓt~奊簗䥄妌}ՓvmRW*>Y3M_h^MKHCLAXJYV\,CڭڢƖÕzƘ}ęęŘxww{xuvj}՞ݮ֞ѓԟצئԟџΐʑǏ꾌{qFZ+?].@W+?v@>C=<3QD`Kj`y`ыsՏuܔw|~ݘ{ޖu֎nłgYDR-<\4EX3N];Q]4IsCGg8Dg5?i:E`[]XPMNK_SVG]1Gڰҕk}f}gjx~}Ŕz}x}yxvwqfد~ףڨ֜՛ӞԗЗϓϑČw͇Ku:8Y+9R+>f5@`3BV)W+@PMNLR)=}DAW-=]2Cb0>^0=[-=a.:m=Aj5:m9Dj5:s;;NAPBmVzgԅh׆j֐uЉpܒuِqߜ|ޠߞ۠{ߥ⪉߰޻{QZU9NW1IY4H\5FoAM^4Bc7EJI\QRIUOLLZQICj:Dөcz^mWsfz]itnvŒww{urpzotoŒעӘҙϗҝѕϖʊ渇ΙtHCQ#7Q*=d2>u<He5@_-BY.?a.D^3DQK\-@Z+?c4B_/:a1Ae4Ad6Bu@Gu@Dg4Ai6CTI`OxYσe~_~_҄cȄmчi؍oۓvٔp֖yבrוyנ߯âɤūuW?U_;LfI)?R+D}N^b9MV/HlHTQgnBXN(C[}ob?[|]ksvOxytZ=Q^0Ax@Fh;HV2GTNX.=Y+Dm8Bc3=h5>UThMz_|_~a{`΄lЊqډf܊aِr׊j׉iאrڗy{㳍忝ĝƟȡ̪ΪwM-=M)>Q'9k:CIE~GILITQQI~EDMP֕g~gɏqjaqxctfiZfWg[j_sni_obiXlcj^ĊэȉЖҗИї٫|QFZ.Y0>_3HvG!;j9PiyK[L%>S)Kw\qTmfkmj~c4Eg7CCBa3CS&U';f6?_3GX-Bg9Ci=GKJk6Aa0EyDFc7@PKfVtWvZ`ρaʂeڊh؍lܓuٍnوlْtەxݟ᫄崌鿙徚žɠ̦ͪҮֵya6=e9G{GLyGHQG{CCk4:zmЕu͒sȔywmw}{r{kxmnaqdZUt`ƂYbRVPĆҘВ֜қ͖؛jszUgm?RlE[c<[ikoM&F`9UkEbb@\yX}k|K#CP*Id2GR.FN)BOJf3Bd9KR1Fb2@g=Ib1>]4Ii4At?FcI`0>WRo\qWф^~]{d֋o܆aَi،n؆dىgڑlܜ{䧃⭉嵐溘弗澘şɢͣϫӱ׷_6MtAIsBC~JFw>@\(=Ȏ{ΔuϚyė}zswxxpu|pxpyqnfyVȄXj[ʈ\˓՞Ԡ֠ˉ뿃gOW*>PGYLXKRLgW_N\S\Iut{ZNa,9PB҉hpxwostuiE Ewg{_z^x`׈k܍i׈lێmڊfݍgڏlݕwxݟ}⩇~孂䱍渌뻑뿑Ɲ̦Τӷֺؽfi}C>r;;~FAHHP(C٪ˑpœvȖtrtnzwuuonoyizYȆYuNިuӟ՚ԗ՜ňןiB?zDG^N_SZLjUz`MQL`UsEQ~tna.9SC׌`z뱀~wj݌Zy~g6>P(@P&;b6AV,8W0Bk8FS.BQ*Gc{sJbK(A\6@O&BY;X|VfQ.HnFalJpxu}j<;a8[ͺM&8M$7w@Eh8Ab0@S)@^2E~MO_0Q1G^1C[/Jp^:LX&3J!=aP-GoEeanMd{XhDeolp{D#@H%q;@~DFa-h{W{sMpalnuVxa~c3K]3OszN+EP&9}CAOEc4AU.@Y3GvACb.:_2?l6>`NpIZG`,;bSqOف\؀bۇ_܅_܇eݑm܋eݐkݒkiޘtuݜy}㬄届沉溗꽐ĚʨдҴ־߻k:;e/9^,7a+7՚rËjɖxʑlǔwl{rvtuqzhyfːls{ϗ٥֚Ә~͊OXQ`MVOfToVmZ^NYNgYkdi_R):a3F«{O&;G<ٌ`xs}vjߋa~{M)Ce7MX-Cc:Jb;HV.C]7LS-JZnbxH"=qJT]/DQ%;[7RaP%:iCO_6GY*ԏiƔyȓxrsƑspsmmn|syezcܩvԛՠΑ՜١ԙȁُX]I\K_PfOsXu\ZNZLk[dW`X_^G3U%:zȭ}[)3z88هWw||x}pۉYrV.Ie>LN$9T*9[,?]3JR-Hyl>Ie7IK'@S*@vJ\bf5@c05f2@o;Dj?Id09_-=v=BrQ^|^[DyCAiXzP׃g܈gވiߊcډdۇ`݌f߅^݌hݐnڝ~rߜxwߡ᧊㯎䳍帎彝åɬϱϴӻھ߼scF0kYϋdϟzȕurÏnqqptnmrzhw[꾆١ԗѕ֠ؤҐ}uK_HXE_LlWoPcQ^P`Pg[khaZVVJ!4U(>|ªh4:|>BڈZr{ypvrؑlsg?PU-BQ-CU,9[)9V,JwReO1SoxSeZ/BW.?d:HP(ՃWx~~}kیb~xNXW)=\8IV*=_7FV1DQ/AZ4G\muFYS,>mKY[6GV-A_8OU1?V-Hqd>WL*IknU(;V+0L':\39j;=`.9f8DmՃZmxutzpօ`mrk8EfpH^W,KnFVB!;g@]`zvpU/GO&9m6m@LvLPq?E}bi7?c2Y\wGI}>?҃^n~讁곃fڒkÇ|vGRd=NW.BO)EY4Peq]5ET,CkCWc9M\0?X/AL(?{WxX->a=VzUq[6SbV;L|frkDhrmW-=L#8tBFc6>s>Ei4QkCVc:Qc?Te8LW3Hc8OY2Gy]xgCi^>Uz`xh<[hHo}H$8j:@S(Y2DR+<\6IoJ_rGXZk;DR'5`09Z'5Z,:_05k7?SGnKvS}]xXi7IWKӂ[ڈeهdݐuߋggݐqߍdhi݊_ۉ`݊`ލbߐeߕoߕquޛq~ᩃ᫆⮅縒佛ɮɭռտӼڹͅU[GVHWGcMp[w`xpnupǎnӜfђ^ˇV͈XÑۣՒaxNfJSGUGfOMBTIlf`WbZYXkh^YVUu>?N(:N#5^1CƱoju<=}Omwy{wmakkR]Q)@V*;[-=U+MV/Eg?SZ6Ke8F`6DX,AO$5Q(>X.?iRu~[\:TbnF]c;SjXrl>G^0X)8V(8g26KGeFxVsRvN]Ae9MeVWڈh؆_ސqݑnbފjdZhۈ^څ[ވ^ڌgފ]ݓlvޚvݚsߞpx੄~߱廘ƩϷжӸӸ۾ʏwSIaXF@GBQ@]M]QcTnbsfqʖ}ԢrɒiŇ_՘hђަېWjPS@MCZPSIMEaX`T_[_W`\jfa]~JGm59N%9E0^4Iȯ|mz=;uRn~y{tޓ`psYcM%?f;LQ0JP(AU/Ci>KU4Kc9HW3Gj@Mg:QgNAMFKCbZncUP[TZRf``^WWk;@k7@_/:nS);V.@]2E]4G_8MW2Jd;T[4Hi=Qf=I^/CjBSR+?X1@`S'4X)7h.8F?hKxNvU{U{6/g3>mYӃZ݋_߆`ڈhލaދ_aߎinސk_ߋcۅY݆[܊[ۅYۍeܒnەomޙnwzঃⴑ㳉世ĪǬ̳ϾԿپدNC`KhZfU^SQEIFp;Ae38Z+5U+6xBI߯Ƃ]}ӍωܖSRAs9;JFWLIGYSlh^N[Y\SYSli]ZxJIs>>g2<\VPK\`~ƳͷxBAsHy}}{qoXzKYR%7W0GgAPX0FR(<\2@X7Oc`5GsL]S)>I(Iksb}V0EW0?V+5R&6R%8U0?Z*?PEYHrNtUwPC6W'9XMӀY؄Wن[݊e܋f݆]]ifߓo\fۊ_ݍjڍh݈\ފc݊^ڎfߒekܘqݛy|ߥyߩ崏㺕ƭɳͻҾԻսٸeX^Mk[o\gZ_U]VGEtEM_/9O'=DDƋ́ݙ[yԏqP?m57{@>LCHHQPi_cWPOTJTJf`ttYWzIJr@Dk6>[VZRlj­ƷFAsSpttwlcN{jQ_Z1EU,C[3BV-=X+=Y5IW1DV0DR*=pGYX0Be=RU-CW0He9JN$8j?MZ6MhCVn@U^:Sh}wT/E`1>T)r0P!3WE~W~Vׄ^نc߉aӆeߎaދ\cݍdݏq݋_ޒo\ފcߋh݋^ݏh،iډ^da۔itޟ|ߣާ{㱒㶗㽠çȳ͹ѽѸٿԵWMj`m[dUaR\QUJyF@k:?`,9IL|{uƄgYCg3;j5=LFz?CNJbV^RROOOLFZWqrfaUWSRo:BrBKQMqnroŮȯPFqRoxq봂vvcSrm_3Eb9JT3GZ1C^6HV,@a8HQ)@X4LcF]iBQT,CrK[g=R\6GV/Gf}^8TnB^a:UoOfxl?S[4@p?HV+=R);X-;O)7S%,a1:MAhKiJeIO!,a-7cEtOxQ؄W؄Wۉ]܈Wۍkދa܊eތhލcߋaސifݑjߌecߌ\ޏbމ^ڋgݐiۑiܒeܙtޟwߤ}|ᧀ௑⸖你ŭͰϸҽԻծMBf^hYeUg\bUbWUUNJVO\K}՗}גZ]Lw@?m5;LGE@I@aVlcZX}KPNL[Wkgmj^^XXtDGwGIg6_3HoFXY/Dc;P`=QU0GyVrvP`O(~`hW3JjIhsNx\6GfE\O*FX/6Q)9Z.:\*4}B;Q=i29O&4j6>T@cGuSxW~U؃ZԁZ؆_܌^ۅ[ߒkގoߊaefߑdjjݒiߍb܌gފXۍe݌a݋\݌]ܓklޙrޡ|ृz⯋ඕ忢ìǭϸѽҿհRIZPeYl\g\g^dY^Ya]\SbZwƈؖTRHLFz>C~F>GBLKb^ph_WNMu>ALM`Xoeida`yDGp>Fb2:~W[]dz~Ưi_pJޛjv|}l΍oNVN'@S+@T1?a9Mo?Q\6J`6F[1Ha3IW/HuZsR/G]usJ^I)@aqM#2pLsx_:Xbuo~T2GQ*>V-?\1>Z)7X(6U'5l7>NCYDeMqSwQyRрU~T|QԂ\׆bڊgۈ[݈_݅Y݋dbߍ`݌gߒnkސgݎdލaތb܉[`ޑi܏dޒiouࣁ⩄ⱏ亘亥俣ū̳лؼyRJb[eUgZqccbf\t`lXnV{WxTUKPGUI[PPFFEaZga^TJF{IMwBHc^pnrqccZ`vGLq=Aq>A_0;d:DiXb=WvM(Fmew@8tI]U.?gGbysRhiCSL$6Z7ER&5a,/t95Ni8Aa3>`4:`1:g@H_hκ˰ƯrrYޚs}x}}wQZh?K]3IV*?O(6_4FjAOb8Pg?Ua@NO)@S+LnQ/DmF^sC_[>QhGdV0FgCf39}AjDkHrHyWuM{MҁZ}S|Q؃SـS؃XڂX܆\ވ[ކ[ۅ^W݊^߉[ސonjjݐiihjkmߐ`ߗlutvޟqyߦ~ⱈ೏以㾡ŮɴϸмһԳLGUQYKf^g\sgt\~_~buYqSoQ~WwPiS`^g][[SVMPNIMFbYzkysh`W[r??c1ʹŌyP^gcm_S]hbwĝŭȶwu{VZdZV\m<Ѳr]FTle_h_ZbhlwŘ޸λɩksO`PTʭotͺoMbP`R^VxRw_CeYQVZ>O[X_vkhpĒ1LŲKILƹznΧ`c]PKoZRg_WT\dNmLoBfvISeT`}w}azscľ Ĺ~JFy·u̾vibb]s^Pc^\]_j\kkV{P~jX@haXqh[}Ŀſ~PFo·zɄd\haeY[iehf_jcLa\^TSqNVUpXjgmžŮĽҴLVKkɹvο\SaVRWdlglfU\Y\8KJiXfkkXLZbctȀ.æx~NGbrѮ[V\RPf]d_faNSPMxrakh[cZ8M~{aUT[qhQU[_befhgikoruxy|x{~lejmtxxtty~}ŭxWphV_`i}}_BWo"=/-F:-,./$%7HBI~kYZYXngOT[`cedefhlortuu{}~}vnklruuvux}eZUe[Zf|e4>p3(/!<>%#/;B)*AMXx~x_V_[SifLR[bdebaegkorssrx~ykgotrxuqsw~QFaXXezl.-^z@=%9<6+>6$2+2DLs~WVY\VVmjKPX_cd`^]linusx{txnnmppvlpvv~?RRdza1 Afl(!;88,6?/,684Lu~YWZ]WWnlOSZ`dfcbhnmnpquqy}pmpoppqpqx׻IW[o<%7Mo9-,877//4.-00>k~\X[]VWpnRUZ`egfegeklmwzordgmkfiowvr}ÿO?Zk:")/lz~S1$08422-/4/*3e~[XZ\UVopQSX^bfeef^klkywo{kpvulrq|}w~sz܌6clb8)-+*pwx1(:+<00406<-.P~ZWZ[UTmpMOUZ_cbcmbqnlrhpvglpvlsqyt~nRqiC20)"N6(0*?25335078,D~XVZ]VTknJMSZ_baai`plqqeeafhtiqrt}}{r};n=" #5-28/A,863//0;h~YX\`YWkmJNU]bebbd_kfvrjfosoqvyx{{nlkte-!44Mws]_[[^]niNRZbda_a^dghbop[ij¼̌,)?-(7--3g~`d^\`dskKNV^a_^bfac_Yn}Zx`gi`^+ǽЧ_kȥ:659#D~bf`\ahvlILT]a`aebcg_Vmwyx~ot~sfOEh~:crd@Fh5ƙľ˾ͩSYQ~+./3 8.'eqcia\ckxmJLT]aabg]dh_Zkmvwr~mtu`rkkrtjD-AN7')1tƿɷ;Ub^]K*-0,&8$7udjc\dnznMOV^a`afZdd_eVȣpuox~|ubqrhR:AFUhXCh'_0-ĿĸjXYOqz=#2D/*/:&Rtfkc]do{nRSW^`^_cYc`^nJʤtocyvxwX2&.92cGjng`bdpuQPT\a_^_\mUpsadçd|d{t?f@FVT'u/:0/2jBVYp3ǺVBbgqȶ##=6090+29<lngb`^mvLKQ[a`c^mZcokVqҾw{rvjxzvbW6WA3l%@1'9<&i^uõÚgahXc67.456;1'655\lmgb^ZiwKKOZ`be^gborjFǼymw{}qymMUag< TA[%,AT]gHkunϧɐb^bnud",228.8G0$625~l|fc^WfxNMP[__]^dQmouse׷Zn}q|pF;5i79;L`4<#=),.k_vȸcYhJ]:!(/D727+.5.Hvlvec^UezNOR\``^`g_hmigj_wslsyk~fT!E8@LO),Ws#E,'3]SĪr;#Xpn@=36M<3+$453rksec]UdzLLQ\cdceYn`iqnikl`xzviu^3L5&48T=5`2WQ')wodzv>4KL-E$30;1>:'1,;{i|edaZeuSOQ[dgee^cehs}xk^ܣyhq{ZB=b1Q%:K,3A.T9d0:i{ȺX&e44299?B)63:'oyqihdcaZfwSQT^fgfgdakzymp}{fizpON<>A<;@M8c^3:WW'"NC=29:=@/6528iucb`YgwRRX`fefifem|yln~kxɆv}]>;S?V/I;;4.0*E&s?yϳr9&/`G>17<;=537*Vlihb`_YhxQS[bedfjejjkr{wmmyyvf8m/L*AHL:7<)KS(VxŶȭ{Q("NH;7=?:89/7,uihb`^XgyPRZbdcchdibpzzsi}oy.Ig$AJ=4/z$K<!e¾սO$&VV=AAD938+6?~jica^XdzRSXaedbeecjwtmy)&l{z"8"7h18,I+ (<?_1trˠ]duy¿ƨn<%[l:@;E:07+5^~kjdb_Wb{TSWahgccecivuqv= Np/&SsDF;%,;gRT&0öFB_¶α`LD'#P}3;;A:/8/6}ijed`Wa|VRVajjebdgbrW+f^3c4B1S'?U%&]6*īpjUYzƥxdo~qZ>%D1?F<80937}~fbc]]SWKHVa_jo_\rcku=6QF_Pm[(]#2z$(.:)uvιO[TF.79.ztI-5HA0,HmJ9:7-72'Ya]_Z]RUKOUZ^\csOjw@[MQzo]2bAU0*!|9( )BL&?86Nm+ Yt>6+=&0B1!DK681138,oi]Z]XZPRHQU\e``nQjttB W:T%5cv%37:8:"!<.r6_17HN+0Ⱦ?ZxyΜ9/=\?'65'OXG8*429:~_\]YZNOMMZcemm]lUDH/"d%C0K@Yu'#,.I/"J!71Na~bWD?O{Ătun~gaYYl7,707_maY2*463P~eab\[MN[Laj]tt:;Ok4&"O`:=XJfAt<5&(A:A!)0`}z`sл{siGA*'7_Z[U-/1<.jeidc[WKL~]Mcna{GhmC*eF-VR4cZr6*//*98#Qh`uyvrr~~ӗvaG6M>)0U_XG020:9oha_VTHKTS`joy|8LB%U\owv9B<>0HeG}N,(-OnNs;26$zq1On~}׵}|e859=79520<xUNOKI4+,><54I{x7 ,p:`p}{ԽuT144,/'*81rƿ~JFHEB7>yIYy`f7fyz'hOo~W903)#<;;UW*~IQo{}x|ťpE&39,+3,44ȿlLGIC?34*`i2gAL r~%2AOkx{~~y|ͣg8#9D2'L+.G~RLKC=/9xU;[dqcF``6gxgN?451*ZMr-M%y| #,N^hvy}֛Y0'?M5"o0+h}~XQNC;,7vMR}spoJW[SAEo0f/A8;$-RUF(7 rz6"/(QJetz}qڑxM*-CP36+}ʿwUIKF@9ExiTp\v~HYfY(dO7awK02^(?/-c# t*(+lPnr{o~ɘ{)(4>8"2H%+½wVKMJEAQI[Nesh^e|@4u5IN&$+y.9+9&14)Vbpt{|rulqR'&,A7-5B*KwVLNJII[`EnS_DQ@2CPUUw",rv!>ijz/&A)Aa[suz|w*-.5N8;32,J;C$7jGozǭŵg9.'BPEE2%v~@>F?BJ^M>\tp@h-A1jO^IMc7z!QKYE'c8,/X1(IWfv|}@312>DL=5.||8|A-?LXn}{}~ww|z3223->9BV-Z)P~g6;;>:VawrBy~R=+,XWDt@lgaI\nF.!8131A>1ESMfxww~|~]#,-3-;?@R/[.Rj3:783Q^XGepx:M?4-3?tr?ZQ[\~r1B6$E%452A@7KWB^rrqy~~n2+/838JBQ6Z1Lj17357XaNGbi&`4*-U^s?Ow487)O=463BA:KR=ThmnxqnI$%35A<7RKT:7@GP^q}8D*-1<>?4\NJAN;.{|~13,4Dnm\Je^32U4*Y>?;JxUNcI6"/77@;525,8:4<7<><;DXn|&:0,3F:93cLFGSJ2zr25.2>ikR:&h76=6 sJlrxyx\ZK34/(874F13)273<7EB://A^svo%792;Q944gMFO[V5yü~0)(45XcHTi2]7D6>3>K{`pZ%8+&VQ'N.37536=A@;JG:99;U^kz]6*4:9:>6>YO\@ZT8||n©N%$~5,%-/Q[mJDO9O*.ERFIt`nkYe.,{wwuqop}~ut~h:)W6//78116:S4Lx{yн҉8HAKB)~wzfziͷp)WYSPX\[^~r}W+Z*3BH3<;?3-64h.@Ua^r}G0J?E<31:>;>FTi8BpwvwG@GD$u}qq˓S=`^\o~dRc~Fr3PnD)<5(81$dD32%CY0KJio~4D!"C80,4G5"M_~L']f~B3L6%y|ռsKbXYlt`]hd~0f~/Mm4b&+-;h>))^/BYScEsiju/(./G3)3L>#BazW(dp WH&}ŗjN]\blk]]gi~"H&MJ@@2A)%9+>!j^RZipHf31e$^U8'-D:#$=+,-y7@;"S7 IP?>eq\!7:/*>?20Bnv]9735?2HK8_6ezzNk}4=R2+C2 ;Wg{vv@eړɿvleed[R]c^WXZZ~( KZJW62>;>46C?B<5?9&?;gA:{s7Sz%+&A)910QjuyUMoؘq}ٶndbe_O^^\ZZ[UO~.&H_HZ.)70+2>FAF<+1/Y8r.-O;qErBA*+/+7Xlq}}8PzcdScn~׫~a]ZYWPe_[\a_QC~&"?hD~yW-,2,)A7>9@7$(&%RPDNK=k`=3@1)(*@atvxV1d܍ShGJQ[cgny׺gQWTNVbc]\be]I8~!$8wE}nN)10/-L/84>;.2+8-!SOj+*;@4/#)+:Vst#HRhZZUME@CLTmԳqPGRQO]lZY^ecUA4@9=BH|uJ"4/3,@1;7@A9;,1.<+]l^fH.E"E# %/GbsxcD*m:XalmfXI<3-+?˖OCGOS[ecVYah`M>9~[\TH{N!706)05?8<=75 $:N($xk^}.&,$22A]rwnIYt|b]thfc]RA0#GĺյS:AMOSggQU\gj]I@AB\djKzcH441/)6//'L0B3!8E1@M,flE&'*##,>Jhi>2D}3Աhdof``YH93Pùb6:FGJ]eVIKamfXPH?BUfnTurr>1665-6.47B">H73a(@E>qP>622* %4J^o`0B}6Vgnhee`UMKVԴmD4EHQekVIWYhocSJC;;Keq`|a2,5;=26C8>I-NM($i$o,Lb>2*,.-18V8$3Tlwz~8P_ihijfbacb\E@MIO]nfF@[fon]LC>8~:WeuhvS*'1:B78;!)Y7d^U']"Hr8uacD-,-$"(6I\fjqxӀXbeikjilok{ZNORYJ]d]RDJ^pqiWF>:6D-COerx|L(&,5B;;^=8m?:r.ljF3XvU8)1.#.KckrvsO\cjnpqlj`\gjYHYb\NJKZqvpcO?865D3~;7;\pµx>)+*,>?D:5?J8R0Pg@F0H^*)A0Ah*};fG"MVTHH\jmsy~~B̿ÓY]_do~~wst]VVH^ZM]x~y\I1',AZl~Awvvrmlklimy}zxlWKSSUUTURQRTW[]^`hhec`bceedcea]]bffedba`_cbacegfedca`ecbdfd_U^iy|ytplkigfiolgwj=NaKvVgdbba]VPU[]fUbuWrqlkjlkny|yvhTFORVWTSNPQSVZ\]_ghfcbbccdabea]]addeddaa_b`aadeecdbaa`aa`c`abec\UYev|{vpnmkhgimkhs:KS]_^dc_`_\URQ`[`_o|VrpokjiimoxzvseNBLQWXURMOPRUY[\^ecd4cb_aca]\babecdaa^a^__cbdcdb__``_]a_abdbZTS^oy|xsoomjjihijjim{SDNdTba^]][[WVa\]qpP<(]pqonjggipouwspaJBLPVWUSONOQTXZ[\bcddfdca_\_ba\\a^abccb`_`_^_bccbcb^_``_]`_`bcaZURXgszxusqomlkkjijkhmHTU[a^^\[\afis_,oponjihjrosuqo`HFNPTURNNPSWY[[`acceca^]\^`_[\`^_`*_^]_^]^abbaa_^^]^\[^`abda[YTU_nvwxysqnmlkkjkedykPK`Z][\Z[]be`zuH/-*,3popmjkkmsorqopaIHOPSTTUSNNQTXZ[\]\``b`__]Z\_^ZZ^`__^]7^]]^`ba`a_^^]]\Z^_abca\ZXU[jtvx|vtqnmlklnmlkdboOKVUZ _hlq[/08? oprommnornpobLFNPTTSRNOOQTXZ\Z[Y]\_]V\[]^]XX\a`][ZZ[\\[Z\^__^`a]^]]ZXZ^aba^][YTYjxxyzvtqpomllopnjediprLMUWXYY[bktG:2,26E%pqqonmoqrlmooqdLCMQUUROIOPRUY[\[ZYYZ[\]\^\XW\c`_YZX\[\YZZ^]_^ba_]_][XX]`[Z[YSYlzywwvtspnmlkprojfeELVVWWY[cnyO&363IF=\sronrtroonkjrr_JIKJRURPMMNQSWXYWZXWWXZ\^`][[]][X^a^Z_WV^^WZ_aY]fa]eVaT`^Y[`ad`^^[Y[gqststrrqnmlnpqmjebgCVM\\Yksh[#,39?DEBqRrsqqrqnmkjqp\IBILTVQNKMMPSWXXVXWVVWX[\\ZYZ_^_]aea_b[Waib\[[\`fca`eed\WZ[`bb_]\[[^hqs&tsqqomnnmnookhdbeyiAMa`[lwW-)2:<@BCBlpsuqnAjkjjqn[I=HNWVOLKMNPSWXYWWUVVWY\]\[[\`_abgmgce^ZcZ[\^chgbhk^iYg]b]^a1_][][^iqrsqrrpqqpooqqnlhfa`bhBQQZmpT32:AC@?AB(lnprpjefijkjnnZI=IOWUNMNNORUYZZXWVWXXY\]]^a+bknihmlmzr^ZdfaafbfZa`gaabcb^\[][`ippqoqpqpoqpliec`__ewlMK^nU.&3>CHJE??C~roorph_^hklkomZI?JNUSNPRPQTWZ[\ZYX[\\]__\_`abcdiqwsvz]e^d`nfe[dedeb`^][Z`hrrpmonopnnoopnjgcb__YfdUfiK():9EHIKG==AXwqptm`WXglnmplYJ@IKRRNPQPQTW[\\ZYX[]^^`_\_bccfio~odRkfl]ddecc_]]YX_hrrpmpnlklkhfba_^X^SonP5(@=JFEHD;9;r|tscPKRfmqoqlZJ=EGPROMKOPRUYZ[YXY[\__``ceihefhm{{b[[egcbdba^^\WV]hrrpmomllkjihihfeba^^]ZY_e-0-.@HMC@EF>8:Vjovq[BCQflnoolXK:AFOVQKFMNSUWYZYVXY[^`__loplhddhju{aURdcbba_\\[WW[gpqpo#lkigdbbeggfdbf\hUdl-*.BPEPC?FJB>>~xutfG0?]jmkfhiVG7CIMQRSSRRUWZYYUZUZ\YXjS\deddgnnvyru}bYef`[WhIiZXZfnrpqqrnqtj^\[\cglmmlZoZg_|ǣ<(:7FIC;9AA7@F8vuq]>.CblmjdggVF3CIPRQdTWXZYWQSXYZ\aaZ[`bhkprsrvx{|^_Mh`mYhAYXXdnpqtnpmkrnd_X[bjoppol`aZhp>#;E;KJ>=E?=JD78vshN2,EclolgghWE1AIQSQQNPORTVYDVYZW_gaN]Z[]gmpswos}xxS[K\RLf^VUWdorttppi`dmnc\\dhmngbbnms821EC>E:/CK:@T90a~zoZ>+0LclpmhijWE4CJQSRQPPOQSUZ[[^[XWagbS[Z\]cimormnvzz{{ǾGEelJ\URUbnqrtwtgTQeria]cgjjkk^glu} 78=BGD@LCAQgpsqmon[H=HLPRRUURRTWX[\[[TZc`OJOV\ab_^ehhkhdk~|ǿeFbYJRPS_illnvmfL/Dqvhcecbdggj^?64PF=?DI;;FQEDsz~fM=A@=Nkqusopp\H=GLQSRSRQQUWXZYW[[_^XPPQ[]^]^`giolijr{}züҾVLIYOMP^hjkmwmoS'2crlffc_^`cbns)(8-EH03DQ\@>NSUj~i~\F>IF:Lnsutprq\I:ELSTRQNPPTWXYWTX^ZLIQYYa]ZZ`flmykjtxtrwz¾ԺB;VMKN\gijmyqw]%%Vksihd^^_coj4F4JF@6NK:IADMNj{e~~?@FIC>Rjssutwr^M9CIPSQOKHURV[Y\_UeZPSRWW_TYjk\^iolptokrɰr4IFN[imihxrmU*?[oroa\cefl_..OLE5AOBALIARsln~FDILFASlsstsvsaQ=?FIORSTRQGTTQ_[R^NSZYSYWbe^essejtscW_rþφ1ROnkamtuqY8/7/"^fXu}iom0&7M@PCBC=AF3/L}yxy|~*LINMF>OfopqorsdU:BFKOPQPXKZVRXLSXJOV\SZW_gjkNcsxgYcjDTph_cptt`B9;0=ò0+<:RCBBEF@B>,?tyt~xvJHNOG>MdoprsqcS7@DKOOPNTIYTWWIqGDINZPXXZenkdgro_Vayޭ,bbejakqvd>+-+/̚ĸ4@J@N5CJH?936\rty~y~JIPQG>K`mpqptqaQ7AFNRRQOOHTN\XNJTXUeW\_^aefbfohUSs]X^jkjios[.$KkԮO9AR:J6>CIE88W|oy~yI|PSH?K`mnpqsp^M8AIPSSPNVRWL]RJx?RSK[JJhfa]]`cfI[ŻHiy_qomkN&5ؓʾّ3DKD;C58GL=Exq~|xv|~OJNOH?J^gnonrs`M8@DFHKNPMXQ[RMEwGNXMU_c^dN`oaaXWēelydftP=3£̽ΐ7;A@;H7@H3;7EA<]~|yxyyzz~QMQSLDQdflonuueSILLKIIKIISQI?~oa\KKWQYhddaqydcljv}z~ǻð.9ACAK5<7jz{}|zyz{|{~NINPIBPbjorovueR?JMOLJIKKHTSDCsh`NMRM_\^kcnxbgolvxuͬU29CI8C4=Mz|~~{}|}|}||LHLOHAOakpspvudQ?JNOLIHGNJVS=A~md]MKJGaXbvilr_l{~|tyû">@KQ0>;Ki|w||}}~}~GIIHJCNempkqtqlK@IKOMIFHINQOBGzg_Y_L=ORrsrmhfkrp{y{xwnvl,4O?;F7?f}|{z{z||}~~GJJIJEOdmpkquqlNBJMQLGDGMLMJ@U{d\U]LC^irnjkmnqsuswpu}F)?KGHB5Oyz~{z}|{z||}~zILKIKGQdmpkqurmNBILOKFDFQKJF=fzd^[cUJgtqmhjqtql\fwg{a[wùuV2Fk%3:E5K;+a|z~|{yzqMSOIOQXdmokrvtoQ>GJNNJKPHNQB6?gVd\KY`_nurnmjflw|du{k}^DT_C/-0o~rANJJxB'2=ASVABuHt}mQchZ{u}>kJXprGKRFDH^tz/zpA6ejkp'C@@MD=BADHPWTTRKVCGRK5G{[ds_`hkqYnvwe_Fm^>T@*TC;PVAlw~OSi^_'0-8=@KC9FC;[~o}~}~RTSOMELdottruvfV9pl|~}{zyHRTRPLBKcottrxwgY?EGOTQPMQ:VSYTdA\}`f>dgWik{SGES[_o~LO1J6:<|q2xSYrT|K/"/5J?>D8;A7Kgq~~{zx~RSQRL@JdotvrxzjZ?FHPURQOTHQQMHJUYYmWsd@_K:HSsaYNfX*,zsd>@XV(G4H;E;HF1:2C57y{w{tuu|~~}|wvv~RSRTQCG^puwwz}l\EIKU[WSNNPPMVhszO"{ca?wQeU8h6Jc-97l@0zYvsw{R>CfaK[pq_D'>1KYQK?C62oy{{yw}||{yw~OKPKK?OQF+31#yqieiuypG,9PJ72KoNAGMBD8#K{n~|{xz}~}~IFMHJ=HLMN3Y<3B(yZ$Q%.FN,.Ķ2G^[jp|0.@`H1?;,S^MD?I@<0xq|~}zy{}~~|}~{~ztqsvlJGMIJ;8bqwysvvdV=EMOMSTEZE8; *)r7=cqg_>?HB3Dq|z{}|}~}~}zwrlilvmRNQML:6`rx{xyxfXG@RVE[\(.Gf* $ZsU`sbUJ9:UNW352}BbtiRh{ūtlbVbnRtwJG1-;d^aZ6BCD,\xx~~~|zy{|{ztrops~~XSTLJ:6`sy}yzzhXG@RXJdl7brE+mWE;}{]{M=1AC=JD,Rb?Vm_tuhcatcalorkYD7PC.4Zc^L9B@@5pm~~}~}{yxyvwyzyxvskmulYRQHH95`pw{xzziY=ELSXfqsE[R2GNLpww[::LBB9!*z=EngssupeeiktvmZcVH29R_jN?<=5Nziz{|~}zxuvxxwrpns|~VONEF75bouzwzzhY8OHL^WcxxGZHQkjkQ^oy~I=83J/1XiINjhpvrkfakxsg{KK0@IJtX;6?)`|ixzz{|zzxxuvwuspkg~~PHHDF64du{|y{{k\>BAQ]cqphZSovHDaneW@9E.A:$0R\`eusml_gşvtqovb02A:<9937zo{xxuxz|{yvsp lgj} LEGCD31`u{|y*jZL@HVa}|SnumRXS6T]UL`JR0zk+7:13s)"?V\)kxwpn`fġyvsqr]<><77.0<3Nowyzzxwttotqdcs FAEBA00auz{xpiY8EJ\nVSeWfsNUMGIYSD;L{w</~a:SY]YXityoli[c|vsttmS49902),:-i~v|ryzyxvusstyn`fgC?DA?/1bty{xxwhZ5OmU]B|QsnMGKA+3F=8P~Z1!oxFFZ\XUep}vjacX^svqv{jF*9?2.2+30|swnzxuruwtjdshEBGA>+/buy{xxwiZ;WldRYqz_uHQH>(lm0a:o*#u.!./iD[X[cgluz}tyvlNlfaai{prt|{27CKA%2G"vtv{yzywttbwiPFKG?7?ixz|w|r_1KC_tol{^?Y8L]]44;>F#)~B/8:)QS[Y\aejrx}rzy{v^aSXOVfwqu~X4:>N=/4@%8zy~wv|zyxvsog{~QGLGC?It{|}w~tdJ6cMfRfZPfuzxÖ:=&+Krnj20K1%A\L^Z[]bhqr{v{~{~|lu\eesujuo0:@G[>=0.5\szy}uxwuuxwtpgn~OFKFCAMw{}zv|teG4Hku=hob9oypXYi68Hzao5/*CE.5W[`\ZZbhmmsw}|yzxpxkqqxS(@CQkCF'Lo|pyy~{wuttvusnbuiLEIC@ALuz|yu{sdBFEj{ef`Sfigfq?h]!'Zl?!4G;??NG3?CGS\WU`d_ljd[TTY_g\ctos?;995GAJ[0W?oqosstsuwuwxvwzthY?Bz:NNqxy{zvfgi?x]OBG:wwc_hmbL8,B;>>MJ9GL>O[TR\dbllic\Z\av~h48680?EFW3Z%A{trvvwxxzwyxwx{ui[a=B@>3IKluy{zvgH@drF_UOKR_^}{yk2F?.P/<>>LK@NR6IWSOWbdilmjd_^adpsziA0:6=4;NHY<[)C;7TR\EY+1vtwywwy|z|{yzzuhY~=>8ddIownq},D*I89A8<;KMCKF2:FKS^hfghllihlp}y`L;IGAD<1WUYIU/&vvyyxxz}~~z{zuhWa?>8C:;4.+2D\ecfntw{}:FHDK4/+_QNR\K(xy{zyy{~|{{sgh~=A::AcZinv|{}vlD:aDF8|NPXRL681BZqjopw>;JVT;W69;98;@D@18BL[hqmpsvwy}v~N?:0?SG@Uj]fR[J$kY[_fnosx}}znpczA"#;OlG;-/.FDcvww}vpR*P@WdEI_W*}\Yʼn^w2?dB>\>?@ABCGLI99Odjlnlmmlklorsv|P?E.#GmV^[VI*z`eb``b^^asosvpewN)$>VUBcWA:3>4Vs}z|}w%Imv{vzylRTO.=R8(MntCBz}H?XA>Z8:>EE??@H@'=]^lrhkonnl6mzۻ;DTOO_I;S|ktoorqkgfUXYFXhI:v9"'=>BSV~q^EBnw{vz~re{2:(LMX~BMx[]~cdd|X55[IEGOND@BOU2B`]hfbeiljhggmy}˽h.@KIWD.qxxtuxxqnmdb`F[oK@t*1KVPMMG~sNDq|ww}umNKCA8\9rO~Jo'7n|{w|rox.?EW=NJFpm.WSRIRdYvuoF=9UgL=8>5'Ec]U Ibfedcdeegknpux}ʲ#*vgtqrtutsplg^eI>NP]jXIT[VY~193n{zw|rmy3)YGPBBAl2TU=WCDUkhvwO@+[QFJD8.3ZpaSJdgebabdefjnrw{~Lps}qqrrusqnl_\l<;OP`bQH]cWS_)5,mzyvyplr:J;H@YGIRM4jP9_,hZ]n,AC;7KH80>etdF"Fceaa`cbcekmsw|fdl}uorusqkiX]]<9HO\WKOadXQ~$7x))lyxuwnkjKEF2GRYGX@:D`;FMrKOzeB8O;B>5:Jhna53H`b]_^abcdjnrw|qw{Yknnrusqkh[doRE>CTWJMZ^\XT~(PDNDmc=cM3ULEPX8EJABxL>32BWmlf/EQeg`_`abbcgkosx{ͱioqnjmotvuqkg^g]KOFE]VDQbZSYW_12nC&p}{z{xwkn>B?76[G?TLC@FN;;SLSNUK8<<=kkbmiYxRE M=40.>WeddAOgngpafeedcbccgimoqsxz~µu;Q15?LV^elmohYhrM9AB?IX]YW^cZF5?&(>?^DMISQBFBPGRFRNUWOOCJIWH{}cG\6V3,/6H]iiP/Vnkehb`e9ca`cehjlmpt{CMY_[OD6-"'zn86;E^lj[4BnZkreTjffgfgebaacfgikmpxLKc[^_XN:%-q/+;GHObbMQWcfYG=>B\cj{.St{uvr>|R?@BAcFXJ8Q7`L\kI^=:>3/6DIctX(*ddhihfb]aadefceg0muu}XTd^\\TA- 7|=0CDGZaRFH]ldVPH?BUen~7NltrvyOnI>DGGBKEKNY:T_NLyB[a\kYNGE:,1:JWeP%d`cfige_]`adefdbdf0kru}dzEXc_``[L?7;pM%@HQciSFSUdmaSJC;BKdqE]u{{z{Z]=9CLOGKZQW`Efd?<>Hg}VI<;957:N*7MVY^befec_]`abc8edcaacedipw|¾@R^__`]UPNGe>)'=EQ_meE=Wbkl]NE@:9:VesMQkwmO57BMULOT:BrO|ul?u;bS{zW<85*$%*3DHHLRZ[^cAb^]_`abcceedabdfeipv{rKVW]__[YXNc[<38?MHaf_QAFZlmiWHA=9 /DReYUp|p|\H36=HUPRwVQ7WSH/_KqjH4:3"+BONRRWZTKZ\`bba^\]^abcdffdbeggehpv{ùDNT\^_\ZVPKA?PXKAYf^PIGVlrlcOB<<;E5=Gap_|tKD68:BRUWV@B}Dh[XTQa-czK))15KePQPLIRWXW\^_``]\\]abcdf5dgjigiquz¸5KQX\`a^WTJGQ_`WOb[KILK[}qeTE<=CGD?;@^ǾPq[=6;;?QW[SNXcSmIhTBF[ctn?-4DRU[RMJIJHDVZ^__]]\\]^`cd6fehkjhipuz}KHLQU\dc\YPT^[W\cZWJIT[g|dU@65ASa==24S_yD:5>ʹŌyP^gcm_S]hbwĝŭȶwu{VZdZV\m<Ѳr]FTle_h_ZbhlwŘ޸λɩksO`PTʭotͺoMbP`R^VxRw_CeYQVZ>O[X_vkhpĒ1LŲKILƹznΧ`c]PKoZRg_WT\dNmLoBfvISeT`}w}azscľ Ĺ~JFy·u̾vibb]s^Pc^\]_j\kkV{P~jX@haXqh[}Ŀſ~PFo·zɄd\haeY[iehf_jcLa\^TSqNVUpXjgmžŮĽҴLVKkɹvο\SaVRWdlglfU\Y\8KJiXfkkXLZbctȀ.æx~NGbrѮ[V\RPf]d_faNSPMxrakh[cZ8M~{aUT[qhQU[_befhgikoruxy|x{~lejmtxxtty~}ŭxWphV_`i}}_BWo"=/-F:-,./$%7HBI~kYZYXngOT[`cedefhlortuu{}~}vnklruuvux}eZUe[Zf|e4>p3(/!<>%#/;B)*AMXx~x_V_[SifLR[bdebaegkorssrx~ykgotrxuqsw~QFaXXezl.-^z@=%9<6+>6$2+2DLs~WVY\VVmjKPX_cd`^]linusx{txnnmppvlpvv~?RRdza1 Afl(!;88,6?/,684Lu~YWZ]WWnlOSZ`dfcbhnmnpquqy}pmpoppqpqx׻IW[o<%7Mo9-,877//4.-00>k~\X[]VWpnRUZ`egfegeklmwzordgmkfiowvr}ÿO?Zk:")/lz~S1$08422-/4/*3e~[XZ\UVopQSX^bfeef^klkywo{kpvulrq|}w~sz܌6clb8)-+*pwx1(:+<00406<-.P~ZWZ[UTmpMOUZ_cbcmbqnlrhpvglpvlsqyt~nRqiC20)"N6(0*?25335078,D~XVZ]VTknJMSZ_baai`plqqeeafhtiqrt}}{r};n=" #5-28/A,863//0;h~YX\`YWkmJNU]bebbd_kfvrjfosoqvyx{{nlkte-!44Mws]_[[^]niNRZbda_a^dghbop[ij¼̌,)?-(7--3g~`d^\`dskKNV^a_^bfac_Yn}Zx`gi`^+ǽЧ_kȥ:659#D~bf`\ahvlILT]a`aebcg_Vmwyx~ot~sfOEh~:crd@Fh5ƙľ˾ͩSYQ~+./3 8.'eqcia\ckxmJLT]aabg]dh_Zkmvwr~mtu`rkkrtjD-AN7')1tƿɷ;Ub^]K*-0,&8$7udjc\dnznMOV^a`afZdd_eVȣpuox~|ubqrhR:AFUhXCh'_0-ĿĸjXYOqz=#2D/*/:&Rtfkc]do{nRSW^`^_cYc`^nJʤtocyvxwX2&.92cGjng`bdpuQPT\a_^_\mUpsadçd|d{t?f@FVT'u/:0/2jBVYp3ǺVBbgqȶ##=6090+29<lngb`^mvLKQ[a`c^mZcokVqҾw{rvjxzvbW6WA3l%@1'9<&i^uõÚgahXc67.456;1'655\lmgb^ZiwKKOZ`be^gborjFǼymw{}qymMUag< TA[%,AT]gHkunϧɐb^bnud",228.8G0$625~l|fc^WfxNMP[__]^dQmouse׷Zn}q|pF;5i79;L`4<#=),.k_vȸcYhJ]:!(/D727+.5.Hvlvec^UezNOR\``^`g_hmigj_wslsyk~fT!E8@LO),Ws#E,'3]SĪr;#Xpn@=36M<3+$453rksec]UdzLLQ\cdceYn`iqnikl`xzviu^3L5&48T=5`2WQ')wodzv>4KL-E$30;1>:'1,;{i|edaZeuSOQ[dgee^cehs}xk^ܣyhq{ZB=b1Q%:K,3A.T9d0:i{ȺX&e44299?B)63:'oyqihdcaZfwSQT^fgfgdakzymp}{fizpON<>A<;@M8c^3:WW'"NC=29:=@/6528iucb`YgwRRX`fefifem|yln~kxɆv}]>;S?V/I;;4.0*E&s?yϳr9&/`G>17<;=537*Vlihb`_YhxQS[bedfjejjkr{wmmyyvf8m/L*AHL:7<)KS(VxŶȭ{Q("NH;7=?:89/7,uihb`^XgyPRZbdcchdibpzzsi}oy.Ig$AJ=4/z$K<!e¾սO$&VV=AAD938+6?~jica^XdzRSXaedbeecjwtmy)&l{z"8"7h18,I+ (<?_1trˠ]duy¿ƨn<%[l:@;E:07+5^~kjdb_Wb{TSWahgccecivuqv= Np/&SsDF;%,;gRT&0öFB_¶α`LD'#P}3;;A:/8/6}ijed`Wa|VRVajjebdgbrW+f^3c4B1S'?U%&]6*īpjUYzƥxdo~qZ>%D1?F<80937}~fbc]]SWKHVa_jo_\rcku=6QF_Pm[(]#2z$(.:)uvιO[TF.79.ztI-5HA0,HmJ9:7-72'Ya]_Z]RUKOUZ^\csOjw@[MQzo]2bAU0*!|9( )BL&?86Nm+ Yt>6+=&0B1!DK681138,oi]Z]XZPRHQU\e``nQjttB W:T%5cv%37:8:"!<.r6_17HN+0Ⱦ?ZxyΜ9/=\?'65'OXG8*429:~_\]YZNOMMZcemm]lUDH/"d%C0K@Yu'#,.I/"J!71Na~bWD?O{Ătun~gaYYl7,707_maY2*463P~eab\[MN[Laj]tt:;Ok4&"O`:=XJfAt<5&(A:A!)0`}z`sл{siGA*'7_Z[U-/1<.jeidc[WKL~]Mcna{GhmC*eF-VR4cZr6*//*98#Qh`uyvrr~~ӗvaG6M>)0U_XG020:9oha_VTHKTS`joy|8LB%U\owv9B<>0HeG}N,(-OnNs;26$zq1On~}׵}|e859=79520<xUNOKI4+,><54I{x7 ,p:`p}{ԽuT144,/'*81rƿ~JFHEB7>yIYy`f7fyz'hOo~W903)#<;;UW*~IQo{}x|ťpE&39,+3,44ȿlLGIC?34*`i2gAL r~%2AOkx{~~y|ͣg8#9D2'L+.G~RLKC=/9xU;[dqcF``6gxgN?451*ZMr-M%y| #,N^hvy}֛Y0'?M5"o0+h}~XQNC;,7vMR}spoJW[SAEo0f/A8;$-RUF(7 rz6"/(QJetz}qڑxM*-CP36+}ʿwUIKF@9ExiTp\v~HYfY(dO7awK02^(?/-c# t*(+lPnr{o~ɘ{)(4>8"2H%+½wVKMJEAQI[Nesh^e|@4u5IN&$+y.9+9&14)Vbpt{|rulqR'&,A7-5B*KwVLNJII[`EnS_DQ@2CPUUw",rv!>ijz/&A)Aa[suz|w*-.5N8;32,J;C$7jGozǭŵg9.'BPEE2%v~@>F?BJ^M>\tp@h-A1jO^IMc7z!QKYE'c8,/X1(IWfv|}@312>DL=5.||8|A-?LXn}{}~ww|z3223->9BV-Z)P~g6;;>:VawrBy~R=+,XWDt@lgaI\nF.!8131A>1ESMfxww~|~]#,-3-;?@R/[.Rj3:783Q^XGepx:M?4-3?tr?ZQ[\~r1B6$E%452A@7KWB^rrqy~~n2+/838JBQ6Z1Lj17357XaNGbi&`4*-U^s?Ow487)O=463BA:KR=ThmnxqnI$%35A<7RKT:7@GP^q}8D*-1<>?4\NJAN;.{|~13,4Dnm\Je^32U4*Y>?;JxUNcI6"/77@;525,8:4<7<><;DXn|&:0,3F:93cLFGSJ2zr25.2>ikR:&h76=6 sJlrxyx\ZK34/(874F13)273<7EB://A^svo%792;Q944gMFO[V5yü~0)(45XcHTi2]7D6>3>K{`pZ%8+&VQ'N.37536=A@;JG:99;U^kz]6*4:9:>6>YO\@ZT8||n©N%$~5,%-/Q[mJDO9O*.ERFIt`nkYe.,{wwuqop}~ut~h:)W6//78116:S4Lx{yн҉8HAKB)~wzfziͷp)WYSPX\[^~r}W+Z*3BH3<;?3-64h.@Ua^r}G0J?E<31:>;>FTi8BpwvwG@GD$u}qq˓S=`^\o~dRc~Fr3PnD)<5(81$dD32%CY0KJio~4D!"C80,4G5"M_~L']f~B3L6%y|ռsKbXYlt`]hd~0f~/Mm4b&+-;h>))^/BYScEsiju/(./G3)3L>#BazW(dp WH&}ŗjN]\blk]]gi~"H&MJ@@2A)%9+>!j^RZipHf31e$^U8'-D:#$=+,-y7@;"S7 IP?>eq\!7:/*>?20Bnv]9735?2HK8_6ezzNk}4=R2+C2 ;Wg{vv@eړɿvleed[R]c^WXZZ~( KZJW62>;>46C?B<5?9&?;gA:{s7Sz%+&A)910QjuyUMoؘq}ٶndbe_O^^\ZZ[UO~.&H_HZ.)70+2>FAF<+1/Y8r.-O;qErBA*+/+7Xlq}}8PzcdScn~׫~a]ZYWPe_[\a_QC~&"?hD~yW-,2,)A7>9@7$(&%RPDNK=k`=3@1)(*@atvxV1d܍ShGJQ[cgny׺gQWTNVbc]\be]I8~!$8wE}nN)10/-L/84>;.2+8-!SOj+*;@4/#)+:Vst#HRhZZUME@CLTmԳqPGRQO]lZY^ecUA4@9=BH|uJ"4/3,@1;7@A9;,1.<+]l^fH.E"E# %/GbsxcD*m:XalmfXI<3-+?˖OCGOS[ecVYah`M>9~[\TH{N!706)05?8<=75 $:N($xk^}.&,$22A]rwnIYt|b]thfc]RA0#GĺյS:AMOSggQU\gj]I@AB\djKzcH441/)6//'L0B3!8E1@M,flE&'*##,>Jhi>2D}3Աhdof``YH93Pùb6:FGJ]eVIKamfXPH?BUfnTurr>1665-6.47B">H73a(@E>qP>622* %4J^o`0B}6Vgnhee`UMKVԴmD4EHQekVIWYhocSJC;;Keq`|a2,5;=26C8>I-NM($i$o,Lb>2*,.-18V8$3Tlwz~8P_ihijfbacb\E@MIO]nfF@[fon]LC>8~:WeuhvS*'1:B78;!)Y7d^U']"Hr8uacD-,-$"(6I\fjqxӀXbeikjilok{ZNORYJ]d]RDJ^pqiWF>:6D-COerx|L(&,5B;;^=8m?:r.ljF3XvU8)1.#.KckrvsO\cjnpqlj`\gjYHYb\NJKZqvpcO?865D3~;7;\pµx>)+*,>?D:5?J8R0Pg@F0H^*)A0Ah*};fG"MVTHH\jmsy~~B̿ÓY]_do~~wst]VVH^ZM]x~y\I1',AZlAwvvrmlklimy}zxlWKSSUUTURQRTW[]^`hhec`bceedcea]]bffedba`_cbacegfedca`ecbdfd_U^iy|ytplkigfiolgwj=NaKvVgdbba]VPU[]fUbuWrqlkjlkny|yvhTFORVWTSNPQSVZ\]_ghfcbbccdabea]]addeddaa_b`aadeecdbaa`aa`c`abec\UYev|{vpnmkhgimkhs:KS]_^dc_`_\URQ`[`_o|VrpokjiimoxzvseNBLQWXURMOPRUY[\^ecd4cb_aca]\babecdaa^a^__cbdcdb__``_]a_abdbZTS^oy|xsoomjjihijjim{SDNdTba^]][[WVa\]qpP<(]pqonjggipouwspaJBLPVWUSONOQTXZ[\bcddfdca_\_ba\\a^abccb`_`_^_bccbcb^_``_]`_`bcaZURXgszxusqomlkkjijkhmHTU[a^^\[\afis_,oponjihjrosuqo`HFNPTURNNPSWY[[`acceca^]\^`_[\`^_`*_^]_^]^abbaa_^^]^\[^`abda[YTU_nvwxysqnmlkkjkedykPK`Z][\Z[]be`zuH/-*,3popmjkkmsorqopaIHOPSTTUSNNQTXZ[\]\``b`__]Z\_^ZZ^`__^]7^]]^`ba`a_^^]]\Z^_abca\ZXU[jtvx|vtqnmlklnmlkdboOKVUZ _hlq[/08? oprommnornpobLFNPTTSRNOOQTXZ\Z[Y]\_]V\[]^]XX\a`][ZZ[\\[Z\^__^`a]^]]ZXZ^aba^][YTYjxxyzvtqpomllopnjediprLMUWXYY[bktG:2,26E%pqqonmoqrlmooqdLCMQUUROIOPRUY[\[ZYYZ[\]\^\XW\c`_YZX\[\YZZ^]_^ba_]_][XX]`[Z[YSYlzywwvtspnmlkprojfeELVVWWY[cnyO&363IF=\sronrtroonkjrr_JIKJRURPMMNQSWXYWZXWWXZ\^`][[]][X^a^Z_WV^^WZ_aY]fa]eVaT`^Y[`ad`^^[Y[gqststrrqnmlnpqmjebgCVM\\Yksh[#,39?DEBqRrsqqrqnmkjqp\IBILTVQNKMMPSWXXVXWVVWX[\\ZYZ_^_]aea_b[Waib\[[\`fca`eed\WZ[`bb_]\[[^hqs&tsqqomnnmnookhdbeyiAMa`[lwW-)2:<@BCBlpsuqnAjkjjqn[I=HNWVOLKMNPSWXYWWUVVWY\]\[[\`_abgmgce^ZcZ[\^chgbhk^iYg]b]^a1_][][^iqrsqrrpqqpooqqnlhfa`bhBQQZmpT32:AC@?AB(lnprpjefijkjnnZI=IOWUNMNNORUYZZXWVWXXY\]]^a+bknihmlmzr^ZdfaafbfZa`gaabcb^\[][`ippqoqpqpoqpliec`__ewlMK^nU.&3>CHJE??C~roorph_^hklkomZI?JNUSNPRPQTWZ[\ZYX[\\]__\_`abcdiqwsvz]e^d`nfe[dedeb`^][Z`hrrpmonopnnoopnjgcb__YfdUfiK():9EHIKG==AXwqptm`WXglnmplYJ@IKRRNPQPQTW[\\ZYX[]^^`_\_bccfio~odRkfl]ddecc_]]YX_hrrpmpnlklkhfba_^X^SonP5(@=JFEHD;9;r|tscPKRfmqoqlZJ=EGPROMKOPRUYZ[YXY[\__``ceihefhm{{b[[egcbdba^^\WV]hrrpmomllkjihihfeba^^]ZY_e-0-.@HMC@EF>8:Vjovq[BCQflnoolXK:AFOVQKFMNSUWYZYVXY[^`__loplhddhju{aURdcbba_\\[WW[gpqpo#lkigdbbeggfdbf\hUdl-*.BPEPC?FJB>>~xutfG0?]jmkfhiVG7CIMQRSSRRUWZYYUZUZ\YXjS\deddgnnvyru}bYef`[WhIiZXZfnrpqqrnqtj^\[\cglmmlZoZg_|ǣ<(:7FIC;9AA7@F8vuq]>.CblmjdggVF3CIPRQdTWXZYWQSXYZ\aaZ[`bhkprsrvx{|^_Mh`mYhAYXXdnpqtnpmkrnd_X[bjoppol`aZhp>#;E;KJ>=E?=JD78vshN2,EclolgghWE1AIQSQQNPORTVYDVYZW_gaN]Z[]gmpswos}xxS[K\RLf^VUWdorttppi`dmnc\\dhmngbbnms821EC>E:/CK:@T90a~zoZ>+0LclpmhijWE4CJQSRQPPOQSUZ[[^[XWagbS[Z\]cimormnvzz{{ǾGEelJ\URUbnqrtwtgTQeria]cgjjkk^glu} 78=BGD@LCAQgpsqmon[H=HLPRRUURRTWX[\[[TZc`OJOV\ab_^ehhkhdk~|ǿeFbYJRPS_illnvmfL/Dqvhcecbdggj^?64PF=?DI;;FQEDsz~fM=A@=Nkqusopp\H=GLQSRSRQQUWXZYW[[_^XPPQ[]^]^`giolijr{}züҾVLIYOMP^hjkmwmoS'2crlffc_^`cbns)(8-EH03DQ\@>NSUj~i~\F>IF:Lnsutprq\I:ELSTRQNPPTWXYWTX^ZLIQYYa]ZZ`flmykjtxtrwz¾ԺB;VMKN\gijmyqw]%%Vksihd^^_coj4F4JF@6NK:IADMNj{e~~?@FIC>Rjssutwr^M9CIPSQOKHURV[Y\_UeZPSRWW_TYjk\^iolptokrɰr4IFN[imihxrmU*?[oroa\cefl_..OLE5AOBALIARsln~FDILFASlsstsvsaQ=?FIORSTRQGTTQ_[R^NSZYSYWbe^essejtscW_rþφ1ROnkamtuqY8/7/"^fXu}iom0&7M@PCBC=AF3/L}yxy|~*LINMF>OfopqorsdU:BFKOPQPXKZVRXLSXJOV\SZW_gjkNcsxgYcjDTph_cptt`B9;0=ò0+<:RCBBEF@B>,?tyt~xvJHNOG>MdoprsqcS7@DKOOPNTIYTWWIqGDINZPXXZenkdgro_Vayޭ,bbejakqvd>+-+/̚ĸ4@J@N5CJH?936\rty~y~JIPQG>K`mpqptqaQ7AFNRRQOOHTN\XNJTXUeW\_^aefbfohUSs]X^jkjios[.$KkԮO9AR:J6>CIE88W|oy~yI|PSH?K`mnpqsp^M8AIPSSPNVRWL]RJx?RSK[JJhfa]]`cfI[ŻHiy_qomkN&5ؓʾّ3DKD;C58GL=Exq~|xv|~OJNOH?J^gnonrs`M8@DFHKNPMXQ[RMEwGNXMU_c^dN`oaaXWēelydftP=3£̽ΐ7;A@;H7@H3;7EA<]~|yxyyzz~QMQSLDQdflonuueSILLKIIKIISQI?~oa\KKWQYhddaqydcljv}z~ǻð.9ACAK5<7jz{}|zyz{|{~NINPIBPbjorovueR?JMOLJIKKHTSDCsh`NMRM_\^kcnxbgolvxuͬU29CI8C4=Mz|~~{}|}|}||LHLOHAOakpspvudQ?JNOLIHGNJVS=A~md]MKJGaXbvilr_l{~|tyû">@KQ0>;Ki|w||}}~}~GIIHJCNempkqtqlK@IKOMIFHINQOBGzg_Y_L=ORrsrmhfkrp{y{xwnvl,4O?;F7?f}|{z{z||}~~GJJIJEOdmpkquqlNBJMQLGDGMLMJ@U{d\U]LC^irnjkmnqsuswpu}F)?KGHB5Oyz~{z}|{z||}~zILKIKGQdmpkqurmNBILOKFDFQKJF=fzd^[cUJgtqmhjqtql\fwg{a[wùuV2Fk%3:E5K;+a|z~|{yzqMSOIOQXdmokrvtoQ>GJNNJKPHNQB6?gVd\KY`_nurnmjflw|du{k}^DT_C/-0o~rANJJxB'2=ASVABuHt}mQchZ{u}>kJXprGKRFDH^tz/zpA6ejkp'C@@MD=BADHPWTTRKVCGRK5G{[ds_`hkqYnvwe_Fm^>T@*TC;PVAlw~OSi^_'0-8=@KC9FC;[~o}~}~RTSOMELdottruvfV9pl|~}{zyHRTRPLBKcottrxwgY?EGOTQPMQ:VSYTdA\}`f>dgWik{SGES[_o~LO1J6:<|q2xSYrT|K/"/5J?>D8;A7Kgq~~{zx~RSQRL@JdotvrxzjZ?FHPURQOTHQQMHJUYYmWsd@_K:HSsaYNfX*,zsd>@XV(G4H;E;HF1:2C57y{w{tuu|~~}|wvv~RSRTQCG^puwwz}l\EIKU[WSNNPPMVhszO"{ca?wQeU8h6Jc-97l@0zYvsw{R>CfaK[pq_D'>1KYQK?C62oy{{yw}||{yw~OKPKK?OQF+31#yqieiuypG,9PJ72KoNAGMBD8#K{n~|{xz}~}~IFMHJ=HLMN3Y<3B(yZ$Q%.FN,.Ķ2G^[jp|0.@`H1?;,S^MD?I@<0xq|~}zy{}~~|}~{~ztqsvlJGMIJ;8bqwysvvdV=EMOMSTEZE8; *)r7=cqg_>?HB3Dq|z{}|}~}~}zwrlilvmRNQML:6`rx{xyxfXG@RVE[\(.Gf* $ZsU`sbUJ9:UNW352}BbtiRh{ūtlbVbnRtwJG1-;d^aZ6BCD,\xx~~~|zy{|{ztrops~~XSTLJ:6`sy}yzzhXG@RXJdl7brE+mWE;}{]{M=1AC=JD,Rb?Vm_tuhcatcalorkYD7PC.4Zc^L9B@@5pm~~}~}{yxyvwyzyxvskmulYRQHH95`pw{xzziY=ELSXfqsE[R2GNLpww[::LBB9!*z=EngssupeeiktvmZcVH29R_jN?<=5Nziz{|~}zxuvxxwrpns|~VONEF75bouzwzzhY8OHL^WcxxGZHQkjkQ^oy~I=83J/1XiINjhpvrkfakxsg{KK0@IJtX;6?)`|ixzz{|zzxxuvwuspkg~~PHHDF64du{|y{{k\>BAQ]cqphZSovHDaneW@9E.A:$0R\`eusml_gşvtqovb02A:<9937zo{xxuxz|{yvsp lgj} LEGCD31`u{|y*jZL@HVa}|SnumRXS6T]UL`JR0zk+7:13s)"?V\)kxwpn`fġyvsqr]<><77.0<3Nowyzzxwttotqdcs FAEBA00auz{xpiY8EJ\nVSeWfsNUMGIYSD;L{w</~a:SY]YXityoli[c|vsttmS49902),:-i~v|ryzyxvusstyn`fgC?DA?/1bty{xxwhZ5OmU]B|QsnMGKA+3F=8P~Z1!oxFFZ\XUep}vjacX^svqv{jF*9?2.2+30|swnzxuruwtjdshEBGA>+/buy{xxwiZ;WldRYqz_uHQH>(lm0a:o*#u.!./iD[X[cgluz}tyvlNlfaai{prt|{27CKA%2G"vtv{yzywttbwiPFKG?7?ixz|w|r_1KC_tol{^?Y8L]]44;>F#)~B/8:)QS[Y\aejrx}rzy{v^aSXOVfwqu~X4:>N=/4@%8zy~wv|zyxvsog{~QGLGC?It{|}w~tdJ6cMfRfZPfuzxÖ:=&+Krnj20K1%A\L^Z[]bhqr{v{~{~|lu\eesujuo0:@G[>=0.5\szy}uxwuuxwtpgn~OFKFCAMw{}zv|teG4Hku=hob9oypXYi68Hzao5/*CE.5W[`\ZZbhmmsw}|yzxpxkqqxS(@CQkCF'Lo|pyy~{wuttvusnbuiLEIC@ALuz|yu{sdBFEj{ef`Sfigfq?h]!'Zl?!4G;??NG3?CGS\WU`d_ljd[TTY_g\ctos?;995GAJ[0W?oqosstsuwuwxvwzthY?Bz:NNqxy{zvfgi?x]OBG:wwc_hmbL8,B;>>MJ9GL>O[TR\dbllic\Z\av~h48680?EFW3Z%A{trvvwxxzwyxwx{ui[a=B@>3IKluy{zvgH@drF_UOKR_^}{yk2F?.P/<>>LK@NR6IWSOWbdilmjd_^adpsziA0:6=4;NHY<[)C;7TR\EY+1vtwywwy|z|{yzzuhY~=>8ddIownq},D*I89A8<;KMCKF2:FKS^hfghllihlp}y`L;IGAD<1WUYIU/&vvyyxxz}~~z{zuhWa?>8C:;4.+2D\ecfntw{}:FHDK4/+_QNR\K(xy{zyy{~|{{sgh~=A::AcZinv|{}vlD:aDF8|NPXRL681BZqjopw>;JVT;W69;98;@D@18BL[hqmpsvwy}v~N?:0?SG@Uj]fR[J$kY[_fnosx}}znpczA"#;OlG;-/.FDcvww}vpR*P@WdEI_W*}\Yʼn^w2?dB>\>?@ABCGLI99Odjlnlmmlklorsv|P?E.#GmV^[VI*z`eb``b^^asosvpewN)$>VUBcWA:3>4Vs}z|}w%Imv{vzylRTO.=R8(MntCBz}H?XA>Z8:>EE??@H@'=]^lrhkonnl6mzۻ;DTOO_I;S|ktoorqkgfUXYFXhI:v9"'=>BSV~q^EBnw{vz~re{2:(LMX~BMx[]~cdd|X55[IEGOND@BOU2B`]hfbeiljhggmy}˽h.@KIWD.qxxtuxxqnmdb`F[oK@t*1KVPMMG~sNDq|ww}umNKCA8\9rO~Jo'7n|{w|rox.?EW=NJFpm.WSRIRdYvuoF=9UgL=8>5'Ec]U Ibfedcdeegknpux}ʲ#*vgtqrtutsplg^eI>NP]jXIT[VY~193n{zw|rmy3)YGPBBAl2TU=WCDUkhvwO@+[QFJD8.3ZpaSJdgebabdefjnrw{~Lps}qqrrusqnl_\l<;OP`bQH]cWS_)5,mzyvyplr:J;H@YGIRM4jP9_,hZ]n,AC;7KH80>etdF"Fceaa`cbcekmsw|fdl}uorusqkiX]]<9HO\WKOadXQ~$7x))lyxuwnkjKEF2GRYGX@:D`;FMrKOzeB8O;B>5:Jhna53H`b]_^abcdjnrw|qw{Yknnrusqkh[doRE>CTWJMZ^\XT~(PDNDmc=cM3ULEPX8EJABxL>32BWmlf/EQeg`_`abbcgkosx{ͱioqnjmotvuqkg^g]KOFE]VDQbZSYW_12nC&p}{z{xwkn>B?76[G?TLC@FN;;SLSNUK8<<=kkbmiYxRE M=40.>WeddAOgngpafeedcbccgimoqsxz~µu;Q15?LV^elmohYhrM9AB?IX]YW^cZF5?&(>?^DMISQBFBPGRFRNUWOOCJIWH{}cG\6V3,/6H]iiP/Vnkehb`e9ca`cehjlmpt{CMY_[OD6-"'zn86;E^lj[4BnZkreTjffgfgebaacfgikmpxLKc[^_XN:%-q/+;GHObbMQWcfYG=>B\cj{.St{uvr>|R?@BAcFXJ8Q7`L\kI^=:>3/6DIctX(*ddhihfb]aadefceg0muu}XTd^\\TA- 7|=0CDGZaRFH]ldVPH?BUen~7NltrvyOnI>DGGBKEKNY:T_NLyB[a\kYNGE:,1:JWeP%d`cfige_]`adefdbdf0kru}dzEXc_``[L?7;pM%@HQciSFSUdmaSJC;BKdqE]u{{z{Z]=9CLOGKZQW`Efd?<>Hg}VI<;957:N*7MVY^befec_]`abc8edcaacedipw|¾@R^__`]UPNGe>)'=EQ_meE=Wbkl]NE@:9:VesMQkwmO57BMULOT:BrO|ul?u;bS{zW<85*$%*3DHHLRZ[^cAb^]_`abcceedabdfeipv{rKVW]__[YXNc[<38?MHaf_QAFZlmiWHA=9 /DReYUp|p|\H36=HUPRwVQ7WSH/_KqjH4:3"+BONRRWZTKZ\`bba^\]^abcdffdbeggehpv{ùDNT\^_\ZVPKA?PXKAYf^PIGVlrlcOB<<;E5=Gap_|tKD68:BRUWV@B}Dh[XTQa-czK))15KePQPLIRWXW\^_``]\\]abcdf5dgjigiquz¸5KQX\`a^WTJGQ_`WOb[KILK[}qeTE<=CGD?;@^ǾPq[=6;;?QW[SNXcSmIhTBF[ctn?-4DRU[RMJIJHDVZ^__]]\\]^`cd6fehkjhipuz}KHLQU\dc\YPT^[W\cZWJIT[g|dU@65ASa==24S_yD:5>Nůj hη?q#|_v2a |҅X]Sۇ D%^d+'`Nݷ+޷p0iQG*DM?{G侺9 (1ϭ\#s_b:(҈aBw>n\G^~(TvN &UTRTP`1dW9~=n1 cO_8cr_8l)DҨ:0Ei}roSS܀XrLjS!fSoB ԁP>u_=4 R:u噭GWq:_?7BM̦*YMjHHi0My}i5cN(Ux5X{v}ݭGDCwID%PDKL~]c| GhN g6VAz38%oCyc2T3rRzc/ #4 SU&s mҠI 5ݹէ%1ɜ@ʂ+PVBKLxwMbBf*P DAJ~Lu.NųWќc*a*y'xb,l_oXYVQ\ T2OBRV.x)Uh`XRfS0Y )O ,LkBL SƖy4Q&v] g dnT9Ca-p6৲`s ƌ`RQ .'bVXR[(`竃Xw9cV`\SR%1dR\8<3e0Yn"#3ras>{D1ti]f CqN&J6I0#LpԐa@L}2}.@EVt- ̲, {TPGvewp+ #|n& 1|`W|uX^I%Q DIbrś8)0+!ZzLC pʥZk„RQrD-*.XT boSEdjwq>̈ j̣I# b2@+ ; Fji{HUBie!D.n8ِ%PQe\ uIjB1u9kX[x(uKHǪ0J,UEI0aJЫ8JČ2ī< 8k0M,l"Ƣ0PJ#QIVH'2LY#7 A3,)eXfBY&,Ɓp0"U!"e>5TBtǴJLgGz'z4ۘ5.fb*/tBG08 ڰ:I낓DntZ$|臼eb S4bZԴPWI 栊0t&6[H~F}غjL3MGLIc +筠"7?)! Ry+&Ѥh &ԝPD91CSEdV. I X&LQ$ 9Q1Db 4A2A3b"+Hki2 θXx1a" T2c-T6`,e'.e6S+bَ?mYGͬ)cLRo(㘄 {.XDfM %H2)T$L(NE{ FΊc4!@h3# QMgWu[;o_;mYDxep`XNڮ!fhۊhYI)oL׿HP{u}֑5Oe0+ #m;3$4=hWŬ8h E$AU(Lڨ>oa,m:XIz#0$\[ MGu}T(7Rٽ>~ĔB1eQ$4'/ڟDD:&b"b÷/xR=1IdeBLAK{ mbZ,%ab!Q1|<ݝh0:c3F#ANߘg"QAXq+`na?n 1UjeQ0ǴSNsԄ j1f& P{BH{F&A풢YQڳ]LSBL͐E+y JaLΫi$h}qJQX\MAM2LV`iaE849ױE{0q*xmmM !w}¿p b+v-s$fq+RWp?Bs^^ !Jt/(IO+)/,{q[ZM+ј*=ȡBu#Foa) hbazXmF h%F'Amb%.g(lUQvZaI g׈~3B̾qeY!xoھe[ %ƋkhHTȝoc@%bFzhƢݫBwKh{erjCj:a|P5M]Ps,!3&9b9{Qh bɋR[VP8 p:*>BJ(%"(s) dn_KX\d7`xa?n}[=,jԃEW&'iOߓ˼|jhL;ӯ5$\{6Ucu7RHtv/Py1NAտʪzLiB=)JѦ(36k$EGtmM,ǜmJ+6UF/[!VЊ<wVtq#<'t{1^,&O V LIsh(w%%3{*!aaLhUw3.P۾L:}2$fȾ@>8m5R8O1-L5WYP rJS w5D'?jGpH*nF- :c&ڕn9xlZn&a퀨r8I2SJV^JrSOFLY)ԉh @y1ʮ Y89>29su['n_0I{!} ( Q5IA̲iVsd Nr e ^찣s) =&k8ePUV6'X72 on'//*‹C<ZcloV5Q:΄Y^uGbypO78ekPއ)l~('r9ItIm"3D;M1`:!4RB,S@7|6XIJ۽(bo+u6ҥ5/"KzNH4DM~Tkދ_ea)/* ԑ`*sZj0^mP "THal,J` LR ˸']U&I=nm48w9Лޥf["2Y$tw[4Ќa'= 1WTpAFiR^cUvl:Vo׺LCC9j+ob1tt cX48/$JܺE!3\ʝ:~W{L0 hHT =ɧ*f˓vBx@]>UġRK w;n@Džv};k.eZ4j\Ŀ|A2^,yѬ38.ol|_64v͢*{e"fTҏ~ ]~uGm 7A?K[0کlT|?Yw=_Q$6ؑy7 yLLD"`H1 F&H:l% sǪe>߭KsfǍv~ʓkJ> 6̡\ 1X=YMpR<~r YAD392+g7n M j휴.)gKR!&~P {p81h])wTb&˸66o7WTx=uJ}@TR z5uFv֛ Ǐ̦߻Z.esG(`%4{Cl]r-Dyk?,`V9S .&#vDLX&_UV\ʊv!ΖӬ?lom׏i)v<8ńmsHh73_X tKx9Y阆C8lK9 wQe4TMDWi9/a8oB@_Lc 슜}s34= VW9Av¥Q{hpćE붫6\ʲwt?5,lt1:S--3 \yKN[B8[&="߄Y?}m0?=ȿRĿ ujZz(H䏽-P%tSv}Qή#j&MN꺱ʐgYMEhX-i.S@LPAݡ^@owUhRCB nY߁݌#F2j8`mek/j$g73; 跭2>`EW/}A3 C!ŭ`yأ=wF̬Ȁ4y Mpillow-2.3.0/Images/lena.gif0000644000175000001440000003772012257506326014531 0ustar dokousersGIF87aC6ܔD<҇[g^zRQӣmOץfm18Ѥ꼀v\͉|ݽn}qCMЙssSw\7IhR娎XLjr}ZˀoE`×sW(:˳`waӰZExzbЛ{~шiifhrdl܁XxpvsY^EBSNc[/LD#?U)Eph``}=>ĦΑ~wavl^lο܂gL-O׿bGL$9|6,Ěp}\{ĺd8Ed*7deᰁdԁeܶdlӶm>R經L4Đspb|ZimL&E~\ܶ,G 4:象gbWD$JtR,A^tB,CL)@HX S$Hø>A:>[z$?a*H,VW1e:t RcȠ#Aώ聣6IØ1@.$ǎm0rK:*  }I$s, I%i.]j4GntZbu׮$ RCQ:tAF<=:0.u5*K>4uG 9q\ʸ"/Y#h*(3r iՏ2g|ppsu .V,!MGSH'q`tt@GtHs|wQ6iG<^R|Tp) _M/ל%ud Jr,)ڈF q !4Pܽ T؁raH8 N/`F'!x/Zႃ`A KD,эnX|e<<@d`4q=ÅYC%P#}ζDb UJ17*@P$.@ΆxI@֡+PpH5tJ6P X`%-ܐTC< 1V0ڶҚ}8 h#dqDTC@C7")<t2Vy]J~arp5U! 1:20]Ft ex+sd+L эa"krneIEbLjb? 0 zCTCXnc.@*1^0 2+9B(2;=@sQ Q  \2:@ ^&1`nk#Eb9HfʃC*T/P|mV C18@ Xh,#cGkG0` Wɴe`0:r $n& mk5Pu#.0* :ҀhxiA5!@|pE&h#/X  -Jic% E#4@}х +iD1A\֐0a11TРĦA8LtMС yՎl;9A nN 0r [FYm h6@c*:pBܠ0pO: Gv__v Hߓ7K! ne"y88?ȆFA XZBJ+J8}=F '$ 0 vڠPfI|Mww"RqvIp0|{WSebvr3:EAn)JRkB@7#rtrNu)vp7B/|5 @ ]Gq@ 0k|H)uPPİB/(GX:7|@/SE$k&:_ ~pf` @ drMzw D* Qp8f_`Rt7bH"pT`P`dy

M`T` 47(MH 順ݐ+p+mfv7֒@h1WLj`+#( ,%I {iZ & 1 P&X 7 Q8U2mR bHP kGI0  A@|0}80m:Ih~c#t@ P'dpZ ey|ɗM <g@ >  2#@ W Wb;hM(V+@0 ɠpqH@`R!@jVj Yq`۠%H@Y &@ 0  ysyLyp '@dA*f{;@yQb ]zMM0 iFZpcRE0Ÿ Hʓpcpja'$B_Y@tZ&@ h06C:@1-3@~PNW gf§Y%PyjFz; EǓW83c3e !ii@bAY Z0ZZ&I˃u QVNuXy 2 hphPfWwE']}@ %h/'`8x<([ĀPTϠ^@Y۰[Q`z MƃGq+ c_) BX  *DU+zS N@{z>s/Fs G4̰X (JPր @& e D[Zxd0&pr+mw d'\T{7KHx }Ap ÖC@@x_b+k ej*yD`_PPϙs*?X@DD ?`@ l6[@^ 0Le~ 0XFs fi۠/ p~IpK*d@K GD@ypUi6ɡyRth (+@8Ÿg.0 8D8Gf %PV d& 0E FgZ< hMNP+%i jIp@b Hp`hTk pGp B B _PuT0 BhC\&` 0%|e+`J `l;N@++ Ā+!7}ȓ<3VUW *9,BJdp~YGZ%BYPD\yyPױ <A(19`yېWS7< m FJQS0=7 7hSS> Pk :uB@ 1BS{+@ lM cUP{-G y0 D.TWXEU_*!]= fե pBc5xY ͐kP`2+`h@ +@ 0ZeȝrdHF4 eL}< mp}R=: y* PN!ш4` 0dTV 0pI ۀ0 u]?X0 r FWMQ7k"FftQՠ$ <:@}I3 D@IP`<  ` P I p 0 ؞oCpUb epw% a$`F؎=m|1W/0N fpU3 ` >S4LE0   ? b] EP pUE 7ʐWXH=5Zༀkn^F@x1 %7E(W2^/' S`PP 0d00 pN  ee =pt\>ogKrCIt)Vp~l& ySi `>&0 Ed?L p ?? p * ]  'x  H` G@rDsDb@DJGH 7g:uì<p GG/p 1p* K U-g`1Xdd0 6b@J+Pyb-K0`@ \6xKd@&2 E8LQhYҡLQ +zQ` fA(G!Ph@ H.S#c*cf D8eGĸR _CF&"9&,h ot9$qZ.#q/6h O-C*!* " +G_g9JxAA r S0l,0 !4 9f X]*TH{8A$A?`Fj9R?H@3o PBQ|C ˄Հha #ȃEPaX5^@:Czx.50@P80H`:EhEW"o_4VNC F_aϙྷ4&e' G60g?,!@ @:(-1V{0cq7o,t7S(:o\ p.a l343e80`/hCPB! C(vi1av`pHr`sH,Ld@@~`m\Ѝ8mb ^ f+]Q #J< AA+xTq0 .th/̱# yb.E $D@ +  8P E I$c݁':*'TnU uHh9X+"h;P6wC! y@Pp 9a8i9hz8)*cX^Ѕ$8 k*2'(i:Â( HuI h9 IXihO|ȉ.0R ]1\mxNkemhN=x6Ȁs8E@1 +sU)l( PH\ %F:,`Vp u@4H1A? :>wGw!2@!H A= 20Pj88D8sHH:X ,X J0<9 4 ;0i(I@ͺ ƒ0\Fp5@?i?4փD$Cp'Tq0.G6! V =Xj H4-&jNpH!ʝ0nU;X^(婺R3F̢H7vȅ1ht:F\= ;$8/8%_.CiGGg0U"8Ӝ9@A/&aM/@,)@WXHÀ?r0J,pKK{b=!LNkH;J耿@L'8S`.8.hG YXG`b!F : 9v *e)P$:Ўd)`E4E=xP8&y3m:sW-Sj ȻҒ. ؁%8C%FVQ 0J;`pQࡈCs &0!pC& Ѐ  m'Vl4M`7:/xN;:1phZHP֬kZ:!|THupx֚I &pcT2X_PyĮ{ |LH?A&`%4';s?}K{HxXUF79388\PÁ7ڀ)C c Q.P9:!(*P b~PP4 =t^6x4H#~ w۹(b (5ZhZ\\u(Zv[/դjuXhS1Ux#^n3ZxwXuMdEtЇ8EVlNm8Q! ;{$pP3 pbQ< mxG]Wu͔ Sy5>rh*IH%"VO(K'`^h`ӱu`-ЂrņjD)X m4cj@j HKcp I<%bt(<3b#\My9ƴX^/"rXj`Sq.0H`P8,rB`Z!`PUX1㌽c}hfb}saBRql=Z ց ה$9#Ziw aSk`' !P'@PH-(YFoXN`zld|S$V>4N  @Bh;>T(%Rk 3EbuMMu1`,jHeHGhq ;!Hi@n8 (0 (<+8rcHj@<b%V4V` 9[%+h0`>e] Nݽ0HxNvMw5g8h8$0 f2R@y?nH|Xu[}}s`#X&xvA öK8oPƺ {i\0l6HN0Zw+gph k J pp d[+`^rHB+)QoU(SH7hƥl@j sW&2k2oPjudN-QJn6SίЀkjP29@UgROi@u"lxXU>Pc%&Kc Em>sˆD#B( ؃>Pܓlۃ#gyL}7 x@؀XfHIpT`YX3ՀG.s<(tMh[:L`f@)h?;bXTXJȁ((EGC:8QMN̽  F;}ր$X& {_a(sDІNh SVEXc:0ntf^N}PvCw3f q@T,T3Qq Xæx&2fЏiIy~0p,iELЀn)#To.Z 2`tf`Ec `8 RR0>:5̽6,-VJNXMwk#p=MƁC_1@w)Cg(.($($x0XiB Oo pׅUX0~'KA`~}8HXuK`T`('s&ك\K?uwSkRNEX-+)aCgxɐ…Tv,,U0*  (_D휶N3fL)Y9%ѝ; 8Pn^,fBXQ Zh9C0eS1aŒ*f6U80`p̐lR0̓AcL)!fBRrGla,:&SFC<_ %06w9F`JBAkE:!=A@eƷ؆3=^y! Pdő'B1GLT YwIQC6< fT gID;WaG0P! d-l4M%[=8U.pذYi 9t/t!*BA@b{"P!aBI0 p9\ȓAL#\0;;\:v䠁#Z4!-3T@Dn#6"ሐ;P1ν:g b~@A@4,_b0F WHJȁPc90[㓾U/x˾ځ**@X͞]>@ pEH 'g1 D( C`$Є !AcYdC$P1Xb>8`@(D "nˇ LdGC=fnI!?0~6qs Hj\؃GXZQtmDA 0¤EO R+@$9 pJ @}@@A1!800AX@+8y(84'@A)Ԓ2AM)P, }(VE:(E=3 >0'A2hVPY,^B;̂t2` `Ֆ.=(CD|^x9XȂ##!\4TAg Ch,0t D 2aaPYd] B (&9I.\A;$܀.L@ŸP,AXh4P@?t+\UH@@4lɼB@;.`q8`dC46|p/ t=AQ79 pC+%>0My B*@ZBv $ D-A 6lu0@_%C4_* 4R?3 [> "*O 0p7d8B7P7i@l@XXhC7L_\AP_88!,0tH*Rhh<. M' ,J~<CJ$ 'ؖ8dz_@80PA7L.dg08x9-A_BLZZ0UÔ](B* H%&(c3j]4 P6=.j<@F@A$`&$+R(@*.A 6xC/su np'x)TB(R-mѥ`C]iC\ K vN mQSD.eZ,A%A\>h.h@B{AP. < ėt̗zB<40@hi6 A1cs^$B`P wW&2iI_;|ˍ(A !EbBA<La6@+tytAG6Z®B)@Djap},k_b`%|= /pŒ40)> S0)  0h .;&:< XAh8,W[^4W\B=}@58L8(36>Pdh +>l* .h@hܔlAXPAMlm<$$'J>ۘU]BsiZp(G:d_baZA*@ɾBAؙ)PB(7 jC/0P@&ܣ.+8|Affė""9HA>\,K,&ÛnF0c3FC?0 rBwމ+,TpC~A %L>B!Tn1A*7K4&C8cP}xHj 89B'&@!1 .T5M~7xC Ea"r5huA,?H+ X08cLA182;kASh~8Q!8y&@߶p @9ADD~nS@dU?jZ@hV@kWHo^EwNGx>EYHvbJmGGJJwPIzQJ{eMpqLqgMvUMQNDLNQpStZPHOGSwWoRRdWyNS[VTRuWyRWIVYWUWHSMU~[zJWEXKXS[T\s^GZ^`MZ[\H[Q^daebI^J]RbNaXcKaYdPdXjMcHfOeglEi^mqtoSlRnqqquUngtiqVoQpjwLs{vSrYrbuStlwTsbyx|iyVu{`wkyp}XyZy^{axe|to_~\}a~X}kbcc_de`\nxZotubv|fpqyenjezjufb{qnhcykz{vxr||n}yii~ojlgm}puvqtov}rxyz~mSK[6&B)'fQI7B )@ qsM&)X9]?zQ,&%)pN7'D#/\ ((O: Uʿx!hEJ`$6jD14NCoh !T9Sr$ۙnzZLivƢ|Fpillow-2.3.0/Images/courB08.pil0000644000175000001440000001202712257506326015044 0ustar dokousersPILfont ;;;;;;10; DATA    !!$$((--005577;;@@FFKKPPVV[[``eejjooqqttxx||##((++//2277==@@FFLLQQWW\\aaggmmssw w~~ ##**..2277::==??FFLLNNQQTTXX__ffmmttyy                          !! '' -- 33 99 ?? EE JJ OO TT YY ^^ dd jj pp vv {{               pillow-2.3.0/Images/lena.png0000644000175000001440000011153312257506326014543 0ustar dokousersPNG  IHDRL\"IDATx,.Ca}wmK[Wj$ahb@.D=ֲSd Z}:0x{y, 3 [[شKqԌ֚B%Y4$P$S4V L$I򿐤PDo"R!%!Fd~5OͮF" !$ $o0]t{C __\]w;r9E^d wďqoz;yzzm̎OtN@ Dǎ@M׀uHPHP0Z,WnJ- ̌F-$ja;"2ozmv3M 9""ma+8&̮Kgk!$?͟`ƾ8LӨZו$mۖe?y ٦$PhQdqP~<>]./7DJADj6ngM18]f5}C7z5 q F }DD9Xࠂwy3 \3"YdӄI`t@ BC :d&Z:nfSD9 `qሎZ\qp8uvL2 , bOET?O_dTJAKR-_!,]Avd읮x}(ꖐD;ۄ "0v*+υiw IKK]Ha8fv@E w4O !M|EV2i Z[׵6!25 cE5˲`0M]-y9ۛ]DpdQ[Nw??ϯO/LMJCA((ѝ7q!x ]kgż@#IFS$Ruy#T guI?do,:`) eXTLD&Aҁ,K[k8Nf ̒%XU{j[^nmaIO0cHH!Fif"QаGf=@Ezh0D hB$Z&ދ~RԜR:6F_؜A #0z.hvڰ_Na2}T1NP Dg' 4t{  B  wl{Mj8Ҙp9ed&qj e$ u\$N)3n ID F9vEve_l7W]K(~Ben6֓n8@5(ag>8g|1` p!0f4v-=>PL3LTZ+ z xNI)H6noO/:xr/mΑLKn@ C8@ ]6QtKP]ؙz$Hb$~W-3kٮMvWܵ rֽvpxIQzI3YjśHUۍ0=/q^ѭ xqDD(+6+$27rtK:+lk@ ߟp`5DZ44dB2$~LJQݭ< EBumϙ?aB2bj)'ɷP(5MFZLZg>v>iJ2LPL0BLX%;L6fG|izQ fvl:.ƚieߧrjTbJ3tҧ W"c^o?>!rs}p'6궢,^x֛ndXMKQ {oVW"ŋHۃKmĜC C2I, tsΦ(až{q!}4sATDe@88!pI:mjY1P:y] vQBH)AOũmp9 A+K_(bTr8nQ˟iiI=3?_/]\-BH#`Q/L;OA m (H(BH)B8ĥ.pw1>l ̪ZD$,37I$X+H*–?AQiR])yO5|&sUlp^{wKC|03.Y4vyn]U@KB.UZ!Z2UM] ZPͪ:vbSWw};]~Z'̀65ы|TMJA SUmv@EO@AaJ\TI^ј9"p8jamn(v 5&A1νEn˓D`.e`hrLfs ,L4J 8u{u}6#>jI- LX?;U9 ,Ġ.ɬRkݽﷷ7aswfflNy8)̓PI._4KNA D߄B2B&;HXB`uY4s[.<T,~~8cMhQPAɥ"fjĩPsJ, TO#m7TG:cR*ŚiZXBiU|^"M xϯǷi~x:5Ta0IZD׉V ERFQS$`0E{:??fu`,% iԶքf\{o44عAЮ6@bJd|# sGu}]]W2˱?m-Y0pYD ,">e6@um΀UXXL.l1E!B믟x1ɰ`u`dk-4zv ]k: ^㼨]p=a/ݎG"  JT(ZTHaU dD*\iq?m~~<~?1NmZ6*pW5/1 fZ_LNQg FИXSXS+Gؠ r\f,V~= rvc`hz9@nĔ2#RB9KH;7,}ŘQkݵ~XXD$C:D9#a#I9҄~VӉ`JZbTUܪ뾚<9ϣ1}x\1٪ٜ_K}E;ݤi4Msfq-?!3QnW6uƨc!(޹@ʲdf313"j2KG,ơ[R酌^<9F]%{\j>{/vRNWU7ClRamclu-ɜ B$R$%VF%,i"2UEVuUmLE&q <=N@g^혀B nAhˁhi L?vvbi^} n{vqA ( L"hCDk=9 x{l֟(DtN0=8lڪZ;IKDy>+˻czy D 117MVm*j У"T>RZkS;x|Z+1Zɲ̓Q2/O{DQ/`WLMNAFAD9kxIw.23H=U.:}&=|آpȢ3s> 9h,C)%c4MuR1Q 5$PXtU${ihdME=>&z8-w[xd[t=+[d.8SΒ "3q *Tb +HAc,K׶GQzCkseYht @DAmPY.VT;OAΝawEpeBHW6X#Qe3s-ƐXT;8U;j}r!FQDH_;~N=cR4(ʪn3@`|:Cn8" Ǻm0:2A(m0JCat˺PrH5dF\d>a ;YJjά1MϑnND:^9w>or2e 5#J\ۍ^\7y/gtDMNP mIi(ЂWb{`];%$/mOU0Ҍ4ߌUtq&̌dEQ1'@AdEU:$|J|z^fTY { #ugZ2EX]sLC2hy߶n!΃sE`{l^_>[,Q'bҷBȬuucuS @ #$!U}뺯תּ(E1CP$8*q^bd;N0Eq>F((|&` Ē(au=0d(,M^q=i˯)#؂ p3$W'1 @yN)SZ뜋iJ,)1j^9會Ԯ뺾8Rc8YEHb 9q,7NL:huB\ $$4+y7BhrGGFZ0媹_@J)Ji۶Yu]7#(&iT4+t]4 Fu.˲iR"ϋ4"m;k]}`dFjՏ#@qgw1w1@B\m~$E&E}RqzYeV|g`(c֢֩i};lN@w|c+vd x*$ .M1^š +7DP)*޿R J0g|Dy,_0 si.9R :[|4ϴR(@ąRjUɔ HDѣ@ozspnۻ6:~Oٱ}Uda֒EYVJ/JMF ,W} ?/oZMpZB$0|DpZW7uHiK8~LJAE5әB@ܹB])$]Ub'>c8f `xRGG=M[$2 ÐRbrYĜ۶i0QnqS.B&Mt֚H)1ր`tQVcǔq6S>}~a)Z ʨŒܝ]ǧg]\pByz_>6X,$x!"50ۻsR ڇVL;O1k%QwQRP"R"$?nMj̧笇Qsp&q#|9֚S%!niE!B3@ BSRZVmB GMsQu޺GYp`J =CbA !!B.vYYw bHRYRJ)@ds9BUďO.Lfg}r6_~}6:j]NcR NRBW%sP*7ۛk2k*eZk`P4JCAEgfg%#!PFSmoP6Q01ow_8z!tTyaHވ8;Z -ƑH !*slaS_zD,5͗m[C]Na<#"9|wpX^j¾af򄎉Jl̀#T*a%Wod]0&xg6k[)`_eZê<5]Rv HR˳(jطsd)1_L=N@2Ę"ƈ !C\BÕ8E$(Ĭ}(f4r ]F'øQH0"l1PjeY6MS59ODޑrQ`2d7]ǥSͅZcQmi~E*ra:"3BC9C =99tl7OϗWeɵR7Z R\ɶwz"g8D::wƻvXSƥΒwgrv>KNgGt\J !ql{l?,NAE1=  ((hB\\_5l41AFy =Ub{{NFDHܚAUM H|Pz[2"`{cle?䜻ϫ {^evE\L5P웰YT?:>g&2gDbP͐ 1qIfIt>9nwGhaT뺮*0\^_>^dB Lo,}g%p59<5{7]\MǢ /Lb4"bD;N@Eߛ=("T B.k'=R` WWWG:DD`Bk@c=x7j1|N4R"I4/-hq`1J.mʲ,ʨHBz{Eryu~qzF)l,g2}@?SCzs `Ym]O8U0*c],iAS۲4M1*FfZsυ >2nWY?>~^`wޮ>[e?Ul~YU@LSߔY\Kr (Ve)oMxvy:SZAH+M,J`FgIzIojBP )tH$俏ᜏ*"(3 5B&D"* 33 CFȄspYĔu Ә3<xd)ƓsӵMHDzcb9 jnWAλd9i ECŸ!8|jJ){4r|6T_^SAm ΅6f>?۫ZP4D".#jj9 ަg;aLMj@ 5v&fWH -zKBnxf$MNJt=>=-,7"e(y{-дX+3 -qۑx(@2"W R 2CRJ5Mu]j?cQjZZIGmڙD8+cDR)0S8;ǔB',&"=mOIc2z(:'_[^p8P" !rJ*c$}Y?yU,1dͥU+dEbCT"E"V՜݁<7Q iRiǧa9~ va0~~B-($ ^QXu(4%#!w`Xj^_TN1 E8L ]š-? @mqXD y9~eIe3Bl݀ 2Gì&Ҫ;~̼bN:^TD(m}6r`)HE"#Q,r-[h 1粏%zw9oj"?ߒ?1Xv;Z)fާx{^o qZ1y D<-i \[NALsѐMt{!Q QQ[8z'.X"W1YW@ C)UDdmֹ2Lj9c4]7Ou79"*E2FY ߿)QZCH%3LarL„9V }g*WqnnnNbe`LKef<﷛v~~ _ǾWU7|Uϼoj fVOW|hu0t@׷]^74N0׭;*'TBKqjgcs0}aOι`1yKJ "rνdt/hq ҴY%""c\>Dk9WJ5MSUH)EDc2ޏպ~lM!lBe7֘7"8J&9!D)ee!WE]Wi@|Qv BbBLeP>F^VJVƘV:WpkwGx;&x?\KOA{:CVa5ij?k?IyY!;ao}t}4;]>oMVa[ZkrnO@o@IiZk{>uUI(X.VS'O]dI0骜v.sݏhf<_lp<^34tZ,Ic̸x)\/" ZOHDIJ I؎t8<W7N;|+2&. #$  \%\J@g7&USPp 7ţS=TZ5%M> ?1t%OWepPZ/c$hXHJ񮗎9gk~zY,ʲD I+k6CV횐Xsx{40EM&y^l?X6P,y[fJBW2Gt21EaIA2yK),Zs.__%q&>>B32  m]{B(~Bk$ZO#q LJ@\Ҧ4дF.JTuQ UPdfθ־/n ey*)1c|Ũu1k cT9w\D(I`FwB(h@)%ð'ݝx&}7*+Td9!>i> 7 on/.:Ozx|vUk͂``)F+c4Un7O:/oQvZuh"d:F䖘D2&X?tJQsνwƦfF0DPE (A ѢwSH (qFνŕv=V9f`QmaXeD9 R $Ns"U6Ն\q+=S/jFϯã83Jƽt*Ri#utӋ^à NNnn..6sUk'Xx*Hp78Ik;rZk43uXTU(.Zj5c̪ fAm]AC5L\NP@}j"Kc@?#q,LLh%\zmoŅ~v39c E%X>-NsmP}H)=Qjb2a)-}s}ۃ̐ H4Q>=>7jQ8 +k՚\Aw{݇wM''ya6 K-^C1BR!#($@LȹJ5%Vs{b1ch6;uTuĽ$RGR֦ HD4w[ X } TN@gvnS`ԟ#;/4GB@BP@K]/HIf&s9"d(Nw_e L)Hym~cL OYfZ)Uw)q4[dBJ~q-+'qLRJof+* I̟;h{MG7wB6(TXe~J59ޢh|A[/n{9/dVA3K:/41@zcE4{׀]Z#{\FbvzyOJ,l8r@ xRs-|:ۇ[|Nn4iz«7;V)'fӽߥtqM&~|hjN~a `eʀCe̳aP wu;Q*+1C@XH2}txsS|ҶS0Q4 ,a>Hʟk ` LKKQƙqfRȔ0چHЮ(?ӪU((]$q9_#ҏxw>2+ `) HSJ( u]WUp0aݬhצhx)qfV732NZt&{-z}S$i窵;Q$J*ސPV,a\>)V*WAtxBoHE#{' c1c#w6APx-8vȦiZ7;ӯQ 7Lqe4X0N$e4P$P "Y%PlNPcmʢ^V"QyV.\}A_@EBL CKũ '3_W~&*B;%QfQ(s' #3pG;ػwNK&qal*r SM@+)"8CF DT VY03a DN@Eg_#N詠KçtP!1,ˎ=ko)F9mwKքm6fM*Ѹdu[Yk,EFo$?tU bBQ$0˲sY ~.9mEYgEha<8:x{] V4,˸\Aas,j2ZI{x=]G $ѦEH;RjKuoPB1& k*M"F54\N@ow) Cx'PxnT&U bEOoC+L&Lfxq "ɵ8,tlc65[8%`E4@)UnRE8=~tُ(.h^ZoL4趣h,Y,~?_l"dl2A=ޔvkWnY@2҉A8 5ZHJ92ጚfc,ak eAju%Zk0!1v&sZKQk)R s BȂ8L # sB4JQΧ36()KEQn h="*! 2hEH4_xy@}Ѽ _ү֠Z)w"h4ZBxHr3Vʞ\1b3^)^v/j+{#I -ln;{Ѵo,n" ^yk$sl+y}u{iƒqJo+?6vbEK!N9n:;.V(U97%ә?xaH) !$Pf|5(\B 4" ĈiJSP0" 4$ٽNPsu|}BHJ@P; Rx ):tRRbNM"Z169>Ƨ" ]FYk4J/3I,Y(-I *$u*/4Ձ Y]`,o}p27{/ nkFߍm0$4ݽ?~^WβlzwIrrUr; v=_|r31&Pq㇕xC֥XG%|et}1eLG wy&[Vsx2\˒!xcl#~ndŞbǼdL5`kQQHHuzv\JF$a#f,./ N͙=uöiugwψFlz t{#2\M>]LRl۲m2JHm7.riJ #kXs~'F5Kofͪx8'1&XNGvnwpfd/u|隲,r>oiلVwkiRJ7a(G1 (`^3hkԫf{{78AH.B~w{A"[M'X%:1 tDr5j8fIp'"f6 Vv(!wh7Y"|?ۈTbmad`A2*,Q`cU*1ﻔV9[b |-QФRr.: MBZJ\ӄRTJ@F'3e6mlVZw1EB셈xQ)fET1>|(R_ ?ZPIe%Z.x5 F/yW7>''Lϯ(2*kdu<:Z"(֛4^&׸>;=m?'e#kD6 TCմLC[a/HW< hYTרkM4]yUd@0M͋4 zmZt!86Nc$DUJHp}Txz !@ ^~׳ p@Ho,J@F3tEU/(nm]AMQ RP(vҙ%]qæpXc/!@K(#0fи &c1"}~om_N_+!*Q7NNߧJ)BEW/O-8=E \ΣН<2cdyVUU]{Iy:e%Tllh h!KɃmX+ df)moMedB(DlV5IG*=6MqԞXTʿgIQR:nw'Fǭ.Ih!A=(76""\]N@Z > VhךoPBMܩk3 ㎋~]ܛs<_u]#-~m6h4ÝUU+˲~Nb˰eNƗgMϋxruw;}y-+^AQ<`dt:[wm*TԪbQ^Fc%;WskιXvAcXJ<;1+8d=cgwZ RH0&`+ r MF1m!`"<=KAfn1AIF"_%ZKZԒ?&!_ev,6\73B@Z2`Jg(6Wro0}}O6JLg"|(Wq$NGH=s`w7NZll$.QDFwzrTĺGCMDXk jn0!R@s6T+-U^VθdFQsFnωEd\,^@U8=>l8.̠Q2~\ș@LJ@d[ZKZY|7KFܵ *If ,Y||ibƪ8"։uT5²=R[ి>?_1&]%q<)pi$͗G'zZ2sgOAg?dW@5\F)ƟߩWO,CV\i}al^diX 4 BV(,Lus뗹%EZ:7b砧&niʬQAD)q\ ʒV:"(qP=_O4MJ#AWSIk`NxAA\sʽi\{Cf&FbLR ǃ||\HAD-Rv[~)=`&I b^u Ui &ۛLJyUÝӥyv@h_¦_GbI1Zem 27Y'%H.hzL"JңA iù K4GMFIH<nܐCՋtG`:? h;UE۠6$P_9G.pmݖ6_b^V @)ȸ0J)gmJODN@ܙii)TPLHW00.\w7Jܘ(P!ס}s|JP*j/%B"*Dc8=#40[dl֫ˋQ `M2N#:/ dt5D!ۢl{O^ F 6t||"`T0#$hq1Qzh^rg4nHq C> n/d[U_K$'eӮʲႄxmi8uUB  -( TMN@yiv҉6K+Ҹ23UNa .^ hu>\BĻ=;1&ضM)~5hVQI1r0Lt4c{P}6Zq YM8yY|nnp$N[&N~SDQl6)EQlK)I$i ]æ~bܺGl2ǫU=y(.+~9Z4MBL˲Ƙ|Ik{\18/ cM)P%+kΏDJڔB2*BZz" @L;N@wg7~)F%#H|rtp $ą 9J!!~,źGg@D-P#6E2BU;"j r$nzQeY6͞__Fh4z|xBN8|zA7S7W~4\y~=*%*0 =`F@4EQQA" e$kq$43IBJRb#aoeiYpn{AXnQͪ, !>G#Rn[Z7H[u Jϱ=&( [1JP5^dJ@ݬ٪ 4^ ^9[IѪm61;W?1zr4h?/ c42$̲^U]V+cLQieMtp]Fy~MZݾ|x_.I(秗ϏxϼNgﬕR'r:3@CH5Jm~6,HYܴպJ" qd[eI7td9g]LQ ApDG,=y׋ʑB!^AVLN@g˖Ӛ{ I@A[@w3o0d. @O c0X`X4LYE(?1nۭVXm^T(ٜRUb\ա(6yؚT-z9)gfS%$ZwDoMMp-sƶz. glȠg~QDdl" #Ʈ_DN@FN ֆB# ]h7pod wFB@ "cqLۙR|sssp@∋ 3o~^Zv{i$@#?6[ە8m)%<ϲJ֓y٭\^]p螝:wAXݯ}D)ˆ~ZVPp  5-r>yǏ#4^PC( &@ƋrIa:go]7A9ࢮIL#9E4۟1ly p$1ZFT42h߿j4/jJm(8 htr|:j.nMo?;KwJvqxߑ-eX `:JDCj|YYmE%kRpEyOnjronr GO:n~\nöe2vS"rU7H5vA 5"0"W,I HJYk@ΌZ`fLN@F>KSU *х>|ԄD2O;u11N򭾜CZL\*DJ)~O!Դi b1 :h+wUv(ΓϲlPʗ74 ,I$c IN BQ2jm6{4u(cck-A8,d4i:Oϒ1I}W!C.Uԍ2RrZ)@=]7`?W8C1`͇n|`SB9B@npJ!Lk縔^\# ,NA]Ĭ z#\b< ]֝mWԥ"@c eYVFԑAPD:>׻Z.Yj]lQlfb1 <t4]דp8z[}77"YJbwžLB .1B !fc)Q5YM'~6;}x|ޙ(XC,SbbHM92 'D$ 2Q7epCUXCI k`dDh CU4PW?Obq2TU5I`v}mUΨ(GD"NZpށ #*նzYmΞ+Y1vF1M3THhs#hGH -V,M6MT Zߒ*"ADMN0O~ j++*!׀ $(Q:NYK<4O})<g-Ї,m ˯wU}:93]-UUVEukIXMQeYfc!HI<8>8nZ[۹q$B.Ĉ" ޼8|~T'TI&3)sRfc5"")@hm(#0s Edх9!IAPzJt|J@/LNPgmVS` D;Ĉ))͸(_ٜ|`>PyPk>HgXkL{8l6|W7b1NWv=˻Ϗ/ךi /)˓f>\_$':{V" kL?4f>`"9D)BMt8-R{$#Ь4FKzZ1ȹFEE:"DE!A7*{$P4uX F lyU ?DIOA_wOH14$^<\IcTDաRG#@ @"Wm@MԮq~~Rnex<^ޯbp3\.y;I/Un_L m=ܖeY"jkiݹwVCfٕjN8Bsqq*$Fmt6GH`Bsr"V j͙ 8Js 54HE'v@D=zO\H$ 51Q 0 EGiLN@ϞRQWРXxQ}d2|7$0X؉K/>1& =^y3~fe㱪ݹ,fY{^1GUNΆﯺ(JO"RlV4,v#Mf Z!a`ɓdc7Nz*9o-5֡yd]{7zk"inu6>$BI-M_[LDeLȂFԿqVuHsu =L *(۶_4KN@DgeD bg _(QQ؉3,LPzON%b+B `BN @w<-W0J/PwZ"Ͼ6Y/,/ >1-ʳq{a vH)%etpMs6f7D-"\UXU[+bfIBQ w(  t'aey:ӠuD2EH#"Q7S4Hk%L#aRA18 }$I/QOV;āh?@APMKcPN;3o7Ne1etB0cJy*+K˭Ru.oǧ7w S sh$jsuIޠu{oP8?Z-˒0kF{oeud"aAJ@ 0(X }~zJ~}zqDsHp"d4{_?Aua<94Ԇ%7sjӏ̫EF!@4"sN !CR*)%ο!"oo3$q(PND˩8D}ă^tչ~xxF$KJAtWuL'Ì!܈Dƥ7GpN oDQĈ"1dzEu3&c)gden0ihzvuS$IƩvkW7jmmnuxyq.'h$J9ٱg@'lڋ8Jj˶@R2T톮&Ƌ9:??x>4MPGB:,yvfltyN^JI3 T"`Y0,be. ) =޽߾۩ͷ8$J1F'6jxA/`ⳉ@q/hƂTpWh3L$.-|JTeK5ze{bR&GBR:'gd0DQ, TTJ GN^\hcW{OZR^@ 13CN8`5)ˍFRS㬇flR2@9<@,d RmLo/D~?,rkAS(  ZJi*1hf "mt&$_a&ZqKrDH+6%ou6o./5$KN@g㣥(T% /4Kt׊[tmJDMЖfe/2R:%˲Te1Y-"19z=jn":Md:A>&`{w/MzB^U!v8v:[[͍FǓ(>F\EQx x xF8mɵZF%u!K(,H9aQ%-qA}s}d3zs)+RQ(qޣ( RjkVF)g^}~zB(Z+γl>7tZ˂g@AR׫QP*.>Aw7if&_w>z{};-W&4%RJlp ۻFl6WUBEL//&r9Ǒ0 <#Ao EP!D2dc ڒ$ɲ,D!4!tu,1&+x2j+7ZG:|}rv::[|i&*DA)Ң)yݲ,۶-r,dL%''ZW4t\볬(i&JkS7~a0P4JQſ;wsG)7.,ڶZT/&=M @2\D¢?;k1 gs;?4M&Ʌ;Fa-?9Mt"\.O}V?0ǗZmw.ϯ&#w)M pn_Ff9X,YEqE(:Jq4϶Cv*+Rag 8C2%gT -`4f~,oi0)w7h<ɓ}|)n 4sH]hKB[ımm!+,ӸR e2}4jjF:\ف#A4.A曝ٮݮ.!qRD$H'nA%\@HFQ?;?7g~)B ^c!O Y(?t:'gGssYAen72wJ(M꽗 kU`0 ԓ4Ͽvպ8o6w[;@ns8g$BTǓHZk )k2 U9SNF< "J1oPݽm}i*hQq矿Ӣ,JSX( "0ƊU;UmnSPEf^lb<h4$_;M?L[N@Σ3}< |cD@܍aWQ4&JXMBt^~p?=>=d08-Z Uxͫ,ˣ( 1,8n4M/g~"`n~],9˪~u(a.(B$ҢQ]W4=q(|: acƲ,ϳݠBӞaBw\ ˱ F @5022AϡΦꆋh0ƌ1 Qo!{pB(T}t\:˦8l⍪ljԶDp>4пD]N@N;'AT1lĠF(E ̝񡊻89wGZ8F6Eڳ,ijz3^1,Ku9FUv'gZ.U{~eteJʝj& 0tQQIx'"$\z @םgh=\Ν֏?m_T`%c+j2ǧ*"?MSD;j;JY߅QQSե&Au1"j\)J ARJ"jd?LN@ E<#MZɢl7BYt$UBDI2c/X֕e{WMJJq +!D$q>l^QZk@ p8WZC4uK57 Z81$oac,[ߝ !4hMb8qqt8s4ѡ@C(G@Ȃ'0Mlߘ &u w]V-y4f< d_`][{d4Bk 8HD]R@g& Y8=?'@ $KaƇBtwǸrYZ銽x*˫_|vi^$}a8g`0:R?urXшڝ$iqe1/ w5#]6JzDj Z4SD8@+ENB8Ƿf%eHʼ,Rqi-!?'~wy@hSdhua)U%B-RDn0^%-hVX95 A#b^I?e5 is([oK4(cB<ϵa5X, D~to7qq1h]]WɲlZY.nGi"bQJ6Nƣq<$gx/ϫ*$Iá}9l?a,eY 24M(6unSI)~'uug5E*K;K/mo{ 2DB݅<>=holm˲s7 %ΜQHzӹB[wQB8 %p<R15 \QN@gfaeY(+#G {ޡ'0f$!%C 1&~:O@)5癯m̌2eY !1Z8u]d銈_o(p8l[8Ins5<i<.l,Uy; S̙2Eëv7׭hl8Q$KT)%Gǫ8G}  ,s傇 Z74f,x`4\N@wN_@cGL ?&,uA,t^.~ᜓ9A1&Z8M$9jJ(?U5*,iK16MScd2Yk]G)Wq!eC]O/eg#VX,Шԕy^y3@p_D?ظys /?YΧ {NޜwE~ն;}u2gX@ijxDyDZ3* SD Biq:T'8w!qss!4XVX,U(fSUU!k` NS1,֘j#"TH@QcPpE4M"\>f3"\$I\1(mP阚D #Ϗjn t]Ҷ~p”\uol~h{{׷/DKN0@u6\(gqKnJ"Hq,L3{0/(@G-*8ay܆|<!H9cRJʂJ*!D^ EQ\?M)ΧF9}}Ӟ J1D)!"2dI)2c\UU4jumf|r{ZR %a:yL&!uQ,8uqwNKZ !·Dؿ}ɮC;:D )aJ%xd9gAYwӘz)mFKG N!!7&vn:vi;ʄ!e"8{En?4[N0DGB% x BN.ql__u13:)ELQii.KCsb1GfF,,p=8($J0N] Ƙ͜RbXnnr,۶:Ia߷4e\d'.+kƜbxzy&fgQ#i9^ >|2e$"@ WA,3 !1S0 3pIuy|t?z+[aa1G8m m3kf춝SڦCV''s{rT@?LKNA{근'#CHdCĸ EȉUA;`'9?^UWEYZQ""EFQ`4""G Ҭ*Z)50,D/"6'y6u0zݾhnJ`#6M{xk1k׮{M8<nd'm۫ł^?GJ=V@]uĹNˢY^_/ge黝,}!Lj8>TOE@Gy5& C&x4 {cT~#,qQfG go;%E1.u߇&f\^WU[E2qJ ~|A 80XTJ 4J1d27tiCW\Ϣҽn|BAnDj+SE:_P"2>>^D$0zc=BXqFx u!sRUfZK)'r/:U [(RFe."5x6(UЀF7 âh~j]D2 ! I=1XkhLSJιﺶ֜]n%$z @^^Am(d ; վi\pZAH/\IN@Et;`3\ # %D($E{%U*D =:0BDJAmYuQu]7#k(\4M]8ܿx.qvrzm9/R( (X(X h,#>~./oZ1",hߚ`!g 񕂁w ^'tQ*ؘq1MG9ah,%6NT|xy]|}ex0Rfٔsڬ]G cTo|QkDJ@F&؅ q[ .څ\ (P*6ҴKw19ݮ_cR׽A)%g#m@BۭAp!`h4}'.!XU mBtX'g{6-s 75R9O7_Aqq>4Z9[3.l I5e(' y-H# ҈m$D$u؀cH) o' w?*fxF@}xy_ݭ>>1ӓIBHUTE4ͯsM9ʴ.X$y#H<_esR:kaQdvqR@L(;6_nwXoNuV[8gOϏK_.n{b)a3uYF B EY4] Nh$Oj=ll|$)RQr`&{@QLI? G{iZ.SX=̥AMvJkjCn D,Bc>?4KJAgzQ0B^ >^CnD1!I].:^ZzQO=j+ωlQ DQr xdצ^z9!PJA~?nRӗaYUW׷7>h~txu2 ΑnǽnY*j]2z9+U@@K,On7,?:̘BR9L0BNL kZI^gO;)z>[odUUjIk:dKn0EDIUO+hYL*̑Avз9!b!RuMcsJUUeԈ\P0\oӨ6r#9{? UJ9jl[3- LjZ?v϶k5˙➻RI\i*xAp#ݤa B@i$ePJ& O( hH4rJ]K{_`$#T8Zr%%Xq [P2̵!H [k(W96LN0w$vmjűB^O38"4Oۻ,$aG;s2}1z K"Xȴ+?䎈!Eb!̲iei97n.E^~xz|9oS7.1[: ֺjng;7[+aB|5v(Hy #H:MO0R"s36q*J,:usT  I@.Y& ӎj~1-!Li4ϯ(1*g_d]N0ԶM uC/!yYSLpdK3}a Mȿ1C*ض{]Jj]׺caŲ=#1o"i5,FX{Wc4BOWIY01uɭ+`6uEz\3Qi#qZVVpb:)SEh̘\Tf&xid;.tgfm%a?to=j`I4V/2m7f2Y:[|Gj9bݣxoQFK}L7Gf֖I20:Vƞc4 z51vfs\ vs׈o5rq^xTHt%&,T*sB "u:D{@u{Ԏ4OX}nqɞki =CƴrxCh,c.GNI%Rw#ޛ!}*;uV;ʩ$tfUn}j#-coڶ];@<aC%뫩8.GSϭtV!M;ֱseF+V+Ig6r>2;?JQ{os :05g<*ʛC<.zIs-$'T~.}yK1އPksϫgti剮xÚ=5̎Y_mm3z= e]~eϦqk5R{).3,o5T0:jzYGfiO'ƇeFz-/NT"@'s?e^J++t4ڊ0z~Z"*7hCu3#M؃]}Ι7WWGwcb>jgTXV1x|6Ck&3/O$WIotbH>#V9%88nS pcN|r~#NB(tHx$Ve` ~_6/n2f2V5yuS9/tkwc*TfIlҸTӝ畊B:3{gc B(YAhgiU8JY<ыqSܜwJ}io)aFC#ϧNwH{k+G6q#+dec際+=NMr-sZډPoH a_:y7IF,']u.,&p5+3,;0ӍHy^p)EɕYuцc8>twak}Kc4krrwgB9he8Wax3qq]ÞvC:dVVǟZsjѵKyR,yu88qZgd5g'ڷ 61c*z+=>6Flr1ٵxyQٓl.WBWw,J'n$wV F8 q{o}9"I4$'b#P9oCU[߱vp8Fݪ y/I=q;~^4d/( +u?{vԨXI.nv,Al@ry IZǛR $o'T99EnXM4.d<SM-kc w[]ؖ >V9#ڰoN>nm"Wܱb011#8W~9^#A\tk˟}DŽבa1ʌ)5tҚIVv,K+ny7GWH儺>!8Q߈-i˟y'8'5@F.Uf |X>X9(aKWˢ*Ald$,x\ c̋P'P")@G*?*dmq6edoǥ^ԭd HJd՚^ Q_R.,xn0Xss57,ͽ  =Op3~'c5(+/Cȫ%۩p>r?]>&\t62s4} [CW`vX2NAҺ==،#ݳR f sf)#ۏ62Y9\[SkD-yC^r:$v ܘאX7[rskӖF5~V ,O7(ݙԊVgvbk.Xd"Az[h!\4ԙ:Ve6J5,ZmC!~h.g3q{tkp[b4c/s0ֽ>Q8eyO I)ݍ8WsUboGgѲ~R}1 z槿Y,0ܨ`AUW d6p,~arW4[Zú[v\).9x7K_ ͩbo0@2 [M*Eᄁ^e|?WZL"LzV=I}Ssk㼹,˹|zW02+mDe$gkgu.d Ŋvh+keݏI隒>o(xlzsQWgHҤC+c'^h&٤m/:uHtQ訇Q-G7O|\~yVIIetQY|F2)'5IrGt9/vvpDƒ@1ĀJrI>|ME\JMMabRGSK*DQ@$ hfR|C$eЮ⻉~$WO9ּ9S1*.O\ҽ #4:hBWGj9*ClO HrrsfʐbJ2 3#uֆ"<0=?4],Q)9$率ƽhh-N`o# RsOls\3WXU/C5{D ٷɒ }yԚ-ܓ-"۴sGSUSUra9ՁL#xk g@P#npBċwW"i+bsvD*6"'P+S6S0j$9;H;Y9dtkV:<.Q$ib;]?=#޲A8B 0c~'y< h !QFF`LWgr8M$)U[ɷ'`$+`+Szlw[ T_qk>XNީEiR^\gˉ8U}&AxnoppbkḸ>6W'#(=h+j*0De1H[kzpki!?r/:#h(Xg txuˌ{c.&!\m]mEA괘T Ƕ)!g,SeINr')*cՊhiVEQ$_pyO5Y\\6 w<j?5TonnGSU5W zuRIGQB7MJ(d* i0i)X#J0_5xj7cԧ $LA ^E*) { %uc 񲽵qC9>ի96V5~;?1vW?맪Mr|H v_WNEw}x?8#}8-\:E]o.lV "cҫ+E7M/S_4|#1!aTnm| +%+.?«jS*1]0pillow-2.3.0/Images/courB08.pbm0000644000175000001440000000237112257506326015037 0ustar dokousersPNG  IHDR+2hIDATxeuD#.1s>o1>s϶w}3=fك C@(TN e =m ­ -YS +\3δY7}fqӵy%dM}양>!EYC 1OxūŮMx0eF = @~ @K_I74(pիZou4}#㿆:~߮oee2P$k1}o@ P`ѰD@@+b0KhJ7Z`f+4(qYe$n;s9}uY b``b(N ./?`O< cQ"bx\b~M"۽?{m#ǯ;e b`|$A5D+c'GCA+bxǸ?  o00X3Tb?֗wo-ܪQ=nBTb`*hczZLEma~YbbX"~aW'P?3%bbZcx7 ÿ/q<Tb0`AynTb``````CL=K"`7uò$UIENDB`pillow-2.3.0/Images/lena.webp0000644000175000001440000000743212257506326014716 0ustar dokousersRIFFWEBPVP8 8*>]$E-q,?Os;嫘՝T}V]˹zwOgF?yaaoK^~ A.VOa|Zu-4n!HD AAD+{/L^69]ne]7PB)`_Ai29mz$%HxNdiP*SGfr2+#p WUKra_!k,)*m #Qd9ra Ċ`:p,6  q1GpB緓@Ē7'gI S`WN9֧mqeѱ=ǕW0uEвv=b^JQضWK0a_0D(+wk,{ )XY9VjU mn$GY$f.ԣ&p9w4FF#tN":kn&CRS*=dk5h~>O:B #/ q xSԝ R„jIqm1#i?}`,뜡.3x] lSbG$>F 󯸧*&^Qٽ j}n[lWm))~e#d~YËejPm~Xnp Gz)z?f^ruCX{Eڟg_8y1ŷ  3vu T0dP4hH;PywLNRMY0e`NKs'6VpZZv2d /S~:y_k'?!̓tP1s a&88aεG3+8Ff!B2%,ai+O7%/VQ4H*CX1VB`ak$+HiɝD5v] Xp3FP-Zy Ip"/B.c9wQ>WEþ=sJ~c'\+b&J1`$x>B=h|h$V,q2q| (y78WBZ+E9gG,0nNb75G<\,nVG4y$".Zkɸ 4WVhOuլH `~搘a+vqVC 0%UR0+yL|}Q\~:QҨw"4RV0aq!S,\zòb] ϥ*o6e#}[T:|O7D`c4N/ӕS3yD f L+!* E% Qj \Fߚ.ѻOvB]FهSq.{l]7 n;mUG`kh3ISzL?I%-a&VrX)D-*t8QDo5DdajȪ@KV=-(g!%ϏoJ G|ZU>lic?$ʓ!&"lWIU$h8L# C lfdNwTrpHY7G:ڝg {0p~溒8+G! 6IݸYyΦ̌w?k^$N { lK!ĉLl'1QDJ]NM= %Q*uvZC~=-ȑ ɓ#u׊_ԅbސҲhV,-l#:są%Kc790mڎ*r#/ v j8owHE^݇Q$E$!Hi$Kඇu# o!&|%4 MLG9e?nq EsU ލ7n%l#kȋ[E6֐y.^5W6_ ]V4Ħ^EHF~#Y8wO=nl﫞"]X%p;!ɼ$D7Nyygq.[E4 ] \lI|zi\mQn s4xSgx_E,E X$#Txnb'ePml\n=% %}Kɗʛ=zܑh̚.XҠ@wB~ٸ{ͽ$av,_Jx2Tֳ}߷Z- J갳[0LT~⸆tk1._Ex)(]N%:73[$qSKg-tӀ$̢J$*iFK;Wo;c8' uQD!āT+vܒYp [W6{l7E L׮%,P:p {WD d iun"昢H4o??isjXͶ䗴|;Ą6yħIBoU 4|24b`-䗷( 1"݄=^N;i<@~qz&"# .]aT/ BG/zBe=U?QG׬7w/RS9ӳ9bЧ/ʝWOPm>E.;RYxzb+z#m%" a/`i?! j XPKr+dJ cUI#95dvvHfR0)c?߈I G9&v@:Xti`.t0 < cfl4]$SFf}y)!?j/B+qjK K v;# ܕ1$#+BJ?"z$R݁X6>8*=ȥл#m'e,@^kn֏ׇÆ;@il|v؜'jr24ڌpj0jeM5zۥK7tP=T0m %h;7ɓa\<ީe4BB׆G틤K皫eqG<~LF34ꀯe4/:ySm䤇̍:4, X my.a91dk+~N0a䞮0_L> @I>l.h.EL;q u<6wۯ&.=4gbd; 4nnSwD++obhE4KWxO&(E_17ZG>ϮZՌ͌LNF y&g_Ui~$I>pOXB?\7Ӌt ST Tc*2ei7(Y󽵜xu+-TK0/A*.'ylKOD9-L<ˍ}xn$3*{t%}^EJ' M 7lokeBF#h rϤD k(OĴxEŽ+&R⁀ZҺgWObT"Ght>IcO:+MS"f2pk9jȾB26kѤKцGNͪw(:0?Pp2:^`\7qRKC3_Aﮓ Gvn<؂JLT+uFk//YҾVrYk[`T词 Osls&^@HZSO7,PFt0]xovxHCķ]Ai_c6 soܰaomЍ?|:gi+c`Pq>`~b:J H. T,7?j4h{J-$c@_ \58uI3<'譇1t,LH>I l8%ݵRXlalo`d?P#J4<6ag5X(*H׏̌B\׵.⌁ZW\QZ_'IvJ.+HBE{x͆Uv&ph$h9.u'vWᣏ\P\c}&`TS2'"= ڨ,_A8u>1aJ0*xVC{)Y3T*e"+nMH&U@tJa|3>twN愣(GQn AH\nGQtfGnqzy(Z\eΑEg'p&JJF~>KTOŸ;͌٫1tԾrqb&M^ iO lҰm%>I9A>FAA`-^Zev+"GCBB@ '<݄湂gH!Dk!1%_6S;2PR64:ۂ;몏r%ĦvBLg)Hs l#A r[=sd(\MR߁6y WȟNz]Ӻ:P*GGt R$8 䰢/IH*G1(f&s]Pq>j%A,g + RoHd\H]LΙ$cE7fλ~N?FpY<9e T$GUjm6yƂ' ݸyQGTJ各J.,ņZ/ܟYa лJ.UD6vspU̯r7\q8 L@BC]mWKݨk3 Pc~[gNЛ ګ(m-ߺ֙ Kzl C,qrFFNșX %w@c%DZޛ2X\I<Ec M"(PS{L)Êظ|,_BS" NԗA O8L'wv֜*a~Xn'zheWz T3<8&kSdЦq#FȷK9 #AV/. Wzk%`tL?7kxXOwDȺ1J84w]0v0cWE}֜`::lf&-ߐ"Zq=[pֽ*"tr^AhT^qo\Z #klx&c7twHPN6%ӯ^7j1I";671;]vx w!,a`墖"RIqJ6 <.nw=@jO޻;,OOM:XiAPE[O(G4Q 'W^^SxjQ@wE+^ӛckqeڑÑBsPWQ:kYEta;0f9wpSdx#hڀpV]**w\ c ߕ %9)*IANpJ[][OHΰQP=&ڳL}&Sů@KJน5ӴTw~S-Gʒ35)$Q>_ݓ67-~l`G8xٳK18%ю)ڑΖB+xWaDNZnR0\NoɈCµ8|98NzX_e-#%Twh㼈J%vf2uPEvmi@\8~'hipO|c L/TPK 9gkqP {f{EP^ F0"ABAn?"#BwP:YLry)+)6dG~$E Fh3,_Rw83CA] .տQk&㥜Tgæ{]US=U76FŚ?l>^͘H7<(<{~|dG#3mR e%Blsܓ늧]M#?3WJ["~YÁ9A+-:by *~UL+"v;QL}K+"c}552]'&Z: z"-_uɬmnꮾu(>^G/=yj u[|Ӌ߲\18RQ+!~6L0Ljs#BdmO}Z:irdg@ϡ@ :ʐ%,3pKtex/bn /~.Cv:4j%'ϟGGHfN0w cwڿ.YǴոG&Wy/tu&ȵAkqQ'H=MGg@0[b.xAPESs%MmQ+E~TYpA:_O':70 G>"PƊt3  [xEZ?W$ Z ܮI*&V(Yx:Pqe uih 5x*hE1:stXs7eU UL ͉^^?GAJ›h$9t~<1+)DɆ&M{>OSaoz c2—4jUSr]lPs ^V# u Q ""=a ~ 3=z,|GECs租 ׍ 2OqKU8KSԼJ)/szZj4PF[rҿضtK ZΨDŽki]̊6v>p\!-=9U+>jb6v2,@R!yCB[T+uv/C!7wvJ8*ZL"R\FWW+ xZSHR :7fvրc<^ ==+wS6j6"u K9ױHР%s>.53?3iU?O9])(N-gO bΪB GtY+8ip'3C|iSIQ$j-PmďAR A#0wW!\+ /EpU@QM8KqD쑸#sE B%sf7f ]3:r2O8Aׯd&ܷ=?ĀD}ܽrS݆ .dmQpu_)4$U9wh0b5#M]P{+# Q:9+2GV5"?ʚKt `Xz<8^3cEBOXVhbZsa〨e*pfCޣp:\X"0.JyPE cvogEx|"Np9۟*K;&۽ :xuvmK[~3?<09.,NoHt}NXrDb|>7iq.؋,,$y2HBh7 ^ )a x`RW;>xbiK` [U,w84^[2R AiSZlyQW76O`e,ϫ4tҌ{ҧyк &: L7sU*GE".x6FM t7NVݞ'{n8WhWpda{'/O*I FBϊsƍ@lX@F\M*Mj\ kv`J4Ўݡ H|)AC+7Zd9_A.YZCډ$GeV2$laB;h3Ǔdg%B8Uiͭi*v.)3p-)5t5N5(QG&Az+*򈎶ND/2롉pԳ顲}uCIXsq TL2`vZ4wj “Uiw~Fz!T J_ӹs3OO j?Ehw*H"ogdԯw(}9rݼZ S#UJ)s05ON#UT0l*{娶H2܅=Δ}E/]Iێ F9-6N$5+&68jx¼t*Lc#+ K*qq6րCݴ}r}07~cbjx"' 1 XXUrOV}.Fn:]W}եʇ>r/ܛ9Q`Y. G( @7+K[Lyu#~ښ/6 @H/ {oϠ;@f,%y%X/FEG= V3]_R?7%[//OJL\q }q7ʔ5M9Pc4>JY; kJ 97]d}+aҡ>eVO$eF^`HaK^޷'ߎrޭ@e@}A8OkItb8308 G r(cr8k'6e f5lskRIP:( )n:@Ưq tMY=ݦHJ͢P`xtOV7ď59r(g:*cU7I&x^"7 Dmy%җ0xPLo+COzIE&j/90&H̸]{D.IE`@V#tR!>b,x#wۂ^[(r-wQZ_\k5 "jC?\7zٔsA"a|J;3UTfşiZ Itflö ,h51 {ŞJfcǧqOYљ|o/{)GE #3*³e%WlY]-K0WmP\_MZm>gtVMsy>Rd( *voIlyLYYֲ,#DC!? gQBz?wtu딠 yjh͊3GnYSSQbOKPc~~FM!Y >(]EAϑE6'?`V;״: <ߛm_yDk6jʆ0AZ+@C𭺻Nr~^PA+rEt*R:? $NM[An7f7Gg&vWG1_i).% p9ݡiz~1?[Gd/Sc*OK~őޒ#֘e3(M >D.Z->uu"QgI5:[q]Y3rrpk)5=yh a!PözݦLBsST){vt|FDh`H. s"eIC.4S[A5{V nٓ>7J§&YawbB&&YEGTPL;/'qM[CF>upNl i,Pnr Tx0&BELW w_^ "VKrX@.JxEgTjE6/Te^e\1(&sUDt>kMr=>}h[_7`U__-it٫IunkHSF6`+LBi2e]f4Mׯ?2Q\pEzkH+?OpUJV^q]ťBw'.=5!f9QyDX>L#'y3;k1nWTjTx8 1iʷlOv+9|{NnRc)4@AB". xu`-K:t:z%QQ)-#!ڧ72BSPaPz).|<0ޜ elp>Oxuᱻ@ H7'ӬXEt]̉+3 hR a^LklN0.&!<^SB.4V{RlJj/eHZ]6sZ_8O0c1^W?;{_ة IއzM/!0ahZ %:S=YC̤83v&ֶPS%H_HX,vr8V)4Ix*Iaw)],Xu-G}Q 5s}-Av&%kzEt4w'@<^ʑ *\PIV"ߚ&70ݻ?,т-sBds΅$.=AgzZgi {ˑJXy,_>~>0xx<+vzHo.nsBLi1i[Q;e%De!$1 4s1 T8=ހ%7Վ{8ŏṜk{.\L^ Ni}/ZX'$b:,qes{2nFQg00|&1<=^ine=DJi@Bt<**2QhX~ 3xw+!wE?ks22ۇnSq*Cm/_B_7?zb;RBYSaCAu-̵sF{MQMѺ9:GGe'X%VE\M_ GKk758ώ1y#  dzj}(ս(`,,k tGcouYC:T#6an~@E "$/[Nb{z9nmGX~&ǣ6G 4~m2`L1>k|٠c&-F&VrZ>PgkLG)J^ .!4lgNJЦIȀhOwXGoM?쿅;BÜ-/G 7ՁTO)9򼍵k^ŬsZrT _ڥBL!a"X:V㹂 )q5T5p&Ճ%\\{PvR-as-F`:8 ~SG3>*F'd6W9i$`s4,g ÊMJT4]-}XJV#%A1ԋA~vĻo⷗QF 8RdL5LrSyL 8R+Ik3HIXn&M N-L8CHAYRs6iJgƶ2 eلop|R<=>b(\;bNR ץ,9uf}Yȹ=C%BdCTUl\i.RCz 4ʛŲ KgL!w]ʒdѪ ҃v2vyeKv H˺9bAo"ҏiʏgRϏ(2`_:L$ _RY<8qL],[2#{G|Ǎ+Tc+jZ-RʛALycEd=] P/iהL9{Osչvui~Q5Fz,ȷl*|Й4+$HjL,:Ff&r3ѷC^sh}en\nc 1|p@Dbr'%~8lڰ'$~C৴qDddSd5Js;&❻PC4<)Eݜڢ0Zr>>s0 >7YЭe'vKi ʬ2\R<|2[<(Z4Q9&>jF4sod_@NB  |.^%T iot5uV,Z'"H8^jvJ9\:֔zXg]h\J;al/+w68ɩ>ZU 7( \&jt*һpp⤚#iN"FVՍwUiNȳG*Kq6Hҩ#1#J'_KӇ L) 4#"xԀMu|5#(v^6Ew-06s6N6'`grX25_d|:&U.|OV)Vm'FՃjOh$00'&XXupE<Y0\JqL=ܷ:sINಱ`Pt{(A=ekb?ew tGB^]H|y>qNN =w'ScDQy.p>O[smr#- Re W9H9ܘilKzJ;BJ2EÜ%׸[m!Lqhs<$i! ̆WG}BNGjoN!N0TGmi{F2*pwcZ*{#ր ߞR;R=ڲ_`,4.԰#LkkFߔ3'=o&u3cPH\#ß^6 SNφw.^tdbX+xјodӓhI3-`׷k$!źNdZ2LJ[>[i@U(3p߮CYeoaA,-rNnWc\eCO6u0p1!ba}toj$k9 %v0äj3@Ie zՁL9t,`$I=3|A D#H%j5&ė,>;1^/5ԎsI*W R.xiARq1rbHSmV)- })`3Ԩ bYB'`?[$uc@3{&)eZal1ܔqTg@Xy;)du&nroWSgiU%_*uX$!A!\!5ցD2dU Qm:4OJPS`q5۴a0#Кm4߰W%)jNTx Gj݄{ bw)RPn<~-=kn~ >-gX ;/͓3=1 $MB2 Ք czW8qwA0hM'ڪth_ağ6kD?CPN"N7\4 ;F߁HKȭLeIJPvϋ)`E!Jn v]QArKWEŞ# n2jY]<? |79cW) o}|+_+qB]*ı$< ցD3MȪI#S6[.(tV:6,jP>d7@]g[]%ŽtIzkoNHZ2A.Z:ex|o0dl^u/މW~f v'㎠8x<9I䠧\HYp)Bs R~2)ӌN%p'J" Fyi:He~D&d*WUB;ɞЛ%E~\tiLf_E y].PБUMk\Lϫ^n4RVɹFz(JƯ\m YմgG[*Cbc& 1LaC呡e ]H:i "uU6e/L7;y{:jkH{G UT%TOϰ!cXDL%&`RXV|ԫ?OÝ4!6yAUVky+%`ODJ39EG&Zw\Du~ZI?9qTn|gtv$.S87'trB/S!FeGN_1zشQd`$j㢹-*t՜ot8ҏ \ciJ$t)uT>RB2\ %e:IY% swC% 4xJG,j,NQ%(TOQbO;(&+|$Q#=*(~S)G9>x9axd$6+哔C( =' 6 *eۜ2XN܅f~ hrQ~j1ިʳ :+B*P_%3~1gCG.ڔ]jx6&( <0U;m2FhG264h={} $n0CF>c(v][Wǯ42{^j4/ۻ2bТf&ڍ3*OkeM2H >l(dȝ]}`8w| $`q[_YU\n?L0 K~=8Px^a5pQШZgx`sSژW֍NQA`ۿGB<PhN&IKezY CB %Ş&A T~^H%#;4,Z*zzӺ,| P=Dl|s5c+)7;%yyŽU폑#aF;>oW<(NB/QdCQGS;\j5]l5"昨h|YQX4 D@3,wfA' ȥQg`>3F4_O-5 zCy*MzB_$-POSls\bVM' M|+;;DHS/P v9k3շH3EKP*wī3ؑp廤4ՀPOFTNblﮢGrY~..Ԉd3&pVv)I)ZE~(5f^7#/R]MVW=%uhεa[ޔ(AgQt~-LȑOD'{[>V'OCE'[~[-=IcſəwxN1@8~PX!ɐXB^e|(i'.?9cX d`Hg "Tbfs,+Bqׄ,56 ekKi%y|Yd0x֛XB+E'S  >ށȹwP8guڋK"覌:IS42hB %r* g[tsFE'Cy&2F6/@'SM5 ۤLͪ@uVIGLoo>e4ş,FQF\\YҚ\t` {~Cp)dz"c\=aBC! u|sC 40s{͸wƺBXwt=չޙKb!'K)9q" S)Lx3x[""ͦGJu+lY_K* ]{FbRx߻SR9S!*4vF[DxZI\0=x%iKDȉ%ڀm>L0_s ՘@ȢnsP:6)Ov}mJ]qaQa7} xoW -UOPT ݦ5$Qs-JvNps؂TDD܊1\_'Rl)ձub'ACeVfoU$p}sE]/Jffk9Z|kφ}B%>,sl4f:?HZE6zLjZ-6 \'䱮 }@ ׹c&_U|s(v:+,0Hæ$qgXT{Ep!mk> :7h|'Vx=UGkh'QbY[Tw0*9XihX'tLĮA2°tt]qD8Y5:j/0!ƖĜ4Czk(No+o2q/Yz-s-qFQa0Ɛ"*ʎ` FdM4J6ݯA{v?LԆM,oPýԅ[֋deJoj@$C.:0Y20Ez|-F9|Қ@'uJ!hͣיٰv4>n(JY-&Un]Ze;/!iʫVJ=x1ewǔ$餟DX-NMK>d4uBZu"^O<٘#D>gd; hPN& vƓ ѤzTރy  [hd)6LElOͶtFJe '$ ªKS]~sHB#G[+KY51ygǐG@{;/d,/ª5MB OEXIFExifII* z(2iCanonCanon PowerShot S402003:12:14 12:01:440220>Rn v~   |f0100px2003:12:14 12:01:442003:12:14 12:01:44 1  (D ;  & FP0 160!IMG:PowerShot S40 JPEGFirmware Version 1.10Andreas Huggel*z 9"@R980100 (HUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*UUUUUUUUUUUUUUUUUUUUEUUUUUUUUUUUUUQUUUUUUUUUQUUUUUUUUUUU    !#"! $)4,$'1'-=-167:::"*?D>8B3796    OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<Iڵ򷶹 g5V*7XY*çZ`oZ.8xFSpjM68^X+“F 7^N  28oZg2Diޠխ>ް+FW+nL4ZEA/{eqK*Lv7?Z͙ o~R_{ !EZ}l1-⾸&'xx RG||y{?Xb[4zo#2*z ~ӵH<}\j2Tk&(7%G¥ZYe$drJqkFYn"FAw+F&*T;E0= =xK7*ޒmrpz l]8JĚ;+zBr**ǦSZrZЫȪt#UƚYhŚCM{ܻy}Z#{YW3 T5ClHZ4=MtuRu!> M} ٦ aW+{.t,t G58F[͏xo'k9o5{o8iJDj7H̜{}if1ʤ27K{')ZKe1z37~E]Ј+ܑ_"3qzY fBk9nKuw…9ɂ-hE2IG,Y޼]~ww~dm`($޺m;òi_lXf 㹭ҧ3iQiM#8G'n&$2zA9]hN?~+:9ϠejA ~%^<}9-㼴n_ݖ4!q1/iCwZ>S>*cgMH[ܩ9,>WVN9@4jǁcӭ>fUJr?Zni]$▟e( rAsJQy/#kwǸ'^sUe@㞧WEһZ.pBf_0\9W;w>"kF)D8K}s?N[ߎƼcR}oCz:4N/B9%{+#`N;P{R Z0gh9&%&SqJeF"d?\6m5$,xGVWFʳel[2Kr?O}qƿwi(]i]^M7Og6%7VW ZKE9BKk^TRJ1sުi|Y ~@=3ްqV[ӽ9[Y8GD,kZpI!'Fsa&ؤqsL*:dv?ZIYޢpʖIݽׁH~6,g('\o%N'OKiKF;O38=>jG z˞z|1M_kQS]):t˷ q^{=4"3OA,0@ vՑbb,_0oӏL֜uCUL!aTֹt 0וsXJr1$ ZG]q~^{P*HPf6]i\sx}3]}/R}ҷlj3}+U կu6+C4~ #SS=@XU5 n`+®ؘ#ב\egg ^riIo&e'"O>5bmluR}QYZ־QSoiV qB+þ ڵfӠϔ rU{㜞V5sɥ߱**)iJ-Ey)dNq+2 ŧ|>+S-9'nx5EY%OrQrpE^Uw:"$zƗSGe JMWQw(a=ttТ_[[bӋ`j OӥHƹެw!*y BX_-\6&T]k:RzN=џks&vPq`r꺀22DSt ½EJQki:Q·摥{3&8?Vo3etdNQթ96;0{]SG.{)cma6aiϠ> amӭWˍP8D^?۔t^8{)=)Y}Q\׿ֹ/;>X׏CE'g-2P֌p,c_ֵgmvBE[2赯[)C٫[4(H-CVGq 3jD*v%Q#ib*<ުs\iѪuwQN7fwj)_Ho|C(m9Gނnu[gqQkXRKҔ_ բX˙6PE$VrBo,޸jgʾpr܎nm4=$\(#!GW5˨\AjeF0(KXn8z5ܚ%^J`O01֥o[G,Vosҵ:b+|)yeˏ1Q:qK]MyC6:-9Tƽ}+-wa# < ޿_oƱQ5FڭQy)a@Jt^brUkN^:,~{d?5n"T+2nǺU>fn TؑF>h2dAN]%G"G9zƪ~H +c(jܞr\I;o7(=EJIpIس&3E.ȀICj8 V = ȫǎ@_ 85N? #ߑ#ȭ=Yy vRjVZ]xbH.ZYTd)MӴxUoރʺ?NZ] 7QOI'iywn͜n`,W 6 dPa:!ѵj:;x=Մԥ~<`sЦx"sXw kTdӓzwI]21!>v5˻^;}Z-:;#цEl^';M60{S/Ft矧B&fV@qU`||ǯ֐*Tu=XZ-9=Wfw4V<.W9Ͻ?d%qu3hR3ȸY1ZɣFu1|g=iI`krVdAwzx3CkIo1Hq-F1-šόB EY&n.7.>Q\sLvoVbhEi$č>nkѴ!2YOQZ]%}ɖKԠL’:GY-sXr;hm'9\M1PjKnfC<74IEsrc; if (num_bytes > (long) source->pub.bytes_in_buffer) { /* We need to skip more data than we have in the buffer. This will force the JPEG library to suspend decoding. */ source->skip = num_bytes - source->pub.bytes_in_buffer; source->pub.next_input_byte += source->pub.bytes_in_buffer; source->pub.bytes_in_buffer = 0; } else { /* Skip portion of the buffer */ source->pub.bytes_in_buffer -= num_bytes; source->pub.next_input_byte += num_bytes; source->skip = 0; } } GLOBAL(void) jpeg_buffer_src(j_decompress_ptr cinfo, JPEGSOURCE* source) { cinfo->src = (void*) source; /* Prepare for suspending reader */ source->pub.init_source = stub; source->pub.fill_input_buffer = fill_input_buffer; source->pub.skip_input_data = skip_input_data; source->pub.resync_to_restart = jpeg_resync_to_restart; source->pub.term_source = stub; source->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ source->skip = 0; } /* -------------------------------------------------------------------- */ /* Error handler */ /* -------------------------------------------------------------------- */ METHODDEF(void) error(j_common_ptr cinfo) { JPEGERROR* error; error = (JPEGERROR*) cinfo->err; longjmp(error->setjmp_buffer, 1); } METHODDEF(void) output(j_common_ptr cinfo) { /* nothing */ } /* -------------------------------------------------------------------- */ /* Decoder */ /* -------------------------------------------------------------------- */ int ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { JPEGSTATE* context = (JPEGSTATE*) state->context; int ok; if (setjmp(context->error.setjmp_buffer)) { /* JPEG error handler */ jpeg_destroy_decompress(&context->cinfo); state->errcode = IMAGING_CODEC_BROKEN; return -1; } if (!state->state) { /* Setup decompression context */ context->cinfo.err = jpeg_std_error(&context->error.pub); context->error.pub.error_exit = error; context->error.pub.output_message = output; jpeg_create_decompress(&context->cinfo); jpeg_buffer_src(&context->cinfo, &context->source); /* Ready to decode */ state->state = 1; } /* Load the source buffer */ context->source.pub.next_input_byte = buf; context->source.pub.bytes_in_buffer = bytes; if (context->source.skip > 0) { skip_input_data(&context->cinfo, context->source.skip); if (context->source.skip > 0) return context->source.pub.next_input_byte - buf; } switch (state->state) { case 1: /* Read JPEG header, until we find an image body. */ do { /* Note that we cannot return unless we have decoded as much data as possible. */ ok = jpeg_read_header(&context->cinfo, FALSE); } while (ok == JPEG_HEADER_TABLES_ONLY); if (ok == JPEG_SUSPENDED) break; /* Decoder settings */ /* jpegmode indicates whats in the file; if not set, we'll trust the decoder */ if (strcmp(context->jpegmode, "L") == 0) context->cinfo.jpeg_color_space = JCS_GRAYSCALE; else if (strcmp(context->jpegmode, "RGB") == 0) context->cinfo.jpeg_color_space = JCS_RGB; else if (strcmp(context->jpegmode, "CMYK") == 0) context->cinfo.jpeg_color_space = JCS_CMYK; else if (strcmp(context->jpegmode, "YCbCr") == 0) context->cinfo.jpeg_color_space = JCS_YCbCr; else if (strcmp(context->jpegmode, "YCbCrK") == 0) { context->cinfo.jpeg_color_space = JCS_YCCK; } /* rawmode indicates what we want from the decoder. if not set, conversions are disabled */ if (strcmp(context->rawmode, "L") == 0) context->cinfo.out_color_space = JCS_GRAYSCALE; else if (strcmp(context->rawmode, "RGB") == 0) context->cinfo.out_color_space = JCS_RGB; else if (strcmp(context->rawmode, "CMYK") == 0 || strcmp(context->rawmode, "CMYK;I") == 0) context->cinfo.out_color_space = JCS_CMYK; else if (strcmp(context->rawmode, "YCbCr") == 0) context->cinfo.out_color_space = JCS_YCbCr; else if (strcmp(context->rawmode, "YCbCrK") == 0) context->cinfo.out_color_space = JCS_YCCK; else { /* Disable decoder conversions */ context->cinfo.jpeg_color_space = JCS_UNKNOWN; context->cinfo.out_color_space = JCS_UNKNOWN; } if (context->scale > 1) { context->cinfo.scale_num = 1; context->cinfo.scale_denom = context->scale; } if (context->draft) { context->cinfo.do_fancy_upsampling = FALSE; context->cinfo.dct_method = JDCT_FASTEST; } state->state++; /* fall through */ case 2: /* Set things up for decompression (this processes the entire file if necessary to return data line by line) */ if (!jpeg_start_decompress(&context->cinfo)) break; state->state++; /* fall through */ case 3: /* Decompress a single line of data */ ok = 1; while (state->y < state->ysize) { ok = jpeg_read_scanlines(&context->cinfo, &state->buffer, 1); if (ok != 1) break; state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->y++; } if (ok != 1) break; state->state++; /* fall through */ case 4: /* Finish decompression */ if (!jpeg_finish_decompress(&context->cinfo)) { /* FIXME: add strictness mode test */ if (state->y < state->ysize) break; } /* Clean up */ jpeg_destroy_decompress(&context->cinfo); /* if (jerr.pub.num_warnings) return BROKEN; */ return -1; } /* Return number of bytes consumed */ return context->source.pub.next_input_byte - buf; } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ int ImagingJpegDecodeCleanup(ImagingCodecState state){ /* called to fee the decompression engine when the decode terminates due to a corrupt or truncated image */ JPEGSTATE* context = (JPEGSTATE*) state->context; /* Clean up */ jpeg_destroy_decompress(&context->cinfo); return -1; } #endif pillow-2.3.0/libImaging/PackDecode.c0000644000175000001440000000275512257506326016106 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for PackBits image data. * * history: * 96-04-19 fl Created * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingPackbitsDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8 n; UINT8* ptr; int i; ptr = buf; for (;;) { if (bytes < 1) return ptr - buf; if (ptr[0] & 0x80) { if (ptr[0] == 0x80) { /* Nop */ ptr++; bytes--; continue; } /* Run */ if (bytes < 2) return ptr - buf; for (n = 257 - ptr[0]; n > 0; n--) { if (state->x >= state->bytes) { /* state->errcode = IMAGING_CODEC_OVERRUN; */ break; } state->buffer[state->x++] = ptr[1]; } ptr += 2; bytes -= 2; } else { /* Literal */ n = ptr[0]+2; if (bytes < n) return ptr - buf; for (i = 1; i < n; i++) { if (state->x >= state->bytes) { /* state->errcode = IMAGING_CODEC_OVERRUN; */ break; } state->buffer[state->x++] = ptr[i]; } ptr += n; bytes -= n; } if (state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } } pillow-2.3.0/libImaging/MspDecode.c0000644000175000001440000000264012257506326015760 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for MSP version 2 data. * * history: * 97-01-03 fl Created * * Copyright (c) Fredrik Lundh 1997. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { int n; UINT8* ptr; ptr = buf; for (;;) { if (bytes < 1) return ptr - buf; if (ptr[0] == 0) { /* Run (3 bytes block) */ if (bytes < 3) break; n = ptr[1]; if (state->x + n > state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } memset(state->buffer + state->x, ptr[2], n); ptr += 3; bytes -= 3; } else { /* Literal (1+n bytes block) */ n = ptr[0]; if (bytes < 1 + n) break; if (state->x + n > state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } memcpy(state->buffer + state->x, ptr + 1, n); ptr += 1 + n; bytes -= 1 + n; } state->x += n; if (state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } return ptr - buf; } pillow-2.3.0/libImaging/Offset.c0000644000175000001440000000230312257506326015337 0ustar dokousers/* * The Python Imaging Library * $Id$ * * offset an image in x and y directions * * history: * 96-07-22 fl: Created * 98-11-01 cgw@pgt.com: Fixed negative-array index bug * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" Imaging ImagingOffset(Imaging im, int xoffset, int yoffset) { int x, y; Imaging imOut; if (!im) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(im->mode, im->xsize, im->ysize); if (!imOut) return NULL; ImagingCopyInfo(imOut, im); /* make offsets positive to avoid negative coordinates */ xoffset %= im->xsize; xoffset = im->xsize - xoffset; if (xoffset < 0) xoffset += im->xsize; yoffset %= im->ysize; yoffset = im->ysize - yoffset; if (yoffset < 0) yoffset += im->ysize; #define OFFSET(image)\ for (y = 0; y < im->ysize; y++)\ for (x = 0; x < im->xsize; x++) {\ int yi = (y + yoffset) % im->ysize;\ int xi = (x + xoffset) % im->xsize;\ imOut->image[y][x] = im->image[yi][xi];\ } if (im->image8) OFFSET(image8) else OFFSET(image32) return imOut; } pillow-2.3.0/libImaging/EpsEncode.c0000644000175000001440000000254312257506326015764 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * encoder for EPS hex data * * history: * 96-04-19 fl created * 96-06-27 fl don't drop last block of encoded data * * notes: * FIXME: rename to HexEncode.c ?? * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { enum { HEXBYTE=1, NEWLINE }; const char *hex = "0123456789abcdef"; UINT8* ptr = buf; UINT8* in, i; if (!state->state) { state->state = HEXBYTE; state->xsize *= im->pixelsize; /* Hack! */ } in = (UINT8*) im->image[state->y]; for (;;) { if (state->state == NEWLINE) { if (bytes < 1) break; *ptr++ = '\n'; bytes--; state->state = HEXBYTE; } if (bytes < 2) break; i = in[state->x++]; *ptr++ = hex[(i>>4)&15]; *ptr++ = hex[i&15]; bytes -= 2; /* Skip junk bytes */ if (im->bands == 3 && (state->x & 3) == 3) state->x++; if (++state->count >= 79/2) { state->state = NEWLINE; state->count = 0; } if (state->x >= state->xsize) { state->x = 0; if (++state->y >= state->ysize) { state->errcode = IMAGING_CODEC_END; break; } in = (UINT8*) im->image[state->y]; } } return ptr - buf; } pillow-2.3.0/libImaging/Fill.c0000644000175000001440000000452512257506326015007 0ustar dokousers/* * The Python Imaging Library * $Id$ * * fill image with constant pixel value * * history: * 95-11-26 fl moved from Imaging.c * 96-05-17 fl added radial fill, renamed wedge to linear * 98-06-23 fl changed ImageFill signature * * Copyright (c) Secret Labs AB 1997-98. All rights reserved. * Copyright (c) Fredrik Lundh 1995-96. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include "math.h" Imaging ImagingFill(Imaging im, const void* colour) { int x, y; ImagingSectionCookie cookie; if (im->type == IMAGING_TYPE_SPECIAL) { /* use generic API */ ImagingAccess access = ImagingAccessNew(im); if (access) { for (y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++) access->put_pixel(im, x, y, colour); ImagingAccessDelete(im, access); } else { /* wipe the image */ for (y = 0; y < im->ysize; y++) memset(im->image[y], 0, im->linesize); } } else { INT32 c = 0L; ImagingSectionEnter(&cookie); memcpy(&c, colour, im->pixelsize); if (im->image32 && c != 0L) { for (y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++) im->image32[y][x] = c; } else { unsigned char cc = (unsigned char) *(UINT8*) colour; for (y = 0; y < im->ysize; y++) memset(im->image[y], cc, im->linesize); } ImagingSectionLeave(&cookie); } return im; } Imaging ImagingFillLinearGradient(const char *mode) { Imaging im; int y; if (strlen(mode) != 1) return (Imaging) ImagingError_ModeError(); im = ImagingNew(mode, 256, 256); if (!im) return NULL; for (y = 0; y < 256; y++) memset(im->image8[y], (unsigned char) y, 256); return im; } Imaging ImagingFillRadialGradient(const char *mode) { Imaging im; int x, y; int d; if (strlen(mode) != 1) return (Imaging) ImagingError_ModeError(); im = ImagingNew(mode, 256, 256); if (!im) return NULL; for (y = 0; y < 256; y++) for (x = 0; x < 256; x++) { d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0); if (d >= 255) im->image8[y][x] = 255; else im->image8[y][x] = d; } return im; } pillow-2.3.0/libImaging/PcdDecode.c0000644000175000001440000000302212257506326015722 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for uncompressed PCD image data. * * history: * 96-05-10 fl Created * 96-05-18 fl New tables * 97-01-25 fl Use PhotoYCC unpacker * * notes: * This driver supports uncompressed PCD modes only * (resolutions up to 768x512). * * Copyright (c) Fredrik Lundh 1996-97. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { int x; int chunk; UINT8* out; UINT8* ptr; ptr = buf; chunk = 3 * state->xsize; for (;;) { /* We need data for two full lines before we can do anything */ if (bytes < chunk) return ptr - buf; /* Unpack first line */ out = state->buffer; for (x = 0; x < state->xsize; x++) { out[0] = ptr[x]; out[1] = ptr[(x+4*state->xsize)/2]; out[2] = ptr[(x+5*state->xsize)/2]; out += 4; } state->shuffle((UINT8*) im->image[state->y], state->buffer, state->xsize); if (++state->y >= state->ysize) return -1; /* This can hardly happen */ /* Unpack second line */ out = state->buffer; for (x = 0; x < state->xsize; x++) { out[0] = ptr[x+state->xsize]; out[1] = ptr[(x+4*state->xsize)/2]; out[2] = ptr[(x+5*state->xsize)/2]; out += 4; } state->shuffle((UINT8*) im->image[state->y], state->buffer, state->xsize); if (++state->y >= state->ysize) return -1; ptr += chunk; bytes -= chunk; } } pillow-2.3.0/libImaging/ModeFilter.c0000644000175000001440000000412612257506326016150 0ustar dokousers/* * The Python Imaging Library * $Id$ * * mode filter * * history: * 2002-06-08 fl Created (based on code from IFUNC95) * 2004-10-05 fl Rewritten; use a simpler brute-force algorithm * * Copyright (c) Secret Labs AB 2002-2004. All rights reserved. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" Imaging ImagingModeFilter(Imaging im, int size) { Imaging imOut; int x, y, i; int xx, yy; int maxcount; UINT8 maxpixel; int histogram[256]; if (!im || im->bands != 1 || im->type != IMAGING_TYPE_UINT8) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(im->mode, im->xsize, im->ysize); if (!imOut) return NULL; size = size / 2; for (y = 0; y < imOut->ysize; y++) { UINT8* out = &IMAGING_PIXEL_L(imOut, 0, y); for (x = 0; x < imOut->xsize; x++) { /* calculate histogram over current area */ /* FIXME: brute force! to improve, update the histogram incrementally. may also add a "frequent list", like in the old implementation, but I'm not sure that's worth the added complexity... */ memset(histogram, 0, sizeof(histogram)); for (yy = y - size; yy <= y + size; yy++) if (yy >= 0 && yy < imOut->ysize) { UINT8* in = &IMAGING_PIXEL_L(im, 0, yy); for (xx = x - size; xx <= x + size; xx++) if (xx >= 0 && xx < imOut->xsize) histogram[in[xx]]++; } /* find most frequent pixel value in this region */ maxpixel = 0; maxcount = histogram[maxpixel]; for (i = 1; i < 256; i++) if (histogram[i] > maxcount) { maxcount = histogram[i]; maxpixel = (UINT8) i; } if (maxcount > 2) out[x] = maxpixel; else out[x] = IMAGING_PIXEL_L(im, x, y); } } ImagingCopyInfo(imOut, im); return imOut; } pillow-2.3.0/libImaging/QuantHash.c0000644000175000001440000002473512257506326016022 0ustar dokousers/* * The Python Imaging Library * $Id$ * * hash tables used by the image quantizer * * history: * 98-09-10 tjs Contributed * 98-12-29 fl Added to PIL 1.0b1 * * Written by Toby J Sargeant . * * Copyright (c) 1998 by Toby J Sargeant * Copyright (c) 1998 by Secret Labs AB * * See the README file for information on usage and redistribution. */ #include #include #include #include #include "QuantHash.h" typedef struct _HashNode { struct _HashNode *next; HashKey_t key; HashVal_t value; } HashNode; struct _HashTable { HashNode **table; uint32_t length; uint32_t count; HashFunc hashFunc; HashCmpFunc cmpFunc; KeyDestroyFunc keyDestroyFunc; ValDestroyFunc valDestroyFunc; void *userData; }; #define MIN_LENGTH 11 #define RESIZE_FACTOR 3 static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); #if 0 static int _hashtable_test(HashTable *); #endif HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { HashTable *h; h=malloc(sizeof(HashTable)); if (!h) { return NULL; } h->hashFunc=hf; h->cmpFunc=cf; h->keyDestroyFunc=NULL; h->valDestroyFunc=NULL; h->length=MIN_LENGTH; h->count=0; h->userData=NULL; h->table=malloc(sizeof(HashNode *)*h->length); if (!h->table) { free(h); return NULL; } memset (h->table,0,sizeof(HashNode *)*h->length); return h; } static void _hashtable_destroy(const HashTable *h,const HashKey_t key,const HashVal_t val,void *u) { if (h->keyDestroyFunc) { h->keyDestroyFunc(h,key); } if (h->valDestroyFunc) { h->valDestroyFunc(h,val); } } static uint32_t _findPrime(uint32_t start,int dir) { static int unit[]={0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0}; uint32_t t; while (start>1) { if (!unit[start&0x0f]) { start+=dir; continue; } for (t=2;t=sqrt((double)start)) { break; } start+=dir; } return start; } static void _hashtable_rehash(HashTable *h,CollisionFunc cf,uint32_t newSize) { HashNode **oldTable=h->table; uint32_t i; HashNode *n,*nn; uint32_t oldSize; oldSize=h->length; h->table=malloc(sizeof(HashNode *)*newSize); if (!h->table) { h->table=oldTable; return; } h->length=newSize; h->count=0; memset (h->table,0,sizeof(HashNode *)*h->length); for (i=0;inext; _hashtable_insert_node(h,n,0,0,cf); } } free(oldTable); } static void _hashtable_resize(HashTable *h) { uint32_t newSize; uint32_t oldSize; oldSize=h->length; newSize=oldSize; if (h->count*RESIZE_FACTORlength) { newSize=_findPrime(h->length/2-1,-1); } else if (h->length*RESIZE_FACTORcount) { newSize=_findPrime(h->length*2+1,+1); } if (newSizelength;i++) { for (n=h->table[i];n&&n->next;n=n->next) { j=h->cmpFunc(h,n->key,n->next->key); printf ("%c",j?(j<0?'-':'+'):'='); } printf ("\n"); } return 0; } #endif static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) { uint32_t hash=h->hashFunc(h,node->key)%h->length; HashNode **n,*nv; int i; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; i=h->cmpFunc(h,nv->key,node->key); if (!i) { if (cf) { nv->key=node->key; cf(h,&(nv->key),&(nv->value),node->key,node->value); free(node); return 1; } else { if (h->valDestroyFunc) { h->valDestroyFunc(h,nv->value); } if (h->keyDestroyFunc) { h->keyDestroyFunc(h,nv->key); } nv->key=node->key; nv->value=node->value; free(node); return 1; } } else if (i>0) { break; } } if (!update) { node->next=*n; *n=node; h->count++; if (resize) _hashtable_resize(h); return 1; } else { return 0; } } static int _hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val,int resize,int update) { HashNode **n,*nv; HashNode *t; int i; uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; i=h->cmpFunc(h,nv->key,key); if (!i) { if (h->valDestroyFunc) { h->valDestroyFunc(h,nv->value); } nv->value=val; return 1; } else if (i>0) { break; } } if (!update) { t=malloc(sizeof(HashNode)); if (!t) return 0; t->next=*n; *n=t; t->key=key; t->value=val; h->count++; if (resize) _hashtable_resize(h); return 1; } else { return 0; } } static int _hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *retVal,HashVal_t newVal,int resize) { HashNode **n,*nv; HashNode *t; int i; uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; i=h->cmpFunc(h,nv->key,key); if (!i) { *retVal=nv->value; return 1; } else if (i>0) { break; } } t=malloc(sizeof(HashNode)); if (!t) return 0; t->next=*n; *n=t; t->key=key; t->value=newVal; *retVal=newVal; h->count++; if (resize) _hashtable_resize(h); return 1; } int hashtable_insert_or_update_computed(HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc) { HashNode **n,*nv; HashNode *t; int i; uint32_t hash=h->hashFunc(h,key)%h->length; for (n=&(h->table[hash]);*n;n=&((*n)->next)) { nv=*n; i=h->cmpFunc(h,nv->key,key); if (!i) { HashVal_t old=nv->value; if (existsFunc) { existsFunc(h,nv->key,&(nv->value)); if (nv->value!=old) { if (h->valDestroyFunc) { h->valDestroyFunc(h,old); } } } else { return 0; } return 1; } else if (i>0) { break; } } t=malloc(sizeof(HashNode)); if (!t) return 0; t->key=key; t->next=*n; *n=t; if (newFunc) { newFunc(h,t->key,&(t->value)); } else { free(t); return 0; } h->count++; _hashtable_resize(h); return 1; } int hashtable_update(HashTable *h,HashKey_t key,HashVal_t val) { return _hashtable_insert(h,key,val,1,0); } int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val) { return _hashtable_insert(h,key,val,1,0); } void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u) { HashNode *n; uint32_t x; if (h->table) { for (x=0;xlength;x++) { for (n=h->table[x];n;n=n->next) { i(h,n->key,&(n->value),u); } } } } void hashtable_foreach(HashTable *h,IteratorFunc i,void *u) { HashNode *n; uint32_t x; if (h->table) { for (x=0;xlength;x++) { for (n=h->table[x];n;n=n->next) { i(h,n->key,n->value,u); } } } } void hashtable_free(HashTable *h) { HashNode *n,*nn; uint32_t i; if (h->table) { if (h->keyDestroyFunc || h->keyDestroyFunc) { hashtable_foreach(h,_hashtable_destroy,NULL); } for (i=0;ilength;i++) { for (n=h->table[i];n;n=nn) { nn=n->next; free(n); } } free(h->table); } free(h); } ValDestroyFunc hashtable_set_value_destroy_func(HashTable *h,ValDestroyFunc d) { ValDestroyFunc r=h->valDestroyFunc; h->valDestroyFunc=d; return r; } KeyDestroyFunc hashtable_set_key_destroy_func(HashTable *h,KeyDestroyFunc d) { KeyDestroyFunc r=h->keyDestroyFunc; h->keyDestroyFunc=d; return r; } static int _hashtable_remove(HashTable *h, const HashKey_t key, HashKey_t *keyRet, HashVal_t *valRet, int resize) { uint32_t hash=h->hashFunc(h,key)%h->length; HashNode *n,*p; int i; for (p=NULL,n=h->table[hash];n;p=n,n=n->next) { i=h->cmpFunc(h,n->key,key); if (!i) { if (p) p=n->next; else h->table[hash]=n->next; *keyRet=n->key; *valRet=n->value; free(n); h->count++; return 1; } else if (i>0) { break; } } return 0; } static int _hashtable_delete(HashTable *h,const HashKey_t key,int resize) { uint32_t hash=h->hashFunc(h,key)%h->length; HashNode *n,*p; int i; for (p=NULL,n=h->table[hash];n;p=n,n=n->next) { i=h->cmpFunc(h,n->key,key); if (!i) { if (p) p=n->next; else h->table[hash]=n->next; if (h->valDestroyFunc) { h->valDestroyFunc(h,n->value); } if (h->keyDestroyFunc) { h->keyDestroyFunc(h,n->key); } free(n); h->count++; return 1; } else if (i>0) { break; } } return 0; } int hashtable_remove(HashTable *h,const HashKey_t key,HashKey_t *keyRet,HashVal_t *valRet) { return _hashtable_remove(h,key,keyRet,valRet,1); } int hashtable_delete(HashTable *h,const HashKey_t key) { return _hashtable_delete(h,key,1); } void hashtable_rehash_compute(HashTable *h,CollisionFunc cf) { _hashtable_rehash(h,cf,h->length); } void hashtable_rehash(HashTable *h) { _hashtable_rehash(h,NULL,h->length); } int hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *valp,HashVal_t val) { return _hashtable_lookup_or_insert(h,key,valp,val,1); } int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp) { uint32_t hash=h->hashFunc(h,key)%h->length; HashNode *n; int i; for (n=h->table[hash];n;n=n->next) { i=h->cmpFunc(h,n->key,key); if (!i) { *valp=n->value; return 1; } else if (i>0) { break; } } return 0; } uint32_t hashtable_get_count(const HashTable *h) { return h->count; } void *hashtable_get_user_data(const HashTable *h) { return h->userData; } void *hashtable_set_user_data(HashTable *h,void *data) { void *r=h->userData; h->userData=data; return r; } pillow-2.3.0/libImaging/ZipDecode.c0000644000175000001440000001621712257506326015770 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for ZIP (deflated) image data. * * history: * 1996-12-14 fl Created (for PNG) * 1997-01-15 fl Prepared to read TIFF/ZIP * 2001-11-19 fl PNG incomplete read patch (from Bernhard Herzog) * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997-2001. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #ifdef HAVE_LIBZ #include "Zip.h" static const int OFFSET[] = { 7, 3, 3, 1, 1, 0, 0 }; static const int STARTING_COL[] = { 0, 4, 0, 2, 0, 1, 0 }; static const int STARTING_ROW[] = { 0, 0, 4, 0, 2, 0, 1 }; static const int COL_INCREMENT[] = { 8, 8, 4, 4, 2, 2, 1 }; static const int ROW_INCREMENT[] = { 8, 8, 8, 4, 4, 2, 2 }; /* Get the length in bytes of a scanline in the pass specified, * for interlaced images */ static int get_row_len(ImagingCodecState state, int pass) { int row_len = (state->xsize + OFFSET[pass]) / COL_INCREMENT[pass]; return ((row_len * state->bits) + 7) / 8; } /* -------------------------------------------------------------------- */ /* Decoder */ /* -------------------------------------------------------------------- */ int ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { ZIPSTATE* context = (ZIPSTATE*) state->context; int err; int n; UINT8* ptr; int i, bpp; int row_len; if (!state->state) { /* Initialization */ if (context->mode == ZIP_PNG || context->mode == ZIP_PNG_PALETTE) context->prefix = 1; /* PNG */ /* Expand standard buffer to make room for the (optional) filter prefix, and allocate a buffer to hold the previous line */ free(state->buffer); state->buffer = (UINT8*) malloc(state->bytes+1); context->previous = (UINT8*) malloc(state->bytes+1); if (!state->buffer || !context->previous) { state->errcode = IMAGING_CODEC_MEMORY; return -1; } context->last_output = 0; /* Initialize to black */ memset(context->previous, 0, state->bytes+1); /* Setup decompression context */ context->z_stream.zalloc = (alloc_func) NULL; context->z_stream.zfree = (free_func) NULL; context->z_stream.opaque = (voidpf) NULL; err = inflateInit(&context->z_stream); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } if (context->interlaced) { context->pass = 0; state->y = STARTING_ROW[context->pass]; } /* Ready to decode */ state->state = 1; } if (context->interlaced) { row_len = get_row_len(state, context->pass); } else { row_len = state->bytes; } /* Setup the source buffer */ context->z_stream.next_in = buf; context->z_stream.avail_in = bytes; /* Decompress what we've got this far */ while (context->z_stream.avail_in > 0) { context->z_stream.next_out = state->buffer + context->last_output; context->z_stream.avail_out = row_len + context->prefix - context->last_output; err = inflate(&context->z_stream, Z_NO_FLUSH); if (err < 0) { /* Something went wrong inside the compression library */ if (err == Z_DATA_ERROR) state->errcode = IMAGING_CODEC_BROKEN; else if (err == Z_MEM_ERROR) state->errcode = IMAGING_CODEC_MEMORY; else state->errcode = IMAGING_CODEC_CONFIG; free(context->previous); inflateEnd(&context->z_stream); return -1; } n = row_len + context->prefix - context->z_stream.avail_out; if (n < row_len + context->prefix) { context->last_output = n; break; /* need more input data */ } /* Apply predictor */ switch (context->mode) { case ZIP_PNG: switch (state->buffer[0]) { case 0: break; case 1: /* prior */ bpp = (state->bits + 7) / 8; for (i = bpp+1; i <= row_len; i++) state->buffer[i] += state->buffer[i-bpp]; break; case 2: /* up */ for (i = 1; i <= row_len; i++) state->buffer[i] += context->previous[i]; break; case 3: /* average */ bpp = (state->bits + 7) / 8; for (i = 1; i <= bpp; i++) state->buffer[i] += context->previous[i]/2; for (; i <= row_len; i++) state->buffer[i] += (state->buffer[i-bpp] + context->previous[i])/2; break; case 4: /* paeth filtering */ bpp = (state->bits + 7) / 8; for (i = 1; i <= bpp; i++) state->buffer[i] += context->previous[i]; for (; i <= row_len; i++) { int a, b, c; int pa, pb, pc; /* fetch pixels */ a = state->buffer[i-bpp]; b = context->previous[i]; c = context->previous[i-bpp]; /* distances to surrounding pixels */ pa = abs(b - c); pb = abs(a - c); pc = abs(a + b - 2*c); /* pick predictor with the shortest distance */ state->buffer[i] += (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; } break; default: state->errcode = IMAGING_CODEC_UNKNOWN; free(context->previous); inflateEnd(&context->z_stream); return -1; } break; case ZIP_TIFF_PREDICTOR: bpp = (state->bits + 7) / 8; for (i = bpp+1; i <= row_len; i++) state->buffer[i] += state->buffer[i-bpp]; break; } /* Stuff data into the image */ if (context->interlaced) { int col = STARTING_COL[context->pass]; if (state->bits >= 8) { /* Stuff pixels in their correct location, one by one */ for (i = 0; i < row_len; i += ((state->bits + 7) / 8)) { state->shuffle((UINT8*) im->image[state->y] + col * im->pixelsize, state->buffer + context->prefix + i, 1); col += COL_INCREMENT[context->pass]; } } else { /* Handle case with more than a pixel in each byte */ int row_bits = ((state->xsize + OFFSET[context->pass]) / COL_INCREMENT[context->pass]) * state->bits; for (i = 0; i < row_bits; i += state->bits) { UINT8 byte = *(state->buffer + context->prefix + (i / 8)); byte <<= (i % 8); state->shuffle((UINT8*) im->image[state->y] + col * im->pixelsize, &byte, 1); col += COL_INCREMENT[context->pass]; } } /* Find next valid scanline */ state->y += ROW_INCREMENT[context->pass]; while (state->y >= state->ysize || row_len <= 0) { context->pass++; if (context->pass == 7) { /* Force exit below */ state->y = state->ysize; break; } state->y = STARTING_ROW[context->pass]; row_len = get_row_len(state, context->pass); /* Since we're moving to the "first" line, the previous line * should be black to make filters work corectly */ memset(state->buffer, 0, state->bytes+1); } } else { state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer + context->prefix, state->xsize); state->y++; } /* all inflate output has been consumed */ context->last_output = 0; if (state->y >= state->ysize || err == Z_STREAM_END) { /* The image and the data should end simultaneously */ /* if (state->y < state->ysize || err != Z_STREAM_END) state->errcode = IMAGING_CODEC_BROKEN; */ free(context->previous); inflateEnd(&context->z_stream); return -1; /* end of file (errcode=0) */ } /* Swap buffer pointers */ ptr = state->buffer; state->buffer = context->previous; context->previous = ptr; } return bytes; /* consumed all of it */ } #endif pillow-2.3.0/libImaging/QuantTypes.h0000644000175000001440000000077512257506326016246 0ustar dokousers/* * The Python Imaging Library * $Id$ * * image quantizer * * Written by Toby J Sargeant . * * See the README file for information on usage and redistribution. */ #ifndef __TYPES_H__ #define __TYPES_H__ #ifdef _MSC_VER typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif typedef union { struct { unsigned char r,g,b,a; } c; struct { unsigned char v[4]; } a; uint32_t v; } Pixel; #endif pillow-2.3.0/libImaging/Filter.c0000644000175000001440000001244612257506326015347 0ustar dokousers/* * The Python Imaging Library * $Id$ * * apply convolution kernel to image * * history: * 1995-11-26 fl Created, supports 3x3 kernels * 1995-11-27 fl Added 5x5 kernels, copy border * 1999-07-26 fl Eliminated a few compiler warnings * 2002-06-09 fl Moved kernel definitions to Python * 2002-06-11 fl Support floating point kernels * 2003-09-15 fl Added ImagingExpand helper * * Copyright (c) Secret Labs AB 1997-2002. All rights reserved. * Copyright (c) Fredrik Lundh 1995. * * See the README file for information on usage and redistribution. */ /* * FIXME: Support RGB and RGBA/CMYK modes as well * FIXME: Expand image border (current version leaves border as is) * FIXME: Implement image processing gradient filters */ #include "Imaging.h" Imaging ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) { Imaging imOut; int x, y; if (xmargin < 0 && ymargin < 0) return (Imaging) ImagingError_ValueError("bad kernel size"); imOut = ImagingNew( imIn->mode, imIn->xsize+2*xmargin, imIn->ysize+2*ymargin ); if (!imOut) return NULL; #define EXPAND_LINE(type, image, yin, yout) {\ for (x = 0; x < xmargin; x++)\ imOut->image[yout][x] = imIn->image[yin][0];\ for (x = 0; x < imIn->xsize; x++)\ imOut->image[yout][x+xmargin] = imIn->image[yin][x];\ for (x = 0; x < xmargin; x++)\ imOut->image[yout][xmargin+imIn->xsize+x] =\ imIn->image[yin][imIn->xsize-1];\ } #define EXPAND(type, image) {\ for (y = 0; y < ymargin; y++)\ EXPAND_LINE(type, image, 0, y);\ for (y = 0; y < imIn->ysize; y++)\ EXPAND_LINE(type, image, y, y+ymargin);\ for (y = 0; y < ymargin; y++)\ EXPAND_LINE(type, image, imIn->ysize-1, ymargin+imIn->ysize+y);\ } if (imIn->image8) { EXPAND(UINT8, image8); } else { EXPAND(INT32, image32); } ImagingCopyInfo(imOut, imIn); return imOut; } Imaging ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, FLOAT32 offset, FLOAT32 divisor) { Imaging imOut; int x, y; FLOAT32 sum; if (!im || strcmp(im->mode, "L") != 0) return (Imaging) ImagingError_ModeError(); if (im->xsize < xsize || im->ysize < ysize) return ImagingCopy(im); if ((xsize != 3 && xsize != 5) || xsize != ysize) return (Imaging) ImagingError_ValueError("bad kernel size"); imOut = ImagingNew(im->mode, im->xsize, im->ysize); if (!imOut) return NULL; /* brute force kernel implementations */ #define KERNEL3x3(image, kernel, d) ( \ (int) image[y+1][x-d] * kernel[0] + \ (int) image[y+1][x] * kernel[1] + \ (int) image[y+1][x+d] * kernel[2] + \ (int) image[y][x-d] * kernel[3] + \ (int) image[y][x] * kernel[4] + \ (int) image[y][x+d] * kernel[5] + \ (int) image[y-1][x-d] * kernel[6] + \ (int) image[y-1][x] * kernel[7] + \ (int) image[y-1][x+d] * kernel[8]) #define KERNEL5x5(image, kernel, d) ( \ (int) image[y+2][x-d-d] * kernel[0] + \ (int) image[y+2][x-d] * kernel[1] + \ (int) image[y+2][x] * kernel[2] + \ (int) image[y+2][x+d] * kernel[3] + \ (int) image[y+2][x+d+d] * kernel[4] + \ (int) image[y+1][x-d-d] * kernel[5] + \ (int) image[y+1][x-d] * kernel[6] + \ (int) image[y+1][x] * kernel[7] + \ (int) image[y+1][x+d] * kernel[8] + \ (int) image[y+1][x+d+d] * kernel[9] + \ (int) image[y][x-d-d] * kernel[10] + \ (int) image[y][x-d] * kernel[11] + \ (int) image[y][x] * kernel[12] + \ (int) image[y][x+d] * kernel[13] + \ (int) image[y][x+d+d] * kernel[14] + \ (int) image[y-1][x-d-d] * kernel[15] + \ (int) image[y-1][x-d] * kernel[16] + \ (int) image[y-1][x] * kernel[17] + \ (int) image[y-1][x+d] * kernel[18] + \ (int) image[y-1][x+d+d] * kernel[19] + \ (int) image[y-2][x-d-d] * kernel[20] + \ (int) image[y-2][x-d] * kernel[21] + \ (int) image[y-2][x] * kernel[22] + \ (int) image[y-2][x+d] * kernel[23] + \ (int) image[y-2][x+d+d] * kernel[24]) if (xsize == 3) { /* 3x3 kernel. */ for (x = 0; x < im->xsize; x++) imOut->image[0][x] = im->image8[0][x]; for (y = 1; y < im->ysize-1; y++) { imOut->image[y][0] = im->image8[y][0]; for (x = 1; x < im->xsize-1; x++) { sum = KERNEL3x3(im->image8, kernel, 1) / divisor + offset; if (sum <= 0) imOut->image8[y][x] = 0; else if (sum >= 255) imOut->image8[y][x] = 255; else imOut->image8[y][x] = (UINT8) sum; } imOut->image8[y][x] = im->image8[y][x]; } for (x = 0; x < im->xsize; x++) imOut->image8[y][x] = im->image8[y][x]; } else { /* 5x5 kernel. */ for (y = 0; y < 2; y++) for (x = 0; x < im->xsize; x++) imOut->image8[y][x] = im->image8[y][x]; for (; y < im->ysize-2; y++) { for (x = 0; x < 2; x++) imOut->image8[y][x] = im->image8[y][x]; for (; x < im->xsize-2; x++) { sum = KERNEL5x5(im->image8, kernel, 1) / divisor + offset; if (sum <= 0) imOut->image8[y][x] = 0; else if (sum >= 255) imOut->image8[y][x] = 255; else imOut->image8[y][x] = (UINT8) sum; } for (; x < im->xsize; x++) imOut->image8[y][x] = im->image8[y][x]; } for (; y < im->ysize; y++) for (x = 0; x < im->xsize; x++) imOut->image8[y][x] = im->image8[y][x]; } return imOut; } pillow-2.3.0/libImaging/Copy.c0000644000175000001440000000217112257506326015026 0ustar dokousers/* * The Python Imaging Library * $Id$ * * copy image * * history: * 95-11-26 fl Moved from Imaging.c * 97-05-12 fl Added ImagingCopy2 * 97-08-28 fl Allow imOut == NULL in ImagingCopy2 * * Copyright (c) Fredrik Lundh 1995-97. * Copyright (c) Secret Labs AB 1997. * * See the README file for details on usage and redistribution. */ #include "Imaging.h" static Imaging _copy(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int y; if (!imIn) return (Imaging) ImagingError_ValueError(NULL); imOut = ImagingNew2(imIn->mode, imOut, imIn); if (!imOut) return NULL; ImagingCopyInfo(imOut, imIn); ImagingSectionEnter(&cookie); if (imIn->block != NULL && imOut->block != NULL) memcpy(imOut->block, imIn->block, imIn->ysize * imIn->linesize); else for (y = 0; y < imIn->ysize; y++) memcpy(imOut->image[y], imIn->image[y], imIn->linesize); ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingCopy(Imaging imIn) { return _copy(NULL, imIn); } Imaging ImagingCopy2(Imaging imOut, Imaging imIn) { return _copy(imOut, imIn); } pillow-2.3.0/libImaging/Histo.c0000644000175000001440000001207612257506326015207 0ustar dokousers/* * The Python Imaging Library * $Id$ * * histogram support * * history: * 1995-06-15 fl Created. * 1996-04-05 fl Fixed histogram for multiband images. * 1997-02-23 fl Added mask support * 1998-07-01 fl Added basic 32-bit float/integer support * * Copyright (c) 1997-2003 by Secret Labs AB. * Copyright (c) 1995-2003 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* HISTOGRAM */ /* -------------------------------------------------------------------- * Take a histogram of an image. Returns a histogram object containing * 256 slots per band in the input image. */ void ImagingHistogramDelete(ImagingHistogram h) { if (h->histogram) free(h->histogram); free(h); } ImagingHistogram ImagingHistogramNew(Imaging im) { ImagingHistogram h; /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH); h->bands = im->bands; h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); return h; } ImagingHistogram ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) { ImagingSectionCookie cookie; int x, y, i; ImagingHistogram h; INT32 imin, imax; FLOAT32 fmin, fmax, scale; if (!im) return ImagingError_ModeError(); if (imMask) { /* Validate mask */ if (im->xsize != imMask->xsize || im->ysize != imMask->ysize) return ImagingError_Mismatch(); if (strcmp(imMask->mode, "1") != 0 && strcmp(imMask->mode, "L") != 0) return ImagingError_ValueError("bad transparency mask"); } h = ImagingHistogramNew(im); if (imMask) { /* mask */ if (im->image8) { ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++) if (imMask->image8[y][x] != 0) h->histogram[im->image8[y][x]]++; ImagingSectionLeave(&cookie); } else { /* yes, we need the braces. C isn't Python! */ if (im->type != IMAGING_TYPE_UINT8) return ImagingError_ModeError(); ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { UINT8* in = (UINT8*) im->image32[y]; for (x = 0; x < im->xsize; x++) if (imMask->image8[y][x] != 0) { h->histogram[(*in++)]++; h->histogram[(*in++)+256]++; h->histogram[(*in++)+512]++; h->histogram[(*in++)+768]++; } else in += 4; } ImagingSectionLeave(&cookie); } } else { /* mask not given; process pixels in image */ if (im->image8) { ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++) h->histogram[im->image8[y][x]]++; ImagingSectionLeave(&cookie); } else { switch (im->type) { case IMAGING_TYPE_UINT8: ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { UINT8* in = (UINT8*) im->image[y]; for (x = 0; x < im->xsize; x++) { h->histogram[(*in++)]++; h->histogram[(*in++)+256]++; h->histogram[(*in++)+512]++; h->histogram[(*in++)+768]++; } } ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_INT32: if (!minmax) return ImagingError_ValueError("min/max not given"); if (!im->xsize || !im->ysize) break; imin = ((INT32*) minmax)[0]; imax = ((INT32*) minmax)[1]; if (imin >= imax) break; ImagingSectionEnter(&cookie); scale = 255.0F / (imax - imin); for (y = 0; y < im->ysize; y++) { INT32* in = im->image32[y]; for (x = 0; x < im->xsize; x++) { i = (int) (((*in++)-imin)*scale); if (i >= 0 && i < 256) h->histogram[i]++; } } ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_FLOAT32: if (!minmax) return ImagingError_ValueError("min/max not given"); if (!im->xsize || !im->ysize) break; fmin = ((FLOAT32*) minmax)[0]; fmax = ((FLOAT32*) minmax)[1]; if (fmin >= fmax) break; ImagingSectionEnter(&cookie); scale = 255.0F / (fmax - fmin); for (y = 0; y < im->ysize; y++) { FLOAT32* in = (FLOAT32*) im->image32[y]; for (x = 0; x < im->xsize; x++) { i = (int) (((*in++)-fmin)*scale); if (i >= 0 && i < 256) h->histogram[i]++; } } ImagingSectionLeave(&cookie); break; } } } return h; } pillow-2.3.0/libImaging/AlphaComposite.c0000644000175000001440000000524212257506326017026 0ustar dokousers/* * The Python Imaging Library * $Id$ * * Alpha composite imSrc over imDst. * http://en.wikipedia.org/wiki/Alpha_compositing * * See the README file for details on usage and redistribution. */ #include "Imaging.h" typedef struct { UINT8 r; UINT8 g; UINT8 b; UINT8 a; } rgba8; Imaging ImagingAlphaComposite(Imaging imDst, Imaging imSrc) { Imaging imOut; int x, y; /* Check arguments */ if (!imDst || !imSrc || strcmp(imDst->mode, "RGBA") || imDst->type != IMAGING_TYPE_UINT8 || imDst->bands != 4) return ImagingError_ModeError(); if (strcmp(imDst->mode, imSrc->mode) || imDst->type != imSrc->type || imDst->bands != imSrc->bands || imDst->xsize != imSrc->xsize || imDst->ysize != imSrc->ysize) return ImagingError_Mismatch(); imOut = ImagingNew(imDst->mode, imDst->xsize, imDst->ysize); if (!imOut) return NULL; ImagingCopyInfo(imOut, imDst); for (y = 0; y < imDst->ysize; y++) { rgba8* dst = (rgba8*) imDst->image[y]; rgba8* src = (rgba8*) imSrc->image[y]; rgba8* out = (rgba8*) imOut->image[y]; for (x = 0; x < imDst->xsize; x ++) { if (src->a == 0) { // Copy 4 bytes at once. *out = *dst; } else { // Integer implementation with increased precision. // Each variable has extra meaningful bits. // Divisions are rounded. // This code uses trick from Paste.c: // (a + (2 << (n-1)) - 1) / ((2 << n)-1) // almost equivalent to: // tmp = a + (2 << (n-1)), ((tmp >> n) + tmp) >> n UINT32 tmpr, tmpg, tmpb; UINT16 blend = dst->a * (255 - src->a); UINT16 outa255 = src->a * 255 + blend; // There we use 7 bits for precision. // We could use more, but we go beyond 32 bits. UINT16 coef1 = src->a * 255 * 255 * 128 / outa255; UINT16 coef2 = 255 * 128 - coef1; #define SHIFTFORDIV255(a)\ ((((a) >> 8) + a) >> 8) tmpr = src->r * coef1 + dst->r * coef2 + (0x80 << 7); out->r = SHIFTFORDIV255(tmpr) >> 7; tmpg = src->g * coef1 + dst->g * coef2 + (0x80 << 7); out->g = SHIFTFORDIV255(tmpg) >> 7; tmpb = src->b * coef1 + dst->b * coef2 + (0x80 << 7); out->b = SHIFTFORDIV255(tmpb) >> 7; out->a = SHIFTFORDIV255(outa255 + 0x80); } dst++; src++; out++; } } return imOut; } pillow-2.3.0/libImaging/Crc32.c0000644000175000001440000000755312257506326015001 0ustar dokousers/* * The Python Imaging Library * $Id$ * * calculate ISO 3307 checksum * * history: * 96-12-10 fl: Created (based on example in the PNG spec) * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* Precalculated CRC values (created by makecrctable.py) */ static UINT32 crc32table[] = { 0x0, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x76DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0xEDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x9B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L, 0x1DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x6B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0xF00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x86D3D2DL, 0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L, 0x3B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x4DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0xD6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0xA00AE27L, 0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x26D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x5005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0xCB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0xBDBDF21L, 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; UINT32 ImagingCRC32(UINT32 crc, UINT8* buffer, int bytes) { int i; crc ^= 0xFFFFFFFFL; for (i = 0; i < bytes; i++) crc = crc32table[(UINT8) crc ^ buffer[i]] ^ (crc >> 8); return crc ^ 0xFFFFFFFFL; } pillow-2.3.0/libImaging/RawEncode.c0000644000175000001440000000356012257506326015766 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * coder for raw data * * FIXME: This encoder will fail if the buffer is not large enough to * hold one full line of data. There's a workaround for this problem * in ImageFile.py, but it should be solved here instead. * * history: * 96-04-30 fl created * 97-01-03 fl fixed padding * * Copyright (c) Fredrik Lundh 1996-97. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* ptr; if (!state->state) { /* The "count" field holds the stride, if specified. Fix things up so "bytes" is the full size, and "count" the packed size */ if (state->count > 0) { int bytes = state->count; /* stride must not be less than real size */ if (state->count < state->bytes) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } state->count = state->bytes; state->bytes = bytes; } else state->count = state->bytes; /* The "ystep" field specifies the orientation */ if (state->ystep < 0) { state->y = state->ysize-1; state->ystep = -1; } else state->ystep = 1; state->state = 1; } if (bytes < state->bytes) { state->errcode = IMAGING_CODEC_CONFIG; return 0; } ptr = buf; while (bytes >= state->bytes) { state->shuffle(ptr, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); if (state->bytes > state->count) /* zero-pad the buffer, if necessary */ memset(ptr + state->count, 0, state->bytes - state->count); ptr += state->bytes; bytes -= state->bytes; state->y += state->ystep; if (state->y < 0 || state->y >= state->ysize) { state->errcode = IMAGING_CODEC_END; break; } } return ptr - buf; } pillow-2.3.0/libImaging/Quant.c0000644000175000001440000012301412257506326015204 0ustar dokousers/* * The Python Imaging Library * $Id$ * * image quantizer * * history: * 1998-09-10 tjs Contributed * 1998-12-29 fl Added to PIL 1.0b1 * 2004-02-21 fl Fixed bogus free() on quantization error * 2005-02-07 fl Limit number of colors to 256 * * Written by Toby J Sargeant . * * Copyright (c) 1998 by Toby J Sargeant * Copyright (c) 1998-2004 by Secret Labs AB. All rights reserved. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include #include #include #include #include "QuantTypes.h" #include "QuantOctree.h" #include "QuantHash.h" #include "QuantHeap.h" #define NO_OUTPUT typedef struct { uint32_t scale; } PixelHashData; typedef struct _PixelList { struct _PixelList *next[3],*prev[3]; Pixel p; unsigned int flag:1; int count; } PixelList; typedef struct _BoxNode { struct _BoxNode *l,*r; PixelList *head[3],*tail[3]; int axis; int volume; uint32_t pixelCount; } BoxNode; #define _SQR(x) ((x)*(x)) #define _DISTSQR(p1,p2) \ _SQR((int)((p1)->c.r)-(int)((p2)->c.r))+ \ _SQR((int)((p1)->c.g)-(int)((p2)->c.g))+ \ _SQR((int)((p1)->c.b)-(int)((p2)->c.b)) #define MAX_HASH_ENTRIES 65536 #define PIXEL_HASH(r,g,b) \ (((unsigned int)(r) )*463 ^ \ ((unsigned int)(g)<< 8)*10069 ^ \ ((unsigned int)(b)<<16)*64997) #define PIXEL_UNSCALE(p,q,s) \ ((q)->c.r=(p)->c.r<<(s)), \ ((q)->c.g=(p)->c.g<<(s)), \ ((q)->c.b=(p)->c.b<<(s)) #define PIXEL_SCALE(p,q,s)\ ((q)->c.r=(p)->c.r>>(s)), \ ((q)->c.g=(p)->c.g>>(s)), \ ((q)->c.b=(p)->c.b>>(s)) static uint32_t unshifted_pixel_hash(const HashTable *h, const Pixel pixel) { return PIXEL_HASH(pixel.c.r, pixel.c.g, pixel.c.b); } static int unshifted_pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) { if (pixel1.c.r==pixel2.c.r) { if (pixel1.c.g==pixel2.c.g) { if (pixel1.c.b==pixel2.c.b) { return 0; } else { return (int)(pixel1.c.b)-(int)(pixel2.c.b); } } else { return (int)(pixel1.c.g)-(int)(pixel2.c.g); } } else { return (int)(pixel1.c.r)-(int)(pixel2.c.r); } } static uint32_t pixel_hash(const HashTable *h,const Pixel pixel) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); return PIXEL_HASH(pixel.c.r>>d->scale, pixel.c.g>>d->scale, pixel.c.b>>d->scale); } static int pixel_cmp(const HashTable *h,const Pixel pixel1, const Pixel pixel2) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); uint32_t A,B; A=PIXEL_HASH(pixel1.c.r>>d->scale, pixel1.c.g>>d->scale, pixel1.c.b>>d->scale); B=PIXEL_HASH(pixel2.c.r>>d->scale, pixel2.c.g>>d->scale, pixel2.c.b>>d->scale); return (A==B)?0:((Ascale=0; #ifndef NO_OUTPUT timer=timer3=clock(); #endif for (i=0;iMAX_HASH_ENTRIES) { d->scale++; #ifndef NO_OUTPUT printf ("rehashing - new scale: %d\n",(int)d->scale); timer2=clock(); #endif hashtable_rehash_compute(hash,rehash_collide); #ifndef NO_OUTPUT timer2=clock()-timer2; printf ("rehash took %f sec\n",timer2/(double)CLOCKS_PER_SEC); timer+=timer2; #endif } } #ifndef NO_OUTPUT printf ("inserts took %f sec\n",(clock()-timer)/(double)CLOCKS_PER_SEC); #endif #ifndef NO_OUTPUT printf ("total %f sec\n",(clock()-timer3)/(double)CLOCKS_PER_SEC); #endif return hash; } static void destroy_pixel_hash(HashTable *hash) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash); if (d) free(d); hashtable_free(hash); } /* 1. hash quantized pixels. */ /* 2. create R,G,B lists of sorted quantized pixels. */ /* 3. median cut. */ /* 4. build hash table from median cut boxes. */ /* 5. for each pixel, compute entry in hash table, and hence median cut box. */ /* 6. compute median cut box pixel averages. */ /* 7. map each pixel to nearest average. */ static int compute_box_volume(BoxNode *b) { unsigned char rl,rh,gl,gh,bl,bh; if (b->volume>=0) return b->volume; if (!b->head[0]) { b->volume=0; } else { rh=b->head[0]->p.c.r; rl=b->tail[0]->p.c.r; gh=b->head[1]->p.c.g; gl=b->tail[1]->p.c.g; bh=b->head[2]->p.c.b; bl=b->tail[2]->p.c.b; b->volume=(rh-rl+1)*(gh-gl+1)*(bh-bl+1); } return b->volume; } static void hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); PixelList **pl=(PixelList **)u; PixelList *p; int i; Pixel q; PIXEL_SCALE(&pixel,&q,d->scale); p=malloc(sizeof(PixelList)); if (!p) return; p->flag=0; p->p=q; p->count=count; for (i=0;i<3;i++) { p->next[i]=pl[i]; p->prev[i]=NULL; if (pl[i]) pl[i]->prev[i]=p; pl[i]=p; } } static PixelList * mergesort_pixels(PixelList *head, int i) { PixelList *c,*t,*a,*b,*p; if (!head||!head->next[i]) { if (head) { head->next[i]=NULL; head->prev[i]=NULL; } return head; } for (c=t=head;c&&t;c=c->next[i],t=(t->next[i])?t->next[i]->next[i]:NULL); if (c) { if (c->prev[i]) c->prev[i]->next[i]=NULL; c->prev[i]=NULL; } a=mergesort_pixels(head,i); b=mergesort_pixels(c,i); head=NULL; p=NULL; while (a&&b) { if (a->p.a.v[i]>b->p.a.v[i]) { c=a; a=a->next[i]; } else { c=b; b=b->next[i]; } c->prev[i]=p; c->next[i]=NULL; if (p) p->next[i]=c; p=c; if (!head) head=c; } if (a) { c->next[i]=a; a->prev[i]=c; } else if (b) { c->next[i]=b; b->prev[i]=c; } return head; } #if defined(TEST_MERGESORT) || defined(TEST_SORTED) static int test_sorted(PixelList *pl[3]) { int i,n,l; PixelList *t; for(i=0;i<3;i++) { n=0; l=256; for (t=pl[i];t;t=t->next[i]) { if (lp.a.v[i]) return 0; l=t->p.a.v[i]; } } return 1; } #endif static int box_heap_cmp(const Heap *h, const void *A, const void *B) { BoxNode *a=(BoxNode *)A; BoxNode *b=(BoxNode *)B; return (int)a->pixelCount-(int)b->pixelCount; } #define LUMINANCE(p) (77*(p)->c.r+150*(p)->c.g+29*(p)->c.b) static int splitlists(PixelList *h[3], PixelList *t[3], PixelList *nh[2][3], PixelList *nt[2][3], uint32_t nCount[2], int axis, uint32_t pixelCount) { uint32_t left; PixelList *l,*r,*c,*n; int i; int nRight,nLeft; int splitColourVal; #ifdef TEST_SPLIT { PixelList *_prevTest,*_nextTest; int _i,_nextCount[3],_prevCount[3]; for (_i=0;_i<3;_i++) { for (_nextCount[_i]=0,_nextTest=h[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); for (_prevCount[_i]=0,_prevTest=t[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); if (_nextTest!=t[_i]) { printf ("next-list of axis %d does not end at tail\n",_i); exit(1); } if (_prevTest!=h[_i]) { printf ("prev-list of axis %d does not end at head\n",_i); exit(1); } for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); if (_nextTest!=h[_i]) { printf ("next-list of axis %d does not loop back to head\n",_i); exit(1); } if (_prevTest!=t[_i]) { printf ("prev-list of axis %d does not loop back to tail\n",_i); exit(1); } } for (_i=1;_i<3;_i++) { if (_prevCount[_i]!=_prevCount[_i-1] || _nextCount[_i]!=_nextCount[_i-1] || _prevCount[_i]!=_nextCount[_i]) { printf ("{%d %d %d} {%d %d %d}\n", _prevCount[0], _prevCount[1], _prevCount[2], _nextCount[0], _nextCount[1], _nextCount[2]); exit(1); } } } #endif nCount[0]=nCount[1]=0; nLeft=nRight=0; for (left=0,c=h[axis];c;) { left=left+c->count; nCount[0]+=c->count; c->flag=0; nLeft++; c=c->next[axis]; if (left*2>pixelCount) { break; } } if (c) { splitColourVal=c->prev[axis]->p.a.v[axis]; for (;c;c=c->next[axis]) { if (splitColourVal!=c->p.a.v[axis]) { break; } c->flag=0; nLeft++; nCount[0]+=c->count; } } for (;c;c=c->next[axis]) { c->flag=1; nRight++; nCount[1]+=c->count; } if (!nRight) { for (c=t[axis],splitColourVal=t[axis]->p.a.v[axis];c;c=c->prev[axis]) { if (splitColourVal!=c->p.a.v[axis]) { break; } c->flag=1; nRight++; nLeft--; nCount[0]-=c->count; nCount[1]+=c->count; } } #ifndef NO_OUTPUT if (!nLeft) { for (c=h[axis];c;c=c->next[axis]) { printf ("[%d %d %d]\n",c->p.c.r,c->p.c.g,c->p.c.b); } printf ("warning... trivial split\n"); } #endif for (i=0;i<3;i++) { l=r=NULL; nh[0][i]=nt[0][i]=NULL; nh[1][i]=nt[1][i]=NULL; for (c=h[i];c;c=n) { n=c->next[i]; if (c->flag) { /* move pixel to right list*/ if (r) r->next[i]=c; else nh[1][i]=c; c->prev[i]=r; r=c; } else { /* move pixel to left list */ if (l) l->next[i]=c; else nh[0][i]=c; c->prev[i]=l; l=c; } } if (l) l->next[i]=NULL; if (r) r->next[i]=NULL; nt[0][i]=l; nt[1][i]=r; } return 1; } static int split(BoxNode *node) { unsigned char rl,rh,gl,gh,bl,bh; int f[3]; int best,axis; int i; PixelList *heads[2][3]; PixelList *tails[2][3]; uint32_t newCounts[2]; BoxNode *left,*right; rh=node->head[0]->p.c.r; rl=node->tail[0]->p.c.r; gh=node->head[1]->p.c.g; gl=node->tail[1]->p.c.g; bh=node->head[2]->p.c.b; bl=node->tail[2]->p.c.b; #ifdef TEST_SPLIT printf ("splitting node [%d %d %d] [%d %d %d] ",rl,gl,bl,rh,gh,bh); #endif f[0]=(rh-rl)*77; f[1]=(gh-gl)*150; f[2]=(bh-bl)*29; best=f[0]; axis=0; for (i=1;i<3;i++) { if (besttail[_i]->next[_i]) { printf ("tail is not tail\n"); printf ("node->tail[%d]->next[%d]=%p\n",_i,_i,node->tail[_i]->next[_i]); } if (node->head[_i]->prev[_i]) { printf ("head is not head\n"); printf ("node->head[%d]->prev[%d]=%p\n",_i,_i,node->head[_i]->prev[_i]); } } for (_i=0;_i<3;_i++) { for (_nextCount[_i]=0,_nextTest=node->head[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); for (_prevCount[_i]=0,_prevTest=node->tail[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); if (_nextTest!=node->tail[_i]) { printf ("next-list of axis %d does not end at tail\n",_i); } if (_prevTest!=node->head[_i]) { printf ("prev-list of axis %d does not end at head\n",_i); } for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); if (_nextTest!=node->head[_i]) { printf ("next-list of axis %d does not loop back to head\n",_i); } if (_prevTest!=node->tail[_i]) { printf ("prev-list of axis %d does not loop back to tail\n",_i); } } for (_i=1;_i<3;_i++) { if (_prevCount[_i]!=_prevCount[_i-1] || _nextCount[_i]!=_nextCount[_i-1] || _prevCount[_i]!=_nextCount[_i]) { printf ("{%d %d %d} {%d %d %d}\n", _prevCount[0], _prevCount[1], _prevCount[2], _nextCount[0], _nextCount[1], _nextCount[2]); } } } #endif node->axis=axis; if (!splitlists(node->head, node->tail, heads, tails, newCounts, axis, node->pixelCount)) { #ifndef NO_OUTPUT printf ("list split failed.\n"); #endif return 0; } #ifdef TEST_SPLIT if (!test_sorted(heads[0])) { printf ("bug in split"); exit(1); } if (!test_sorted(heads[1])) { printf ("bug in split"); exit(1); } #endif left=malloc(sizeof(BoxNode)); right=malloc(sizeof(BoxNode)); if (!left||!right) { return 0; } for(i=0;i<3;i++) { left->head[i]=heads[0][i]; left->tail[i]=tails[0][i]; right->head[i]=heads[1][i]; right->tail[i]=tails[1][i]; node->head[i]=NULL; node->tail[i]=NULL; } #ifdef TEST_SPLIT if (left->head[0]) { rh=left->head[0]->p.c.r; rl=left->tail[0]->p.c.r; gh=left->head[1]->p.c.g; gl=left->tail[1]->p.c.g; bh=left->head[2]->p.c.b; bl=left->tail[2]->p.c.b; printf (" left node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); } if (right->head[0]) { rh=right->head[0]->p.c.r; rl=right->tail[0]->p.c.r; gh=right->head[1]->p.c.g; gl=right->tail[1]->p.c.g; bh=right->head[2]->p.c.b; bl=right->tail[2]->p.c.b; printf (" right node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); } #endif left->l=left->r=NULL; right->l=right->r=NULL; left->axis=right->axis=-1; left->volume=right->volume=-1; left->pixelCount=newCounts[0]; right->pixelCount=newCounts[1]; node->l=left; node->r=right; return 1; } static BoxNode * median_cut(PixelList *hl[3], uint32_t imPixelCount, int nPixels) { PixelList *tl[3]; int i; BoxNode *root; Heap* h; BoxNode *thisNode; h=ImagingQuantHeapNew(box_heap_cmp); root=malloc(sizeof(BoxNode)); if (!root) { ImagingQuantHeapFree(h); return NULL; } for(i=0;i<3;i++) { for (tl[i]=hl[i];tl[i]&&tl[i]->next[i];tl[i]=tl[i]->next[i]); root->head[i]=hl[i]; root->tail[i]=tl[i]; } root->l=root->r=NULL; root->axis=-1; root->volume=-1; root->pixelCount=imPixelCount; ImagingQuantHeapAdd(h,(void *)root); while (--nPixels) { do { if (!ImagingQuantHeapRemove(h,(void **)&thisNode)) { goto done; } } while (compute_box_volume(thisNode)==1); if (!split(thisNode)) { #ifndef NO_OUTPUT printf ("Oops, split failed...\n"); #endif exit (1); } ImagingQuantHeapAdd(h,(void *)(thisNode->l)); ImagingQuantHeapAdd(h,(void *)(thisNode->r)); } done: ImagingQuantHeapFree(h); return root; } static void free_box_tree(BoxNode *n) { PixelList *p,*pp; if (n->l) free_box_tree(n->l); if (n->r) free_box_tree(n->r); for (p=n->head[0];p;p=pp) { pp=p->next[0]; free(p); } free(n); } #ifdef TEST_SPLIT_INTEGRITY static int checkContained(BoxNode *n,Pixel *pp) { if (n->l&&n->r) { return checkContained(n->l,pp)+checkContained(n->r,pp); } if (n->l||n->r) { #ifndef NO_OUTPUT printf ("box tree is dead\n"); #endif return 0; } if ( pp->c.r<=n->head[0]->p.c.r && pp->c.r>=n->tail[0]->p.c.r && pp->c.g<=n->head[1]->p.c.g && pp->c.g>=n->tail[1]->p.c.g && pp->c.b<=n->head[2]->p.c.b && pp->c.b>=n->tail[2]->p.c.b) { return 1; } return 0; } #endif static int annotate_hash_table(BoxNode *n,HashTable *h,uint32_t *box) { PixelList *p; PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); Pixel q; if (n->l&&n->r) { return annotate_hash_table(n->l,h,box) && annotate_hash_table(n->r,h,box); } if (n->l||n->r) { #ifndef NO_OUTPUT printf ("box tree is dead\n"); #endif return 0; } for (p=n->head[0];p;p=p->next[0]) { PIXEL_UNSCALE(&(p->p),&q,d->scale); if (!hashtable_insert(h,q,*box)) { #ifndef NO_OUTPUT printf ("hashtable insert failed\n"); #endif return 0; } } if (n->head[0]) (*box)++; return 1; } static int _sort_ulong_ptr_keys(const void *a, const void *b) { uint32_t A=**(uint32_t **)a; uint32_t B=**(uint32_t **)b; return (A==B)?0:((A*(skRow[k]));k--) { skRow[k]=skRow[k-1]; } if (k!=j) skRow[k]=skElt; } } return 1; } static int build_distance_tables(uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) { uint32_t i,j; for (i=0;i1) { printf ("pixel in two boxes\n"); for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } #endif if (!hashtable_lookup(medianBoxHash,pixelData[i],&paletteEntry)) { #ifndef NO_OUTPUT printf ("pixel lookup failed\n"); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } if (paletteEntry>=nPaletteEntries) { #ifndef NO_OUTPUT printf ("panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",(int)paletteEntry,(int)nPaletteEntries); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } avg[0][paletteEntry]+=pixelData[i].c.r; avg[1][paletteEntry]+=pixelData[i].c.g; avg[2][paletteEntry]+=pixelData[i].c.b; count[paletteEntry]++; } p=malloc(sizeof(Pixel)*nPaletteEntries); if (!p) { for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } for (i=0;i=nPaletteEntries) { #ifndef NO_OUTPUT printf ("scream\n"); #endif return 0; } avg[0][qp[i]]+=pixelData[i].c.r; avg[1][qp[i]]+=pixelData[i].c.g; avg[2][qp[i]]+=pixelData[i].c.b; count[qp[i]]++; } for (i=0;i { uint32_t bestmatch,bestdist,dist; HashTable *h2; printf ("nearest neighbour search (full search)..."); fflush(stdout); timer=clock(); h2=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); for (i=0;inew),&pixel); if (data->secondPixel || newDistdata->furthestDistance) { data->furthestDistance=oldDist; data->furthest.v=pixel.v; } } int quantize2(Pixel *pixelData, uint32_t nPixels, uint32_t nQuantPixels, Pixel **palette, uint32_t *paletteLength, uint32_t **quantizedPixels, int kmeans) { HashTable *h; uint32_t i; uint32_t mean[3]; Pixel *p; DistanceData data; uint32_t *qp; uint32_t *avgDist; uint32_t **avgDistSortKey; p=malloc(sizeof(Pixel)*nQuantPixels); if (!p) return 0; mean[0]=mean[1]=mean[2]=0; h=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); for (i=0;i 256) /* FIXME: for colors > 256, consider returning an RGB image instead (see @PIL205) */ return (Imaging) ImagingError_ValueError("bad number of colors"); if (strcmp(im->mode, "L") != 0 && strcmp(im->mode, "P") != 0 && strcmp(im->mode, "RGB") != 0 && strcmp(im->mode, "RGBA") !=0) return ImagingError_ModeError(); /* only octree supports RGBA */ if (!strcmp(im->mode, "RGBA") && mode != 2) return ImagingError_ModeError(); p = malloc(sizeof(Pixel) * im->xsize * im->ysize); if (!p) return ImagingError_MemoryError(); /* collect statistics */ /* FIXME: maybe we could load the hash tables directly from the image data? */ if (!strcmp(im->mode, "L")) { /* greyscale */ /* FIXME: converting a "L" image to "P" with 256 colors should be done by a simple copy... */ for (i = y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++, i++) p[i].c.r = p[i].c.g = p[i].c.b = im->image8[y][x]; } else if (!strcmp(im->mode, "P")) { /* palette */ pp = im->palette->palette; for (i = y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++, i++) { v = im->image8[y][x]; p[i].c.r = pp[v*4+0]; p[i].c.g = pp[v*4+1]; p[i].c.b = pp[v*4+2]; } } else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) { /* true colour */ for (i = y = 0; y < im->ysize; y++) for (x = 0; x < im->xsize; x++, i++) p[i].v = im->image32[y][x]; } else { free(p); return (Imaging) ImagingError_ValueError("internal error"); } ImagingSectionEnter(&cookie); switch (mode) { case 0: /* median cut */ result = quantize( p, im->xsize*im->ysize, colors, &palette, &paletteLength, &newData, kmeans ); break; case 1: /* maximum coverage */ result = quantize2( p, im->xsize*im->ysize, colors, &palette, &paletteLength, &newData, kmeans ); break; case 2: if (!strcmp(im->mode, "RGBA")) { withAlpha = 1; } result = quantize_octree( p, im->xsize*im->ysize, colors, &palette, &paletteLength, &newData, withAlpha ); break; default: result = 0; break; } free(p); ImagingSectionLeave(&cookie); if (result) { imOut = ImagingNew("P", im->xsize, im->ysize); ImagingSectionEnter(&cookie); for (i = y = 0; y < im->ysize; y++) for (x=0; x < im->xsize; x++) imOut->image8[y][x] = (unsigned char) newData[i++]; free(newData); pp = imOut->palette->palette; for (i = j = 0; i < (int) paletteLength; i++) { *pp++ = palette[i].c.r; *pp++ = palette[i].c.g; *pp++ = palette[i].c.b; if (withAlpha) { *pp++ = palette[i].c.a; } else { *pp++ = 255; } } for (; i < 256; i++) { *pp++ = 0; *pp++ = 0; *pp++ = 0; *pp++ = 255; } if (withAlpha) { strcpy(imOut->palette->mode, "RGBA"); } free(palette); ImagingSectionLeave(&cookie); return imOut; } else { return (Imaging) ImagingError_ValueError("quantization error"); } } pillow-2.3.0/libImaging/PcxEncode.c0000644000175000001440000000715612257506326015774 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * encoder for PCX data * * history: * 99-02-07 fl created * * Copyright (c) Fredrik Lundh 1999. * Copyright (c) Secret Labs AB 1999. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" enum { INIT, FETCH, ENCODE }; /* we're reusing "ystep" to store the last value */ #define LAST ystep int ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* ptr; int this; ptr = buf; if (!state->state) { /* sanity check */ if (state->xsize <= 0 || state->ysize <= 0) { state->errcode = IMAGING_CODEC_END; return 0; } state->bytes = (state->xsize*state->bits + 7) / 8; state->state = FETCH; } for (;;) switch (state->state) { case FETCH: /* get a line of data */ if (state->y >= state->ysize) { state->errcode = IMAGING_CODEC_END; return ptr - buf; } state->shuffle(state->buffer, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); state->y++; state->count = 1; state->LAST = state->buffer[0]; state->x = 1; state->state = ENCODE; /* fall through */ case ENCODE: /* compress this line */ /* when we arrive here, "count" contains the number of bytes having the value of "LAST" that we've already seen */ while (state->x < state->bytes) { if (state->count == 63) { /* this run is full; flush it */ if (bytes < 2) return ptr - buf; *ptr++ = 0xff; *ptr++ = state->LAST; bytes -= 2; state->count = 0; } this = state->buffer[state->x]; if (this == state->LAST) { /* extend the current run */ state->x++; state->count++; } else { /* start a new run */ if (state->count == 1 && (state->LAST < 0xc0)) { if (bytes < 1) return ptr - buf; *ptr++ = state->LAST; bytes--; } else { if (state->count > 0) { if (bytes < 2) return ptr - buf; *ptr++ = 0xc0 | state->count; *ptr++ = state->LAST; bytes -= 2; } } state->LAST = this; state->count = 1; state->x++; } } /* end of line; flush the current run */ if (state->count == 1 && (state->LAST < 0xc0)) { if (bytes < 1) return ptr - buf; *ptr++ = state->LAST; bytes--; } else { if (state->count > 0) { if (bytes < 2) return ptr - buf; *ptr++ = 0xc0 | state->count; *ptr++ = state->LAST; bytes -= 2; } } /* read next line */ state->state = FETCH; break; } } pillow-2.3.0/libImaging/Imaging.h0000644000175000001440000004654212257511054015500 0ustar dokousers/* * The Python Imaging Library * $Id$ * * declarations for the imaging core library * * Copyright (c) 1997-2005 by Secret Labs AB * Copyright (c) 1995-2005 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #include "ImPlatform.h" #if defined(__cplusplus) extern "C" { #endif #ifndef M_PI #define M_PI 3.14159265359 #endif /* -------------------------------------------------------------------- */ /* * Image data organization: * * mode bytes byte order * ------------------------------- * 1 1 1 * L 1 L * P 1 P * I 4 I (32-bit integer, native byte order) * F 4 F (32-bit IEEE float, native byte order) * RGB 4 R, G, B, - * RGBA 4 R, G, B, A * CMYK 4 C, M, Y, K * YCbCr 4 Y, Cb, Cr, - * Lab 4 L, a, b, - * * experimental modes (incomplete): * LA 4 L, -, -, A * PA 4 P, -, -, A * I;16 2 I (16-bit integer, native byte order) * * "P" is an 8-bit palette mode, which should be mapped through the * palette member to get an output image. Check palette->mode to * find the corresponding "real" mode. * * For information on how to access Imaging objects from your own C * extensions, see http://www.effbot.org/zone/pil-extending.htm */ /* Handles */ typedef struct ImagingMemoryInstance* Imaging; typedef struct ImagingAccessInstance* ImagingAccess; typedef struct ImagingHistogramInstance* ImagingHistogram; typedef struct ImagingOutlineInstance* ImagingOutline; typedef struct ImagingPaletteInstance* ImagingPalette; /* handle magics (used with PyCObject). */ #define IMAGING_MAGIC "PIL Imaging" /* pixel types */ #define IMAGING_TYPE_UINT8 0 #define IMAGING_TYPE_INT32 1 #define IMAGING_TYPE_FLOAT32 2 #define IMAGING_TYPE_SPECIAL 3 /* check mode for details */ #define IMAGING_MODE_LENGTH 6+1 /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */ struct ImagingMemoryInstance { /* Format */ char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */ int type; /* Data type (IMAGING_TYPE_*) */ int depth; /* Depth (ignored in this version) */ int bands; /* Number of bands (1, 2, 3, or 4) */ int xsize; /* Image dimension. */ int ysize; /* Colour palette (for "P" images only) */ ImagingPalette palette; /* Data pointers */ UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */ INT32 **image32; /* Set for 32-bit images (pixelsize=4). */ /* Internals */ char **image; /* Actual raster data. */ char *block; /* Set if data is allocated in a single block. */ int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */ int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ /* Virtual methods */ void (*destroy)(Imaging im); }; #define IMAGING_PIXEL_1(im,x,y) ((im)->image8[(y)][(x)]) #define IMAGING_PIXEL_L(im,x,y) ((im)->image8[(y)][(x)]) #define IMAGING_PIXEL_LA(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_P(im,x,y) ((im)->image8[(y)][(x)]) #define IMAGING_PIXEL_PA(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_I(im,x,y) ((im)->image32[(y)][(x)]) #define IMAGING_PIXEL_F(im,x,y) (((FLOAT32*)(im)->image32[y])[x]) #define IMAGING_PIXEL_RGB(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_RGBA(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_CMYK(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_YCbCr(im,x,y) ((im)->image[(y)][(x)*4]) #define IMAGING_PIXEL_UINT8(im,x,y) ((im)->image8[(y)][(x)]) #define IMAGING_PIXEL_INT32(im,x,y) ((im)->image32[(y)][(x)]) #define IMAGING_PIXEL_FLOAT32(im,x,y) (((FLOAT32*)(im)->image32[y])[x]) struct ImagingAccessInstance { const char* mode; void* (*line)(Imaging im, int x, int y); void (*get_pixel)(Imaging im, int x, int y, void* pixel); void (*put_pixel)(Imaging im, int x, int y, const void* pixel); }; struct ImagingHistogramInstance { /* Format */ char mode[IMAGING_MODE_LENGTH]; /* Band names (of corresponding source image) */ int bands; /* Number of bands (1, 3, or 4) */ /* Data */ long *histogram; /* Histogram (bands*256 longs) */ }; struct ImagingPaletteInstance { /* Format */ char mode[IMAGING_MODE_LENGTH]; /* Band names */ /* Data */ UINT8 palette[1024];/* Palette data (same format as image data) */ INT16* cache; /* Palette cache (used for predefined palettes) */ int keep_cache; /* This palette will be reused; keep cache */ }; /* Objects */ /* ------- */ extern int ImagingNewCount; extern Imaging ImagingNew(const char* mode, int xsize, int ysize); extern Imaging ImagingNew2(const char* mode, Imaging imOut, Imaging imIn); extern void ImagingDelete(Imaging im); extern Imaging ImagingNewBlock(const char* mode, int xsize, int ysize); extern Imaging ImagingNewArray(const char* mode, int xsize, int ysize); extern Imaging ImagingNewMap(const char* filename, int readonly, const char* mode, int xsize, int ysize); extern Imaging ImagingNewPrologue(const char *mode, unsigned xsize, unsigned ysize); extern Imaging ImagingNewPrologueSubtype(const char *mode, unsigned xsize, unsigned ysize, int structure_size); extern Imaging ImagingNewEpilogue(Imaging im); extern void ImagingCopyInfo(Imaging destination, Imaging source); extern void ImagingHistogramDelete(ImagingHistogram histogram); extern void ImagingAccessInit(void); extern ImagingAccess ImagingAccessNew(Imaging im); extern void _ImagingAccessDelete(Imaging im, ImagingAccess access); #define ImagingAccessDelete(im, access) /* nop, for now */ /*#define ImagingAccessDelete(im, access) \ ((access)->dynamic ? _ImagingAccessDelete((im), (access)), 0 : 0)) */ extern ImagingPalette ImagingPaletteNew(const char *mode); extern ImagingPalette ImagingPaletteNewBrowser(void); extern ImagingPalette ImagingPaletteDuplicate(ImagingPalette palette); extern void ImagingPaletteDelete(ImagingPalette palette); extern int ImagingPaletteCachePrepare(ImagingPalette palette); extern void ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b); extern void ImagingPaletteCacheDelete(ImagingPalette palette); #define ImagingPaletteCache(p, r, g, b)\ p->cache[(r>>2) + (g>>2)*64 + (b>>2)*64*64] extern Imaging ImagingQuantize(Imaging im, int colours, int mode, int kmeans); /* Threading */ /* --------- */ typedef void* ImagingSectionCookie; extern void ImagingSectionEnter(ImagingSectionCookie* cookie); extern void ImagingSectionLeave(ImagingSectionCookie* cookie); /* Exceptions */ /* ---------- */ extern void* ImagingError_IOError(void); extern void* ImagingError_MemoryError(void); extern void* ImagingError_ModeError(void); /* maps to ValueError by default */ extern void* ImagingError_Mismatch(void); /* maps to ValueError by default */ extern void* ImagingError_ValueError(const char* message); extern void ImagingError_Clear(void); /* Transform callbacks */ /* ------------------- */ /* standard transforms */ #define IMAGING_TRANSFORM_AFFINE 0 #define IMAGING_TRANSFORM_PERSPECTIVE 2 #define IMAGING_TRANSFORM_QUAD 3 /* standard filters */ #define IMAGING_TRANSFORM_NEAREST 0 #define IMAGING_TRANSFORM_ANTIALIAS 1 #define IMAGING_TRANSFORM_BILINEAR 2 #define IMAGING_TRANSFORM_BICUBIC 3 typedef int (*ImagingTransformMap)(double* X, double* Y, int x, int y, void* data); typedef int (*ImagingTransformFilter)(void* out, Imaging im, double x, double y, void* data); /* Image Manipulation Methods */ /* -------------------------- */ extern Imaging ImagingAlphaComposite(Imaging imIn1, Imaging imIn2); extern Imaging ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha); extern Imaging ImagingCopy(Imaging im); extern Imaging ImagingConvert(Imaging im, const char* mode, ImagingPalette palette, int dither); extern Imaging ImagingConvertInPlace(Imaging im, const char* mode); extern Imaging ImagingConvertMatrix(Imaging im, const char *mode, float m[]); extern Imaging ImagingConvertTransparent(Imaging im, const char *mode, int r, int g, int b); extern Imaging ImagingCrop(Imaging im, int x0, int y0, int x1, int y1); extern Imaging ImagingExpand(Imaging im, int x, int y, int mode); extern Imaging ImagingFill(Imaging im, const void* ink); extern int ImagingFill2( Imaging into, const void* ink, Imaging mask, int x0, int y0, int x1, int y1); extern Imaging ImagingFillBand(Imaging im, int band, int color); extern Imaging ImagingFillLinearGradient(const char* mode); extern Imaging ImagingFillRadialGradient(const char* mode); extern Imaging ImagingFilter( Imaging im, int xsize, int ysize, const FLOAT32* kernel, FLOAT32 offset, FLOAT32 divisor); extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius); extern Imaging ImagingGetBand(Imaging im, int band); extern int ImagingGetBBox(Imaging im, int bbox[4]); typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem; extern ImagingColorItem* ImagingGetColors(Imaging im, int maxcolors, int *colors); extern int ImagingGetExtrema(Imaging im, void *extrema); extern int ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj); extern ImagingHistogram ImagingGetHistogram( Imaging im, Imaging mask, void *extrema); extern Imaging ImagingModeFilter(Imaging im, int size); extern Imaging ImagingNegative(Imaging im); extern Imaging ImagingOffset(Imaging im, int xoffset, int yoffset); extern int ImagingPaste( Imaging into, Imaging im, Imaging mask, int x0, int y0, int x1, int y1); extern Imaging ImagingPoint( Imaging im, const char* tablemode, const void* table); extern Imaging ImagingPointTransform( Imaging imIn, double scale, double offset); extern Imaging ImagingPutBand(Imaging im, Imaging imIn, int band); extern Imaging ImagingRankFilter(Imaging im, int size, int rank); extern Imaging ImagingResize(Imaging imOut, Imaging imIn, int filter); extern Imaging ImagingRotate( Imaging imOut, Imaging imIn, double theta, int filter); extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); extern Imaging ImagingStretch(Imaging imOut, Imaging imIn, int filter); extern Imaging ImagingTransformPerspective( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filter, int fill); extern Imaging ImagingTransformAffine( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[6], int filter, int fill); extern Imaging ImagingTransformQuad( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filter, int fill); extern Imaging ImagingTransform( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, ImagingTransformMap transform, void* transform_data, ImagingTransformFilter filter, void* filter_data, int fill); extern Imaging ImagingUnsharpMask( Imaging im, Imaging imOut, float radius, int percent, int threshold); extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); /* Channel operations */ /* any mode, except "F" */ extern Imaging ImagingChopLighter(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopDarker(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopDifference(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopMultiply(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopScreen(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopAdd( Imaging imIn1, Imaging imIn2, float scale, int offset); extern Imaging ImagingChopSubtract( Imaging imIn1, Imaging imIn2, float scale, int offset); extern Imaging ImagingChopAddModulo(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2); /* "1" images only */ extern Imaging ImagingChopAnd(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopOr(Imaging imIn1, Imaging imIn2); extern Imaging ImagingChopXor(Imaging imIn1, Imaging imIn2); /* Image measurement */ extern void ImagingCrack(Imaging im, int x0, int y0); /* Graphics */ struct ImagingAffineMatrixInstance { float a[9]; }; typedef struct ImagingAffineMatrixInstance *ImagingAffineMatrix; extern int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int op); extern int ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink, int op); extern int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int fill, int op); extern int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, const void* ink, int fill, int op); extern int ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink, int op); extern int ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink, int width, int op); extern int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int fill, int op); extern int ImagingDrawPoint(Imaging im, int x, int y, const void* ink, int op); extern int ImagingDrawPolygon(Imaging im, int points, int *xy, const void* ink, int fill, int op); extern int ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, const void* ink, int fill, int op); /* Level 2 graphics (WORK IN PROGRESS) */ extern ImagingOutline ImagingOutlineNew(void); extern void ImagingOutlineDelete(ImagingOutline outline); extern int ImagingDrawOutline(Imaging im, ImagingOutline outline, const void* ink, int fill, int op); extern int ImagingOutlineMove(ImagingOutline outline, float x, float y); extern int ImagingOutlineLine(ImagingOutline outline, float x, float y); extern int ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3); extern int ImagingOutlineTransform(ImagingOutline outline, double a[6]); extern int ImagingOutlineClose(ImagingOutline outline); /* Special effects */ extern Imaging ImagingEffectSpread(Imaging imIn, int distance); extern Imaging ImagingEffectNoise(int xsize, int ysize, float sigma); extern Imaging ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality); /* Obsolete */ extern int ImagingToString(Imaging im, int orientation, char *buffer); extern int ImagingFromString(Imaging im, int orientation, char *buffer); /* File I/O */ /* -------- */ /* Built-in drivers */ extern Imaging ImagingOpenPPM(const char* filename); extern int ImagingSavePPM(Imaging im, const char* filename); /* Utility functions */ extern UINT32 ImagingCRC32(UINT32 crc, UINT8* buffer, int bytes); /* Codecs */ typedef struct ImagingCodecStateInstance *ImagingCodecState; typedef int (*ImagingCodec)(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #ifdef HAVE_LIBJPEG extern int ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingJpegDecodeCleanup(ImagingCodecState state); extern int ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #endif extern int ImagingLzwDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #ifdef HAVE_LIBTIFF extern int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #endif #ifdef HAVE_LIBMPEG extern int ImagingMpegDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #endif extern int ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingPackbitsDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingTgaRleDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #ifdef HAVE_LIBZ extern int ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); #endif typedef void (*ImagingShuffler)(UINT8* out, const UINT8* in, int pixels); /* Public shufflers */ extern void ImagingPackRGB(UINT8* out, const UINT8* in, int pixels); extern void ImagingPackBGR(UINT8* out, const UINT8* in, int pixels); extern void ImagingUnpackRGB(UINT8* out, const UINT8* in, int pixels); extern void ImagingUnpackBGR(UINT8* out, const UINT8* in, int pixels); extern void ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels); extern void ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels); extern void ImagingUnpackYCbCr(UINT8* out, const UINT8* in, int pixels); extern void ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels); extern void ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels); extern ImagingShuffler ImagingFindUnpacker(const char* mode, const char* rawmode, int* bits_out); extern ImagingShuffler ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out); struct ImagingCodecStateInstance { int count; int state; int errcode; int x, y; int ystep; int xsize, ysize, xoff, yoff; ImagingShuffler shuffle; int bits, bytes; UINT8 *buffer; void *context; }; /* Errcodes */ #define IMAGING_CODEC_END 1 #define IMAGING_CODEC_OVERRUN -1 #define IMAGING_CODEC_BROKEN -2 #define IMAGING_CODEC_UNKNOWN -3 #define IMAGING_CODEC_CONFIG -8 #define IMAGING_CODEC_MEMORY -9 #if defined(__cplusplus) } #endif pillow-2.3.0/libImaging/QuantOctree.c0000644000175000001440000003365712257506326016363 0ustar dokousers/* Copyright (c) 2010 Oliver Tonnhofer , Omniscale // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. */ /* // This file implements a variation of the octree color quantization algorithm. */ #include #include #include #include "QuantOctree.h" typedef struct _ColorBucket{ /* contains palette index when used for look up cube */ uint32_t count; uint64_t r; uint64_t g; uint64_t b; uint64_t a; } *ColorBucket; typedef struct _ColorCube{ unsigned int rBits, gBits, bBits, aBits; unsigned int rWidth, gWidth, bWidth, aWidth; unsigned int rOffset, gOffset, bOffset, aOffset; long size; ColorBucket buckets; } *ColorCube; #define MAX(a, b) (a)>(b) ? (a) : (b) static ColorCube new_color_cube(int r, int g, int b, int a) { ColorCube cube; cube = malloc(sizeof(struct _ColorCube)); if (!cube) return NULL; cube->rBits = MAX(r, 0); cube->gBits = MAX(g, 0); cube->bBits = MAX(b, 0); cube->aBits = MAX(a, 0); /* the width of the cube for each dimension */ cube->rWidth = 1<rBits; cube->gWidth = 1<gBits; cube->bWidth = 1<bBits; cube->aWidth = 1<aBits; /* the offsets of each color */ cube->rOffset = cube->gBits + cube->bBits + cube->aBits; cube->gOffset = cube->bBits + cube->aBits; cube->bOffset = cube->aBits; cube->aOffset = 0; /* the number of color buckets */ cube->size = cube->rWidth * cube->gWidth * cube->bWidth * cube->aWidth; cube->buckets = calloc(cube->size, sizeof(struct _ColorBucket)); if (!cube->buckets) { free(cube); return NULL; } return cube; } static void free_color_cube(ColorCube cube) { if (cube != NULL) { free(cube->buckets); free(cube); } } static long color_bucket_offset_pos(const ColorCube cube, unsigned int r, unsigned int g, unsigned int b, unsigned int a) { return r<rOffset | g<gOffset | b<bOffset | a<aOffset; } static long color_bucket_offset(const ColorCube cube, const Pixel *p) { unsigned int r = p->c.r>>(8-cube->rBits); unsigned int g = p->c.g>>(8-cube->gBits); unsigned int b = p->c.b>>(8-cube->bBits); unsigned int a = p->c.a>>(8-cube->aBits); return color_bucket_offset_pos(cube, r, g, b, a); } static ColorBucket color_bucket_from_cube(const ColorCube cube, const Pixel *p) { unsigned int offset = color_bucket_offset(cube, p); return &cube->buckets[offset]; } static void add_color_to_color_cube(const ColorCube cube, const Pixel *p) { ColorBucket bucket = color_bucket_from_cube(cube, p); bucket->count += 1; bucket->r += p->c.r; bucket->g += p->c.g; bucket->b += p->c.b; bucket->a += p->c.a; } static long count_used_color_buckets(const ColorCube cube) { long usedBuckets = 0; long i; for (i=0; i < cube->size; i++) { if (cube->buckets[i].count > 0) { usedBuckets += 1; } } return usedBuckets; } static void avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { float count = bucket->count; dst->c.r = (int)(bucket->r / count); dst->c.g = (int)(bucket->g / count); dst->c.b = (int)(bucket->b / count); dst->c.a = (int)(bucket->a / count); } static int compare_bucket_count(const ColorBucket a, const ColorBucket b) { return b->count - a->count; } static ColorBucket create_sorted_color_palette(const ColorCube cube) { ColorBucket buckets; buckets = malloc(sizeof(struct _ColorBucket)*cube->size); if (!buckets) return NULL; memcpy(buckets, cube->buckets, sizeof(struct _ColorBucket)*cube->size); qsort(buckets, cube->size, sizeof(struct _ColorBucket), (int (*)(void const *, void const *))&compare_bucket_count); return buckets; } void add_bucket_values(ColorBucket src, ColorBucket dst) { dst->count += src->count; dst->r += src->r; dst->g += src->g; dst->b += src->b; dst->a += src->a; } /* expand or shrink a given cube to level */ static ColorCube copy_color_cube(const ColorCube cube, int rBits, int gBits, int bBits, int aBits) { unsigned int r, g, b, a; long src_pos, dst_pos; unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0}; unsigned int width[4]; ColorCube result; result = new_color_cube(rBits, gBits, bBits, aBits); if (!result) return NULL; if (cube->rBits > rBits) { dst_reduce[0] = cube->rBits - result->rBits; width[0] = cube->rWidth; } else { src_reduce[0] = result->rBits - cube->rBits; width[0] = result->rWidth; } if (cube->gBits > gBits) { dst_reduce[1] = cube->gBits - result->gBits; width[1] = cube->gWidth; } else { src_reduce[1] = result->gBits - cube->gBits; width[1] = result->gWidth; } if (cube->bBits > bBits) { dst_reduce[2] = cube->bBits - result->bBits; width[2] = cube->bWidth; } else { src_reduce[2] = result->bBits - cube->bBits; width[2] = result->bWidth; } if (cube->aBits > aBits) { dst_reduce[3] = cube->aBits - result->aBits; width[3] = cube->aWidth; } else { src_reduce[3] = result->aBits - cube->aBits; width[3] = result->aWidth; } for (r=0; r>src_reduce[0], g>>src_reduce[1], b>>src_reduce[2], a>>src_reduce[3]); dst_pos = color_bucket_offset_pos(result, r>>dst_reduce[0], g>>dst_reduce[1], b>>dst_reduce[2], a>>dst_reduce[3]); add_bucket_values( &cube->buckets[src_pos], &result->buckets[dst_pos] ); } } } } return result; } void subtract_color_buckets(ColorCube cube, ColorBucket buckets, long nBuckets) { ColorBucket minuend, subtrahend; long i; Pixel p; for (i=0; icount -= subtrahend->count; minuend->r -= subtrahend->r; minuend->g -= subtrahend->g; minuend->b -= subtrahend->b; minuend->a -= subtrahend->a; } } static void set_lookup_value(const ColorCube cube, const Pixel *p, long value) { ColorBucket bucket = color_bucket_from_cube(cube, p); bucket->count = value; } uint64_t lookup_color(const ColorCube cube, const Pixel *p) { ColorBucket bucket = color_bucket_from_cube(cube, p); return bucket->count; } void add_lookup_buckets(ColorCube cube, ColorBucket palette, long nColors, long offset) { long i; Pixel p; for (i=offset; i 64). For a quantization to 256 colors all 64 coarse colors will be used plus the 192 most used color buckets from the fine color cube. The average of all colors within one bucket is used as the actual color for that bucket. For images with alpha the cubes gets a forth dimension, 8x16x8x8 and 4x4x4x4. */ /* create fine cube */ fineCube = new_color_cube(cubeBits[0], cubeBits[1], cubeBits[2], cubeBits[3]); if (!fineCube) goto error; for (i=0; i nQuantPixels) nCoarseColors = nQuantPixels; /* how many space do we have in our palette for fine colors? */ nFineColors = nQuantPixels - nCoarseColors; /* create fine color palette */ paletteBucketsFine = create_sorted_color_palette(fineCube); if (!paletteBucketsFine) goto error; /* remove the used fine colors from the coarse cube */ subtract_color_buckets(coarseCube, paletteBucketsFine, nFineColors); /* did the substraction cleared one or more coarse bucket? */ while (nCoarseColors > count_used_color_buckets(coarseCube)) { /* then we can use the free buckets for fine colors */ nAlreadySubtracted = nFineColors; nCoarseColors = count_used_color_buckets(coarseCube); nFineColors = nQuantPixels - nCoarseColors; subtract_color_buckets(coarseCube, &paletteBucketsFine[nAlreadySubtracted], nFineColors-nAlreadySubtracted); } /* create our palette buckets with fine and coarse combined */ paletteBucketsCoarse = create_sorted_color_palette(coarseCube); if (!paletteBucketsCoarse) goto error; paletteBuckets = combined_palette(paletteBucketsCoarse, nCoarseColors, paletteBucketsFine, nFineColors); free(paletteBucketsFine); paletteBucketsFine = NULL; free(paletteBucketsCoarse); paletteBucketsCoarse = NULL; /* add all coarse colors to our coarse lookup cube. */ coarseLookupCube = new_color_cube(cubeBits[4], cubeBits[5], cubeBits[6], cubeBits[7]); if (!coarseLookupCube) goto error; add_lookup_buckets(coarseLookupCube, paletteBuckets, nCoarseColors, 0); /* expand coarse cube (64) to larger fine cube (4k). the value of each coarse bucket is then present in the according 64 fine buckets. */ lookupCube = copy_color_cube(coarseLookupCube, cubeBits[0], cubeBits[1], cubeBits[2], cubeBits[3]); if (!lookupCube) goto error; /* add fine colors to the lookup cube */ add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); /* create result pixles and map palatte indices */ qp = malloc(sizeof(Pixel)*nPixels); if (!qp) goto error; map_image_pixels(pixelData, nPixels, lookupCube, qp); /* convert palette buckets to RGB pixel palette */ *palette = create_palette_array(paletteBuckets, nQuantPixels); if (!(*palette)) goto error; *quantizedPixels = qp; *paletteLength = nQuantPixels; free_color_cube(coarseCube); free_color_cube(fineCube); free_color_cube(lookupCube); free_color_cube(coarseLookupCube); free(paletteBuckets); return 1; error: /* everything is initialized to NULL so we are safe to call free */ free(qp); free_color_cube(lookupCube); free_color_cube(coarseLookupCube); free(paletteBucketsCoarse); free(paletteBucketsFine); free_color_cube(coarseCube); free_color_cube(fineCube); return 0; } pillow-2.3.0/libImaging/RawDecode.c0000644000175000001440000000303412257506326015750 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for raw (uncompressed) image data * * history: * 96-03-07 fl rewritten * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include "Raw.h" int ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { enum { LINE = 1, SKIP }; RAWSTATE* rawstate = state->context; UINT8* ptr; if (state->state == 0) { /* Initialize context variables */ /* get size of image data and padding */ state->bytes = (state->xsize * state->bits + 7) / 8; rawstate->skip = (rawstate->stride) ? rawstate->stride - state->bytes : 0; /* check image orientation */ if (state->ystep < 0) { state->y = state->ysize-1; state->ystep = -1; } else state->ystep = 1; state->state = LINE; } ptr = buf; for (;;) { if (state->state == SKIP) { /* Skip padding between lines */ if (bytes < rawstate->skip) return ptr - buf; ptr += rawstate->skip; bytes -= rawstate->skip; state->state = LINE; } if (bytes < state->bytes) return ptr - buf; /* Unpack data */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, ptr, state->xsize); ptr += state->bytes; bytes -= state->bytes; state->y += state->ystep; if (state->y < 0 || state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } state->state = SKIP; } } pillow-2.3.0/libImaging/TgaRleDecode.c0000644000175000001440000000413712257506326016402 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for Targa RLE data. * * history: * 97-01-04 fl created * 98-09-11 fl don't one byte per pixel; take orientation into account * * Copyright (c) Fredrik Lundh 1997. * Copyright (c) Secret Labs AB 1997-98. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingTgaRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { int n, depth; UINT8* ptr; ptr = buf; if (state->state == 0) { /* check image orientation */ if (state->ystep < 0) { state->y = state->ysize-1; state->ystep = -1; } else state->ystep = 1; state->state = 1; } depth = state->count; for (;;) { if (bytes < 1) return ptr - buf; if (ptr[0] & 0x80) { /* Run (1 + pixelsize bytes) */ if (bytes < 1 + depth) break; n = depth * ((ptr[0] & 0x7f) + 1); if (state->x + n > state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } if (depth == 1) memset(state->buffer + state->x, ptr[1], n); else { int i; for (i = 0; i < n; i += depth) memcpy(state->buffer + state->x + i, ptr+1, depth); } ptr += 1 + depth; bytes -= 1 + depth; } else { /* Literal (1+n+1 bytes block) */ n = depth * (ptr[0] + 1); if (bytes < 1 + n) break; if (state->x + n > state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } memcpy(state->buffer + state->x, ptr + 1, n); ptr += 1 + n; bytes -= 1 + n; } state->x += n; if (state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; state->y += state->ystep; if (state->y < 0 || state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } return ptr - buf; } pillow-2.3.0/libImaging/PcxDecode.c0000644000175000001440000000230212257506326015746 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for PCX image data. * * history: * 95-09-14 fl Created * * Copyright (c) Fredrik Lundh 1995. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8 n; UINT8* ptr; ptr = buf; for (;;) { if (bytes < 1) return ptr - buf; if ((*ptr & 0xC0) == 0xC0) { /* Run */ if (bytes < 2) return ptr - buf; n = ptr[0] & 0x3F; while (n > 0) { if (state->x >= state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; break; } state->buffer[state->x++] = ptr[1]; n--; } ptr += 2; bytes -= 2; } else { /* Literal */ state->buffer[state->x++] = ptr[0]; ptr++; bytes--; } if (state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } } pillow-2.3.0/libImaging/QuantOctree.h0000644000175000001440000000035612257506326016356 0ustar dokousers#ifndef __QUANT_OCTREE_H__ #define __QUANT_OCTREE_H__ #include "QuantTypes.h" int quantize_octree(Pixel *, uint32_t, uint32_t, Pixel **, uint32_t *, uint32_t **, int); #endif pillow-2.3.0/libImaging/QuantHeap.c0000644000175000001440000000543212257506326016005 0ustar dokousers/* * The Python Imaging Library * $Id$ * * heap data type used by the image quantizer * * history: * 98-09-10 tjs Contributed * 98-12-29 fl Added to PIL 1.0b1 * * Written by Toby J Sargeant . * * Copyright (c) 1998 by Toby J Sargeant * Copyright (c) 1998 by Secret Labs AB * * See the README file for information on usage and redistribution. */ #include #include #include #include #include "QuantHeap.h" struct _Heap { void **heap; int heapsize; int heapcount; HeapCmpFunc cf; }; #define INITIAL_SIZE 256 // #define DEBUG #ifdef DEBUG static int _heap_test(Heap *); #endif void ImagingQuantHeapFree(Heap *h) { free(h->heap); free(h); } static int _heap_grow(Heap *h,int newsize) { void *newheap; if (!newsize) newsize=h->heapsize<<1; if (newsizeheapsize) return 0; newheap=malloc(sizeof(void *)*newsize); if (!newheap) return 0; memcpy(newheap,h->heap,sizeof(void *)*h->heapsize); free(h->heap); h->heap=newheap; h->heapsize=newsize; return 1; } #ifdef DEBUG static int _heap_test(Heap *h) { int k; for (k=1;k*2<=h->heapcount;k++) { if (h->cf(h,h->heap[k],h->heap[k*2])<0) { printf ("heap is bad\n"); return 0; } if (k*2+1<=h->heapcount && h->cf(h,h->heap[k],h->heap[k*2+1])<0) { printf ("heap is bad\n"); return 0; } } return 1; } #endif int ImagingQuantHeapRemove(Heap* h,void **r) { int k,l; void *v; if (!h->heapcount) { return 0; } *r=h->heap[1]; v=h->heap[h->heapcount--]; for (k=1;k*2<=h->heapcount;k=l) { l=k*2; if (lheapcount) { if (h->cf(h,h->heap[l],h->heap[l+1])<0) { l++; } } if (h->cf(h,v,h->heap[l])>0) { break; } h->heap[k]=h->heap[l]; } h->heap[k]=v; #ifdef DEBUG if (!_heap_test(h)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } #endif return 1; } int ImagingQuantHeapAdd(Heap *h,void *val) { int k; if (h->heapcount==h->heapsize-1) { _heap_grow(h,0); } k=++h->heapcount; while (k!=1) { if (h->cf(h,val,h->heap[k/2])<=0) { break; } h->heap[k]=h->heap[k/2]; k>>=1; } h->heap[k]=val; #ifdef DEBUG if (!_heap_test(h)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } #endif return 1; } int ImagingQuantHeapTop(Heap *h,void **r) { if (!h->heapcount) { return 0; } *r=h->heap[1]; return 1; } Heap *ImagingQuantHeapNew(HeapCmpFunc cf) { Heap *h; h=malloc(sizeof(Heap)); if (!h) return NULL; h->heapsize=INITIAL_SIZE; h->heap=malloc(sizeof(void *)*h->heapsize); if (!h->heap) { free(h); return NULL; } h->heapcount=0; h->cf=cf; return h; } pillow-2.3.0/libImaging/GifEncode.c0000644000175000001440000002113112257506326015734 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * encoder for uncompressed GIF data * * history: * 97-01-05 fl created (writes uncompressed data) * 97-08-27 fl fixed off-by-one error in buffer size test * 98-07-09 fl added interlace write support * 99-02-07 fl rewritten, now uses a run-length encoding strategy * 99-02-08 fl improved run-length encoding for long runs * * Copyright (c) Secret Labs AB 1997-99. * Copyright (c) Fredrik Lundh 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include "Gif.h" /* codes from 0 to 255 are literals */ #define CLEAR_CODE 256 #define EOF_CODE 257 #define FIRST_CODE 258 #define LAST_CODE 511 enum { INIT, ENCODE, ENCODE_EOF, FLUSH, EXIT }; /* to make things a little less complicated, we use a simple output queue to hold completed blocks. the following inlined function adds a byte to the current block. it allocates a new block if necessary. */ static inline int emit(GIFENCODERSTATE *context, int byte) { /* write a byte to the output buffer */ if (!context->block || context->block->size == 255) { GIFENCODERBLOCK* block; /* no room in the current block (or no current block); allocate a new one */ /* add current block to end of flush queue */ if (context->block) { block = context->flush; while (block && block->next) block = block->next; if (block) block->next = context->block; else context->flush = context->block; } /* get a new block */ if (context->free) { block = context->free; context->free = NULL; } else { block = malloc(sizeof(GIFENCODERBLOCK)); if (!block) return 0; } block->size = 0; block->next = NULL; context->block = block; } /* write new byte to block */ context->block->data[context->block->size++] = byte; return 1; } /* write a code word to the current block. this is a macro to make sure it's inlined on all platforms */ #define EMIT(code) {\ context->bitbuffer |= ((INT32) (code)) << context->bitcount;\ context->bitcount += 9;\ while (context->bitcount >= 8) {\ if (!emit(context, (UINT8) context->bitbuffer)) {\ state->errcode = IMAGING_CODEC_MEMORY;\ return 0;\ }\ context->bitbuffer >>= 8;\ context->bitcount -= 8;\ }\ } /* write a run. we use a combination of literals and combinations of literals. this can give quite decent compression for images with long stretches of identical pixels. but remember: if you want really good compression, use another file format. */ #define EMIT_RUN(label) {\ label:\ while (context->count > 0) {\ int run = 2;\ EMIT(context->last);\ context->count--;\ if (state->count++ == LAST_CODE) {\ EMIT(CLEAR_CODE);\ state->count = FIRST_CODE;\ goto label;\ }\ while (context->count >= run) {\ EMIT(state->count - 1);\ context->count -= run;\ run++;\ if (state->count++ == LAST_CODE) {\ EMIT(CLEAR_CODE);\ state->count = FIRST_CODE;\ goto label;\ }\ }\ if (context->count > 1) {\ EMIT(state->count - 1 - (run - context->count));\ context->count = 0;\ if (state->count++ == LAST_CODE) {\ EMIT(CLEAR_CODE);\ state->count = FIRST_CODE;\ }\ break;\ }\ }\ } int ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* ptr; int this; GIFENCODERBLOCK* block; GIFENCODERSTATE *context = (GIFENCODERSTATE*) state->context; if (!state->state) { /* place a clear code in the output buffer */ context->bitbuffer = CLEAR_CODE; context->bitcount = 9; state->count = FIRST_CODE; if (context->interlace) { context->interlace = 1; context->step = 8; } else context->step = 1; context->last = -1; /* sanity check */ if (state->xsize <= 0 || state->ysize <= 0) state->state = ENCODE_EOF; } ptr = buf; for (;;) switch (state->state) { case INIT: case ENCODE: /* identify and store a run of pixels */ if (state->x == 0 || state->x >= state->xsize) { if (!context->interlace && state->y >= state->ysize) { state->state = ENCODE_EOF; break; } if (context->flush) { state->state = FLUSH; break; } /* get another line of data */ state->shuffle( state->buffer, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize ); state->x = 0; if (state->state == INIT) { /* preload the run-length buffer and get going */ context->last = state->buffer[0]; context->count = state->x = 1; state->state = ENCODE; } /* step forward, according to the interlace settings */ state->y += context->step; while (context->interlace && state->y >= state->ysize) switch (context->interlace) { case 1: state->y = 4; context->interlace = 2; break; case 2: context->step = 4; state->y = 2; context->interlace = 3; break; case 3: context->step = 2; state->y = 1; context->interlace = 0; break; default: /* just make sure we don't loop forever */ context->interlace = 0; } } this = state->buffer[state->x++]; if (this == context->last) context->count++; else { EMIT_RUN(label1); context->last = this; context->count = 1; } break; case ENCODE_EOF: /* write the final run */ EMIT_RUN(label2); /* write an end of image marker */ EMIT(EOF_CODE); /* empty the bit buffer */ while (context->bitcount > 0) { if (!emit(context, (UINT8) context->bitbuffer)) { state->errcode = IMAGING_CODEC_MEMORY; return 0; } context->bitbuffer >>= 8; context->bitcount -= 8; } /* flush the last block, and exit */ if (context->block) { GIFENCODERBLOCK* block; block = context->flush; while (block && block->next) block = block->next; if (block) block->next = context->block; else context->flush = context->block; context->block = NULL; } state->state = EXIT; /* fall through... */ case EXIT: case FLUSH: while (context->flush) { /* get a block from the flush queue */ block = context->flush; if (block->size > 0) { /* make sure it fits into the output buffer */ if (bytes < block->size+1) return ptr - buf; ptr[0] = block->size; memcpy(ptr+1, block->data, block->size); ptr += block->size+1; bytes -= block->size+1; } context->flush = block->next; if (context->free) free(context->free); context->free = block; } if (state->state == EXIT) { /* this was the last block! */ if (context->free) free(context->free); state->errcode = IMAGING_CODEC_END; return ptr - buf; } state->state = ENCODE; break; } } pillow-2.3.0/libImaging/Paste.c0000644000175000001440000003522212257506326015173 0ustar dokousers/* * The Python Imaging Library * $Id$ * * paste image on another image * * history: * 96-03-27 fl Created * 96-07-16 fl Support "1", "L" and "RGBA" masks * 96-08-16 fl Merged with opaque paste * 97-01-17 fl Faster blending, added support for RGBa images * 97-08-27 fl Faster masking for 32-bit images * 98-02-02 fl Fixed MULDIV255 macro for gcc * 99-02-02 fl Added "RGBa" mask support * 99-02-06 fl Rewritten. Added support for masked fill operations. * 99-12-08 fl Fixed matte fill. * * Copyright (c) Fredrik Lundh 1996-97. * Copyright (c) Secret Labs AB 1997-99. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* like (a * b + 127) / 255), but much faster on most platforms */ #define MULDIV255NEW(a, b, tmp)\ (tmp = (a) * (b) + 128, ((((tmp) >> 8) + (tmp)) >> 8)) #define MULDIV255OLD(a, b, tmp)\ (((a) * (b) + 127) / 255) #define MULDIV255 MULDIV255NEW #define BLEND(mask, in1, in2, tmp1, tmp2)\ (MULDIV255(in1, 255 - mask, tmp1) + MULDIV255(in2, mask, tmp2)) #define PREBLEND(mask, in1, in2, tmp1)\ (MULDIV255(in1, 255 - mask, tmp1) + in2) static inline void paste(Imaging imOut, Imaging imIn, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* paste opaque region */ int y; dx *= pixelsize; sx *= pixelsize; xsize *= pixelsize; for (y = 0; y < ysize; y++) memcpy(imOut->image[y+dy]+dx, imIn->image[y+sy]+sx, xsize); } static inline void paste_mask_1(Imaging imOut, Imaging imIn, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* paste with mode "1" mask */ int x, y; if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* in = imIn->image8[y+sy]+sx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { if (*mask++) *out = *in; out++, in++; } } } else { for (y = 0; y < ysize; y++) { INT32* out = imOut->image32[y+dy]+dx; INT32* in = imIn->image32[y+sy]+sx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { if (*mask++) *out = *in; out++, in++; } } } } static inline void paste_mask_L(Imaging imOut, Imaging imIn, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* paste with mode "L" matte */ int x, y, i; unsigned int tmp1, tmp2; if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* in = imIn->image8[y+sy]+sx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, *in, tmp1, tmp2); out++, in++, mask++; } } } else { for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; UINT8* in = (UINT8*) imIn->image[y+sy]+sx*pixelsize; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = BLEND(*mask, *out, *in, tmp1, tmp2); out++, in++; } mask++; } } } } static inline void paste_mask_RGBA(Imaging imOut, Imaging imIn, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* paste with mode "RGBA" matte */ int x, y, i; unsigned int tmp1, tmp2; if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* in = imIn->image8[y+sy]+sx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, *in, tmp1, tmp2); out++, in++, mask += 4; } } } else { for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; UINT8* in = (UINT8*) imIn->image[y+sy]+sx*pixelsize; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = BLEND(*mask, *out, *in, tmp1, tmp2); out++, in++; } mask += 4; } } } } static inline void paste_mask_RGBa(Imaging imOut, Imaging imIn, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* paste with mode "RGBa" matte */ int x, y, i; unsigned int tmp1; if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* in = imIn->image8[y+sy]+sx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; for (x = 0; x < xsize; x++) { *out = PREBLEND(*mask, *out, *in, tmp1); out++, in++, mask += 4; } } } else { for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; UINT8* in = (UINT8*) imIn->image[y+sy]+sx*pixelsize; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = PREBLEND(*mask, *out, *in, tmp1); out++, in++; } mask += 4; } } } } int ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, int dx0, int dy0, int dx1, int dy1) { int xsize, ysize; int pixelsize; int sx0, sy0; ImagingSectionCookie cookie; if (!imOut || !imIn) { (void) ImagingError_ModeError(); return -1; } pixelsize = imOut->pixelsize; xsize = dx1 - dx0; ysize = dy1 - dy0; if (xsize != imIn->xsize || ysize != imIn->ysize || pixelsize != imIn->pixelsize) { (void) ImagingError_Mismatch(); return -1; } if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { (void) ImagingError_Mismatch(); return -1; } /* Determine which region to copy */ sx0 = sy0 = 0; if (dx0 < 0) xsize += dx0, sx0 = -dx0, dx0 = 0; if (dx0 + xsize > imOut->xsize) xsize = imOut->xsize - dx0; if (dy0 < 0) ysize += dy0, sy0 = -dy0, dy0 = 0; if (dy0 + ysize > imOut->ysize) ysize = imOut->ysize - dy0; if (xsize <= 0 || ysize <= 0) return 0; if (!imMask) { ImagingSectionEnter(&cookie); paste(imOut, imIn, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "1") == 0) { ImagingSectionEnter(&cookie); paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "L") == 0) { ImagingSectionEnter(&cookie); paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBA") == 0) { ImagingSectionEnter(&cookie); paste_mask_RGBA(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBa") == 0) { ImagingSectionEnter(&cookie); paste_mask_RGBa(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else { (void) ImagingError_ValueError("bad transparency mask"); return -1; } return 0; } static inline void fill(Imaging imOut, const void* ink_, int dx, int dy, int xsize, int ysize, int pixelsize) { /* fill opaque region */ int x, y; UINT8 ink8 = 0; INT32 ink32 = 0L; memcpy(&ink32, ink_, pixelsize); memcpy(&ink8, ink_, sizeof(ink8)); if (imOut->image8 || ink32 == 0L) { dx *= pixelsize; xsize *= pixelsize; for (y = 0; y < ysize; y++) memset(imOut->image[y+dy]+dx, ink8, xsize); } else { for (y = 0; y < ysize; y++) { INT32* out = imOut->image32[y+dy]+dx; for (x = 0; x < xsize; x++) out[x] = ink32; } } } static inline void fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* fill with mode "1" mask */ int x, y; UINT8 ink8 = 0; INT32 ink32 = 0L; memcpy(&ink32, ink_, pixelsize); memcpy(&ink8, ink_, sizeof(ink8)); if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { if (*mask++) *out = ink8; out++; } } } else { for (y = 0; y < ysize; y++) { INT32* out = imOut->image32[y+dy]+dx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { if (*mask++) *out = ink32; out++; } } } } static inline void fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* fill with mode "L" matte */ int x, y, i; unsigned int tmp1, tmp2; if (imOut->image8) { for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* mask = imMask->image8[y+sy]+sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, ink[0], tmp1, tmp2); out++, mask++; } } } else { for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = BLEND(*mask, *out, ink[i], tmp1, tmp2); out++; } mask++; } } } } static inline void fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* fill with mode "RGBA" matte */ int x, y, i; unsigned int tmp1, tmp2; if (imOut->image8) { sx = sx*4+3; for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, ink[0], tmp1, tmp2); out++, mask += 4; } } } else { dx *= pixelsize; sx = sx*4 + 3; for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = BLEND(*mask, *out, ink[i], tmp1, tmp2); out++; } mask += 4; } } } } static inline void fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask, int dx, int dy, int sx, int sy, int xsize, int ysize, int pixelsize) { /* fill with mode "RGBa" matte */ int x, y, i; unsigned int tmp1; if (imOut->image8) { sx = sx*4 + 3; for (y = 0; y < ysize; y++) { UINT8* out = imOut->image8[y+dy]+dx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { *out = PREBLEND(*mask, *out, ink[0], tmp1); out++, mask += 4; } } } else { dx *= pixelsize; sx = sx*4 + 3; for (y = 0; y < ysize; y++) { UINT8* out = (UINT8*) imOut->image[y+dy]+dx; UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = PREBLEND(*mask, *out, ink[i], tmp1); out++; } mask += 4; } } } } int ImagingFill2(Imaging imOut, const void* ink, Imaging imMask, int dx0, int dy0, int dx1, int dy1) { ImagingSectionCookie cookie; int xsize, ysize; int pixelsize; int sx0, sy0; if (!imOut || !ink) { (void) ImagingError_ModeError(); return -1; } pixelsize = imOut->pixelsize; xsize = dx1 - dx0; ysize = dy1 - dy0; if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { (void) ImagingError_Mismatch(); return -1; } /* Determine which region to fill */ sx0 = sy0 = 0; if (dx0 < 0) xsize += dx0, sx0 = -dx0, dx0 = 0; if (dx0 + xsize > imOut->xsize) xsize = imOut->xsize - dx0; if (dy0 < 0) ysize += dy0, sy0 = -dy0, dy0 = 0; if (dy0 + ysize > imOut->ysize) ysize = imOut->ysize - dy0; if (xsize <= 0 || ysize <= 0) return 0; if (!imMask) { ImagingSectionEnter(&cookie); fill(imOut, ink, dx0, dy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "1") == 0) { ImagingSectionEnter(&cookie); fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "L") == 0) { ImagingSectionEnter(&cookie); fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBA") == 0) { ImagingSectionEnter(&cookie); fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBa") == 0) { ImagingSectionEnter(&cookie); fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else { (void) ImagingError_ValueError("bad transparency mask"); return -1; } return 0; } pillow-2.3.0/libImaging/GifDecode.c0000644000175000001440000001442112257506326015726 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * a fast, suspendable GIF decoder * * history: * 95-09-03 fl Created * 95-09-05 fl Fixed sign problem on 16-bit platforms * 95-09-13 fl Added some storage shortcuts * 96-03-28 fl Revised API, integrated with PIL * 96-12-10 fl Added interlace support * 96-12-16 fl Fixed premature termination bug introduced by last fix * 97-01-05 fl Don't mess up on bogus configuration * 97-01-17 fl Don't mess up on very small, interlaced files * 99-02-07 fl Minor speedups * * Copyright (c) Secret Labs AB 1997-99. * Copyright (c) Fredrik Lundh 1995-97. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include #include /* memcpy() */ #include "Gif.h" #define NEWLINE(state, context) {\ state->x = 0;\ state->y += context->step;\ while (state->y >= state->ysize)\ switch (context->interlace) {\ case 1:\ context->repeat = state->y = 4;\ context->interlace = 2;\ break;\ case 2:\ context->step = 4;\ context->repeat = state->y = 2;\ context->interlace = 3;\ break;\ case 3:\ context->step = 2;\ context->repeat = state->y = 1;\ context->interlace = 0;\ break;\ default:\ return -1;\ }\ if (state->y < state->ysize)\ out = im->image8[state->y + state->yoff] + state->xoff;\ } int ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes) { UINT8* p; UINT8* out; int c, i; int thiscode; GIFDECODERSTATE *context = (GIFDECODERSTATE*) state->context; UINT8 *ptr = buffer; if (!state->state) { /* Initialise state */ if (context->bits < 0 || context->bits > 8) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } /* Clear code */ context->clear = 1 << context->bits; /* End code */ context->end = context->clear + 1; /* Interlace */ if (context->interlace) { context->interlace = 1; context->step = context->repeat = 8; } else context->step = 1; state->state = 1; } out = im->image8[state->y + state->yoff] + state->xoff + state->x; for (;;) { if (state->state == 1) { /* First free entry in table */ context->next = context->clear + 2; /* Initial code size */ context->codesize = context->bits + 1; context->codemask = (1 << context->codesize) - 1; /* Buffer pointer. We fill the buffer from right, which allows us to return all of it in one operation. */ context->bufferindex = GIFBUFFER; state->state = 2; } if (context->bufferindex < GIFBUFFER) { /* Return whole buffer in one chunk */ i = GIFBUFFER - context->bufferindex; p = &context->buffer[context->bufferindex]; context->bufferindex = GIFBUFFER; } else { /* Get current symbol */ while (context->bitcount < context->codesize) { if (context->blocksize > 0) { /* Read next byte */ c = *ptr++; bytes--; context->blocksize--; /* New bits are shifted in from from the left. */ context->bitbuffer |= (INT32) c << context->bitcount; context->bitcount += 8; } else { /* New GIF block */ /* We don't start decoding unless we have a full block */ if (bytes < 1) return ptr - buffer; c = *ptr; if (bytes < c+1) return ptr - buffer; context->blocksize = c; ptr++; bytes--; } } /* Extract current symbol from bit buffer. */ c = (int) context->bitbuffer & context->codemask; /* Adjust buffer */ context->bitbuffer >>= context->codesize; context->bitcount -= context->codesize; /* If c is less than "clear", it's a data byte. Otherwise, it's either clear/end or a code symbol which should be expanded. */ if (c == context->clear) { if (state->state != 2) state->state = 1; continue; } if (c == context->end) break; i = 1; p = &context->lastdata; if (state->state == 2) { /* First valid symbol after clear; use as is */ if (c > context->clear) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->lastdata = context->lastcode = c; state->state = 3; } else { thiscode = c; if (c > context->next) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } if (c == context->next) { /* c == next is allowed. not sure why. */ if (context->bufferindex <= 0) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->buffer[--context->bufferindex] = context->lastdata; c = context->lastcode; } while (c >= context->clear) { /* Copy data string to buffer (beginning from right) */ if (context->bufferindex <= 0 || c >= GIFTABLE) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->buffer[--context->bufferindex] = context->data[c]; c = context->link[c]; } context->lastdata = c; if (context->next < GIFTABLE) { /* We'll only add this symbol if we have room for it (take advise, Netscape!) */ context->data[context->next] = c; context->link[context->next] = context->lastcode; if (context->next == context->codemask && context->codesize < GIFBITS) { /* Expand code size */ context->codesize++; context->codemask = (1 << context->codesize) - 1; } context->next++; } context->lastcode = thiscode; } } /* Copy the bytes into the image */ if (state->y >= state->ysize) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } /* To squeeze some extra pixels out of this loop, we test for some common cases and handle them separately. */ /* FIXME: should we handle the transparency index in here??? */ if (i == 1) { if (state->x < state->xsize-1) { /* Single pixel, not at the end of the line. */ *out++ = p[0]; state->x++; continue; } } else if (state->x + i <= state->xsize) { /* This string fits into current line. */ memcpy(out, p, i); out += i; state->x += i; if (state->x == state->xsize) { NEWLINE(state, context); } continue; } /* No shortcut, copy pixel by pixel */ for (c = 0; c < i; c++) { *out++ = p[c]; if (++state->x >= state->xsize) { NEWLINE(state, context); } } } return ptr - buffer; } pillow-2.3.0/libImaging/Bands.c0000644000175000001440000000550512257506326015147 0ustar dokousers/* * The Python Imaging Library * $Id$ * * stuff to extract and paste back individual bands * * history: * 1996-03-20 fl Created * 1997-08-27 fl Fixed putband for single band targets. * 2003-09-26 fl Fixed getband/putband for 2-band images (LA, PA). * * Copyright (c) 1997-2003 by Secret Labs AB. * Copyright (c) 1996-1997 by Fredrik Lundh. * * See the README file for details on usage and redistribution. */ #include "Imaging.h" #define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) Imaging ImagingGetBand(Imaging imIn, int band) { Imaging imOut; int x, y; /* Check arguments */ if (!imIn || imIn->type != IMAGING_TYPE_UINT8) return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imIn->bands) return (Imaging) ImagingError_ValueError("band index out of range"); /* Shortcuts */ if (imIn->bands == 1) return ImagingCopy(imIn); /* Special case for LXXA etc */ if (imIn->bands == 2 && band == 1) band = 3; imOut = ImagingNew("L", imIn->xsize, imIn->ysize); if (!imOut) return NULL; /* Extract band from image */ for (y = 0; y < imIn->ysize; y++) { UINT8* in = (UINT8*) imIn->image[y] + band; UINT8* out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) { out[x] = *in; in += 4; } } return imOut; } Imaging ImagingPutBand(Imaging imOut, Imaging imIn, int band) { int x, y; /* Check arguments */ if (!imIn || imIn->bands != 1 || !imOut) return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imOut->bands) return (Imaging) ImagingError_ValueError("band index out of range"); if (imIn->type != imOut->type || imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) return (Imaging) ImagingError_Mismatch(); /* Shortcuts */ if (imOut->bands == 1) return ImagingCopy2(imOut, imIn); /* Special case for LXXA etc */ if (imOut->bands == 2 && band == 1) band = 3; /* Insert band into image */ for (y = 0; y < imIn->ysize; y++) { UINT8* in = imIn->image8[y]; UINT8* out = (UINT8*) imOut->image[y] + band; for (x = 0; x < imIn->xsize; x++) { *out = in[x]; out += 4; } } return imOut; } Imaging ImagingFillBand(Imaging imOut, int band, int color) { int x, y; /* Check arguments */ if (!imOut || imOut->type != IMAGING_TYPE_UINT8) return (Imaging) ImagingError_ModeError(); if (band < 0 || band >= imOut->bands) return (Imaging) ImagingError_ValueError("band index out of range"); /* Special case for LXXA etc */ if (imOut->bands == 2 && band == 1) band = 3; color = CLIP(color); /* Insert color into image */ for (y = 0; y < imOut->ysize; y++) { UINT8* out = (UINT8*) imOut->image[y] + band; for (x = 0; x < imOut->xsize; x++) { *out = (UINT8) color; out += 4; } } return imOut; } pillow-2.3.0/libImaging/TiffDecode.h0000644000175000001440000000222512257510072016106 0ustar dokousers/* * The Python Imaging Library. * $Id: //modules/pil/libImaging/Tiff.h#1 $ * * declarations for the LibTiff-based Group3 and Group4 decoder * */ #ifndef _TIFFIO_ #include #endif #ifndef _TIFF_ #include #endif #ifndef _UNISTD_H #include #endif #ifndef min #define min(x,y) (( x > y ) ? y : x ) #define max(x,y) (( x < y ) ? y : x ) #endif #ifndef _PIL_LIBTIFF_ #define _PIL_LIBTIFF_ typedef struct { tdata_t data; /* tdata_t == void* */ toff_t loc; /* toff_t == uint32 */ tsize_t size; /* tsize_t == int32 */ int fp; TIFF *tiff; /* Used in write */ toff_t eof; int flrealloc; /* may we realloc */ } TIFFSTATE; extern int ImagingLibTiffInit(ImagingCodecState state, int fp); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); #if defined(_MSC_VER) && (_MSC_VER == 1310) /* VS2003/py2.4 can't use varargs. Skipping trace for now.*/ #define TRACE(args) #else /* #define VA_ARGS(...) __VA_ARGS__ #define TRACE(args) fprintf(stderr, VA_ARGS args) */ #define TRACE(args) #endif /* _MSC_VER */ #endif pillow-2.3.0/libImaging/XbmEncode.c0000644000175000001440000000327012257506326015761 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * encoder for Xbm data * * history: * 96-11-01 fl created * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { const char *hex = "0123456789abcdef"; UINT8* ptr = buf; int i, n; if (!state->state) { /* 8 pixels are stored in no more than 6 bytes */ state->bytes = 6*(state->xsize+7)/8; state->state = 1; } if (bytes < state->bytes) { state->errcode = IMAGING_CODEC_MEMORY; return 0; } ptr = buf; while (bytes >= state->bytes) { state->shuffle(state->buffer, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); if (state->y < state->ysize-1) { /* any line but the last */ for (n = 0; n < state->xsize; n += 8) { i = state->buffer[n/8]; *ptr++ = '0'; *ptr++ = 'x'; *ptr++ = hex[(i>>4)&15]; *ptr++ = hex[i&15]; *ptr++ = ','; bytes -= 5; if (++state->count >= 79/5) { *ptr++ = '\n'; bytes--; state->count = 0; } } state->y++; } else { /* last line */ for (n = 0; n < state->xsize; n += 8) { i = state->buffer[n/8]; *ptr++ = '0'; *ptr++ = 'x'; *ptr++ = hex[(i>>4)&15]; *ptr++ = hex[i&15]; if (n < state->xsize-8) { *ptr++ = ','; if (++state->count >= 79/5) { *ptr++ = '\n'; bytes--; state->count = 0; } } else *ptr++ = '\n'; bytes -= 5; } state->errcode = IMAGING_CODEC_END; break; } } return ptr - buf; } pillow-2.3.0/libImaging/ZipEncode.c0000644000175000001440000002114512257506326015776 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * coder for ZIP (deflated) image data * * History: * 96-12-29 fl created * 96-12-30 fl adaptive filter selection, encoder tuning * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #ifdef HAVE_LIBZ #include "Zip.h" int ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { ZIPSTATE* context = (ZIPSTATE*) state->context; int err; int compress_level, compress_type; UINT8* ptr; int i, bpp, s, sum; ImagingSectionCookie cookie; if (!state->state) { /* Initialization */ /* Valid modes are ZIP_PNG, ZIP_PNG_PALETTE, and ZIP_TIFF */ /* Expand standard buffer to make room for the filter selector, and allocate filter buffers */ free(state->buffer); state->buffer = (UINT8*) malloc(state->bytes+1); context->previous = (UINT8*) malloc(state->bytes+1); context->prior = (UINT8*) malloc(state->bytes+1); context->up = (UINT8*) malloc(state->bytes+1); context->average = (UINT8*) malloc(state->bytes+1); context->paeth = (UINT8*) malloc(state->bytes+1); if (!state->buffer || !context->previous || !context->prior || !context->up || !context->average || !context->paeth) { free(context->paeth); free(context->average); free(context->up); free(context->prior); free(context->previous); state->errcode = IMAGING_CODEC_MEMORY; return -1; } /* Initalise filter buffers */ state->buffer[0] = 0; context->prior[0] = 1; context->up[0] = 2; context->average[0] = 3; context->paeth[0] = 4; /* Initialise previous buffer to black */ memset(context->previous, 0, state->bytes+1); /* Setup compression context */ context->z_stream.zalloc = (alloc_func)0; context->z_stream.zfree = (free_func)0; context->z_stream.opaque = (voidpf)0; context->z_stream.next_in = 0; context->z_stream.avail_in = 0; compress_level = (context->optimize) ? Z_BEST_COMPRESSION : context->compress_level; if (context->compress_type == -1) { compress_type = (context->mode == ZIP_PNG) ? Z_FILTERED : Z_DEFAULT_STRATEGY; } else { compress_type = context->compress_type; } err = deflateInit2(&context->z_stream, /* compression level */ compress_level, /* compression method */ Z_DEFLATED, /* compression memory resources */ 15, 9, /* compression strategy (image data are filtered)*/ compress_type); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } if (context->dictionary && context->dictionary_size > 0) { err = deflateSetDictionary(&context->z_stream, (unsigned char *)context->dictionary, context->dictionary_size); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } } /* Ready to decode */ state->state = 1; } /* Setup the destination buffer */ context->z_stream.next_out = buf; context->z_stream.avail_out = bytes; if (context->z_stream.next_in && context->z_stream.avail_in > 0) { /* We have some data from previous round, deflate it first */ err = deflate(&context->z_stream, Z_NO_FLUSH); if (err < 0) { /* Something went wrong inside the compression library */ if (err == Z_DATA_ERROR) state->errcode = IMAGING_CODEC_BROKEN; else if (err == Z_MEM_ERROR) state->errcode = IMAGING_CODEC_MEMORY; else state->errcode = IMAGING_CODEC_CONFIG; free(context->paeth); free(context->average); free(context->up); free(context->prior); free(context->previous); deflateEnd(&context->z_stream); return -1; } } ImagingSectionEnter(&cookie); for (;;) { switch (state->state) { case 1: /* Compress image data */ while (context->z_stream.avail_out > 0) { if (state->y >= state->ysize) { /* End of image; now flush compressor buffers */ state->state = 2; break; } /* Stuff image data into the compressor */ state->shuffle(state->buffer+1, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); state->y++; context->output = state->buffer; if (context->mode == ZIP_PNG) { /* Filter the image data. For each line, select the filter that gives the least total distance from zero for the filtered data (taken from LIBPNG) */ bpp = (state->bits + 7) / 8; /* 0. No filter */ for (i = 1, sum = 0; i <= state->bytes; i++) { UINT8 v = state->buffer[i]; sum += (v < 128) ? v : 256 - v; } /* 2. Up. We'll test this first to save time when an image line is identical to the one above. */ if (sum > 0) { for (i = 1, s = 0; i <= state->bytes; i++) { UINT8 v = state->buffer[i] - context->previous[i]; context->up[i] = v; s += (v < 128) ? v : 256 - v; } if (s < sum) { context->output = context->up; sum = s; /* 0 if line was duplicated */ } } /* 1. Prior */ if (sum > 0) { for (i = 1, s = 0; i <= bpp; i++) { UINT8 v = state->buffer[i]; context->prior[i] = v; s += (v < 128) ? v : 256 - v; } for (; i <= state->bytes; i++) { UINT8 v = state->buffer[i] - state->buffer[i-bpp]; context->prior[i] = v; s += (v < 128) ? v : 256 - v; } if (s < sum) { context->output = context->prior; sum = s; /* 0 if line is solid */ } } /* 3. Average (not very common in real-life images, so its only used with the optimize option) */ if (context->optimize && sum > 0) { for (i = 1, s = 0; i <= bpp; i++) { UINT8 v = state->buffer[i] - context->previous[i]/2; context->average[i] = v; s += (v < 128) ? v : 256 - v; } for (; i <= state->bytes; i++) { UINT8 v = state->buffer[i] - (state->buffer[i-bpp] + context->previous[i])/2; context->average[i] = v; s += (v < 128) ? v : 256 - v; } if (s < sum) { context->output = context->average; sum = s; } } /* 4. Paeth */ if (sum > 0) { for (i = 1, s = 0; i <= bpp; i++) { UINT8 v = state->buffer[i] - context->previous[i]; context->paeth[i] = v; s += (v < 128) ? v : 256 - v; } for (; i <= state->bytes; i++) { UINT8 v; int a, b, c; int pa, pb, pc; /* fetch pixels */ a = state->buffer[i-bpp]; b = context->previous[i]; c = context->previous[i-bpp]; /* distances to surrounding pixels */ pa = abs(b - c); pb = abs(a - c); pc = abs(a + b - 2*c); /* pick predictor with the shortest distance */ v = state->buffer[i] - ((pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c); context->paeth[i] = v; s += (v < 128) ? v : 256 - v; } if (s < sum) { context->output = context->paeth; sum = s; } } } /* Compress this line */ context->z_stream.next_in = context->output; context->z_stream.avail_in = state->bytes+1; err = deflate(&context->z_stream, Z_NO_FLUSH); if (err < 0) { /* Something went wrong inside the compression library */ if (err == Z_DATA_ERROR) state->errcode = IMAGING_CODEC_BROKEN; else if (err == Z_MEM_ERROR) state->errcode = IMAGING_CODEC_MEMORY; else state->errcode = IMAGING_CODEC_CONFIG; free(context->paeth); free(context->average); free(context->up); free(context->prior); free(context->previous); deflateEnd(&context->z_stream); ImagingSectionLeave(&cookie); return -1; } /* Swap buffer pointers */ ptr = state->buffer; state->buffer = context->previous; context->previous = ptr; } if (context->z_stream.avail_out == 0) break; /* Buffer full */ case 2: /* End of image data; flush compressor buffers */ while (context->z_stream.avail_out > 0) { err = deflate(&context->z_stream, Z_FINISH); if (err == Z_STREAM_END) { free(context->paeth); free(context->average); free(context->up); free(context->prior); free(context->previous); deflateEnd(&context->z_stream); state->errcode = IMAGING_CODEC_END; break; } if (context->z_stream.avail_out == 0) break; /* Buffer full */ } } ImagingSectionLeave(&cookie); return bytes - context->z_stream.avail_out; } /* Should never ever arrive here... */ state->errcode = IMAGING_CODEC_CONFIG; ImagingSectionLeave(&cookie); return -1; } const char* ImagingZipVersion(void) { return ZLIB_VERSION; } #endif pillow-2.3.0/libImaging/TiffDecode.c0000644000175000001440000003063412257510072016106 0ustar dokousers/* * The Python Imaging Library. * $Id: //modules/pil/libImaging/TiffDecode.c#1 $ * * LibTiff-based Group3 and Group4 decoder * * * started modding to use non-private tiff functions to port to libtiff 4.x * eds 3/12/12 * */ #include "Imaging.h" #ifdef HAVE_LIBTIFF #ifndef uint #define uint uint32 #endif #include "TiffDecode.h" void dump_state(const TIFFSTATE *state){ TRACE(("State: Location %u size %d eof %d data: %p \n", (uint)state->loc, (int)state->size, (uint)state->eof, state->data)); } /* procs for TIFFOpenClient */ tsize_t _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { TIFFSTATE *state = (TIFFSTATE *)hdata; tsize_t to_read; TRACE(("_tiffReadProc: %d \n", (int)size)); dump_state(state); to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); TRACE(("to_read: %d\n", (int)to_read)); _TIFFmemcpy(buf, (UINT8 *)state->data + state->loc, to_read); state->loc += (toff_t)to_read; TRACE( ("location: %u\n", (uint)state->loc)); return to_read; } tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { TIFFSTATE *state = (TIFFSTATE *)hdata; tsize_t to_write; TRACE(("_tiffWriteProc: %d \n", (int)size)); dump_state(state); to_write = min(size, state->size - (tsize_t)state->loc); if (state->flrealloc && size>to_write) { tdata_t new; tsize_t newsize=state->size; while (newsize < (size + state->size)) { newsize += 64*1024; // newsize*=2; // UNDONE, by 64k chunks? } TRACE(("Reallocing in write to %d bytes\n", (int)newsize)); new = realloc(state->data, newsize); if (!new) { // fail out return 0; } state->data = new; state->size = newsize; to_write = size; } TRACE(("to_write: %d\n", (int)to_write)); _TIFFmemcpy((UINT8 *)state->data + state->loc, buf, to_write); state->loc += (toff_t)to_write; state->eof = max(state->loc, state->eof); dump_state(state); return to_write; } toff_t _tiffSeekProc(thandle_t hdata, toff_t off, int whence) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffSeekProc: off: %u whence: %d \n", (uint)off, whence)); dump_state(state); switch (whence) { case 0: state->loc = off; break; case 1: state->loc += off; break; case 2: state->loc = state->eof + off; break; } dump_state(state); return state->loc; } int _tiffCloseProc(thandle_t hdata) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffCloseProc \n")); dump_state(state); return 0; } toff_t _tiffSizeProc(thandle_t hdata) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffSizeProc \n")); dump_state(state); return (toff_t)state->size; } int _tiffMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffMapProc input size: %u, data: %p\n", (uint)*psize, *pbase)); dump_state(state); *pbase = state->data; *psize = state->size; TRACE(("_tiffMapProc returning size: %u, data: %p\n", (uint)*psize, *pbase)); return (1); } int _tiffNullMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { (void) hdata; (void) pbase; (void) psize; return (0); } void _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { TRACE(("_tiffUnMapProc\n")); (void) hdata; (void) base; (void) size; } int ImagingLibTiffInit(ImagingCodecState state, int fp) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TRACE(("initing libtiff\n")); TRACE(("filepointer: %d \n", fp)); TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, state->x, state->y, state->ystep)); TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, state->xoff, state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("State: context %p \n", state->context)); clientstate->loc = 0; clientstate->size = 0; clientstate->data = 0; clientstate->fp = fp; clientstate->eof = 0; return 1; } int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; char *filename = "tempfile.tif"; char *mode = "r"; TIFF *tiff; int size; /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ TRACE(("in decoder: bytes %d\n", bytes)); TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, state->x, state->y, state->ystep)); TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, state->xoff, state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); TRACE(("State->Buffer: %c%c%c%c\n", (char)state->buffer[0], (char)state->buffer[1],(char)state->buffer[2], (char)state->buffer[3])); TRACE(("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", im->mode, im->type, im->bands, im->xsize, im->ysize)); TRACE(("Image: image8 %p, image32 %p, image %p, block %p \n", im->image8, im->image32, im->image, im->block)); TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize)); dump_state(clientstate); clientstate->size = bytes; clientstate->eof = clientstate->size; clientstate->loc = 0; clientstate->data = (tdata_t)buffer; clientstate->flrealloc = 0; dump_state(clientstate); TIFFSetWarningHandler(NULL); TIFFSetWarningHandlerExt(NULL); if (clientstate->fp) { TRACE(("Opening using fd: %d\n",clientstate->fp)); lseek(clientstate->fp,0,SEEK_SET); // Sometimes, I get it set to the end. tiff = TIFFFdOpen(clientstate->fp, filename, mode); } else { TRACE(("Opening from string\n")); tiff = TIFFClientOpen(filename, mode, (thandle_t) clientstate, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); } if (!tiff){ TRACE(("Error, didn't get the tiff\n")); state->errcode = IMAGING_CODEC_BROKEN; return -1; } size = TIFFScanlineSize(tiff); TRACE(("ScanlineSize: %d \n", size)); if (size > state->bytes) { TRACE(("Error, scanline size > buffer size\n")); state->errcode = IMAGING_CODEC_BROKEN; TIFFClose(tiff); return -1; } // Have to do this row by row and shove stuff into the buffer that way, // with shuffle. (or, just alloc a buffer myself, then figure out how to get it // back in. Can't use read encoded stripe. // This thing pretty much requires that I have the whole image in one shot. // Prehaps a stub version would work better??? while(state->y < state->ysize){ if (TIFFReadScanline(tiff, (tdata_t)state->buffer, (uint32)state->y, 0) == -1) { TRACE(("Decode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; TIFFClose(tiff); return -1; } /* TRACE(("Decoded row %d \n", state->y)); */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->y++; } TIFFClose(tiff); TRACE(("Done Decoding, Returning \n")); // Returning -1 here to force ImageFile.load to break, rather than // even think about looping back around. return -1; } int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { // Open the FD or the pointer as a tiff file, for writing. // We may have to do some monkeying around to make this really work. // If we have a fp, then we're good. // If we have a memory string, we're probably going to have to malloc, then // shuffle bytes into the writescanline process. // Going to have to deal with the directory as well. TIFFSTATE *clientstate = (TIFFSTATE *)state->context; int bufsize = 64*1024; char *mode = "w"; TRACE(("initing libtiff\n")); TRACE(("Filename %s, filepointer: %d \n", filename, fp)); TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, state->x, state->y, state->ystep)); TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, state->xoff, state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("State: context %p \n", state->context)); clientstate->loc = 0; clientstate->size = 0; clientstate->eof =0; clientstate->data = 0; clientstate->flrealloc = 0; clientstate->fp = fp; state->state = 0; if (fp) { TRACE(("Opening using fd: %d for writing \n",clientstate->fp)); clientstate->tiff = TIFFFdOpen(clientstate->fp, filename, mode); } else { // malloc a buffer to write the tif, we're going to need to realloc or something if we need bigger. TRACE(("Opening a buffer for writing \n")); clientstate->data = malloc(bufsize); clientstate->size = bufsize; clientstate->flrealloc=1; if (!clientstate->data) { TRACE(("Error, couldn't allocate a buffer of size %d\n", bufsize)); return 0; } clientstate->tiff = TIFFClientOpen(filename, mode, (thandle_t) clientstate, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffNullMapProc, _tiffUnmapProc); /*force no mmap*/ } if (!clientstate->tiff) { TRACE(("Error, couldn't open tiff file\n")); return 0; } return 1; } int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ // after tif_dir.c->TIFFSetField. TIFFSTATE *clientstate = (TIFFSTATE *)state->context; va_list ap; int status; va_start(ap, tag); status = TIFFVSetField(clientstate->tiff, tag, ap); va_end(ap); return status; } int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes) { /* One shot encoder. Encode everything to the tiff in the clientstate. If we're running off of a FD, then run once, we're good, everything ends up in the file, we close and we're done. If we're going to memory, then we need to write the whole file into memory, then parcel it back out to the pystring buffer bytes at a time. */ TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TIFF *tiff = clientstate->tiff; TRACE(("in encoder: bytes %d\n", bytes)); TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, state->x, state->y, state->ystep)); TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, state->xoff, state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); TRACE(("State->Buffer: %c%c%c%c\n", (char)state->buffer[0], (char)state->buffer[1],(char)state->buffer[2], (char)state->buffer[3])); TRACE(("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", im->mode, im->type, im->bands, im->xsize, im->ysize)); TRACE(("Image: image8 %p, image32 %p, image %p, block %p \n", im->image8, im->image32, im->image, im->block)); TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize)); dump_state(clientstate); if (state->state == 0) { TRACE(("Encoding line bt line")); while(state->y < state->ysize){ state->shuffle(state->buffer, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); if (TIFFWriteScanline(tiff, (tdata_t)(state->buffer), (uint32)state->y, 0) == -1) { TRACE(("Encode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; TIFFClose(tiff); if (!clientstate->fp){ free(clientstate->data); } return -1; } state->y++; } if (state->y == state->ysize) { state->state=1; TRACE(("Flushing \n")); if (!TIFFFlush(tiff)) { TRACE(("Error flushing the tiff")); // likely reason is memory. state->errcode = IMAGING_CODEC_MEMORY; TIFFClose(tiff); if (!clientstate->fp){ free(clientstate->data); } return -1; } TRACE(("Closing \n")); TIFFClose(tiff); // reset the clientstate metadata to use it to read out the buffer. clientstate->loc = 0; clientstate->size = clientstate->eof; // redundant? } } if (state->state == 1 && !clientstate->fp) { int read = (int)_tiffReadProc(clientstate, (tdata_t)buffer, (tsize_t)bytes); TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); if (clientstate->loc == clientstate->eof) { TRACE(("Hit EOF, calling an end, freeing data")); state->errcode = IMAGING_CODEC_END; free(clientstate->data); } return read; } state->errcode = IMAGING_CODEC_END; return 0; } #endif pillow-2.3.0/libImaging/Matrix.c0000644000175000001440000000322512257506326015361 0ustar dokousers/* * The Python Imaging Library * $Id$ * * colour and luminance matrix transforms * * history: * 1996-05-18 fl: created (brute force implementation) * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8) v) Imaging ImagingConvertMatrix(Imaging im, const char *mode, float m[]) { Imaging imOut; int x, y; /* Assume there's enough data in the buffer */ if (!im) return (Imaging) ImagingError_ModeError(); if (strcmp(mode, "L") == 0 && im->bands == 3) { imOut = ImagingNew("L", im->xsize, im->ysize); if (!imOut) return NULL; for (y = 0; y < im->ysize; y++) { UINT8* in = (UINT8*) im->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < im->xsize; x++) { float v = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; out[x] = CLIPF(v); in += 4; } } } else if (strlen(mode) == 3 && im->bands == 3) { imOut = ImagingNew(mode, im->xsize, im->ysize); if (!imOut) return NULL; for (y = 0; y < im->ysize; y++) { UINT8* in = (UINT8*) im->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < im->xsize; x++) { float v0 = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; float v1 = m[4]*in[0] + m[5]*in[1] + m[6]*in[2] + m[7] + 0.5; float v2 = m[8]*in[0] + m[9]*in[1] + m[10]*in[2] + m[11] + 0.5; out[0] = CLIPF(v0); out[1] = CLIPF(v1); out[2] = CLIPF(v2); in += 4; out += 4; } } } else return (Imaging) ImagingError_ModeError(); return imOut; } pillow-2.3.0/libImaging/Gif.h0000644000175000001440000000500212257506326014622 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * Declarations for a fast, suspendable GIF decoder. * * Copyright (c) Fredrik Lundh 1995-96. */ /* Max size for a LZW code word. */ #define GIFBITS 12 #define GIFTABLE (1<type != IMAGING_TYPE_UINT8) return ImagingError_ModeError(); if (imIn1->type != imIn2->type || imIn1->bands != imIn2->bands || imIn1->xsize != imIn2->xsize || imIn1->ysize != imIn2->ysize) return ImagingError_Mismatch(); /* Shortcuts */ if (alpha == 0.0) return ImagingCopy(imIn1); else if (alpha == 1.0) return ImagingCopy(imIn2); imOut = ImagingNew(imIn1->mode, imIn1->xsize, imIn1->ysize); if (!imOut) return NULL; ImagingCopyInfo(imOut, imIn1); if (alpha >= 0 && alpha <= 1.0) { /* Interpolate between bands */ for (y = 0; y < imIn1->ysize; y++) { UINT8* in1 = (UINT8*) imIn1->image[y]; UINT8* in2 = (UINT8*) imIn2->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < imIn1->linesize; x++) out[x] = (UINT8) ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); } } else { /* Extrapolation; must make sure to clip resulting values */ for (y = 0; y < imIn1->ysize; y++) { UINT8* in1 = (UINT8*) imIn1->image[y]; UINT8* in2 = (UINT8*) imIn2->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < imIn1->linesize; x++) { float temp = (float) ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); if (temp <= 0.0) out[x] = 0; else if (temp >= 255.0) out[x] = 255; else out[x] = (UINT8) temp; } } } return imOut; } pillow-2.3.0/libImaging/QuantHeap.h0000644000175000001440000000113312257506326016004 0ustar dokousers/* * The Python Imaging Library * $Id$ * * image quantizer * * Written by Toby J Sargeant . * * See the README file for information on usage and redistribution. */ #ifndef __QUANTHEAP_H__ #define __QUANTHEAP_H__ #include "QuantTypes.h" typedef struct _Heap Heap; typedef int (*HeapCmpFunc)(const Heap *,const void *,const void *); void ImagingQuantHeapFree(Heap *); int ImagingQuantHeapRemove(Heap *,void **); int ImagingQuantHeapAdd(Heap *,void *); int ImagingQuantHeapTop(Heap *,void **); Heap *ImagingQuantHeapNew(HeapCmpFunc); #endif // __QUANTHEAP_H__ pillow-2.3.0/libImaging/FliDecode.c0000644000175000001440000001137512257506326015740 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for Autodesk Animator FLI/FLC animations * * history: * 97-01-03 fl Created * 97-01-17 fl Added SS2 support (FLC) * * Copyright (c) Fredrik Lundh 1997. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define I16(ptr)\ ((ptr)[0] + ((ptr)[1] << 8)) #define I32(ptr)\ ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) int ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* ptr; int framesize; int c, chunks; int l, lines; int i, j, x = 0, y, ymax; /* If not even the chunk size is present, we'd better leave */ if (bytes < 4) return 0; /* We don't decode anything unless we have a full chunk in the input buffer (on the other hand, the Python part of the driver makes sure this is always the case) */ ptr = buf; framesize = I32(ptr); if (framesize < I32(ptr)) return 0; /* Make sure this is a frame chunk. The Python driver takes case of other chunk types. */ if (I16(ptr+4) != 0xF1FA) { state->errcode = IMAGING_CODEC_UNKNOWN; return -1; } chunks = I16(ptr+6); ptr += 16; /* Process subchunks */ for (c = 0; c < chunks; c++) { UINT8 *data = ptr + 6; switch (I16(ptr+4)) { case 4: case 11: /* FLI COLOR chunk */ break; /* ignored; handled by Python code */ case 7: /* FLI SS2 chunk (word delta) */ lines = I16(data); data += 2; for (l = y = 0; l < lines && y < state->ysize; l++, y++) { UINT8* buf = (UINT8*) im->image[y]; int p, packets; packets = I16(data); data += 2; while (packets & 0x8000) { /* flag word */ if (packets & 0x4000) { y += 65536 - packets; /* skip lines */ if (y >= state->ysize) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } buf = (UINT8*) im->image[y]; } else { /* store last byte (used if line width is odd) */ buf[state->xsize-1] = (UINT8) packets; } packets = I16(data); data += 2; } for (p = x = 0; p < packets; p++) { x += data[0]; /* pixel skip */ if (data[1] >= 128) { i = 256-data[1]; /* run */ if (x + i + i > state->xsize) break; for (j = 0; j < i; j++) { buf[x++] = data[2]; buf[x++] = data[3]; } data += 2 + 2; } else { i = 2 * (int) data[1]; /* chunk */ if (x + i > state->xsize) break; memcpy(buf + x, data + 2, i); data += 2 + i; x += i; } } if (p < packets) break; /* didn't process all packets */ } if (l < lines) { /* didn't process all lines */ state->errcode = IMAGING_CODEC_OVERRUN; return -1; } break; case 12: /* FLI LC chunk (byte delta) */ y = I16(data); ymax = y + I16(data+2); data += 4; for (; y < ymax && y < state->ysize; y++) { UINT8* out = (UINT8*) im->image[y]; int p, packets = *data++; for (p = x = 0; p < packets; p++, x += i) { x += data[0]; /* skip pixels */ if (data[1] & 0x80) { i = 256-data[1]; /* run */ if (x + i > state->xsize) break; memset(out + x, data[2], i); data += 3; } else { i = data[1]; /* chunk */ if (x + i > state->xsize) break; memcpy(out + x, data + 2, i); data += i + 2; } } if (p < packets) break; /* didn't process all packets */ } if (y < ymax) { /* didn't process all lines */ state->errcode = IMAGING_CODEC_OVERRUN; return -1; } break; case 13: /* FLI BLACK chunk */ for (y = 0; y < state->ysize; y++) memset(im->image[y], 0, state->xsize); break; case 15: /* FLI BRUN chunk */ for (y = 0; y < state->ysize; y++) { UINT8* out = (UINT8*) im->image[y]; data += 1; /* ignore packetcount byte */ for (x = 0; x < state->xsize; x += i) { if (data[0] & 0x80) { i = 256 - data[0]; if (x + i > state->xsize) break; /* safety first */ memcpy(out + x, data + 1, i); data += i + 1; } else { i = data[0]; if (x + i > state->xsize) break; /* safety first */ memset(out + x, data[1], i); data += 2; } } if (x != state->xsize) { /* didn't unpack whole line */ state->errcode = IMAGING_CODEC_OVERRUN; return -1; } } break; case 16: /* COPY chunk */ for (y = 0; y < state->ysize; y++) { UINT8* buf = (UINT8*) im->image[y]; memcpy(buf+x, data, state->xsize); data += state->xsize; } break; case 18: /* PSTAMP chunk */ break; /* ignored */ default: /* unknown chunk */ /* printf("unknown FLI/FLC chunk: %d\n", I16(ptr+4)); */ state->errcode = IMAGING_CODEC_UNKNOWN; return -1; } ptr += I32(ptr); } return -1; /* end of frame */ } pillow-2.3.0/libImaging/Pack.c0000644000175000001440000003101112257506326014765 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * code to pack raw data * * history: * 1996-04-30 fl Created * 1996-05-12 fl Published a few RGB packers * 1996-11-01 fl More RGB packers (Tk booster stuff) * 1996-12-30 fl Added P;1, P;2 and P;4 packers * 1997-06-02 fl Added F (F;32NF) packer * 1997-08-28 fl Added 1 as L packer * 1998-02-08 fl Added I packer * 1998-03-09 fl Added mode field, RGBA/RGBX as RGB packers * 1998-07-01 fl Added YCbCr support * 1998-07-12 fl Added I 16 packer * 1999-02-03 fl Added BGR packers * 2003-09-26 fl Added LA/PA packers * 2006-06-22 fl Added CMYK;I packer * * Copyright (c) 1997-2006 by Secret Labs AB. * Copyright (c) 1996-1997 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define R 0 #define G 1 #define B 2 #define X 3 #define A 3 #define C 0 #define M 1 #define Y 2 #define K 3 /* byte swapping macros */ #define C16N\ (out[0]=tmp[0], out[1]=tmp[1]); #define C16S\ (out[1]=tmp[0], out[0]=tmp[1]); #define C32N\ (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3]); #define C32S\ (out[3]=tmp[0], out[2]=tmp[1], out[1]=tmp[2], out[0]=tmp[3]); #define C64N\ (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3],\ out[4]=tmp[4], out[5]=tmp[5], out[6]=tmp[6], out[7]=tmp[7]); #define C64S\ (out[7]=tmp[0], out[6]=tmp[1], out[5]=tmp[2], out[4]=tmp[3],\ out[3]=tmp[4], out[2]=tmp[5], out[1]=tmp[6], out[0]=tmp[7]); #ifdef WORDS_BIGENDIAN #define C16B C16N #define C16L C16S #define C32B C32N #define C32L C32S #define C64B C64N #define C64L C64S #else #define C16B C16S #define C16L C16N #define C32B C32S #define C32L C32N #define C64B C64S #define C64L C64N #endif static void pack1(UINT8* out, const UINT8* in, int pixels) { int i, m, b; /* bilevel (black is 0) */ b = 0; m = 128; for (i = 0; i < pixels; i++) { if (in[i] != 0) b |= m; m >>= 1; if (m == 0) { *out++ = b; b = 0; m = 128; } } if (m != 128) *out++ = b; } static void pack1I(UINT8* out, const UINT8* in, int pixels) { int i, m, b; /* bilevel (black is 1) */ b = 0; m = 128; for (i = 0; i < pixels; i++) { if (in[i] == 0) b |= m; m >>= 1; if (m == 0) { *out++ = b; b = 0; m = 128; } } if (m != 128) *out++ = b; } static void pack1R(UINT8* out, const UINT8* in, int pixels) { int i, m, b; /* bilevel, lsb first (black is 0) */ b = 0; m = 1; for (i = 0; i < pixels; i++) { if (in[i] != 0) b |= m; m <<= 1; if (m == 256){ *out++ = b; b = 0; m = 1; } } if (m != 1) *out++ = b; } static void pack1IR(UINT8* out, const UINT8* in, int pixels) { int i, m, b; /* bilevel, lsb first (black is 1) */ b = 0; m = 1; for (i = 0; i < pixels; i++) { if (in[i] == 0) b |= m; m <<= 1; if (m == 256){ *out++ = b; b = 0; m = 1; } } if (m != 1) *out++ = b; } static void pack1L(UINT8* out, const UINT8* in, int pixels) { int i; /* bilevel, stored as bytes */ for (i = 0; i < pixels; i++) out[i] = (in[i] != 0) ? 255 : 0; } static void packP4(UINT8* out, const UINT8* in, int pixels) { while (pixels >= 2) { *out++ = (in[0] << 4) | (in[1] & 15); in += 2; pixels -= 2; } if (pixels) out[0] = (in[0] << 4); } static void packP2(UINT8* out, const UINT8* in, int pixels) { while (pixels >= 4) { *out++ = (in[0] << 6) | ((in[1] & 3) << 4) | ((in[2] & 3) << 2) | (in[3] & 3); in += 4; pixels -= 4; } switch (pixels) { case 3: out[0] = (in[0] << 6) | ((in[1] & 3) << 4) | ((in[2] & 3) << 2); break; case 2: out[0] = (in[0] << 6) | ((in[1] & 3) << 4); case 1: out[0] = (in[0] << 6); } } static void packLA(UINT8* out, const UINT8* in, int pixels) { int i; /* LA, pixel interleaved */ for (i = 0; i < pixels; i++) { out[0] = in[R]; out[1] = in[A]; out += 2; in += 4; } } static void packLAL(UINT8* out, const UINT8* in, int pixels) { int i; /* LA, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; out[i+pixels] = in[A]; in += 4; } } void ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB triplets */ for (i = 0; i < pixels; i++) { out[0] = in[R]; out[1] = in[G]; out[2] = in[B]; out += 3; in += 4; } } void ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) { int i; /* XRGB, triplets with left padding */ for (i = 0; i < pixels; i++) { out[0] = 0; out[1] = in[R]; out[2] = in[G]; out[3] = in[B]; out += 4; in += 4; } } void ImagingPackBGR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, reversed bytes */ for (i = 0; i < pixels; i++) { out[0] = in[B]; out[1] = in[G]; out[2] = in[R]; out += 3; in += 4; } } void ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) { int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { out[0] = in[B]; out[1] = in[G]; out[2] = in[R]; out[3] = 0; out += 4; in += 4; } } void ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) { int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { out[0] = 0; out[1] = in[B]; out[2] = in[G]; out[3] = in[R]; out += 4; in += 4; } } void ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) { int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { out[0] = in[B]; out[1] = in[G]; out[2] = in[R]; out[3] = in[A]; out += 4; in += 4; } } void ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) { int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { out[0] = in[A]; out[1] = in[B]; out[2] = in[G]; out[3] = in[R]; out += 4; in += 4; } } static void packRGBL(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; out[i+pixels] = in[G]; out[i+pixels+pixels] = in[B]; in += 4; } } static void packRGBXL(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBX, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; out[i+pixels] = in[G]; out[i+pixels+pixels] = in[B]; out[i+pixels+pixels+pixels] = in[X]; in += 4; } } static void packI16B(UINT8* out, const UINT8* in_, int pixels) { int i; INT32* in = (INT32*) in_; UINT16 tmp_; UINT8* tmp = (UINT8*) &tmp_; for (i = 0; i < pixels; i++) { if (in[0] <= 0) tmp_ = 0; else if (in[0] > 65535) tmp_ = 65535; else tmp_ = in[0]; C16B; out += 2; in++; } } static void packI16N_I16B(UINT8* out, const UINT8* in, int pixels){ int i; UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C16B; out += 2; tmp += 2; } } static void packI16N_I16(UINT8* out, const UINT8* in, int pixels){ int i; UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C16L; out += 2; tmp += 2; } } static void packI32S(UINT8* out, const UINT8* in, int pixels) { int i; UINT8* tmp = (UINT8*) in; for (i = 0; i < pixels; i++) { C32L; out += 4; tmp += 4; } } void ImagingPackLAB(UINT8* out, const UINT8* in, int pixels) { int i; /* LAB triplets */ for (i = 0; i < pixels; i++) { out[0] = in[0]; out[1] = in[1] ^ 128; /* signed in outside world */ out[2] = in[2] ^ 128; out += 3; in += 4; } } static void copy1(UINT8* out, const UINT8* in, int pixels) { /* L, P */ memcpy(out, in, pixels); } static void copy2(UINT8* out, const UINT8* in, int pixels) { /* I;16, etc */ memcpy(out, in, pixels*2); } static void copy3(UINT8* out, const UINT8* in, int pixels) { /* BGR;24, etc */ memcpy(out, in, pixels*3); } static void copy4(UINT8* out, const UINT8* in, int pixels) { /* RGBA, CMYK quadruples */ memcpy(out, in, 4*pixels); } static void copy4I(UINT8* out, const UINT8* in, int pixels) { /* RGBA, CMYK quadruples, inverted */ int i; for (i = 0; i < pixels*4; i++) out[i] = ~in[i]; } static void band0(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) out[i] = in[0]; } static void band1(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) out[i] = in[1]; } static void band2(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) out[i] = in[2]; } static void band3(UINT8* out, const UINT8* in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) out[i] = in[3]; } static struct { const char* mode; const char* rawmode; int bits; ImagingShuffler pack; } packers[] = { /* bilevel */ {"1", "1", 1, pack1}, {"1", "1;I", 1, pack1I}, {"1", "1;R", 1, pack1R}, {"1", "1;IR", 1, pack1IR}, {"1", "L", 8, pack1L}, /* greyscale */ {"L", "L", 8, copy1}, /* greyscale w. alpha */ {"LA", "LA", 16, packLA}, {"LA", "LA;L", 16, packLAL}, /* palette */ {"P", "P;1", 1, pack1}, {"P", "P;2", 2, packP2}, {"P", "P;4", 4, packP4}, {"P", "P", 8, copy1}, /* palette w. alpha */ {"PA", "PA", 16, packLA}, {"PA", "PA;L", 16, packLAL}, /* true colour */ {"RGB", "RGB", 24, ImagingPackRGB}, {"RGB", "RGBX", 32, copy4}, {"RGB", "XRGB", 32, ImagingPackXRGB}, {"RGB", "BGR", 24, ImagingPackBGR}, {"RGB", "BGRX", 32, ImagingPackBGRX}, {"RGB", "XBGR", 32, ImagingPackXBGR}, {"RGB", "RGB;L", 24, packRGBL}, {"RGB", "R", 8, band0}, {"RGB", "G", 8, band1}, {"RGB", "B", 8, band2}, /* true colour w. alpha */ {"RGBA", "RGBA", 32, copy4}, {"RGBA", "RGBA;L", 32, packRGBXL}, {"RGBA", "RGB", 24, ImagingPackRGB}, {"RGBA", "BGR", 24, ImagingPackBGR}, {"RGBA", "BGRA", 32, ImagingPackBGRA}, {"RGBA", "ABGR", 32, ImagingPackABGR}, {"RGBA", "R", 8, band0}, {"RGBA", "G", 8, band1}, {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, /* true colour w. padding */ {"RGBX", "RGBX", 32, copy4}, {"RGBX", "RGBX;L", 32, packRGBXL}, {"RGBX", "RGB", 32, ImagingPackRGB}, {"RGBX", "BGR", 32, ImagingPackBGR}, {"RGBX", "BGRX", 32, ImagingPackBGRX}, {"RGBX", "XBGR", 32, ImagingPackXBGR}, {"RGBX", "R", 8, band0}, {"RGBX", "G", 8, band1}, {"RGBX", "B", 8, band2}, {"RGBX", "X", 8, band3}, /* colour separation */ {"CMYK", "CMYK", 32, copy4}, {"CMYK", "CMYK;I", 32, copy4I}, {"CMYK", "CMYK;L", 32, packRGBXL}, {"CMYK", "C", 8, band0}, {"CMYK", "M", 8, band1}, {"CMYK", "Y", 8, band2}, {"CMYK", "K", 8, band3}, /* video (YCbCr) */ {"YCbCr", "YCbCr", 24, ImagingPackRGB}, {"YCbCr", "YCbCr;L", 24, packRGBL}, {"YCbCr", "YCbCrX", 32, copy4}, {"YCbCr", "YCbCrK", 32, copy4}, {"YCbCr", "Y", 8, band0}, {"YCbCr", "Cb", 8, band1}, {"YCbCr", "Cr", 8, band2}, /* LAB Color */ {"LAB", "LAB", 24, ImagingPackLAB}, {"LAB", "L", 8, band0}, {"LAB", "A", 8, band1}, {"LAB", "B", 8, band2}, /* integer */ {"I", "I", 32, copy4}, {"I", "I;16B", 16, packI16B}, {"I", "I;32S", 32, packI32S}, {"I", "I;32NS", 32, copy4}, /* floating point */ {"F", "F", 32, copy4}, {"F", "F;32F", 32, packI32S}, {"F", "F;32NF", 32, copy4}, /* storage modes */ {"I;16", "I;16", 16, copy2}, {"I;16B", "I;16B", 16, copy2}, {"I;16L", "I;16L", 16, copy2}, {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. {"I;16L", "I;16N", 16, packI16N_I16}, {"I;16B", "I;16N", 16, packI16N_I16B}, {"BGR;15", "BGR;15", 16, copy2}, {"BGR;16", "BGR;16", 16, copy2}, {"BGR;24", "BGR;24", 24, copy3}, {NULL} /* sentinel */ }; ImagingShuffler ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out) { int i; /* find a suitable pixel packer */ for (i = 0; packers[i].rawmode; i++) if (strcmp(packers[i].mode, mode) == 0 && strcmp(packers[i].rawmode, rawmode) == 0) { if (bits_out) *bits_out = packers[i].bits; return packers[i].pack; } return NULL; } pillow-2.3.0/libImaging/UnpackYCC.c0000644000175000001440000001703512257506326015701 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * code to convert and unpack PhotoYCC data * * history: * 97-01-25 fl Moved from PcdDecode.c * * Copyright (c) Fredrik Lundh 1996-97. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* Tables generated by pcdtables.py, based on transforms taken from the "Colour Space Conversions FAQ" by Roberts/Ford. */ static INT16 L[] = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 42, 43, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, 65, 67, 68, 69, 71, 72, 73, 75, 76, 77, 79, 80, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 147, 148, 149, 151, 152, 153, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 170, 171, 173, 174, 175, 177, 178, 179, 181, 182, 183, 185, 186, 187, 189, 190, 192, 193, 194, 196, 197, 198, 200, 201, 202, 204, 205, 206, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 223, 224, 225, 227, 228, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, 243, 245, 246, 247, 249, 250, 251, 253, 254, 255, 257, 258, 259, 261, 262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, 281, 283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, 300, 302, 303, 304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, 319, 321, 322, 323, 325, 326, 327, 329, 330, 331, 333, 334, 336, 337, 338, 340, 341, 342, 344, 345, 346 }; static INT16 CB[] = { -345, -343, -341, -338, -336, -334, -332, -329, -327, -325, -323, -321, -318, -316, -314, -312, -310, -307, -305, -303, -301, -298, -296, -294, -292, -290, -287, -285, -283, -281, -278, -276, -274, -272, -270, -267, -265, -263, -261, -258, -256, -254, -252, -250, -247, -245, -243, -241, -239, -236, -234, -232, -230, -227, -225, -223, -221, -219, -216, -214, -212, -210, -207, -205, -203, -201, -199, -196, -194, -192, -190, -188, -185, -183, -181, -179, -176, -174, -172, -170, -168, -165, -163, -161, -159, -156, -154, -152, -150, -148, -145, -143, -141, -139, -137, -134, -132, -130, -128, -125, -123, -121, -119, -117, -114, -112, -110, -108, -105, -103, -101, -99, -97, -94, -92, -90, -88, -85, -83, -81, -79, -77, -74, -72, -70, -68, -66, -63, -61, -59, -57, -54, -52, -50, -48, -46, -43, -41, -39, -37, -34, -32, -30, -28, -26, -23, -21, -19, -17, -15, -12, -10, -8, -6, -3, -1, 0, 2, 4, 7, 9, 11, 13, 16, 18, 20, 22, 24, 27, 29, 31, 33, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, 60, 62, 64, 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 95, 98, 100, 102, 104, 106, 109, 111, 113, 115, 118, 120, 122, 124, 126, 129, 131, 133, 135, 138, 140, 142, 144, 146, 149, 151, 153, 155, 157, 160, 162, 164, 166, 169, 171, 173, 175, 177, 180, 182, 184, 186, 189, 191, 193, 195, 197, 200, 202, 204, 206, 208, 211, 213, 215, 217, 220 }; static INT16 GB[] = { 67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, 62, 62, 61, 61, 60, 60, 59, 59, 59, 58, 58, 57, 57, 56, 56, 56, 55, 55, 54, 54, 53, 53, 52, 52, 52, 51, 51, 50, 50, 49, 49, 49, 48, 48, 47, 47, 46, 46, 46, 45, 45, 44, 44, 43, 43, 43, 42, 42, 41, 41, 40, 40, 40, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 22, 21, 21, 20, 20, 19, 19, 19, 18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5, -5, -6, -6, -7, -7, -8, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -12, -13, -13, -14, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -19, -19, -20, -20, -21, -21, -21, -22, -22, -23, -23, -24, -24, -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -32, -32, -33, -33, -33, -34, -34, -35, -35, -36, -36, -36, -37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42 }; static INT16 CR[] = { -249, -247, -245, -243, -241, -239, -238, -236, -234, -232, -230, -229, -227, -225, -223, -221, -219, -218, -216, -214, -212, -210, -208, -207, -205, -203, -201, -199, -198, -196, -194, -192, -190, -188, -187, -185, -183, -181, -179, -178, -176, -174, -172, -170, -168, -167, -165, -163, -161, -159, -157, -156, -154, -152, -150, -148, -147, -145, -143, -141, -139, -137, -136, -134, -132, -130, -128, -127, -125, -123, -121, -119, -117, -116, -114, -112, -110, -108, -106, -105, -103, -101, -99, -97, -96, -94, -92, -90, -88, -86, -85, -83, -81, -79, -77, -76, -74, -72, -70, -68, -66, -65, -63, -61, -59, -57, -55, -54, -52, -50, -48, -46, -45, -43, -41, -39, -37, -35, -34, -32, -30, -28, -26, -25, -23, -21, -19, -17, -15, -14, -12, -10, -8, -6, -4, -3, -1, 0, 2, 4, 5, 7, 9, 11, 13, 15, 16, 18, 20, 22, 24, 26, 27, 29, 31, 33, 35, 36, 38, 40, 42, 44, 46, 47, 49, 51, 53, 55, 56, 58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 77, 78, 80, 82, 84, 86, 87, 89, 91, 93, 95, 97, 98, 100, 102, 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 129, 131, 133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182, 184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208, 209, 211, 213, 215 }; static INT16 GR[] = { 127, 126, 125, 124, 123, 122, 121, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, -59, -60, -61, -62, -63, -64, -65, -66, -67, -68, -69, -69, -70, -71, -72, -73, -74, -75, -76, -77, -78, -79, -80, -81, -82, -82, -83, -84, -85, -86, -87, -88, -89, -90, -91, -92, -93, -94, -94, -95, -96, -97, -98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107, -108 }; #define R 0 #define G 1 #define B 2 #define A 3 #define YCC2RGB(rgb, y, cb, cr) {\ int l = L[y];\ int r = l + CR[cr];\ int g = l + GR[cr] + GB[cb];\ int b = l + CB[cb];\ rgb[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r;\ rgb[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g;\ rgb[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b;\ } void ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels) { int i; /* PhotoYCC triplets */ for (i = 0; i < pixels; i++) { YCC2RGB(out, in[0], in[1], in[2]); out[A] = 255; out += 4; in += 3; } } void ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels) { int i; /* PhotoYCC triplets plus premultiplied alpha */ for (i = 0; i < pixels; i++) { /* Divide by alpha */ UINT8 rgb[3]; rgb[0] = (in[3] == 0) ? 0 : (((int) in[0] * 255) / in[3]); rgb[1] = (in[3] == 0) ? 0 : (((int) in[1] * 255) / in[3]); rgb[2] = (in[3] == 0) ? 0 : (((int) in[2] * 255) / in[3]); /* Convert non-multiplied data to RGB */ YCC2RGB(out, rgb[0], rgb[1], rgb[2]); out[A] = in[3]; out += 4; in += 4; } } pillow-2.3.0/libImaging/Access.c0000644000175000001440000001337312257506326015323 0ustar dokousers/* * The Python Imaging Library * $Id$ * * imaging access objects * * Copyright (c) Fredrik Lundh 2009. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* use Tests/make_hash.py to calculate these values */ #define ACCESS_TABLE_SIZE 21 #define ACCESS_TABLE_HASH 30197 static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE]; static inline UINT32 hash(const char* mode) { UINT32 i = ACCESS_TABLE_HASH; while (*mode) i = ((i<<5) + i) ^ (UINT8) *mode++; return i % ACCESS_TABLE_SIZE; } static ImagingAccess add_item(const char* mode) { UINT32 i = hash(mode); /* printf("hash %s => %d\n", mode, i); */ if (access_table[i].mode) { fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n", i, mode, access_table[i].mode); exit(1); } access_table[i].mode = mode; return &access_table[i]; } /* fetch pointer to pixel line */ static void* line_8(Imaging im, int x, int y) { return &im->image8[y][x]; } static void* line_16(Imaging im, int x, int y) { return &im->image8[y][x+x]; } static void* line_32(Imaging im, int x, int y) { return &im->image32[y][x]; } /* fetch individual pixel */ static void get_pixel(Imaging im, int x, int y, void* color) { char* out = color; /* generic pixel access*/ if (im->image8) { out[0] = im->image8[y][x]; } else { UINT8* p = (UINT8*) &im->image32[y][x]; if (im->type == IMAGING_TYPE_UINT8 && im->bands == 2) { out[0] = p[0]; out[1] = p[3]; return; } memcpy(out, p, im->pixelsize); } } static void get_pixel_8(Imaging im, int x, int y, void* color) { char* out = color; out[0] = im->image8[y][x]; } static void get_pixel_16L(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x+x]; INT16* out = color; #ifdef WORDS_BIGENDIAN out[0] = in[0] + (in[1]<<8); #else out[0] = *(INT16*) in; #endif } static void get_pixel_16B(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x+x]; INT16* out = color; #ifdef WORDS_BIGENDIAN out[0] = *(INT16*) in; #else out[0] = in[1] + (in[0]<<8); #endif } static void get_pixel_32(Imaging im, int x, int y, void* color) { INT32* out = color; out[0] = im->image32[y][x]; } static void get_pixel_32L(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x*4]; INT32* out = color; #ifdef WORDS_BIGENDIAN out[0] = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24); #else out[0] = *(INT32*) in; #endif } static void get_pixel_32B(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x*4]; INT32* out = color; #ifdef WORDS_BIGENDIAN out[0] = *(INT32*) in; #else out[0] = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24); #endif } /* store individual pixel */ static void put_pixel(Imaging im, int x, int y, const void* color) { if (im->image8) im->image8[y][x] = *((UINT8*) color); else im->image32[y][x] = *((INT32*) color); } static void put_pixel_8(Imaging im, int x, int y, const void* color) { im->image8[y][x] = *((UINT8*) color); } static void put_pixel_16L(Imaging im, int x, int y, const void* color) { const char* in = color; UINT8* out = (UINT8*) &im->image8[y][x+x]; out[0] = in[0]; out[1] = in[1]; } static void put_pixel_16B(Imaging im, int x, int y, const void* color) { const char* in = color; UINT8* out = (UINT8*) &im->image8[y][x+x]; out[0] = in[1]; out[1] = in[0]; } static void put_pixel_32L(Imaging im, int x, int y, const void* color) { const char* in = color; UINT8* out = (UINT8*) &im->image8[y][x*4]; out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; } static void put_pixel_32B(Imaging im, int x, int y, const void* color) { const char* in = color; UINT8* out = (UINT8*) &im->image8[y][x*4]; out[0] = in[3]; out[1] = in[2]; out[2] = in[1]; out[3] = in[0]; } static void put_pixel_32(Imaging im, int x, int y, const void* color) { im->image32[y][x] = *((INT32*) color); } void ImagingAccessInit() { #define ADD(mode_, line_, get_pixel_, put_pixel_) \ { ImagingAccess access = add_item(mode_); \ access->line = line_; \ access->get_pixel = get_pixel_; \ access->put_pixel = put_pixel_; \ } /* populate access table */ ADD("1", line_8, get_pixel_8, put_pixel_8); ADD("L", line_8, get_pixel_8, put_pixel_8); ADD("LA", line_32, get_pixel, put_pixel); ADD("I", line_32, get_pixel_32, put_pixel_32); ADD("I;16", line_16, get_pixel_16L, put_pixel_16L); ADD("I;16L", line_16, get_pixel_16L, put_pixel_16L); ADD("I;16B", line_16, get_pixel_16B, put_pixel_16B); ADD("I;32L", line_32, get_pixel_32L, put_pixel_32L); ADD("I;32B", line_32, get_pixel_32B, put_pixel_32B); ADD("F", line_32, get_pixel_32, put_pixel_32); ADD("P", line_8, get_pixel_8, put_pixel_8); ADD("PA", line_32, get_pixel, put_pixel); ADD("RGB", line_32, get_pixel_32, put_pixel_32); ADD("RGBA", line_32, get_pixel_32, put_pixel_32); ADD("RGBa", line_32, get_pixel_32, put_pixel_32); ADD("RGBX", line_32, get_pixel_32, put_pixel_32); ADD("CMYK", line_32, get_pixel_32, put_pixel_32); ADD("YCbCr", line_32, get_pixel_32, put_pixel_32); ADD("LAB", line_32, get_pixel_32, put_pixel_32); } ImagingAccess ImagingAccessNew(Imaging im) { ImagingAccess access = &access_table[hash(im->mode)]; if (im->mode[0] != access->mode[0] || strcmp(im->mode, access->mode) != 0) return NULL; return access; } void _ImagingAccessDelete(Imaging im, ImagingAccess access) { } pillow-2.3.0/libImaging/Effects.c0000644000175000001440000002337512257506326015504 0ustar dokousers/* * The Python Imaging Library * $Id$ * * various special effects and image generators * * history: * 1997-05-21 fl Just for fun * 1997-06-05 fl Added mandelbrot generator * 2003-05-24 fl Added perlin_turbulence generator (in progress) * * Copyright (c) 1997-2003 by Fredrik Lundh. * Copyright (c) 1997 by Secret Labs AB. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include Imaging ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) { /* Generate a Mandelbrot set covering the given extent */ Imaging im; int x, y, k; double width, height; double x1, y1, xi2, yi2, cr, ci, radius; double dr, di; /* Check arguments */ width = extent[2] - extent[0]; height = extent[3] - extent[1]; if (width < 0.0 || height < 0.0 || quality < 2) return (Imaging) ImagingError_ValueError(NULL); im = ImagingNew("L", xsize, ysize); if (!im) return NULL; dr = width/(xsize-1); di = height/(ysize-1); radius = 100.0; for (y = 0; y < ysize; y++) { UINT8* buf = im->image8[y]; for (x = 0; x < xsize; x++) { x1 = y1 = xi2 = yi2 = 0.0; cr = x*dr + extent[0]; ci = y*di + extent[1]; for (k = 1;; k++) { y1 = 2*x1*y1 + ci; x1 = xi2 - yi2 + cr; xi2 = x1*x1; yi2 = y1*y1; if ((xi2 + yi2) > radius) { buf[x] = k*255/quality; break; } if (k > quality) { buf[x] = 0; break; } } } } return im; } Imaging ImagingEffectNoise(int xsize, int ysize, float sigma) { /* Generate gaussian noise centered around 128 */ Imaging imOut; int x, y; int nextok; double this, next; imOut = ImagingNew("L", xsize, ysize); if (!imOut) return NULL; next = 0.0; nextok = 0; for (y = 0; y < imOut->ysize; y++) { UINT8* out = imOut->image8[y]; for (x = 0; x < imOut->xsize; x++) { if (nextok) { this = next; nextok = 0; } else { /* after numerical recepies */ double v1, v2, radius, factor; do { v1 = rand()*(2.0/32767.0) - 1.0; v2 = rand()*(2.0/32767.0) - 1.0; radius= v1*v1 + v2*v2; } while (radius >= 1.0); factor = sqrt(-2.0*log(radius)/radius); this = factor * v1; next = factor * v2; } out[x] = (unsigned char) (128 + sigma * this); } } return imOut; } Imaging ImagingEffectPerlinTurbulence(int xsize, int ysize) { /* Perlin turbulence (In progress) */ return NULL; } Imaging ImagingEffectSpread(Imaging imIn, int distance) { /* Randomly spread pixels in an image */ Imaging imOut; int x, y; imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; #define SPREAD(type, image)\ for (y = 0; y < imIn->ysize; y++)\ for (x = 0; x < imIn->xsize; x++) {\ int xx = x + (rand() % distance) - distance/2;\ int yy = y + (rand() % distance) - distance/2;\ if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) {\ imOut->image[yy][xx] = imIn->image[y][x];\ imOut->image[y][x] = imIn->image[yy][xx];\ } else\ imOut->image[y][x] = imIn->image[y][x];\ } if (imIn->image8) { SPREAD(UINT8, image8); } else { SPREAD(INT32, image32); } ImagingCopyInfo(imOut, imIn); return imOut; } /* -------------------------------------------------------------------- */ /* Taken from the "C" code in the W3C SVG specification. Translated to C89 by Fredrik Lundh */ #if 0 /* Produces results in the range [1, 2**31 - 2]. Algorithm is: r = (a * r) mod m where a = 16807 and m = 2**31 - 1 = 2147483647 See [Park & Miller], CACM vol. 31 no. 10 p. 1195, Oct. 1988 To test: the algorithm should produce the result 1043618065 as the 10,000th generated number if the original seed is 1. */ #define RAND_m 2147483647 /* 2**31 - 1 */ #define RAND_a 16807 /* 7**5; primitive root of m */ #define RAND_q 127773 /* m / a */ #define RAND_r 2836 /* m % a */ static long perlin_setup_seed(long lSeed) { if (lSeed <= 0) lSeed = -(lSeed % (RAND_m - 1)) + 1; if (lSeed > RAND_m - 1) lSeed = RAND_m - 1; return lSeed; } static long perlin_random(long lSeed) { long result; result = RAND_a * (lSeed % RAND_q) - RAND_r * (lSeed / RAND_q); if (result <= 0) result += RAND_m; return result; } #define BSize 0x100 #define BM 0xff #define PerlinN 0x1000 #define NP 12 /* 2^PerlinN */ #define NM 0xfff static int perlin_uLatticeSelector[BSize + BSize + 2]; static double perlin_fGradient[4][BSize + BSize + 2][2]; typedef struct { int nWidth; /* How much to subtract to wrap for stitching. */ int nHeight; int nWrapX; /* Minimum value to wrap. */ int nWrapY; } StitchInfo; static void perlin_init(long lSeed) { double s; int i, j, k; lSeed = perlin_setup_seed(lSeed); for(k = 0; k < 4; k++) { for(i = 0; i < BSize; i++) { perlin_uLatticeSelector[i] = i; for (j = 0; j < 2; j++) perlin_fGradient[k][i][j] = (double)(((lSeed = perlin_random(lSeed)) % (BSize + BSize)) - BSize) / BSize; s = (double) (sqrt(perlin_fGradient[k][i][0] * perlin_fGradient[k][i][0] + perlin_fGradient[k][i][1] * perlin_fGradient[k][i][1])); perlin_fGradient[k][i][0] /= s; perlin_fGradient[k][i][1] /= s; } } while(--i) { k = perlin_uLatticeSelector[i]; perlin_uLatticeSelector[i] = perlin_uLatticeSelector[j = (lSeed = perlin_random(lSeed)) % BSize]; perlin_uLatticeSelector[j] = k; } for(i = 0; i < BSize + 2; i++) { perlin_uLatticeSelector[BSize + i] = perlin_uLatticeSelector[i]; for(k = 0; k < 4; k++) for(j = 0; j < 2; j++) perlin_fGradient[k][BSize + i][j] = perlin_fGradient[k][i][j]; } } #define s_curve(t) ( t * t * (3. - 2. * t) ) #define lerp(t, a, b) ( a + t * (b - a) ) static double perlin_noise2(int nColorChannel, double vec[2], StitchInfo *pStitchInfo) { int bx0, bx1, by0, by1, b00, b10, b01, b11; double rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v; register int i, j; t = vec[0] + (double) PerlinN; bx0 = (int)t; bx1 = bx0+1; rx0 = t - (int)t; rx1 = rx0 - 1.0f; t = vec[1] + (double) PerlinN; by0 = (int)t; by1 = by0+1; ry0 = t - (int)t; ry1 = ry0 - 1.0f; /* If stitching, adjust lattice points accordingly. */ if(pStitchInfo != NULL) { if(bx0 >= pStitchInfo->nWrapX) bx0 -= pStitchInfo->nWidth; if(bx1 >= pStitchInfo->nWrapX) bx1 -= pStitchInfo->nWidth; if(by0 >= pStitchInfo->nWrapY) by0 -= pStitchInfo->nHeight; if(by1 >= pStitchInfo->nWrapY) by1 -= pStitchInfo->nHeight; } bx0 &= BM; bx1 &= BM; by0 &= BM; by1 &= BM; i = perlin_uLatticeSelector[bx0]; j = perlin_uLatticeSelector[bx1]; b00 = perlin_uLatticeSelector[i + by0]; b10 = perlin_uLatticeSelector[j + by0]; b01 = perlin_uLatticeSelector[i + by1]; b11 = perlin_uLatticeSelector[j + by1]; sx = (double) (s_curve(rx0)); sy = (double) (s_curve(ry0)); q = perlin_fGradient[nColorChannel][b00]; u = rx0 * q[0] + ry0 * q[1]; q = perlin_fGradient[nColorChannel][b10]; v = rx1 * q[0] + ry0 * q[1]; a = lerp(sx, u, v); q = perlin_fGradient[nColorChannel][b01]; u = rx0 * q[0] + ry1 * q[1]; q = perlin_fGradient[nColorChannel][b11]; v = rx1 * q[0] + ry1 * q[1]; b = lerp(sx, u, v); return lerp(sy, a, b); } double perlin_turbulence( int nColorChannel, double *point, double fBaseFreqX, double fBaseFreqY, int nNumOctaves, int bFractalSum, int bDoStitching, double fTileX, double fTileY, double fTileWidth, double fTileHeight) { StitchInfo stitch; StitchInfo *pStitchInfo = NULL; /* Not stitching when NULL. */ double fSum = 0.0f; double vec[2]; double ratio = 1; int nOctave; vec[0] = point[0] * fBaseFreqX; vec[1] = point[1] * fBaseFreqY; /* Adjust the base frequencies if necessary for stitching. */ if(bDoStitching) { /* When stitching tiled turbulence, the frequencies must be adjusted */ /* so that the tile borders will be continuous. */ if(fBaseFreqX != 0.0) { double fLoFreq = (double) (floor(fTileWidth * fBaseFreqX)) / fTileWidth; double fHiFreq = (double) (ceil(fTileWidth * fBaseFreqX)) / fTileWidth; if(fBaseFreqX / fLoFreq < fHiFreq / fBaseFreqX) fBaseFreqX = fLoFreq; else fBaseFreqX = fHiFreq; } if(fBaseFreqY != 0.0) { double fLoFreq = (double) (floor(fTileHeight * fBaseFreqY)) / fTileHeight; double fHiFreq = (double) (ceil(fTileHeight * fBaseFreqY)) / fTileHeight; if(fBaseFreqY / fLoFreq < fHiFreq / fBaseFreqY) fBaseFreqY = fLoFreq; else fBaseFreqY = fHiFreq; } /* Set up initial stitch values. */ pStitchInfo = &stitch; stitch.nWidth = (int) (fTileWidth * fBaseFreqX + 0.5f); stitch.nWrapX = (int) (fTileX * fBaseFreqX + PerlinN + stitch.nWidth); stitch.nHeight = (int) (fTileHeight * fBaseFreqY + 0.5f); stitch.nWrapY = (int) (fTileY * fBaseFreqY + PerlinN + stitch.nHeight); } for(nOctave = 0; nOctave < nNumOctaves; nOctave++) { if(bFractalSum) fSum += (double) (perlin_noise2(nColorChannel, vec, pStitchInfo) / ratio); else fSum += (double) (fabs(perlin_noise2(nColorChannel, vec, pStitchInfo)) / ratio); vec[0] *= 2; vec[1] *= 2; ratio *= 2; if(pStitchInfo != NULL) { /* Update stitch values. Subtracting PerlinN before the multiplication and */ /* adding it afterward simplifies to subtracting it once. */ stitch.nWidth *= 2; stitch.nWrapX = 2 * stitch.nWrapX - PerlinN; stitch.nHeight *= 2; stitch.nWrapY = 2 * stitch.nWrapY - PerlinN; } } return fSum; } #endif pillow-2.3.0/libImaging/Point.c0000644000175000001440000001620312257506326015206 0ustar dokousers/* * The Python Imaging Library * $Id$ * * point (pixel) translation * * history: * 1995-11-27 fl Created * 1996-03-31 fl Fixed colour support * 1996-08-13 fl Support 8-bit to "1" thresholding * 1997-05-31 fl Added floating point transform * 1998-07-02 fl Added integer point transform * 1998-07-17 fl Support L to anything lookup * 2004-12-18 fl Refactored; added I to L lookup * * Copyright (c) 1997-2004 by Secret Labs AB. * Copyright (c) 1995-2004 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" typedef struct { const void* table; } im_point_context; static void im_point_8_8(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 8-bit source, 8-bit destination */ UINT8* table = (UINT8*) context->table; for (y = 0; y < imIn->ysize; y++) { UINT8* in = imIn->image8[y]; UINT8* out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) out[x] = table[in[x]]; } } static void im_point_2x8_2x8(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 2x8-bit source, 2x8-bit destination */ UINT8* table = (UINT8*) context->table; for (y = 0; y < imIn->ysize; y++) { UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; out[3] = table[in[3]+256]; in += 4; out += 4; } } } static void im_point_3x8_3x8(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 3x8-bit source, 3x8-bit destination */ UINT8* table = (UINT8*) context->table; for (y = 0; y < imIn->ysize; y++) { UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; out[1] = table[in[1]+256]; out[2] = table[in[2]+512]; in += 4; out += 4; } } } static void im_point_4x8_4x8(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 4x8-bit source, 4x8-bit destination */ UINT8* table = (UINT8*) context->table; for (y = 0; y < imIn->ysize; y++) { UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = (UINT8*) imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; out[1] = table[in[1]+256]; out[2] = table[in[2]+512]; out[3] = table[in[3]+768]; in += 4; out += 4; } } } static void im_point_8_32(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 8-bit source, 32-bit destination */ INT32* table = (INT32*) context->table; for (y = 0; y < imIn->ysize; y++) { UINT8* in = imIn->image8[y]; INT32* out = imOut->image32[y]; for (x = 0; x < imIn->xsize; x++) out[x] = table[in[x]]; } } static void im_point_32_8(Imaging imOut, Imaging imIn, im_point_context* context) { int x, y; /* 32-bit source, 8-bit destination */ UINT8* table = (UINT8*) context->table; for (y = 0; y < imIn->ysize; y++) { INT32* in = imIn->image32[y]; UINT8* out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) { int v = in[x]; if (v < 0) v = 0; else if (v > 65535) v = 65535; out[x] = table[v]; } } } Imaging ImagingPoint(Imaging imIn, const char* mode, const void* table) { /* lookup table transform */ ImagingSectionCookie cookie; Imaging imOut; im_point_context context; void (*point)(Imaging imIn, Imaging imOut, im_point_context* context); if (!imIn) return (Imaging) ImagingError_ModeError(); if (!mode) mode = imIn->mode; if (imIn->type != IMAGING_TYPE_UINT8) { if (imIn->type != IMAGING_TYPE_INT32 || strcmp(mode, "L") != 0) goto mode_mismatch; } else if (!imIn->image8 && strcmp(imIn->mode, mode) != 0) goto mode_mismatch; imOut = ImagingNew(mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; /* find appropriate handler */ if (imIn->type == IMAGING_TYPE_UINT8) { if (imIn->bands == imOut->bands && imIn->type == imOut->type) { switch (imIn->bands) { case 1: point = im_point_8_8; break; case 2: point = im_point_2x8_2x8; break; case 3: point = im_point_3x8_3x8; break; case 4: point = im_point_4x8_4x8; break; default: /* this cannot really happen */ point = im_point_8_8; break; } } else point = im_point_8_32; } else point = im_point_32_8; ImagingCopyInfo(imOut, imIn); ImagingSectionEnter(&cookie); context.table = table; point(imOut, imIn, &context); ImagingSectionLeave(&cookie); return imOut; mode_mismatch: return (Imaging) ImagingError_ValueError( "point operation not supported for this mode" ); } Imaging ImagingPointTransform(Imaging imIn, double scale, double offset) { /* scale/offset transform */ ImagingSectionCookie cookie; Imaging imOut; int x, y; if (!imIn || (strcmp(imIn->mode, "I") != 0 && strcmp(imIn->mode, "I;16") != 0 && strcmp(imIn->mode, "F") != 0)) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; ImagingCopyInfo(imOut, imIn); switch (imIn->type) { case IMAGING_TYPE_INT32: ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { INT32* in = imIn->image32[y]; INT32* out = imOut->image32[y]; /* FIXME: add clipping? */ for (x = 0; x < imIn->xsize; x++) out[x] = in[x] * scale + offset; } ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_FLOAT32: ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { FLOAT32* in = (FLOAT32*) imIn->image32[y]; FLOAT32* out = (FLOAT32*) imOut->image32[y]; for (x = 0; x < imIn->xsize; x++) out[x] = in[x] * scale + offset; } ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_SPECIAL: if (strcmp(imIn->mode,"I;16") == 0) { ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { UINT16* in = (UINT16 *)imIn->image[y]; UINT16* out = (UINT16 *)imOut->image[y]; /* FIXME: add clipping? */ for (x = 0; x < imIn->xsize; x++) out[x] = in[x] * scale + offset; } ImagingSectionLeave(&cookie); break; } /* FALL THROUGH */ default: ImagingDelete(imOut); return (Imaging) ImagingError_ValueError("internal error"); } return imOut; } pillow-2.3.0/libImaging/Draw.c0000644000175000001440000006312612257506326015020 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * a simple drawing package for the Imaging library * * history: * 1996-04-13 fl Created. * 1996-04-30 fl Added transforms and polygon support. * 1996-08-12 fl Added filled polygons. * 1996-11-05 fl Fixed float/int confusion in polygon filler * 1997-07-04 fl Support 32-bit images (C++ would have been nice) * 1998-09-09 fl Eliminated qsort casts; improved rectangle clipping * 1998-09-10 fl Fixed fill rectangle to include lower edge (!) * 1998-12-29 fl Added arc, chord, and pieslice primitives * 1999-01-10 fl Added some level 2 ("arrow") stuff (experimental) * 1999-02-06 fl Added bitmap primitive * 1999-07-26 fl Eliminated a compiler warning * 1999-07-31 fl Pass ink as void* instead of int * 2002-12-10 fl Added experimental RGBA-on-RGB drawing * 2004-09-04 fl Support simple wide lines (no joins) * 2005-05-25 fl Fixed line width calculation * * Copyright (c) 1996-2006 by Fredrik Lundh * Copyright (c) 1997-2006 by Secret Labs AB. * * See the README file for information on usage and redistribution. */ /* FIXME: support fill/outline attribute for all filled shapes */ /* FIXME: support zero-winding fill */ /* FIXME: add drawing context, support affine transforms */ /* FIXME: support clip window (and mask?) */ #include "Imaging.h" #include #define CEIL(v) (int) ceil(v) #define FLOOR(v) ((v) >= 0.0 ? (int) (v) : (int) floor(v)) #define INK8(ink) (*(UINT8*)ink) #define INK32(ink) (*(INT32*)ink) /* like (a * b + 127) / 255), but much faster on most platforms */ #define MULDIV255(a, b, tmp)\ (tmp = (a) * (b) + 128, ((((tmp) >> 8) + (tmp)) >> 8)) #define BLEND(mask, in1, in2, tmp1, tmp2)\ (MULDIV255(in1, 255 - mask, tmp1) + MULDIV255(in2, mask, tmp2)) /* -------------------------------------------------------------------- */ /* Primitives */ /* -------------------------------------------------------------------- */ typedef struct { /* edge descriptor for polygon engine */ int d; int x0, y0; int xmin, ymin, xmax, ymax; float dx; } Edge; static inline void point8(Imaging im, int x, int y, int ink) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) im->image8[y][x] = (UINT8) ink; } static inline void point32(Imaging im, int x, int y, int ink) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) im->image32[y][x] = ink; } static inline void point32rgba(Imaging im, int x, int y, int ink) { unsigned int tmp1, tmp2; if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { UINT8* out = (UINT8*) im->image[y]+x*4; UINT8* in = (UINT8*) &ink; out[0] = BLEND(in[3], out[0], in[0], tmp1, tmp2); out[1] = BLEND(in[3], out[1], in[1], tmp1, tmp2); out[2] = BLEND(in[3], out[2], in[2], tmp1, tmp2); } } static inline void hline8(Imaging im, int x0, int y0, int x1, int ink) { int tmp; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) tmp = x0, x0 = x1, x1 = tmp; if (x0 < 0) x0 = 0; else if (x0 >= im->xsize) return; if (x1 < 0) return; else if (x1 >= im->xsize) x1 = im->xsize-1; if (x0 <= x1) memset(im->image8[y0] + x0, (UINT8) ink, x1 - x0 + 1); } } static inline void hline32(Imaging im, int x0, int y0, int x1, int ink) { int tmp; INT32* p; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) tmp = x0, x0 = x1, x1 = tmp; if (x0 < 0) x0 = 0; else if (x0 >= im->xsize) return; if (x1 < 0) return; else if (x1 >= im->xsize) x1 = im->xsize-1; p = im->image32[y0]; while (x0 <= x1) p[x0++] = ink; } } static inline void hline32rgba(Imaging im, int x0, int y0, int x1, int ink) { int tmp; unsigned int tmp1, tmp2; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) tmp = x0, x0 = x1, x1 = tmp; if (x0 < 0) x0 = 0; else if (x0 >= im->xsize) return; if (x1 < 0) return; else if (x1 >= im->xsize) x1 = im->xsize-1; if (x0 <= x1) { UINT8* out = (UINT8*) im->image[y0]+x0*4; UINT8* in = (UINT8*) &ink; while (x0 <= x1) { out[0] = BLEND(in[3], out[0], in[0], tmp1, tmp2); out[1] = BLEND(in[3], out[1], in[1], tmp1, tmp2); out[2] = BLEND(in[3], out[2], in[2], tmp1, tmp2); x0++; out += 4; } } } } static inline void line8(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ dx = x1-x0; if (dx < 0) dx = -dx, xs = -1; else xs = 1; dy = y1-y0; if (dy < 0) dy = -dy, ys = -1; else ys = 1; n = (dx > dy) ? dx : dy; if (dx == 0) /* vertical */ for (i = 0; i < dy; i++) { point8(im, x0, y0, ink); y0 += ys; } else if (dy == 0) /* horizontal */ for (i = 0; i < dx; i++) { point8(im, x0, y0, ink); x0 += xs; } else if (dx > dy) { /* bresenham, horizontal slope */ n = dx; dy += dy; e = dy - dx; dx += dx; for (i = 0; i < n; i++) { point8(im, x0, y0, ink); if (e >= 0) { y0 += ys; e -= dx; } e += dy; x0 += xs; } } else { /* bresenham, vertical slope */ n = dy; dx += dx; e = dx - dy; dy += dy; for (i = 0; i < n; i++) { point8(im, x0, y0, ink); if (e >= 0) { x0 += xs; e -= dy; } e += dx; y0 += ys; } } } static inline void line32(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ dx = x1-x0; if (dx < 0) dx = -dx, xs = -1; else xs = 1; dy = y1-y0; if (dy < 0) dy = -dy, ys = -1; else ys = 1; n = (dx > dy) ? dx : dy; if (dx == 0) /* vertical */ for (i = 0; i < dy; i++) { point32(im, x0, y0, ink); y0 += ys; } else if (dy == 0) /* horizontal */ for (i = 0; i < dx; i++) { point32(im, x0, y0, ink); x0 += xs; } else if (dx > dy) { /* bresenham, horizontal slope */ n = dx; dy += dy; e = dy - dx; dx += dx; for (i = 0; i < n; i++) { point32(im, x0, y0, ink); if (e >= 0) { y0 += ys; e -= dx; } e += dy; x0 += xs; } } else { /* bresenham, vertical slope */ n = dy; dx += dx; e = dx - dy; dy += dy; for (i = 0; i < n; i++) { point32(im, x0, y0, ink); if (e >= 0) { x0 += xs; e -= dy; } e += dx; y0 += ys; } } } static inline void line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ dx = x1-x0; if (dx < 0) dx = -dx, xs = -1; else xs = 1; dy = y1-y0; if (dy < 0) dy = -dy, ys = -1; else ys = 1; n = (dx > dy) ? dx : dy; if (dx == 0) /* vertical */ for (i = 0; i < dy; i++) { point32rgba(im, x0, y0, ink); y0 += ys; } else if (dy == 0) /* horizontal */ for (i = 0; i < dx; i++) { point32rgba(im, x0, y0, ink); x0 += xs; } else if (dx > dy) { /* bresenham, horizontal slope */ n = dx; dy += dy; e = dy - dx; dx += dx; for (i = 0; i < n; i++) { point32rgba(im, x0, y0, ink); if (e >= 0) { y0 += ys; e -= dx; } e += dy; x0 += xs; } } else { /* bresenham, vertical slope */ n = dy; dx += dx; e = dx - dy; dy += dy; for (i = 0; i < n; i++) { point32rgba(im, x0, y0, ink); if (e >= 0) { x0 += xs; e -= dy; } e += dx; y0 += ys; } } } static int x_cmp(const void *x0, const void *x1) { float diff = *((float*)x0) - *((float*)x1); if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } static inline int polygon8(Imaging im, int n, Edge *e, int ink, int eofill) { int i, j; float *xx; int ymin, ymax; float y; if (n <= 0) return 0; /* Find upper and lower polygon boundary (within image) */ ymin = e[0].ymin; ymax = e[0].ymax; for (i = 1; i < n; i++) { if (e[i].ymin < ymin) ymin = e[i].ymin; if (e[i].ymax > ymax) ymax = e[i].ymax; } if (ymin < 0) ymin = 0; if (ymax >= im->ysize) ymax = im->ysize-1; /* Process polygon edges */ xx = malloc(n * sizeof(float)); if (!xx) return -1; for (;ymin <= ymax; ymin++) { y = ymin+0.5F; for (i = j = 0; i < n; i++) if (y >= e[i].ymin && y <= e[i].ymax) { if (e[i].d == 0) hline8(im, e[i].xmin, ymin, e[i].xmax, ink); else xx[j++] = (y-e[i].y0) * e[i].dx + e[i].x0; } if (j == 2) { if (xx[0] < xx[1]) hline8(im, CEIL(xx[0]-0.5), ymin, FLOOR(xx[1]+0.5), ink); else hline8(im, CEIL(xx[1]-0.5), ymin, FLOOR(xx[0]+0.5), ink); } else { qsort(xx, j, sizeof(float), x_cmp); for (i = 0; i < j-1 ; i += 2) hline8(im, CEIL(xx[i]-0.5), ymin, FLOOR(xx[i+1]+0.5), ink); } } free(xx); return 0; } static inline int polygon32(Imaging im, int n, Edge *e, int ink, int eofill) { int i, j; float *xx; int ymin, ymax; float y; if (n <= 0) return 0; /* Find upper and lower polygon boundary (within image) */ ymin = e[0].ymin; ymax = e[0].ymax; for (i = 1; i < n; i++) { if (e[i].ymin < ymin) ymin = e[i].ymin; if (e[i].ymax > ymax) ymax = e[i].ymax; } if (ymin < 0) ymin = 0; if (ymax >= im->ysize) ymax = im->ysize-1; /* Process polygon edges */ xx = malloc(n * sizeof(float)); if (!xx) return -1; for (;ymin <= ymax; ymin++) { y = ymin+0.5F; for (i = j = 0; i < n; i++) { if (y >= e[i].ymin && y <= e[i].ymax) { if (e[i].d == 0) hline32(im, e[i].xmin, ymin, e[i].xmax, ink); else xx[j++] = (y-e[i].y0) * e[i].dx + e[i].x0; } } if (j == 2) { if (xx[0] < xx[1]) hline32(im, CEIL(xx[0]-0.5), ymin, FLOOR(xx[1]+0.5), ink); else hline32(im, CEIL(xx[1]-0.5), ymin, FLOOR(xx[0]+0.5), ink); } else { qsort(xx, j, sizeof(float), x_cmp); for (i = 0; i < j-1 ; i += 2) hline32(im, CEIL(xx[i]-0.5), ymin, FLOOR(xx[i+1]+0.5), ink); } } free(xx); return 0; } static inline int polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) { int i, j; float *xx; int ymin, ymax; float y; if (n <= 0) return 0; /* Find upper and lower polygon boundary (within image) */ ymin = e[0].ymin; ymax = e[0].ymax; for (i = 1; i < n; i++) { if (e[i].ymin < ymin) ymin = e[i].ymin; if (e[i].ymax > ymax) ymax = e[i].ymax; } if (ymin < 0) ymin = 0; if (ymax >= im->ysize) ymax = im->ysize-1; /* Process polygon edges */ xx = malloc(n * sizeof(float)); if (!xx) return -1; for (;ymin <= ymax; ymin++) { y = ymin+0.5F; for (i = j = 0; i < n; i++) { if (y >= e[i].ymin && y <= e[i].ymax) { if (e[i].d == 0) hline32rgba(im, e[i].xmin, ymin, e[i].xmax, ink); else xx[j++] = (y-e[i].y0) * e[i].dx + e[i].x0; } } if (j == 2) { if (xx[0] < xx[1]) hline32rgba(im, CEIL(xx[0]-0.5), ymin, FLOOR(xx[1]+0.5), ink); else hline32rgba(im, CEIL(xx[1]-0.5), ymin, FLOOR(xx[0]+0.5), ink); } else { qsort(xx, j, sizeof(float), x_cmp); for (i = 0; i < j-1 ; i += 2) hline32rgba(im, CEIL(xx[i]-0.5), ymin, FLOOR(xx[i+1]+0.5), ink); } } free(xx); return 0; } static inline void add_edge(Edge *e, int x0, int y0, int x1, int y1) { /* printf("edge %d %d %d %d\n", x0, y0, x1, y1); */ if (x0 <= x1) e->xmin = x0, e->xmax = x1; else e->xmin = x1, e->xmax = x0; if (y0 <= y1) e->ymin = y0, e->ymax = y1; else e->ymin = y1, e->ymax = y0; if (y0 == y1) { e->d = 0; e->dx = 0.0; } else { e->dx = ((float)(x1-x0)) / (y1-y0); if (y0 == e->ymin) e->d = 1; else e->d = -1; } e->x0 = x0; e->y0 = y0; } typedef struct { void (*point)(Imaging im, int x, int y, int ink); void (*hline)(Imaging im, int x0, int y0, int x1, int ink); void (*line)(Imaging im, int x0, int y0, int x1, int y1, int ink); int (*polygon)(Imaging im, int n, Edge *e, int ink, int eofill); } DRAW; DRAW draw8 = { point8, hline8, line8, polygon8 }; DRAW draw32 = { point32, hline32, line32, polygon32 }; DRAW draw32rgba = { point32rgba, hline32rgba, line32rgba, polygon32rgba }; /* -------------------------------------------------------------------- */ /* Interface */ /* -------------------------------------------------------------------- */ #define DRAWINIT()\ if (im->image8) {\ draw = &draw8;\ ink = INK8(ink_);\ } else {\ draw = (op) ? &draw32rgba : &draw32; \ ink = INK32(ink_);\ } int ImagingDrawPoint(Imaging im, int x0, int y0, const void* ink_, int op) { DRAW* draw; INT32 ink; DRAWINIT(); draw->point(im, x0, y0, ink); return 0; } int ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, int op) { DRAW* draw; INT32 ink; DRAWINIT(); draw->line(im, x0, y0, x1, y1, ink); return 0; } int ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, int width, int op) { DRAW* draw; INT32 ink; Edge e[4]; int dx, dy; double d; DRAWINIT(); if (width <= 1) { draw->line(im, x0, y0, x1, y1, ink); return 0; } dx = x1-x0; dy = y1-y0; if (dx == 0 && dy == 0) { draw->point(im, x0, y0, ink); return 0; } d = width / sqrt((float) (dx*dx + dy*dy)) / 2.0; dx = (int) floor(d * (y1-y0) + 0.5); dy = (int) floor(d * (x1-x0) + 0.5); add_edge(e+0, x0 - dx, y0 + dy, x1 - dx, y1 + dy); add_edge(e+1, x1 - dx, y1 + dy, x1 + dx, y1 - dy); add_edge(e+2, x1 + dx, y1 - dy, x0 + dx, y0 - dy); add_edge(e+3, x0 + dx, y0 - dy, x0 - dx, y0 + dy); draw->polygon(im, 4, e, ink, 0); return 0; } int ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, int fill, int op) { int y; int tmp; DRAW* draw; INT32 ink; DRAWINIT(); if (y0 > y1) tmp = y0, y0 = y1, y1 = tmp; if (fill) { if (y0 < 0) y0 = 0; else if (y0 >= im->ysize) return 0; if (y1 < 0) return 0; else if (y1 > im->ysize) y1 = im->ysize; for (y = y0; y <= y1; y++) draw->hline(im, x0, y, x1, ink); } else { /* outline */ draw->line(im, x0, y0, x1, y0, ink); draw->line(im, x1, y0, x1, y1, ink); draw->line(im, x1, y1, x0, y1, ink); draw->line(im, x0, y1, x0, y0, ink); } return 0; } int ImagingDrawPolygon(Imaging im, int count, int* xy, const void* ink_, int fill, int op) { int i, n; DRAW* draw; INT32 ink; if (count <= 0) return 0; DRAWINIT(); if (fill) { /* Build edge list */ Edge* e = malloc(count * sizeof(Edge)); if (!e) { (void) ImagingError_MemoryError(); return -1; } for (i = n = 0; i < count-1; i++) add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3]); if (xy[i+i] != xy[0] || xy[i+i+1] != xy[1]) add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[0], xy[1]); draw->polygon(im, n, e, ink, 0); free(e); } else { /* Outline */ for (i = 0; i < count-1; i++) draw->line(im, xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3], ink); draw->line(im, xy[i+i], xy[i+i+1], xy[0], xy[1], ink); } return 0; } int ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink, int op) { return ImagingFill2( im, ink, bitmap, x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize ); } /* -------------------------------------------------------------------- */ /* standard shapes */ #define ARC 0 #define CHORD 1 #define PIESLICE 2 static int ellipse(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink_, int fill, int mode, int op) { int i, n; int cx, cy; int w, h; int x = 0, y = 0; int lx = 0, ly = 0; int sx = 0, sy = 0; DRAW* draw; INT32 ink; w = x1 - x0; h = y1 - y0; if (w < 0 || h < 0) return 0; DRAWINIT(); cx = (x0 + x1) / 2; cy = (y0 + y1) / 2; while (end < start) end += 360; if (mode != ARC && fill) { /* Build edge list */ Edge* e = malloc((end - start + 3) * sizeof(Edge)); if (!e) { ImagingError_MemoryError(); return -1; } n = 0; for (i = start; i <= end; i++) { x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); if (i != start) add_edge(&e[n++], lx, ly, x, y); else sx = x, sy = y; lx = x, ly = y; } if (n > 0) { /* close and draw polygon */ if (mode == PIESLICE) { if (x != cx || y != cy) { add_edge(&e[n++], x, y, cx, cy); add_edge(&e[n++], cx, cy, sx, sy); } } else { if (x != sx || y != sy) add_edge(&e[n++], x, y, sx, sy); } draw->polygon(im, n, e, ink, 0); } free(e); } else { for (i = start; i <= end; i++) { x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); if (i != start) draw->line(im, lx, ly, x, y, ink); else sx = x, sy = y; lx = x, ly = y; } if (i != start) { if (mode == PIESLICE) { if (x != cx || y != cy) { draw->line(im, x, y, cx, cy, ink); draw->line(im, cx, cy, sx, sy, ink); } } else if (mode == CHORD) { if (x != sx || y != sy) draw->line(im, x, y, sx, sy, ink); } } } return 0; } int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int op) { return ellipse(im, x0, y0, x1, y1, start, end, ink, 0, ARC, op); } int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int fill, int op) { return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, CHORD, op); } int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, const void* ink, int fill, int op) { return ellipse(im, x0, y0, x1, y1, 0, 360, ink, fill, CHORD, op); } int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, int start, int end, const void* ink, int fill, int op) { return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, PIESLICE, op); } /* -------------------------------------------------------------------- */ /* experimental level 2 ("arrow") graphics stuff. this implements portions of the arrow api on top of the Edge structure. the semantics are ok, except that "curve" flattens the bezier curves by itself */ #if 1 /* ARROW_GRAPHICS */ struct ImagingOutlineInstance { float x0, y0; float x, y; int count; Edge *edges; int size; }; ImagingOutline ImagingOutlineNew(void) { ImagingOutline outline; outline = calloc(1, sizeof(struct ImagingOutlineInstance)); if (!outline) return (ImagingOutline) ImagingError_MemoryError(); outline->edges = NULL; outline->count = outline->size = 0; ImagingOutlineMove(outline, 0, 0); return outline; } void ImagingOutlineDelete(ImagingOutline outline) { if (!outline) return; if (outline->edges) free(outline->edges); free(outline); } static Edge* allocate(ImagingOutline outline, int extra) { Edge* e; if (outline->count + extra > outline->size) { /* expand outline buffer */ outline->size += extra + 25; if (!outline->edges) e = malloc(outline->size * sizeof(Edge)); else e = realloc(outline->edges, outline->size * sizeof(Edge)); if (!e) return NULL; outline->edges = e; } e = outline->edges + outline->count; outline->count += extra; return e; } int ImagingOutlineMove(ImagingOutline outline, float x0, float y0) { outline->x = outline->x0 = x0; outline->y = outline->y0 = y0; return 0; } int ImagingOutlineLine(ImagingOutline outline, float x1, float y1) { Edge* e; e = allocate(outline, 1); if (!e) return -1; /* out of memory */ add_edge(e, (int) outline->x, (int) outline->y, (int) x1, (int) y1); outline->x = x1; outline->y = y1; return 0; } int ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3) { Edge* e; int i; float xo, yo; #define STEPS 32 e = allocate(outline, STEPS); if (!e) return -1; /* out of memory */ xo = outline->x; yo = outline->y; /* flatten the bezier segment */ for (i = 1; i <= STEPS; i++) { float t = ((float) i) / STEPS; float t2 = t*t; float t3 = t2*t; float u = 1.0F - t; float u2 = u*u; float u3 = u2*u; float x = outline->x*u3 + 3*(x1*t*u2 + x2*t2*u) + x3*t3 + 0.5; float y = outline->y*u3 + 3*(y1*t*u2 + y2*t2*u) + y3*t3 + 0.5; add_edge(e++, xo, yo, (int) x, (int) y); xo = x, yo = y; } outline->x = xo; outline->y = yo; return 0; } int ImagingOutlineCurve2(ImagingOutline outline, float cx, float cy, float x3, float y3) { /* add bezier curve based on three control points (as in the Flash file format) */ return ImagingOutlineCurve( outline, (outline->x + cx + cx)/3, (outline->y + cy + cy)/3, (cx + cx + x3)/3, (cy + cy + y3)/3, x3, y3); } int ImagingOutlineClose(ImagingOutline outline) { if (outline->x == outline->x0 && outline->y == outline->y0) return 0; return ImagingOutlineLine(outline, outline->x0, outline->y0); } int ImagingOutlineTransform(ImagingOutline outline, double a[6]) { Edge *eIn; Edge *eOut; int i, n; int x0, y0, x1, y1; int X0, Y0, X1, Y1; double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; eIn = outline->edges; n = outline->count; /* FIXME: ugly! */ outline->edges = NULL; outline->count = outline->size = 0; eOut = allocate(outline, n); if (!eOut) { outline->edges = eIn; outline->count = outline->size = n; ImagingError_MemoryError(); return -1; } for (i = 0; i < n; i++) { x0 = eIn->x0; y0 = eIn->y0; /* FIXME: ouch! */ if (eIn->x0 == eIn->xmin) x1 = eIn->xmax; else x1 = eIn->xmin; if (eIn->y0 == eIn->ymin) y1 = eIn->ymax; else y1 = eIn->ymin; /* full moon tonight! if this doesn't work, you may need to upgrade your compiler (make sure you have the right service pack) */ X0 = (int) (a0*x0 + a1*y0 + a2); Y0 = (int) (a3*x0 + a4*y0 + a5); X1 = (int) (a0*x1 + a1*y1 + a2); Y1 = (int) (a3*x1 + a4*y1 + a5); add_edge(eOut, X0, Y0, X1, Y1); eIn++; eOut++; } free(eIn); return 0; } int ImagingDrawOutline(Imaging im, ImagingOutline outline, const void* ink_, int fill, int op) { DRAW* draw; INT32 ink; DRAWINIT(); draw->polygon(im, outline->count, outline->edges, ink, 0); return 0; } #endif pillow-2.3.0/libImaging/ImDib.h0000644000175000001440000000253112257506326015105 0ustar dokousers/* * The Python Imaging Library * $Id$ * * Windows DIB specifics * * Copyright (c) Secret Labs AB 1997-98. * Copyright (c) Fredrik Lundh 1996. * * See the README file for information on usage and redistribution. */ #ifdef WIN32 #if (defined(_MSC_VER) && _MSC_VER >= 1200) || (defined __GNUC__) /* already defined in basetsd.h */ #undef INT8 #undef UINT8 #undef INT16 #undef UINT16 #undef INT32 #undef INT64 #undef UINT32 #endif #include #if defined(__cplusplus) extern "C" { #endif struct ImagingDIBInstance { /* Windows interface */ HDC dc; HBITMAP bitmap; HGDIOBJ old_bitmap; BITMAPINFO *info; UINT8 *bits; HPALETTE palette; /* Used by cut and paste */ char mode[4]; int xsize, ysize; int pixelsize; int linesize; ImagingShuffler pack; ImagingShuffler unpack; }; typedef struct ImagingDIBInstance* ImagingDIB; extern char* ImagingGetModeDIB(int size_out[2]); extern ImagingDIB ImagingNewDIB(const char *mode, int xsize, int ysize); extern void ImagingDeleteDIB(ImagingDIB im); extern void ImagingDrawDIB(ImagingDIB dib, int dc, int dst[4], int src[4]); extern void ImagingExposeDIB(ImagingDIB dib, int dc); extern int ImagingQueryPaletteDIB(ImagingDIB dib, int dc); extern void ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]); #if defined(__cplusplus) } #endif #endif pillow-2.3.0/libImaging/Storage.c0000644000175000001440000002551612257512250015521 0ustar dokousers/* * The Python Imaging Library * $Id$ * * imaging storage object * * This baseline implementation is designed to efficiently handle * large images, provided they fit into the available memory. * * history: * 1995-06-15 fl Created * 1995-09-12 fl Updated API, compiles silently under ANSI C++ * 1995-11-26 fl Compiles silently under Borland 4.5 as well * 1996-05-05 fl Correctly test status from Prologue * 1997-05-12 fl Increased THRESHOLD (to speed up Tk interface) * 1997-05-30 fl Added support for floating point images * 1997-11-17 fl Added support for "RGBX" images * 1998-01-11 fl Added support for integer images * 1998-03-05 fl Exported Prologue/Epilogue functions * 1998-07-01 fl Added basic "YCrCb" support * 1998-07-03 fl Attach palette in prologue for "P" images * 1998-07-09 hk Don't report MemoryError on zero-size images * 1998-07-12 fl Change "YCrCb" to "YCbCr" (!) * 1998-10-26 fl Added "I;16" and "I;16B" storage modes (experimental) * 1998-12-29 fl Fixed allocation bug caused by previous fix * 1999-02-03 fl Added "RGBa" and "BGR" modes (experimental) * 2001-04-22 fl Fixed potential memory leak in ImagingCopyInfo * 2003-09-26 fl Added "LA" and "PA" modes (experimental) * 2005-10-02 fl Added image counter * * Copyright (c) 1998-2005 by Secret Labs AB * Copyright (c) 1995-2005 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include int ImagingNewCount = 0; /* -------------------------------------------------------------------- * Standard image object. */ Imaging ImagingNewPrologueSubtype(const char *mode, unsigned xsize, unsigned ysize, int size) { Imaging im; ImagingSectionCookie cookie; im = (Imaging) calloc(1, size); if (!im) return (Imaging) ImagingError_MemoryError(); /* Setup image descriptor */ im->xsize = xsize; im->ysize = ysize; im->type = IMAGING_TYPE_UINT8; if (strcmp(mode, "1") == 0) { /* 1-bit images */ im->bands = im->pixelsize = 1; im->linesize = xsize; } else if (strcmp(mode, "P") == 0) { /* 8-bit palette mapped images */ im->bands = im->pixelsize = 1; im->linesize = xsize; im->palette = ImagingPaletteNew("RGB"); } else if (strcmp(mode, "PA") == 0) { /* 8-bit palette with alpha */ im->bands = 2; im->pixelsize = 4; /* store in image32 memory */ im->linesize = xsize * 4; im->palette = ImagingPaletteNew("RGB"); } else if (strcmp(mode, "L") == 0) { /* 8-bit greyscale (luminance) images */ im->bands = im->pixelsize = 1; im->linesize = xsize; } else if (strcmp(mode, "LA") == 0) { /* 8-bit greyscale (luminance) with alpha */ im->bands = 2; im->pixelsize = 4; /* store in image32 memory */ im->linesize = xsize * 4; } else if (strcmp(mode, "F") == 0) { /* 32-bit floating point images */ im->bands = 1; im->pixelsize = 4; im->linesize = xsize * 4; im->type = IMAGING_TYPE_FLOAT32; } else if (strcmp(mode, "I") == 0) { /* 32-bit integer images */ im->bands = 1; im->pixelsize = 4; im->linesize = xsize * 4; im->type = IMAGING_TYPE_INT32; } else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 \ || strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) { /* EXPERIMENTAL */ /* 16-bit raw integer images */ im->bands = 1; im->pixelsize = 2; im->linesize = xsize * 2; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "RGB") == 0) { /* 24-bit true colour images */ im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "BGR;15") == 0) { /* EXPERIMENTAL */ /* 15-bit true colour */ im->bands = 1; im->pixelsize = 2; im->linesize = (xsize*2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;16") == 0) { /* EXPERIMENTAL */ /* 16-bit reversed true colour */ im->bands = 1; im->pixelsize = 2; im->linesize = (xsize*2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;24") == 0) { /* EXPERIMENTAL */ /* 24-bit reversed true colour */ im->bands = 1; im->pixelsize = 3; im->linesize = (xsize*3 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;32") == 0) { /* EXPERIMENTAL */ /* 32-bit reversed true colour */ im->bands = 1; im->pixelsize = 4; im->linesize = (xsize*4 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "RGBX") == 0) { /* 32-bit true colour images with padding */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "RGBA") == 0) { /* 32-bit true colour images with alpha */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "RGBa") == 0) { /* EXPERIMENTAL */ /* 32-bit true colour images with premultiplied alpha */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "CMYK") == 0) { /* 32-bit colour separation */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "YCbCr") == 0) { /* 24-bit video format */ im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; } else if (strcmp(mode, "LAB") == 0) { /* 24-bit color, luminance, + 2 color channels */ /* L is uint8, a,b are int8 */ im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; } else { free(im); return (Imaging) ImagingError_ValueError("unrecognized mode"); } /* Setup image descriptor */ strcpy(im->mode, mode); ImagingSectionEnter(&cookie); /* Pointer array (allocate at least one line, to avoid MemoryError exceptions on platforms where calloc(0, x) returns NULL) */ im->image = (char **) calloc((ysize > 0) ? ysize : 1, sizeof(void *)); ImagingSectionLeave(&cookie); if (!im->image) { free(im); return (Imaging) ImagingError_MemoryError(); } ImagingNewCount++; return im; } Imaging ImagingNewPrologue(const char *mode, unsigned xsize, unsigned ysize) { return ImagingNewPrologueSubtype( mode, xsize, ysize, sizeof(struct ImagingMemoryInstance) ); } Imaging ImagingNewEpilogue(Imaging im) { /* If the raster data allocator didn't setup a destructor, assume that it couldn't allocate the required amount of memory. */ if (!im->destroy) return (Imaging) ImagingError_MemoryError(); /* Initialize alias pointers to pixel data. */ switch (im->pixelsize) { case 1: case 2: case 3: im->image8 = (UINT8 **) im->image; break; case 4: im->image32 = (INT32 **) im->image; break; } return im; } void ImagingDelete(Imaging im) { if (!im) return; if (im->palette) ImagingPaletteDelete(im->palette); if (im->destroy) im->destroy(im); if (im->image) free(im->image); free(im); } /* Array Storage Type */ /* ------------------ */ /* Allocate image as an array of line buffers. */ static void ImagingDestroyArray(Imaging im) { int y; if (im->image) for (y = 0; y < im->ysize; y++) if (im->image[y]) free(im->image[y]); } Imaging ImagingNewArray(const char *mode, int xsize, int ysize) { Imaging im; ImagingSectionCookie cookie; int y; char* p; im = ImagingNewPrologue(mode, xsize, ysize); if (!im) return NULL; ImagingSectionEnter(&cookie); /* Allocate image as an array of lines */ for (y = 0; y < im->ysize; y++) { p = (char *) malloc(im->linesize); if (!p) { ImagingDestroyArray(im); break; } im->image[y] = p; } ImagingSectionLeave(&cookie); if (y == im->ysize) im->destroy = ImagingDestroyArray; return ImagingNewEpilogue(im); } /* Block Storage Type */ /* ------------------ */ /* Allocate image as a single block. */ static void ImagingDestroyBlock(Imaging im) { if (im->block) free(im->block); } Imaging ImagingNewBlock(const char *mode, int xsize, int ysize) { Imaging im; Py_ssize_t y, i; Py_ssize_t bytes; im = ImagingNewPrologue(mode, xsize, ysize); if (!im) return NULL; /* Use a single block */ bytes = (Py_ssize_t) im->ysize * im->linesize; if (bytes <= 0) /* some platforms return NULL for malloc(0); this fix prevents MemoryError on zero-sized images on such platforms */ bytes = 1; im->block = (char *) malloc(bytes); if (im->block) { memset(im->block, 0, bytes); for (y = i = 0; y < im->ysize; y++) { im->image[y] = im->block + i; i += im->linesize; } im->destroy = ImagingDestroyBlock; } return ImagingNewEpilogue(im); } /* -------------------------------------------------------------------- * Create a new, internally allocated, image. */ #if defined(IMAGING_SMALL_MODEL) #define THRESHOLD 16384L #else #define THRESHOLD (2048*2048*4L) #endif Imaging ImagingNew(const char* mode, int xsize, int ysize) { int bytes; Imaging im; if (strlen(mode) == 1) { if (mode[0] == 'F' || mode[0] == 'I') bytes = 4; else bytes = 1; } else bytes = strlen(mode); /* close enough */ if ((Py_ssize_t) xsize * ysize * bytes <= THRESHOLD) { im = ImagingNewBlock(mode, xsize, ysize); if (im) return im; /* assume memory error; try allocating in array mode instead */ ImagingError_Clear(); } return ImagingNewArray(mode, xsize, ysize); } Imaging ImagingNew2(const char* mode, Imaging imOut, Imaging imIn) { /* allocate or validate output image */ if (imOut) { /* make sure images match */ if (strcmp(imOut->mode, mode) != 0 || imOut->xsize != imIn->xsize || imOut->ysize != imIn->ysize) { return ImagingError_Mismatch(); } } else { /* create new image */ imOut = ImagingNew(mode, imIn->xsize, imIn->ysize); if (!imOut) return NULL; } return imOut; } void ImagingCopyInfo(Imaging destination, Imaging source) { if (source->palette) { if (destination->palette) ImagingPaletteDelete(destination->palette); destination->palette = ImagingPaletteDuplicate(source->palette); } } pillow-2.3.0/libImaging/Raw.h0000644000175000001440000000034012257506326014646 0ustar dokousers/* Raw.h */ typedef struct { /* CONFIGURATION */ /* Distance between lines (0=no padding) */ int stride; /* PRIVATE (initialized by decoder) */ /* Padding between lines */ int skip; } RAWSTATE; pillow-2.3.0/libImaging/HexDecode.c0000644000175000001440000000211012257506326015735 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for hex encoded image data * * history: * 96-05-16 fl Created * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ (v >= 'A' && v <= 'F') ? v - 'A' + 10 : -1) int ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* ptr; int a, b; ptr = buf; for (;;) { if (bytes < 2) return ptr - buf; a = HEX(ptr[0]); b = HEX(ptr[1]); if (a < 0 || b < 0) { ptr++; bytes--; } else { ptr += 2; bytes -= 2; state->buffer[state->x] = (a<<4) + b; if (++state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y], state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } } } pillow-2.3.0/libImaging/Jpeg.h0000644000175000001440000000426012257506326015007 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * declarations for the IJG JPEG codec interface. * * Copyright (c) 1995-2001 by Secret Labs AB * Copyright (c) 1995-1996 by Fredrik Lundh */ #include "jpeglib.h" #include typedef struct { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ } JPEGERROR; /* -------------------------------------------------------------------- */ /* Decoder */ typedef struct { struct jpeg_source_mgr pub; int skip; } JPEGSOURCE; typedef struct { /* CONFIGURATION */ /* Jpeg file mode (empty if not known) */ char jpegmode[8+1]; /* Converter output mode (input to the shuffler). If empty, convert conversions are disabled */ char rawmode[8+1]; /* If set, trade quality for speed */ int draft; /* Scale factor (1, 2, 4, 8) */ int scale; /* PRIVATE CONTEXT (set by decoder) */ struct jpeg_decompress_struct cinfo; JPEGERROR error; JPEGSOURCE source; } JPEGSTATE; /* -------------------------------------------------------------------- */ /* Encoder */ typedef struct { struct jpeg_destination_mgr pub; /* might add something some other day */ } JPEGDESTINATION; typedef struct { /* CONFIGURATION */ /* Quality (1-100, 0 means default) */ int quality; /* Progressive mode */ int progressive; /* Smoothing factor (1-100, 0 means none) */ int smooth; /* Optimize Huffman tables (slow) */ int optimize; /* Stream type (0=full, 1=tables only, 2=image only) */ int streamtype; /* DPI setting (0=square pixels, otherwide DPI) */ int xdpi, ydpi; /* Chroma Subsampling (-1=default, 0=none, 1=medium, 2=high) */ int subsampling; /* Custom quantization tables () */ unsigned int **qtables; /* Extra data (to be injected after header) */ char* extra; int extra_size; /* PRIVATE CONTEXT (set by encoder) */ struct jpeg_compress_struct cinfo; JPEGERROR error; JPEGDESTINATION destination; int extra_offset; int rawExifLen; /* EXIF data length */ char* rawExif; /* EXIF buffer pointer */ } JPEGENCODERSTATE; pillow-2.3.0/libImaging/JpegEncode.c0000644000175000001440000002113412257506326016117 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * coder for JPEG data * * history: * 1996-05-06 fl created * 1996-07-16 fl don't drop last block of encoded data * 1996-12-30 fl added quality and progressive settings * 1997-01-08 fl added streamtype settings * 1998-01-31 fl adapted to libjpeg 6a * 1998-07-12 fl added YCbCr support * 2001-04-16 fl added DPI write support * * Copyright (c) 1997-2001 by Secret Labs AB * Copyright (c) 1995-1997 by Fredrik Lundh * * See the README file for details on usage and redistribution. */ #include "Imaging.h" #ifdef HAVE_LIBJPEG #undef HAVE_PROTOTYPES #undef HAVE_STDLIB_H #undef HAVE_STDDEF_H #undef UINT8 #undef UINT16 #undef UINT32 #undef INT16 #undef INT32 #include "Jpeg.h" /* -------------------------------------------------------------------- */ /* Suspending output handler */ /* -------------------------------------------------------------------- */ METHODDEF(void) stub(j_compress_ptr cinfo) { /* empty */ } METHODDEF(boolean) empty_output_buffer (j_compress_ptr cinfo) { /* Suspension */ return FALSE; } GLOBAL(void) jpeg_buffer_dest(j_compress_ptr cinfo, JPEGDESTINATION* destination) { cinfo->dest = (void*) destination; destination->pub.init_destination = stub; destination->pub.empty_output_buffer = empty_output_buffer; destination->pub.term_destination = stub; } /* -------------------------------------------------------------------- */ /* Error handler */ /* -------------------------------------------------------------------- */ METHODDEF(void) error(j_common_ptr cinfo) { JPEGERROR* error; error = (JPEGERROR*) cinfo->err; (*cinfo->err->output_message) (cinfo); longjmp(error->setjmp_buffer, 1); } /* -------------------------------------------------------------------- */ /* Encoder */ /* -------------------------------------------------------------------- */ int ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { JPEGENCODERSTATE* context = (JPEGENCODERSTATE*) state->context; int ok; if (setjmp(context->error.setjmp_buffer)) { /* JPEG error handler */ jpeg_destroy_compress(&context->cinfo); state->errcode = IMAGING_CODEC_BROKEN; return -1; } if (!state->state) { /* Setup compression context (very similar to the decoder) */ context->cinfo.err = jpeg_std_error(&context->error.pub); context->error.pub.error_exit = error; jpeg_create_compress(&context->cinfo); jpeg_buffer_dest(&context->cinfo, &context->destination); context->extra_offset = 0; /* Ready to encode */ state->state = 1; } /* Load the destination buffer */ context->destination.pub.next_output_byte = buf; context->destination.pub.free_in_buffer = bytes; switch (state->state) { case 1: context->cinfo.image_width = state->xsize; context->cinfo.image_height = state->ysize; switch (state->bits) { case 8: context->cinfo.input_components = 1; context->cinfo.in_color_space = JCS_GRAYSCALE; break; case 24: context->cinfo.input_components = 3; if (strcmp(im->mode, "YCbCr") == 0) context->cinfo.in_color_space = JCS_YCbCr; else context->cinfo.in_color_space = JCS_RGB; break; case 32: context->cinfo.input_components = 4; context->cinfo.in_color_space = JCS_CMYK; break; default: state->errcode = IMAGING_CODEC_CONFIG; return -1; } /* Compressor configuration */ jpeg_set_defaults(&context->cinfo); /* Use custom quantization tables */ if (context->qtables) { int i; int quality = 100; if (context->quality > 0) { quality = context->quality; } for (i = 0; i < sizeof(context->qtables)/sizeof(unsigned int); i++) { // TODO: Should add support for none baseline jpeg_add_quant_table(&context->cinfo, i, context->qtables[i], quality, TRUE); } } else if (context->quality > 0) { jpeg_set_quality(&context->cinfo, context->quality, 1); } /* Set subsampling options */ switch (context->subsampling) { case 0: /* 1x1 1x1 1x1 (4:4:4) : None */ { context->cinfo.comp_info[0].h_samp_factor = 1; context->cinfo.comp_info[0].v_samp_factor = 1; context->cinfo.comp_info[1].h_samp_factor = 1; context->cinfo.comp_info[1].v_samp_factor = 1; context->cinfo.comp_info[2].h_samp_factor = 1; context->cinfo.comp_info[2].v_samp_factor = 1; break; } case 1: /* 2x1, 1x1, 1x1 (4:2:2) : Medium */ { context->cinfo.comp_info[0].h_samp_factor = 2; context->cinfo.comp_info[0].v_samp_factor = 1; context->cinfo.comp_info[1].h_samp_factor = 1; context->cinfo.comp_info[1].v_samp_factor = 1; context->cinfo.comp_info[2].h_samp_factor = 1; context->cinfo.comp_info[2].v_samp_factor = 1; break; } case 2: /* 2x2, 1x1, 1x1 (4:1:1) : High */ { context->cinfo.comp_info[0].h_samp_factor = 2; context->cinfo.comp_info[0].v_samp_factor = 2; context->cinfo.comp_info[1].h_samp_factor = 1; context->cinfo.comp_info[1].v_samp_factor = 1; context->cinfo.comp_info[2].h_samp_factor = 1; context->cinfo.comp_info[2].v_samp_factor = 1; break; } default: { /* Use the lib's default */ break; } } if (context->progressive) jpeg_simple_progression(&context->cinfo); context->cinfo.smoothing_factor = context->smooth; context->cinfo.optimize_coding = (boolean) context->optimize; if (context->xdpi > 0 && context->ydpi > 0) { context->cinfo.density_unit = 1; /* dots per inch */ context->cinfo.X_density = context->xdpi; context->cinfo.Y_density = context->ydpi; } switch (context->streamtype) { case 1: /* tables only -- not yet implemented */ state->errcode = IMAGING_CODEC_CONFIG; return -1; case 2: /* image only */ jpeg_suppress_tables(&context->cinfo, TRUE); jpeg_start_compress(&context->cinfo, FALSE); /* suppress extra section */ context->extra_offset = context->extra_size; break; default: /* interchange stream */ jpeg_start_compress(&context->cinfo, TRUE); break; } state->state++; /* fall through */ case 2: // check for exif len + 'APP1' header bytes if (context->rawExifLen + 5 > context->destination.pub.free_in_buffer){ break; } //add exif header if (context->rawExifLen > 0){ jpeg_write_marker(&context->cinfo, JPEG_APP0+1, (unsigned char*)context->rawExif, context->rawExifLen); } state->state++; /* fall through */ case 3: if (context->extra) { /* copy extra buffer to output buffer */ unsigned int n = context->extra_size - context->extra_offset; if (n > context->destination.pub.free_in_buffer) n = context->destination.pub.free_in_buffer; memcpy(context->destination.pub.next_output_byte, context->extra + context->extra_offset, n); context->destination.pub.next_output_byte += n; context->destination.pub.free_in_buffer -= n; context->extra_offset += n; if (context->extra_offset >= context->extra_size) state->state++; else break; } else state->state++; case 4: if (1024 > context->destination.pub.free_in_buffer){ break; } ok = 1; while (state->y < state->ysize) { state->shuffle(state->buffer, (UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->xsize); ok = jpeg_write_scanlines(&context->cinfo, &state->buffer, 1); if (ok != 1) break; state->y++; } if (ok != 1) break; state->state++; /* fall through */ case 5: /* Finish compression */ if (context->destination.pub.free_in_buffer < 100) break; jpeg_finish_compress(&context->cinfo); /* Clean up */ if (context->extra) free(context->extra); jpeg_destroy_compress(&context->cinfo); /* if (jerr.pub.num_warnings) return BROKEN; */ state->errcode = IMAGING_CODEC_END; break; } /* Return number of bytes in output buffer */ return context->destination.pub.next_output_byte - buf; } const char* ImagingJpegVersion(void) { static char version[20]; sprintf(version, "%d.%d", JPEG_LIB_VERSION / 10, JPEG_LIB_VERSION % 10); return version; } #endif pillow-2.3.0/libImaging/Chops.c0000644000175000001440000000641712257506326015177 0ustar dokousers/* * The Python Imaging Library * $Id$ * * basic channel operations * * history: * 1996-03-28 fl Created * 1996-08-13 fl Added and/or/xor for "1" images * 1996-12-14 fl Added add_modulo, sub_modulo * 2005-09-10 fl Fixed output values from and/or/xor * * Copyright (c) 1996 by Fredrik Lundh. * Copyright (c) 1997 by Secret Labs AB. * * See the README file for details on usage and redistribution. */ #include "Imaging.h" #define CHOP(operation, mode)\ int x, y;\ Imaging imOut;\ imOut = create(imIn1, imIn2, mode);\ if (!imOut)\ return NULL;\ for (y = 0; y < imOut->ysize; y++) {\ UINT8* out = (UINT8*) imOut->image[y];\ UINT8* in1 = (UINT8*) imIn1->image[y];\ UINT8* in2 = (UINT8*) imIn2->image[y];\ for (x = 0; x < imOut->linesize; x++) {\ int temp = operation;\ if (temp <= 0)\ out[x] = 0;\ else if (temp >= 255)\ out[x] = 255;\ else\ out[x] = temp;\ }\ }\ return imOut; #define CHOP2(operation, mode)\ int x, y;\ Imaging imOut;\ imOut = create(imIn1, imIn2, mode);\ if (!imOut)\ return NULL;\ for (y = 0; y < imOut->ysize; y++) {\ UINT8* out = (UINT8*) imOut->image[y];\ UINT8* in1 = (UINT8*) imIn1->image[y];\ UINT8* in2 = (UINT8*) imIn2->image[y];\ for (x = 0; x < imOut->linesize; x++) {\ out[x] = operation;\ }\ }\ return imOut; static Imaging create(Imaging im1, Imaging im2, char* mode) { int xsize, ysize; if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 || (mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1")))) return (Imaging) ImagingError_ModeError(); if (im1->type != im2->type || im1->bands != im2->bands) return (Imaging) ImagingError_Mismatch(); xsize = (im1->xsize < im2->xsize) ? im1->xsize : im2->xsize; ysize = (im1->ysize < im2->ysize) ? im1->ysize : im2->ysize; return ImagingNew(im1->mode, xsize, ysize); } Imaging ImagingChopLighter(Imaging imIn1, Imaging imIn2) { CHOP((in1[x] > in2[x]) ? in1[x] : in2[x], NULL); } Imaging ImagingChopDarker(Imaging imIn1, Imaging imIn2) { CHOP((in1[x] < in2[x]) ? in1[x] : in2[x], NULL); } Imaging ImagingChopDifference(Imaging imIn1, Imaging imIn2) { CHOP(abs((int) in1[x] - (int) in2[x]), NULL); } Imaging ImagingChopMultiply(Imaging imIn1, Imaging imIn2) { CHOP((int) in1[x] * (int) in2[x] / 255, NULL); } Imaging ImagingChopScreen(Imaging imIn1, Imaging imIn2) { CHOP(255 - ((int) (255 - in1[x]) * (int) (255 - in2[x])) / 255, NULL); } Imaging ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset) { CHOP(((int) in1[x] + (int) in2[x]) / scale + offset, NULL); } Imaging ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) { CHOP(((int) in1[x] - (int) in2[x]) / scale + offset, NULL); } Imaging ImagingChopAnd(Imaging imIn1, Imaging imIn2) { CHOP2((in1[x] && in2[x]) ? 255 : 0, "1"); } Imaging ImagingChopOr(Imaging imIn1, Imaging imIn2) { CHOP2((in1[x] || in2[x]) ? 255 : 0, "1"); } Imaging ImagingChopXor(Imaging imIn1, Imaging imIn2) { CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1"); } Imaging ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) { CHOP2(in1[x] + in2[x], NULL); } Imaging ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) { CHOP2(in1[x] - in2[x], NULL); } pillow-2.3.0/libImaging/GetBBox.c0000644000175000001440000001764712257506326015424 0ustar dokousers/* * The Python Imaging Library * $Id$ * * helpers to bounding boxes, min/max values, number of colors, etc. * * history: * 1996-07-22 fl Created * 1996-12-30 fl Added projection stuff * 1998-07-12 fl Added extrema stuff * 2004-09-17 fl Added colors stuff * * Copyright (c) 1997-2004 by Secret Labs AB. * Copyright (c) 1996-2004 by Fredrik Lundh. * * See the README file for details on usage and redistribution. */ #include "Imaging.h" int ImagingGetBBox(Imaging im, int bbox[4]) { /* Get the bounding box for any non-zero data in the image.*/ int x, y; int has_data; /* Initialize bounding box to max values */ bbox[0] = im->xsize; bbox[1] = -1; bbox[2] = bbox[3] = 0; #define GETBBOX(image, mask)\ for (y = 0; y < im->ysize; y++) {\ has_data = 0;\ for (x = 0; x < im->xsize; x++)\ if (im->image[y][x] & mask) {\ has_data = 1;\ if (x < bbox[0])\ bbox[0] = x;\ if (x >= bbox[2])\ bbox[2] = x+1;\ }\ if (has_data) {\ if (bbox[1] < 0)\ bbox[1] = y;\ bbox[3] = y+1;\ }\ } if (im->image8) { GETBBOX(image8, 0xff); } else { INT32 mask = 0xffffffff; if (im->bands == 3) ((UINT8*) &mask)[3] = 0; GETBBOX(image32, mask); } /* Check that we got a box */ if (bbox[1] < 0) return 0; /* no data */ return 1; /* ok */ } int ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj) { /* Get projection arrays for non-zero data in the image.*/ int x, y; int has_data; /* Initialize projection arrays */ memset(xproj, 0, im->xsize); memset(yproj, 0, im->ysize); #define GETPROJ(image, mask)\ for (y = 0; y < im->ysize; y++) {\ has_data = 0;\ for (x = 0; x < im->xsize; x++)\ if (im->image[y][x] & mask) {\ has_data = 1;\ xproj[x] = 1;\ }\ if (has_data)\ yproj[y] = 1;\ } if (im->image8) { GETPROJ(image8, 0xff); } else { INT32 mask = 0xffffffff; if (im->bands == 3) ((UINT8*) &mask)[3] = 0; GETPROJ(image32, mask); } return 1; /* ok */ } int ImagingGetExtrema(Imaging im, void *extrema) { int x, y; INT32 imin, imax; FLOAT32 fmin, fmax; if (im->bands != 1) { (void) ImagingError_ModeError(); return -1; /* mismatch */ } if (!im->xsize || !im->ysize) return 0; /* zero size */ switch (im->type) { case IMAGING_TYPE_UINT8: imin = imax = im->image8[0][0]; for (y = 0; y < im->ysize; y++) { UINT8* in = im->image8[y]; for (x = 0; x < im->xsize; x++) { if (imin > in[x]) imin = in[x]; else if (imax < in[x]) imax = in[x]; } } ((UINT8*) extrema)[0] = (UINT8) imin; ((UINT8*) extrema)[1] = (UINT8) imax; break; case IMAGING_TYPE_INT32: imin = imax = im->image32[0][0]; for (y = 0; y < im->ysize; y++) { INT32* in = im->image32[y]; for (x = 0; x < im->xsize; x++) { if (imin > in[x]) imin = in[x]; else if (imax < in[x]) imax = in[x]; } } ((INT32*) extrema)[0] = imin; ((INT32*) extrema)[1] = imax; break; case IMAGING_TYPE_FLOAT32: fmin = fmax = ((FLOAT32*) im->image32[0])[0]; for (y = 0; y < im->ysize; y++) { FLOAT32* in = (FLOAT32*) im->image32[y]; for (x = 0; x < im->xsize; x++) { if (fmin > in[x]) fmin = in[x]; else if (fmax < in[x]) fmax = in[x]; } } ((FLOAT32*) extrema)[0] = fmin; ((FLOAT32*) extrema)[1] = fmax; break; case IMAGING_TYPE_SPECIAL: if (strcmp(im->mode, "I;16") == 0) { imin = imax = ((UINT16*) im->image8[0])[0]; for (y = 0; y < im->ysize; y++) { UINT16* in = (UINT16 *) im->image[y]; for (x = 0; x < im->xsize; x++) { if (imin > in[x]) imin = in[x]; else if (imax < in[x]) imax = in[x]; } } ((UINT16*) extrema)[0] = (UINT16) imin; ((UINT16*) extrema)[1] = (UINT16) imax; break; } /* FALL THROUGH */ default: (void) ImagingError_ModeError(); return -1; } return 1; /* ok */ } /* static ImagingColorItem* getcolors8(Imaging im, int maxcolors, int* size);*/ static ImagingColorItem* getcolors32(Imaging im, int maxcolors, int* size); ImagingColorItem* ImagingGetColors(Imaging im, int maxcolors, int* size) { /* FIXME: add support for 8-bit images */ return getcolors32(im, maxcolors, size); } static ImagingColorItem* getcolors32(Imaging im, int maxcolors, int* size) { unsigned int h; unsigned int i, incr; int colors; INT32 pixel_mask; int x, y; ImagingColorItem* table; ImagingColorItem* v; unsigned int code_size; unsigned int code_poly; unsigned int code_mask; /* note: the hash algorithm used here is based on the dictionary code in Python 2.1.3; the exact implementation is borrowed from Python's Unicode property database (written by yours truly) /F */ static int SIZES[] = { 4,3, 8,3, 16,3, 32,5, 64,3, 128,3, 256,29, 512,17, 1024,9, 2048,5, 4096,83, 8192,27, 16384,43, 32768,3, 65536,45, 131072,9, 262144,39, 524288,39, 1048576,9, 2097152,5, 4194304,3, 8388608,33, 16777216,27, 33554432,9, 67108864,71, 134217728,39, 268435456,9, 536870912,5, 1073741824,83, 0 }; code_size = code_poly = code_mask = 0; for (i = 0; SIZES[i]; i += 2) { if (SIZES[i] > maxcolors) { code_size = SIZES[i]; code_poly = SIZES[i+1]; code_mask = code_size - 1; break; } } /* printf("code_size=%d\n", code_size); */ /* printf("code_poly=%d\n", code_poly); */ if (!code_size) return ImagingError_MemoryError(); /* just give up */ if (!im->image32) return ImagingError_ModeError(); table = calloc(code_size + 1, sizeof(ImagingColorItem)); if (!table) return ImagingError_MemoryError(); pixel_mask = 0xffffffff; if (im->bands == 3) ((UINT8*) &pixel_mask)[3] = 0; colors = 0; for (y = 0; y < im->ysize; y++) { INT32* p = im->image32[y]; for (x = 0; x < im->xsize; x++) { INT32 pixel = p[x] & pixel_mask; h = (pixel); /* null hashing */ i = (~h) & code_mask; v = &table[i]; if (!v->count) { /* add to table */ if (colors++ == maxcolors) goto overflow; v->x = x; v->y = y; v->pixel = pixel; v->count = 1; continue; } else if (v->pixel == pixel) { v->count++; continue; } incr = (h ^ (h >> 3)) & code_mask; if (!incr) incr = code_mask; for (;;) { i = (i + incr) & code_mask; v = &table[i]; if (!v->count) { /* add to table */ if (colors++ == maxcolors) goto overflow; v->x = x; v->y = y; v->pixel = pixel; v->count = 1; break; } else if (v->pixel == pixel) { v->count++; break; } incr = incr << 1; if (incr > code_mask) incr = incr ^ code_poly; } } } overflow: /* pack the table */ for (x = y = 0; x < (int) code_size; x++) if (table[x].count) { if (x != y) table[y] = table[x]; y++; } table[y].count = 0; /* mark end of table */ *size = colors; return table; } pillow-2.3.0/libImaging/Antialias.c0000644000175000001440000002417712257506326016033 0ustar dokousers/* * The Python Imaging Library * $Id$ * * pilopen antialiasing support * * history: * 2002-03-09 fl Created (for PIL 1.1.3) * 2002-03-10 fl Added support for mode "F" * * Copyright (c) 1997-2002 by Secret Labs AB * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include /* resampling filters (from antialias.py) */ struct filter { float (*filter)(float x); float support; }; static inline float sinc_filter(float x) { if (x == 0.0) return 1.0; x = x * M_PI; return sin(x) / x; } static inline float antialias_filter(float x) { /* lanczos (truncated sinc) */ if (-3.0 <= x && x < 3.0) return sinc_filter(x) * sinc_filter(x/3); return 0.0; } static struct filter ANTIALIAS = { antialias_filter, 3.0 }; static inline float nearest_filter(float x) { if (-0.5 <= x && x < 0.5) return 1.0; return 0.0; } static struct filter NEAREST = { nearest_filter, 0.5 }; static inline float bilinear_filter(float x) { if (x < 0.0) x = -x; if (x < 1.0) return 1.0-x; return 0.0; } static struct filter BILINEAR = { bilinear_filter, 1.0 }; static inline float bicubic_filter(float x) { /* FIXME: double-check this algorithm */ /* FIXME: for best results, "a" should be -0.5 to -1.0, but we'll set it to zero for now, to match the 1.1 magnifying filter */ #define a 0.0 if (x < 0.0) x = -x; if (x < 1.0) return (((a + 2.0) * x) - (a + 3.0)) * x*x + 1; if (x < 2.0) return (((a * x) - 5*a) * x + 8) * x - 4*a; return 0.0; #undef a } static struct filter BICUBIC = { bicubic_filter, 2.0 }; Imaging ImagingStretch(Imaging imOut, Imaging imIn, int filter) { /* FIXME: this is a quick and straightforward translation from a python prototype. might need some further C-ification... */ ImagingSectionCookie cookie; struct filter *filterp; float support, scale, filterscale; float center, ww, ss, ymin, ymax, xmin, xmax; int xx, yy, x, y, b; float *k; /* check modes */ if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); /* check filter */ switch (filter) { case IMAGING_TRANSFORM_NEAREST: filterp = &NEAREST; break; case IMAGING_TRANSFORM_ANTIALIAS: filterp = &ANTIALIAS; break; case IMAGING_TRANSFORM_BILINEAR: filterp = &BILINEAR; break; case IMAGING_TRANSFORM_BICUBIC: filterp = &BICUBIC; break; default: return (Imaging) ImagingError_ValueError( "unsupported resampling filter" ); } if (imIn->ysize == imOut->ysize) { /* prepare for horizontal stretch */ filterscale = scale = (float) imIn->xsize / imOut->xsize; } else if (imIn->xsize == imOut->xsize) { /* prepare for vertical stretch */ filterscale = scale = (float) imIn->ysize / imOut->ysize; } else return (Imaging) ImagingError_Mismatch(); /* determine support size (length of resampling filter) */ support = filterp->support; if (filterscale < 1.0) { filterscale = 1.0; support = 0.5; } support = support * filterscale; /* coefficient buffer (with rounding safety margin) */ k = malloc(((int) support * 2 + 10) * sizeof(float)); if (!k) return (Imaging) ImagingError_MemoryError(); ImagingSectionEnter(&cookie); if (imIn->xsize == imOut->xsize) { /* vertical stretch */ for (yy = 0; yy < imOut->ysize; yy++) { center = (yy + 0.5) * scale; ww = 0.0; ss = 1.0 / filterscale; /* calculate filter weights */ ymin = floor(center - support); if (ymin < 0.0) ymin = 0.0; ymax = ceil(center + support); if (ymax > (float) imIn->ysize) ymax = (float) imIn->ysize; for (y = (int) ymin; y < (int) ymax; y++) { float w = filterp->filter((y - center + 0.5) * ss) * ss; k[y - (int) ymin] = w; ww = ww + w; } if (ww == 0.0) ww = 1.0; else ww = 1.0 / ww; if (imIn->image8) { /* 8-bit grayscale */ for (xx = 0; xx < imOut->xsize; xx++) { ss = 0.0; for (y = (int) ymin; y < (int) ymax; y++) ss = ss + imIn->image8[y][xx] * k[y - (int) ymin]; ss = ss * ww + 0.5; if (ss < 0.5) imOut->image8[yy][xx] = 0; else if (ss >= 255.0) imOut->image8[yy][xx] = 255; else imOut->image8[yy][xx] = (UINT8) ss; } } else switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ for (xx = 0; xx < imOut->xsize*4; xx++) { /* FIXME: skip over unused pixels */ ss = 0.0; for (y = (int) ymin; y < (int) ymax; y++) ss = ss + (UINT8) imIn->image[y][xx] * k[y-(int) ymin]; ss = ss * ww + 0.5; if (ss < 0.5) imOut->image[yy][xx] = (UINT8) 0; else if (ss >= 255.0) imOut->image[yy][xx] = (UINT8) 255; else imOut->image[yy][xx] = (UINT8) ss; } break; case IMAGING_TYPE_INT32: /* 32-bit integer */ for (xx = 0; xx < imOut->xsize; xx++) { ss = 0.0; for (y = (int) ymin; y < (int) ymax; y++) ss = ss + IMAGING_PIXEL_I(imIn, xx, y) * k[y - (int) ymin]; IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; } break; case IMAGING_TYPE_FLOAT32: /* 32-bit float */ for (xx = 0; xx < imOut->xsize; xx++) { ss = 0.0; for (y = (int) ymin; y < (int) ymax; y++) ss = ss + IMAGING_PIXEL_F(imIn, xx, y) * k[y - (int) ymin]; IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; } break; default: ImagingSectionLeave(&cookie); return (Imaging) ImagingError_ModeError(); } } } else { /* horizontal stretch */ for (xx = 0; xx < imOut->xsize; xx++) { center = (xx + 0.5) * scale; ww = 0.0; ss = 1.0 / filterscale; xmin = floor(center - support); if (xmin < 0.0) xmin = 0.0; xmax = ceil(center + support); if (xmax > (float) imIn->xsize) xmax = (float) imIn->xsize; for (x = (int) xmin; x < (int) xmax; x++) { float w = filterp->filter((x - center + 0.5) * ss) * ss; k[x - (int) xmin] = w; ww = ww + w; } if (ww == 0.0) ww = 1.0; else ww = 1.0 / ww; if (imIn->image8) { /* 8-bit grayscale */ for (yy = 0; yy < imOut->ysize; yy++) { ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + imIn->image8[yy][x] * k[x - (int) xmin]; ss = ss * ww + 0.5; if (ss < 0.5) imOut->image8[yy][xx] = (UINT8) 0; else if (ss >= 255.0) imOut->image8[yy][xx] = (UINT8) 255; else imOut->image8[yy][xx] = (UINT8) ss; } } else switch(imIn->type) { case IMAGING_TYPE_UINT8: /* n-bit grayscale */ for (yy = 0; yy < imOut->ysize; yy++) { for (b = 0; b < imIn->bands; b++) { if (imIn->bands == 2 && b) b = 3; /* hack to deal with LA images */ ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + (UINT8) imIn->image[yy][x*4+b] * k[x - (int) xmin]; ss = ss * ww + 0.5; if (ss < 0.5) imOut->image[yy][xx*4+b] = (UINT8) 0; else if (ss >= 255.0) imOut->image[yy][xx*4+b] = (UINT8) 255; else imOut->image[yy][xx*4+b] = (UINT8) ss; } } break; case IMAGING_TYPE_INT32: /* 32-bit integer */ for (yy = 0; yy < imOut->ysize; yy++) { ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_I(imIn, x, yy) * k[x - (int) xmin]; IMAGING_PIXEL_I(imOut, xx, yy) = (int) ss * ww; } break; case IMAGING_TYPE_FLOAT32: /* 32-bit float */ for (yy = 0; yy < imOut->ysize; yy++) { ss = 0.0; for (x = (int) xmin; x < (int) xmax; x++) ss = ss + IMAGING_PIXEL_F(imIn, x, yy) * k[x - (int) xmin]; IMAGING_PIXEL_F(imOut, xx, yy) = ss * ww; } break; default: ImagingSectionLeave(&cookie); return (Imaging) ImagingError_ModeError(); } } } ImagingSectionLeave(&cookie); free(k); return imOut; } pillow-2.3.0/libImaging/Dib.c0000644000175000001440000001644012257506326014616 0ustar dokousers/* * The Python Imaging Library * $Id$ * * imaging display object for Windows * * history: * 1996-05-12 fl Created * 1996-05-17 fl Up and running * 1996-05-21 fl Added palette stuff * 1996-05-26 fl Added query palette and mode inquery * 1997-09-21 fl Added draw primitive * 1998-01-20 fl Use StretchDIBits instead of StretchBlt * 1998-12-30 fl Plugged a resource leak in DeleteDIB (from Roger Burnham) * * Copyright (c) Secret Labs AB 1997-2001. * Copyright (c) Fredrik Lundh 1996. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #ifdef WIN32 #include "ImDib.h" char* ImagingGetModeDIB(int size_out[2]) { /* Get device characteristics */ HDC dc; char* mode; dc = CreateCompatibleDC(NULL); mode = "P"; if (!(GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE)) { mode = "RGB"; if (GetDeviceCaps(dc, BITSPIXEL) == 1) mode = "1"; } if (size_out) { size_out[0] = GetDeviceCaps(dc, HORZRES); size_out[1] = GetDeviceCaps(dc, VERTRES); } DeleteDC(dc); return mode; } ImagingDIB ImagingNewDIB(const char *mode, int xsize, int ysize) { /* Create a Windows bitmap */ ImagingDIB dib; RGBQUAD *palette; int i; /* Check mode */ if (strcmp(mode, "1") != 0 && strcmp(mode, "L") != 0 && strcmp(mode, "RGB") != 0) return (ImagingDIB) ImagingError_ModeError(); /* Create DIB context and info header */ dib = (ImagingDIB) malloc(sizeof(*dib)); if (!dib) return (ImagingDIB) ImagingError_MemoryError(); dib->info = (BITMAPINFO*) malloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); if (!dib->info) { free(dib); return (ImagingDIB) ImagingError_MemoryError(); } memset(dib->info, 0, sizeof(BITMAPINFOHEADER)); dib->info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dib->info->bmiHeader.biWidth = xsize; dib->info->bmiHeader.biHeight = ysize; dib->info->bmiHeader.biPlanes = 1; dib->info->bmiHeader.biBitCount = strlen(mode)*8; dib->info->bmiHeader.biCompression = BI_RGB; /* Create DIB */ dib->dc = CreateCompatibleDC(NULL); if (!dib->dc) { free(dib->info); free(dib); return (ImagingDIB) ImagingError_MemoryError(); } dib->bitmap = CreateDIBSection(dib->dc, dib->info, DIB_RGB_COLORS, &dib->bits, NULL, 0); if (!dib->bitmap) { free(dib->info); free(dib); return (ImagingDIB) ImagingError_MemoryError(); } strcpy(dib->mode, mode); dib->xsize = xsize; dib->ysize = ysize; dib->pixelsize = strlen(mode); dib->linesize = (xsize * dib->pixelsize + 3) & -4; if (dib->pixelsize == 1) dib->pack = dib->unpack = (ImagingShuffler) memcpy; else { dib->pack = ImagingPackBGR; dib->unpack = ImagingPackBGR; } /* Bind the DIB to the device context */ dib->old_bitmap = SelectObject(dib->dc, dib->bitmap); palette = dib->info->bmiColors; /* Bind a palette to it as well (only required for 8-bit DIBs) */ if (dib->pixelsize == 1) { for (i = 0; i < 256; i++) { palette[i].rgbRed = palette[i].rgbGreen = palette[i].rgbBlue = i; palette[i].rgbReserved = 0; } SetDIBColorTable(dib->dc, 0, 256, palette); } /* Create an associated palette (for 8-bit displays only) */ if (strcmp(ImagingGetModeDIB(NULL), "P") == 0) { char palbuf[sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY)]; LPLOGPALETTE pal = (LPLOGPALETTE) palbuf; int i, r, g, b; /* Load system palette */ pal->palVersion = 0x300; pal->palNumEntries = 256; GetSystemPaletteEntries(dib->dc, 0, 256, pal->palPalEntry); if (strcmp(mode, "L") == 0) { /* Greyscale DIB. Fill all 236 slots with a greyscale ramp * (this is usually overkill on Windows since VGA only offers * 6 bits greyscale resolution). Ignore the slots already * allocated by Windows */ i = 10; for (r = 0; r < 236; r++) { pal->palPalEntry[i].peRed = pal->palPalEntry[i].peGreen = pal->palPalEntry[i].peBlue = i; i++; } dib->palette = CreatePalette(pal); } else if (strcmp(mode, "RGB") == 0) { #ifdef CUBE216 /* Colour DIB. Create a 6x6x6 colour cube (216 entries) and * add 20 extra greylevels for best result with greyscale * images. */ i = 10; for (r = 0; r < 256; r += 51) for (g = 0; g < 256; g += 51) for (b = 0; b < 256; b += 51) { pal->palPalEntry[i].peRed = r; pal->palPalEntry[i].peGreen = g; pal->palPalEntry[i].peBlue = b; i++; } for (r = 1; r < 22-1; r++) { /* Black and white are already provided by the cube. */ pal->palPalEntry[i].peRed = pal->palPalEntry[i].peGreen = pal->palPalEntry[i].peBlue = r * 255 / (22-1); i++; } #else /* Colour DIB. Alternate palette. */ i = 10; for (r = 0; r < 256; r += 37) for (g = 0; g < 256; g += 32) for (b = 0; b < 256; b += 64) { pal->palPalEntry[i].peRed = r; pal->palPalEntry[i].peGreen = g; pal->palPalEntry[i].peBlue = b; i++; } #endif #if 0 { /* DEBUG: dump palette to file */ FILE *err = fopen("dib.pal", "w"); for (i = 0; i < 256; i++) fprintf(err, "%d: %d/%d/%d\n", i, pal->palPalEntry[i].peRed, pal->palPalEntry[i].peGreen, pal->palPalEntry[i].peBlue); fclose(err); } #endif dib->palette = CreatePalette(pal); } } return dib; } void ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]) { /* Paste image data into a bitmap */ /* FIXME: check size! */ int y; for (y = 0; y < im->ysize; y++) dib->pack(dib->bits + dib->linesize*(dib->ysize-(xy[1]+y)-1) + xy[0]*dib->pixelsize, im->image[y], im->xsize); } void ImagingExposeDIB(ImagingDIB dib, int dc) { /* Copy bitmap to display */ if (dib->palette != 0) SelectPalette((HDC) dc, dib->palette, FALSE); BitBlt((HDC) dc, 0, 0, dib->xsize, dib->ysize, dib->dc, 0, 0, SRCCOPY); } void ImagingDrawDIB(ImagingDIB dib, int dc, int dst[4], int src[4]) { /* Copy bitmap to printer/display */ if (GetDeviceCaps((HDC) dc, RASTERCAPS) & RC_STRETCHDIB) { /* stretchdib (printers) */ StretchDIBits((HDC) dc, dst[0], dst[1], dst[2]-dst[0], dst[3]-dst[1], src[0], src[1], src[2]-src[0], src[3]-src[1], dib->bits, dib->info, DIB_RGB_COLORS, SRCCOPY); } else { /* stretchblt (displays) */ if (dib->palette != 0) SelectPalette((HDC) dc, dib->palette, FALSE); StretchBlt((HDC) dc, dst[0], dst[1], dst[2]-dst[0], dst[3]-dst[1], dib->dc, src[0], src[1], src[2]-src[0], src[3]-src[1], SRCCOPY); } } int ImagingQueryPaletteDIB(ImagingDIB dib, int dc) { /* Install bitmap palette */ int n; if (dib->palette != 0) { /* Realize associated palette */ HPALETTE now = SelectPalette((HDC) dc, dib->palette, FALSE); n = RealizePalette((HDC) dc); /* Restore palette */ SelectPalette((HDC) dc, now, FALSE); } else n = 0; return n; /* number of colours that was changed */ } void ImagingDeleteDIB(ImagingDIB dib) { /* Clean up */ if (dib->palette) DeleteObject(dib->palette); if (dib->bitmap) { SelectObject(dib->dc, dib->old_bitmap); DeleteObject(dib->bitmap); } if (dib->dc) DeleteDC(dib->dc); free(dib->info); } #endif /* WIN32 */ pillow-2.3.0/libImaging/XbmDecode.c0000644000175000001440000000243212257506326015746 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for XBM hex image data * * history: * 96-04-13 fl Created * * Copyright (c) Fredrik Lundh 1996. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ (v >= 'A' && v <= 'F') ? v - 'A' + 10 : 0) int ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { enum { BYTE = 1, SKIP }; UINT8* ptr; if (!state->state) state->state = SKIP; ptr = buf; for (;;) { if (state->state == SKIP) { /* Skip forward until next 'x' */ while (bytes > 0) { if (*ptr == 'x') break; ptr++; bytes--; } if (bytes == 0) return ptr - buf; state->state = BYTE; } if (bytes < 3) return ptr - buf; state->buffer[state->x] = (HEX(ptr[1])<<4) + HEX(ptr[2]); if (++state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y], state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } ptr += 3; bytes -= 3; state->state = SKIP; } } pillow-2.3.0/libImaging/ConvertYCbCr.c0000644000175000001440000005151312257506326016423 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * code to convert YCbCr data * * history: * 98-07-01 hk Created * * Copyright (c) Secret Labs AB 1998 * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* JPEG/JFIF YCbCr conversions Y = R * 0.29900 + G * 0.58700 + B * 0.11400 Cb = R * -0.16874 + G * -0.33126 + B * 0.50000 + 128 Cr = R * 0.50000 + G * -0.41869 + B * -0.08131 + 128 R = Y + + (Cr - 128) * 1.40200 G = Y + (Cb - 128) * -0.34414 + (Cr - 128) * -0.71414 B = Y + (Cb - 128) * 1.77200 */ #define SCALE 6 /* bits */ static INT16 Y_R[] = { 0, 19, 38, 57, 77, 96, 115, 134, 153, 172, 191, 210, 230, 249, 268, 287, 306, 325, 344, 364, 383, 402, 421, 440, 459, 478, 498, 517, 536, 555, 574, 593, 612, 631, 651, 670, 689, 708, 727, 746, 765, 785, 804, 823, 842, 861, 880, 899, 919, 938, 957, 976, 995, 1014, 1033, 1052, 1072, 1091, 1110, 1129, 1148, 1167, 1186, 1206, 1225, 1244, 1263, 1282, 1301, 1320, 1340, 1359, 1378, 1397, 1416, 1435, 1454, 1473, 1493, 1512, 1531, 1550, 1569, 1588, 1607, 1627, 1646, 1665, 1684, 1703, 1722, 1741, 1761, 1780, 1799, 1818, 1837, 1856, 1875, 1894, 1914, 1933, 1952, 1971, 1990, 2009, 2028, 2048, 2067, 2086, 2105, 2124, 2143, 2162, 2182, 2201, 2220, 2239, 2258, 2277, 2296, 2315, 2335, 2354, 2373, 2392, 2411, 2430, 2449, 2469, 2488, 2507, 2526, 2545, 2564, 2583, 2602, 2622, 2641, 2660, 2679, 2698, 2717, 2736, 2756, 2775, 2794, 2813, 2832, 2851, 2870, 2890, 2909, 2928, 2947, 2966, 2985, 3004, 3023, 3043, 3062, 3081, 3100, 3119, 3138, 3157, 3177, 3196, 3215, 3234, 3253, 3272, 3291, 3311, 3330, 3349, 3368, 3387, 3406, 3425, 3444, 3464, 3483, 3502, 3521, 3540, 3559, 3578, 3598, 3617, 3636, 3655, 3674, 3693, 3712, 3732, 3751, 3770, 3789, 3808, 3827, 3846, 3865, 3885, 3904, 3923, 3942, 3961, 3980, 3999, 4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, 4172, 4191, 4210, 4229, 4248, 4267, 4286, 4306, 4325, 4344, 4363, 4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535, 4554, 4574, 4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, 4803, 4822, 4841, 4861, 4880 }; static INT16 Y_G[] = { 0, 38, 75, 113, 150, 188, 225, 263, 301, 338, 376, 413, 451, 488, 526, 564, 601, 639, 676, 714, 751, 789, 826, 864, 902, 939, 977, 1014, 1052, 1089, 1127, 1165, 1202, 1240, 1277, 1315, 1352, 1390, 1428, 1465, 1503, 1540, 1578, 1615, 1653, 1691, 1728, 1766, 1803, 1841, 1878, 1916, 1954, 1991, 2029, 2066, 2104, 2141, 2179, 2217, 2254, 2292, 2329, 2367, 2404, 2442, 2479, 2517, 2555, 2592, 2630, 2667, 2705, 2742, 2780, 2818, 2855, 2893, 2930, 2968, 3005, 3043, 3081, 3118, 3156, 3193, 3231, 3268, 3306, 3344, 3381, 3419, 3456, 3494, 3531, 3569, 3607, 3644, 3682, 3719, 3757, 3794, 3832, 3870, 3907, 3945, 3982, 4020, 4057, 4095, 4132, 4170, 4208, 4245, 4283, 4320, 4358, 4395, 4433, 4471, 4508, 4546, 4583, 4621, 4658, 4696, 4734, 4771, 4809, 4846, 4884, 4921, 4959, 4997, 5034, 5072, 5109, 5147, 5184, 5222, 5260, 5297, 5335, 5372, 5410, 5447, 5485, 5522, 5560, 5598, 5635, 5673, 5710, 5748, 5785, 5823, 5861, 5898, 5936, 5973, 6011, 6048, 6086, 6124, 6161, 6199, 6236, 6274, 6311, 6349, 6387, 6424, 6462, 6499, 6537, 6574, 6612, 6650, 6687, 6725, 6762, 6800, 6837, 6875, 6913, 6950, 6988, 7025, 7063, 7100, 7138, 7175, 7213, 7251, 7288, 7326, 7363, 7401, 7438, 7476, 7514, 7551, 7589, 7626, 7664, 7701, 7739, 7777, 7814, 7852, 7889, 7927, 7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, 8378, 8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, 8791, 8828, 8866, 8904, 8941, 8979, 9016, 9054, 9091, 9129, 9167, 9204, 9242, 9279, 9317, 9354, 9392, 9430, 9467, 9505, 9542, 9580 }; static INT16 Y_B[] = { 0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, 88, 95, 102, 109, 117, 124, 131, 139, 146, 153, 161, 168, 175, 182, 190, 197, 204, 212, 219, 226, 233, 241, 248, 255, 263, 270, 277, 285, 292, 299, 306, 314, 321, 328, 336, 343, 350, 358, 365, 372, 379, 387, 394, 401, 409, 416, 423, 430, 438, 445, 452, 460, 467, 474, 482, 489, 496, 503, 511, 518, 525, 533, 540, 547, 554, 562, 569, 576, 584, 591, 598, 606, 613, 620, 627, 635, 642, 649, 657, 664, 671, 679, 686, 693, 700, 708, 715, 722, 730, 737, 744, 751, 759, 766, 773, 781, 788, 795, 803, 810, 817, 824, 832, 839, 846, 854, 861, 868, 876, 883, 890, 897, 905, 912, 919, 927, 934, 941, 948, 956, 963, 970, 978, 985, 992, 1000, 1007, 1014, 1021, 1029, 1036, 1043, 1051, 1058, 1065, 1073, 1080, 1087, 1094, 1102, 1109, 1116, 1124, 1131, 1138, 1145, 1153, 1160, 1167, 1175, 1182, 1189, 1197, 1204, 1211, 1218, 1226, 1233, 1240, 1248, 1255, 1262, 1270, 1277, 1284, 1291, 1299, 1306, 1313, 1321, 1328, 1335, 1342, 1350, 1357, 1364, 1372, 1379, 1386, 1394, 1401, 1408, 1415, 1423, 1430, 1437, 1445, 1452, 1459, 1466, 1474, 1481, 1488, 1496, 1503, 1510, 1518, 1525, 1532, 1539, 1547, 1554, 1561, 1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627, 1634, 1642, 1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, 1729, 1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, 1809, 1817, 1824, 1831, 1839, 1846, 1853, 1860 }; static INT16 Cb_R[] = { 0, -10, -21, -31, -42, -53, -64, -75, -85, -96, -107, -118, -129, -139, -150, -161, -172, -183, -193, -204, -215, -226, -237, -247, -258, -269, -280, -291, -301, -312, -323, -334, -345, -355, -366, -377, -388, -399, -409, -420, -431, -442, -453, -463, -474, -485, -496, -507, -517, -528, -539, -550, -561, -571, -582, -593, -604, -615, -625, -636, -647, -658, -669, -679, -690, -701, -712, -723, -733, -744, -755, -766, -777, -787, -798, -809, -820, -831, -841, -852, -863, -874, -885, -895, -906, -917, -928, -939, -949, -960, -971, -982, -993, -1003, -1014, -1025, -1036, -1047, -1057, -1068, -1079, -1090, -1101, -1111, -1122, -1133, -1144, -1155, -1165, -1176, -1187, -1198, -1209, -1219, -1230, -1241, -1252, -1263, -1273, -1284, -1295, -1306, -1317, -1327, -1338, -1349, -1360, -1371, -1381, -1392, -1403, -1414, -1425, -1435, -1446, -1457, -1468, -1479, -1489, -1500, -1511, -1522, -1533, -1543, -1554, -1565, -1576, -1587, -1597, -1608, -1619, -1630, -1641, -1651, -1662, -1673, -1684, -1694, -1705, -1716, -1727, -1738, -1748, -1759, -1770, -1781, -1792, -1802, -1813, -1824, -1835, -1846, -1856, -1867, -1878, -1889, -1900, -1910, -1921, -1932, -1943, -1954, -1964, -1975, -1986, -1997, -2008, -2018, -2029, -2040, -2051, -2062, -2072, -2083, -2094, -2105, -2116, -2126, -2137, -2148, -2159, -2170, -2180, -2191, -2202, -2213, -2224, -2234, -2245, -2256, -2267, -2278, -2288, -2299, -2310, -2321, -2332, -2342, -2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450, -2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, -2569, -2580, -2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, -2677, -2688, -2699, -2710, -2720, -2731, -2742, -2753 }; static INT16 Cb_G[] = { 0, -20, -41, -63, -84, -105, -126, -147, -169, -190, -211, -232, -253, -275, -296, -317, -338, -359, -381, -402, -423, -444, -465, -487, -508, -529, -550, -571, -593, -614, -635, -656, -677, -699, -720, -741, -762, -783, -805, -826, -847, -868, -889, -911, -932, -953, -974, -995, -1017, -1038, -1059, -1080, -1101, -1123, -1144, -1165, -1186, -1207, -1229, -1250, -1271, -1292, -1313, -1335, -1356, -1377, -1398, -1419, -1441, -1462, -1483, -1504, -1525, -1547, -1568, -1589, -1610, -1631, -1653, -1674, -1695, -1716, -1737, -1759, -1780, -1801, -1822, -1843, -1865, -1886, -1907, -1928, -1949, -1971, -1992, -2013, -2034, -2055, -2077, -2098, -2119, -2140, -2161, -2183, -2204, -2225, -2246, -2267, -2289, -2310, -2331, -2352, -2373, -2395, -2416, -2437, -2458, -2479, -2501, -2522, -2543, -2564, -2585, -2607, -2628, -2649, -2670, -2691, -2713, -2734, -2755, -2776, -2797, -2819, -2840, -2861, -2882, -2903, -2925, -2946, -2967, -2988, -3009, -3031, -3052, -3073, -3094, -3115, -3137, -3158, -3179, -3200, -3221, -3243, -3264, -3285, -3306, -3328, -3349, -3370, -3391, -3412, -3434, -3455, -3476, -3497, -3518, -3540, -3561, -3582, -3603, -3624, -3646, -3667, -3688, -3709, -3730, -3752, -3773, -3794, -3815, -3836, -3858, -3879, -3900, -3921, -3942, -3964, -3985, -4006, -4027, -4048, -4070, -4091, -4112, -4133, -4154, -4176, -4197, -4218, -4239, -4260, -4282, -4303, -4324, -4345, -4366, -4388, -4409, -4430, -4451, -4472, -4494, -4515, -4536, -4557, -4578, -4600, -4621, -4642, -4663, -4684, -4706, -4727, -4748, -4769, -4790, -4812, -4833, -4854, -4875, -4896, -4918, -4939, -4960, -4981, -5002, -5024, -5045, -5066, -5087, -5108, -5130, -5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320, -5342, -5363, -5384, -5405 }; static INT16 Cb_B[] = { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024, 1056, 1088, 1120, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472, 1504, 1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, 2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, 2880, 2912, 2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, 3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, 3648, 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, 4000, 4032, 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352, 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, 4704, 4736, 4768, 4800, 4832, 4864, 4896, 4928, 4960, 4992, 5024, 5056, 5088, 5120, 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376, 5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, 6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, 6752, 6784, 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, 7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, 7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160 }; #define Cr_R Cb_B static INT16 Cr_G[] = { 0, -26, -53, -79, -106, -133, -160, -187, -213, -240, -267, -294, -321, -347, -374, -401, -428, -455, -481, -508, -535, -562, -589, -615, -642, -669, -696, -722, -749, -776, -803, -830, -856, -883, -910, -937, -964, -990, -1017, -1044, -1071, -1098, -1124, -1151, -1178, -1205, -1232, -1258, -1285, -1312, -1339, -1366, -1392, -1419, -1446, -1473, -1500, -1526, -1553, -1580, -1607, -1634, -1660, -1687, -1714, -1741, -1768, -1794, -1821, -1848, -1875, -1902, -1928, -1955, -1982, -2009, -2036, -2062, -2089, -2116, -2143, -2169, -2196, -2223, -2250, -2277, -2303, -2330, -2357, -2384, -2411, -2437, -2464, -2491, -2518, -2545, -2571, -2598, -2625, -2652, -2679, -2705, -2732, -2759, -2786, -2813, -2839, -2866, -2893, -2920, -2947, -2973, -3000, -3027, -3054, -3081, -3107, -3134, -3161, -3188, -3215, -3241, -3268, -3295, -3322, -3349, -3375, -3402, -3429, -3456, -3483, -3509, -3536, -3563, -3590, -3616, -3643, -3670, -3697, -3724, -3750, -3777, -3804, -3831, -3858, -3884, -3911, -3938, -3965, -3992, -4018, -4045, -4072, -4099, -4126, -4152, -4179, -4206, -4233, -4260, -4286, -4313, -4340, -4367, -4394, -4420, -4447, -4474, -4501, -4528, -4554, -4581, -4608, -4635, -4662, -4688, -4715, -4742, -4769, -4796, -4822, -4849, -4876, -4903, -4929, -4956, -4983, -5010, -5037, -5063, -5090, -5117, -5144, -5171, -5197, -5224, -5251, -5278, -5305, -5331, -5358, -5385, -5412, -5439, -5465, -5492, -5519, -5546, -5573, -5599, -5626, -5653, -5680, -5707, -5733, -5760, -5787, -5814, -5841, -5867, -5894, -5921, -5948, -5975, -6001, -6028, -6055, -6082, -6109, -6135, -6162, -6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403, -6430, -6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, -6725, -6752, -6778, -6805, -6832 }; static INT16 Cr_B[] = { 0, -4, -9, -15, -20, -25, -30, -35, -41, -46, -51, -56, -61, -67, -72, -77, -82, -87, -93, -98, -103, -108, -113, -119, -124, -129, -134, -140, -145, -150, -155, -160, -166, -171, -176, -181, -186, -192, -197, -202, -207, -212, -218, -223, -228, -233, -238, -244, -249, -254, -259, -264, -270, -275, -280, -285, -290, -296, -301, -306, -311, -316, -322, -327, -332, -337, -342, -348, -353, -358, -363, -368, -374, -379, -384, -389, -394, -400, -405, -410, -415, -421, -426, -431, -436, -441, -447, -452, -457, -462, -467, -473, -478, -483, -488, -493, -499, -504, -509, -514, -519, -525, -530, -535, -540, -545, -551, -556, -561, -566, -571, -577, -582, -587, -592, -597, -603, -608, -613, -618, -623, -629, -634, -639, -644, -649, -655, -660, -665, -670, -675, -681, -686, -691, -696, -702, -707, -712, -717, -722, -728, -733, -738, -743, -748, -754, -759, -764, -769, -774, -780, -785, -790, -795, -800, -806, -811, -816, -821, -826, -832, -837, -842, -847, -852, -858, -863, -868, -873, -878, -884, -889, -894, -899, -904, -910, -915, -920, -925, -930, -936, -941, -946, -951, -957, -962, -967, -972, -977, -983, -988, -993, -998, -1003, -1009, -1014, -1019, -1024, -1029, -1035, -1040, -1045, -1050, -1055, -1061, -1066, -1071, -1076, -1081, -1087, -1092, -1097, -1102, -1107, -1113, -1118, -1123, -1128, -1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180, -1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, -1238, -1243, -1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, -1290, -1295, -1300, -1305, -1310, -1316, -1321, -1326 }; static INT16 R_Cr[] = { -11484, -11394, -11305, -11215, -11125, -11036, -10946, -10856, -10766, -10677, -10587, -10497, -10407, -10318, -10228, -10138, -10049, -9959, -9869, -9779, -9690, -9600, -9510, -9420, -9331, -9241, -9151, -9062, -8972, -8882, -8792, -8703, -8613, -8523, -8433, -8344, -8254, -8164, -8075, -7985, -7895, -7805, -7716, -7626, -7536, -7446, -7357, -7267, -7177, -7088, -6998, -6908, -6818, -6729, -6639, -6549, -6459, -6370, -6280, -6190, -6101, -6011, -5921, -5831, -5742, -5652, -5562, -5472, -5383, -5293, -5203, -5113, -5024, -4934, -4844, -4755, -4665, -4575, -4485, -4396, -4306, -4216, -4126, -4037, -3947, -3857, -3768, -3678, -3588, -3498, -3409, -3319, -3229, -3139, -3050, -2960, -2870, -2781, -2691, -2601, -2511, -2422, -2332, -2242, -2152, -2063, -1973, -1883, -1794, -1704, -1614, -1524, -1435, -1345, -1255, -1165, -1076, -986, -896, -807, -717, -627, -537, -448, -358, -268, -178, -89, 0, 90, 179, 269, 359, 449, 538, 628, 718, 808, 897, 987, 1077, 1166, 1256, 1346, 1436, 1525, 1615, 1705, 1795, 1884, 1974, 2064, 2153, 2243, 2333, 2423, 2512, 2602, 2692, 2782, 2871, 2961, 3051, 3140, 3230, 3320, 3410, 3499, 3589, 3679, 3769, 3858, 3948, 4038, 4127, 4217, 4307, 4397, 4486, 4576, 4666, 4756, 4845, 4935, 5025, 5114, 5204, 5294, 5384, 5473, 5563, 5653, 5743, 5832, 5922, 6012, 6102, 6191, 6281, 6371, 6460, 6550, 6640, 6730, 6819, 6909, 6999, 7089, 7178, 7268, 7358, 7447, 7537, 7627, 7717, 7806, 7896, 7986, 8076, 8165, 8255, 8345, 8434, 8524, 8614, 8704, 8793, 8883, 8973, 9063, 9152, 9242, 9332, 9421, 9511, 9601, 9691, 9780, 9870, 9960, 10050, 10139, 10229, 10319, 10408, 10498, 10588, 10678, 10767, 10857, 10947, 11037, 11126, 11216, 11306, 11395 }; static INT16 G_Cb[] = { 2819, 2797, 2775, 2753, 2731, 2709, 2687, 2665, 2643, 2621, 2599, 2577, 2555, 2533, 2511, 2489, 2467, 2445, 2423, 2401, 2379, 2357, 2335, 2313, 2291, 2269, 2247, 2225, 2202, 2180, 2158, 2136, 2114, 2092, 2070, 2048, 2026, 2004, 1982, 1960, 1938, 1916, 1894, 1872, 1850, 1828, 1806, 1784, 1762, 1740, 1718, 1696, 1674, 1652, 1630, 1608, 1586, 1564, 1542, 1520, 1498, 1476, 1454, 1432, 1410, 1388, 1366, 1344, 1321, 1299, 1277, 1255, 1233, 1211, 1189, 1167, 1145, 1123, 1101, 1079, 1057, 1035, 1013, 991, 969, 947, 925, 903, 881, 859, 837, 815, 793, 771, 749, 727, 705, 683, 661, 639, 617, 595, 573, 551, 529, 507, 485, 463, 440, 418, 396, 374, 352, 330, 308, 286, 264, 242, 220, 198, 176, 154, 132, 110, 88, 66, 44, 22, 0, -21, -43, -65, -87, -109, -131, -153, -175, -197, -219, -241, -263, -285, -307, -329, -351, -373, -395, -417, -439, -462, -484, -506, -528, -550, -572, -594, -616, -638, -660, -682, -704, -726, -748, -770, -792, -814, -836, -858, -880, -902, -924, -946, -968, -990, -1012, -1034, -1056, -1078, -1100, -1122, -1144, -1166, -1188, -1210, -1232, -1254, -1276, -1298, -1320, -1343, -1365, -1387, -1409, -1431, -1453, -1475, -1497, -1519, -1541, -1563, -1585, -1607, -1629, -1651, -1673, -1695, -1717, -1739, -1761, -1783, -1805, -1827, -1849, -1871, -1893, -1915, -1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, -2113, -2135, -2157, -2179, -2201, -2224, -2246, -2268, -2290, -2312, -2334, -2356, -2378, -2400, -2422, -2444, -2466, -2488, -2510, -2532, -2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708, -2730, -2752, -2774, -2796 }; static INT16 G_Cr[] = { 5850, 5805, 5759, 5713, 5667, 5622, 5576, 5530, 5485, 5439, 5393, 5347, 5302, 5256, 5210, 5165, 5119, 5073, 5028, 4982, 4936, 4890, 4845, 4799, 4753, 4708, 4662, 4616, 4570, 4525, 4479, 4433, 4388, 4342, 4296, 4251, 4205, 4159, 4113, 4068, 4022, 3976, 3931, 3885, 3839, 3794, 3748, 3702, 3656, 3611, 3565, 3519, 3474, 3428, 3382, 3336, 3291, 3245, 3199, 3154, 3108, 3062, 3017, 2971, 2925, 2879, 2834, 2788, 2742, 2697, 2651, 2605, 2559, 2514, 2468, 2422, 2377, 2331, 2285, 2240, 2194, 2148, 2102, 2057, 2011, 1965, 1920, 1874, 1828, 1782, 1737, 1691, 1645, 1600, 1554, 1508, 1463, 1417, 1371, 1325, 1280, 1234, 1188, 1143, 1097, 1051, 1006, 960, 914, 868, 823, 777, 731, 686, 640, 594, 548, 503, 457, 411, 366, 320, 274, 229, 183, 137, 91, 46, 0, -45, -90, -136, -182, -228, -273, -319, -365, -410, -456, -502, -547, -593, -639, -685, -730, -776, -822, -867, -913, -959, -1005, -1050, -1096, -1142, -1187, -1233, -1279, -1324, -1370, -1416, -1462, -1507, -1553, -1599, -1644, -1690, -1736, -1781, -1827, -1873, -1919, -1964, -2010, -2056, -2101, -2147, -2193, -2239, -2284, -2330, -2376, -2421, -2467, -2513, -2558, -2604, -2650, -2696, -2741, -2787, -2833, -2878, -2924, -2970, -3016, -3061, -3107, -3153, -3198, -3244, -3290, -3335, -3381, -3427, -3473, -3518, -3564, -3610, -3655, -3701, -3747, -3793, -3838, -3884, -3930, -3975, -4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, -4432, -4478, -4524, -4569, -4615, -4661, -4707, -4752, -4798, -4844, -4889, -4935, -4981, -5027, -5072, -5118, -5164, -5209, -5255, -5301, -5346, -5392, -5438, -5484, -5529, -5575, -5621, -5666, -5712, -5758, -5804 }; static INT16 B_Cb[] = { -14515, -14402, -14288, -14175, -14062, -13948, -13835, -13721, -13608, -13495, -13381, -13268, -13154, -13041, -12928, -12814, -12701, -12587, -12474, -12360, -12247, -12134, -12020, -11907, -11793, -11680, -11567, -11453, -11340, -11226, -11113, -11000, -10886, -10773, -10659, -10546, -10433, -10319, -10206, -10092, -9979, -9865, -9752, -9639, -9525, -9412, -9298, -9185, -9072, -8958, -8845, -8731, -8618, -8505, -8391, -8278, -8164, -8051, -7938, -7824, -7711, -7597, -7484, -7371, -7257, -7144, -7030, -6917, -6803, -6690, -6577, -6463, -6350, -6236, -6123, -6010, -5896, -5783, -5669, -5556, -5443, -5329, -5216, -5102, -4989, -4876, -4762, -4649, -4535, -4422, -4309, -4195, -4082, -3968, -3855, -3741, -3628, -3515, -3401, -3288, -3174, -3061, -2948, -2834, -2721, -2607, -2494, -2381, -2267, -2154, -2040, -1927, -1814, -1700, -1587, -1473, -1360, -1246, -1133, -1020, -906, -793, -679, -566, -453, -339, -226, -112, 0, 113, 227, 340, 454, 567, 680, 794, 907, 1021, 1134, 1247, 1361, 1474, 1588, 1701, 1815, 1928, 2041, 2155, 2268, 2382, 2495, 2608, 2722, 2835, 2949, 3062, 3175, 3289, 3402, 3516, 3629, 3742, 3856, 3969, 4083, 4196, 4310, 4423, 4536, 4650, 4763, 4877, 4990, 5103, 5217, 5330, 5444, 5557, 5670, 5784, 5897, 6011, 6124, 6237, 6351, 6464, 6578, 6691, 6804, 6918, 7031, 7145, 7258, 7372, 7485, 7598, 7712, 7825, 7939, 8052, 8165, 8279, 8392, 8506, 8619, 8732, 8846, 8959, 9073, 9186, 9299, 9413, 9526, 9640, 9753, 9866, 9980, 10093, 10207, 10320, 10434, 10547, 10660, 10774, 10887, 11001, 11114, 11227, 11341, 11454, 11568, 11681, 11794, 11908, 12021, 12135, 12248, 12361, 12475, 12588, 12702, 12815, 12929, 13042, 13155, 13269, 13382, 13496, 13609, 13722, 13836, 13949, 14063, 14176, 14289, 14403 }; void ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels) { int x; UINT8 a; int r, g, b; int y, cr, cb; for (x = 0; x < pixels; x++, in +=4, out += 4) { r = in[0]; g = in[1]; b = in[2]; a = in[3]; y = (Y_R[r] + Y_G[g] + Y_B[b]) >> SCALE; cb = ((Cb_R[r] + Cb_G[g] + Cb_B[b]) >> SCALE) + 128; cr = ((Cr_R[r] + Cr_G[g] + Cr_B[b]) >> SCALE) + 128; out[0] = (UINT8) y; out[1] = (UINT8) cb; out[2] = (UINT8) cr; out[3] = a; } } void ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels) { int x; UINT8 a; int r, g, b; int y, cr, cb; for (x = 0; x < pixels; x++, in += 4, out += 4) { y = in[0]; cb = in[1]; cr = in[2]; a = in[3]; r = y + (( R_Cr[cr]) >> SCALE); g = y + ((G_Cb[cb] + G_Cr[cr]) >> SCALE); b = y + ((B_Cb[cb] ) >> SCALE); out[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r; out[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g; out[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b; out[3] = a; } } pillow-2.3.0/libImaging/RankFilter.c0000644000175000001440000000507712257506326016165 0ustar dokousers/* * The Python Imaging Library * $Id$ * * min, max, median filters * * history: * 2002-06-08 fl Created * * Copyright (c) Secret Labs AB 2002. All rights reserved. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* Fast rank algorithm (due to Wirth), based on public domain code by Nicolas Devillard, available at http://ndevilla.free.fr */ #define SWAP(type,a,b) { register type t=(a);(a)=(b);(b)=t; } #define MakeRankFunction(type)\ static type Rank##type(type a[], int n, int k)\ {\ register int i, j, l, m;\ register type x;\ l = 0; m = n-1;\ while (l < m) {\ x = a[k];\ i = l;\ j = m;\ do {\ while (a[i] < x) i++;\ while (x < a[j]) j--;\ if (i <= j) {\ SWAP(type, a[i], a[j]);\ i++; j--;\ }\ } while (i <= j);\ if (j < k) l = i;\ if (k < i) m = j;\ }\ return a[k];\ } MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) Imaging ImagingRankFilter(Imaging im, int size, int rank) { Imaging imOut = NULL; int x, y; int i, margin, size2; if (!im || im->bands != 1 || im->type == IMAGING_TYPE_SPECIAL) return (Imaging) ImagingError_ModeError(); if (!(size & 1)) return (Imaging) ImagingError_ValueError("bad filter size"); size2 = size * size; margin = (size-1) / 2; if (rank < 0 || rank >= size2) return (Imaging) ImagingError_ValueError("bad rank value"); imOut = ImagingNew(im->mode, im->xsize - 2*margin, im->ysize - 2*margin); if (!imOut) return NULL; #define RANK_BODY(type) do {\ type* buf = malloc(size2 * sizeof(type));\ if (!buf)\ goto nomemory;\ for (y = 0; y < imOut->ysize; y++)\ for (x = 0; x < imOut->xsize; x++) {\ for (i = 0; i < size; i++)\ memcpy(buf + i*size, &IMAGING_PIXEL_##type(im, x, y+i),\ size * sizeof(type));\ IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank);\ }\ free(buf); \ } while (0) if (im->image8) RANK_BODY(UINT8); else if (im->type == IMAGING_TYPE_INT32) RANK_BODY(INT32); else if (im->type == IMAGING_TYPE_FLOAT32) RANK_BODY(FLOAT32); else { /* safety net (we shouldn't end up here) */ ImagingDelete(imOut); return (Imaging) ImagingError_ModeError(); } ImagingCopyInfo(imOut, im); return imOut; nomemory: ImagingDelete(imOut); return (Imaging) ImagingError_MemoryError(); } pillow-2.3.0/libImaging/Zip.h0000644000175000001440000000256012257506326014665 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * declarations for the ZIP codecs * * Copyright (c) Fredrik Lundh 1996. */ #include "zlib.h" /* modes */ #define ZIP_PNG 0 /* continuous, filtered image data */ #define ZIP_PNG_PALETTE 1 /* non-continuous data, disable filtering */ #define ZIP_TIFF_PREDICTOR 2 /* TIFF, with predictor */ #define ZIP_TIFF 3 /* TIFF, without predictor */ typedef struct { /* CONFIGURATION */ /* Codec mode */ int mode; /* Optimize (max compression) SLOW!!! */ int optimize; /* 0 no compression, 9 best compression, -1 default compression */ int compress_level; /* compression strategy Z_XXX */ int compress_type; /* Predefined dictionary (experimental) */ char* dictionary; int dictionary_size; /* PRIVATE CONTEXT (set by decoder/encoder) */ z_stream z_stream; /* (de)compression stream */ UINT8* previous; /* previous line (allocated) */ int last_output; /* # bytes last output by inflate */ /* Compressor specific stuff */ UINT8* prior; /* filter storage (allocated) */ UINT8* up; UINT8* average; UINT8* paeth; UINT8* output; /* output data */ int prefix; /* size of filter prefix (0 for TIFF data) */ int interlaced; /* is the image interlaced? (PNG) */ int pass; /* current pass of the interlaced image (PNG) */ } ZIPSTATE; pillow-2.3.0/libImaging/SunRleDecode.c0000644000175000001440000000324412257506326016432 0ustar dokousers/* * THIS IS WORK IN PROGRESS * * The Python Imaging Library. * $Id$ * * decoder for SUN RLE data. * * history: * 97-01-04 fl Created * * Copyright (c) Fredrik Lundh 1997. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" int ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { int n; UINT8* ptr; ptr = buf; for (;;) { if (bytes < 1) return ptr - buf; if (ptr[0] == 0x80) { if (bytes < 2) break; n = ptr[1]; if (n == 0) { /* Literal 0x80 (2 bytes) */ n = 1; state->buffer[state->x] = 0x80; ptr += 2; bytes -= 2; } else { /* Run (3 bytes) */ if (bytes < 3) break; if (state->x + n > state->bytes) { /* FIXME: is this correct? */ state->errcode = IMAGING_CODEC_OVERRUN; return -1; } memset(state->buffer + state->x, ptr[2], n); ptr += 3; bytes -= 3; } } else { /* Literal (1+n bytes block) */ n = ptr[0]; if (bytes < 1 + n) break; if (state->x + n > state->bytes) { /* FIXME: is this correct? */ state->errcode = IMAGING_CODEC_OVERRUN; return -1; } memcpy(state->buffer + state->x, ptr + 1, n); ptr += 1 + n; bytes -= 1 + n; } state->x += n; if (state->x >= state->bytes) { /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) { /* End of file (errcode = 0) */ return -1; } } } return ptr - buf; } pillow-2.3.0/libImaging/Palette.c0000644000175000001440000001634312257506326015520 0ustar dokousers/* * The Python Imaging Library * $Id$ * * imaging palette object * * history: * 1996-05-05 fl Added to library * 1996-05-27 fl Added colour mapping stuff * 1997-05-12 fl Support RGBA palettes * 2005-02-09 fl Removed grayscale entries from web palette * * Copyright (c) Secret Labs AB 1997-2005. All rights reserved. * Copyright (c) Fredrik Lundh 1995-1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include ImagingPalette ImagingPaletteNew(const char* mode) { /* Create a palette object */ int i; ImagingPalette palette; if (strcmp(mode, "RGB") && strcmp(mode, "RGBA")) return (ImagingPalette) ImagingError_ModeError(); palette = calloc(1, sizeof(struct ImagingPaletteInstance)); if (!palette) return (ImagingPalette) ImagingError_MemoryError(); strncpy(palette->mode, mode, IMAGING_MODE_LENGTH); /* Initialize to ramp */ for (i = 0; i < 256; i++) { palette->palette[i*4+0] = palette->palette[i*4+1] = palette->palette[i*4+2] = (UINT8) i; palette->palette[i*4+3] = 255; /* opaque */ } return palette; } ImagingPalette ImagingPaletteNewBrowser(void) { /* Create a standard "browser" palette object */ int i, r, g, b; ImagingPalette palette; palette = ImagingPaletteNew("RGB"); if (!palette) return NULL; /* Blank out unused entries */ /* FIXME: Add 10-level windows palette here? */ for (i = 0; i < 10; i++) { palette->palette[i*4+0] = palette->palette[i*4+1] = palette->palette[i*4+2] = 0; } /* Simple 6x6x6 colour cube */ for (b = 0; b < 256; b += 51) for (g = 0; g < 256; g += 51) for (r = 0; r < 256; r += 51) { palette->palette[i*4+0] = r; palette->palette[i*4+1] = g; palette->palette[i*4+2] = b; i++; } /* Blank out unused entries */ /* FIXME: add 30-level greyscale wedge here? */ for (; i < 256; i++) { palette->palette[i*4+0] = palette->palette[i*4+1] = palette->palette[i*4+2] = 0; } return palette; } ImagingPalette ImagingPaletteDuplicate(ImagingPalette palette) { /* Duplicate palette descriptor */ ImagingPalette new_palette; if (!palette) return NULL; new_palette = malloc(sizeof(struct ImagingPaletteInstance)); if (!new_palette) return (ImagingPalette) ImagingError_MemoryError(); memcpy(new_palette, palette, sizeof(struct ImagingPaletteInstance)); /* Don't share the cache */ new_palette->cache = NULL; return new_palette; } void ImagingPaletteDelete(ImagingPalette palette) { /* Destroy palette object */ if (palette) { if (palette->cache) free(palette->cache); free(palette); } } /* -------------------------------------------------------------------- */ /* Colour mapping */ /* -------------------------------------------------------------------- */ /* This code is used to map RGB triplets to palette indices, using a palette index cache. */ /* * This implementation is loosely based on the corresponding code in * the IJG JPEG library by Thomas G. Lane. Original algorithms by * Paul Heckbert and Spencer W. Thomas. * * The IJG JPEG library is copyright (C) 1991-1995, Thomas G. Lane. */ #define DIST(a, b, s) (a - b) * (a - b) * s /* Colour weights (no scaling, for now) */ #define RSCALE 1 #define GSCALE 1 #define BSCALE 1 /* Calculated scaled distances */ #define RDIST(a, b) DIST(a, b, RSCALE*RSCALE) #define GDIST(a, b) DIST(a, b, GSCALE*GSCALE) #define BDIST(a, b) DIST(a, b, BSCALE*BSCALE) /* Incremental steps */ #define RSTEP (4 * RSCALE) #define GSTEP (4 * GSCALE) #define BSTEP (4 * BSCALE) #define BOX 8 #define BOXVOLUME BOX*BOX*BOX void ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) { int i, j; unsigned int dmin[256], dmax; int r0, g0, b0; int r1, g1, b1; int rc, gc, bc; unsigned int d[BOXVOLUME]; UINT8 c[BOXVOLUME]; /* Get box boundaries for the given (r,g,b)-triplet. Each box covers eight cache slots (32 colour values, that is). */ r0 = r & 0xe0; r1 = r0 + 0x1f; rc = (r0 + r1) / 2; g0 = g & 0xe0; g1 = g0 + 0x1f; gc = (g0 + g1) / 2; b0 = b & 0xe0; b1 = b0 + 0x1f; bc = (b0 + b1) / 2; /* Step 1 -- Select relevant palette entries (after Heckbert) */ /* For each palette entry, calculate the min and max distances to * any position in the box given by the colour we're looking for. */ dmax = (unsigned int) ~0; for (i = 0; i < 256; i++) { int r, g, b; unsigned int tmin, tmax; /* Find min and max distances to any point in the box */ r = palette->palette[i*4+0]; tmin = (r < r0) ? RDIST(r, r1) : (r > r1) ? RDIST(r, r0) : 0; tmax = (r <= rc) ? RDIST(r, r1) : RDIST(r, r0); g = palette->palette[i*4+1]; tmin += (g < g0) ? GDIST(g, g1) : (g > g1) ? GDIST(g, g0) : 0; tmax += (g <= gc) ? GDIST(g, g1) : GDIST(g, g0); b = palette->palette[i*4+2]; tmin += (b < b0) ? BDIST(b, b1) : (b > b1) ? BDIST(b, b0) : 0; tmax += (b <= bc) ? BDIST(b, b1) : BDIST(b, b0); dmin[i] = tmin; if (tmax < dmax) dmax = tmax; /* keep the smallest max distance only */ } /* Step 2 -- Incrementally update cache slot (after Thomas) */ /* Find the box containing the nearest palette entry, and update * all slots in that box. We only check boxes for which the min * distance is less than or equal the smallest max distance */ for (i = 0; i < BOXVOLUME; i++) d[i] = (unsigned int) ~0; for (i = 0; i < 256; i++) if (dmin[i] <= dmax) { int rd, gd, bd; int ri, gi, bi; int rx, gx, bx; ri = (r0 - palette->palette[i*4+0]) * RSCALE; gi = (g0 - palette->palette[i*4+1]) * GSCALE; bi = (b0 - palette->palette[i*4+2]) * BSCALE; rd = ri*ri + gi*gi + bi*bi; ri = ri * (2 * RSTEP) + RSTEP * RSTEP; gi = gi * (2 * GSTEP) + GSTEP * GSTEP; bi = bi * (2 * BSTEP) + BSTEP * BSTEP; rx = ri; for (r = j = 0; r < BOX; r++) { gd = rd; gx = gi; for (g = 0; g < BOX; g++) { bd = gd; bx = bi; for (b = 0; b < BOX; b++) { if ((unsigned int) bd < d[j]) { d[j] = bd; c[j] = (UINT8) i; } bd += bx; bx += 2 * BSTEP * BSTEP; j++; } gd += gx; gx += 2 * GSTEP * GSTEP; } rd += rx; rx += 2 * RSTEP * RSTEP; } } /* Step 3 -- Update cache */ /* The c array now contains the closest match for each * cache slot in the box. Update the cache. */ j = 0; for (r = r0; r < r1; r+=4) for (g = g0; g < g1; g+=4) for (b = b0; b < b1; b+=4) ImagingPaletteCache(palette, r, g, b) = c[j++]; } int ImagingPaletteCachePrepare(ImagingPalette palette) { /* Add a colour cache to a palette */ int i; int entries = 64*64*64; if (palette->cache == NULL) { /* The cache is 512k. It might be a good idea to break it up into a pointer array (e.g. an 8-bit image?) */ palette->cache = (INT16*) malloc(entries * sizeof(INT16)); if (!palette->cache) { (void) ImagingError_MemoryError(); return -1; } /* Mark all entries as empty */ for (i = 0; i < entries; i++) palette->cache[i] = 0x100; } return 0; } void ImagingPaletteCacheDelete(ImagingPalette palette) { /* Release the colour cache, if any */ if (palette && palette->cache) { free(palette->cache); palette->cache = NULL; } } pillow-2.3.0/libImaging/File.c0000644000175000001440000000641612257506326015001 0ustar dokousers/* * The Python Imaging Library * $Id$ * * built-in image file handling * * history: * 1995-11-26 fl Created, supports PGM/PPM * 1996-08-07 fl Write "1" images as PGM * 1999-02-21 fl Don't write non-standard modes * * Copyright (c) 1997-99 by Secret Labs AB. * Copyright (c) 1995-96 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include Imaging ImagingOpenPPM(const char* infile) { FILE* fp; int i, c, v; char* mode; int x, y, max; Imaging im; if (!infile) return ImagingError_ValueError(NULL); fp = fopen(infile, "rb"); if (!fp) return ImagingError_IOError(); /* PPM magic */ if (fgetc(fp) != 'P') goto error; switch (fgetc(fp)) { case '4': /* FIXME: 1-bit images are not yet supported */ goto error; case '5': mode = "L"; break; case '6': mode = "RGB"; break; default: goto error; } i = 0; c = fgetc(fp); x = y = max = 0; while (i < 3) { /* Ignore optional comment fields */ while (c == '\n') { c = fgetc(fp); if (c == '#') { do { c = fgetc(fp); if (c == EOF) goto error; } while (c != '\n'); c = fgetc(fp); } } /* Skip forward to next value */ while (isspace(c)) c = fgetc(fp); /* And parse it */ v = 0; while (isdigit(c)) { v = v * 10 + (c - '0'); c = fgetc(fp); } if (c == EOF) goto error; switch (i++) { case 0: x = v; break; case 1: y = v; break; case 2: max = v; break; } } im = ImagingNew(mode, x, y); if (!im) return NULL; /* if (max != 255) ... FIXME: does anyone ever use this feature? */ if (strcmp(im->mode, "L") == 0) { /* PPM "L" */ for (y = 0; y < im->ysize; y++) if (fread(im->image[y], im->xsize, 1, fp) != 1) goto error; } else { /* PPM "RGB" or PyPPM mode */ for (y = 0; y < im->ysize; y++) for (x = i = 0; x < im->xsize; x++, i += im->pixelsize) if (fread(im->image[y]+i, im->bands, 1, fp) != 1) goto error; } fclose(fp); return im; error: fclose(fp); return ImagingError_IOError(); } int ImagingSaveRaw(Imaging im, FILE* fp) { int x, y, i; if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { /* @PIL227: FIXME: for mode "1", map != 0 to 255 */ /* PGM "L" */ for (y = 0; y < im->ysize; y++) fwrite(im->image[y], 1, im->xsize, fp); } else { /* PPM "RGB" or other internal format */ for (y = 0; y < im->ysize; y++) for (x = i = 0; x < im->xsize; x++, i += im->pixelsize) fwrite(im->image[y]+i, 1, im->bands, fp); } return 1; } int ImagingSavePPM(Imaging im, const char* outfile) { FILE* fp; if (!im) { (void) ImagingError_ValueError(NULL); return 0; } fp = fopen(outfile, "wb"); if (!fp) { (void) ImagingError_IOError(); return 0; } if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { /* Write "PGM" */ fprintf(fp, "P5\n%d %d\n255\n", im->xsize, im->ysize); } else if (strcmp(im->mode, "RGB") == 0) { /* Write "PPM" */ fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize); } else { (void) ImagingError_ModeError(); return 0; } ImagingSaveRaw(im, fp); fclose(fp); return 1; } pillow-2.3.0/libImaging/QuantHash.h0000644000175000001440000000423512257506326016020 0ustar dokousers/* * The Python Imaging Library * $Id$ * * image quantizer * * Written by Toby J Sargeant . * * See the README file for information on usage and redistribution. */ #ifndef __QUANTHASH_H__ #define __QUANTHASH_H__ #include "QuantTypes.h" typedef struct _HashTable HashTable; typedef Pixel HashKey_t; typedef uint32_t HashVal_t; typedef uint32_t (*HashFunc)(const HashTable *,const HashKey_t); typedef int (*HashCmpFunc)(const HashTable *,const HashKey_t,const HashKey_t); typedef void (*IteratorFunc)(const HashTable *,const HashKey_t,const HashVal_t,void *); typedef void (*IteratorUpdateFunc)(const HashTable *,const HashKey_t,HashVal_t *,void *); typedef void (*KeyDestroyFunc)(const HashTable *,HashKey_t); typedef void (*ValDestroyFunc)(const HashTable *,HashVal_t); typedef void (*ComputeFunc)(const HashTable *,const HashKey_t,HashVal_t *); typedef void (*CollisionFunc)(const HashTable *,HashKey_t *,HashVal_t *,HashKey_t,HashVal_t); HashTable * hashtable_new(HashFunc hf,HashCmpFunc cf); void hashtable_free(HashTable *h); void hashtable_foreach(HashTable *h,IteratorFunc i,void *u); void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u); int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val); int hashtable_update(HashTable *h,HashKey_t key,HashVal_t val); int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp); int hashtable_lookup_or_insert(HashTable *h,HashKey_t key,HashVal_t *valp,HashVal_t val); int hashtable_insert_or_update_computed(HashTable *h,HashKey_t key,ComputeFunc newFunc,ComputeFunc existsFunc); int hashtable_delete(HashTable *h,const HashKey_t key); int hashtable_remove(HashTable *h,const HashKey_t key,HashKey_t *keyRet,HashVal_t *valRet); void *hashtable_set_user_data(HashTable *h,void *data); void *hashtable_get_user_data(const HashTable *h); KeyDestroyFunc hashtable_set_key_destroy_func(HashTable *,KeyDestroyFunc d); ValDestroyFunc hashtable_set_value_destroy_func(HashTable *,ValDestroyFunc d); uint32_t hashtable_get_count(const HashTable *h); void hashtable_rehash(HashTable *h); void hashtable_rehash_compute(HashTable *h,CollisionFunc cf); #endif // __QUANTHASH_H__ pillow-2.3.0/libImaging/Negative.c0000644000175000001440000000131312257506326015653 0ustar dokousers/* * The Python Imaging Library * $Id$ * * negate image * * to do: * FIXME: Maybe this should be implemented using ImagingPoint() * * history: * 95-11-27 fl: Created * * Copyright (c) Fredrik Lundh 1995. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" Imaging ImagingNegative(Imaging im) { Imaging imOut; int x, y; if (!im) return (Imaging) ImagingError_ModeError(); imOut = ImagingNew(im->mode, im->xsize, im->ysize); if (!imOut) return NULL; for (y = 0; y < im->ysize; y++) for (x = 0; x < im->linesize; x++) imOut->image[y][x] = ~im->image[y][x]; return imOut; } pillow-2.3.0/libImaging/Unpack.c0000644000175000001440000010416112257510072015330 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * code to unpack raw data from various file formats * * history: * 1996-03-07 fl Created (from various decoders) * 1996-04-19 fl Added band unpackers * 1996-05-12 fl Published RGB unpackers * 1996-05-27 fl Added nibble unpacker * 1996-12-10 fl Added complete set of PNG unpackers * 1996-12-29 fl Set alpha byte in RGB unpackers * 1997-01-05 fl Added remaining TGA unpackers * 1997-01-18 fl Added inverting band unpackers * 1997-01-25 fl Added FlashPix unpackers * 1997-05-31 fl Added floating point unpackers * 1998-02-08 fl Added I unpacker * 1998-07-01 fl Added YCbCr unpacker * 1998-07-02 fl Added full set of integer unpackers * 1998-12-29 fl Added mode field, I;16 unpackers * 1998-12-30 fl Added RGBX modes * 1999-02-04 fl Fixed I;16 unpackers * 2003-05-13 fl Added L/RGB reversed unpackers * 2003-09-26 fl Added LA/PA and RGBa->RGB unpackers * * Copyright (c) 1997-2003 by Secret Labs AB. * Copyright (c) 1996-1997 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #define R 0 #define G 1 #define B 2 #define X 3 #define A 3 #define C 0 #define M 1 #define Y 2 #define K 3 #define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) /* byte-swapping macros */ #define C16N\ (tmp[0]=in[0], tmp[1]=in[1]); #define C16S\ (tmp[1]=in[0], tmp[0]=in[1]); #define C32N\ (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3]); #define C32S\ (tmp[3]=in[0], tmp[2]=in[1], tmp[1]=in[2], tmp[0]=in[3]); #define C64N\ (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3],\ tmp[4]=in[4], tmp[5]=in[5], tmp[6]=in[6], tmp[7]=in[7]); #define C64S\ (tmp[7]=in[0], tmp[6]=in[1], tmp[5]=in[2], tmp[4]=in[3],\ tmp[3]=in[4], tmp[2]=in[5], tmp[1]=in[6], tmp[0]=in[7]); #ifdef WORDS_BIGENDIAN #define C16B C16N #define C16L C16S #define C32B C32N #define C32L C32S #define C64B C64N #define C64L C64S #else #define C16B C16S #define C16L C16N #define C32B C32S #define C32L C32N #define C64B C64S #define C64L C64N #endif /* bit-swapping */ static UINT8 BITFLIP[] = { 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255 }; /* Unpack to "1" image */ static void unpack1(UINT8* out, const UINT8* in, int pixels) { /* bits (msb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 7: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 6: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 5: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 4: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 3: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 2: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; case 1: *out++ = (byte & 128) ? 255 : 0; } pixels -= 8; } } static void unpack1I(UINT8* out, const UINT8* in, int pixels) { /* bits (msb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 7: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 6: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 5: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 4: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 3: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 2: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; case 1: *out++ = (byte & 128) ? 0 : 255; } pixels -= 8; } } static void unpack1R(UINT8* out, const UINT8* in, int pixels) { /* bits (lsb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 7: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 6: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 5: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 4: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 3: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 2: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; case 1: *out++ = (byte & 1) ? 255 : 0; } pixels -= 8; } } static void unpack1IR(UINT8* out, const UINT8* in, int pixels) { /* bits (lsb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 7: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 6: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 5: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 4: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 3: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 2: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; case 1: *out++ = (byte & 1) ? 0 : 255; } pixels -= 8; } } /* Unpack to "L" image */ static void unpackL2(UINT8* out, const UINT8* in, int pixels) { /* nibbles */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = ((byte >> 6) & 3) * 255 / 3; byte <<= 2; case 3: *out++ = ((byte >> 6) & 3) * 255 / 3; byte <<= 2; case 2: *out++ = ((byte >> 6) & 3) * 255 / 3; byte <<= 2; case 1: *out++ = ((byte >> 6) & 3) * 255 / 3; } pixels -= 4; } } static void unpackL4(UINT8* out, const UINT8* in, int pixels) { /* nibbles */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = ((byte >> 4) & 15) * 255 / 15; byte <<= 4; case 1: *out++ = ((byte >> 4) & 15) * 255 / 15; } pixels -= 2; } } static void unpackLA(UINT8* out, const UINT8* in, int pixels) { int i; /* LA, pixel interleaved */ for (i = 0; i < pixels; i++) { out[R] = out[G] = out[B] = in[0]; out[A] = in[1]; in += 2; out += 4; } } static void unpackLAL(UINT8* out, const UINT8* in, int pixels) { int i; /* LA, line interleaved */ for (i = 0; i < pixels; i++) { out[R] = out[G] = out[B] = in[i]; out[A] = in[i+pixels]; out += 4; } } static void unpackLI(UINT8* out, const UINT8* in, int pixels) { /* negative */ int i; for (i = 0; i < pixels; i++) out[i] = ~in[i]; } static void unpackLR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, bit reversed */ for (i = 0; i < pixels; i++) { out[i] = BITFLIP[in[i]]; } } static void unpackL16(UINT8* out, const UINT8* in, int pixels) { /* int16 (upper byte, little endian) */ int i; for (i = 0; i < pixels; i++) { out[i] = in[1]; in += 2; } } static void unpackL16B(UINT8* out, const UINT8* in, int pixels) { int i; /* int16 (upper byte, big endian) */ for (i = 0; i < pixels; i++) { out[i] = in[0]; in += 2; } } /* Unpack to "P" image */ static void unpackP1(UINT8* out, const UINT8* in, int pixels) { /* bits */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte >> 7) & 1; byte <<= 1; case 7: *out++ = (byte >> 7) & 1; byte <<= 1; case 6: *out++ = (byte >> 7) & 1; byte <<= 1; case 5: *out++ = (byte >> 7) & 1; byte <<= 1; case 4: *out++ = (byte >> 7) & 1; byte <<= 1; case 3: *out++ = (byte >> 7) & 1; byte <<= 1; case 2: *out++ = (byte >> 7) & 1; byte <<= 1; case 1: *out++ = (byte >> 7) & 1; } pixels -= 8; } } static void unpackP2(UINT8* out, const UINT8* in, int pixels) { /* bit pairs */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte >> 6) & 3; byte <<= 2; case 3: *out++ = (byte >> 6) & 3; byte <<= 2; case 2: *out++ = (byte >> 6) & 3; byte <<= 2; case 1: *out++ = (byte >> 6) & 3; } pixels -= 4; } } static void unpackP4(UINT8* out, const UINT8* in, int pixels) { /* nibbles */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { default: *out++ = (byte >> 4) & 15; byte <<= 4; case 1: *out++ = (byte >> 4) & 15; } pixels -= 2; } } static void unpackP2L(UINT8* out, const UINT8* in, int pixels) { int i, j, m, s; /* bit layers */ m = 128; s = (pixels+7)/8; for (i = j = 0; i < pixels; i++) { out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0); if ((m >>= 1) == 0) { m = 128; j++; } } } static void unpackP4L(UINT8* out, const UINT8* in, int pixels) { int i, j, m, s; /* bit layers (trust the optimizer ;-) */ m = 128; s = (pixels+7)/8; for (i = j = 0; i < pixels; i++) { out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0) + ((in[j + 2*s] & m) ? 4 : 0) + ((in[j + 3*s] & m) ? 8 : 0); if ((m >>= 1) == 0) { m = 128; j++; } } } /* Unpack to "RGB" image */ void ImagingUnpackRGB(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB triplets */ for (i = 0; i < pixels; i++) { out[R] = in[0]; out[G] = in[1]; out[B] = in[2]; out[A] = 255; out += 4; in += 3; } } void unpackRGB16B(UINT8* out, const UINT8* in, int pixels) { int i; /* 16-bit RGB triplets, big-endian order */ for (i = 0; i < pixels; i++) { out[R] = in[0]; out[G] = in[2]; out[B] = in[4]; out[A] = 255; out += 4; in += 6; } } static void unpackRGBL(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, line interleaved */ for (i = 0; i < pixels; i++) { out[R] = in[i]; out[G] = in[i+pixels]; out[B] = in[i+pixels+pixels]; out[A] = 255; out += 4; } } static void unpackRGBR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, bit reversed */ for (i = 0; i < pixels; i++) { out[R] = BITFLIP[in[0]]; out[G] = BITFLIP[in[1]]; out[B] = BITFLIP[in[2]]; out[A] = 255; out += 4; in += 3; } } void ImagingUnpackBGR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, reversed bytes */ for (i = 0; i < pixels; i++) { out[R] = in[2]; out[G] = in[1]; out[B] = in[0]; out[A] = 255; out += 4; in += 3; } } void ImagingUnpackRGB15(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, 5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 31) * 255 / 31; out[B] = ((pixel>>10) & 31) * 255 / 31; out[A] = 255; out += 4; in += 2; } } void ImagingUnpackRGBA15(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, 5/5/5/1 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 31) * 255 / 31; out[B] = ((pixel>>10) & 31) * 255 / 31; out[A] = (pixel>>15) * 255; out += 4; in += 2; } } void ImagingUnpackBGR15(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 31) * 255 / 31; out[R] = ((pixel>>10) & 31) * 255 / 31; out[A] = 255; out += 4; in += 2; } } void ImagingUnpackBGRA15(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5/5/5/1 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 31) * 255 / 31; out[R] = ((pixel>>10) & 31) * 255 / 31; out[A] = (pixel>>15) * 255; out += 4; in += 2; } } void ImagingUnpackRGB16(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, 5/6/5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 63) * 255 / 63; out[B] = ((pixel>>11) & 31) * 255 / 31; out[A] = 255; out += 4; in += 2; } } void ImagingUnpackBGR16(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5/6/5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; out[G] = ((pixel>>5) & 63) * 255 / 63; out[R] = ((pixel>>11) & 31) * 255 / 31; out[A] = 255; out += 4; in += 2; } } void ImagingUnpackRGB4B(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGB, 4 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 15) * 17; out[G] = ((pixel>>4) & 15) * 17; out[B] = ((pixel>>8) & 15) * 17; out[A] = 255; out += 4; in += 2; } } void ImagingUnpackRGBA4B(UINT8* out, const UINT8* in, int pixels) { int i, pixel; /* RGBA, 4 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 15) * 17; out[G] = ((pixel>>4) & 15) * 17; out[B] = ((pixel>>8) & 15) * 17; out[A] = ((pixel>>12) & 15) * 17; out += 4; in += 2; } } static void ImagingUnpackBGRX(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, reversed bytes with padding */ for (i = 0; i < pixels; i++) { out[R] = in[2]; out[G] = in[1]; out[B] = in[0]; out[A] = 255; out += 4; in += 4; } } static void ImagingUnpackXRGB(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, leading pad */ for (i = 0; i < pixels; i++) { out[R] = in[1]; out[G] = in[2]; out[B] = in[3]; out[A] = 255; out += 4; in += 4; } } static void ImagingUnpackXBGR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGB, reversed bytes, leading pad */ for (i = 0; i < pixels; i++) { out[R] = in[3]; out[G] = in[2]; out[B] = in[1]; out[A] = 255; out += 4; in += 4; } } /* Unpack to "RGBA" image */ static void unpackRGBALA(UINT8* out, const UINT8* in, int pixels) { int i; /* greyscale with alpha */ for (i = 0; i < pixels; i++) { out[R] = out[G] = out[B] = in[0]; out[A] = in[1]; out += 4; in += 2; } } static void unpackRGBALA16B(UINT8* out, const UINT8* in, int pixels) { int i; /* 16-bit greyscale with alpha, big-endian */ for (i = 0; i < pixels; i++) { out[R] = out[G] = out[B] = in[0]; out[A] = in[2]; out += 4; in += 4; } } static void unpackRGBa(UINT8* out, const UINT8* in, int pixels) { int i; /* premultiplied RGBA */ for (i = 0; i < pixels; i++) { int a = in[3]; if (!a) out[R] = out[G] = out[B] = out[A] = 0; else { out[R] = CLIP(in[0] * 255 / a); out[G] = CLIP(in[1] * 255 / a); out[B] = CLIP(in[2] * 255 / a); out[A] = a; } out += 4; in += 4; } } static void unpackRGBAI(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBA, inverted RGB bytes (FlashPix) */ for (i = 0; i < pixels; i++) { out[R] = ~in[0]; out[G] = ~in[1]; out[B] = ~in[2]; out[A] = in[3]; out += 4; in += 4; } } static void unpackRGBAL(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBA, line interleaved */ for (i = 0; i < pixels; i++) { out[R] = in[i]; out[G] = in[i+pixels]; out[B] = in[i+pixels+pixels]; out[A] = in[i+pixels+pixels+pixels]; out += 4; } } void unpackRGBA16B(UINT8* out, const UINT8* in, int pixels) { int i; /* 16-bit RGBA, big-endian order */ for (i = 0; i < pixels; i++) { out[R] = in[0]; out[G] = in[2]; out[B] = in[4]; out[A] = in[6]; out += 4; in += 8; } } static void unpackARGB(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBA, leading pad */ for (i = 0; i < pixels; i++) { out[R] = in[1]; out[G] = in[2]; out[B] = in[3]; out[A] = in[0]; out += 4; in += 4; } } static void unpackABGR(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBA, reversed bytes */ for (i = 0; i < pixels; i++) { out[R] = in[3]; out[G] = in[2]; out[B] = in[1]; out[A] = in[0]; out += 4; in += 4; } } static void unpackBGRA(UINT8* out, const UINT8* in, int pixels) { int i; /* RGBA, reversed bytes */ for (i = 0; i < pixels; i++) { out[R] = in[2]; out[G] = in[1]; out[B] = in[0]; out[A] = in[3]; out += 4; in += 4; } } /* Unpack to "CMYK" image */ static void unpackCMYKI(UINT8* out, const UINT8* in, int pixels) { int i; /* CMYK, inverted bytes (Photoshop 2.5) */ for (i = 0; i < pixels; i++) { out[C] = ~in[0]; out[M] = ~in[1]; out[Y] = ~in[2]; out[K] = ~in[3]; out += 4; in += 4; } } /* Unpack to "LAB" image */ /* There are two representations of LAB images for whatever precision: L: Uint (in PS, it's 0-100) A: Int (in ps, -128 .. 128, or elsewhere 0..255, with 128 as middle. Channels in PS display a 0 value as middle grey, LCMS appears to use 128 as the 0 value for these channels) B: Int (as above) Since we don't have any signed ints, we're going with the shifted versions internally, and we'll unshift for saving and whatnot. */ void ImagingUnpackLAB(UINT8* out, const UINT8* in, int pixels) { int i; /* LAB triplets */ for (i = 0; i < pixels; i++) { out[0] = in[0]; out[1] = in[1] ^ 128; /* signed in outside world */ out[2] = in[2] ^ 128; out[3] = 255; out += 4; in += 3; } } static void unpackI16N_I16B(UINT8* out, const UINT8* in, int pixels){ int i; UINT8* tmp = (UINT8*) out; for (i = 0; i < pixels; i++) { C16B; in += 2; tmp += 2; } } static void unpackI16N_I16(UINT8* out, const UINT8* in, int pixels){ int i; UINT8* tmp = (UINT8*) out; for (i = 0; i < pixels; i++) { C16L; in += 2; tmp += 2; } } static void unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ /* Fillorder 1/MSB -> LittleEndian, for 12bit integer greyscale tiffs. According to the TIFF spec: FillOrder = 2 should be used only when BitsPerSample = 1 and the data is either uncompressed or compressed using CCITT 1D or 2D compression, to avoid potentially ambigous situations. Yeah. I thought so. We'll see how well people read the spec. We've got several fillorder=2 modes in TiffImagePlugin.py There's no spec I can find. It appears that the in storage layout is: 00 80 00 ... -> (128 , 0 ...). The samples are stored in a single big bitian 12bit block, but need to be pulled out to little endian format to be stored in a 2 byte int. */ int i; UINT16 pixel; #ifdef WORDS_BIGENDIAN UINT8* tmp = (UINT8 *)&pixel; #endif UINT16* out16 = (UINT16 *)out; for (i = 0; i < pixels-1; i+=2) { pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); #ifdef WORDS_BIGENDIAN out[0] = tmp[1]; out[1] = tmp[0]; #else out16[0] = pixel; #endif pixel = (((UINT16) (in[1] & 0x0F)) << 8) + in[2]; #ifdef WORDS_BIGENDIAN out[2] = tmp[1]; out[3] = tmp[0]; #else out16[1] = pixel; #endif in += 3; out16 += 2; out+=4; } if (i == pixels-1) { pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); #ifdef WORDS_BIGENDIAN out[0] = tmp[1]; out[1] = tmp[0]; #else out16[0] = pixel; #endif } } static void copy1(UINT8* out, const UINT8* in, int pixels) { /* L, P */ memcpy(out, in, pixels); } static void copy2(UINT8* out, const UINT8* in, int pixels) { /* I;16 */ memcpy(out, in, pixels*2); } static void copy3(UINT8* out, const UINT8* in, int pixels) { /* LAB triples, 24bit */ memcpy(out, in, 3 * pixels); } static void copy4(UINT8* out, const UINT8* in, int pixels) { /* RGBA, CMYK quadruples */ memcpy(out, in, 4 * pixels); } /* Unpack to "I" and "F" images */ #define UNPACK_RAW(NAME, GET, INTYPE, OUTTYPE)\ static void NAME(UINT8* out_, const UINT8* in, int pixels)\ {\ int i;\ OUTTYPE* out = (OUTTYPE*) out_;\ for (i = 0; i < pixels; i++, in += sizeof(INTYPE))\ out[i] = (OUTTYPE) ((INTYPE) GET);\ } #define UNPACK(NAME, COPY, INTYPE, OUTTYPE)\ static void NAME(UINT8* out_, const UINT8* in, int pixels)\ {\ int i;\ OUTTYPE* out = (OUTTYPE*) out_;\ INTYPE tmp_;\ UINT8* tmp = (UINT8*) &tmp_;\ for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) {\ COPY;\ out[i] = (OUTTYPE) tmp_;\ }\ } UNPACK_RAW(unpackI8, in[0], UINT8, INT32) UNPACK_RAW(unpackI8S, in[0], INT8, INT32) UNPACK(unpackI16, C16L, UINT16, INT32) UNPACK(unpackI16S, C16L, INT16, INT32) UNPACK(unpackI16B, C16B, UINT16, INT32) UNPACK(unpackI16BS, C16B, INT16, INT32) UNPACK(unpackI16N, C16N, UINT16, INT32) UNPACK(unpackI16NS, C16N, INT16, INT32) UNPACK(unpackI32, C32L, UINT32, INT32) UNPACK(unpackI32S, C32L, INT32, INT32) UNPACK(unpackI32B, C32B, UINT32, INT32) UNPACK(unpackI32BS, C32B, INT32, INT32) UNPACK(unpackI32N, C32N, UINT32, INT32) UNPACK(unpackI32NS, C32N, INT32, INT32) UNPACK_RAW(unpackF8, in[0], UINT8, FLOAT32) UNPACK_RAW(unpackF8S, in[0], INT8, FLOAT32) UNPACK(unpackF16, C16L, UINT16, FLOAT32) UNPACK(unpackF16S, C16L, INT16, FLOAT32) UNPACK(unpackF16B, C16B, UINT16, FLOAT32) UNPACK(unpackF16BS, C16B, INT16, FLOAT32) UNPACK(unpackF16N, C16N, UINT16, FLOAT32) UNPACK(unpackF16NS, C16N, INT16, FLOAT32) UNPACK(unpackF32, C32L, UINT32, FLOAT32) UNPACK(unpackF32S, C32L, INT32, FLOAT32) UNPACK(unpackF32B, C32B, UINT32, FLOAT32) UNPACK(unpackF32BS, C32B, INT32, FLOAT32) UNPACK(unpackF32N, C32N, UINT32, FLOAT32) UNPACK(unpackF32NS, C32N, INT32, FLOAT32) UNPACK(unpackF32F, C32L, FLOAT32, FLOAT32) UNPACK(unpackF32BF, C32B, FLOAT32, FLOAT32) UNPACK(unpackF32NF, C32N, FLOAT32, FLOAT32) #ifdef FLOAT64 UNPACK(unpackF64F, C64L, FLOAT64, FLOAT32) UNPACK(unpackF64BF, C64B, FLOAT64, FLOAT32) UNPACK(unpackF64NF, C64N, FLOAT64, FLOAT32) #endif /* Misc. unpackers */ static void band0(UINT8* out, const UINT8* in, int pixels) { int i; /* band 0 only */ for (i = 0; i < pixels; i++) { out[0] = in[i]; out += 4; } } static void band1(UINT8* out, const UINT8* in, int pixels) { int i; /* band 1 only */ for (i = 0; i < pixels; i++) { out[1] = in[i]; out += 4; } } static void band2(UINT8* out, const UINT8* in, int pixels) { int i; /* band 2 only */ for (i = 0; i < pixels; i++) { out[2] = in[i]; out += 4; } } static void band3(UINT8* out, const UINT8* in, int pixels) { /* band 3 only */ int i; for (i = 0; i < pixels; i++) { out[3] = in[i]; out += 4; } } static void band0I(UINT8* out, const UINT8* in, int pixels) { int i; /* band 0 only */ for (i = 0; i < pixels; i++) { out[0] = ~in[i]; out += 4; } } static void band1I(UINT8* out, const UINT8* in, int pixels) { int i; /* band 1 only */ for (i = 0; i < pixels; i++) { out[1] = ~in[i]; out += 4; } } static void band2I(UINT8* out, const UINT8* in, int pixels) { int i; /* band 2 only */ for (i = 0; i < pixels; i++) { out[2] = ~in[i]; out += 4; } } static void band3I(UINT8* out, const UINT8* in, int pixels) { /* band 3 only */ int i; for (i = 0; i < pixels; i++) { out[3] = ~in[i]; out += 4; } } static struct { const char* mode; const char* rawmode; int bits; ImagingShuffler unpack; } unpackers[] = { /* raw mode syntax is ";" where "bits" defaults depending on mode (1 for "1", 8 for "P" and "L", etc), and "flags" should be given in alphabetical order. if both bits and flags have their default values, the ; should be left out */ /* flags: "I" inverted data; "R" reversed bit order; "B" big endian byte order (default is little endian); "L" line interleave, "S" signed, "F" floating point */ /* bilevel */ {"1", "1", 1, unpack1}, {"1", "1;I", 1, unpack1I}, {"1", "1;R", 1, unpack1R}, {"1", "1;IR", 1, unpack1IR}, /* greyscale */ {"L", "L;2", 2, unpackL2}, {"L", "L;4", 4, unpackL4}, {"L", "L", 8, copy1}, {"L", "L;I", 8, unpackLI}, {"L", "L;R", 8, unpackLR}, {"L", "L;16", 16, unpackL16}, {"L", "L;16B", 16, unpackL16B}, /* greyscale w. alpha */ {"LA", "LA", 16, unpackLA}, {"LA", "LA;L", 16, unpackLAL}, /* palette */ {"P", "P;1", 1, unpackP1}, {"P", "P;2", 2, unpackP2}, {"P", "P;2L", 2, unpackP2L}, {"P", "P;4", 4, unpackP4}, {"P", "P;4L", 4, unpackP4L}, {"P", "P", 8, copy1}, {"P", "P;R", 8, unpackLR}, /* palette w. alpha */ {"PA", "PA", 16, unpackLA}, {"PA", "PA;L", 16, unpackLAL}, /* true colour */ {"RGB", "RGB", 24, ImagingUnpackRGB}, {"RGB", "RGB;L", 24, unpackRGBL}, {"RGB", "RGB;R", 24, unpackRGBR}, {"RGB", "RGB;16B", 48, unpackRGB16B}, {"RGB", "BGR", 24, ImagingUnpackBGR}, {"RGB", "RGB;15", 16, ImagingUnpackRGB15}, {"RGB", "BGR;15", 16, ImagingUnpackBGR15}, {"RGB", "RGB;16", 16, ImagingUnpackRGB16}, {"RGB", "BGR;16", 16, ImagingUnpackBGR16}, {"RGB", "RGB;4B", 16, ImagingUnpackRGB4B}, {"RGB", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ {"RGB", "RGBX", 32, copy4}, {"RGB", "RGBX;L", 32, unpackRGBAL}, {"RGB", "BGRX", 32, ImagingUnpackBGRX}, {"RGB", "XRGB", 24, ImagingUnpackXRGB}, {"RGB", "XBGR", 32, ImagingUnpackXBGR}, {"RGB", "YCC;P", 24, ImagingUnpackYCC}, {"RGB", "R", 8, band0}, {"RGB", "G", 8, band1}, {"RGB", "B", 8, band2}, /* true colour w. alpha */ {"RGBA", "LA", 16, unpackRGBALA}, {"RGBA", "LA;16B", 32, unpackRGBALA16B}, {"RGBA", "RGBA", 32, copy4}, {"RGBA", "RGBa", 32, unpackRGBa}, {"RGBA", "RGBA;I", 32, unpackRGBAI}, {"RGBA", "RGBA;L", 32, unpackRGBAL}, {"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15}, {"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15}, {"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B}, {"RGBA", "RGBA;16B", 64, unpackRGBA16B}, {"RGBA", "BGRA", 32, unpackBGRA}, {"RGBA", "ARGB", 32, unpackARGB}, {"RGBA", "ABGR", 32, unpackABGR}, {"RGBA", "YCCA;P", 32, ImagingUnpackYCCA}, {"RGBA", "R", 8, band0}, {"RGBA", "G", 8, band1}, {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, /* true colour w. padding */ {"RGBX", "RGB", 24, ImagingUnpackRGB}, {"RGBX", "RGB;L", 24, unpackRGBL}, {"RGBX", "RGB;16B", 48, unpackRGB16B}, {"RGBX", "BGR", 24, ImagingUnpackBGR}, {"RGBX", "RGB;15", 16, ImagingUnpackRGB15}, {"RGBX", "BGR;15", 16, ImagingUnpackBGR15}, {"RGBX", "RGB;4B", 16, ImagingUnpackRGB4B}, {"RGBX", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ {"RGBX", "RGBX", 32, copy4}, {"RGBX", "RGBX;L", 32, unpackRGBAL}, {"RGBX", "BGRX", 32, ImagingUnpackBGRX}, {"RGBX", "XRGB", 24, ImagingUnpackXRGB}, {"RGBX", "XBGR", 32, ImagingUnpackXBGR}, {"RGBX", "YCC;P", 24, ImagingUnpackYCC}, {"RGBX", "R", 8, band0}, {"RGBX", "G", 8, band1}, {"RGBX", "B", 8, band2}, {"RGBX", "X", 8, band3}, /* colour separation */ {"CMYK", "CMYK", 32, copy4}, {"CMYK", "CMYK;I", 32, unpackCMYKI}, {"CMYK", "CMYK;L", 32, unpackRGBAL}, {"CMYK", "C", 8, band0}, {"CMYK", "M", 8, band1}, {"CMYK", "Y", 8, band2}, {"CMYK", "K", 8, band3}, {"CMYK", "C;I", 8, band0I}, {"CMYK", "M;I", 8, band1I}, {"CMYK", "Y;I", 8, band2I}, {"CMYK", "K;I", 8, band3I}, /* video (YCbCr) */ {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, {"YCbCr", "YCbCr;L", 24, unpackRGBL}, {"YCbCr", "YCbCrX", 32, copy4}, {"YCbCr", "YCbCrK", 32, copy4}, /* LAB Color */ {"LAB", "LAB", 24, ImagingUnpackLAB}, {"LAB", "L", 8, band0}, {"LAB", "A", 8, band1}, {"LAB", "B", 8, band2}, /* integer variations */ {"I", "I", 32, copy4}, {"I", "I;8", 8, unpackI8}, {"I", "I;8S", 8, unpackI8S}, {"I", "I;16", 16, unpackI16}, {"I", "I;16S", 16, unpackI16S}, {"I", "I;16B", 16, unpackI16B}, {"I", "I;16BS", 16, unpackI16BS}, {"I", "I;16N", 16, unpackI16N}, {"I", "I;16NS", 16, unpackI16NS}, {"I", "I;32", 32, unpackI32}, {"I", "I;32S", 32, unpackI32S}, {"I", "I;32B", 32, unpackI32B}, {"I", "I;32BS", 32, unpackI32BS}, {"I", "I;32N", 32, unpackI32N}, {"I", "I;32NS", 32, unpackI32NS}, /* floating point variations */ {"F", "F", 32, copy4}, {"F", "F;8", 8, unpackF8}, {"F", "F;8S", 8, unpackF8S}, {"F", "F;16", 16, unpackF16}, {"F", "F;16S", 16, unpackF16S}, {"F", "F;16B", 16, unpackF16B}, {"F", "F;16BS", 16, unpackF16BS}, {"F", "F;16N", 16, unpackF16N}, {"F", "F;16NS", 16, unpackF16NS}, {"F", "F;32", 32, unpackF32}, {"F", "F;32S", 32, unpackF32S}, {"F", "F;32B", 32, unpackF32B}, {"F", "F;32BS", 32, unpackF32BS}, {"F", "F;32N", 32, unpackF32N}, {"F", "F;32NS", 32, unpackF32NS}, {"F", "F;32F", 32, unpackF32F}, {"F", "F;32BF", 32, unpackF32BF}, {"F", "F;32NF", 32, unpackF32NF}, #ifdef FLOAT64 {"F", "F;64F", 64, unpackF64F}, {"F", "F;64BF", 64, unpackF64BF}, {"F", "F;64NF", 64, unpackF64NF}, #endif /* storage modes */ {"I;16", "I;16", 16, copy2}, {"I;16B", "I;16B", 16, copy2}, {"I;16L", "I;16L", 16, copy2}, {"I;16", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. {"I;16L", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. {"I;16B", "I;16N", 16, unpackI16N_I16B}, {"I;16", "I;12", 12, unpackI12_I16}, // 12 bit Tiffs stored in 16bits. {NULL} /* sentinel */ }; ImagingShuffler ImagingFindUnpacker(const char* mode, const char* rawmode, int* bits_out) { int i; /* find a suitable pixel unpacker */ for (i = 0; unpackers[i].rawmode; i++) if (strcmp(unpackers[i].mode, mode) == 0 && strcmp(unpackers[i].rawmode, rawmode) == 0) { if (bits_out) *bits_out = unpackers[i].bits; return unpackers[i].unpack; } /* FIXME: configure a general unpacker based on the type codes... */ return NULL; } pillow-2.3.0/libImaging/Bit.h0000644000175000001440000000103512257506326014635 0ustar dokousers/* Bit.h */ typedef struct { /* CONFIGURATION */ /* Number of bits per pixel */ int bits; /* Line padding (0 or 8) */ int pad; /* Fill order */ /* 0=msb/msb, 1=msbfill/lsbshift, 2=lsbfill/msbshift, 3=lsb/lsb */ int fill; /* Signed integers (0=unsigned, 1=signed) */ int sign; /* Lookup table (not implemented) */ unsigned long lutsize; FLOAT32* lut; /* INTERNAL */ unsigned long mask; unsigned long signmask; unsigned long bitbuffer; int bitcount; } BITSTATE; pillow-2.3.0/libImaging/Crop.c0000644000175000001440000000233312257506326015017 0ustar dokousers/* * The Python Imaging Library * $Id$ * * cut region from image * * history: * 95-11-27 fl Created * 98-07-10 fl Fixed "null result" error * 99-02-05 fl Rewritten to use Paste primitive * * Copyright (c) Secret Labs AB 1997-99. * Copyright (c) Fredrik Lundh 1995. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" Imaging ImagingCrop(Imaging imIn, int sx0, int sy0, int sx1, int sy1) { Imaging imOut; int xsize, ysize; int dx0, dy0, dx1, dy1; INT32 zero = 0; if (!imIn) return (Imaging) ImagingError_ModeError(); xsize = sx1 - sx0; if (xsize < 0) xsize = 0; ysize = sy1 - sy0; if (ysize < 0) ysize = 0; imOut = ImagingNew(imIn->mode, xsize, ysize); if (!imOut) return NULL; ImagingCopyInfo(imOut, imIn); if (sx0 < 0 || sy0 < 0 || sx1 > imIn->xsize || sy1 > imIn->ysize) (void) ImagingFill(imOut, &zero); dx0 = -sx0; dy0 = -sy0; dx1 = imIn->xsize - sx0; dy1 = imIn->ysize - sy0; /* paste the source image on top of the output image!!! */ if (ImagingPaste(imOut, imIn, NULL, dx0, dy0, dx1, dy1) < 0) { ImagingDelete(imOut); return NULL; } return imOut; } pillow-2.3.0/libImaging/ImPlatform.h0000644000175000001440000000332612257506326016176 0ustar dokousers/* * The Python Imaging Library * $Id$ * * platform declarations for the imaging core library * * Copyright (c) Fredrik Lundh 1995-2003. */ #include "Python.h" /* Check that we have an ANSI compliant compiler */ #ifndef HAVE_PROTOTYPES #error Sorry, this library requires support for ANSI prototypes. #endif #ifndef STDC_HEADERS #error Sorry, this library requires ANSI header files. #endif #if defined(_MSC_VER) #ifndef WIN32 #define WIN32 #endif /* VC++ 4.0 is a bit annoying when it comes to precision issues (like claiming that "float a = 0.0;" would lead to loss of precision). I don't like to see warnings from my code, but since I still want to keep it readable, I simply switch off a few warnings instead of adding the tons of casts that VC++ seem to require. This code is compiled with numerous other compilers as well, so any real errors are likely to be catched anyway. */ #pragma warning(disable: 4244) /* conversion from 'float' to 'int' */ #endif #if defined(_MSC_VER) #define inline __inline #elif !defined(USE_INLINE) #define inline #endif #if SIZEOF_SHORT == 2 #define INT16 short #elif SIZEOF_INT == 2 #define INT16 int #else #define INT16 short /* most things works just fine anyway... */ #endif #if SIZEOF_SHORT == 4 #define INT32 short #elif SIZEOF_INT == 4 #define INT32 int #elif SIZEOF_LONG == 4 #define INT32 long #else #error Cannot find required 32-bit integer type #endif #if SIZEOF_LONG == 8 #define INT64 long #elif SIZEOF_LONG_LONG == 8 #define INT64 long #endif /* assume IEEE; tweak if necessary (patches are welcome) */ #define FLOAT32 float #define FLOAT64 double #define INT8 signed char #define UINT8 unsigned char #define UINT16 unsigned INT16 #define UINT32 unsigned INT32 pillow-2.3.0/libImaging/LzwDecode.c0000644000175000001440000001175612257506326016005 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * a fast, suspendable TIFF LZW decoder * * description: * This code is based on the GIF decoder. There are some * subtle differences between GIF and TIFF LZW, though: * - The fill order is different. In the TIFF file, you * must shift new bits in to the right, not to the left. * - There is no blocking in the input data stream. * - The code size is increased one step earlier than * for GIF * - Image data are seen as a byte stream, not a pixel * stream. This means that the code size will always * start at 9 bits. * * history: * 95-09-13 fl Created (derived from GifDecode.c) * 96-03-28 fl Revised API, integrated with PIL * 97-01-05 fl Added filter support, added extra consistency checks * * Copyright (c) Fredrik Lundh 1995-97. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include #include /* memcpy() */ #include "Lzw.h" int ImagingLzwDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { UINT8* p; int c, i; int thiscode; LZWSTATE* context = (LZWSTATE*) state->context; unsigned char *ptr = buf; if (!state->state) { /* Clear code */ context->clear = 1 << 8; /* End code */ context->end = context->clear + 1; state->state = 1; } for (;;) { if (state->state == 1) { /* First free entry in table */ context->next = context->clear + 2; /* Initial code size */ context->codesize = 8 + 1; context->codemask = (1 << context->codesize) - 1; /* Buffer pointer. We fill the buffer from right, which allows us to return all of it in one operation. */ context->bufferindex = LZWBUFFER; state->state = 2; } if (context->bufferindex < LZWBUFFER) { /* Return whole buffer in one chunk */ i = LZWBUFFER - context->bufferindex; p = &context->buffer[context->bufferindex]; context->bufferindex = LZWBUFFER; } else { /* Get current symbol */ while (context->bitcount < context->codesize) { if (bytes < 1) return ptr - buf;; /* Read next byte */ c = *ptr++; bytes--; /* New bits are shifted in from from the right. */ context->bitbuffer = (context->bitbuffer << 8) | c; context->bitcount += 8; } /* Extract current symbol from bit buffer. */ c = (context->bitbuffer >> (context->bitcount - context->codesize)) & context->codemask; /* Adjust buffer */ context->bitcount -= context->codesize; /* If c is less than clear, it's a data byte. Otherwise, it's either clear/end or a code symbol which should be expanded. */ if (c == context->clear) { if (state->state != 2) state->state = 1; continue; } if (c == context->end) break; i = 1; p = &context->lastdata; if (state->state == 2) { /* First valid symbol after clear; use as is */ if (c > context->clear) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->lastdata = context->lastcode = c; state->state = 3; } else { thiscode = c; if (c > context->next) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } if (c == context->next) { /* c == next is allowed, by some strange reason */ if (context->bufferindex <= 0) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->buffer[--context->bufferindex] = context->lastdata; c = context->lastcode; } while (c >= context->clear) { /* Copy data string to buffer (beginning from right) */ if (context->bufferindex <= 0 || c >= LZWTABLE) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } context->buffer[--context->bufferindex] = context->data[c]; c = context->link[c]; } context->lastdata = c; if (context->next < LZWTABLE) { /* While we still have room for it, add this symbol to the table. */ context->data[context->next] = c; context->link[context->next] = context->lastcode; context->next++; if (context->next == context->codemask && context->codesize < LZWBITS) { /* Expand code size */ context->codesize++; context->codemask = (1 << context->codesize) - 1; } } context->lastcode = thiscode; } } /* Update the output image */ for (c = 0; c < i; c++) { state->buffer[state->x] = p[c]; if (++state->x >= state->bytes) { int x, bpp; /* Apply filter */ switch (context->filter) { case 2: /* Horizontal differing ("prior") */ bpp = (state->bits + 7) / 8; for (x = bpp; x < state->bytes; x++) state->buffer[x] += state->buffer[x-bpp]; } /* Got a full line, unpack it */ state->shuffle((UINT8*) im->image[state->y + state->yoff] + state->xoff * im->pixelsize, state->buffer, state->xsize); state->x = 0; if (++state->y >= state->ysize) /* End of file (errcode = 0) */ return -1; } } } return ptr - buf; } pillow-2.3.0/libImaging/BitDecode.c0000644000175000001440000000745512257506326015750 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * decoder for packed bitfields (converts to floating point) * * history: * 97-05-31 fl created (much more than originally intended) * * Copyright (c) Fredrik Lundh 1997. * Copyright (c) Secret Labs AB 1997. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" #include "Bit.h" int ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { BITSTATE* bitstate = state->context; UINT8* ptr; if (state->state == 0) { /* Initialize context variables */ /* this decoder only works for float32 image buffers */ if (im->type != IMAGING_TYPE_FLOAT32) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } /* sanity check */ if (bitstate->bits < 1 || bitstate->bits >= 32) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } bitstate->mask = (1<bits)-1; if (bitstate->sign) bitstate->signmask = (1<<(bitstate->bits-1)); /* check image orientation */ if (state->ystep < 0) { state->y = state->ysize-1; state->ystep = -1; } else state->ystep = 1; state->state = 1; } ptr = buf; while (bytes > 0) { UINT8 byte = *ptr; ptr++; bytes--; /* get a byte from the input stream and insert in the bit buffer */ if (bitstate->fill&1) /* fill MSB first */ bitstate->bitbuffer |= (unsigned long) byte << bitstate->bitcount; else /* fill LSB first */ bitstate->bitbuffer = (bitstate->bitbuffer << 8) | byte; bitstate->bitcount += 8; while (bitstate->bitcount >= bitstate->bits) { /* get a pixel from the bit buffer */ unsigned long data; FLOAT32 pixel; if (bitstate->fill&2) { /* store LSB first */ data = bitstate->bitbuffer & bitstate->mask; if (bitstate->bitcount > 32) /* bitbuffer overflow; restore it from last input byte */ bitstate->bitbuffer = byte >> (8 - (bitstate->bitcount - bitstate->bits)); else bitstate->bitbuffer >>= bitstate->bits; } else /* store MSB first */ data = (bitstate->bitbuffer >> (bitstate->bitcount - bitstate->bits)) & bitstate->mask; bitstate->bitcount -= bitstate->bits; if (bitstate->lutsize > 0) { /* map through lookup table */ if (data <= 0) pixel = bitstate->lut[0]; else if (data >= bitstate->lutsize) pixel = bitstate->lut[bitstate->lutsize-1]; else pixel = bitstate->lut[data]; } else { /* convert */ if (data & bitstate->signmask) /* image memory contains signed data */ pixel = (FLOAT32) (INT32) (data | ~bitstate->mask); else pixel = (FLOAT32) data; } *(FLOAT32*)(&im->image32[state->y][state->x]) = pixel; /* step forward */ if (++state->x >= state->xsize) { /* new line */ state->y += state->ystep; if (state->y < 0 || state->y >= state->ysize) { /* end of file (errcode = 0) */ return -1; } state->x = 0; /* reset bit buffer */ if (bitstate->pad > 0) bitstate->bitcount = 0; } } } return ptr - buf; } pillow-2.3.0/libImaging/UnsharpMask.c0000644000175000001440000002711412257506326016354 0ustar dokousers/* PILusm, a gaussian blur and unsharp masking library for PIL By Kevin Cazabon, copyright 2003 kevin_cazabon@hotmail.com kevin@cazabon.com */ /* Originally released under LGPL. Graciously donated to PIL for distribution under the standard PIL license in 2009." */ #include "Python.h" #include "Imaging.h" #define PILUSMVERSION "0.6.1" /* version history 0.6.1 converted to C and added to PIL 1.1.7 0.6.0 fixed/improved float radius support (oops!) now that radius can be a float (properly), changed radius value to be an actual radius (instead of diameter). So, you should get similar results from PIL_usm as from other paint programs when using the SAME values (no doubling of radius required any more). Be careful, this may "break" software if you had it set for 2x or 5x the radius as was recommended with earlier versions. made PILusm thread-friendly (release GIL before lengthly operations, and re-acquire it before returning to Python). This makes a huge difference with multi-threaded applications on dual-processor or "Hyperthreading"-enabled systems (Pentium4, Xeon, etc.) 0.5.0 added support for float radius values! 0.4.0 tweaked gaussian curve calculation to be closer to consistent shape across a wide range of radius values 0.3.0 changed deviation calculation in gausian algorithm to be dynamic _gblur now adds 1 to the user-supplied radius before using it so that a value of "0" returns the original image instead of a black one. fixed handling of alpha channel in RGBX, RGBA images improved speed of gblur by reducing unnecessary checks and assignments 0.2.0 fixed L-mode image support 0.1.0 initial release */ static inline UINT8 clip(double in) { if (in >= 255.0) return (UINT8) 255; if (in <= 0.0) return (UINT8) 0; return (UINT8) in; } static Imaging gblur(Imaging im, Imaging imOut, float floatRadius, int channels, int padding) { ImagingSectionCookie cookie; float *maskData = NULL; int y = 0; int x = 0; float z = 0; float sum = 0.0; float dev = 0.0; float *buffer = NULL; int *line = NULL; UINT8 *line8 = NULL; int pix = 0; float newPixel[4]; int channel = 0; int offset = 0; INT32 newPixelFinals; int radius = 0; float remainder = 0.0; int i; /* Do the gaussian blur */ /* For a symmetrical gaussian blur, instead of doing a radius*radius matrix lookup, you get the EXACT same results by doing a radius*1 transform, followed by a 1*radius transform. This reduces the number of lookups exponentially (10 lookups per pixel for a radius of 5 instead of 25 lookups). So, we blur the lines first, then we blur the resulting columns. */ /* first, round radius off to the next higher integer and hold the remainder this is used so we can support float radius values properly. */ remainder = floatRadius - ((int) floatRadius); floatRadius = ceil(floatRadius); /* Next, double the radius and offset by 2.0... that way "0" returns the original image instead of a black one. We multiply it by 2.0 so that it is a true "radius", not a diameter (the results match other paint programs closer that way too). */ radius = (int) ((floatRadius * 2.0) + 2.0); /* create the maskData for the gaussian curve */ maskData = malloc(radius * sizeof(float)); /* FIXME: error checking */ for (x = 0; x < radius; x++) { z = ((float) (x + 2) / ((float) radius)); dev = 0.5 + (((float) (radius * radius)) * 0.001); /* you can adjust this factor to change the shape/center-weighting of the gaussian */ maskData[x] = (float) pow((1.0 / sqrt(2.0 * 3.14159265359 * dev)), ((-(z - 1.0) * -(x - 1.0)) / (2.0 * dev))); } /* if there's any remainder, multiply the first/last values in MaskData it. this allows us to support float radius values. */ if (remainder > 0.0) { maskData[0] *= remainder; maskData[radius - 1] *= remainder; } for (x = 0; x < radius; x++) { /* this is done separately now due to the correction for float radius values above */ sum += maskData[x]; } for (i = 0; i < radius; i++) { maskData[i] *= (1.0 / sum); /* printf("%f\n", maskData[i]); */ } /* create a temporary memory buffer for the data for the first pass memset the buffer to 0 so we can use it directly with += */ /* don't bother about alpha/padding */ buffer = calloc((size_t) (im->xsize * im->ysize * channels), sizeof(float)); if (buffer == NULL) return ImagingError_MemoryError(); /* be nice to other threads while you go off to lala land */ ImagingSectionEnter(&cookie); /* memset(buffer, 0, sizeof(buffer)); */ newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* perform a blur on each line, and place in the temporary storage buffer */ for (y = 0; y < im->ysize; y++) { if (channels == 1 && im->image8 != NULL) { line8 = (UINT8 *) im->image8[y]; } else { line = im->image32[y]; } for (x = 0; x < im->xsize; x++) { newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ for (pix = 0; pix < radius; pix++) { /* figure the offset of this neighbor pixel */ offset = (int) ((-((float) radius / 2.0) + (float) pix) + 0.5); if (x + offset < 0) offset = -x; else if (x + offset >= im->xsize) offset = im->xsize - x - 1; /* add (neighbor pixel value * maskData[pix]) to the current pixel value */ if (channels == 1) { buffer[(y * im->xsize) + x] += ((float) ((UINT8 *) & line8[x + offset])[0]) * (maskData[pix]); } else { for (channel = 0; channel < channels; channel++) { buffer[(y * im->xsize * channels) + (x * channels) + channel] += ((float) ((UINT8 *) & line[x + offset]) [channel]) * (maskData[pix]); } } } } } /* perform a blur on each column in the buffer, and place in the output image */ for (x = 0; x < im->xsize; x++) { for (y = 0; y < im->ysize; y++) { newPixel[0] = newPixel[1] = newPixel[2] = newPixel[3] = 0; /* for each neighbor pixel, factor in its value/weighting to the current pixel */ for (pix = 0; pix < radius; pix++) { /* figure the offset of this neighbor pixel */ offset = (int) (-((float) radius / 2.0) + (float) pix + 0.5); if (y + offset < 0) offset = -y; else if (y + offset >= im->ysize) offset = im->ysize - y - 1; /* add (neighbor pixel value * maskData[pix]) to the current pixel value */ for (channel = 0; channel < channels; channel++) { newPixel[channel] += (buffer [((y + offset) * im->xsize * channels) + (x * channels) + channel]) * (maskData[pix]); } } /* if the image is RGBX or RGBA, copy the 4th channel data to newPixel, so it gets put in imOut */ if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { newPixel[3] = (float) ((UINT8 *) & line[x + offset])[3]; } /* pack the channels into an INT32 so we can put them back in the PIL image */ newPixelFinals = 0; if (channels == 1) { newPixelFinals = clip(newPixel[0]); } else { /* for RGB, the fourth channel isn't used anyways, so just pack a 0 in there, this saves checking the mode for each pixel. */ /* this doesn't work on little-endian machines... fix it! */ newPixelFinals = clip(newPixel[0]) | clip(newPixel[1]) << 8 | clip(newPixel[2]) << 16 | clip(newPixel[3]) << 24; } /* set the resulting pixel in imOut */ if (channels == 1) { imOut->image8[y][x] = (UINT8) newPixelFinals; } else { imOut->image32[y][x] = newPixelFinals; } } } /* free the buffer */ free(buffer); /* get the GIL back so Python knows who you are */ ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) { int channels = 0; int padding = 0; if (strcmp(im->mode, "RGB") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { channels = 4; padding = 0; } else if (strcmp(im->mode, "L") == 0) { channels = 1; padding = 0; } else return ImagingError_ModeError(); return gblur(im, imOut, radius, channels, padding); } Imaging ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, int threshold) { ImagingSectionCookie cookie; Imaging result; int channel = 0; int channels = 0; int padding = 0; int x = 0; int y = 0; int *lineIn = NULL; int *lineOut = NULL; UINT8 *lineIn8 = NULL; UINT8 *lineOut8 = NULL; int diff = 0; INT32 newPixel = 0; if (strcmp(im->mode, "RGB") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "RGBA") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "RGBX") == 0) { channels = 3; padding = 1; } else if (strcmp(im->mode, "CMYK") == 0) { channels = 4; padding = 0; } else if (strcmp(im->mode, "L") == 0) { channels = 1; padding = 0; } else return ImagingError_ModeError(); /* first, do a gaussian blur on the image, putting results in imOut temporarily */ result = gblur(im, imOut, radius, channels, padding); if (!result) return NULL; /* now, go through each pixel, compare "normal" pixel to blurred pixel. if the difference is more than threshold values, apply the OPPOSITE correction to the amount of blur, multiplied by percent. */ ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { if (channels == 1) { lineIn8 = im->image8[y]; lineOut8 = imOut->image8[y]; } else { lineIn = im->image32[y]; lineOut = imOut->image32[y]; } for (x = 0; x < im->xsize; x++) { newPixel = 0; /* compare in/out pixels, apply sharpening */ if (channels == 1) { diff = ((UINT8 *) & lineIn8[x])[0] - ((UINT8 *) & lineOut8[x])[0]; if (abs(diff) > threshold) { /* add the diff*percent to the original pixel */ imOut->image8[y][x] = clip((((UINT8 *) & lineIn8[x])[0]) + (diff * ((float) percent) / 100.0)); } else { /* newPixel is the same as imIn */ imOut->image8[y][x] = ((UINT8 *) & lineIn8[x])[0]; } } else { for (channel = 0; channel < channels; channel++) { diff = (int) ((((UINT8 *) & lineIn[x])[channel]) - (((UINT8 *) & lineOut[x])[channel])); if (abs(diff) > threshold) { /* add the diff*percent to the original pixel this may not work for little-endian systems, fix it! */ newPixel = newPixel | clip((float) (((UINT8 *) & lineIn[x])[channel]) + (diff * (((float) percent / 100.0)))) << (channel * 8); } else { /* newPixel is the same as imIn this may not work for little-endian systems, fix it! */ newPixel = newPixel | ((UINT8 *) & lineIn[x])[channel] << (channel * 8); } } if (strcmp(im->mode, "RGBX") == 0 || strcmp(im->mode, "RGBA") == 0) { /* preserve the alpha channel this may not work for little-endian systems, fix it! */ newPixel = newPixel | ((UINT8 *) & lineIn[x])[channel] << 24; } imOut->image32[y][x] = newPixel; } } } ImagingSectionLeave(&cookie); return imOut; } pillow-2.3.0/libImaging/Except.c0000644000175000001440000000267612257506326015356 0ustar dokousers/* * The Python Imaging Library * $Id$ * * default exception handling * * This module is usually overridden by application code (e.g. * _imaging.c for PIL's standard Python bindings). If you get * linking errors, remove this file from your project/library. * * history: * 1995-06-15 fl Created * 1998-12-29 fl Minor tweaks * 2003-09-13 fl Added ImagingEnter/LeaveSection() * * Copyright (c) 1997-2003 by Secret Labs AB. * Copyright (c) 1995-2003 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ #include "Imaging.h" /* exception state */ void * ImagingError_IOError(void) { fprintf(stderr, "*** exception: file access error\n"); return NULL; } void * ImagingError_MemoryError(void) { fprintf(stderr, "*** exception: out of memory\n"); return NULL; } void * ImagingError_ModeError(void) { return ImagingError_ValueError("bad image mode"); return NULL; } void * ImagingError_Mismatch(void) { return ImagingError_ValueError("images don't match"); return NULL; } void * ImagingError_ValueError(const char *message) { if (!message) message = "exception: bad argument to function"; fprintf(stderr, "*** %s\n", message); return NULL; } void ImagingError_Clear(void) { /* nop */; } /* thread state */ void ImagingSectionEnter(ImagingSectionCookie* cookie) { /* pass */ } void ImagingSectionLeave(ImagingSectionCookie* cookie) { /* pass */ } pillow-2.3.0/libImaging/Convert.c0000644000175000001440000007420712257511054015537 0ustar dokousers/* * The Python Imaging Library * $Id$ * * convert images * * history: * 1995-06-15 fl created * 1995-11-28 fl added some "RGBA" and "CMYK" conversions * 1996-04-22 fl added "1" conversions (same as "L") * 1996-05-05 fl added palette conversions (hack) * 1996-07-23 fl fixed "1" conversions to zero/non-zero convention * 1996-11-01 fl fixed "P" to "L" and "RGB" to "1" conversions * 1996-12-29 fl set alpha byte in RGB converters * 1997-05-12 fl added ImagingConvert2 * 1997-05-30 fl added floating point support * 1997-08-27 fl added "P" to "1" and "P" to "F" conversions * 1998-01-11 fl added integer support * 1998-07-01 fl added "YCbCr" support * 1998-07-02 fl added "RGBX" conversions (sort of) * 1998-07-04 fl added floyd-steinberg dithering * 1998-07-12 fl changed "YCrCb" to "YCbCr" (!) * 1998-12-29 fl added basic "I;16" and "I;16B" conversions * 1999-02-03 fl added "RGBa", and "BGR" conversions (experimental) * 2003-09-26 fl added "LA" and "PA" conversions (experimental) * 2005-05-05 fl fixed "P" to "1" threshold * 2005-12-08 fl fixed palette memory leak in topalette * * Copyright (c) 1997-2005 by Secret Labs AB. * Copyright (c) 1995-1997 by Fredrik Lundh. * * See the README file for details on usage and redistribution. */ #include "Imaging.h" #define CLIP(v) ((v) <= 0 ? 0 : (v) >= 255 ? 255 : (v)) #define CLIP16(v) ((v) <= -32768 ? -32768 : (v) >= 32767 ? 32767 : (v)) /* like (a * b + 127) / 255), but much faster on most platforms */ #define MULDIV255(a, b, tmp)\ (tmp = (a) * (b) + 128, ((((tmp) >> 8) + (tmp)) >> 8)) /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ #define L(rgb)\ ((INT32) (rgb)[0]*299 + (INT32) (rgb)[1]*587 + (INT32) (rgb)[2]*114) /* ------------------- */ /* 1 (bit) conversions */ /* ------------------- */ static void bit2l(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) *out++ = (*in++ != 0) ? 255 : 0; } static void bit2rgb(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = (*in++ != 0) ? 255 : 0; *out++ = v; *out++ = v; *out++ = v; *out++ = 255; } } static void bit2cmyk(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = 0; *out++ = 0; *out++ = 0; *out++ = (*in++ != 0) ? 0 : 255; } } static void bit2ycbcr(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = (*in++ != 0) ? 255 : 0; *out++ = 128; *out++ = 128; *out++ = 255; } } /* ----------------- */ /* RGB/L conversions */ /* ----------------- */ static void l2bit(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) *out++ = (*in++ >= 128) ? 255 : 0; } static void l2la(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = *in++; *out++ = v; *out++ = v; *out++ = v; *out++ = 255; } } static void l2rgb(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = *in++; *out++ = v; *out++ = v; *out++ = v; *out++ = 255; } } static void la2l(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) *out++ = in[0]; } static void la2rgb(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { UINT8 v = in[0]; *out++ = v; *out++ = v; *out++ = v; *out++ = in[3]; } } static void rgb2bit(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ *out++ = (L(in) >= 128000) ? 255 : 0; } static void rgb2l(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ *out++ = L(in) / 1000; } static void rgb2la(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ out[0] = out[1] = out[2] = L(in) / 1000; out[3] = 255; } } static void rgb2i(UINT8* out_, const UINT8* in, int xsize) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++, in += 4) *out++ = L(in) / 1000; } static void rgb2f(UINT8* out_, const UINT8* in, int xsize) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++, in += 4) *out++ = (float) L(in) / 1000.0F; } static void rgb2bgr15(UINT8* out_, const UINT8* in, int xsize) { int x; UINT16* out = (UINT16*) out_; for (x = 0; x < xsize; x++, in += 4) *out++ = ((((UINT16)in[0])<<7)&0x7c00) + ((((UINT16)in[1])<<2)&0x03e0) + ((((UINT16)in[2])>>3)&0x001f); } static void rgb2bgr16(UINT8* out_, const UINT8* in, int xsize) { int x; UINT16* out = (UINT16*) out_; for (x = 0; x < xsize; x++, in += 4) *out++ = ((((UINT16)in[0])<<8)&0xf800) + ((((UINT16)in[1])<<3)&0x07e0) + ((((UINT16)in[2])>>3)&0x001f); } static void rgb2bgr24(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = in[2]; *out++ = in[1]; *out++ = in[0]; } } /* ---------------- */ /* RGBA conversions */ /* ---------------- */ static void rgb2rgba(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; *out++ = *in++; *out++ = *in++; *out++ = 255; in++; } } static void rgba2la(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ out[0] = out[1] = out[2] = L(in) / 1000; out[3] = in[3]; } } static void rgba2rgb(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; *out++ = *in++; *out++ = *in++; *out++ = 255; in++; } } static void rgba2rgba(UINT8* out, const UINT8* in, int xsize) { int x; unsigned int alpha, tmp; for (x = 0; x < xsize; x++) { alpha = in[3]; *out++ = MULDIV255(*in++, alpha, tmp); *out++ = MULDIV255(*in++, alpha, tmp); *out++ = MULDIV255(*in++, alpha, tmp); *out++ = *in++; } } /* RGBa -> RGBA conversion to remove premultiplication Needed for correct transforms/resizing on RGBA images */ static void rgba2rgbA(UINT8* out, const UINT8* in, int xsize) { int x; unsigned int alpha; for (x = 0; x < xsize; x++, in+=4) { alpha = in[3]; if (alpha) { *out++ = CLIP((255 * in[0]) / alpha); *out++ = CLIP((255 * in[1]) / alpha); *out++ = CLIP((255 * in[2]) / alpha); } else { *out++ = in[0]; *out++ = in[1]; *out++ = in[2]; } *out++ = in[3]; } } /* * Conversion of RGB + single transparent color to RGBA, * where any pixel that matches the color will have the * alpha channel set to 0 */ static void rgbT2rgba(UINT8* out, int xsize, int r, int g, int b) { #ifdef WORDS_BIGENDIAN UINT32 trns = ((r & 0xff)<<24) | ((g & 0xff)<<16) | ((b & 0xff)<<8) | 0xff; UINT32 repl = trns & 0xffffff00; #else UINT32 trns = (0xff <<24) | ((b & 0xff)<<16) | ((g & 0xff)<<8) | (r & 0xff); UINT32 repl = trns & 0x00ffffff; #endif UINT32* tmp = (UINT32 *)out; int i; for (i=0; i < xsize; i++ ,tmp++) { if (tmp[0]==trns) { tmp[0]=repl; } } } /* ---------------- */ /* CMYK conversions */ /* ---------------- */ static void l2cmyk(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = 0; *out++ = 0; *out++ = 0; *out++ = ~(*in++); } } static void rgb2cmyk(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { /* Note: no undercolour removal */ *out++ = ~(*in++); *out++ = ~(*in++); *out++ = ~(*in++); *out++ = 0; in++; } } static void cmyk2rgb(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = CLIP(255 - (in[0] + in[3])); *out++ = CLIP(255 - (in[1] + in[3])); *out++ = CLIP(255 - (in[2] + in[3])); *out++ = 255; } } /* ------------- */ /* I conversions */ /* ------------- */ static void bit2i(UINT8* out_, const UINT8* in, int xsize) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++) *out++ = (*in++ != 0) ? 255 : 0; } static void l2i(UINT8* out_, const UINT8* in, int xsize) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++) *out++ = (INT32) *in++; } static void i2l(UINT8* out, const UINT8* in_, int xsize) { int x; INT32* in = (INT32*) in_; for (x = 0; x < xsize; x++, in++, out++) { if (*in <= 0) *out = 0; else if (*in >= 255) *out = 255; else *out = (UINT8) *in; } } static void i2f(UINT8* out_, const UINT8* in_, int xsize) { int x; INT32* in = (INT32*) in_; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++) *out++ = (FLOAT32) *in++; } /* ------------- */ /* F conversions */ /* ------------- */ static void bit2f(UINT8* out_, const UINT8* in, int xsize) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++) *out++ = (*in++ != 0) ? 255.0F : 0.0F; } static void l2f(UINT8* out_, const UINT8* in, int xsize) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++) *out++ = (FLOAT32) *in++; } static void f2l(UINT8* out, const UINT8* in_, int xsize) { int x; FLOAT32* in = (FLOAT32*) in_; for (x = 0; x < xsize; x++, in++, out++) { if (*in <= 0.0) *out = 0; else if (*in >= 255.0) *out = 255; else *out = (UINT8) *in; } } static void f2i(UINT8* out_, const UINT8* in_, int xsize) { int x; FLOAT32* in = (FLOAT32*) in_; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++) *out++ = (INT32) *in++; } /* ----------------- */ /* YCbCr conversions */ /* ----------------- */ /* See ConvertYCbCr.c for RGB/YCbCr tables */ static void l2ycbcr(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; *out++ = 128; *out++ = 128; *out++ = 255; } } static void ycbcr2l(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) *out++ = in[0]; } /* ------------------------- */ /* I;16 (16-bit) conversions */ /* ------------------------- */ static void I_I16L(UINT8* out, const UINT8* in_, int xsize) { int x, v; INT32* in = (INT32*) in_; for (x = 0; x < xsize; x++, in++) { v = CLIP16(*in); *out++ = (UINT8) v; *out++ = (UINT8) (v >> 8); } } static void I_I16B(UINT8* out, const UINT8* in_, int xsize) { int x, v; INT32* in = (INT32*) in_; for (x = 0; x < xsize; x++, in++) { v = CLIP16(*in); *out++ = (UINT8) (v >> 8); *out++ = (UINT8) v; } } static void I16L_I(UINT8* out_, const UINT8* in, int xsize) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++, in += 2) *out++ = in[0] + ((int) in[1] << 8); } static void I16B_I(UINT8* out_, const UINT8* in, int xsize) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++, in += 2) *out++ = in[1] + ((int) in[0] << 8); } static void I16L_F(UINT8* out_, const UINT8* in, int xsize) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++, in += 2) *out++ = (FLOAT32) (in[0] + ((int) in[1] << 8)); } static void I16B_F(UINT8* out_, const UINT8* in, int xsize) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++, in += 2) *out++ = (FLOAT32) (in[1] + ((int) in[0] << 8)); } static void L_I16L(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in++) { *out++ = *in; *out++ = 0; } } static void L_I16B(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in++) { *out++ = 0; *out++ = *in; } } static void I16L_L(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2) if (in[1] != 0) *out++ = 255; else *out++ = in[0]; } static void I16B_L(UINT8* out, const UINT8* in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2) if (in[0] != 0) *out++ = 255; else *out++ = in[1]; } static struct { const char* from; const char* to; ImagingShuffler convert; } converters[] = { { "1", "L", bit2l }, { "1", "I", bit2i }, { "1", "F", bit2f }, { "1", "RGB", bit2rgb }, { "1", "RGBA", bit2rgb }, { "1", "RGBX", bit2rgb }, { "1", "CMYK", bit2cmyk }, { "1", "YCbCr", bit2ycbcr }, { "L", "1", l2bit }, { "L", "LA", l2la }, { "L", "I", l2i }, { "L", "F", l2f }, { "L", "RGB", l2rgb }, { "L", "RGBA", l2rgb }, { "L", "RGBX", l2rgb }, { "L", "CMYK", l2cmyk }, { "L", "YCbCr", l2ycbcr }, { "LA", "L", la2l }, { "LA", "RGB", la2rgb }, { "LA", "RGBX", la2rgb }, { "LA", "RGBA", la2rgb }, { "I", "L", i2l }, { "I", "F", i2f }, { "F", "L", f2l }, { "F", "I", f2i }, { "RGB", "1", rgb2bit }, { "RGB", "L", rgb2l }, { "RGB", "LA", rgb2la }, { "RGB", "I", rgb2i }, { "RGB", "F", rgb2f }, { "RGB", "BGR;15", rgb2bgr15 }, { "RGB", "BGR;16", rgb2bgr16 }, { "RGB", "BGR;24", rgb2bgr24 }, { "RGB", "RGBA", rgb2rgba }, { "RGB", "RGBX", rgb2rgba }, { "RGB", "CMYK", rgb2cmyk }, { "RGB", "YCbCr", ImagingConvertRGB2YCbCr }, { "RGBA", "1", rgb2bit }, { "RGBA", "L", rgb2l }, { "RGBA", "LA", rgba2la }, { "RGBA", "I", rgb2i }, { "RGBA", "F", rgb2f }, { "RGBA", "RGB", rgba2rgb }, { "RGBA", "RGBa", rgba2rgba }, { "RGBA", "RGBX", rgb2rgba }, { "RGBA", "CMYK", rgb2cmyk }, { "RGBA", "YCbCr", ImagingConvertRGB2YCbCr }, { "RGBa", "RGBA", rgba2rgbA }, { "RGBX", "1", rgb2bit }, { "RGBX", "L", rgb2l }, { "RGBA", "I", rgb2i }, { "RGBA", "F", rgb2f }, { "RGBX", "RGB", rgba2rgb }, { "RGBX", "CMYK", rgb2cmyk }, { "RGBX", "YCbCr", ImagingConvertRGB2YCbCr }, { "CMYK", "RGB", cmyk2rgb }, { "CMYK", "RGBA", cmyk2rgb }, { "CMYK", "RGBX", cmyk2rgb }, { "YCbCr", "L", ycbcr2l }, { "YCbCr", "RGB", ImagingConvertYCbCr2RGB }, { "I", "I;16", I_I16L }, { "I;16", "I", I16L_I }, { "L", "I;16", L_I16L }, { "I;16", "L", I16L_L }, { "I", "I;16L", I_I16L }, { "I;16L", "I", I16L_I }, { "I", "I;16B", I_I16B }, { "I;16B", "I", I16B_I }, { "L", "I;16L", L_I16L }, { "I;16L", "L", I16L_L }, { "L", "I;16B", L_I16B }, { "I;16B", "L", I16B_L }, { "I;16", "F", I16L_F }, { "I;16L", "F", I16L_F }, { "I;16B", "F", I16B_F }, { NULL } }; /* FIXME: translate indexed versions to pointer versions below this line */ /* ------------------- */ /* Palette conversions */ /* ------------------- */ static void p2bit(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++) *out++ = (L(&palette[in[x]*4]) >= 128000) ? 255 : 0; } static void p2l(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++) *out++ = L(&palette[in[x]*4]) / 1000; } static void pa2la(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++, in += 2) { *out++ = L(&palette[in[0]*4]) / 1000; *out++ = in[1]; } } static void p2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) { int x; INT32* out = (INT32*) out_; for (x = 0; x < xsize; x++) *out++ = L(&palette[in[x]*4]) / 1000; } static void p2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) { int x; FLOAT32* out = (FLOAT32*) out_; for (x = 0; x < xsize; x++) *out++ = (float) L(&palette[in[x]*4]) / 1000.0F; } static void p2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; for (x = 0; x < xsize; x++) { const UINT8* rgb = &palette[*in++ * 4]; *out++ = rgb[0]; *out++ = rgb[1]; *out++ = rgb[2]; *out++ = 255; } } static void p2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; for (x = 0; x < xsize; x++) { const UINT8* rgba = &palette[*in++ * 4]; *out++ = rgba[0]; *out++ = rgba[1]; *out++ = rgba[2]; *out++ = rgba[3]; } } static void pa2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { int x; for (x = 0; x < xsize; x++, in += 4) { const UINT8* rgb = &palette[in[0] * 4]; *out++ = rgb[0]; *out++ = rgb[1]; *out++ = rgb[2]; *out++ = in[3]; } } static void p2cmyk(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { p2rgb(out, in, xsize, palette); rgb2cmyk(out, out, xsize); } static void p2ycbcr(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) { p2rgb(out, in, xsize, palette); ImagingConvertRGB2YCbCr(out, out, xsize); } static Imaging frompalette(Imaging imOut, Imaging imIn, const char *mode) { ImagingSectionCookie cookie; int alpha; int y; void (*convert)(UINT8*, const UINT8*, int, const UINT8*); /* Map palette image to L, RGB, RGBA, or CMYK */ if (!imIn->palette) return (Imaging) ImagingError_ValueError("no palette"); alpha = !strcmp(imIn->mode, "PA"); if (strcmp(mode, "1") == 0) convert = p2bit; else if (strcmp(mode, "L") == 0) convert = p2l; else if (strcmp(mode, "LA") == 0) convert = (alpha) ? pa2la : p2l; else if (strcmp(mode, "I") == 0) convert = p2i; else if (strcmp(mode, "F") == 0) convert = p2f; else if (strcmp(mode, "RGB") == 0) convert = p2rgb; else if (strcmp(mode, "RGBA") == 0) convert = (alpha) ? pa2rgba : p2rgba; else if (strcmp(mode, "RGBX") == 0) convert = p2rgba; else if (strcmp(mode, "CMYK") == 0) convert = p2cmyk; else if (strcmp(mode, "YCbCr") == 0) convert = p2ycbcr; else return (Imaging) ImagingError_ValueError("conversion not supported"); imOut = ImagingNew2(mode, imOut, imIn); if (!imOut) return NULL; ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], imIn->xsize, imIn->palette->palette); ImagingSectionLeave(&cookie); return imOut; } #if defined(_MSC_VER) && (_MSC_VER == 1600) #pragma optimize("", off) #endif static Imaging topalette(Imaging imOut, Imaging imIn, ImagingPalette inpalette, int dither) { ImagingSectionCookie cookie; int x, y; ImagingPalette palette = inpalette;; /* Map L or RGB/RGBX/RGBA to palette image */ if (strcmp(imIn->mode, "L") != 0 && strncmp(imIn->mode, "RGB", 3) != 0) return (Imaging) ImagingError_ValueError("conversion not supported"); if (palette == NULL) { /* FIXME: make user configurable */ if (imIn->bands == 1) palette = ImagingPaletteNew("RGB"); /* Initialised to grey ramp */ else palette = ImagingPaletteNewBrowser(); /* Standard colour cube */ } if (!palette) return (Imaging) ImagingError_ValueError("no palette"); imOut = ImagingNew2("P", imOut, imIn); if (!imOut) { if (palette != inpalette) ImagingPaletteDelete(palette); return NULL; } ImagingPaletteDelete(imOut->palette); imOut->palette = ImagingPaletteDuplicate(palette); if (imIn->bands == 1) { /* greyscale image */ /* Greyscale palette: copy data as is */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) memcpy(imOut->image[y], imIn->image[y], imIn->linesize); ImagingSectionLeave(&cookie); } else { /* colour image */ /* Create mapping cache */ if (ImagingPaletteCachePrepare(palette) < 0) { ImagingDelete(imOut); if (palette != inpalette) ImagingPaletteDelete(palette); return NULL; } if (dither) { /* floyd-steinberg dither */ int* errors; errors = calloc(imIn->xsize + 1, sizeof(int) * 3); if (!errors) { ImagingDelete(imOut); return ImagingError_MemoryError(); } /* Map each pixel to the nearest palette entry */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int r, r0, r1, r2; int g, g0, g1, g2; int b, b0, b1, b2; UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = imOut->image8[y]; int* e = errors; r = r0 = r1 = 0; g = g0 = g1 = 0; b = b0 = b1 = b2 = 0; for (x = 0; x < imIn->xsize; x++, in += 4) { int d2; INT16* cache; r = CLIP(in[0] + (r + e[3+0])/16); g = CLIP(in[1] + (g + e[3+1])/16); b = CLIP(in[2] + (b + e[3+2])/16); /* get closest colour */ cache = &ImagingPaletteCache(palette, r, g, b); if (cache[0] == 0x100) ImagingPaletteCacheUpdate(palette, r, g, b); out[x] = (UINT8) cache[0]; r -= (int) palette->palette[cache[0]*4]; g -= (int) palette->palette[cache[0]*4+1]; b -= (int) palette->palette[cache[0]*4+2]; /* propagate errors (don't ask ;-) */ r2 = r; d2 = r + r; r += d2; e[0] = r + r0; r += d2; r0 = r + r1; r1 = r2; r += d2; g2 = g; d2 = g + g; g += d2; e[1] = g + g0; g += d2; g0 = g + g1; g1 = g2; g += d2; b2 = b; d2 = b + b; b += d2; e[2] = b + b0; b += d2; b0 = b + b1; b1 = b2; b += d2; e += 3; } e[0] = b0; e[1] = b1; e[2] = b2; } ImagingSectionLeave(&cookie); free(errors); } else { /* closest colour */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int r, g, b; UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++, in += 4) { INT16* cache; r = in[0]; g = in[1]; b = in[2]; /* get closest colour */ cache = &ImagingPaletteCache(palette, r, g, b); if (cache[0] == 0x100) ImagingPaletteCacheUpdate(palette, r, g, b); out[x] = (UINT8) cache[0]; } } ImagingSectionLeave(&cookie); } if (inpalette != palette) ImagingPaletteCacheDelete(palette); } if (inpalette != palette) ImagingPaletteDelete(palette); return imOut; } static Imaging tobilevel(Imaging imOut, Imaging imIn, int dither) { ImagingSectionCookie cookie; int x, y; int* errors; /* Map L or RGB to dithered 1 image */ if (strcmp(imIn->mode, "L") != 0 && strcmp(imIn->mode, "RGB") != 0) return (Imaging) ImagingError_ValueError("conversion not supported"); imOut = ImagingNew2("1", imOut, imIn); if (!imOut) return NULL; errors = calloc(imIn->xsize + 1, sizeof(int)); if (!errors) { ImagingDelete(imOut); return ImagingError_MemoryError(); } if (imIn->bands == 1) { /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int l, l0, l1, l2, d2; UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = imOut->image8[y]; l = l0 = l1 = 0; for (x = 0; x < imIn->xsize; x++) { /* pick closest colour */ l = CLIP(in[x] + (l + errors[x+1])/16); out[x] = (l > 128) ? 255 : 0; /* propagate errors */ l -= (int) out[x]; l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; l += d2; l0 = l + l1; l1 = l2; l += d2; } errors[x] = l0; } ImagingSectionLeave(&cookie); } else { /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int l, l0, l1, l2, d2; UINT8* in = (UINT8*) imIn->image[y]; UINT8* out = imOut->image8[y]; l = l0 = l1 = 0; for (x = 0; x < imIn->xsize; x++, in += 4) { /* pick closest colour */ l = CLIP(L(in)/1000 + (l + errors[x+1])/16); out[x] = (l > 128) ? 255 : 0; /* propagate errors */ l -= (int) out[x]; l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; l += d2; l0 = l + l1; l1 = l2; l += d2; } errors[x] = l0; } ImagingSectionLeave(&cookie); } free(errors); return imOut; } #if defined(_MSC_VER) && (_MSC_VER == 1600) #pragma optimize("", on) #endif static Imaging convert(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette palette, int dither) { ImagingSectionCookie cookie; ImagingShuffler convert; int y; if (!imIn) return (Imaging) ImagingError_ModeError(); if (!mode) { /* Map palette image to full depth */ if (!imIn->palette) return (Imaging) ImagingError_ModeError(); mode = imIn->palette->mode; } else /* Same mode? */ if (!strcmp(imIn->mode, mode)) return ImagingCopy2(imOut, imIn); /* test for special conversions */ if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "PA") == 0) return frompalette(imOut, imIn, mode); if (strcmp(mode, "P") == 0) return topalette(imOut, imIn, palette, dither); if (dither && strcmp(mode, "1") == 0) return tobilevel(imOut, imIn, dither); /* standard conversion machinery */ convert = NULL; for (y = 0; converters[y].from; y++) if (!strcmp(imIn->mode, converters[y].from) && !strcmp(mode, converters[y].to)) { convert = converters[y].convert; break; } if (!convert) #ifdef notdef return (Imaging) ImagingError_ValueError("conversion not supported"); #else { static char buf[256]; /* FIXME: may overflow if mode is too large */ sprintf(buf, "conversion from %s to %s not supported", imIn->mode, mode); return (Imaging) ImagingError_ValueError(buf); } #endif imOut = ImagingNew2(mode, imOut, imIn); if (!imOut) return NULL; ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], imIn->xsize); ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingConvert(Imaging imIn, const char *mode, ImagingPalette palette, int dither) { return convert(NULL, imIn, mode, palette, dither); } Imaging ImagingConvert2(Imaging imOut, Imaging imIn) { return convert(imOut, imIn, imOut->mode, NULL, 0); } Imaging ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) { ImagingSectionCookie cookie; ImagingShuffler convert; Imaging imOut = NULL; int y; if (!imIn){ return (Imaging) ImagingError_ModeError(); } if (!((strcmp(imIn->mode, "RGB") == 0 || strcmp(imIn->mode, "L") == 0) && strcmp(mode, "RGBA") == 0)) #ifdef notdef { return (Imaging) ImagingError_ValueError("conversion not supported"); } #else { static char buf[256]; /* FIXME: may overflow if mode is too large */ sprintf(buf, "conversion from %s to %s not supported in convert_transparent", imIn->mode, mode); return (Imaging) ImagingError_ValueError(buf); } #endif if (strcmp(imIn->mode, "RGB") == 0) { convert = rgb2rgba; } else { convert = l2rgb; g = b = r; } imOut = ImagingNew2(mode, imOut, imIn); if (!imOut){ return NULL; } ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], imIn->xsize); rgbT2rgba((UINT8*) imOut->image[y], imIn->xsize, r, g, b); } ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingConvertInPlace(Imaging imIn, const char* mode) { ImagingSectionCookie cookie; ImagingShuffler convert; int y; /* limited support for inplace conversion */ if (strcmp(imIn->mode, "L") == 0 && strcmp(mode, "1") == 0) convert = l2bit; else if (strcmp(imIn->mode, "1") == 0 && strcmp(mode, "L") == 0) convert = bit2l; else return ImagingError_ModeError(); ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) (*convert)((UINT8*) imIn->image[y], (UINT8*) imIn->image[y], imIn->xsize); ImagingSectionLeave(&cookie); return imIn; } pillow-2.3.0/libImaging/Lzw.h0000644000175000001440000000151212257506326014673 0ustar dokousers/* * The Python Imaging Library. * $Id$ * * declarations for the TIFF LZW decoder. * * Copyright (c) Fredrik Lundh 1995-96. */ /* Max size for LZW code words */ #define LZWBITS 12 #define LZWTABLE (1<mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); #define FLIP_HORIZ(image)\ for (y = 0; y < imIn->ysize; y++) {\ xr = imIn->xsize-1;\ for (x = 0; x < imIn->xsize; x++, xr--)\ imOut->image[y][x] = imIn->image[y][xr];\ } ImagingSectionEnter(&cookie); if (imIn->image8) FLIP_HORIZ(image8) else FLIP_HORIZ(image32) ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int y, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); ImagingSectionEnter(&cookie); yr = imIn->ysize-1; for (y = 0; y < imIn->ysize; y++, yr--) memcpy(imOut->image[yr], imIn->image[y], imIn->linesize); ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingRotate90(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); #define ROTATE_90(image)\ for (y = 0; y < imIn->ysize; y++) {\ xr = imIn->xsize-1;\ for (x = 0; x < imIn->xsize; x++, xr--)\ imOut->image[xr][y] = imIn->image[y][x];\ } ImagingSectionEnter(&cookie); if (imIn->image8) ROTATE_90(image8) else ROTATE_90(image32) ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingRotate180(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xr, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); yr = imIn->ysize-1; #define ROTATE_180(image)\ for (y = 0; y < imIn->ysize; y++, yr--) {\ xr = imIn->xsize-1;\ for (x = 0; x < imIn->xsize; x++, xr--)\ imOut->image[y][x] = imIn->image[yr][xr];\ } ImagingSectionEnter(&cookie); if (imIn->image8) ROTATE_180(image8) else ROTATE_180(image32) ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingRotate270(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) return (Imaging) ImagingError_Mismatch(); ImagingCopyInfo(imOut, imIn); yr = imIn->ysize - 1; #define ROTATE_270(image)\ for (y = 0; y < imIn->ysize; y++, yr--)\ for (x = 0; x < imIn->xsize; x++)\ imOut->image[x][y] = imIn->image[yr][x]; ImagingSectionEnter(&cookie); if (imIn->image8) ROTATE_270(image8) else ROTATE_270(image32) ImagingSectionLeave(&cookie); return imOut; } /* -------------------------------------------------------------------- */ /* Transforms */ /* transform primitives (ImagingTransformMap) */ static int affine_transform(double* xin, double* yin, int x, int y, void* data) { /* full moon tonight. your compiler will generate bogus code for simple expressions, unless you reorganize the code, or install Service Pack 3 */ double* a = (double*) data; double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; xin[0] = a0 + a1*x + a2*y; yin[0] = a3 + a4*x + a5*y; return 1; } static int perspective_transform(double* xin, double* yin, int x, int y, void* data) { double* a = (double*) data; double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; xin[0] = (a0 + a1*x + a2*y) / (a6*x + a7*y + 1); yin[0] = (a3 + a4*x + a5*y) / (a6*x + a7*y + 1); return 1; } #if 0 static int quadratic_transform(double* xin, double* yin, int x, int y, void* data) { double* a = (double*) data; double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; double a8 = a[8]; double a9 = a[9]; double a10 = a[10]; double a11 = a[11]; xin[0] = a0 + a1*x + a2*y + a3*x*x + a4*x*y + a5*y*y; yin[0] = a6 + a7*x + a8*y + a9*x*x + a10*x*y + a11*y*y; return 1; } #endif static int quad_transform(double* xin, double* yin, int x, int y, void* data) { /* quad warp: map quadrilateral to rectangle */ double* a = (double*) data; double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; xin[0] = a0 + a1*x + a2*y + a3*x*y; yin[0] = a4 + a5*x + a6*y + a7*x*y; return 1; } /* transform filters (ImagingTransformFilter) */ #ifdef WITH_FILTERS static int nearest_filter8(void* out, Imaging im, double xin, double yin, void* data) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) return 0; ((UINT8*)out)[0] = im->image8[y][x]; return 1; } static int nearest_filter16(void* out, Imaging im, double xin, double yin, void* data) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) return 0; ((INT16*)out)[0] = ((INT16*)(im->image8[y]))[x]; return 1; } static int nearest_filter32(void* out, Imaging im, double xin, double yin, void* data) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) return 0; ((INT32*)out)[0] = im->image32[y][x]; return 1; } #define XCLIP(im, x) ( ((x) < 0) ? 0 : ((x) < im->xsize) ? (x) : im->xsize-1 ) #define YCLIP(im, y) ( ((y) < 0) ? 0 : ((y) < im->ysize) ? (y) : im->ysize-1 ) #define BILINEAR(v, a, b, d)\ (v = (a) + ( (b) - (a) ) * (d)) #define BILINEAR_HEAD(type)\ int x, y;\ int x0, x1;\ double v1, v2;\ double dx, dy;\ type* in;\ if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize)\ return 0;\ xin -= 0.5;\ yin -= 0.5;\ x = FLOOR(xin);\ y = FLOOR(yin);\ dx = xin - x;\ dy = yin - y; #define BILINEAR_BODY(type, image, step, offset) {\ in = (type*) ((image)[YCLIP(im, y)] + offset);\ x0 = XCLIP(im, x+0)*step;\ x1 = XCLIP(im, x+1)*step;\ BILINEAR(v1, in[x0], in[x1], dx);\ if (y+1 >= 0 && y+1 < im->ysize) {\ in = (type*) ((image)[y+1] + offset);\ BILINEAR(v2, in[x0], in[x1], dx);\ } else\ v2 = v1;\ BILINEAR(v1, v1, v2, dy);\ } static int bilinear_filter8(void* out, Imaging im, double xin, double yin, void* data) { BILINEAR_HEAD(UINT8); BILINEAR_BODY(UINT8, im->image8, 1, 0); ((UINT8*)out)[0] = (UINT8) v1; return 1; } static int bilinear_filter32I(void* out, Imaging im, double xin, double yin, void* data) { BILINEAR_HEAD(INT32); BILINEAR_BODY(INT32, im->image32, 1, 0); ((INT32*)out)[0] = (INT32) v1; return 1; } static int bilinear_filter32F(void* out, Imaging im, double xin, double yin, void* data) { BILINEAR_HEAD(FLOAT32); BILINEAR_BODY(FLOAT32, im->image32, 1, 0); ((FLOAT32*)out)[0] = (FLOAT32) v1; return 1; } static int bilinear_filter32LA(void* out, Imaging im, double xin, double yin, void* data) { BILINEAR_HEAD(UINT8); BILINEAR_BODY(UINT8, im->image, 4, 0); ((UINT8*)out)[0] = (UINT8) v1; ((UINT8*)out)[1] = (UINT8) v1; ((UINT8*)out)[2] = (UINT8) v1; BILINEAR_BODY(UINT8, im->image, 4, 3); ((UINT8*)out)[3] = (UINT8) v1; return 1; } static int bilinear_filter32RGB(void* out, Imaging im, double xin, double yin, void* data) { int b; BILINEAR_HEAD(UINT8); for (b = 0; b < im->bands; b++) { BILINEAR_BODY(UINT8, im->image, 4, b); ((UINT8*)out)[b] = (UINT8) v1; } return 1; } #define BICUBIC(v, v1, v2, v3, v4, d) {\ double p1 = v2;\ double p2 = -v1 + v3;\ double p3 = 2*(v1 - v2) + v3 - v4;\ double p4 = -v1 + v2 - v3 + v4;\ v = p1 + (d)*(p2 + (d)*(p3 + (d)*p4));\ } #define BICUBIC_HEAD(type)\ int x = FLOOR(xin);\ int y = FLOOR(yin);\ int x0, x1, x2, x3;\ double v1, v2, v3, v4;\ double dx, dy;\ type* in;\ if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize)\ return 0;\ xin -= 0.5;\ yin -= 0.5;\ x = FLOOR(xin);\ y = FLOOR(yin);\ dx = xin - x;\ dy = yin - y;\ x--; y--; #define BICUBIC_BODY(type, image, step, offset) {\ in = (type*) ((image)[YCLIP(im, y)] + offset);\ x0 = XCLIP(im, x+0)*step;\ x1 = XCLIP(im, x+1)*step;\ x2 = XCLIP(im, x+2)*step;\ x3 = XCLIP(im, x+3)*step;\ BICUBIC(v1, in[x0], in[x1], in[x2], in[x3], dx);\ if (y+1 >= 0 && y+1 < im->ysize) {\ in = (type*) ((image)[y+1] + offset);\ BICUBIC(v2, in[x0], in[x1], in[x2], in[x3], dx);\ } else\ v2 = v1;\ if (y+2 >= 0 && y+2 < im->ysize) {\ in = (type*) ((image)[y+2] + offset);\ BICUBIC(v3, in[x0], in[x1], in[x2], in[x3], dx);\ } else\ v3 = v2;\ if (y+3 >= 0 && y+3 < im->ysize) {\ in = (type*) ((image)[y+3] + offset);\ BICUBIC(v4, in[x0], in[x1], in[x2], in[x3], dx);\ } else\ v4 = v3;\ BICUBIC(v1, v1, v2, v3, v4, dy);\ } static int bicubic_filter8(void* out, Imaging im, double xin, double yin, void* data) { BICUBIC_HEAD(UINT8); BICUBIC_BODY(UINT8, im->image8, 1, 0); if (v1 <= 0.0) ((UINT8*)out)[0] = 0; else if (v1 >= 255.0) ((UINT8*)out)[0] = 255; else ((UINT8*)out)[0] = (UINT8) v1; return 1; } static int bicubic_filter32I(void* out, Imaging im, double xin, double yin, void* data) { BICUBIC_HEAD(INT32); BICUBIC_BODY(INT32, im->image32, 1, 0); ((INT32*)out)[0] = (INT32) v1; return 1; } static int bicubic_filter32F(void* out, Imaging im, double xin, double yin, void* data) { BICUBIC_HEAD(FLOAT32); BICUBIC_BODY(FLOAT32, im->image32, 1, 0); ((FLOAT32*)out)[0] = (FLOAT32) v1; return 1; } static int bicubic_filter32LA(void* out, Imaging im, double xin, double yin, void* data) { BICUBIC_HEAD(UINT8); BICUBIC_BODY(UINT8, im->image, 4, 0); if (v1 <= 0.0) { ((UINT8*)out)[0] = 0; ((UINT8*)out)[1] = 0; ((UINT8*)out)[2] = 0; } else if (v1 >= 255.0) { ((UINT8*)out)[0] = 255; ((UINT8*)out)[1] = 255; ((UINT8*)out)[2] = 255; } else { ((UINT8*)out)[0] = (UINT8) v1; ((UINT8*)out)[1] = (UINT8) v1; ((UINT8*)out)[2] = (UINT8) v1; } BICUBIC_BODY(UINT8, im->image, 4, 3); if (v1 <= 0.0) ((UINT8*)out)[3] = 0; else if (v1 >= 255.0) ((UINT8*)out)[3] = 255; else ((UINT8*)out)[3] = (UINT8) v1; return 1; } static int bicubic_filter32RGB(void* out, Imaging im, double xin, double yin, void* data) { int b; BICUBIC_HEAD(UINT8); for (b = 0; b < im->bands; b++) { BICUBIC_BODY(UINT8, im->image, 4, b); if (v1 <= 0.0) ((UINT8*)out)[b] = 0; else if (v1 >= 255.0) ((UINT8*)out)[b] = 255; else ((UINT8*)out)[b] = (UINT8) v1; } return 1; } static ImagingTransformFilter getfilter(Imaging im, int filterid) { switch (filterid) { case IMAGING_TRANSFORM_NEAREST: if (im->image8) switch (im->type) { case IMAGING_TYPE_UINT8: return (ImagingTransformFilter) nearest_filter8; case IMAGING_TYPE_SPECIAL: switch (im->pixelsize) { case 1: return (ImagingTransformFilter) nearest_filter8; case 2: return (ImagingTransformFilter) nearest_filter16; case 4: return (ImagingTransformFilter) nearest_filter32; } } else return (ImagingTransformFilter) nearest_filter32; break; case IMAGING_TRANSFORM_BILINEAR: if (im->image8) return (ImagingTransformFilter) bilinear_filter8; else if (im->image32) { switch (im->type) { case IMAGING_TYPE_UINT8: if (im->bands == 2) return (ImagingTransformFilter) bilinear_filter32LA; else return (ImagingTransformFilter) bilinear_filter32RGB; case IMAGING_TYPE_INT32: return (ImagingTransformFilter) bilinear_filter32I; case IMAGING_TYPE_FLOAT32: return (ImagingTransformFilter) bilinear_filter32F; } } break; case IMAGING_TRANSFORM_BICUBIC: if (im->image8) return (ImagingTransformFilter) bicubic_filter8; else if (im->image32) { switch (im->type) { case IMAGING_TYPE_UINT8: if (im->bands == 2) return (ImagingTransformFilter) bicubic_filter32LA; else return (ImagingTransformFilter) bicubic_filter32RGB; case IMAGING_TYPE_INT32: return (ImagingTransformFilter) bicubic_filter32I; case IMAGING_TYPE_FLOAT32: return (ImagingTransformFilter) bicubic_filter32F; } } break; } /* no such filter */ return NULL; } #else #define getfilter(im, id) NULL #endif /* transformation engines */ Imaging ImagingTransform( Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, ImagingTransformMap transform, void* transform_data, ImagingTransformFilter filter, void* filter_data, int fill) { /* slow generic transformation. use ImagingTransformAffine or ImagingScaleAffine where possible. */ ImagingSectionCookie cookie; int x, y; char *out; double xx, yy; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); ImagingCopyInfo(imOut, imIn); ImagingSectionEnter(&cookie); if (x0 < 0) x0 = 0; if (y0 < 0) y0 = 0; if (x1 > imOut->xsize) x1 = imOut->xsize; if (y1 > imOut->ysize) y1 = imOut->ysize; for (y = y0; y < y1; y++) { out = imOut->image[y] + x0*imOut->pixelsize; for (x = x0; x < x1; x++) { if (!transform(&xx, &yy, x-x0, y-y0, transform_data) || !filter(out, imIn, xx, yy, filter_data)) { if (fill) memset(out, 0, imOut->pixelsize); } out += imOut->pixelsize; } } ImagingSectionLeave(&cookie); return imOut; } static Imaging ImagingScaleAffine(Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[6], int fill) { /* scale, nearest neighbour resampling */ ImagingSectionCookie cookie; int x, y; int xin; double xo, yo; int xmin, xmax; int *xintab; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); ImagingCopyInfo(imOut, imIn); if (x0 < 0) x0 = 0; if (y0 < 0) y0 = 0; if (x1 > imOut->xsize) x1 = imOut->xsize; if (y1 > imOut->ysize) y1 = imOut->ysize; xintab = (int*) malloc(imOut->xsize * sizeof(int)); if (!xintab) { ImagingDelete(imOut); return (Imaging) ImagingError_MemoryError(); } xo = a[0]; yo = a[3]; xmin = x1; xmax = x0; /* Pretabulate horizontal pixel positions */ for (x = x0; x < x1; x++) { xin = COORD(xo); if (xin >= 0 && xin < (int) imIn->xsize) { xmax = x+1; if (x < xmin) xmin = x; xintab[x] = xin; } xo += a[1]; } #define AFFINE_SCALE(pixel, image)\ for (y = y0; y < y1; y++) {\ int yi = COORD(yo);\ pixel *in, *out;\ out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ if (yi >= 0 && yi < imIn->ysize) {\ in = imIn->image[yi];\ for (x = xmin; x < xmax; x++)\ out[x] = in[xintab[x]];\ }\ yo += a[5];\ } ImagingSectionEnter(&cookie); if (imIn->image8) { AFFINE_SCALE(UINT8, image8); } else { AFFINE_SCALE(INT32, image32); } ImagingSectionLeave(&cookie); free(xintab); return imOut; } static inline int check_fixed(double a[6], int x, int y) { return (fabs(a[0] + x*a[1] + y*a[2]) < 32768.0 && fabs(a[3] + x*a[4] + y*a[5]) < 32768.0); } static inline Imaging affine_fixed(Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[6], int filterid, int fill) { /* affine transform, nearest neighbour resampling, fixed point arithmetics */ int x, y; int xin, yin; int xsize, ysize; int xx, yy; int a0, a1, a2, a3, a4, a5; ImagingCopyInfo(imOut, imIn); xsize = (int) imIn->xsize; ysize = (int) imIn->ysize; /* use 16.16 fixed point arithmetics */ #define FIX(v) FLOOR((v)*65536.0 + 0.5) a0 = FIX(a[0]); a1 = FIX(a[1]); a2 = FIX(a[2]); a3 = FIX(a[3]); a4 = FIX(a[4]); a5 = FIX(a[5]); #define AFFINE_TRANSFORM_FIXED(pixel, image)\ for (y = y0; y < y1; y++) {\ pixel *out;\ xx = a0;\ yy = a3;\ out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ for (x = x0; x < x1; x++, out++) {\ xin = xx >> 16;\ if (xin >= 0 && xin < xsize) {\ yin = yy >> 16;\ if (yin >= 0 && yin < ysize)\ *out = imIn->image[yin][xin];\ }\ xx += a1;\ yy += a4;\ }\ a0 += a2;\ a3 += a5;\ } if (imIn->image8) AFFINE_TRANSFORM_FIXED(UINT8, image8) else AFFINE_TRANSFORM_FIXED(INT32, image32) return imOut; } Imaging ImagingTransformAffine(Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[6], int filterid, int fill) { /* affine transform, nearest neighbour resampling, floating point arithmetics*/ ImagingSectionCookie cookie; int x, y; int xin, yin; int xsize, ysize; double xx, yy; double xo, yo; if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) { /* Filtered transform */ ImagingTransformFilter filter = getfilter(imIn, filterid); if (!filter) return (Imaging) ImagingError_ValueError("unknown filter"); return ImagingTransform( imOut, imIn, x0, y0, x1, y1, affine_transform, a, filter, NULL, fill); } if (a[2] == 0 && a[4] == 0) /* Scaling */ return ImagingScaleAffine(imOut, imIn, x0, y0, x1, y1, a, fill); if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) return (Imaging) ImagingError_ModeError(); if (x0 < 0) x0 = 0; if (y0 < 0) y0 = 0; if (x1 > imOut->xsize) x1 = imOut->xsize; if (y1 > imOut->ysize) y1 = imOut->ysize; ImagingCopyInfo(imOut, imIn); /* translate all four corners to check if they are within the range that can be represented by the fixed point arithmetics */ if (check_fixed(a, 0, 0) && check_fixed(a, x1-x0, y1-y0) && check_fixed(a, 0, y1-y0) && check_fixed(a, x1-x0, 0)) return affine_fixed(imOut, imIn, x0, y0, x1, y1, a, filterid, fill); /* FIXME: cannot really think of any reasonable case when the following code is used. maybe we should fall back on the slow generic transform engine in this case? */ xsize = (int) imIn->xsize; ysize = (int) imIn->ysize; xo = a[0]; yo = a[3]; #define AFFINE_TRANSFORM(pixel, image)\ for (y = y0; y < y1; y++) {\ pixel *out;\ xx = xo;\ yy = yo;\ out = imOut->image[y];\ if (fill && x1 > x0)\ memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ for (x = x0; x < x1; x++, out++) {\ xin = COORD(xx);\ if (xin >= 0 && xin < xsize) {\ yin = COORD(yy);\ if (yin >= 0 && yin < ysize)\ *out = imIn->image[yin][xin];\ }\ xx += a[1];\ yy += a[4];\ }\ xo += a[2];\ yo += a[5];\ } ImagingSectionEnter(&cookie); if (imIn->image8) AFFINE_TRANSFORM(UINT8, image8) else AFFINE_TRANSFORM(INT32, image32) ImagingSectionLeave(&cookie); return imOut; } Imaging ImagingTransformPerspective(Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filterid, int fill) { ImagingTransformFilter filter = getfilter(imIn, filterid); if (!filter) return (Imaging) ImagingError_ValueError("bad filter number"); return ImagingTransform( imOut, imIn, x0, y0, x1, y1, perspective_transform, a, filter, NULL, fill); } Imaging ImagingTransformQuad(Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[8], int filterid, int fill) { ImagingTransformFilter filter = getfilter(imIn, filterid); if (!filter) return (Imaging) ImagingError_ValueError("bad filter number"); return ImagingTransform( imOut, imIn, x0, y0, x1, y1, quad_transform, a, filter, NULL, fill); } /* -------------------------------------------------------------------- */ /* Convenience functions */ Imaging ImagingResize(Imaging imOut, Imaging imIn, int filterid) { double a[6]; if (imOut->xsize == imIn->xsize && imOut->ysize == imIn->ysize) return ImagingCopy2(imOut, imIn); memset(a, 0, sizeof a); a[1] = (double) imIn->xsize / imOut->xsize; a[5] = (double) imIn->ysize / imOut->ysize; if (!filterid && imIn->type != IMAGING_TYPE_SPECIAL) return ImagingScaleAffine( imOut, imIn, 0, 0, imOut->xsize, imOut->ysize, a, 1); return ImagingTransformAffine( imOut, imIn, 0, 0, imOut->xsize, imOut->ysize, a, filterid, 1); } Imaging ImagingRotate(Imaging imOut, Imaging imIn, double theta, int filterid) { int xsize, ysize; double sintheta, costheta; double a[6]; /* Setup an affine transform to rotate around the image center */ theta = -theta * M_PI / 180.0; sintheta = sin(theta); costheta = cos(theta); xsize = imOut->xsize; ysize = imOut->ysize; a[0] = -costheta * xsize/2 - sintheta * ysize/2 + xsize/2; a[1] = costheta; a[2] = sintheta; a[3] = sintheta * xsize/2 - costheta * ysize/2 + ysize/2; a[4] = -sintheta; a[5] = costheta; return ImagingTransformAffine( imOut, imIn, 0, 0, imOut->xsize, imOut->ysize, a, filterid, 1); } pillow-2.3.0/PKG-INFO0000644000175000001440000027563512261041654013015 0ustar dokousersMetadata-Version: 1.1 Name: Pillow Version: 2.3.0 Summary: Python Imaging Library (Fork) Home-page: http://python-imaging.github.io/ Author: Alex Clark (fork author) Author-email: aclark@aclark.net License: Standard PIL License Description: Pillow ====== *Python Imaging Library (Fork)* Pillow is the "friendly" PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow .. image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version .. image:: https://pypip.in/d/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Number of PyPI downloads The documentation is hosted at http://pillow.readthedocs.org/. It contains installation instructions, tutorials, reference, compatibility details, and more. Changelog (Pillow) ================== 2.3.0 (2014-01-01) ------------------ - Stop leaking filename parameter passed to getfont [jpharvey] - Report availability of LIBTIFF during setup and selftest [cgohlke] - Fix msvc build error C1189: "No Target Architecture" [cgohlke] - Fix memory leak in font_getsize [wiredfool] - Correctly prioritize include and library paths [ohanar] - Image.point fixes for numpy.array and docs [wiredfool] - Save the transparency header by default for PNGs [wiredfool] - Support for PNG tRNS header when converting from RGB->RGBA [wiredfool] - PyQT5 Support [wiredfool] - Updates for saving color tiffs w/compression using libtiff [wiredfool] - 2gigapix image fixes and redux [wiredfool] - Save arbitrary tags in Tiff image files [wiredfool] - Quote filenames and title before using on command line [tmccombs] - Fixed Viewer.show to return properly [tmccombs] - Documentation fixes [wiredfool] - Fixed memory leak saving images as webp when webpmux is available [cezarsa] - Fix compiling with FreeType 2.5.1 [stromnov] - Adds directories for NetBSD. [deepy] - Support RGBA TIFF with missing ExtraSamples tag [cgohlke] - Lossless WEBP Support [wiredfool] - Take compression as an option in the save call for tiffs [wiredfool] - Add support for saving lossless WebP. Just pass 'lossless=True' to save() [liftoff] - LCMS support upgraded from version 1 to version 2, fixes #343 [wiredfool] - Added more raw decoder 16 bit pixel formats [svanheulen] - Document remaining Image* modules listed in PIL handbook [irksep] - Document ImageEnhance, ImageFile, ImageFilter, ImageFont, ImageGrab, ImageMath, and ImageOps [irksep] - Port and update docs for Image, ImageChops, ImageColor, and ImageDraw [irksep] - Move or copy content from README.rst to docs/ [irksep] - Respect CFLAGS/LDFLAGS when searching for headers/libs [iElectric] - Port PIL Handbook tutorial and appendices [irksep] - Alpha Premultiplication support for transform and resize [wiredfool] - Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 [wiredfool] 2.2.2 (2013-12-11) ------------------ - Fix #427: compiling with FreeType 2.5.1 [stromnov] 2.2.1 (2013-10-02) ------------------ - Fix #356: Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) [wiredfool] 2.2.0 (2013-10-02) ------------------ - Fix #254: Bug in image transformations resulting from uninitialized memory [nikmolnar] - Fix for encoding of b_whitespace, similar to closed issue #272 [mhogg] - Fix #273: Add numpy array interface support for 16 and 32 bit integer modes [cgohlke] - Partial fix for #290: Add preliminary support for TIFF tags. [wiredfool] - Fix #251 and #326: circumvent classification of pngtest_bad.png as malware [cgohlke] - Add typedef uint64_t for MSVC. [cgohlke] - Fix #329: setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. [nu774] - Fix #328: _imagingcms.c: include windef.h to fix build issue on MSVC [nu774] - Automatically discover homebrew include/ and lib/ paths on OSX [donspaulding] - Fix bytes which should be bytearray [manisandro] - Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build if specified as environment variables. [seanupton] - Fix #312 + gif optimize improvement [d-schmidt] - Be more tolerant of tag read failures [ericbuehl] - Fix #318: Catch truncated zTXt errors. [vytisb] - Fix IOError when saving progressive JPEGs. [e98cuenc] - Add RGBA support to ImageColor [yoavweiss] - Fix #304: test for `str`, not `"utf-8"`. [mjpieters] - Fix missing import os in _util.py. [mnowotka] - Added missing exif tags. [freyes] - Fail on all import errors, fixes #298. [macfreek, wiredfool] - Fixed Windows fallback (wasn't using correct file in Windows fonts). [lmollea] - Moved ImageFile and ImageFileIO comments to docstrings. [freyes] - Restore compatibility with ISO C. [cgohlke] - Use correct format character for C int type. [cgohlke] - Allocate enough memory to hold pointers in encode.c. [cgohlke] - Fix #279, fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff. [wiredfool] - Moved Image module comments to docstrings. [freyes] - Add 16-bit TIFF support, fixes #274. [wiredfool] - Ignore high ascii characters in string.whitespace, fixes #272. [wiredfool] - Added clean/build to tox to make it behave like travis. [freyes] - Adding support for metadata in webp images. [heynemann] 2.1.0 (2013-07-02) ------------------ - Add /usr/bin/env python shebangs to all scripts in /Scripts. - Add several TIFF decoders and encoders. - Added support for alpha transparent webp images. - Adding Python 3 support for StringIO. - Adding Python3 basestring compatibility without changing basestring. - Fix webp encode errors on win-amd64. - Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1. - Better support for ICO images. - Changed PY_VERSION_HEX, fixes #166. - Changes to put everything under the PIL namespace. [wiredfool] - Changing StringIO to BytesIO. - Cleanup whitespace. [Arfrever] - Don't skip 'import site' on initialization when running tests for inplace builds. [cgohlke] - Enable warnings for test suite. - Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) - Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6 - Fix #193: remove double typedef declaration. - Fix msvc compile errors (#230). - Fix rendered characters have been chipped for some TrueType fonts. - Fix usage of pilfont.py script. - Fresh start for docs, generated by sphinx-apidoc. - Introduce --enable-x and fail if it is given and x is not available. - Partial work to add a wrapper for WebPGetFeatures to correctly support #204. - Significant performance improvement of `alpha_composite` function. - Support explicitly disabling features via --disable-* options. - Support selftest.py --installed, fixes #263. - Transparent WebP Support, #204 - Use PyCapsule for py3.1, fixes #237. - Workaround for: http://bugs.python.org/16754 in 3.2.x < 3.2.4 and 3.3.0. 2.0.0 (2013-03-15) ------------------ - Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) [fluggo] - Add PyPy support (experimental, please see: https://github.com/python-imaging/Pillow/issues/67) - Add WebP support. [lqs] - Add Tiff G3/G4 support (experimental) [wiredfool] - Backport PIL's PNG/Zip improvements. [olt] - Various 64 bit and Windows fixes. [cgohlke] - Add testing suite. [cgohlke, fluggo] - Added support for PNG images with transparency palette. [d-schmidt] - Many other bug fixes and enhancements by many other people (see commit log and/or docs/CONTRIBUTORS.txt). - Special thanks to Christoph Gohlke and Eric Soroos for rallying around the effort to get a release out for PyCon 2013. 1.7.8 (2012-11-01) ------------------ - Removed doctests.py that made tests of other packages fail. [thomasdesvenain] - Fix opening psd files with RGBA layers when A mode is not of type 65535 but 3. Fixes #3 [thomasdesvenain] 1.7.7 (2012-04-04) ------------------ - UNDEF more types before including windows headers [mattip] 1.7.6 (2012-01-20) ------------------ - Bug fix: freetype not found on Mac OS X with case-sensitive filesystem [gjo] - Bug fix: Backport fix to split() after open() (regression introduced in PIL 1.1.7). [sfllaw] 1.7.5 (2011-09-07) ------------------ - Fix for sys.platform = "linux3" [blueyed] - Package cleanup and additional documentation [aclark] 1.7.4 (2011-07-21) ------------------ - Fix brown bag release [aclark] 1.7.3 (2011-07-20) ------------------ - Fix : resize need int values, append int conversion in thumbnail method [harobed] 1.7.2 (2011-06-02) ------------------ - Bug fix: Python 2.4 compat [aclark] 1.7.1 (2011-05-31) ------------------ - More multi-arch support [SteveM, regebro, barry, aclark] 1.7.0 (2011-05-27) ------------------ - Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu [aclark] 1.6 (12/01/2010) ---------------- - Bug fix: /usr/x11/include should be added to include_dirs not library_dirs [elro] - Doc fixes 1.5 (11/28/2010) ---------------- - Module and package fixes 1.4 (11/28/2010) ---------------- - Doc fixes 1.3 (11/28/2010) ---------------- - Add support for /lib64 and /usr/lib64 library directories on Linux - Doc fixes 1.2 (08/02/2010) ---------------- - On OS X also check for freetype2 in the X11 path [jezdez] - Doc fixes [aclark] 1.1 (07/31/2010) ---------------- - Removed setuptools_hg requirement - Doc fixes 1.0 (07/30/2010) ---------------- - Forked PIL based on Hanno Schlichting's re-packaging (http://dist.plone.org/thirdparty/PIL-1.1.7.tar.gz) - Remove support for importing from the standard namespace .. Note:: What follows is the original PIL 1.1.7 CHANGES file contents :: -*- coding: utf-8 -*- The Python Imaging Library $Id$ ACKNOWLEDGEMENTS: PIL wouldn't be what it is without the help of: David Ascher, Phil Austin, Douglas Bagnall, Larry Bates, Anthony Baxter, William Baxter, Denis Benoit, Jan Blom, Duncan Booth, Alexey Borzenkov, Jeff Breidenbach, Roger Burnham, Zac Burns, Gene Cash, Kevin Cazabon, Fred Clare, Greg Coats, Chris Cogdon, Greg Couch, Bill Crutchfield, Abel Deuring, Tim Docker, Fred Drake, Graham Dumpleton, Matthew Ellis, Eric Etheridge, Daniel Fetchinson, Robin Friedrich, Pier Paolo Glave, Federico Di Gregorio, Markus Gritsch, Daniel Haertle, Greg Hamilton, Mark Hammond, Bernhard Herzog, Rob Hooft, Bob Ippolito, Jack Jansen, Bill Janssen, Edward Jones, Richard Jones, Håkan Karlsson, Robert Kern, David Kirtley, Bob Klimek, Matthias Klose, Andrew Kuchling, Magnus Källström, Victor Lacina, Ben Last, Hamish Lawson, Cesare Leonardi, Andrew MacIntyre, Jan Matejek, Naveen Michaud-Agrawal, Gordon McMillan, Skip Montanaro, Fredrik Nehr, Russell Nelson, Luciano Nocera, Travis Oliphant, Piet van Oostrum, Richard Oudkerk, Paul Pharr, Andres Polit, Conrado Porto Lopes Gouvêa, Eric Raymond, Victor Reijs, Bertil Reinhammar, Nicholas Riley, Don Rozenberg, Toby Sargeant, Barry Scott, Les Schaffer, Joel Shprentz, Klamer Shutte, Gene Skonicki, Niki Spahiev, D. Alan Stewart, Perry Stoll, Paul Svensson, Ulrik Svensson, Miki Tebeka, Michael van Tellingen, Ivan Tkatchev, Dan Torop, Adam Twardoch, Rune Uhlin, Dmitry Vasiliev, Sasha Voynow, Charles Waldman, Collin Winter, Dan Wolfe, Ka-Ping Yee, and many others (if your name should be on this list, let me know.) *** Changes from release 1.1.6 to 1.1.7 *** This section may not be fully complete. For changes since this file was last updated, see the repository revision history: http://bitbucket.org/effbot/pil-2009-raclette/changesets/ (1.1.7 final) + Set GIF loop info property to the number of iterations if a NETSCAPE loop extension is present, instead of always setting it to 1 (from Valentino Volonghi). (1.1.7c1 released) + Improved PNG compression (from Alexey Borzenkov). + Read interlaced PNG files (from Conrado Porto Lopes Gouvêa) + Added various TGA improvements from Alexey Borzenkov, including support for specifying image orientation. + Bumped block threshold to 16 megabytes, made size estimation a bit more accurate. This speeds up allocation of large images. + Fixed rounding error in ImagingDrawWideLine. "gormish" writes: ImagingDrawWideLine() in Draw.c has a bug in every version I've seen, which leads to different width lines depending on the order of the points in the line. This is especially bad at some angles where a 'width=2' line can completely disappear. + Added support for RGBA mode to the SGI module (based on code by Karsten Hiddemann). + Handle repeated IPTC tags (adapted from a patch by Eric Bruning). Eric writes: According to the specification, some IPTC tags can be repeated, e.g., tag 2:25 (keywords). PIL 1.1.6 only retained the last instance of that tag. Below is a patch to store all tags. If there are multiple tag instances, they are stored in a (python) list. Single tag instances remain as strings. + Fixed potential crash in ImageFilter for small target images (reported by Zac Burns and Daniel Fetchinson). + Use BMP instead of JPEG as temporary show format on Mac OS X. + Fixed putpixel/new for I;16 with colors > 255. + Added integer power support to ImagingMath. + Added limited support for I;16L mode (explicit little endian). + Moved WMF support into Image.core; enable WMF rendering by default if renderer is available. + Mark the ARG plugin as obsolete. + Added version query mechanism to ImageCms and ImageFont, for debugging. + Added (experimental) ImageCms function for fetching the ICC profile for the current display (currently Windows only). Added HWND/HDC support to ImageCms.get_display_profile(). + Added WMF renderer (Windows only). + Added ImagePointHandler and ImageTransformHandler mixins; made ImageCmsTransform work with im.point. + Fixed potential endless loop in the XVThumbnail reader (from Nikolai Ugelvik). + Added Kevin Cazabon's pyCMS package. The C code has been moved to _imagingcms.c, the Python interface module is installed as PIL.ImageCMS. Added support for in-memory ICC profiles. Unified buildTransform and buildTransformFromOpenProfiles. The profile can now be either a filename, a profile object, or a file-like object containing an in-memory profile. Additional fixes from Florian Böch: Very nice - it just needs LCMS flags support so we can use black point compensation and softproofing :) See attached patches. They also fix a naming issue which could cause confusion - display profile (ImageCms wording) actually means proof profile (lcms wording), so I changed variable names and docstrings where applicable. Patches are tested under Python 2.6. + Improved support for layer names in PSD files (from Sylvain Baubeau) Sylvain writes: I needed to be able to retrieve the names of the layers in a PSD files. But PsdImagePlugin.py didn't do the job so I wrote this very small patch. + Improved RGBA support for ImageTk for 8.4 and newer (from Con Radchenko). This replaces the slow run-length based encoding model with true compositing at the Tk level. + Added support for 16- and 32-bit images to McIdas loader. Based on file samples and stand-alone reader code provided by Craig Swank. + Added ImagePalette support to putpalette. + Fixed problem with incremental parsing of PNG files. + Make selftest.py report non-zero status on failure (from Mark Sienkiewicz) + Add big endian save support and multipage infrastructure to the TIFF writer (from Sebastian Haase). + Handle files with GPS IFD but no basic EXIF IFD (reported by Kurt Schwehr). + Added zTXT support (from Andrew Kuchling via Lowell Alleman). + Fixed potential infinite loop bug in ImageFont (from Guilherme Polo). + Added sample ICC profiles (from Kevin Cazabon) + Fixed array interface for I, F, and RGBA/RGBX images. + Added Chroma subsampling support for JPEG (from Justin Huff). Justin writes: Attached is a patch (against PIL 1.1.6) to provide control over the chroma subsampling done by the JPEG encoder. This is often useful for reducing compression artifacts around edges of clipart and text. + Added USM/Gaussian Blur code from Kevin Cazabon. + Fixed bug w. uninitialized image data when cropping outside the source image. + Use ImageShow to implement the Image.show method. Most notably, this picks the 'display' utility when available. It also allows application code to register new display utilities via the ImageShow registry. + Release the GIL in the PNG compressor (from Michael van Tellingen). + Revised JPEG CMYK handling. Always assume Adobe behaviour, both when reading and writing (based on a patch by Kevin Cazabon, and test data by Tim V. and Charlie Clark, and additional debugging by Michael van Tellingen). + Support for preserving ICC profiles (by Florian Böch via Tim Hatch). Florian writes: It's a beta, so still needs some testing, but should allow you to: - retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF. Existing code doesn't need to be changed. - access embedded profiles in JPEG, PNG, PSD, TIFF. It also includes patches for TIFF to retain IPTC, Photoshop and XMP metadata when saving as TIFF again, read/write TIFF resolution information correctly, and to correct inverted CMYK JPEG files. + Fixed potential memory leak in median cut quantizer (from Evgeny Salmin). + Fixed OverflowError when reading upside-down BMP images. + Added resolution save option for PDF files. Andreas Kostyrka writes: I've included a patched PdfImagePlugin.py based on 1.1.6 as included in Ubuntu, that supports a "resolution" save option. Not great, but it makes the PDF saving more useful by allowing PDFs that are not exactly 72dpi. + Look for Tcl/Tk include files in version-specific include directory (from Encolpe Degoute). + Fixed grayscale rounding error in ImageColor.getcolor (from Tim Hatch). + Fixed calculation of mean value in ImageEnhance.Contrast (reported by "roop" and Scott David Daniels). + Fixed truetype positioning when first character has a negative left bearing (from Ned Batchelder): Ned writes: In PIL 1.1.6, ImageDraw.text will position the string incorrectly if the first character has a negative left bearing. To see the problem, show a string like "///" in an italic font. The first slash will be clipped at the left, and the string will be mis-positioned. + Fixed resolution unit bug in tiff reader/writer (based on code by Florian Höch, Gary Bloom, and others). + Added simple transparency support for RGB images (reported by Sebastian Spaeth). + Added support for Unicode filenames in ImageFont.truetype (from Donn Ingle). + Fixed potential crash in ImageFont.getname method (from Donn Ingle). + Fixed encoding issue in PIL/WalImageFile (from Santiago M. Mola). *** Changes from release 1.1.5 to 1.1.6 *** (1.1.6 released) + Fixed some 64-bit compatibility warnings for Python 2.5. + Added threading support for the Sane driver (from Abel Deuring). (1.1.6b2 released) + Added experimental "floodfill" function to the ImageDraw module (based on code by Eric Raymond). + The default arguments for "frombuffer" doesn't match "fromstring" and the documentation; this is a bug, and will most likely be fixed in a future version. In this release, PIL prints a warning message instead. To silence the warning, change any calls of the form "frombuffer(mode, size, data)" to frombuffer(mode, size, data, "raw", mode, 0, 1) + Added "fromarray" function, which takes an object implementing the NumPy array interface and creates a PIL Image from it. (from Travis Oliphant). + Added NumPy array interface support (__array_interface__) to the Image class (based on code by Travis Oliphant). This allows you to easily convert between PIL image memories and NumPy arrays: import numpy, Image im = Image.open('lena.jpg') a = numpy.asarray(im) # a is readonly im = Image.fromarray(a) + Fixed CMYK polarity for JPEG images, by treating all images as "Adobe CMYK" images. (thanks to Cesare Leonardi and Kevin Cazabon for samples, debugging, and patches). (1.1.6b1 released) + Added 'expand' option to the Image 'rotate' method. If true, the output image is made large enough to hold the entire rotated image. + Changed the ImageDraw 'line' method to always draw the last pixel in a polyline, independent of line angle. + Fixed bearing calculation and clipping in the ImageFont truetype renderer; this could lead to clipped text, or crashes in the low- level _imagingft module. (based on input from Adam Twardoch and others). + Added ImageQt wrapper module, for converting PIL Image objects to QImage objects in an efficient way. + Fixed 'getmodebands' to return the number of bands also for "PA" and "LA" modes. Added 'getmodebandnames' helper that return the band names. (1.1.6a2 released) + Added float/double support to the TIFF loader (from Russell Nelson). + Fixed broken use of realloc() in path.c (from Jan Matejek) + Added save support for Spider images (from William Baxter). + Fixed broken 'paste' and 'resize' operations in pildriver (from Bill Janssen). + Added support for duplex scanning to the Sane interface (Abel Deuring). (1.1.6a1 released) + Fixed a memory leak in "convert(mode)", when converting from L to P. + Added pixel access object. The "load" method now returns a access object that can be used to directly get and set pixel values, using ordinary [x, y] notation: pixel = im.load() v = pixel[x, y] pixel[x, y] = v If you're accessing more than a few pixels, this is a lot faster than using getpixel/putpixel. + Fixed building on Cygwin (from Miki Tebeka). + Fixed "point(callable)" on unloaded images (reported by Håkan Karlsson). + Fixed size bug in ImageWin.ImageWindow constructor (from Victor Reijs) + Fixed ImageMath float() and int() operations for Python 2.4 (reported by Don Rozenberg). + Fixed "RuntimeError: encoder error -8 in tostring" problem for wide "RGB", "I", and "F" images. + Fixed line width calculation. (1.1.6a0 released) + Fixed byte order issue in Image.paste(ink) (from Ka-Ping Yee). + Fixed off-by-0.5 errors in the ANTIALIAS code (based on input from Douglas Bagnall). + Added buffer interface support to the Path constructor. If a buffer is provided, it is assumed to contain a flat array of float coordinates (e.g. array.array('f', seq)). + Added new ImageMath module. + Fixed ImageOps.equalize when used with a small number of distinct values (reported by David Kirtley). + Fixed potential integer division in PSDraw.image (from Eric Etheridge). *** Changes from release 1.1 to 1.1.5 *** (1.1.5c2 and 1.1.5 final released) + Added experimental PERSPECTIVE transform method (from Jeff Breiden- bach). (1.1.5c1 released) + Make sure "thumbnail" never generates zero-wide or zero-high images (reported by Gene Skonicki) + Fixed a "getcolors" bug that could result in a zero count for some colors (reported by Richard Oudkerk). + Changed default "convert" palette to avoid "rounding errors" when round-tripping white source pixels (reported by Henryk Gerlach and Jeff Epler). (1.1.5b3 released) + Don't crash in "quantize" method if the number of colors requested is larger than 256. This release raises a ValueError exception; future versions may return a mode "RGB" image instead (reported by Richard Oudkerk). + Added WBMP read/write support (based on code by Duncan Booth). (1.1.5b2 released) + Added DPI read/write support to the PNG codec. The decoder sets the info["dpi"] attribute for PNG files with appropriate resolution settings. The encoder uses the "dpi" option (based on code by Niki Spahiev). + Added limited support for "point" mappings from mode "I" to mode "L". Only 16-bit values are supported (other values are clipped), the lookup table must contain exactly 65536 entries, and the mode argument must be set to "L". + Added support for Mac OS X icns files (based on code by Bob Ippolito). + Added "ModeFilter" support to the ImageFilter module. + Added support for Spider images (from William Baxter). See the comments in PIL/SpiderImagePlugin.py for more information on this format. (1.1.5b1 released) + Added new Sane release (from Ralph Heinkel). See the Sane/README and Sane/CHANGES files for more information. + Added experimental PngInfo chunk container to the PngImageFile module. This can be used to add arbitrary chunks to a PNG file. Create a PngInfo instance, use "add" or "add_text" to add chunks, and pass the instance as the "pnginfo" option when saving the file. + Added "getpalette" method. This returns the palette as a list, or None if the image has no palette. To modify the palette, use "getpalette" to fetch the current palette, modify the list, and put it back using "putpalette". + Added optional flattening to the ImagePath "tolist" method. tolist() or tolist(0) returns a list of 2-tuples, as before. tolist(1) returns a flattened list instead. (1.1.5a5 released) + Fixed BILINEAR/BICUBIC/ANTIALIAS filtering for mode "LA". + Added "getcolors()" method. This is similar to the existing histo- gram method, but looks at color values instead of individual layers, and returns an unsorted list of (count, color) tuples. By default, the method returns None if finds more than 256 colors. If you need to look for more colors, you can pass in a limit (this is used to allocate internal tables, so you probably don't want to pass in too large values). + Build improvements: Fixed building under AIX, improved detection of FreeType2 and Mac OS X framework libraries, and more. Many thanks to everyone who helped test the new "setup.py" script! (1.1.5a4 released) + The "save" method now looks for a file format driver before creating the file. + Don't use antialiased truetype fonts when drawing in mode "P", "I", and "F" images. + Rewrote the "setup.py" file. The new version scans for available support libraries, and configures both the libImaging core library and the bindings in one step. To use specific versions of the libraries, edit the ROOT variables in the setup.py file. + Removed threaded "show" viewer; use the old "show" implementation instead (Windows). + Added deprecation warnings to Image.offset, ImageDraw.setink, and ImageDraw.setfill. + Added width option to ImageDraw.line(). The current implementation works best for straight lines; it does not support line joins, so polylines won't look good. + ImageDraw.Draw is now a factory function instead of a class. If you need to create custom draw classes, inherit from the ImageDraw class. All other code should use the factory function. + Fixed loading of certain PCX files (problem reported by Greg Hamilton, who also provided samples). + Changed _imagingft.c to require FreeType 2.1 or newer. The module can still be built with earlier versions; see comments in _imagingft.c for details. (1.1.5a3 released) + Added 'getim' method, which returns a PyCObject wrapping an Imaging pointer. The description string is set to IMAGING_MAGIC. See Imaging.h for pointer and string declarations. + Fixed reading of TIFF JPEG images (problem reported by Ulrik Svensson). + Made ImageColor work under Python 1.5.2 + Fixed division by zero "equalize" on very small images (from Douglas Bagnall). (1.1.5a2 released) + The "paste" method now supports the alternative "paste(im, mask)" syntax (in this case, the box defaults to im's bounding box). + The "ImageFile.Parser" class now works also for PNG files with more than one IDAT block. + Added DPI read/write to the TIFF codec, and fixed writing of rational values. The decoder sets the info["dpi"] attribute for TIFF files with appropriate resolution settings. The encoder uses the "dpi" option. + Disable interlacing for small (or narrow) GIF images, to work around what appears to be a hard-to-find bug in PIL's GIF encoder. + Fixed writing of mode "P" PDF images. Made mode "1" PDF images smaller. + Made the XBM reader a bit more robust; the file may now start with a few whitespace characters. + Added support for enhanced metafiles to the WMF driver. The separate PILWMF kit lets you render both placeable WMF files and EMF files as raster images. See http://effbot.org/downloads#pilwmf (1.1.5a1 released) + Replaced broken WMF driver with a WMF stub plugin (see below). + Fixed writing of mode "1", "L", and "CMYK" PDF images (based on input from Nicholas Riley and others). + Fixed adaptive palette conversion for zero-width or zero-height images (from Chris Cogdon) + Fixed reading of PNG images from QuickTime 6 (from Paul Pharr) + Added support for StubImageFile plugins, including stub plugins for BUFR, FITS, GRIB, and HDF5 files. A stub plugin can identify a given file format, but relies on application code to open and save files in that format. + Added optional "encoding" argument to the ImageFont.truetype factory. This argument can be used to specify non-Unicode character maps for fonts that support that. For example, to draw text using the Microsoft Symbol font, use: font = ImageFont.truetype("symbol.ttf", 16, encoding="symb") draw.text((0, 0), unichr(0xF000 + 0xAA)) (note that the symbol font uses characters in the 0xF000-0xF0FF range) Common encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. + Made "putalpha" a bit more robust; you can now attach an alpha layer to a plain "L" or "RGB" image, and you can also specify constant alphas instead of alpha layers (using integers or colour names). + Added experimental "LA" mode support. An "LA" image is an "L" image with an attached transparency layer. Note that support for "LA" is not complete; some operations may fail or produce unexpected results. + Added "RankFilter", "MinFilter", "MedianFilter", and "MaxFilter" classes to the ImageFilter module. + Improved support for applications using multiple threads; PIL now releases the global interpreter lock for many CPU-intensive operations (based on work by Kevin Cazabon). + Ignore Unicode characters in the PCF loader (from Andres Polit) + Fixed typo in OleFileIO.loadfat, which could affect loading of FlashPix and Image Composer images (Daniel Haertle) + Fixed building on platforms that have Freetype but don't have Tcl/Tk (Jack Jansen, Luciano Nocera, Piet van Oostrum and others) + Added EXIF GPSInfo read support for JPEG files. To extract GPSInfo information, open the file, extract the exif dictionary, and check for the key 0x8825 (GPSInfo). If present, it contains a dictionary mapping GPS keys to GPS values. For a list of keys, see the EXIF specification. The "ExifTags" module contains a GPSTAGS dictionary mapping GPS tags to tag names. + Added DPI read support to the PCX and DCX codecs (info["dpi"]). + The "show" methods now uses a built-in image viewer on Windows. This viewer creates an instance of the ImageWindow class (see below) and keeps it running in a separate thread. NOTE: This was disabled in 1.1.5a4. + Added experimental "Window" and "ImageWindow" classes to the ImageWin module. These classes allow you to create a WCK-style toplevel window, and use it to display raster data. + Fixed some Python 1.5.2 issues (to build under 1.5.2, use the Makefile.pre.in/Setup.in approach) + Added support for the TIFF FillOrder tag. PIL can read mode "1", "L", "P" and "RGB" images with non-standard FillOrder (based on input from Jeff Breidenbach). (1.1.4 final released) + Fixed ImageTk build problem on Unix. (1.1.4b2 released) + Improved building on Mac OS X (from Jack Jansen). + Improved building on Windows with MinGW (from Klamer Shutte). + If no font is specified, ImageDraw now uses the embedded default font. Use the "load" or "truetype" methods to load a real font. + Added embedded default font to the ImageFont module (currently an 8-pixel Courier font, taken from the X window distribution). (1.1.4b1 released) + Added experimental EXIF support for JPEG files. To extract EXIF information from a JPEG file, open the file as usual, and call the "_getexif" method. If successful, this method returns a dictionary mapping EXIF TIFF tags to values. If the file does not contain EXIF data, the "_getexif" method returns None. The "ExifTags" module contains a dictionary mapping tags to tag names. This interface will most likely change in future versions. + Fixed a bug when using the "transparency" option with the GIF writer. + Added limited support for "bitfield compression" in BMP files and DIB buffers, for 15-bit, 16-bit, and 32-bit images. This also fixes a problem with ImageGrab module when copying screen- dumps from the clipboard on 15/16/32-bit displays. + Added experimental WAL (Quake 2 textures) loader. To use this loader, import WalImageFile and call the "open" method in that module. (1.1.4a4 released) + Added updated SANE driver (Andrew Kuchling, Abel Deuring) + Use Python's "mmap" module on non-Windows platforms to read some uncompressed formats using memory mapping. Also added a "frombuffer" function that allows you to access the contents of an existing string or buffer object as if it were an image object. + Fixed a memory leak that could appear when processing mode "P" images (from Pier Paolo Glave) + Ignore Unicode characters in the BDF loader (from Graham Dumpleton) (1.1.4a3 released; windows only) + Added experimental RGBA-on-RGB drawing support. To use RGBA colours on an RGB image, pass "RGBA" as the second string to the ImageDraw.Draw constructor. + Added support for non-ASCII strings (Latin-1) and Unicode to the truetype font renderer. + The ImageWin "Dib" object can now be constructed directly from an image object. + The ImageWin module now allows you use window handles as well as device contexts. To use a window handle, wrap the handle in an ImageWin.HWND object, and pass in this object instead of the device context. (1.1.4a2 released) + Improved support for 16-bit unsigned integer images (mode "I;16"). This includes TIFF reader support, and support for "getextrema" and "point" (from Klamer Shutte). + Made the BdfFontFile reader a bit more robust (from Kevin Cazabon and Dmitry Vasiliev) + Changed TIFF writer to always write Compression tag, even when using the default compression (from Greg Couch). + Added "show" support for Mac OS X (from Dan Wolfe). + Added clipboard support to the "ImageGrab" module (Windows only). The "grabclipboard" function returns an Image object, a list of filenames (not in 1.1.4), or None if neither was found. (1.1.4a1 released) + Improved support for drawing RGB data in palette images. You can now use RGB tuples or colour names (see below) when drawing in a mode "P" image. The drawing layer automatically assigns color indexes, as long as you don't use more than 256 unique colours. + Moved self test from MiniTest/test.py to ./selftest.py. + Added support for CSS3-style color strings to most places that accept colour codes/tuples. This includes the "ImageDraw" module, the Image "new" function, and the Image "paste" method. Colour strings can use one of the following formats: "#f00", "#ff0000", "rgb(255,0,0)", "rgb(100%,0%,0%)", "hsl(0, 100%, 50%)", or "red" (most X11-style colour names are supported). See the documentation for the "ImageColor" module for more information. + Fixed DCX decoder (based on input from Larry Bates) + Added "IptcImagePlugin.getiptcinfo" helper to extract IPTC/NAA newsphoto properties from JPEG, TIFF, or IPTC files. + Support for TrueType/OpenType fonts has been added to the standard distribution. You need the freetype 2.0 library. + Made the PCX reader a bit more robust when reading 2-bit and 4-bit PCX images with odd image sizes. + Added "Kernel" class to the ImageFilter module. This class allows you to filter images with user-defined 3x3 and 5x5 convolution kernels. + Added "putdata" support for mode "I", "F" and "RGB". + The GIF writer now supports the transparency option (from Denis Benoit). + A HTML version of the module documentation is now shipped with the source code distribution. You'll find the files in the Doc subdirectory. + Added support for Palm pixmaps (from Bill Janssen). This change was listed for 1.1.3, but the "PalmImagePlugin" driver didn't make it into the distribution. + Improved decoder error messages. (1.1.3 final released) + Made setup.py look for old versions of zlib. For some back- ground, see: http://www.gzip.org/zlib/advisory-2002-03-11.txt (1.1.3c2 released) + Added setup.py file (tested on Unix and Windows). You still need to build libImaging/imaging.lib in the traditional way, but the setup.py script takes care of the rest. The old Setup.in/Makefile.pre.in build method is still supported. + Fixed segmentation violation in ANTIALIAS filter (an internal buffer wasn't properly allocated). (1.1.3c1 released) + Added ANTIALIAS downsampling filter for high-quality "resize" and "thumbnail" operations. Also added filter option to the "thumbnail" operation; the default value is NEAREST, but this will most likely change in future versions. + Fixed plugin loader to be more robust if the __file__ variable isn't set. + Added seek/tell support (for layers) to the PhotoShop loader. Layer 0 is the main image. + Added new (but experimental) "ImageOps" module, which provides shortcuts for commonly used operations on entire images. + Don't mess up when loading PNG images if the decoder leaves data in the output buffer. This could cause internal errors on some PNG images, with some versions of ZLIB. (Bug report and patch provided by Bernhard Herzog.) + Don't mess up on Unicode filenames. + Don't mess up when drawing on big endian platforms. + Made the TIFF loader a bit more robust; it can now read some more slightly broken TIFF files (based on input from Ted Wright, Bob Klimek, and D. Alan Stewart) + Added OS/2 EMX build files (from Andrew MacIntyre) + Change "ImageFont" to reject image files if they don't have the right mode. Older versions could leak memory for "P" images. (Bug reported by Markus Gritsch). + Renamed some internal functions to avoid potential build problem on Mac OS X. + Added DL_EXPORT where relevant (for Cygwin, based on input from Robert Yodlowski) + (re)moved bogus __init__ call in BdfFontFile (bug spotted by Fred Clare) + Added "ImageGrab" support (Windows only) + Added support for XBM hotspots (based on code contributed by Bernhard Herzog). + Added write support for more TIFF tags, namely the Artist, Copyright, DateTime, ResolutionUnit, Software, XResolution and YResolution tags (from Greg Couch) + Added TransposedFont wrapper to ImageFont module + Added "optimize" flag to GIF encoder. If optimize is present and non-zero, PIL will work harder to create a small file. + Raise "EOFError" (not IndexError) when reading beyond the end of a TIFF sequence. + Support rewind ("seek(0)") for GIF and TIFF sequences. + Load grayscale GIF images as mode "L" + Added DPI read/write support to the JPEG codec. The decoder sets the info["dpi"] attribute for JPEG files with JFIF dpi settings. The encoder uses the "dpi" option: im = Image.open("file.jpg") dpi = im.info["dpi"] # raises KeyError if DPI not known im.save("out.jpg", dpi=dpi) Note that PIL doesn't always preserve the "info" attribute for normal image operations. (1.1.2c1 and 1.1.2 final released) + Adapted to Python 2.1. Among other things, all uses of the "regex" module has been repleased with "re". + Fixed attribute error when reading large PNG files (this bug was introduced in maintenance code released after the 1.1.1 release) + Ignore non-string objects in sys.path + Fixed Image.transform(EXTENT) for negative xoffsets + Fixed loading of image plugins if PIL is installed as a package. (The plugin loader now always looks in the directory where the Image.py module itself is found, even if that directory isn't on the standard search path) + The Png plugin has been added to the list of preloaded standard formats + Fixed bitmap/text drawing in fill mode. + Fixed "getextrema" to work also for multiband images. + Added transparency support for L and P images to the PNG codec. + Improved support for read-only images. The "load" method now sets the "readonly" attribute for memory-mapped images. Operations that modifies an image in place (such as "paste" and drawing operations) creates an in-memory copy of the image, if necessary. (before this change, any attempt to modify a memory-mapped image resulted in a core dump...) + Added special cases for lists everywhere PIL expects a sequence. This should speed up things like "putdata" and drawing operations. + The Image.offset method is deprecated. Use the ImageChops.offset function instead. + Changed ImageChops operators to copy palette and info dictionary from the first image argument. (1.1.1 released) + Additional fixes for Python 1.6/2.0, including TIFF "save" bug. + Changed "init" to properly load plugins when PIL is used as a package. + Fixed broken "show" method (on Unix) *** Changes from release 1.0 to 1.1 *** + Adapted to Python 1.6 ("append" and other method changes) + Fixed Image.paste when pasting with solid colour and matte layers ("L" or "RGBA" masks) (bug reported by Robert Kern) + To make it easier to distribute prebuilt versions of PIL, the tkinit binding stuff has been moved to a separate extension module, named "_imagingtk". *** Changes from release 0.3b2 to 1.0 final *** + If there's no 16-bit integer (like on a Cray T3E), set INT16 to the smallest integer available. Most of the library works just fine anyway (from Bill Crutchfield) + Tweaks to make drawing work on big-endian platforms. (1.0c2 released) + If PIL is built with the WITH_TKINTER flag, ImageTk can automatically hook into a standard Tkinter build. You no longer need to build your own Tkinter to use the ImageTk module. The old way still works, though. For more information, see Tk/install.txt. + Some tweaks to ImageTk to support multiple Tk interpreters (from Greg Couch). + ImageFont "load_path" now scans directory mentioned in .pth files (from Richard Jones). (1.0c1 released) + The TIFF plugin has been rewritten. The new plugin fully supports all major PIL image modes (including F and I). + The ImageFile module now includes a Parser class, which can be used to incrementally decode an image file (while down- loading it from the net, for example). See the handbook for details. + "show" now converts non-standard modes to "L" or "RGB" (as appropriate), rather than writing weird things to disk for "xv" to choke upon. (bug reported by Les Schaffer). (1.0b2 released) + Major speedups for rotate, transform(EXTENT), and transform(AFFINE) when using nearest neighbour resampling. + Modified ImageDraw to be compatible with the Arrow graphics interface. See the handbook for details. + PIL now automatically loads file codecs when used as a package (from The Dragon De Monsyne). Also included an __init__.py file in the standard distribution. + The GIF encoder has been modified to produce much smaller files. PIL now uses a run-length encoding method to encode GIF files. On a random selection of GIF images grabbed from the web, this version makes the images about twice as large as the original LZW files, where the earlier version made them over 5 times larger. YMMV, of course. + Added PCX write support (works with "1", "P", "L", and "RGB") + Added "bitmap" and "textsize" methods to ImageDraw. + Improved font rendering code. Fixed a bug or two, and moved most of the time critical stuff to C. + Removed "bdf2pil.py". Use "pilfont.py" instead! + Improved 16-bit support (still experimental, though). The following methods now support "I;16" and "I;16B" images: "getpixel", "copy", "convert" (to and from mode "I"), "resize", "rotate", and "transform" with nearest neighbour filters, and "save" using the IM format. The "new" and "open" functions also work as expected. On Windows, 16-bit files are memory mapped. NOTE: ALL other operations are still UNDEFINED on 16-bit images. + The "paste" method now supports constant sources. Just pass a colour value (a number or a tuple, depending on the target image mode) instead of the source image. This was in fact implemented in an inefficient way in earlier versions (the "paste" method generated a temporary source image if you passed it a colour instead of an image). In this version, this is handled on the C level instead. + Added experimental "RGBa" mode support. An "RGBa" image is an RGBA image where the colour components have have been premultipled with the alpha value. PIL allows you to convert an RGBA image to an RGBa image, and to paste RGBa images on top of RGB images. Since this saves a bunch of multiplications and shifts, it is typically about twice as fast an ordinary RGBA paste. + Eliminated extra conversion step when pasting "RGBA" or "RGBa" images on top of "RGB" images. + Fixed Image.BICUBIC resampling for "RGB" images. + Fixed PCX image file handler to properly read 8-bit PCX files (bug introduced in 1.0b1, reported by Bernhard Herzog) + Fixed PSDraw "image" method to restore the coordinate system. + Fixed "blend" problem when applied to images that was not already loaded (reported by Edward C. Jones) + Fixed -f option to "pilconvert.py" (from Anthony Baxter) (1.0b1 released) + Added Toby J. Sargeant's quantization package. To enable quantization, use the "palette" option to "convert": imOut = im.convert("P", palette=Image.ADAPTIVE) This can be used with "L", "P", and "RGB" images. In this version, dithering cannot be used with adaptive palettes. Note: ADAPTIVE currently maps to median cut quantization with 256 colours. The quantization package also contains a maximum coverage quantizer, which will be supported by future versions of PIL. + Added Eric S. Raymond's "pildriver" image calculator to the distribution. See the docstring for more information. + The "offset" method no longer dumps core if given positive offsets (from Charles Waldman). + Fixed a resource leak that could cause ImageWin to run out of GDI resources (from Roger Burnham). + Added "arc", "chord", and "pieslice" methods to ImageDraw (inspired by code contributed by Richard Jones). + Added experimental 16-bit support, via modes "I;16" (little endian data) and "I;16B" (big endian). Only a few methods properly support such images (see above). + Added XV thumbnail file handler (from Gene Cash). + Fixed BMP image file handler to handle palette images with small palettes (from Rob Hooft). + Fixed Sun raster file handler for palette images (from Charles Waldman). + Improved various internal error messages. + Fixed Path constructor to handle arbitrary sequence objects. This also affects the ImageDraw class (from Richard Jones). + Fixed a bug in JpegDecode that caused PIL to report "decoder error -2" for some progressive JPEG files (reported by Magnus Källström, who also provided samples). + Fixed a bug in JpegImagePlugin that caused PIL to hang when loading JPEG files using 16-bit quantization tables. + The Image "transform" method now supports Image.QUAD transforms. The data argument is an 8-tuple giving the upper left, lower left, lower right, and upper right corner of the source quadri- lateral. Also added Image.MESH transform which takes a list of quadrilaterals. + The Image "resize", "rotate", and "transform" methods now support Image.BILINEAR (2x2) and Image.BICUBIC (4x4) resampling filters. Filters can be used with all transform methods. + The ImageDraw "rectangle" method now includes both the right and the bottom edges when drawing filled rectangles. + The TGA decoder now works properly for runlength encoded images which have more than one byte per pixel. + "getbands" on an YCbCr image now returns ("Y", "Cb", "Cr") + Some file drivers didn't handle the optional "modify" argument to the load method. This resulted in exceptions when you used "paste" (and other methods that modify an image in place) on a newly opened file. *** Changes from release 0.2 (b5) to 0.3 (b2) *** (0.3b2 released) The test suite includes 825 individual tests. + An Image "getbands" method has been added. It returns a tuple containing the individual band names for this image. To figure out how many bands an image has, use "len(im.getbands())". + An Image "putpixel" method has been added. + The Image "point" method can now be used to convert "L" images to any other format, via a lookup table. That table should contain 256 values for each band in the output image. + Some file drivers (including FLI/FLC, GIF, and IM) accidently overwrote the offset method with an internal attribute. All drivers have been updated to use private attributes where possible. + The Image "histogram" method now works for "I" and "F" images. For these modes, PIL divides the range between the min and max values used in the image into 256 bins. You can also pass in your own min and max values via the "extrema" option: h = im.histogram(extrema=(0, 255)) + An Image "getextrema" method has been added. It returns the min and max values used in the image. In this release, this works for single band images only. + Changed the PNG driver to load and save mode "I" images as 16-bit images. When saving, values outside the range 0..65535 are clipped. + Fixed ImageFont.py to work with the new "pilfont" compiler. + Added JPEG "save" and "draft" support for mode "YCbCr" images. Note that if you save an "YCbCr" image as a JPEG file and read it back, it is read as an RGB file. To get around this, you can use the "draft" method: im = Image.open("color.jpg") im.draft("YCbCr", im.size) + Read "RGBA" TGA images. Also fixed the orientation bug; all images should now come out the right way. + Changed mode name (and internal representation) from "YCrCb" to "YCbCr" (!) *** WARNING: MAY BREAK EXISTING CODE *** (0.3b1 released) The test suite includes 750 individual tests. + The "pilfont" package is now included in the standard PIL distribution. The pilfont utility can be used to convert X BDF and PCF raster font files to a format understood by the ImageFont module. + GIF files are now interlaced by default. To write a non-interlaced file, pass interlace=0 to the "save" method. + The default string format has changed for the "fromstring" and "tostring" methods. *** WARNING: MAY BREAK EXISTING CODE *** NOTE: If no extra arguments are given, the first line in the string buffer is the top line of the image, instead of the bottom line. For RGB images, the string now contains 3 bytes per pixel instead of 4. These changes were made to make the methods compatible with the "fromstring" factory function. To get the old behaviour, use the following syntax: data = im.tostring("raw", "RGBX", 0, -1) im.fromstring(data, "raw", "RGBX", 0, -1) + "new" no longer gives a MemoryError if the width or height is zero (this only happened on platforms where malloc(0) or calloc(0) returns NULL). + "new" now adds a default palette object to "P" images. + You can now convert directly between all modes supported by PIL. When converting colour images to "P", PIL defaults to a "web" palette and dithering. When converting greyscale images to "1", PIL uses a thresholding and dithering. + Added a "dither" option to "convert". By default, "convert" uses floyd-steinberg error diffusion for "P" and "1" targets, so this option is only used to *disable* dithering. Allowed values are NONE (no dithering) or FLOYDSTEINBERG (default). imOut = im.convert("P", dither=Image.NONE) + Added a full set of "I" decoders. You can use "fromstring" (and file decoders) to read any standard integer type as an "I" image. + Added some support for "YCbCr" images (creation, conversion from/to "L" and "RGB", IM YCC load/save) + "getpixel" now works properly with fractional coordinates. + ImageDraw "setink" now works with "I", "F", "RGB", "RGBA", "RGBX", "CMYK", and "YCbCr" images. + ImImagePlugin no longer attaches palettes to "RGB" images. + Various minor fixes. (0.3a4 released) + Added experimental IPTC/NAA support. + Eliminated AttributeError exceptions after "crop" (from Skip Montanaro) + Reads some uncompressed formats via memory mapping (this is currently supported on Win32 only) + Fixed some last minute glitches in the last alpha release (Types instead of types in Image.py, version numbers, etc.) + Eliminated some more bogus compiler warnings. + Various fixes to make PIL compile and run smoother on Macs (from Jack Jansen). + Fixed "fromstring" and "tostring" for mode "I" images. (0.3a3 released) The test suite includes 530 individual tests. + Eliminated unexpected side-effect in "paste" with matte. "paste" now works properly also if compiled with "gcc". + Adapted to Python 1.5 (build issues only) + Fixed the ImageDraw "point" method to draw also the last point (!). + Added "I" and "RGBX" support to Image.new. + The plugin path is now properly prepended to the module search path when a plugin module is imported. + Added "draw" method to the ImageWin.Dib class. This is used by Topaz to print images on Windows printers. + "convert" now supports conversions from "P" to "1" and "F". + "paste" can now take a colour instead of an image as the first argument. The colour must match the colour argument given to the new function, and match the mode of the target image. + Fixed "paste" to allow a mask also for mode "F" images. + The BMP driver now saves mode "1" images. When loading images, the mode is set to "L" for 8-bit files with greyscale palettes, and to "P" for other 8-bit files. + The IM driver now reads and saves "1" images (file modes "0 1" or "L 1"). + The JPEG and GIF drivers now saves "1" images. For JPEG, the image is saved as 8-bit greyscale (it will load as mode "L"). For GIF, the image will be loaded as a "P" image. + Fixed a potential buffer overrun in the GIF encoder. (0.3a2 released) The test suite includes 400 individual tests. + Improvements to the test suite revealed a number of minor bugs, which are all fixed. Note that crop/paste, 32-bit ImageDraw, and ImageFont are still weak spots in this release. + Added "putpalette" method to the Image class. You can use this to add or modify the palette for "P" and "L" images. If a palette is added to an "L" image, it is automatically converted to a "P" image. + Fixed ImageDraw to properly handle 32-bit image memories ("RGB", "RGBA", "CMYK", "F") + Fixed "fromstring" and "tostring" not to mess up the mode attribute in default mode. + Changed ImPlatform.h to work on CRAY's (don't have one at home, so I haven't tried it). The previous version assumed that either "short" or "int" were 16-bit wide. PIL still won't compile on platforms where neither "short", "int" nor "long" are 32-bit wide. + Added file= and data= keyword arguments to PhotoImage and BitmapImage. This allows you to use them as drop-in replacements for the corre- sponding Tkinter classes. + Removed bogus references to the crack coder (ImagingCrack). (0.3a1 released) + Make sure image is loaded in "tostring". + Added floating point packer (native 32-bit floats only). *** Changes from release 0.1b1 to 0.2 (b5) *** + Modified "fromstring" and "tostring" methods to use file codecs. Also added "fromstring" factory method to create an image directly from data in a string. + Added support for 32-bit floating point images (mode "F"). You can convert between "L" and "F" images, and apply a subset of the available image processing methods on the "F" image. You can also read virtually any data format into a floating point image memory; see the section on "Decoding Floating Point Data" in the handbook for more information. (0.2b5 released; on windows only) + Fixed the tobitmap() method to work properly for small bitmaps. + Added RMS and standard deviation to the ImageStat.Stat class. Also modified the constructor to take an optional feature mask, and also to accept either an image or a list containing the histogram data. + The BitmapImage code in ImageTk can now use a special bitmap decoder, which has to be patched into Tk. See the "Tk/pilbitmap.txt" file for details. If not installed, bitmaps are transferred to Tk as XBM strings. + The PhotoImage code in ImageTk now uses a Tcl command ("PyImagingPaste") instead of a special image type. This gives somewhat better performance, and also allows PIL to support transparency. *** WARNING: TKAPPINIT MUST BE MODIFIED *** + ImageTk now honours the alpha layer in RGBA images. Only fully transparent pixels are made transparent (that is, the alpha layer is treated as a mask). To treat the alpha laters as a matte, you must paste the image on the background before handing it over to ImageTk. + Added McIdas reader (supports 8-bit images only). + PIL now preloads drivers for BMP, GIF, JPEG, PPM, and TIFF. As long as you only load and save these formats, you don't have to wait for a full scan for drivers. To force scanning, call the Image.init() function. + The "seek" and "tell" methods are now always available, also for single-frame images. + Added optional mask argument to histogram method. The mask may be an "1" or "L" image with the same size as the original image. Only pixels where the mask is non-zero are included in the histogram. + The "paste" method now allows you to specify only the lower left corner (a 2-tuple), instead of the full region (a 4-tuple). + Reverted to old plugin scanning model; now scans all directory names in the path when looking for plugins. + Added PIXAR raster support. Only uncompressed ("dumped") RGB images can currently be read (based on information provided by Greg Coats). + Added FlashPix (FPX) read support. Reads all pixel formats, but only the highest resolution is read, and the viewing transform is currently ignored. + Made PNG encoding somewhat more efficient in "optimize" mode; a bug in 0.2b4 didn't enable all predictor filters when optimized storage were requested. + Added Microsoft Image Composer (MIC) read support. When opened, the first sprite in the file is loaded. You can use the seek method to load additional sprites from the file. + Properly reads "P" and "CMYK" PSD images. + "pilconvert" no longer optimizes by default; use the -o option to make the file as small as possible (at the expense of speed); use the -q option to set the quality when compressing to JPEG. + Fixed "crop" not to drop the palette for "P" images. + Added and verified FLC support. + Paste with "L" or "RGBA" alpha is now several times faster on most platforms. + Changed Image.new() to initialize the image to black, as described in the handbook. To get an uninitialized image, use None as the colour. + Fixed the PDF encoder to produce a valid header; Acrobat no longer complains when you load PDF images created by PIL. + PIL only scans fully-qualified directory names in the path when looking for plugins. *** WARNING: MAY BREAK EXISTING CODE *** + Faster implementation of "save" used when filename is given, or when file object has "fileno" and "flush" methods. + Don't crash in "crop" if region extends outside the source image. + Eliminated a massive memory leak in the "save" function. + The GIF decoder doesn't crash if the code size is set to an illegal value. This could happen since another bug didn't handle local palettes properly if they didn't have the same size as the global palette (not very common). + Added predictor support (TIFF 6.0 section 14) to the TIFF decoder. + Fixed palette and padding problems in BMP driver. Now properly writes "1", "L", "P" and "RGB" images. + Fixed getpixel()/getdata() to return correct pixel values. + Added PSD (PhotoShop) read support. Reads both uncompressed and compressed images of most types. + Added GIF write support (writes "uncompressed" GIF files only, due to unresolvable licensing issues). The "gifmaker.py" script can be used to create GIF animations. + Reads 8-bit "L" and "P" TGA images. Also reads 16-bit "RGB" images. + Added FLI read support. This driver has only been tested on a few FLI samples. + Reads 2-bit and 4-bit PCX images. + Added MSP read and write support. Both version 1 and 2 can be read, but only version 1 (uncompressed) files are written. + Fixed a bug in the FLI/FLC identification code that caused the driver to raise an exception when parsing valid FLI/FLC files. + Improved performance when loading file format plugins, and when opening files. + Added GIF animation support, via the "seek" and "tell" methods. You can use "player.py" to play an animated GIF file. + Removed MNG support, since the spec is changing faster than I can change the code. I've added support for the experimental ARG format instead. Contact me for more information on this format. + Added keyword options to the "save" method. The following options are currently supported: format option description -------------------------------------------------------- JPEG optimize minimize output file at the expense of compression speed. JPEG progressive enable progressive output. the option value is ignored. JPEG quality set compression quality (1-100). the default value is 75. JPEG smooth smooth dithered images. value is strengh (1-100). default is off (0). PNG optimize minimize output file at the expense of compression speed. Expect more options in future releases. Also note that file writers silently ignore unknown options. + Plugged memory leaks in the PNG and TIFF decoders. + Added PNG write support. + (internal) RGB unpackers and converters now set the pad byte to 255 (full opacity). + Properly handles the "transparency" property for GIF, PNG and XPM files. + Added a "putalpha" method, allowing you to attach a "1" or "L" image as the alpha layer to an "RGBA" image. + Various improvements to the sample scripts: "pilconvert" Carries out some extra tricks in order to make the resulting file as small as possible. "explode" (NEW) Split an image sequence into individual frames. "gifmaker" (NEW) Convert a sequence file into a GIF animation. Note that the GIF encoder create "uncompressed" GIF files, so animations created by this script are rather large (typically 2-5 times the compressed sizes). "image2py" (NEW) Convert a single image to a python module. See comments in this script for details. "player" If multiple images are given on the command line, they are interpreted as frames in a sequence. The script assumes that they all have the same size. Also note that this script now can play FLI/FLC and GIF animations. This player can also execute embedded Python animation applets (ARG format only). "viewer" Transparent images ("P" with transparency property, and "RGBA") are superimposed on the standard Tk back- ground. + Fixed colour argument to "new". For multilayer images, pass a tuple: (Red, Green, Blue), (Red, Green, Blue, Alpha), or (Cyan, Magenta, Yellow, Black). + Added XPM (X pixmap) read support. (0.2b3 released) + Added MNG (multi-image network graphics) read support. "Ming" is a proposed animation standard, based on the PNG file format. You can use the "player" sample script to display some flavours of this format. The MNG standard is still under development, as is this driver. More information, including sample files, can be found at + Added a "verify" method to images loaded from file. This method scans the file for errors, without actually decoding the image data, and raises a suitable exception if it finds any problems. Currently implemented for PNG and MNG files only. + Added support for interlaced GIF images. + Added PNG read support -- if linked with the ZLIB compression library, PIL reads all kinds of PNG images, except interlaced files. + Improved PNG identification support -- doesn't mess up on unknown chunks, identifies all possible PNG modes, and verifies checksum on PNG header chunks. + Added an experimental reader for placable Windows Meta Files (WMF). This reader is still very incomplete, but it illustrates how PIL's drawing capabilities can be used to render vector and metafile formats. + Added restricted drivers for images from Image Tools (greyscale only) and LabEye/IFUNC (common interchange modes only). + Some minor improvements to the sample scripts provided in the "Scripts" directory. + The test images have been moved to the "Images" directory. (0.2b2 released) (0.2b1 released; Windows only) + Fixed filling of complex polygons. The ImageDraw "line" and "polygon" methods also accept Path objects. + The ImageTk "PhotoImage" object can now be constructed directly from an image. You can also pass the object itself to Tkinter, instead of using the "image" attribute. Finally, using "paste" on a displayed image automatically updates the display. + The ImageTk "BitmapImage" object allows you to create transparent overlays from 1-bit images. You can pass the object itself to Tkinter. The constructor takes the same arguments as the Tkinter BitmapImage class; use the "foreground" option to set the colour of the overlay. + Added a "putdata" method to the Image class. This can be used to load a 1-layer image with data from a sequence object or a string. An optional floating point scale and offset can be used to adjust the data to fit into the 8-bit pixel range. Also see the "getdata" method. + Added the EXTENT method to the Image "transform" method. This can be used to quickly crop, stretch, shrink, or mirror a subregion from another image. + Adapted to Python 1.4. + Added a project makefile for Visual C++ 4.x. This allows you to easily build a dynamically linked version of PIL for Windows 95 and NT. + A Tk "booster" patch for Windows is available. It gives dramatic performance improvements for some displays. Has been tested with Tk 4.2 only, but is likely to work with Tk 4.1 as well. See the Tk subdirectory for details. + You can now save 1-bit images in the XBM format. In addition, the Image class now provides a "tobitmap" method which returns a string containing an XBM representation of the image. Quite handy to use with Tk. + More conversions, including "RGB" to "1" and more. (0.2a1 released) + Where earlier versions accepted lists, this version accepts arbitrary Python sequences (including strings, in some cases). A few resource leaks were plugged in the process. + The Image "paste" method now allows the box to extend outside the target image. The size of the box, the image to be pasted, and the optional mask must still match. + The ImageDraw module now supports filled polygons, outlined and filled ellipses, and text. Font support is rudimentary, though. + The Image "point" method now takes an optional mode argument, allowing you to convert the image while translating it. Currently, this can only be used to convert "L" or "P" images to "1" images (creating thresholded images or "matte" masks). + An Image "getpixel" method has been added. For single band images, it returns the pixel value at a given position as an integer. For n-band images, it returns an n-tuple of integers. + An Image "getdata" method has been added. It returns a sequence object representing the image as a 1-dimensional array. Only len() and [] can be used with this sequence. This method returns a reference to the existing image data, so changes in the image will be immediately reflected in the sequence object. + Fixed alignment problems in the Windows BMP writer. + If converting an "RGB" image to "RGB" or "L", you can give a second argument containing a colour conversion matrix. + An Image "getbbox" method has been added. It returns the bounding box of data in an image, considering the value 0 as background. + An Image "offset" method has been added. It returns a new image where the contents of the image have been offset the given distance in X and/or Y direction. Data wraps between edges. + Saves PDF images. The driver creates a binary PDF 1.1 files, using JPEG compression for "L", "RGB", and "CMYK" images, and hex encoding (same as for PostScript) for other formats. + The "paste" method now accepts "1" masks. Zero means transparent, any other pixel value means opaque. This is faster than using an "L" transparency mask. + Properly writes EPS files (and properly prints images to postscript printers as well). + Reads 4-bit BMP files, as well as 4 and 8-bit Windows ICO and CUR files. Cursor animations are not supported. + Fixed alignment problems in the Sun raster loader. + Added "draft" and "thumbnail" methods. The draft method is used to optimize loading of JPEG and PCD files, the thumbnail method is used to create a thumbnail representation of an image. + Added Windows display support, via the ImageWin class (see the handbook for details). + Added raster conversion for EPS files. This requires GNU or Aladdin Ghostscript, and probably works on UNIX only. + Reads PhotoCD (PCD) images. The base resolution (768x512) can be read from a PhotoCD file. + Eliminated some compiler warnings. Bindings now compile cleanly in C++ mode. Note that the Imaging library itself must be compiled in C mode. + Added "bdf2pil.py", which converts BDF fonts into images with associated metrics. This is definitely work in progress. For info, see description in script for details. + Fixed a bug in the "ImageEnhance.py" module. + Fixed a bug in the netpbm save hack in "GifImagePlugin.py" + Fixed 90 and 270 degree rotation of rectangular images. + Properly reads 8-bit TIFF palette-color images. + Reads plane separated RGB and CMYK TIFF images. + Added driver debug mode. This is enabled by setting Image.DEBUG to a non-zero value. Try the -D option to "pilfile.py" and see what happens. + Don't crash on "atend" constructs in PostScript files. + Only the Image module imports _imaging directly. Other modules should refer to the binding module as "Image.core". *** Changes from release 0.0 to 0.1 (b1) *** + A handbook is available (distributed separately). + The coordinate system is changed so that (0,0) is now located in the upper left corner. This is in compliancy with ISO 12087 and 90% of all other image processing and graphics libraries. + Modes "1" (bilevel) and "P" (palette) have been introduced. Note that bilevel images are stored with one byte per pixel. + The Image "crop" and "paste" methods now accepts None as the box argument, to refer to the full image (self, that is). + The Image "crop" method now works properly. + The Image "point" method is now available. You can use either a lookup table or a function taking one argument. + The Image join function has been renamed to "merge". + An Image "composite" function has been added. It is identical to copy() followed by paste(mask). + An Image "eval" function has been added. It is currently identical to point(function); that is, only a single image can be processed. + A set of channel operations has been added. See the "ImageChops" module, test_chops.py, and the handbook for details. + Added the "pilconvert" utility, which converts image files. Note that the number of output formats are still quite restricted. + Added the "pilfile" utility, which quickly identifies image files (without loading them, in most cases). + Added the "pilprint" utility, which prints image files to Postscript printers. + Added a rudimentary version of the "pilview" utility, which is simple image viewer based on Tk. Only File/Exit and Image/Next works properly. + An interface to Tk has been added. See "Lib/ImageTk.py" and README for details. + An interface to Jack Jansen's Img library has been added (thanks to Jack). This allows you to read images through the Img extensions file format handlers. See the file "Lib/ImgExtImagePlugin.py" for details. + Postscript printing is provided through the PSDraw module. See the handbook for details. Keywords: Imaging Platform: UNKNOWN Classifier: Development Status :: 6 - Mature Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera Classifier: Topic :: Multimedia :: Graphics :: Capture :: Scanners Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion Classifier: Topic :: Multimedia :: Graphics :: Viewers Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 pillow-2.3.0/Pillow.egg-info/0000755000175000001440000000000012274164154014643 5ustar dokouserspillow-2.3.0/Pillow.egg-info/top_level.txt0000644000175000001440000000000412261041654017362 0ustar dokousersPIL pillow-2.3.0/Pillow.egg-info/SOURCES.txt0000644000175000001440000002272712261041654016534 0ustar dokousers.gitattributes .travis.yml CHANGES.rst MANIFEST.in Makefile README.rst _imaging.c _imagingcms.c _imagingft.c _imagingmath.c _imagingtk.c _webp.c decode.c display.c encode.c map.c outline.c path.c py3.h selftest.py setup.py tox.ini Images/courB08.bdf Images/courB08.pbm Images/courB08.pil Images/flower.webp Images/flower2.webp Images/lena.fli Images/lena.gif Images/lena.ico Images/lena.jpg Images/lena.png Images/lena.ppm Images/lena.psd Images/lena.tar Images/lena.webp Images/lena.xpm Images/transparent.png Images/transparent.webp PIL/ArgImagePlugin.py PIL/BdfFontFile.py PIL/BmpImagePlugin.py PIL/BufrStubImagePlugin.py PIL/ContainerIO.py PIL/CurImagePlugin.py PIL/DcxImagePlugin.py PIL/EpsImagePlugin.py PIL/ExifTags.py PIL/FitsStubImagePlugin.py PIL/FliImagePlugin.py PIL/FontFile.py PIL/FpxImagePlugin.py PIL/GbrImagePlugin.py PIL/GdImageFile.py PIL/GifImagePlugin.py PIL/GimpGradientFile.py PIL/GimpPaletteFile.py PIL/GribStubImagePlugin.py PIL/Hdf5StubImagePlugin.py PIL/IcnsImagePlugin.py PIL/IcoImagePlugin.py PIL/ImImagePlugin.py PIL/Image.py PIL/ImageChops.py PIL/ImageCms.py PIL/ImageColor.py PIL/ImageDraw.py PIL/ImageDraw2.py PIL/ImageEnhance.py PIL/ImageFile.py PIL/ImageFileIO.py PIL/ImageFilter.py PIL/ImageFont.py PIL/ImageGrab.py PIL/ImageMath.py PIL/ImageMode.py PIL/ImageOps.py PIL/ImagePalette.py PIL/ImagePath.py PIL/ImageQt.py PIL/ImageSequence.py PIL/ImageShow.py PIL/ImageStat.py PIL/ImageTk.py PIL/ImageTransform.py PIL/ImageWin.py PIL/ImtImagePlugin.py PIL/IptcImagePlugin.py PIL/JpegImagePlugin.py PIL/JpegPresets.py PIL/McIdasImagePlugin.py PIL/MicImagePlugin.py PIL/MpegImagePlugin.py PIL/MspImagePlugin.py PIL/OleFileIO.py PIL/PSDraw.py PIL/PaletteFile.py PIL/PalmImagePlugin.py PIL/PcdImagePlugin.py PIL/PcfFontFile.py PIL/PcxImagePlugin.py PIL/PdfImagePlugin.py PIL/PixarImagePlugin.py PIL/PngImagePlugin.py PIL/PpmImagePlugin.py PIL/PsdImagePlugin.py PIL/SgiImagePlugin.py PIL/SpiderImagePlugin.py PIL/SunImagePlugin.py PIL/TarIO.py PIL/TgaImagePlugin.py PIL/TiffImagePlugin.py PIL/TiffTags.py PIL/WalImageFile.py PIL/WebPImagePlugin.py PIL/WmfImagePlugin.py PIL/XVThumbImagePlugin.py PIL/XbmImagePlugin.py PIL/XpmImagePlugin.py PIL/__init__.py PIL/_binary.py PIL/_util.py PIL/tests.py Pillow.egg-info/PKG-INFO Pillow.egg-info/SOURCES.txt Pillow.egg-info/dependency_links.txt Pillow.egg-info/top_level.txt Pillow.egg-info/zip-safe Sane/CHANGES Sane/README Sane/_sane.c Sane/demo_numarray.py Sane/demo_pil.py Sane/sane.py Sane/sanedoc.txt Sane/setup.py Scripts/README Scripts/enhancer.py Scripts/explode.py Scripts/gifmaker.py Scripts/painter.py Scripts/pilconvert.py Scripts/pildriver.py Scripts/pilfile.py Scripts/pilfont.py Scripts/pilprint.py Scripts/player.py Scripts/thresholder.py Scripts/viewer.py Tests/README.txt Tests/bench_get.py Tests/cms_test.py Tests/crash_ttf_memory_error.py Tests/import_all.py Tests/large_memory_numpy_test.py Tests/large_memory_test.py Tests/make_hash.py Tests/run.py Tests/show_icc.py Tests/show_mcidas.py Tests/test_000_sanity.py Tests/test_001_archive.py Tests/test_file_bmp.py Tests/test_file_eps.py Tests/test_file_fli.py Tests/test_file_gif.py Tests/test_file_ico.py Tests/test_file_jpeg.py Tests/test_file_libtiff.py Tests/test_file_libtiff_small.py Tests/test_file_msp.py Tests/test_file_pcx.py Tests/test_file_png.py Tests/test_file_ppm.py Tests/test_file_psd.py Tests/test_file_tar.py Tests/test_file_tiff.py Tests/test_file_tiff_metadata.py Tests/test_file_webp.py Tests/test_file_webp_metadata.py Tests/test_file_xbm.py Tests/test_file_xpm.py Tests/test_font_bdf.py Tests/test_font_pcf.py Tests/test_format_lab.py Tests/test_image.py Tests/test_image_array.py Tests/test_image_convert.py Tests/test_image_copy.py Tests/test_image_crop.py Tests/test_image_draft.py Tests/test_image_filter.py Tests/test_image_frombytes.py Tests/test_image_getbands.py Tests/test_image_getbbox.py Tests/test_image_getcolors.py Tests/test_image_getdata.py Tests/test_image_getextrema.py Tests/test_image_getim.py Tests/test_image_getpalette.py Tests/test_image_getpixel.py Tests/test_image_getprojection.py Tests/test_image_histogram.py Tests/test_image_load.py Tests/test_image_mode.py Tests/test_image_offset.py Tests/test_image_paste.py Tests/test_image_point.py Tests/test_image_putalpha.py Tests/test_image_putdata.py Tests/test_image_putpalette.py Tests/test_image_putpixel.py Tests/test_image_quantize.py Tests/test_image_resize.py Tests/test_image_rotate.py Tests/test_image_save.py Tests/test_image_seek.py Tests/test_image_show.py Tests/test_image_split.py Tests/test_image_tell.py Tests/test_image_thumbnail.py Tests/test_image_tobitmap.py Tests/test_image_tobytes.py Tests/test_image_transform.py Tests/test_image_transpose.py Tests/test_image_verify.py Tests/test_imagechops.py Tests/test_imagecms.py Tests/test_imagecolor.py Tests/test_imagedraw.py Tests/test_imageenhance.py Tests/test_imagefile.py Tests/test_imagefileio.py Tests/test_imagefilter.py Tests/test_imagefont.py Tests/test_imagegrab.py Tests/test_imagemath.py Tests/test_imagemode.py Tests/test_imageops.py Tests/test_imageops_usm.py Tests/test_imagepalette.py Tests/test_imagepath.py Tests/test_imageqt.py Tests/test_imagesequence.py Tests/test_imageshow.py Tests/test_imagestat.py Tests/test_imagetk.py Tests/test_imagetransform.py Tests/test_imagewin.py Tests/test_lib_image.py Tests/test_lib_pack.py Tests/test_locale.py Tests/test_mode_i16.py Tests/test_numpy.py Tests/tester.py Tests/threaded_save.py Tests/versions.py Tests/fonts/FreeMono.ttf Tests/fonts/helvO18.pcf Tests/icc/CMY.icm Tests/icc/YCC709.icm Tests/icc/sRGB.icm Tests/images/12bit.cropped.tif Tests/images/12in16bit.tif Tests/images/16bit.MM.cropped.tif Tests/images/16bit.MM.deflate.tif Tests/images/16bit.cropped.tif Tests/images/16bit.deflate.tif Tests/images/broken.png Tests/images/caption_6_33_22.png Tests/images/create_eps.gnuplot Tests/images/flower.jpg Tests/images/flower2.jpg Tests/images/g4-fillorder-test.png Tests/images/g4-fillorder-test.tif Tests/images/l_trns.png Tests/images/lab-green.tif Tests/images/lab-red.tif Tests/images/lab.tif Tests/images/lena.Lab.tif Tests/images/lena.tif Tests/images/lena_bw.png Tests/images/lena_bw_500.png Tests/images/lena_g4.tif Tests/images/lena_g4_500.tif Tests/images/lena_webp_bits.ppm Tests/images/lena_webp_write.ppm Tests/images/multiline_text.png Tests/images/non_zero_bb.eps Tests/images/non_zero_bb.png Tests/images/non_zero_bb_scale2.png Tests/images/p_trns_single.png Tests/images/pil123p.png Tests/images/pil123rgba.png Tests/images/pil136.tiff Tests/images/pil168.tif Tests/images/pil184.pcx Tests/images/pil_sample_cmyk.jpg Tests/images/pil_sample_rgb.jpg Tests/images/pngtest_bad.png.bin Tests/images/pport_g4.tif Tests/images/rgb.jpg Tests/images/rgb_trns.png Tests/images/tiff_adobe_deflate.tif Tests/images/zero_bb.eps Tests/images/zero_bb.png Tests/images/zero_bb_scale2.png Tk/booster.txt Tk/install.txt Tk/pilbitmap.txt Tk/tkImaging.c docs/BUILDME docs/COPYING docs/Guardfile docs/LICENSE docs/Makefile docs/PIL.rst docs/about.rst docs/conf.py docs/guides.rst docs/index.rst docs/installation.rst docs/make.bat docs/original-readme.rst docs/plugins.rst docs/porting-pil-to-pillow.rst docs/requirements.txt docs/_build/.gitignore docs/_static/.gitignore docs/_templates/.gitignore docs/_templates/sidebarhelp.html docs/handbook/appendices.rst docs/handbook/concepts.rst docs/handbook/image-file-formats.rst docs/handbook/overview.rst docs/handbook/tutorial.rst docs/handbook/writing-your-own-file-decoder.rst docs/reference/Image.rst docs/reference/ImageChops.rst docs/reference/ImageColor.rst docs/reference/ImageDraw.rst docs/reference/ImageEnhance.rst docs/reference/ImageFile.rst docs/reference/ImageFilter.rst docs/reference/ImageFont.rst docs/reference/ImageGrab.rst docs/reference/ImageMath.rst docs/reference/ImageOps.rst docs/reference/ImagePalette.rst docs/reference/ImagePath.rst docs/reference/ImageQt.rst docs/reference/ImageSequence.rst docs/reference/ImageStat.rst docs/reference/ImageTk.rst docs/reference/ImageWin.rst docs/reference/PSDraw.rst docs/reference/index.rst libImaging/Access.c libImaging/AlphaComposite.c libImaging/Antialias.c libImaging/Bands.c libImaging/Bit.h libImaging/BitDecode.c libImaging/Blend.c libImaging/Chops.c libImaging/Convert.c libImaging/ConvertYCbCr.c libImaging/Copy.c libImaging/Crc32.c libImaging/Crop.c libImaging/Dib.c libImaging/Draw.c libImaging/Effects.c libImaging/EpsEncode.c libImaging/Except.c libImaging/File.c libImaging/Fill.c libImaging/Filter.c libImaging/FliDecode.c libImaging/Geometry.c libImaging/GetBBox.c libImaging/Gif.h libImaging/GifDecode.c libImaging/GifEncode.c libImaging/HexDecode.c libImaging/Histo.c libImaging/ImDib.h libImaging/ImPlatform.h libImaging/Imaging.h libImaging/Jpeg.h libImaging/JpegDecode.c libImaging/JpegEncode.c libImaging/Lzw.h libImaging/LzwDecode.c libImaging/Matrix.c libImaging/ModeFilter.c libImaging/MspDecode.c libImaging/Negative.c libImaging/Offset.c libImaging/Pack.c libImaging/PackDecode.c libImaging/Palette.c libImaging/Paste.c libImaging/PcdDecode.c libImaging/PcxDecode.c libImaging/PcxEncode.c libImaging/Point.c libImaging/Quant.c libImaging/QuantHash.c libImaging/QuantHash.h libImaging/QuantHeap.c libImaging/QuantHeap.h libImaging/QuantOctree.c libImaging/QuantOctree.h libImaging/QuantTypes.h libImaging/RankFilter.c libImaging/Raw.h libImaging/RawDecode.c libImaging/RawEncode.c libImaging/Storage.c libImaging/SunRleDecode.c libImaging/TgaRleDecode.c libImaging/TiffDecode.c libImaging/TiffDecode.h libImaging/Unpack.c libImaging/UnpackYCC.c libImaging/UnsharpMask.c libImaging/XbmDecode.c libImaging/XbmEncode.c libImaging/Zip.h libImaging/ZipDecode.c libImaging/ZipEncode.cpillow-2.3.0/Pillow.egg-info/dependency_links.txt0000644000175000001440000000000112261041654020704 0ustar dokousers pillow-2.3.0/Pillow.egg-info/PKG-INFO0000644000175000001440000027563512261041654015755 0ustar dokousersMetadata-Version: 1.1 Name: Pillow Version: 2.3.0 Summary: Python Imaging Library (Fork) Home-page: http://python-imaging.github.io/ Author: Alex Clark (fork author) Author-email: aclark@aclark.net License: Standard PIL License Description: Pillow ====== *Python Imaging Library (Fork)* Pillow is the "friendly" PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. .. image:: https://travis-ci.org/python-imaging/Pillow.png :target: https://travis-ci.org/python-imaging/Pillow .. image:: https://pypip.in/v/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Latest PyPI version .. image:: https://pypip.in/d/Pillow/badge.png :target: https://pypi.python.org/pypi/Pillow/ :alt: Number of PyPI downloads The documentation is hosted at http://pillow.readthedocs.org/. It contains installation instructions, tutorials, reference, compatibility details, and more. Changelog (Pillow) ================== 2.3.0 (2014-01-01) ------------------ - Stop leaking filename parameter passed to getfont [jpharvey] - Report availability of LIBTIFF during setup and selftest [cgohlke] - Fix msvc build error C1189: "No Target Architecture" [cgohlke] - Fix memory leak in font_getsize [wiredfool] - Correctly prioritize include and library paths [ohanar] - Image.point fixes for numpy.array and docs [wiredfool] - Save the transparency header by default for PNGs [wiredfool] - Support for PNG tRNS header when converting from RGB->RGBA [wiredfool] - PyQT5 Support [wiredfool] - Updates for saving color tiffs w/compression using libtiff [wiredfool] - 2gigapix image fixes and redux [wiredfool] - Save arbitrary tags in Tiff image files [wiredfool] - Quote filenames and title before using on command line [tmccombs] - Fixed Viewer.show to return properly [tmccombs] - Documentation fixes [wiredfool] - Fixed memory leak saving images as webp when webpmux is available [cezarsa] - Fix compiling with FreeType 2.5.1 [stromnov] - Adds directories for NetBSD. [deepy] - Support RGBA TIFF with missing ExtraSamples tag [cgohlke] - Lossless WEBP Support [wiredfool] - Take compression as an option in the save call for tiffs [wiredfool] - Add support for saving lossless WebP. Just pass 'lossless=True' to save() [liftoff] - LCMS support upgraded from version 1 to version 2, fixes #343 [wiredfool] - Added more raw decoder 16 bit pixel formats [svanheulen] - Document remaining Image* modules listed in PIL handbook [irksep] - Document ImageEnhance, ImageFile, ImageFilter, ImageFont, ImageGrab, ImageMath, and ImageOps [irksep] - Port and update docs for Image, ImageChops, ImageColor, and ImageDraw [irksep] - Move or copy content from README.rst to docs/ [irksep] - Respect CFLAGS/LDFLAGS when searching for headers/libs [iElectric] - Port PIL Handbook tutorial and appendices [irksep] - Alpha Premultiplication support for transform and resize [wiredfool] - Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 [wiredfool] 2.2.2 (2013-12-11) ------------------ - Fix #427: compiling with FreeType 2.5.1 [stromnov] 2.2.1 (2013-10-02) ------------------ - Fix #356: Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) [wiredfool] 2.2.0 (2013-10-02) ------------------ - Fix #254: Bug in image transformations resulting from uninitialized memory [nikmolnar] - Fix for encoding of b_whitespace, similar to closed issue #272 [mhogg] - Fix #273: Add numpy array interface support for 16 and 32 bit integer modes [cgohlke] - Partial fix for #290: Add preliminary support for TIFF tags. [wiredfool] - Fix #251 and #326: circumvent classification of pngtest_bad.png as malware [cgohlke] - Add typedef uint64_t for MSVC. [cgohlke] - Fix #329: setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. [nu774] - Fix #328: _imagingcms.c: include windef.h to fix build issue on MSVC [nu774] - Automatically discover homebrew include/ and lib/ paths on OSX [donspaulding] - Fix bytes which should be bytearray [manisandro] - Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build if specified as environment variables. [seanupton] - Fix #312 + gif optimize improvement [d-schmidt] - Be more tolerant of tag read failures [ericbuehl] - Fix #318: Catch truncated zTXt errors. [vytisb] - Fix IOError when saving progressive JPEGs. [e98cuenc] - Add RGBA support to ImageColor [yoavweiss] - Fix #304: test for `str`, not `"utf-8"`. [mjpieters] - Fix missing import os in _util.py. [mnowotka] - Added missing exif tags. [freyes] - Fail on all import errors, fixes #298. [macfreek, wiredfool] - Fixed Windows fallback (wasn't using correct file in Windows fonts). [lmollea] - Moved ImageFile and ImageFileIO comments to docstrings. [freyes] - Restore compatibility with ISO C. [cgohlke] - Use correct format character for C int type. [cgohlke] - Allocate enough memory to hold pointers in encode.c. [cgohlke] - Fix #279, fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff. [wiredfool] - Moved Image module comments to docstrings. [freyes] - Add 16-bit TIFF support, fixes #274. [wiredfool] - Ignore high ascii characters in string.whitespace, fixes #272. [wiredfool] - Added clean/build to tox to make it behave like travis. [freyes] - Adding support for metadata in webp images. [heynemann] 2.1.0 (2013-07-02) ------------------ - Add /usr/bin/env python shebangs to all scripts in /Scripts. - Add several TIFF decoders and encoders. - Added support for alpha transparent webp images. - Adding Python 3 support for StringIO. - Adding Python3 basestring compatibility without changing basestring. - Fix webp encode errors on win-amd64. - Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1. - Better support for ICO images. - Changed PY_VERSION_HEX, fixes #166. - Changes to put everything under the PIL namespace. [wiredfool] - Changing StringIO to BytesIO. - Cleanup whitespace. [Arfrever] - Don't skip 'import site' on initialization when running tests for inplace builds. [cgohlke] - Enable warnings for test suite. - Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) - Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6 - Fix #193: remove double typedef declaration. - Fix msvc compile errors (#230). - Fix rendered characters have been chipped for some TrueType fonts. - Fix usage of pilfont.py script. - Fresh start for docs, generated by sphinx-apidoc. - Introduce --enable-x and fail if it is given and x is not available. - Partial work to add a wrapper for WebPGetFeatures to correctly support #204. - Significant performance improvement of `alpha_composite` function. - Support explicitly disabling features via --disable-* options. - Support selftest.py --installed, fixes #263. - Transparent WebP Support, #204 - Use PyCapsule for py3.1, fixes #237. - Workaround for: http://bugs.python.org/16754 in 3.2.x < 3.2.4 and 3.3.0. 2.0.0 (2013-03-15) ------------------ - Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) [fluggo] - Add PyPy support (experimental, please see: https://github.com/python-imaging/Pillow/issues/67) - Add WebP support. [lqs] - Add Tiff G3/G4 support (experimental) [wiredfool] - Backport PIL's PNG/Zip improvements. [olt] - Various 64 bit and Windows fixes. [cgohlke] - Add testing suite. [cgohlke, fluggo] - Added support for PNG images with transparency palette. [d-schmidt] - Many other bug fixes and enhancements by many other people (see commit log and/or docs/CONTRIBUTORS.txt). - Special thanks to Christoph Gohlke and Eric Soroos for rallying around the effort to get a release out for PyCon 2013. 1.7.8 (2012-11-01) ------------------ - Removed doctests.py that made tests of other packages fail. [thomasdesvenain] - Fix opening psd files with RGBA layers when A mode is not of type 65535 but 3. Fixes #3 [thomasdesvenain] 1.7.7 (2012-04-04) ------------------ - UNDEF more types before including windows headers [mattip] 1.7.6 (2012-01-20) ------------------ - Bug fix: freetype not found on Mac OS X with case-sensitive filesystem [gjo] - Bug fix: Backport fix to split() after open() (regression introduced in PIL 1.1.7). [sfllaw] 1.7.5 (2011-09-07) ------------------ - Fix for sys.platform = "linux3" [blueyed] - Package cleanup and additional documentation [aclark] 1.7.4 (2011-07-21) ------------------ - Fix brown bag release [aclark] 1.7.3 (2011-07-20) ------------------ - Fix : resize need int values, append int conversion in thumbnail method [harobed] 1.7.2 (2011-06-02) ------------------ - Bug fix: Python 2.4 compat [aclark] 1.7.1 (2011-05-31) ------------------ - More multi-arch support [SteveM, regebro, barry, aclark] 1.7.0 (2011-05-27) ------------------ - Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu [aclark] 1.6 (12/01/2010) ---------------- - Bug fix: /usr/x11/include should be added to include_dirs not library_dirs [elro] - Doc fixes 1.5 (11/28/2010) ---------------- - Module and package fixes 1.4 (11/28/2010) ---------------- - Doc fixes 1.3 (11/28/2010) ---------------- - Add support for /lib64 and /usr/lib64 library directories on Linux - Doc fixes 1.2 (08/02/2010) ---------------- - On OS X also check for freetype2 in the X11 path [jezdez] - Doc fixes [aclark] 1.1 (07/31/2010) ---------------- - Removed setuptools_hg requirement - Doc fixes 1.0 (07/30/2010) ---------------- - Forked PIL based on Hanno Schlichting's re-packaging (http://dist.plone.org/thirdparty/PIL-1.1.7.tar.gz) - Remove support for importing from the standard namespace .. Note:: What follows is the original PIL 1.1.7 CHANGES file contents :: -*- coding: utf-8 -*- The Python Imaging Library $Id$ ACKNOWLEDGEMENTS: PIL wouldn't be what it is without the help of: David Ascher, Phil Austin, Douglas Bagnall, Larry Bates, Anthony Baxter, William Baxter, Denis Benoit, Jan Blom, Duncan Booth, Alexey Borzenkov, Jeff Breidenbach, Roger Burnham, Zac Burns, Gene Cash, Kevin Cazabon, Fred Clare, Greg Coats, Chris Cogdon, Greg Couch, Bill Crutchfield, Abel Deuring, Tim Docker, Fred Drake, Graham Dumpleton, Matthew Ellis, Eric Etheridge, Daniel Fetchinson, Robin Friedrich, Pier Paolo Glave, Federico Di Gregorio, Markus Gritsch, Daniel Haertle, Greg Hamilton, Mark Hammond, Bernhard Herzog, Rob Hooft, Bob Ippolito, Jack Jansen, Bill Janssen, Edward Jones, Richard Jones, Håkan Karlsson, Robert Kern, David Kirtley, Bob Klimek, Matthias Klose, Andrew Kuchling, Magnus Källström, Victor Lacina, Ben Last, Hamish Lawson, Cesare Leonardi, Andrew MacIntyre, Jan Matejek, Naveen Michaud-Agrawal, Gordon McMillan, Skip Montanaro, Fredrik Nehr, Russell Nelson, Luciano Nocera, Travis Oliphant, Piet van Oostrum, Richard Oudkerk, Paul Pharr, Andres Polit, Conrado Porto Lopes Gouvêa, Eric Raymond, Victor Reijs, Bertil Reinhammar, Nicholas Riley, Don Rozenberg, Toby Sargeant, Barry Scott, Les Schaffer, Joel Shprentz, Klamer Shutte, Gene Skonicki, Niki Spahiev, D. Alan Stewart, Perry Stoll, Paul Svensson, Ulrik Svensson, Miki Tebeka, Michael van Tellingen, Ivan Tkatchev, Dan Torop, Adam Twardoch, Rune Uhlin, Dmitry Vasiliev, Sasha Voynow, Charles Waldman, Collin Winter, Dan Wolfe, Ka-Ping Yee, and many others (if your name should be on this list, let me know.) *** Changes from release 1.1.6 to 1.1.7 *** This section may not be fully complete. For changes since this file was last updated, see the repository revision history: http://bitbucket.org/effbot/pil-2009-raclette/changesets/ (1.1.7 final) + Set GIF loop info property to the number of iterations if a NETSCAPE loop extension is present, instead of always setting it to 1 (from Valentino Volonghi). (1.1.7c1 released) + Improved PNG compression (from Alexey Borzenkov). + Read interlaced PNG files (from Conrado Porto Lopes Gouvêa) + Added various TGA improvements from Alexey Borzenkov, including support for specifying image orientation. + Bumped block threshold to 16 megabytes, made size estimation a bit more accurate. This speeds up allocation of large images. + Fixed rounding error in ImagingDrawWideLine. "gormish" writes: ImagingDrawWideLine() in Draw.c has a bug in every version I've seen, which leads to different width lines depending on the order of the points in the line. This is especially bad at some angles where a 'width=2' line can completely disappear. + Added support for RGBA mode to the SGI module (based on code by Karsten Hiddemann). + Handle repeated IPTC tags (adapted from a patch by Eric Bruning). Eric writes: According to the specification, some IPTC tags can be repeated, e.g., tag 2:25 (keywords). PIL 1.1.6 only retained the last instance of that tag. Below is a patch to store all tags. If there are multiple tag instances, they are stored in a (python) list. Single tag instances remain as strings. + Fixed potential crash in ImageFilter for small target images (reported by Zac Burns and Daniel Fetchinson). + Use BMP instead of JPEG as temporary show format on Mac OS X. + Fixed putpixel/new for I;16 with colors > 255. + Added integer power support to ImagingMath. + Added limited support for I;16L mode (explicit little endian). + Moved WMF support into Image.core; enable WMF rendering by default if renderer is available. + Mark the ARG plugin as obsolete. + Added version query mechanism to ImageCms and ImageFont, for debugging. + Added (experimental) ImageCms function for fetching the ICC profile for the current display (currently Windows only). Added HWND/HDC support to ImageCms.get_display_profile(). + Added WMF renderer (Windows only). + Added ImagePointHandler and ImageTransformHandler mixins; made ImageCmsTransform work with im.point. + Fixed potential endless loop in the XVThumbnail reader (from Nikolai Ugelvik). + Added Kevin Cazabon's pyCMS package. The C code has been moved to _imagingcms.c, the Python interface module is installed as PIL.ImageCMS. Added support for in-memory ICC profiles. Unified buildTransform and buildTransformFromOpenProfiles. The profile can now be either a filename, a profile object, or a file-like object containing an in-memory profile. Additional fixes from Florian Böch: Very nice - it just needs LCMS flags support so we can use black point compensation and softproofing :) See attached patches. They also fix a naming issue which could cause confusion - display profile (ImageCms wording) actually means proof profile (lcms wording), so I changed variable names and docstrings where applicable. Patches are tested under Python 2.6. + Improved support for layer names in PSD files (from Sylvain Baubeau) Sylvain writes: I needed to be able to retrieve the names of the layers in a PSD files. But PsdImagePlugin.py didn't do the job so I wrote this very small patch. + Improved RGBA support for ImageTk for 8.4 and newer (from Con Radchenko). This replaces the slow run-length based encoding model with true compositing at the Tk level. + Added support for 16- and 32-bit images to McIdas loader. Based on file samples and stand-alone reader code provided by Craig Swank. + Added ImagePalette support to putpalette. + Fixed problem with incremental parsing of PNG files. + Make selftest.py report non-zero status on failure (from Mark Sienkiewicz) + Add big endian save support and multipage infrastructure to the TIFF writer (from Sebastian Haase). + Handle files with GPS IFD but no basic EXIF IFD (reported by Kurt Schwehr). + Added zTXT support (from Andrew Kuchling via Lowell Alleman). + Fixed potential infinite loop bug in ImageFont (from Guilherme Polo). + Added sample ICC profiles (from Kevin Cazabon) + Fixed array interface for I, F, and RGBA/RGBX images. + Added Chroma subsampling support for JPEG (from Justin Huff). Justin writes: Attached is a patch (against PIL 1.1.6) to provide control over the chroma subsampling done by the JPEG encoder. This is often useful for reducing compression artifacts around edges of clipart and text. + Added USM/Gaussian Blur code from Kevin Cazabon. + Fixed bug w. uninitialized image data when cropping outside the source image. + Use ImageShow to implement the Image.show method. Most notably, this picks the 'display' utility when available. It also allows application code to register new display utilities via the ImageShow registry. + Release the GIL in the PNG compressor (from Michael van Tellingen). + Revised JPEG CMYK handling. Always assume Adobe behaviour, both when reading and writing (based on a patch by Kevin Cazabon, and test data by Tim V. and Charlie Clark, and additional debugging by Michael van Tellingen). + Support for preserving ICC profiles (by Florian Böch via Tim Hatch). Florian writes: It's a beta, so still needs some testing, but should allow you to: - retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF. Existing code doesn't need to be changed. - access embedded profiles in JPEG, PNG, PSD, TIFF. It also includes patches for TIFF to retain IPTC, Photoshop and XMP metadata when saving as TIFF again, read/write TIFF resolution information correctly, and to correct inverted CMYK JPEG files. + Fixed potential memory leak in median cut quantizer (from Evgeny Salmin). + Fixed OverflowError when reading upside-down BMP images. + Added resolution save option for PDF files. Andreas Kostyrka writes: I've included a patched PdfImagePlugin.py based on 1.1.6 as included in Ubuntu, that supports a "resolution" save option. Not great, but it makes the PDF saving more useful by allowing PDFs that are not exactly 72dpi. + Look for Tcl/Tk include files in version-specific include directory (from Encolpe Degoute). + Fixed grayscale rounding error in ImageColor.getcolor (from Tim Hatch). + Fixed calculation of mean value in ImageEnhance.Contrast (reported by "roop" and Scott David Daniels). + Fixed truetype positioning when first character has a negative left bearing (from Ned Batchelder): Ned writes: In PIL 1.1.6, ImageDraw.text will position the string incorrectly if the first character has a negative left bearing. To see the problem, show a string like "///" in an italic font. The first slash will be clipped at the left, and the string will be mis-positioned. + Fixed resolution unit bug in tiff reader/writer (based on code by Florian Höch, Gary Bloom, and others). + Added simple transparency support for RGB images (reported by Sebastian Spaeth). + Added support for Unicode filenames in ImageFont.truetype (from Donn Ingle). + Fixed potential crash in ImageFont.getname method (from Donn Ingle). + Fixed encoding issue in PIL/WalImageFile (from Santiago M. Mola). *** Changes from release 1.1.5 to 1.1.6 *** (1.1.6 released) + Fixed some 64-bit compatibility warnings for Python 2.5. + Added threading support for the Sane driver (from Abel Deuring). (1.1.6b2 released) + Added experimental "floodfill" function to the ImageDraw module (based on code by Eric Raymond). + The default arguments for "frombuffer" doesn't match "fromstring" and the documentation; this is a bug, and will most likely be fixed in a future version. In this release, PIL prints a warning message instead. To silence the warning, change any calls of the form "frombuffer(mode, size, data)" to frombuffer(mode, size, data, "raw", mode, 0, 1) + Added "fromarray" function, which takes an object implementing the NumPy array interface and creates a PIL Image from it. (from Travis Oliphant). + Added NumPy array interface support (__array_interface__) to the Image class (based on code by Travis Oliphant). This allows you to easily convert between PIL image memories and NumPy arrays: import numpy, Image im = Image.open('lena.jpg') a = numpy.asarray(im) # a is readonly im = Image.fromarray(a) + Fixed CMYK polarity for JPEG images, by treating all images as "Adobe CMYK" images. (thanks to Cesare Leonardi and Kevin Cazabon for samples, debugging, and patches). (1.1.6b1 released) + Added 'expand' option to the Image 'rotate' method. If true, the output image is made large enough to hold the entire rotated image. + Changed the ImageDraw 'line' method to always draw the last pixel in a polyline, independent of line angle. + Fixed bearing calculation and clipping in the ImageFont truetype renderer; this could lead to clipped text, or crashes in the low- level _imagingft module. (based on input from Adam Twardoch and others). + Added ImageQt wrapper module, for converting PIL Image objects to QImage objects in an efficient way. + Fixed 'getmodebands' to return the number of bands also for "PA" and "LA" modes. Added 'getmodebandnames' helper that return the band names. (1.1.6a2 released) + Added float/double support to the TIFF loader (from Russell Nelson). + Fixed broken use of realloc() in path.c (from Jan Matejek) + Added save support for Spider images (from William Baxter). + Fixed broken 'paste' and 'resize' operations in pildriver (from Bill Janssen). + Added support for duplex scanning to the Sane interface (Abel Deuring). (1.1.6a1 released) + Fixed a memory leak in "convert(mode)", when converting from L to P. + Added pixel access object. The "load" method now returns a access object that can be used to directly get and set pixel values, using ordinary [x, y] notation: pixel = im.load() v = pixel[x, y] pixel[x, y] = v If you're accessing more than a few pixels, this is a lot faster than using getpixel/putpixel. + Fixed building on Cygwin (from Miki Tebeka). + Fixed "point(callable)" on unloaded images (reported by Håkan Karlsson). + Fixed size bug in ImageWin.ImageWindow constructor (from Victor Reijs) + Fixed ImageMath float() and int() operations for Python 2.4 (reported by Don Rozenberg). + Fixed "RuntimeError: encoder error -8 in tostring" problem for wide "RGB", "I", and "F" images. + Fixed line width calculation. (1.1.6a0 released) + Fixed byte order issue in Image.paste(ink) (from Ka-Ping Yee). + Fixed off-by-0.5 errors in the ANTIALIAS code (based on input from Douglas Bagnall). + Added buffer interface support to the Path constructor. If a buffer is provided, it is assumed to contain a flat array of float coordinates (e.g. array.array('f', seq)). + Added new ImageMath module. + Fixed ImageOps.equalize when used with a small number of distinct values (reported by David Kirtley). + Fixed potential integer division in PSDraw.image (from Eric Etheridge). *** Changes from release 1.1 to 1.1.5 *** (1.1.5c2 and 1.1.5 final released) + Added experimental PERSPECTIVE transform method (from Jeff Breiden- bach). (1.1.5c1 released) + Make sure "thumbnail" never generates zero-wide or zero-high images (reported by Gene Skonicki) + Fixed a "getcolors" bug that could result in a zero count for some colors (reported by Richard Oudkerk). + Changed default "convert" palette to avoid "rounding errors" when round-tripping white source pixels (reported by Henryk Gerlach and Jeff Epler). (1.1.5b3 released) + Don't crash in "quantize" method if the number of colors requested is larger than 256. This release raises a ValueError exception; future versions may return a mode "RGB" image instead (reported by Richard Oudkerk). + Added WBMP read/write support (based on code by Duncan Booth). (1.1.5b2 released) + Added DPI read/write support to the PNG codec. The decoder sets the info["dpi"] attribute for PNG files with appropriate resolution settings. The encoder uses the "dpi" option (based on code by Niki Spahiev). + Added limited support for "point" mappings from mode "I" to mode "L". Only 16-bit values are supported (other values are clipped), the lookup table must contain exactly 65536 entries, and the mode argument must be set to "L". + Added support for Mac OS X icns files (based on code by Bob Ippolito). + Added "ModeFilter" support to the ImageFilter module. + Added support for Spider images (from William Baxter). See the comments in PIL/SpiderImagePlugin.py for more information on this format. (1.1.5b1 released) + Added new Sane release (from Ralph Heinkel). See the Sane/README and Sane/CHANGES files for more information. + Added experimental PngInfo chunk container to the PngImageFile module. This can be used to add arbitrary chunks to a PNG file. Create a PngInfo instance, use "add" or "add_text" to add chunks, and pass the instance as the "pnginfo" option when saving the file. + Added "getpalette" method. This returns the palette as a list, or None if the image has no palette. To modify the palette, use "getpalette" to fetch the current palette, modify the list, and put it back using "putpalette". + Added optional flattening to the ImagePath "tolist" method. tolist() or tolist(0) returns a list of 2-tuples, as before. tolist(1) returns a flattened list instead. (1.1.5a5 released) + Fixed BILINEAR/BICUBIC/ANTIALIAS filtering for mode "LA". + Added "getcolors()" method. This is similar to the existing histo- gram method, but looks at color values instead of individual layers, and returns an unsorted list of (count, color) tuples. By default, the method returns None if finds more than 256 colors. If you need to look for more colors, you can pass in a limit (this is used to allocate internal tables, so you probably don't want to pass in too large values). + Build improvements: Fixed building under AIX, improved detection of FreeType2 and Mac OS X framework libraries, and more. Many thanks to everyone who helped test the new "setup.py" script! (1.1.5a4 released) + The "save" method now looks for a file format driver before creating the file. + Don't use antialiased truetype fonts when drawing in mode "P", "I", and "F" images. + Rewrote the "setup.py" file. The new version scans for available support libraries, and configures both the libImaging core library and the bindings in one step. To use specific versions of the libraries, edit the ROOT variables in the setup.py file. + Removed threaded "show" viewer; use the old "show" implementation instead (Windows). + Added deprecation warnings to Image.offset, ImageDraw.setink, and ImageDraw.setfill. + Added width option to ImageDraw.line(). The current implementation works best for straight lines; it does not support line joins, so polylines won't look good. + ImageDraw.Draw is now a factory function instead of a class. If you need to create custom draw classes, inherit from the ImageDraw class. All other code should use the factory function. + Fixed loading of certain PCX files (problem reported by Greg Hamilton, who also provided samples). + Changed _imagingft.c to require FreeType 2.1 or newer. The module can still be built with earlier versions; see comments in _imagingft.c for details. (1.1.5a3 released) + Added 'getim' method, which returns a PyCObject wrapping an Imaging pointer. The description string is set to IMAGING_MAGIC. See Imaging.h for pointer and string declarations. + Fixed reading of TIFF JPEG images (problem reported by Ulrik Svensson). + Made ImageColor work under Python 1.5.2 + Fixed division by zero "equalize" on very small images (from Douglas Bagnall). (1.1.5a2 released) + The "paste" method now supports the alternative "paste(im, mask)" syntax (in this case, the box defaults to im's bounding box). + The "ImageFile.Parser" class now works also for PNG files with more than one IDAT block. + Added DPI read/write to the TIFF codec, and fixed writing of rational values. The decoder sets the info["dpi"] attribute for TIFF files with appropriate resolution settings. The encoder uses the "dpi" option. + Disable interlacing for small (or narrow) GIF images, to work around what appears to be a hard-to-find bug in PIL's GIF encoder. + Fixed writing of mode "P" PDF images. Made mode "1" PDF images smaller. + Made the XBM reader a bit more robust; the file may now start with a few whitespace characters. + Added support for enhanced metafiles to the WMF driver. The separate PILWMF kit lets you render both placeable WMF files and EMF files as raster images. See http://effbot.org/downloads#pilwmf (1.1.5a1 released) + Replaced broken WMF driver with a WMF stub plugin (see below). + Fixed writing of mode "1", "L", and "CMYK" PDF images (based on input from Nicholas Riley and others). + Fixed adaptive palette conversion for zero-width or zero-height images (from Chris Cogdon) + Fixed reading of PNG images from QuickTime 6 (from Paul Pharr) + Added support for StubImageFile plugins, including stub plugins for BUFR, FITS, GRIB, and HDF5 files. A stub plugin can identify a given file format, but relies on application code to open and save files in that format. + Added optional "encoding" argument to the ImageFont.truetype factory. This argument can be used to specify non-Unicode character maps for fonts that support that. For example, to draw text using the Microsoft Symbol font, use: font = ImageFont.truetype("symbol.ttf", 16, encoding="symb") draw.text((0, 0), unichr(0xF000 + 0xAA)) (note that the symbol font uses characters in the 0xF000-0xF0FF range) Common encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman). See the FreeType documentation for more information. + Made "putalpha" a bit more robust; you can now attach an alpha layer to a plain "L" or "RGB" image, and you can also specify constant alphas instead of alpha layers (using integers or colour names). + Added experimental "LA" mode support. An "LA" image is an "L" image with an attached transparency layer. Note that support for "LA" is not complete; some operations may fail or produce unexpected results. + Added "RankFilter", "MinFilter", "MedianFilter", and "MaxFilter" classes to the ImageFilter module. + Improved support for applications using multiple threads; PIL now releases the global interpreter lock for many CPU-intensive operations (based on work by Kevin Cazabon). + Ignore Unicode characters in the PCF loader (from Andres Polit) + Fixed typo in OleFileIO.loadfat, which could affect loading of FlashPix and Image Composer images (Daniel Haertle) + Fixed building on platforms that have Freetype but don't have Tcl/Tk (Jack Jansen, Luciano Nocera, Piet van Oostrum and others) + Added EXIF GPSInfo read support for JPEG files. To extract GPSInfo information, open the file, extract the exif dictionary, and check for the key 0x8825 (GPSInfo). If present, it contains a dictionary mapping GPS keys to GPS values. For a list of keys, see the EXIF specification. The "ExifTags" module contains a GPSTAGS dictionary mapping GPS tags to tag names. + Added DPI read support to the PCX and DCX codecs (info["dpi"]). + The "show" methods now uses a built-in image viewer on Windows. This viewer creates an instance of the ImageWindow class (see below) and keeps it running in a separate thread. NOTE: This was disabled in 1.1.5a4. + Added experimental "Window" and "ImageWindow" classes to the ImageWin module. These classes allow you to create a WCK-style toplevel window, and use it to display raster data. + Fixed some Python 1.5.2 issues (to build under 1.5.2, use the Makefile.pre.in/Setup.in approach) + Added support for the TIFF FillOrder tag. PIL can read mode "1", "L", "P" and "RGB" images with non-standard FillOrder (based on input from Jeff Breidenbach). (1.1.4 final released) + Fixed ImageTk build problem on Unix. (1.1.4b2 released) + Improved building on Mac OS X (from Jack Jansen). + Improved building on Windows with MinGW (from Klamer Shutte). + If no font is specified, ImageDraw now uses the embedded default font. Use the "load" or "truetype" methods to load a real font. + Added embedded default font to the ImageFont module (currently an 8-pixel Courier font, taken from the X window distribution). (1.1.4b1 released) + Added experimental EXIF support for JPEG files. To extract EXIF information from a JPEG file, open the file as usual, and call the "_getexif" method. If successful, this method returns a dictionary mapping EXIF TIFF tags to values. If the file does not contain EXIF data, the "_getexif" method returns None. The "ExifTags" module contains a dictionary mapping tags to tag names. This interface will most likely change in future versions. + Fixed a bug when using the "transparency" option with the GIF writer. + Added limited support for "bitfield compression" in BMP files and DIB buffers, for 15-bit, 16-bit, and 32-bit images. This also fixes a problem with ImageGrab module when copying screen- dumps from the clipboard on 15/16/32-bit displays. + Added experimental WAL (Quake 2 textures) loader. To use this loader, import WalImageFile and call the "open" method in that module. (1.1.4a4 released) + Added updated SANE driver (Andrew Kuchling, Abel Deuring) + Use Python's "mmap" module on non-Windows platforms to read some uncompressed formats using memory mapping. Also added a "frombuffer" function that allows you to access the contents of an existing string or buffer object as if it were an image object. + Fixed a memory leak that could appear when processing mode "P" images (from Pier Paolo Glave) + Ignore Unicode characters in the BDF loader (from Graham Dumpleton) (1.1.4a3 released; windows only) + Added experimental RGBA-on-RGB drawing support. To use RGBA colours on an RGB image, pass "RGBA" as the second string to the ImageDraw.Draw constructor. + Added support for non-ASCII strings (Latin-1) and Unicode to the truetype font renderer. + The ImageWin "Dib" object can now be constructed directly from an image object. + The ImageWin module now allows you use window handles as well as device contexts. To use a window handle, wrap the handle in an ImageWin.HWND object, and pass in this object instead of the device context. (1.1.4a2 released) + Improved support for 16-bit unsigned integer images (mode "I;16"). This includes TIFF reader support, and support for "getextrema" and "point" (from Klamer Shutte). + Made the BdfFontFile reader a bit more robust (from Kevin Cazabon and Dmitry Vasiliev) + Changed TIFF writer to always write Compression tag, even when using the default compression (from Greg Couch). + Added "show" support for Mac OS X (from Dan Wolfe). + Added clipboard support to the "ImageGrab" module (Windows only). The "grabclipboard" function returns an Image object, a list of filenames (not in 1.1.4), or None if neither was found. (1.1.4a1 released) + Improved support for drawing RGB data in palette images. You can now use RGB tuples or colour names (see below) when drawing in a mode "P" image. The drawing layer automatically assigns color indexes, as long as you don't use more than 256 unique colours. + Moved self test from MiniTest/test.py to ./selftest.py. + Added support for CSS3-style color strings to most places that accept colour codes/tuples. This includes the "ImageDraw" module, the Image "new" function, and the Image "paste" method. Colour strings can use one of the following formats: "#f00", "#ff0000", "rgb(255,0,0)", "rgb(100%,0%,0%)", "hsl(0, 100%, 50%)", or "red" (most X11-style colour names are supported). See the documentation for the "ImageColor" module for more information. + Fixed DCX decoder (based on input from Larry Bates) + Added "IptcImagePlugin.getiptcinfo" helper to extract IPTC/NAA newsphoto properties from JPEG, TIFF, or IPTC files. + Support for TrueType/OpenType fonts has been added to the standard distribution. You need the freetype 2.0 library. + Made the PCX reader a bit more robust when reading 2-bit and 4-bit PCX images with odd image sizes. + Added "Kernel" class to the ImageFilter module. This class allows you to filter images with user-defined 3x3 and 5x5 convolution kernels. + Added "putdata" support for mode "I", "F" and "RGB". + The GIF writer now supports the transparency option (from Denis Benoit). + A HTML version of the module documentation is now shipped with the source code distribution. You'll find the files in the Doc subdirectory. + Added support for Palm pixmaps (from Bill Janssen). This change was listed for 1.1.3, but the "PalmImagePlugin" driver didn't make it into the distribution. + Improved decoder error messages. (1.1.3 final released) + Made setup.py look for old versions of zlib. For some back- ground, see: http://www.gzip.org/zlib/advisory-2002-03-11.txt (1.1.3c2 released) + Added setup.py file (tested on Unix and Windows). You still need to build libImaging/imaging.lib in the traditional way, but the setup.py script takes care of the rest. The old Setup.in/Makefile.pre.in build method is still supported. + Fixed segmentation violation in ANTIALIAS filter (an internal buffer wasn't properly allocated). (1.1.3c1 released) + Added ANTIALIAS downsampling filter for high-quality "resize" and "thumbnail" operations. Also added filter option to the "thumbnail" operation; the default value is NEAREST, but this will most likely change in future versions. + Fixed plugin loader to be more robust if the __file__ variable isn't set. + Added seek/tell support (for layers) to the PhotoShop loader. Layer 0 is the main image. + Added new (but experimental) "ImageOps" module, which provides shortcuts for commonly used operations on entire images. + Don't mess up when loading PNG images if the decoder leaves data in the output buffer. This could cause internal errors on some PNG images, with some versions of ZLIB. (Bug report and patch provided by Bernhard Herzog.) + Don't mess up on Unicode filenames. + Don't mess up when drawing on big endian platforms. + Made the TIFF loader a bit more robust; it can now read some more slightly broken TIFF files (based on input from Ted Wright, Bob Klimek, and D. Alan Stewart) + Added OS/2 EMX build files (from Andrew MacIntyre) + Change "ImageFont" to reject image files if they don't have the right mode. Older versions could leak memory for "P" images. (Bug reported by Markus Gritsch). + Renamed some internal functions to avoid potential build problem on Mac OS X. + Added DL_EXPORT where relevant (for Cygwin, based on input from Robert Yodlowski) + (re)moved bogus __init__ call in BdfFontFile (bug spotted by Fred Clare) + Added "ImageGrab" support (Windows only) + Added support for XBM hotspots (based on code contributed by Bernhard Herzog). + Added write support for more TIFF tags, namely the Artist, Copyright, DateTime, ResolutionUnit, Software, XResolution and YResolution tags (from Greg Couch) + Added TransposedFont wrapper to ImageFont module + Added "optimize" flag to GIF encoder. If optimize is present and non-zero, PIL will work harder to create a small file. + Raise "EOFError" (not IndexError) when reading beyond the end of a TIFF sequence. + Support rewind ("seek(0)") for GIF and TIFF sequences. + Load grayscale GIF images as mode "L" + Added DPI read/write support to the JPEG codec. The decoder sets the info["dpi"] attribute for JPEG files with JFIF dpi settings. The encoder uses the "dpi" option: im = Image.open("file.jpg") dpi = im.info["dpi"] # raises KeyError if DPI not known im.save("out.jpg", dpi=dpi) Note that PIL doesn't always preserve the "info" attribute for normal image operations. (1.1.2c1 and 1.1.2 final released) + Adapted to Python 2.1. Among other things, all uses of the "regex" module has been repleased with "re". + Fixed attribute error when reading large PNG files (this bug was introduced in maintenance code released after the 1.1.1 release) + Ignore non-string objects in sys.path + Fixed Image.transform(EXTENT) for negative xoffsets + Fixed loading of image plugins if PIL is installed as a package. (The plugin loader now always looks in the directory where the Image.py module itself is found, even if that directory isn't on the standard search path) + The Png plugin has been added to the list of preloaded standard formats + Fixed bitmap/text drawing in fill mode. + Fixed "getextrema" to work also for multiband images. + Added transparency support for L and P images to the PNG codec. + Improved support for read-only images. The "load" method now sets the "readonly" attribute for memory-mapped images. Operations that modifies an image in place (such as "paste" and drawing operations) creates an in-memory copy of the image, if necessary. (before this change, any attempt to modify a memory-mapped image resulted in a core dump...) + Added special cases for lists everywhere PIL expects a sequence. This should speed up things like "putdata" and drawing operations. + The Image.offset method is deprecated. Use the ImageChops.offset function instead. + Changed ImageChops operators to copy palette and info dictionary from the first image argument. (1.1.1 released) + Additional fixes for Python 1.6/2.0, including TIFF "save" bug. + Changed "init" to properly load plugins when PIL is used as a package. + Fixed broken "show" method (on Unix) *** Changes from release 1.0 to 1.1 *** + Adapted to Python 1.6 ("append" and other method changes) + Fixed Image.paste when pasting with solid colour and matte layers ("L" or "RGBA" masks) (bug reported by Robert Kern) + To make it easier to distribute prebuilt versions of PIL, the tkinit binding stuff has been moved to a separate extension module, named "_imagingtk". *** Changes from release 0.3b2 to 1.0 final *** + If there's no 16-bit integer (like on a Cray T3E), set INT16 to the smallest integer available. Most of the library works just fine anyway (from Bill Crutchfield) + Tweaks to make drawing work on big-endian platforms. (1.0c2 released) + If PIL is built with the WITH_TKINTER flag, ImageTk can automatically hook into a standard Tkinter build. You no longer need to build your own Tkinter to use the ImageTk module. The old way still works, though. For more information, see Tk/install.txt. + Some tweaks to ImageTk to support multiple Tk interpreters (from Greg Couch). + ImageFont "load_path" now scans directory mentioned in .pth files (from Richard Jones). (1.0c1 released) + The TIFF plugin has been rewritten. The new plugin fully supports all major PIL image modes (including F and I). + The ImageFile module now includes a Parser class, which can be used to incrementally decode an image file (while down- loading it from the net, for example). See the handbook for details. + "show" now converts non-standard modes to "L" or "RGB" (as appropriate), rather than writing weird things to disk for "xv" to choke upon. (bug reported by Les Schaffer). (1.0b2 released) + Major speedups for rotate, transform(EXTENT), and transform(AFFINE) when using nearest neighbour resampling. + Modified ImageDraw to be compatible with the Arrow graphics interface. See the handbook for details. + PIL now automatically loads file codecs when used as a package (from The Dragon De Monsyne). Also included an __init__.py file in the standard distribution. + The GIF encoder has been modified to produce much smaller files. PIL now uses a run-length encoding method to encode GIF files. On a random selection of GIF images grabbed from the web, this version makes the images about twice as large as the original LZW files, where the earlier version made them over 5 times larger. YMMV, of course. + Added PCX write support (works with "1", "P", "L", and "RGB") + Added "bitmap" and "textsize" methods to ImageDraw. + Improved font rendering code. Fixed a bug or two, and moved most of the time critical stuff to C. + Removed "bdf2pil.py". Use "pilfont.py" instead! + Improved 16-bit support (still experimental, though). The following methods now support "I;16" and "I;16B" images: "getpixel", "copy", "convert" (to and from mode "I"), "resize", "rotate", and "transform" with nearest neighbour filters, and "save" using the IM format. The "new" and "open" functions also work as expected. On Windows, 16-bit files are memory mapped. NOTE: ALL other operations are still UNDEFINED on 16-bit images. + The "paste" method now supports constant sources. Just pass a colour value (a number or a tuple, depending on the target image mode) instead of the source image. This was in fact implemented in an inefficient way in earlier versions (the "paste" method generated a temporary source image if you passed it a colour instead of an image). In this version, this is handled on the C level instead. + Added experimental "RGBa" mode support. An "RGBa" image is an RGBA image where the colour components have have been premultipled with the alpha value. PIL allows you to convert an RGBA image to an RGBa image, and to paste RGBa images on top of RGB images. Since this saves a bunch of multiplications and shifts, it is typically about twice as fast an ordinary RGBA paste. + Eliminated extra conversion step when pasting "RGBA" or "RGBa" images on top of "RGB" images. + Fixed Image.BICUBIC resampling for "RGB" images. + Fixed PCX image file handler to properly read 8-bit PCX files (bug introduced in 1.0b1, reported by Bernhard Herzog) + Fixed PSDraw "image" method to restore the coordinate system. + Fixed "blend" problem when applied to images that was not already loaded (reported by Edward C. Jones) + Fixed -f option to "pilconvert.py" (from Anthony Baxter) (1.0b1 released) + Added Toby J. Sargeant's quantization package. To enable quantization, use the "palette" option to "convert": imOut = im.convert("P", palette=Image.ADAPTIVE) This can be used with "L", "P", and "RGB" images. In this version, dithering cannot be used with adaptive palettes. Note: ADAPTIVE currently maps to median cut quantization with 256 colours. The quantization package also contains a maximum coverage quantizer, which will be supported by future versions of PIL. + Added Eric S. Raymond's "pildriver" image calculator to the distribution. See the docstring for more information. + The "offset" method no longer dumps core if given positive offsets (from Charles Waldman). + Fixed a resource leak that could cause ImageWin to run out of GDI resources (from Roger Burnham). + Added "arc", "chord", and "pieslice" methods to ImageDraw (inspired by code contributed by Richard Jones). + Added experimental 16-bit support, via modes "I;16" (little endian data) and "I;16B" (big endian). Only a few methods properly support such images (see above). + Added XV thumbnail file handler (from Gene Cash). + Fixed BMP image file handler to handle palette images with small palettes (from Rob Hooft). + Fixed Sun raster file handler for palette images (from Charles Waldman). + Improved various internal error messages. + Fixed Path constructor to handle arbitrary sequence objects. This also affects the ImageDraw class (from Richard Jones). + Fixed a bug in JpegDecode that caused PIL to report "decoder error -2" for some progressive JPEG files (reported by Magnus Källström, who also provided samples). + Fixed a bug in JpegImagePlugin that caused PIL to hang when loading JPEG files using 16-bit quantization tables. + The Image "transform" method now supports Image.QUAD transforms. The data argument is an 8-tuple giving the upper left, lower left, lower right, and upper right corner of the source quadri- lateral. Also added Image.MESH transform which takes a list of quadrilaterals. + The Image "resize", "rotate", and "transform" methods now support Image.BILINEAR (2x2) and Image.BICUBIC (4x4) resampling filters. Filters can be used with all transform methods. + The ImageDraw "rectangle" method now includes both the right and the bottom edges when drawing filled rectangles. + The TGA decoder now works properly for runlength encoded images which have more than one byte per pixel. + "getbands" on an YCbCr image now returns ("Y", "Cb", "Cr") + Some file drivers didn't handle the optional "modify" argument to the load method. This resulted in exceptions when you used "paste" (and other methods that modify an image in place) on a newly opened file. *** Changes from release 0.2 (b5) to 0.3 (b2) *** (0.3b2 released) The test suite includes 825 individual tests. + An Image "getbands" method has been added. It returns a tuple containing the individual band names for this image. To figure out how many bands an image has, use "len(im.getbands())". + An Image "putpixel" method has been added. + The Image "point" method can now be used to convert "L" images to any other format, via a lookup table. That table should contain 256 values for each band in the output image. + Some file drivers (including FLI/FLC, GIF, and IM) accidently overwrote the offset method with an internal attribute. All drivers have been updated to use private attributes where possible. + The Image "histogram" method now works for "I" and "F" images. For these modes, PIL divides the range between the min and max values used in the image into 256 bins. You can also pass in your own min and max values via the "extrema" option: h = im.histogram(extrema=(0, 255)) + An Image "getextrema" method has been added. It returns the min and max values used in the image. In this release, this works for single band images only. + Changed the PNG driver to load and save mode "I" images as 16-bit images. When saving, values outside the range 0..65535 are clipped. + Fixed ImageFont.py to work with the new "pilfont" compiler. + Added JPEG "save" and "draft" support for mode "YCbCr" images. Note that if you save an "YCbCr" image as a JPEG file and read it back, it is read as an RGB file. To get around this, you can use the "draft" method: im = Image.open("color.jpg") im.draft("YCbCr", im.size) + Read "RGBA" TGA images. Also fixed the orientation bug; all images should now come out the right way. + Changed mode name (and internal representation) from "YCrCb" to "YCbCr" (!) *** WARNING: MAY BREAK EXISTING CODE *** (0.3b1 released) The test suite includes 750 individual tests. + The "pilfont" package is now included in the standard PIL distribution. The pilfont utility can be used to convert X BDF and PCF raster font files to a format understood by the ImageFont module. + GIF files are now interlaced by default. To write a non-interlaced file, pass interlace=0 to the "save" method. + The default string format has changed for the "fromstring" and "tostring" methods. *** WARNING: MAY BREAK EXISTING CODE *** NOTE: If no extra arguments are given, the first line in the string buffer is the top line of the image, instead of the bottom line. For RGB images, the string now contains 3 bytes per pixel instead of 4. These changes were made to make the methods compatible with the "fromstring" factory function. To get the old behaviour, use the following syntax: data = im.tostring("raw", "RGBX", 0, -1) im.fromstring(data, "raw", "RGBX", 0, -1) + "new" no longer gives a MemoryError if the width or height is zero (this only happened on platforms where malloc(0) or calloc(0) returns NULL). + "new" now adds a default palette object to "P" images. + You can now convert directly between all modes supported by PIL. When converting colour images to "P", PIL defaults to a "web" palette and dithering. When converting greyscale images to "1", PIL uses a thresholding and dithering. + Added a "dither" option to "convert". By default, "convert" uses floyd-steinberg error diffusion for "P" and "1" targets, so this option is only used to *disable* dithering. Allowed values are NONE (no dithering) or FLOYDSTEINBERG (default). imOut = im.convert("P", dither=Image.NONE) + Added a full set of "I" decoders. You can use "fromstring" (and file decoders) to read any standard integer type as an "I" image. + Added some support for "YCbCr" images (creation, conversion from/to "L" and "RGB", IM YCC load/save) + "getpixel" now works properly with fractional coordinates. + ImageDraw "setink" now works with "I", "F", "RGB", "RGBA", "RGBX", "CMYK", and "YCbCr" images. + ImImagePlugin no longer attaches palettes to "RGB" images. + Various minor fixes. (0.3a4 released) + Added experimental IPTC/NAA support. + Eliminated AttributeError exceptions after "crop" (from Skip Montanaro) + Reads some uncompressed formats via memory mapping (this is currently supported on Win32 only) + Fixed some last minute glitches in the last alpha release (Types instead of types in Image.py, version numbers, etc.) + Eliminated some more bogus compiler warnings. + Various fixes to make PIL compile and run smoother on Macs (from Jack Jansen). + Fixed "fromstring" and "tostring" for mode "I" images. (0.3a3 released) The test suite includes 530 individual tests. + Eliminated unexpected side-effect in "paste" with matte. "paste" now works properly also if compiled with "gcc". + Adapted to Python 1.5 (build issues only) + Fixed the ImageDraw "point" method to draw also the last point (!). + Added "I" and "RGBX" support to Image.new. + The plugin path is now properly prepended to the module search path when a plugin module is imported. + Added "draw" method to the ImageWin.Dib class. This is used by Topaz to print images on Windows printers. + "convert" now supports conversions from "P" to "1" and "F". + "paste" can now take a colour instead of an image as the first argument. The colour must match the colour argument given to the new function, and match the mode of the target image. + Fixed "paste" to allow a mask also for mode "F" images. + The BMP driver now saves mode "1" images. When loading images, the mode is set to "L" for 8-bit files with greyscale palettes, and to "P" for other 8-bit files. + The IM driver now reads and saves "1" images (file modes "0 1" or "L 1"). + The JPEG and GIF drivers now saves "1" images. For JPEG, the image is saved as 8-bit greyscale (it will load as mode "L"). For GIF, the image will be loaded as a "P" image. + Fixed a potential buffer overrun in the GIF encoder. (0.3a2 released) The test suite includes 400 individual tests. + Improvements to the test suite revealed a number of minor bugs, which are all fixed. Note that crop/paste, 32-bit ImageDraw, and ImageFont are still weak spots in this release. + Added "putpalette" method to the Image class. You can use this to add or modify the palette for "P" and "L" images. If a palette is added to an "L" image, it is automatically converted to a "P" image. + Fixed ImageDraw to properly handle 32-bit image memories ("RGB", "RGBA", "CMYK", "F") + Fixed "fromstring" and "tostring" not to mess up the mode attribute in default mode. + Changed ImPlatform.h to work on CRAY's (don't have one at home, so I haven't tried it). The previous version assumed that either "short" or "int" were 16-bit wide. PIL still won't compile on platforms where neither "short", "int" nor "long" are 32-bit wide. + Added file= and data= keyword arguments to PhotoImage and BitmapImage. This allows you to use them as drop-in replacements for the corre- sponding Tkinter classes. + Removed bogus references to the crack coder (ImagingCrack). (0.3a1 released) + Make sure image is loaded in "tostring". + Added floating point packer (native 32-bit floats only). *** Changes from release 0.1b1 to 0.2 (b5) *** + Modified "fromstring" and "tostring" methods to use file codecs. Also added "fromstring" factory method to create an image directly from data in a string. + Added support for 32-bit floating point images (mode "F"). You can convert between "L" and "F" images, and apply a subset of the available image processing methods on the "F" image. You can also read virtually any data format into a floating point image memory; see the section on "Decoding Floating Point Data" in the handbook for more information. (0.2b5 released; on windows only) + Fixed the tobitmap() method to work properly for small bitmaps. + Added RMS and standard deviation to the ImageStat.Stat class. Also modified the constructor to take an optional feature mask, and also to accept either an image or a list containing the histogram data. + The BitmapImage code in ImageTk can now use a special bitmap decoder, which has to be patched into Tk. See the "Tk/pilbitmap.txt" file for details. If not installed, bitmaps are transferred to Tk as XBM strings. + The PhotoImage code in ImageTk now uses a Tcl command ("PyImagingPaste") instead of a special image type. This gives somewhat better performance, and also allows PIL to support transparency. *** WARNING: TKAPPINIT MUST BE MODIFIED *** + ImageTk now honours the alpha layer in RGBA images. Only fully transparent pixels are made transparent (that is, the alpha layer is treated as a mask). To treat the alpha laters as a matte, you must paste the image on the background before handing it over to ImageTk. + Added McIdas reader (supports 8-bit images only). + PIL now preloads drivers for BMP, GIF, JPEG, PPM, and TIFF. As long as you only load and save these formats, you don't have to wait for a full scan for drivers. To force scanning, call the Image.init() function. + The "seek" and "tell" methods are now always available, also for single-frame images. + Added optional mask argument to histogram method. The mask may be an "1" or "L" image with the same size as the original image. Only pixels where the mask is non-zero are included in the histogram. + The "paste" method now allows you to specify only the lower left corner (a 2-tuple), instead of the full region (a 4-tuple). + Reverted to old plugin scanning model; now scans all directory names in the path when looking for plugins. + Added PIXAR raster support. Only uncompressed ("dumped") RGB images can currently be read (based on information provided by Greg Coats). + Added FlashPix (FPX) read support. Reads all pixel formats, but only the highest resolution is read, and the viewing transform is currently ignored. + Made PNG encoding somewhat more efficient in "optimize" mode; a bug in 0.2b4 didn't enable all predictor filters when optimized storage were requested. + Added Microsoft Image Composer (MIC) read support. When opened, the first sprite in the file is loaded. You can use the seek method to load additional sprites from the file. + Properly reads "P" and "CMYK" PSD images. + "pilconvert" no longer optimizes by default; use the -o option to make the file as small as possible (at the expense of speed); use the -q option to set the quality when compressing to JPEG. + Fixed "crop" not to drop the palette for "P" images. + Added and verified FLC support. + Paste with "L" or "RGBA" alpha is now several times faster on most platforms. + Changed Image.new() to initialize the image to black, as described in the handbook. To get an uninitialized image, use None as the colour. + Fixed the PDF encoder to produce a valid header; Acrobat no longer complains when you load PDF images created by PIL. + PIL only scans fully-qualified directory names in the path when looking for plugins. *** WARNING: MAY BREAK EXISTING CODE *** + Faster implementation of "save" used when filename is given, or when file object has "fileno" and "flush" methods. + Don't crash in "crop" if region extends outside the source image. + Eliminated a massive memory leak in the "save" function. + The GIF decoder doesn't crash if the code size is set to an illegal value. This could happen since another bug didn't handle local palettes properly if they didn't have the same size as the global palette (not very common). + Added predictor support (TIFF 6.0 section 14) to the TIFF decoder. + Fixed palette and padding problems in BMP driver. Now properly writes "1", "L", "P" and "RGB" images. + Fixed getpixel()/getdata() to return correct pixel values. + Added PSD (PhotoShop) read support. Reads both uncompressed and compressed images of most types. + Added GIF write support (writes "uncompressed" GIF files only, due to unresolvable licensing issues). The "gifmaker.py" script can be used to create GIF animations. + Reads 8-bit "L" and "P" TGA images. Also reads 16-bit "RGB" images. + Added FLI read support. This driver has only been tested on a few FLI samples. + Reads 2-bit and 4-bit PCX images. + Added MSP read and write support. Both version 1 and 2 can be read, but only version 1 (uncompressed) files are written. + Fixed a bug in the FLI/FLC identification code that caused the driver to raise an exception when parsing valid FLI/FLC files. + Improved performance when loading file format plugins, and when opening files. + Added GIF animation support, via the "seek" and "tell" methods. You can use "player.py" to play an animated GIF file. + Removed MNG support, since the spec is changing faster than I can change the code. I've added support for the experimental ARG format instead. Contact me for more information on this format. + Added keyword options to the "save" method. The following options are currently supported: format option description -------------------------------------------------------- JPEG optimize minimize output file at the expense of compression speed. JPEG progressive enable progressive output. the option value is ignored. JPEG quality set compression quality (1-100). the default value is 75. JPEG smooth smooth dithered images. value is strengh (1-100). default is off (0). PNG optimize minimize output file at the expense of compression speed. Expect more options in future releases. Also note that file writers silently ignore unknown options. + Plugged memory leaks in the PNG and TIFF decoders. + Added PNG write support. + (internal) RGB unpackers and converters now set the pad byte to 255 (full opacity). + Properly handles the "transparency" property for GIF, PNG and XPM files. + Added a "putalpha" method, allowing you to attach a "1" or "L" image as the alpha layer to an "RGBA" image. + Various improvements to the sample scripts: "pilconvert" Carries out some extra tricks in order to make the resulting file as small as possible. "explode" (NEW) Split an image sequence into individual frames. "gifmaker" (NEW) Convert a sequence file into a GIF animation. Note that the GIF encoder create "uncompressed" GIF files, so animations created by this script are rather large (typically 2-5 times the compressed sizes). "image2py" (NEW) Convert a single image to a python module. See comments in this script for details. "player" If multiple images are given on the command line, they are interpreted as frames in a sequence. The script assumes that they all have the same size. Also note that this script now can play FLI/FLC and GIF animations. This player can also execute embedded Python animation applets (ARG format only). "viewer" Transparent images ("P" with transparency property, and "RGBA") are superimposed on the standard Tk back- ground. + Fixed colour argument to "new". For multilayer images, pass a tuple: (Red, Green, Blue), (Red, Green, Blue, Alpha), or (Cyan, Magenta, Yellow, Black). + Added XPM (X pixmap) read support. (0.2b3 released) + Added MNG (multi-image network graphics) read support. "Ming" is a proposed animation standard, based on the PNG file format. You can use the "player" sample script to display some flavours of this format. The MNG standard is still under development, as is this driver. More information, including sample files, can be found at + Added a "verify" method to images loaded from file. This method scans the file for errors, without actually decoding the image data, and raises a suitable exception if it finds any problems. Currently implemented for PNG and MNG files only. + Added support for interlaced GIF images. + Added PNG read support -- if linked with the ZLIB compression library, PIL reads all kinds of PNG images, except interlaced files. + Improved PNG identification support -- doesn't mess up on unknown chunks, identifies all possible PNG modes, and verifies checksum on PNG header chunks. + Added an experimental reader for placable Windows Meta Files (WMF). This reader is still very incomplete, but it illustrates how PIL's drawing capabilities can be used to render vector and metafile formats. + Added restricted drivers for images from Image Tools (greyscale only) and LabEye/IFUNC (common interchange modes only). + Some minor improvements to the sample scripts provided in the "Scripts" directory. + The test images have been moved to the "Images" directory. (0.2b2 released) (0.2b1 released; Windows only) + Fixed filling of complex polygons. The ImageDraw "line" and "polygon" methods also accept Path objects. + The ImageTk "PhotoImage" object can now be constructed directly from an image. You can also pass the object itself to Tkinter, instead of using the "image" attribute. Finally, using "paste" on a displayed image automatically updates the display. + The ImageTk "BitmapImage" object allows you to create transparent overlays from 1-bit images. You can pass the object itself to Tkinter. The constructor takes the same arguments as the Tkinter BitmapImage class; use the "foreground" option to set the colour of the overlay. + Added a "putdata" method to the Image class. This can be used to load a 1-layer image with data from a sequence object or a string. An optional floating point scale and offset can be used to adjust the data to fit into the 8-bit pixel range. Also see the "getdata" method. + Added the EXTENT method to the Image "transform" method. This can be used to quickly crop, stretch, shrink, or mirror a subregion from another image. + Adapted to Python 1.4. + Added a project makefile for Visual C++ 4.x. This allows you to easily build a dynamically linked version of PIL for Windows 95 and NT. + A Tk "booster" patch for Windows is available. It gives dramatic performance improvements for some displays. Has been tested with Tk 4.2 only, but is likely to work with Tk 4.1 as well. See the Tk subdirectory for details. + You can now save 1-bit images in the XBM format. In addition, the Image class now provides a "tobitmap" method which returns a string containing an XBM representation of the image. Quite handy to use with Tk. + More conversions, including "RGB" to "1" and more. (0.2a1 released) + Where earlier versions accepted lists, this version accepts arbitrary Python sequences (including strings, in some cases). A few resource leaks were plugged in the process. + The Image "paste" method now allows the box to extend outside the target image. The size of the box, the image to be pasted, and the optional mask must still match. + The ImageDraw module now supports filled polygons, outlined and filled ellipses, and text. Font support is rudimentary, though. + The Image "point" method now takes an optional mode argument, allowing you to convert the image while translating it. Currently, this can only be used to convert "L" or "P" images to "1" images (creating thresholded images or "matte" masks). + An Image "getpixel" method has been added. For single band images, it returns the pixel value at a given position as an integer. For n-band images, it returns an n-tuple of integers. + An Image "getdata" method has been added. It returns a sequence object representing the image as a 1-dimensional array. Only len() and [] can be used with this sequence. This method returns a reference to the existing image data, so changes in the image will be immediately reflected in the sequence object. + Fixed alignment problems in the Windows BMP writer. + If converting an "RGB" image to "RGB" or "L", you can give a second argument containing a colour conversion matrix. + An Image "getbbox" method has been added. It returns the bounding box of data in an image, considering the value 0 as background. + An Image "offset" method has been added. It returns a new image where the contents of the image have been offset the given distance in X and/or Y direction. Data wraps between edges. + Saves PDF images. The driver creates a binary PDF 1.1 files, using JPEG compression for "L", "RGB", and "CMYK" images, and hex encoding (same as for PostScript) for other formats. + The "paste" method now accepts "1" masks. Zero means transparent, any other pixel value means opaque. This is faster than using an "L" transparency mask. + Properly writes EPS files (and properly prints images to postscript printers as well). + Reads 4-bit BMP files, as well as 4 and 8-bit Windows ICO and CUR files. Cursor animations are not supported. + Fixed alignment problems in the Sun raster loader. + Added "draft" and "thumbnail" methods. The draft method is used to optimize loading of JPEG and PCD files, the thumbnail method is used to create a thumbnail representation of an image. + Added Windows display support, via the ImageWin class (see the handbook for details). + Added raster conversion for EPS files. This requires GNU or Aladdin Ghostscript, and probably works on UNIX only. + Reads PhotoCD (PCD) images. The base resolution (768x512) can be read from a PhotoCD file. + Eliminated some compiler warnings. Bindings now compile cleanly in C++ mode. Note that the Imaging library itself must be compiled in C mode. + Added "bdf2pil.py", which converts BDF fonts into images with associated metrics. This is definitely work in progress. For info, see description in script for details. + Fixed a bug in the "ImageEnhance.py" module. + Fixed a bug in the netpbm save hack in "GifImagePlugin.py" + Fixed 90 and 270 degree rotation of rectangular images. + Properly reads 8-bit TIFF palette-color images. + Reads plane separated RGB and CMYK TIFF images. + Added driver debug mode. This is enabled by setting Image.DEBUG to a non-zero value. Try the -D option to "pilfile.py" and see what happens. + Don't crash on "atend" constructs in PostScript files. + Only the Image module imports _imaging directly. Other modules should refer to the binding module as "Image.core". *** Changes from release 0.0 to 0.1 (b1) *** + A handbook is available (distributed separately). + The coordinate system is changed so that (0,0) is now located in the upper left corner. This is in compliancy with ISO 12087 and 90% of all other image processing and graphics libraries. + Modes "1" (bilevel) and "P" (palette) have been introduced. Note that bilevel images are stored with one byte per pixel. + The Image "crop" and "paste" methods now accepts None as the box argument, to refer to the full image (self, that is). + The Image "crop" method now works properly. + The Image "point" method is now available. You can use either a lookup table or a function taking one argument. + The Image join function has been renamed to "merge". + An Image "composite" function has been added. It is identical to copy() followed by paste(mask). + An Image "eval" function has been added. It is currently identical to point(function); that is, only a single image can be processed. + A set of channel operations has been added. See the "ImageChops" module, test_chops.py, and the handbook for details. + Added the "pilconvert" utility, which converts image files. Note that the number of output formats are still quite restricted. + Added the "pilfile" utility, which quickly identifies image files (without loading them, in most cases). + Added the "pilprint" utility, which prints image files to Postscript printers. + Added a rudimentary version of the "pilview" utility, which is simple image viewer based on Tk. Only File/Exit and Image/Next works properly. + An interface to Tk has been added. See "Lib/ImageTk.py" and README for details. + An interface to Jack Jansen's Img library has been added (thanks to Jack). This allows you to read images through the Img extensions file format handlers. See the file "Lib/ImgExtImagePlugin.py" for details. + Postscript printing is provided through the PSDraw module. See the handbook for details. Keywords: Imaging Platform: UNKNOWN Classifier: Development Status :: 6 - Mature Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera Classifier: Topic :: Multimedia :: Graphics :: Capture :: Scanners Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion Classifier: Topic :: Multimedia :: Graphics :: Viewers Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 pillow-2.3.0/Pillow.egg-info/zip-safe0000644000175000001440000000000112257506432016273 0ustar dokousers pillow-2.3.0/_webp.c0000644000175000001440000002006712257506326013152 0ustar dokousers#define PY_SSIZE_T_CLEAN #include #include "py3.h" #include #include #include #ifdef HAVE_WEBPMUX #include #endif PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) { int width; int height; int lossless; float quality_factor; uint8_t *rgb; uint8_t *icc_bytes; uint8_t *exif_bytes; uint8_t *output; char *mode; Py_ssize_t size; Py_ssize_t icc_size; Py_ssize_t exif_size; size_t ret_size; if (!PyArg_ParseTuple(args, "s#iiifss#s#", (char**)&rgb, &size, &width, &height, &lossless, &quality_factor, &mode, &icc_bytes, &icc_size, &exif_bytes, &exif_size)) { Py_RETURN_NONE; } if (strcmp(mode, "RGBA")==0){ if (size < width * height * 4){ Py_RETURN_NONE; } if (lossless) { ret_size = WebPEncodeLosslessRGBA(rgb, width, height, 4* width, &output); } else { ret_size = WebPEncodeRGBA(rgb, width, height, 4* width, quality_factor, &output); } } else if (strcmp(mode, "RGB")==0){ if (size < width * height * 3){ Py_RETURN_NONE; } if (lossless) { ret_size = WebPEncodeLosslessRGB(rgb, width, height, 3* width, &output); } else { ret_size = WebPEncodeRGB(rgb, width, height, 3* width, quality_factor, &output); } } else { Py_RETURN_NONE; } #ifndef HAVE_WEBPMUX if (ret_size > 0) { PyObject *ret = PyBytes_FromStringAndSize((char*)output, ret_size); free(output); return ret; } #else { /* I want to truncate the *_size items that get passed into webp data. Pypy2.1.0 had some issues where the Py_ssize_t items had data in the upper byte. (Not sure why, it shouldn't have been there) */ int i_icc_size = (int)icc_size; int i_exif_size = (int)exif_size; WebPData output_data = {0}; WebPData image = { output, ret_size }; WebPData icc_profile = { icc_bytes, i_icc_size }; WebPData exif = { exif_bytes, i_exif_size }; WebPMuxError err; int dbg = 0; int copy_data = 0; // value 1 indicates given data WILL be copied to the mux // and value 0 indicates data will NOT be copied. WebPMux* mux = WebPMuxNew(); WebPMuxSetImage(mux, &image, copy_data); if (dbg) { /* was getting %ld icc_size == 0, icc_size>0 was true */ fprintf(stderr, "icc size %d, %d \n", i_icc_size, i_icc_size > 0); } if (i_icc_size > 0) { if (dbg) { fprintf (stderr, "Adding ICC Profile\n"); } err = WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); if (dbg && err == WEBP_MUX_INVALID_ARGUMENT) { fprintf(stderr, "Invalid ICC Argument\n"); } else if (dbg && err == WEBP_MUX_MEMORY_ERROR) { fprintf(stderr, "ICC Memory Error\n"); } } if (dbg) { fprintf(stderr, "exif size %d \n", i_exif_size); } if (i_exif_size > 0) { if (dbg){ fprintf (stderr, "Adding Exif Data\n"); } err = WebPMuxSetChunk(mux, "EXIF", &exif, copy_data); if (dbg && err == WEBP_MUX_INVALID_ARGUMENT) { fprintf(stderr, "Invalid Exif Argument\n"); } else if (dbg && err == WEBP_MUX_MEMORY_ERROR) { fprintf(stderr, "Exif Memory Error\n"); } } WebPMuxAssemble(mux, &output_data); WebPMuxDelete(mux); free(output); ret_size = output_data.size; if (ret_size > 0) { PyObject *ret = PyBytes_FromStringAndSize((char*)output_data.bytes, ret_size); WebPDataClear(&output_data); return ret; } } #endif Py_RETURN_NONE; } PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) { PyBytesObject *webp_string; uint8_t *webp; Py_ssize_t size; PyObject *ret, *bytes, *pymode, *icc_profile = Py_None, *exif = Py_None; WebPDecoderConfig config; VP8StatusCode vp8_status_code = VP8_STATUS_OK; char* mode = "RGB"; if (!PyArg_ParseTuple(args, "S", &webp_string)) { Py_RETURN_NONE; } if (!WebPInitDecoderConfig(&config)) { Py_RETURN_NONE; } PyBytes_AsStringAndSize((PyObject *) webp_string, (char**)&webp, &size); vp8_status_code = WebPGetFeatures(webp, size, &config.input); if (vp8_status_code == VP8_STATUS_OK) { // If we don't set it, we don't get alpha. // Initialized to MODE_RGB if (config.input.has_alpha) { config.output.colorspace = MODE_RGBA; mode = "RGBA"; } #ifndef HAVE_WEBPMUX vp8_status_code = WebPDecode(webp, size, &config); #else { int copy_data = 0; WebPData data = { webp, size }; WebPMuxFrameInfo image; WebPData icc_profile_data = {0}; WebPData exif_data = {0}; WebPMux* mux = WebPMuxCreate(&data, copy_data); WebPMuxGetFrame(mux, 1, &image); webp = (uint8_t*)image.bitstream.bytes; size = image.bitstream.size; vp8_status_code = WebPDecode(webp, size, &config); WebPMuxGetChunk(mux, "ICCP", &icc_profile_data); if (icc_profile_data.size > 0) { icc_profile = PyBytes_FromStringAndSize((const char*)icc_profile_data.bytes, icc_profile_data.size); } WebPMuxGetChunk(mux, "EXIF", &exif_data); if (exif_data.size > 0) { exif = PyBytes_FromStringAndSize((const char*)exif_data.bytes, exif_data.size); } WebPMuxDelete(mux); } #endif } if (vp8_status_code != VP8_STATUS_OK) { WebPFreeDecBuffer(&config.output); Py_RETURN_NONE; } if (config.output.colorspace < MODE_YUV) { bytes = PyBytes_FromStringAndSize((char *)config.output.u.RGBA.rgba, config.output.u.RGBA.size); } else { // Skipping YUV for now. Need Test Images. // UNDONE -- unclear if we'll ever get here if we set mode_rgb* bytes = PyBytes_FromStringAndSize((char *)config.output.u.YUVA.y, config.output.u.YUVA.y_size); } #if PY_VERSION_HEX >= 0x03000000 pymode = PyUnicode_FromString(mode); #else pymode = PyString_FromString(mode); #endif ret = Py_BuildValue("SiiSSS", bytes, config.output.width, config.output.height, pymode, icc_profile, exif); WebPFreeDecBuffer(&config.output); return ret; } // Return the decoder's version number, packed in hexadecimal using 8bits for // each of major/minor/revision. E.g: v2.5.7 is 0x020507. PyObject* WebPDecoderVersion_wrapper(PyObject* self, PyObject* args){ return Py_BuildValue("i", WebPGetDecoderVersion()); } /* * The version of webp that ships with (0.1.3) Ubuntu 12.04 doesn't handle alpha well. * Files that are valid with 0.3 are reported as being invalid. */ PyObject* WebPDecoderBuggyAlpha_wrapper(PyObject* self, PyObject* args){ return Py_BuildValue("i", WebPGetDecoderVersion()==0x0103); } static PyMethodDef webpMethods[] = { {"WebPEncode", WebPEncode_wrapper, METH_VARARGS, "WebPEncode"}, {"WebPDecode", WebPDecode_wrapper, METH_VARARGS, "WebPDecode"}, {"WebPDecoderVersion", WebPDecoderVersion_wrapper, METH_VARARGS, "WebPVersion"}, {"WebPDecoderBuggyAlpha", WebPDecoderBuggyAlpha_wrapper, METH_VARARGS, "WebPDecoderBuggyAlpha"}, {NULL, NULL} }; void addMuxFlagToModule(PyObject* m) { #ifdef HAVE_WEBPMUX PyModule_AddObject(m, "HAVE_WEBPMUX", Py_True); #else PyModule_AddObject(m, "HAVE_WEBPMUX", Py_False); #endif } #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__webp(void) { PyObject* m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "_webp", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ webpMethods, /* m_methods */ }; m = PyModule_Create(&module_def); addMuxFlagToModule(m); return m; } #else PyMODINIT_FUNC init_webp(void) { PyObject* m = Py_InitModule("_webp", webpMethods); addMuxFlagToModule(m); } #endif pillow-2.3.0/.travis.yml0000644000175000001440000000052612257510366014020 0ustar dokouserslanguage: python # for python-qt4 virtualenv: system_site_packages: true python: - 2.6 - 2.7 - 3.2 - 3.3 install: "sudo apt-get -qq install libfreetype6-dev liblcms2-dev libwebp-dev python-qt4 ghostscript"" script: - python setup.py clean - python setup.py build_ext --inplace - python selftest.py - python Tests/run.py pillow-2.3.0/decode.c0000644000175000001440000004761312257510072013300 0ustar dokousers/* * The Python Imaging Library. * * standard decoder interfaces for the Imaging library * * history: * 1996-03-28 fl Moved from _imagingmodule.c * 1996-04-15 fl Support subregions in setimage * 1996-04-19 fl Allocate decoder buffer (where appropriate) * 1996-05-02 fl Added jpeg decoder * 1996-05-12 fl Compile cleanly as C++ * 1996-05-16 fl Added hex decoder * 1996-05-26 fl Added jpeg configuration parameters * 1996-12-14 fl Added zip decoder * 1996-12-30 fl Plugged potential memory leak for tiled images * 1997-01-03 fl Added fli and msp decoders * 1997-01-04 fl Added sun_rle and tga_rle decoders * 1997-05-31 fl Added bitfield decoder * 1998-09-11 fl Added orientation and pixelsize fields to tga_rle decoder * 1998-12-29 fl Added mode/rawmode argument to decoders * 1998-12-30 fl Added mode argument to *all* decoders * 2002-06-09 fl Added stride argument to pcx decoder * * Copyright (c) 1997-2002 by Secret Labs AB. * Copyright (c) 1995-2002 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ /* FIXME: make these pluggable! */ #include "Python.h" #include "Imaging.h" #include "py3.h" #include "Gif.h" #include "Lzw.h" #include "Raw.h" #include "Bit.h" /* -------------------------------------------------------------------- */ /* Common */ /* -------------------------------------------------------------------- */ typedef struct { PyObject_HEAD int (*decode)(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); int (*cleanup)(ImagingCodecState state); struct ImagingCodecStateInstance state; Imaging im; PyObject* lock; } ImagingDecoderObject; static PyTypeObject ImagingDecoderType; static ImagingDecoderObject* PyImaging_DecoderNew(int contextsize) { ImagingDecoderObject *decoder; void *context; if(PyType_Ready(&ImagingDecoderType) < 0) return NULL; decoder = PyObject_New(ImagingDecoderObject, &ImagingDecoderType); if (decoder == NULL) return NULL; /* Clear the decoder state */ memset(&decoder->state, 0, sizeof(decoder->state)); /* Allocate decoder context */ if (contextsize > 0) { context = (void*) calloc(1, contextsize); if (!context) { Py_DECREF(decoder); (void) PyErr_NoMemory(); return NULL; } } else context = 0; /* Initialize decoder context */ decoder->state.context = context; /* Target image */ decoder->lock = NULL; decoder->im = NULL; /* Initialize the cleanup function pointer */ decoder->cleanup = NULL; return decoder; } static void _dealloc(ImagingDecoderObject* decoder) { free(decoder->state.buffer); free(decoder->state.context); Py_XDECREF(decoder->lock); PyObject_Del(decoder); } static PyObject* _decode(ImagingDecoderObject* decoder, PyObject* args) { UINT8* buffer; int bufsize, status; if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH, &buffer, &bufsize)) return NULL; status = decoder->decode(decoder->im, &decoder->state, buffer, bufsize); return Py_BuildValue("ii", status, decoder->state.errcode); } static PyObject* _decode_cleanup(ImagingDecoderObject* decoder, PyObject* args) { int status = 0; if (decoder->cleanup){ status = decoder->cleanup(&decoder->state); } return Py_BuildValue("i", status); } extern Imaging PyImaging_AsImaging(PyObject *op); static PyObject* _setimage(ImagingDecoderObject* decoder, PyObject* args) { PyObject* op; Imaging im; ImagingCodecState state; int x0, y0, x1, y1; x0 = y0 = x1 = y1 = 0; /* FIXME: should publish the ImagingType descriptor */ if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1)) return NULL; im = PyImaging_AsImaging(op); if (!im) return NULL; decoder->im = im; state = &decoder->state; /* Setup decoding tile extent */ if (x0 == 0 && x1 == 0) { state->xsize = im->xsize; state->ysize = im->ysize; } else { state->xoff = x0; state->yoff = y0; state->xsize = x1 - x0; state->ysize = y1 - y0; } if (state->xsize <= 0 || state->xsize + state->xoff > (int) im->xsize || state->ysize <= 0 || state->ysize + state->yoff > (int) im->ysize) { PyErr_SetString(PyExc_ValueError, "tile cannot extend outside image"); return NULL; } /* Allocate memory buffer (if bits field is set) */ if (state->bits > 0) { if (!state->bytes) state->bytes = (state->bits * state->xsize+7)/8; state->buffer = (UINT8*) malloc(state->bytes); if (!state->buffer) return PyErr_NoMemory(); } /* Keep a reference to the image object, to make sure it doesn't go away before we do */ Py_INCREF(op); Py_XDECREF(decoder->lock); decoder->lock = op; Py_INCREF(Py_None); return Py_None; } static struct PyMethodDef methods[] = { {"decode", (PyCFunction)_decode, 1}, {"cleanup", (PyCFunction)_decode_cleanup, 1}, {"setimage", (PyCFunction)_setimage, 1}, {NULL, NULL} /* sentinel */ }; static PyTypeObject ImagingDecoderType = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingDecoder", /*tp_name*/ sizeof(ImagingDecoderObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; /* -------------------------------------------------------------------- */ int get_unpacker(ImagingDecoderObject* decoder, const char* mode, const char* rawmode) { int bits; ImagingShuffler unpack; unpack = ImagingFindUnpacker(mode, rawmode, &bits); if (!unpack) { Py_DECREF(decoder); PyErr_SetString(PyExc_ValueError, "unknown raw mode"); return -1; } decoder->state.shuffle = unpack; decoder->state.bits = bits; return 0; } /* -------------------------------------------------------------------- */ /* BIT (packed fields) */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_BitDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; int bits = 8; int pad = 8; int fill = 0; int sign = 0; int ystep = 1; if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, &sign, &ystep)) return NULL; if (strcmp(mode, "F") != 0) { PyErr_SetString(PyExc_ValueError, "bad image mode"); return NULL; } decoder = PyImaging_DecoderNew(sizeof(BITSTATE)); if (decoder == NULL) return NULL; decoder->decode = ImagingBitDecode; decoder->state.ystep = ystep; ((BITSTATE*)decoder->state.context)->bits = bits; ((BITSTATE*)decoder->state.context)->pad = pad; ((BITSTATE*)decoder->state.context)->fill = fill; ((BITSTATE*)decoder->state.context)->sign = sign; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* FLI */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_FliDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; decoder->decode = ImagingFliDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* GIF */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_GifDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; int bits = 8; int interlace = 0; if (!PyArg_ParseTuple(args, "s|ii", &mode, &bits, &interlace)) return NULL; if (strcmp(mode, "L") != 0 && strcmp(mode, "P") != 0) { PyErr_SetString(PyExc_ValueError, "bad image mode"); return NULL; } decoder = PyImaging_DecoderNew(sizeof(GIFDECODERSTATE)); if (decoder == NULL) return NULL; decoder->decode = ImagingGifDecode; ((GIFDECODERSTATE*)decoder->state.context)->bits = bits; ((GIFDECODERSTATE*)decoder->state.context)->interlace = interlace; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* HEX */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_HexDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) return NULL; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingHexDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* LZW */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_TiffLzwDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; int filter = 0; if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &filter)) return NULL; decoder = PyImaging_DecoderNew(sizeof(LZWSTATE)); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingLzwDecode; ((LZWSTATE*)decoder->state.context)->filter = filter; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* LibTiff */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBTIFF #include "TiffDecode.h" #include #ifdef __WIN32__ #define strcasecmp(s1, s2) stricmp(s1, s2) #endif PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; char* compname; int fp; if (! PyArg_ParseTuple(args, "sssi", &mode, &rawmode, &compname, &fp)) return NULL; TRACE(("new tiff decoder %s\n", compname)); decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE)); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; if (! ImagingLibTiffInit(&decoder->state, fp)) { Py_DECREF(decoder); PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); return NULL; } decoder->decode = ImagingLibTiffDecode; return (PyObject*) decoder; } #endif /* -------------------------------------------------------------------- */ /* MSP */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_MspDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, "1", "1") < 0) return NULL; decoder->decode = ImagingMspDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* PackBits */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) return NULL; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingPackbitsDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* PCD */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; /* Unpack from PhotoYCC to RGB */ if (get_unpacker(decoder, "RGB", "YCC;P") < 0) return NULL; decoder->decode = ImagingPcdDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* PCX */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_PcxDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; int stride; if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) return NULL; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->state.bytes = stride; decoder->decode = ImagingPcxDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* RAW */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_RawDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; int stride = 0; int ystep = 1; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) return NULL; decoder = PyImaging_DecoderNew(sizeof(RAWSTATE)); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingRawDecode; decoder->state.ystep = ystep; ((RAWSTATE*)decoder->state.context)->stride = stride; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* SUN RLE */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) return NULL; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingSunRleDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* TGA RLE */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; int ystep = 1; int depth = 8; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) return NULL; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingTgaRleDecode; decoder->state.ystep = ystep; decoder->state.count = depth / 8; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* XBM */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_XbmDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) return NULL; if (get_unpacker(decoder, "1", "1;R") < 0) return NULL; decoder->decode = ImagingXbmDecode; return (PyObject*) decoder; } /* -------------------------------------------------------------------- */ /* ZIP */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBZ #include "Zip.h" PyObject* PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; int interlaced = 0; if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) return NULL; decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE)); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingZipDecode; ((ZIPSTATE*)decoder->state.context)->interlaced = interlaced; return (PyObject*) decoder; } #endif /* -------------------------------------------------------------------- */ /* JPEG */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBJPEG /* We better define this decoder last in this file, so the following undef's won't mess things up for the Imaging library proper. */ #undef HAVE_PROTOTYPES #undef HAVE_STDDEF_H #undef HAVE_STDLIB_H #undef UINT8 #undef UINT16 #undef UINT32 #undef INT8 #undef INT16 #undef INT32 #include "Jpeg.h" PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args) { ImagingDecoderObject* decoder; char* mode; char* rawmode; /* what we wan't from the decoder */ char* jpegmode; /* what's in the file */ int scale = 1; int draft = 0; if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, &scale, &draft)) return NULL; if (!jpegmode) jpegmode = ""; decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE)); if (decoder == NULL) return NULL; if (get_unpacker(decoder, mode, rawmode) < 0) return NULL; decoder->decode = ImagingJpegDecode; decoder->cleanup = ImagingJpegDecodeCleanup; strncpy(((JPEGSTATE*)decoder->state.context)->rawmode, rawmode, 8); strncpy(((JPEGSTATE*)decoder->state.context)->jpegmode, jpegmode, 8); ((JPEGSTATE*)decoder->state.context)->scale = scale; ((JPEGSTATE*)decoder->state.context)->draft = draft; return (PyObject*) decoder; } #endif pillow-2.3.0/Sane/0000755000175000001440000000000012274164154012571 5ustar dokouserspillow-2.3.0/Sane/sanedoc.txt0000644000175000001440000002433512257506326014757 0ustar dokousersThe _sane_ module is an Python interface to the SANE (Scanning is Now Easy) library, which provides access to various raster scanning devices such as flatbed scanners and digital cameras. For more information about SANE, consult the SANE Web site at http://www.mostang.com/sane/ . Note that this documentation doesn't duplicate all the information in the SANE documentation, which you must also consult to get a complete understanding. This module has been originally developed by A.M. Kuchling (amk1@erols.com), now development has been taken over by Ralph Heinkel (rheinkel-at-email.de). If you write to me please make sure to have the word 'SANE' or 'sane' in the subject of your mail, otherwise it might be classified as spam in the future. The module exports two object types, a bunch of constants, and two functions. get_devices() Return a list of 4-tuples containing the available scanning devices. Each tuple contains 4 strings: the device name, suitable for passing to _open()_; the device's vendor; the model; and the type of device, such as 'virtual device' or 'video camera'. >>> import sane ; sane.get_devices() [('epson:libusb:001:004', 'Epson', 'GT-8300', 'flatbed scanner')] open(devicename) Open a device, given a string containing its name. SANE devices have names like 'epson:libusb:001:004'. If the attempt to open the device fails, a _sane.error_ exception will be raised. If there are no problems, a SaneDev object will be returned. As an easy way to open the scanner (if only one is available) just type >>> sane.open(sane.get_devices()[0][0]) SaneDev objects =============== The basic process of scanning an image consists of getting a SaneDev object for the device, setting various parameters, starting the scan, and then reading the image data. Images are composed of one or more frames; greyscale and one-pass colour scanners return a single frame containing all the image data, but 3-pass scanners will usually return 3 frames, one for each of the red, green, blue channels. Methods: -------- fileno() Returns a file descriptor for the scanning device. This method's existence means that SaneDev objects can be used by the select module. get_parameters() Return a tuple containing information about the current settings of the device and the current frame: (format, last_frame, pixels_per_line, lines, depth, bytes_per_line). mode -- 'gray' for greyscale image, 'color' for RGB image, or one of 'red', 'green', 'blue' if the image is a single channel of an RGB image (from PIL's point of view, this is equivalent to 'L'). last_frame -- A Boolean value, which is true if this is the last frame of the image, and false otherwise. pixels_per_line -- Width of the frame. lines -- Height of the frame. depth -- Depth of the image, measured in bits. SANE will only allow using 8, 16, or 24-bit depths. bytes_per_line -- Bytes required to store a single line of data, as computed from pixels_per_line and depth. start() Start a scan. This function must be called before the _snap()_ method can be used. cancel() Cancel a scan already in progress. snap(no_cancel=0) Snap a single frame of data, returning a PIL Image object containing the data. If no_cancel is false, the Sane library function sane_cancel is called after the scan. This is reasonable in most cases, but may cause backends for duplex ADF scanners to drop the backside image, when snap() is called for the front side image. If no_cancel is true, cancel() should be called manually, after all scans are finished. scan() This is just a shortcut for s.start(); s.snap() Returns a PIL image multi_scan() This method returns an iterator. It is intended to be used for scanning with an automatic document feeder. The next() method of the iterator tries to start a scan. If this is successful, it returns a PIL Image object, like scan(); if the document feeder runs out of paper, it raises StopIteration, thereby signaling that the sequence is ran out of items. arr_snap(multipleOf=1) same as snap, but the result is a NumArray object. (Not that num_array must be installed already at compilation time, otherwise this feature will not be activated). By default the resulting array has the same number of pixels per line as specified in self.get_parameters()[2][0] However sometimes it is necessary to obtain arrays where the number of pixels per line is e.g. a multiple of 4. This can then be achieved with the option 'multipleOf=4'. So if the scanner scanned 34 pixels per line, you will obtain an array with 32 pixels per line. Note that this only works with monochrome images (e.g. gray-scales) arr_scan(multipleOf=1) This is just a shortcut for s.start(); s.arr_snap(multipleOf=1) Returns a NumArray object close() Closes the object. Attributes: ----------- SaneDev objects have a few fixed attributes which are always available, and a larger collection of attributes which vary depending on the device. An Epson 1660 photo scanner has attributes like 'mode', 'depth', etc. Another (pseudo scanner), the _pnm:0_ device, takes a PNM file and simulates a scanner using the image data; a SaneDev object representing the _pnm:0_ device therefore has a _filename_ attribute which can be changed to specify the filename, _contrast_ and _brightness_ attributes to modify the returned image, and so forth. The values of the scanner options may be an integer, floating-point value, or string, depending on the nature of the option. sane_signature The tuple for this scandev that is returned by sane.get_devices() e.g. ('epson:libusb:001:006', 'Epson', 'GT-8300', 'flatbed scanner') scanner_model same as sane_signature[1:3], i.e. ('Epson', 'GT-8300') for the case above. optlist A list containing the all the options supported by this device. >>> import sane ; s=sane.open('epson:libusb:001:004') ; s.optlist ['focus_position', 'color_correction', 'sharpness', ...., 'br_x'] A closer look at all options listed in s.optlist can be obtained through the SaneOption objects. SaneOption objects ================== SANE's option handling is its most elaborate subsystem, intended to allow automatically generating dialog boxes and prompts for user configuration of the scanning device. The SaneOption object can be used to get a human-readable name and description for an option, the units to use, and what the legal values are. No information about the current value of the option is available; for that, read the corresponding attribute of a SaneDev object. This documentation does not explain all the details of SANE's option handling; consult the SANE documentation for all the details. A scandevice option is accessed via __getitem__. For example s['mode'] returns the option descriptor for the mode-option which controls whether the scanner works in color, grayscale, or b/w mode. >>> s['mode'] Name: mode Cur value: Color Index: 2 Title: Scan mode Desc: Selects the scan mode (e.g., lineart, monochrome, or color). Type: TYPE_STRING Unit: UNIT_NONE Constr: ['Binary', 'Gray', 'Color'] active: yes settable: yes In order to change 'mode' to 'gray', just type: >>> s.mode = 'gray' With the attributes and methods of sane-option objects it is possible to access individual option values: is_active() Returns true if the option is active. is_settable() Returns true if the option can be set under software control. Attributes: cap An integer containing various flags about the object's capabilities; whether it's active, whether it's settable, etc. Also available as the _capability_ attribute. constraint The constraint placed on the value of this option. If it's _None_, there are essentially no constraint of the value. It may also be a list of integers or strings, in which case the value *must* be one of the possibilities in the list. Numeric values may have a 3-tuple as the constraint; this 3-tuple contains _(minimum, maximum, increment)_, and the value must be in the defined range. desc A lengthy description of what the option does; it may be shown to the user for clarification. index An integer giving the option's index in the option list. name A short name for the option, as it comes from the sane-backend. py_name The option's name, as a legal Python identifier. The name attribute may contain the '-' character, so it will be converted to '_' for the py_name attribute. size For a string-valued option, this is the maximum length allowed. title A single-line string that can be used as a title string. type A constant giving the type of this option: will be one of the following constants found in the SANE module: TYPE_BOOL TYPE_INT TYPE_FIXED TYPE_STRING TYPE_BUTTON TYPE_GROUP unit For numeric-valued options, this is a constant representing the unit used for this option. It will be one of the following constants found in the SANE module: UNIT_NONE UNIT_PIXEL UNIT_BIT UNIT_MM UNIT_DPI UNIT_PERCENT Example us usage: ================= >>> import sane >>> print 'SANE version:', sane.init() >>> print 'Available devices=', sane.get_devices() SANE version: (16777230, 1, 0, 14) >>> s = sane.open(sane.get_devices()[0][0]) >>> print 'Device parameters:', s.get_parameters() Device parameters: ('L', 1, (424, 585), 1, 53) >>> print s.resolution 50 ## In order to scan a color image into a PIL object: >>> s.mode = 'color' >>> s.start() >>> img = s.snap() >>> img.show() ## In order to obtain a 16-bit grayscale image at 100DPI in a numarray object ## with bottom-right coordinates set to (160, 120) [in millimeter] : >>> s.mode = 'gray' >>> s.br_x=160. ; s.br_y=120. >>> s.resolution = 100 >>> s.depth=16 >>> s.start() >>> s.get_parameters()[2] # just check the size (624, 472) >>> arr16 = s.arr_snap() >>> arr16 array([[63957, 64721, 65067, ..., 65535, 65535, 65535], [63892, 64342, 64236, ..., 65535, 65535, 65535], [64286, 64248, 64705, ..., 65535, 65535, 65535], ..., [65518, 65249, 65058, ..., 65535, 65535, 65535], [64435, 65047, 65081, ..., 65535, 65535, 65535], [65309, 65438, 65535, ..., 65535, 65535, 65535]], type=UInt16) >>> arr16.shape # inverse order of coordinates, first y, then x! (472, 624) pillow-2.3.0/Sane/_sane.c0000644000175000001440000012000112257506326014016 0ustar dokousers/*********************************************************** (C) Copyright 2003 A.M. Kuchling. All Rights Reserved (C) Copyright 2004 A.M. Kuchling, Ralph Heinkel All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of A.M. Kuchling and Ralph Heinkel not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. A.M. KUCHLING, R.H. HEINKEL DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* SaneDev objects */ #include "Python.h" #include "Imaging.h" #include #include #if PY_MAJOR_VERSION >= 3 #define PyInt_AsLong PyLong_AsLong #define PyInt_FromLong PyLong_FromLong #define PyInt_Check PyLong_Check #endif static PyObject *ErrorObject; typedef struct { PyObject_HEAD SANE_Handle h; } SaneDevObject; #ifdef WITH_THREAD PyThreadState *_save; #endif /* Raise a SANE exception */ PyObject * PySane_Error(SANE_Status st) { const char *string; if (st==SANE_STATUS_GOOD) {Py_INCREF(Py_None); return (Py_None);} string=sane_strstatus(st); PyErr_SetString(ErrorObject, string); return NULL; } static PyTypeObject SaneDev_Type; #define SaneDevObject_Check(v) (Py_TYPE(v) == &SaneDev_Type) static SaneDevObject * newSaneDevObject(void) { SaneDevObject *self; if (PyType_Ready(&SaneDev_Type) < 0) return NULL; self = PyObject_NEW(SaneDevObject, &SaneDev_Type); if (self == NULL) return NULL; self->h=NULL; return self; } /* SaneDev methods */ static void SaneDev_dealloc(SaneDevObject *self) { if (self->h) sane_close(self->h); self->h=NULL; PyObject_DEL(self); } static PyObject * SaneDev_close(SaneDevObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h) sane_close(self->h); self->h=NULL; Py_INCREF(Py_None); return (Py_None); } static PyObject * SaneDev_get_parameters(SaneDevObject *self, PyObject *args) { SANE_Status st; SANE_Parameters p; char *format="unknown format"; if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } Py_BEGIN_ALLOW_THREADS st=sane_get_parameters(self->h, &p); Py_END_ALLOW_THREADS if (st) return PySane_Error(st); switch (p.format) { case(SANE_FRAME_GRAY): format="gray"; break; case(SANE_FRAME_RGB): format="color"; break; case(SANE_FRAME_RED): format="red"; break; case(SANE_FRAME_GREEN): format="green"; break; case(SANE_FRAME_BLUE): format="blue"; break; } return Py_BuildValue("si(ii)ii", format, p.last_frame, p.pixels_per_line, p.lines, p.depth, p.bytes_per_line); } static PyObject * SaneDev_fileno(SaneDevObject *self, PyObject *args) { SANE_Status st; SANE_Int fd; if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } st=sane_get_select_fd(self->h, &fd); if (st) return PySane_Error(st); return PyInt_FromLong(fd); } static PyObject * SaneDev_start(SaneDevObject *self, PyObject *args) { SANE_Status st; if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } /* sane_start can take several seconds, if the user initiates a new scan, while the scan head of a flatbed scanner moves back to the start position after finishing a previous scan. Hence it is worth to allow threads here. */ Py_BEGIN_ALLOW_THREADS st=sane_start(self->h); Py_END_ALLOW_THREADS if (st) return PySane_Error(st); Py_INCREF(Py_None); return Py_None; } static PyObject * SaneDev_cancel(SaneDevObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } sane_cancel(self->h); Py_INCREF(Py_None); return Py_None; } static PyObject * SaneDev_get_options(SaneDevObject *self, PyObject *args) { const SANE_Option_Descriptor *d; PyObject *list, *value; int i=1; if (!PyArg_ParseTuple(args, "")) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } if (!(list = PyList_New(0))) return NULL; do { d=sane_get_option_descriptor(self->h, i); if (d!=NULL) { PyObject *constraint=NULL; int j; switch (d->constraint_type) { case(SANE_CONSTRAINT_NONE): Py_INCREF(Py_None); constraint=Py_None; break; case(SANE_CONSTRAINT_RANGE): if (d->type == SANE_TYPE_INT) constraint=Py_BuildValue("iii", d->constraint.range->min, d->constraint.range->max, d->constraint.range->quant); else constraint=Py_BuildValue("ddd", SANE_UNFIX(d->constraint.range->min), SANE_UNFIX(d->constraint.range->max), SANE_UNFIX(d->constraint.range->quant)); break; case(SANE_CONSTRAINT_WORD_LIST): constraint=PyList_New(d->constraint.word_list[0]); if (d->type == SANE_TYPE_INT) for (j=1; j<=d->constraint.word_list[0]; j++) PyList_SetItem(constraint, j-1, PyInt_FromLong(d->constraint.word_list[j])); else for (j=1; j<=d->constraint.word_list[0]; j++) PyList_SetItem(constraint, j-1, PyFloat_FromDouble(SANE_UNFIX(d->constraint.word_list[j]))); break; case(SANE_CONSTRAINT_STRING_LIST): constraint=PyList_New(0); for(j=0; d->constraint.string_list[j]!=NULL; j++) PyList_Append(constraint, #if PY_MAJOR_VERSION >= 3 PyUnicode_DecodeLatin1(d->constraint.string_list[j], strlen(d->constraint.string_list[j]), NULL)); #else PyString_FromString(d->constraint.string_list[j])); #endif break; } value=Py_BuildValue("isssiiiiO", i, d->name, d->title, d->desc, d->type, d->unit, d->size, d->cap, constraint); PyList_Append(list, value); } i++; } while (d!=NULL); return list; } static PyObject * SaneDev_get_option(SaneDevObject *self, PyObject *args) { SANE_Status st; const SANE_Option_Descriptor *d; PyObject *value=NULL; int n; void *v; if (!PyArg_ParseTuple(args, "i", &n)) { return NULL; } if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } d=sane_get_option_descriptor(self->h, n); v=malloc(d->size+1); st=sane_control_option(self->h, n, SANE_ACTION_GET_VALUE, v, NULL); if (st) { free(v); return PySane_Error(st); } switch(d->type) { case(SANE_TYPE_BOOL): case(SANE_TYPE_INT): value=Py_BuildValue("i", *( (SANE_Int*)v) ); break; case(SANE_TYPE_FIXED): value=Py_BuildValue("d", SANE_UNFIX((*((SANE_Fixed*)v))) ); break; case(SANE_TYPE_STRING): #if PY_MAJOR_VERSION >= 3 value=PyUnicode_DecodeLatin1((const char *) v, strlen((const char *) v), NULL); #else value=Py_BuildValue("s", v); #endif break; case(SANE_TYPE_BUTTON): case(SANE_TYPE_GROUP): value=Py_BuildValue("O", Py_None); break; } free(v); return value; } static PyObject * SaneDev_set_option(SaneDevObject *self, PyObject *args) { SANE_Status st; const SANE_Option_Descriptor *d; SANE_Int i; PyObject *value; int n; void *v; if (!PyArg_ParseTuple(args, "iO", &n, &value)) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } d=sane_get_option_descriptor(self->h, n); v=malloc(d->size+1); switch(d->type) { case(SANE_TYPE_BOOL): if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "SANE_BOOL requires an integer"); free(v); return NULL; } /* fall through */ case(SANE_TYPE_INT): if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "SANE_INT requires an integer"); free(v); return NULL; } *( (SANE_Int*)v) = PyInt_AsLong(value); break; case(SANE_TYPE_FIXED): if (!PyFloat_Check(value)) { PyErr_SetString(PyExc_TypeError, "SANE_FIXED requires a floating point number"); free(v); return NULL; } *( (SANE_Fixed*)v) = SANE_FIX(PyFloat_AsDouble(value)); break; case(SANE_TYPE_STRING): #if PY_MAJOR_VERSION >= 3 if (!PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string"); free(v); return NULL; } { PyObject *encoded = PyUnicode_AsLatin1String(value); if (!encoded) return NULL; strncpy(v, PyBytes_AsString(encoded), d->size-1); ((char*)v)[d->size-1] = 0; Py_DECREF(encoded); } #else if (!PyString_Check(value)) { PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string"); free(v); return NULL; } strncpy(v, PyString_AsString(value), d->size-1); ((char*)v)[d->size-1] = 0; #endif break; case(SANE_TYPE_BUTTON): case(SANE_TYPE_GROUP): break; } st=sane_control_option(self->h, n, SANE_ACTION_SET_VALUE, v, &i); if (st) {free(v); return PySane_Error(st);} free(v); return Py_BuildValue("i", i); } static PyObject * SaneDev_set_auto_option(SaneDevObject *self, PyObject *args) { SANE_Status st; SANE_Int i; int n; if (!PyArg_ParseTuple(args, "i", &n)) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } st=sane_control_option(self->h, n, SANE_ACTION_SET_AUTO, NULL, &i); if (st) {return PySane_Error(st);} return Py_BuildValue("i", i); } #define READSIZE 32768 static PyObject * SaneDev_snap(SaneDevObject *self, PyObject *args) { SANE_Status st; /* The buffer should be a multiple of 3 in size, so each sane_read operation will return an integral number of RGB triples. */ SANE_Byte buffer[READSIZE]; /* XXX how big should the buffer be? */ SANE_Int len, lastlen; Imaging im; SANE_Parameters p; int px, py, remain, cplen, bufpos, padbytes; long L; char errmsg[80]; union { char c[2]; INT16 i16; } endian; PyObject *pyNoCancel = NULL; int noCancel = 0; endian.i16 = 1; if (!PyArg_ParseTuple(args, "l|O", &L, &pyNoCancel)) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } im=(Imaging)L; if (pyNoCancel) noCancel = PyObject_IsTrue(pyNoCancel); st=SANE_STATUS_GOOD; px=py=0; /* xxx not yet implemented - handscanner support (i.e., unknown image length during start) - generally: move the functionality from method snap in sane.py down here -- I don't like this cross-dependency. we need to call sane_get_parameters here, and we can create the result Image object here. */ Py_UNBLOCK_THREADS sane_get_parameters(self->h, &p); if (p.format == SANE_FRAME_GRAY) { switch (p.depth) { case 1: remain = p.bytes_per_line * im->ysize; padbytes = p.bytes_per_line - (im->xsize+7)/8; bufpos = 0; lastlen = len = 0; while (st!=SANE_STATUS_EOF && py < im->ysize) { while (len > 0 && py < im->ysize) { int i, j, k; j = buffer[bufpos++]; k = 0x80; for (i = 0; i < 8 && px < im->xsize; i++) { im->image8[py][px++] = (k&j) ? 0 : 0xFF; k = k >> 1; } len--; if (px >= im->xsize) { bufpos += padbytes; len -= padbytes; py++; px = 0; } } st=sane_read(self->h, buffer, remainh); Py_BLOCK_THREADS return PySane_Error(st); } bufpos -= lastlen; lastlen = len; remain -= len; /* skip possible pad bytes at the start of the buffer */ len -= bufpos; } break; case 8: remain = p.bytes_per_line * im->ysize; padbytes = p.bytes_per_line - im->xsize; bufpos = 0; len = 0; while (st!=SANE_STATUS_EOF && py < im->ysize) { while (len > 0 && py < im->ysize) { cplen = len; if (px + cplen >= im->xsize) cplen = im->xsize - px; memcpy(&im->image8[py][px], &buffer[bufpos], cplen); len -= cplen; bufpos += cplen; px += cplen; if (px >= im->xsize) { px = 0; py++; bufpos += padbytes; len -= padbytes; } } bufpos = -len; st=sane_read(self->h, buffer, remainh); Py_BLOCK_THREADS return PySane_Error(st); } remain -= len; len -= bufpos; } break; case 16: remain = p.bytes_per_line * im->ysize; padbytes = p.bytes_per_line - 2 * im->xsize; bufpos = endian.c[0]; lastlen = len = 0; while (st!=SANE_STATUS_EOF && py < im->ysize) { while (len > 0 && py < im->ysize) { im->image8[py][px++] = buffer[bufpos]; bufpos += 2; len -= 2; if (px >= im->xsize) { bufpos += padbytes; len -= padbytes; py++; px = 0; } } st=sane_read(self->h, buffer, remainh); Py_BLOCK_THREADS return PySane_Error(st); } remain -= len; bufpos -= lastlen; lastlen = len; len -= bufpos; } break; default: /* other depths are not formally "illegal" according to the Sane API, but it's agreed by Sane developers that other depths than 1, 8, 16 should not be used */ sane_cancel(self->h); Py_BLOCK_THREADS snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth); PyErr_SetString(ErrorObject, errmsg); return NULL; } } else if (p.format == SANE_FRAME_RGB) { int incr, color, pxs, pxmax, bit, val, mask; switch (p.depth) { case 1: remain = p.bytes_per_line * im->ysize; padbytes = p.bytes_per_line - ((im->xsize+7)/8) * 3; bufpos = 0; len = 0; lastlen = 0; pxmax = 4 * im->xsize; while (st!=SANE_STATUS_EOF && py < im->ysize) { pxs = px; for (color = 0; color < 3; color++) { while (len <= 0 && st == SANE_STATUS_GOOD) { st=sane_read(self->h, buffer, remainh); Py_BLOCK_THREADS return PySane_Error(st); } bufpos -= lastlen; remain -= len; lastlen = len; /* skip possible pad bytes at the start of the buffer */ len -= bufpos; } if (st == SANE_STATUS_EOF) break; pxs = px; val = buffer[bufpos++]; len--; mask = 0x80; for (bit = 0; (bit < 8) && (px < pxmax); bit++) { ((UINT8**)(im->image32))[py][px] = (val&mask) ? 0xFF : 0; mask = mask >> 1; px += 4; } pxs++; px = pxs; } if (st == SANE_STATUS_EOF) break; for (bit = 0; bit < 8 && px < pxmax; bit++) { ((UINT8**)(im->image32))[py][px] = 0; px += 4; } px -= 3; if (px >= pxmax) { bufpos += padbytes; len -= padbytes; py++; px = 0; } } break; case 8: case 16: if (p.depth == 8) { padbytes = p.bytes_per_line - 3 * im->xsize; bufpos = 0; incr = 1; } else { padbytes = p.bytes_per_line - 6 * im->xsize; bufpos = endian.c[0]; incr = 2; } remain = p.bytes_per_line * im->ysize; len = 0; lastlen = 0; pxmax = 4 * im->xsize; /* probably not very efficient. But we have to deal with these possible conditions: - we may have padding bytes at the end of a scan line - the number of bytes read with sane_read may be smaller than the number of pad bytes - the buffer may become empty after setting any of the red/green/blue pixel values */ while (st != SANE_STATUS_EOF && py < im->ysize) { for (color = 0; color < 3; color++) { while (len <= 0 && st == SANE_STATUS_GOOD) { bufpos -= lastlen; if (remain == 0) { sane_cancel(self->h); Py_BLOCK_THREADS PyErr_SetString(ErrorObject, "internal _sane error: premature end of scan"); return NULL; } st = sane_read(self->h, buffer, remain<(READSIZE) ? remain : (READSIZE), &len); if (st && (st!=SANE_STATUS_EOF)) { sane_cancel(self->h); Py_BLOCK_THREADS return PySane_Error(st); } lastlen = len; remain -= len; len -= bufpos; } if (st == SANE_STATUS_EOF) break; ((UINT8**)(im->image32))[py][px++] = buffer[bufpos]; bufpos += incr; len -= incr; } if (st == SANE_STATUS_EOF) break; ((UINT8**)(im->image32))[py][px++] = 0; if (px >= pxmax) { px = 0; py++; bufpos += padbytes; len -= padbytes; } } break; default: Py_BLOCK_THREADS sane_cancel(self->h); snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth); PyErr_SetString(ErrorObject, errmsg); return NULL; } } else /* should be SANE_FRAME_RED, GREEN or BLUE */ { int lastlen, pxa, pxmax, offset, incr, frame_count = 0; /* at least the Sane test backend behaves a bit weird, if it returns "premature EOF" for sane_read, i.e., if the option "return value of sane_read" is set to SANE_STATUS_EOF. In this case, the test backend does not advance to the next frame, so p.last_frame will never be set... So let's count the number of frames we try to acquire */ while (!p.last_frame && frame_count < 4) { frame_count++; st = sane_get_parameters(self->h, &p); if (st) { sane_cancel(self->h); Py_BLOCK_THREADS return PySane_Error(st); } remain = p.bytes_per_line * im->ysize; bufpos = 0; len = 0; lastlen = 0; py = 0; switch (p.format) { case SANE_FRAME_RED: offset = 0; break; case SANE_FRAME_GREEN: offset = 1; break; case SANE_FRAME_BLUE: offset = 2; break; default: sane_cancel(self->h); Py_BLOCK_THREADS snprintf(errmsg, 80, "unknown/invalid frame format: %i", p.format); PyErr_SetString(ErrorObject, errmsg); return NULL; } px = offset; pxa = 3; pxmax = im->xsize * 4; switch (p.depth) { case 1: padbytes = p.bytes_per_line - (im->xsize+7)/8; st = SANE_STATUS_GOOD; while (st != SANE_STATUS_EOF && py < im->ysize) { while (len > 0) { int bit, mask, val; val = buffer[bufpos++]; len--; mask = 0x80; for (bit = 0; bit < 8 && px < pxmax; bit++) { ((UINT8**)(im->image32))[py][px] = val&mask ? 0xFF : 0; ((UINT8**)(im->image32))[py][pxa] = 0; px += 4; pxa += 4; mask = mask >> 1; } if (px >= pxmax) { px = offset; pxa = 3; py++; bufpos += padbytes; len -= padbytes; } } while (len <= 0 && st == SANE_STATUS_GOOD && remain > 0) { bufpos -= lastlen; st = sane_read(self->h, buffer, remain<(READSIZE) ? remain : (READSIZE), &len); if (st && (st!=SANE_STATUS_EOF)) { sane_cancel(self->h); Py_BLOCK_THREADS return PySane_Error(st); } remain -= len; lastlen = len; len -= bufpos; } } break; case 8: case 16: if (p.depth == 8) { padbytes = p.bytes_per_line - im->xsize; incr = 1; } else { padbytes = p.bytes_per_line - 2 * im->xsize; incr = 2; bufpos = endian.c[0]; } st = SANE_STATUS_GOOD; while (st != SANE_STATUS_EOF && py < im->ysize) { while (len <= 0) { bufpos -= lastlen; if (remain == 0) { sane_cancel(self->h); Py_BLOCK_THREADS PyErr_SetString(ErrorObject, "internal _sane error: premature end of scan"); return NULL; } st = sane_read(self->h, buffer, remain<(READSIZE) ? remain : (READSIZE), &len); if (st && (st!=SANE_STATUS_EOF)) { sane_cancel(self->h); Py_BLOCK_THREADS return PySane_Error(st); } if (st == SANE_STATUS_EOF) break; lastlen = len; remain -= len; if (bufpos >= len) len = 0; else len -= bufpos; } if (st == SANE_STATUS_EOF) break; ((UINT8**)(im->image32))[py][px] = buffer[bufpos]; ((UINT8**)(im->image32))[py][pxa] = 0; bufpos += incr; len -= incr; px += 4; pxa += 4; if (px >= pxmax) { px = offset; pxa = 3; py++; bufpos += padbytes; len -= padbytes; } } break; default: sane_cancel(self->h); Py_BLOCK_THREADS snprintf(errmsg, 80, "unsupported pixel depth: %i", p.depth); PyErr_SetString(ErrorObject, errmsg); return NULL; } if (!p.last_frame) { /* all sane_read calls in the above loop may return SANE_STATUS_GOOD, but the backend may need another sane_read call which returns SANE_STATUS_EOF in order to start a new frame. */ do { st = sane_read(self->h, buffer, READSIZE, &len); } while (st == SANE_STATUS_GOOD); if (st != SANE_STATUS_EOF) { Py_BLOCK_THREADS sane_cancel(self->h); return PySane_Error(st); } st = sane_start(self->h); if (st) { Py_BLOCK_THREADS return PySane_Error(st); } } } } /* enforce SANE_STATUS_EOF. Can be necessary for ADF scans for some backends */ do { st = sane_read(self->h, buffer, READSIZE, &len); } while (st == SANE_STATUS_GOOD); if (st != SANE_STATUS_EOF) { sane_cancel(self->h); Py_BLOCK_THREADS return PySane_Error(st); } if (!noCancel) sane_cancel(self->h); Py_BLOCK_THREADS Py_INCREF(Py_None); return Py_None; } #ifdef WITH_NUMARRAY #include "numarray/libnumarray.h" /* this global variable is set to 1 in 'init_sane()' after successfully importing the numarray module. */ int NUMARRAY_IMPORTED = 0; static PyObject * SaneDev_arr_snap(SaneDevObject *self, PyObject *args) { SANE_Status st; SANE_Byte buffer[READSIZE]; SANE_Int len; SANE_Parameters p; PyArrayObject *pyArr = NULL; NumarrayType arrType; int line, line_index, buffer_index, remain_bytes_line, num_pad_bytes; int cp_num_bytes, total_remain, bpp, arr_bytes_per_line; int pixels_per_line = -1; char errmsg[80]; if (!NUMARRAY_IMPORTED) { PyErr_SetString(ErrorObject, "numarray package not available"); return NULL; } if (!PyArg_ParseTuple(args, "|i", &pixels_per_line)) return NULL; if (self->h==NULL) { PyErr_SetString(ErrorObject, "SaneDev object is closed"); return NULL; } sane_get_parameters(self->h, &p); if (p.format != SANE_FRAME_GRAY) { sane_cancel(self->h); snprintf(errmsg, 80, "numarray only supports gray-scale images"); PyErr_SetString(ErrorObject, errmsg); return NULL; } if (p.depth == 8) { bpp=1; /* bytes-per-pixel */ arrType = tUInt8; } else if (p.depth == 16) { bpp=2; /* bytes-per-pixel */ arrType = tUInt16; } else { sane_cancel(self->h); snprintf(errmsg, 80, "arrsnap: unsupported pixel depth: %i", p.depth); PyErr_SetString(ErrorObject, errmsg); return NULL; } if (pixels_per_line < 1) /* The user can choose a smaller result array than the actual scan */ pixels_per_line = p.pixels_per_line; else if (pixels_per_line > p.pixels_per_line) { PyErr_SetString(ErrorObject,"given pixels_per_line too big"); return NULL; } /* important: NumArray have indices like (y, x) !! */ if (!(pyArr = NA_NewArray(NULL, arrType, 2, p.lines, pixels_per_line))) { PyErr_SetString(ErrorObject, "failed to create NumArray object"); return NULL; } arr_bytes_per_line = pixels_per_line * bpp; st=SANE_STATUS_GOOD; #ifdef WRITE_PGM FILE *fp; fp = fopen("sane_p5.pgm", "w"); fprintf(fp, "P5\n%d %d\n%d\n", p.pixels_per_line, p.lines, (int) pow(2.0, (double) p.depth)-1); #endif line_index = line = 0; remain_bytes_line = arr_bytes_per_line; total_remain = p.bytes_per_line * p.lines; num_pad_bytes = p.bytes_per_line - arr_bytes_per_line; while (st!=SANE_STATUS_EOF) { Py_BEGIN_ALLOW_THREADS st = sane_read(self->h, buffer, READSIZE < total_remain ? READSIZE : total_remain, &len); Py_END_ALLOW_THREADS #ifdef WRITE_PGM printf("p5_write: read %d of %d\n", len, READSIZE); fwrite(buffer, 1, len, fp); #endif buffer_index = 0; total_remain -= len; while (len > 0) { /* copy at most the number of bytes that fit into (the rest of) one line: */ cp_num_bytes = (len > remain_bytes_line ? remain_bytes_line : len); remain_bytes_line -= cp_num_bytes; len -= cp_num_bytes; #ifdef DEBUG printf("copying %d bytes from b_idx %d to d_idx %d\n", cp_num_bytes, buffer_index, line * arr_bytes_per_line + line_index); printf("len is now %d\n", len); #endif memcpy(pyArr->data + line * arr_bytes_per_line + line_index, buffer + buffer_index, cp_num_bytes); buffer_index += cp_num_bytes; if (remain_bytes_line ==0) { /* The line has been completed, so reinitialize remain_bytes_line increase the line counter, and reset line_index */ #ifdef DEBUG printf("line %d full, skipping %d bytes\n",line,num_pad_bytes); #endif remain_bytes_line = arr_bytes_per_line; line++; line_index = 0; /* Skip the number of bytes in the input stream which are not used: */ len -= num_pad_bytes; buffer_index += num_pad_bytes; } else line_index += cp_num_bytes; } } #ifdef WRITE_PGM fclose(fp); printf("p5_write finished\n"); #endif sane_cancel(self->h); return (PyObject*) pyArr; } #endif /* WITH_NUMARRAY */ static PyMethodDef SaneDev_methods[] = { {"get_parameters", (PyCFunction)SaneDev_get_parameters, 1}, {"get_options", (PyCFunction)SaneDev_get_options, 1}, {"get_option", (PyCFunction)SaneDev_get_option, 1}, {"set_option", (PyCFunction)SaneDev_set_option, 1}, {"set_auto_option", (PyCFunction)SaneDev_set_auto_option, 1}, {"start", (PyCFunction)SaneDev_start, 1}, {"cancel", (PyCFunction)SaneDev_cancel, 1}, {"snap", (PyCFunction)SaneDev_snap, 1}, #ifdef WITH_NUMARRAY {"arr_snap", (PyCFunction)SaneDev_arr_snap, 1}, #endif /* WITH_NUMARRAY */ {"fileno", (PyCFunction)SaneDev_fileno, 1}, {"close", (PyCFunction)SaneDev_close, 1}, {NULL, NULL} /* sentinel */ }; static PyTypeObject SaneDev_Type = { PyVarObject_HEAD_INIT(NULL, 0) "SaneDev", /*tp_name*/ sizeof(SaneDevObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)SaneDev_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ SaneDev_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; /* --------------------------------------------------------------------- */ static PyObject * PySane_init(PyObject *self, PyObject *args) { SANE_Status st; SANE_Int version; if (!PyArg_ParseTuple(args, "")) return NULL; /* XXX Authorization is not yet supported */ st=sane_init(&version, NULL); if (st) return PySane_Error(st); return Py_BuildValue("iiii", version, SANE_VERSION_MAJOR(version), SANE_VERSION_MINOR(version), SANE_VERSION_BUILD(version)); } static PyObject * PySane_exit(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; sane_exit(); Py_INCREF(Py_None); return Py_None; } static PyObject * PySane_get_devices(PyObject *self, PyObject *args) { const SANE_Device **devlist; const SANE_Device *dev; SANE_Status st; PyObject *list; int local_only = 0, i; if (!PyArg_ParseTuple(args, "|i", &local_only)) { return NULL; } Py_BEGIN_ALLOW_THREADS st=sane_get_devices(&devlist, local_only); Py_END_ALLOW_THREADS if (st) return PySane_Error(st); if (!(list = PyList_New(0))) return NULL; for(i=0; devlist[i]!=NULL; i++) { dev=devlist[i]; PyList_Append(list, Py_BuildValue("ssss", dev->name, dev->vendor, dev->model, dev->type)); } return list; } /* Function returning new SaneDev object */ static PyObject * PySane_open(PyObject *self, PyObject *args) { SaneDevObject *rv; SANE_Status st; char *name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; rv = newSaneDevObject(); if ( rv == NULL ) return NULL; Py_BEGIN_ALLOW_THREADS st = sane_open(name, &(rv->h)); Py_END_ALLOW_THREADS if (st) { Py_DECREF(rv); return PySane_Error(st); } return (PyObject *)rv; } static PyObject * PySane_OPTION_IS_ACTIVE(PyObject *self, PyObject *args) { SANE_Int cap; long lg; if (!PyArg_ParseTuple(args, "l", &lg)) return NULL; cap=lg; return PyInt_FromLong( SANE_OPTION_IS_ACTIVE(cap)); } static PyObject * PySane_OPTION_IS_SETTABLE(PyObject *self, PyObject *args) { SANE_Int cap; long lg; if (!PyArg_ParseTuple(args, "l", &lg)) return NULL; cap=lg; return PyInt_FromLong( SANE_OPTION_IS_SETTABLE(cap)); } /* List of functions defined in the module */ static PyMethodDef PySane_methods[] = { {"init", PySane_init, 1}, {"exit", PySane_exit, 1}, {"get_devices", PySane_get_devices, 1}, {"_open", PySane_open, 1}, {"OPTION_IS_ACTIVE", PySane_OPTION_IS_ACTIVE, 1}, {"OPTION_IS_SETTABLE", PySane_OPTION_IS_SETTABLE, 1}, {NULL, NULL} /* sentinel */ }; static void insint(PyObject *d, char *name, int value) { PyObject *v = PyInt_FromLong((long) value); if (!v || PyDict_SetItemString(d, name, v)) Py_FatalError("can't initialize sane module"); Py_DECREF(v); } #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef PySane_moduledef = { PyModuleDef_HEAD_INIT, "_sane", NULL, 0, PySane_methods, NULL, NULL, NULL, NULL }; PyMODINIT_FUNC PyInit__sane(void) { /* Create the module and add the functions */ PyObject *m = PyModule_Create(&PySane_moduledef); if(!m) return NULL; #else /* if PY_MAJOR_VERSION < 3 */ PyMODINIT_FUNC init_sane(void) { /* Create the module and add the functions */ PyObject *m = Py_InitModule("_sane", PySane_methods); if(!m) return; #endif /* Add some symbolic constants to the module */ PyObject *d = PyModule_GetDict(m); ErrorObject = PyErr_NewException("_sane.error", NULL, NULL); PyDict_SetItemString(d, "error", ErrorObject); insint(d, "INFO_INEXACT", SANE_INFO_INEXACT); insint(d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS); insint(d, "RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS); insint(d, "FRAME_GRAY", SANE_FRAME_GRAY); insint(d, "FRAME_RGB", SANE_FRAME_RGB); insint(d, "FRAME_RED", SANE_FRAME_RED); insint(d, "FRAME_GREEN", SANE_FRAME_GREEN); insint(d, "FRAME_BLUE", SANE_FRAME_BLUE); insint(d, "CONSTRAINT_NONE", SANE_CONSTRAINT_NONE); insint(d, "CONSTRAINT_RANGE", SANE_CONSTRAINT_RANGE); insint(d, "CONSTRAINT_WORD_LIST", SANE_CONSTRAINT_WORD_LIST); insint(d, "CONSTRAINT_STRING_LIST", SANE_CONSTRAINT_STRING_LIST); insint(d, "TYPE_BOOL", SANE_TYPE_BOOL); insint(d, "TYPE_INT", SANE_TYPE_INT); insint(d, "TYPE_FIXED", SANE_TYPE_FIXED); insint(d, "TYPE_STRING", SANE_TYPE_STRING); insint(d, "TYPE_BUTTON", SANE_TYPE_BUTTON); insint(d, "TYPE_GROUP", SANE_TYPE_GROUP); insint(d, "UNIT_NONE", SANE_UNIT_NONE); insint(d, "UNIT_PIXEL", SANE_UNIT_PIXEL); insint(d, "UNIT_BIT", SANE_UNIT_BIT); insint(d, "UNIT_MM", SANE_UNIT_MM); insint(d, "UNIT_DPI", SANE_UNIT_DPI); insint(d, "UNIT_PERCENT", SANE_UNIT_PERCENT); insint(d, "UNIT_MICROSECOND", SANE_UNIT_MICROSECOND); insint(d, "CAP_SOFT_SELECT", SANE_CAP_SOFT_SELECT); insint(d, "CAP_HARD_SELECT", SANE_CAP_HARD_SELECT); insint(d, "CAP_SOFT_DETECT", SANE_CAP_SOFT_DETECT); insint(d, "CAP_EMULATED", SANE_CAP_EMULATED); insint(d, "CAP_AUTOMATIC", SANE_CAP_AUTOMATIC); insint(d, "CAP_INACTIVE", SANE_CAP_INACTIVE); insint(d, "CAP_ADVANCED", SANE_CAP_ADVANCED); /* handy for checking array lengths: */ insint(d, "SANE_WORD_SIZE", sizeof(SANE_Word)); /* possible return values of set_option() */ insint(d, "INFO_INEXACT", SANE_INFO_INEXACT); insint(d, "INFO_RELOAD_OPTIONS", SANE_INFO_RELOAD_OPTIONS); insint(d, "INFO_RELOAD_PARAMS", SANE_INFO_RELOAD_PARAMS); /* Check for errors */ if (PyErr_Occurred()) Py_FatalError("can't initialize module _sane"); #ifdef WITH_NUMARRAY import_libnumarray(); if (PyErr_Occurred()) PyErr_Clear(); else /* this global variable is declared just in front of the arr_snap() function and should be set to 1 after successfully importing the numarray module. */ NUMARRAY_IMPORTED = 1; #endif /* WITH_NUMARRAY */ #if PY_MAJOR_VERSION >= 3 return m; #endif } pillow-2.3.0/Sane/demo_pil.py0000644000175000001440000000137112257506326014737 0ustar dokousers#!/usr/bin/env python # # Shows how to scan a color image into a PIL rgb-image # from __future__ import print_function # Get the path set up to find PIL modules if not installed yet: import sys ; sys.path.append('../PIL') import sane print('SANE version:', sane.init()) print('Available devices=', sane.get_devices()) s = sane.open(sane.get_devices()[0][0]) s.mode = 'color' s.br_x=320. ; s.br_y=240. print('Device parameters:', s.get_parameters()) # Initiate the scan s.start() # Get an Image object # (For my B&W QuickCam, this is a grey-scale image. Other scanning devices # may return a im=s.snap() # Write the image out as a GIF file #im.save('foo.gif') # The show method() simply saves the image to a temporary file and calls "xv". im.show() pillow-2.3.0/Sane/README0000644000175000001440000000130212257506326013447 0ustar dokousers Python SANE module V1.1 (30 Sep. 2004) The SANE module provides an interface to the SANE scanner and frame grabber interface for Linux. This module was contributed by Andrew Kuchling and is extended and currently maintained by Ralph Heinkel (rheinkel-at-email.de). If you write to me please make sure to have the word 'SANE' or 'sane' in the subject of your mail, otherwise it might be classified as spam in the future. To build this module, type (in the Sane directory): python setup.py build In order to install the module type: python setup.py install For some basic documentation please look at the file sanedoc.txt The two demo_*.py scripts give basic examples on how to use the software. pillow-2.3.0/Sane/demo_numarray.py0000644000175000001440000000200512257506326016004 0ustar dokousers#!/usr/bin/env python # # Shows how to scan a 16 bit grayscale image into a numarray object # from __future__ import print_function # Get the path set up to find PIL modules if not installed yet: import sys ; sys.path.append('../PIL') from numarray import * import sane import Image def toImage(arr): if arr.type().bytes == 1: # need to swap coordinates btw array and image (with [::-1]) im = Image.frombytes('L', arr.shape[::-1], arr.tostring()) else: arr_c = arr - arr.min() arr_c *= (255./arr_c.max()) arr = arr_c.astype(UInt8) # need to swap coordinates btw array and image (with [::-1]) im = Image.frombytes('L', arr.shape[::-1], arr.tostring()) return im print('SANE version:', sane.init()) print('Available devices=', sane.get_devices()) s = sane.open(sane.get_devices()[0][0]) # Set scan parameters s.mode = 'gray' s.br_x=320. ; s.br_y=240. print('Device parameters:', s.get_parameters()) s.depth=16 arr16 = s.arr_scan() toImage(arr16).show() pillow-2.3.0/Sane/setup.py0000644000175000001440000000116112257506326014304 0ustar dokousersfrom distutils.core import setup, Extension PIL_BUILD_DIR = '..' PIL_IMAGING_DIR = PIL_BUILD_DIR+'/libImaging' defs = [] try: import numarray defs.append(('WITH_NUMARRAY',None)) except ImportError: pass sane = Extension('_sane', include_dirs = [PIL_IMAGING_DIR], libraries = ['sane'], library_dirs = [PIL_IMAGING_DIR], define_macros = defs, sources = ['_sane.c']) setup (name = 'pysane', version = '2.0', description = 'This is the pysane package', py_modules = ['sane'], ext_modules = [sane]) pillow-2.3.0/Sane/CHANGES0000644000175000001440000000306012257506326013565 0ustar dokousers from V1.0 to V2.0 _sane.c: - Values for option constraints are correctly translated to floats if value type is TYPE_FIXED for SANE_CONSTRAINT_RANGE and SANE_CONSTRAINT_WORD_LIST - added constants INFO_INEXACT, INFO_RELOAD_OPTIONS, INFO_RELOAD_PARAMS (possible return values of set_option()) to module dictionnary. - removed additional return variable 'i' from SaneDev_get_option(), because it is only set when SANE_ACTION_SET_VALUE is used. - scanDev.get_parameters() now returns the scanner mode as 'format', no more the typical PIL codes. So 'L' became 'gray', 'RGB' is now 'color', 'R' is 'red', 'G' is 'green', 'B' is 'red'. This matches the way scanDev.mode is set. This should be the only incompatibility vs. version 1.0. sane.py - ScanDev got new method __load_option_dict() called from __init__() and from __setattr__() if backend reported that the frontend should reload the options. - Nice human-readable __repr__() method added for class Option - if __setattr__ (i.e. set_option) reports that all other options have to be reloaded due to a change in the backend then they are reloaded. - due to the change in SaneDev_get_option() only the 'value' is returned from get_option(). - in __setattr__ integer values are automatically converted to floats if SANE backend expects SANE_FIXED (i.e. fix-point float) - The scanner options can now directly be accessed via scanDev[optionName] instead scanDev.opt[optionName]. (The old way still works). V1.0: A.M. Kuchling's original pysane package.pillow-2.3.0/Sane/sane.py0000644000175000001440000002371512257506326014103 0ustar dokousers# sane.py # # Python wrapper on top of the _sane module, which is in turn a very # thin wrapper on top of the SANE library. For a complete understanding # of SANE, consult the documentation at the SANE home page: # http://www.mostang.com/sane/ . __version__ = '2.0' __author__ = ['Andrew Kuchling', 'Ralph Heinkel'] from PIL import Image import _sane from _sane import * TYPE_STR = { TYPE_BOOL: "TYPE_BOOL", TYPE_INT: "TYPE_INT", TYPE_FIXED: "TYPE_FIXED", TYPE_STRING: "TYPE_STRING", TYPE_BUTTON: "TYPE_BUTTON", TYPE_GROUP: "TYPE_GROUP" } UNIT_STR = { UNIT_NONE: "UNIT_NONE", UNIT_PIXEL: "UNIT_PIXEL", UNIT_BIT: "UNIT_BIT", UNIT_MM: "UNIT_MM", UNIT_DPI: "UNIT_DPI", UNIT_PERCENT: "UNIT_PERCENT", UNIT_MICROSECOND: "UNIT_MICROSECOND" } class Option: """Class representing a SANE option. Attributes: index -- number from 0 to n, giving the option number name -- a string uniquely identifying the option title -- single-line string containing a title for the option desc -- a long string describing the option; useful as a help message type -- type of this option. Possible values: TYPE_BOOL, TYPE_INT, TYPE_STRING, and so forth. unit -- units of this option. Possible values: UNIT_NONE, UNIT_PIXEL, etc. size -- size of the value in bytes cap -- capabilities available; CAP_EMULATED, CAP_SOFT_SELECT, etc. constraint -- constraint on values. Possible values: None : No constraint (min,max,step) Integer values, from min to max, stepping by list of integers or strings: only the listed values are allowed """ def __init__(self, args, scanDev): self.scanDev = scanDev # needed to get current value of this option self.index, self.name = args[0], args[1] self.title, self.desc = args[2], args[3] self.type, self.unit = args[4], args[5] self.size, self.cap = args[6], args[7] self.constraint = args[8] def f(x): if x=='-': return '_' else: return x if not isinstance(self.name, str): self.py_name=str(self.name) else: self.py_name=''.join(map(f, self.name)) def is_active(self): return _sane.OPTION_IS_ACTIVE(self.cap) def is_settable(self): return _sane.OPTION_IS_SETTABLE(self.cap) def __repr__(self): if self.is_settable(): settable = 'yes' else: settable = 'no' if self.is_active(): active = 'yes' curValue = repr(getattr(self.scanDev, self.py_name)) else: active = 'no' curValue = '' s = """\nName: %s Cur value: %s Index: %d Title: %s Desc: %s Type: %s Unit: %s Constr: %s active: %s settable: %s\n""" % (self.py_name, curValue, self.index, self.title, self.desc, TYPE_STR[self.type], UNIT_STR[self.unit], repr(self.constraint), active, settable) return s class _SaneIterator: """ intended for ADF scans. """ def __init__(self, device): self.device = device def __iter__(self): return self def __del__(self): self.device.cancel() def next(self): try: self.device.start() except error as v: if v == 'Document feeder out of documents': raise StopIteration else: raise return self.device.snap(1) class SaneDev: """Class representing a SANE device. Methods: start() -- initiate a scan, using the current settings snap() -- snap a picture, returning an Image object arr_snap() -- snap a picture, returning a numarray object cancel() -- cancel an in-progress scanning operation fileno() -- return the file descriptor for the scanner (handy for select) Also available, but rather low-level: get_parameters() -- get the current parameter settings of the device get_options() -- return a list of tuples describing all the options. Attributes: optlist -- list of option names You can also access an option name to retrieve its value, and to set it. For example, if one option has a .name attribute of imagemode, and scanner is a SaneDev object, you can do: print scanner.imagemode scanner.imagemode = 'Full frame' scanner.['imagemode'] returns the corresponding Option object. """ def __init__(self, devname): d=self.__dict__ d['sane_signature'] = self._getSaneSignature(devname) d['scanner_model'] = d['sane_signature'][1:3] d['dev'] = _sane._open(devname) self.__load_option_dict() def _getSaneSignature(self, devname): devices = get_devices() if not devices: raise RuntimeError('no scanner available') for dev in devices: if devname == dev[0]: return dev raise RuntimeError('no such scan device "%s"' % devname) def __load_option_dict(self): d=self.__dict__ d['opt']={} optlist=d['dev'].get_options() for t in optlist: o=Option(t, self) if o.type!=TYPE_GROUP: d['opt'][o.py_name]=o def __setattr__(self, key, value): dev=self.__dict__['dev'] optdict=self.__dict__['opt'] if key not in optdict: self.__dict__[key]=value ; return opt=optdict[key] if opt.type==TYPE_GROUP: raise AttributeError("Groups can't be set: "+key) if not _sane.OPTION_IS_ACTIVE(opt.cap): raise AttributeError('Inactive option: '+key) if not _sane.OPTION_IS_SETTABLE(opt.cap): raise AttributeError("Option can't be set by software: "+key) if isinstance(value, int) and opt.type == TYPE_FIXED: # avoid annoying errors of backend if int is given instead float: value = float(value) self.last_opt = dev.set_option(opt.index, value) # do binary AND to find if we have to reload options: if self.last_opt & INFO_RELOAD_OPTIONS: self.__load_option_dict() def __getattr__(self, key): dev=self.__dict__['dev'] optdict=self.__dict__['opt'] if key=='optlist': return list(self.opt.keys()) if key=='area': return (self.tl_x, self.tl_y),(self.br_x, self.br_y) if key not in optdict: raise AttributeError('No such attribute: '+key) opt=optdict[key] if opt.type==TYPE_BUTTON: raise AttributeError("Buttons don't have values: "+key) if opt.type==TYPE_GROUP: raise AttributeError("Groups don't have values: "+key) if not _sane.OPTION_IS_ACTIVE(opt.cap): raise AttributeError('Inactive option: '+key) value = dev.get_option(opt.index) return value def __getitem__(self, key): return self.opt[key] def get_parameters(self): """Return a 5-tuple holding all the current device settings: (format, last_frame, (pixels_per_line, lines), depth, bytes_per_line) - format is one of 'L' (grey), 'RGB', 'R' (red), 'G' (green), 'B' (blue). - last_frame [bool] indicates if this is the last frame of a multi frame image - (pixels_per_line, lines) specifies the size of the scanned image (x,y) - lines denotes the number of scanlines per frame - depth gives number of pixels per sample """ return self.dev.get_parameters() def get_options(self): "Return a list of tuples describing all the available options" return self.dev.get_options() def start(self): "Initiate a scanning operation" return self.dev.start() def cancel(self): "Cancel an in-progress scanning operation" return self.dev.cancel() def snap(self, no_cancel=0): "Snap a picture, returning a PIL image object with the results" (mode, last_frame, (xsize, ysize), depth, bytes_per_line) = self.get_parameters() if mode in ['gray', 'red', 'green', 'blue']: format = 'L' elif mode == 'color': format = 'RGB' else: raise ValueError('got unknown "mode" from self.get_parameters()') im=Image.new(format, (xsize,ysize)) self.dev.snap( im.im.id, no_cancel ) return im def scan(self): self.start() return self.snap() def multi_scan(self): return _SaneIterator(self) def arr_snap(self, multipleOf=1): """Snap a picture, returning a numarray object with the results. By default the resulting array has the same number of pixels per line as specified in self.get_parameters()[2][0] However sometimes it is necessary to obtain arrays where the number of pixels per line is e.g. a multiple of 4. This can then be achieved with the option 'multipleOf=4'. So if the scanner scanned 34 pixels per line, you will obtain an array with 32 pixels per line. """ (mode, last_frame, (xsize, ysize), depth, bpl) = self.get_parameters() if not mode in ['gray', 'red', 'green', 'blue']: raise RuntimeError('arr_snap() only works with monochrome images') if multipleOf < 1: raise ValueError('option "multipleOf" must be a positive number') elif multipleOf > 1: pixels_per_line = xsize - divmod(xsize, 4)[1] else: pixels_per_line = xsize return self.dev.arr_snap(pixels_per_line) def arr_scan(self, multipleOf=1): self.start() return self.arr_snap(multipleOf=multipleOf) def fileno(self): "Return the file descriptor for the scanning device" return self.dev.fileno() def close(self): self.dev.close() def open(devname): "Open a device for scanning" new=SaneDev(devname) return new pillow-2.3.0/MANIFEST.in0000644000175000001440000000312412257506326013443 0ustar dokousersinclude *.c include *.h include *.py include *.rst include .gitattributes include .travis.yml include Makefile include tox.ini recursive-include Images *.bdf recursive-include Images *.fli recursive-include Images *.gif recursive-include Images *.ico recursive-include Images *.jpg recursive-include Images *.pbm recursive-include Images *.pil recursive-include Images *.png recursive-include Images *.ppm recursive-include Images *.psd recursive-include Images *.tar recursive-include Images *.webp recursive-include Images *.xpm recursive-include Sane *.c recursive-include Sane *.py recursive-include Sane *.txt recursive-include Sane CHANGES recursive-include Sane README recursive-include Scripts *.py recursive-include Scripts README recursive-include Tests *.bin recursive-include Tests *.eps recursive-include Tests *.gnuplot recursive-include Tests *.icm recursive-include Tests *.jpg recursive-include Tests *.pcf recursive-include Tests *.pcx recursive-include Tests *.png recursive-include Tests *.ppm recursive-include Tests *.py recursive-include Tests *.tif recursive-include Tests *.tiff recursive-include Tests *.ttf recursive-include Tests *.txt recursive-include Tk *.c recursive-include Tk *.txt recursive-include docs *.bat recursive-include docs *.gitignore recursive-include docs *.html recursive-include docs *.py recursive-include docs *.rst recursive-include docs *.txt recursive-include docs Guardfile recursive-include docs Makefile recursive-include docs BUILDME recursive-include docs COPYING recursive-include docs LICENSE recursive-include libImaging *.c recursive-include libImaging *.h pillow-2.3.0/encode.c0000644000175000001440000005406212257510072013306 0ustar dokousers/* * The Python Imaging Library. * * standard encoder interfaces for the Imaging library * * History: * 1996-04-19 fl Based on decoders.c * 1996-05-12 fl Compile cleanly as C++ * 1996-12-30 fl Plugged potential memory leak for tiled images * 1997-01-03 fl Added GIF encoder * 1997-01-05 fl Plugged encoder buffer leaks * 1997-01-11 fl Added encode_to_file method * 1998-03-09 fl Added mode/rawmode argument to encoders * 1998-07-09 fl Added interlace argument to GIF encoder * 1999-02-07 fl Added PCX encoder * * Copyright (c) 1997-2001 by Secret Labs AB * Copyright (c) 1996-1997 by Fredrik Lundh * * See the README file for information on usage and redistribution. */ /* FIXME: make these pluggable! */ #include "Python.h" #include "Imaging.h" #include "py3.h" #include "Gif.h" #ifdef HAVE_UNISTD_H #include /* write */ #endif /* -------------------------------------------------------------------- */ /* Common */ /* -------------------------------------------------------------------- */ typedef struct { PyObject_HEAD int (*encode)(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); struct ImagingCodecStateInstance state; Imaging im; PyObject* lock; } ImagingEncoderObject; static PyTypeObject ImagingEncoderType; static ImagingEncoderObject* PyImaging_EncoderNew(int contextsize) { ImagingEncoderObject *encoder; void *context; if(!PyType_Ready(&ImagingEncoderType) < 0) return NULL; encoder = PyObject_New(ImagingEncoderObject, &ImagingEncoderType); if (encoder == NULL) return NULL; /* Clear the encoder state */ memset(&encoder->state, 0, sizeof(encoder->state)); /* Allocate encoder context */ if (contextsize > 0) { context = (void*) calloc(1, contextsize); if (!context) { Py_DECREF(encoder); (void) PyErr_NoMemory(); return NULL; } } else context = 0; /* Initialize encoder context */ encoder->state.context = context; /* Target image */ encoder->lock = NULL; encoder->im = NULL; return encoder; } static void _dealloc(ImagingEncoderObject* encoder) { free(encoder->state.buffer); free(encoder->state.context); Py_XDECREF(encoder->lock); PyObject_Del(encoder); } static PyObject* _encode(ImagingEncoderObject* encoder, PyObject* args) { PyObject* buf; PyObject* result; int status; /* Encode to a Python string (allocated by this method) */ int bufsize = 16384; if (!PyArg_ParseTuple(args, "|i", &bufsize)) return NULL; buf = PyBytes_FromStringAndSize(NULL, bufsize); if (!buf) return NULL; status = encoder->encode(encoder->im, &encoder->state, (UINT8*) PyBytes_AsString(buf), bufsize); /* adjust string length to avoid slicing in encoder */ if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0) return NULL; result = Py_BuildValue("iiO", status, encoder->state.errcode, buf); Py_DECREF(buf); /* must release buffer!!! */ return result; } static PyObject* _encode_to_file(ImagingEncoderObject* encoder, PyObject* args) { UINT8* buf; int status; ImagingSectionCookie cookie; /* Encode to a file handle */ int fh; int bufsize = 16384; if (!PyArg_ParseTuple(args, "i|i", &fh, &bufsize)) return NULL; /* Allocate an encoder buffer */ buf = (UINT8*) malloc(bufsize); if (!buf) return PyErr_NoMemory(); ImagingSectionEnter(&cookie); do { /* This replaces the inner loop in the ImageFile _save function. */ status = encoder->encode(encoder->im, &encoder->state, buf, bufsize); if (status > 0) if (write(fh, buf, status) < 0) { ImagingSectionLeave(&cookie); free(buf); return PyErr_SetFromErrno(PyExc_IOError); } } while (encoder->state.errcode == 0); ImagingSectionLeave(&cookie); free(buf); return Py_BuildValue("i", encoder->state.errcode); } extern Imaging PyImaging_AsImaging(PyObject *op); static PyObject* _setimage(ImagingEncoderObject* encoder, PyObject* args) { PyObject* op; Imaging im; ImagingCodecState state; int x0, y0, x1, y1; /* Define where image data should be stored */ x0 = y0 = x1 = y1 = 0; /* FIXME: should publish the ImagingType descriptor */ if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1)) return NULL; im = PyImaging_AsImaging(op); if (!im) return NULL; encoder->im = im; state = &encoder->state; if (x0 == 0 && x1 == 0) { state->xsize = im->xsize; state->ysize = im->ysize; } else { state->xoff = x0; state->yoff = y0; state->xsize = x1 - x0; state->ysize = y1 - y0; } if (state->xsize <= 0 || state->xsize + state->xoff > im->xsize || state->ysize <= 0 || state->ysize + state->yoff > im->ysize) { PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image"); return NULL; } /* Allocate memory buffer (if bits field is set) */ if (state->bits > 0) { state->bytes = (state->bits * state->xsize+7)/8; state->buffer = (UINT8*) malloc(state->bytes); if (!state->buffer) return PyErr_NoMemory(); } /* Keep a reference to the image object, to make sure it doesn't go away before we do */ Py_INCREF(op); Py_XDECREF(encoder->lock); encoder->lock = op; Py_INCREF(Py_None); return Py_None; } static struct PyMethodDef methods[] = { {"encode", (PyCFunction)_encode, 1}, {"encode_to_file", (PyCFunction)_encode_to_file, 1}, {"setimage", (PyCFunction)_setimage, 1}, {NULL, NULL} /* sentinel */ }; static PyTypeObject ImagingEncoderType = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingEncoder", /*tp_name*/ sizeof(ImagingEncoderObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; /* -------------------------------------------------------------------- */ int get_packer(ImagingEncoderObject* encoder, const char* mode, const char* rawmode) { int bits; ImagingShuffler pack; pack = ImagingFindPacker(mode, rawmode, &bits); if (!pack) { Py_DECREF(encoder); PyErr_SetString(PyExc_SystemError, "unknown raw mode"); return -1; } encoder->state.shuffle = pack; encoder->state.bits = bits; return 0; } /* -------------------------------------------------------------------- */ /* EPS */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_EpsEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) return NULL; encoder->encode = ImagingEpsEncode; return (PyObject*) encoder; } /* -------------------------------------------------------------------- */ /* GIF */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_GifEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char *mode; char *rawmode; int bits = 8; int interlace = 0; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &bits, &interlace)) return NULL; encoder = PyImaging_EncoderNew(sizeof(GIFENCODERSTATE)); if (encoder == NULL) return NULL; if (get_packer(encoder, mode, rawmode) < 0) return NULL; encoder->encode = ImagingGifEncode; ((GIFENCODERSTATE*)encoder->state.context)->bits = bits; ((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace; return (PyObject*) encoder; } /* -------------------------------------------------------------------- */ /* PCX */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_PcxEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char *mode; char *rawmode; int bits = 8; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &bits)) return NULL; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) return NULL; if (get_packer(encoder, mode, rawmode) < 0) return NULL; encoder->encode = ImagingPcxEncode; return (PyObject*) encoder; } /* -------------------------------------------------------------------- */ /* RAW */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_RawEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char *mode; char *rawmode; int stride = 0; int ystep = 1; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) return NULL; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) return NULL; if (get_packer(encoder, mode, rawmode) < 0) return NULL; encoder->encode = ImagingRawEncode; encoder->state.ystep = ystep; encoder->state.count = stride; return (PyObject*) encoder; } /* -------------------------------------------------------------------- */ /* XBM */ /* -------------------------------------------------------------------- */ PyObject* PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) return NULL; if (get_packer(encoder, "1", "1;R") < 0) return NULL; encoder->encode = ImagingXbmEncode; return (PyObject*) encoder; } /* -------------------------------------------------------------------- */ /* ZIP */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBZ #include "Zip.h" PyObject* PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char* mode; char* rawmode; int optimize = 0; int compress_level = -1; int compress_type = -1; char* dictionary = NULL; int dictionary_size = 0; if (!PyArg_ParseTuple(args, "ss|iii"PY_ARG_BYTES_LENGTH, &mode, &rawmode, &optimize, &compress_level, &compress_type, &dictionary, &dictionary_size)) return NULL; /* Copy to avoid referencing Python's memory, but there's no mechanism to free this memory later, so this function (and several others here) leaks. */ if (dictionary && dictionary_size > 0) { char* p = malloc(dictionary_size); if (!p) return PyErr_NoMemory(); memcpy(p, dictionary, dictionary_size); dictionary = p; } else dictionary = NULL; encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE)); if (encoder == NULL) return NULL; if (get_packer(encoder, mode, rawmode) < 0) return NULL; encoder->encode = ImagingZipEncode; if (rawmode[0] == 'P') /* disable filtering */ ((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE; ((ZIPSTATE*)encoder->state.context)->optimize = optimize; ((ZIPSTATE*)encoder->state.context)->compress_level = compress_level; ((ZIPSTATE*)encoder->state.context)->compress_type = compress_type; ((ZIPSTATE*)encoder->state.context)->dictionary = dictionary; ((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size; return (PyObject*) encoder; } #endif /* -------------------------------------------------------------------- */ /* JPEG */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBJPEG /* We better define this encoder last in this file, so the following undef's won't mess things up for the Imaging library proper. */ #undef HAVE_PROTOTYPES #undef HAVE_STDDEF_H #undef HAVE_STDLIB_H #undef UINT8 #undef UINT16 #undef UINT32 #undef INT8 #undef INT16 #undef INT32 #include "Jpeg.h" static unsigned int** get_qtables_arrays(PyObject* qtables) { PyObject* tables; PyObject* table; PyObject* table_data; int i, j, num_tables; unsigned int **qarrays; if ((qtables == NULL) || (qtables == Py_None)) { return NULL; } if (!PySequence_Check(qtables)) { PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); return NULL; } tables = PySequence_Fast(qtables, "expected a sequence"); num_tables = PySequence_Size(qtables); if (num_tables < 2 || num_tables > NUM_QUANT_TBLS) { PyErr_SetString(PyExc_ValueError, "Not a valid numbers of quantization tables. Should be between 2 and 4."); return NULL; } qarrays = (unsigned int**) PyMem_Malloc(num_tables * sizeof(unsigned int*)); if (!qarrays) { Py_DECREF(tables); PyErr_NoMemory(); return NULL; } for (i = 0; i < num_tables; i++) { table = PySequence_Fast_GET_ITEM(tables, i); if (!PySequence_Check(table)) { Py_DECREF(tables); PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); return NULL; } if (PySequence_Size(table) != DCTSIZE2) { Py_DECREF(tables); PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); return NULL; } table_data = PySequence_Fast(table, "expected a sequence"); qarrays[i] = (unsigned int*) PyMem_Malloc(DCTSIZE2 * sizeof(unsigned int)); if (!qarrays[i]) { Py_DECREF(tables); PyErr_NoMemory(); return NULL; } for (j = 0; j < DCTSIZE2; j++) { qarrays[i][j] = PyInt_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j)); } } Py_DECREF(tables); if (PyErr_Occurred()) { PyMem_Free(qarrays); qarrays = NULL; } return qarrays; } PyObject* PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char *mode; char *rawmode; int quality = 0; int progressive = 0; int smooth = 0; int optimize = 0; int streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */ int xdpi = 0, ydpi = 0; int subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */ PyObject* qtables=NULL; unsigned int **qarrays = NULL; char* extra = NULL; int extra_size; char* rawExif = NULL; int rawExifLen = 0; if (!PyArg_ParseTuple(args, "ss|iiiiiiiiO"PY_ARG_BYTES_LENGTH""PY_ARG_BYTES_LENGTH, &mode, &rawmode, &quality, &progressive, &smooth, &optimize, &streamtype, &xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size, &rawExif, &rawExifLen)) return NULL; encoder = PyImaging_EncoderNew(sizeof(JPEGENCODERSTATE)); if (encoder == NULL) return NULL; if (get_packer(encoder, mode, rawmode) < 0) return NULL; qarrays = get_qtables_arrays(qtables); if (extra && extra_size > 0) { char* p = malloc(extra_size); if (!p) return PyErr_NoMemory(); memcpy(p, extra, extra_size); extra = p; } else extra = NULL; if (rawExif && rawExifLen > 0) { char* pp = malloc(rawExifLen); if (!pp) return PyErr_NoMemory(); memcpy(pp, rawExif, rawExifLen); rawExif = pp; } else rawExif = NULL; encoder->encode = ImagingJpegEncode; ((JPEGENCODERSTATE*)encoder->state.context)->quality = quality; ((JPEGENCODERSTATE*)encoder->state.context)->qtables = qarrays; ((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling; ((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive; ((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth; ((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize; ((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype; ((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi; ((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi; ((JPEGENCODERSTATE*)encoder->state.context)->extra = extra; ((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size; ((JPEGENCODERSTATE*)encoder->state.context)->rawExif = rawExif; ((JPEGENCODERSTATE*)encoder->state.context)->rawExifLen = rawExifLen; return (PyObject*) encoder; } #endif /* -------------------------------------------------------------------- */ /* LibTiff */ /* -------------------------------------------------------------------- */ #ifdef HAVE_LIBTIFF #include "TiffDecode.h" #include #ifdef __WIN32__ #define strcasecmp(s1, s2) stricmp(s1, s2) #endif PyObject* PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) { ImagingEncoderObject* encoder; char* mode; char* rawmode; char* compname; char* filename; int fp; PyObject *dir; PyObject *key, *value; Py_ssize_t pos = 0; int status; Py_ssize_t d_size; PyObject *keys, *values; if (! PyArg_ParseTuple(args, "sssisO", &mode, &rawmode, &compname, &fp, &filename, &dir)) { return NULL; } if (!PyDict_Check(dir)) { PyErr_SetString(PyExc_ValueError, "Invalid Dictionary"); return NULL; } else { d_size = PyDict_Size(dir); TRACE(("dict size: %d\n", (int)d_size)); keys = PyDict_Keys(dir); values = PyDict_Values(dir); for (pos=0;posstate, filename, fp)) { Py_DECREF(encoder); PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); return NULL; } // While failes on 64 bit machines, complains that pos is an int instead of a Py_ssize_t // while (PyDict_Next(dir, &pos, &key, &value)) { for (pos=0;posstate, (ttag_t) PyInt_AsLong(key), PyInt_AsLong(value)); } else if(PyBytes_Check(value)) { TRACE(("Setting from Bytes: %d, %s \n", (int)PyInt_AsLong(key),PyBytes_AsString(value))); status = ImagingLibTiffSetField(&encoder->state, (ttag_t) PyInt_AsLong(key), PyBytes_AsString(value)); } else if(PyList_Check(value)) { int len,i; float *floatav; int *intav; TRACE(("Setting from List: %d \n", (int)PyInt_AsLong(key))); len = (int)PyList_Size(value); if (len) { if (PyInt_Check(PyList_GetItem(value,0))) { TRACE((" %d elements, setting as ints \n", len)); intav = malloc(sizeof(int)*len); if (intav) { for (i=0;istate, (ttag_t) PyInt_AsLong(key), intav); free(intav); } } else { TRACE((" %d elements, setting as floats \n", len)); floatav = malloc(sizeof(float)*len); if (floatav) { for (i=0;istate, (ttag_t) PyInt_AsLong(key), floatav); free(floatav); } } } } else if (PyFloat_Check(value)) { TRACE(("Setting from Float: %d, %f \n", (int)PyInt_AsLong(key),PyFloat_AsDouble(value))); status = ImagingLibTiffSetField(&encoder->state, (ttag_t) PyInt_AsLong(key), (float)PyFloat_AsDouble(value)); } else { TRACE(("Unhandled type for key %d : %s \n", (int)PyInt_AsLong(key), PyBytes_AsString(PyObject_Str(value)))); } if (!status) { TRACE(("Error setting Field\n")); Py_DECREF(encoder); PyErr_SetString(PyExc_RuntimeError, "Error setting from dictionary"); return NULL; } } encoder->encode = ImagingLibTiffEncode; return (PyObject*) encoder; } #endif pillow-2.3.0/Tests/0000755000175000001440000000000012274164213013001 5ustar dokouserspillow-2.3.0/Tests/test_image_offset.py0000644000175000001440000000075112257506326017053 0ustar dokousersfrom tester import * from PIL import Image def test_offset(): im1 = lena() im2 = assert_warning(DeprecationWarning, lambda: im1.offset(10)) assert_equal(im1.getpixel((0, 0)), im2.getpixel((10, 10))) im2 = assert_warning(DeprecationWarning, lambda: im1.offset(10, 20)) assert_equal(im1.getpixel((0, 0)), im2.getpixel((10, 20))) im2 = assert_warning(DeprecationWarning, lambda: im1.offset(20, 20)) assert_equal(im1.getpixel((0, 0)), im2.getpixel((20, 20))) pillow-2.3.0/Tests/test_font_pcf.py0000644000175000001440000000150512257506326016217 0ustar dokousersfrom tester import * from PIL import Image, FontFile, PcfFontFile from PIL import ImageFont, ImageDraw codecs = dir(Image.core) if "zip_encoder" not in codecs or "zip_decoder" not in codecs: skip("zlib support not available") fontname = "Tests/fonts/helvO18.pcf" tempname = tempfile("temp.pil", "temp.pbm") message = "hello, world" def test_sanity(): file = open(fontname, "rb") font = PcfFontFile.PcfFontFile(file) assert_true(isinstance(font, FontFile.FontFile)) assert_equal(len([_f for _f in font.glyph if _f]), 192) font.save(tempname) def test_draw(): font = ImageFont.load(tempname) image = Image.new("L", font.getsize(message), "white") draw = ImageDraw.Draw(image) draw.text((0, 0), message, font=font) # assert_signature(image, "7216c60f988dea43a46bb68321e3c1b03ec62aee") pillow-2.3.0/Tests/test_imagefileio.py0000644000175000001440000000072212257506326016673 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageFileIO def test_fileio(): class DumbFile: def __init__(self, data): self.data = data def read(self, bytes=None): assert_equal(bytes, None) return self.data def close(self): pass im1 = lena() io = ImageFileIO.ImageFileIO(DumbFile(tostring(im1, "PPM"))) im2 = Image.open(io) assert_image_equal(im1, im2) pillow-2.3.0/Tests/test_file_jpeg.py0000644000175000001440000001511012257506326016342 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageFile codecs = dir(Image.core) if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: skip("jpeg support not available") # sample jpeg stream file = "Images/lena.jpg" data = open(file, "rb").read() def roundtrip(im, **options): out = BytesIO() im.save(out, "JPEG", **options) bytes = out.tell() out.seek(0) im = Image.open(out) im.bytes = bytes # for testing only return im # -------------------------------------------------------------------- def test_sanity(): # internal version number assert_match(Image.core.jpeglib_version, "\d+\.\d+$") im = Image.open(file) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "JPEG") # -------------------------------------------------------------------- def test_app(): # Test APP/COM reader (@PIL135) im = Image.open(file) assert_equal(im.applist[0], ("APP0", b"JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00")) assert_equal(im.applist[1], ("COM", b"Python Imaging Library")) assert_equal(len(im.applist), 2) def test_cmyk(): # Test CMYK handling. Thanks to Tim and Charlie for test data, # Michael for getting me to look one more time. file = "Tests/images/pil_sample_cmyk.jpg" im = Image.open(file) # the source image has red pixels in the upper left corner. c, m, y, k = [x / 255.0 for x in im.getpixel((0, 0))] assert_true(c == 0.0 and m > 0.8 and y > 0.8 and k == 0.0) # the opposite corner is black c, m, y, k = [x / 255.0 for x in im.getpixel((im.size[0]-1, im.size[1]-1))] assert_true(k > 0.9) # roundtrip, and check again im = roundtrip(im) c, m, y, k = [x / 255.0 for x in im.getpixel((0, 0))] assert_true(c == 0.0 and m > 0.8 and y > 0.8 and k == 0.0) c, m, y, k = [x / 255.0 for x in im.getpixel((im.size[0]-1, im.size[1]-1))] assert_true(k > 0.9) def test_dpi(): def test(xdpi, ydpi=None): im = Image.open(file) im = roundtrip(im, dpi=(xdpi, ydpi or xdpi)) return im.info.get("dpi") assert_equal(test(72), (72, 72)) assert_equal(test(300), (300, 300)) assert_equal(test(100, 200), (100, 200)) assert_equal(test(0), None) # square pixels def test_icc(): # Test ICC support im1 = Image.open("Tests/images/rgb.jpg") icc_profile = im1.info["icc_profile"] assert_equal(len(icc_profile), 3144) # Roundtrip via physical file. file = tempfile("temp.jpg") im1.save(file, icc_profile=icc_profile) im2 = Image.open(file) assert_equal(im2.info.get("icc_profile"), icc_profile) # Roundtrip via memory buffer. im1 = roundtrip(lena()) im2 = roundtrip(lena(), icc_profile=icc_profile) assert_image_equal(im1, im2) assert_false(im1.info.get("icc_profile")) assert_true(im2.info.get("icc_profile")) def test_icc_big(): # Make sure that the "extra" support handles large blocks def test(n): # The ICC APP marker can store 65519 bytes per marker, so # using a 4-byte test code should allow us to detect out of # order issues. icc_profile = (b"Test"*int(n/4+1))[:n] assert len(icc_profile) == n # sanity im1 = roundtrip(lena(), icc_profile=icc_profile) assert_equal(im1.info.get("icc_profile"), icc_profile or None) test(0); test(1) test(3); test(4); test(5) test(65533-14) # full JPEG marker block test(65533-14+1) # full block plus one byte test(ImageFile.MAXBLOCK) # full buffer block test(ImageFile.MAXBLOCK+1) # full buffer block plus one byte test(ImageFile.MAXBLOCK*4+3) # large block def test_optimize(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), optimize=1) assert_image_equal(im1, im2) assert_true(im1.bytes >= im2.bytes) def test_optimize_large_buffer(): #https://github.com/python-imaging/Pillow/issues/148 f = tempfile('temp.jpg') # this requires ~ 1.5x Image.MAXBLOCK im = Image.new("RGB", (4096,4096), 0xff3333) im.save(f, format="JPEG", optimize=True) def test_progressive(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), progressive=True) assert_image_equal(im1, im2) assert_true(im1.bytes >= im2.bytes) def test_progressive_large_buffer(): f = tempfile('temp.jpg') # this requires ~ 1.5x Image.MAXBLOCK im = Image.new("RGB", (4096,4096), 0xff3333) im.save(f, format="JPEG", progressive=True) def test_large_exif(): #https://github.com/python-imaging/Pillow/issues/148 f = tempfile('temp.jpg') im = lena() im.save(f,'JPEG', quality=90, exif=b"1"*65532) def test_progressive(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), progressive=1) im3 = roundtrip(lena(), progression=1) # compatibility assert_image_equal(im1, im2) assert_image_equal(im1, im3) assert_false(im1.info.get("progressive")) assert_false(im1.info.get("progression")) assert_true(im2.info.get("progressive")) assert_true(im2.info.get("progression")) assert_true(im3.info.get("progressive")) assert_true(im3.info.get("progression")) def test_quality(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), quality=50) assert_image(im1, im2.mode, im2.size) assert_true(im1.bytes >= im2.bytes) def test_smooth(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), smooth=100) assert_image(im1, im2.mode, im2.size) def test_subsampling(): def getsampling(im): layer = im.layer return layer[0][1:3] + layer[1][1:3] + layer[2][1:3] # experimental API im = roundtrip(lena(), subsampling=-1) # default assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling=0) # 4:4:4 assert_equal(getsampling(im), (1, 1, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling=1) # 4:2:2 assert_equal(getsampling(im), (2, 1, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling=2) # 4:1:1 assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling=3) # default (undefined) assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling="4:4:4") assert_equal(getsampling(im), (1, 1, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling="4:2:2") assert_equal(getsampling(im), (2, 1, 1, 1, 1, 1)) im = roundtrip(lena(), subsampling="4:1:1") assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) assert_exception(TypeError, lambda: roundtrip(lena(), subsampling="1:1:1")) def test_exif(): im = Image.open("Tests/images/pil_sample_rgb.jpg") info = im._getexif() assert_equal(info[305], 'Adobe Photoshop CS Macintosh') pillow-2.3.0/Tests/test_image_point.py0000644000175000001440000000162412257512376016720 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() assert_exception(ValueError, lambda: im.point(list(range(256)))) assert_no_exception(lambda: im.point(list(range(256))*3)) assert_no_exception(lambda: im.point(lambda x: x)) im = im.convert("I") assert_exception(ValueError, lambda: im.point(list(range(256)))) assert_no_exception(lambda: im.point(lambda x: x*1)) assert_no_exception(lambda: im.point(lambda x: x+1)) assert_no_exception(lambda: im.point(lambda x: x*1+1)) assert_exception(TypeError, lambda: im.point(lambda x: x-1)) assert_exception(TypeError, lambda: im.point(lambda x: x/1)) def test_16bit_lut(): """ Tests for 16 bit -> 8 bit lut for converting I->L images see https://github.com/python-imaging/Pillow/issues/440 """ im = lena("I") assert_no_exception(lambda: im.point(list(range(256))*256, 'L')) pillow-2.3.0/Tests/test_imagecolor.py0000644000175000001440000000256012257506326016544 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageColor # -------------------------------------------------------------------- # sanity assert_equal((255, 0, 0), ImageColor.getrgb("#f00")) assert_equal((255, 0, 0), ImageColor.getrgb("#ff0000")) assert_equal((255, 0, 0), ImageColor.getrgb("rgb(255,0,0)")) assert_equal((255, 0, 0), ImageColor.getrgb("rgb(255, 0, 0)")) assert_equal((255, 0, 0), ImageColor.getrgb("rgb(100%,0%,0%)")) assert_equal((255, 0, 0), ImageColor.getrgb("hsl(0, 100%, 50%)")) assert_equal((255, 0, 0, 0), ImageColor.getrgb("rgba(255,0,0,0)")) assert_equal((255, 0, 0, 0), ImageColor.getrgb("rgba(255, 0, 0, 0)")) assert_equal((255, 0, 0), ImageColor.getrgb("red")) # -------------------------------------------------------------------- # look for rounding errors (based on code by Tim Hatch) for color in list(ImageColor.colormap.keys()): expected = Image.new("RGB", (1, 1), color).convert("L").getpixel((0, 0)) actual = Image.new("L", (1, 1), color).getpixel((0, 0)) assert_equal(expected, actual) assert_equal((0, 0, 0), ImageColor.getcolor("black", "RGB")) assert_equal((255, 255, 255), ImageColor.getcolor("white", "RGB")) assert_equal(0, ImageColor.getcolor("black", "L")) assert_equal(255, ImageColor.getcolor("white", "L")) assert_equal(0, ImageColor.getcolor("black", "1")) assert_equal(255, ImageColor.getcolor("white", "1")) pillow-2.3.0/Tests/test_imagedraw.py0000644000175000001440000000103712257506326016361 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageDraw def test_sanity(): im = lena("RGB").copy() draw = ImageDraw.ImageDraw(im) draw = ImageDraw.Draw(im) draw.ellipse(list(range(4))) draw.line(list(range(10))) draw.polygon(list(range(100))) draw.rectangle(list(range(4))) success() def test_deprecated(): im = lena().copy() draw = ImageDraw.Draw(im) assert_warning(DeprecationWarning, lambda: draw.setink(0)) assert_warning(DeprecationWarning, lambda: draw.setfill(0)) pillow-2.3.0/Tests/test_imagemath.py0000644000175000001440000000477712257506326016373 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageMath def pixel(im): if hasattr(im, "im"): return "%s %r" % (im.mode, im.getpixel((0, 0))) else: if isinstance(im, type(0)): return int(im) # hack to deal with booleans print(im) A = Image.new("L", (1, 1), 1) B = Image.new("L", (1, 1), 2) F = Image.new("F", (1, 1), 3) I = Image.new("I", (1, 1), 4) images = {"A": A, "B": B, "F": F, "I": I} def test_sanity(): assert_equal(ImageMath.eval("1"), 1) assert_equal(ImageMath.eval("1+A", A=2), 3) assert_equal(pixel(ImageMath.eval("A+B", A=A, B=B)), "I 3") assert_equal(pixel(ImageMath.eval("A+B", images)), "I 3") assert_equal(pixel(ImageMath.eval("float(A)+B", images)), "F 3.0") assert_equal(pixel(ImageMath.eval("int(float(A)+B)", images)), "I 3") def test_ops(): assert_equal(pixel(ImageMath.eval("-A", images)), "I -1") assert_equal(pixel(ImageMath.eval("+B", images)), "L 2") assert_equal(pixel(ImageMath.eval("A+B", images)), "I 3") assert_equal(pixel(ImageMath.eval("A-B", images)), "I -1") assert_equal(pixel(ImageMath.eval("A*B", images)), "I 2") assert_equal(pixel(ImageMath.eval("A/B", images)), "I 0") assert_equal(pixel(ImageMath.eval("B**2", images)), "I 4") assert_equal(pixel(ImageMath.eval("B**33", images)), "I 2147483647") assert_equal(pixel(ImageMath.eval("float(A)+B", images)), "F 3.0") assert_equal(pixel(ImageMath.eval("float(A)-B", images)), "F -1.0") assert_equal(pixel(ImageMath.eval("float(A)*B", images)), "F 2.0") assert_equal(pixel(ImageMath.eval("float(A)/B", images)), "F 0.5") assert_equal(pixel(ImageMath.eval("float(B)**2", images)), "F 4.0") assert_equal(pixel(ImageMath.eval("float(B)**33", images)), "F 8589934592.0") def test_logical(): assert_equal(pixel(ImageMath.eval("not A", images)), 0) assert_equal(pixel(ImageMath.eval("A and B", images)), "L 2") assert_equal(pixel(ImageMath.eval("A or B", images)), "L 1") def test_convert(): assert_equal(pixel(ImageMath.eval("convert(A+B, 'L')", images)), "L 3") assert_equal(pixel(ImageMath.eval("convert(A+B, '1')", images)), "1 0") assert_equal(pixel(ImageMath.eval("convert(A+B, 'RGB')", images)), "RGB (3, 3, 3)") def test_compare(): assert_equal(pixel(ImageMath.eval("min(A, B)", images)), "I 1") assert_equal(pixel(ImageMath.eval("max(A, B)", images)), "I 2") assert_equal(pixel(ImageMath.eval("A == 1", images)), "I 1") assert_equal(pixel(ImageMath.eval("A == 2", images)), "I 0") pillow-2.3.0/Tests/test_imageqt.py0000644000175000001440000000162712257510366016054 0ustar dokousersfrom tester import * from PIL import Image try: from PyQt5.QtGui import QImage, qRgb, qRgba except: try: from PyQt4.QtGui import QImage, qRgb, qRgba except: skip('PyQT4 or 5 not installed') from PIL import ImageQt def test_rgb(): # from https://qt-project.org/doc/qt-4.8/qcolor.html # typedef QRgb # An ARGB quadruplet on the format #AARRGGBB, equivalent to an unsigned int. assert_equal(qRgb(0,0,0), qRgba(0,0,0,255)) def checkrgb(r,g,b): val = ImageQt.rgb(r,g,b) val = val % 2**24 # drop the alpha assert_equal(val >> 16, r) assert_equal(((val >> 8 ) % 2**8), g) assert_equal(val % 2**8, b) checkrgb(0,0,0) checkrgb(255,0,0) checkrgb(0,255,0) checkrgb(0,0,255) def test_image(): for mode in ('1', 'RGB', 'RGBA', 'L', 'P'): assert_no_exception(lambda: ImageQt.ImageQt(lena(mode))) pillow-2.3.0/Tests/test_imageshow.py0000644000175000001440000000012112257506326016375 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageShow success() pillow-2.3.0/Tests/test_image.py0000644000175000001440000000207112257506326015502 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = Image.new("L", (100, 100)) assert_equal(repr(im)[:45], "255? assert_equal(pack("RGBA", "RGBA"), [1, 2, 3, 4]) assert_equal(pack("CMYK", "CMYK"), [1, 2, 3, 4]) assert_equal(pack("YCbCr", "YCbCr"), [1, 2, 3]) def test_unpack(): def unpack(mode, rawmode, bytes_): im = None if py3: data = bytes(range(1,bytes_+1)) else: data = ''.join(chr(i) for i in range(1,bytes_+1)) im = Image.frombytes(mode, (1, 1), data, "raw", rawmode, 0, 1) return im.getpixel((0, 0)) def unpack_1(mode, rawmode, value): assert mode == "1" im = None if py3: im = Image.frombytes(mode, (8, 1), bytes([value]), "raw", rawmode, 0, 1) else: im = Image.frombytes(mode, (8, 1), chr(value), "raw", rawmode, 0, 1) return tuple(im.getdata()) X = 255 assert_equal(unpack_1("1", "1", 1), (0,0,0,0,0,0,0,X)) assert_equal(unpack_1("1", "1;I", 1), (X,X,X,X,X,X,X,0)) assert_equal(unpack_1("1", "1;R", 1), (X,0,0,0,0,0,0,0)) assert_equal(unpack_1("1", "1;IR", 1), (0,X,X,X,X,X,X,X)) assert_equal(unpack_1("1", "1", 170), (X,0,X,0,X,0,X,0)) assert_equal(unpack_1("1", "1;I", 170), (0,X,0,X,0,X,0,X)) assert_equal(unpack_1("1", "1;R", 170), (0,X,0,X,0,X,0,X)) assert_equal(unpack_1("1", "1;IR", 170), (X,0,X,0,X,0,X,0)) assert_equal(unpack("L", "L;2", 1), 0) assert_equal(unpack("L", "L;4", 1), 0) assert_equal(unpack("L", "L", 1), 1) assert_equal(unpack("L", "L;I", 1), 254) assert_equal(unpack("L", "L;R", 1), 128) assert_equal(unpack("L", "L;16", 2), 2) # little endian assert_equal(unpack("L", "L;16B", 2), 1) # big endian assert_equal(unpack("LA", "LA", 2), (1, 2)) assert_equal(unpack("LA", "LA;L", 2), (1, 2)) assert_equal(unpack("RGB", "RGB", 3), (1, 2, 3)) assert_equal(unpack("RGB", "RGB;L", 3), (1, 2, 3)) assert_equal(unpack("RGB", "RGB;R", 3), (128, 64, 192)) assert_equal(unpack("RGB", "RGB;16B", 6), (1, 3, 5)) # ? assert_equal(unpack("RGB", "BGR", 3), (3, 2, 1)) assert_equal(unpack("RGB", "RGB;15", 2), (8, 131, 0)) assert_equal(unpack("RGB", "BGR;15", 2), (0, 131, 8)) assert_equal(unpack("RGB", "RGB;16", 2), (8, 64, 0)) assert_equal(unpack("RGB", "BGR;16", 2), (0, 64, 8)) assert_equal(unpack("RGB", "RGB;4B", 2), (17, 0, 34)) assert_equal(unpack("RGB", "RGBX", 4), (1, 2, 3)) assert_equal(unpack("RGB", "BGRX", 4), (3, 2, 1)) assert_equal(unpack("RGB", "XRGB", 4), (2, 3, 4)) assert_equal(unpack("RGB", "XBGR", 4), (4, 3, 2)) assert_equal(unpack("RGBA", "RGBA", 4), (1, 2, 3, 4)) assert_equal(unpack("RGBA", "BGRA", 4), (3, 2, 1, 4)) assert_equal(unpack("RGBA", "ARGB", 4), (2, 3, 4, 1)) assert_equal(unpack("RGBA", "ABGR", 4), (4, 3, 2, 1)) assert_equal(unpack("RGBA", "RGBA;15", 2), (8, 131, 0, 0)) assert_equal(unpack("RGBA", "BGRA;15", 2), (0, 131, 8, 0)) assert_equal(unpack("RGBA", "RGBA;4B", 2), (17, 0, 34, 0)) assert_equal(unpack("RGBX", "RGBX", 4), (1, 2, 3, 4)) # 4->255? assert_equal(unpack("RGBX", "BGRX", 4), (3, 2, 1, 255)) assert_equal(unpack("RGBX", "XRGB", 4), (2, 3, 4, 255)) assert_equal(unpack("RGBX", "XBGR", 4), (4, 3, 2, 255)) assert_equal(unpack("RGBX", "RGB;15", 2), (8, 131, 0, 255)) assert_equal(unpack("RGBX", "BGR;15", 2), (0, 131, 8, 255)) assert_equal(unpack("RGBX", "RGB;4B", 2), (17, 0, 34, 255)) assert_equal(unpack("CMYK", "CMYK", 4), (1, 2, 3, 4)) assert_equal(unpack("CMYK", "CMYK;I", 4), (254, 253, 252, 251)) assert_exception(ValueError, lambda: unpack("L", "L", 0)) assert_exception(ValueError, lambda: unpack("RGB", "RGB", 2)) assert_exception(ValueError, lambda: unpack("CMYK", "CMYK", 2)) run() pillow-2.3.0/Tests/test_image_tell.py0000644000175000001440000000006712257506326016525 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_file_xpm.py0000644000175000001440000000043512257506326016225 0ustar dokousersfrom tester import * from PIL import Image # sample ppm stream file = "Images/lena.xpm" data = open(file, "rb").read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "P") assert_equal(im.size, (128, 128)) assert_equal(im.format, "XPM") pillow-2.3.0/Tests/test_imageops.py0000644000175000001440000000402012257506326016220 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageOps class Deformer: def getmesh(self, im): x, y = im.size return [((0, 0, x, y), (0, 0, x, 0, x, y, y, 0))] deformer = Deformer() def test_sanity(): ImageOps.autocontrast(lena("L")) ImageOps.autocontrast(lena("RGB")) ImageOps.autocontrast(lena("L"), cutoff=10) ImageOps.autocontrast(lena("L"), ignore=[0, 255]) ImageOps.colorize(lena("L"), (0, 0, 0), (255, 255, 255)) ImageOps.colorize(lena("L"), "black", "white") ImageOps.crop(lena("L"), 1) ImageOps.crop(lena("RGB"), 1) ImageOps.deform(lena("L"), deformer) ImageOps.deform(lena("RGB"), deformer) ImageOps.equalize(lena("L")) ImageOps.equalize(lena("RGB")) ImageOps.expand(lena("L"), 1) ImageOps.expand(lena("RGB"), 1) ImageOps.expand(lena("L"), 2, "blue") ImageOps.expand(lena("RGB"), 2, "blue") ImageOps.fit(lena("L"), (128, 128)) ImageOps.fit(lena("RGB"), (128, 128)) ImageOps.flip(lena("L")) ImageOps.flip(lena("RGB")) ImageOps.grayscale(lena("L")) ImageOps.grayscale(lena("RGB")) ImageOps.invert(lena("L")) ImageOps.invert(lena("RGB")) ImageOps.mirror(lena("L")) ImageOps.mirror(lena("RGB")) ImageOps.posterize(lena("L"), 4) ImageOps.posterize(lena("RGB"), 4) ImageOps.solarize(lena("L")) ImageOps.solarize(lena("RGB")) success() def test_1pxfit(): # Division by zero in equalize if image is 1 pixel high newimg = ImageOps.fit(lena("RGB").resize((1,1)), (35,35)) assert_equal(newimg.size,(35,35)) newimg = ImageOps.fit(lena("RGB").resize((1,100)), (35,35)) assert_equal(newimg.size,(35,35)) newimg = ImageOps.fit(lena("RGB").resize((100,1)), (35,35)) assert_equal(newimg.size,(35,35)) def test_pil163(): # Division by zero in equalize if < 255 pixels in image (@PIL163) i = lena("RGB").resize((15, 16)) ImageOps.equalize(i.convert("L")) ImageOps.equalize(i.convert("P")) ImageOps.equalize(i.convert("RGB")) success() pillow-2.3.0/Tests/test_000_sanity.py0000644000175000001440000000114112257506326016303 0ustar dokousersfrom __future__ import print_function from tester import * import PIL import PIL.Image # Make sure we have the binary extension im = PIL.Image.core.new("L", (100, 100)) assert PIL.Image.VERSION[:3] == '1.1' # Create an image and do stuff with it. im = PIL.Image.new("1", (100, 100)) assert (im.mode, im.size) == ('1', (100, 100)) assert len(im.tobytes()) == 1300 # Create images in all remaining major modes. im = PIL.Image.new("L", (100, 100)) im = PIL.Image.new("P", (100, 100)) im = PIL.Image.new("RGB", (100, 100)) im = PIL.Image.new("I", (100, 100)) im = PIL.Image.new("F", (100, 100)) print("ok") pillow-2.3.0/Tests/test_file_ppm.py0000644000175000001440000000043712257506326016217 0ustar dokousersfrom tester import * from PIL import Image # sample ppm stream file = "Images/lena.ppm" data = open(file, "rb").read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "PPM") pillow-2.3.0/Tests/test_image_getpixel.py0000644000175000001440000000302412257506326017402 0ustar dokousersfrom tester import * from PIL import Image def color(mode): bands = Image.getmodebands(mode) if bands == 1: return 1 else: return tuple(range(1, bands+1)) def test_pixel(): def pixel(mode): c = color(mode) im = Image.new(mode, (1, 1), None) im.putpixel((0, 0), c) return im.getpixel((0, 0)) assert_equal(pixel("1"), 1) assert_equal(pixel("L"), 1) assert_equal(pixel("LA"), (1, 2)) assert_equal(pixel("I"), 1) assert_equal(pixel("I;16"), 1) assert_equal(pixel("I;16B"), 1) assert_equal(pixel("F"), 1.0) assert_equal(pixel("P"), 1) assert_equal(pixel("PA"), (1, 2)) assert_equal(pixel("RGB"), (1, 2, 3)) assert_equal(pixel("RGBA"), (1, 2, 3, 4)) assert_equal(pixel("RGBX"), (1, 2, 3, 4)) assert_equal(pixel("CMYK"), (1, 2, 3, 4)) assert_equal(pixel("YCbCr"), (1, 2, 3)) def test_image(): def pixel(mode): im = Image.new(mode, (1, 1), color(mode)) return im.getpixel((0, 0)) assert_equal(pixel("1"), 1) assert_equal(pixel("L"), 1) assert_equal(pixel("LA"), (1, 2)) assert_equal(pixel("I"), 1) assert_equal(pixel("I;16"), 1) assert_equal(pixel("I;16B"), 1) assert_equal(pixel("F"), 1.0) assert_equal(pixel("P"), 1) assert_equal(pixel("PA"), (1, 2)) assert_equal(pixel("RGB"), (1, 2, 3)) assert_equal(pixel("RGBA"), (1, 2, 3, 4)) assert_equal(pixel("RGBX"), (1, 2, 3, 4)) assert_equal(pixel("CMYK"), (1, 2, 3, 4)) assert_equal(pixel("YCbCr"), (1, 2, 3)) pillow-2.3.0/Tests/test_image_putpalette.py0000644000175000001440000000211112257506326017744 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImagePalette def test_putpalette(): def palette(mode): im = lena(mode).copy() im.putpalette(list(range(256))*3) p = im.getpalette() if p: return im.mode, p[:10] return im.mode assert_exception(ValueError, lambda: palette("1")) assert_equal(palette("L"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) assert_equal(palette("P"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) assert_exception(ValueError, lambda: palette("I")) assert_exception(ValueError, lambda: palette("F")) assert_exception(ValueError, lambda: palette("RGB")) assert_exception(ValueError, lambda: palette("RGBA")) assert_exception(ValueError, lambda: palette("YCbCr")) def test_imagepalette(): im = lena("P") assert_no_exception(lambda: im.putpalette(ImagePalette.negative())) assert_no_exception(lambda: im.putpalette(ImagePalette.random())) assert_no_exception(lambda: im.putpalette(ImagePalette.sepia())) assert_no_exception(lambda: im.putpalette(ImagePalette.wedge())) pillow-2.3.0/Tests/make_hash.py0000644000175000001440000000244112257506326015302 0ustar dokousers# brute-force search for access descriptor hash table import random modes = [ "1", "L", "LA", "I", "I;16", "I;16L", "I;16B", "I;32L", "I;32B", "F", "P", "PA", "RGB", "RGBA", "RGBa", "RGBX", "CMYK", "YCbCr", ] def hash(s, i): # djb2 hash: multiply by 33 and xor character for c in s: i = (((i<<5) + i) ^ ord(c)) & 0xffffffff return i def check(size, i0): h = [None] * size for m in modes: i = hash(m, i0) i = i % size if h[i]: return 0 h[i] = m return h min_start = 0 # 1) find the smallest table size with no collisions for min_size in range(len(modes), 16384): if check(min_size, 0): print(len(modes), "modes fit in", min_size, "slots") break # 2) see if we can do better with a different initial value for i0 in range(65556): for size in range(1, min_size): if check(size, i0): if size < min_size: print(len(modes), "modes fit in", size, "slots with start", i0) min_size = size min_start = i0 print() # print check(min_size, min_start) print("#define ACCESS_TABLE_SIZE", min_size) print("#define ACCESS_TABLE_HASH", min_start) # for m in modes: # print m, "=>", hash(m, min_start) % min_size pillow-2.3.0/Tests/test_image_getdata.py0000644000175000001440000000151512257506326017175 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): data = lena().getdata() assert_no_exception(lambda: len(data)) assert_no_exception(lambda: list(data)) assert_equal(data[0], (223, 162, 133)) def test_roundtrip(): def getdata(mode): im = lena(mode).resize((32, 30)) data = im.getdata() return data[0], len(data), len(list(data)) assert_equal(getdata("1"), (255, 960, 960)) assert_equal(getdata("L"), (176, 960, 960)) assert_equal(getdata("I"), (176, 960, 960)) assert_equal(getdata("F"), (176.0, 960, 960)) assert_equal(getdata("RGB"), ((223, 162, 133), 960, 960)) assert_equal(getdata("RGBA"), ((223, 162, 133, 255), 960, 960)) assert_equal(getdata("CMYK"), ((32, 93, 122, 0), 960, 960)) assert_equal(getdata("YCbCr"), ((176, 103, 160), 960, 960)) pillow-2.3.0/Tests/test_image_putalpha.py0000644000175000001440000000204412257506326017400 0ustar dokousersfrom tester import * from PIL import Image def test_interface(): im = Image.new("RGBA", (1, 1), (1, 2, 3, 0)) assert_equal(im.getpixel((0, 0)), (1, 2, 3, 0)) im = Image.new("RGBA", (1, 1), (1, 2, 3)) assert_equal(im.getpixel((0, 0)), (1, 2, 3, 255)) im.putalpha(Image.new("L", im.size, 4)) assert_equal(im.getpixel((0, 0)), (1, 2, 3, 4)) im.putalpha(5) assert_equal(im.getpixel((0, 0)), (1, 2, 3, 5)) def test_promote(): im = Image.new("L", (1, 1), 1) assert_equal(im.getpixel((0, 0)), 1) im.putalpha(2) assert_equal(im.mode, 'LA') assert_equal(im.getpixel((0, 0)), (1, 2)) im = Image.new("RGB", (1, 1), (1, 2, 3)) assert_equal(im.getpixel((0, 0)), (1, 2, 3)) im.putalpha(4) assert_equal(im.mode, 'RGBA') assert_equal(im.getpixel((0, 0)), (1, 2, 3, 4)) def test_readonly(): im = Image.new("RGB", (1, 1), (1, 2, 3)) im.readonly = 1 im.putalpha(4) assert_false(im.readonly) assert_equal(im.mode, 'RGBA') assert_equal(im.getpixel((0, 0)), (1, 2, 3, 4)) pillow-2.3.0/Tests/show_icc.py0000644000175000001440000000100512257506326015153 0ustar dokousersimport sys sys.path.insert(0, ".") from PIL import Image from PIL import ImageCms try: filename = sys.argv[1] except IndexError: filename = "../pil-archive/cmyk.jpg" i = Image.open(filename) print(i.format) print(i.mode) print(i.size) print(i.tile) p = ImageCms.getMemoryProfile(i.info["icc_profile"]) print(repr(p.product_name)) print(repr(p.product_info)) o = ImageCms.createProfile("sRGB") t = ImageCms.buildTransformFromOpenProfiles(p, o, i.mode, "RGB") i = ImageCms.applyTransform(i, t) i.show() pillow-2.3.0/Tests/test_image_verify.py0000644000175000001440000000006712257506326017071 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_imagepalette.py0000644000175000001440000000155712257506326017071 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImagePalette ImagePalette = ImagePalette.ImagePalette def test_sanity(): assert_no_exception(lambda: ImagePalette("RGB", list(range(256))*3)) assert_exception(ValueError, lambda: ImagePalette("RGB", list(range(256))*2)) def test_getcolor(): palette = ImagePalette() map = {} for i in range(256): map[palette.getcolor((i, i, i))] = i assert_equal(len(map), 256) assert_exception(ValueError, lambda: palette.getcolor((1, 2, 3))) def test_file(): palette = ImagePalette() file = tempfile("temp.lut") palette.save(file) from PIL.ImagePalette import load, raw p = load(file) # load returns raw palette information assert_equal(len(p[0]), 768) assert_equal(p[1], "RGB") p = raw(p[1], p[0]) assert_true(isinstance(p, ImagePalette)) pillow-2.3.0/Tests/show_mcidas.py0000644000175000001440000000101212257506326015653 0ustar dokousersimport sys sys.path.insert(0, ".") from PIL import Image from PIL import ImageMath try: filename = sys.argv[1] except IndexError: filename = "../pil-archive/goes12.2005.140.190925.BAND_01.mcidas" # filename = "../pil-archive/goes12.2005.140.190925.BAND_01.im" im = Image.open(filename) print(im.format) print(im.mode) print(im.size) print(im.tile) lo, hi = im.getextrema() print("map", lo, hi, "->", end=' ') im = ImageMath.eval("convert(im*255/hi, 'L')", im=im, hi=hi) print(im.getextrema()) im.show() pillow-2.3.0/Tests/test_imagefilter.py0000644000175000001440000000230712257506326016712 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageFilter def test_sanity(): # see test_image_filter for more tests assert_no_exception(lambda: ImageFilter.MaxFilter) assert_no_exception(lambda: ImageFilter.MedianFilter) assert_no_exception(lambda: ImageFilter.MinFilter) assert_no_exception(lambda: ImageFilter.ModeFilter) assert_no_exception(lambda: ImageFilter.Kernel((3, 3), list(range(9)))) assert_no_exception(lambda: ImageFilter.GaussianBlur) assert_no_exception(lambda: ImageFilter.GaussianBlur(5)) assert_no_exception(lambda: ImageFilter.UnsharpMask) assert_no_exception(lambda: ImageFilter.UnsharpMask(10)) assert_no_exception(lambda: ImageFilter.BLUR) assert_no_exception(lambda: ImageFilter.CONTOUR) assert_no_exception(lambda: ImageFilter.DETAIL) assert_no_exception(lambda: ImageFilter.EDGE_ENHANCE) assert_no_exception(lambda: ImageFilter.EDGE_ENHANCE_MORE) assert_no_exception(lambda: ImageFilter.EMBOSS) assert_no_exception(lambda: ImageFilter.FIND_EDGES) assert_no_exception(lambda: ImageFilter.SMOOTH) assert_no_exception(lambda: ImageFilter.SMOOTH_MORE) assert_no_exception(lambda: ImageFilter.SHARPEN) pillow-2.3.0/Tests/test_image_seek.py0000644000175000001440000000006712257506326016514 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_image_tobitmap.py0000644000175000001440000000052512257506326017403 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): assert_exception(ValueError, lambda: lena().tobitmap()) assert_no_exception(lambda: lena().convert("1").tobitmap()) im1 = lena().convert("1") bitmap = im1.tobitmap() assert_true(isinstance(bitmap, bytes)) assert_image_equal(im1, fromstring(bitmap)) pillow-2.3.0/Tests/test_format_lab.py0000644000175000001440000000154512257506326016533 0ustar dokousersfrom tester import * from PIL import Image def test_white(): i = Image.open('Tests/images/lab.tif') bits = i.load() assert_equal(i.mode, 'LAB') assert_equal(i.getbands(), ('L','A', 'B')) k = i.getpixel((0,0)) assert_equal(k, (255,128,128)) L = i.getdata(0) a = i.getdata(1) b = i.getdata(2) assert_equal(list(L), [255]*100) assert_equal(list(a), [128]*100) assert_equal(list(b), [128]*100) def test_green(): # l= 50 (/100), a = -100 (-128 .. 128) b=0 in PS # == RGB: 0, 152, 117 i = Image.open('Tests/images/lab-green.tif') k = i.getpixel((0,0)) assert_equal(k, (128,28,128)) def test_red(): # l= 50 (/100), a = 100 (-128 .. 128) b=0 in PS # == RGB: 255, 0, 124 i = Image.open('Tests/images/lab-red.tif') k = i.getpixel((0,0)) assert_equal(k, (128,228,128)) pillow-2.3.0/Tests/crash_ttf_memory_error.py0000644000175000001440000000050612257506326020140 0ustar dokousersfrom PIL import Image, ImageFont, ImageDraw font = "../pil-archive/memory-error-2.ttf" s = "Test Text" f = ImageFont.truetype(font, 64, index=0, encoding="unicode") w, h = f.getsize(s) i = Image.new("RGB", (500, h), "white") d = ImageDraw.Draw(i) # this line causes a MemoryError d.text((0,0), s, font=f, fill=0) i.show() pillow-2.3.0/Tests/test_imageenhance.py0000644000175000001440000000110612257506326017022 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageEnhance def test_sanity(): # FIXME: assert_image assert_no_exception(lambda: ImageEnhance.Color(lena()).enhance(0.5)) assert_no_exception(lambda: ImageEnhance.Contrast(lena()).enhance(0.5)) assert_no_exception(lambda: ImageEnhance.Brightness(lena()).enhance(0.5)) assert_no_exception(lambda: ImageEnhance.Sharpness(lena()).enhance(0.5)) def test_crash(): # crashes on small images im = Image.new("RGB", (1, 1)) assert_no_exception(lambda: ImageEnhance.Sharpness(im).enhance(0.5)) pillow-2.3.0/Tests/README.txt0000644000175000001440000000053012257506326014503 0ustar dokousersMinimalistic PIL test framework. Test scripts are named "test_xxx" and are supposed to output "ok". That's it. To run the tests:: python setup.py develop Run the tests from the root of the Pillow source distribution: python selftest.py python Tests/run.py --installed To run an individual test: python Tests/test_image.py pillow-2.3.0/Tests/test_image_getextrema.py0000644000175000001440000000110712257506326017726 0ustar dokousersfrom tester import * from PIL import Image def test_extrema(): def extrema(mode): return lena(mode).getextrema() assert_equal(extrema("1"), (0, 255)) assert_equal(extrema("L"), (40, 235)) assert_equal(extrema("I"), (40, 235)) assert_equal(extrema("F"), (40.0, 235.0)) assert_equal(extrema("P"), (11, 218)) # fixed palette assert_equal(extrema("RGB"), ((61, 255), (26, 234), (44, 223))) assert_equal(extrema("RGBA"), ((61, 255), (26, 234), (44, 223), (255, 255))) assert_equal(extrema("CMYK"), ((0, 194), (21, 229), (32, 211), (0, 0))) pillow-2.3.0/Tests/test_image_getim.py0000644000175000001440000000034012257506326016664 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() type_repr = repr(type(im.getim())) if py3: assert_true("PyCapsule" in type_repr) assert_true(isinstance(im.im.id, int)) pillow-2.3.0/Tests/test_imagegrab.py0000644000175000001440000000031112257506326016331 0ustar dokousersfrom tester import * from PIL import Image try: from PIL import ImageGrab except ImportError as v: skip(v) def test_grab(): im = ImageGrab.grab() assert_image(im, im.mode, im.size) pillow-2.3.0/Tests/test_file_libtiff.py0000644000175000001440000002113112260206064017022 0ustar dokousersfrom tester import * from PIL import Image, TiffImagePlugin codecs = dir(Image.core) if "libtiff_encoder" not in codecs or "libtiff_decoder" not in codecs: skip("tiff support not available") def _assert_noerr(im): """Helper tests that assert basic sanity about the g4 tiff reading""" #1 bit assert_equal(im.mode, "1") # Does the data actually load assert_no_exception(lambda: im.load()) assert_no_exception(lambda: im.getdata()) try: assert_equal(im._compression, 'group4') except: print("No _compression") print (dir(im)) # can we write it back out, in a different form. out = tempfile("temp.png") assert_no_exception(lambda: im.save(out)) def test_g4_tiff(): """Test the ordinary file path load path""" file = "Tests/images/lena_g4_500.tif" im = Image.open(file) assert_equal(im.size, (500,500)) _assert_noerr(im) def test_g4_large(): file = "Tests/images/pport_g4.tif" im = Image.open(file) _assert_noerr(im) def test_g4_tiff_file(): """Testing the string load path""" file = "Tests/images/lena_g4_500.tif" with open(file,'rb') as f: im = Image.open(f) assert_equal(im.size, (500,500)) _assert_noerr(im) def test_g4_tiff_bytesio(): """Testing the stringio loading code path""" from io import BytesIO file = "Tests/images/lena_g4_500.tif" s = BytesIO() with open(file,'rb') as f: s.write(f.read()) s.seek(0) im = Image.open(s) assert_equal(im.size, (500,500)) _assert_noerr(im) def test_g4_eq_png(): """ Checking that we're actually getting the data that we expect""" png = Image.open('Tests/images/lena_bw_500.png') g4 = Image.open('Tests/images/lena_g4_500.tif') assert_image_equal(g4, png) # see https://github.com/python-imaging/Pillow/issues/279 def test_g4_fillorder_eq_png(): """ Checking that we're actually getting the data that we expect""" png = Image.open('Tests/images/g4-fillorder-test.png') g4 = Image.open('Tests/images/g4-fillorder-test.tif') assert_image_equal(g4, png) def test_g4_write(): """Checking to see that the saved image is the same as what we wrote""" file = "Tests/images/lena_g4_500.tif" orig = Image.open(file) out = tempfile("temp.tif") rot = orig.transpose(Image.ROTATE_90) assert_equal(rot.size,(500,500)) rot.save(out) reread = Image.open(out) assert_equal(reread.size,(500,500)) _assert_noerr(reread) assert_image_equal(reread, rot) assert_equal(reread.info['compression'], 'group4') assert_equal(reread.info['compression'], orig.info['compression']) assert_false(orig.tobytes() == reread.tobytes()) def test_adobe_deflate_tiff(): file = "Tests/images/tiff_adobe_deflate.tif" im = Image.open(file) assert_equal(im.mode, "RGB") assert_equal(im.size, (278, 374)) assert_equal(im.tile[0][:3], ('tiff_adobe_deflate', (0, 0, 278, 374), 0)) assert_no_exception(lambda: im.load()) def test_write_metadata(): """ Test metadata writing through libtiff """ img = Image.open('Tests/images/lena_g4.tif') f = tempfile('temp.tiff') img.save(f, tiffinfo = img.tag) loaded = Image.open(f) original = img.tag.named() reloaded = loaded.tag.named() # PhotometricInterpretation is set from SAVE_INFO, not the original image. ignored = ['StripByteCounts', 'RowsPerStrip', 'PageNumber', 'PhotometricInterpretation'] for tag, value in reloaded.items(): if tag not in ignored: if tag.endswith('Resolution'): val = original[tag] assert_almost_equal(val[0][0]/val[0][1], value[0][0]/value[0][1], msg="%s didn't roundtrip" % tag) else: assert_equal(original[tag], value, "%s didn't roundtrip" % tag) for tag, value in original.items(): if tag not in ignored: if tag.endswith('Resolution'): val = reloaded[tag] assert_almost_equal(val[0][0]/val[0][1], value[0][0]/value[0][1], msg="%s didn't roundtrip" % tag) else: assert_equal(value, reloaded[tag], "%s didn't roundtrip" % tag) def test_g3_compression(): i = Image.open('Tests/images/lena_g4_500.tif') out = tempfile("temp.tif") i.save(out, compression='group3') reread = Image.open(out) assert_equal(reread.info['compression'], 'group3') assert_image_equal(reread, i) def test_little_endian(): im = Image.open('Tests/images/16bit.deflate.tif') assert_equal(im.getpixel((0,0)), 480) assert_equal(im.mode, 'I;16') b = im.tobytes() # Bytes are in image native order (little endian) if py3: assert_equal(b[0], ord(b'\xe0')) assert_equal(b[1], ord(b'\x01')) else: assert_equal(b[0], b'\xe0') assert_equal(b[1], b'\x01') out = tempfile("temp.tif") #out = "temp.le.tif" im.save(out) reread = Image.open(out) assert_equal(reread.info['compression'], im.info['compression']) assert_equal(reread.getpixel((0,0)), 480) # UNDONE - libtiff defaults to writing in native endian, so # on big endian, we'll get back mode = 'I;16B' here. def test_big_endian(): im = Image.open('Tests/images/16bit.MM.deflate.tif') assert_equal(im.getpixel((0,0)), 480) assert_equal(im.mode, 'I;16B') b = im.tobytes() # Bytes are in image native order (big endian) if py3: assert_equal(b[0], ord(b'\x01')) assert_equal(b[1], ord(b'\xe0')) else: assert_equal(b[0], b'\x01') assert_equal(b[1], b'\xe0') out = tempfile("temp.tif") im.save(out) reread = Image.open(out) assert_equal(reread.info['compression'], im.info['compression']) assert_equal(reread.getpixel((0,0)), 480) def test_g4_string_info(): """Tests String data in info directory""" file = "Tests/images/lena_g4_500.tif" orig = Image.open(file) out = tempfile("temp.tif") orig.tag[269] = 'temp.tif' orig.save(out) reread = Image.open(out) assert_equal('temp.tif', reread.tag[269]) def test_12bit_rawmode(): """ Are we generating the same interpretation of the image as Imagemagick is? """ TiffImagePlugin.READ_LIBTIFF = True #Image.DEBUG = True im = Image.open('Tests/images/12bit.cropped.tif') im.load() TiffImagePlugin.READ_LIBTIFF = False # to make the target -- # convert 12bit.cropped.tif -depth 16 tmp.tif # convert tmp.tif -evaluate RightShift 4 12in16bit2.tif # imagemagick will auto scale so that a 12bit FFF is 16bit FFF0, # so we need to unshift so that the integer values are the same. im2 = Image.open('Tests/images/12in16bit.tif') if Image.DEBUG: print (im.getpixel((0,0))) print (im.getpixel((0,1))) print (im.getpixel((0,2))) print (im2.getpixel((0,0))) print (im2.getpixel((0,1))) print (im2.getpixel((0,2))) assert_image_equal(im, im2) def test_blur(): # test case from irc, how to do blur on b/w image and save to compressed tif. from PIL import ImageFilter out = tempfile('temp.tif') im = Image.open('Tests/images/pport_g4.tif') im = im.convert('L') im=im.filter(ImageFilter.GaussianBlur(4)) im.save(out, compression='tiff_adobe_deflate') im2 = Image.open(out) im2.load() assert_image_equal(im, im2) def test_compressions(): im = lena('RGB') out = tempfile('temp.tif') TiffImagePlugin.READ_LIBTIFF = True TiffImagePlugin.WRITE_LIBTIFF = True for compression in ('packbits', 'tiff_lzw'): im.save(out, compression=compression) im2 = Image.open(out) assert_image_equal(im, im2) im.save(out, compression='jpeg') im2 = Image.open(out) assert_image_similar(im, im2, 30) TiffImagePlugin.READ_LIBTIFF = False TiffImagePlugin.WRITE_LIBTIFF = False def test_cmyk_save(): im = lena('CMYK') out = tempfile('temp.tif') im.save(out, compression='tiff_adobe_deflate') im2 = Image.open(out) assert_image_equal(im, im2) def xtest_bw_compression_wRGB(): """ This test passes, but when running all tests causes a failure due to output on stderr from the error thrown by libtiff. We need to capture that but not now""" im = lena('RGB') out = tempfile('temp.tif') assert_exception(IOError, lambda: im.save(out, compression='tiff_ccitt')) assert_exception(IOError, lambda: im.save(out, compression='group3')) assert_exception(IOError, lambda: im.save(out, compression='group4')) pillow-2.3.0/Tests/test_image_histogram.py0000644000175000001440000000115312257506326017557 0ustar dokousersfrom tester import * from PIL import Image def test_histogram(): def histogram(mode): h = lena(mode).histogram() return len(h), min(h), max(h) assert_equal(histogram("1"), (256, 0, 8872)) assert_equal(histogram("L"), (256, 0, 199)) assert_equal(histogram("I"), (256, 0, 199)) assert_equal(histogram("F"), (256, 0, 199)) assert_equal(histogram("P"), (256, 0, 2912)) assert_equal(histogram("RGB"), (768, 0, 285)) assert_equal(histogram("RGBA"), (1024, 0, 16384)) assert_equal(histogram("CMYK"), (1024, 0, 16384)) assert_equal(histogram("YCbCr"), (768, 0, 741)) pillow-2.3.0/Tests/run.py0000644000175000001440000000474212257506326014174 0ustar dokousersfrom __future__ import print_function # minimal test runner import glob, os, os.path, sys, tempfile try: root = os.path.dirname(__file__) except NameError: root = os.path.dirname(sys.argv[0]) if not os.path.isfile("PIL/Image.py"): print("***", "please run this script from the PIL development directory as") print("***", "$ python Tests/run.py") sys.exit(1) print("-"*68) python_options = [] tester_options = [] if "--installed" not in sys.argv: os.environ["PYTHONPATH"] = "." if "--coverage" in sys.argv: tester_options.append("--coverage") if "--log" in sys.argv: tester_options.append("--log") files = glob.glob(os.path.join(root, "test_*.py")) files.sort() success = failure = 0 include = [x for x in sys.argv[1:] if x[:2] != "--"] skipped = [] python_options = " ".join(python_options) tester_options = " ".join(tester_options) for file in files: test, ext = os.path.splitext(os.path.basename(file)) if include and test not in include: continue print("running", test, "...") # 2>&1 works on unix and on modern windowses. we might care about # very old Python versions, but not ancient microsoft products :-) out = os.popen("%s %s -u %s %s 2>&1" % ( sys.executable, python_options, file, tester_options )) result = out.read().strip() if result == "ok": result = None elif result == "skip": print("---", "skipped") # FIXME: driver should include a reason skipped.append(test) continue elif not result: result = "(no output)" status = out.close() if status or result: if status: print("=== error", status) if result: if result[-3:] == "\nok": # if there's an ok at the end, it's not really ok result = result[:-3] print(result) failure = failure + 1 else: success = success + 1 print("-"*68) temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests') tempfiles = glob.glob(os.path.join(temp_root, "temp_*")) if tempfiles: print("===", "remaining temporary files") for file in tempfiles: print(file) print("-"*68) def tests(n): if n == 1: return "1 test" else: return "%d tests" % n if skipped: print("---", tests(len(skipped)), "skipped.") print(skipped) if failure: print("***", tests(failure), "of", (success + failure), "failed.") sys.exit(1) else: print(tests(success), "passed.") pillow-2.3.0/Tests/test_file_tiff_metadata.py0000644000175000001440000000505612257506326020215 0ustar dokousersfrom tester import * from PIL import Image, TiffImagePlugin, TiffTags tag_ids = dict(zip(TiffTags.TAGS.values(), TiffTags.TAGS.keys())) def test_rt_metadata(): """ Test writing arbitray metadata into the tiff image directory Use case is ImageJ private tags, one numeric, one arbitrary data. https://github.com/python-imaging/Pillow/issues/291 """ img = lena() textdata = "This is some arbitrary metadata for a text field" info = TiffImagePlugin.ImageFileDirectory() info[tag_ids['ImageJMetaDataByteCounts']] = len(textdata) info[tag_ids['ImageJMetaData']] = textdata f = tempfile("temp.tif") img.save(f, tiffinfo=info) loaded = Image.open(f) assert_equal(loaded.tag[50838], (len(textdata),)) assert_equal(loaded.tag[50839], textdata) def test_read_metadata(): img = Image.open('Tests/images/lena_g4.tif') known = {'YResolution': ((1207959552, 16777216),), 'PlanarConfiguration': (1,), 'BitsPerSample': (1,), 'ImageLength': (128,), 'Compression': (4,), 'FillOrder': (1,), 'DocumentName': 'lena.g4.tif', 'RowsPerStrip': (128,), 'ResolutionUnit': (1,), 'PhotometricInterpretation': (0,), 'PageNumber': (0, 1), 'XResolution': ((1207959552, 16777216),), 'ImageWidth': (128,), 'Orientation': (1,), 'StripByteCounts': (1796,), 'SamplesPerPixel': (1,), 'StripOffsets': (8,), 'Software': 'ImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.org'} # assert_equal is equivalent, but less helpful in telling what's wrong. named = img.tag.named() for tag, value in named.items(): assert_equal(known[tag], value) for tag, value in known.items(): assert_equal(value, named[tag]) def test_write_metadata(): """ Test metadata writing through the python code """ img = Image.open('Tests/images/lena.tif') f = tempfile('temp.tiff') img.save(f, tiffinfo = img.tag) loaded = Image.open(f) original = img.tag.named() reloaded = loaded.tag.named() ignored = ['StripByteCounts', 'RowsPerStrip', 'PageNumber', 'StripOffsets'] for tag, value in reloaded.items(): if tag not in ignored: assert_equal(original[tag], value, "%s didn't roundtrip" % tag) for tag, value in original.items(): if tag not in ignored: assert_equal(value, reloaded[tag], "%s didn't roundtrip" % tag) pillow-2.3.0/Tests/test_lib_image.py0000644000175000001440000000161712257506326016335 0ustar dokousersfrom tester import * from PIL import Image def test_setmode(): im = Image.new("L", (1, 1), 255) im.im.setmode("1") assert_equal(im.im.getpixel((0, 0)), 255) im.im.setmode("L") assert_equal(im.im.getpixel((0, 0)), 255) im = Image.new("1", (1, 1), 1) im.im.setmode("L") assert_equal(im.im.getpixel((0, 0)), 255) im.im.setmode("1") assert_equal(im.im.getpixel((0, 0)), 255) im = Image.new("RGB", (1, 1), (1, 2, 3)) im.im.setmode("RGB") assert_equal(im.im.getpixel((0, 0)), (1, 2, 3)) im.im.setmode("RGBA") assert_equal(im.im.getpixel((0, 0)), (1, 2, 3, 255)) im.im.setmode("RGBX") assert_equal(im.im.getpixel((0, 0)), (1, 2, 3, 255)) im.im.setmode("RGB") assert_equal(im.im.getpixel((0, 0)), (1, 2, 3)) assert_exception(ValueError, lambda: im.im.setmode("L")) assert_exception(ValueError, lambda: im.im.setmode("RGBABCDE")) pillow-2.3.0/Tests/test_image_copy.py0000644000175000001440000000043612257506326016537 0ustar dokousersfrom tester import * from PIL import Image def test_copy(): def copy(mode): im = lena(mode) out = im.copy() assert_equal(out.mode, mode) assert_equal(out.size, im.size) for mode in "1", "P", "L", "RGB", "I", "F": yield_test(copy, mode) pillow-2.3.0/Tests/test_image_transform.py0000644000175000001440000000726112257506326017603 0ustar dokousersfrom tester import * from PIL import Image def test_extent(): im = lena('RGB') (w,h) = im.size transformed = im.transform(im.size, Image.EXTENT, (0,0, w//2,h//2), # ul -> lr Image.BILINEAR) scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0,0,w,h)) assert_image_similar(transformed, scaled, 10) # undone -- precision? def test_quad(): # one simple quad transform, equivalent to scale & crop upper left quad im = lena('RGB') (w,h) = im.size transformed = im.transform(im.size, Image.QUAD, (0,0,0,h//2, w//2,h//2,w//2,0), # ul -> ccw around quad Image.BILINEAR) scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0,0,w,h)) assert_image_equal(transformed, scaled) def test_mesh(): # this should be a checkerboard of halfsized lenas in ul, lr im = lena('RGBA') (w,h) = im.size transformed = im.transform(im.size, Image.MESH, [((0,0,w//2,h//2), # box (0,0,0,h, w,h,w,0)), # ul -> ccw around quad ((w//2,h//2,w,h), # box (0,0,0,h, w,h,w,0))], # ul -> ccw around quad Image.BILINEAR) #transformed.save('transformed.png') scaled = im.resize((w//2, h//2), Image.BILINEAR) checker = Image.new('RGBA', im.size) checker.paste(scaled, (0,0)) checker.paste(scaled, (w//2,h//2)) assert_image_equal(transformed, checker) # now, check to see that the extra area is (0,0,0,0) blank = Image.new('RGBA', (w//2,h//2), (0,0,0,0)) assert_image_equal(blank, transformed.crop((w//2,0,w,h//2))) assert_image_equal(blank, transformed.crop((0,h//2,w//2,h))) def _test_alpha_premult(op): # create image with half white, half black, with the black half transparent. # do op, # there should be no darkness in the white section. im = Image.new('RGBA', (10,10), (0,0,0,0)); im2 = Image.new('RGBA', (5,10), (255,255,255,255)); im.paste(im2, (0,0)) im = op(im, (40,10)) im_background = Image.new('RGB', (40,10), (255,255,255)) im_background.paste(im, (0,0), im) hist = im_background.histogram() assert_equal(40*10, hist[-1]) def test_alpha_premult_resize(): def op (im, sz): return im.resize(sz, Image.LINEAR) _test_alpha_premult(op) def test_alpha_premult_transform(): def op(im, sz): (w,h) = im.size return im.transform(sz, Image.EXTENT, (0,0, w,h), Image.BILINEAR) _test_alpha_premult(op) def test_blank_fill(): # attempting to hit # https://github.com/python-imaging/Pillow/issues/254 reported # # issue is that transforms with transparent overflow area # contained junk from previous images, especially on systems with # constrained memory. So, attempt to fill up memory with a # pattern, free it, and then run the mesh test again. Using a 1Mp # image with 4 bands, for 4 megs of data allocated, x 64. OMM (64 # bit 12.04 VM with 512 megs available, this fails with Pillow < # a0eaf06cc5f62a6fb6de556989ac1014ff3348ea # # Running by default, but I'd totally understand not doing it in # the future foo = [Image.new('RGBA',(1024,1024), (a,a,a,a)) for a in range(1,65)] # Yeah. Watch some JIT optimize this out. foo = None test_mesh() pillow-2.3.0/Tests/test_font_bdf.py0000644000175000001440000000046412257506326016205 0ustar dokousersfrom tester import * from PIL import Image, FontFile, BdfFontFile filename = "Images/courB08.bdf" def test_sanity(): file = open(filename, "rb") font = BdfFontFile.BdfFontFile(file) assert_true(isinstance(font, FontFile.FontFile)) assert_equal(len([_f for _f in font.glyph if _f]), 190) pillow-2.3.0/Tests/test_file_pcx.py0000644000175000001440000000147112257506326016214 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): file = tempfile("temp.pcx") lena("1").save(file) im = Image.open(file) im.load() assert_equal(im.mode, "1") assert_equal(im.size, (128, 128)) assert_equal(im.format, "PCX") lena("1").save(file) im = Image.open(file) lena("L").save(file) im = Image.open(file) lena("P").save(file) im = Image.open(file) lena("RGB").save(file) im = Image.open(file) def test_pil184(): # Check reading of files where xmin/xmax is not zero. file = "Tests/images/pil184.pcx" im = Image.open(file) assert_equal(im.size, (447, 144)) assert_equal(im.tile[0][1], (0, 0, 447, 144)) # Make sure all pixels are either 0 or 255. assert_equal(im.histogram()[0] + im.histogram()[255], 447*144) pillow-2.3.0/Tests/threaded_save.py0000644000175000001440000000173212257506326016162 0ustar dokousersfrom PIL import Image import sys, time import io import threading, queue try: format = sys.argv[1] except: format = "PNG" im = Image.open("Images/lena.ppm") im.load() queue = queue.Queue() result = [] class Worker(threading.Thread): def run(self): while 1: im = queue.get() if im is None: queue.task_done() sys.stdout.write("x") break f = io.BytesIO() im.save(f, format, optimize=1) data = f.getvalue() result.append(len(data)) im = Image.open(io.BytesIO(data)) im.load() sys.stdout.write(".") queue.task_done() t0 = time.time() threads = 20 jobs = 100 for i in range(threads): w = Worker() w.start() for i in range(jobs): queue.put(im) for i in range(threads): queue.put(None) queue.join() print() print(time.time() - t0) print(len(result), sum(result)) print(result) pillow-2.3.0/Tests/test_file_libtiff_small.py0000644000175000001440000000250312257510072020217 0ustar dokousersfrom tester import * from PIL import Image from test_file_libtiff import _assert_noerr codecs = dir(Image.core) if "libtiff_encoder" not in codecs or "libtiff_decoder" not in codecs: skip("tiff support not available") """ The small lena image was failing on open in the libtiff decoder because the file pointer was set to the wrong place by a spurious seek. It wasn't failing with the byteio method. It was fixed by forcing an lseek to the beginning of the file just before reading in libtiff. These tests remain to ensure that it stays fixed. """ def test_g4_lena_file(): """Testing the open file load path""" file = "Tests/images/lena_g4.tif" with open(file,'rb') as f: im = Image.open(f) assert_equal(im.size, (128,128)) _assert_noerr(im) def test_g4_lena_bytesio(): """Testing the bytesio loading code path""" from io import BytesIO file = "Tests/images/lena_g4.tif" s = BytesIO() with open(file,'rb') as f: s.write(f.read()) s.seek(0) im = Image.open(s) assert_equal(im.size, (128,128)) _assert_noerr(im) def test_g4_lena(): """The 128x128 lena image fails for some reason. Investigating""" file = "Tests/images/lena_g4.tif" im = Image.open(file) assert_equal(im.size, (128,128)) _assert_noerr(im) pillow-2.3.0/Tests/test_image_array.py0000644000175000001440000000262212257506326016702 0ustar dokousersfrom tester import * from PIL import Image im = lena().resize((128, 100)) def test_toarray(): def test(mode): ai = im.convert(mode).__array_interface__ return ai["shape"], ai["typestr"], len(ai["data"]) # assert_equal(test("1"), ((100, 128), '|b1', 1600)) assert_equal(test("L"), ((100, 128), '|u1', 12800)) assert_equal(test("I"), ((100, 128), Image._ENDIAN + 'i4', 51200)) # FIXME: wrong? assert_equal(test("F"), ((100, 128), Image._ENDIAN + 'f4', 51200)) # FIXME: wrong? assert_equal(test("RGB"), ((100, 128, 3), '|u1', 38400)) assert_equal(test("RGBA"), ((100, 128, 4), '|u1', 51200)) assert_equal(test("RGBX"), ((100, 128, 4), '|u1', 51200)) def test_fromarray(): def test(mode): i = im.convert(mode) a = i.__array_interface__ a["strides"] = 1 # pretend it's non-contigous i.__array_interface__ = a # patch in new version of attribute out = Image.fromarray(i) return out.mode, out.size, list(i.getdata()) == list(out.getdata()) # assert_equal(test("1"), ("1", (128, 100), True)) assert_equal(test("L"), ("L", (128, 100), True)) assert_equal(test("I"), ("I", (128, 100), True)) assert_equal(test("F"), ("F", (128, 100), True)) assert_equal(test("RGB"), ("RGB", (128, 100), True)) assert_equal(test("RGBA"), ("RGBA", (128, 100), True)) assert_equal(test("RGBX"), ("RGBA", (128, 100), True)) pillow-2.3.0/Tests/test_image_getbbox.py0000644000175000001440000000154312257506326017217 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): bbox = lena().getbbox() assert_true(isinstance(bbox, tuple)) def test_bbox(): # 8-bit mode im = Image.new("L", (100, 100), 0) assert_equal(im.getbbox(), None) im.paste(255, (10, 25, 90, 75)) assert_equal(im.getbbox(), (10, 25, 90, 75)) im.paste(255, (25, 10, 75, 90)) assert_equal(im.getbbox(), (10, 10, 90, 90)) im.paste(255, (-10, -10, 110, 110)) assert_equal(im.getbbox(), (0, 0, 100, 100)) # 32-bit mode im = Image.new("RGB", (100, 100), 0) assert_equal(im.getbbox(), None) im.paste(255, (10, 25, 90, 75)) assert_equal(im.getbbox(), (10, 25, 90, 75)) im.paste(255, (25, 10, 75, 90)) assert_equal(im.getbbox(), (10, 10, 90, 90)) im.paste(255, (-10, -10, 110, 110)) assert_equal(im.getbbox(), (0, 0, 100, 100)) pillow-2.3.0/Tests/test_image_mode.py0000644000175000001440000000156612257506326016516 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() assert_no_exception(lambda: im.mode) def test_properties(): def check(mode, *result): signature = ( Image.getmodebase(mode), Image.getmodetype(mode), Image.getmodebands(mode), Image.getmodebandnames(mode), ) assert_equal(signature, result) check("1", "L", "L", 1, ("1",)) check("L", "L", "L", 1, ("L",)) check("P", "RGB", "L", 1, ("P",)) check("I", "L", "I", 1, ("I",)) check("F", "L", "F", 1, ("F",)) check("RGB", "RGB", "L", 3, ("R", "G", "B")) check("RGBA", "RGB", "L", 4, ("R", "G", "B", "A")) check("RGBX", "RGB", "L", 4, ("R", "G", "B", "X")) check("RGBX", "RGB", "L", 4, ("R", "G", "B", "X")) check("CMYK", "RGB", "L", 4, ("C", "M", "Y", "K")) check("YCbCr", "RGB", "L", 3, ("Y", "Cb", "Cr")) pillow-2.3.0/Tests/test_file_fli.py0000644000175000001440000000043512257506326016173 0ustar dokousersfrom tester import * from PIL import Image # sample ppm stream file = "Images/lena.fli" data = open(file, "rb").read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "P") assert_equal(im.size, (128, 128)) assert_equal(im.format, "FLI") pillow-2.3.0/Tests/test_file_eps.py0000644000175000001440000000610412257510630016200 0ustar dokousersfrom tester import * from PIL import Image, EpsImagePlugin import sys if EpsImagePlugin.gs_windows_binary == False: # already checked. Not there. skip() if not sys.platform.startswith('win'): import subprocess try: gs = subprocess.Popen(['gs','--version'], stdout=subprocess.PIPE) gs.stdout.read() except OSError: # no ghostscript skip() #Our two EPS test files (they are identical except for their bounding boxes) file1 = "Tests/images/zero_bb.eps" file2 = "Tests/images/non_zero_bb.eps" #Due to palletization, we'll need to convert these to RGB after load file1_compare = "Tests/images/zero_bb.png" file1_compare_scale2 = "Tests/images/zero_bb_scale2.png" file2_compare = "Tests/images/non_zero_bb.png" file2_compare_scale2 = "Tests/images/non_zero_bb_scale2.png" def test_sanity(): #Regular scale image1 = Image.open(file1) image1.load() assert_equal(image1.mode, "RGB") assert_equal(image1.size, (460, 352)) assert_equal(image1.format, "EPS") image2 = Image.open(file2) image2.load() assert_equal(image2.mode, "RGB") assert_equal(image2.size, (360, 252)) assert_equal(image2.format, "EPS") #Double scale image1_scale2 = Image.open(file1) image1_scale2.load(scale=2) assert_equal(image1_scale2.mode, "RGB") assert_equal(image1_scale2.size, (920, 704)) assert_equal(image1_scale2.format, "EPS") image2_scale2 = Image.open(file2) image2_scale2.load(scale=2) assert_equal(image2_scale2.mode, "RGB") assert_equal(image2_scale2.size, (720, 504)) assert_equal(image2_scale2.format, "EPS") def test_render_scale1(): #We need png support for these render test codecs = dir(Image.core) if "zip_encoder" not in codecs or "zip_decoder" not in codecs: skip("zip/deflate support not available") #Zero bounding box image1_scale1 = Image.open(file1) image1_scale1.load() image1_scale1_compare = Image.open(file1_compare).convert("RGB") image1_scale1_compare.load() assert_image_similar(image1_scale1, image1_scale1_compare, 5) #Non-Zero bounding box image2_scale1 = Image.open(file2) image2_scale1.load() image2_scale1_compare = Image.open(file2_compare).convert("RGB") image2_scale1_compare.load() assert_image_similar(image2_scale1, image2_scale1_compare, 10) def test_render_scale2(): #We need png support for these render test codecs = dir(Image.core) if "zip_encoder" not in codecs or "zip_decoder" not in codecs: skip("zip/deflate support not available") #Zero bounding box image1_scale2 = Image.open(file1) image1_scale2.load(scale=2) image1_scale2_compare = Image.open(file1_compare_scale2).convert("RGB") image1_scale2_compare.load() assert_image_similar(image1_scale2, image1_scale2_compare, 5) #Non-Zero bounding box image2_scale2 = Image.open(file2) image2_scale2.load(scale=2) image2_scale2_compare = Image.open(file2_compare_scale2).convert("RGB") image2_scale2_compare.load() assert_image_similar(image2_scale2, image2_scale2_compare, 10) pillow-2.3.0/Tests/test_image_transpose.py0000644000175000001440000000166512257506326017610 0ustar dokousersfrom tester import * from PIL import Image FLIP_LEFT_RIGHT = Image.FLIP_LEFT_RIGHT FLIP_TOP_BOTTOM = Image.FLIP_TOP_BOTTOM ROTATE_90 = Image.ROTATE_90 ROTATE_180 = Image.ROTATE_180 ROTATE_270 = Image.ROTATE_270 def test_sanity(): im = lena() assert_no_exception(lambda: im.transpose(FLIP_LEFT_RIGHT)) assert_no_exception(lambda: im.transpose(FLIP_TOP_BOTTOM)) assert_no_exception(lambda: im.transpose(ROTATE_90)) assert_no_exception(lambda: im.transpose(ROTATE_180)) assert_no_exception(lambda: im.transpose(ROTATE_270)) def test_roundtrip(): im = lena() def transpose(first, second): return im.transpose(first).transpose(second) assert_image_equal(im, transpose(FLIP_LEFT_RIGHT, FLIP_LEFT_RIGHT)) assert_image_equal(im, transpose(FLIP_TOP_BOTTOM, FLIP_TOP_BOTTOM)) assert_image_equal(im, transpose(ROTATE_90, ROTATE_270)) assert_image_equal(im, transpose(ROTATE_180, ROTATE_180)) pillow-2.3.0/Tests/test_imagefont.py0000644000175000001440000000721712257506326016400 0ustar dokousersfrom tester import * from PIL import Image from io import BytesIO import os try: from PIL import ImageFont ImageFont.core.getfont # check if freetype is available except ImportError: skip() from PIL import ImageDraw font_path = "Tests/fonts/FreeMono.ttf" font_size=20 def test_sanity(): assert_match(ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") def test_font_with_name(): assert_no_exception(lambda: ImageFont.truetype(font_path, font_size)) assert_no_exception(lambda: _render(font_path)) _clean() def _font_as_bytes(): with open(font_path, 'rb') as f: font_bytes = BytesIO(f.read()) return font_bytes def test_font_with_filelike(): assert_no_exception(lambda: ImageFont.truetype(_font_as_bytes(), font_size)) assert_no_exception(lambda: _render(_font_as_bytes())) # Usage note: making two fonts from the same buffer fails. #shared_bytes = _font_as_bytes() #assert_no_exception(lambda: _render(shared_bytes)) #assert_exception(Exception, lambda: _render(shared_bytes)) _clean() def test_font_with_open_file(): with open(font_path, 'rb') as f: assert_no_exception(lambda: _render(f)) _clean() def test_font_old_parameters(): assert_warning(DeprecationWarning, lambda: ImageFont.truetype(filename=font_path, size=font_size)) def _render(font): txt = "Hello World!" ttf = ImageFont.truetype(font, font_size) w, h = ttf.getsize(txt) img = Image.new("RGB", (256, 64), "white") d = ImageDraw.Draw(img) d.text((10, 10), txt, font=ttf, fill='black') img.save('font.png') return img def _clean(): os.unlink('font.png') def test_render_equal(): img_path = _render(font_path) with open(font_path, 'rb') as f: font_filelike = BytesIO(f.read()) img_filelike = _render(font_filelike) assert_image_equal(img_path, img_filelike) _clean() def test_render_multiline(): im = Image.new(mode='RGB', size=(300,100)) draw = ImageDraw.Draw(im) ttf = ImageFont.truetype(font_path, font_size) line_spacing = draw.textsize('A', font=ttf)[1] + 8 lines = ['hey you', 'you are awesome', 'this looks awkward'] y = 0 for line in lines: draw.text((0, y), line, font=ttf) y += line_spacing target = 'Tests/images/multiline_text.png' target_img = Image.open(target) # some versions of freetype have different horizontal spacing. # setting a tight epsilon, I'm showing the original test failure # at epsilon = ~38. assert_image_similar(im, target_img,.5) def test_rotated_transposed_font(): img_grey = Image.new("L", (100, 100)) draw = ImageDraw.Draw(img_grey) word = "testing" font = ImageFont.truetype(font_path, font_size) orientation = Image.ROTATE_90 transposed_font = ImageFont.TransposedFont(font, orientation=orientation) # Original font draw.setfont(font) box_size_a = draw.textsize(word) # Rotated font draw.setfont(transposed_font) box_size_b = draw.textsize(word) # Check (w,h) of box a is (h,w) of box b assert_equal(box_size_a[0], box_size_b[1]) assert_equal(box_size_a[1], box_size_b[0]) def test_unrotated_transposed_font(): img_grey = Image.new("L", (100, 100)) draw = ImageDraw.Draw(img_grey) word = "testing" font = ImageFont.truetype(font_path, font_size) orientation = None transposed_font = ImageFont.TransposedFont(font, orientation=orientation) # Original font draw.setfont(font) box_size_a = draw.textsize(word) # Rotated font draw.setfont(transposed_font) box_size_b = draw.textsize(word) # Check boxes a and b are same size assert_equal(box_size_a, box_size_b) pillow-2.3.0/Tests/test_image_tobytes.py0000644000175000001440000000020512257506326017250 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): data = lena().tobytes() assert_true(isinstance(data, bytes)) pillow-2.3.0/Tests/test_image_thumbnail.py0000644000175000001440000000142612257506326017550 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() im.thumbnail((100, 100)) assert_image(im, im.mode, (100, 100)) def test_aspect(): im = lena() im.thumbnail((100, 100)) assert_image(im, im.mode, (100, 100)) im = lena().resize((128, 256)) im.thumbnail((100, 100)) assert_image(im, im.mode, (50, 100)) im = lena().resize((128, 256)) im.thumbnail((50, 100)) assert_image(im, im.mode, (50, 100)) im = lena().resize((256, 128)) im.thumbnail((100, 100)) assert_image(im, im.mode, (100, 50)) im = lena().resize((256, 128)) im.thumbnail((100, 50)) assert_image(im, im.mode, (100, 50)) im = lena().resize((128, 128)) im.thumbnail((100, 100)) assert_image(im, im.mode, (100, 100)) pillow-2.3.0/Tests/test_file_webp_metadata.py0000644000175000001440000000371612257506326020223 0ustar dokousersfrom tester import * from PIL import Image try: from PIL import _webp if not _webp.HAVE_WEBPMUX: skip('webpmux support not installed') except: skip('webp support not installed') def test_read_exif_metadata(): file_path = "Images/flower.webp" image = Image.open(file_path) assert_equal(image.format, "WEBP") exif_data = image.info.get("exif", None) assert_true(exif_data) exif = image._getexif() #camera make assert_equal(exif[271], "Canon") jpeg_image = Image.open('Tests/images/flower.jpg') expected_exif = jpeg_image.info['exif'] assert_equal(exif_data, expected_exif) def test_write_exif_metadata(): file_path = "Tests/images/flower.jpg" image = Image.open(file_path) expected_exif = image.info['exif'] buffer = BytesIO() image.save(buffer, "webp", exif=expected_exif) buffer.seek(0) webp_image = Image.open(buffer) webp_exif = webp_image.info.get('exif', None) assert_true(webp_exif) if webp_exif: assert_equal(webp_exif, expected_exif, "Webp Exif didn't match") def test_read_icc_profile(): file_path = "Images/flower2.webp" image = Image.open(file_path) assert_equal(image.format, "WEBP") assert_true(image.info.get("icc_profile", None)) icc = image.info['icc_profile'] jpeg_image = Image.open('Tests/images/flower2.jpg') expected_icc = jpeg_image.info['icc_profile'] assert_equal(icc, expected_icc) def test_write_icc_metadata(): file_path = "Tests/images/flower2.jpg" image = Image.open(file_path) expected_icc_profile = image.info['icc_profile'] buffer = BytesIO() image.save(buffer, "webp", icc_profile=expected_icc_profile) buffer.seek(0) webp_image = Image.open(buffer) webp_icc_profile = webp_image.info.get('icc_profile', None) assert_true(webp_icc_profile) if webp_icc_profile: assert_equal(webp_icc_profile, expected_icc_profile, "Webp ICC didn't match") pillow-2.3.0/Tests/test_imagechops.py0000644000175000001440000000330212257506326016535 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageChops def test_sanity(): im = lena("L") ImageChops.constant(im, 128) ImageChops.duplicate(im) ImageChops.invert(im) ImageChops.lighter(im, im) ImageChops.darker(im, im) ImageChops.difference(im, im) ImageChops.multiply(im, im) ImageChops.screen(im, im) ImageChops.add(im, im) ImageChops.add(im, im, 2.0) ImageChops.add(im, im, 2.0, 128) ImageChops.subtract(im, im) ImageChops.subtract(im, im, 2.0) ImageChops.subtract(im, im, 2.0, 128) ImageChops.add_modulo(im, im) ImageChops.subtract_modulo(im, im) ImageChops.blend(im, im, 0.5) ImageChops.composite(im, im, im) ImageChops.offset(im, 10) ImageChops.offset(im, 10, 20) def test_logical(): def table(op, a, b): out = [] for x in (a, b): imx = Image.new("1", (1, 1), x) for y in (a, b): imy = Image.new("1", (1, 1), y) out.append(op(imx, imy).getpixel((0, 0))) return tuple(out) assert_equal(table(ImageChops.logical_and, 0, 1), (0, 0, 0, 255)) assert_equal(table(ImageChops.logical_or, 0, 1), (0, 255, 255, 255)) assert_equal(table(ImageChops.logical_xor, 0, 1), (0, 255, 255, 0)) assert_equal(table(ImageChops.logical_and, 0, 128), (0, 0, 0, 255)) assert_equal(table(ImageChops.logical_or, 0, 128), (0, 255, 255, 255)) assert_equal(table(ImageChops.logical_xor, 0, 128), (0, 255, 255, 0)) assert_equal(table(ImageChops.logical_and, 0, 255), (0, 0, 0, 255)) assert_equal(table(ImageChops.logical_or, 0, 255), (0, 255, 255, 255)) assert_equal(table(ImageChops.logical_xor, 0, 255), (0, 255, 255, 0)) pillow-2.3.0/Tests/test_file_webp.py0000644000175000001440000001023412257506326016354 0ustar dokousersfrom tester import * from PIL import Image try: from PIL import _webp except: skip('webp support not installed') def test_version(): assert_no_exception(lambda: _webp.WebPDecoderVersion()) def test_good_alpha(): assert_equal(_webp.WebPDecoderBuggyAlpha(), 0) def test_read_rgb(): file_path = "Images/lena.webp" image = Image.open(file_path) assert_equal(image.mode, "RGB") assert_equal(image.size, (128, 128)) assert_equal(image.format, "WEBP") assert_no_exception(lambda: image.load()) assert_no_exception(lambda: image.getdata()) # generated with: dwebp -ppm ../../Images/lena.webp -o lena_webp_bits.ppm target = Image.open('Tests/images/lena_webp_bits.ppm') assert_image_equal(image, target) def test_write_rgb(): """ Can we write a RGB mode file to webp without error. Does it have the bits we expect? """ temp_file = tempfile("temp.webp") lena("RGB").save(temp_file) image = Image.open(temp_file) image.load() assert_equal(image.mode, "RGB") assert_equal(image.size, (128, 128)) assert_equal(image.format, "WEBP") assert_no_exception(lambda: image.load()) assert_no_exception(lambda: image.getdata()) # If we're using the exact same version of webp, this test should pass. # but it doesn't if the webp is generated on Ubuntu and tested on Fedora. # generated with: dwebp -ppm temp.webp -o lena_webp_write.ppm #target = Image.open('Tests/images/lena_webp_write.ppm') #assert_image_equal(image, target) # This test asserts that the images are similar. If the average pixel difference # between the two images is less than the epsilon value, then we're going to # accept that it's a reasonable lossy version of the image. The included lena images # for webp are showing ~16 on Ubuntu, the jpegs are showing ~18. target = lena("RGB") assert_image_similar(image, target, 20.0) def test_write_lossless_rgb(): temp_file = tempfile("temp.webp") lena("RGB").save(temp_file, lossless=True) image = Image.open(temp_file) image.load() assert_equal(image.mode, "RGB") assert_equal(image.size, (128, 128)) assert_equal(image.format, "WEBP") assert_no_exception(lambda: image.load()) assert_no_exception(lambda: image.getdata()) assert_image_equal(image, lena("RGB")) def test_write_rgba(): """ Can we write a RGBA mode file to webp without error. Does it have the bits we expect? """ temp_file = tempfile("temp.webp") pil_image = Image.new("RGBA", (10, 10), (255, 0, 0, 20)) pil_image.save(temp_file) if _webp.WebPDecoderBuggyAlpha(): return image = Image.open(temp_file) image.load() assert_equal(image.mode, "RGBA") assert_equal(image.size, (10, 10)) assert_equal(image.format, "WEBP") assert_no_exception(image.load) assert_no_exception(image.getdata) assert_image_similar(image, pil_image, 1.0) if _webp.WebPDecoderBuggyAlpha(): skip("Buggy early version of webp installed, not testing transparency") def test_read_rgba(): # Generated with `cwebp transparent.png -o transparent.webp` file_path = "Images/transparent.webp" image = Image.open(file_path) assert_equal(image.mode, "RGBA") assert_equal(image.size, (200, 150)) assert_equal(image.format, "WEBP") assert_no_exception(lambda: image.load()) assert_no_exception(lambda: image.getdata()) orig_bytes = image.tobytes() target = Image.open('Images/transparent.png') assert_image_similar(image, target, 20.0) def test_write_lossless_rgb(): temp_file = tempfile("temp.webp") #temp_file = "temp.webp" pil_image = lena('RGBA') mask = Image.new("RGBA", (64, 64), (128,128,128,128)) pil_image.paste(mask, (0,0), mask) # add some partially transparent bits. pil_image.save(temp_file, lossless=True) image = Image.open(temp_file) image.load() assert_equal(image.mode, "RGBA") assert_equal(image.size, pil_image.size) assert_equal(image.format, "WEBP") assert_no_exception(lambda: image.load()) assert_no_exception(lambda: image.getdata()) assert_image_equal(image, pil_image) pillow-2.3.0/Tests/test_image_filter.py0000644000175000001440000000474312257506326017057 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageFilter def test_sanity(): def filter(filter): im = lena("L") out = im.filter(filter) assert_equal(out.mode, im.mode) assert_equal(out.size, im.size) filter(ImageFilter.BLUR) filter(ImageFilter.CONTOUR) filter(ImageFilter.DETAIL) filter(ImageFilter.EDGE_ENHANCE) filter(ImageFilter.EDGE_ENHANCE_MORE) filter(ImageFilter.EMBOSS) filter(ImageFilter.FIND_EDGES) filter(ImageFilter.SMOOTH) filter(ImageFilter.SMOOTH_MORE) filter(ImageFilter.SHARPEN) filter(ImageFilter.MaxFilter) filter(ImageFilter.MedianFilter) filter(ImageFilter.MinFilter) filter(ImageFilter.ModeFilter) filter(ImageFilter.Kernel((3, 3), list(range(9)))) assert_exception(TypeError, lambda: filter("hello")) def test_crash(): # crashes on small images im = Image.new("RGB", (1, 1)) assert_no_exception(lambda: im.filter(ImageFilter.SMOOTH)) im = Image.new("RGB", (2, 2)) assert_no_exception(lambda: im.filter(ImageFilter.SMOOTH)) im = Image.new("RGB", (3, 3)) assert_no_exception(lambda: im.filter(ImageFilter.SMOOTH)) def test_modefilter(): def modefilter(mode): im = Image.new(mode, (3, 3), None) im.putdata(list(range(9))) # image is: # 0 1 2 # 3 4 5 # 6 7 8 mod = im.filter(ImageFilter.ModeFilter).getpixel((1, 1)) im.putdata([0, 0, 1, 2, 5, 1, 5, 2, 0]) # mode=0 mod2 = im.filter(ImageFilter.ModeFilter).getpixel((1, 1)) return mod, mod2 assert_equal(modefilter("1"), (4, 0)) assert_equal(modefilter("L"), (4, 0)) assert_equal(modefilter("P"), (4, 0)) assert_equal(modefilter("RGB"), ((4, 0, 0), (0, 0, 0))) def test_rankfilter(): def rankfilter(mode): im = Image.new(mode, (3, 3), None) im.putdata(list(range(9))) # image is: # 0 1 2 # 3 4 5 # 6 7 8 min = im.filter(ImageFilter.MinFilter).getpixel((1, 1)) med = im.filter(ImageFilter.MedianFilter).getpixel((1, 1)) max = im.filter(ImageFilter.MaxFilter).getpixel((1, 1)) return min, med, max assert_equal(rankfilter("1"), (0, 4, 8)) assert_equal(rankfilter("L"), (0, 4, 8)) assert_exception(ValueError, lambda: rankfilter("P")) assert_equal(rankfilter("RGB"), ((0, 0, 0), (4, 0, 0), (8, 0, 0))) assert_equal(rankfilter("I"), (0, 4, 8)) assert_equal(rankfilter("F"), (0.0, 4.0, 8.0)) pillow-2.3.0/Tests/test_image_getcolors.py0000644000175000001440000000326112257506326017565 0ustar dokousersfrom tester import * from PIL import Image def test_getcolors(): def getcolors(mode, limit=None): im = lena(mode) if limit: colors = im.getcolors(limit) else: colors = im.getcolors() if colors: return len(colors) return None assert_equal(getcolors("1"), 2) assert_equal(getcolors("L"), 193) assert_equal(getcolors("I"), 193) assert_equal(getcolors("F"), 193) assert_equal(getcolors("P"), 54) # fixed palette assert_equal(getcolors("RGB"), None) assert_equal(getcolors("RGBA"), None) assert_equal(getcolors("CMYK"), None) assert_equal(getcolors("YCbCr"), None) assert_equal(getcolors("L", 128), None) assert_equal(getcolors("L", 1024), 193) assert_equal(getcolors("RGB", 8192), None) assert_equal(getcolors("RGB", 16384), 14836) assert_equal(getcolors("RGB", 100000), 14836) assert_equal(getcolors("RGBA", 16384), 14836) assert_equal(getcolors("CMYK", 16384), 14836) assert_equal(getcolors("YCbCr", 16384), 11995) # -------------------------------------------------------------------- def test_pack(): # Pack problems for small tables (@PIL209) im = lena().quantize(3).convert("RGB") expected = [(3236, (227, 183, 147)), (6297, (143, 84, 81)), (6851, (208, 143, 112))] A = im.getcolors(maxcolors=2) assert_equal(A, None) A = im.getcolors(maxcolors=3) A.sort() assert_equal(A, expected) A = im.getcolors(maxcolors=4) A.sort() assert_equal(A, expected) A = im.getcolors(maxcolors=8) A.sort() assert_equal(A, expected) A = im.getcolors(maxcolors=16) A.sort() assert_equal(A, expected) pillow-2.3.0/Tests/test_file_tar.py0000644000175000001440000000136612257506326016213 0ustar dokousersfrom tester import * from PIL import Image, TarIO codecs = dir(Image.core) if "zip_decoder" not in codecs and "jpeg_decoder" not in codecs: skip("neither jpeg nor zip support not available") # sample ppm stream tarfile = "Images/lena.tar" def test_sanity(): if "zip_decoder" in codecs: tar = TarIO.TarIO(tarfile, 'lena.png') im = Image.open(tar) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "PNG") if "jpeg_decoder" in codecs: tar = TarIO.TarIO(tarfile, 'lena.jpg') im = Image.open(tar) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "JPEG") pillow-2.3.0/Tests/test_image_quantize.py0000644000175000001440000000061312257506326017422 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() im = im.quantize() assert_image(im, "P", im.size) im = lena() im = im.quantize(palette=lena("P")) assert_image(im, "P", im.size) def test_octree_quantize(): im = lena() im = im.quantize(100, Image.FASTOCTREE) assert_image(im, "P", im.size) assert len(im.getcolors()) == 100pillow-2.3.0/Tests/test_imageops_usm.py0000644000175000001440000000341112257506326017107 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageOps from PIL import ImageFilter im = Image.open("Images/lena.ppm") def test_ops_api(): i = ImageOps.gaussian_blur(im, 2.0) assert_equal(i.mode, "RGB") assert_equal(i.size, (128, 128)) # i.save("blur.bmp") i = ImageOps.usm(im, 2.0, 125, 8) assert_equal(i.mode, "RGB") assert_equal(i.size, (128, 128)) # i.save("usm.bmp") def test_filter_api(): filter = ImageFilter.GaussianBlur(2.0) i = im.filter(filter) assert_equal(i.mode, "RGB") assert_equal(i.size, (128, 128)) filter = ImageFilter.UnsharpMask(2.0, 125, 8) i = im.filter(filter) assert_equal(i.mode, "RGB") assert_equal(i.size, (128, 128)) def test_usm(): usm = ImageOps.unsharp_mask assert_exception(ValueError, lambda: usm(im.convert("1"))) assert_no_exception(lambda: usm(im.convert("L"))) assert_exception(ValueError, lambda: usm(im.convert("I"))) assert_exception(ValueError, lambda: usm(im.convert("F"))) assert_no_exception(lambda: usm(im.convert("RGB"))) assert_no_exception(lambda: usm(im.convert("RGBA"))) assert_no_exception(lambda: usm(im.convert("CMYK"))) assert_exception(ValueError, lambda: usm(im.convert("YCbCr"))) def test_blur(): blur = ImageOps.gaussian_blur assert_exception(ValueError, lambda: blur(im.convert("1"))) assert_no_exception(lambda: blur(im.convert("L"))) assert_exception(ValueError, lambda: blur(im.convert("I"))) assert_exception(ValueError, lambda: blur(im.convert("F"))) assert_no_exception(lambda: blur(im.convert("RGB"))) assert_no_exception(lambda: blur(im.convert("RGBA"))) assert_no_exception(lambda: blur(im.convert("CMYK"))) assert_exception(ValueError, lambda: blur(im.convert("YCbCr"))) pillow-2.3.0/Tests/test_imagestat.py0000644000175000001440000000247312257506326016404 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageStat def test_sanity(): im = lena() st = ImageStat.Stat(im) st = ImageStat.Stat(im.histogram()) st = ImageStat.Stat(im, Image.new("1", im.size, 1)) assert_no_exception(lambda: st.extrema) assert_no_exception(lambda: st.sum) assert_no_exception(lambda: st.mean) assert_no_exception(lambda: st.median) assert_no_exception(lambda: st.rms) assert_no_exception(lambda: st.sum2) assert_no_exception(lambda: st.var) assert_no_exception(lambda: st.stddev) assert_exception(AttributeError, lambda: st.spam) assert_exception(TypeError, lambda: ImageStat.Stat(1)) def test_lena(): im = lena() st = ImageStat.Stat(im) # verify a few values assert_equal(st.extrema[0], (61, 255)) assert_equal(st.median[0], 197) assert_equal(st.sum[0], 2954416) assert_equal(st.sum[1], 2027250) assert_equal(st.sum[2], 1727331) def test_constant(): im = Image.new("L", (128, 128), 128) st = ImageStat.Stat(im) assert_equal(st.extrema[0], (128, 128)) assert_equal(st.sum[0], 128**3) assert_equal(st.sum2[0], 128**4) assert_equal(st.mean[0], 128) assert_equal(st.median[0], 128) assert_equal(st.rms[0], 128) assert_equal(st.var[0], 0) assert_equal(st.stddev[0], 0) pillow-2.3.0/Tests/test_image_putpixel.py0000644000175000001440000000152312257506326017435 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im1 = lena() im2 = Image.new(im1.mode, im1.size, 0) for y in range(im1.size[1]): for x in range(im1.size[0]): pos = x, y im2.putpixel(pos, im1.getpixel(pos)) assert_image_equal(im1, im2) im2 = Image.new(im1.mode, im1.size, 0) im2.readonly = 1 for y in range(im1.size[1]): for x in range(im1.size[0]): pos = x, y im2.putpixel(pos, im1.getpixel(pos)) assert_false(im2.readonly) assert_image_equal(im1, im2) im2 = Image.new(im1.mode, im1.size, 0) pix1 = im1.load() pix2 = im2.load() for y in range(im1.size[1]): for x in range(im1.size[0]): pix2[x, y] = pix1[x, y] assert_image_equal(im1, im2) # see test_image_getpixel for more tests pillow-2.3.0/Tests/test_file_ico.py0000644000175000001440000000043612257506326016174 0ustar dokousersfrom tester import * from PIL import Image # sample ppm stream file = "Images/lena.ico" data = open(file, "rb").read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "RGBA") assert_equal(im.size, (16, 16)) assert_equal(im.format, "ICO") pillow-2.3.0/Tests/test_image_putdata.py0000644000175000001440000000166012257506326017227 0ustar dokousersfrom tester import * import sys from PIL import Image def test_sanity(): im1 = lena() data = list(im1.getdata()) im2 = Image.new(im1.mode, im1.size, 0) im2.putdata(data) assert_image_equal(im1, im2) # readonly im2 = Image.new(im1.mode, im2.size, 0) im2.readonly = 1 im2.putdata(data) assert_false(im2.readonly) assert_image_equal(im1, im2) def test_long_integers(): # see bug-200802-systemerror def put(value): im = Image.new("RGBA", (1, 1)) im.putdata([value]) return im.getpixel((0, 0)) assert_equal(put(0xFFFFFFFF), (255, 255, 255, 255)) assert_equal(put(0xFFFFFFFF), (255, 255, 255, 255)) assert_equal(put(-1), (255, 255, 255, 255)) assert_equal(put(-1), (255, 255, 255, 255)) if sys.maxsize > 2**32: assert_equal(put(sys.maxsize), (255, 255, 255, 255)) else: assert_equal(put(sys.maxsize), (255, 255, 255, 127)) pillow-2.3.0/Tests/test_image_rotate.py0000644000175000001440000000067212257506326017065 0ustar dokousersfrom tester import * from PIL import Image def test_rotate(): def rotate(mode): im = lena(mode) out = im.rotate(45) assert_equal(out.mode, mode) assert_equal(out.size, im.size) # default rotate clips output out = im.rotate(45, expand=1) assert_equal(out.mode, mode) assert_true(out.size != im.size) for mode in "1", "P", "L", "RGB", "I", "F": yield_test(rotate, mode) pillow-2.3.0/Tests/test_imagecms.py0000644000175000001440000001223112257506326016204 0ustar dokousersfrom tester import * from PIL import Image try: from PIL import ImageCms except ImportError: skip() SRGB = "Tests/icc/sRGB.icm" def test_sanity(): # basic smoke test. # this mostly follows the cms_test outline. v = ImageCms.versions() # should return four strings assert_equal(v[0], '1.0.0 pil') assert_equal(list(map(type, v)), [str, str, str, str]) # internal version number assert_match(ImageCms.core.littlecms_version, "\d+\.\d+$") i = ImageCms.profileToProfile(lena(), SRGB, SRGB) assert_image(i, "RGB", (128, 128)) t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") i = ImageCms.applyTransform(lena(), t) assert_image(i, "RGB", (128, 128)) p = ImageCms.createProfile("sRGB") o = ImageCms.getOpenProfile(SRGB) t = ImageCms.buildTransformFromOpenProfiles(p, o, "RGB", "RGB") i = ImageCms.applyTransform(lena(), t) assert_image(i, "RGB", (128, 128)) t = ImageCms.buildProofTransform(SRGB, SRGB, SRGB, "RGB", "RGB") assert_equal(t.inputMode, "RGB") assert_equal(t.outputMode, "RGB") i = ImageCms.applyTransform(lena(), t) assert_image(i, "RGB", (128, 128)) # test PointTransform convenience API im = lena().point(t) def test_name(): # get profile information for file assert_equal(ImageCms.getProfileName(SRGB).strip(), 'IEC 61966-2.1 Default RGB colour space - sRGB') def x_test_info(): assert_equal(ImageCms.getProfileInfo(SRGB).splitlines(), ['sRGB IEC61966-2.1', '', 'Copyright (c) 1998 Hewlett-Packard Company', '', 'WhitePoint : D65 (daylight)', '', 'Tests/icc/sRGB.icm']) def test_intent(): assert_equal(ImageCms.getDefaultIntent(SRGB), 0) assert_equal(ImageCms.isIntentSupported( SRGB, ImageCms.INTENT_ABSOLUTE_COLORIMETRIC, ImageCms.DIRECTION_INPUT), 1) def test_profile_object(): # same, using profile object p = ImageCms.createProfile("sRGB") # assert_equal(ImageCms.getProfileName(p).strip(), # 'sRGB built-in - (lcms internal)') # assert_equal(ImageCms.getProfileInfo(p).splitlines(), # ['sRGB built-in', '', 'WhitePoint : D65 (daylight)', '', '']) assert_equal(ImageCms.getDefaultIntent(p), 0) assert_equal(ImageCms.isIntentSupported( p, ImageCms.INTENT_ABSOLUTE_COLORIMETRIC, ImageCms.DIRECTION_INPUT), 1) def test_extensions(): # extensions i = Image.open("Tests/images/rgb.jpg") p = ImageCms.getOpenProfile(BytesIO(i.info["icc_profile"])) assert_equal(ImageCms.getProfileName(p).strip(), 'IEC 61966-2.1 Default RGB colour space - sRGB') def test_exceptions(): # the procedural pyCMS API uses PyCMSError for all sorts of errors assert_exception(ImageCms.PyCMSError, lambda: ImageCms.profileToProfile(lena(), "foo", "bar")) assert_exception(ImageCms.PyCMSError, lambda: ImageCms.buildTransform("foo", "bar", "RGB", "RGB")) assert_exception(ImageCms.PyCMSError, lambda: ImageCms.getProfileName(None)) assert_exception(ImageCms.PyCMSError, lambda: ImageCms.isIntentSupported(SRGB, None, None)) def test_display_profile(): # try fetching the profile for the current display device assert_no_exception(lambda: ImageCms.get_display_profile()) def test_lab_color_profile(): pLab = ImageCms.createProfile("LAB", 5000) pLab = ImageCms.createProfile("LAB", 6500) def test_simple_lab(): i = Image.new('RGB', (10,10), (128,128,128)) pLab = ImageCms.createProfile("LAB") t = ImageCms.buildTransform(SRGB, pLab, "RGB", "LAB") i_lab = ImageCms.applyTransform(i, t) assert_equal(i_lab.mode, 'LAB') k = i_lab.getpixel((0,0)) assert_equal(k, (137,128,128)) # not a linear luminance map. so L != 128 L = i_lab.getdata(0) a = i_lab.getdata(1) b = i_lab.getdata(2) assert_equal(list(L), [137]*100) assert_equal(list(a), [128]*100) assert_equal(list(b), [128]*100) def test_lab_color(): pLab = ImageCms.createProfile("LAB") t = ImageCms.buildTransform(SRGB, pLab, "RGB", "LAB") # need to add a type mapping for some PIL type to TYPE_Lab_8 in findLCMSType, # and have that mapping work back to a PIL mode. (likely RGB) i = ImageCms.applyTransform(lena(), t) assert_image(i, "LAB", (128, 128)) # i.save('temp.lab.tif') # visually verified vs PS. target = Image.open('Tests/images/lena.Lab.tif') assert_image_similar(i, target, 30) def test_lab_srgb(): pLab = ImageCms.createProfile("LAB") t = ImageCms.buildTransform(pLab, SRGB, "LAB", "RGB") img = Image.open('Tests/images/lena.Lab.tif') img_srgb = ImageCms.applyTransform(img, t) # img_srgb.save('temp.srgb.tif') # visually verified vs ps. assert_image_similar(lena(), img_srgb, 30) def test_lab_roundtrip(): # check to see if we're at least internally consistent. pLab = ImageCms.createProfile("LAB") t = ImageCms.buildTransform(SRGB, pLab, "RGB", "LAB") t2 = ImageCms.buildTransform(pLab, SRGB, "LAB", "RGB") i = ImageCms.applyTransform(lena(), t) out = ImageCms.applyTransform(i, t2) assert_image_similar(lena(), out, 2) pillow-2.3.0/Tests/test_imagepath.py0000644000175000001440000000322112257506326016355 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImagePath import array def test_path(): p = ImagePath.Path(list(range(10))) # sequence interface assert_equal(len(p), 5) assert_equal(p[0], (0.0, 1.0)) assert_equal(p[-1], (8.0, 9.0)) assert_equal(list(p[:1]), [(0.0, 1.0)]) assert_equal(list(p), [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)]) # method sanity check assert_equal(p.tolist(), [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)]) assert_equal(p.tolist(1), [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]) assert_equal(p.getbbox(), (0.0, 1.0, 8.0, 9.0)) assert_equal(p.compact(5), 2) assert_equal(list(p), [(0.0, 1.0), (4.0, 5.0), (8.0, 9.0)]) p.transform((1,0,1,0,1,1)) assert_equal(list(p), [(1.0, 2.0), (5.0, 6.0), (9.0, 10.0)]) # alternative constructors p = ImagePath.Path([0, 1]) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path([0.0, 1.0]) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path([0, 1]) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path([(0, 1)]) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path(p) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path(p.tolist(0)) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path(p.tolist(1)) assert_equal(list(p), [(0.0, 1.0)]) p = ImagePath.Path(array.array("f", [0, 1])) assert_equal(list(p), [(0.0, 1.0)]) arr = array.array("f", [0, 1]) if hasattr(arr, 'tobytes'): p = ImagePath.Path(arr.tobytes()) else: p = ImagePath.Path(arr.tostring()) assert_equal(list(p), [(0.0, 1.0)]) pillow-2.3.0/Tests/test_file_msp.py0000644000175000001440000000041412257506326016215 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): file = tempfile("temp.msp") lena("1").save(file) im = Image.open(file) im.load() assert_equal(im.mode, "1") assert_equal(im.size, (128, 128)) assert_equal(im.format, "MSP") pillow-2.3.0/Tests/images/0000755000175000001440000000000012274164154014252 5ustar dokouserspillow-2.3.0/Tests/images/16bit.deflate.tif0000644000175000001440000001177012257510072017307 0ustar dokousersII*zx-ouqT(臢AHveQDl\f8Y8 gpᾋ,Qڑ-";qƈI hm0{9Yݡw/?=mG݁{MW[}y{ݦsyfݲ3oN36 fλF%skEuK[q݋[k pXs!~݈{Ww [摻@= |poQo"مA>κ*n2:ڑf:}#q}~~hz݀. ]0 !E06_e]̓g%K3Dž\|7vg`Zpy.G 9rM:_~U(j 跄A6\7V)@?U,3-Bn9lO t={=&OX*H9W͏}0M4-;F} NvkX=6 c N^_~g+gxK( -sX{ /% #͊*S:[ `~XVGdn mb|{A_K7U|[BY45MarJ 'xZT+0b.c^l;2v~xxdhE#Nw}-(җ\΁. e& 2@0-g( Ǵ,9*X>jhC"^-1iA o{-( bHCR~L݇ Oedu`e(h@sz (Ƒ\'L*9f X}^2"ߗATc !e9vDxz-imZ d|}n>9|lKģ@m:kC8ѵ$뾆VI(N/ɪn>4Zwk ؙgLp᷂8AӂV~X${"O>Pu^Dvco;9lA{0 о÷+^W\;lr򊬉e.#}Շ[23 f&!І Fbe|CJ#o-6NKk]JɧXGuy qV)lOl36YdN0ӈg-߄.%ְ>OZv}ЎrǐQ~(L)}B[a&SD8Z>Sb˰x:f5VYUHbPEᕆʬi6KD\79v;o4xeeR|p+WH s o`n8x3j9x¹ .h#] qtBUOiǘ_淈Qf)Qd.aF[ѬZNۈ5/:o7'[e2|xm/)M`18*3A(34lxL$M/%' r9ZZx vf6]Xal$= ;phwZ_Ք5pLSYcu#eAՠ;EZIC1M4V 5A9/R] e;Qx ("`N4FDUY4EeN2êfOw^x!K#a"aJVv͈N;EC,nf.U*X*ީൌrG#jYYM2&^EGL4U+p̰76tV8]$ 5EHb~e;2Q@7;/60 ۩ dY{U9 U(qGYkus1K WV\rIv\0h:Y &1Mx4~m=  TO߃vAMGhdg: A,6^3YUjjq\zK'>,ըL[Ezvnf>2of}ѽP~ iQ!hV뺛 eTyE@f 3YJ`}m'l47VRa&^o7ܿA K³=J6uZJzj 6涳 X>4ƞh쌲v}p~~F~)wY 6>, Uq"nzj뻈%ⳙo/XE9Q䃜*Qu?;El;k!l};qBՙOUE 1yY*/HF5-vuxU6B)!sNc5a )ټs*pL0AURײc*k]ːqD@?~Fb'G)r q "S/a?Va N@әh=VFMYݰ0R X*,T7tkv2ٶ΁_7eފcCN(x*6@"mTp :X5[f-HN*ln7%tEX7zmtN6D#^ӭqMw%hus씽MF9$QG6uu H9%O8 ׀:%.ۂq~TuMH1m~5S<_ߺ?ap`_u4:p([B}LhG a-l3H'ǝ<<`GNgVF2rػAt[.vZTn|:y<~˞g4{~/|KdtZ?y{XYOתŭ*QVYT @@@rpillow-2.3.0/Tests/images/12bit.cropped.tif0000644000175000001440000003564412257510072017341 0ustar dokousersII*: P p@  @p P   p P P p pp@p  @@@ @@@p  @ @ P    pP@ p  P P   @p   p P  P  @@p@ @pP P@p`  @ P @@@@p` P@ @ P@ @p Pp @  @p  pp   @PP@p@ PP  P@ppP P p @  @   @  p@ @P P @ pPp@@   P@@PP p@ pP@ @ p @p@p@  P@   p@  Pp @  p P P@ p pP  @@  @  PPp@@  PP @ @P@  `  @ pP@P @pP   @ PPPPp  @ P@ @ ppppP P   P @ p   @  PP @ p P@P      P p  p @@ @ @P P @pP p P@ P   @  P  PPP@P `   @P @P P p  @ @ Pp P   @@P   p@ P  @ @ P   P@Pp@P0 P @` p    P   P  P@ P   P@@ @  P@ @ p  P p @  @p@   P 0   P   p @P  P pp@  Pp@ @ p pPPPp@PP@pP P@ Ppp  @pPp @ @P   Pp  0p pP  P   Ppp PP@ @Ppp ` PP  P @@@  pPP   P p p@ pP @p   @   @  P   p p PPPP 0` @P @P @@`@P  p   @@  p p   P@P Pp   PP@@@ P@@P@@@  @ @ @PPP @ p @ p   @ PP`  PP@  pp@PppPpP P p @ p   p pP  p p @PpPP @@@p P @ @P P@@ p @@  @ @ ` ` @` @p@ P pPpP  @ pppP  @P@  pp@P P@ P @@ pP@@ P @P@ p@ pP @ @ P@`P  pPpP p@  p @  @  pP ppP p@ p      P   P@`p @p ppp @ PP0@ `P @ p @@ pp  @ PPP@ pp@ @P@@@Pp@@ @@@  P`P   pP`@Pp@  @P@Pp P  P@ P pP @p@   @Pp@ p@@@ `PP @ @  P@ P@ @ @ @ Pp@ @PP@Ppp @PP p P p Pp@ @ppp@ p@pP PPPp PP@  @p P P @P @ p@PppPpP @@ @Ppp P  P p@@@Pp@p `@@p p @p @@ P@p  p @P Pp@   P@pPpPp P@ @ @pP @ @  p P `0pppP@  @ P@ ``@ P Pp@@  P P p@@P @P@P@P P pP pp P@ @  PPP  p @P@ @p   @p @PP@P  @@ P @Pp @p @ @  p PpPp @ P @ @P `P   @@@P   @P@P ppPP@p @ @@ @@P@P@p @  pPPp@p P@  @``@  @P`P@  @ @  P`P`@@PP@   p  @ p @  pPP@PpP P Pp@ @P   @@ @   p @ @ @pP  dd   r;;6;;;()12bit.cropped.tifHHpillow-2.3.0/Tests/images/caption_6_33_22.png0000644000175000001440000003602212257506326017457 0ustar dokousersPNG  IHDR?1tRNSSDK;IDATx]XTw7d}dnvmvm{yq&o7dXcl{CEwwT 6#ҤA@zu91y{e2qOfܹ3?>ZA=OM&BFN}8AU8Lkub5̍(k!`~?’IWU0?d]Iá1^,leb-̐*0jZЮ%C L =-uZP#@)b\B{=NZX3j aA|$׈E0'& 1 @X36~%AZZQ-=6tKQ!V!`Va%jkrC2x؃w077s.!J޻bÅ*-b9lW<ZmX s: M|p/fgYQ%`Ԉg+0ORUy +a3LaL"fiǻyb)̍4(!`f{?pCyM29J<P}˾̒+%B kѹY?D)?V, nG;BfHհ/ljb-̐`bY@ '5S\ 0ch3R TQHf3y%A]"@FJ'AefHuh֊Q_f@ n~{ 2Vφ?f s8k0Kdn+oV07F`5JZߔSF@Ea C)[ ˧07R`!5_ v,P Sk0Cg14Hpp)nՏfh1$B,Dž/Ub)pfT7f mf0K(`p0HuzC̖*c2Z)|{AcX @؏M>b)̐0$P&B hbR0CR`EL=V0?!V[#VCܨ.U32DR%l_nDyšYEb-̐*1 I\-D0 2.wi⾼;Prqk @ryc.TEp_#qŦ PGqLvSa4LsU$LØy}!)UǩOH؏Cy$@j,`Bl` "L!8@/]x'l V/H } , @k=Džu71d?h MPs`d{T,N橕҈0h/W8ܺϖtC1#Xjﻁ-v`P Y`! irC@ iix?r`5 '_aZS],6Sutf2_ֶ K9b$*6! X 3`Be vSIal^j]||7Ms ,%&z^b#3'WDK18(x:ƹȂRhIx(5a]73Fa3Ao/ve$on֝}.@%%P)@PđÆק&T]!--KY6o3k/LW4< MG]iˇXgN*.E%0k nFz! i Zh':Ϯ H6-2h kge8IА qyׯ mV;ݕl$+q' Ή%%m*G/-GvK`P*  0l'ӈ雺TR <"TsY@މ XWX{HRk"h:1CI1ݦp?^v0s?Pb`t3X5,Pt.+<[AޕPDq)w1"̈0yd:ҌG ~+<oydCX9 BkEa;.3ܚuTٻ yl 0fCEaXAuINӇEsAES$#5jfx ĝ;HkPZ}"g^?cH9;Cu^w6Y~,a4Q*^$Iy[}LXbA>q% g uXj^V.[6TLDipTX3Sa?co#isB{#,Xw]'@yEqLug_CƔPV;og"`6~Yn>/; For0 gP@\sA&. f:~,m^\ r^I숧ֲu{PbfIÙ#WN;sG3V\ԏn q\9Ǣ`0b} ~*6h]t&sVmouS]& zP%5H6\'g%-7)6(}i`#)hwdbHge$ ҕ_Hw@'T^E!#n3kT(IR8S[gؠ۰n6&- 0pʼnCQuԜ:n%~,4gK5}Д 6íӐD*/(Djq m%ɚݷNR[:^1"AuLr_k:/)ӡ:cas@\= sHR.m >v*пvZ*C'ŽZqC'B[, [+K|V`PX6APR@ 9]cC8o|d%@iV8e6Uڮl\NP;K h2Epu<tٯ+s1WMe] h4a++6ڴ./.}w6XqźA:jq:Ύ\?K_'U?i MFK)o l` ]ʖf0t%/(b Â10af9wF3=w.pIP=ކd!$HT^LjX#ʋQeTi\jISKF٩r6+J\ !H)ex۾&ȁR2P[Z myU=v,d7Y^MQv.F]8MaT G줬W 8g l]cF)iBdԭ!;u {A0fN %җ/X2,sT}]L ;]Z M'/_zb#Ֆvyo>:PY Umk!Lu#`|8as~HsVKa9di n yʥ* :e]+0?„%A,w8d+U&m&U F]^; oV4PU3?e 4gbu^51Oհ`Lά{, >H}3,@ucg YU\!dI%iSk0`d,ja{sjmϭ =w­1;Ï&Q8SP8mXd<mۮPTei:NpG }Jm4ns8)vr/x!smKH-ZhLLeXͅi3F'͚p2]͉00C(ޕKzYW^:#.z kz=TO3mp Osu8IsWe4K$aBO2*C/59 "IM+==@K ҫF0A٣^h*Bb;ݳ=*^Zrc9m=Yj$ǩk磯=w61kBToM"ǰa|s0Pj QDJsA*q6NGmCMfypn [,ljf)ܘ;XpU0m\ Kp(W^l'7C_w $t[ -@UF `66Z~zK/ÀL5!P*fWޜu{|U/N61Z4@y0^. Aq2*ի}Zѿ_r^[Yqz&UμWhA%kC'9 I>y\QV&>̙sK";;_|KII b_XKBt~FJ]f2߈zq@U7z\6v?x}[NGmllm{u/544H5T*UZZZFTO$._1]cWaHuiɉ:88,.3}]YGׯZwt_39uuu?|~~ȑ#C H$j {H}hyVšL!ж ǗI^w7q-===]6lذ~Z>wyĉJr….ڴi]$RHGz+k ߕ3% :6v n2g P3P>DRg?%z7꘻W^=^_;w.=ݹs$0o<ݑ@:2|Y.N)#Yvn6LHX= N `-"ǣP"%UQofo@y7+ї_~I /`ooO\{9:p}授v.+N2^<۷_|zHeK̭zIʽ !f|=YEP+et=@8t|x?4]=oٲXB>zjzz_.X@W_}U.[o5x`YҚ)y6^%҈-iI9Hρ*P52cuȫ5455 0`РANk:Px6PUU%@y@Gj .10{4bH7RkݡswO |}:۱5H'^O~BIcǎnnnxtnGQ`Gj=IC=] u5NI< 5rA/^Hyi~~~~>0H{lnsO ;\ĝt#´1cuܞ"s1z 赝Auq˩&OJrJb~zxx}Ϟ=togzzzxxÇ?Û7o tahk04#$'ylj_\X\Xn`T}0w d{K8Z\g}6#F8[vww'Wwf߾}?ӂ4] id\ŗ{ۨ0<"V̀zS w@=<\C 1~PM@$'BTWWdffA>> mΖ[3 o:JmͫqgeSa|FJhJ˧=lDWϐ!+qOfgfcX8X?u2ֹ@]נ"v'r[!vfzvl_7Æpac+_-[ mz4`4{Fd@PξsOb,ezV]ذWcBnۜAȱE0AYں.w>QN=jkpjQ A+O(\2z+T-0( 䦗mKs@yp kz2F"4fTN+PҀ5g\|hR8 NsZ|o;ToJAbWi1(7)n_^={usEPN~P!ɶP&KnC}U@qya5T=ԥI' 8Zv^Jj oHp QnϡcO|H^9U\ qUªRM,)@E6{uGck{AIY$v,BIQpFX?v'B! z 8<1v4BΐPB]Gϊ[-mθc$:qnGS@i )9zs8 IOeQC'oP%;8Ubxnŷx{m fHFf ܬtr4)6crŝԶ㼂 .?n(2٬Y3KjYP; N @b\:&=;T`:7·|/4:K--:QBS,aCo6<8*1(J}2DN[n0Vd(0Y;A-HӬޔ u\l8g Q$ܧ'c+L zhAA]e} M9 7Cuwfa-9kJR dB%z+0&ՀG]Y ]猁V\T8|r(S-% M7έhޅ[0"n!rAt^ ˦Ai6ABP `|5;& >lQ%z,p)+3oU[l֓A)anBr:x~(C@lؾH,%Ƹ ˃yV.A8<k0׍ ,wnId6 U9n]ХzݶZ*SXg ;liˆ]p{bNw]Q㾂ʠgh؋J8Ƚ Ѐn<,Bi&Ú~4@Ɲm+5QѠ؟#߷SKp }eʏp"6΅Sk u_mWȼدzO}z2z1|DH^;8&UM׹Sթ5@[< пp}?w‚^ r5uFzK#5LXMcncysX 75R3gUp(Pms s+ʧ"+"X$*KMa| & ]'atgaAܺu铚Ah`fm$H VcV_}p P'ɧ0XWxȖmGweQĝ9c jE(Z}KU:" NwZ=2O8*Wy#&D;9{T f2&S)=<0٪(ai2@eLA;LZRIL >=n8<,ϩYxruHEl}]kby1ƙ~sCE=a-T[ Wrg Ð6"hwLƺcS4>k@tYߐn]w[ۦ^c!q?okԬW[`w$+ %@ݳ'iVA˦aИ{p_≸͒!҅pu+N:Kf:/0 }wcn0O HWm4\{s['s¹cH 0Rtcjjnrv.+0UQ3~ ?;ʏ>]:sRnoC N-** xbttZME0fdOXXKKKuJarl%lF&`(ěAzGvs*MRXՖ/(,ZyiPJ2MŽIeͻʓydj3=s18oO g}vРA__{Ǐ=4d27{JRp8B\w<̙3+!+d W~*KD@'|Їn Pe%{z[,UgB9g._R8WU4mz +pٗUF:[UWj 5F[&??333u*ߊ+dzn j[tב=՟bfho঑=R[,j 'qpd Ҽ6&l@]4xB⬒r,Q*hGJ$Hth } SHOOױ% ?vg}_}Ubbj\\ѣ_z+?͛q:,oZZhQ(K,!_r%}'y0*IiiM'?B xu'BE{ůj͙9tW$mj<@'E6` p!wy&6œ>>>}W_ݼysTTԢE~q?trrpo=k,-/ڵk-vvv=\JJ 1cưatW&e9?˗ߑJ&ˍoXSi< 4&`$8O6RJgP=$AY&Mɂv Owb4Ï~~kP~87?޴xU{G^ 6N N%ƕЧOׯ {JO>dԩDA߾}eOӓ'OB~jjjoܸAWHxSOL+c~gp"dHNwM z%dFTprJu$0HޡcjN^:GSFuرccǎ/RE6i;_~ M;5=%f@R=Sd_ˋ'G)ч v. T4v$e`Ox7 9}4X屒Yr \m`h)֏|?FWZxm:'ݼ К|$Pݰ>[ZZ%''{{{駤,Hx饗V\H i/{-J:ҥK'u"8!wyȀ7pn'9e~>Ǐo;p>IJA:o9h oݺEcbbck.O鿿?پt5RIۉ=S?&TȦ[p!}7x>Xzރ *䜨U3ww[qDLNGauJsBo{Gi%3Z޶Tڶ'|}5yfN0=7h-fcSb~vvMpIr+^9EYI;>9b>y[LzK_Wz^m޷]Kt mѹ>$B+\C c+sۣR_NKT7L'j&wqo8 bV#&;Fcƅn8=9r8bMuR"ZX'݈,FOdr=Vs`<3*N$s ܱF31k>0Ω{*S1IP6݋xT$KF:Jx^+ڣxUGTo9`i{'Ĕso1ڙ rw2 $/(wc*@A{@f(tIϢ=NY4H32ݡ.Vޞ'P$RkjkrSuPgVZ4R+3nK8{ ŭ}1Udo, ZB :,ۮ1$` YkEC?a.e^t?y>wmXr+wG*R (g)IfCtԺ|؆8Y`J̿\+.)) udA .. s\);Z:ݷ@^[Zҕ Nj2YO3,FAmq@f}zdɒ~^754&և|H<%ilC\UIض8ޟ  d]kOm0[[{/22>޽ =Ej1w xPyw#Pg>xf2' 2O9 lIv#y\\\t]I>쳹svqN al:3fݽ6h.*x5~|14]ݻwoo?k_͉yrnn^)˼ <(OGຑ]U_IteeeOOz=R*FxJ|OHpo$姒ӐZ5!Pmw}wҤIm{H[>u%0J 88^_wݻw9ѣOh> z *,,\nŜ9si.O;`B} 7lC퓍1O2隨ǿ{8i|@$nz w-7 N 'L)m[z5\TV矗}{=:x5tۙn 9[n$OOALƞ E*KH+d|oF4ё>}\zU_ОvN6 /u__j5i8ϙ 7z_B#^ɑԩSt9ɓsεfXEGGGDD,Ydٲewޕn} ?ׯ<ʈ7MNe3,^xݺu&-W<]eSܑp ˗OҰhA2`%\憸* ?c2 UZAfNhs# JuAm߀"AwBg}<r%Z>nlk;PAĵC5_rřHo 0_Js~*[G!-//Lo?VUUBn=cK&'''}M!AF @:;[v1BAVmr@ juHH7ILLj4h IsΥ# ?s666??=SE.269_Brae)Ѕ lnHx3}CDXBZh %pa ^Op_>occ:p }hAlp6ز^ߦXC[)}_V>5aq~2=8EФg=}-,֏avL@[@o`y}c ܬCj 4c!ڿє3E=6"һ Laq[c=WZ^sEoE'U?pfweeoF~ zTSiׇJR}WX9p?.?VF\뵃h7ջ0;Hx뇉?3z~^/3!zk5r׃Pt{\';}y=8I+nhJ?9 &z{RQ5~&?ᗙ `Z ͍^mVJ}Fo/CD'p~E~5O>~H^> =.  k0O<_wSaѻz{#=S̐ޯ1Eթ_=EY职ޟ(܈0vOv,oGQ[9*gj=`>ss?b5Ku̓άF$=400`P qzhJӗk~D^^6@0v_z8G5igCַ=S54}o MV'7|LQ/(yT㾷ā8йNr*-ԣ$zg GSq*b#-V\h\# f܂6Gi\'swIMB3xʜg>J`Ghop>փ'k*tRvy=(Y\_ sO=5z DZӚ9P[Ӄa,-~^Q[Vzk&i}aJwnW_95^#X/f /;F'/ .hRk;-IENDB`pillow-2.3.0/Tests/images/tiff_adobe_deflate.tif0000644000175000001440000114461412257506326020541 0ustar dokousersII*vNBv$(1,2H=M\I\isH 6\L< ' 'Adobe Photoshop CS Windows2013:07:01 13:44:41 2013-07-01T13:44:41+04:00 2013-07-01T13:44:41+04:00 2013-07-01T13:44:41+04:00 Adobe Photoshop CS Windows uuid:511dc7d2-e232-11e2-9c78-996f56a7d61a adobe:docid:photoshop:511dc7d1-e232-11e2-9c78-996f56a7d61a adobe:docid:photoshop:511dc7d5-e232-11e2-9c78-996f56a7d61a image/tiff 8BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIM7v6vnullboundsObjcRct1Top longLeftlongBtomlongvRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongvRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM whJFIFHH Adobe_CMAdobed            w"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$IJI$Skp.X^ ;fۚүԭ쥎чU?豴I%A+fV>ښ~^OCkhm۫:=_S L.M-= _kzT4=?QEWcL8?ѭz]asC,!=oJXͶ9ESkk۟U'c ;M?5ϯ'c x=\72HH1M`2U2WX.k6dk=Z)U_Xͫ;gVf^^U!PӲ\ڪo}?[W1>^He-{?ycM;mg1vOQgG`j-iTwOoj1 赢_N׵] wvvML4cjdEq6Q]ko0+|'bJO^Qqc^Ht7S7T ?R?WX?U ^Y%3K'VY`QKaZDM@i/GA͹?dj_P>"l@qi5,Ep\nqkm{SoM>݌ڻ.ʝq\Sd2$8+ 9c8LkRQWw׋5l{=,׹ޟZ`ki;X$.s8r>?Ay:~v#1xl1"l+WsUzn`kDnsXʿG]Kɋuͻw8=?G?Uem}LbpBsV=_7O1k-8]}&I+G(lHi{c!tQ&fGZNfH-ncZ9o?-OJ'ROlI;_SktV1ˁkx+Js(@Tcap1k$pXZA1Ye"lCbisǞRTV]X眅ӧv7[ \|Q t=;-If5&-/h#D?ը.e5'sjsgt?J`Ie{Yw.إ1 85*'Ož)\/.q&KW{=o*&>^6Kߌ̲˫pI{\Y_o}ݐ׎l5mm7 gh`Y+P^C x|Ub[UKu ?$A\D0lj"TgTKn r ?rH{^+cA0*ccQc]k BwA 8lh0=u qfU}nhm{CI>A@A VMXNgSוu(e^lɫ?˭Bzf/S?Z˩N~369pokozEUSg_3}P<=6Gvzֲ>=R/,ݑPݴ?o5;jsY{vC A/m=~_ `hm ˜!;wvbkc"$Cvu_䩙!-6.gK~Ou | 1UX@ &s^4۫[W?O@ZGc1ww2InrHZ'GӋ1SZ!约1S˫hg" P+,Ԫqx{"VP`̛roE²zR繍$=4uf?yZڙ?P'@X GG=7N-16K0hmib_{[Ugޗ{ٗYoX`'VG i4d$u|0XޏXcrvԫ _:ykz1sΩ DW6:&ó(4*!YbƱ`vUfYZcLC!~7Qz覇Z*-}C u=e9-~7Iԡ_twqqWuԐ4}oӭz WB櫪Ͷ>vZf#v}/ޝqiIWr?WI-{W/k8h1]%Vtؕn|` .r>)Ɨꅺʪ/1) oxw88+}ueMxн $w;vg6Cۈp`/K' ,61^,kK*X}oJ;&,XM]7kClm/ZCigIK[OF0 )c=g@MVfyȡ)mS_MS j^7]bm6W#zM,˥83kIWcP.cFcl~Y=B JoeսsEwo*߲5#i8y3>A"4ۏ&7h͟>JlUAmm#2cd7[Ov&$5f[[.\;+cM~ͯYX6kUժDUw]'D޼|O" ''vCH⅔JɵZl2N{Z*C'kT*osw-dl{wo(r;2C]O^/֊Fms[[^V;V%Z9c@轶+5a,P"?tv^^9to~@5#6nԘM&f<2:y䰉k{Y?x[a-i+;ӥ[ޱ>%WmX8,;پgn,ʯ(\vnwm =}=K]dzgS:?߸~n?Kqz jb;'#0bݾvYggOvVv`'mnc1V6[,%U2s, 1Ύ}:$T"\ṑ![{n`>ȟܡɗyH1$x^ն$ijoa-u`YiG?{5즋#!3Aﰺhu減CmZvj)最,k6!'}u>Vchs 1 `(G%liLXkg_`̿!ͿqOk;ãʵVxZMQU6eD>;: ssehdw'zۗ0PZ]ޞǵT_k:'kXY`oZkwBvz^ qciy$ׯ?+ kZ\v5X pB?9J?ܫcun6iulWgbz_k -;fƍzO' س6f6srClp5u=~]_gJV?<>ԫd6.uWM⺟N_vǷ^7*tw7Kx?KoR3?g4 Ϻ o﮺~mOfCҫR3p3[/p>]s*-k㽻=WԷ+6~*k k-6> 1m寏PѾ }#?G81ޤ4kC#=g=Z-uh0fQ?޲3e!a"4`ׅV־ٗVח5e˷%[ew\jh ]pϹ^eU]qh{~ֳ3ܵȧ[}L,sBѷs!WjMqZC[!w{]ҰFmmF\- >sYz^>kĴ9XtaH{]Ŵq_cT~%?.?N=-{HxY+Et6eoȭΥwCj՟a܊o߄OZd>?h;YMƼd3|=̳i'=&(=?!uGsAenu 7nlTqZ_pe}e[W+ t+Jx} _"} U{. ~ԯB9C?$_bЧUc?msѩiuIsb!v=9G"i>~jVNF9bYckX#@2DBŝzRDc#gFFc{hmsgZ6U͆ 8 fCՏ=2\TX,`; ^0Cd5mw_XVBbO_H"q 8VYSkĮAn m4ձ,e{k;ZZ`?i!6?D}?Ms`a~}Z+iC5k@UI$$v'z[}"[$WfҰOcA3lM>7h~3Aok!sZ/n6=wsv{D\_?ӧ^6=%ϩ5+s ??c7# BǪu5gӯG#{1hPE[X^ik\ְkzo&= fsqd^c }'?7Ҷ?GeoVq/)uɋG%L_5?ӯGrdC_U32na׌EkC #kkkv{+~Z %w?j8BIM!SAdobe PhotoshopAdobe Photoshop CS HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmHWoG?gvuH8 ҪU%*Vm @ IDVB*}@B"DTQHAMHS&Nvl'3;{m@wlgsgZ==g.Af3b9Z2Ef T(LY%v"CdDE,AU e`'? T=3,2#U2"B#|APhGg˹1]~ R˔ ~Y 7lL#sL5.3J֒K1wy #VtҼ]XlǴgޜ\^X2u WZjYJkp6+WaoUX}:Q|ʛ?t7z_c~Z:B?˥Rp`h"QMmNPagq$-2-rLaC3m;JqWݿ=@A#KhP&_50; CdHq{06/ץJ$O2x9!Z߬1 56 iJu*Le}ό́o7~_Xo9돰HQ%(C=Z&";pEBO0&:R!qQkG]8E@ zHXv5 f*Pa]Ee}Gşȷ]w?:ś'GTYY=xfj P֤!ddl@,63jc""+yx;Twoħ K3 iRGDqZYjl}xemԽJ0r{ #58*gl(uHCGz/RwVΝ*aJCX YF5N_+ 0t$Ǩ2*qF$>ߝRA^!BDaK h2ȭI.0 ~̑~(qxPM(?\BFH>L> WY(9N9f9#H=4AXY$,^+5+{$ FQH 1I/[o7JAEOk?w'AcZ/APBxJ~ |D%Y 6Et8!D.\FnfG9(!c'EI鮰.O02rejLP^4OZ+(PM/l!ȺG_#mS--Y(cOמK/<:zrDK"Dا𩄖l}E )جQ ~Skxx[Q5##.)gމ|Z,0, İ/=NEA6(:g@Tن$tBmSOk<=3yha跢EA–",B})S@0.yc'f>8],u|t5 BĘOӪz}jP=usA?5F?7v?S Ifvzzxuv'F}Wŗ_$*.ƒ(E Y[ wk7pȺ{= <[]~֭[oqg{`I.6OJn #*12qs<Qz(++2Xr?a_jK.}zu;˗gN{{c}K".yr╃q !hlqR@D>ɹM^jCvc(˥n ܸehxQ? iF?zC;>uo 2e*OJኃ "DF}HS" (Ћ7Uꃄ "Q#G1=4kصm;v_ .h}Ҟ'_yAFЫoA 5A 1|Mdm 0yDUl񉑑orơV+gD@⃙sgϝ+MA42Ry<6o>Heђ(dM/eBHȈ!k(!61k-]̿~;ݾy;(O!}|}ثNŁ;Qɸv* e*+!v&Uu&뎻oqcyZmuisѳ'Nd6mj%FTmiM~f;ōcZ刌9ÙřW?ŁaIBA3\98;?0 ՆVeS7I0銜rajяEĻgeUvD:nUK* [UD i#•?مTR짵JyO!(c֫k>)5Sjˎ%}a:F!2I(=VT^*XM?4q(1I$IR$5/Ǐ4ơ(PD< QUbBoV'qp'j=I򾚞~rAR9 jĀ؁m$޽aݚ rX<0WA Y,oB7_O y$h4Ruz6} =p/}ƵlJ^R'ەMN[H{M"P0"؝+#Io\/k9HeF% u?M"b<OMf1[DU IFl{vJAF$)+EЙ^QRUDY ZixFӓ}fD뛟||V)StTcA7Fa=t@'b94 jj0fE6gpP P&ٲ~g(cB7'*"M `O%o}EfA\M# ~[&0u':$3>h*DX P7Dxp*)jlhhXɇN1}#A7`{|zrCɢLkڲ[a]+D3_V l/wG T$WUHA`@2⁩pc.ӳš'9ڔ+0Ku 9˖Y Zj߁omM}|Pز`@x3wL7!C0YcHTMYl'&6g+$S'h޶l6c.f'?IZVaZH1 S|e]0 ޲w(A33V\f3}3K]-DLJ~WՀ5SC?>¯@ `/?JF*X@ 01.[l׮]***N̸݇ [JHdpM=AFbfY8H*o[\4g2N*{{ep +˜`F؂pHLCUI^6%uddfH64g'Nnw-iǙٳZ{E%ee,!A8z7)A>?hGsCju҃\p"F([ "ɷ4"jcVKLx R-,,^6,jl''bPbt̷tq2@48W`%B(H19O{'m}@%5-|Kl\NNQX1K=lctAw ?`*컵da~mP8sKbq99b6C6Ԫ +vaXf@(<*7D,D%ɖi=rx9ElC{߽'<-p ' u^A0(U1 bhA?DdzGuԃ|1\2,e E!hAw6B|(8QuH4fr(X%Xe& VDPHL> iюgh]8眿(Ú<í??vhx[O. h;&Tx"bf˲Y-C(F-/ʎlբIBAw%i#A!QA<こ.u-Xө!bv};/b5qER^mXl}jAO\􎎏i: mYej]RQ Bdp ⹌ Q>%>jRP"Dhr͵I8M_J2C45[5=]=|r0 [[+#x$ ,_ +GzFJu޻KW?Gĩ mdT 2 8p;+i!@ dcÐ@"#CU&8c;e0NW '*1TJp%! C0YIBJ{hggv&_w!}ښͶ{5k!’$xTGO 31ICs"^:1Ooa&giL}ʃ*7o@PuTa jk+AC4ʑuvxJ.Є9_%zSxkm *SΌc"@DQbX1|XqtEO6 lšH t/jݦݿ_P{uz`(dYnu>2aQFy)YѠnRTitbp/7|LŹm-$?dWJoU(K& /]#Ge\N'0$pKh?xJLژhMBPG`07Uu}eVSv:CXe9r]Ftw P_?ܘbPH NX8("z3B~喎1,U%AѠt,+4WӂMp{Cm4YR3Xje uAXg-W.X@#G~8sjȀe޸nkPfjp?>pUpE ̚d՝9QGj1D:r+gҗdE+pвIX ~[U#|("-/$ݓ4C8rQ@hL7 G C\ٸgNv1#]Lc9Fp.A AI7"D2H"-n`*@p[NAo*MF#VQcc݃zW {]Ƃeraw/)+\4D2Hl@ -Y:~x4]+,;O滗O6굆Tݞ,^h/-\h͓_<=ٰw]^P~xb5F]|~>0ESOE9PA`ӿ3 AC"~6DtfG,4(ALF&dzVLBFnxHQjemkW_s<fYၶ~5<d.!#B9Ѭue=bՈC̷ _|WeSk?p?'+q(2R83Û]).rBti$ATIGe1f}C$"GW$ bh)@q,' B HC 'JD#MCUSP^@  z?)=w^kQ{͍u5;ȣbO윆in )*yTYidYqī罡ߵ3jV7_{B|~=={<&~c*1#1n$G4= Ez9" w~shc><7 cgF#Q/9&c d$hAb.&!bOpQ)?tb.iIœT!JQ%3GoڬsjOw" T`k%O_7iŽC.IP\Gv^vФeeʅ4(L2&sߺ}/{ MB)1T%X A%hfq>gKN B{K_$4DE,ȁJ{ǘiRl^0;!9ݿݶ;,Rrfё=UpIkw BtDPQ&І"`0 +k_: e)78vdL1FMw(/|ɖٗ<ܓIĮmr#;9u<}Ø*R =]m 2-UcQZr&)uՕ)Z@+d8'dIhڏ d2 BHx֕5#3e 1cM'_$hc-1=@P)\{{ً7GcƆ&$~јfu@tѡ~b^=ov_WBѴ0{931B=7PJEBsYMscqG,|f63fMr靗$)vl*_id~I i}.hTdz?$q6&Q>I"๬xg?izzt-8C#}8Kr^/<*86+=`#4tU'6j"I`bB(+D XI "' v>N){gQRDt߀8[Q?$:⨄TnBsq5y!Qw`˅܅aOO+% T|vWֲƒ+BG4}Zi,4ՖO 3QG AB1#|XO^Xl/%!x|OQM(Z?0@Kś I?_BHA?OL O˱ھ $E(9|wOH 8jLDHeJ'ֺm_X?SeM0 6f;2 tzi[5F%%qp"əp1H.P %C0ꉮ)%ԟ2hehgbi co(|Q>/-;{nܤ1)us +k;,q&6q.ZCK?UGcRz\+gՂCY5ՕřeL&gG@4M7Ǫؤ)=`e(d ta@H2a-D3F Pi4?($N b"3$&ύ>~ p!z<Af<̫ueja+A椌_ hhkeRO00 !(,C($'|/E0`!Ȍj*Ű9fu;^e4:ܞ!î9EXVцVh\3$)\^`vQ[֦Չ/[Qk^F@4'%|4QLw, kxU2lDpXb Z O@p ]4oAH$)7 E[,HwpptC;HEc<所k_ 7]d/[К-WO (pA"dvukҒ9s"x $g[emlj9Y|Qv\XTXdhcpY YmbnݎW;nʽ%\ jG~WkIysաdO>ڶwEfPEgk 10+o>]օo]4Ł"0^ƿSb&H,"bԩr$YfoBSW75zWZk޾v"oOWX:P6whYݫӴ&MRBp$17yPPzj\hd`xW 8=[`~3guC_!@@PmJW~D(iCO|n=l)>el a'j/G:=PbRn{'4 { K"WRa~b۫}D/{eG׉bx >qtj(E*6 }XX9J>qv ONyOػ7kR\sxxd&Tq;Hnp\g"YA2:SF?ڻc1T܀0^D.*P ֮ H,~7۷,~w}K{'TW;Rb(ƷeSS/^3ǚyS0(E)ol9bR|iOd 8ήPT`>pǝV6dQ`ʕ Xzik,iW̺Ȇ*J$`cЊ2 d:yV:kUstRV *3J $tg<&pZ%ws.=똵 |D Sg }YK1V\dm <\ГVp1qY1cB&h|9 )3L:m|.- H}}-/pTs͚6q#KVhb裸࿷ ka~YKzJ҇ <6g3*sTEמ= c#)!C )M+9Etv"͙ 'E).˕#Oi"hTC43MNs_#&hBD]JɊWjGV$T!yjoZy=|UD,=$(&h8#= XZLbsSL߲>(&hSAg;(ڍSmmƍ mx0ۼ# ,(pg/^ b<032ERS$!`şr/INfD7Hs–Cb.Kȅ5.c\$#TD|A@DpN *`XcΗ2B?X/y@%eH2;#10  (ɘa^ +%p,'G=12 úӽDкC#_^¬AYc2R;S S/Bߓ&ga`, `!׌ʛ(V'IjAX܌ߟDi,EFQ$+ 9 BE9(\F1 i(\`Nl3+,X@KT@Vc7 <ԑ@t4"ăK^r)&]Wu ST!QAС6{B |X*&|Ș䈵;'N.f1*Z+a0ٛc7n 诬-6k$Tqx;AmLqD] {~# o 3dC Q8R| NY,{= 99T[.$h=.͋æ3,WkUWs{BB,USBֿ&m2GlbIMSMV:Ciq 1 Fs9gZN'#N1̜~e#it4a"`)EȱB fiqI*AtHR`Co: ʲɔߴ|$TQ:c9C!jDE$*Rc%:LK0 8Aqd -u2~g̏AGe4hd-7]~P7 eEeiMWmf}$HR$DK#l/S|Z b;HD SDYZ;J(DP\ R.1>5i*" !eRHL4󰎥򖆊҅2tĒX\YOQ )ew&Vu  G'Wl 8Q&qakɛ9:FijaQ@BDj9>!-_G V\ 8/³{f]{2h,쾹o n\we{_H4#ox8F ӗ~lgk;}o| ĀB,P=ݽS7UTzJUѿ E (ꀌ3˥˃/,(ja|@2Lj%=c c)̑E ,'%|" VPTE@Bv'S')5s1`X a GTtq VV B,+ufӑ؁:ZKfyj}?n1(6=Ⱥ}ż|剉3cwc<8ޏw&ڴGO.](ލ(l'iO70=+WW6߽V*ɑ1uk״81ww߮m} ^:5|bA@ 0o9<)@^/P$8 0!/rM#򲞠SM>w9P45I֒`FxVʹa ,i`ⓨPT32e}Mikd%#SEL/!FdENQFk,,]As8!X4걦#5$o(*P/X>Ҋ W Ao \>>wﻇA/A2n8àπAŹuΟtU[Ưԧ{\_ %mՊ?td=5)pAW1 屷;MyzYzkoK{׍p^]K۾ K0 *JӹBY jN}ޔp&2MJAh&":@?R8 mH6]Yk8|Bd UhB*;Cx4s Y#x@@LUQjP~T H`<ȩd I(VCq%{PmMCH4m<-aTfwcKz.'`)- X:4hx߹:?H09*e9קtkvXe"n' QëdxDJ%GLΪYeDfQJЗ E2"5:-C~J7< 2 rׅ$ BI0 y Dl}7,سk&"kfjl[7PvDBiM56k(3 pbE\)z,l2zE)ЬѠܗ&~P[Y9BCnjd eάdgX:: k#N#_<jF廉B>V[H"2KR\aA4f( &vNE#<5`35 e w%GO,|4p/%?hXXNg7^~0hX\tsε %o} UAhOۣ"O~hÚ6{Ws޺ ڱIdT5?/ PB"U.H:hIcRM*Иh,;&@biCb[)x/xK$2\FJaf(sk3Ԇ ѝə}gu`mЪ S@ $2W^ȶBXt "yLFhٌ fcSM]iv)Qb>P:TD\xLL]Us "Ƙ&-x2 > B+*7 ]S8Lefh1tgHF<"gBl(R|7^MSKx=}j"?^xa/wNjq;:&iܷ63'׮\f׭잫ޚߺǧQ1mE`S h6xm"S:=DGfBW)U٢s>fc L)ӔGLrp9d-C-3N:"vUB,P pLzF%xLbQƥې덥q4TLZqTMVF)5 ?b,d=֪ٔ :Fx{.tWkv#ٿ/ڳK{./_Fm@F;"bl1vp5Z,jˣf6 A%㇖)oHs*I.sl GPAnm(dh'JJːvO+ 3GhU QϫtQrB`,IO-,b%.NghgeҰ\ϋ5ݯ`R* YIlHnD[`wxU΀QUQ#DXP `˳&/aTr*3t7_FJM-b+KM} Fk|•=&6@ǭ R <:.0ꟛ|cu/W~~S.={Gy{QY@Kͨ3Ӟy}2-2S  p෧.5cH qSeY8m$7v %IZjvf|@Qd_( 4SUŭ(ʔp+FL S,z o=Ƀ\T} 82Y#yl:AvZb = mLZ#HUikwBswl=~f ?_g|wsս?7=}  z@G)@ܢ" k vØg BT!J:N, X)>@vbZ{ 4!TjGb@qFd68$*U?sejڹsP3_'w(/7n+zXu$oWB⏴Q47*+f,4a YAS!xG|,,ھ]Ǐگ$!7>H>{ ; Z>D(Vx-4ydk&wJOw|2;+?پgw?40pb1x=2/g6&ޟlGa2BTV9bƋeqq؁)vi5zGBVՌ}Y`UfbO'&RGJD71+]t2Z\*IfM)Cj;8dsaa a )܁Y,c u&B D\t VWq"3̂`IksJA0,. Z4k^*CR!6s~/ HtF|'nްmY&A4n8۸|e  A h4My9>3&ēOn{lL&3[ 6V^ (`\{ hKؒ)#=  h,bĐ,+'dރbQz ,\!uC5cM(PjJLsgX(4 Uxp E,Y|ȜuFX>xbUTeF6K8$mŤr2u$U)J)2DUf*]awj- .+UNUo)y0P&oc&袸K_A~Ciâry~BKiᬭv&t1~ ;>x|A:wsC#ǖ.W3%x'<}# uU\Oԓ)I"$ 0 |* Dx0rК,Ti }7θFK\дdm&ư3`Z\I* sXJu~84/CI8LR% LW0B8qH@ܰYYiox>jP*r)؀P8GicteY(0206/>},$:~%6O)ƅtog: u )k{{5EAO*@uSxIE9െiD X4`bB߮& .RC0H*c4HҦ]^h̎ls'Dj{KYNZe] )n!%^"t[(+.i1cSt2xE(_4JFqhmnJuO_YMgɱڒH(vA} }p<ͻ@`'ү%~> )7sts!֝éWoTvʵ Z[~$Kƒ.ITn4B mk^ooA_^s/ dGqB=B8 r5*L("HbUhR5BTk=A&h fe>-жϺ8w ) ;h;gDA A9XE38Yݧ#2 Dg}(JC.L3B0;MFnHFC |2_)K"jm=-4nBy: mv1iLj2U̬])ΖX$׀W71 ѯTz%VA`Չ`KatܨgM )Ɋ%;ۏ<AlO{όK ˷&nw ~lCrrN ,I>#h^o5HYACd\[RtWd_%8MG#w 857Trv7>V zlLC9z{a "-]7Vow*U#cݟ> h~ƌ8XQ[T8mЉ:+#WaVvMBmKJeUS2veLD2(iL+#`hK)j1ؓdm`p]ppT,]9#z L<O)Y7!lH&io¹$PtA4`tWΨ4`khsX*ճ{AϜx񧌂y&{/~쮥+ކڃοʃر|@>H=gR\Q+TP5QUDшP(; ]Xà ~0v<4D]̡sE-]4nLK)q*(}d#IXBkƶص<:i<8Ħ% !ơNИQp]۰|޲`)v >x#ΊQfC 8+SfbO[Tg$ZfUfJ56{g}/퟾yϿL{5mAwd$]ӶR 6&W5`\4WSBS;4LF:tȍˆQD.ر]Z>w/-Įk>T:"4EVJ")V'Cb'Y_4"KFii+6d}kBEJm^aH-DVjsN3։4̈́$;!9sf_c =EpB&vH.m 8JF$1@f#3G:65; 1`Lbi%)b&]u[X 7CdP0$<9miQ"ш9{qdYZ9q)xpܛ<2tΝ7z'k9K{vw֟Xzdzua~˱zK6wg)hZtu'O G3(iqB'9E.9xRAfV<T| |ҋm};`nx%p/4 jzMqJ|Cnm~O)ڒ^?v69ckM{q 2/鋡ʀ9rT0S3a5 o!Kmu*;gmdJ5+4ћMlßh2rw,QeSlu8B(QV!Œ(A;'q :theup~̉{\!ϯ.\+m---mܼ͔D9,md7 ׵-lu(Iz74JqT hjF~"Jd`0$*.{ PćSS~lziX(8Dw hU,"[1߭]D kW)wm*%d)'5fJƓ8WS31pvJTC]=X QxiT qcEI#w ¨RYUnΑ68_gxÎݷ\RR1~}^Fbx|ls[Ae!?MG/ݱ0O32fF--EwIgujۉlۯ>]İ8 ]F!ی3B{p֒H|cy4D?bo4 GmWp7 C>BD/6҃^6NLe;ʫTeB5]:p&9P`'o-'ZKU7VJ䃠 4420dG$5JL"nщ(b?nDqr>_ROY fcL{߆~4]ZZ\TXd;S|\~GWl^'A{qGp84o􍟏]bn۽K|zLu?`Biy.Eeι#P`e%$%W!EȄ]:FmͳUSIj׸o vJնUIRE;Ƶa57U7WDn(S lRS zMyeSmaLF,*\m\Nka -i4R$R&,cM,zME ]v񔠏ϟ /Ѕ[ +ћ+q{& #h {oq+4-~n3nۯQUb=z'l_FyA݀삲 ZL1TmTJCx-G>YQRe"O\+dz:FKL sdi M-gEFN`!UcP&&nX*"Ң53ZɆ.vrK|ЖzA’ϓ,&L3fy_ɭϥ%n]S+^90¿A%=OwCk߹,*!W~a_s;z2HtD'!EGo@nN[}BfQ S.2g9r$4 31**EōQepa<A6X W5+U[:>;Y%뷊Mt8lC&XWEl+Z]Y W'{]m⻚8iF>ל8䚅WFXKr5i:ȶ5}K܉!ti6C9zϜ-UDM-;O-)x[RZ.AT4Ō\45uJdQMoM\[Rjj8d>YYNAKf+ CC&31Pʮe#$tl)|Ӓ\ ɠ64CFfT\O[>FЫG9AG8A YÞ[Sڎij!uP.deC0ix Q%ȗ6,xLmTU(zwܢ|AA޸jAG8AzEy{jR8 1Qb+}awU$>pV ZQp%auA:]S-EE@)6Rs`+ [ӋPsQi!JZ2(פ>B>"XX"4 u4̠> * YWe+扞BN[x !h߶xه@v}~qeLkh9KvmZcj{ʜ~M+9kU]4uA dYbemc{e5}D6q>2z) yoFάT''y^ZC C%7/ JVRxctƸ} ?eSZWͲ$M-Cf}Io`fbz#ࣀ'E5=8Tb9p4.R Ifc~#kFʙ-۲0v\G$%{jc^"%Vc`g,]|&-{ޟl>1@{۽/-+fm ٱvmؽy5ǁ,y;_/~}l˜s?8?^s^ֹ}MxdNmyի[3Ԥ!ҲtE! GK`*+TkzEXwb՟Z-|sГD@ }jB f$XWTp ;H+˪p#]r9=%+'CZhYef{x@ Xo\ŏ-Rl*H;Y[bs_YwnKofa cݔL(ŐX[$2I%[0 ]?ftL(d6۠\i K m{.9~ ]Li{<9BL:"BB$("YEc8M(cjx:tʔ9h A?W4h:9"v{E8Y0i󶑻#>y[}nDІ~A8A˷|]8w۸;L{r&A#jzoH~¢Q4 0x(a|LjBE (Xb(?Lʑ(煑sEXb{yQ Ai$ @Ե$0؅!AJb5eMoh<#:Cg$=n@Lv)%" b֑}/H)b'Y)p"Y~/8\jeA@ױ]jmZs&8K!wdd, Z?g=ֹCЊѿ~9Htm?xI'ִc>֫'^mó/[;gνC׮%1)Vvs{>Oo\xZٞ(ڹ뽎KAP=r(#{[[Gz;~Ԓ&^ Q`3, F|‘(߂MB咐#|G]+LRǕFNP*BZ(aQ cAπ"r2B£/-oiZhHz%VMqMCePFAĮi|(95 -lF& /D;#c"O+d*h/,C^0g`Z>-ae:RFqK㕹xdkZ[˗{.M{YA sݬ7Mk\IXeAbuk ΰC;Ou\rĮ_\:%g~#Ewt&_:-ӍGkgw=Lk Nica (OT(Ka`6B{_SM2% 8z\;@ )3jF8Q T"-C~$xF!r:|8ǡ9eJJ!$ 4($7˼"6Q ®arBJՏ놐>J5ݥ<<E /o_in/5h~*Rku\w+_4]xۏ=Td?4`)δc|MUUŠ斾c3[G_y͝?w˰Gqrm&]uՁ7Р=m,Y.Q:$ -:F“,%"*B#\衹<1Eo!bAi'ZecGlaqYKdM>S}2&x 3D ʽT\hR0SP@r]+K$/Ml)W̆n39e2++EUp~bH: wTd.c%PacRJg(MA|\$(v_&5^2t%#l^`&P)RQ:"`L,k/wϽfh Şx_xiS.\媯>-$s/DRV2 Uj6S6ȫ6egҌQlOT3T('&V0ArP,B&V3G+,*Q?NXQ@)gtBP[(\$ y)d2UH)z-#͢ fl$1c C Kzz/ )@X$$ xT҆'nz%t7&տ}_&P#kw{r-Z](3u#joԂ7"mM,ԅ8locɏOxc&N}߾6GwNԩ_;|#d}3_kʤ|!@-ϟ\v҅u׳T=EBkA e- y(;J Wr=Ք?\ -eEƍq*~268#$"5#lQI hLƂ̬YSlBEbpA㧃bg|DВJ'0ܘq(E]Yh|8s+}Ua|]N@+J!)zAX<䣢PiM4XĘ$c4\h(Ͼ[CpvcDv̙}{F .JP:9jVYNMa՘:Iׯx8E[aU%+0q[+mmǽ"hLR}9<$9~l _j.8蹉GOON.sb׾p[GDZx||)2hD)(̔ Ѽm K}AZ#7hԖS JSpP"rQ!2QizS™άT]GP)ԅrMѼ0Sщj+Fo*h]:sdPWԨuZ6DY(Rc`Ɓ",A>@FƤ6BȚAo溾1m++aQ4q<~pۃ~ޘc!^t];f o^~ݻSf"~yg* cӯE{nW?ok?K/Z j_mKÙVLN||Ilx4ӗʬgb@nE0TW lf-D7/RQa2DWLum3?HY1'RE[B)cURj*P#N$tE&RKaNVPbR'#昦kȷS&''-t+\ug< B_JQUOS4m;cMs2A?֌+{G_^~cY+p"~% #jW _?민D42.(kQ .ԉ R *tEћxWfD0$ǭҝ 4ecy] b%;5,Pjs=IJC@wmZFGH06)<+O1C XG 3tH*i1)=fpܜxT0 yXp>E0E^V:Ew(Ȑ]*0dk&MKilF|ʘ]S~rހ؄ xyf}|l9x|t*2;=;7[urKvfhzfzV׿xg]vFmZm/؊17*hid+2v%{_2iy4ʔA]ʅ E!RZ .H©iɧ4,Uf/6mϚMm UkJ- 6S[XNC"&rO|">+Zы/:.ܫڷ߽xm`e+q{h zL"x 0Q ^?#@LSٖnbF\TC% `jƷ4g#-SL_%N[I) JDS,BUQoJ\jrDL',(KxUzLY̗cM!&L $lݸo(y#O_-~{kJqIKVuUDnrͨK-SQ#%Ԍ0 ڲ Pxҹ+[)oE/r" #`}KUgLG$(b]\≀Cɳ{32C!W߅^K]ԡl+掇v¾?}\w&֎̹- (ĭ Zq!ĀDW­&RQPR XZ@4@$PJhbrw`N93gf(ի{\z'oKTҶS|fCösn_G:KAP՚BZHf 3WcPx; ab/5@Hs.#}QF WBYY]ILaX lzO O2b(Bli_%j<ɟ_d3 ٖI1) SXLqp\GBH\O v9.#UJW C]]Y~LAb΂чAO)|Iq"Ƌgon6%=}nZ[/snw)]bFߠ8q:RHZwzp$S#YYw[ё~YHBYHeThoy{g5˖dF6v1m;s: 3LpNzNh1@2D2vT"]Cʽ4Z{v-Ypw xANW_5 }1U=¬`Ala&b^s><\u+om>wMW=Iv۹V_wzE,Iyݝƺ߽0Å]I( ]_ VVc0U:dț $*HKX'ʲ5F8lŠ+Y 'Wh^[7|tY {a[tnUxļgQ <-f\{I܁ V2<5[, &JMy侖ۏY8^SBoӹ=~O>t-rxЭ V|ɛku!oQ3d.:UCO\..R2,uP`+|^qsMoGf#Of*y#ݛk2y32?4gy`"[V> ̓3dj +ɐW?tl2*%&fa$@Λ3j(k#YRTuq3x4b$cUA IJ|Lj3X7UZBj-|'z͹aܘ%PXVCļDmK}\'v xqҡQGztv2Cq~֑p 7GAǎLu9_닯~q%oo)᣻\>$f@qf!KIզM=ʧL/sR0v2K8|wJC&2&My3sBKec(f#[yT| D@sڵypB":kT*Ğ (me7bp8'Eaѻf*E| 5\)Ub SA s W:|"hwy97^>[V#h1T2 !ɨYlD@Y0]א-C F1*T7t2,[a8#鍌ڄj -&Q 8r*&J֮YM`V֧Ωa|k2.4#%T.>-KpC Mck(vf2L/c>@\VY?4g""Hcfuzwk7|}\/zދ7K}{lin߼Ab˵cl5!ELB,h@rꪣܾB/BtԂ4K >شIIiR4EMԧmL6_ll-'`郁0)D2Fa朳&v^@{f=v:#1yhm}r(\CD_Ј32Wg2m+'i|#g;t1p]9#؎9lδ3^4f,NF*PpFi3!QM V) Rnjl#8N 56-kL,KڢEqaFۺPƄeP{#Ivbt۟Oo?K+3?.ֶ=Ome˾iQRd>L9n*NϽMSV%.+tA˧wm"$rHMI%l8մuC<|u<4e^n)6/ ,RסS?\H40<$Kn.dIWTudP B`a!-iR! +dPYD" a+"WZK);w>*,m0gG[ՠ^ }v>pk֭P7Xnɢ#o?ub!rn_47wxw0;7J4ݹYW^AAE5̃\ScSW"imdRwW⯏{!8ȋˠnCo][ѹ?Z sϽMS[ 5DhSʐ -.瀌 kSYIb#0\Y@ZSCukP ah-ĄI#pqJh4-7L"}QdWR+b+7^ DT}M7!|uy$kDv;^K%[w,CpYT78/7 @C{\UV)X.=yjîA>=ŪQ V~sA7\3';6vczyUl0+pч={;D[sכKN|ŷ,Yv1f߇^q"r,>8bm/{>w;'{:6MuZ,J":y(a^Z"1X¼̈́ >viʁt;/S 0zb2bGfwys ڹh_c'=6wx4Ԁ0{{>[kLttۻX3{7OFGu9 bëo]ePϽMS觾&ole *2D zQͣwٙ"U^9w@ M'lxjJqN$NŨJ[%" |DPЀDFdS$mM*:+z#$P^ dM5V-[t$aHMqKx"j*lz7b ii+7X.x"ls3Y誤ACǟ8ԫ[bE/7 g5/:}IR&jTA_2yA$hf">$ }h)ƤC IH0Vb?P5L$DLkI2-S~ssfspovr&sg.>7vgAN̝Aq3 !'~9}=l=!slc~1?sr D=h1O?8 k_5cf,lr+.ڇ Irln§a}~E=g4y=eZ~8x&BQd6e”g4I)€cD}UJ2bi/b1gLB JЍ (; K.GjT􊺾ؚ;u{ U&X72:N*`Ih eZ"Q|UT(|UJƈUFS#.\`ikS~xG>OF,W0;ν?Ao%5=)SnQ[b;3k-tW7fqzWlfSWur?LV!;9m㗺GW__>u;5w/?Mt-u\6al&аsUE,-20ho$.SjF0AFj% idQ@ xk0&9uQC]DIdc_S*AM]r.R\6.bhJ5(M7gȤM)qm/tdn().KW BRo@id\L=<%&a̽ {)MMOQclġ R)DsVUǕb?k$lU f'ԽN=#_tm-SjEoy8h:.m9>8mٯglXR 4gzKtk;VК߽7~no'z6'F,,2q PHS?@) UΊ +$ Z}u\J`BrK  ucO2٢t䍣 ~FfUah0Sy|2FrB93caJd<ѺR.OT؁Eg?*ƽi~|Xtf|ǂھmm:s97i-'p;6er? H}!tS!BxRƃL|f8T#EAB4à"aڜ)/4J8 .9wR T!LH:[)*K.##/TGtES):5꘭kBI6L`d4S%#+!`]w]+ACi?Jzdd"zmUvbf/}9$ {ھ}ԓYB {%r0H!6 )  Y=+<}hS]mvM~m4Ǯp1^t+\#ֶۯ\ic .4sC1r)"?|AI3P 向~UQy\0~ؖF8!M_EQCD41A'&`-Vi6L~By%m FmSsw{/Y~+1EӚ D'+ 8lCQnHS"ycC^63ŀOθӪrtJ{I,j{ͫz&qE\9l5jKFm̅Z^)tÙ<'EGLNEAtZ{6XBëg.uҭKA:ܫ`]}?l?|2nZB0{1;l5 Lu5&viEc:97n+)-҉%DL{ۭ}N6-06g4WY{bc2W 秥rłgVpX@i9"Lg̈EyelNk)1#{:\JFGf(lzc0^5lupɸ+YePvM|65Qx³bm!J/Z]:Cڭ"N՟PpRLĦ]J)4\TXe/(+nhԨ~؈O9"(24jVb3}J{$p3 [u/!nWVZz`y@y˗ϼ@|:Ox}=XۯN2j*D&(fd&_0\1[Ts疀E_(A=ReWuAhkz"u NAcʅڐ颸a~֜&{ߨrvd[u&<(nb8.e2mS 8q|U b7A-ZH-4-<jrߢ<])3[ a~k63 3Z˲a6uk\]9v bÇ=voc_}^.oyg/]įOggc QU\5#'f9Qb##вRHcij?!AL2-⍥ri4ZOnq-LQV\o,(R%2EyYEIU`%Z,Ru[ZOcZ&C\Et`Ǒco;Rx8e&@{x݆N"n)䫁s7}?K;;︽dcG﹃Oԗ~yi8\~wc{;?"Dj@$J(KKc-ը&Qʠ\͏OC',=a'P`P rԥY^LJSĂD(8Ե'h9/gDE?/\|wrvAR;;7}g^oAƾ{{y[|ƹn}߿2SN@>B![=JJjU꒾36鵫O_ ia"5~g2#XgFJ ҒT, āW[&,(s~^m{o-t7=g~ڰ(/89> */R?ɮV}cPӓ$vHǹ|q;qAB r$σ,œ\ 7n G64J"/U"9r$,}FU<>fè XW jSexΧ^x^|u#z'ڿmmߟo:w N/lsuO{{o`{agLa^v%6uI>acg TyZ"LvRbG@"Ҍu"S$ 5OY *@i`c($ k[b pS8Z k uҗ$J,#Lrt:6LuUp_?ˑA"hccd]ڿmel&7&k{ם{Fw~~N{^p3~tY ])$b9)a,EN1셼J~R&4%AȽ:V>Rc/Z„VljKWV˥e:;ue#֣2Ur7YHRD?4 d}3c/{$|kETTkeˀju9!>*~jP0T #s4>٤͇.yK?=.olZ;|c?:m-]6r3+_׃>ͽf/ۛ "HsVD\F6 Tӯj ?0\Tҙ{IM#Io/3vNE`:[W!F?gƍ+RMQR&l7ϊ4[=BE$1ԤX@κeר2egjٯ9A/ު;|pcK6J.A[zЬnfslvg+S$ b8^(L+Xch+VKPDMZ` 6&w5&N6AH2>+c&ZL\U #ޠ_5xD\Tރ aT ^ӰQ2S *RWQl(ƍZK Kξ r&ȶCJ,6)[wS~#6=aQ^o{͹ۮ|*\o'7Q5obU_DsYZ0\nePN0y'\b֪")lWe⺨ 5葫Hί,4&l-<5ޕXIG+PlUz@-/ab3tE1. G-g*8rnRQa3DOʖi̓[M,Z9(ه^zWo!cO>{mJ=oY3˿ƶcܞI3q#m2H@M#7{f=cJHLp`!M8ȵ".Vcb5 kZEIɍ$uDWꕊq`@/pTaVJQlbJ)Hoa'n5/,0,*Qt&b510*])yU9c3u-O{-%*'=A_ysN~VXfm4Q% QiUATD \~]ٿ ash[mPW)(l#e壺+U}Z7[V iMEQVcUhaƝ:0 +1UTKPY4.>.X2`!)a*\rV.]_~so>8>Gx'r G!**SʄD9Q$$GomL/DZcцF:)E%>J`A; /_2g8񞈵Ʊ1ƘPjBѪ3{3+Bj1&N@4Z{u[9$,ne?-s7vhZUK *AF) URt5Kn;Gc!v&YL:間>zAah}cʏRtN) 0[7i})PaN~E.r^1oF=L!3CGZL9šч9ԅC+ \Y*o$s<9"99~e ¥ӃN?!dD ca=eKIJOotbGHME|`qY[4lЏl%{.N€Qް1TXcTgئZGz%$ SbqG޲ [+`m;ؖmu&y.bz]NO5?GmFnI1u]dôEtfY"hدc|Jy RnӰf"L9@=D6t!ǡUR5gir6Cq.˻)/!-/ܘ$.[;5bu|,-ϵ.W)j+]@/X}[si</3vܻgu\73?bȕ >?߹^ic2Uh(G\39^U'^PjF|Ke E}1堮Ay&a0. Ypv_skRI=EqH`/+ѐ/Ȟ ڊʌ*7ZP*trv΍ݞƋ%*]F w]/Am#ڵ_W^6j;?m?zq _/ZHph l!mfg)-0^BH)>Os'"fCbՋvU+&WR8 9M{ rXOA1тu}ڒFIv@g)yh kYIpIJ.ݘMzs.E<ɢČi)piVC2 .0YUM@[w5Yw;vl߲{OA/u߉>:˛=mW#Kr4Eth|DLKؘ9QtՈ.x¨ƈ\nэ7lvUKRל^ZXiEugΑlp"T@hUJfo)füHLAv"k}*H'ό9ς.ڮn1ƴa\ŮUdr7h'pY{~ꍟܥ=o[h-~l}u6p{WkO1r)AȢAʨtr~E/T7K:R ;}>+Dc-KӕNaNc:]M"\ L2ɹ(Xk{ƥx[@ț²+qm @M9ࢌEW&iCۀo^ iS%-Wk5zUY=Xy }GfCD=, N:=yU\yS8? qn?C{룒~|~so>˜6APX1T ]C-V %gMTx釖eAMu6^CQ+V`ŕDZN&8NϑL U""jX1 VBUpʦr"\|-Nzͺ[ L.ZyseU)ڀd"e rwnCd&MJKApHlFi .E$bH.N͘nVdVKu#mw]s>#O !I%,~JES*6BsU%j%Q S!AA3.tƝֺttŌLxŲ@/a0w0B bFY%jwy8/]a"p!(4UJuw+]ɡq9"Y-{r%v$1Jic ِm@D8@X Kg1_%@In6nON`M 0hl{Gg^MĠ9S>00Ntn_N;^ң &j˓O3 R]\.rLӵ.m[ۀP_x<޺-}YE^J+-Zě)O$͟JBE{ER4@I0LǃβG&!Ű$*&jpiD&K_IXC8&S€XFr T ܅'+yda;AD|K%d3Ĥxt $~mUty/wjғtl2hgZǴ)]s N;aLtz 1h%5~dj=_9c+{[h] DyǰQse͗,rFuȠ4A O4IؽJ/ `m0$ AeC$ayW `a & YƞE]RJnz~:̜؉2PZaBpn `)GfPѨ VApxY ME)ܙ 7$ 2=GPLH|[ F|-}4_׋P;J)5uݸh)0h;̇F_\= >qƀNjX+W޸w/G~rWWuwu2tE/ tN׵)%YPij@tXgyh^lC(C$ff G^ JIMc:%gím|H d5U2XD)r*=\#D<'/$LeDC(A(Y̞H8B,FFq~џk fT әaPRP.9G)KլB S~UTT\ƮGz)l;qANyzuMt6{K_SCO]OwC*ma~~ӵ|{nYs^ Sc%\X|;qvx $FTy hЖEeYX]\$D┤BdQ e$ 2G~ʓetyFJDYlVz_7&w3M*M s+F(Mpe1T.佑P)ZA2W?J=^l6?"&_<$t[UbЬc@34w_|붧g]=GnhWRϣm񭻦~bЛvt%"B@QH:M#lפ.ED,BNqiy,ÊuWnƂe'%@b2xT++ 79Wx1QP3C/0V&( 1%V*]Y$\!!_qNHOa uBQȵHlc pe%Mq0o/7tvn߼[ $a0ݧ4H t9 b>wI_{7Z6qhR{~/GOے~ك+~ݒfh@ô`qb2&FZ<н:k*tz`x %XUdhA&pR4mAx?[>swj?C է 9G1\ V)ttLLŝ( DPT ]&(,.E Q3~gI}鯯[Ƞ-Vb0W]wblgݝm>{?]e>š3B)wC/D1qs&P@й$2 --D m$ ^( `"FysST|Iw=9Yk66}ue\_w= MJ; P[alhvjΒbdFIzgɋ"0SYTg6WcD&}yyS4YMaj[u()\EծFE +dYEF71Pxm~:If-;7 kn[ !iOx,eE& uSU<ʩtg.9TxA/'=~_~CuxЍ_ڳ/{ЇnsUn{Wwy+oU%Zh5MYKk*gA@%qLi)U3BVHZA5$J *)m(pMD(`ls,SZϑ0UICȨ,^&o)NG5dXǡ*j%)UJ˄J,gȸlcu0<XrW7ՒUkkYjq2ס+:_w?|/x3zco} HЗ/GDžNo;btrvT8q2d簸ϜuJ. 1O'9؉ 4աqeh`L)o$p~(@T5 tMNʂ"\]֦ ^+a\+rhx1 )M-(CY}c)؍@eQ_*E S̜24S63Ք.MLM\NUs[^&R`~؃Oxcv %V#蓟ڽ-on3r r MJ@iUyFBSqKڋf>jVsR$emK mhSNЙU@*>`CV)\Xy\7>WP_qhq3֣=)*4nBC参c(&BTZ]HZRSS IPNtPROjSa?hqZoCBЩǎ<i]{o..nv@V\[#wh5zKgj.C[WgB-S䂧7c.g)&Ӆx@$C|u#kOY7pB5 jgQ,E[IPRH:Y6ٚ!%~U.sZ .\yշ BjGN<|G;w5wܮ7{ f;lß^O_U|v'%4>2RB' d}QT{zHqIt}v.3kܮXRjDSn4cήk]y@*eu.KEt{RrDRÁ-YRtњԾE ٳ eX44[!-@ܮ>GuWLktxnN)'1!/'^rcǻ˯闎qUݴ#O>]olS9ٕYCHBrό:΂fDQ9Sn|Ap (HDVŊ1)eX6dVy֬uoԝtt3Dmk"Y `}rꅝg)AMT?՟\auSd6ɝfCi" g?srSOޮvA/Sw1Q@jΥ"L65Ęa$a _ULi[t3ꚸ*LMńk.nZ ZٱA䂚_ҜCvjf;JVR{QV$˺~q[e- { ^2' [ت;#ioTcX)5I{\e112/= s"\tl!.jY!g&jϥ7|Eo;~^k̤D8U?-i8hXFրRv'PR-#teiZ'AF2" &ZS%5Mk|8YrV`OaXtD|n .NW܈iΊ-/IAr;̔[I)VHb>dt&Γ F*(R@OX2vv6+AAǞ?"7n!G_e/:s!JK)PóIFĖ' 1!iǃhKLPQ /4bE[ BC cj bۙsi!;VPιϽkom㶍̳?~՟uU'=cr1=κ-uzPai %~"l,J:!Wl,;!FR/9-2fRƵJ8əcps\hk'F@.ƈXA6$/~٘tz'hR1npR(O)n֛ P9b Òt%dq:!'ڽaATgѣㆸ;3ufxi6 uA=z7c{>=7 o7QϚ?/osÕ/~{qUu㷪zb܌P$/Pcَ>#3iqIurbRfZfThmL$nP9y h,ҟHƟr$X@i~:PB 闈FmLB?rQBXe١Qpu+5 xխ| [ﵩv -F5V,SUGR]]tvnz[072w ?{/zϙe\5.[ =OxqS z & Za6t ZK-H p*50QJ^d-Lc?AW qfBHDhbIy-T;I41_aq U-v2(]M--|SB[ 0C ͌CZ@v1֮#@Q :\.1R F,}zH~׏^zȬtƫ_q)ysiE;o͍ӳ C0(F>%'Ň8JԤXz呜 %71$;gOI=IA.IE/vYϡ.RqHV+!ɺ^'ƮGb}m5;fH-f*Y0ejt./+fG)يU']9zـ<1+rᒷnՉU>Vm/Nゟz.Ƞ:=9dt|W@q{l#5ebSB!(6)h(Ix%#h (1#B[NJ].mhHO!:4y(HS墕fOUqQ(8ٙe2I1>ElKm\EEQ;r\$OДJY1ZJi+ryaz7نy:b+qqi~~WmxBqO? A~q;԰9rNJu)߾ا!mGJ$` eMi@a,:{!_`Ex$M8fF?&;ۆ839*0J h[7Pu51{c*48Ek& ^JA,`Յ8dEw ^'$)&I 6dv*Qܩoa(>h 0A&#UxWg>C2!N+ JIe{~Ǿp3}z#-ߨY7?1$)*< 0˚.N2YVj\RN(W8MOrQX&.#;44ص2 8ȪE&k勖R/*uuċC׋Zh,S{p23sQd{y*PyR6qI0S463*r]lO“08? ..^wqг^P7k_kދv>r;9>۶fgAz!LZlؑR㽼QkFap$5#X.1ٜZBQ$ VFqvrN%̎Ku4wBF3QޑDOTT2&e'MӢmt7DcXf$(6\S@i3GYaE'1\ &r pi+Vjq+ A .@@s2 O3ONQOk9(%zÝ<'{ܿK}^6q3b0)s&,'4-5**tS|]gɐjʣnc] ƸTmBé.אP9 .i&$U6d2:ԪUK>F XOgvPֲ$%/ә6؜rJ^$:42+0h'3 RumVھ$¿dy@Պn0f{QǫC7W Id$32=<Jl: ]jŦs%on/.lcR>t1r102; Me<~=o/\Wyuq/ˆ:P3ذ06FP ;cb}r= Ws ߻'66N>*re^|q>A{sOMmEyV]^|'Ɔd@4sYh(01MSI͑Z ՌXES*'BcDbK58Fsn]6$C(BRB/J3vZxQ X'fJw]9UMkmec1P27r߾n=}+&Ueޒb+X=AڝRdB() n$%ݔ[+Ȫ 4Fu^^VV=Dd}Z&ʅx!Rd?Aj " NbQ34pѵPE }E?vb}>8.:gS¶#cf\2jX艐TB+I\.kbslv'K>t`t{Z%q1. b\R,CmUќzPѪO jFt9aɮr*ZҾ'vg>:{^g;Ml{^|4'zVܭLڭ.rWҐѡQ]q%`xrEyJGZ$n:] SQ"<) ˢ>-8`Ӏkhy\ 9 (:`=W*lI溮εbzkn87̟- z]{|{3g| wi7>6].AIzdlDf&YtBZk97PIh})nJD`]tJUZX/[%X- f|*>JVKLfAƀClbZpAK!PW9cA\j _g&P"Ʃū;d9*alz:xb5eTzRez8M}It՗ޙ{S5 XƄtkkVKs 9n裳tYgc 19r&:Q'J*HE9V%1ވ*Q)$Mn,k +pUZX 3e1Iw&"  $L)`c!dd6&J`aA!^f7./.]NL;"y?[58ظf`Mջ+ⷨC5mpGj*jn i)֍K~;wAsw"U)|v?||+]UI֠mU~Q" 5(ݾ[V".HP1(^IDD@GD!aQ^0)FPE ( 4q,-ЁF+XCi0 FҌ_)=/ CQuKA%*jR4k 就9&Mj]p}R'd$yd>K[?hrS?(GI4*#Yaatr34:5Pbc&>RjT;x][zJZylLf]}OO?$K+#h瞹7&LЦtqgR3D!D‰.#{-ו"A%*|'>H4mˆ)Dj Q(aEiƴ ;MAP}@ FUARh7 %gA#`*0Άezd`&H*/P鼠 Do\`6^r} ݼugvWzu~ua;o 9^x'hW i bJV!(BLUHƴEzzg=X&3^k}G7!efuz=]%Vd0Oڞ0ѣWϝy8?ߺ!;8m8GO+KT|nSE[U`I9epJb Q)8]#'+y]ȅډA5 UĒW2IUocrXiɝ¢@W WN!=`nsc,RIHYBZVN0>#%YI|Nq9z^GSd{(N'y DU[]96Sckyj ן?kMqA;p;~qm Wi=9IQZbEfU̅ %/jL@uD kP΋fe{ЬIbLhi20J5id,gҬYku.ncLnJÆ ”NlI*Z 2ҒQiL1uqw{4޾=OQJa^ 3qPnf'I,TKz4~_k?;??|˟A<6 "+kH# C[BB#"k Ub>_M(q/e^SrjX6>=AۇfD"duDqZP(R̺%HR R9(A`Tl/xɌ󰌳y<Ѱ޾{O"zјU 6zv!D#M8΃ -GNl3ś_km_: {C\` O]m%iƁZAdA2beS➖\U`&'/zADĚIvӋ‚.!]A&F]VtA<%(vkXu!D5HSrl$3VrH2 kbk ݅PaMa)Ct=c!@*zCgߘ!L_JƼCɶ393m|m>'\}o7q=AK7Ⱦ#Č`RaZ[A"ADnq~eQ]4NQ-,ʼnHz(+^l8Λ zeP&JPI: ;S`K4ޒjcZ)-(U˨ΔPU}5,ҍ[٫"Hŋt/DiBiR@D\ * 55xU” mI\K9t6S9ϪdC=,YŹ005ڢ;"y?ڗ҄ٳ-#:'pat^*]]F`M!)Z 49%_ݹ=ݰ-EeƐx':3f&<Ӯ땉!tġ˱,\Wt7̪[<7>sū7x R˗/_}AX"E !"bl) kBwX+iZ3Nr&)5;1ʈGi%H(wCbQL4L qLqfP*JԮRW *ad1$f K+qd]ؙD/S 0~qxq8n܉;:66=a s:W;{B'Y0dNePNl87,w"y/K_'~-2@Wgm8@.@1є e7Ű $%W=A)ꤔg+@Zg% ƒ!ߤlqyNQj _R*Yk)>z7uǎx(Q-Q:Ɖbb"Ic%rܺ~7f,尾c&=h%4wVqAV+iT]5qSWub^:D\ژŽXMil0 7Ϟ;dлKgƘ22^kN%{7GvlLB7uOHi&$:xV[yUETbp2&NJ7K I/`/LV@Zw_9%|ZQ^Γ:UM՝'j;6f"iܬcxgWˑo^zLu37_8FE vZ´,8^Bw?;~#?~96Nt;W_lѬ*#Tbiߕ)CB4S$#=A*EZ lb*0~{ bVR" (,ФH)T4څ1-4 (MZb0&&&vc` 7,ImB 3ޯs3JvyI;{{3OJ:dC*Ab@PVwx)DO.G-3$bFVRkWt'M'A)n-сӧ'E)$huܹ63S2PO/e2*GnJ8ūt,AW ׮mc(:Hȃ׺fi߽Қ2=0=BKf9/7օDܓi[Uv!8S؁xEVz<.u޼P`}y Ai :[Nq'>γP4(s;ޠ)#h}a{$C530J10&AR"g230)t1Q)P$BI4 `Y >t.S*ȋk& ঠ{GA"[aa8L!HN)>Nq0soZϹ! ig! ) ۩~s) %b64  z[׻a:j:J8_RTKuQz|1 ~8k[f;6]'6uo=kǡc 7~}qkG?~#}sxTA^L?r !{*.J) !])a9Gk7XoPҰHh RXJY&KdȤB|0`!wB&3)"LT8%EC cT~1KKz%i2',Q/qaJώz~fֶC3>]~ͼhn/gȻn/ݷJu;qP_{GN4݉q?:A[i>x8ĺ춎nZgv 8k!y>>$(Zb_6p T!V6WconnPhpfDQ&g'Q *O("lZ.6c:8m^ {#W4MaY^(1N~7~;ܳ+N^˯ܨ#\71AX)ky4/*Qc܉DsO|kMG#<%L^SLBVG)Fi!+܀R;.Ф.,3abOٙ|@vv: B'`@>!@"@d4 ePfRDl\DT{R:@E54lRgD2Pk[!)j8R_ҡdawG[Ъ˛i{.+b$z7~yz_Mеuݯ?ZZ` B85O!" W5::Bq`;52I`-\e<[u(!Y|T(W7U$yWaer" M6f ,ub穆6tY _Dp0&9 ȡJp$<˲x0Z]yKP3V4ѪX־Aٟ_(7W--W֒'k7ךhk8;$ξ]OJMÁk̥Uݯ6W+m`|䉓/>Ν9Yc'6A׭Bw~\fD j|`L $0 @сs0=D"8(&nxj+Y)H>E EO[JmZ(;sB'a- 2!"teu l@SKMFŇLOfJdoiҤ1ׁAB$t|ub֙[WC.Uv1 YXؿ:iY[7qck0uhrZ3^g0S߿~sg.k..]܅]_ A:8R 4JY֩N,l4r&CНRÂy Nq`TAbB1L!L$ l5ʕh'(qo8.c9 A3Pd0!P1\K|<Њ%0L0CLH[W)jKua&M{>nTwVl0R6bi70%5pJQȗ|7N %MuRfO/1>SO=3Р3g(=˧Ooj\9. b=ʝ @WG 2~ck-nx=U4,@]i2hFgi oC;PeR(-|[W|kR(IXd ck~u BݕX_/3A^d/:A/zF h#Ǿ/3@%^(01!Mlf*M@c6H [q-ah a[KKMD.Nz&4mK_^F2"hĆ e;Y5&1YHCV]2@/jYYnr3gf  ]RR]>AJEi$hnfIYAAIF2Bqs9ng2 0~s{wy'S.~Gq]c}NPLIclxї/ vK-9YVE*,e 9AIYEZH5-uHzEn~`mْߙ Xa%۷w'pG?1믻#ȣjg/t~J(袼*@,U3N9V UfVprך**(X+ģup'P󦪂2 ~1%4.NV¾u)&.d݋;bUS&roETf-umtXu0ZUSk4ݿWTJLsw,ULX ѶEc&z^kR_u6HDJ?jk` 7,6varK$2.e䃇<4~މdXz\PH4$zƕȐ PI7%Y ̈tYLK=ae.PI4(pOYwRimˊQ}a@i&\ λ %öGBu80w -:dsD'lQVWW"V|\#,n6~_1r6D(ru)<{dLӘUa4dzIR,:nO`kJZU>b-K*Ƶi-~b?;w/.3>Çxg@&!q&@MV 6AfY0vLى,Wݡ,OYЂ$ "*Ỡv\\Ȫh$^U^h3팧W;{3n@ +^v?ݣ3]0DG V=lyS7 b$)֍1Z-RPްEj5.,T7 R;R>!!\6]!1Œ\pQ#|pKNńe݌x3RJ%P01u5;п݀<ژ3^"{e6[C93]٥ ۖF)*a]2QzILĉwd@,CXdc^MzR-'ᅭ?Cp:=}+A?nO;i(Ap<[zǿ6λxןft@/m7\9m>R1ļo=39uc)O љ6zNa0%9QFZQN3D&<:3aݰ|T Y2I \@t: c 9Tbڢ<^pR2it{w? gX`y|XaS%E3%kO-ս|i[\$r A70,Y'[JB~lCe[z÷g:(\q8RBA)w.P'9to@=[.G D]myjr>R(>4egڶ1Mmfc0I@@悴uG >(RD;>M7%A믿fLw/?W+}ԃ fR5Zdβ@pXyWA}JhY >70;cGc 4q UCB0 }FX]YD6)Fy`,ZPu$H@C$ ve\ :yj%9{RT,(H`8!Ͱ૊B-NLzbr՚;(/1E2eX)J!#uS|=}Vk a$&}S_9SN :qǯ>O̓wn}6Zf jf,_;Ѿ'X_|Q߻]4`ǩ¦2`Z^|: tx*82x09o\Va"͘c_,QV{k!A`ɤX< n Z .e. abڊ^fEft+""-1*k-{P#ǵ/NSЦ ыC$yYZ#A K_Nƴ8J zO:YbJwZ wIb#9hyleF&Zw;t'x{G>rώ貛z/ݽ_zZ]m^k,Lf.]Ԇ8}ͥ&Aϣu.@+^)"PP>G?GxI'^6p`Ɗ3L6]c@vLt:/- "PejLnDPX> ]kurea6- 6|*aVkt+rqJ>G!\.APG (Lfp0nBVÇ+?6yvk"3\p {f;H(r~5av%GLZhq)n47vm>bD/ d1g;z2_lg V ^fSoCDg\=.o]zppD|eLC)e=Pt!Q@7#BiDP5dQ&( r0\ZU1=xD%1)FZ.1;<ي, uip 1NdsWvEZݖi]/b=cˢ`y8검!16̉-b҄B˕u!.|rQM܀%o]3Scɸq^Ll;*+Tn{4@@O^f[O}?~kp[.7d Afힿ{%Es\#5\~CsHpփg| 'HUk`Hc!A=Ci1WMNX0 ycUS=hxZ:Z4cZauVDlFub A*HEɌfҫRRwlOg2L'6Kcdċf\ Te$ etHt(rz("ԆAWx[Kq$|d!,뼨@h:ۖ΂Yi178TD-XyL$4B~{}A;:B(|7Az ZϠ/g㺘ԤA?}wq;#ϟ^ ƹ/",pƺP)jTCz۸ѕ eitjX6XID5a5^UNM{HpJQf`HAwU[Q0O=$'#sK;WBQ&d~D ֤kW2X AM4wmq 8ֆp(f_o}6/w%zi^RXyY.wu=ᓌryxlq]B !PB,UU Bj( +,$DGl>8m%J E"x9~-bMtht]=R?~A?Ah2a[w>|n ?zWHէ/?p7#@'NĉK4DdѬ̪`wq'*12'u{ v<2J'LHO+\ (XEH9:$DSsKLVfJ:Ñ56A!5xhVL"/RI ]ea1hinM5miҙ^qGMt>(n*_ FGq<;Ց-e ʤX9T+Y _ZB<.?ufc{ 迯])1csU`V$ⱱ^9E,Eq S #k\-*(#y P@ 1km+( fBբ8**+au3A1[AcZˬX8ɜ;|B[.+ʈr1Ƶ#&:hXLycjqө[ ?F`:r+pru_䛃&糢b8MccL|D6_ѽ; Jr V7iYi|_1A\CwO{H{A!'CtC\ !*xKI0CxƱqij,! 2  HM3 etg:bqJwC(j]`~a &4fnڅ~Z!Ĺ !Xz%)@&i*YBX$_9 VH?4vg"̓k u)[IQ̳Vv1~)5PJrg{YfC&Np\5,6k bm@pM4lr:a$R/RfM0/#ݤoO|k!$='>|?s]$!\H(/b@p1@dD!,{\3eI] U{䜤! Sk MW3.)j3.j ˺ c.IM10p3BgY||zϑ' ~-+ގM40IS a"{%ԕTVI]\/EUcIt[ψMg);jn:ߧ9mܜX -m$Luq~ f\^,;8^:ۏyrb,\d8Ad,f4p#\(%d_ aF2tOO>Gz:.RpϩS>LED0aCgViokwcW\/|_ΞhЇ>uynAEVNFc\ф ʰ;E\$/P,9R<¥6vɐ:RCFc>QE ;*ċw5=J2[jy]NySTnlvOg O^ܚp캮~x1ξo<)0~c n ViM"PL⟘iNӔy!*z0qGǞgϞRy%xƜrA@/~rOxD^~OtQ!3` PϪc A1HL j>2,n=}Pc{[?ocz̈́?$xrebLHy2f(%0s+ȷ Ur Q,u^4m:$jl2N7WGX.5{Ӏ3`Oo4[z3?snJTP~ +Џq3#L[ +4$Ǒ5hw?Η›;;?yO?^pBB'/m5erMO1) TRjm㲄&\FBKjWm0CLXЍې)ԣ@w]&E[#pVHsCqL1:K0cEt|;7w_ٞCm74Mއ?2oUrKVMѭ<1\ۈD=&kZ4_hA8MY6Sv6kc\Bp<&*`mɓyzIo>tm_|WypqAyŗ_}P;{BЇӮ^>8= ٜc lnNco~+%8."Th@zs]T/|K FdB N ྎa<T$t&Sw̚aHsFmPne{\ֶl&z/O<9;*=E 82&YnV7XMu@U*հSĤfX(XX:[uݎ63].݅:h+>_~@Ϋ??"g.^_j Am AOoc0!:ZNY" սBKJ u@ڔp5cNRvW>H,W%P).喌2pQc̢2ʀTpȓ(JGfb"bPCZ+AS8I!&@6u-Eː,~ 8x2 mO(Ɲo:lլW%k$:$7jHP`ɔ {> U}I(WVv];7d8xZx#(#mPDQ|w^~c?̥/tV.%jcp?-ģv#;%OLo]J2\B[ Irv." cM7VGd$w+6NôL5A PA{_^"LbʥMY ~ΡlIB$E7_ݼ_;!-]ǓxGiNnW k 2Qu`Ze"Y|ϙݙM6i!(^EiMV"MBQ7DQQB-noRv5KLz?}f71ۄܹ{^yϼVGnޗ:l6s׆t BJ^ŒA[;dr[JIUξw_9<Ѡ w hz_K_' z7~#[gn-AォO [&&D޿Sp*WUJQY(;BR[2-Dцӂ&{C m$5mr~?>cpg^C*:oTjE]0 bumtLw K zT_-+ib֕2]A4ٷ{F5Gr}mUp-ȃb#i>0㿯m(4Я{pc(fťJas61}_(enQ3SBgv#_{4hᙟ6rOx˷Ίi2I<$ C@5ml/Q@K)aHAoH8pf*ws fs/;W7M ̙]Z[heM A7wu=t=-('pVl ÜGTE+ BJEk q\0&:IlZ$e 99 (+J{f/{:VlI|, UwĚ ѵqm0r!VkLz?/kԈR^ M ^SeȀbve)HqV<5'LaVHʹR&&" (DYh!eBI&`O B(]qRΎM{ely$ wC)lNO}GԠg ={g~?;#9nޭ@[mjB w݄¸oה8=tQPMx^u wNhtˠAtm)6|.Fe(H}6!#ʧC_r-}>.nWFK%*=f}(`{7ˬݎ8R"A66g]z5ď~.$ FoD$Jexs1@ %.*/ LA.yuVGgw.ח34@T`&9)M谉N4}_]B D'O}̙}nuwwBې qomBjslt|sāѸdGN^r;hƥ!M1&$(k?xuxw'8gPAthoR5{m5wjt#)7: HbYM*@/47`B{d:˺%yk1{uU1t]W58=ԈA7 a.<^Vɕ kƵv"u2LS⬣UN:IYـ f:$ ԃDng!"f^V2Dv+Y9w{HA`.+y5n$ro;``Lu=P/}4MC=6!蹻"});9Gjܨ@w@m./?gG W/hTm"г4a÷~qQ}}#`,D!!X )V$+`DdCAC6VM1ь}|q1I$43[s 8)x* bkSx)Q{N[n ek=@tS񎴡Ma9\{K0ʝT;}`PDcj5}cƵ+(hLbn7wʆq5nc<.#P 1% meй,8 \Kqcyl9YcD(V(\3W2K i2Ѻr"A,ލpՎ.Łe-'w~r@O\ Dtӧϝ;^oN5oWi}F}@b{S?pU"<ۛOPz*Z+ŗ'z^(#cq4ܜF|Hp&Vg3fi@Ǹc+u"ڳ#pk}曵߬hNî' ?޷E:%7J}mγRlM=g 1834fٴ>&zO#yr^5NJs$[-L I_̢ a㏀ڝ >$C{M]\_\e$mkle/lyFsaRS|‹Yc0@B&ZE=o9Sΐ[vZ]A:YxƢ=ijXiNOt z.8]@G#$i#'G]ӓB %mDJV]\G@buVJt?@pK:bMJ7,5vT%@?/8nD I9s/y_;}~z'>_Ʌfle*N[(~Gasd&<|^A|AcJY,q^9o^U&2X϶ Qb<Τ\udž<sjII< C:BQIqa*ѽ -wH.EE:;Wњ U3yBYG,` ~0KsB>]\DHXJA /O(Nr箾ک[Gu }el vUi\d 9CJc]ڡI&n>KO  E(yg F#ɨ`kՙ=m4 tBʆɽe]8I@䋣.N湛P}v@*ys؀g`'cB5jf97a(ftCѦ /|ltABX#1x6VwЖkZV^6$4 ۘ+sy_`.icpLDE"mAA?N 9|> =J{$ 4_%36~J[W84¢IMC*4e3gٵhC1c K魻We C|;'+ןw[p?WcRX:hbTD3' ?w&|'#GLܻU%@ZΤ F]1Y;S)=<)Lm"eyBB8lOcXSkzf4 >j:8<Ԥi=M /{o.=pq /0z\GMJѯk:rE+ѾsO<Ԅq?6M ^d#㮬/\f@H+9#QeR%ce q ,ЮqVFK>mm]HRi K<5L*[@֡sO-M֥87LU+, EαMJyzb9DBҸ"ld%;8S[ #´}aWYX-΁ԥq$d@a2X4CGGOoWܬIU=i]3 pg_7~[n~??qG g,DH5A1${ SAء$ZSDy`. B,J7˃cU!Ԏ<O/iIo Mƻ|Mw~Bh0Q,6i ~c1^vVyae,`u0YP[Vi##[v-fih\cF)BY.y(AD'BjV G#UBW.eԟ!M[F]Ʉ*L煰ـu+__ o EvWNdYΑfE.L1P+l>)L6)sjJZ>L}S%A@KFDž7R.fX}"T)1xb*C-J|0-9Q hQޢOE4-qJpX]ٞ]E7 PM {,.2)|ABwNIN,*zc˛[c)#4vIJԈX@Q-pzg2km3'ao\!"s^8soAΝw ?s1𠓧{н[d )  5J2Hehn&6NiYMkBޢj|"0u.(5&A6Ezu]=0(QѪICQlڙ͓-F|Tx'ʕ9^zdjK. {’\p+#0]Q-9e>Ѐq\*8V1fB=:OLb]Ljk6 c_:~:|5W~w>⺞U%ЂbdA7gEeX`؆-L49G[C5[5P3Π89J3i05K{1hrHnWچоfZTn =؎qDHmPH,I\ <3RnSfH@nꔡIhL 8Sv 9ZaAUU8vu=γTD 8bSF%ֈpL)I̻ M:3)0&8`6ȥ:@{]vXdkϠ$:o~ıvcA?>=h?=a&Wы起: `lX.w֤8|]YUY#Y;hoTc&0 I* 0BW2^帰cq/NSԟD< 7)[}dҼv U%[WpgVroO'Ԡ5FdsQZ\l: ݓ>ӆDA+97?DR/&ϰ7/Ʀ?w3J?UHd0fCâZ(q5fĮnpJdpF`U[~}gEz'8}kg_:ktxW~wAR <ѵ`+FQv/-b_ƔTGDQ~l2Adԥ꽯o@ !YpRR ?)u+ K-.n '5@P#YYbl\l؜MB~\a ,Ck?.[>L]4+@Z/,NJh i*酬;GPB:] |F*$Tg5!L:KcqU0cuhGӢ #ad :rI7֟[w3=k/T[o|{k޿|O.|{A!6?A$sK3+5cݢdG!-vGvbZXl H䦞@Buc gB`1 |bh6^6K2!~վ-3/n(JP,!0#KZ &Aո} xd@1,0%$"!\/n6ex mI3L͍.ex'XfMP +M1 F]I(t4(##yk&;<\گ=z}/Kʝ3酵 [gn- l4 r2#Xϱ6j~5ח&:!#|5܃i* ֦,0xo]0?cb>݆+$ j:A..nNrwQ v-376dX)b^8a1`T8gOHmT[RDa[h+fU- +71/No1B}67sL)E0Oz6j1FF IY>LP[͢iGu! ,NNP! J#ݻ}Wsڱ7Wmb?wn&gng㍳zW~p` zpq8[Q7]{D™R-TpLK#iyg(t Pu#tteFt õnR[ wyiG8ZmfDq 5c *2Rل'(AN!je]{r:T뼱dcXjb #HQYx9~xEg 2/(lRD \g!q\EVuBb$tfPD2\P&hgPEP:,p`  ԏx/|LЙiARC_w_~6Eǖbr"#MŘJ+ʾ;O(g,};tNā?SG{]m\,> 5.&"(d4;QEa@x|6M-Z(Z5tUaS: iAgXL;?(C-1DH2Y͑9yv).p;'۟YO w",,Gbvh|l/of>%T-㜟*"\xN,DC s@ÄBy(^7"ЊpDT^X[F r? }qJPp+]ܝ9AwA^yreT`uaT:을P~^f+:ERIrec^%VI۰XZLOdu#i\L`$vb(6( Mz)S,ϐVa0Na04&QAaYSA.h6Y1Vz&ŌH:u3:Җ#9lZ $Fx](M%D rNtO%3F!P'…W DQHri\nqoݨF;SH@ ̷* ED >:$#$\+ )ˆXRc"*ݙ !JXvteͱRysTLMlMۑӉٯ "?#="#?s;hr@j8’&x2Y P=jHHRx|enw3ӟ?a@X2"y#3G퀓 vA/ ^HWt $8%DJPl͖{@&S1IٱOwjkb#3-75Y "]:W|kpk,Xs 9+ۺmjm?5BSAÕv1Rן..aUSe,:dGhE1Q ncTCN1.d\p+8 /EUe%+cB6j \H =>q>M:9 2|~A{ A~&aS]z7!z౪ɺO\=6E ȭ:Yvko[36#~8Չ^7|Du.\gԧbյ۔Θs2޵#AhT|Rl+zC8usfwIDʳ( Q_#>qՐqYwƓ )L,WqE](8{qLdC?6I3ubr5${#H2@T"E|B]๭I)c} !}{DGszbc*r\-=0Dsښk #<94S2}8zD!Z-&d{Ʒ^II g!0 R!*8>=LD LfB!AG6tt>rQ",lhcYdDƘ{/}e}?#(?Bw_\J&119  SFI,ё;.=PB wX/ӍQ\u>2Mua `EȦUnT,v=⧶1aZU#W>0{ցQb3U1Fİ[Xf !3bBGL "@QI? ElT *&DxFMg֙N2/Jp뭾5ݲs6ޤ&C-:EW]nCs,HBu_1uY׭upA^޻;G zˠoy\=_}e>yIB^7O͐~,DhR~qй84 ‚==0؞*Hpa̢kZ/yé<&كժ*f]lkԕ\J5G[2a~㋖M9uC" įD$r6Xؑ0єʢ-$+Ip 0ш#)*}b##I,+) PN BPiN"`0t϶_V0qζV31V(ږ֣4Ƌg-rş z?G o޼yw :+.=G%{0+KECW.u}s 8e@0-1dyv7lȝ ԑRT73Q-$=3/)hpfsHq}$ jk;Jst(Xg74Xz.0D0U:ԭ'BpM~VsPIZXL+T~8LmHb*r>SR, & X wdd700Lƌ?!K$7o?޻{?=V /\t/n쩂N~yem>3o U-挪NG;h~Z0)㔳m,c2lt)9 7RT{pm;0ٰM“48 *UYK[|9x- 4Stl!׿:ztvPu $8[]OE!ϒq^U7y|اUz4A`mnlGyLL=SܰlkҊ4E u27Z[6 =,e(eީCN+ORQ~^Wh#kWq뿽}\=UOĒ%D~TT|hr4N>Hn1>FD( 7#H5!. +]4͸\\WOp]OwFůp5#ʀNh:+ً:S(7oWgOt2-2D "δq^, ڷQg|h ha"I!hΗ)Ղllp`X)<=ow}+}7g 0,Ⱥi%hyѶ64Bmde$,1/[S]nBF}h.Ka1F[JWFMb47 j'N"1< ]UPN$YG'B*xX?jAʬ;㏂֘,#6 U7Lb q&d/=~џ^޷yo XAw^?Ξ*dꭗT&]ҍsfh}a%,M $-pHjk$p9CU npf~3M>:Hr *\g$3LiMJkCI"ŊH}hx)+HAMQ|y(jiMdfe}^{]fyK9묳>|JM6Z@|N ٷ!էKّ]gM% |_>yq詗?3UnN?{`.5txgmN( a^VY~UkuVl! -b/5޽wEtcf)V lFDPڡ6E(Йdkș/zK XǑsMdnq Qc-L7VF^:ÐA?fJ4O>/~Ľ'fG ;??s_ AO~xnO'`zk$Q꽶:cІ)Sd[&DP0X6f:FwGac""*d36 WV +.0r t :v[m$Nʠ?21ij'dXmR}0W9 Ai1D eH Fk&n*AWm޻EՈ\Yη^-B{zTJ0 DU:709EԂlȁa9, ۑh]-xh͎u!uj~FTUYskѩo Vl lмt44Bnp6X]{Noιʳ6lX4805Ph6΢ZGԳr,y! Z̄!Y)9aZ7M? T2*۫^UR=KglxlHd0" A@\QH@XB Y&, q8(H$&f2,==֫z;oFPdk*Z]_?BP iʁJJ^OhUc}JȠk o^|MGvx7^[7PTCЙQڰ(`j<͐ U蜱"Ȧk;%xaY08 !X5%v^F,FGx/mQD͌LF^B B" G"lY;))`37 w{·qbKk-U%Re1co5''*Q|0#BTpC5zi[[$3e V萵&(TŔg#0h$]s *$ zSԜDk<~/ovy}ԉA?7؛ pt7 ?CP:S52 h2"Z  ݇Ee N v-;;O6hca(7Ѷ@{@nWц-LCEI8§ !Jkˠ#uhc$GLĺD#Uu*Lo5WL$ 'Z3eR5P5?,M;ٙ$eV POSwUGS}xUۄ:j@TPАZ\' f4C+ 0⑳.,%ps :VV0NCEsYTeKpEģ^{#_%Wgqc'~y W?ďp 6|I 3%={.WANvb0mm2HX,ͥ =na*q:D`vV^F5ke+-e H:l~Y eb_ 1 *! "b ߞ,8_Wٮ5OIN߶0`94nlmK !(x(br>OY8%(ZDsƘ$RaaLmgJ͸n72RRiG$Rn(,tDJY"B\Q&v$dؖ~Y]QyPædt3 -;{"8J_ Ov>>"k%nrFYQKk|vGaӀRgԗcvT%l&",l8D@>-;gyTm/Sp|fe`4^(bӉ~e[^h ?8ߙ0 y;Ii3Ҳ$!ؔФ+zi]PdCXT)RIB0 +Ba& fSAe ielƯlʍV6rc x3<9XU}Su K'5vu{Phqd"L@_\vmְ5ZW9dÏ ?VS/}4f2pҙ+SمvnZ n@dj_{#̑ dA J)f)ƌk 8d ˫]Wk{=&**"Ձ88kt 8P+A ,$hHRo:9~+J@!,{﻾ϨZP%jcq-sljN?,0lͫ'GV AOI]]g58uQ p9pȭK&N"Fp A.yM\S6^aX>.Y aBZ9@pF7-S7ܵMO<z{ᥫW,{OWg*Է[=_ `^0[ Y*`C|h3ҌuL4G\!TyY @x9" F|#7{"b)Ƽ&1[0@Qps6p2c{_>{Ǩaq#N[d<2+-4PJlINUOħV-!=FX)~wckQZ #A G<7B:c@i Y}wZbI GX͹5 {nȘS P^-1d28 =T7AZǵČ?ʛ!jTK_׭?L 8C#= Pb+נ8,+Bȑ+}sW;#mTaV :+, qfwᶼ{h]XWeA? ZG/t'?_}A.?B):A(%pBm l8mPaaIr.=/HԪ1ۘg4{]1; ;\@'˃[S6Y"(r͡Dgz-Buׯ 2-*+B8ħ:q*j.>}afC [#fOd-TYX{;;uԠ" qz^ !'- +Xcmq P>Xܚ__N;c@`p\O{hVV+;ɜC__̵ko7Wȅc6ŽxY/=~pqD;!9˱-mOT9< (6nx{P欆D7I}$* 5,#+m"L>FizhPKJZ3ܯ=IMZtP"Lr0}iw;3æ" & ,DH`EeUE1!emYq0wU⡄riSZ2ք ȯ 5[-N7;PśV.#!Q~Xuq|]ڷ3̙ffS(T$քԂCKc|i*5b0IcRDS.圳{.)U !%;g}U;!jjHaχwV5-c$N g>Č%Oݫ}H7RVJa"~sb|PZU7԰K=jX}j SPKж( .Ƈ VV,@T5qPFգ#f,X0!]^e8Nt*Mg$oPNRx>WrUC { h_&xu\ȑ}JD'ܘˋ?dD [MɹbK 912dwǛu)a }r8 p aIp[~Ֆ~gSO?rN!A^Ԯu~ ׎=Kbf<T:Nxw2 k=9Jq5VVO\C*KiG+AUvVZ% kX Jn[Q03G;>R;.PUDmccknKtw=V3 Xb.-`^>ը6 R٣q]wSv(UCUM*i%%~FB.tx15uu>l4z]ᡬW~j4h';u;;w'wMϿr!AԃB6mԓFHDAYR\v*R4.-ɴ"޲:rҵ'f#j"cv1l2j5QWeBnz9(kWhkuJ+g:pj>ϱ:S%,2PXYJ#\[$_έ3*,D7G\Ic2fCh'R+md;Mh_$_.7nڶO tCĈQKZwmڮa܎Dk[E TM4E(0̌GuDP?tـg Nw3k<}ј5uΩÇ}^CO&~1rV_׻j1 GIJ Y?Wj׋<\у}.tbxMqi9Ұvp%7B&B-UE坂>OH8U줦bʴԣ;Lmrz+YOt9>`Bxbz\D IjFB Ǹīq~9']7ˉA@B tp DRط8Y ~uAɑ𭎉˪ᓀiG?kM  Wkke>ǂ~tfߞ?: p ?oWĽ;ξ?zy)n߹/SmZ[=}o6"jҢt.uL4(Ίfk}ɪ'vضny* )+{O5:HFRH*2j`2!vT۹~jx3ޗ<˴41ڨ=bë5#]c(eS$2.t* 8,)Țל[Ew$$`BfV 0R' ռo}/mXBM)1r|ҝA1#gQZ:D]_t {o].&3v:TnuS*[kd8@TB68F_&:4?R‘N=qA5@k8on[AuYq)\QYn"6mgҧxЫ=wrtgN[2&F5XFqpK)\b8|;&NNc硴JCB),"UDmU! b 6( *DS(m܆qxuއ3NCP6>;3{t}? S Y71_E z3VٽtMP@K#Ida #5 FVE"t}S{Z;(Z@GA=ٯH|w8& ˪FU?8}aӦ/E}CMl >,i ̇]ƲZ(!eBU&8_- h4Y3r\n4j3d G->`:YKK5"kc<&0PslAY/ =_gcF~_[7;m]^lա#.# :]bf@YK5=.9;;xu4 Bn`$TcmBNdQcEa%t5>{\}Og!| Saw(z)/b%[U4!1hB*B5Pi:s9B,(";7zW27U nh_3<ЦMb;9(kvU\ZӉx۱Z" * '8hF[Xzڱ*ݓ!bߔǟA`?'g7soA[ԃ~ߕ7`/}7;)>w_l.~HB>CPT\u @V" ZIj h[1#cD˰櫋o:?] ;YfϕطWPH@ =Y+] ~ =(Rbdu0@MFge^-dBt$Xe=d)c&h)+"cYTP`~wUtv:Bͅ{97ND Qxx*J[LdV.㑜h5 }ztEnvVy[4S?A;>;ʠ4oOގ"t3B- qD%)* \3n)v\\Ɯ|16]i&fh1((? /*CSTm jZSUQ\ dP|~=6J^YFyH(k\)-!J0!jY@/AAJ!P b+|Q'fL~8zjzvfsgxT;OOq񛗾PĀ9+u*WJNjVj#jU*g1MdIJa) RV+^Y̶K& ] K͠Ю߀]o"-uNypd15ߊjJ$XBSd"|c FaSi@ȩܵskwthu{ ڭ#'@>%nHSP{;zP ټ!p3U@ͦb@q=o]ը<.}ZLI`N00!!p]Nt}yC0@SH߿2ؒ ym\=6'7eoceWҰ엟 390kUYqB+ (G=܊s"DJ =": Jܪq  W<|@\R7+xislIG70$(D5 ƈV*IOf"gj.g fP;ծIiJX65r_|ym}KSv,}/ cZZNJqw{RL%Xh Ўra&!,%$6wzRQ\#-nOv \I=~(;U<~o85g ᳋3hi!jrۓKI7<֕5p4RkeB9S22+0Uj]6~^0;-9ABe*%InGF?^oo|'.hiikV5jGƶh`./.Doo&b6qNl (TRƟYkiS8xkk?w}\Ǟ:cq<$v=(f 23,KVJ`lPy)0-ֺ9k>C[% ḊE䠤\ 4GwQi!䔆@nC"&疓/S;(!V2i`,C()+J YFMQ)RCk1Tp &$nmVlf{u6H`0ۅgAgcXMU#il]׊,37^h8Z`*E i~3H *癐!Яr]=CxH)Lx_xB4 F| P!@T&dsƉŞXVކo@h+ g<-Ai҄Rk]+a[ʋCrMI" ,ƠŽi6R +,yҚBY":61}DBT^J#rnii7Mqb0UC q rs հQGRC"M>Ԧ (~}gN+gW'O% 㷤 C+29ED#tL8Θ /v)7#U>1ΝٵfX1N@h@ "4 (@) Q !U4H1~CҀ0 27?,PA>p!"D'-{~;_Aը&.U Ő#P> ?i ċYYGAHEejڒЫs5 C _r(7V?7tBZYfr=DblZ1ec)tu%ۅ@SAS*NV¥1*""BB,ϼ99|K]>_{2wN3C vp5!fbRHz,QSmddD0E{ml@H]p$ PJ2Pэy"O(y]#Ps(zzHїX@#= |9#8jFqH+HiZu5Ĩ1Qc`e%Aٍ}ݹR.g~z'89]{Xޚ#B#L=nYh vI"LR!hwLEsrԸ^Ph B?/4kjV`Ss?Ϡ?wKO_$7KS;Ti d@ɢc˼Ft6=:={S&DŽM`v!) 9#_}KߨBuڦe_[8dYhILc@ ֵn/^ی1eƂ@[ūwfrMFலޝv8b٨IBZV`zl R³Q$LoX^\KGF˲Ly[$WP? !itzh.>ׯ_["^ -O<. -cZtSihα8#i)AiLq#Ƀ7'7pԋb7)Yst^RASur ``sa)gRb`nqq]eֶ" E0§z뽕 {;s2§NrIC#(WE&xo&ȋ}&boWpDUPq&KDM97[O;dF3}Zw a"JRBw܊0綯 ?{+?Πc9 wʖW's%ZEH@QR" 9SMNjڕg(,]_8 ϥFyKl$Xv[B:'9'C`4sPCRw_'BQgCJ6Z~![FlSFJB˅Λ8>-+8< 93'B;#@}i>@ KQqD˺^lgY2+6GLtg rRZ;vՠܠql)x+oWz2]yA}`LC[) h(ƾh`B#RAA P6> 64acURV;'7< } .gնZh5+8#yBG"cE%krP\SҳibFd驛÷t9ȋ˯]x7߬Onx[n/#/奦nPip 4HwDp#0˴IX*f@['GoK4y5IJJH зQL[j}`CⲌW?g=;hp@ıu ZGf~"TB#`SL j-Oma,b=֙bFլ3Z!@epht|T+# F _;' !6h&FrL0&bP#F“KVc4}0?;N7*]*~IGoC`MDջv?AG{7Y{~< ^75Akqo=-+6+^z9GghE1s˗K2X弴Au3J; oK;~9.sld ئ2WW xWy[tD4^BsYA`DS)8?0VK]du5EJ #\:m8Р7˅6fk(!jW>=]#jJB5;E+X05Ѵih;}@,A)l#*Pn@wht982kI"5u^(|ktqwA>Nx;tr *gLd'iTR)M5A| h3}W bjS(b"VMLKӴ&LΜg_5N}u؛}~w= omLІe6?_~t{cKk_@R_#auysB%YKny2B`*T@i l uf^ji-И gb!kUۮp,sAG,!U`8D]3\o^Vil(oo+[B3HK4h ~. 5a.~2qlXy!Ѕ ma}:Nh @{c$x"$N|*dw |+ $$xJkh4VW.wEo';u/~ 6d|yG3GLO}s~#h3-1?"m;r#}&PXR KsE@ML(&cpvZj"B)&* P|8IHk1dZ^ݻg.!ӣ͉07Л vȈ4ٴw 0rlDSa⑏&ud(#yu#.UO7MpX+w64q4E2;I-J),N$ #dAفmLp?/S!##DdcUъRU0QApZYld^o;6J&ڪJ5R`Ϸgs_9u /p'cCOw#h֠oΐ- [߬y+\8q D:A WJ[̗gQo#lG=R6+k 35CQ2'Î+m.xo]pa49,==HhptQ8ok(Yd,ͨ#ϭ X)5xtMI=OtBlbØzDP+Ý# ך%ZE"^P+e yԈYuM4*Kl0*Q>0 pzŨ=QitEq"ڐ=.>Ž rߟrYϟ}Oyv&V~MMr=zso;nC??'@_ryi<rmVj0XL@) Sk=eX댬]6lbZ+|YfNK{'LsC3 2du.y @c,{j͞JjK^f8; $ϗz냳$M2tࡽG,}z} ~w{tn&s=C;DWIn\: P5C `Z6>lV._F DyMO1ۙ3]fuwŠэ@ϚŘ ˓wg' 0LjvAdobe Photoshop Document Data BlockMIB8ryaLv   MIB8mron)( BackgroundMIB8inul BackgroundMIB8rsnldngbMIB8diylMIB8lblcMIB8xfniMIB8oknkMIB8fpslMIB8rlclMIB8prxfv 2MIB8mron((Layer 1MIB8inulLayer 1MIB8rsnlryalMIB8diylMIB8lblcMIB8xfniMIB8oknkMIB8fpslMIB8rlclMIB8prxfov|m}x9cPMLQPPO]X{pysoa//////-~|yy|yz|{yzz|~ z`ULB7wUKCyKBس v? z3 w yܡ { *z  -y ~}|}|}|}~  {~|}}||{zyzyz{{~}mhghijkklmnnopqrstvwxwvu tssrqpoonnmlml ]jw}{zyxwwxwxyyzxk  rYv |yn_^cmstohaajtvvwxyyz|n~ Zv zyc`~ӿhcpvwwxxy|o}   ¿aw~zyyfcƘmeqvxy zxj|púSx~zy] ŊfkuxywveP``uuz ļ ]{~u` mhswxwvw]@0P`u`W@@8GĽ_~~yycrfsvwvxnv0P`xpP@@SP@Püj||xbqcquutuu{[p0pP`pV@@|8HµYzzxbjerssutwmnp `PP`pY@HV]xxxqı_hqsuzT``PP0Pp`@HV gwvvDgԴyZkqrrs{_z`PP@00 `P@@0@PVkvur=pιƴcanqrsyn`p`PP@@` itsr9hȺǸySippqv{PP`PP@@WP c~rqp@Żȼđ?22ٔWboppuPpP0`@PW h{oonBoŻ˾pNT?Fשh[moou~VpP0pp0@0@P@ ~vunno?iƼ˿{%rSҼvShoot}Xp P0@| snlln5mɽZ-ƁKeoot|[`P@0 ~xkkjl:xƽډבb;̋Hcoorz\ {iho7 = %|CÿEbonqz] uhgm; zۀ%ŸDbnnox]xgfm9˾D`nnprJqvwyz|}}~~}|}~ |{ywutssrrv}defn̓#gjqt¶yżmȅ0.+ZcojnĹ $%'*-/2455679;=@EJOSUWZZYWUUTRRQRQ OLJGDB?<::988782m0%rs[ļő뿅j0%oXǿ{뿅h1%ϰpirTηnɑ뿅h1%¸vpcePڏ|͟뿅g1#۾vlgcSKBm፲뿅g1#vreJ?Kzٍ뿅j1 ߢd]VSNBJlэ뿅h1!kʍ뿅g2p~č뿅f2p{q]]f2 k~qᅪ]x>c2 ߍlp"IIonnI]x>]xc2֙nzpoonInnmmm]]xd2¢n|oIonm mm]x>]x]xe2}yvvy|o#onnnHmmm]xx]]x]xd2 o#nnmHmmHl]x>x>]xd2Կ(nImmmmmllll뿍]x]]xe2Կ꿍뿅d2Կ꿍뿅f2Կ꿍뿅e2Կ鿍뿅e2ԿÖ뿅i2Կϰ뿅h2؍ϯ덅h3n3߅m 3РBDGFBAFBA?F@C?DDB?;==9ABA= C>>@=@A?A>B@DMCDCDBFKFFGHJJKKLJKKMONPRTWXVWXXWYX\\^]an{q49CD?FEIEGBCBHFAD>B?>>@DD?CA?@>>BC?BB=A@BA0BCDGIKHDDHKLLMJLIJNMLJLKURTUWZ[\YZ\^^[W]ivt5ECHIKG JIHGDHCBF@@DB@ A??@BBDBGEIFEIKNKLJJMPQPONMWXXW[Z\[Y[^_`_]hzw 5ڿдڿ.DGIGEEKIFKMKIHGKFJBABCBC?>=?CB==@B@ACDKJIFHIJJINMPLPTNPRTTVZUXX\Y]^[[_egdcrw6پ융ߛپ#CIGIGHFIIFEFNNMKJHDEAEA>BDAA>?>@EBCBGHGJDIJJNEPNRQQWRQQVYXUZY^)`\_ixwxzþy7ؼ챛أʐ䰪ؼEGFIyGIKHGLGGIFHIDEA<99?AA@>@??CADHBHIHKEGIKLRMRPTQQTSRSWWXW[^\[__cdhvľ| 7׻ 웰ڡ`׻HGEHHMFNJHLJHIJFD?A?@>??>@@>@BA>?AEFDEJFJGFIJNOSRQPQTTUUVWXYY]`^_dgozɾف 8ֺҞзPֺ$IFFHJNDGIHGKKGJJKHFBC@>9@EDDHJHGIML:ONMSRUUWYW]anqqkqy{ÿۋ :ҴPxPWҴұMIIKIIGHLKIIJKJFDEBDA,BEBBACCEHIMJLMJNPQSPVUWTX`clr||zw}6ڐ:ѳfWHCHP@ѳѱMHGHHIFHHIHHGHHBEE@@AACfDFBDDEFGIJHIJLKOORUTUTUY`is{ّ ;ǯtP@0^P0ǯDZ#JHFHJHGJHKJKEFC@>F>DB@CFBG4EGGEJNKJNPNOQQUSVZ\dinsy}ٝ=Ǯ꽾e@04ǔ8)ǮDZ.KLHEGJEFEBBHC@AB@BEB@BFJDEJHKIJKHMPMOOQRRVVT_mqxv}+՞ =ǫ׶B8ǫDZCKMJILKIHEDEDBAB?ABCBDEGIACHHJLHMMJMORSSTTVZ`lx{}||{*դ =ȬėȬȱK NMKJKHGDCA@CCBCDGHCEEGIOGFLNONQTW[YXbnzԥ >ȫȫȱQNGGHIHEDGFBCCFDBBDCEEBAEGLIJIHORNNPVWWZbjz ԧ >ȫȫȱQLKLEbHDCABHDDEHJFDGCIKMKJKNPNNUUVUW`jz Ԫ ?Ȫ 闼Ȫȱ1QKMGIIJHKGB@GEDEDDFHHFHKGGLPNKPNNQSQ[YV^lv9ƿ Ѫ@ȪȪȱTIJKHHJIFGILK??CJIDGHEFHGKEKNKJMMLOW\ZXZdt Ю @ɩ 藽ɩɱaIHHIJJLIHGFEGEBFGDDIEKKHKELNKMJNLPQX\bjrx˲AɩɩɱFDHKILLIGWBGDFEDFFIIMJIOIKLLPMSTTW[dmrvy½ʵ Bɩ 旽ɩɱ0HIKLGJJHFHJGDBCBDHCFIIHFMNNMKNOTXY]diuw|.þ Bʩʩʱ4LNJKJKJIGGIJBDECGGDHGJMKKNONNSRSSZ^fqx:þ̱ C˩ 旾`˩˱aOLJONONMIGHGDDGEIJKKFLLPJKOLJRUTW^gn{½ƵC˨`˨˱QOLONMPOIIFIIDHNLIKIJLLKKMRVUSX^oz, żC˨ 嗾А˨OPNO MKHJHJFGLLIKIJLLNOOQRWYW]eu~ ǺC˧0˧PSPOPQJMLKIHGHEGNHMLHLNPQV>X[gpy{C̨䗿pp0̨PROPRQMLOFHILNGFNKINKMMLTSRWZZ[bmrv{õC̨Р`00 ̨PRPQRQMVKIKKLKGIKLMRRPPSSVXZ\[_jswyij B̨p ̨OQQMNQQOJIHJHJPKFKPNQPTTSSVWWY_`fou{B̧p`PP ̧wQONORNPLONOKJHLNPLNNPSRRSWW]W[bflu{Bͥ0p ͥ RQNOPQOOJOPMAPOPMPRQPRSUVVXZafqx~¾% Bͥ``P ͥ$NPPMNOPOKORMNOKJHLNPRQRTVWZ\[]_hs|=¿ AͥP ͥQ5PMNLUMMPORNQPMNMPOPRUVWWY]_a_hw:þ AΥ@00 ΥΘ MPPTNLPOIQSLRPRPQUWX^acbkq¾   AΥ ΥΔ@PQTQNLRIOQPOMLKNOMQQPWUY\[[cfkvÿ  AΥ ΥΏaKNQRPMRQOORROQJPUMNZZRT^_[dlq{Ŀ AΤcc Τ΋QONNLSQOMNPSTLOSOPTUXZ]dbmu~~ @ϤdA ϤχONOHMTRQOMKTSPRSPVTT]`[cgv%@ϢdAdAddd ϢςɡlˀbaˤlQNMOPMRRPRQOVRXTTPZWW_^Xchy¿ÿ¿ @ϢdϝdddϷAddAdd Ϣ~jhbjSQFRNQQPQQSUOWTTU\YY`b`emĿ @УdCdddddddd У{Œc\\c`SOPQUTSQOUULVZTYZZ[^aelw"  @УdЃdd dddОCdCdddи Уw{ibci{`CVTRTOQRQRTTWOSVTUVW`^a`et,¾ @УdCЃC ddОCddddи Уuhb\\bh`b%TSTURRSQRQORPUVVY]\^`ban|))¿¿ @Сd%ddddddCdddȱ Сur\\r`VUQSVUUSOORTQZY_`b6frþ @ѡİ ѡuj\\j`kS}UTSSUVUVXZTVWX]_c`fdjy~½ @ҡì ҡxfse]sff`+WTTSTTUWUYXXUVX[]_a`des|#(¾ @ҡ ʿڶ ҡ|tlha–ltt``jUVUUWXVXWYSQUXZZ\aacijw{ý @ҡ Կפ ҡTWUUYX%YXXU[ZX]^^`dlt}'ſ ?ӡ ׶ڧ ӡӅgWVTVXYYXWVWW[YY^a_`gow¾  ?ӡʡ ӡӈXVSVWXWX=[][\aa]elv3 ?ӟ ӟӍIYXUYYWUUV\[[\Z\`dajr}2>ӟV ¯ ӟӓY?XZ[W\\[]]_^]]accgl{:ľÿ >ԟV ¸ ԟԘZXXVYV]_\\^^`]acmjo{¾ſ >ԟV¸{ԟZ\ZVYx]\^Z_^`dceow¿ =ԟ¸{ԟVX[]wa_`cbadejr =՞{՞W[YY]Y`^_``fbejkr{ſ =՞՞[Y\[[]`__bbe`gmlpyý <՞՞DZ[^^\]]^`bddehijnx! <֞֞[H\[]^^`]ddifhiknwǽ/ ;֞֞AZY[[__^a`cfbjqnhkqy ;םם\]Y\^`_`]`ciilmjknv||ſ :؝؝`^]`_cea_bdhiklkmotyzŸ :ٝΟٝ^c][a`fdCifgkonqqvy|ǹ.9ڞΟڞa``_cdaeffkihjmrvu{}Ƹ 9ڜ̟ڜ_abjhijhhihmtx|}¼÷ 8۝ͫf۝+\^bcbdehgfhojnvxz,ź  8ܝp>pp>Yfܝcgbegghjgknnpw{ 7ݞpp>fݞkgikhfiijmjlnrw{  7ݞpp>> p>>p>>pp>>pp>>p>>pp>>Yfffݞomifhmoquz|O 7ޜp>>Y>p>pp>>!Y>pp>>pp>Yppppffޜplhfj*norv{J6ߝp>Ypppp>ppp ppYYYpppp>pp>>ffߝrpokjklpxuyj~~5pYYppppppppppYpp pp>pfokoMroszx{(!~5o>oY>o>YoY>Y>oYooY oo>>@oloonqstzy|~|y~}||~{| }4p>>> Y>>pp>>p>>p>>ppYpY>>ppp>>pWmjjonpty{|~~{|{yz|}{{|$}~}}~}4>oojinmptz~5|z|z|{{}|{z}}~"}|{}~}~~ ~}4>ooYfjkmnrvy~~~~}~~}y}{|~|~ {zx}{~~}~~}4㻞㻞Yillorswz}~|}}~~}{|{{x"y{xwx}x{{z| ~}|3仠[lorqrtw}~{y{~~~~~}|zz}wxwvsvuwy|y{ }|3lopuuy|+}}z}z{~~{|}{yz|{z{wu"tqtsusqtuwv{~||27mqqntww|} {z|y{{vz{{z}~~}||zzyzzvuvwrstqrutuwyz~}|2opttvuw~~3|~}x{~|ywz{|}|yzxuxurtutuxuvxw~}2dstuwxyy~}{yxxy~x|}~~}|{vwxxwzwvuvrqurrttsux|}}}s}|2ny{yzz|}¿|ywxy}z~~|}zzyuwxzwwuxtuutqstwvuwtsvzz~ }{t~}}1hh{~U{y{zz{~}~}{zy|{yu{xvwyvuwuwuvqvwqruwy~y{s~1h~ayyzyx{z~|zyxxzyyxwruutuwvvuwtuuwvspqsvzz|{v~1h}xwwxyzzyzwywzz}vtrosoruttsvvuswwvrsuux{}{yv1h{xvuuzwvwxyvzzywu'tuursropqptosrutvvx}~||v1hL~yxvxwuw/swzwvrvstsrprrqsqqssuutruvww~{|t1hI{z|vwuv0wswwurqrqqnqpqqrrnqrrqtvsvyvwr1hF}yxvu3wtvsussppqtusmpmnrnqppqnprprrwtwu1httHI~|zyxvvwu0strppqopsompnqqnnppqqrpruqvzzx1hHttHH$ ~}}{||z}yxz{vxv3utssuoojpopnllqmmoomlpqqsurssuyyp1httHtttHtHHHtH~ wzyy|yzxwxvxyw2sqqomonoqmlmoppoolonlmppossuxy|p0httHttt(tHHHHtH<{y{|{zxwy{xvxyvwwu2rsqoojnpoknpqpomommprnpprtuuw{|o0h tttHttttHttttttHH)zx{{y}wymnllplkmknpoponljklkjkklkmljkjmjkijklggkiikjilnopnpsoonroqoY )v'R'W||}~{z~}|zy|zyz{zz{wwzwtrtusqospqpoqpporonklkijlkkommlljflijjol$jhkkgkiegikhfiigimjmlnpnqppoptqspV )'QQ' }~~~~||{ ||}|z}y{yyzxvt$rqnsqrspstpmqqomlnpkklkmnmkkmlokjjnmnlmkfhjljjhiljmlomnmnoorppqqtpW )QQQQH~~}{~}zz~}~~yzy{|yvtsoproppswopvpnlqmplklkl jolkkliqlnnmlol!mnlkgllkggijkhlnlkonqsrsrorpqoT )P'''X~~}z~~}{}||~||{yywtursrorswzsrrpplpqlljnmmjmosimmnpspqssonmlkljhjiikmlglopklknpsomlnjknS )'PP' ~{|~}~"|}{{zwvussuronprrpqrnklqnmlplmjmllqooproppnpponmnpolnkifilk lposnmomnnonmpnS )'NNqq 0~{}|{~~{zywrronspromnqoqqoomomjnlklmiimpmokkqropporonnmljklhjklmnpopqoonopnlmoomlnS )''N' }}||yturponpqsprrmmomnonmnmomnlnoknsonkmqnpqoomnmomjlmopomnljmmolmqlmlmQ )'o''o }~} }xvvrrqo8nqwsupoqqnpnqokkllnmllijmljlmjoponnpqmknllkmhnkjjkjmoonlpmonmoomonnooR )~}!zxurqprpmopwrpnmponorsqoijkjjmh)fhhijghllnpomnlonjlklhljlkhijlnnknojnnkjlnlnqrnQ )L}|wtrsqsrononomloqqpoomoollkjgkiihcegdjggfmhnooqikjljlkigljhheggikmknligij rmnmoqqnS )I{yvtpqpopqoqpsmnqnpnlmnmjlkighhihge2dedgjkhkjlnhjihikjjkiigdfijihjnjjffigijmnkonlknV ),zuusopqnppqp?molljpnkkhffidgiebaegeefjjghefhhjighgefhhiieefjhiijiifijfimmqlplnU )T|{zxzurpotropprqqpmmllmhmljhkiifbecggfifdghgfhei'jijfdcfeccddcceebgjiggfihkeijlknomlmR )!~{{vtuqnopprqqoqqolikmkmjgiffeac``cecafededggfgfddfgeafebaeecegfefeihlmlmklmpnnoU ))~|{upnlonlqqrsqpopmmnoomnnkfhiifdba_adccafdihhfdf`adbbd^_bba^ccecaghjhhkjpnlkqropW )h~|yrrqopnqprpnlookmjkgjomifgfd`bdb^abc`db_baeg``b`de_ed__]_ecddebafbegefbgkjlnoprnnmX )S{wwutqqonlmppqnnlojmkmjkliffgce_aab]abc_e`^ab`b`cbab^]^^_b_bb__dcgfghkkhimolY *1zzvsqnpnnlnoopm&klhhkmlkhffeecgaabd\`b`\^]]_a^ea_^_ba\^] [\^_`^b`abdfbcdhlmkmnlmmnlnmkW *~wsttpoqmoklnqmkjmojkekiikhff`dbb^a`\a``\^^\ZY_^`^^baaZ^]YZ\\_^^`__`bcbeebaeilhqoijmlnnkkW*'PHtHt}}ztusopnmjnnmnkjmlnikmkkfehedd`b`bb_\\__][^]]^\_^a]_ca`ZZ^_][^\^]`b_`a^aaeceeilfmnhhmkmkhj[+sPPtHH HttHHH|ywqssnqomllonmmjjkmkogcbgdbb`]^_da][_^Z^^_]Z]`^_aa_^_`a\Z^][_^ba``acfgijhglghimpjghh\+PHHHH~~zxursrpnllniilmlifllhmhifdeab^cc``_^_^\[[`]YU``^\^_]^^]]`_^`Z`b[^\\]b\a_`dhghhehjffihjhjleh^+PHtHH ~|{wqpqolmlki kliillhmihbcdc_`__Z_^YZ_c^ZZa__^^aa_]\\`a`_b]_]]dabd^`cfedgeghehjlhgd\_+PHHHH9zyutrqpqmklmkjhhkfimmkgjjgceebbc_``^a^_ ^]^^]`__`ba_ca__`a`dc_b`abc`cbffbdeffecgh lfe`SKa,PHH D~zwttsponllkhkljhfflmijjihfddb_`aab^a^b^_^^\]]^a_`_ab`a`]_bab^`bcbaa_cffadedeg imjkcXM=;c,PHHHR|zxtrpqqpmlkjhihjjgfllhfhfebccab`a^`^_^b]^^]]^^``_^`bba`'a`aa^cbeccaeedcdcfdfdfefegcijeXPE:;9e-PHHH=|zyupttonkjljkhkjigijmjgiicf`cdc^^_b^_`Z^^_\_[b_]`b_b`bb`aba cb_abdeadbdcfefbeffegcSE;?983l.s'PtHtHn}zxvwussopnmjgiikhfghkifigcacb^abc_]`]^_`^_`c`]_^[X_`]]^`]``_bccbca^cfcaa`b`b`eggbcdbg `][I@:D@A2k//~|zyyxuqrsmllmlkjijgfjikjgdb ab`\\__^^]\^7_^_baa\_a``]^]ddbf`bbcddcb^a`^`cefgeccbf_[`[\N==:663p0~~{}|ysqnlklmmlkihjhigiffdedcb_a `_\`c__`^^``aca^]b`aacba`beeaed`db`d`efdc`dPMQUZM?:03:5t1 }|}|wsrm;nlokkgjjijhdgfgeccbb_abebcb]^`ba`^__bb`^``__`^__^c`^c]]ddbc`b`adbgedecY[aN@>@IE:71198~3z~|zyrrm\jnlnlmjhkjhediehfhlbb^bacaacb_`bb_``_^a^[^_^]\]__]aa]_]`c_`ca`adc`bbeeceeb^cUIB9<9:884/-24瞠}}zswvsrmlkjjmjikfcgdhd ec^acb`_ba`c_:ab`_b`]bb__^^`a^_`^]_de`_bb`^eb`babgehfcXUI=8=<<994116/6}|uuovsoligjiijkjgjijeehchfeffc_adbbaa``a`ab__Z`^_]]W[\`b\a_\]^_]]Z\__^c`bb_ac]acecaPC<:179,/10-55/7|{wroqmolhjlgklhheffgebecIdbbabfdcc``a_`b__^\^_]``_^a`^aa^[]b^a\^]_ac\Zc`a`^agY[Q?=986461./3364.9Awusnlljjljmhjmfjljjfhhkgeddefdda`cc`aa`ac_^]^] \``_]`^\^][]]\^#a\]``]ebe_acb[NKC96478114.16583,:}xvoonpmjhjhiijihefikcecd efeccaccbba`b_\`_2\`a``[^^__^^[]^\^_`^_cjd`c`TUNMD7338658-,732311= {zvnqnomrnpjligiihihidfbddgcdecacbcaa_^b_`b__`^3_a``]^\^\]b`Z[[\\^_a__gfcZQKEHII926886:;73463473>M~|wsrqmlmppmonhihlijijihjdecebfecdcbbceba__c`_b^]``_[]a^.]^^Z\__[^\[]]\^]\fg]QKC:A?;3-19::654636867:@'sHz{|yvtkqonommjkihkifkjkjgiggfgdeaaddabaa`a^a\a^_]]_[\][\_\[^Z^]\^\\Y[`^\aZcgc\HC:/575014:78634>257308:978532348-/)167E'HtHtHB{zwzxvvwvqoroppomljjhhkkfbfe`dab`acc`aea__c_]\^\^^\][]][Y[]\[]^]`daVMA;=<214:745<63: 1+;4048FPHH~}x{vwwqsvqponljljigfhfgeb`deaab`ac`_ca]^^_^]]Y\]0[][^^[X]]Z\_]]^]`][QC=7<<:87;419:9;88<,(/5381G'tH}}|yuvwts5qmmllkkegidgfde`cdecbbccba`a^^\^]a\__[_]\Z[XY_\][Y[_[]^ `RBB?5>>?<60155;;<82260)2354-G'tHH|~wvxvryyqtrnmmrkjkhidb`ccfce`dedeedc_^`[\b`a^]__^]]YWZ\]Z\[_][\^^`\__P@>AA?B:2,1924;661+.,.0-764,H' HHH<}|vzxuwwuvromokkhjjkkggihghfhdafcdc?baa`a`a_]__^^_^^ZZ]Z[_[`^\^[XX]^TC?CF@?:1/27875-'&178337034*H'HU{|vvxxwrurroqllfijiighkjgifejgfedbedbedc`bbc^ab^]^\^^[\\W[\&[^\YU[[QIABIJ?4112364-1338?A;63+'32H}xz(vurovtpmnkpkjkjgjjlihgeikhjkcebaggbb_c`_]^3]\Y\^]_^\\_]\^^]]Z\_PNEIIJ?5:2492/48ANDE@8-++ #4H {{zxxywusXrplonmmjfmkmhhfghghlieghgghbbadaac`]__\[\\]c`\][__`^]XWZ]MGCKJD>7:8994548?A:94,&*-"!&H ~y~xwvxvvtxvvsqrqronkjilljh)ligefehhffgfddehfg^`_^_``_^\][]_b`_]\_\SZWDJLH@>5996-2026960,*)&-)%H7~~||{y{x|yyurtvxstpnpllrjkonligkokljghkmdbjifhegcabca1`^^`[\c``b]T\b`QWXFFEKF;>D:76;8:1,/94,/-,(1+&6H瞠}~}|y{Gxvwuuwwxqsrtkoqmmppnhikkjmmhikigifggfdgcdgcac__cb`^`__`\[ZadcTTRLHLND:>;6;A81433).9+).(18AH~}~|}|}{_xtwyxyzvtqquousmqsmoomkllnljijjihecdfeiggfecfdeddbb``_ea^_bhbVMLFBJJ>99?:17;B6,48423D@*(:55;H|~}xy}zvtuzwwvyxutyutrLprpknpmkjlihiggjiifcdgeebdeb_db_]]`b``YXX_TL?;:EC;6198-1;>34;6476HB0.3,4>IF~~~~}z{~}{yzzx|ywxvuxwxxzwtvuvxrqrtopkoopmkhjhgmlfjhjicg5hccb^`db^a_^_aa\PSa^J<25@B=627,.48;745662796.8B65<I~}}|z{y{z{{zvz{{wwzzyxqy{x|wzuwvwwospsrolqqnkjifgikihjjhieghgjecfdcbebc`^^fbY[RPZK7/2?>;7383,553::47:16977?EBHHI(~}|xyxzz||zv|xvy{zyvxzzxrwwvx{zwz{{uxSwxusstuuqpnmnmoljkhhjlmhghgedifcfcdb`a`dae`ca`U^\HA>57;8:/.2841+-,5>@>/<648=D]k^I}|}}|wytwwuuxwuyvswzzyvywy{yz{z|xvvuvtstrponnmnmjjijlhjhhg8dcdfddcbcebb^dbcdd_[Y^IBC68:854./584"*/8EC853;75;C`VNI'H-|zz||yzwtuvruvsvwvvtutvvuxzz{xxyxy||z{zzvtzzxxuqKsplqllnmkmjkijjffhifegidcdfgfac`cfehedXWWI==9::602+.6<**5<;7<@5"&/31.7CIK19A9E;9>I'tttH zwwuuxsqqpqtrpmn@mlpquxxwxzy||{|}|{||xvuvussqrrqnnmnljlmjkihghfhhegfaccbbaa^_`a\_&[OF601632123,3;A>1,0)02;GHR6?SGL>@<IsPHHH|xvrpnlqsrsoomjjljiprquywuyxvx}z{z{{zuvtstqrqqtqlmnlDijimghfhigfhfd``ab`_^_]`_`_be\I25510645233-23.>9@AMTLTAT[VHCIOI' HtHHswwrtlkpmlnllnkmhfiinmnpqsvstswwy{zywuvwsxrrsqrposlsnrmmlnlmljggfccedd_cic`c`b`^`]\^a]XZTA340,27:2/0033:H5#@@FH?JLVQKRAD>GZWH't HtH uvqrprnnlmmhili:67933PeeBFgg]A:NisGP HHHturqoononkgegigjijihkmnsptwwustsrsuroqmmponmklnmljkiijkgAdedfbda__^_^^]\[^ZY\]]YWB403675255:4;>.$0>45@A:Nw\Q_vdGBY{}FP'HHpntppiljkmihgdegghjolqoqprqqr[qnrsoonllkmofjjkihdggjiicdefdfbc`\]^\\]Z^`\WXVY[UQ6104122:609:8:68:;2>Y`UmqZ_`[Vyvp}|E'HtH koopnklligdgdefghjikinplpnoolmnollnkjhijhijgiiegFhggfbaea\_]_][Y]\[X[\XTUTVSGD500(()/626:D9;?>397Kgd^~~ipVOs{tqx{zyyD2jkimlkghefdebebabdihggilljkkijlijlhjnkijkghjihgfhilfHcddfddcbb`^`\[YZZYWXSVWQTQTTN50(23.*,=B?@@5879QTNhytwSdx}rgwwvvB(ifnlkjfgcgbjeb`ccabegfkjifikkdkggaihefflcegeOfddfcbf`dhf`a`a_^YZ\\ZWWVVSOQPQPJRLD0016/363Gf~E`l9A/,9616Xw}=K^Ueb^qvo}lo^rqqpp@#cdaeebdeadda`^`_^``agidbcafdccbcaeb_dbfhd``aacc^^]]_^^\\[ZYWVTR7MNMNRNJLI<77Q:7?9.A}g9@N=?Rl~uxryKkonm?瞠a \bd__`ada]^\&_dabadaa`_cbd_b^^aa`ebc`ene`\Z`e\]]\[Y]XEVW[VUSSURQOPMKRMPNJEC625<65AA;<:ibOGcUAu}ph^eptaW[_[dF6Jmmll>_^``][]v[\[]\][\]^`_``_dc``bad_accdaca]cki`YZ^\Z[[YXUVXXWVTUQPOQRMOMKJJKLJII90056;>5?@7E_|l\kdqu}zi]fPLbiknnmlkk=Z[_\]]Y[Y^][\[[\\]Z]_a__a^]_d\Yhme^e^\ekdbYXYXZYWUSSQTTRCQPKKLMKKIIFEFECF?54359BHKBBHqkvtSse_\llkj=[XX\[WU[[YZ[][WY\\^jtb`aYcecefc`glh]a[Y^e^[\UUWVUSRQRSPOOPOPNIJJNKGGJEIJD=A8:47=H^uH\}wnczvdJH<@]llkj=;YXWWYSXZ[ZX[\]\[\Z[_d^RTJGbh\_`_[ab[IKNMOVVYWTUXVRTPQPMNMMNNL@KJNHDKJDCAA5=88@DqqYw~yvcmvcX||kcY:'-mlkk=-WVTTWQWYVWXYY[]YMBEKI26700N]MGRUJMREHMLEBOVUTSTNSRRPPMNJMONMKMLHKGAFGFC658TUNSPTQPRNONQLNHKLJJGIIGIMFJGIM'PHH USPUVRSTVYWYH8=94*++/-$*)+9C4/5[>FF@;EUNMRPRNMNMNKJIKGFEDHF>HP^}{lUHYl^vN49I>tsrr@sPttHttHtTORUSRUVSRXL639D6:9430")94/:C43=DC48:=>EGILRPLMMNHIIDHGEGHIKBEHSY{IJx{Zg{~ho{?"6<vutsA'P HHHHHHTPUWRWSTSWU=.+,57::*//'$+7>6:>==ID@<:<=?EKONPKKNIKKLIEIGKIGHD\nxz~tjuPV~5"!)+;xwvBPPHHHt HHHtRQTUSVTSVXK5/*16=>9,13.9<8@A:>M=;>@C>9FUQOQMKJJIMMIGGDGFKm|zgfu|x|l=nnvgc?'-,8<zyxCsPttHHtHHTSVWWYTMTP@8216:;=:06<64-??AC:?H@:47EC86CFJOOKJPJHJKIIDIUZk}x~|so[wɿl01*4:{{zyCs'Ht HHtHHQSWWTS>:?=6JIC;34?;5685FLMKHLGEGGHJPp~v}~u~~ywy}|obWGOqno]cu3BL,3||{{DP HH HHOTQPOB137;0&%14552?C>9>=9HOMD677886/6MMOKIMIHFDGKmmpmu{|~oqtQQgbxXZYdaWLo~m}@^h58}}||DPHHtHHtXT84:9,136:?:<603C:AF9/9;6;KE7GI=?547>4+&9GKLIGJACLDFMEe~kkvwmdh{w`RMBCFRm}ž[gwgb[kg]]i`IKEG8~}|EC<380.22/8?A<>0,;A;=@90:?9HTJ?FC??4)36,&"#-5@HHLMGFGMdvezvsmcnnfwxykDJbCA@HUfqvr}m_HDM{v|aasXAFK<~~}E0-1411-47@B<7--2CE996839?ATLCCF?>?7(16+)$"#',3>D>DKNd}wpmlegfhkt`Xq\CZQ1.1BgmsdolHR]Ogys}uBA?;~F9}8220.5=B>64"35=SJ91934;FN@?=>>=A9-6C=50220+&)/;HGnts}xqmg}kdMvODDC3%+2e^IVjNGa}kHUco;;G~~F>:8610;<@<:4+)65:_U58=42=C@?==8;HH@0+.33220)9[un}}~v}xnwzujayG;12,.Hmy\E;AXfd`}~uZRdfqbGS~F瞠D72/8?DED464,234BRQ9;801@CDA;5EA?;;CQI<./6DFJJC@>~sRJFY9=mv^A=<26X{bF[i`~bgF;.,:?EA;<440.4.3VfV88=84@6BI=8@C:2;VQA>EAI`kqmd^x`Er|~HDC:60HnOJ;1IOJghcds`e{voF:,2BAB>:=-17026MI40AZYk{rfm{{vŲrEWZ@C:.59jS>91;~xyuZEFVRVp{d~~F9-1??AdWFC<>F{t[ZT>:5Nlo]R}~FN:02==>>=H75H95<;>WY@6CECB?MO?DA8CBMe}zk~xkuX@C_-rQD8/-AlMPKHIJrw{fN4:ORQbcazsfUo}}~~F5698?SGB:=@99@LK6(LO8IERH?FD5BO]}~|~w||zQ7;HoZCWL:>SemjFD=CFGJQF>Acu_UM]G@MXnedRFF||}}F:EH89A:-,1,(.*FHDt±ǃg^wOJW\bxt{{|FstHtZ867D@5+.,!.ASfò{pp}llwzz{{FsHtHHt87;DE:>C=PZNCSBF[XD>:9JU@JA6MA?>PqcMdsvaiieihXyyrtvJPFI>;786?CkwqaVdurnmdieoxx]wwvwD' Ht 5>=BO142;:9PCC:@C@;1@?RLMU=7Jmd:cry}styaexebwKF;;:;=CCDL`[HIFAH[p|{rzvyuxgolivyrRY{uutuC2MKG<6*?E879CMCGV>82NnebXVplZMVeq}tSQE>46:957y}`jhvtsxdj}{qvwy}s|àttuC1GDK@GGO;>/"7D067HSVIFENFWjRYzkcq}e_vqivz|{Xwbet_S@=1137:D]{z{f{phzx~ttuC2IHLUFHOH8."::4KNTCM85MHIEQQuu[Rf`Weikahcmr_kvZK@31611>`j{yv|}v~~tok±uuvCu1/BVliN=-$>JKFUIGMK@LUXhcZe|}oKG̲zswgD89B?>:FE@FQQmwsjr}»ҾȴԶH?85@EE`IHQXgu{{oiomj[MFy}Ǵ}H?51:G39;7:LMLQquzpɩѵ½I8:9-9ShFNRcwYhtjIXKqʾн|Q:,-3D<543>CAYںŴtō°ɿI943+*8JPmtojj_]ke]Utνּ_eRaYA7CWZ\oӨɺ{zJ'H>5.408_m~xbkd_z{ƼѿyDC[Ͽǹ¯ĴJ'tH76737ZmbbX}x{wvƳʪȢϖN_ٰʝmŷJstH1282DiY^|jhҹxƋkļɹJP'H39<^zdOY_TTj`}w˶ĵpܿ¾ǿTIP'HO}|lb`jqrbbTmuĞ㽶p|}pɺXIP''sHt}pv__dkttrcoǪmƳyx|rqlgoxrptx˼ɷImvjsu`febz׾uuDZ}lbhŷIFq{|mj~vtʪȽҭƼ$ цIbryfu˫p{wo^mpŸɿ̽ԷǺIgpl໬|q^QT_TWRûï°˰·J瞠foYLoox¾¾ǟuWTLOWjqul}װ—K}}qa2FV\hĨλıtskwsƮʉLeMRXQ]ϥ۷ū̬wgyy{xϵŪ}L}`YlǾtϽxbgTv{x{yMwjzu˨ǭdfͨ{yrNf~}Ӫβ~vr~rҶη¢Nup̬ⱊzسp㾻һʰM's¾ͨ׻ûӵddz̹L'tt wxxY˫Ĭٿ¶mԩйJPtt}͡ûܭɵt|{دȷ޹z|}~H'HHtH i0ĠαoTQmͲ;ƽŰwxyyFs HteqӻxĦȣ_eɶƼŽrstuC'tH|ʻҽ{µӼymȾʹ¿лopqBsHHHHðӼ͹ЫuƿȾqgsʿйŻmn@'HHvǫھͮ˳̴ۮǿޝ]J|Ż޽íʿmm@sPHt}mpȵ˶ȿŻ۰ŗҐJahn˽ҷsnn@wd϶ƚſ¹Ժ׶|W\xǙӽǘqq@`ƽźԸǹòğ躬ĂylO]»²ɧvuBҷķ֯rݸÏ_e죁پʼ˶ǣޥzzEyƺƳɼڼ{˭ocYhÿĺεϻسG瞠~տݽɫѶзѾꯔ򭘏|~ŴKŰ⽵ƫǫŘиø̐ݴƻx̩snsٿNũ߸ֽڷߨƖgbdegPӯuyĿЭ˸Ȯؿj]acdp R⼥˸bjíǼճ{ch_c[`\g!TNʿөjXgϾ嵧-zb]dv[c|qc\g"U̸߽oIfοĬʺ|aacdokmaR_jڢý"U'Pʠ۶zcLOzԿʕp~`^bbdnգrZtجǽγ"UsPƶϪsZL@oԕ}ánuxVZW]deعʺxٴ#UPsHtŝiWq~]ӳgGQU[VVWZZ{ɾ࿻{ȼ#U'PHHҼڭθ۲zڶw[TGFQUnx\ZesϻᵷϾƸ#U''tHtȻϙЧֶϷ¿էx\HAOqycӨȷ#Us' HɿЯ̰ԩ~|ͧs[U깏IJն#U'PtHHǖ¾ӭrolyjRA8HS^w|ʮɭVSeկ߿ȿիƩ#U'PsH㫨˵b𴎓p^P\oz}WG>HEG~սϳ̳ܿ̕#U'PtHHt۶ظ츍p}yR=>OK[dL?RwèΥ¶ҿɺ#UxǽƪyP:5=4:qL@:bۼ¾oѼӶʦľû"U˹׽ð[B:=>::845?xŽͱř޿ų콭"UǺκ͵NNT@689921:lǹʾмگ"UѻǴѸ~K[leK8170*(ZȰɢ"U瞠̵ȿɇUMQbgQA70((E᯼ֿšвͧŰѾ!Udz̯ɆʒZMBKTWTN@5,@ǵ_{鯗̴ U˭տ־[D>=KNSSNNKVǪи`PqΧ T¼ĭʽȺ˼b;=:>U\XVOURǵ˰ʑ̤ϷʿzϭSȾĦ½^BD=:DIVRH[\Rͽɯƶ¾ζƺ̾пR˿ѸҾèYA<<8:ONFT[Y`碹®ķ൵ij˨ӤݷʱQ'H·ػǃLB?CFBZQU\_fqᩰΥú̈觧ʮⱿ㿭ʹP''ttH«ÉWˊJ>BCvwywp@hPnhv}î÷_~v+:K]zj"jw[h8`Hxph}}ǹj}y106=FNWW!шezh``XPPH@8`XHpph`XPh}μl~|A&+|ojl{xhxph`XPHɬxʭh}|6y*$3ykυ\v~VxX`hXPH@z ˷c{{B-1;rfȵp]l|~~VxX@xHH@@¾v ɦ g{{=0?Ffvamn޷ndy}}\pX@x@8p ħ{{yFy5NMsϤrǩZt}}_hH0P@@88 Ķs{yy6}5\WڭύSp}|bhXPH@8 yyx4Hhu|vO޹}۲ՖOn||dÿyx6¼za}sSDs~rŞĢLl|{~ewyxw5uSojfiޝ@`ݧrĺJk{{|e~zyxxw~4ȿJj{{|~Qpwz{} }{zyxxwwvuww~)՝ȮʻРşºī{ Å~*э>=:dͳâż̌" #-/257:=@@ABCEFHKPUZ]`beeb`^\[ZYXYYZY XWUSQOLIGEEDCB;~>%̻δ¨ÿǽϜǯۅ|>%ɸ詬ʾ҇¸ۅz>%תؽΧ~۵ۅz>%ڰϼצۅx>#κ흴Ŧz{ٲۅx>#ش똧߯ʼynزۅz>"үꠟ߾|ֲۅx>!ߥyղۅw>׻}Բۅv>Է}ԲABBfABۅw> ӹyԲAAAۅw> |ԲA#ABAfBBABBAAAfBBBBAA}AB}aBy>ƫء|ԲAAAAAAAAAABBA}AŅu>Ʃ~ԲAABBAABBAB ABBAAAAAAAŅw>óԲA#AֽfAAAAռeABBAAaAAŅt> ղA#AAּAA텡AAԻA졡AAAaAŅt>ղ(AeAABAABBAAAABAԻAAABBAAB}AŅu>Բۅt>Բۅs=Բۅs=Բۅr=ҹۅs=ߵۅq=ŷز벅p=s=p =ܠZWTUYYVZWZZY]Y\ZZWWYUVg]ZUVZ[YW\[[WVXYWU\XYYVVW\Z\\``^\a_abd``bbecfeegigijknmklqxp=.YVWXVZSWWZWU[X\YWXWZVUWZXYWXWYWZZWZXXUVTUWWVVUX[\^Ib``_b`bcbabccigfgjhihiklkoxxzq=\VXTXVXSVTVTWYWWYW\\WUY\\XVXVWXVVYVWXSXZURSTRRSUWZ\Y]]_^_bcd_ccdb_`aehgjkjljkknrrv|p=V`UZRVVXUWVYXXWZZ]ZYYWVWWXYY\WYWZXYYUUVUTUROORSRVZZ_\^[^``a`dbdb``abbdgfjmlorxy|{r=,VWSXWWTWXVUWVTYWW[VVYWYYXYWYZVYYWWZYVSTPSRRPPR TWY[Z]Z\__`!becd`cbbegdgmorx{~q=XUTTUSSQPTUTRVTWUUTVYZ[ZXZX[XZV[WRQPNRNQRTQSY[_ZZ[][[^`b_^dcd`fddggfgjks~r=ǯX[TQQRTU SPRQTVZYWYWZVS]ZXZZXYXYVSQTQPOOSORɲטVXTSRQRQTSQSQRTRVWWYYXXZ[YXZZXYTUVRTSQSPQPRSZW\[_^\_]^_bgfdeggotvzv> 䰹pUVVUPSPUQPSNMOVVWUYX[Y[ XWYZZ[WVUUTUOSRPQQUW]Z[[]`_^^`abAefdehinqx|}v >Ĩ`T2USQSQQSTRRURTUVTVTY\\[WVY[\[XYYUSTUVSRVLOSVXVXZZ[^_]6_adaba``cepuy}}v >XTVTPPSSQTVTUSQSUX[ZYY[Z[WWXYXCVTTSSRUVUUVVWWTWY]Z[]]_^``ab_ba_ccjt{w ?̀p`w!STRPRQRQQUTRSQRVW\^]Z[Y^YWVUUWSVTSR#STXTWYXTWVX[]ZZ[]_``acddcchgtv1w?v`hTPCQRURWQPQSTTYZ\][WYX\]XTWUUSROQQNPSWUUTWXUXVUZWXX]`^__addfelrty~y ?΢x~߻(SRSRRWWVXUSTSTWZ[Z^]VWY\ZVWVVTONNPPUTUXTUY$W\Z[[WYZabedbdfejnmty{ |@Δ_avxh߻ SRSRSXWWTUSTSSYY\[\ZXXZ[VTUSTQNOPR?TWTWVX[Z[Y\\[^bfcggffjjkmluz~~|@hPzx˭PػUWURVMRVUUVXWYXZXUYZXWUTQRPPNNQVWSUUVUXYWYYXWUYadcfjgnqpplrnlux{ ~@Pxş@ػWUSTVUVUUYY[Y\Z:XVSRSQOROORPUSSXWVYWV[^ZWWYZ\`baejhnrqrqnnpwzw}~~ @ŪP؉`@*ػUTXWSXXVWWVW]\[`[\ZUXYRUSRQbMRTXTUYYWZZX\^\[X[_b_`cfilnoqrsnprvyy@˹`PKحAAػRSUTSSVYXYZVTYX\]YX]ZUSSRQOSPTSNVVWXYUZ]\YY[X]a^_a`]dllnpqrrsqsouy!@ðgAػ;SVUSWVYVY][XZ[\ZYWXWWUSTONQPUWUTWXYVYYZ[YY\\afbbcbafknmtuusvw@{~ AЧػRFUVUWWU[]\ZZ^^ZZWUUTUUQSPQSSVYVXUY]Y[\^[Z`adjjhkedlmlkpswtx{y}/ AػDVSUXSWYZYX[]^\\]VTQRQRTQNOPUUVYYZXV]\`]Z[badgmnklmlnmjorvxy}{} AؿؿػSKUWWXWZZW[Z[WX\WVTUTPPTQSTWWY\YY[Y[]^[[]bgikorsprpqssuvywz~  Aؿ ؿػR/[WWUX]aYW[[YXXUUVTQOSWUSUYZZYY]Z[XZ\[^adintrrtrtu0rvvyxx{  Bٿٿٻ2SUXWUVYUVXZ[PUXXVSTUSRRQPTWXZZ\Z[]^[_\\`djjnrqpqtw{wyxwx{!  BٿٿٻVUVX.VUUWYXWZWVWUUYSVVTRUY[^^]^[^\^]^adcijoopqrtzxuuv wy+CٿٿٻUTW[XXVVUYYUWYZWVX\]WXY7VX^_^][[]_aa^``hlqpruwz|ywttvwz} CٿٿٻWjZYTVXXWYZURQVWX\ZYXVWUXZVXZU^\ZZ_abeacjjotsuy|~{{xvquvxzCٿٿٻUYUVTTXZYXZWTUXZ\XV[Y\]YY[X[^Z_\Y]]`bcjkjkptsw}~zzxxyrvwx| CڻSQWVWY\[YZXZW[]][V[Y_\]<`^\]YZ^_\dgfjmlmqnuzwzwwxvwux|~~! DpڻS_USRSY[^WYZ\VY\][]]\\^^][\[_[[\X\_iigkqnnpwuuvurtwvwu{D PS TW[\[\ZZ\YY[Z\6^\^]^\][]_[]Zadhhkosqoquuqtvsrvuvw{~~DۿhۿRUSSTVY[[\\[YY\[ZY\^Y^QZ[Z^\Y[Y]^aaehlpttquvvrwxutsrtv{~ CۿȸXۿSTRSVW]Z]V[\^\^\Y]Y^[[^\XZ\\[\^\]bekoprsvxztBxtprruty}CܿؐXXPܿT STXYZZ\\[]^[\-[\[\\Y[]\ZZ\^[Y[^_bfjjlprtuursqtuqtxwx}1 CܿаPܿTUTRUZ[ZZ[ZY\\[]^Za[YWY[]ZH\^ZY]^dcijloortrroosruxx{}~} CܽȠHܽUTXTW TXZ][^`_]\[Z[5X]V[Z[\_`afgjrtpnpjqokrrvwxx}}y}*CܽHHܽUVTWXWXYRVWZ[\\_\][\\XY[\[XWWZ\^bacghjmnqrmlrssrsw{{|zztyCܽHܽ=SUVWWXWXUVWZ\^\\Z_]^]Z[[__\\[\]_cdcc`fhilolkmoojoimquttx{zzxy$ Bܽx@ܽ$WXWTWWXZSV[[Z[\Z]`_][\\Z^^[]\\Z[aiebighloojlpiiknsrvxvvz{ BݽpXXPPHH@@ ݽݷVYWYVUWXX\ZZXY\[][`[Z[[`_]Y__dlidjfdfhjhgfgkjkoopwvwvvy~2 B޾ ޾޳[WZWTUZW\^[[\[Z``^aa_a\[]\\`]_fjookkihhgdfefegfiiklmmqwx{z{~ B޾ ޾ޮ)ZY[\[Y_^^[\[^Z\_^a``^^\\]^adbbsusrprjlkicgfeghhlnpmptu{}||A޾AB ޾ު ^[YY[YXZ\[^`^5][b^]\aa^[_cfhoxwqspooljjiiedaegikhhpnrvvz|} A޾AA ޾ަXWYZ]ZVX[_7]^`]]a]_]_``[ahkpwyxqpnolghjiiecbgjmkhkpnswvxzz}+A߾AABbBbbBBABBAA߱AbBbA ߾ߡܴޔwv޹ݔW+XYZXX[^__^_`d]_^\`_\\_ddhnuvwxwnmijlgiihhegfk lmhkrstx{8 @߾ABBAAAAߙAbAAA ߾ߞ}wѳVYX[W]_^^]a_`a[_]^=]^`delrsptsqlmjjllkhhjhkghgiopomprsvvz  @߾AAA A߱BBAABBAAAABBA ߾ߚ֡yrryv'USVWZX]\_a_e`_^^_\][\^^abclqrrusmmnnlmljh*ilihjhnrrsmstywz}~  @AbA AbAAAAAA ϐxyvZYVSWW]^_`a_bb`^[ZVZX[Y__eiotqpssojjlnqopojkighikmpprrvuwy{y{~ @AAb A᳀AAယAAAAA  ˮ~xrrx~vx9XVVZY^\]`badbb_\\Z[X^\]`frsstuvvokmpnponpmjkhiljmpprrptuxy{~! @ABBA$ABAABAABBAAAAABBAؿ rrvg[XYZ[^\]bcada_W_YXZ[^^]]fntssuqsklomoproqlhjlolklnroppquxx|{| @ӽ ѨrrǢvDUWXZZ^Z\\_adb]]Z\V\Z^_Z_eoolprpqoqqkqqtosplkoqprkmqlkmortx} @Һ ѿ|ƿzsƈ||vWYZYZ\[^^_a\[]^Z][Y^^bfknmnprnpsqv%orqoqpqstqpkjnmnrvz} ? բ}vթvv)TUWX[Z\][_]_`_\]^^a_[bbfhlqsqponorsxvwuuvsqr yuqklopmqx|| ? ᳤ V\[[_\\[ZY_abca`adb__eejjkrsso7louur{wtvsrqutvwwollnoqpsyy~ ? ɚ []^^_\Z[_cab_`bcbbcfgjnquvroqCruyy{wyyvvurvvusnnmlmqqrqry~~}{ ?հ  \Z[]\^`^\]^b`cn^dehjkinstsprwvvxyzw{|}{{vtturtokhiijlmnnqy}~~~{{~ >͢  [\\_^\][[_]`cddfkmlosttstyxptzY~{{xuvsrsnkhihglmpopxy|~}|{yzy >} ν []^_a[__^__`_^`_bdafklrsu\qkvtr{zyxz~}{xwtuxuqpmjllpsvrpu{|~~~}|{z =} ź  \]^^a[_`^]^_ab_becinnuzwuuvuoovx}~yz{zzzuxyxvssnpnnuxyutz} |{}}yzyv =}ͻźUZ^_\\[^b_a\_^`dedfglqqrsuvyusrmvw{y~||}y|}~{zyuusqrsqpstzz|{~~&~||~||yxv=̬źW[\\_`^_b``cb`dfghkqrsvxyxzwwtsvuy|yxwzy~{wsvztrurpiquyy}z~~}{y{wu <ʦCX]\]_[`_^^]acbghknptrvvwz}{vwtqptz|vrswywtrruwutrnnmprx{}0}}zyxu <̣ZY_^\^\n]\_^agefiqssyz}~}zwvvssuvurtwxsrrpopnnmnkpprvx|}z}}ys ;tY\`_]\Y[]\]\a_`cfkrtuvy}||zyvwttvuvvwxusturoolkjnmnnrtx|~~{zyws ;gY[_]_^[][^]aa__dhlstvuy|~|}z{ywuwtvs{yxyysvvsrrqlljjonpoqvy~z|yxwp :XR\Z]\]^[^`_adcdeeikquuwxzzwzyxvstsy~}||zuwssuqjonlhhnsqty~~}|~}}}yuzyzxn:Z\YZ\A][]\a_`cefehhikntutuy{zzxytwz||~xvwurmlmnlljhkqsuv~}~}}}|{xtyyxvo :]\[^\]^ []``dfhifeippvy}ywwx]z|~|ywpmlolmilommrsx{~}}}{xxtyvstl 9mZ_[X\Y\^b``Y]cgeihgekqpvzyxwuuqtq|~{}xttrpnpkolmssuuv{}}~zxyxyyxvtuj 9ޟ Z\][]\Y]`__\`c*hjhhlopwttssrqtvv{}~zz|yvsplnpnonnssvuv$}~|zzyxywussk 8ޟXY\]ZK_^_^^`ab`emgjmopsprsqrnqssuvxxyx{}ypoopnqqstutvuz~~||{zuttwttrj 8߫D\ZZ\[^`_]\^a`bgedhhjqroioqsupjkjkoursxzxwtsrttssuswvsxz{7~~}}~~x{zywwyqsvrg 7jjj[Y[\[^`]a_a`ccegijjmqqnnorsplj fioquvyxwqtvwtwty{zz{}#~|z~~~~}~}|}~~~~|wzz{yxwvtrrg 7jjj'[\^\\a`^bac`ehggmojnppmqmormklmmjhjqtvwvurvyxtswzzwz}}{zyx|~}}{{~z{|yx|{}~~||}{wuwywvtusrrf 7jڸڀjjjjjjڀjڦjjjjjڀjjڎڎa_^`a_ceeihhjlorpnssppoqonlqmnintqxxv1uww{zytuxyyuy}{|{y{vtsx{zw{xvwwts rtsvwzy~|{}{}}{|ywzxzxvutrtrd 6jȥ٥ٓjȥٓjٷj!ٷjjjjjٓjٓjjj`^]^a`_'degjjkklpvvrrsrpprutsrqmkqqstqqsruuwzyxwx9tx}}{{}|~zxyywsrswtrtuwstoqompoqrtvz{}{||}}|yz ywyvttpoqq`~6jٷjjjjjjjjjjjȥjjjٷj%^_b`]]`_ecehihloppuvvtusrvvwvvtsosrrutq'rtyywz|wxxuutty{yurtstx|xuwxroqs+rsqprqonolornqwux~xx~}|~|{zzwwvwwtsqrnrp_!}5jjjjjjjjjjj jjj jjȷjc^a``c``edegjkjmrtxttvvueyz{vxstxutusrsuuwvtwxyyxustrqrrpoioorsvy}|z}}wxurorqruqmoommqkkjmjnolopqptsux{|x{ywxuuwvvtqmnmn\!~~5jإإؒjȥjإطjjȒj jjȷطjb^_`_ab`cdeljnnrrsrvstywxustusqxvusrrttuDwzxyvuusrmonjijjlptvxwxz|~ztqronmlokjinmmlhjmjmpokmkmporuts|zw{yxzwxursqno_~ }4jطjjjjjjjj jȥjj jjjjj^[[`_`abcdfikmnp$stuvz|{{wxxtqywyvxvtoruwytxvw}yxxyuron/klkonosyux|}}{yvstpnkhihjjmnllklloommpjlkmprorswxyuwrrtrrskmnna ~}4jjȽY\Z^\_]bdhhgkmrpqrqrusuzzyzzwywxyxwxz{vz{yx{y{z~{{zwuprpovpljhhmswwzy{xtwrrpoinnjlkknmkjnmkllmkj lknjkmstwxxwyuwvpnmponmj_ ~}4jjjȽUZZ\\`abfgmpnps utwwxz{zyyzyxz|}}~{}~z~|{zxvsromnlkjlprpsuxuurqrnqqlnoonnmhlkilkljhlkllilruvxysvsonmkmh]~|4տտ)WZ[[^`cbdgigknkopssutssruvwyyzz}yyxxtx|~~z|ytrsonpqnokhijhnnpsqxsnnqo(msoomjiilhhiijjljggmhjjfjlnnsrvvwxvwsqmrmki\ }|3ՠ[]_^\_aajhhmkkjqqrtoqqswqstxz~|5wyy|{{wpuquutrommnnjkllqqpqlnmnnsmmkkmijjmi$hffehhggiijjlhoprrstxyusvsomnlmnj[ }|3[Z]]a_cafhhihhjknnqoqpqrsuux{{|8yz~~~{z{xsvwxutuuomllmljhjjklmljlmqqpkjijkjljgh"gdfegedefggmnpqqrtvxwutrrnolmli\~}|3OZ]][_c``bijeihgjigkkoquvtyxuz}z}z{~~|zxxwruxxwwvwsmkmlkljljehkjimnpon,kjijkhghieffefebbfdehimqpqqsvwussqpmollhg\~~}}2ƼRZ\]__^^baehdhigijiimqrtuutstxwx{vyzzyzxyxttvvxxvvrplmjmlilnkfgkmnrpjilkihjheecdfgfgihhimkqruvussprpoljkhY~~}2]\\^__`cadhefijhjnqqprs'qsuxxwy|~~~}{xssw{yxurptmmqmjhijhoolkijjljhfhhfjghgiedfddfhggklkmmru turspmjgjfU~}2ɊS`b]__bcddehagifiklnmnqpptppqqssv{{~}{wsuv{yxvxssopllkjihijjspkfjlilmhi(fgejghhgaefihhiffhjhhksuvussrspnohjhdV~~2g`acbdgfbadgghiinlmnnqqssqronqrsw|{}~}{}}zwrwxyyzwwusqomkgjljlknmomklknlhfhfghifeffgefefgbfgedfkqut ussnkghgbdU~~2 cbdefkjdfhgcgi jlonrquvuutr ux{{~~{5~}zywz}}|yxwvvsnpnjkkhikjnljkkjkhiihfiiefhggfheefgfbcdfgkrvtutstrqllggeeW2fcehijiki-jifjmqsxv{yyusuuqvxz~{|}~{{~}|wussrtrmiigihjjijijikjmf(cgbegffehfecggfecebdhkmstuqqsqqlnhfedV2+egdgjjllknmhkkhjmptzw{|z{wuzxvz{~ ~{}|yz||xvsr;nljgffkighijgijigeefehgdedaccbgbdcedgceljinrqrtsrnjhiffeV26khighkijkmlgklinossyw}|zzy|zz{~}~|xw}|zxwvusrpsqoopjjgiifh/egjhebfefgeacfdecceeggdbccdeklorqrsrpmkhgeceY2jk2mlnlnmmkmnmqswuvvy}|z{y}|}{~~}z|}|y%vuvtqrruqqmikmghgghhifhggebdegfeccddeacfebegdeknmrtvsqmmighggfU2lpsmmorrqppqsrusquvvx}~}~||~}x|~{z|{xvssqoqsonrpopkhjhjhdfegefeeabbcfebc_cgaecfgdeebcbheejoqwuvspsqomgkhhV1mror"orqoppuqrrux{}~|y|}N|{ywwsqoonnlnmnnlmnjijhjkgfghdfecbc`bedbbadda``bdcc_dfafiginouttrpqppokjhhX1HHptsqmlttqrqppqusvuwwy|J}~{wvvsqrnmkmmkjihijkklhfggegjhhjdd_dbccadc``ba_^bcbcdcdfhhmmpprtsqqppkhhgS1 HHHHttHrwrpqsutsqruvvyyv}{z|}f~zx{yxuswuqpljkfjijklelkgihejifiiggfcedbdcbcdbdbb_ddc`bbaedeffhiklnoqsvtsnmjhhgT1HHHHHH'HHHtHHtHHtHHtHHHHHsrwvuwstwwvvuyw{|k{z{}}{usvwywtsqonjfhljihgihjihifdhgegghfdd`cba`ceccbab`ded`bcefgdegfijjmooqspomnjihfU1t HHHtHHHHHHH-sttvtvtuxwywty{|}~{y{{}{~|zyyuxvrpojnmkghgejhijghih7bgigehgffbea`_`dd`adaacc__\`bdeigegghljknkonlnnkhhgdT1H HHttHHHtHHtHHntsstwquvxxzwz}}{zy|x|}~z|~~wvvstpsutrpqmjhhifgikiifjlhfjkhghffgcggdfgcceeaebaa_]`]__bbfehhgijjijm ljjlkkgifdR1HHtHHH"߿߿Ht߿Ht߿Hsrtuvwwz}{{|||}}~~|ywvvr=trqroljfihfihiihffhideicfdaghieefhegeecagcbccba`b`cddcfhghjhhjiljijihifQ1tHHHt'HHt߿tHsttuuxXyzz|}~~~}}}zxvxwsnqutqpopnljkghlhihiiljdgedheefdfefeffgedcdcbaa`abba``bfdehmkigfgjkhjjhfgegihgQ1tHHtHtHttHHttHt?svuvy{zxyz}}|y|}xzuvwstrotwutoomkkillghhjiggfiediedeccbcffecbabc`dcbcbacebafcggigfiigikfggjgefggefR1tHsvy{{y{{}'~~~}|u{|wxussrpnqprqlokjh gjglieegfehjjfdgeddceedcddacc`bcbcbca``dadcdfiigfghigfgfhfecedfhN1tHuwzyyx|{{}~~{||~~{}~y}~vz{xuvutqolnrlmkkljlfhihjilihhijjfjjfeeccbeddebddbbdbedbddebb_bcbcgbfhegfefdcfjfggcbceccdedN1tHZtvv||xz|~~~~zz}{}{zyyx{{|~{ysttvtrqpptnkiligjldjhfggfhmjglhehgeghhgefggbebcd^bbac_aecbgdffeddgiebb_cc`aa_bbcdbaO1tvuz{z}{}{z{|}{yyx}~~{{yvuywtqrttspsnilmljlkehffgklijjehfghghi3fdbebcdcdecacbbcdcefeeddefbdcbbdbbdbc_a`c_`bebb`L0sxwz{~}zy{wvywy|{zzyvussvxystsqpq7onqmjgjkihkhegghfijlijfehedgihgdgeffeddbdde`debd`cceeccdaeddeccdccacab]a``^]`a_d`L/sy{||}{|zz{yussttswsutw{utusqrromkoji dchgefhjgihhcgfehhffhjeb1gccdcdeedaacdcb``bccefdbebdebaabfda^``^__\a`bbL/vxz}~|z}zyywuqopqrssrpur6tvutsttpoqpnnkmmkjihjdcfgeijighjjdggfdecfefgcecaacffecde cbaccdb``bcbaaebdba_a _\[^[_^^aL.yzy{%|{zxwsrppopssqsrsrpnrtsvvsqqpnlpmjlkikhiefehddfdghfehifddfefhcdcb`b-ecigc`cca`_ac`cbccaacaddfcbd^b`a^_^^_^]\^aI.xw{zz}xx{ysrpsnopponspSnoopntuqtsnqpqmikgfgihfhidggbggdcfhceffadbdcbebdgbac]d`a`adbcgcbe`b_c_]bbd``aa_^`a_`_^]_`X\^J-{|z}|wtrptppnklmqomqlnrnrrsp(npolkifhhfeedfggeedgddfegfedaac`cfa_a`caaca`bc)dbcb_b`cab^`bccb`_^``_`\\]^__]_^^[^]a`L-l}~{{}yssttqqponmjklnmlmkkqmommnmnpllikfihifegieffdfhefceddfccba`acbaa_acbb`b`db`aedccbb`a`aba^_`^_ab]a`^]__^\[_]Z]^\]\G-϶L~|}zyzyxvstsqnlklmmlmomlkinplpnomoqqiliigghgffgfebeedfe_accecadbac`aba_cba^b`_c__`b_^` \Z[\^_^[\]_][__\Z\^]\VYY^^[Z[H,϶}'~{|{yz{xtqpmkkjjihkonqlkmmknkomoplljihdefecfecfcfgfeeddbbcbb` ]a_a_`^_`b_]b]_`a^_]^_^^[\X[[]XZ[] \^][\Z\\ZX[\\ZC,϶U|~}{~|{{yzzwpnjhidjfhjikljhlkljipopjikgghhihecchffgcdeiffdecbbfaec_^``_a^]`cab^\`_]^_a^ ][\\]\Z[Y\X\[\]_\[\YZW\_^\\ZZ\^\E,϶C~~}|z}|uupiihfgikjjilhggejhhimnmkkjfheeccigfhgifbdf`baacdfcdba`ab`8a^_``_`a_Y\_b^^[Z[_\^XYZ\[\[][Y[[\[[YUW[[XX][Z[\^\[^]F,϶ }y{|xopihhijkjfhjfhigiighghkghghfGdfdecfebb`dcecbedfcdbc^c`_a`a_^\__]a^Z\_]\[][[YZZX\Y[Z\YZ[\[[YY]\XWZ\[[\[Z\Z]\C,϶AeAAz|{wolhghjgjhgfgfhifjjihg]jlgghhghgffegfcbcfbbcfgcb]cabbc``^_a_]_]^_^_a_^\]_\Z][ZX]\[\Z]Z\[\[[YY\ZZ[TVZ\\]\]]YZY[X[ZG,϶AeeI}zzywvmjhhgidkffgiighgfkljjheefligfggbehdcfgdbdfdbagbb_acbaad__^^][\_]\][][X_[Z[]ZZ[ZY\[W\[VXXYYXYWUWWV\Z\ [YY[]\^[F,϶dAdd,~~|yvwtpmhfgiihhiffihijhgjighhigeighihffehf-edcdeca`gcb_bdda^c``_^``[]^\\]^\\][^\YZ]\^YZYZ[VYXYXXWWZYWX\ZZV\[X[Z[[\_[D,϶ddd}|yyxvrmjihijghjgghhghgcjjhgijiiggejlhggeffghdcbcaca`daa`aaf__^_]a^\\Y\^^]Za^[YYV^[]_^\\YWXZ\\[X]ZWUUWYYUVZZXYX^]\\ZZ[Z[YA+϶AccAA4}{{trrspkhfnkkjhimjfkhjfgifhghkhedilhfehlihgfgebb`aba`_`]_a]][`^]Z\\_\^[YY\]^__\[]\\[VW[[WWYXWTY]]WY [^\YYXTVYB+϶cAcAA{urrpnmijjkhkkghjgefhjfhiihgkljmkimjhigifggcfdbbca`_cba^_a^\]c]\_5\_\\__]^_\^][]]\][\]\YXWZZXTZ[YVWX\[_[Z\XYXXYWZXWXB+϶cAcA}ysstpnlijhijhffhjkijhekkloomklk fghdeeccb__c``_ c_`a_``b_]^\]_[[Z_\^[[^_\]]\_][\ZWWX[WXYYX[\ZZ\[[YXYWUWXXVUWC+϶AAbA*|zzttnmkijijihgffhihjlijhjgpprqmqnnjjlifeb4`_]`a]^``a`]^_\``a__^_^ZX\][\Y\]b_`\[X[]Z]^\\ZZ[\ZW[[Z[\[ZYXVVUVWXTTXUWUVB+϶AbAA|{|zvssmmlkigki hegfggljmjmoqsrrnqsokjfccdcc`_b>`c_]^__`]`__]^^_^ZYWY\^X[][_`\[[]^XY\YZXZX[YWYZVYZZ\[ZWVWWYXWYXVWVD+϶}{yxxrpqmgjkgmjihfghiomonlqrqstrniggeebbcbb`\`ah`aa_`][\`>^]\][[^ZZ[Z[\ZZWWZ[[]\Z[Y\\W[XYXZXZYWVVWY\[VVRWXTWXYWVUTXZUD+϶{iwrrnrqmrrhjmmjikmhgilkjmnprrsrsusrnolggfc__b`c`^aa`aa__a_]^`^]\]Z\\Z^ZXYV[]Z][WX]YZ\^`Z]XZY[ZXTWVUVWUTUUWUV TUSVV\VVWTVF+϶{sqqnm>olkgilkjlkjjmmkkoprrnrrqrqppmkidbdc_bba]``b`a]_b]_]\_`[Y]ZZYZYYXYXUXUWY[XYX[]WZVWXZXVUTWVWVSTXSTSSURV WUXTSRVI+4}{urnpomjpnhiimpnkklknnomppnnoqtqppmkkghc^aa_ab`__\_^_?`]`_[]b^]]YVWZVWYWSRUUVUUXXTYUTVVYVVWUSUVUVVUVSWUUSTRSQTUQUWV[UWUVH+>}{zrnoklomjnmqqrpjnnmnmnoopnmooqrronnkccbab_`]\a`]^^_]__\^^_[[^\[YYVTWUYYWWSTWXVTUWYWVXXYUSRTSRQSTSROTWUTRPSTVQRSVTUXUSTE,zytsomlmppnnttrqmnpo;nmmnppqoomiffee``e`\^`]^\\[__\\YZY]_]\]YVWVWWRUSRUSTRXVTRRVUVSUTPRPTSRRQRPRTSTROQQWWTVTVTSSD,w yztnqppttpqsqlnlnmlnorpnommomqnmifeea`^]^[\[]`_^\[[Y^]\\]VVWXWUTTRU/WSVPVWUWVYNORPPRPOPQQOPPRPPQPSPRPSTSZWTTSUSTF,zw{ywtsrpv+wqurmlprnlpmolonkpmhjnnlciggd]_^]]\b_`^^\a]Z]Y\@WVXTUSWVTSTSPPXTRRQTVQRTQSRPQNNPKOROQQRQOPMPQSTQSQUUSTUTVSPUSG-Q}{{zzvuwvwzyysponmonqmnmnpookmmkihgfecacca^_]\]]_^_^_\]Z\]\XZZWVVWTWRTSSRTSRQYTPSSQR&QRPLKPOOPLPOMORQPOURRPSTRPSTSRSQQTRH- ~|{{}}|{xz}yxtorqkmmqnpnjmmrokjjgf ceba`]_^_]^`]]^[]ZY\\[YWUVUWVZS TNQRQOTQQSSQVQONPQPNMKOPLLMLMLQRQP MQOQSTSPRQQRSORF->~|{xvzyxtuppomqpopnmmoopmlmjghhfc`bb^^b]`]\^_][[^_Y[V[YZYUVVSV;ORPLSQQORSPNMQPQNNROPLPLJNNMOMLNMNNPQNPNQOPRVRSUPQSQQSSQF.AA~}zxzwxwyssqppqnkokjnnqnmmokjligdfdaca]^\][]]\[ZZ_]^YZ[ZYWXVSTURUT3QONQPONQPQPNONPNNPNOLJMOOLLONLOQOMNMMLNPQOQWPQUPOSORQJ.AdHHHtt HH}|zyvuxxwwuqrorvplmkjnqmnkjihgc^__\^\]Z[][Z]ZZ\\[WV\UUWSRRSSP TQPPTRNRQPOLMNOMNPNOMMONJKPMNPMNOMMNOPPQSRQNOQK.dHHH&vy|~|zsxwtrptrttqpnmrqokomomllhfgc`^^``]#X\Z[\[VZZ\ZXZWZXVVTUPTTQRQPRQNNLPKNNM.NOQKOPPONMMOHJLJONMLOJOMNOSMOOMOSNNQPPMSQJPM.dHHwxuywyuxussnqrqtnpmlrpqmlheecda^]_\[^Z[Z[Z[ZYXYTUQOKQPKPORON LMOORNOONMN#PMILLONLQMNPKMNQMNMMNNMOMQRRNKIDK.dHHtHH{xtvsvsrsuurnorqrromqpnlkfedbaa`^_^_ZZ\Z[[YY\ZY[XXWGXUWWSSUQQROQMPOOROMNNQKMNPPNOOPONMMRRMMKNPQMMKNOLNNOMNOPOLNOMNSNKB6.N/dHtHHtHxtsrrsrrtuvrqmnoolmnqrppomlihhdc_a__]]\Y[[XYZZYWZZYWXZVVWVUTPORRSNROTOPOROLNLOKLLNONMMKMPPLNQLKMLMLKIKNNJMOONMONNPMMQOPH<0P/dHtHHtHxutsrtrurpusronoomrnoqponmieeb^[Z^][Z YWUYZYWYXYXVGUTSPTRROPMPNSNPOMNNLMOMKLNNMMNMMNLLNKOOPLMLOOLMNMOMOMOPOOPIKJD93'P0dHHtHHWrvtusvurtrroqnnmpqpmorniljhhcac`\_\WZYXZZ[YZWWY\VXW\[TTWRTSPQPQOLOONOOQKMLOKMJNLILNMOMNNLMONMKMLMLNOMNMOMNLMOMII@0# W1AtHtpsrnpqrqsnnrqpnnpnolpkkihecab^\[Z\Z\[Z\\YWTTVXUV[ZWTSRPTSQQORRQSSQPQRNOQNMIOOLLMPMQNLMLKLOOMNMPOPNNJMONJKMJMJNMLEB:%#"&W1 qorpqqrpmlpqqnlhmkhgb a`b`[]^ZXX[ZXUUXWYSVXXUQRRTSRNQPPOOMONONMONMJLPOOMKIPMKOLLN MNMKLKGIOMKLNMKJMF@?64*!%$$ Y2%pomsrqrmkjlpspkknljmjjffccbdd_`]^^[ZXXZUYWVXUYVYXXUSSRRQOMONNKMRNMOPORLNNLKMMNNMNNLIKKNLOKKNOMQNKNLIIHJIKOLIEH52.-2)$' &Z4sqnlokmomnoomklimkjfghfddcb\_^Y'ZX[WXTVVWYXUWXYVRQOQOQNQMONKLONNMMNOPPMLMLMMNMGNLINKKOLKMKJKFEKJE9:A.!"('#' a5Krnqmmllihmnlnlhjmkmkjfggc`gea__^ZZ[XZXZY[XTWXWVUSRTSRTOPLONNLNPPOOQQMNNLNOLIL0JIJKLJLMKLJLNIJMJIJKKHLDFIKKGB;@3*&"!"#%%!g6綠qojlhkjijmjikjkhfebccd^`^_`\\[ZWWX[YZXSTVVSTRWTRSRQLNOKLMPNNQNNLMMJKOMKMMNMLJIJLMOKJMMOLKLJHFIHHJDCIMJCD95+##!!##%!! # e7 ikjkehgklklk0miihjhhfddea`]_]]\\ZVSVVWWXVUXWWSQVQUTSUSRPQROPOONPQNNLJKLJKFJJMNFKMIJKIEHHJKJGDHCHAAIHG@91+%&! ##g8 nkijkgiijlki hjhihifecd`^]ZY\ZYYTWZUYWUURS QSQQRRQSQORQ ONNMNQNNMHKLJMKMLILLIHJLHKGKHI@DFDC=>A9?3((! "$ ($ k::mkhflgjhilkmihihiniggeead^]^[[XWYZX[UW[SXWWURTUWTSRRSSRSPOQO%PONPMLOMLMLKKIKKMJKIHIGEIIGIHHJFDDEBCFE>71+.,'$"! !$&&!u;nhhfj;mllilhkhinkhfgfdbb^^Z\Z\YZZ\XVWVWUUVTQRSUPRPRQQRTTQPNRRQONMOMJKNLJGKLKKFHJIHDFEFCDECHFE??:+0**,#%' %! r<oghgikl8,'"''&!!#&*#$!!" !$z=Smkjhhmnlmkhihiijgfgecfba_][ZZVYXYYWZXUVUXTVTTRSTQRPROSQRSRPOPQONMLONMOKJKJJIJNHIIGIIH'EGDEGFEEHBE?5))   %+('#"!%%$ z>Atmklzinphghkehkgfefea`a`]^\[[RYXWYXXUUSRVTTVTSTTURQQSQSQOQQNKLLNPLKGNMMKJMJJKHLKECIEGEEFDCBDJFCFEDH>1"$#'%&""%%$z@dA HHHttHtt1mljjkkmmlfggeghefeebcdba^\[X[Y[ZUW\YXVTUXVUSTTRTTRPJSOOMPPMMNPNOLJMNNLJIJJIKHEFEFDCEEFEDFEDEFEEC@<97# %!!(&$# $|@AHHHHlWjhkllklhfgfhiefbcadd`_a\[Z\[XYXXZXYYXXVURRSTSQQSPRRPPOMOQNMMPMMJILLKIGIJKIHIGDEEDGGHEDDCD"FGFCD752&"#)(')%!AAtHmhgikiljhhceeddacdca`_^][_^\Z[]YXZXWUUTTQSVUSOPROSNOMNAPKIIOMNKJHJIGIEIHGHCFEFDFGFEDFGFDEJ@8, "$##$+"#! Bd Htthgilihlggeddcabcedac_`[^__\][XZZ[YWVTSTRQRRQOQQPLOPLLMJLNJKNNKMKHGJHDFE/HDFEDBFECEDEGGEFB:2" !"$## CdHHjkhhgfijgcdcaadba``ac``^_]Z] YWV]]ZVVUTVVRMPOMPLNNPNMMLKMLMOKKJKGIIJIDHD/FCADEECACH@DFGFI1!$!! CdHj&ehebgdefb`ad`babcca``\\``[[Y\[][W[YWVUXUSTPKKNLNKMNSQOLNONJKNJJQKKFGGIFE0BCFD@FABDEGECECEA)"    CdHtttkigdcbbdccb``ac`b`bcd`!a_]^Z\]^[Y\[WWVWSSPSRTSQPSRPQMPOMQNLMKJHIGGHIGGHFFCCFCFF@F$@>@?*& #  %#Bgfefedbcdb`c_^cbb^aabc`_[Z[[\[XZYYVVUUTTS/TROSRSPPNPPQOOIKMOLMNKLJMIIKIFHGDHFDBFBCCADCCD?7:)!$#%  Bfec!dea`caba``c``^^]W]ZZ^YVZXXYXTRWYVSRSQQPJONLLMNMLLKKMOMKKMJKFHEDDFGEFCDBACFDC?A@;392"$!!  Bghfdedcbca`;bddc`a`^^\]^`Z[[\VXUUWWYWYWUTURTPSSTQPPTTPPMMPMQMJONKNJMIGHIF1HGEEBEGEFID8A@7(/1"$#$  B綠d bdeebd`cbaa`adcb`_^\dZ[ZZ[XWXYXWXZVYVWTTRRSSRSNORQMQPMPMMOPILKKJMIHLIFGCCFFCBECDEB>;>=9*,,$"($%#  %Bca0b`bcb`_`bcca`ab^[_]]Z]\]ZWZZXYZYX\YXVSVTXRORRLOQQPRQOONIK9NLKJJGJHIFECEEDCIA<;>D9,%("$& "%!# &|{Bcbab`aedcbaa``b`\]][\_[XXZZXXW\WZXUWWUSUVQSTOPROPOAMLJKOMMJHHKIIFHIGEHFEC@CD@;3<<;*$%%'! yyxyCcdcaaebb`a\ad`a^_b^[\^^\XZ[Y[YWZWWZW[XVTVUUVQQSNPNQQPNMOMNLJLKLMIKJJKEFE/GFCHCCA@<607A6#$'% zyxCd`a`_a_`_ ^__a^]]\Z[\^YZ[[Z_XVXU[[W[WZYUWVTUUQSRRPRPMLPOHNNKILKIIMKOJIKFDGFECFDEDC@E@6/004'''% {zyyC]\`c_a_\*^[\]\Z^\XYYZZX]ZWY[XXUWYXVXYZUYXXWWTRSTSSQPO,NQNPNLKLNOIJMLKIKIEIHJFDDEEBHDD?B174#!"# "5,{{zzC\2]^]\^^\[[\ZZWZZXY[WW[[X\[WZ\YXWVXZXX[Y[WTVUVTTSSRPPOGMOOKMLMOLMKJIKLHHFHFHHFGIFFBCAC@>:3/4$  ! #  3-+|{zDAHtt>^\]_^\[ZXYYVYZVX[YYWWXZ[Z\[YZYWXWY\\YZVWUSVUUSRRVPOORPMQLLNMLOLNMIHKMJ4FGIHGFCFDCDBB>=0.1(%   -&&||{zDd섄HHHH]\[ZYXZXWXWpXW[ZUXVUXYWVXYZVXXZ[ZUXUVUXVSRTSQTRUQOPMKNOJNJMMNNLJIMIDHICEKKCCFGFEDCD>FFH?0,* ' #|{zDdHHH ]ZZY[_YXYWVQTUWUUVWUSUVYYWWX[YX\\Z\ZYZUWWTSQRROSQQRPNMMNKJLOLMIIHIGIJFIHCGGDCDDBBEFBC@>@=5*!%)% !) |{zzDAHHttHQ\ZY[[ZYYXUXYTWUWVRTVTQTUTUYXWUYUY\ZZYXSVUURSRPRORQNQPJLNLKMJMLMGHEJJHHKIDDEED?ECDAD*?AC<,!"&0"# $&&"&${zyyDAA H"X[^YZRUWUUVVTUSUSQSRUQOPTUXUTSVTXWUSYTVSWQRRPPOOTMSNOMMLNLNJIGJIGDJHHCFFAAEDFDAEBBAE@<<7%(" #% "(%)$%(#zyxxCAHHHEYZXYW[WVTUVSSTRSSRUTSTQRTTUWVXSUSRSRSRTTRSTPPOOMKQMLMMLJJKMLJKJIHHFIGHE6DADDC@CCBBDB@74& ' $+' ,+."1,6xwvvCA HHXVWXXYYWXWTTQQRQRQRQOQSQVWVTRSSQ'RSTROQMMOONMKMONLJLKKLLIKKFGFGDGGDCBECDCB@AD+?>+""&  "<4,**0)#57@EvuCӄAttHHHt TU[XZRVSTUTQ8OPQSQRPSQRPSQRRTQQSRQRNQQOOPNMMOPGKKLJJFIILKKHIGJFHDFGBCBA4>?AD?@>@@>9$ " !*%%-71)$)1! :?62:>ttssBdAHH5TWXXWSXUQPOTQPPONPQPRPROPQSSPTRQOQQOPNPMMOONLMMLKKHKLJHJIE@IF@CBECB=AA?<@>B=>=>7-,"(&# "$0(%7<8$*" .293/+-7srqqAUTQUTRNPPRNQMOSRO&SOMPNNPNMMOLORNJJLILOMLLJLJMIKKGDEGHFEDFD?<>?:><==5 #!")) ,:3GFEE7<-#+==<+--,(~qqpp@WRWURQMPMTPWQPPSPMLOQNQNNKMPPLMMLOLIKLKMENNKJJKKJGHJFFJDGIFAEDEBEB@CDB@A>?=:;;<72:51 $+1)4 +C11E>,D9(618/76-:>*4.'#}ppoo@SRPRUPNPNNMLOOQQOLMLOONMMJLMKMNK[INLGBFIJJIGFGFEFDCFFDDFCBBAABB@>=?><>?<;:89;/-(&%).=3% -.+-BB=>>536:2,1/)/F=L$/G{ponn@PNQQOLNPPLMNPNLLMLNRNLOLNMLKLKMHJCHKMIEBIIJIFAHHEEDCDDFDBBABACAA@A??=><<;;=7762$!!/'879% $/DCCGHBBDECB@@B A@?>><>>;=;:9=762(!##0:/'$*57>HJD@E@=94.,-+$$!$"%/?srpp?@ONPMLLGKIONLKLLMKHMHBCCFB??DLLEE>JEGFE=>B==AADDBCCA@>>=A@>?=>><<9:9889610("!!'!166."*::FD?AG<>?=>D4%:@9-%!#853.37:usrq@N}JKMMJLHKKJHJGJMJMNGIC?B<=BHJIG@CGE?@508=<>ECAB>?@@?@B>=<=<8;::878<774380/%&<5"6>6;5,=;:AA98:A5/E?@BC<<:3'(%$*38>AA@CB>@>?>=><:;:69=;78668761-),.%-/295;96PD@701@MHMH=:@B:**.0$.2;45+&" zywvAIKHFHFIIGJLJLJHB4+-<0!/>0(48,+-"#&!1;>@A?><8:;989<;6745755*"+4/,05L=;3+1?>F)'563:B1L;=4"5*$"*3?9+  !&(%%*!:?:?>?<>?=>=><<689775674614840)042:HJFXXD9D61ELG7",D<7?EIB6<042"!*0/>AC6/4;(~}|DAHttt߿8JKIIGHGFGLIF3"$ #!)<=9@=?=>><;<:;<87B546356412??<@CIIOPQGA?K?B?BCM9&0>DCIJ@KC=, -&6L881-022$  FddHHHHHHH+KMKGIGIHEHD?$    +@:;A?<96885C75343789G?GQHLUUMZ`I==>L;<DGMNLJJK=/-G5=B=8##.96- GddHHHHHHIDEHHGHDGD2"$$" +/9>BB?<=<59:6686542628366>BOKE=BLUO^aWTID8A=8;B<2>FFEDG@GH<9'?LD,,:004-#5@*IdHtHHt tHHtFIGHILGFEKB% !  !_+& !+4=?A>><99:;9753653445@GB;HIDL>1:@8CF::2.98;A@=@BB@?7:9;;76730438BDYKGBLHEEB198>:0&+2:54;68;IJE>C:54@BH):<,))$?AB8(  &)&%(!%"*1:D@;<=;9;:7596;89A<8ELI@YM;;76BK;/0;>B?9@EAA:<<9BG::1,2MELVP<16>@:274?G@619?KH:>@@<36E;5;79:/#$"0,/"(2>:5A>JPJ/"&NdttH HH HH HJEFC."!!%&'!! /+*+#" <@?<;:;:83IBMG?><@HP7L;/.:C@-047>F@93>>@>9:76:7622AOCK@M>8;8(-35.&,??FC>1:AC@DE?.O"$($ .&  +/ #"!" /:8DNL44MWI:775,-,7BFRME5=?L:AN6%'->-,0D;&)3/0G:3068IE4,4.-=!$?C'  ',! /<227,# "!'<8<81"P綠&",,)  2)"'!$d  $ ADF6==C@1*.RW]S?C+ 0  /:0924#!"*#>C343?7+&&P*&+'(()& $-<&#" &$ !"#+4.'05NGD@FRcYMRRIFD6976 &1 25254)--" ':=CB;6=*5/ P)%("#,(#"##$$6*"$!" ##%'4@>9BAQ>FDGIDGWXGDPABC>45>I@32,142#&FUPDMGD! &1#+732- "384%;>>9>62P'&#!%"%" !,) %""#-1C>DGAG=>KDOROHFJD:O=0;7;.%7;@3#*6=*@A98F@;) *8((,-' #1:62/%%/+3;-$P !" !.$%!)! &!)&# )5:65BHGA4IGAIJFB=<*)<39522,/55A5@B7 2C21@893%( ' 3=065!-)&P\#*, ,&( $ # !%*% !&#,*3CG?:A?/8E>?AF/24>AG;4=985CMOX; $6GPIB4+4$  *>=2*%14+*("#OdAHt\"'"!+)$*$*'4,#0$1=?KLAJ7AC@OM?,%"0=AK8"!5;2*/1&$KWSO4,"00  (<<=A=NNG;GK,$,-0#1OdttHO" )-! #*-"$!5EI=43H;CFED5.'5;??2*!(*&./.112.+7>48EDB1),   #:@:996?OC94:;5*$$4.-%$+45OdHV"!&)%*%# "180$,.=183308,-@1*,:1)22-74323?B?15B. #"4BDG@<=DGC7//',>KJ@27"&77*5FENdAtHttHU! %$!&!0#!#&3&)144C<=4,01(&$990DLAGL@),'&++4;@B9&1-  & (=IJJNE=FJ@60:%4LA445$!.=:;HUONAtH#  !)&()%"!  ,897=,+%0)+6BFBF/ +45-5/-/*1?=3D?<6,09=D>*%   -  $9@BHILLDG@:/ !)/2*/24,/0,'(&3?7+@9ALAHHߜG"'+0+$ %+#&*+8GPNMHNIKC9.1+!):E68532954%+7AFHG)      :?DCKM;729,%+)%&%#$&;H2.'3+;ULJQLAdtHE(& (# +$+H3+IJF?NMD;8.//1/#)2..478=FYM1 6(..5<:B>35FI='22303;?6-2)&)+(205A#$3:GLNQSK+,)!)()@CCJ@F<9KJ986&P&+5?04D89=::=(  );;0-,,5>E7 (>?>'5TH4-23*(1668513/1&/.=7*-).6GLQKMQVK% # ! ,!/8C7;KL<76*)-3'%.))30.36)=8,#$/& *55,)-4@C=?1'<6455KRN=?410<822:?:;*&,,/114BB>C<+CB1900,&DMDEC?98ID>G;08:3)#+>MSQUSLMONPK綠 !*,%-* "#?QNLHNUOCBFVR*72()' #"&062()(!6@959=62:BIBBTPOOL<7&"/=@DEHPWOMEd\RNG=<-3''?QSWTPHCLOJFIEK%"+/&$ )'" (PQJFRYSN>@IT:$"%    !8@>A=<7&.5E<>B@:GCF@@GOH:HYB<48I)-QA)(4,' "!37;3/62*11-,0,/>?9HNYYOILRLOI5*  ->FJGGMWntiY[J81.CIJDCDMGHOPkuey{cx}~xo]l]`bihijjgfYa`chi[UWUVURUPIR`]I/!  -?BBGGKwry|rysly}|zqlgoZ_bfja_\QSYMEENG:8=6E\WNLHFMdHH+5'2/'%7?0*8683.,5KUTIDLYUBaVY^\T_Q@DX;"99@F3EZWHN]-J_TGG>MAHH-47<1 #8>1)?F=8>:6MUOJLAdAAtH#7;AD5""6BA>DF63>GGOA49CO9LHZpjU[\R@:EJ?8:RaIPOILFJNjI?Bqtzyuzho|xsnm`jgqmjfg_\[VY`ehdPNSKKOT\TMD,?OPOLAAH0$0>>EA<.!%BPE4?38LMR?+-2MB5E^g^hZJ<6HH>AH@U`VSIKJ8>LMA@=GCJFC4642;@9=:9>Y}{x^dl{rtf]`mlkgadeb`UXfekheRFVJJNW^VSSHA+2/KAdHH.6=IB@4%,NSK.3LNNJ.35HC58QVDY^J2-4CKLINOfYARL>?DE=2C8(BJLD8Cbv}qfil_ord_eccb_dfdcegbWRgdfijbTYXRNPOW_d^YVS( KdAH!3;,.1'"!%&&$!,2(>FK=6?=Q8-.IWaRM8=3<@INKMOOIOD;7JRIILNOD9-;@@:3@,'@C<7BppqpggilkjkW^^eebfhd^eelZ]fheiefPPb`cbWONVbaUYL5 KAH.A@F4#+#&)"4"%58HQGJ[JH5?A$!)6CRLID52>NBDMID>IE>3CK>GLEDK<5.-+# "-/234@mvgh`Zempnfbnjif`ky{rlle`monrng^]Vfkgb[^a^Y[\WO>>QUKo;>?-02-+*%*7).>APN=>M_rnuun_fhaajn`dsmbhhjtxytu{kbpso{n`[L]kgfgi`]\a`eP5879A>>FVSRTWPQ]WYOX[\HCGGKK4+! :PRTPUPOFZPDDBFSTLQOYsspvndadebdnigmmh_cdpntvtqpedjkv{XPEVeghfoi^ZWaa]HCUSRdK綠3A1&%,-$/:D=AC3CV\Z^]SQRJMMOTWXQQ]Q?)#*))6;46;D7MQPM@98GLQLN\vx~voahde_lptpohlpnlpusnifhehpysXFHFjhfned_[\V^a^P=ISU`L54*,"! '9CLCB@;QV`^]Z[YUC;HXTOOSUWTD:.$.$+8;9.2690(/4@ECEJJ8:LKRavyx{xlfhjlknsmgbkswlqrnpof`iosup`LIK]kjgea]_[]VW`\Z5>MPWM8741%%=CGG@ALU\Yi\_cU9N_^DEIFNNLKSIHQBBSUTD2)#)*+-212H>KHRBGx{tqsmg_jownhfhdoxusrpoojlhsnklZSDCYhonmb_][W[\`[VE8IOTZN2A??4($4'9HMB=L]c`\SW[dcYV_\NIL:+JWTIE<6ADJHL@62(&"#.,2C=8:NJ,bmxvulcbmrwm]_l|psvuqiecchcdfjeKPHUfcbhsd`_VX\\`^M4+Q^dYO-479:6)0;0@QVQY`ee][^aYb[YXQXWRB9,KPD.#&+.:?>O=JT:7'5:)'>=?6>?>P~rs|{wngjgjsyqf`mutrsrifdded`afkZLJ]hgd^]eic_^XY_[[Q?>ZfeMP:+7:H9)/=4DE@Wjd_Y^\ba__WXU[]b[@XECD.(&3??Mv~yruwe`k\exxrl_gwpqmcbcehh[bikdMPWe`_Z^X[da__Z[aXZTAQWbcCQE<4D8(+<@;IEUed\WW[b`[V[Tbb^_\WC`aB2,3)6GIMWcWZ[AX@%;H:<:DKOYTI\z|rrvxfXYe`mrokc^irpj`XO[cfdaiiba@N`YTMNMNS\`^Vae\RRZKW`be>QAHtG904;4CUX]^^YZYY[TOIS^gjbaO=>_iXKA53EORU^XW[XUK2?GO?CBQRUN]s}}tijeaXSgthhicddhjbbZ^Ief]_^beNHa^TNMGJILQS`Z_dcSUYLUWEM>PHHHtt302A84KCFT^_[]YUQ[NMSXZ^bccacPHVd[WND;K<OAHH;4FI9DFP`HSd]VUOQRCR\_^\_ceI;ETVYTUXCNGQW>D?C4&)1)?GIYUHPRR]\\]{skZeXW[Z_rlciedrl\[^``kbcce\ebQRQA@=@CDNKTWX]bYef\_fcG;B:MHHt*CE7:TPVEHZa\UTSTQV^\]]d]VA7?WWLV_bSNN=@85?9)+7LPQQf\MKPRTUYLlx|mcbPTRSZgmfdelrj_T^caWZ\]_`^ZQVMG@:>=?IMT[_\_b\aX]_RKDCFKAt)75ERVMTU\_[XWWUY[ZY[[_`V@+9HPU]aZYda[SYRACLJF~IdH-9PVVHNIZ\WSWUZ\ZWY]_`\S4*HWOQBCJNQSKHY]_VAB,3#-]iUMOVI45@BBPBKw{~i_ZUOMVYX`hpkvvgqhb``eej`NPS]MHGEBAB<=CKW`a]V^^U_Q;6DG@Dz{||GA HOQJMZ]UOPTOTYZ\[\\^c_]SE1FZQXFFBHgd``VEVVLYJ.*5JVSION@+"*=NCJJXy}sd^YUONQQTbkqnxufjgcdbgdh]PW^ZJ@CFEKLBDUUW^caW\VVN93-LLNDyyFAttHHttEA6KWV_XX\OP[]^\_bacaPR[GXKIOJKPB[mif`?>QRIC;?NPLVZ`A .6C:-@U^x~lgo`VPORTSP^ssruplnjfhhkh_IUSdZK:C@INN7A``[Xa_VT\VNE.,NJLCyyEAHH362IX^\Yd`OUX]`^\_aaZK[JKR>PTMTb\hsof[<)T@QSIIW{igonmma[V_P^b[LV]QhskgkmfcS]bZNd]]fT<>FNbhJ6UbYQL>;5CH>''\^QWh[NMO@I\fYUQbWVBc|}|wkO&$$&JPQUbmfpmlpgORaZ^[VUcY\jodjnrnj]Q^f\IU][_Q=HOZj`L綠B=<@JOK=0_L:.'/3+?EFJ\]fcP^YgY"VOX\VX]fk`fpcIFbaZZP?8./QVR[YY]ViikcK;7/7EB<9NelNW[cnmk]WWdsWchqtqypYSW\K_jghdeojaghZPQNJBe|rt{usfJ,<6KD(&-,.5HHIThtbT\k[e[#XD\__cedflUIDK]YOVI81$*AVSQY[fcic^bWE>58OI1@Q]ofgfchni`]ZVwvfYinsru`aZWUD`b[cjpupROgYJ?6+2fvojfgkA!5:>=&)(-.KUVWNaivibcj[PMJ@8::@6Jdjm^]dkrj]iv~}ykmkypqykdste]\S\[Zc]`R*KS7)--53`aamkedYL)>'(/X^A@MMZhllj_^WPUW$ZA[aVf]KCDTcYaJE>."3GQ]]ZUflheilh_ZVL>HBH7,Uiok_^bonarzr}wbfekmsrngvkdmaWcc_ZZU;0K3*/.2/6\gnpj`a[YCP?-$4U[GPOO\RhtaQJUM@HT$YAAtHec\aLHZLHOTXG9.+GNZ]`\`gjfbcolf_T30UI7*9Xise__ajiptvz|pr`[fkxojozi_lnimibe\RB+,5%&,,/3Drhmf^efgaSMH;6FPJSHLIUVcuk``\_ihmemxvmmj`Qbmytqrp[\gdfb_dcM8#**&%'/)=e^ggccZ[WNJ2brnjYOPGQ4/?NZMGEEW[T$XAdtHtme`a_]XJQZE4]YHGBJT[Y^]_dgtmbmwuif`TF*,U_[RWyhd_]db\X`ltolpb]W]uwxvpjVccRb^]]J.#$.-%%6[cd[`[NKXZRQ`zxmPTWNDBMLQMLMJKOPF$WAd fjfmbUSMfS@RWSQWURV_[^Z_YPslnvpnigb\L:+FVXEZvhbbf[VZWlqswtoicamqxtvrlffdXZ\b[B(  .?MQ73":`[][e]DBKMP[b[_^YTQT][]Z]SMONCGGU#VAAHHej\\T[_`USS\YVT[XLX[b^[_Sdtstqrsib^\K?A;GI>Zc^abf`Wdktiy{usujplaqpstulbljf_^ZE2-3MIsYI?(2KYijiE877?[jiol]E?EN][UQZbN__HHUq#Vdd Hbi^\]cR9GY`W\RTWWZ[]m^SSfiozvwo\IE:380A=5,#!'97Wmhnluuhu|okn`kmtrkhhmeYRXZ@:`x^S}k6&7HM_mjUC6KPunqqxgRNQP[V[QS`DROAHOPx#UAAHporekiACO[Z]YWU[[\b^VP^efluy{lLAHB3%')6;98!9`pkgmco{y|xnjeZnsrhkih_[YVQQPcsqZmznK3M_[eb]`RNVDRhl]^ycO[USSW\ZXUBWS:9IOa#UAGjo|fhaOJKYddYUX[Y\W][Y__br}ufJ626<="*B+(65f|llfjekrwtrfeWatjffhk]RW4Q]gjjedtvuv\XjjaMSWSPZN?FIBOM[S[LY_WOYPO_bYZ]IIX"Uoimn]OSOQ[kfNX_`aXT^aY]nltkSIC?MC8&1!0Kb|wlebvpmfnjg^ZQki`fmaXWPQQMTfista[plmqsunhfa?(>ONRGZS]L9SrdSEUbbUQQHBAf_[UV`"TY\h\SUPSUZ\V\WXVWLT_^Z_rvtmYXOTND@&IhyvY`rhjhjd[__XifhmhUVYRONViplunY_XA^jnrriZP6>R6AOTmz[QNIYODTS\fNBIDBKU`^btl"TUX^\V\\RSWXZa\TRRK[c^ekuoaYW]MJQY?!!&BlyoVgeehrcUXafkjahfVUTUYNSnnmmj]XNVlqkikhWTLC>;69Cm{X^C?DKFG>@KF<8DRS]Z\VWX"TU}YXR[TRT[d\gfLHVYgifgepiZWX\R[`a8)?6 /cytjefggroWPVlpldbk_TRSTUT\dvwhXRMRs~uqk]J<>3=@DE79>@?JZdD:HJUUCMUBLSILERRYfS[WMO_U!T\fUPQNU^^dhkaejmw_Xdc#UIIV\V8WZ@$!+0," gxlma]hhpgPQYdj@_`[[WKTPdll`YE9=OLE;BJ<8,#/>2,:fzheI;RYac]TdfcaVGP^WQ^_]MMLdV SYZ_XMGCVcfe^ijdhesVQ^]V^UKEQ\O<=@E@4!(7ATgO_NBG\SZh^lq^UUZUd]U[`[WPRYd\ SPQbPOJEU\SWW^kd]\cT[bWUZXPCSabb\VN&(*%$%(6awi^edj^QRJaatubRWYMCK`[JB6ALC>LVQOY<;=@;0(:MUSLPU\f[[P@GBVNAFVfc`ged\XNKW^YURP`^XOMJNVNM_^e^ejn^][QTZNGDZ\_ZWU5-/-&"("IuiadacSQVXmjqvMHUTBKMS38M2FPAIXV\XU5<6;7(.HMSXWWOS]dO@:643DFCWaR_cVQOLW\_^iicR\i]ZWYVPRSWiikknefcVQDWQTSOT[TYUO( %,%!)&Guh`WeaRX[enhloIU_VEOSG@?EDLF?OUSYYH9<7:@GVXUTTidTTJNAB;<>^^U[_WUIQH@SK\aZab]WRigjffb`UUZWhlikoee^OF?KRS_ZRPQWVK"$ $&%,QefeYb^][eibkv{f=PRGBACNCEdV=JQKNUTC:@OFQ]YXS[fW?Jl\F]SVYTSVU[NIX]ZkgR\PLQAtihgo_eaWdhekkikmgTULLIVPXg^RQI_\2 ".$()+*.?cojh__]]b\doskYFNQN@IMV_gmZOTSSQWY3AOTPXWcaUq\@K~[JF:;W^[^`TWU`[CPU\_FEVB8QAAHttHHH%ocjmce^mlhmpj{ofUKWSFGVW_ebU9 K\4$13V-)-4RVEutr`\VZ`[[\ilSJHSU_^AZa^ZX[`NMQN@4IW`_NZz|xc?/]d]SEKR`]^a\^cXbU\TQGXmd_e]WPPdAHHHonbg_niojknrt{]OPLXNBDUR[`aR*`Z=3DMF3IL=GGWUCkfbi\X`_T00a^K?PYYsto`YMJLYXQ?@4*C[af_VgpbPPRScTV_WVR[]`ba`\T``STLRL]wtso^RQOAAtHHtj|_ghpkonid`RCMQSJPLSXYZZiP4V\FK;:an]gHYfLD;5HN05BLH`fQ10IdM>SfbcjummhR?GVLIF?HP[[ab\Y\UTofSZZWP]bVQX\W_UZibc\WRv}fw}zjYNVNAd tH[aonj_ylegXROPTWSTHCKWaV\W_`Z[D9]GJ_q_Q[\fLEFD?A1OuMKHL>H{ySPRsy`e^YRUM68ECXSMSVa]XW\`b]ZnyWX\QRPVZbeKNRWJXd^[[h_~z`uxw\VYXMAHHHiuqmkinj\UMSRUTHKRQA9OUR\^}~zxtoub[\]WQcX^ZNPA/DJRTHA67TnTbcfi_[TUOMP2&+9\bUV]\\ZYWSV[\djfjdWIOQZeWFUUWTNPWR]bKMTX]Z]Ze_LAHHrfrqi[UOsNQUPYbTH>GZ`PhnWKKF:57NXqZ/#&(+0?E3/+-Grl{i\_]]W[SLUC3?OTfXQVRUWTT^ZY[`qq`g^]SS[SQ`\`^]\X]dUri\QTXTU_psu_LAtHHtrnlp^TZVQHFFEPJST_OWOM[J?qv}lD7PD)2L`cYK)#^mW^@[bB246KdfX]RVWX\]VQQDES[]ZURTTPW[cafXU\`JKM[IHNLQg\rkQ\ll`SOjd_bVgmSXZjoma^JW_c[MLA5?IIMMLKTWT\fa^`B6]Q0.9BUPdcME06q[rhRiQ2>D@JGPKSTTQWGTURSSe|G;UWW\\MNYY`WVWMLGORRXTMQecZrnKS^bzdghZWW\[X]]J(%tz{~uz}v`{}q{9MGHDFGHESMxptrq]$%%#%%%ĿH  ﷤o''&%$#"!  ! 衍~'*}|'  `* .' &  && & |~}~~}}|{zhvų& ƽc&ǴDZg&ˠ˰ɾn&ΫĚ ʼ`&Ж߹¿ ʦl& ʔ˖t` Ž p&ʕ Ӝ ˸ӿʢ|& әuР ﰰؤŷȺǼj&k  oˏРź̽ɿ p%u bj mʷ{%Ж$ ࢏%ɹ¿ǁ%$Ҩ  DŽ#ƿ%5ѕ  ޝkp ¼{% &}lp@"ɴ%,Ѣ  ͇u p@ ̿ș$;Е pdٗy@Pp' ȸ$5Ϙߣx~p$ Ϣpr" ǽ$ ά] ׸m ƶ#4ͰB  i @Ҽk˜#9ͮԺjj̴#)012Q06{C6P׺؅#:YXXw+Q1&3+&BXNGBܗ+ۊ}|~z~L~~}z}~o>}|}}c}~~~{{p>~}~}}{~z~}~~yyym>}4)~~}~}|}~~{{z|o>6} }~ ~~}~~~{zz{m>~~~}z}{||~~{|}{}{{m>&~  ~~}}}~~|y{l>;&~{|}|{}~}~}z{|}j=t}~vx{}z|}|z{~{}{{l=H* ~}%|~}|}~~~||~}|zzp=H/ >~{|~}~~}}y|}|}~~~~~|}|{yxk=tHtHHHtHt5/~{~|~||x|}|z|}{~~{y|{zxl=HH(HHtHHHHHHB{~|~|{~{y|yy{|~~~|}}||zn=ttHtHHtHHtt*(~{}|}~|z~z|}z~}~|~}|zl= tHtHtttttHt+5~~~x~}}{~}zw||wv|{}{}~ ~~||yh=Httttt#HtttHtHHtHttt J~~~y~}{{}|zz}x|~{{~~~}|}~~~|{||}yj=Htttt(HHtttttHttHtttT~~~%x|{z{|{{|}}~||{}}|{x{|{zk= ttttttt r~|~~{|}~~|}~{}~|~{|{||}{||z|{{wyn=Ht"|~}}~}|}|{~~|z{z{z~~|{|~~{}~}{|{~{zy{y{}j=Ht  A{x~{~{y{vsx{vw~}{~{zzy|||~yxyzx|{zzj=Ht8C~{y|z~{}{~~|~~{x}zu|vyz|xqzy~szvwyvtk= 6z}|||~}y}~}|||y|zvwyv|{zvzwxvrspxwwxth<N~~|x~}|~y}~|}zx{~{z{z|{|y}wz|vz{xxr~zzuwzstyvg;w~}}|}z||~~~{yzyz|zyyzz}x}w~}uz~xtty|wtrosmttwvf; R~z||{~~|z|~||{}{}|zz{z{}{yzxz~ywzyxuwxz{xotqtsrsuj:^}~}|~~}}~{zyy~|~~z{|~{zy{|z}zt|zw~yy{swwyvttospopqsf:>|~|~||w}~|9|}|{~w~{~||}}|zzwyw|zx}{{wxyyvtwxwzzuutrttuvmrrqqtf9 /~~}}}{|z}~}|y}|~}}zzy{zy}{{z|~txx{z|yzxvuvwwtqruwzyssqturpttg9C{}y||}8zx||}|v|yww{|{z{|{utvyyvyxuvxyuxxuuwqrttuvvtqstsqpooc9F}{~~}~~y{}{z{~}{{z{z~yxxyxxtsw susruwutsuwurvuqoqqnttvnlrommc9<~|~}}~~zy z{z{w{z{yw~wx'wxuvwwvsuqqrtoqruutstusopmnstqqnpnml]9K~~~{~|~~z{w~yyxx|zz|}xtvuvxuvxxvwuwurtqrossrsuprnwsmlsuloqn`9G|~||~z{}{|yx{|}zzyyz{yxx}{}wqpuzzvquyttqnpttstutsrrlrtqno nkjmmppb8}}~|~|{},{~|}w{yy|y{yyvxxwxyyxvostutvtutqursqrppqsqronprsopvoopnkionqp_8>>Q}}~}||{|w{{||}yyxx{ywyvxzwyxwvtvs(tuuxuqrtwsvtuqomnpnmooklpsroqrlljnlpne8cc>>0{}}}~~}~7~|z|{z{~zywwvtwxvvwuvsrqpymrxzspvrnqrqttqqnmpnppmmqilnp nmknmknkc8>cX~~~~~|}{}{xw{|zxvxzvwwvvwwusutymptxsrpronopnmnqooqpimsnlilkmjknkb8>>>>I~|}||~||z}||}zx{uvu|wyuuvuvwtzxvssotooqtvqrrsqqspjopriilirpkkrpnmjjlkmmom`8cc>c3~~|{{yHvuw}yyz{|yzyssty{{vwvzpqswwvtwxvpnoqssqqolmlmrmlklljnnpnmelnqnllkigdb8bb>b1}~|~~~|+zxwyzzy|}xusxxwwxw|yzuxvuwrrwyusrssrpnnqtrnplnmnkjlmolqpnjlmklljlkied7>>>5{~~}|yy|zwy{{|y|zxuuxvwwxzwvwwspxunssrqsrrsqrpoqnlmpmklnqjjmnnjlmkijlkgfgf7bb>b}~7}~}{zyz{uz~|{zvwxwyzuvwwywustuqqwrovvwonlpusqrppmonpmjnmkmonhjliihjkliimfgeff7>>>>~~~~}|zyyx{{y}yxyvuxw{ztuvuusutqqsttqqrwtponrtqprmnmpjomjkljkklnmjlljhmlkmljkjfehe7}~[}}||ztxxzxvuzzuv{zxwvwxvrstusqqrpnnprnqponqpusmpoqlnklkgighjmlhnjjihjkljiilighd7=~|{z}}|yzyvvxuyxurrwxwv(utosqrpkpustrnmtsppqtntnollkikmiihhjihjlljhfejciijcgiifc8 6|z~yxyuyyzy|yzxy}xwtrvyusuutpqqronlmoloonorsomnqlpnmnljigjkkigimghggfcffghfihfehe8g~~y{y|{w{xxuyxytturusuu{ututqnrnqsokinonomoppmkjllommjjknkklkiihjiihieffhgbajihenghjhe8~ |~|Szxxwxuvyyxsrprttusutsrvssomqmqqopjlrrjlqkonmmkkheejkhfgghiggchjhfeehfg^fgdcjgffgc8!~}tzyxvowvwvwuwxtvuystutupqoprnpmlrjlnhnmlkihfhhjfgfjihieedfhedfejhggececddfd91~{xzx~~yxtvuv srsuxsustwwq rqrmollihmnoin*ommjjhgigikedfhhfcdfdcaaefheficgjc]_bcef9A~~z}~}wxtxyzxxttsxoqsmnmqtspnpl:onkmjlnjkmjmklnhikggegfehiagkhgghdbebcdffefehddfecc_b[ag::|wz|}yu{xt{xvvtvstuvrts4oppqmqmnoljhjlhijillhfikkigciebfhdfgbeeabedcchbbadcb_d cb_bd^h:1}~~~yxxwyzwvzywvupnmnpptp?oqnsnmnohikieeghiigjkjhghdeaahhaccbb`dbbabb__^acba_cbdcc^dd`f::|}}z}z{zwxzzwuxv{wrrvytuqvutrq?mpllfiifkmnhjlfdehffhgighbf`_fgbdcbbaa_aa`a`babdfbbfcdebahaff:d>HHHtHHK~{yxxuy{zvxwwqyvqvutwuwrsrptompmnnlnjjiffggjlgjmhig*ehegbaadhfbcdaada`a_a_bdebehabfbaba`e]ej;>>HtHt}zyz[uwzvzxutpttoxttsvvuouspmmjlmlhjimjikbigiinhfghgheccddgdbegead`aa`a`aa``acbba_^ecddaa^aa^k;>HHH,~}}zyywvxvpuytuOotrrqrvptnllpngjjhlkmmkggfkghhgheefg`deddedbbacadd`^]`_a]\^bgdeX`^b``__\\^Z`o;>tt5|~}}~{y{{~{zzwtuvustspqopstsqqsolmmoolhghijeljdgilhgefiecdffccdaa``_^daab[[_bbaaX_\cb_`^ZUIn<>tDz~}}z{zy{zywuswutusrpnlootuqqrjlmlppnmlhiidhgikgeecgeegihehhggffec ^_`a_`^``\_ab_^_]`]``__b^[N:,m<>Ht}wzyyzyxsstruvsstrpnostnouijlmonji?jhhfkigeifdebebdfhhdffcceecacaa^ba_\WY_^Z^bd^^]^^cYZ_]]XB2n=>H<~|~zxxywutuwuqsutsqssqiopmmojkjlljmjifigmgfdeefdfgacgigdedb&`a_^cbaba_a]Z^^]_`c]_[`]cUVTM@8$q=>Ht3}yy{}zxxvuyvqrtrpovsurpoqhmnmn okkjgihhgfihg_ddfegeccdggcecca__`^_ba_^]`^_\]^b]_W`\a]WI1v=>tHt}|{{}|xwuutuvvxspnmsvmnklptnlnljhnmgffiieifghjiigf`hjgecha__`c_cc`^`d`cda^`__`_]X^\^^[W[[X]__XH@&s>|{}~#yzwvzxuspsvsrqpnortmmlmoulkllkhknlgaAghiigfgeb`edcfdd^`cbb_bZ`cbc^_^`ca__^`]YUY\^`\\ZXZSLC61$v?$}~{|}}{|xv}zyvwussustqo rsopnmksmmkIjmlgiiedechlfegecdbcdbbcdbb`aa`__\ae`[Y_ce^^]`^[WSX\__YXSQ:2(*%x@ ~}|}}{{y{stywk{yssu)qrnnioqolnolmmkiiejiihmijgbadgfcbccfgcaddba_"^]Z]d[[_ZZbaXY[ZXWZUYZYWTGEE-A~}||{{||{|xpr{yvu{yqqtruqsopllpnjmojhjilpdiffeiihkgdcigabcbceb_bca_]^_^\`_[^_[\XZ^]XZ\ZVWXUVYYUPFC1$BΠ {}}{}}|~`y}z}zttuyx{yxumnpprrpqmknjjioqjhlilmfjfddcddhhgjfd`bca_b`^``ca_]\\_^^]]_\^][ZX][_[WXSOU\]WR?1" C~|}|~{|~}{}|zyz{vurxvrpllonomkhjomjgknikifhgfefhehggd=bcdb`^a_`^`]YZ^a\a\[]^[UWVX[ZY\RMSSZQBGRTF@.! D~}~}|}}~}}y}||{{z{uvustonqomorkkjmnjghmkhigeefdffejhgfcdb_^]^_^abb_a\Z][(]^XZW[Y[\WMMVTPQB>D<@0 E}|x~}2|~}|}zz}zyzy{y|sqqnnlklnmqlnsijjopkhjokhhghgdecdhhbcacb_]]_[[\^^b^]ZWYWVZ&[YY\YY[VLLPSRQF7)#,$F~}|}z{}{xz~zzwxyzzyutnompm,onkllkhglmjghkehfhheeggffcedcba`daa_[[^]_^]Z]\-[]XYZZ\[WYXZXYUNLOQIGB*%)G~{|{}|}|}{qy{{yzwwzyxtutmokrmnjpmljkkhfgkkggjfgdhgjeegebdccaa`^c``b__]]^\]^]\Y[Z^ZX[YVXWZWYWWSOQPE6.(H@z|~{~}|~}|}xyx{zy{wsvtusqqpojolkkjolhlikhdikggjefdgeiggfecbdebba`;_b_^\]_]]a]]ZXYY[YXWVYZYYVSSXLMI;+%Id>HtHt}~{||||z}xyyuwzxyywupkrrspgrsqmiijjhfgchkikjjgfddgeidaddb_^]]`]`\a^][]^WX\\YZUV[WZXUWWXTRWWSURPNB4" $Jdt%~z|{}yyxzyytxy{xwuqpopqmomqtnlommlj%hkiklgihedeefdb`cca_`b_a_^_`_]\][WX\\XZWVXWVUUYWRQWWTUOE>6# JdHH*|~{{~zww}|{vxuzttsoovqqmomlpnklnnoonjhljQhfdhefecdc`bcb^_cabaZ]]^\Z][[YZ\\ZYYWYXXTSUTUQPXZWVS?7.!KH}|}~zzxyzzuwrtsr stsosqompqkkrkn4kikjfgjhheefbecc`^aa]`c`^__]^]]\]\XZW[ZWYTTSWUUVTRUSSVZM<*K> tttx{}}{|z{vwuwyxtsqtsvxuunrssmqnhnslkjggffeefdJb`ca^_`\_a\^a_\][ZX\ZVYXXWVXUVUTSXUPQYTSVUTK?1|L>HtHtxv{~{tz6vruvwwtqrvvxvspvuqrsqmpohknkmljjicdedefbdc`a[baa`_``]^]^Z[XZ[]\XZW/XVVZTWUQPRVTTWUT5!L>HH>x{|yvtzwuvrpsusyyrtrsrtmosrlloskooeejkghqegfdc\faa]baia^[^b`^]^Y;^Z\ZVWXWUUXRSSVSOQTPQXVRNILM, L> HtHtH{xvsuwvvussrtquutssprtprqnpkptmkmi!kgigfbddgfgfgeccada]`]`]]`_\[XYY[ZXV2XYWSRVTQUQTTXWOGGKK1 K>HHtwvxywuurrxvwwuupsttssqrtqroolmkpmnohjikijfg_bcfjcdiga`]`fc`]a[^_\[ZYV[[]Z][USUTVVTUUQTTPRTWPIDIE0K@zvsvstvssvtvtturtutsqsospsqpilmogimgmkheeajdbehgbdhd`]``a\bc`]Z[]Y;UYWWYZWTSRSUWSSQWUURQQTOMFFC0$ K ywvwwvuvwvtwspt(rsrrspspplmnnmndinmihhkgceeghe`dbe`_]a^\\`]?\XYYWZTR\YVVURTUTRUQURPRQNPMEA>;- |Kozwwvwuvuvttvurtsuvqqsprsonkrppmkbhnmkhfikgehihb^c`^^_a]^`_]Xa]ZZ[W[[ZZSQTWTSVVUUVSRPTQRSPGJLG::2# |KIwuruupuutssrtuuwuttrqqnpnjpjnmmpkgdefgicikbdebcZfbabecbd_^\Y[Y\\ZYXX[UZ[UVU2Y[RLQORTUSNKFDD:'-, ~KΠtqquvssuqtsqtsutrtrsqppnonlhmmnkijjfdjkicfefabb`]bb_\`db^aa^Y]]\\Y[\ZSVSWYUSUSTSQRQRPRSIFGE@6&'*   Kvtrttrqttsqoqsutqqoqnmqppnkojmgmnfhonjg`dhee`ea_dc`hg_d`^`abY^^ZYYX[ZTTSYWUSWVXUTUTOPQUKDCDF9+"$ Ktrrwtosrtvrssrqqoqqnnonqlpdhmgglkkmia`elffaabe^bd]]b]]\Z]^`YX[YWV[\VRTZVUQUWURVWSMNOPKD7:?E2$  K*stwwsrstsrpvsprporponjmponkmjhlkiifheiifgeecdbcbc`c\Z[^\\Y_YW]\URW[ZTYVWWSU0QTTRTPLKMF7/9G;#    }Kspsuqlqrsttsmpspnmolmklknkqkngmmihgbfjggdkddgfa[d__]_^\_a_^[X\\VU\QWYXTXVUXUV\ZRMTSTQJJRF56.)."   }Ksrosvpqrrqnlkqolirnlnnmjlqnmllhhfhjhdedifhdefgebabcc^[^_^]\XZ[ZXWW\[WYUKYXSOUTUSPQPTMNCMOC469     yLtqrrqpnrqqnlnsonllmomlmjfjjij+ihfgigefhlgcb`^[Yabb_]Z\]\]\XWXZZVWURWYVXUSTQRSURRNPIEKN@3+3    uLd>>HHusrttrmplntqonknlmhlikjiighifhjihfbfeaigca\\d_^]][W^[\^\WZXYXYXOSWX_RVXSPNTTUQSPTQINMB4,*     {L¥>Htr&pmmppopknpkimplnljkihhijkghghhgdc_eeffdcPb`_`\Y]VV[^Y[VXWYYXXYSPSTRNSXUKPUVTQNPQFNSOH4$      LdHpoppqupnpkimlmljIljihhljikifgjeddgd]\\]]\]Z[^^]ZZ\ZXXZVWTVVWXTSTPTQTTQOPRQQONPRGEH?8,       L>HHHommqrorpnjnpopkknrilkijkeehecbiehiffhd^cdbdc`^\ZYXW^`][\[XWQWVXRUUVTXWUUTPORSQRRSQOLNMHHC/       L>>HttHtahmqpwrppmkllhkmroomkkhfekggecacficcgfddebeZ]]\\Y[[V`YW^\Z[UVXWTUUSQSTWPNPNOSQRKPUOOTQUIF=        Ld ttsospmjillmmknlijfgkfdhe(bade^cddc`c_]^]\YZ[VZYW\YXWXWVXVUUTTRRVRNOQ2OROPROLIK60     Ld HH@wsqnnmtqpolmjlmkkgliegfehbefgbdabdb\`ceb_`[\`_]Z[[\]ZXYWWXXUVUQRPS:RQNPOQPOOSLLRPJFA$     LdHtHHovstkqnmononlljigihhfgdibcbadfaab_^bb^]^]Q^_VZZ[YYRVVXWWQSRTQRSTTMOQPNPMOQKNQKNQJ<    L>dttkprspkspkjjnkkmmlkhdhbhdbfcc_feb__^^a^[[]\[\\ZZ\XVYYXWWVUTURRVQLQRSNMPRPNKPOKNPKNL6*  " Kopmnkhnnhjlmillnmigebcfhbcedc`\`f^Y`_\[ZRY]\ZYVW[]SVYWTTRRPTSTTSQRQPJLRRMMJMOMMLPM?     "! ! K rpunlnllbnkumkjfhjfidjcabb__^_[\Y`YT[TW_XUVY^YWVXUT_VXXVMWSSUXQPQRPMMORPMLJLL@JD1      K*nqnnpoljiflljikjhefegffcgdac`e]_c\\^X]`]OL[ZXOVUTUUSSTSSXVRNLQQNMLKPOPMNLKKIML<6'   $ " Knqmomnijeomrihjhffgfihefe_a^_a[^`[[X][\XTOUZ]]WOWVVUVVPQTUVWRNNRPOLOQSSTNLJKOLH=;%   LΠAosmnpnfgmkpkihhfgljic`^d^[^^b_Z[]SVWaYYVQNGQYYVQUVVUVTUPSRQQYPPQSSQ#MLTMPNLF5   )"   Lprqmijikhgghhgjgffji^UU]]ZV\beYZYRNSXXVQF:EKTZWNVWWTSPTVTSSPUOPRTROSROKJMMLIC1    !   Mlpqiiljljkgcggijhfhg]PQZLHIQ[_SVMUMMYWJEB8?KTXYTXWUPNMQTTRSSRNJONNKMOPKIGFD?.    )!  N,pkffjidkjeejlibchhih`ZGMI>GMMNUULHGFFC8708?FTUOWVTRQRTQPOQPMNMOOPKKJPHAJ>/'  %$!!"  P2pmgdjhgkifekiigb^ZTg\B2.-+=IGDKK@84/$'"$)=HSUUVTQTROPNMHKMNKMOHJLKD9. 0###$!  !RpojfjhkibdgkfigW9!+C7';8'49)#$)HLTVTRSRSTRTRQMNMJKKMMHJIEGHH> $## "SwqmjkijlichihhS@(%## =OLTTUPUVQQOQOQLOMJNJLKHJLNM?/% # "&/0##"# #U>HHHHtnmjjgfifglga:$ $BNMURVRTTQMNLLQPOLINKIKGHIE:(&#!#')."-/+#$&%. !!  $X>tHtHlmjffchhglcW#(AKMSVVTQRORMNHLMNKILIFECF;7;$&4$&20/+., *"&""" #!   %Z>>HHimnjejmimlgC$.=EU[YULVSIMPOLIMFBNFFGBE3&)((%%/(14-2&&#" ( "-    &\d>HHHHH4illhelgccfS&".BU[WQUSRPMNPOPHGIIAA=/)(&$&$#5%&! $"# !$ '^>HtttHttH0ikhgjkhebb<#-HU[WSVQSPNIDIBHLKB/0(!&*)')$"""  '   '_>>ttttjmgmul`[UM* '0?WYUTQRPPOLNEKI?;1,$ +%.&,(!)!!(&*"%"#$   (`>HHHipijjS757.%>UYVTLPNNMKKMD:*&'%$1,&"  &!  #!    (a>H tH tH.js`^X,!  Q][TTQOKI@7*#&*###! $!!     (b>to_4! HMNMNTNOGFJ@MD)%)#"!!"!"#!       (cF3#! #.>KOINOPKKA:2$" !(+!            (cy$   $4@AMFGLE4*$"!"!$')""$      (c'"$+ 7IGE;%'-!$),,#"  %    $ (c5)# %BA2!F %$ %$        (dΠ   )* %'")-$&$#(*%! #&'     (d:! # $ *($'"-3.)A-'#" '$! ,3:0        (d+ !"+#!$/31*)'" &&#%#())     (d & '*" % $"&(##&0/'! "  $$-!)        'c$ /'')&%)$'),1'!)##% "          'c$  "$''!$''&""(!!$          'ci "" $& !& %(% ")$+**! -           &c>ttttt.#"#-#)!)#M"     &     &b>HH!  #&&% "''% $%          &b>tHHH   !"      &a>dtH"   !        %`dHt      !     %`>HHHHF &  "    * 5  %_d HHH2   ! !I*'       $_d>tHtHtHt       !  #        "$^>t   # ,&       ! $^    #" "  % $][    "       $]v        ' %% $$]!   %#     !$% $]Π    g%"      #"!## !("%%+&$% "$]f           "$ .(*!*)1/)(($"$^    " "    !&((%&.!,&$&+).*,&-/2 " $^3       H" !!')*&-04&%+//#(*&&*$"'2.%+$%^      (&%%!&,53,5<320;*'-"&1"#)'.-*)%," %_       "%#*1"($  !"/52<>485@*-#1- *((%","+& #+'!1 %^  t       "',2/1&  $0558@8:%(-.*0*')1,%##)-+$'$""!!"%^d>>d  " ! "!' ,.+#%&#'3=9:2*2/ +224?.#+ &$$"(!#!!$^dt  # ""$%"#(-" 3?A.%7+5:D@;:5!$$! #*(! #$]dw  !&") "$$!,"$#"#$'$$8;33:<;2<=:5,*! "!-&)# ""$%$\d>H !$ !&% .')!# !."% # %50149>(+)&-"%!$" %! (*+)"$$##$$[d>t]  % " '1+$&!" !056821#"',(!)!*%)')0#"!& !$$[> &!  *'!    !16496($0( #&#+! *'%($ !"%$ $[d>#  & X%!!'=?*7,$ &$ "&%$ $ #')+(##&(&%%"%Z>d ! %+"#$&&#/?80/."%)$! #$&!!$*%" $(% ('#&"),% %Z>>! ! $ = /CI.-0 !%+$'#"!('0-% "!%"!")( "!! !#!%Z!      !"  >?/$%(#(#!# %/-#"$!,%0'$ '#!' .$%($ !%Z9!! ) $"!#$B 3-*!""#!-0#*,' +-/+%&"$&"'&#" $$!!%Z  ')#-/!%#!+) $%)+')/)%+3.-2%" %! %" &&'%#%%ZK  "    $%$*&0###&($!&((+.&)*/40&$'%&% &&%[Πx !!  00,))(!#).$*"*(!"0,'%*.('$3,"%#$"$&%[^ $%#  "001430#$**.-"$+&+(*,+& *"%""&! "%%\} "&#$,  &35.:2:-%$%/+!),)/.'#'$'& $"%]5 +$$ "# $   %2&+!:70+)" .%"#+3,*" $(-#$    &^&%%,-%$&  3,)847*$$ '"!&'$ $%+,&%#!" !"!!#" &_!"#*%"(!!'&"   $/65*-% (##!!.& "#  &$(" &`} $*/1+$! #"   &B2.#((% " ' !$ ""! &`> HHHtp )*"%%&(&'#!!%!$     8E56%#$+#%!! !#  &`>H}")+0+((&+$ !!) "!&#  A159,' $-( $ %#$"!+ %`dHH !0%#.0)'!""$(&&&"  &;=-,7%!.%&#+$ ,! #'$$  $^>HH$$"+-$$"!#%!'$" !  8:5-.'! )$%  "!!#"%$#$$#]>HttHt !#+!''*(&$#%!#$" !&%#"#  6D5(+")'#($#'* !    &! %!#[d ttHt# % +&%%!"&'%$'$#$$     #  ,*6,4/&$($&%&( )$ '% "Y> HHH!)$%("w(! %"$&&%"((#$!  &/00/%"( %! "(%#$$"WdHtHHtH' "'&&$"'"!%'$'(("%#"    (./( !$%%$ "'#'$+" $ #""V>tHt $'/(&))&)*"'& #)(%$     ,'-*'"!(''%!& !$"V#(%(#/)'$!#% #""!   #.,'$+.*!,&!'&#!&#!'"#  &,$ !"V"%!$*+'+ $"*'#$"%    %,0*118/=**!%# '!((#$#- !%-,#%#%""#X %#&%%  *+$%$"   #(!&1/3610?$"",(*'%'#!& *,,% !&!$"# #$%'$Z%&!  "#'%)+!!%%  )("$7747-&  !"$&*+!+"##! $'"$%#" #%\Π!'#%&%""'#   (*-5),# ##*#!!"!!' "##)!%&_! '-!,!$% N  "'(%1=+/)"+#2-"$'%&+" !#% $!''(b# %*&#'**+("#(+     8:. !,84221-% &') % !! !%!$!"(!+(,')d$!#$$((+ $+!    /C5&"$.&15,&&+$!""!##+!%$    !!-*(+.#*f)$$%$,#/  ')'    9I73"&/-%*""#%!()$#-+*('(  "/;#%'&(*fY #+)#*&%'#    "@56,4-))9()"+'!%"$,-("'#"*4,! #"*g!"*((&(&   #  #4/5:%.%/"#%$%%$! (#!# $  %,,*( *g>ttHHt&'!&,+       $+1%470/!)!$&(!&*'."& "%"'#" %!!4)(!#*fddH/&"'    ")-.,#%! /)#%"+"&*$&! $'% " #"*fdHH&*)"      %,*&(% &%!'!'  +*#86?1"*e>>H*u.*"!! %"!*(!% !!  ! *'"7690)d> tH,4)'+!"$%"## $ !    (*"'&$!)c>dd Htt(,--! '  S!!"(*/ #$#&%$!#" %#&)*  "  .++!% '(cd> H + ,'&#  $$,"!,'!'$'(($ $ 7--67%  $ #8613/ #(b>HttH*/-)-/"  !  (*'$($#())$!-'%!!&$/.$4A33, &% #%*((9* (a>+*.*,"   !#(%!" #+$"%$"&'$$*22(3C0;:.&$#' "&!!&!#.'+(a42),k !'    &4&)## "&!& !!*8,.-07901*.% %!($&  '!!(a#"# #   $"  (50'"  #'#  &*42!$( %&,&&-%!  !'a !  " (9! '!%  ( !+$)1-!!!'" %" !'`    $#'%  0+#$% !  ,22-*'+#     '`Π &  $!"!  !  #&# 1"  "  "'`U"   !)!"#),*+#& $*  !1+* "'`a"  $   *" " "/    + $'`F!! !!$$'  (#!  %4  )!"&`- #  ""!!%        &` $&"$ ') "" ! ##"  ! %$! %&`%)-2'"#% !#2(  "  U!" %"&`>>dHtHH).6.&%"(()!"' ##$ $   "&`dtHb+#'#)#$**""!/" ! #%"!#!# !)"! $ ! ! "$""'"&_ddHH%),-'))%*'#&#. " !%(3&".,'%$ !  $(*))*!     % %&)'&_> HH&!--**)%./+#  $",(!0*%%$'#*! # '&$%!()"$  !56--1(&_>d> tttH+,$)- *%%.  $ %)+& ,8;$ #"%#,(- ()!%,# ( !(/#'#&_>Htt&"))($(/( "5<32%)2+#+*() #)%$2%"(C  %"%    *"#!/+ !&^HH(%/'y  (310.'   ".#)"!#"(#"!"$! & &-&^>HttHH#'2$$&( ! 211&    !44<11/3&&," "" !";J7,*70 &^>Ht$%!"&./>   8KG<0*+&,&  "% !$ !$'-$%&## 4 "&&^##)#""""64#   +MWA,.((A2!! !$5+/(2+1'&^MIB8ksML2MIB8ttaPpillow-2.3.0/Tests/images/lab.tif0000644000175000001440000005745412257506326015535 0ustar dokousersII*  ] , (122^;FI0!<i_ ' 'Adobe Photoshop CS3 Macintosh2013:10:14 21:37:51 image/tiff Adobe Photoshop CS3 Macintosh 2013-10-14T21:37:18-07:00 2013-10-14T21:37:51-07:00 2013-10-14T21:37:51-07:00 uuid:6F6A39A95A34E311B432EB92488C2511 uuid:706A39A95A34E311B432EB92488C2511 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;8E835F30F499D49339C487EC31A250BE 10 10 8 8 8 1 8 3 1 10 10 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;76E873547D6C5EEF6EF8C950264DC120 9 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM; lab nullboundsObjcRct1Top longLeftlongBtomlong Rghtlong slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong Rghtlong urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM D @(JFIFHH Adobe_CMAdobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%?8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlongVFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslongVLCntlong8BIMRoll8BIMmfri  pillow-2.3.0/Tests/images/16bit.MM.cropped.tif0000644000175000001440000002040012257510072017635 0ustar dokousersMM* qfevKVNRQ=uwVeqwsi_{bXPpgfdwvPs{=VmNN3Op|bwXbN\gxjcvnYTtT_j~rx{yzgwMal]c}^gbz|Xqfoi`^pljw~v|zibwu`aeXj^|jxt^i\cehn}_z^kYyVXLdb_QCqSkp{~wP}nYxYmYxbxYPY|noa{jjSNfr\ywxFU]riqwnBow_UYQCq|mVmDH wzg^yLQxnzvoi_fizql`Jmzwzwe]JRRYVfkpJ[pqy|\Yjixyl{~WtTnmKO]FR}m_akcTf}~rn}{r}pplmmghzP}K{nO\]^vur^][ubi_``pO|otz`6t}naZecw{a}eSf_[kDn\fTy^Ccwcw9\fk}Oo~]j{Rrsy{Tf~s~q}^jdkeuVlzaeuf>{df9zjWfps{uxiywtysVcKqkvfgRsvs~tIpcq~}q{wugbyvRP[3W|_OKgccZ`ntqxrq@zxzaw^kmyzovjkhVmp]^]nP3pjk[c~E}yFoyh`ehh_[x\pxvzWZiry~mcfmipUmd^ihZdcJmH`ZfYmWT{zClhrd~\w\^|wcmSUzkSxwVlvzvjjd}MwrgWxb_vrZl{cTlsVzgT^\QmrmkxbhSrtQofiwQk~{\kzW}cIQeR]jjuSvnql{vn{v~|lQ`P@Z}kepkWw{ky|}towrxgqlpVuvMvvvBx-i{}nzn^vlpyI[w]pnmW`]lcc|ymi~|{vj|umsp{vn-fH`Dv\ekqWetevx\{mtu|ghO]ulzbZ`xjlqi]C^{Y\[|`~xopdztvndAd^^qQjXqh~dojYZiv?r|b[bj`epnYg]ZZj}{xxkg}wnOvveeay}fXhzigw|FtfZ}\g]`znamfXRgOwh~}y`vze|f}jpRghfs~e_|fcU}tupt`bbqlgskhb^yqJ|ujcezdQ~~NwX{i@\dhr~r{Vk{^ePOnw|oed#Xhlsiclw__zNVub[|[hvN~jWr@rvg]fxrbxyxgaVchmvERb:{zko@uz|}arsgk}edqqYay|]ml\Pkm{kW{|vO5|ensvXn_pptrRj=SW~~ULb}]MW^zgldlnmvr|AwZknifTXj~mxbvrrSd}n]uxs}csgrbk`bc`KXPs_h[p~z}]hu[`i|ilklwcxr]a{s]dmxxukmjhu\l)m[z^m~{gpos|{^^x{zqzrYvNS4njjshkNVyl}w`j]oyhmyny{mMVMHJcbeazxut^y}pqzfrYO^^pv\du|ts]_W}upSotteOux_}jbxsztSYe]W}Rul|mb\hc}aeixZAxy{|nsxRyf\lOrqyzxpjrz\Tvxqxwy{q]v[yopTVf_Tt[_L\w_rWb^\pyw|z[ptc}l_fvhZgQHjdsQ^_iVdS>_\mmrs|l\TUn{N|as~jznbqgqlXpPOz~x}K9abI\dLTfdSLyqcG|ePeo}kstfx[hkgGr}{{jktJ_cMz^rYb}_|vfuiQq[u_uRVbb~l~e{``]jtm]dxYLebd~ml2qb~~amVrTv}k\S~Antt|ud~tQc}yq|bSRZ||^wr}wu_fIdb^nvwsapn |rqNNOo||Ob[lfXHUacugw|Lbs|~mrW}x}k%Hi'vTv|itJQrW_TZ~iVRUkglelcblndkmnijVyigsnlq{~ccuI|X}`xUnYvn~}osrvfqxi}tuho}i@mRXk{vpW<P0iR}pvikeroki}aqamrway{SLiZoh{KgmkuZ{~|uxdgUN}jiI[jiifvRo<vXsrgWMsoGY^}}|k~ozwwqf|abvhlq`u;j[~qjklrfykMIQuxzjxymb}e>y}:uvkflbmX6^ltnpbnmvwxlPrs{myqt~g^{lxNuikpt}tRNpkr|sfonwUpqbnxxydtqdzoQ\uvdh}{bx[g^dqg_pmWjvUoyWpzx_cvmtzzxPosqxut|W\m}Tb`feogmf@o]/Wmp|eL}wh^l}Xohj{b{uu~jIFd|fiY{Z\Tr{oLQxxNjz|u_vwutixyscbn[~drQQ|wp]h|y~jxTnmwNUbrS[wzv{v{^n}oRvt[ztgpSzrkZm^xxdozlxspocNg\^}b`q`v}Iaei`hRMvfJ]m}guyutthpmu`z\|n{ojfqtfpaxq]lxvfb<lu{\[sxq{EdVWhqaVvuUeJiw~aF6pJ5 }rsrdeqkflm\L~Vui[Pkea_Xs~`w{fdVdk[fdaPFnh}dmAnv][hY:KLDswce@@   @   ()12bit.MM.cropped.tifHHpillow-2.3.0/Tests/images/g4-fillorder-test.png0000644000175000001440000000173512257506326020237 0ustar dokousersPNG  IHDRTbKGD݊ oFFshc3& pHYs.#.#x?vIDATHq! `y8pJX\FJz܈JȁA%dR@@B,ﯕH vt"%vXK'2E/'4Rha7&i+א𾡗LG 璑Mk=JpB,̩iP"sBO{m7DiXeDž &qZَYkJ̊3o&[Bc7 †5pIyCLGSp^G\ŽN7e4ES~ YPǎ=6Ų629Mqvj}c/BLNk.P14o};MjoGD䚫ٕz#vV.9f=`0O&y/?=0?&o|7WP&S[(tEXtcommentKofax PDF Filter - version 3.75.ώm%tEXtdate:create2013-07-10T22:14:36-07:00aU%tEXtdate:modify2013-07-10T22:14:36-07:00BCtEXttiff:document/home/erics/Pillow/Tests/images/g4-fillorder-test.tif^tEXttiff:endianlsbUCtEXttiff:photometricmin-is-white;tEXttiff:rows-per-strip84]EtEXttiff:softwareKofax standard Multi-Page TIFF Storage Filter v3.03.000"tEXttiff:timestamp2005:12:07 07:38:25GIENDB`pillow-2.3.0/Tests/images/lena_bw.png0000644000175000001440000000362712257506326016401 0ustar dokousersPNG  IHDRE\fbKGD#2 pHYsHHFk> vpAg01IDATHM[le3̖ҝj35x &"3 hE <%^v %Vclc/iQ|1Htj/(\dw\~8 R@ht93 ]krB#$3DXj0-vÎC0l~vT01= XXC:Qa9uSs]P $3Qwb5' /m2p5Vb%4bQ)E[dS:AhD Y񙂲8Bd6.UfT${.{1($dE C@>E+{ r0X7+mn|_xX$$ H,\!w~"` hY{(Hk%-<_,[HφFpM9Ǽ"W0qY)5+ ؞Äaa*rkj7-6/onzp& Un!l̉שheN&bGAZMGTҔL)-NJqtIp婋[F=bs@;)%S ݬ+ԠQQ1MI6O_$yOV͹Ă(©/7I uER Ý P Uߣf^ pĄbT|uq"/ih-jqdN<510#44v[gֹEܖ צ*؝6xH]ZKH)UXC HUk,֓V.1E$G::PQA.7[]4ls9H q+ ,(BK4Z ȇ1JXC1fL;&@0 FU<-h `%`CtX8'28c=d"pf}ƫT"0$fGZ''h@SKCniةjb ~ @rCfX3g@J"F`ɠ- ty&,0PųE|+> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (sample.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 3) /Author (mentalpower) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Nov 20 00:23:10 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor LTb 3600 4773 M (Interlocking Tori) Cshow 1.000 UP % Begin plot #1 1.000 UL LT0 LC0 setrgbcolor 3896 3541 M -104 38 V stroke LT0 LC0 setrgbcolor 3685 3502 M 107 77 V stroke LT0 LC0 setrgbcolor 2901 3533 M 891 46 V stroke LT0 LC0 setrgbcolor 2142 3242 M 759 291 V stroke LT0 LC0 setrgbcolor 2977 3427 M -76 106 V stroke LT0 LC3 setrgbcolor 4293 2350 M -21 2 V stroke LT0 LC0 setrgbcolor 2977 3427 M 425 22 V stroke LT0 LC0 setrgbcolor 1639 2658 M 320 470 V stroke LT0 LC1 setrgbcolor 2142 3242 M 1959 3128 L stroke LT0 LC0 setrgbcolor 2142 3242 M 1959 3128 L stroke LT0 LC3 setrgbcolor 3569 1853 M -11 -160 V stroke LT0 LC3 setrgbcolor 3159 1946 M 399 -253 V stroke LT0 LC3 setrgbcolor 4259 1624 M -701 69 V stroke LT0 LC0 setrgbcolor 3017 3294 M -40 133 V stroke LT0 LC0 setrgbcolor 2423 3214 M 554 213 V stroke LT0 LC0 setrgbcolor 3887 2095 M 406 272 V stroke LT0 LC3 setrgbcolor 4259 1624 M 260 -20 V stroke LT0 LC3 setrgbcolor 5058 1939 M 4519 1604 L stroke LT0 LC0 setrgbcolor 2669 3058 M 234 89 V stroke LT0 LC0 setrgbcolor 2669 3058 M 81 -175 V stroke LT0 LC0 setrgbcolor 2683 2722 M 3 5 V stroke LT0 LC0 setrgbcolor 2683 2722 M 3 5 V stroke LT0 LC0 setrgbcolor 2669 3058 M 81 -175 V stroke LT0 LC0 setrgbcolor 2423 3214 M -281 28 V stroke LT0 LC0 setrgbcolor 1870 2842 M 272 400 V stroke LT0 LC0 setrgbcolor 2423 3214 M -281 28 V stroke LT0 LC3 setrgbcolor 4225 2265 M -73 7 V stroke LT0 LC3 setrgbcolor 4225 2265 M -73 7 V stroke LT0 LC0 setrgbcolor 4011 2179 M 282 189 V stroke LT0 LC3 setrgbcolor 2687 2718 M -1 9 V stroke LT0 LC2 setrgbcolor 2687 2718 M -1 9 V stroke LT0 LC3 setrgbcolor 2969 3262 M 2696 2790 L stroke LT0 LC3 setrgbcolor 3699 2056 M 3569 1853 L stroke LT0 LC3 setrgbcolor 3358 1986 M 211 -133 V stroke LT0 LC3 setrgbcolor 4081 1802 M -512 51 V stroke LT0 LC0 setrgbcolor 2423 3214 M 246 -156 V stroke LT0 LC0 setrgbcolor 2423 3214 M 246 -156 V stroke LT0 LC0 setrgbcolor 2535 2860 M 134 198 V stroke LT0 LC0 setrgbcolor 2224 2922 M 199 292 V stroke LT0 LC3 setrgbcolor 4718 1909 M 4259 1624 L stroke LT0 LC3 setrgbcolor 4081 1802 M 178 -178 V stroke LT0 LC3 setrgbcolor 4067 2055 M -251 25 V stroke LT0 LC3 setrgbcolor 4067 2055 M 158 210 V stroke LT0 LC3 setrgbcolor 4293 2307 M -68 -42 V stroke LT0 LC2 setrgbcolor 4293 2307 M -68 -42 V stroke LT0 LC0 setrgbcolor 4011 2381 M 211 141 V stroke LT0 LC0 setrgbcolor 2042 2077 M -403 379 V stroke LT0 LC0 setrgbcolor 1639 2658 M 0 -202 V stroke LT0 LC3 setrgbcolor 2941 3034 M 2746 2697 L stroke LT0 LC0 setrgbcolor 3532 2744 M 58 39 V stroke LT0 LC3 setrgbcolor 4067 2055 M 14 -253 V stroke LT0 LC3 setrgbcolor 4416 2011 M 4081 1802 L stroke LT0 LC3 setrgbcolor 4293 2196 M 4067 2055 L stroke LT0 LC3 setrgbcolor 5277 2680 M 0 -594 V stroke LT0 LC3 setrgbcolor 5058 1939 M 219 147 V stroke LT0 LC3 setrgbcolor 3417 2751 M -21 -36 V stroke LT0 LC0 setrgbcolor 3887 2607 M 141 94 V stroke LT0 LC0 setrgbcolor 2705 2701 M -170 159 V stroke LT0 LC0 setrgbcolor 2224 2922 M 311 -62 V stroke LT0 LC0 setrgbcolor 3010 1915 M 877 180 V stroke LT0 LC0 setrgbcolor 4011 2179 M -124 -84 V stroke LT0 LC3 setrgbcolor 3118 2832 M -97 -167 V stroke LT0 LC0 setrgbcolor 3698 2750 M 64 43 V stroke LT0 LC0 setrgbcolor 1870 2842 M 1639 2658 L stroke LT0 LC0 setrgbcolor 2042 2280 M -403 378 V stroke LT0 LC3 setrgbcolor 3913 3544 M 3188 3409 L stroke LT0 LC3 setrgbcolor 2969 3262 M 219 147 V stroke LT0 LC3 setrgbcolor 4718 1909 M 340 30 V stroke LT0 LC3 setrgbcolor 5058 2534 M 0 -595 V stroke LT0 LC0 setrgbcolor 3010 1915 M -797 93 V stroke LT0 LC0 setrgbcolor 2042 2077 M 171 -69 V stroke LT0 LC0 setrgbcolor 1870 2842 M 354 80 V stroke LT0 LC0 setrgbcolor 2474 2687 M -250 235 V stroke LT0 LC0 setrgbcolor 3698 2750 M -166 -6 V stroke LT0 LC0 setrgbcolor 3420 2721 M 112 23 V stroke LT0 LC0 setrgbcolor 3098 2657 M 266 53 V stroke LT0 LC3 setrgbcolor 4293 2446 M 0 -250 V stroke LT0 LC3 setrgbcolor 4416 2011 M -123 185 V stroke LT0 LC0 setrgbcolor 2213 2521 M -343 321 V stroke LT0 LC0 setrgbcolor 3098 2657 M -393 44 V stroke LT0 LC0 setrgbcolor 2474 2687 M 231 14 V stroke LT0 LC3 setrgbcolor 5277 2680 M -4 107 V stroke LT0 LC3 setrgbcolor 4815 3277 M 458 -490 V stroke LT0 LC0 setrgbcolor 2980 1968 M 30 -53 V stroke LT0 LC3 setrgbcolor 3721 2808 M -304 -57 V stroke LT0 LC3 setrgbcolor 3118 2832 M 299 -81 V stroke LT0 LC0 setrgbcolor 4011 2381 M 0 -202 V stroke LT0 LC0 setrgbcolor 2980 1968 M 1031 211 V stroke LT0 LC3 setrgbcolor 4416 2011 M 302 -102 V stroke LT0 LC3 setrgbcolor 4718 2415 M 0 -506 V stroke LT0 LC0 setrgbcolor 3057 2620 M 41 37 V stroke LT0 LC3 setrgbcolor 4416 2381 M 0 -370 V stroke LT0 LC3 setrgbcolor 2941 3034 M 28 228 V stroke LT0 LC3 setrgbcolor 3694 3397 M 2969 3262 L stroke LT0 LC3 setrgbcolor 4815 3277 M -702 245 V stroke LT0 LC3 setrgbcolor 3913 3544 M 200 -22 V stroke LT0 LC0 setrgbcolor 3887 2607 M -189 143 V stroke LT0 LC0 setrgbcolor 3057 2620 M 641 130 V stroke LT0 LC0 setrgbcolor 2980 1968 M -938 109 V stroke LT0 LC0 setrgbcolor 2042 2280 M 0 -203 V stroke LT0 LC3 setrgbcolor 2941 3034 M 177 -202 V stroke LT0 LC3 setrgbcolor 3569 2916 M -451 -84 V stroke LT0 LC3 setrgbcolor 4067 2687 M 226 -241 V stroke LT0 LC3 setrgbcolor 4416 2381 M -123 65 V stroke LT0 LC3 setrgbcolor 3558 3149 M 2941 3034 L stroke LT0 LC0 setrgbcolor 3887 2607 M 124 -226 V stroke LT0 LC0 setrgbcolor 2980 2170 M 1031 211 V stroke LT0 LC3 setrgbcolor 4067 2687 M -346 121 V stroke LT0 LC3 setrgbcolor 3569 2916 M 152 -108 V stroke LT0 LC0 setrgbcolor 3057 2620 M -583 67 V stroke LT0 LC0 setrgbcolor 2213 2521 M 261 166 V stroke LT0 LC3 setrgbcolor 4739 3256 M 76 21 V stroke LT0 LC3 setrgbcolor 4739 3256 M 538 -576 V stroke LT0 LC3 setrgbcolor 5058 2534 M 219 146 V stroke LT0 LC0 setrgbcolor 3010 2428 M 877 179 V stroke LT0 LC3 setrgbcolor 4081 2738 M -14 -51 V stroke LT0 LC0 setrgbcolor 2980 2170 M 0 -202 V stroke LT0 LC0 setrgbcolor 3010 2428 M 47 192 V stroke LT0 LC0 setrgbcolor 2213 2521 M 2042 2280 L stroke LT0 LC0 setrgbcolor 2980 2170 M -938 110 V stroke LT0 LC3 setrgbcolor 3694 3397 M 219 147 V stroke LT0 LC3 setrgbcolor 4739 3256 M -826 288 V stroke LT0 LC0 setrgbcolor 3010 2428 M -797 93 V stroke LT0 LC3 setrgbcolor 4718 2415 M -302 -34 V stroke LT0 LC3 setrgbcolor 4081 2738 M 335 -357 V stroke LT0 LC3 setrgbcolor 4718 2415 M 340 119 V stroke LT0 LC3 setrgbcolor 4519 3109 M 539 -575 V stroke LT0 LC3 setrgbcolor 4081 2738 M -512 178 V stroke LT0 LC3 setrgbcolor 3558 3149 M 11 -233 V stroke LT0 LC0 setrgbcolor 3010 2428 M -30 -258 V stroke LT0 LC3 setrgbcolor 4259 2904 M 459 -489 V stroke LT0 LC3 setrgbcolor 4519 3109 M 220 147 V stroke LT0 LC3 setrgbcolor 4259 2904 M 4081 2738 L stroke LT0 LC3 setrgbcolor 3558 3149 M 136 248 V stroke LT0 LC3 setrgbcolor 4519 3109 M -825 288 V stroke LT0 LC3 setrgbcolor 4259 2904 M -701 245 V stroke LT0 LC3 setrgbcolor 4259 2904 M 260 205 V % End plot #1 % Begin plot #2 stroke LCb setrgbcolor /Helvetica findfont 140 scalefont setfont /vshift -46 def 5692 490 M (cos\(u\)+.5*cos\(u\)*cos\(v\),sin\(u\)+.5*sin\(u\)*cos\(v\),.5*sin\(v\)) Rshow 1.000 UL LT0 1.00 0.00 0.00 C 1.00 0.00 0.00 C 5776 490 M 399 0 V % End plot #2 % Begin plot #3 stroke LCb setrgbcolor /Helvetica findfont 140 scalefont setfont 5692 350 M (1+cos\(u\)+.5*cos\(u\)*cos\(v\),.5*sin\(v\),sin\(u\)+.5*sin\(u\)*cos\(v\)) Rshow 1.000 UL LT0 0.00 0.00 1.00 C 0.00 0.00 1.00 C 5776 350 M 399 0 V % End plot #3 stroke LTb LCb setrgbcolor 4304 755 M 6229 2045 L stroke LTb LCb setrgbcolor 4304 755 M 971 1500 L stroke LTb LCb setrgbcolor 971 1500 M 984 659 V stroke LTb LCb setrgbcolor 6229 2045 M -952 213 V stroke LTb LCb setrgbcolor 971 3275 M 0 -1775 V stroke LTb LCb setrgbcolor 971 1500 M 52 35 V stroke LTb LCb setrgbcolor 901 1422 M (-1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1388 1407 M 52 35 V stroke LTb LCb setrgbcolor 1318 1329 M (-1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1804 1314 M 53 35 V stroke LTb LCb setrgbcolor 1735 1236 M (-0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 2221 1221 M 53 35 V stroke LTb LCb setrgbcolor 2151 1143 M ( 0) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 2638 1127 M 52 36 V stroke LTb LCb setrgbcolor 2568 1050 M ( 0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 3055 1034 M 52 35 V stroke LTb LCb setrgbcolor 2985 956 M ( 1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 3472 941 M 52 35 V stroke LTb LCb setrgbcolor 3402 863 M ( 1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5343 2197 M 53 35 V stroke LTb LCb setrgbcolor 3887 848 M 53 35 V stroke LTb LCb setrgbcolor 3818 770 M ( 2) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5760 2103 M 52 35 V stroke LTb LCb setrgbcolor 4304 755 M 52 35 V stroke LTb LCb setrgbcolor 4234 677 M ( 2.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6177 2010 M 52 35 V stroke LTb LCb setrgbcolor 4304 755 M -54 12 V 127 -39 R (-1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1025 1488 M -54 12 V stroke LTb LCb setrgbcolor 4625 970 M -55 12 V 128 -39 R (-1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1346 1703 M -54 12 V stroke LTb LCb setrgbcolor 4946 1185 M -55 12 V 128 -39 R (-0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1667 1918 M -54 12 V stroke LTb LCb setrgbcolor 5267 1400 M -55 12 V 127 -39 R ( 0) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1981 2134 M -48 11 V stroke LTb LCb setrgbcolor 5587 1615 M -54 12 V 127 -39 R ( 0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5908 1830 M -54 12 V 127 -39 R ( 1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6229 2045 M -54 13 V 127 -40 R ( 1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 1500 M -63 0 V -126 0 R (-1.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 1796 M -63 0 V -126 0 R (-1) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2092 M -63 0 V -126 0 R (-0.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2388 M -63 0 V -126 0 R ( 0) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2683 M -63 0 V -126 0 R ( 0.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2979 M -63 0 V -126 0 R ( 1) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 3275 M -63 0 V -126 0 R ( 1.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UP stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica pillow-2.3.0/Tests/images/flower2.jpg0000644000175000001440000025073312257506326016350 0ustar dokousersExifMM* (1 2ԇi  ' 'Adobe Photoshop CS6 (Macintosh)2013:07:04 17:24:410221,nv(~/HH Adobe_CMAdobed            x" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?.ocĞdhn۵!E@YCF5srPk@F~rY$~Gv.-:f[k1nc$T΁?}0-o.XXL7dǎRtkT屠eZWA1} Mhes[_\C*졁6h><|tUVA kGoіn&`y8H ֵꍽoWbm`k.duDZ[\ꅲ78w-˟].1[+CԎ&e0lkKNV~/3 @:Pzߊ?7R](躧87zeog7;t߫dՐuMknn09uͷ.+8S-ެ]OՏ?(-8ain~9YDJDzLyɬD_Z=;/?!x1/h u\MOu]f3jdKٮoK{1CkIrј*2$V=Z^ߢ\wsozN:ʭgNnr-t LՠNE) D9;vI)dQY֎5S;0 q)!FA~n61`>xjN86۰M_=qW/$:A׍]MtDRư&V0k4u9m.y]mucYmW.tY_ҭ _p: ayhs Ow*V:}$9j\beG$H ^#2eDnNʝ(n.N3=QZE-եnhX(ȳ/wm-.-:HoMCc \1ߦDt>N)/["m ?yszT{q0Xl|hi{GMU*,ߓsƲ vRؿVqm9ZY9|'$?-쮫߿nd߿y,lvz5- i=۲ A;~Xκ]^=[=H.nm`jH}'9]i.aeLzw70$Q?WFB@wtiƭٝ>v&5,g5Wg9.&CN>qu3R==3Oܮ_鹽Nƛd1 IfngF>шkKs!mm_gwF_շON 鞋kkhl9s6]B 28[_Z3}]2[S.Ͳ7-Ƴ5qy{H3eMvYפ޻"M1 y :J1ƉnUhΧmh3&ht8[\nUkAUplюGwVv6784l<"tU`tףs]-Q;~Y=Gjv)]n<3oVkw\[j{3O.v7Q3MsMFUem'Rfskgbn~b~V%M85Fu_ &]ik̚~l#cH,{;1ߌkdzې*d3q{?Y_tX:^sTkvwW.$O־ݘ'# Ig쾙ժkDZ !K][/ZmOվ31Ưv{լ's߃eu"ۅ'kV3?YzSZI~+C}[K JlpgaĪ2')P4&NGN1KukZ7g-}{7zY}iiiϹk^WC]>|7zy6VN%/?ܖFks*:'ϥ"K%I` $l~LbouηoG l{=s]\˺Y϶̊licvI=8ezKZCn>ܛ,w?"f@b2k۝c6eLLûv+Z ~?qJNMÚ]إ2O}l@Qӯ(1ҏP镵k 6{vugP- N" u_ޤR0o~ fJklk[YBuyXG7840U-UXH5 M0<@ X"NU&~$;,v,,@I:7Su1P6 mMַL˲Zmt~`PoqtDUNf[AU6nߐOY__׳"Ɂn}TcՐ1ꥭp swv[d9p3iƷc?ݛM?hɺi`kXnn-_5YþQӰ;h.!s#cYW]/L}RZMzn=ZWk΍:.vT-pW&[K쵿= eYGR{X{eqo U'x Q;[C:ىwb/_j-Cbr6s-qel8CC?h+v?쾴 ug0͟kw灔j&֘% i}7+h$ZcuXz;h$5G}T(ۜY*!wXLܺ^al<ܭ0=Q2rCPsY9tk_sq=I>R)sz~EuzK|{,#PYXt#Tu5̝uy1<ןJUð("eC1&t:0dTt3fE\iPV3*lvF4} ~5ܧkcjŧkM~[?kALUA$lǫ8u _`[^(;]}5[V%U&kqO)O<2_UL o6H]yN^;ZIn|G~ct_[U? @#n5'u7mϲs*{-A౪~{IFgf=xù׹6VuQmBik7coѩ }/H%`?~m`#&:C]uwّMbS1N+Cnsc7{ sESmmfeQ-{1զc9QOg!b'u:uϤ[Km:} v+YM11?rNEnkO >R7{ t>;JA.f]ub n!4Ք>hZ\i֓?=d>XX/{7t8¶^y'S"I'mѨfZGP`~T 8eE@nID )9_͵0l?c>YEA0sZč$ꃪn55 N^Cjڨ/"@->Bm3>c dlnq}wM@ClD~g{t1s,6:Z?uEtUu18V+ lmo;Yp}DDZSn;=' U֗mrƱkhslmCFw)w6y]_Oq.:ReZ#V }AkfUGi֙4\#~TݟN6}!{I/hcܫme Oinݏ^/cC}NuwљX %?7U}j!Bͯ(?;(.3{\cѸ1?ܾS<`NLjn/suMkk#m+>ҋkc\Xk4׶kO,s,\}~Kgytw;I0/LnY;: (OW~Ӫο%BEw.nJ3f١s Įm[|xxlXٹ⩼tV.V{@Td*ـ9ud,; mk4|4~ܹ, wU3r.wP!V10YtFu.]=r`[K,'ӲhY[ÛcvWc{7>nI]95jfC%aNaə>38CZ4~\CO[weeV2.{Qբ!Ϣ߳1 rs8xL\-=S,\CeDJ]VvwVwv(Mv!:~ Xe@nQc^Ipca@>O h*͜O MV X`D 7P^}ȕC v[SCl2OzxƋMQmGl/&uBl\J]@`u$-iC ydh.Y%'UznM ~uVifD乣}/;>ٹq(e^/UoZӊ}?t>պ=G.Iu\wͿB":Od}ʹ}˗IYN^6z ` e$uc/Qi r[\]QDOw` 8%|^ +T4p+֔!PPhotoshop 3.08BIMZ%G8BIM%}Ǿ pvN8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXT techtudo oldprintProofSetupObjc Proof Setup proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMC,flower2,nullboundsObjcRct1Top longLeftlongBtomlongRghtlong,slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong,urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM Kx/ Adobe_CMAdobed            x" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?.ocĞdhn۵!E@YCF5srPk@F~rY$~Gv.-:f[k1nc$T΁?}0-o.XXL7dǎRtkT屠eZWA1} Mhes[_\C*졁6h><|tUVA kGoіn&`y8H ֵꍽoWbm`k.duDZ[\ꅲ78w-˟].1[+CԎ&e0lkKNV~/3 @:Pzߊ?7R](躧87zeog7;t߫dՐuMknn09uͷ.+8S-ެ]OՏ?(-8ain~9YDJDzLyɬD_Z=;/?!x1/h u\MOu]f3jdKٮoK{1CkIrј*2$V=Z^ߢ\wsozN:ʭgNnr-t LՠNE) D9;vI)dQY֎5S;0 q)!FA~n61`>xjN86۰M_=qW/$:A׍]MtDRư&V0k4u9m.y]mucYmW.tY_ҭ _p: ayhs Ow*V:}$9j\beG$H ^#2eDnNʝ(n.N3=QZE-եnhX(ȳ/wm-.-:HoMCc \1ߦDt>N)/["m ?yszT{q0Xl|hi{GMU*,ߓsƲ vRؿVqm9ZY9|'$?-쮫߿nd߿y,lvz5- i=۲ A;~Xκ]^=[=H.nm`jH}'9]i.aeLzw70$Q?WFB@wtiƭٝ>v&5,g5Wg9.&CN>qu3R==3Oܮ_鹽Nƛd1 IfngF>шkKs!mm_gwF_շON 鞋kkhl9s6]B 28[_Z3}]2[S.Ͳ7-Ƴ5qy{H3eMvYפ޻"M1 y :J1ƉnUhΧmh3&ht8[\nUkAUplюGwVv6784l<"tU`tףs]-Q;~Y=Gjv)]n<3oVkw\[j{3O.v7Q3MsMFUem'Rfskgbn~b~V%M85Fu_ &]ik̚~l#cH,{;1ߌkdzې*d3q{?Y_tX:^sTkvwW.$O־ݘ'# Ig쾙ժkDZ !K][/ZmOվ31Ưv{լ's߃eu"ۅ'kV3?YzSZI~+C}[K JlpgaĪ2')P4&NGN1KukZ7g-}{7zY}iiiϹk^WC]>|7zy6VN%/?ܖFks*:'ϥ"K%I` $l~LbouηoG l{=s]\˺Y϶̊licvI=8ezKZCn>ܛ,w?"f@b2k۝c6eLLûv+Z ~?qJNMÚ]إ2O}l@Qӯ(1ҏP镵k 6{vugP- N" u_ޤR0o~ fJklk[YBuyXG7840U-UXH5 M0<@ X"NU&~$;,v,,@I:7Su1P6 mMַL˲Zmt~`PoqtDUNf[AU6nߐOY__׳"Ɂn}TcՐ1ꥭp swv[d9p3iƷc?ݛM?hɺi`kXnn-_5YþQӰ;h.!s#cYW]/L}RZMzn=ZWk΍:.vT-pW&[K쵿= eYGR{X{eqo U'x Q;[C:ىwb/_j-Cbr6s-qel8CC?h+v?쾴 ug0͟kw灔j&֘% i}7+h$ZcuXz;h$5G}T(ۜY*!wXLܺ^al<ܭ0=Q2rCPsY9tk_sq=I>R)sz~EuzK|{,#PYXt#Tu5̝uy1<ןJUð("eC1&t:0dTt3fE\iPV3*lvF4} ~5ܧkcjŧkM~[?kALUA$lǫ8u _`[^(;]}5[V%U&kqO)O<2_UL o6H]yN^;ZIn|G~ct_[U? @#n5'u7mϲs*{-A౪~{IFgf=xù׹6VuQmBik7coѩ }/H%`?~m`#&:C]uwّMbS1N+Cnsc7{ sESmmfeQ-{1զc9QOg!b'u:uϤ[Km:} v+YM11?rNEnkO >R7{ t>;JA.f]ub n!4Ք>hZ\i֓?=d>XX/{7t8¶^y'S"I'mѨfZGP`~T 8eE@nID )9_͵0l?c>YEA0sZč$ꃪn55 N^Cjڨ/"@->Bm3>c dlnq}wM@ClD~g{t1s,6:Z?uEtUu18V+ lmo;Yp}DDZSn;=' U֗mrƱkhslmCFw)w6y]_Oq.:ReZ#V }AkfUGi֙4\#~TݟN6}!{I/hcܫme Oinݏ^/cC}NuwљX %?7U}j!Bͯ(?;(.3{\cѸ1?ܾS<`NLjn/suMkk#m+>ҋkc\Xk4׶kO,s,\}~Kgytw;I0/LnY;: (OW~Ӫο%BEw.nJ3f١s Įm[|xxlXٹ⩼tV.V{@Td*ـ9ud,; mk4|4~ܹ, wU3r.wP!V10YtFu.]=r`[K,'ӲhY[ÛcvWc{7>nI]95jfC%aNaə>38CZ4~\CO[weeV2.{Qբ!Ϣ߳1 rs8xL\-=S,\CeDJ]VvwVwv(Mv!:~ Xe@nQc^Ipca@>O h*͜O MV X`D 7P^}ȕC v[SCl2OzxƋMQmGl/&uBl\J]@`u$-iC ydh.Y%'UznM ~uVifD乣}/;>ٹq(e^/UoZӊ}?t>պ=G.Iu\wͿB":Od}ʹ}˗IYN^6z ` e$uc/Qi r[\]QDOw` 8%|^ +T4p+֔8BIM!UAdobe PhotoshopAdobe Photoshop CS68BIM http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@,&     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?NMTƵe(V6xH,Wz'\R_$۰ԑt3CZur5[ۗFdPT4DIE%h\Za6K^5E7 #Ŧ8#U;ZY(/9^ "ID7g'WSkY@uڬ1S=CZ$$ި'Aβ=B&QYW {2Z!: ?H<X`k@O8Ϣ+Ԗ6":eSK`Y34RX9 Mǰ/8=Rv,b~Y[vFFYW)6>`#3ca>|4nw*5WS_t5>[}:Eq?gzO{uCӋSOGڔ*NΠ͸r*'I-Jo4ȫT_ac٢+gig# upNzy۽ Ɇ ZS.r 4xuW[qUf*1Ix*j30⎣I*W.$Gme0(?TmdmQ b?xuGOuxj*`xjT/p$XSܾf}5l12^lut_tG1l}Ƕ6-&Z K9 ܔb*VMOW9hh!y#Z_JM 6{Q'|X^=9+9,ԓw!>6lр܏seAEܛk'TᢠH h}2( >>øn6ja|:M yF Z+2lJ8kw}.:#"$QHj٥JCGOwbW.Kx5-/ʹڀ=q^=ô7 Sy }&z-Hubl;Yb+/Ó{{6imsT1EsN=d!{#n(,He'h҇rߐ}֝Opi{mdvɚh,NREI@I ~n k\MӬb*t=K}pM3nb ÌNĞ6nzͭAJTd{M ' _5wsV#}s>{;ۛNUL8lY[sC+ҤJ FI$/3j{#-| 3oHzzxgS$Zv\h _s)mRM$stZsH|;b5i[5.+FX-?l9f1D=ڬo}Ucaryz F\`m{Ǐk=hZ\qǧQ{{yw5OGtfQMU)T1JCUR$$sڶȁdVg!˝}4ˣY#s'x*~[#S)\G>Fj2T"ND@W.,9wܧD=BQ>3ǬgybqStBʊbUzS.C$nCTi”*g5E kYA)Z  ꌮE59Ո,N.o8h+SEHeC50H:^Eo+vW.]KHZ#.e~+7F1h%PSs14*:irYMWZ\Ywm#UA^A_#q^l^CugX{a;Ҵ)^ GFhugav>uc1{9# ZzXəDJ*C$6meMq=9zM㻆E5# |4.j]۔k"\QSFz0Dr"Pki#-IFE7RiIv*C~OQ@1Us1}!u]#/%qLmXo{~䶭?R^S˯У<6719R%2Io$O7>l![=sH >NIY]I8+ @A?d#W 0$O[ B6="$b&Od2jyqR)Pۓb@o'QVz.)b<ڊЪ2z]\Wӡ3Hon\fk'WS;g836ȘagGQ伽ɑmײڮ# 2uS:wn/K[SC7W-)I~IΫ3%{ io 4lG[aa0XDuP%j5XMLuYU ZJ8欭=A?ڀ捂R[sS2+NyzH"ۭm%# P|ʞguK*ivRKOgZjLr{E{9=擤y/ףby{mKVIWBWQZ:װn_9UsqQ[ "DXMk_x߷Ӽ<2~lW.y7S9ˏW2+;A{lm63:muNՠSp8\Tc!KY!YI Cg3sWuɷP=mr1ǔeJ5X~b76lM-O/q|IU^6w,!UCY#_({l#䚓i[KnlMʕ@#<( Ȭ5`<#y{k4;BȿSk%c}.yy޻}7lr59Xaکdm`f,H 9z6;5nB5 }[2mY ځI,@@oLr?^e1)jTk_dtsM5,1ɱ{_V{|.צ ΫHǘ ~W,ls[,4մBڛ'_q%< )E U[BYsk.[DjAgy_`X-QȦ+OWdQ fY^'UJ;1ґH*͸9 vcw3ocr{TSͽO=1IOQ[W=1o,'u0]Gϱ݃NJS:mnJDR:_>J`:r{gq|ngPC<4A,e嵁Q{X܍aK7Eãy}=GIym61@rŠT?}WOxf2n!y ETTSQq qn[^}e\K4Tul#!SEWӼ[V^]Pg׫~Z\3)Ew CI+>t0х3%4xܻX^~}i#=j1EyG3pְ'kXrmiLҒ#6$<_~>j|_.6OF z= y*!E$ W>akUK}tpk8|zvfMt 5MYΚlkx.˹><[7憊'oj̔)o{1ϳ nyr3jI-ZkCr?oAA .Q7Qno,Adp)QE<>,|6)" 'WT/2I~4 ߕ~N<ޕHڹWՓ5?{Lmͱ /4xiġEd4ȬD9^nl d#>]Z{[֋E%ry8i5SJ7Lwh!Qc=ne I8SOHymlheO˥C.۝Vݧx!XaM ڜ͏LT&u!(]ؽQZvllwFnYlN;wA򴹺E4yhjuU;Fݸ{uođ"!+L>+9b=` fcg2`t㪇ad=ANs1pKLPꤤZ ^6BH#)Mw؎,n@`H p8=E4Qʳ2Ah)^)| nDMMS 0z T)*)# 9:Y6P^{"um3kD`:cgƋ%m'[IIRIq4nm~cߝ)tނ̴$pA>Jr4쑳,+x.3(ۃ V<>ߍQ.SDxc+0ˍxqU4ᡫ:o1 JMv zMZvKnI ,|!A$)&)-x/w/o,Hc4*dz@AZtLΆGFpٺἷUa5.Z-wFԑ i)e=rk^UC%tt BǚT|-GwmnA~DIO+g5B=tdzmWr’sRBoު T+ϰݯ"rGP$M]|*{(\Rq}归oZPɨhvJ$Ў1o,^211FDgz}[4B))us%OxVUhSN 4C'd-ݡv-48և΃FC3qZczm;iS]Q8H>Q]/\ݬzOmhJ bJ$ex@9E*)E*|^'!QouWȾX*l"<3Ң+L\>R&;ȴeW`АVAk09-NZ\,q͐':dFLX{[= 8E}z ~[LjIIklO4ӽH?3Pdݸm"H VRR?x.m۝ z|[k[=i]򿫫{=X< 6͉ܻ⊝r|nc;V)K&uپv)6b+Sħ9+SӠ7C2K|.F㎬|tTsLMG%$  ƗZ-1RMHd^4?'TF˒2J.3H~YHn)tڅQVK Q5JD6۟h./u*uK#;jձr5^ >޷EbI?х#ͭmF%=~:i_ңlu$-wG"Q'껓n9 X#2*W@u0nvbϮyJ؆ʨ]*YG[ڸ5gbKУqET8| ڡ+%`m;o}YںQ^cyӸh$9 4ň_A{")CNF GƽL %^a ܷ>B>ō}=' ڌ⃠v%$dx!jbP5϶Z(Ƚi ]BX?ׁg?Nz]Sbmf&4eZ~JNf'}*n,ßkaOt(*Fz影6vɤ]E*=lL8"S'i[?U7/ݩͧ;{#2BZ'FS &]LPXj)đ˳{q%*ʢv5:2%&s{;5ݻpkyE2+A,Y$j~yH)S\yso5ZvS6xfkk[ "bGphjT T&VOU-N1'C :BрjzPA31oDr"+QV'UF*|Wn"FX20=~UGE>c'K[C4eacocϳkۄI#?К yfe$%:=IKؓͼc"Jjj;h 'G$s Q+%HWJ5V*TIvwn76),ц⯘ˣִmo޸:j,-&Oi:)6ejbj\AWDh%]Z󟔷||۷1l$m3CQVƵV^M޶fnf7*Cg$%5H.5]9ia UOTn"?6[)+w }!욕ТvDSb_n;ݾ_ն&(HWZU*Qy~jl g6hYjn.XRXjsӯYEqYmvF)A1)Sh zQUEw+m6,MLxb.bodaKHr4sDSƹh:>)6n?ƾU6驭8T9 -K5L5[oriAF i\F=ԅ,@՛ӧۥ$$6$a Q- U"|!e]V6O5.vNۘHqQc)*RR ̽]Nښ(F eHb!=oݥg&:B+ã#}1mZj:Il@+_ύؽ1U}.Gjv߇#}(%'IvƏ9DgR[tݶDm{fQ_PqTq[mH<_$RxTև#=QFnyȖIjjS;X,]bO7Ql'9&Ocf E;R'OZg+bO~Ga},/Q8+l.GD#yd<~^~O<Iʾ]@(3={_xi^g[UXmM7努 r@{- &$avsSԭٺ֪H$Si-3 dTtx'z YC`KYm\@^ċdkg zSDwV KmsN˓%zլHH6H?=%XJI u[ct$rx LV]6,L͞?˥[SEza@?}I8~E }--zD:*i& 7H[ZMY,J2iOmf6(v+KT:I!Ճ^ ExbPǺn$wQLB~OC. S@ o-Ěn}ٔTe+'j*g)fR%isAESO ?%؇qcDV4#9RL@&%Qèߘ7^^iW f~*̻KXrZF-w]nqҬ­Ip~s,nkJcFw^;:I6jKQ yBGcŝFz W/6?ۿMQ֕G͒d^Фk![02_RHFd#MIQCµ|y 'i,LAgLi{_sf[#h6L#  H )<ԶiZż \9R#]BQI׭C˵A,!Xj zz3` ϕeTnVZy}>ꎊjÏ45%U4dcDF9FeWyMlڑ-ĥVfM^{YO$lk-v$-YGlb깶wWTWpxZ}޾jڷ IWg䫆Wj̒.Br{yn8`ZQ@  JP|2EܘLlF8)>dR>]yvf(Ɠ61*~0Og3ٓj#}i аƣ~Ηuc%ǻʔԱ,}9_aMlS?NW+]5Ycr5OS_OG08h+j) ɹHQOp=Yo+Z$6 :i7ȥoUpUP/-Q qT5 Z&z܎Bxh`)vyT=IST8Ue=B]]#Xf!TĀ,Zd1'H>-=K,ӥKWdRH&9M/,r*o✚u;cٳ8t띗J­EAᏟ@:nZø+7# "+fSIIULa-Αpnۖ8ܷT '˥WGh *N[8>C^ٹ-P`5dՖm}ky#DŽu\5rȯQVv%%%VgR|r+dmw|h12$ ը*0As4w6aRFQ֕ Gè~SaǁzߵMd-MDR8RKHUUX*,y%\r3wM],!Ku^ǜVʍ7fojLDXZLiьE<z wf&m-qކ?sNM׹:nG Ih>Yc2 -ϱ\NL7"+{xp2w8 )h.7ULXe'$2Ii,$[$%6*MpH;m{68N?E**ۦ!K$_EE4:V'I?Kw6߹: *?,uʛizj?|۳nRf!k(\4'>K_[]@6We/fPT ji$" R,U6^Olɷht@h-]*jgV$~x<{'9TW*1$|=:?GWk[i{GgS֣Y+#COxQPWS,j1d2zR!PX->k:pۃZ9e+PbNB\ITlJ կ2I56Ik [?-4e\>m M2F –a> %𕼺:ñ áb"6J؉" U:$ 1u~JM|*(t-* jc[#boCnLbtg-ãy> &IF>LM1oDs]R{ZrV$gl&gdVmaXLPZxiTTDhQasc>ſYy\tEpb[ԓ'־ |wu&rx⫃eIniܳ׿Ԟ}–Z?WOp-$ar+5Lj5 =Ԫgj+(%۝P&4:?1O~q01J …@*AڛRگ feiZשcMg3S^ǹYOQI6D. W܃ca56eRI5X(m%k͒=7 R2fܒn*x/8,f3r155{rwy cCJ=[Y-1](o=Oz \%]Rkh[ٚn4l1o[ ?Ox!ۃkr>kZHSmNtTN2MJ$JEu*ZMUM'ߠk˽D쩧p$p ˢ8fVҙ=.;#ͽ$ٛz4/w2y4a]0+}Hݜ`z;x8헆;˖WU sO/.n\aoLUҐy権bKyefX~=>y=AyDQǢPAϩHse&08з<p84"[rGN7da=S4Z}ؙf횛 k9s5 Z4-X{KY^UBO垉e@|7!Ck.Gnbq8$OTJYW}}v$@?лjFheɨzz~-]I*b$+[DVTFmϰ[5ﻍkKUE 49bdCSE aVZʙdi$[+ Jv}oXԊb_gDzno-%)]GN 9(+051ELL"DzLd [a-mviT+_<稿se`bɨgքQ]mg:Nw"j".%[5nv{j1$dRXV[v/| A.߅ݛ-QXe%U"=ۮX_O95$S?KUYg??^2=x#1[O TȏpUpj $}=0mj0ma ?i̼Η'"XMzcUzښh+H,zTx KeJQ):-iniKXY@GϤky>h4Fz 1'ʽDz57[Ž垨}O\~_{WNR.ltYYJekfbi^czI.Yj_Q齇Qn'4;Oqcxꑭ/ }.ߏwKeB8,zu»HKH`muIW'J9Su1.C\&_uVE=7dc!#E$^67 }M~8!7c \] l0R4M\Pwn:~mo6򦃩>UE]Jq2RȱY@WϲpP tdт:yvTWbry.[Q:kq+L 4w$ zt5\VAn_{gyEk7,8QI C @t{~A&stͤTUt>\$?uy{N hIiiyZ_E}N=N~ثj`dhΐX kO?mmPT*T wNu 9eC|꿎J | jZD&."ox%oXD>0PO{ՄZn&QƝR,H&܋_4=2 sP _YLo3n:IjFW"Gok88V[<C>x+YwfxۍkgRfsb Ò#Q6j^!Lxr~ O÷/QSH y3ԚrX)*/o{]]]ZpİXʏI:B₺kǤo5HR>Y5N= [;#+םmS u!FYܕq=K U,ok}y:c[w[d?0EEg36MV7U3x$MKR&yk,ntsPu&ɴmF&u"t,KRV:ΪMukd`YZ:f0XZF Wqy顑Y}bomn}U)mm(B*GBGml}=e/OOsiD,/pYfwcؾIk|g?Ocݥ%=>75ɧd㡣TwgKozwJ3➒nYY,PMȹ-wt)!@#j>tŐ8t 捿{kMU.*M 4^b3Zujl^}r#CϽXSQFPWT'ʱػ,"eI K ZZFBLH9ynھ0H$֬E@+ANSwS NٳnxԴ%% =;SPG_7; ~p"kLPGNhj.e(-O?/:/^]Y:rv^ڣYytbOE$KF K4ߩX뉼 YQ \ьINgB h @cJӇG3{~Pb4|V#7so5YHɒ᪫*G }HK{Nc-ZOYi~15^1G ܋x>Z:E4[ۚ1öW֤ɋFaab '[ rK'SHi##LdO"Ƅ#ߏ> caN9`^iu4W eoH;xp3ҺF@OG#QDWpTgBs$(9uxlY ( [[[Ŗq>Ώbhx푣Da@$jcH[K@|)O$1y < ~=_nrH⿳̕$lY$OԀO}I|TP@$ZVm}j!y-%=$\`P՟;2Y.x6 ۨv^XS>cVQkwl鮖ϝ=:/]0eyjH+s5HOY,\E򹱸w$iief~C=w91cFQ>'_pu.gl'v[ɕ:PO n?@yb'1e_@FvG/ IĬ3,׫T쭻ѝTVdWp6rBmn*qMn{hjW[.ݐIV..HԆӿrGY!:*l{o<'RȏO˭eju6ϓڵgK"5t/o7pr3]F BP[I叟CnE/{m56hYRȸIW#W!zz:iC Ur,CW3ý7 !Y 38 Pʞ{w||{ͱ-$ۻ-L(Pphjhtt^Ç{pZ,.\ѫ7%[tlm6[>\+xEAK*e)1`xa`TҘVlʠ=Sqڶ^Ty_LAٟ E.gTZ[@"jЂ%U$,H[-0s^墂qF fOSQ BxXP`Q,$y"WjP #P dumik$fGjt ;' Q8%6KJO/69ۭwҴ?N+Z ú q@k;M՚|کfzv,$7,/~{&I>gXn-Y!~#l]jjquT J*:d׿ڊl|=4a0CSkeZHc2KTW'E?t$A#;Z_ZrBՔOhPQ+UCije2k ͔\~N$e+3;Ad5ߞEN.= =Fޯ6_v)^ tRv >{Gz8杭 ?n }:١$Ө)-$ʀAּz_U_zqM8ƚ֝׮x|B2x> qb~A@v@P9ZqD":'ssob(#mj!wFzY*%6Dh pz(ɍ:.r`X6lIXqvƅEEPQ{3ZP:3a*W-Uttb298I%RC<{/p)4QUB١Rrxѡ? q9OU]5EJCƂTH $}mhlǺr1t+ܶ:$3t5=?Wf#4T5'Ʒ'VDk_>m{|is&Wdng^~%/n?\}E}eK.kt6}}2Xo*Oj+QtR2OA곻3F}QYIQYSPcݖ(1Ȱ2*>IKz^zSy?Ћnf[ J O^?mxi*j|uU +zHϳ7lajќ~] ysmu/Fav _>(6olI(D␐v nOrnvɮ )_Ө{捶o*̺17^[ԍ%z-2R%BUo}T}g*2Z/ I6+2uQQLxbUU@$㿵޾uu"lVP:neݖS3{ `^åpMAddH2lbR+1+@^Z_t(|H Nz=>^c +-CX$S=q{C)&z8iEM#5L9"[2K. t(QJ>}F;[l!18@ #@'_7&s ӻsͣW=s׻O#RݣaO"KKEHSiVgd#cʩn㽘v(mcg|J-08Ѫ=}߹K/ߛ=oҾoan@*mm (Hu=I$t{rRfrZs s: s޺9fH1䧘:{V+DZ!/J%om]Ź%UYU]ZiF?!W]̻N@$Uu=`y|in%#kPν(;57lee4LU14R< C"=m[o*0qOCNk[Y0"01[C fy>GJ,uCܔ/.fn1YLN竚Jy2xXu vx1Rzi2x`yCYe6COR'h'5$)4JZr}g'Euʜ`]@||+9'm۔;t5ʬկ}zn{ݽe򃱻'; !'YghT4–2[z٤4 iw{e9GQvUN9vV.)Yx^USK|W]9[65%I4x0\Ŋ:H}Y$`}9uy `tᨣGW`էg0 :&wnY6-.TTЬXؖOy 3$Jc `d hM*ƸA=:!//$Fh#Xl~'/Tˏxx-J)R.Ԓ=lfICJX<g韢KIױԏ1L˒*AV+8ŏ]݂^[3 uF}Tu [Eqdu#PQzu-7?dЎ=";|BFzOV5,H  n2:^dӤܔrD̺ob ߎ?"=ӏIZwzZ"8͏_WI_KF)*r %*'zDV( ؿ=Ļ[ahNpxh?~tFJi+r͏1jk&U)KR.[~܍xL|'*rꇎŸ?J;vE>fey@p'\{{l"oDN#6϶܈*~]+?Y]&ӎRD,,1Ee\ű^ۻ$T)m'vDPE)J.de ag!*|P_~>+6vőSY?q۝-$bHxepMOqYh O,$k&iL MŜ HKiAAon6hfI>Cl%{N}o@Pl7kS(nx*\O34WA,dd/MܻC ѫRPpdw-Q^-/{z@LdbӀ%Iy' }M.LMPێkm [۸IO@h/(f2vg,");Y ~ztOFGCy^טR +YgdZ@uSCMyǼvuW\n`qbH*J8c %qՁB)/v3srO>s h7I36%!fTZ`y{t7|;D{E΍F@Pm-"I=R`\m+DL4E 6Ttq{[$Ř5y͗&,CJG )L>G|zӘ,#-#UPx(c5|75YT/fNl YŁLPR%%fc[ٴVP4iIAyx7TfB:?q=_u~LWJzcm5"7%%Dz׻Q%\rHWc~Xwdښ}ۖԗ hR 9Py}69*JzeJZ˸0u[g˓#?ZnHyIfEfR!2&zS#eK0׳ Ǹ1+F^iKnV巳|KĮi''תƜlH&'-6'9: >_nWI7r$e 5R:c%7'nnV;у$(e+r)9or/o{kfH;XR}"{<;`ĘاR5]͈MU<86)UJ>hqۭ'yV[2TK21KQw{mM؏U0|H21R?-WT _`\c_gD5..rOhjL:\+IU6<\\Xl%+YǟHGiZ7_ų2Ѿ.0KxebY-?ϸ=u/lv,i#u47KРϘ:6]ŸdM}WU4,1V!a}}}7{2`yLg .b1{J̃Z]9 ߲1XzEAYbmIs6myase*XP70>߼Eq`AXb<6"q*%nx}ϰf] ڽ&7i @a`hq,ziEl$^] Aub#cmfMr/r#{i-$GIh] !Or,tٌg=boEڴO\֘1. 9/gO4YcSfETḱO;}}>_w]?F31vjAXUSNo4eՀp#}?3rexP~m{ef*OHt b6*yoͲg"GϢvC巩ҨDl U6ŽiC0 JӉC)堈}J9O(}}{EGAKkj!a4MŅ c3*qIV)Bt}Blyy#hI$WC6Bt~A7&$c]kZ@B&6GJYI6nBA݁ۍUt} "PϧB v Nßg6w:ML⚭ptQPj2E 2>6bn/WN ,'+{qr@@N3_f|r\T+6M45%1=]C#)ǵ[Exa7iʃ+{N9 cG˭xޢPb][ޕ6~ ]] $j_аb2-ܯ;',ɺI$z"MCAJ0I4zBRvf6UCȾ7sO\M^ˆkWSG$0y!/aѿxmvHe}5˥;{Mmv^`QPyu_ؚɶ~zZ]ohiScI1_:զUaP[}W6I $ >p=!H/7 Hj "Q TxS]Y;vd;>j, |A>Fmˍ;gw*T[dn ssJsi]N4 .T@l;#rvfha[ASH2ǧU߶ߦ}@H̔`X둫Ij#_C{Q6kmOM] +nCQ"]1*= 򔧜!ۙ\Vx$N'6 ;潳, BQZL Ez&׏UVK U"a 0u$GpE.q!8cL1Ƹ q7m6XT4рpf=ZBR6i2kFm6:xM J &s؋o3N Q,O28y:Wme'Qfh(Ĝp|/xvFR MWa.?isȨDjDJIWJٻ+cwmE`XH4]`Q$p"G‰Nv6njJU4⾝TUI77ƞȟcݚ~m{.ΓǏ|?74&}F^&u̿U6DcF'Lj$ j8սHn̓9d*ߛ^|09= >I$jDiȫǹ l/ɸF^ͥ=?+Bz] ZN+O[.9|doMÍO9t6mOT9"r4w۱X=e,~`fnλG9s]`Q$?{aڷm'դ_UM>N5D«JZr/ E6sn/aCSuVRKJ=Ilx:}'r2ȨiPXzMſmEoosM$SYc7E;{&-ḬN`đsYI}- 'ebxquBFl,mʰ3[8U#9W}[k(]iȜU#~jRC,f'v 0@6$#h [>XoeZHuUP sŭ# sے61Twσ ?IF^ O̶!iNI0VҨ8!ڇ{^Lzt!RR +ž{ ~UA?sܨD>+haWYB*MV7>qr=w,lp/A5>yoh.aڍT%,xѻ>Rn~ϋ KI 6'K~14⦵goͯtEHvLxt䞻i XYT}B׳-c">VWt#zJ|Ff:eiY_U$1fye{ kI"u*'zu?u''w7'{{%JHnZ[:!̮̔&s6Q1i+YX;vomW+njf <ԊkzIB=n!ImajB bhx;S.ll퇺r>>tmSCRKNU1Ug\g2۵\źY|sG'B0)ãRmhogQ%M?8&@Z[>LmND(1{Xy2c;EZl}To\}o?, 4 |z Nn9o#i(ypҔd>zgG*t亣|akYj69^f1KU֮. k{ȝpr4uTH"2 #fE:?ؤ+]EeXkIdj~4"zL|b(zdrt#"2 VQSRIRɒi\HJ{XHb.ՠ` Ȍ*ݬ))#&hma⻷%hTi~V=!7&\ap0:U8.c*FH1E#8a1OQD9->qi|&Ncej(1U-m[Ru%( PF5 :[zq{FOj=ˉ5c֨PSE] KK @yc`l}J{mxjzzDܷNYIOJLqz)ۿBWSz|12-Q=O5TIVY3iؚv陼TWxשj9V83韰W_o3E6vT>#-rRN&!@",$4GL!ٮxhطil^C$A=BVhKmrK+ܤ^aCV(:ӧkvnuf<==vv=Wɹ6:xqdzHo&q2)˜^r/6\SK?ٽV!wkmzmg{'!J^#h!ZhWћZ՟$wCm!xro Bf{_s4r#rH%55:zն񹤳\%Jjj`Tɧ@P{ ŕxibFv6!ؕ6x9Әd9nwI*ᆳp?hWs6Y[ ip%@T_C,s(Zĉ㕉wk$ܐO?_y ȾܬV_:knB+m xЕ"lXorO6mϗnP]mÎIPB?"xA{(xcs$zM?= =wj tu}O_k6GF*__.ZJhCHB0&5 .߯q Mi @Wݬ}do.#} ټk":Vk":/l;9 @ Iao>rETtlMB=Y)@EӐٹ iq*êAt.LjHsT<&5B8W"Ă$xͶixeQCtHуtccȶE>0yIo,!T eˑ)Q`lnß` c˧i]7^MEQ.X-@t E?./fR@L`lʅ@n>D#IJ ׻Ӑ5H9(nE?wHXkM}>VAbԴ,b~{vj2&I4̓\RzIeRֶs%G=ZƑqwRDLA]@l h"Pi5:ZP+_/&ZXJ7xդjkOV{WUgI%=ʻעѕ]ϛh H"OK%{m~RҨ!=-m }iŘ$Ch۬JKIAA$K9tkv&ׯy <OV3EUGy!$Zǐ7ʉŚExtBIR$kºcߟ :%9\n>E_-Rx&?DT:6{.zdGw4(eԃ\G>h3x&+@}Ԕ oU4 KNL@pG }mݣ2HRHGOqB;+ `$F|ӕFo`T٬'nƣn:q;c1ڹ:Z%I*]1ܜ,rЬT,2l+g$'txT'*vgce$;jTR\V`:GEtF*}v]ZXՔS:In} gH"єY|,ǗCdu¶Ŋg][wMSG=,9]˻/4r״tPR,F"r>sf-m{Y1"2hW Gps'~kMkzIRW 9C+S|/glޘ(wf*s *M2Ǻ19v (h]M,Ξ)X0 +}qh.[7h @ud#Pxu7{na}qc=DA~8ۘ=򟸷֩f0m=GAGG\fGJX֚z2*n& f+-טo岔KH9ENNq;گʚwwɷܲ^O_cq8=!]Jm*FM?U-Lz2n` P*6DhMv vQǥ_JR,ǧqݩm\\4#tYB ۆף1&?2SW 6o 5ѺKuk^t."eXT~}.0XʞXb8?jmJ2磛YiOnҦkP<=) -% O:Si>TCKP8cMep] 7+z MV h@@->JĆ#D;xaV0фT$~@=93ǠezTtX{R*6 ~/` T#Unma7WϢo ?>Ա̗kqu%DR#m!Ml1ȗA^Ok噣n'ּR3xqO)뺳 8u@dI7FZz0I;FxUk}Gmt35xc85 WYv*j`ďɹ?aw֣ϡ=Hj(aJrȤ~rl_oHp?>[XIK4> ?7Ɲ2/qw6ƢTH$ #+hR@!x ۾J93dvk:xs\-mrx?oFڛ!񚆞LbnLXIbP4y#Mu"ԁm4B3k#=ݟmúS10uSњ=99=>WroLcG++f4@#7IZE\̚.=vR8 q*Gp 6+{}6NO#ޘ=Cɮ&x^ _Ij*`_R)*|n{f|$jRY11{Cӛս-zhX:jPiZ%63^J3{:#Bi#)%Hڤ"}-/ys徸Oɮ Ӫ[ncaq`8 .ulW;eW`h*Dt[#,8j*EDb=o=AhHoP>>X.nYU TzToU񦳲~jb{la⎖)"ed*i*%?òѰUv40QdICƀ _z3ҽuO-Ցo T넞PH#')NWGaznMGiv}aܘJ8%>2F}lPQNQBd[ܧRAAE}znn0"}±Z|B亗 2)]ve:tlJU7f6jLɒ'1}?Mh 뗶Kxiܢ G\t9z(l/kWߴ0`KA[ZTo߰w_UCbzx*)h$lT竆$մvFPG1, -2[: U"/Q-!dDPH0\5 *37[f|^s!Sbkf )fjuԫ墨6^,ly>>-ZlNIJW R.fV UOz~ EG!nlIoKǰuhVmP2fЁٟX)br:kadC4 }UE6$,D>_Jݥ0#ɉvYM4ʢXו% o>unmR@ǥ-}d]c6q-㸴Ŋ Hp7nw{l炊RSm^+rGAT~u}D|П>KQn =zDC DHMqB0?.F@8u;R2jkp-s-R 0:1 gCn*1im]Y?^8y-:)1^(~݀K H}ƁGhJT>y hwI4 boktś7WQRO@&#6$~ PnqQY]< f<ۛ>[~K͖)kw`{U]XH5W˯իJ&hO)y!$;`t=ѭ(p|)}gYIڜ~$VV#4l>HH]*ֱfcϨNK6H@&dZ AKo7gޛt$i6RA%fUDG]X=w6߻e4[܏LEX+OГyd=!~)@lp4-dtEUi+jdpb1L|:~G~N4C7WIÉ'|B-M$7@E8!jn)Ե&X>ZC!FiTDYTyA =TO?hg'dpI G概hϪL:(V(pǐYjh1TW&4@wSL氱u$Ǻ5dj3*p,@?"i_*t ?Ǿͤ^lz+z .Gh* v&G ML N-ZJ<ҩ# :m\iʒMHecAN$lg [&Tr{U#Hø9=uҀ(-|;ckx v6l.O%͛c+$+So}Ô, 2_DZ J9- q=znb(?ݔM+ES$)t4߇7Jo;jA$U#+),PS2re%Oԛls87٥>ތy7t~`wKE'<;8V˥ anWOn#0&ó6j6Wp4q)%p)c,خ峊YHkV1?ֻɺ"lӴCXS\ChD',}|/-Ͱ %5xtL&Xd|be#PԔ1IQM,Nvt11JgREAlw|Гyby(i$,&yAldЖzB|rKW|`[3>ݴ<!Q)YN0VtY(܂yv ݷ/^/*q$sn_v5,xGj5Vz(8Ӝ0_m>ݛ_@'w+ӕeM Yf: >`++wwp[MwV~2P@*>pn0kh*5|5* <2:Lnٛ?nB6GeYUچ,f:d4+[yuw#? `؟q-Ȃ/jL~@K|34AnkS*TE z.[V+cV?DJ:87ǸvqX0|i??)ztf v jKL[~GS&!z$$m X,mH<ϰ?5u 8VF{#P珒>34XmA߻Sci :dDI'6̗-#f4@'fz5kح% :`Ys;!y a ]žޮZ&Q|ϩG&o`Pxqgϣq,:P?ߟnRpfJ0BF{ڮU KqMURTS ]%T{8#ؖ)}6(@*jd"~qsc zj,8W7^ mM<{GxJp43j>U}g[PGrZTtbTפ+RQ87{I!.O%k~K _77R]7UV:֣ۃSV袆WDSԅ @!Xҿe夀tCj)UꕂMK5﨓k Xf]0\S SCWKE^k,ů77)}7 h.Ƣ];tzLɵZSFEtn2V .@$M{+޴whz#!.Bq/䔁A\3Q$hyR|MLdP,A TkB4jplߞBb]uBqƣ}%V]T[M<-@  n^xqӦ14+`)~-O{<٭仝=YB 'F/iqi[j Ŕ-_}彶=T?gB(F:YAb:j>:}U8zz'*k #-i!@X+֚F+_gk[[iKյҙ3${Ϋkp /{FfeUQTaf;[s@\ Wyǩտ>w e[mRe+UM -.BCR+g IkJzz\;$6V(YON p9kw4L;.~I;{V\^X-v>(ǂ\\5J,D~A[Qm\eoh\lH* 5GWf^XY廋KyGe K kӱǶ7rTd3rqcwe4[y\18ЦB}[qbF5*+|@ o܁WI"O.=#Ǝz&ՒPbwZ⛃3Tq۹HY2tzF5rUX 䤐hG+#xG8z sZFZE=0 l) tznm<;+mI5YG xǔfqYjruH$3yw?k3;iܓg00%Wj Pg׫oYnE1'pgm:UJU{ \\MzD㰑K0W3;\o O 7v{*B怜h+v{F"z! /m-N_3INE,1pB,I@?6v>@zV{K/˫띡Sv3\I˱m3Nu&HNՔ~_R~ٷKagRq'x蓼,G zj ëuO)y<,.~Oz~} 1ЁBY>$9c >Ķ"6R I&S U?y#yt~e]%2WȪůc.c9z wuթȣC҄?Û`mEǠeފq VYnl^?N&%CXzw_}mcU|z,^ɇ&^jU1xS"R '=tFbYWq_]_&zZ MFb!C>i盆Q_I`AA =1|o98Q*n#tPEƸ*7Ok.ptQpQsëSʬuc3*X,~!8у ])^Q&egBfH*0c1櫖d LC ŷ(qL-$X@=OFPڨJf$d1{k>Tte $T0IF11}Qpdߟ맏bIU3B^>a Ih\~Or/'4>},0[T1x#; WR{:\QSVHһkKKlMBŎ?U7udIJۛ^/iaVZFHk"a9lI4WH9Oh gVǧJhVFSZ.f8W/7lb>JX6̢vny#1Gt ,Jj"v'8?=/Fu0QRp>Υͫ-9 [zԠp7kӻ)7/9 |^c^U)M0EMj'KMNiGpsb[ v?Q=;^UܶaZгS,E4w#ro-ˎ^]m&^<^ H.Y*Um+YCwPűIλpynkIrGw\yPPJES ^olV%ENe(ȉ#FZ6xTդ^6+ca"1Zy/苕<'cUZ^Z>* A}^M+1M_X}c2*j@T⾣3훃FSdGi[w+^F/SwF&68Zv-zz宥hHƥ{Mn7QW|lWCwxyQ@CJ = Z㿿ySnۃ 1mN[φ)D -Emմwg &$iA5o˿^}v5OXRt!!$WϯLzҤҼƶ5T3~qWϳg34Ԟ<:(:{ty=k!y,v7*p{OCY(^-i`?R7GePHEpzvWxrBtih"B htoUB$tk oc*G*IQ"ƍ#Ho龡j.mvJx~g`U8"hud \)*Bq7ɲ[@Ѡipk?noKYZ*Ā|=_fs8l&:\SLEI{|wUVDOzby "(S_0>} Tp*xUMzi+tEϲ= H#OgB.R?wZ3x:4E_G~I?\d='B<%8/eқpx^/Zu0y.@RLޓOnҶKXqeLH/)y,Q9tp?7ȺˊQ1Ij|i!/j7~OǼzݥ\ =$0֙>T`n$or.X[Vv6НGZ3f%bdz5vU)ש JY]Aqp,MWhuqO[Ciҫi&܏c[11~ڛcqnJ_%#D2pE;+4ZSKdf!Wˤ쪰%؝Sj-u[0ٵL'uX,ɯ oxgHcvK h<DZPC0:[A ݸI`qOt>9@ ʭ$QGˇI5}=(yO]@*|]k24 FBf} l?tsͷOj\G3QYdc(5 .~y˜oqnFEZL9Ԣf<@BpjrrAk ![ј ]K+3e8j0w7> E N;jwN+U CL`KE v[CnC\YȟWql'彖ߕv{m<{CIPڜAn>,j-yό-yk W[[sYZͽ]#EJ5|uٽ7 r?sN,y2x єTN-B }:~[M8I/h|,M 8_G:Ny=y~QꍫOۻ{~)7dzV*ݭU⩪zC? "ۛnKLMjJ(!KV<: o|{mmoz%0#&Y(iZT~s~팵M>I(R++\c(㦭9**켰䨼Z"uR`Hv=#@?"5oG)l~2je>E p=eݕ2b{ _mC7 .'yn80uQIA4 o_b]vK,(J 0Xa(@|i6rّQ5+pz&݁z=qy :36C'wzEOR,TΣ[El*F4nv!#I)ȟG'ӆ=zwc[mѽ>-q0^S_Sa%vuQ4 wD~V` 1'- 2M=Գ[1S~^]DnwW}$Xt52xub== BSVWS%5UUI t z _sn}u]vѯJU>K FN)3 GM-8o-~,M9xwjZWFzS%<P'*܂ֳqnM*=Ѵf'Pryn *禌2(T˝_'|`YI&C0ʏ ;M2QXܯͰ9!OL)B}øec A_%]]qNekXOp-׭{@ŏ=?Sm{{)ܷ0)fMz<6;zlHu\bQtM㐑o/now-6 <ө'`{1(RH_\GIa0͒ף=<"Zarmf$O!QRG[;{ӵj`ߤ 忨?}YM>\::Dը#)Iiap~9-N4**5UOiXi$Tr@'EjϢ{E*&8T [,8ۭʒ"܀iu= v^,Oa!Ց+\# ?  `W R 谷ؾڝhxuu&݆&*E"kAPnRWOyGs ]9 A(YDIϩ}-oϰx.( z~/g gOCʭ,M3ʯ5m@XCq~]f @`"k{G*\1$(+\W 5CVu;-rOOK]58?[ ʠϷYRQN- 'Ϋ܋ɛ%Y kǥv` y+O^"==3+qeD$Fe5GҸ/cao: &oY:Iz:"EEca"_DzvxJ+>JHfp¤LL4x DHoܲ?ɽ]†6-3nDk;!j$F6RU1F$S>¼sZu%5Nr^dZLETxRI 3 ")3UI4EE`H='WQutf/.ߊW,Qy6Jd*xu2ZZx"DRm YZ~z2jjA}:n{JmH9}|.UӋ>>\TE4T":撦VP /Wɲõn$m{5\EtyKc(B>U垓{JZ ey,4%<0T`.7}6@Y=)O?D6#ԚIR>_w vc# 6$zꖪ2z*_c.eo_˛ovP"J;A"GE+z2Km )UV? ־gZ2L~qs&C/oE5~5E3[K~iHuVvY~k:r&խlEݯTf6]cc*PnWެ^'.w3]vi= gBVomQRĆ!M$tc6@QJ/+4n50]ֻf<-5$FdP.n Ouȸ֢_ЃI9_S%\/SG{Qmw.Ehzj-IHeu4 ׬; UUIo ǙHgr:[$8ĊzXV],F?E|xŠםoSuIMJZ=/㼯潫dςR댒<s xzV;5}OSo'+͋7_!GlTCK (h.![ik~? D<8Wcӡ0@@1ׄjXoFōBϥpl/DDnxAʤ:fZ9Xr/rCbUo7=(fF(}$9dzո V3t|=G(vOqSF-E:f :]a7% =vnU@xqtDSz0 6IQǕȤ,.;pnC-or[m5=2OOgZUd.]zuf0=dZڪ$+`b.)vjN=GDrg[{`B!ǭf?Wv:N_d4ɩށS!SMw, Lϧ= {BgQSO| vhk9VSH#F >{7=$L^]Bv^JdR6|άkvfݤ% Tvǀ$IťxQZy=}ݑ՗g:3vN3wy)I5 #2ֵ =o RHu3m\e}Z icz^[ٽqM*lJLtȫ1J/lnJdԃ{$J>V  gXw %aU8" %|oB)1xxqf_x%fZFTu;*#WˉRɽ˽\G,Tք(㞭w{Lߡ*6V OX uE}7%=vGllS4Z cFonjٰ[[bu#SP8 tEX2m1Vb+Tp*ιve^ktEk7 ;#[0 B y%W!VOjvwޮ--HEH&0:r0o[{-e33* SSVeWS 9 J fc&E$l6]Hˉצ+Se7Oe߷CkPI'5LMmBln3HjEMk@|@|QכiS,GਣG%jy:O20sg?NaXG՚9[c2lFӺـcg"Բ0N pw=Q#qb(h7/m-ջ0*Z|ܸj“{Kkb4НUZiD<7)ߧ2Rh$eWOmzl{/+JtڼNajbF r =13J*Fos䥩24#J"'sle$JQ@B:z-7Ev>}VGdE >e8l6 q1̰n*9aCSWg@43[ԶvKby}_X.Te̓ў|87Bw);6eh㧎O[3k}=n\uOLwD "9ji)!]3_UO^Ic{?Lۭ ' )moD@{Cƭ J? ^6D]2zMi]K7$on>OeXɅ2kБNIb=H.{i^?Ӻ X#5*2XpE<?{u!5˧Ddq4!@ Eo{=jӨҝiVɀ +Ƽ_W퇲+zISA#h颫 f q~YHK51ct[49'פ&cH?yPSNKHLX, ٵ ׷_>d&\O{SSM>T?_Ӧ:nˋ'G+'$cZ:^K=g+uo*&?՞j*l3DC4z.l9,I{%vT:Pӛ _><x- qZᑪz8l/xNy>HgtI-UC$? qoO{*e UA}i7 TJ̮Q(Fn wb",s$jJ̚#Kݸ nmsGe|Th ?}3+pmjϔQ25^VxMK굈<o[Z*I`+THqE6q&) 7W+q'c +% 6wڹcrLjZ9OAyoQI,! >q=riݴΫ\fzfe._+.>n7#}(C^ϸOfFkՍfg^I_>?vmeJ_a 9 T|mYE#UQI !roHo.l>=pjH$dոӅ8En6;Q7ׄM12csF i>^-5c(1 bGyi6Ͳb@:}.U7YexD']5SP+$5YަqtV`X5|rHkCzѼ|.dI u2>% 7받⾽gfwv:iigJ4TԱ+(1O"D+ȫp]Ml@:x 2az+͹ǬwA>PNJ 8|Ul 3Vff*7h40KPc?^=~JM)~u?X∰!ġ3OEۿ!&WFI&G6nH{ ;-M}=)Ղm1SQt(BAp9>n {irG6BM\T !56-D7;3)$SZ:cz{8RUJ?N,m~xo}ٔQDCiUvmC>æLiӣKih*A2~>rwonQVz!G1[-pߎ/{uk Ђ,=-6ȮbŁ&iezqlˡ+Hۅ?~p9d6'O$a`-$~H@:&4IL?Q$#ß=Yp3S aN$rti Bmnoc+rz.+Z%>/~{?=׃iW!!E6S}+@I @;̭9b\_42R:y4MC~]lϖx#Tƞ\}>Ii'6Hz9q 4:('"c@ l! 6:Gq"Ih^r $OeYM 5í1b<R4?~ (աpk>l]K_ Fk ԷylkUOF\%ۻZ_m+OFsl}ټY\n3#T XD4 E4n^$ YPJ{޹cqFR1:4I &x@ r>-rrlh}עmd5"o۞.f֢gdদJ\PG<tl=΢ő\ähKN/KN)WE$1iUAv{IOS;TK1_ulZ;}dzҷwc$SSVl*hڣO[qO?LkGx喝sЏq޶ ٬.j_^ffo.FJJiYl~ ={7\lP3^KZYm'qm<&ͼ5D9FJ]%8h#H{i 7/G[aVv!I?RﭽŏQo]3iVWmjXhfXX-Iu0Ρt>\sl۴]\͍̮#2DH1 (۵JM +Ud8ң==7KUwa9pO 6*!ȘAM2_m:r;csBM+}:wmIVKA{k?j7 8:p+w//?n9|Ѩ͚3EIK 5ԟ-pR)s7"P?`%CWP6V//WRJ(#cr?ē?vd;zYFK,o.#ЪTN4;q"#G-$zx?KW5˃),::O^GUꧠGHc-Y %C鱰OmMb (tCHSkָa}Po,c*`uli`%GPȗ,GO ]tVgj0 < O:1Y,Cfu>vX#\gkIOB&"c6g.B=P}@-DCk2Y0AmJŒiZ@ Ii׋n) weͥr۶Ѧ@  |4r;qcZhd]LTuH.x\nNZC}/P*$01F3 # urE#_<OeS*^mf|ѣzaht؋kqIh+?>VǡT.,U1unmO>K:q2i+ F`IJKqO{ ki#EL R)bԒkd-r{^( YxW&mD.MAÒ}-Oaޛj7U[M_7_٤pEFz, L]$o_OW">~ֆuYH@ـ(q K6SUX+?>Xd`MG<κ#* R8k,RusĚ ԙpV[؀&BN(*<&;eifPT?EX}) X:dGN:HX,,+X|̩j@e :l8Ϙo$7GQ:E3@ɦ: rبA'M*mȷ6.R37pz.=*X uʑK,-qaՊXtU:ɇ޹ >NedUqFVy7S'F^%'ozN3)#}p}y:kq_|ҷ5Px|i&-a+B:컸12EN|ۛ/n^G]mf:8 ƖA"ߟr>[m, ><:O5m'-O.5oAO~Hmo_48N:JM+kRn*=&gZnݹ:mIFsbkgwNtF6ܢ;D$`RD Jic68HS.p+s&eKp'3n|NtxHbN*/QR=MKx)`O1Ϻmu(hPp7IVfaD`1jf8czƹ*\lp ZO:N.8yU>Ŗ&/[)jUZ\6?Y,l_J^II ׸L~ߠQ/i294s+zNcaV7qQOAJAnh9hi,`JaN4b}*5Dֽ'殸>n~B 2QSQ~:I CXp˷L=W'u5]u3)g&R. <{4F%ICMCo7~}=B&61q,YBH;Z`2ъV/OTE!Y,@G JaޤcmtWA0Z-a&s_}>M<^QGxN|/OoMh=d5 c7D~TPGC[; j:`tP nw4a?oRvͻ.Rtvq͒;xg'>H+T^:ZM9_k6~bDA7c{zY+KG"H@CsI-#HhMG@vc)_ OW"xl^刭kt,ju}~U5̨;GD2+;p)2VUR}BI5M亻F3}sof`ZvįXS*FXxr}Zs/ 颁Ro[mFֱ|2_͙Uz־Tf $9fuwzmZ6t‚Ϡsr&6[r+N_tdyLerM^iMSsv= #i6ݮ7 K,kN %P]`C:j$ k"@s'I'f\t9%nS79:MD 5D f%Bm/ދ Z,p5 h4uVxCϻ4]}eB8tu/ ;tnOUk3ȧ%|d9ɏSG-KJ=}~`nX9;ؐSGg^DuUSXzV̆jx\vrd ZTM&z%ܖTod\{wؐ>E RI>p҂x6+ |z:bfK7Ԛ:Z o_VKZ-o卺RBG3QCR`1X³_k{ϺiPkr2A3xk7)$J'נ#1u*l2Cif,UN%ůmM۬0Onh#Jfi ?-Ž{2mSl]јÅm$dr!imSjtrthy%m,ZHTnM|3^!No}g"UıȚZu'mv]]'jz}.^x=]J-GI9/n7aa: 9bp#f.@߶9Q4xF bȴQG-I$$y'$o6\}?Յz2uu&@+A}%IlC9Sw|=e>ɤh?MCEOs6"j>ބcz'׭+Te.cQ7\+xr>= cRTM:RmS4GBG yT[M`jo6>5ˣ.0g:0x\.Hұ San,-<{{ r,̃hFb4'oZ[ jzԷoä-vRzffW[?[adϢ ^.#Faʒ=?IY$f+ǤfsCs%'M[V qzKT$[ovZ2dȭGO~X|zyӧ]++C7!CUJdGm=SSЧxڧFشŰ` 6ԋ{m<z#*;0 &[jUڬ}MTzv)/* MX!_Ԇo{ϱ|+ڞaklHC6J8$irI`>M>Sj l՞(HwkV@?ֽ&׷ us쀹z wfIKa->WqM p7K&KH >vTg'FN۱ ISQR.Ik\{En4wpӗӏp㊇$u*Y$ Iz"3͡7NyЈFnj4Mx3I4rPGf( @_ܧa˶s,rqYϛUĀT'}S6ߖlRZŭw{mmIe3ZWz,-Ǫ-9+%MN.{^a=H$me5?.}YJ1.?oUuS7\K3ѽ[S 7^]ŗ y~NH+ ?\z9U2cf$eWn~~+;m>y Կ#G[iڊ@?[ /պQ::@5`?:timȤ~}@#M_ly!zӭ_oa$~wf!7zyLW}?#_3˪CiSNayw&֦X+mBH<8?d2 :Kd|䪕Io{?G_q-sզ Ԏi">HS-05n=N&2z 2y7_\X')?ݮ+&Opgj\t \LIQkܷؕkf WSA҆tװŹr߰4ѵ3/~t_{~>5|}b*͞9Hj&LˁOԡ=8 L~8[K\p-Voz;PnI5 :Id4TmEEmWISvdA0)>֦Pj ~m\xfm:5ha ; "[qp1n?=ƞ#_}1<5lt|֥Ts, ȳXi-n"[F+^7ս?j >7'_$l ƕ<:@ QFSk:䏡#s`F5?-VKtܙkC(܁}?=纷ˣY91 |OS-f.JJV+$l7=ZpeKNZ7lqJTtn %Jy&v!=o^O)yO5A]}ܷܮINMIUOIZ|܆ܐno?OϽ[0z-:W?UzIH~[5ˬ]2z E6p&uTD_m[BU4zԧ}V獗tݷn\bmK&y {cocxǨ24GSh3<*P8}m_SlBTd'C?,DՅt}pRɊXWTcD~OUP9y }@>^y0l?0nWG,]apO#w<ۛ%M+Rtj[ 2QJ~}Y^1rfW} O|@?!jub%+kɖ}GTD7Xij]Y4CO/dVjޑ]s6S TQO%zbcoWIc;FJhx|c- !RTXSSks>yZnZ7*zjKI+pѩF]o{q&UF[j(é]a7fBKp~],FͿV6csZB{{J>])&PkZ}Osb#5Ӏ't$`7p-{&ۘSy!jyŸ nl~Ŷ\dZ1CT֕53F7ӪSؖߖ- WLCn|@)Ѓ U27ѿDG4f:[#L=?iM_US{cl.?˫iCaJ8g[,xbߟ}-aNy~ `.4@4M@ .;`ji{'xPE׭jC% G}zE6E2TwDs$^#HV6 ^[}}$N\˩[JYRedbFcJ{[JbzFs,YorO77ڷDV?/^KZ?vɱ&=>-^:[^#nBϖ2HK}{S?b~ރ, d2sڸg.Qy| ]BPH*R-'֝-|v 44P뺓ck[}?{ w_KHJ>=>}"n{mzP%E K6)7}kJV{L"Op'z&,.kUE:LvSxfvoie0;rQJ945qLe'QSX[z1M?=Hym[m6[iz9wxKl+aj -No) kcZ( AM_~}:pM2c˃n(Sl1Wӡ$n^ӧܹ]w)>҂M M-uU{a L2hMCÓmѹEE-j t񉠧aPTmMO€aGJZGex}HX'*=1g]A{ \_ڴmM8EZcO#]O0!G'ЦϠI@'5 \?Yo`jr3(9~> ٘>!}xkAd]+@r?{4ҫdWˡ4U}EO n}[%iO"'@$נr ܡ1(|U=95MspeEӧď׹#ji SDOe$wԖ{}nG? ?~͌kCt;z0-scvBmb=KheEiќb:Vlm}W-# AGws}G =n:Ή=p E[xay *Z=͟&I:q`H_o6>R99f2 NNxH n}#Js^_x`s uM&:-P'L5ۓ%]5KIp\ |Ϣ]ߙx9G].珠 ^]%Ψ݊d09^F6U|: I;rH'{x?Om]H$G\= XW%+ ?b&ܾ%j͠F§a**>}'w[,x7ܡ,W c;(U'~βd?/[/z-ҷ?{3:Mһ $[_?{vOt PY}~MND?ah>⿗FjuI7m˧zOٞˋks>{-Ӟ^kگng=O?p?GHse v ~x|?7vO;gxݿ-trڟB_=X*}'/m9cK;W2YraۿhT/3g?'ߟ'?攟LbCzW)}?oJbס?D^I_OcCz$_?K{CgL[Uc' ?$u=A?ϥGu}=z'g?'GGP= T}1)U=gOWe('I?'ܙKtd:.6h1):NtdǡhO#{#~ /з(L{~]pillow-2.3.0/Tests/images/pil184.pcx0000644000175000001440000001236412257506326016017 0ustar dokousers **8?????8|??????????????????????????9??8??x???????????~?|?p???????????????????~?8??<??|??????????????À???Á???????<>?90|?8??8???p????p???p??~~?p??~`|??`x??a??????a??A8???><80~?? ?????Ã?pillow-2.3.0/Tests/images/12in16bit.tif0000644000175000001440000004746212257510072016405 0ustar dokousersII*(N                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              dd  N O(O"O*O()12in16bit2.tifH>@@HHpillow-2.3.0/Tests/images/broken.png0000644000175000001440000000012012257506326016233 0ustar dokousersPNG  /}P̒>0jȂ&✉\@TLU x/ Z`w;9cpillow-2.3.0/Tests/images/rgb.jpg0000644000175000001440000004740612257506326015543 0ustar dokousersJFIF,,ExifMM*bj(1r2i-'-'Adobe Photoshop CS4 Windows2009:03:06 16:01:22dd&(.|HHJFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I$[ߩsyҮw+\_Jq?XI$RI$I$$I)I$Jj`_0wE`$,cS/V&C^-sA% %&<1$v9cD !JRRI$i)$IJI$RI$I%?l'm˫>>\OT7%"ˇߏ'~QEN[w;P>eA᠇ *PwmC`c<H}~d2cOn9;xW[mgRO&?VkuhLi=i[۪uN$$r>hqvS.~1er]-k m"Gcbc4?xD|t}p]w>lXcLC0ppICUx{cȖJ[scGGߓ(rFF<|9͊nqHWG5qk9 άTըˊ Yrc(_JI$'\OT7%:mu6րKLxB[&LDG$$v[k}M-#p?/v1Yv\uok6Ag6Yrj'Dz9y6ܿ,n|L~Hgs[94-f-K45oQk}fZ@=}ȿvC$%B㾽Z33SǛ#1Էܷ7~C1\w?Z}Fꊆ.u¶.t8'9 UًnO7~ pnʹ IVLpɆK|{k+kIV3##{4hcI";6KLO&|gU2hohRIYNr9ɔII$$IJI$RI$I%)$IJI$SI$$IJI$RI$I%)$IJI$SRI%Ie$TRI)Ie$TRI)Ie$TRI) FPhotoshop 3.08BIM%8BIM,,8BIM&?8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMMdd RedTest_CMYKddnullboundsObjcRct1Top longLeftlongBtomlongdRghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongdRghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM dd,u0|JFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I$[ߩsyҮw+\_Jq?XI$RI$I$$I)I$Jj`_0wE`$,cS/V&C^-sA% %&<1$v9cD !JRRI$i)$IJI$RI$I%?l'm˫>>\OT7%"ˇߏ'~QEN[w;P>eA᠇ *PwmC`c<H}~d2cOn9;xW[mgRO&?VkuhLi=i[۪uN$$r>hqvS.~1er]-k m"Gcbc4?xD|t}p]w>lXcLC0ppICUx{cȖJ[scGGߓ(rFF<|9͊nqHWG5qk9 άTըˊ Yrc(_JI$'\OT7%:mu6րKLxB[&LDG$$v[k}M-#p?/v1Yv\uok6Ag6Yrj'Dz9y6ܿ,n|L~Hgs[94-f-K45oQk}fZ@=}ȿvC$%B㾽Z33SǛ#1Էܷ7~C1\w?Z}Fꊆ.u¶.t8'9 UًnO7~ pnʹ IVLpɆK|{k+kIV3##{4hcI";6KLO&|gU2hohRIYNr9ɔII$$IJI$RI$I%)$IJI$SI$$IJI$RI$I%)$IJI$SRI%Ie$TRI)Ie$TRI)Ie$TRI)8BIM!UAdobe PhotoshopAdobe Photoshop CS48BIMhttp://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@dd      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?Nn-]}q܏s=u?ֿߺTݣ? ?Y|*,Ҿ_(xH?}r޿sxC}{p/k_ߺ]s9SϿu.H{$q^b?[o^믯7ZN}uOw??N>Oq{Юn?_O>2?O=u'o/׺׸~,X>RW_oVS_$o_r? ?}?u?~?^׺9׵uo>׺<~xl>o~yߺ]\uc_ѧ?g7{m|soxwF/o[i/zw]Aџ?F/o[ k{CpF/o[zk{뺫P7bn_wnL64?qAUj#/5s;{\wۥݴ^?yD&[L #m׏gFzIs?{'ߺ]'}u^_ߛ_׸^׺>׺Aoͭ׺@?}x^Ӌ_{'ůO~t@o6ߺ^~8׺7a6K{^BEum^xy#ߺ^~9ks\-[^}{ [0R[$U$Ȭ>ڹ3'*sWhкAeGSG>/oug ŕ3*,V򣣆VVVXkղJ͍Kvgxݚ<- M@&6jb,#c>`-v{ oVSHH&SLq_E{10{;rxmXI1mSB:DND EH R5}}]ӵiTL=MbÈxjz`T+Aq2s#Y\BTR&(”d*Sb{/l,9Gl}Vu#$.4+,T%e5Ƿ05;jW6xYX#x2/!Q*,y]MnP8y+_ſr5h}Z27XdS(ˉp×9f彵'8g:2Hok UåtI:&ٛ{)8YZK6s3Iqd׈Bu J&e=?%{-s U׸FdU ŖդD2R#LьfO]bTQqu45ԳiRLe-H$\{{nຶ=XpeaPGȃ^U{ǹ;.g%i</1I#px2:aAB9۽ ^k{n.o^R(r776ʫ/tă'-V[hv썉kv "fSci QBSصromlfX5ӫ\oF5WN~]7[cǷΗFҬb퉍Y X (ֽ 4IrOoAf8h)=aܥLUT% Y=FEmZOf?im,k;Zp0$B]+RbYO{v|m ´Y`16LZ.|LL&RSI)#EfWWv}6^Gڣ}KoȚO*yVpBv'Aus|f5c0NHE!5*rOVѽ6ٝ7L3<)W$T^QL!B[ l;Yo#Jokz=l}{=uH+H 7pTա j8Nӽ+kgM~V&_Y46rU0$eOCO|.qm=#j@K ڭG\<}=r{a{юUD\\ɢ2#J+V7R@ʻ$oO9={ԛ+tzOַg7v{1CU{?}?S!`>"fkrFzxɗP;1AM%qTeET%; ^pi#Z?汩5u;̗! 6wzVMu1`}i?]w.bjTar** Z9]@&QB}\s;p1<9 ~Z=^xǷlzqmXK+U4p4OYd +7v>}kG :n>Oߺ_?7>P v[YX6<.37[ToW՗e~g۫\ѕ}g8VK [+!Ss ۃ`VI$Rb>/Mv+k:NUe}}㘽>rك6x޶QKxSN e&Qa;pGSG9%vSm%tuG* 4Z9.T.70aY},2h[.+CQH5}>nV$` mJm[*WD *Cqi&Fl[g?HyL^zrRgHt`xer~L[ OzT0 G3w+?7mrZs.̶0g]å$E+$R%RX] VOLgsuGdqŎhith!FuPmk潞qGe @0:)3ܾSݢ[eAZD%m%EV8F4胷cV~ ۘڊY7>GY*WCCWWD&uUQ_rJ;yrѮw UTG#QAU0 hbA>_xytx/-Oضk"\΍$[I3.~j(@m@/˸vn@{ soEvĴ?G>bo>&A!xVf=ɆK) s{ҵkTDaGBŁu5}>}=%6('(^]ڢ\FPH J:V۽5״؉r1ATWsu)c&be@ 0ﻮQZ]N"rUFA|٘T`ph}_GQl0͵%KX[JZGoo E9SbpU.)5L^>,}HF-˻fhGK=@f!O I=0VKX#K{Up0$x2Pd.A5A-k{ ?[{muJmk6Nu&> RttXi2EIWEPƝ&V(-6wjH4!PM*eeJ37myhۭ.m.aexX̋ HB=;VU#U|cnrj gzj)]4IQM*GP.p@[?v[}0>>D0AB =eW(r;)Z m&M.3r xKUAúwREv2PW%mE=`fIHCКD\['7%E*2*K+)RsBH+s^r ͤuI$tG.T0T {.ݻkn-92|n~4ԙSM)ZErͷg7]wy#Q׸6?9~xmp}}uOV׺7rlׯE~xk}?O~]{~O_ߺ^ן&_׏>O{^?_{}/oʼn?{^[a~??}u/ߺ]Aߺ^7oa{^?׋ߺ]~>yߟ~xc?׺A-@nG޺]Ͽub?>׺^sEKy~ws,?Â?{^oo97ׇs'6^O9|l?#ߺ\} <Ͽu_x~[^_~_ߺ^',s׺??uo7?ak_<^_ŭu??~x_ſߺ^o>׺Ïߺ]oy_~N. ׿ߺ^>ֺ<~?P=>?ޯ׺oƽץtwq{{~~׏zuؿϿuo{׺^?unku[ZZߛ{Z?u6[_{[_K_?{{^ŭkׯWmpillow-2.3.0/Tests/images/pil136.tiff0000644000175000001440000002266612257506326016160 0ustar dokousersMM*$wwwww>>! FJ+>>"w G@i^nB/8=DSUC54<80YmgC38AEK?LPC3 Uor1:=DSUE@A@BB<,'5:Onn[3<=8<=J[]OMHGC:,5:Voy`B4Sdd5XtmaCw 7 7 7 7 7 7 7 7 7 7 7}tzprx]a5w===========& ")$   $$"  ",) "  $$"" "$"*SpsW1 %,)$  wCCCCCCCCCCC@JenSenmue,^kfLwHHHHHHHHHHHHo>kxwOOOOOOOOOOOO=wUUUUUUUUUUUUQwZZZZZZZZZZZZZw````````````` 6w"dddddddddddddQw#iiiiiiiiiiiiiew&nnnnnnnnnnnnnnw'qqqqqqqqqqqqqq .w(uuuuuuuuuuuuuuCw(yyyyyyyyyyyyyyVw*||||||||||||||hw +}}}}}}}}}}}}}}vw , w -!!!!!!!!!!!!!!!w .!!!!!!!!!!!!!!!w .!!!!!!!!!!!!!!!w ."""""""""""""""orp^r_|l[QJ>9gy~ehXppyAOlzw /""""""""""""""" w G ( ( ( ( ( ( ( ( ( ( ( ( ( ( (wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7 7+%$%%(R ' 'pillow-2.3.0/Tests/images/zero_bb.png0000644000175000001440000000523512257506326016411 0ustar dokousersPNG  IHDR`+T PLTEy IIDATx^n:`b <`No? N2meKZH/8-pLg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әdU bUuuݘJee]'7dT[3ٔTۢ{7Q^t3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:ә>nma._FM.SrcҨZjL7`UEX̛әˣ1J4U2biE@3>bP%~,s3 ,Od]4o=3D\.VfBtQ P[wczٱ-X\bY^zIڕ f?t9+Kl,PMk8M,k//gHsEFy᪦,reYG9d"P(ӅLsf0]b$P@K,3q#YYvEh0 wt:3\&N8(: #}ƴqYt:fn~mՓ8cQ*2>$D>!Nd9%qxd MvQ<= NƄ,L5 ȖQ9ͭ"=h;ȚJq3Y@?@%3|  6g3̼/d,&6 y2&J?|T;~.|qD{yX?X1$1LK'w0ssD;ɠA1h2&rvr3h9m(DS1uiAEϙJē0mŚd *OjSg|imf9cfaRЗ VO ;by UD;b8)(fy(w0SP/|.pG#@>_+̒z UQw0dC &V}i~ѦnjG\PwH@վTD0{!΄IePs$Ėiwe9I,q͊ 殌a*EUD)-Y AF3V`C%|Ow>c3?x&1eX 5̴b:N s<O{NE>%L$g:;+̱th`B Iaf@PWΟ|< bFyRMJeUwX*d\m*隿7X):I*BQ&CHIHDXDc2̪\V21+D0eeRs1})ʢ R'fH"bULYyeWb+^If]D\E-ڕJx%S&1@O)7s!&LqɊ _o(d6ELP_m(DZfu2_CaJ}~sX1E{1?s=赆bKѨ,`Z|G IBM5o%)˧7m5{Cq3't3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әt3Lg:әt3LgxIENDB`pillow-2.3.0/Tests/images/lab-red.tif0000644000175000001440000005747412257506326016307 0ustar dokousersII*  ] , (122^;FI@!<i_ ' 'Adobe Photoshop CS3 Macintosh2013:10:15 21:27:04 image/tiff Adobe Photoshop CS3 Macintosh 2013-10-15T21:26:12-07:00 2013-10-15T21:27:04-07:00 2013-10-15T21:27:04-07:00 uuid:0491B9B57237E311B432EB92488C2511 uuid:0B91B9B57237E311B432EB92488C2511 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;9EA219AC1E4EE504A7F256C95FD8F46D 10 10 8 8 8 1 8 3 1 10 10 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;76E873547D6C5EEF6EF8C950264DC120 9 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMI Untitled-1 nullboundsObjcRct1Top longLeftlongBtomlong Rghtlong slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong Rghtlong urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM E @)JFIFHH Adobe_CMAdobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I$8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong>nFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong>nLCntlong8BIMRoll8BIMmfridddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd  pillow-2.3.0/Tests/images/lena.tif0000644000175000001440000014047612257506326015713 0ustar dokousersII*wvvrߝmޜlklޚimy}zxܔlyWaKcSfShUiUjTkUkRjQnRqTwW{[~]^ɀ`Ѕh΂he}c}`b͂cτeЅeτdφcшeχa˃]˃]̆b͉fʈfˆeʅdɂbȁaɀ`_̃c˂bʁãc̅e·g͆f̅e΅d̈́cɃaɃaʆaʆaȄaǃ`ɇeŃcb}d|fxdn_fUt^ʂiڒy|yޘtޙpݙlܘkܘiܘgܘgܘgۗfۗfۗfۙiߟo۝lәg߬wʔؤԟԣǘjh=sNafKԌvlV{g|d{b~bÁaĀ]|VxPzU~[~]˄fkUub襔ߜuurߟqޜlݛkߛjlkny|yvْhvT\F_OeRiVkWjTiSgNiPmQpSvVzZ}\~]_τg΂h̀fˀcb́b͂c΃cτd΄aυb҈eІâ]̂]χădˇdˆĕd˄d˂aʁaɀ_́bʁ`ˀa˂ä́dφe΅ë́c΅d̃b˂aɃaʄ`ʆaȄaǃ`ɄcƁ`~a|b{ewcm\fUoY}e׏v|{vޙpݘnޚmޚkݙhݙhݙhܘgܘgܘgۙiݝmڜkԚhܧsҞעϞޯe:pKrSx]w_t^zdzcz_|`~_~\{UxRwQʁ`{[z`t_ÀoΌ|dVrrpߜoݛkܚjޚiimoxzvs׎eqNXB[LcQiWlXkUhRfMhOlPoRuUyY|[|\}^͂e͂e͂e͂c͂c΃dςdσc΂b́_σaӇcхá]΃\чb̈́ăb͇eφc΅d΄áaˁ^́aˁ^_̂_΃cυbτd΃cτd͂b̂_˂_̃`ʄ`Ƀ_ǁ]Ƀaŀ_~a|bzdvbnZhTiSv^Јoޗy|xߚsޙoomߛjߛjޚiޚiޚiݙhܘiܚjښj՛i֡m{ǓؤѠŗ~SiDpNdmT{byax^x]z]|[}[zWyV˂a|\w]ˉqÂp_PGe5Ch8Hg8Jb3E\-?\-?`1Croorphܕ_۔^hklkomӆZmIV?XJ^NeUeSbNdPjRgPkQoTuWxZz[{\{Z|Y}X}[~\\Ѐ]π_π_~\_ˀ`́a˂b̃c˄d̅i̅q̇wƅsƉvΕМե䶞Фݱ繡鹢鷠ުƏzu]ez^d|`̉nɂf΁ex[~de}d}ezbw`t^q]n[mZs`ȀhӋrאrؒpٔmݘoݘnޙoߚpߛnߛnޙoޙopߘnޕjܑgڐcُb؎_׏_ΊY֖fΔd뷇ҡգƜtUzfziVKa,([')f3:`.9g7Ef5Hg6Ii8Ke4G_,=_,=c0Awqptm۔`ԍWՎXglnmplԇYnJW@WI[KbRdRbNdPiQgPkQoTuWy[{\{\{Z{Y}X}[]с^с^Ё`́_|\ɀ_˂bʃcʃcʅf͈i͊oӐђˍ~ɐ͚̝ΤڴٳְҩϦ٬淣զo~dmRƆkƀf҆lx]d~d|ezcxcu_r]q]lYkXr_ȀhӋrאrؒpٔmܗpܗnݘnݘnݙlܘkۖlۖlݖlܕkݒhېfێbڍaڍ_׍^ωXҐ^SաoҠޫܪܱݫn\Pn<5OU$(e6@^0=g8Ja2Fa0Eh5Hf3D`+;^)9c-;rrtsޗc˄PɀK҉RfmqoqlՈZqJT=SEWG`PdRcOaMbKfOjPmRsUwYyZz[zYzX{Y}[~\Ѐ_Ѐ_`̀`͂c΅e͈iʈhDžeńfdžhȈmˌ{̑ȎƑɚØɦղϯϬӯ׮ٮޱ㶡êݯȖ{}bw[v[~e΁g{czbxdvbuas^q^p\jWiVp]ȀhӋrאrؒpٔmۖoۖmۖlۖlڕkٔjؓiגhړiْhېfڏeێbیaڌ^ٌ^Ս]ΌZNjYő_庇ۦڥteh6-d40Y+-T'.a3@c7Hf9M^/C\+@e2Ei4Fd.>b)8e-:jovqӋ[tBvCφQflnoolՉXrKQ:PATF_OfVdQ_K]FeMhNmSpUuWwYxZxYxVzX{Y}[^~`~_}_֋lԍoҍp̉lńhddhyju{ǒПˠǡѭΫɩήڸܹش۵侧޺ʰ鿦߰{aoUjR|dzcybwbvat_q\n\o[gWhWq[gӌpؑqؒpٓoۖoۖoۖoڕlۓkؓiؑgאd؏bُbڏe܎g܎g܍fًd׌bܓfэ\ٛhUȔdȗ֦ܷǢql_/-V(*W(.f8BqCP`4Ekh/>xutܓfrG[0l?؎]jmkfhi֊VpGM7RCWI\M`QdRfShSgRiRmUqWtZuYuYtU}ZzU}Z\zYvX׈jmSu\|de|dzd~gn}nÅv‡yruɖΠȞʢЭضȩ¥۾ҷӹֺĬʱ෡”}wbnY{ezfu`o[kW{h^I}ijZjXpZfՎnڔrڔpەqےqܓr؏nےqtڒj҉^֎\ۏ[ݐ\ݎcۍgيl؈m؋mُl̃ZoюZۙg͊_|ɧۥe3U.kCُblmjdgg֊VoFI3PCXI_PbReRcRdQfQhQkToWrXtZuYuWtQxS{XzYxZz\|a}aqZt[v`yb{hkp…rÄsƒrąvŊxǎ{ő|ȖʜٰԯϬٻá׽ѷƤʯѹؼι̷Уs^s_bM{ht`ˀmmY{hRAgYgXnXǀd֐nܗpߗqt؏nِpՊmՊkݒrܔn؏dّ_ܑXޑ[ސbݍjڊoىpٌpڏoݓl֍`ؒaыZؐhڑpֽݙp9>E#]-;g7E]-;m=Kl_/=g7E_/?]-=j7Jd1DW$7X%8vs۔hvNW2Q,nEِclolgghՉWnEG1NAXI`QcSdQbQaNePfOiRlTpVsYuYwYwV|Y{ZxW}_օg|ajNt]sZq[t]zgmÅpÆsȉwoÄs͐}͓čxŽxəԨ֮ɤ޽ַٿ̲Ŧս̵θն߼îíiSp[^Ko\dR_Lwfo^dVcUlWdِorttېpڏpІi}`̈́dבmܔnؑcܓ\ޓ\ߒdݏhیmیn܍nܐnِgאbՑbޛnԓmˉs~B8a,2U%1g7Ee5C^.>e5EZ*:O/e2Cm:K^+:d1@xET_-9W%0VazoʂZd>N+S0qL׎clpmhijԈWlEJ4PCYJ`QcSeRbQcPePfOhQkSoUtZw[y[^~[yXxWaօg}boSr[sZr\t]yc}im„odžrmÂnɋvʐzǎző{Ș{خհղҳĦ׺Ӹʴֽзֽ¬͸Ծǰ\GYEve~lZJl\cUbRlUbۑnqrtwܑt̂goTmQɄeٕrגiܕaݔ]cޑg܎jݍjގkߑkӈ^ܕgܙlݞu۟}Ԙb)\% b17\,8_/=d4Bg7Gb1D^-@j9Lc0Cc0A`-Ej89~MI{ᱧr{XaAU8T9[>qQ֌gpsqmon҅[hHQ=UH[L_PbReRfUhUgRiRkToWrXu[x\y[|[xT{Zӄc~`lOeJjOmVt\xaxbt_t^ye~hhȅkłh}d„kЖ~ӛȔ|əУ⺡زŭЭӳַϲʹҿʶϸԽҺѺ̶ɵxeWFpbhYVJ_R`PiS}_ݏillnv։m}f_LB/WDƅqՔvٕhޔceߑcߎccbdgِgӏj娋o^S"k=?Z/6Z-4tFPj:F]-=],?_.Dd/IX$;Y%;j7F{HQtBEzIDsҡz͆fkMY=ZAY@X=nN׎kqusoppτ\gHO=TG[L`QcSeRdSeRfQhQlUoWrXtZuYuW{[}[~_}^vXnPkPlQr[u]u^v]u^x`}g‚ỉoʇlDŽiƄjˋrϓ{͓}Ȓzʘӥ׭ԫ׳Эӳ®˽ƵȵԾռӼѾeVZLUIeY[OZMfP|^܎hjkmw։mτoeSx4'~>2pcljrؓlݓffc_^`cߌbn֏sӕi3)X((Z/8K!-gHS%0R#3`/Dl;QwB\])@_*>uANMSXUxjə˙~ix\_FV>_I[FS:iLڑnsutprq΃\fIL:RE[LbSdTeRbQaNePgPkToWrXsYsWrTxX~^yZkLgIoQtYrYxau]qZsZw`~fĂlDžmהy͈kȅjѐtӓxʎtĊrŏwÑzಛת̣œ⿫ðμ˾ǻ˻Ѿɴ̶ֿսʺQBxF;aVXMXKeNz\܎gijmy܌q׌wl]q.%i-%^Vzkؑsސihd^^_co؇j@4Wo=FQ%4d9JgNg6KU$:f2I_+Ag2DwDMLNsjբȖ{eԤ~W?V@YF\IVCV>mRԋjssutwr΂^jMK9PCXI_PcSdQ`O^K]HlUiRnVu[sYx\{_tUτexZnPnSmRpWpWv_lTpYʂjʄkv\v^ŃiόoЋlЍpѐtʊokĊr͗ϝȚțѨ⼩ɶɹƷɼƺĶŶʹϺϹͷտҼм~rq?4RIRFdNz[ސimihxݍrˀmaUp1*[ wA?f[Έoro܉a܈\cefll_cc(.U!.j;Oe8Ld8EW,5d6An?O`/B],Aj6Lk8Ih4ALRusȔɕlǖnک~YFWDZI]LWFWAnS֍lsstsvsσalQO]-=c0?d0FkjzÐuՠ~ڦ~Нp\JXI[L]NVEWApT֐lqssqusІcnSR?UHZK`QeUgTfUeRgReNkTlTmSw]z^oSЅhrUdGgJmQkOfMiPoUw]v^rY}cӐuҏuÀfҏrόoɆkÃg…imnlȘը仧įñ⿬޽߿ĶʺͼϽннѽмμɂOK{?7ZHÀc׏ggmjsvԋxkbv:9Y"'Z)/c/1l`zd{ȀZ~Ytꠅ頏SKZp1<^$3g0En8Oe4Ia2B^2?[-:]/SFXI^ObRfSeTeRfQ^GkTlTkQy_w[oR{^kNpSvZuYlSrYqW|b}ew^~eӍsҌsÀeȅjѐtЏscsWz_Œr͛嵟ⵞ߶߻ᾪ࿬ݾټ±Ʒ˼ͽ̻̻ϽʸоͻϷm61cRlOۘnkamtǘqbYt88^)/\-7\+/e*"p^fwXՙuݡ}ňiÇoxmm10Z&b(7s:Mb+@qmOҍfopqorsчdpUM:OBUFZK_OcPbQcPmXbKqZnVlRrXhLpSvXgJlOpVv\lSsZqWy_g̓j˃jʄj˅kɆkcΎsӓxgtY~cբ亢۵شظܽîƵȷʹɸƵǶ˺ϾIJ̹ҿϞnjRDqTؙpݙhݔ_cptЇti`}CBe29^0;V)0T"N=٧Ӳ齢ܱc60V(+`0Z,,uD?tΛytҝ~ءљxљvۣXJVHZN]OVGT>kMЋdopppsqІcnSJ7M@SDZK_ObOaPaNiT`IpYlTqWqWeIَq񧊬eGaDfIhNtZiPqXrXtZ}eчn΄k}dǁgЍrˉo{_rV}a͔yި沚蹟ڮݵຣݻ׷չ˴ȴȶƵŴóĵǸʻȸɸ˺ͻѾدi;,bnjbٗejakޔqӌvndu=>T"+L -L#+`5/ᷧضȸ<N-4V2@a8J[/@oAN^,5j8Ce6J`3H^/?]/9^03h;6h\Сrt͘yנܣڢ՜~ЗyYJXI\P`QYGW>kKΉ`mpqptq̈́amQJ7NAUF]NbReRbQbOdO_HkTfNv\rXjN壘fJoTsXoUeqWv\y_x^{aʀef{bƀf͊oÃhnUlSǎs谗칞ᯖ֨Ҩհܸܽڼ׼ھĬĭî®IJĴŵŵ˼ȸƵʶϹԻ־ƕk]tX^ܝjkjiܒoЉse[e-.M$h^/C_2I`4E\.8d68`W|͟o˘y֡֠~מ٠؜ѕyYIYI^PbS[HX?lKЈ`mnpqsp̓^jMK8QAXI`PeSgSePcNjVfRnWdLw]oRjJήߕxZ?lRmSeKu[dJdJςh̀f{ax]y]}`ŀcāfeIv[ٜ볚ӝҠ巟޴հЬִݿëؼϳ׼׼ٽƵǷŵ²ŴIJŴͷӽ׿ؿǻaHĐiyؒ_qoۓmȅk^Na,&`45سǹ׾׺ټ١?*3Q5D[:K[5D\1;l=C\-5S$8a1Gk[+;[(7m9Em:Ak9<^]đОƓʖ٣Ӟ~Ԟ|ԜyӛxԙyԙyӘzӘzgQcMcQfS`L^DqQێdߙflonuuیeqSKTI\LbLdKcIbIbK^I]IgSjQgIe?Ϥ~oՇa΀\lKiKsWkQqYˁh}d}dzaӎqݘyȆdDžcΌlɈjҒvך}Дzљ~ܦݪ۩֧ԥةݯ߱ޭکްتة߲㶙ݱ۲޶۶ὥ߼׶ֵַַֺж˯ӵῦὥƮҮл­̸տʸϽ׸ܽҼԵK+.S/9X2AZ1C\0AhY3@b9Ki>QM!0_4>a4;}MKwiϘћ̖|ܤנΕwܤٞ|ٞ|؝}؝}؛~ך}֙}֙}]G_I[I[H^J]CnN܏empkqtqliKN@RIZKbOdMaI_FaH^IdNgQhObBoGzgܐ_҅YԆ_pL[=iOjRԉrӈsЈrͅmȂhȃf͋kԒrώpؗ{ԔyҔ{㧏ǏxƎw糝ӟϝᯖ̚٦ݪn친Нџ̚٧٩ѡ渡ة帣޳̡ˢݳ۱ˡʤ⿡ĩǯDzų²̼ʼ˼̻ҽŰθ̷vӪlѫԮԯP,,Q)4h?OV-?S(;c7F[-7jN\-7d36gaɘ̖~ϘzӜ~֟נ՞қ|Йzԝ~ԝ~Ӝ}қ|Ӛ|қ|Ӛ|қ|`JdN^L\I`LdJsSێdmpkrusnkOK?NIVL^OaL_G^GbKfQaKcL_BY7ԓi|hbboӈ`nL}`σl͂ḿnɀm̄nыrԎt̉lÀc͊o塊ƃpڛӕǍZQxr`]gfij`cʙ˚^aƔاѣᴱÖV+"ʠsỦҮỤɱĩ¦ĭDzɵɵƵнϼdzཀྵ̷кԧė_JkUoȺХBe:Cb6GL1d5Ii9GT#)vDCwў̖|Й{ԝננ՞њ{Ϙyԝ~ҝ}қ|ќ|њ{Л{қ|ќ|bLfP`N\IaMhNvVێdmpkrvsolPI=LGTJ]NaL`HaJeNbMcMgP_BV4ÂX~ugap֋amKwZybxeoφsЈrЊqЊpɆi~aȂioX֓ˌ{ѓtlÌ~sxfl~OYuEQ˛Øhx~h:Gcnr|dhj@BoFDhd]5-Ъƶ̨ɰĪྣǭĬ«Įɲ˴˴θ˶޾Ƴ͹ͷةS?YF~Q>~kϿV+%[.3]/:b3EQ 5k8Kb.;['+eaȔϛϙћԞ֡֠ԟЛ|ΙzӞН~ќ|Μ{ЛyΜyЛyϝzcMiSaO\IcOkQxXێdmokrvtomQJ>LGTJ]NaNaJbKgP]HdNhQ_BZ6k?gېVdц\mKvYw`r_~nшu΅r˄n͇mʇjƃf˅lߛ͊wʋ|mdtuu{`krk}krtjrD^Z-DlATyN_a7CO'/R)-W10to~ֲƲ⿩ƫɭַưį­įȱʳɱªֿ͵羨rUAbN^J]JxߴŵvKBV*'Z-2^0=],AZ&'r|ʢղ©׷׷ֶԵѵжѷӹĸݽ⿩ś^QORqwuxĜܴװӦ|٥~ﶙyD@P"^/5g8Bc4Dm>R_2GS&:].@h9Cb22cZɔ˕y͗uިؤؤע֡֡ՠԟԞћҜқњњЙΗΗjPnUgQ`NbNdLpTًemrtqtuߐeuTQCPITK\QaW_R^Q_N\ImVU>pSsVaAdBȝÅۧu毈dHʇtӋ}|mdQ{cȂhtZЏ{ÄuÇ}Еw?>fku@J{FXVpTrV'GuZ/Kd:RZ0FV/D\2HjmB^VtYz</pz㿱ܹڸ׵յյб˯˱ϵӹǹۺѭpVArB6begjqkpذ֪ȧ]#FT#'l=Ce6@_0@h9M_0DZ+=b2Bh9Al<KDQH[PaWaTaTcR^KmVZCcGoRkKV5qGҚ분ޣ{w[{d·sr_v`ǁhȅkɇqjYxnzvvwbeW_k6FWmsA^O>`3TlP%@<*j@TZ1CR';e9Pjf59~plפۥա|أ֤բԡԡӠҟҟН~НϜϜ͚}˘{ʗzɖylRlTfRcP^LWBfKӇcottrxwgxYN?MEPG[O_T_Q]P^MdQQ:mVoSuYsTτdeALj\ר}Ɓ`ʅfZ>ƁdǁgnW}iӕqk|p{zFSm;Ge5Eie7Sh9[i;_xLo`~^4Lge7DY+8\.;e5A`.7zHKŒvgq٦ۧؤ֤֣բԡԡӠҟҟӠӠҟџ~Н~Μ{̙z˙xlRlSeQcR^LU@eJԈdotvrxzjzZN?OFRH\P`U`R^Q`OgT_HhQmQiMgHjJ_xUzYvYɇmiWȌus^dg3@L_f5KS&:_4Hd8STsi=aa5Y`]2NWf~QXU'*Z),wzosɚʫ۹ߺׯˢɝܮשըٯ彤ȭ̬˫¨˭ɥǢ곔vdz>>n4@KXzLVȠ›T-(oEGT$4d3H^0;i;E_1;l>Hj:FV'1c1:],2m;<ɘ{pđ~ΜŒsϝxץդդԣӢӢҡѠѠѠП~П~ϟ{͝y˛wəuȘtiOiPeRdSaQZEeJ΄aߛnswswxސiuWSCOFQF[OdYgYeXeT^KcLeNhMsX}_xXkL^Cꣅ_yVhGqQƅi{fZO|B@t=Bbnb1DQgR%UmAXgCq;HSfK0l?TVm[/FtI]f;Og;Va4SZ.Q\0QU*FoEYP&0suj?8~Ɨצ߱ݵynϥ߲߰紗ƍpޢ䧒筙걞궡꺣ʧϮȫƨǠͦϮ𳞲rpv9A^&1a/8`_ԫqGHi>Ga1Ig7Qhf8C^/5h67}y{w˗פԣ͜{țtȜuȜuʝ|˞̟ʝ~ț~ǚ}ȚɛǙșǘ“|wvviRjSeRdT`QWCaG^ޛpuwwz}l|\VERIVKaUj[jWeSbNdNgPgPgMrVӆhޓsݖzђWOd+"{fc^ac3?cwa4QnBe]1UE8zShM'6g?JUcH-R%9R&7]la6@S*0ǟz۶ѭĩԫۯæpYvōΕs΍w֒{jRU>YCzf㛅멑诒깘徝ƳʥxadKo[~pqqZ_y>DY%'sD>ʞa11s?KyFYi[OTQ|FFa.+j73n91g.#Ljy̅q΀iрeևiߖu竇xȣȬʿzytpIGg-,p59HPyAJc07[,2uHK×mo{JNn9An:Gg7MZ-Be7Da28W'#YK{nӝҜҚК~Л|Л{ϝxќz֝כӚј}ϗ~͗}ʖ~ɗРșaI]F_MZH]JR=U<шgߚpturuvݚeƁXKAk6Y3H^7La:Mb8NC3_:YF"c07f7=_cmqŘagY_f2>[*?c4Hf6Bc33PDĔqНҚҚљИΘ|ΙzϚzϚzј{ј}З|Ζ}͕~˕}Ȕ~Ɣ}zwrlilv˜eRaNbQ\M[LM:N6ǀ`rx{xyxޛfȀX[GL@aRjV]Et[t\:(;.OGkf㮨d4*S& L"$wOZ`sb:Ue=`XpJsffAbtbC`).a04UZ_cڭX^zGLc09b2B`0@k:@j95pm͚К~К~И}ϗ~͗}͗{˘y˙x̚yɗvɖwɖyǕzőyxvskm“uϡ۰乌辎鿍hYaR_QVHTHH9K5`ܗpw{xzziʃYT=SE`LjSoXyfƁq|sϒДp8EL[qBRQ%2dSBTAeQn]sczqppݥuJhb;Z[7SvTok|^vG(HC!D\9aoInmFes™uKWa6@X,9d8EK.e5Ah7:Y($Ö֩꺰殡E0oR~\Յ`ڊeu袈쪐쬐譏㪍ᬍ孒嬏⟄ېsދml{_҂gߝîᴟ橌ݖvڎtӅq|o}vcbs/0j-2l8'UD\Ko\щzȆzwtv{n9IrBZgaS0QjHiedGc}lNhK,KJ(KBBS-RwOqnxNbG)s|f;D]2n=Ad7:ܮk9n7UV4MO+GS,Ii>Yh1ybڕty{xxwhˁZI5YOym`Uf]㩥Đe7Bf|yzJ'QhmOso~wWn\9MV0G[3KS)AC+R#3kv3+Q^4HW*>G(`limb20gaƗnAa-:coV#*Q #L֬۳轷tuT*.G!W(._+/liPDn[rX{[cgluz}tyvۊloN݊lՄfa~aɃi֖{ɫ٘pݙrЎtʋ|{{b)2a(7m4Cv>Kp8AY"%h22{HG۩X%"c+ÊvΖҚ֞ƐtӞʕv˘{ɖyǕzǕzŖzÖywtĎtbМw”‹ȇЍΎΕΛϠΥΧͦͦVPKFMKJGE?A7Q?i؜xz|w|rͅ_I1[KNCe_stho^le{|k@^F?Z4Y98uU5LlI]tN]P&4S$4[+;yc.>m9FN#[+)~޵ԭd9BQ&/^18e4:_))VQbSp[tY{\aejrx}rzy{v|^arSuXlOqV€f榍ﮐwەqύuĈ~RX['4[&:a,>wANn7=h-/m54xB@ެ[*%K8Дz͔yЖ~ןȐwКƐvʗ|ȕzƔyƔyĕyÔxvsogף{ÒÉ̌АΕΘΟϣΥΥϣΠVQLGNLJGICI?[I̐t۟{|}w~tЇd`JE6ncSM_fzDRQfn@Z]2PkCfvPu{UzwUx£ÖwB":N,=rvI&P!+r>KFirjnzjƺ\/2T&0oAKX)1P%wAAa\[Ls^uZz[]bhqr{v{~{~|ڎlu|\ʃełeЏsᤈࠄܘuЋjʉuwoc*0a-:c.@j5GN[o8>v;=j30g2.ݬm<5q\՜ɐsΕzؠ̔yϙ}ǑuȕxǔwēuēuÔx“wtpgƐnᮃ‘ˆņϏёΕΚΠϣЦЦФϣQOIFLKHFGCKA_Mϓwܠ{}zv|tшe]GC4SHqkuuʑd0=ShUofi@b<9pJoyUybkKprwiGXtNYci^16c58tAHszܫcavoҨg<5Z,/O *h9Cl=EZ'.i25\Wj[u`y\{Z~Zbhmmߓsw}|yzxݓpxӍk鬍ŧȫܠӑqыqȉxYSY"(g3@e2CvAQ^ku?^,5~JVo;HwCOY$,o7:jhG;oYz]܂_ހZ߃\cgߍgхaߕprޔotrݓns|ߛv~Ǧꭎŧ쵗םʉwяgbVn9Cb.;Z'6vBOP[EKEEl2.[%wvdȒv͕tҚyԞ|ЙzɔtǕtȖuŔtÒrsssrpk\ۤ{ĐːВϑԙΘϟѦѩӬӫӫԩ~@A|>?FG}?@B?JA^Kʍp۝vzyxŭdM8>2v\Ytxpzs@Qh}X-HhA`V1RjsOs^kIjmMrcW7`zE!#xQJ׬ڪ䴪|KFYWŔrEHT'*chk8Ab,9c/K}DMLRy==p51d.$|m|ljȕvʔpԞzӝy˕s˖tȖuœrŔtēssstsrl^ܥ|ﻌĎҖғ͎ՙϙРѦҫԬլԬժu8=u8=~AFz<=|?X*4l=Gd.;j2?g1?vBNq>Gd-3{??LCXGnS}\{W}U`d؄_lj݇d~[wTwT|Y׃_ڇgz\Ёcڎt̅ös͋ljo3?j2;e29b39\-5p>Gn9A~BJV[k-0ZWb)P?ĖoƔq˕o̘s̘s˖tȖsȖuɘwƕuĕwÔxvwzth~Y浊ǕΗ؝ѓҕЗМң֫ذׯԪԥ֧n6?t;Bt;By>Bv::VNaN͍qޞxy{zvʅfwgriB?yx~R]l=OW+BT,G@:yXwvWwaDct]@_lgajIh~\m转nb˛ⱭMwFL\.8O!,g8Bf1;k3>g1>uAMr>Jf19EGSLM>fOx[wTwRց\܈dچblliޅc~\|Z~\؂avܑ~ߖ]h\#4`,8_-6`38[-0l;?t?E{@FRWp/3[Zg.%RA͟Ř{ɗtΘrϛvϛv̚w˙xʙx˚zĕwĕy•xwx{ui[绎˚њ؜єԘ՝۩רҨЦϥ΢͞Μh3=o:Bo7@q8>o33QI^Kʋlݞuy{zvɇgXHG@edprxl:F|M_i?U[4OP-KT3R^?_trZ?^uZ}pQ{{[}\y~›Ęrkc12sBFh6?R$.sEPT%/i4f2>sALr@Kj7@KNWRB6^IrWrSqOyWՂbׄdilmjރd~_~^a׀dpوsڋzܐ؏nio2AQ0^+:\/6e8=_34i8;~JN}BHQYw6kACh<;g77RTKRT\c.8m6<{@Bf^gUÄeڛpvzz}vˈkWKGD۟X[[csCQnO'?F">hGddEdG*IukRoxZrRwwvfnpqz}Z',n;DQ*o=I[-8]/9h9Ag28k6`,8m6Fn:]Z?^T;YaJfxvUpÝxNXcmxISj6CW"2d/Aj7Hj7Fn@Kh;Bb5:d25g58[,2c8Ad:D^4>i4<.;+D2XDn\|eʀcΈf֐nܖtw{衁쥇٘䥓ΓÉ}_&p::a0FZ,H^3DmFK_:4a9/b3+c_LQFNGRS\JKh2(֧ըʗxΙy͚{̙zȗyƔyĕ{ŕ~ŗĕ|{{szghͥޱצס՝ۥ֤Ӥըҥʝ̛ћʎ羀`2=e5Ab.:g2:v>AickZƅiזnv|{}v̉lRDv<:aas>Dl:FU&8h|]7NZ6P^=XT6R= uFLd16f38X)1`2TU3K?6Ħ[>]fKl{|`pĦ{ZkJ%7_8JV+Fa6=m>FYeO^\j~@KZ_TLq8%ݧɖw|_|agqzÐ{~‘ĕxzvsnXְ֡ިԙ՘ӖГڢϛӨ שyNFZ%!\$#c57Z,.X%*d-2j/3QP[Ql֓v|~vw|płemayJRӥL1pD[{Oja9QwOgM*>Q.BeEZoRqdFjeIotz`nkuYpαńewP.>R,;fO\d2>e3?d4@b4Aa2Bb6Cj*͕z`e{bw`w`ubq^o^pas}osv~puete~ețϗәΔˏ՛՞ƒɛwhNm:)`)$w<>NVKU`cTWn=Aj6:h03{?>}?4jVӐs}z|}הw}I<|NPƗP!1]0E@-UpkC[]5MuRf~[oeDYL,DqRrwbGjsXyptfJca:LY/=qETrBPW%1WcZ(4Y)7[-:^0=]1@^2?d6Ckl0%^I̋mv{vzyΌl]RRTuHOM.U(=e9RI8|8(\9M}Zn_tL,CH'B~fzrWzw\}nn|Y7HZ1?uIXc3Ad2>NZZ*8Y*:].>b6Eb6E^2?`2?e6@tAHt=@d&'C=g]m^|lԆrhσkՉo؍n؏n؏l֐lՑlԓmݟz⨃뵓콡ⴚ⹣ɹµǻlF;AqEDQTxFOyFOV_~FIy?;bS˓|ktoorq~kxgwfcUfXgYVFhXzh^IX:ʘƋϕ՝͙̞龓ȚvY9n:"r;'K=I>JBVSYVzmqZ^FEe)WB͌nw{vz~rƅe{~V(2W+:@(_3Lwk]5M{gDXk~L*BS2MzYxZ;[wY;]z\~~cnesoNcsPdxSdl|uIXV(5Y)5O[h9Id5Ed8Gl@Ok?Nc7Dc5@g8B{HORUp32HBl`l]xhzfzbeцi֋l׍j֎hՍgҎg֕mޠyݣ}઄긕̮ҹŰƯнuh^6.mA@vHKtCIQWxADj3.~q̓ȒxƓxtuÑxxq~n}mrdqbo`WFn[o_Ka@Ǒ֘֞˕ΟϥƘtyH*i5|E1\KdV[PXMXMRG}psONc)WDϐq|ww}u΍mܨxKNoAK`4CY,AK8lA\G9ZrM'KBWce6F[/@[/@c7Fd8G]1>_1Ki;Fm>HyFMTYihu83B9pawfτov^Ոl։k׋k׋iՉeՉe֌eԏfݚpz{ڣzުᰈ嵍Ơǡ˥ͪطߺwlpGEm@CxGKvDEY$ ڤǏ~˗Ēwpotwvy{qud}kq[hfqS䰉ϕؘԜԣˡērS;v=*`R^Q\Poc~mdRR>cOiFJroi3'P<ˏmzzx|uАmnenDHT)3E+hPL)=L)A^zR/MeB`zYvtSpcdEdsijuR/CR(4Y.8]/:sGVb3EX)9c3A|LXp>GX#)zBEa`zsWKm(dPp[σkԇkՆg׉eڊiڌhڌh܎jޓlޖnrߞty|ુ⯄崋湏˜ǜΥѫѰռƾH WVxHFX&̘tϜŔvrqtvwwvpm}frTf̔o˔m“ؠ՛Ҟ̟٧jLN;]N\SbYlck_]M]KgRiTA"'gHMǠ̢Z&M8ːn{{y|tђoǗsJPj@LB+j@X]2NiA\Q)CM%=`9LP+=d>SD!7:0j^ysRm{ZuipgHgfU3LT1GexN$0H'^hUeg8JW'7_-9xDPo:B[#&v<;c^oeaQj#dNx_΂h҅gֆe؈c܉gۋfۋf܎hݑmޔoߗqߛtߟyߤ|ߨ଄㲉䷍徕⿕Ṣ́ЩѯԻd=8g;8d72R"НÏwǔwŔtÒrrtvvusml{asSɓm粈贅˚֟֠ԣe`DXC\LdYnei`]Q\NaPfTmYE(,W:>žȞPL7ːn|{w|rђoxQ(.Z1?\3Egh/5b('HElcj]gUj" bI|bςfӄeׇdۉc܊d܊eڊe܌gݏkݓnޖpޚuޞxޢ}ާ઄䰉嵍廓㽖Ụ̂ЪѯջߺL#V)#h8*ϟÑvgƕtÒqrtutsplg{^eᰇʚ̘ԝѝџϟީnI[>dN`Pl]tjcXRI`Th[dVgYG,1Q49ġȟP}I3ɑn{zw|rВmyU.3D)pGYU-G]5PO'BP(BS,AZlG 2gBTd>UJ$=a=WM+CN,D^YU-Gy^7Ig@Rb;MG"4ySj]7PF 9lI_8,rPha?Z_>]eq\nI!,a7Ae:C_/;^*7t>Kw?Hm28l00B>neƀtvd]F<"dFтcֆeֆaۉa܋`݋c܊bۉc܊e܌kۏmޓsޗwޜ|ߠޣਇ䮌䲑帙㺚¡̩Ϯѳӻ•ofGwdlϞ}̚uÓooorusqkiuX]罓۩ΕВӗԣƚ歂]`<[9dHgOo\fWWKXOhajd\XTQ9 $M27rxʪѪe5)s?)ǏlyxuwnΐksjiDK^8EZ3F@2T,G_7Rg?YY2GqmFXU.@N':V/DnF`H";S0FZ7M|ZrR0KS2Opw|[zzSe|b8BZ/8uCOb.;m8Bp7>m05x;:PJsh}nwaM5O3gHс`ׄbՃ]܉_݊^ދa݊bۉcۉdۋj܍nݐrޔwޙ|ޝݠޥ⫌⯐䷚⹛ʪίͱиU.q“wϟ{Yknnrusqkhx[dǚۧȌӓ֙դҗoyRkEa>aCmTmW\JYMcZc^^\YXTT> (T7`8PR*D^6NV/DZmxQcR+=wPc_8MC3e=UY6LQ0EwV5PZ8O-E[5JX2A_7BnxvCLk6>h03p32HB`W|m~l|fH/aEoQֆe܉g؆`ۊ_܋`ދa݊bۇbڈc܉g܌kݎoݒsݖxݛ{ݞޣઈ஍䶕㸘迟Ȩ̭˯͵ҽϿL&ioŕqœnjmotvuqkg^gȘנŇٗڜџņ]qKtOgFaEu]jVTD\Qkb]ZTSXYWWI%1L(2cnâƣzNCn;&ǎp}{z{xwΎkun`5>c8B]3?P'7K$6oH[Z5GR-?gBT_:LW0CT-@\2Fd:NN'P^9K\7I]3G_5Ij?R\2FkH`kKcV8R{_xP6S~ezzjNgk}X4B@"h=FRXa28X+2qCFh22[ };/WHgV{hvcvb@,eMфjanۇbޏf܏e݋c܊bމdމdfghkpsޝuܡwߦ{ީ}௄ⵋ輕žȨ̯ϵҺлĹ|Öwm̗xƏpŐptx|{yrccUҟhޭr{٘ɍݔivOlIeGeLdQ[NRI]Wc^^[WVXVZXZXP(3F +oKUŸZNzJ4h}~zwuʋhɔW^d6@\2Ja;He>PY4E[6HiCXe?ThBWfSlF[gAVlF[fR,;P);fAS]7Ld>S_9Nf@Ua7KN$8S(aWtevdxdVA|1dOgىnڇgp݈afݎeߍeތdߊcމb݈c݈cgimߗoޛqݞsߡxޥzާ~ᭅ䴌溕Ʀ̯жѹ˵ķuS;hQ{G1J5Q?[LcVg^neylmԞɓo̓hŠYҟhљם躈ҖrgMQ9WATBN?VIbXc]]Y\Wb^ec]Z|IFk85H!&H$(\8<άʨwesE+}Wޡtvstxy̐kng|NXW)4[1=Z0>U/>T-?qL^U/D^8MZ4Id>Se;QX.B]2FW+Bb8PU-GH!e@RW1Fa;R]7Nf@UkAWc9Of;OX,C]1JY.Idj2;|AE]^rlwjn[I4kYBӅntZ։krފe|Tjffgfgeމb܉aهaيcۍfڏgّiٔkڗmۚpx᥀㫆䲍溗Ȫα̰ٿӼŌbL]Ktch[f^c_]XRNrA:d0%[#G-ģؚqթ浊S/r:+|A;MGOHSOgbgbQMUQ\Wgcjf]YyIGm@=nA>\\dcjj̫Բ{wK.zSܢt{uvrc>|vHRb4?^4@\1BV/AP)<\6KU/FU/FM'>rLcZ0FlBX_3JM!8d8QI7pE`X1Ld@\pMkM,IflgE^L&=N':W*>R#3U#/a,6w>DJIhctiX>(2D*}d̀dфh׈i݊hfb]aߎadeeefffیcڌeڏgِgؑgޗmuޝu}ᧂ⮉ⴒ㻘¢ȫͱжϸɳԿܱhXdTodf^`\`\YTzHAo9-l3 P7᠂à١|b=g6p:0}FC~GDJG]ZeaVR|IF~KHa]mlfdXV~PPvHHm??}UUfennƥά~T7uNӛltrvyrOrnl>I_1>`6Da6G\5GT-B\6KT.EZ4K]7NhBYL":h>TtH_c7N_3LayP(Bg@[iEaa>\qrPk`>YY6NY2G]2EY*:R ,Y%1k4:JJ^Woe`P0jB%ցd}`Ёcӄf׈i܉gߊe_]ߌ`ߎadeeeffތd܊bڋdۍfَf؏fݔkru}⦂㭉㳏乗ƧƩϳӺԾųVEgXnch_e`e``[ULM?K7V;ԱғpmMyD%f4|E@~HHQQeckiVS|IFWSYUhdomcaSSxJJqCCi;;sKKedqqâʨ`E]ۢu{{z{|Za]`2=Z,9_5Cf;Ld=OY2G\6KiCZ^8Qd>WoI`W-ExNfyMdT(?N$oP,HnLgb}a>VX2IS*E)x@'M=~IEOQ]_nmfeyFEs@=[Wfboknl]]zLNqCEl>@f8:b::}WVeeusâ˩hMvQ͗kwŏmSOX*5V'7\1Be:MiBU^7L^8Oa;TG!:O)BYra7Od|^uUlQ'?]uH";lHbrZ8Sua{czkDWY-<\,8b-5]$*]"$e(%v6*I3\DfHjHqLxRZ[Ӏ^Ԅcֆcۇcb^]ߋ_ߌ`abcceeތdۉaڋb܍d܍fڌeߐipv{㣀㩄ᯌᵒ㽙¡ʫɭ϶ѼнĪrXKbVeWi]k_j_i[lYoXkÑc{[ZAh:=d69W-/kCDvORee̪ӱʣrYxUЙp|||\}LHV(3U&6W,=`5HiBUb;Pa;R^wc=V^8QmI7i?Wf:SrV.Hlj8/hF_S3KzXqv{Uja8HW)4c1:e.3]#"k.+KBcOkNrRvRW܅ZTsKZӁ\Ӄ`ׄbچb߇a^\ߋ]ߍ^abcdffޏd܍bݎeߐgߐgݎehpv{㧃ᬊಐຖ῜Ƨç̲лŹ{OD\NcTj\n^n_n\pZqVlPjK`A\?gPjXYKHAYYbf\^NP|JI|KGZVqlvrplccOOp?Bi8Ge;?`7;b;@\^ǾɟpPΙq“뵉x[p>=W)6Z+;U*;W,?e>Qg?WjD[`:S[5Ne?XpJcc8S}Rm\0IzPhg^V+Qh@XlF]V0InHa^wP*CT)DlA\\0IkAYhL*B}[;S4,f}iG_E"6sM\V`TZ{HGHG\UjamZsSyORρQ~K~IڀN܄T؁VՂZւ]ւ]ل_ޅ]\\\ߋ]ߍ^`ddeefߐehkjgipuy|ިܮܴ۹ָ̮ݿîùYF]F_KdMoZ~ff~awWsSЁc֊ptc]QVOVTHK^`Z\MJ]Zxt~zyu\WzIEc10Y'*_,1tAHZflx  .6()Tests/images/lena.tif?^~HHpillow-2.3.0/Tests/images/lena.Lab.tif0000644000175000001440000017324412257506326016407 0ustar dokousersII* $oQ(1 2>=;RI82<ix ' 'Adobe Photoshop CS3 Macintosh2013:10:09 22:07:19 2013-10-09T22:07:19-07:00 2013-10-09T22:07:19-07:00 2013-10-09T22:07:19-07:00 Adobe Photoshop CS3 Macintosh image/tiff 9 uuid:485EEA1EC132E311B432EB92488C2511 uuid:475EEA1EC132E311B432EB92488C2511 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;89BBC3FF63A79095057F42D2E80CDAC4 128 128 8 8 8 5 8 3 1 128 128 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;4C2D24FEB7C261161A0C19E757B90B64 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM=lenanullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM 5JFIFHH Adobe_CMAdobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?݇rF3[kih."\`yekY7Yj~j¥Qԫ<hA׺yO(#i>) H#]Q+mlZ%I5Y`YM;Lg$A<%^Q'A +aӞ_N%Zs@T0$x5L o8Uz2٭Y'_'GbwD?OaYq'o[ЉcIdNlp\=FuP?5oMGgߍm60`  oIl/6^YuejyJq4ɨƛE, `ƧEK8]k\ƤjJ f-'w)FA'FZvŭ$v#Tց?-Bz#lw\wK@fc4/#^ wqJH_-%v-w0{C̿1kX4[չϫ tsORut[ʞ!"AO19%)ոk[Fs1ѶY\+t#sw3z˭Ư~C.%B#y Klpq HYc;R߳3-VbvͿ+[=;[S^sg}]l^{vfm9-ip/W(R^\=u`3yVX;?"g`-.ΡB c\kVeXU=Nk|;ROKG谺s.q$7b4˜InFHky8QO"@=bn6ݡ"-: 1OAeYVI .w=|_\YhkX4&}sӳ<1̏KzV]<Av$:*ﬖlW:Ikֽη]%v>f@ {.f/Uc(r)l`ɍ!>ĘQJ,Zmk\!I߹}1Iq(qĶc{w[6P#-Dp9 m᭡{0֍v6/#.y%ԗR:Tu63>檟UޭulGG'9{GH:X]0bcox>aGJx!1:ґ(?j"@]HGUsp]pUj1aӿenSۑ\oퟙbI]a|1I? IjNun[͌Ewk/'*JG.d}kunuvBqŞnsY_?e<[lE{\{=E.$ŊRݖĂF7-бf-saqk 7goO/hU`%ۋ=8*og]!T&=ku&~;s>_v'1aˡtʰ~CyIN[m-"ج>Cf+>)8ST6A=goee U;+emn<ŵwv{_m_g`}mv!mm۲׻g?Gmn}e·݌n+n?닊vz&du!RUCcIu/ӹ${;YkpZ&\-iͮqsSZ"'X* 3 vL -cC(=[Ӭ"2}FU\' \Klpˠ;Blo]Y٣To/Kd3;[1'[\F=F W\f1po{+ctWcG=ԙ۵_?UCα΂pw;=KxpٓlAcߜY:$,\m[gO~^3)ƴ@mm5E%ߣ-{[3VsY<@q[v ]W]{ѩ( Է>e:a6]K-m{U $6N3L_OYt\C ~[Aӻg'ekkqS#3 ib}_ǮS}7Qo__^Gk7~n;`@#YQ.'-@ -w BO+zs=__os~GZtIuj{kµXxMyN6l{nS1` V1C|wV_v!KAZ/ ,  JxYÞ}6RM{l6yQxc"Guv"F?U~m\7E.~X3 ǎ]ՆqG X {nxߝ_26N71sp?uo6L:}D\n; ַgfMCK8ԲAߡT?-Yd]lcu!NYRk*=OSt;Enyo;Asvֳٲuծ| Y}5#oXqsG9[[ T Nv%UZn@LCZfs2oyˋy&?-_:!qtƐHcgQcRC=nb$ 2úo58iUZcI?Z`UVʨeMѬhڢQ ov֟*%uxī!t8pki#e`.{@I0hI,r6tO^̊ݺhv\S rSe;<{AEK+ m٭";k}5kfOSԳl;^\Cۚ:{u;s9>>X55[H1sw进.~嫽,V6INvcMœS(:ucKj<Q+=.>1;dv3SDZK{ gۖ'OQh`p A= smkF07}ʨ}"ZFWALu]mllv9i)&Ԡ ַ߱ai̭:U`sUX݅#a\nǨﶗ {G5Y_" `i[~^j,gh = ?.kkΨYKDh۝깻YE{3(&MH`>׎UwYdhs;UL&_&;^ݹFeQutkOɻT9?-pG#3˅ (i6^#~~j{cFbG̘ƅ֫ҩYʭ-5-GoԯhV'p#39Qܴoj5.O []1skviS]U\~+;\C>sZrdoB4B#XFFm$֐A S!bK$U9jD:ڛM63nWz>Kk=FIgX݊5ԐYH&P^Fl}h&$ssعf^P+=Fk.h``~r" D/K_/ܛ,fq$8_oNΚ0&*GA:eZ"0@H8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIM maniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong2GFrGAdoub@>FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong2GLCntlong8BIMRoll8BIMmfri- 'B!w8;/(!D<La1p @Љ%k+  ţyNI~Lr!@l&ABA3|gIax3~a04I`//1/@H> )Tv]l|͆!y hO6fe-=2]4(_\T89CPȽ~h [@Y2E頉AKsQ $ z(z\,^,hB⤪IrP鬋 CJ*"/H^l2CJR*RF~!GF}"( 9=ĬEMh՟@#""\70+sn:$71q4GԲ}(ZCFZ ql]NZ],.`2,PN*i 2? [d`<ಭUҞhl{ C,U"ΓJJl7[2Oĭ>*4ũHV -kOL9lו[@'(G}<)`x&b=*c"Ȫ:w2<~4kHqf +}BعR,RȘx1v'ʞ~RwhF:M-2 SȧZƼXQ}Kbɪen!i\q?(:"$fqph‘Bm`̟#Jz4c)JK )ZJe>.飇Ѕ*yȄΙcCꥥG tMLte aX( (Dh0">eU;愣%1ݏDMI FN~6=P9l4-C`/mFVH@iվ]+["Tp)|+$ƒMHp&H}?Ǥ> lLPN!CTfC_1WN :&7~*@3dYEhPftoҋ`3r ofqfY2Ā)fP )f f/`2p" `4omJppg2Uh~ \ZCf2[j0Z"pcZnsD"`AP~)!$/l͊BArFf,܇D¸$a $&P%zebB'fY¨"G ^ |,n5>0 $ fb 1⺕(&!#!%rDŽ"Nd$n!,V`O X00X P@bIBGkǸ긳-$ra!F<`4lce2#P#1PAlf%Gbo'y  "К)|$)zm9#2Ǹf~rB(2 z^DL^,΢4!iC(#|9"ر"p*"3淳sYm/4^ , )umf)%bDchV4!6ChO"`gD&Sd`*'Bb\dtCJH:'%^U#B*09%.PAs'#J1?р4#" 5-OHH6螯DITgb`po!y(o#(aw! i )FF0 JҖ*M!GHM!sOc'd"n"a(04?U" 0 ;p'"8x&!VtceL @z 2$c*sBc`ch<㾢͢d2!G#J$׎~"1G4+D7 raV4",=b^T"$h0! A#4˲~"4Rԩ HbcԸ0x'/B0: (8UI5 Z 襃2pCr] 06JN %2hR`&9G "(0YBv8i'ق!-/b_JHo"4MŽa$M"<Vc}4&rHLԀca@# " Bh)!;@pCABH$KW ãXdm'?yr(,Yle,Ĵ,`:8zȀ`B n24Ұ$$v4A*@U (!!=N)`l7YG:]Z|>v!`=[a C>\NZAn>HA;ثoFq)mŠ4"rY2k 4z͗\Ow y54Fg=,/1Xq0t:b*E`$H AB"gL!$)tTu)aN`C| 8'4uAJ c+BH>`SA:$dGz9d)JRab $oހڀ*`4w]60z 0cHʃ+ qt@d6ȈW&$a҇ @<)B9o `q"8bD}جgj5d8|2^e\Wfj!$M`I|ȶN!5;:¥Nخ(@NLN|@6.cs(.%';d.bӈãz¢ "p9\|>Cov a{` ?3p .z,("F"&*#3{ 7j("z"r7("!*l -*@1#Hш3L>rZr( -a0 $' rG;8[GZvO mT x$!q\.쀀zօ( 0:@VK.HҔ}''cعj ."/L3*/B(!(s'6%>GAH&"g:{6‘!g12dGϲ,4U0 Xy(7K( CƫN}҇~4L!@s(Vʣ@riAl o|$2ϻa+*hF@) .#X<ˢLȑ t:%bAp3!~"6(#L'*F/> w00!F0_P:ofx}ՂǪg&hgon.2=;~:̎%ƹ|xr > D+0^GTF!0 }6\E2Sv.$@yT@h|mR18D}ݎ2R*wE]/ |\PR퐙+">|A!Ofp(#H#Hq< T&*f?iRڊEHAuŽ`#dLCy*Ba/?~?qp0Dǹ>&}A8/ؔ1FG^`|nT P;@ R:UߑMɨJ 4Qn]hڑuw6kP Ne $YyAJ\r9.w.R$EPeiv!0#;@A(NӠb#P{#@(ΰG6(Ґ~Fi)JG!s&fN3y Kp> pIpIaW|.ڑk<L&}QX3u]Ay } >hfXYA״BNsKX+gଂ#;K3Hl-2A l +w)j CA3&?0t'&>].ſr~!xfhVci2 0&hn F8̎ L =FQQ" *O&R޷ QR2ZWDKR!L)uH/h!Ց]q<$V./c8/&AF/,Q>! ߌu/-$kE"cJdL)IO)SFb=8@!o"$jВ݃0 U?jat "I$Ph<?QnJH1sjdts; SCl4J[cT،I!7Cۑ.BzG$`Y(PL=(pL"= /':e`;Űch)q10Ae^,'#T;:G Yfѹ"| )Ѵ?Cm/"N y:#/  !~H  !90ɍ+ H/ iR+8 ~ }~" *J5#u&ۃ-~gplqsֈ' HqL h&c!ROK|pH@iث'+s 3-psc[0zl$Uk سn9хhܘuUey ;IN:`!IQPu Chs뀸#hHH梪x.e6pvA/5!U4Lq 1/SL U'`NTB2!m  ˷Ȍ 4'OW/5p 9p#HPZı1U6D፷FӍl<pˠa !ze Q ܹڮȏ,d( }R(%K" Xx ڱIj\ٿlQ]|wc1M8ݔr  yYhM8Yxss,'Cq͠<6^c" b `l~P =Ktij6)z% &PX@VAЄf( %*T #()a\Ɋq[ȥf~/' Q!5?Xgg3~r ԉ yY *4Au \WxT+XyȊ=0 ̘-YP@p >(A8" d>;He6:B9Ey`2%g2+ Հ+jO55ԒC$`nk6k]rq-; m41 !@R3tX>(y,ybRO~ mMH7 wAyNxe~굖=5 ;+!)c`xp` v("9nI39AB?@0x(~r!8}ېOp  Xi ,9%4B"Sk #!6- ރ^= 븹} u5)xٜ)u<+/ 9>G6(HkJpBg (BVÈb:1;XWhK!˅"}4; 1 Y'֍ ~ Ȃ< md!y~I/A8}( ~0QR'A<[B 2jÖ|E e$Bhp,fA} vDd֟ 0jc@P]8~_Ϸj&uL9J4hc0@6筻s#?@W K ζ4y21ᑐz/>:χj@YBxjl8 Z 0B@"!):bCJd i*D$@h&x@`*ZzG% p 2CsG"t'5+q )̧LB ˟IC ǼJ,; t& IVG.9Ɲ*S Hދ5L(sQY}G0'hi &II"z! XG|NDΧ L΀ȃ rImy 0TB&pBb /</B B* dY<ӵ Jh'S h˰m<{ejr,ʹji!hb z.Y* =g p$~~}~@> [NrM!ګ#~X'})Ć93z@G&ha(I֎9T*ؙx,& 1ܑg[IU&on&!2e"~6H@~^*˞X>ԀOJ L1u;/$ jI,֮:$ ,eGqk>)=DXs@MIJI($xjHK"zI#`LΎ&~ X̅pa? ;ȰFaWbb !D6jk@0n@kw ICl >*L2p. 94i1ei?Ȅ! < t&E}eIFG#a]b.Ȃ4ayR*`p1rL'@0RWAi Gvc+kc(rR?i솬T_1B P` 7SCn@8@#" *#ha bi7$6]X}S:9ADAEY s2LE)ɨc)~a?3Gx):"10YO1PMz;#qx@x|5"4N`H ;ر1*@}VG!!l&:Չ@&}Ҕ0X (hѬٌƝMF0ZEN )*2UD#F8GOЂ*{vkXv,ct4AJcRhscFpx+D}B̋'O]( @'~,쓑ċ3eK|S _;eFpD1"hf30JG;Eú4 VlSA:LA%  8NJ *Hk6' [1(IG&G}Ɑ&4p5 xLD~b :ɘ!3}>H ?!P]*C^|L60BHQ)͌ւ-! &4ʍT؏yly18r^Հ£rCԗ^lT ej(fv&eP~?hD`ҝ+ hy9 FNҞaΊ#icR#$%604is`>O` A"a+!jAn!a{Hk@6/+)BP""/Gd`8"\3/$a,0RF/^!FDg29OBh~":D!j=!% :0>-"$ )H\a{&% G"BҝfgkaR 4:8b($Ba @4€wO ,hl( f&dH$DŠ认;@I֘$ H*' CX5g&)*hayeaIj#-Xl9cH"#"6 Xi (jbO`?nx bc&`0+` Of@:!m,d41P``AeafA` t4&ot%!2|"b^"" #Z@ l m"2@ClEGYбJ% /B1\$!B@'HDL \$@ ɼIaE4$g X I@B@D@:D P6 "!b q02BRP{)@7ΤR:<0d! !I!P|,k !"%aeg2*+Q2F)ᒐ3. , ޭ  I.G@$  '|A!C8">9'^? T,U$ac`2YK*cd~~c4" -$.~#""2 Yԝfqe~## *+nWRy䈇0"clj(A4B&P#^eoT!@f4`"h АvC+@#Ll+cbP'$uQ!a)@N3Lp@.A.~Xi~,OiN BC' 4r*""r'BQFbqXD aಮ`g*Odr4w/cH&8+.J»='Hu+P`aB2ɵ=bP$4`Y!d6b)Ec".&1,6hE4"zm a6>1 $OU*3 D@ \i%"Қ&G`)OZ^X&.˜f("2>"nHJLBo# "#,B[/`#A$|+e#:aԨ2X 3)YV|+c.ll5tP$FVjX&~,*M^`'E.R 6GA 0FR;+"E*(bQ@,cRCH2"2bAH-"KRFg6@T+p)2]4Q"OV.ÖdRTu+dCd:c 2&`&J0*šjIb_~vv)Bn'1.mc "zÔIcRalX$$2'.qbW`ctDk`f",3!Ai J@%>O6hHh5eN" V=H"!%R:$H`#8KQb,2)|E.qኗj=ICI®O` /GHUSPbF,]Ibn/ lwB aN*!2 ?D 19! 2 ¡" #% @BR"!  R\Ə"B!O D `hLL9&t&KNtHjxz&#`&D3ZFx~dZ,!S f*Ӻ']牳ZxuC/-b}J ld;F)C+01N-r!/'€H0+h F; #nz/#:P{Bh`A!K&AJe`.,`,2d#a"6"IF~2V-!_& `F3>Gv ~)hʢ-耦@4抻Zt¢2&&d Z>N#$ j!l;HV9'ZN,e" ^9ezd6[Ez}"H0ꚲ}@m$i)mdA|y 6EGD~1%kL9u 1"+ʁ6$K,d%+;eB,a9 so".Ji8Ua ,`b3!N!OBya]w g3F &jd "RDb&]CDi[fa#!8AwGCh0 N 02,ZMHF: Y*`߂e#p4!LLdJelE.b,lC#A^7PHj}DuGk(RP" @'"žB fIJ&AC@ &P^ fBnEB##Ab.@t$@0`=p\6If+,)DlĊa+`!ph:Y K08j 0)IvJ/6@bu9N#p+Ԅ r+d/b f@x!P'Ҙ `AODr&L+F<iR$; iL `/; Y(0qz}[@x! Ux xq}?BW~wPތ!/ 8} T~Y aR-SD(5Kw/"'@0d:yhp& =@B?rV8 ``7 }@J x BaD;bݻq ey`mXx?cH Db4;ƂŮ) $8J0QR!8~0ȉ8^#0⿮"Qfx zx5rHg ~:lG |8:!ǻ\~(DezF&Dz/v{HB,-S D ]'ʾ$;@jH.}bFz'l\R}+ J+ : vjq~&! 4R0`8qR "= < ɡWu"*Rw* l#h`6)SWr= X$B)pT<gU8~_KIOퟀA-e"(Q' Ԝqzg=@HU@$}YxBV(XhR1 X.]m Jg@!`GER'I|2`IW2eVX* ka` }Ί'h$3Ҭ-Tpal,C+, ,\i? Z(&HG)g@@|/̘"䗏Ƽ?ҠQ mA^De?!C#cACH$` (贂…? XsBK0} cUG+$1QӚhPP=>dX"EpSQp-eGP5N# F8!"c@!F<^?dw| EX(D^ "$4B @G @P$/;Ooa5"3F( ƖczTj {A)}cD2o PcKQ@p}!Яu. .fOK80pP;hn ;f!L R<1B!a!X  M̀"#A%bA .̖B&Q)b]ׄCoFc.sX{Aŀ9@"u|I@yB€2|c<Ȁ~ Wظ"ـFJ*xBH9(WpCNևaQ8 1ECؒX0/h0@+!'7BY#)8(/@^ P>JXwIUa @c7c{w/VpA8-$ep[GSxQ I*#&A\] XY Q@,I U=.lxȉQ>R.N 012xP8%X*EQClxaCm~ P Zj MId?@:A·+#ԌHʌ}q!' ptjf  _* u_8~0}a DqFapxC Xp(Ph15:p!, ?Шػ:&өXG82 ;8rX!Ts^| @{+i ) } |q ,R@zlTp%ivh} OPe@a *CU 3Rjq Y4|h q j@R`8 ˞&xG@G/@ f~fD؉oP% ^#Q|br?p<܋ q)Q]P (`Ij;E0(o)N3D &aB &6?0 [d# (rp{0Kj1:lx4= uIql Mu3X7i@0'5TMoSF4 @bi=( n઀iX D$KЀ3..xBH 9 ~P@% A8H2(u Ҭj9=Fф Pr)upx=K !R&G8zHٖA0C#͒<0 T͌+AD, 8; PPQ{=sF2L㧳EQB H~+ pC(ԇU+ )5sGqkT%M@F 3lƈtcxRhP 0-ЩFduPH ;6 #8ip&q m^?g<1J\P#`sp 1Z!,ڪ`J*Os kϛЈ"F-PkVsRHWOM@ 2G 5\M;9_iqFH&9G<ʀ9S/G`lhy,0.@HWP8ԙc Ofa p`8m} 8~կӌyX+iI+XXZ/jp]7-+n80s8 -٧yMpȖe B&֎Rdq ԀSkh rMS_ԁMl1R "e?G2ـp ho˝jYFx>tYA FSiuXYȋ:'殿/s2O}}e6(~SRs(g`H^( XR`@ %D H-?u?@O'~׸ &@'&p 6@` _ژ ?P@ʅ>Icxk@ˈM ́V>]?q1  O ⨃3OoZUU ՎZA ̫$|ͧ'Y=__u@ FPH`kc>1upjdA~@GN`po($ ;\Pȁ*@j vڦHPPz@@2ˢ b@'@vy` ɢ"~g B'֒`z,`JH `*Q+휾.+'i ~%,ZV) =jI"[ ʾ$hOH%@rjPm@!vA }H`锛9ӒA.5p x('2jf ?jDGȥ7 vvhR ( s+]ZCJYȃ'ⱵS{'ٶW}5$𬃋>H31ܠz*g V t UY&:BZ]+"lY`Y X*g3X"-r;x٬hHWKSqa`3.zI.E^)!ގ"" ?+KH ,cfZ(+#@G$To,DA H'5s$VIHq&Ra:EbR~~iF=`w|OZHE@GjT DKGM3ʭN,g!ãO"9XC>s@7*m,VJrHp0Zм2^(|kEXt }8&@rD0yŎ#~@Jc e5$M-$?0dp~UƩ`=$B"H I Ny9c$gԼp.E"V8'|TAX9 O%*4R w-EHBkU1 prcJBD4%#EirM*Y v:@ Z'\Rh( ~@"C@aAwBL{8֡n}"+G#|׸?É-S@eh"Xb$,ўGب&$V#$?Wa HKE@3@[*`EQƸVVc2&i y2M3 ^}R`8~P=*^M# H`@8HHG U@AjWtk=<,=E$b%@)pPʛcZ (.>L Z^AEu@@R&VѴG,CQeA~Qq#/8$Y3+`\z tj.O:P~$e T5Dp'w(YI`  ekkSӾB3!kFE_>f2bNkoxeWT4ckɈ?B#Kl"ԇ.nWH=ʉ"l¯j# D~R9C@+Z?W#*Xr%( y۬Gѽeڒ?4Cf։"h-a3]e4w\ QY#wֱ\M[m_V;%iD۹ ""l8 Vc:X؀@+vqUkCL&LüL4;o}!D$NCwH?[K?x@bA=hDWP*#XN!5.)b\@7"'Ud V1$dmN#|*lE:FS+b醒/.#r3H& ` *M *1D~b$t `3&V"lB+$lڎt E@M'cMkGjJkna"+tU`B%J!!H,NaHzL&@`!x9r?Ia>` c0Bn+:-G U0x"`89%D"B$kNk'q.c~N6LEBf!N8$Z7gc;CdGN*@a1iY<9.LAG294@XZQ*j#*lKf'|P"Z<` `sCL4L"PY+n|D"~RS@8MI!Pa I"*|lZD(bGA *|+!LL` ~` bBHd~,h.ik&iX}WD!BаB>THH"sDv79b|ZlBք8#f1B9Atc*\bDo o9L 5bw9sObMq&YfA 40j k/+8*efIjL` NR!4eL<`ujf̣zRd{Rc⬮@¦'#{we:[ X"B0"HgH$JO!@ L!@!Hj-\$,!Nb ÞfB@|zk$90  +O 9`X91 /ej.4@!B&k%b7,@hj>sf&*n/$8B$NEA`"b)^( nO,,H[ \E \C[emA?EAHZ#rF`*Lb3 ¬8n93)@n!af) pt!?`$c`nY,hlWB|%P$J'8dE"|"(%H$%1H0a(5Uկia"|Ox!@h!no1݅o U9&c;9i`zXF2AMEeBc#X Ƒn[@bÏr T|rOA?I`H`!1"F?8XBF-2B#^]cqN#*f9eU* atAOEN9B:s :B4 &.n$9UbINY8"^3AH`HY#s #"A '( þ`SYƥCv R6Ne&tnvcYLq'L#h86P Zfv  VuNIlD!gvjCo>Lo`@A@Z%!1*kBb`c0bBHb _% $"a#!\4m"wcf8b2w/PEI)q#Y~'b %ZOTXeBnh5"8MܴB?EAAƿ,N726CΥcǸZ97=0%nǖP"3JS}\ C_ 9#U69\CI!hSGL4'`H9 &@T&x#cG~#!AҴ@A5R`&+xjv,`0<5"PDa@Ɣ`{~` Únˉ" E6HQhu&bB"x)!J| Ub+rH[U(4%#\u9ApTEv+G' n2%@Uc/+D%Ш67$8l%,apJTv* 4BlĸKp!e~X@jc0` 4"  q6xQ08ENbw0ao[%C9pទ4Nbb*.!B!B$`% _D YưY'ƂP@!D"]6]&<˰ $.aU>+ALT!ARO21$6Ӽ0@"YWk7*c`ÎLʞݦRC*!PdkLqAz[T+&e1! @(2HS-cUDR"Dq#1ȮA_ #~ Zb>m Ma"0bZN9Z =v`+^J**VĶ,fYȀ5vMzo(+S|8372\\jP,!+D2&C͎eINb6*0"xhwV&R:Ug [oHNgu<h*# yD*9aĂ0_,Ixx3b  0 ^ 0 $B&x·y=H~9O@H~XC@S? S+'A0hnMD;@/N07N^@2B!-f/%yR0 fQZP)?kLtgRYV/` Ӄ%!@MG7̀A}U4S랿@.(^7l`)u?,7 ? @(v` ;{ "b}v 4@Gl` |/)1͇* 3% '+6 )G:$% 'J?ÂIJ~|&0π ڬ( l"/KK(D.'҂)Ue G{N &*^EsEg 2jXQ6H46)QGb br*  kȔ~s'<#lJѣį(AHc.rGyPGAy13 x}G 2мJJ+.fPh r;&,I m1b' .+  F.kL&yL J/#Tx MX; V讦U L(:+|`~'62o4ۡ`xz0@rנt K/ќ`!uA"Mp\ՀGBw)+ xH1(` 0z?  /N!|<x>ɶFluC&xK %Ҙ48/@Y2h-"!ՃsMAtKC 0\O啾ar` WʳZ3h2$O DĔ|dUl}.Ґi̛U eGܛEzP2i!y"%V$YN 0&>? d/L CZSu,3HY<b ُ* AbH :a~Sra;Ԉ6;5m* $cQ4`\^FX3L{a!@ O )D,hVFVx/0``TaL2ka)< D"-DBr%*ݨOSbUJ.H]̚ XҺ]63?@B鐰ʹn:SN*L);`<6@~D1(瘩xASpB _*VRhCsZ0d& ϼ"*=IHpx =ǩqĬHb@"R2m !rp<8q(3#l<^meBǠpVCa `%4lĂ`k! "f0  =Jd AĈJ"s^_ s?DRHtɉ6{Ly@5܁q*cp]b"3ejQ14ZkBv qv1f!!5~Q2%L*;OmbY h. K` HD ǰ$b){m2A<yMn>d9p U'+?<ҕyA['F0y4 %0irn#̚Nҥ.ACRe I",R<c.!ҒBgi4XCB^Tvf߈ $C96*2qGw= vAv*g%)dӓb@%n ^LrՏ~U(/0S^xe|dǡ3;#,/1 vF0XquG-R%*}qY Vˀ[*V?{es"Ƥ*႔ uGIf2 "4Ɗ l6f .%$~u 8 c~  y( (XrskTytY,:ut $']), ;6@`1XH P (i (ω0`0 Ĝ:Ax9X2%QxT  #ߕ=iX8:*Ѹ0`ً}TU0ipX4Y!?E1@Z:( Ƀ ##oa  h~~1BV!)A  x  (`P0( ir )A~xgH݇Kqt j @ͭJ䢠j wHȿy *g (]6h xu i  (3NZ+P3T y%!qq|C=T0180ģ[J2( qp%$C8i般Abx浸18}kP jA`C͎7Q? Yț :(^8x0'2 "ƞp |}x],;‡܇w &f.f 䊚s(YXؔX)H пCpg(ˀ%0 jk5 (Ҍ) 4 h ,$‡3?(JJ@yͧld Vx30/Tp`S!KEtDxl <ʕu GX5=V !#rK@)0 p2R *̸ʍDX ɀ;h r2%A(B&$gFF! >+P~YX0!M*iEk&mP86s|%|D-@  4(Z (֍aYS5; K@I0bؠL0{@ډ Irqdȗ!b bX$9RjWDi Nx_3T`I~ aB̀Y1ECH~H o AJ¸Õ(Fx#i`[f0#*ir&fTUU=%=A͍*pV@_ QBQb$+ x樰``㕆̠鵊8oؠM wp` 1'$NK{ 5Xs xaA̼;08K,ˬX%^& 50/|i!0a] &40R 0  l-H@ ²?baĊjU^;7 tLE+ (ֈ()Eմ fq̍[P$!ZKAG88 F{Xҕwȹȩ Z(@Ef  29qzGDn  AP9ؘoӈ"Dx~P6X#X(yahAxo aI(^B #iRV-B K{PjYX8ҭ3޿5X,͑xx~ AIZ hRjNܘl "ѤFH.~%5*!,+ ;@cjfª1Rq @? 9jxmLi`ɵέ ?IXtT(XX飢0N= Ы<(BRYpBp1(ـЈ^{q*HX,U [∅\ W1'8gي;?\ ;fӝ˝؈  p=u+@k $hZK{) v R pC0*Jg҈fH:M)n^Uҋc͡ሂu4 +`8UT jHc, h"auN,@p=D˱EJnLC j&bCЬm&1/M(ٞr̨3jWp )'PHД08 ? (:qy U%H / Zh0lH n N` ͈|ch{OmVKAilX D У@ G) jЯ8CSد$4pR  }%6uPېV>$1[|v܎b˃ A7dh̸@p%X#NO5]bbip{E"p'x)n( 6~_̡ m x_0( B-l$h 8!, @?7 :͟܇k_@N6PV؇G#ĀO PfH}IV+"DxKe J*1"BS{PJNnT ?4hGcY{Y^6<0Uqh` ł*`P`u0{}o@Ty x(x; !^A N@Gx>CkuƟw @M^qA9(@$HT:'a 8:4ۜ4ծ7`0p a0,  VĿ"4XDv|<34E\i74nIv}/|Ipv4 8"G8  b/zΉю*ei:(3$)8v?Zvw"1# hټ^Cü{!:(`y1K*}i^h-,,S&34"F&(GH! 6b׵Ib ʵw1$ #@C}F"UR @*р~@H pF4j'g}j gv~)GZjy&jݟrj(#L] ?I8$AjHy!cݴ@&gWip$2"܇@+%d alpJ.vck.>{^ S5G"U %">/̭lB(Dl'#TjP#Jb}O4϶m\w6#A|(#@c4±  & zj,js/h|LI$oq8 ~*ͣVh;ݠ JYA Z8+Lj֪aRajn)JIƴ FjądrgNC9?4 :@<+<{CV\I> 2Ԛ"hE|7.y5O!*QȌ.3=H#HҶ2ņa t HG*1g#KVQhbF`{i(3F Z(0 ;v@yѐx!B%BvXf̒WwhiȐ>!SWD^;V6F0&Ca2E34ehNi&pRb7HDWFN0 ZE)a]nRM@-c.>e@ZI "1E11]>|dQ0g'jV L\v"(U8D@S\FE`R$ hhpLah%2'$~?Gj~ө"Orb~P"Kx@<f9"`8 1(F!KZ 8{uUFøS ^"%>~a*/ ܍ = IȈ-ltl"JRx#Xげ87PG&,%(_ Yt(pNxTI0cc8mbL@F@v9gLI"A4 edG!VF*Bg=GJ2A0CeJ8>Gwl> )J?!+@Epm]*@ )Wl6DQ^zN>rSdN(dC=kfHif{[}+'m|ڑvɒj]vEۡ8 _Mɭ˚e{'W!\TUVZg(>S QҳȢpMKv?(, hG#Q^#,I(ɺ& YZ`DŽuVlϓg,y?D/h`hA;c++Axc .Lpb|Ep10"ZsjA!'?i)L;c͡ O' MzOfԹ0^1/6^L _c1]= q'^1@ooooߘlߘlmptmifkoӌcpQZE^LdOiSjPjNjLjLiOjToUqUvWyX{X~X́_́_́_́_͂a͂a͂a΂a҂_҄]҄]҄]Ӆ^΀Z΀ZӅ^Ё^Ё^Ё^Ё^π]π]π]π]π]π]π]π]҂_҂_҂_҂b̀b́b_ˀa͂ćbˀa_̀^̀^ˀaˀbz^~dw^qZp\hTr\Ќsדvܘx~}trrrppppܘiۚiۚiۚiטfՖdܝkﴁϛ՝Ӛ~vDxNzXsX{^{^{^{^z]}_ǁdɄfҍrDŽoaXp24h-8c/=_0>_0@ooooߘlmrttmifkoӌcpQZD^IdNjPjNjLkJjLiOjToUqUvWyX{X~X́_́_́_́_͂a͂a͂a΂a҂_҄]҄]҄]Ӆ^΀Z΀ZӅ^Ё^Ё^Ё^Ё^~[~[~[~[~[~[~[~[π]π]π]π_̀b́b_ˀa͂ćb__̀^̀^ˀaˀb{_zazbpXp^jXr^ɄmדxܗztrrrppppۚiڛiڛiڛiۚiՔc֕dܟmȔԜۜΑףli;kI{a{^{^{^{^z]}_ǁdDŽk†rf\w;=[!+f->e->e/:e/:ߜoߜoߜoߜoޛmrwxtpkimoԋbqPZD^LdOiSjPjNjLjLiOjQmSqSvVxV{V~X́_́_́_́_΂a΂a΂a΂a҂_҂_҂_҂_ӄa\\ӄaҁ^ҁ^ҁ^ҁ^{X{X{X{X{[{[{[{[]]]]̀b̀b~_ˀábˀa_}]aaaˀb}^x\{boWm[iXsa˄mّxݗz袁vtttpppmۚiڛiۚiۚiۚiԐaӏ_טf분ӛڛטxFjEtT{^{^{^{^z]}błfąo\Pl87_)2i2@e-@e->e/:e/8ߞmpsvptwtoollolԉ\pJVAZM_PeSePeOfMfJiPiQmSqTvTxTzTyS~Z}\}\}\ЁaЁaЁaЁa^^^^π_Ёa҂bԂcقdրb~_{]}]vUwV^aa~_~_~^Ȁ_Ȁ_àcc}aaà^ˀ^ˀ^a~b~bb΁d{^tZpWp[m[s^iՌrڐty{xvvspmkkݚjݚjݚjݚjݚjݗhڔd֓c֗eȓ֜ٝڡ{vImHtTyZ}\}^ƆjhjaQe10Z&1])7a,;d0?d0?d0>d0>ߞlortsvtrooooolԋ[oHUAZN_SdUeSePeOeMhPiQmSqSvTxTzTyS}Z}\}\}\}\}\}\}\^~^~^~^օeԂcҀa}^ځdb~_{]{\wVzXЅcb{ay^x]}a~bc~ce~e{c~bà^ˀ^̀^a~b~b~bz^x\vZv[o[m[s^iՌrڐty{zzxspmkjߚjߚjߚjߚjޘiݗhەeבbהdyԜ֜ٞ֞ȌZf=mMtWzZ~^hˑyaOc-&Z&/[)7_-;b0>c1?c1?c1?c1?lortvtrpooooolԋ[oHUAZN_SdUeSePeOeMhPiQmSqSvTxTzTyS}Z}\}\}\}\}\}\}\\~\~\~\}[]Ղaׅcځb_~]}[wT}Z{WsPyZw\x^za{b{c{d}e}h}h{c~baaˀ^̀^a~b~b~bz^x\vZv[o[m[s^iՌrڐty{zzxspmkjߚjߚjߚjߚjەeەeڔdבbԐaכiǏۡڟ١򸅫k@hMmUwW{\ibNe0&_*,]*4_-;c1?e3Ac1?c1?c1?c1?lorttrpoooooolԋ[oHUAZN_SdUeSePeOeMhPiQmSqSvTxTzTyS}Z}\}\}\ЁaЁaЁaЁa\~\~\~\Ղaԁ_Ӏ^Ѐ]Մfҁècaaz[ˇfޟۡϖzĈmd{c}d}e}f}i}i{d~cbaˀaa~b~b~b~bЀdz^sWpUo[m[s^iՌrڐty{zzxspmkjߚjߚjߚjߚjבbבbבb֐aЍ]ٚh߬w͔֞Ԝ˕՚msZhSpUx]bNc/"^)+d1;_-:b0>e3Ai7Ec1?c1?c1?c1?qmpxsjݕeݕeloqsqo֍]qJVB[OaTeVhUhShQhOhPjSmSqSxVzV}V{U~[~]~]~]π_π_π_π_{[_{\օeҀaօe_}_ƀjԓLjt֚˓}ԟӟޭᶘ޷꿟䷘۫峖Ƒvzar[ɂlzdzdfdbb}aҁe{_ЀdЀdy]sWqVmZlZr]~hՌrۑvۑsՍlܔsܔsܔqܕl۔jޗkloߚjߚjݗhڔdٓcٓcבbבbՏ_̋Zқf￈ӛٟߨɚpQs\{fcQ_*!_-/b0=e2De3Ad2@h6Dk9Gc1?_-;_-;_-;pqsvoۑbՌ\ڐaloqsqo֍]qJT@XM^QcTfTfQfPfNhPjSmSqSxVzV}V{U~[~]~]~]π_π_π_π_ЄexZ}^~_̀baa҈oȈx͔xƑҟը׭ܴڴհȣԭҫܳ⹞꽡ܨpX~hzchfd~b{_Ѐdz^~b}aw[rVqVmZlZr]~hՌrۑvۑsՍlܔsܔsܔqܕlܕkݖjޘiߚiߚjݗhڔdבbבbבbבb֐a֐aЍ]Α_ףm͕՜ޤգ㭋w^^Oi3,\*-^,9_0Bc3Ff3Ed2@e3Ai7Ed2@a/=_-;_-;ptvqfςT}NӉZloqsqo֍]qJP=UI[N_PcPcNcMcJhPjSmSqSxVzV}V{U~[~]~]~]π_π_π_̀bc~d͆l͆lՎtzaψoҌvΑΕȓɕŖƜƞɡڱխ֯ݸԯܺ߾Ĩ͜w\x_{byby_y]~bx\{_y]sWpTpUlXkXq\}fՌrۑvۑsՍlܔsܔsܔqܕlݖlܕiڔdٓbݗhڔdבbבbבb֐a֐a֐aِbەeӔbɏ\踁Ӛܡ֫db,%X"+[(;\+E^0Db3Ff7Ge3Ad2@h6Df4Bc1?_-;_-;oxxmۍevNqD̂Slooqqo֌^rMO=SGXL]NbObMbLbLiSjSmSqTwXzV}V{W~]~_~]~]π_π_π]̀b̈́jדzϋrǂjǂjǂjw^‚jms}ďТɜөͣ׭ΤӫΩӱںݾ¤Ʃ忣rXv]t^s]xa}bw\{ax]rXpVoWlXkXq[~dՌpۓrۓpՍjܔsܔsܔqܕlݖl۔h֐aԎ]ڔdِbِb׏a׏a׏a׏a׏aڏbޖjړfȇXӜh˔ٞݪհs_d/1c1?X(A[+E^0Db4Di6Gf4Bd2@e3Ae3Ad2?a/;_-:wriޔkx]W=vJڐ^mspoolԉapQH9NEVJ^PcScPdNcNdPiUkVoWrUtVxVyW}a~by[yXzZ\΀Z𤂹pT{dt]x_{cw^ɆmĄkpƌzqvǕ{ϣǝɢͥԯݸܷ⽡׷ݽ޹޽¦ƪ}xbs^zdr\yc}fwar]p\l[hXeSmW΅iِpߗrߘoޗo׎pُqڑo۔kߘooܖfЋ[ۓcܓcܓcܓcۑbۑbۑbېc܎djkՋbՏ_rҜܳޱX(+Z+4V&4^0Bb3Fe8Gi9Ib/@_+=^,:b0>Z(4^,7i:DT%/xvkՌdcQO;qHԍZmqmlllԈboTH;NGVM]QcUcScPcNcQeUjVlUrWtWwXxZy]vZπb}^π_~[ySwSoTq[t]hx_ffLJoɉyȓvyƔȚ΢խٲ̦ܷݸߺܸ޹ợ߽Īǭɱ۸p[iUo[s_o[sao]l\jZhXdUmW΅iِmߘpߘlޗmِp֍oՍlԌfՎeݖlܕi֎_ܑdܓcܓcܓcۑbۑbۑbݐcݎdߎhjݍfܑd֕fŚ趛V&&Z,9a3@[-:h:Gf9Fc6B^/=^,:f4Bf3E^,:^,9m;F\+0O"wtݕitSP?L8oGԌ\mqmlllԈboTH;NGVM]QcUcScPcNbPcSiUkTrWtWwXyWwX~_y[πbzZzWևdvTx]q[t]w_yazbŅkŅlƇsm~k‹wȓ̛y–Ц޷Ωٳ޹ܷݻ۹ݾھůܽƱdOePaNkZm^l]j[iZh[dUmW΅iِmߘpߘlޗmڑoՌmφhˁc^Սjݖmܓjܑdܑdܑdܑdېcېcېcېcݐcݎbjkjݜtː{h4,_18X+8\/;b4Ah:Ge8E^1>X+8h9E_1=_0Bj7Jm;Im:BP_Wjj΅]eGP?XGpN׏apqmlllԈboTH;NGVM]QcUcScPcNbPbQfSjSrWtWwXyW^{]{]xW}\یkmMoPoVq[~fw_w^Łi}cȈpĂpˋzƉxsȐ}Ɠ~ē}ĕzܲڲֱߺٷ߾ڹįھ׻׻ֺ͹տ]IfVk]j\hZl^i[dUmW΅iِmߘpߘlޗkۓmԌkˁe{bt[φjݕrpܑfܑfܑfܑfېeېeېeېcېc܏bݏeݓjߘp֖zv;6_,4T%1_2?a3@i;Ha3@_2?^1>^1=b7?f9Ef8Jd3HwBQX#)LDҝqڑetSM4WHTBtVڐhmpmlokЅ^jOL?QJZPaUdV^N^LdOdSeUiUmVqVrUxZ]~]{[zZzZ^πblNkNs[t^r[w_zb}d}c~e{fǂq{ior՝Ȕ}͚x٬ḟӫߺԲ¨ԸγжɷҿҿҿҽӺ溤[HbQbTbSfV_QaQoX̂f׏lޗoߘlޗkޗmߗt́keSUFiT֍qޔrߔmܑiܑiܑiܑiܑiܑiܑfޔilmۑlܖyQBj08k6J\,=\/;d7Dd7D\/;]0=]0=h=GT,3X1:b3FyI\q=Jl79ŎݨiɀW]?Q>VJTEsXڐkopmlokЅ^jOL?QJZPaUfXdTdQfQdSeUiUmVrWrUtVxV}ZzWzW^ՆhfHlNkNt\t^}epXzbrZv\fȂlƀlƂm}hʼnrɐx̔{Ƒx˚ը転֯⽤ڹپ϶̶ȷ˺ϿϿпҽ~j[JiZfZ_Q]O^OlVɀd׏lޗoߘlޘiޗkߗŕldW;3TG~hܑrߔpݓjܑiܑiܑiܑiܑiܑiۑi׎eޕlwij*+c*:W$9\,=d7D\/;d7D\/;\/;i;H\1=]7A^8BpDSm>L}IO~y̓ɐx֎_kDS:VGVJTEs[ڏmopmlokЅ^jOL?QJZPaUdVfVfTdOdSeUiUmVrWsVvWxT}V{UzWπ_lNoPmQrWpWr\oW~f~ew^~d͉q̆pҌv}eŅlԕ}ˑwК~ɕyœvצ׫Ԭݻƨ˳оϿɻķ˾̾ξϻӺֽ׿ȏiV[LWLZOWL[LhQ}a׏lޗoߘlޘiޘiߗŕlc[z-)=7o\Ӈlߔpߔmܐjܐjܐjܐjܐjۑjڑl׏jޖq·ms,-j*9d,=]->d7D\/;d7D\/;\/;i;H\/;\0?a;JfAPlDOQU{̕ɏ}ʼnrzSU6^J^SVJTBs[ڏmopmlqkЅ^kMM?QJ[PaU^PdTdQ^IdSeUiUmVrWsVvWyU{U{U^vWqSrVoUjSv_r]s]lVs]xafDŽlӍwӍw͉rˋrӔ{ˏvȏtɑy˘~٫۲Φ{ȰͶͶȶλξ˺ɹɹ̹͹ٿӹxO?TGVLVLXJePx_َoߖolޘiޘiߗŕkc[y00y21\Qyc܏qmߑkސjސjސjސjܐlܔq{ߛ~H:a,h+Bd0?h8Fe6Fe6D]-;\,:j:H^/=^/?]0?[2@mFOW[xsҜkԘ[E[FZMZNVI[HqUӋelopqsk҇^mNSALDUJaTbTaQbOaMcQfUjVoVtZvWvVvQVsM}_tZpSoQpUt]r^kXvc}jk{fydlόwҎy̌sАwƈm͎vΓ{Ǐy˚ܳĝͨư˶ư˶˷dzİκɶȴ̷Խ׿տųk\QFPI^W^Sye݌pqmlqv҅hiVm/+_&(r76e\Єilkj݋fߍikqޓq㜂thd+,X$3_,@b2@k;Ii9La-?\*7i7Do=I\):f3Hk8Lp=EMN{Ƒȕs˔tݨ[J[MZNZNWI\FrUӋelorstm҇^mNQ@NEWM_SeWdUdSdPcQfUjVoVtZvWvVwQyP׌ev[iQrWpSqVpXwcwd}jvcƀl̈sjdžq΍xˉtАxȉqɋrhȍv̔{͟k߸ª¬ȳ¯DzȳȲDZư¬̶к͸ҽӽӿҿпɛwj{F?IBVJxeދpqmlrxԅfjTv;6]+/a+1NLxb܈jpm݋fߎhjo{ٕh-(^+3\,=X*=i;Hh8Ff3Ga-Aa/;h6@b0=_-;c0Eb-?w@BpjčȓƑx͚{Ҟ{ӡz[J[MZNZNWI\FrUӋelorstm҇^mNO>PGZO]PeWdUdSdPcQfUjVoVtZvWvVwQxO}VdIbJqVsVrWmVt^mXt^s]ƀjόtˋrĄkɉqӓzLjr„mlpċpk•yܳ⺢īᾨįݾ­ȳ˴̶ͷӽɳůɶнκκϽm=4A8_Szf݌pqmlrxԅfjT~D>\*-T$o32WG{a܏qޓoَeېeݔdߖmڗyQA_(%b/7^/=f9H]0;h9Ec0Aa-?f4Bc1>a/9c1>_-;c0:b]ŎĎ~v˖zբ֣Λx[J[MZNZNWI\FrUӋelorstm҇^mNN=SI[P\ObTaQaOaMcQfUjVoVtZvWvVwQxQjOlUpUrUrWpXmWvaȁkxb}fȅmӓzzaˋqΎv̍w}ikx_w[֤龡㺟۳ײݺںۿDz̶ϹӽDZ̶ͷ̸Ͻͺ˸˸ҿȞt>2L>t_܌pqmlrxԅfjTz@:a/2](-["#s6+hU‚jΎrϐmҔkԗj֚s{f]%]&)d1;e7Ba3@d8@a3?\,=e2Dj8F]+8k9Df6=\+2p>?ȓ͗wrԟբԡ~Ҟ{WGZL[O]QXJWAmPԌfjmrspoԉajJJ9QHWM\ObTaQaOaMiWjXkWoVoTxZmNpJf@eJfOw\oQtZiNw^xb{dǀiǂjˇǒrƆlȅl͍tąo{fs]d嶗㶗ݴṡ޹ԱܻİDzDzůȲкDZɳɳdzɸ̺λͺϽ͑dUM;s]։lpllrs҂dfPw=7^,0c-3f48P!lA7乪ϻϷ߸Ϊȝd3+^,0b/7b/9j;Ge9Ad:?h=Ec3A_,>c1?m;Hf6=^-2k;;̗tsӞӟӟӟ}ӟ}WGZL[O]QXJWAmPԌfjmrspoԉajJH7OFUJXL^P]N]L]IcQeTfSjQmSrTiIЇbvlFhMkToT}_lQw\v]mTɂieЌq}aƆjĄh͉q~ev_yaΚᰕݲ޷ٰܳīֱį¯Dz̶Ȳ̶ůů̸ȸȸɸͺϽн±O=t\Ջlpllrs҂dfPv;6]+/X#)],0S/+ԷлκN(([-9[)6f4Ad2=i=Be?@_6:a2>b0>e3Ak9FX(/a11yrǗĐyďsΛ}֣ӟӟӟ}ӟ}WGZL[O]QXJWAmPԌfjmrspoԉajJG6OFUJZM_Q^O^M^JbPdSeQiPtZlNiI{e?mSoWqVy\rWv[y^z^y\ǁdƁdmOΏpˋoxavaoUݦڨ㶗Υ۴޶Ϧٱ޹ܹۺۻھįȲưվů̶̶űǷȸȸɸϽнӽҿP=mUԋlpllrs҂dfPl2,W%)](-acŶƷV6>O(9\/>a/=i7A^26[46b;=]/8e3Ai7Eh6B\+2caǚ}rНz֣ӟ}ӟ}ӟ}ӟӟWEZI\N^PWHV@lNՌdhmrspoԉajJL:QGZL^PcTcQcOcOeQhTjTkSv[sUiFǞ׎ee?hMiQoTvXfLiNdφjvX{^y\Džf_dpXjQݢ氓㱓ըլܶԬݶҬά¬޾ۻ׽ڿDzȳDZDZɳƳǷǷɸλнҽҽcJЍlpllrޖs̈́eiPc-$O""ƘĨпצP)=^2D_0>a2;_39\49\49[,6i4Bl8Gf3>vDE‘Ǘƕ}˚x٥פϜyӟ}ӟ}ӟӟfNaJfTbO[GW=iHԆ\iostvq֌cpPL;QG[N\NdUcSdPePcMfPkSoVrZlMkDŚ֎bf@iNfOqVmPoTy^τiclOȂeˆiɇiLjiz[tX㣇⦌ܣס٦͜ݱ۳ҬڸЭղүֶǦ߿ȳͷŭ̴«ȴų˸˸̸̺Ӿϣŋj۔kktޚsƇebbH_4%ߺɫȻ˷˷̸͹ӿвT(9_2A_2A^1>_2?^3?^1=f3;l6?a*6c-3qiϝɗɖբ٢՞ԝ~Ӝ}Ӝ}Ӝ}Ӝ}fLaIfQaM]HX=jH׈^iostvq֌cpPN>OEXM]PfWeUfTiTcMfPjSmVs]rUŇ\ĕ̅XhAkPjSoTz]}bsXw\ˁey\z]̇jƄesT_ܝ~ӓw՗}Е{ᨏۣ᫗ݯҪ޸Ψܶҫ۴ױܶ߹侩ܹٸȯǰıɹɹ˹̹̹ͻɻɹк˲鲓ԑjqlܛvɑpxZŘϯӹɹɷɷ˸ͺҿ͍bjW*9a3B_2A_2A_2A_2Aa1?i2;f/6X!*JMɕɖƑЛ٢՞ԝ~՞Ӝ}Ӝ}Ӝ}Ӝ}fLaIfQaMaL\@mLیbiostvq֌cpPP@MBUI_SdUcSdQiTcMfPjSmVr\kN쯄}PiBlQjSsXpSsXsXtZ~bƀcz]ǂeiJ„dݞݞϏsɌqɎtۢ㫕ީ߯ԫԬ۳ݶڲˣԬ߸߸ܴ⽤ῥ߿ŪƪɱįܿŲƲƲƲǴ´Ʒ°ȰɫӖrxۖmӚv̛yΰȭ߽±ɹɷɷ˸ͺҿ]2:_2Ad7Fa3B_2A_2A_2Aa1?m7@d,2c+1{yМő~͚ԟ՞ԝ~՞՞Ӝ}Ӝ}Ӝ}Ӝ}fLaIfQaMcN^BpNݎdiostvq֌cpPQALATHaT^O^N_MdOcMfPjSmVpZ]@̡x~QkEpUeNdIoQoT^Dz_x\tWǁdvXӐrטyԕv̍m֖z{a᥌מ֞尜ӢӦԫ޶ḟɡ޶ԫׯ꾦ٰ⺢⽣׶ۻͯҳٹۻԸپپֿտĴȺϴܹ¦ߩԗs֝x̬߷ԯ˳ιŲ˺˸ɷɷ˸ͺоM"*a3Be8Gb4D_2A_2A^1@a2>q;Ah13]]Ǒɕɖ٥ҝԝ՞՞՞Ӝ}Ӝ}Ӝ}Ӝ}hMfOjUcOePbFpN܍ckptwzvېhtUM=QG\P^QbSaPaNbMbLcMdMfOfP^A˟v۔hrLpUiQfLqTpUjO}bɀd˅hvXדvԑs֗x̍mߡc֘~ڞܣӛ͗צ߲٬˞ӦᴛԨۯޱڬ䷝թݴ߹ЫЯ޿߿ֶ߿ݾٽ׻Թ־׿ӶڹݶŨ淗ť޷޺¥ͱǯDZDzŰ˸ȶǴооJ(_2Ad7Fc6E]0?T&6_2Ad6Ao9?LLƐȓɕҞգҞ՞՞՞՞қ{қ{қ{қ{hMeN[FiUePbFpN܍ckptwzvېhtUM=QG\P^QbSaPaNbMbLcMdMfOkUcF̡}۔h҆_ЄiiQfLjM{afL̀ew[bǁdҍpɇiΏpڛ{ąeϏs֘~ΓyӚڢӝ㰘۪٨֥ܫޭצ߯߯ܫ߲گݴ۴۷ڴߺ⻦ٲݺ޾ٺָӷϲͯմ״̱ٳɭĥͱαũȬǯȯ˳˶ɷǴպоS(0^1@b4Dc6EX+:oAPd7Fj;Gm8>rp̗͗͘ӟӡҞ~՞՞՞՞қ{қ{қ{қ{aFaIjUZFePbFpN܍ckptwzvېhtUM=QG\P^QbSaPaNbMbLcMdMfOlVcFƛ﯀ޗkݑkێslUhMqTiNsX{atXǁd̆iԏr͋l֗x_ғsӓwٛeǎvݥީԡr䲕ⰓԢץ߭٦۩ڨެ֦٫㸘֯կ߹ԬṢֱڸڹԳұٷ̩ǥͽܽڻȬƪβƩũβȬȬȬȯȳλжͺǴcB8Z/7^1@_2Ab4DS%4T&6e8G]/:INĎМ̘ҝբП~ӟ}՞՞՞՞қ{қ{қ{қ{bI_H[H_LePbFpL܍akprtysېhtUM=QG]P_QbSaPbNbMbLcJdMfOiP_@}oېhٌmsXx]^DeJw\qVz^ЋmȂeƁdՓt{\Ӕt٘}ח~͏tҖ}ԛōtաȕ~峖ᯐӡ٦֤٦߭ӡڦΝ{ܪҢҤ۰ᶖ޶⹡Ԫڰݶհճճϯͫ۸ҲٽĬȱηȱ˱ȯȯȬǯ͹ڸĤȩ۾M+)Z/7^/=a1Ab2B^/=^0;]/8wFIzv̕ɔ̗ԞԟҞ~ӡz՟}՞՞՞қ{қ{қ{қ{aJ_M_M^M[DaDrLى\ostvtwݔlqSN=MBZL_QaQaOaMbLaGbIcLeNbIiHtߚfkۏìbjOdMhMjOЅjԋo͇j̆iΉl€bԕvґvϏw΍xڛЕ~ۢϗs٦٦ΜܪӡץԢΜץΝw͜xΜݪܪڨޭ۬ⴢݰϢөӪկƟ̨ƴںַ­įįįįۿƱȳɲ˳ɲ˳̷ɸŗөlճԳI#0]0;b0:d2@b0>d2?d38{LGj\ɖϗӜ՞ԝӜӜ}ӝzԝ~ԝ~ԝ~ԝ~Ӝ}Ӝ}Ӝ}Ӝ}aM_M^O^M]FcFtLی^ostvtwܕlrUQ@QF]OcUbQbOaMbLcIbIcLdM[BȂbtߛa֍XІXӇay\dMeJݐsՉoЇk̆i˅hǂeԑsБrˋoҐ{ɈvϐzԘː{Ζڥӡӟȕ~ԡΛ֣٥٥œv˚xکΜ⯚Ҟު⯛֤٫Ҥ֩ƛšɣ㽫ӯ׸­ŰįįįįƱȳȳDzȳϺϻɜ٦sҨQ,=X1Ea2>e2:d0?b-=i6@j89yI>s˖zϘyӜ}՞ԝ~Ӝ}Ӝ}Ӝ}ԝ~ԝ~ԝ~ԝ~Ӝ}Ӝ}Ӝ}Ӝ}aM_M^O^MaIfIxOޏbostvtwܕlrUL:L@WI]ObQbOaMbLeLdLbJaIU=ٓrsޛXאO֎Uܑd̀^eHՈjԇiІh΅iɄfbۖy~_ғsɉmŅlӑ}Б~̏{͓ן̘͗˘֤đxyh_N̚ȖҞԟ֢ҝۥԞΗϜըڰǝš⻩߽۸޾ƲƱۿҶįįįįɳ˳ȲȲ­ϺлƱțǕ˜sbϨQ,;X1Bb3=d19b-=f2Ai6@h67_T͜˖zϘyӜ}՞Ӝ}Ӝ}Ӝ}Ӝ}ԝ~ԝ~ԝ~ԝ~Ӝ}Ӝ}Ӝ}Ӝ}aM_M^O^McLiLzQdostvtwܕlrUP?PE\NbTbQbOaMbLhNdLaI^GS:֐ppݛQZch҆_mO~_~_υf̈́hbȂeՐsЎpΏpĄhLJo͌wƇsϓΔӚUHrphZTmhic‘^X~Ν֥yեܬ~xf81ěz°ֳ׷ɴį׻ٽįįįįįɳɲȲDz̸̹۲{[EiV}˶J&2O)6_1:b/7d0?r>Md1;d23vΝ˖zϘyӜ}՞Ӝ}Ӝ}Ӝ}Ӝ}ԝ~ԝ~ԝ~ԝ~Ӝ}Ӝ}Ӝ}Ӝ}dPcPbSbPcLkN{SޏbmrttvxݖmsVSAJ?TF^P_ObOcOeOcIbIaIaIV>~]ŽxhZޗVfޓovXx]y^x]~bȂeȂe͈kȆhbɉmŅlńqˋz͐Γph}orch\axGLПП~mGQbets_^a==mHNddZ6)ŞẨɦֶݾƱĭŰ­ƱƱƱƱɴҽ̷ıɹĴС_NZBfNp⶯S-3M)2V0:^07X%-f2A^*9X%0bcĔ̛Κ~ԝ~֟֟ԝ~ԝ~ԝ~ԝ~қ{қ{қ{қ{КzКzКzКzdPcPbSbPcLkN{SޏbmrttvxݖmsVSANBWI^P_ObOcOeOcIbIaIaIW?iHzkZّSjwXmXq]{fv]ˁeωl˅h͈kΌmƇhȈlϏwƅrАȋ~d]ʼnxvsxp}vhxcspZjzNaa:ScBTrS_V7AJ+6U6BP04{ƣ˨ȳưĭھƱƱƱƱ̸˸Ͼ龯{oWMbXbT\@rW߰UZT-7W3;[6;_18_,4k7F^*9a-8̜Ŕ~ϛ՞֟֟ԝ~ԝ~ԝ~ԝ~қ{қ{қ{қ{КzКzКzКzdPcPbSbPcLkN{SޏbmrttvxݖmsVSASG\N^P_ObOcOeOcIbIaIaI[BX8ƑƄr]ӋQmًswktkh\yc҈lҌoǁdŀcΌmƇheĄjɈsƆwqfňorxpvF_j:Tm>WQkVpXra{kE^c[7S\vZ7N=,G%1ͭ׶ɶDzֻֻƱƱƱűνpbUIZQTNVQh\̓w·^11S(0b;F\9>Z48a37i6>t@O^*9VaȖĔ͜ҝ֟֟՞ԝ~ԝ~ԝ~ԝ~қ{қ{қ{қ{КzКzКzКzdPcPcPbPcLkN{UޏcmrttswޕlrTSAVH^P^P_ObOcOeOcIcIaIaI\DU2ӟɍjҌXڐkxbԅy\Uf[ȁkЌq͈my\y[ˈj„dy]Ӕ{̏~rdysyXcvBTwH^l?Zc6PqD^a{~Pke8Sc}Ut[}Z2QrH#3eAJղ}xұ޿ϰӳھھپٿھưƱųijk]xjaP^NUGi]ޓ֑谚X*#a37d7B^6A^9?X16_/6p=E{HS^+6{Ŕ˚Ӟ֟֟՞ԝ~ԝ~ԝ~ԝ~қ~қ~қ~қ~К}К}К}К}lVjTfTdPfQjNxTޏelrstvsݓevQN;NBSE[MaQcPcNbLeLeLcNcLaF\:s˔s֓oz^q]qaێ}όtƆlrX{_ƆjŅixZˍrΔǑxpZck=Oj\2Ia7LW-Bb8MmWl\2GS)>}ToV~T)PI@_qkHAٷv²޾ٸմ׷նַںܾݿ۽۾Ĥַ]Tf[}Őyˑvߥ嫋߬ݬ뺲_00c69c4;j;Ec6Ab6>]/8_,7s=F_*0LJ̘Ɣx͝פפפפբբբբМММММΚ~̗{˖zmUjTfTdPdOiMwU܍clrstvsߓdvOP=I>WJWJaQcPcNbLeNdNcNcLcGb@b9ƛ˚}ۚtӍmjQwb̀l̈qiP}dɌqe~dɉpmWQBojpBFk?NwNeb;UT-GoG[Z2DlEV}UfZ2DiASizfQ&N[F:akȦkۺ«ٸֶ׷׷մմ׷ڹܻܽȤǣӳwVAoLBtrvԟަݦҟx⸑濦b62Z+4a2;i:Dk=Ff8Ab3=a/9c/=o8Dk6:eaɗǖȘzԢפפפפբբբբМММММΚ̗~˖}mUjTfTdPbMfJtSڋalrstvsߓdvOP=I>WJWJaQcPcNbLeOdOcLcIdJ[@Z>έ˞謀ߞycDԈpЂm̀liPȈpĄkkj~j͐}Ȏ}v?6fcQUyJTewtLcQ+EvW0DP):^7HW0AT,>[lXjyPj{PvS)Llwǭ©մ׷ֶԳұӲմٸĩ߿\kI,sP=sktmwhďxڡߨ㰑e=+W**P"+_1:c4>j;Ef8Ab3=a/9i4Bk4@xBGɘԤץפפפפբբբբМММММΚ~̗{˖zmUjTfTdPaLdHrPى_lrstvsߓdvOM9NBQEZMaQcPcNbMdQdOcLcIeLhPaL[@Τ魁쫆sT̀hՇrtazdȄkŁllZ}lƋ}wj{rbb^dq>HWea4Ga8OjD]b{F2b:L^7H]6G\4F]6Gf?P^6MytzTawv׶׷߿׷׷Գаϯұմ۸۶ЩЪ\@we_Xlk~zvl͗ᦑﴟ췣a3$V,$X+/^09f8Ah9Bj;Ee7@b3=_-8e1?w@L\ay͜ڪץפפפפբբբբНММММΚ~̗{˖zmUpZlZeQcN^BlJ׈^lsvwxvfxQO;G;OB]PiZcPaLcNbOdOeNfMmTmVdO\Aꯅژsωjs[r]r_ρl}fvc{myskkfVXN[Sebwm=Qc6NP(A]wmG_h@TV/@\4Ff?P~Vh_q_qXlvwswŢ۹ڹֶմϯϯϯϯϯӲֶݺ廥軤꿟轝kdTkfUXff~Η𴩑VJa)#\,,d8;h9@f8Ah9Bh9Bc4>c4>b3=a/9e1?v?Jrwxsx͜רգբբբբբբբբӟӟӟӟНΛ}̘z˗ylTmWjWcO_JZ>hFԅ[lsvwxvfxQL8J?TGZMbSaN_J_IcMdOeNfMqWtZlPeEȍaΟŘ쫆z[{cjUvbxbo[τtǁwkd}qtzGQr:Op7SWso>Wa3N^6OmGad}zSfS+=W0AW0AV/@T,>b:LatZqtɨܺ׷ӲέϯϯϯϯӲֶۺ㽨뿩ɘm^UQilUW~{ČNjIG_&*]+8b4Df8Df8Af8Ae7@c4>b3=b3=d2=h3AXd{zvΝӣӡբբբբբբբբӟӟӟӟН}Λz̘x˗wjQkUhUaM_JZ>hFԅ[lsvwxvfxQL8J?TGZM\MbOcNaJcLdNePfOqUwUrIlAƌ[˜ҥZqQkSzelXfQ܉v̀q{sfdJPe3>wGWf-I]#Dv?^yGe^{P(BhAZxQhp]6Gc;MQ*;M%7O(9izwOaԲϯݻֶͬŤϯϯϯϯٸܻ­į­ĦĦ٥tfr;9d/3TVrrxv֘w8@]"2a,Ea2He6Df8Af8Ae7@c4>b3=b3=d2=k7EtȖПϟҟբբբբբբբբӟӟ}ӟ}ӟ}НzΛx̘v˗thQjTfT_LcN^BmJֈamsvwxvfwTP;G;OD^P\MeSiTdNcIdLeNfOlPsQoFk>m@΢iDaGr^r^p\ڈvrdvl}xfhd19^kS$8Z%B_*Ic1OSpoA\e=V[q_9OtH[wJ\S&6H)wjrĜƟӱ­޽ճȨӭԬӭӭợƬƯƱŰūū鱛sdLFl34UZyHMϖh-6Z!1b-H\,Ff7Ef8Ae7@d6?c4>_1:b3=d3:xFIɗ͜ΞСԢբբբբբբբӟӟ}ӟ}ӟ}Н}Λz̘x˗weSeSeSdP]H\BdD҆_mtwwwwlvTP>PFXL^PaPiVjWfSdOeNaIlSw[qPwSqIhEЬ񳈿~X~mf]iZͅt~sNGJIIJWa^/=UfP&;i;Qk>T^4I]3Hf=Q^7J}Uid:Odzb/DV#4W%0oo~wӤөЪ߿նӳͯɤ˚գᰕ躞꿢¥ǩȭɰȰǰǰNjyXIVc06U^̛̚p>Ab18m>N^/Al>Ih9Bd6?b3=^09_1:i:D\+/k_{lΝ˚˚Ǘyŕwɚ{͛~Оӡӡӡӡӡ֣ԡ~Ҟ~Ϝ{Ϝ~Κ~̗{ɕ{dUdUdSdP]H]BdF҆bpvwwwyotVQ@QFZL^QcUfWhVfSbNbJfMӂipTqSwVvUfIِp󶍿}\pdli}ỏ{ąlmTWm7@U#0qDSmDVO(;b:LiASiAST,>sL]^7HhyVlV"=m8NE_^ϡϡ׭ϬȦᾳ׳ԭͨ˞֞ޥ豕빜Ʀȫɰ˱ɱȱۜfTi+"]&0Vb˝i;;sFIl>Ic3Al>Ii:Dd6?a2;W)2e7@i:Df77jol̜~С͝˛}ȘzǗyȘzɚ{˛}˛}˛}˛}˛}ҟҞНϜ~Κ~ϛΚ̗~dUdUdSdP]H]BdF҆bpvwwwyotVQ@QFZL^QfXfWeThTjVfOeL}ctXy[yX~\{]sVġdla~yȁw{rfh~HNc08S_T$2U(7hzi?QiAS]6GjBTV/@a9JZ2DT,>oAWW#>ctf43~~hզݭ޳ٷ˨濳ҨӢО՞ᨍ䫐鲖긛Ʀȫɰ˱ɱȱį묘o\{>4X"+Z+7UXҤTTW*-m?Jo?Ml>Ii:Dd6?^09]/8d6?\-7XX~jŕwϟӣҢϟ͝˛}ɚ{ȘzǗyŕwŕwŕwŕwɗ}˘~͛̚~̚}͛}Μ~͛}dUdUdSdP]H]BdF҆bpvwwwyotVQ@QFZL^QeWeVeTjVcOhPhNpVqUvWlLqOhJՕ{‰mv^xlЇŁzljtAITbQ"0m@OzM\d8IZ-?j@SwOaO(9c;Ma9Jd=NP):rJ\ZlL-^iԤhըŗ{٩޲԰ݴզ̘ԛݟᣄ謑鰕곗鷚ƦȫɰͳȰ˳įﰜxeXOf09O!,{NQתsFFa37c4@j:Hl>Ii:Dd6?_1:h9B_1:\-7qq”i͝СԤӣҢϟҢϟ̜~ɚ{ŕwŕwŕwŔyző}ǔ}ɗ}˘{̚{͛}Μ~aQaQaOaMeP\AeG҆bsxxvxzpvWSASG[M_Sj\hXeTiUiUiQjPmTtXπbxẂb~cfOЛpȂxƀyjflqe9HsL_M%9\oT*=T(9mASrIZb:LN&8V/@o\4FkDUd=NM!2W%2bOޱԨըԤⲭ޶ڰګŐޢ⢉梇릌ﱖ嬑㬐峖꺜뾟£ĦǭδǯȱƱmVM^(1[,8}OSڬZZc69pAMp@Nl>Ih9Bc4>a2;_1:f8AsENpĔvСΞ͝ҢССԤӣС͝ɚ{ǗyĔv‘wt{đ~zxēxƖxǗycTcTcQcObMaF_AԈdsxxvxzpvWSASG[M_SeWcTaOdP_LcLiOoUw[qSyXߕvޞ^$\*wj̋xqwv_-8lF\B#>];TqM%9e;Na4DrFU\3DS+=b:L^7HM%7f?P]oS(3orbZ쾨ϣ幘țΞ淫ᯝUEo]vcɄpᖁ뤍뫓벗춚䲕鹛꽞뿥˱ŬDz𱝲q^s6,\%/M*\_ۭkkl?Ba2>h8Fk=Hh9Bc4>b3=b3=a2;Zcrɚ{Ң͝ΞϟϟϟҢҢС͝˛}ɚ{ɚ{ǖ{}Ŗ~xzytseVeVeTeQ_J^D]?҆bsxxvxzpvWSASG[M_SeWcTaOdPeQhPoUt[rVsU~]ꢁv[s>*a0(‡{^UWXf9FN4Ty\xqQ+Ad:Mk?Nf:I\3DI"3Q*;izwOactZ2DmBMyԥڬ帜㶚Ӥ쾫͔{͎vחՔvdPB?1ZLϐz歓气Ⱃ淘躜꿟⶜˱屚}h\HH6B9\%/^0;wIMۭ^14wHTj:Hh9Eh9Bc4>a2;a2;_1:ztСԤΞΞϟϟϟΞСϟ͝˛}˛}˛}ɘ~țȜė{yxsrfWfWhUfU_LU>aD́_sxxxzzmvWP>QDXL^Pk[jWfUjUjOfMkTkQsU҂_y֎kϐxcV[&#~^[ZZb0:l_B^pVvP2QM&=xNa_2Ac6ExNaP&;Q(=U+@_rc:HO(1ǝr֨㷟㷡שᲟ񽬰wehґxƇqqᡔΎmdWIcLLJkڞ᪍㱔嶗庛꾦ݯxdaMo]o]zj_Wj7?Z+7{NQǚ}}Z,0l>Im>Nl=Jh8Fc3A_1=k9DwFMzyӡ֤ΜΜООϟ͝ΞΞ͝˛}˛}˛}˚Ƙ}˝͞ȚyxyycPcPcSbS\IS?ZDӈjrx{~ykyXO:OAWG]JiUhTdPiOiGb@jUze΂aՋblt裔Ӕz~j7?^,9UfqJa^ypPmfB!;XrS)>ViP!1^/AqU(@Q$?U(@O#4mBJtmqcⴤڬ仪֩泦LE\T\OE7vA4e2*p;7d/({qĂrɀf˂bԐpߟᨌ뷛«꽬•k]o?1k8+s@3xE8{GBj8BX*6rEHzzl?Bc4@m>Nd6H],A],Ah4FX%0SU}lɕ{ԡН͚{Λ}Λ}Λ}͛}͜͜͜͝ȗ}ȗ}ȗ}ȗ}Ν˚ǖœɗĐbNbNaPaPXIPAVEЅjrx}ykyVN8N>VD[IaM^J\F_Fb@^@dQ鞉zّhrڕx}vq28~DN\(7XkxQjxaa~B:Xrc9Nbv[+>T!4S"7kQ">T$>W*9X-/濨Ԫ۱鿭ⴥ߬SJB={83q3)q7,j93OMmkb1+b(VD҇iЁaЈh֑t꬏︜껦tic2,],&PJj93h71j93i99b3?W)4zMPxJNk=Hl=Ob3G_/Fb-Ff1F^(3jkˑpΛ}Ҟ~ΛzΛzΛzΛzΛzΛ}Μ͜͜͜ȗ}ȗ}ȗ}ȗ}˚ȗœy_L_L^N^NVGN?TB΂hrx}ykyVN8N>VD[IaM^J\FaIlUZEŀo΍jώkۗbVFP\%3{L\k>TXrJ(FoOodqI%A]4Nd:Od6IZ*=Q2_/Db3I]/Eb3F\08}lϨ俦⸢ȷ걢QGQHq0(o1&G:QF^)"m=8ߪz?3N=ςe~]ͅdӎqߢͱж}p;7j47s>@MOv@Bd/1j7=c1>U&2W[koh9EqAQ^0Bc2Ge2Gc/@l6?ƍ~˓zԡН}͚yϜ{ΛzΛzΛzΛ}Μ͜͜͜ȗ}ȗ}ȗ}ȗǖœ~{~y{]I]I\L\LTEL=Q@̀erx}ykyVN8N>VD[IjVhTeOjVbSQEy;/VEݢ謓֗j+1k3=_+:Paf8LqG^_9Sa>\cDc_}rO+GX0IN$9[,@{L^c0DZ)>_1E\-@X+7\12VN۲{ٳɰiX~qbUM@}?2vfv8+SIpiƿ¹v˅qvXwVΆeڕx橌ϳ˰hVidad[^swϖ{BFp7:i18a/;U&2_cŗadWch8H\/>e6Fh4Fa,:NSv͖zҞΛzΛzϜ{ΛzΛzΛzΛ}Μ͜͜͜ȗ}ȗ}ȗ}ȗœ~zz}~qxɖiUdP\LXHQBO@M;́fߘov}{m{XWAWG_MdSmZr^kUJ9w9/ZS{䯨賣d,6_(:Z*=yM_dzd:Qc=VxTpvSqbaA^_;WQ)BX/D[,@e6Hr?Sc2Gf8JU)1i>=Ěyƞڲ迢꺜lUta΂s֋{~o_Oq_ƅt̐⫢ƽҐw_a҂b҉iӎq⤇ֺ_Lŋ}}Ň䦦ȋBBBBw>Ab-;c4@VZ^^˝VZZeZ*:\/>b2@j8Fh4?fi~rסΛz̘x͚y͚y˗w˗w˗w˗yȖyǖ{ǖ{ǖ{ȗ}ƕz‘wvvwqjŔ~ҡޭ崜lXhT_O\LUFSDP?Ѕjߘov}{m{XWAWG_MdSmZiUm#l_ΞӢmmo>B[(={Xsd>VZ3MN(AzVryUqZ7Ueqqc?[J";V,A\-A\,?f3Ge4I^1@HZQjXṢ佥ī뻝lOz_˅o҇rٌzې~{i˄mȅpzmzt۝褏֍s҂dӄcЈhΉl쯑˯ȭפˏw}taX>6>6PHs74a-8e7BTWTTޱzMPZe_0@e8Ec4@]+8s@Hwv{Ǝv͚֟y̘x͚y̘x˗w˗w˗w˗yȖyǖ{ǖ{ǖ{ƕz‘wsqhhsեܬ㴏껔쾕iUdP]MXHQBO@M;́fߘov}{m{XWAWG_MfUhT^Jۈrړ}~ˢvIXpBXTe\0Bc4QT*Ji[8Vc@^mJiwSois_;WU,FT*?Z+?]-@^+?U$9F(X-,Ŝ›ЪҪ쿥Z>eFĆi͏rٕ}ޔ~擁~ۍxّ{͌{ٛӕܛߘۏtևfՆeΆeɅh橌ɭ˰פٜƅrdžsobO^LXFB8_*0h9EQUqDDᳳjmtFQf7EX+7o@Ia/9}IOxΗ{՞̘x͚y͚y̘x˗w˗w˗w˗yȖyǖ{ǖ{ǖ{‘wspkhϡyᲉ䷋湈齇aO\JUGPDJ=G8E1z\ߘov}{m{XWAVD_JeQjVrbtfԎxomm]6Iha8SV,Jc9Z[}okHiwTtO,J\8TwSosMfplmV,AZ-@V*;X,;_2Aa1DN+~oZխ¯s^dHqPҏoБpޜ~ꡅ똂뢈裋ܝ鬛ᤓُsڋlևf΄dǁb橌Ũ϶깡۟ږ̆pΉqw^~eeNA4](,j8BNSi99䴲qqVc\*8T%1j;E\)/edvМН}̘x͚{̘z̘z˗y˗y˗yɗyǖ{ǖ{ǖ{ǖ{sokd䷋巆껉ď꽅꽄VJUJQIOHNF@2E1z[ܕit{{pЀ]V?T@^HfPtbf[kljqҤpHea9XlEd{TvhZ~~J!A\2P[2Mt[roH^f@MmBNU(7[2BQ-9Q+6e1@f17x}ẩ㯪SHsXzWЅc׍ky룂桄갑鰔鰕⩎䫏ޤ֔xٌqօh}\͂cטwƨ㹣ᨘܚ֎{Չs΂jt]ZGq6*e/1i6>q>DsAB٨mh~JSm9H[&6i6@c,/{vsȔ}Ԣ͝~˛{̚}˘{˘{ǕxǕxǕxƖxxxvro_e֨콅콆콆콆TMQLOMMJME?1D/xXܕit{{pЀ]V?S?^HhQ҉yɁ{~qDZZ6O^:VeA_X3UtOqpJmwNrtk?cc8VX-I[1H_6Ji?QtpOaQ0?ioj=LW/?[9ES,7\%1yeӭ徲]&&G@rXxUՂaڋhݓqy袁壂갏鱑鱑鱑⪋䬍ݥԔxߓxދpՄdՉhژvƥấިڗَyԆoًs}hcSy=6m79l7=m8>m8:٥k4>l4Eb-=j3?t98Ĉ~sϘ}Ңɜ~˛}ɚ{ɚ{ȘzŕwŕwŕwŔyxzslceң{㶇PJNJMMLJJE=1A/vWږkt{{pπ]VASD_IiUvhokr}FX]s^xhD_W3Qd[6Wzcc9ZV+IX-IW,GS)>]3FlDQpIT^:BT/4mojmb4Da3IQ*;S&6o8Dy߹U)%m77ZSrXxUՂa׈eَlߗt桀襅쯏갑갑갑㩋嫍ޤԔxߓxދpՄdՉhژvƥấީژَxԆoًs}jbVy=8q:=k6;f17d/1ۨҞ^(1_(8i4Db+4XV̐ĉtԝСɝ}˛}ɚ{ɚ{ȘzŕwŕwŕwŔyzzrh_ңz䷋齉€ĎБ”NJMJJLIIIE{:1@/tWږkt{{pπ_WETF_NfWlcttUb{tf{WslQ,Nb=^xSvXzW-L_4PU*E_6J[1DV-;Z1=\4>pEOi?Dxt~\-@L1S#1ytt乪ȷT&&h1/WNqWxUՂa׈e׍kܔq{壂쯑쯑쯑娋認ᣆדxۋqׄi{\΂aژvƥợީۛڐwԇlρlrcWPq33q9?k6;e06_*,⯤֣a*3S+t@Nj4:smnj~ȏwӜ}ϟ~Ȝyɚzɚ{ȘzȘzŕwŕwŕwŔyzxob”k߲‹……‡ȔǗǚǚHFFFEGDEEBw90~9*{^ږksz{ym]WG@6yk^Qic͏~r9SWov]9WyTvyTvvra{h>Ue;PX/AS*8O(1U-4sHTd3Hm:Ld\W[^-4O"xv˾˿Q()W*,e0+UGmQyVՂaىfَlܔqzܘxꨉꨌꨌꨌꨌ襉ݛ֏vֆl݉oهh]͌i䱐Ժɱۦښ~ܓtݐvًv~qEBh)/c+1yDIf17\&)֣ǔj3=^(6h4?f13wtΕzԞ{͞yȜwɚzɚ{ɚ{ɚ{ĔvĔvĔvēxwrhdܯ꾈†ĆƋƌȐ̡̢̢̖͜JJHIGLFI{DAs70y7)y^ږksz{ym]UFJBxtiĉ~ZmzD_w]wfB^U1Oc}Wyxe;Pb8JZ1?I"+N&-qINhpi4FkyⴴqFGwILNifyx붱^6/T*/[-1m81VFlPyVՂaىfَlܔq{ܘx餇꣉꣉꣉뤋垅۔z֍seւhҀaxV͌i߬ӹзפטwڑqڍpρmia}8:i*2j29}GMi39[%(НQ[]&4d19}HGyĉwҘ}ӝx̝vǛvɚzɚ{ɚ{ɚ{ĔvĔvĔvēxvqh”l꽌ˆĀNjɐ̖̤̦͛͢͡NOMOLQIOxAAp60v6)v]ٖlsz{ym_OA\W\Qd[~Sht@]Xr_yiEaff]^]4LM#6_7E[2>Z29a9>[\\[ytwrk;;k?EN!0N)d/*ƌ}t~wL#!V+3^07~H?S@mOyVՂaىfَlܔq{ܘx埂螅螅螅죉ُvЅl~eւhҀaxV̋hڦҸӟӔqՍjՈk}iTNp*2l,9t=DNTi39W"$ktc,:_,2fcŌɏz՝~Ҝv˜sǜsɚzɚ{ɚ{ɚ{ĔvĔvĔvēxsmj٪„z}ɍ͖Θ̩ͤͦ͢͝PQOQNTLQw>?m3-s3&t\ٖltz{yk]TFMIzpmfvs}{H\SlVpvQk\xa=[m\7XeZ3Lb=O]6FhANP)2F%V[f\ƓtDGU(3Z-?P#/̘qaoe˖j@9O%&X-8c29TJQ=lOyVՂaډf܍lݓq{ߖx圀曀曀曀靂ޓx׌q̀e׆j݉mچh~]͇fۡΰӜ}ӑoӈfӆioaHFl)2h-8t=DMQb,1PvΛrwk6;^*)}sɐ͔yԜzΜvɛsȚtɚzɚ{ɚ{ɚ{ĔvĔvĔvēzqo“q湋}ΑϘΛΝ΢ΦͩͩPPNOMQJO}A@~?9:,fݘt{~yk΂\aSZSe]kcrov{{L\\qrqMfU1MhxStM(Ipy^?ZO/B[6H_pQ&2rEP]17f;:WWS")P"+D$իܭުvvX/0Q*/P#0^+3]VV@lPzW~^قb݇iotvߓtw{~~ߓt҅ftVۉjׄexWԁ_~]֑mğţڜՐvޓoӄemcx/1e)1i2;wADk73b-*X$!ZQ٤X"d*ɏ~̓zٟқ{͚yɚzɚ{˘~˘~ɗ}ƔyƔyđwtvtiեx齅ŋŇƅˌΗΛΝϡ΢ΦͩͩPNNNMOLM~@@B=F8ɂkݘt}~yi΄[]MUNaWd]xvlpamcwqMfJ&Bz]8Z[6Wqr?!8dAVkDUQ%4Q$1L(ty\24d6=O#&FϩⷨΞP$Q(*P)0b4Dd-9_ZhQlPyW~^ځbކiotvrty{zwܐoԅdԂclOkNjLeGɁa몇詇ޛ֑yَo~cLFf"&]%/l9AJIyE@o:6i40vA=ᬨƑ^)N=̐yˑvןКz̘z˘~ɘ˘~ɗ}ƔyœxƔyđwtv‰xiڪvƇćĉnj͔ΘΝΟ΢ΤΦͩͩPNNNMOLMBBGAZLЉrݘt}~yi΄[XHPI\S_Xtr_cc6B]qsMcP,Fy^:XyTv_qmzT6MeBWpxE$Z+7mAIL"&b^wyoypU$(^-2rHJ[3:U(7j3?e_[ElPyW~^ځbކiotvrty{yxwvx}ë́jɇkښ~奉ᝆԎx·mt^o($i*0j3?l9A{GFvA=k72a,(a,(ުǓs>4tb̐wȏs՝~Ϙ{̘z˘~ɘ~ɗ}ƔyœxœxƔyđwtvsčpȉćĉȑϚΘΝϡ΢ΤΦͩͩPNNNMOLMBBJEfXՎwݘt}~yi΄[WGMFZP\UkiԛS%2tMatNdrmIe\8VqLm\~axmOowqZ7LoGXjyQ$1c4@j;EwyάbV}sḶ[12a04^-2Z02c;Ba3Bi2>d^fPlPyW~^ځbކiotvrty{yyz~ڇqݏzۗ魓ڡ¦討➇ЍxĂpmap31d+1d0>}ITVUMHq=8j61Z%!աVIhːpǏmИyΗz̗{˘{ɘ~ƔyœxœxœxƔyđwtsqКz鹂„ćƍ˖ϛ͛Νϡ΢ΤΦͩͩGEGGJMLMBBJEfXՎwޚvzzjυ\VFXQVM^W➜{N[wOckGaX4P[7UV1SjEftOrey[zxvlI^arzN]L+U&0Ӳ˩cWsoi?AT*/b16e49e;>e>Ea3Bb+7jdeOsWyW{\{\܄flsvݎmxޓqݑpvvvxz䖁嬐¦ޞԐx΍zʼn~d,)j47_,4c1?q=JZ\MHvA=a,(X$ȔseǏpΕmИt՝{Ηz̗{˘{ǗyǕzœxœxœxtđwtohҜy콅ɏ͖ϜОϝПТϣҨҪЬЬEBEEHJIJ~@@HBdVӌtޚvzzjυ\O?HANE΅~ifpspBOfzcy_;UsOk]9WU0QpJl{VyhpQq~p_td=NQ%4bodkws›Ƹh[b[]38h=Em=Dp?DkADsLSZ,;]&2\VZDpTxV}]_ځdކiqtىiٍkߔr׌jsssv{ꚂĨ驍ݝٖzΎ~pmc06b48[/7a1Aq=LWZyE@}HDc/*])$ǓrmqaɑmϗjқtӛyΗz̗{ɗzƖxǕzœxœxœxtđwtohԞxᅦń͓ΛΞΟϝПТϣҨҪЬЬ@>AADFFGz==E?aSψqޚvzzjυ\VFIBmd]VkirvrEQh{jDZX4Nd@\]{qLm_yTwpMorV9SvF0rFUۯҪıWP]\ڳV14Z02jmk:?h7;i?A}U\[-=c,8SMU?kOvT_܄d~a܄fosՆeޓqۏmۏmڎlڎlڎl܍l{tsy줄~Бoācɍ{^,0U(4]6=W09a1Dq=LNP}HDxD?k72b-)zpk}lɓjΖhқrИwΗz̗{ȖxĔvǕzœxœxœxtđwtli֢xĈȇϕΛ͟ϣϟПТϣҨҪЬЬ~>?}??~AF{BFv:9A;]O̅kޚsyzlτ]P@TNkd\Uąfla3@Z2FxQh^:TlHdU1OmJkf~]oNp\>]lrtM^ժy㹲̶kVha}T/2S-3T*/}OSZ&,^-2l@DsHPX)7_,7JEM>hOtWـc߇jbځbflߎoy^>\;vVvVtVtVwXpQmStZڈkE&rNwU͎xof\*4b6E]7@W09_2Aq=J{GFVQl72wA=d-+db}Ɛ~ɓjΖhΗoΖtΗz˗yǕwĔvƕzēzēzēzw‘ywli֤zƍˎϘΛϡУППТϣҨҨҪЬt;As;At?Et?Ey@ATJiWԎqvyq̂]\LԎTQbbT^UdZ2Dh?V]7PiEatQpdFe{brXxmy[{ziE^~VfĚڳq^vk^89^7;a6>c4>f39i6;k:Al>GxFSc0:t>@UOUFjUzc}bۂc܁_ނ]cpޏoڈiڄemQrVv[y^݁h}fـoz׉rΆe͍sc/=[+;\/;_3;i=BsELr@DzE@IDi1+XVe,2SVŎrΕqЗpКsИw͖w˗yɗyȗ}•{}}{z{wkZ᳇ɗԡϞϝСңԦӥӥӨԩԩԩӫp:@p9Bp=Gp=Bt;=ULcQԎotxś_Ԍ{LETSȌmwbmf:Ih>PT+BU/HvQm_}^BaM8Upoy[~X8ZeˡrȰ\JṰ_72a78a7;a6@b4@f39k6;l9Ao=GwEQb/9zEJQPMDdTtaw\~a݂a݁\݄]l݌l݉k߇j{_za}ce׋w{̋xWaj9N[+>[+9\-7_18i;?sAB}EAMEp60UTj,8LT͓ː{ΔsЗsИtϚw˗w˗yɗzȗ}”~~}{z{wl~Xⷋ͟ӤТСӢӤԦҨҨҨЦЦЦЦl7=l6?l9Dl9?p78WN[IҌlߝrv}ś_WGIBmlhlmwk=H}P_]3FS*Ac=VZ6Q^?\yqXDa~ipVxfqeŝȞyǝ^61c9:c9;a7;a6@b6>f39k6;l9Ao=GvDPa-8NTLJE:\MkWlVvZ^݂_ڂ^ۈf܋kߌmoކih߀e݀dmxꗄ䓀։x׍xݘ~Ąti2>d3H^/A_0>a2;Z+2c69NO{D@WOz@:VUq3?DL͕֜֞vϗsИwϚw˗yɗzɗzȗ}~}{z{wl~X轐ӥӤԥԤ֥ץԥҦХХ͢͢͢͢i39i2;i6@i6;j12WNTBЋkޜqt{~ś_TD;4ޟ^cmw_1=^mP&9^6MhX4PoOliQos\Bd_Adxxr߶իpFH_68a7;b8=a6>a6>a4=f39k6;l9Ao=GtBO_,7TZGH>7TGdUfQoSvW\ۄaׅcڈior܆hقd}_z\tXqUv\̀h朇ٓՑ}p2)^(6Z)>^/Af7EwHQa29k>AUV{D@^VF@VUv8Dy=Eٞߨ̕vΘvϚw͚yɗzȗ}ȗ}Ƙ}}{yxytj{V꿓ըТԥԤ֥֥եҥФФ˞˞˞˞e06e/8e2=e28}DEh^o]Ʉdڗlw~{~tυcVFB;ϐ_dPZf8Dm}W-@L#:_ya=X\=Z˯͉raLiy_e~romoᷥ{b7BT)4T)4c8BV+3_4=b6;f39m8>k8@e3>m;Ho;Fq;AFGr/*B8XJhVbJsV}^~]ۇiۇiۉjۉjۉjیkޏoq~란롁螀ݘ~ЏzzkGE[&6V%:_0Bh8Fh9Bi:Ab48~LMUQVNGANMh*6j-6ٞӛɓvɖv̘z̚}ǖ{ŗ~ŗ~ė–}{wwp}cvP–ը٪ӤԤդդӤТϡϡ֨͞͞Οe06e/8e2=e28TUd[cQǁbڗlw~{~tυcXHE>pofkxAJdp^mX/AJ"9_yP,HV7TmVspz\iHj}^_wǜl?J]0Fe9Ld8Ic8D]2=^3;f:@k8>d/4b/7j8Bi7Do;Fq;As:;t20HAA7VFaJoTy\Ԁbچh܈jލmߐpߔrtxz車~ԕvԕ_"HI_+:[*?b2Ek;Ia2;l>Eb48VWSOPHF@TSx:Fj-6ܢ̗֞{Λ}Μ͜ŗ~ėėė~{{wwp}cxS–ҤԥӤԤդդԢϟΞΞΞƖϟ͝e06e/8e2=e28TUd[cQǁbڗlw~{~tυcSBD=]\X]f09_1=zN]mDVN%=ySlW3OkLibJhZEbvqPrŝmDErazOBi:MU&DT&A^1Gh;Mi>I^3;mAG]*0j4:h4=\*4e3@j7Aq;As:>y:9FA?7;/L9^FoQbaׄeލmߔryz~褀yyךz̐yc&t;Ad0A_/Df7Ip@N]/8m?Fb48deNJLDHB\[P\j-6㩡ڢ̗~̚}͛~͜ŗ~ė}{zvvo{b\ɝ֩զӤԤդբӟϝΜΜȖƔ̚đc0:b-;c1>e2:{EEi^p[˅eڗlv}}t̄aH7A;fh{DJq?L\/>^pa7I]3Jb9SS,FH&AjfOl~fppp^hmhpII[1FX-LW,GW*@f:IpEO_39tGJb/4]*2\*4a/;a/=e3@j7?r:@EFw87IDq+!s+@*]BvZrUz\ӆhَoޘxޝzߡ~ꥁ{ߡ~Ԛ{r^e-*l7=e6Fb3Ge7IqDSa3?f:Ba4:lpPNMGHBbaW_h+2䫞ףƔyƔyǖ~ɘŖėė~{~{twqxbhҨۭשӡӡԞӞӞҡ͜͡ěڪab/D],A\-A[+9t?AbWaHˇe٘jt{~tȄ_O=}HDɖyN6Qjj@Uj@Uj=S]0FS*AW4LT;V]E_zz\}rpO/BQ/DU0@U,:lALyMS_26W[c29a/9a1?c3D]->b2@l:EtAIp:@q8;DAG?}6(?)D)>"P2aBpPz[Ҏmהsܚy❀袅❀טyϔym_Sa1/^28_3E^4Ia7ImEU_7E_7BmEP[c]_OMLHZWT\j12ީȔx~fjmqvzœƗwy{xrk٫լ׭ԦНКҗЖΛ˝코Ⱁkr=6a)/b)6b1H],DW)?S%4l:>UIU=Ă_٘jt{~~vȅciVrDOS$AsHdi@Wi?TsGZf9OX/FS,EiNfiMifHhsz{]~ytVwe{N-=L*8Z3>}QZ}OS],0r@D_/6_-:_0>a3B]/Aa1Aj8Eq?Io;Dl7=z?@MGH:dOzaӄeԋlӎqϋm֑t֑tܗz❀❀䝄塈奌䩏괡˛WOa78T,6Z3@a:GlFSb;Hb;HrLXblW\PQOMUVNVq89עoydxdxdye{h}ikly{z}}tp黢ҬҨΞ͚ϖϕΖƕ趏˗yI7c+%d+1p4Ep4HrBUj:M^0BV)6b03~G>J7zZ٘lt{{z{xόj鳡~NI^0;qBXZ+Hf;WmE\j@Ul@Sm@Vd:QX2Je~yW;WV8WpjsrjMio~Z8Fc=GlAIqDGe48NQZ)0\*7\,:_2A_1D_0@h6Bp>Hr?Gj4:v:;TN^PxceӄêdЋk̆fωj֐qܖwݗxەxՎtܗ}㣇譏ﻝ꽡ǯ忭zxd?BfAElGM]7@]7@mGP]eLPQSOMSTJS}DEҜdk{hxdvbvbs_q]p\~ipwzsvytphˬϥ˞˛̘Ϙϖ̘뻓ڥ^Nb+"\$"y@ANLPMVdzJXl?Na3@]*0x@={;,oPחks{}wy{ӏmJ8wGB^0FZ+HQ&BxOfa7L^2Em@VrH_iB[J)Ay^wj_Ab{]~jtvWxo~cAO[4?mBJl?B_/2PTX(/[)6[+9a3B_1Da1Af4Am;FtAIe06r78UOl^ydv\πb_ԋlЇiЇiՌmՌmԋlՌmԎqۖy㤅譍ơũϾtmW30P,,P+/b=B{QVyDFNOUSUVLTOPЛ{_ytm}izfwcq]mZiUk\phmeraraj_bS˨̜Ǘœ̚ϜΛɝҟXFj3(e-(t=9QLOD_S}yborEPzGMx@>k*!V?Ԕirzzx}ƂaQ?rmh9EO!7L:W,Hc:QjN"4k>TiwPiM+DQ4LvhvWxflsrt^>Mc=GlAI^14Z),OSe4;d2?a1?d7Fd6HX)9j8El:EPXj4:l12HBdVs^{bЁc̀b_ӈi҇hڏpَo׍mڏpޖvܘx㤂쳏ĚƚƝǦɰ͸rOFF"U11]_wAD}DEGE{BDEMbcĎzmƓ~{xvpkzfwcfVbU_VXM]Iv^fVP9ɡɖɖ͛̚ϟ“ӣWIe-(WJP@N;XHZNOF}oz_h}DEh&!T?ӓhrzz{~zɆdoqlZ+7Q#9J9G8{lV*=ti?VwPiQ0HZ=TjOh\@\zS4UpQr{]~rve{oN]oM[fqj?G^14Z),NQe4;d2?a1?d7Fo@Sb2Be3@f4?xEMxBHo34NHhZt_za{^Ёa΂a֋i֋iڎl׌j׌jېoޖsޛy䥄鰌긑龔đĔƚɤ̭η˺}s[73i?@yDF}DEGE{BDl2:pqɔɕyƓ~{xvvrp~kpalaibbVyaifN[=ɘ̓Кӟӣ˞Śpp@"f2%XSQEN;[G^N[OTN{{xLOc!P?ӑjrz}~yv΋i붣{LGk=HZ+AT%BT)EmE\J!6Vii;QoE\kE]d}f~P6N}[=\cEedFfz\}owG)?J)7j?G^14Z),NQe4;d2?a1?d7FqBUk;Le3@m;Fp=Eflb&(NHl^wbx^wZ҂bىfىfݎkیiڋhیiݑmߘpy妅㩈岏㸏㿐Ɠɛ̤έԿ̪c:8yED}DEGE{BDc)1ċ̖ɕyƓ~{xvvvvrzlvkrll_w]ˆhqVf˕ЖӚНΞᶌoId4P;WGWJXLocd[]T]T{}X^f&(N@ӑjrz}vrҎlwf뻻O!,c4Hi;Te:UrJ^V/BrH[V,AjAX^8PQ0H]?VP3MeD$DsTscDc{]}co{cBTĢlFSh@I\27V*-}OSc4;b3?_2?d7Fj:Mp=Pi4D~GPJLhep42{:2q_xbw[sTֆcގkډfߐmݎkޏlߐmߔpq{覄ߥ䯌Ⳏ⹎⾏đǕ̟ͩ϶Nje]vFDzFE~GGzDDf-3ۣȓoƓ{zwttttvr}q{ptb~^ŎhwP٤x͕ӗҘНɝң{}M+O2_DfP\Jka{sic]UbZpISwx{b),OEȋds{}yӏowqm=DZ+7[-=i=OZ0BW0Aa9JU0@Q,?e{pMd@6^=UF$?\:U{WvX4SfDbmNkrzx~c@SV1@O+3Q,0kDHe9A]0;P#0b2ELaf-Ea%9DLWM}k~@6j*cNrXׄhՁcۈfۈdۈdډdۍfݏiݑkݔoyz㤂歉汌淎麑Śɢ̩βӹqHA[--wFIq?Bc+1Иƍ{ȐxŐyĐyĐyĐyrrrqqm~f{]bŔfWЖҚҝСě^{E(]BaFaFePwef[]SaZmiV4@bjŦ_*/NGȉfs}ﲀ}yӎq~z{L*U(7Z-?\lZ2Da9J_:JW4GoW4LL(AN*D^zV/Li?]_}lHdrSmiNfrtqA3O/6L+0b?ArGOa3?S%2a1A}G\o4Jj+>w38]Jx^J;j*cMrVׄhׁc݇f݇dۈdۈd܌fݏiݑkݔow{~檆寈貌鷏코şɨϰԸپźO&$klh7;_*,ϗċyǏwŐwđwđwđwpppqplb}[bĕd•]ƎԜӝϜ̟ެ[;Q7^FeJdJkTq_XL]TicokH&2iHPɫ](,G@ȉfs}ﲀ}yӎqڢo=Ic3AT&6b6G[2BQ*;W0AL&7dATvZ7N\8QI%?N*FeVtvNk~Zvjjq[rvbx\9P]:OyM,3N-2hEGT\e8DW*7b2@t@Qj1Al/:y77ePqWXIj*cMrVׄhׁc݇f݇dۈdۈd܌fݏiݑkݔoty{}䨄㬆尉洍꺑쾖ǥͭҶֻjA:^34_/2a,)КƎzȐxŐwđwđwđwpppqplb}[iګzɑڣԟ˚Ę}WV8fMV>jOhNqZbPXLe\jdjfH&2[:B¤ğZ$)~A:ȉfs}ﲀ}yӎqqmc1>[+9U(7k?Pb9IZ2Da9JN)9]pezM*AlHbX4NM)EX1Nf=[]6SkGcxXsqVoyczmyrL)>]lԲI)0U49yVXZbf9E_2>b2@m9G[#,i,1NHkUlScTj*cMrVׄhׁc݇f݇dۈdۈd܌fݏiݑkݔoߕsߗwzߞ{㦂⫅䯈峌鹐뽕Ƥ̬дպ⺯H^//f3)֡̔{͖zŐwđwđwđwpppqplb}[뻓Иڢܦբ˚󿕢iE^B\DbJpUqWoWWFbUh^fafcH&2O/7ΪP}@9Ljer{~{xҍp]+8M+h:If:LV->P):O(9P+;\qI&>]9SmIc]9UZ2OX/MT,I_;Wz[vpcMdmZp~reza?JL+2I)-wTXsHSh:FoAM_1=h4=m79}A?VIv\ЇmfWo/fPcچjقdވhވe܉e܉eۋe܎hܐjݔoߕsߗwzߞ{ᤀߩ⬆㱉鹐뽕Ƥ̬дպٿP%$U%%T@ȔxΗ{͖zssspsoki~ivax[ޭӪ͜Ζ՝Ӟ̛ĕҘqa?_E\EfPpVrXcLZHi\e\_Z\XG%1O/7ΪW"&}@9Ljer{~{xҍp}Z(4k;IV)8N"3]4E^7HW0AwjGZ\9NL)@O+EjF_Z6QJ#@]3QQ*GeA]_@[{aJbye{w]rqO[M,3Z9>\9>]2=_2?rEPi:Dh69f0-F;r^~b}cWH@1fPcچjقdވhވe܉e܉eۋeۍfۏiܓmޔrޖvߚyޝzߣި᫅Ⰸ鹐뽕Ƥ̬дպڿڻ͸vtQ"mUƓpΗx˔wqsrosoki}hwb}_䳑Ӫ͜ΖԜӞɚ鱄…^a@]DaJjUoUjP_HbPdWbX\VXUG%1O/7Ϊa+0}@9Ljer{~{xҍpsptBO[+9X+:U):V->U-?wOaJ%6exyVkP-ET0IeA[U1MO(E]3QS+H[wU6PbG_yxe}eqov\;@W49_4?sFSi;Gk=Dk9:l70Q@fcx^M>O@fPcچjقdވhވe܉e܉eۋeڌeڎhۑlݓqݕtޘxݜyޢ~ݦߪᯇ踏껔ţ˫ϳԹپٸζFhđjΘv˔tqsplsoki{fxceӪ͜ΖӜҞȚڜqqL]>\DcOlXoUcI]FeTcV]TWQTPI%1O/7ͪe37{A9Ljer{~{xҍpwssALP!/b4DS&8d:Md=Mb:JT/>]moI\Q+AkE]d>WT-Gd=Z[1OX1N{cD^G,EkjM&?Z3IU0@[7BfBJw]+8b3=tDJr;;F>ZIv]xZ{bN>TDhNb܆hقbވeވe܉e܉eۋeڌeٍfۏkܑpܔsݗwܛxޟ}ݤߩ⬆趎깓뿜ĢɪβӸչֲ׽U*di͗t̕xŽtsokqmlj{dy_f›ӣ͖͘Ԟ͛ﳆlj^rN_@aGeOiTfP^IbOjXaUZOTMQML%2N(2ZcίxGJy?7džcpy}{yv̍kslm=Dj:JZ+?]0Fa7IQ*:b;HU/;a9I\4Fc;O[2Ih?X\3MO&AsIha9VfB^F&AhMe~hqoyU,DM%7\6BP*3jEJtJOwDLoxr;Gh09t6;VSeWv_Ёcɀfs7&iX}cׄeۅb݇diߎh݌eۉc݌e܌e܌eۍfڏmڑoۖrۗsޝxߢ{㪅谌귔뻚ḵ̌ҷֹܽٺ_8!}bŒp̕yɑyďxwtqpookd}Z^͓͕՟ƕ۞q…ZsLeEbFhOhSL:]Pj]h\_TWNUL]TL%2M$0U_ǪyLNz@8Ɇdqz~}zw̏lyNUm>N]/EL7b8M\i^8BP(6e=M_6H]3HO%=T*A}QlW,Hf=[wOlZ6QxXsU:SkxlHblpU+>O&4iAJ_8?k?Ev?Ji/;f-=b(2?@]VhUv\πbsZr6%iX҆kنd݇dމdiߎh݌eۉc݌e݌e݌e܌fڐkڑoݕrܗsޛwz}㦂歉鲓긚뾟ŦɯϴԸ׻ٹں˥rĉtōwČvxzĐ{zsqooiaZ̗^ot͔Ӟ՘kToHhH[?lTaMSFcZh^^UZPWNZPaWN(4L#/yNXQT{A9ˇer{~{x͐mŏ[bh8HX*@{Nfc9NS,9\6@\3Ai@Pc9Lj@UlBZa7Nf;Vf;Wb8VX1NW3OdeJcI3JtawjF_yNiwN%3lENQ*1c7?]):k1Ed+:h+2MHhXqT{ZrU[DM:lWӈjډfވeވeiߎh݌e܋d݌e݌e݌e܌fۏkۑlݕpܗqܚrޝvy㪆氐鷘黝¤ǬͲҶдںնҶvxcq[xdlsyzywtrmǏkƐaPȕVxӚ̗ﳆɌasMcA]AbIcNTDaTh^d[[QZP^U\SULN(4J"-vJUVX}B:̈fs}}yΑoƐ]d]->O!7c6N[1FT-:_9DsJXlDTf=OWl\2IX/F\1LU*FtJib:WW3OtkU?V?+AbIb[7Pa{{QiqX0>[3=J#*_4?X%9b*?j0=s37UJqWvSXvZ{7\F̅m։lۉj܉hވeiߎhލfލf݌e݌e݌e܌eݏiۑlޕpޖqܗqޜtx}ᨄ䭎峕湛Ū˰ϳ׻նںչlaLS=]IhWseqwzz}wŎrΖr˕eNĐQٟȔ謀…^kI[;S:o\P@TEcXf]aWULf]i_XOxB9Q+8O&2\1;˭mpw=4zXkx{xxyԗth^SZV&7b3I[-FZ0EZ3@c=GX0>e=M_6Hc9Nc9PQ(?N#>N#?T*H{TqyxXsU?VtawjQjb>WfVmi?Q^6DU-7c;BV+6^/AU!2m19E?cPqSmG{WdLy6cG̀c׋lڋj܉h܉eߎhߎhߎhߎhߎh݌eۉcڈbݍfݏiޓlޕmޗoޚqtyߦ⫌㱓䷘ƫ˰дӷ׸׸ֺĐyT?dN~E3MAQH[QcZ^Uh^tk}pΖ~ӛwȓcŽUɖWϐמđДmqQT8J2cPOANBaW_U_V^U]Tf]_VyD:h2)J$1A$b7A˭ťrtw=4zXkx{y{zΑori]dT$4j;QU(@W-B\6BiBM_7E^6F]3Fh>Sf=Tf=TS(B\1M]3QV/LO+GxXscOe{c{x]2M[1HZ0Ba8FQ*3W07\19[-=^*8v:9QGs]vW΂^oNl+N9΁dډfڋlڋlۉj܉hߍiߎhߎhߎhߎh݌eۉcڈb܌eݍfސiޔkߖmߘoqvᤀߩᯐⴖ忡ĩȭβдն׸չĬM8\FaOSINI~HDMHv@;yD?IEMAx_]ݨxڥltԕ̓ztPM1G/ZGL>LB\Ulf[S]T_VbX_VVMxB9k6,X2?c:Fa6@˭ͭz}w=4zXkx{z}ňeypq@GU%6X*@Z,EZ0EZ3@d>Hb9G_7Ge;Nf=QlBZb8Of;VU*FT*H^7TQ-IS3Nps{c{^xwLfS)@h>PS*8^7@T,3M%*W,4h7:E:iWz_x\z\?(w:*jWҀa߉fڋj׋lڋlۉjߍiߎhߎhߎhߎh݌eۉcڈbۉaیbݎdސfߕjߗkmtޢ~ݦެ߲⻝Ǭ̰βԴ׸ԸϸU@^Hl[ke][NLIGr;9m74i20f0&H0毋ۦmzϐȏҚkN+~>%H3VFE9WPdba^TL[QbXh^]TMDwA8p:1XdzS\zSZ˭Ӵt>2zXlwzz~a~{JQS#3a2Ff9O_6HT,=W1>^8Ed=MkDUc;Oa8Oh?X[2LO&AQ)D_9SiE^G%>O2Ijwiq_6MW0AO(8U/9I#,U-2W*,}GBQEs_t^v^E0o)]Jϋrنb߈bۋhڋjۉjۋhߍiߎhߎhߎhߎh݌eۉcڈbه^ۉa܍cݎdiklߛrݡ}ݥݪ߰ṘŦȬͱдԸպjU]IjWsfmfhcZUIGw@@k44c+%L3ΜҜcƋϖ𸉟fAq6A1F7G:UMd^][OMNHZQe]kcWOMExE=o;3X_]cjjɫаTBxUkxzzz﯂dGzv}JUd4BZ,;b6G]3FV/?\4EZ4DV1AU0BpI_U/Gd>WT-GW1Jd>VM*A^;SW4Lb@WkIaZ;QczrW/H]4LL&9W2BM(7F$0W04wA=MEf[Ɓsyk9+i"S@~_΀Zׂ[څ[܋b܋d܋d܋dލfލfލfލfjiލf݌e݌e݌e܌e܌eݏhݓjݔkܗoݜtۢ}ܦݬᴑ㾛ġǦͱҷֺ׽ֽݶ]Ho[r]jVbQ^QXQPNt>>h0*H1ꭇĐcHv9)k2%}B:H@LD]W\VSPXUPM]\kjhfTS}JItBAtBAOUikvsƩϯXFwVmvxx}쬀oTxvd2?d4B_2A_3E\3DT,>[3ET/?X6HiF[]:QT0IjF_c?[X4NH%=avX6JeBW^;PkH]tlIa[4Ni@[T+BV1DV1AO+7N*3[/2HDbWmcfZh!v/!_N}f}W~TׂXڅ[މ_މ_މ_މbލfލfލfލfjjߎh݌e݌e݌e܌e܌eݏhݓjݔkޗoޜtޡzޥެ᲍㹕Ť˱ϷӺ־кVBfSkThPeQcU\SXTTTME_IΡ“̎c_>E4w60}B=xB>PLeahcWSIEMIXWffllccTTxHHp@@p@@wDIehrptͬ]JwVmvxy~~cecW%2a1?b4Db6G^6FV/@]6GmHXU2E\9N^;SW3MrNhpLhI%?X6MyVkI&;~[pX6JmJ_qNc]7PjA\P(?Z0BN%3P%-[16q?@QOz1*m$}4$T>cIvVwT}V~TׂXڅ[މ_މ_މ_މbލfލfލfލfijiލf݌e݌e܌e܌eݏhݓjݔkޗoޜtzᤀ᫆ޭᴑ佛£ȯʹҹս׿˴UA\JcOeQfVhZcZ_X_[^TbI묍ɋkQ8G4z8,MGGAPLb]kffbMHv@;OLbappll\\OOsDDk;;k;;m:@TVa^wl̫aNwVmvxy{ƈmNL_-:\,:_2Ah;Mc:J\4Fb:L\7GX6HX6JtQiT0I]wtoJdS0G\qD!6vShyV3Hz~[rh[4NV,DW+=h9B\+/V$#^&#y3,E=WJbMiMvS}Tԉ^}Q~TׂXڅ[މ_މ_މ_މbލfލfލfލfijjߎh݌e݌e܌e܌eݏhݓjݔkޗoߛtz⣀㪆ޫᱏ㸗忡Ƭ̳ϷӺ׿tUD_OcUi[k^i\f]kbj]kSw[x^WBQAI>^UGAIDc^kf_[TOwA=zE@a]jipphhWW{LLo??e66f77o;Af9;ySPvkаm[vUߘlwsw{vhzDAb0=[+9[-=Z-?mEUh@Qa9J_pV3FZ7Ld{S/HpLea=XsT1Hi~jA3sPeO,ApMbmvQmf?\W-Bk;IS%]%#x;4THbVhZr^x][ˀŴS΁PՅWׂXׂXׂX܇]܇]܇]܇_݌eލfލfލfjjjjjjjjސiޔkߖmpߗrx~⥂䬋ⱏ丗澡ĪɱζҹԻտ亦~L=^UcZi_maqdrdqcq]qVkOeL_JiXaUWNPJVPea\W}GBNIyD?WSyvwwaa}MMm>>l==f77k;;e28_24iB@h]гȺܺrvUߘlwsy쬀Q7xA?_-:X)7W*9_3Ef>N^7Hf?Pc>NO,?T1FkU1JqMfiEa]:QkH]{M*?eBWL)>wTkf\4Q[-D[)6e,0t60L>]JkVoVw[{XXπTρPρPՅWׂXׂXׂX܇]܇]܇]܇_܋dލfލfލfjjjjjjjjߑjݓjޕlߖorx~㤂䪉䭎䲔庝ǯ̳ϷζȲȴzH9]Va\e^i_rdscwcv_sXqQoMlMsZkXaUZTe_ZULG{FANIQMhc{xzyffPPo??h88k;;rBBzJJj7=h:=c=:f\ȻŷݻңvUߘlwsyvit>;[)6U%3T&6_3Ee=M\4FmFWX3DhEWT1FqNeX4N{WqV2NlHbk^;P]rV3HM*?qNcxUjsPh{pN!7a-8v88LB^LeJqNtNyS{STЀSЀSЀSׂXׂXׂXׂX܇]܇]܇]܇_ۉc݌eލfލfjjjjjjjjkܑiݔkߖorx~壂娈䬍㰑䷛㾥Ŭɱζ־ɳҾUHXT[Xa\d[qcwc~fhwZxU}OOvJmLbQ\V[UUPJF~HDNIc^zv{hfUUqAAc33b22k;;QQ\\_,2a36Q+)xWM׺ܺ˜vUߘlws{T9q:8X&3Q"0Q$3W+=jAQkDUsL]X3D_=Of{U2IM)BlHbP,HtPj{XpdAVzQ/DI&;}Zoc@UH$>tQrlEdWmq:FPO^TeQhIsIvHzM}OЀSЀSЀSЀSׂXׂXׂXׂX܇]܇]܇]܇_ڈb܋dލfލfjjjjjjjjlݓjܓjߔmrx~棂䦇㫌⯐᳗ợªǯ̳ʹ̶TQWW]XaWp_xcjmy\~W‡SƋQo:e?XHQLGAZU^ZOJUPsoxtWVwGGf77\,,_00sDD^^ddpillow-2.3.0/Tests/images/pngtest_bad.png.bin0000644000175000001440000002057512257506326020034 0ustar dokousersPNG  IHDR[Ee3ZtRNS asBITM-bKGD/ oFFs-X,pCALbogus unitsfoo/bar1.0e065.535e3W@{ pHYs  ~tIME:&z tEXtTitlePNGy5IDATxOhdɝ?9 "2@<RC!kڛ0P}Sͩu:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3#"!dXϏ+x=hʕ0:yѰg_"<+糲+Iy+Ma JáwĘ~gWU͔B&ˠtU5u-()0u=t>ǣ}{>bѨJ_GoTZ;߭GհWy'gy/_ ˌ|G>ܜy3=9ZO.n6waZvOOVcujX:0Z5?{z:nF]5i:]0tR sHdx~|F@lE۪EAu䓣*Mzt[9Q!")=?>X}r4\<ދ'G =MJPF$#Ć*D3׹sLܭ5-\\:X#eӱ9?>g4F1Z(L\ r@T^t 糲sӳ3..`mn'GըoWUϪ=?y_m(!_}{mk}E,aZ|X䣟ZppK o@p_O W 79&8y0\ͽG:Rٴ|}U'_?zՌz)-dd*Db~m9W>p:)AQ}AXUf*J癔Ub:e5oҿY ~K_8N.0ΏVSWMo nt:|nWKhpaaٳ#"_Y7n wZ k4J`Z:>y*g uid 0w5ۃE"h%>0mB0(%\@A2x6磃O'%.Ԭ`ptM-F`RV0DtH*ݿ5ԝ h&y|K\Չ @droa,LP=_糎f}>LK?ӒouuFqGjig&?I{~4Z*\%[ti`*bxotXXN'e5)S8 )[\:" JDbL9paD[kgÁ}`xz8wɦGizJdt8~A%BMi"r>߷τ,/0/mϼ7֤Hr.}MીQӋ9"Vp*Wv:xMM yzHU""ER]_J*B'}q|$@^:.]>4NJ\CxC<#'%E \ ތJ )N@['D:H,(ͥAa&f]i'SlJ1\ kɕ"n(rEa5|=d 8(rGΦ%jFHDa5Ft#X%O/:W‡:諆q!=`Mz:k1bu }'$H&ICSfWH&XLւF>kEaœcD`cs q{//éN`RD2P"JwzGbCxB:^T ֑WVƻ<{:8AC g3W6?9d ќn;B| QE~|4,NJFO_K~ɨEGP"7DžBgl[ol22%_ ١K˯fUXl}!??*lrE2BL§A٣BgJ=MR-@8fWޞB>,tZ|:uLx;ଅ ؅ył|+M\??&[{Ӹaօ !zփPHjdoȭt~+M*׹sZ 1 LQϮN!nՀHב*F"ٴ|zs4pPt"`條pܱg^?a$'w1#!F : iJ$/N mcdrkZ_YRFȰF|4oՋ N=۟Ֆ:wG+ spP!kΨTܩt}˚hBhpulLƕ(ȣz5L]4uĵl>j/V{LC`+d7&]4=)SN+M5 ׹HLx:cÞ\~hMּ:F$ 1|8(Aa΍cDZtYzbzK- J5Cln|NIzO4$|:ZgX% u :h7NtTc13o0:#2%䢵dLˊ+.NM$r9&IFRFuz1v2crun  =qAegZ4׈@ J ALJSEҵ^mkOQD8!rc_·i&mFe> t)L5LJ2ɍH_ݜc[hdca"wi:D&&kab_֢4kT⺼ %r-D0j(ʖ>UQlǦcF275}g :(FJ{ɕ.Pr|rqy/r\>-Rա|MЫP7ZK{] m#P2eP(Mh/K&KRČJӷU TuF &ee"i >DКT6WJ%B"6D;ʋPXťc^y>;|h0*KzLK4`ڀB2餣,i-X 2N;6vurUT!+j'msEjL&\:O4[%1=ux1lYٙ;_~f*դ{[LI]g<(thp cdm@D|X&塐LMqĦj})rp::Y|CY#=k6i!!dt"B!M}k$>~>3Ƴ'F'^Y=x<뼊ޙna`5>\syq>ķef;U\MrKª7^16nYeS&ucx#Og"o1ǵfԉLj{)3:q#,ˤK_; ϶<{Z֩a5go1W d&6F(}dӋ&nAϪQ0>|zԚA Йp~or._-ڤE~8;yG'ww,?˷\A7}&6Wyjꧬ,悫ZgUAcY7U1F:䲂ؠT8! EYrܫGQ%O=?w'/yv56b".Ȳ._\b-ȪPE[?* <f$ q6-o#U pXdN JdhxȲ̸Emњ+?ɚ?ܷӺ<)jM̛JMVB᠘\%AI{NdJ0ZI@^}KIYqPd ;7?L"=?J5{ffM_ hVBtogyѰg[j$4 ĘP\]Hy$Kv|)Nh؛ W-VHN 's7E^Y-)xӻDFœ=!rY&*\7-7u*COx2wDB}>L[  'GCtb[.FKb~kVwn|jT_ U*Ƕ|[l>63Iq*.r'-jг`/EH֎x},&k0]d"UXg[@˃=ّ]Eb٧@ϭF!6!GN.>0GbZ#OK7rMru8B|zЯh4,u.ˁsUH4E)W~`*t&4ML0"LJX0ٓ:D=K_Gjf^mmI+[,M !Hl 2"osLgW>5t>LC'|ޠ=Ygsf.k&7 ct5 墬eMfUXU JFgyFehg߷D)Aic"=]G 0}kr6Ϊs7CgbjAR5L¦j"HUkzA+zCĴijqU|x:yT};2J#!IM#7wuVoҳT|&gSMpe+6 fYt2gZ|\rOGp2wn ѩLu+s"1vJB$d!3gW.2z, ˍ^7*jS \;?A!"_qv,[&Ǔ%3_XFvhՋT͋"f79n]^FX%gI#h-~_޽ݝ_?zn;]ԋ"._{-^.`w;CtX,rYl֭{vob tkVeڭ1vzNU )ެ5 S&4uHHZH\WոpYƊ5nU:.^#|i c''0(it'Di!}#_ws.[&[!MQ4xw;);6KWeh E7ɅH?U-WDY>FӕPy!P:sڻ<ϬI -WkC7/HcLRd풭q%)+j%}vJP&ԑÁzw4#;ۢ~Gde/j;˗E\"-!%_-Hmw0/p/[vn:ֻ;rv/^FX"[,",B\zw[Zٷ"J$ %6Y2n`Hd2.Y,"c}OlҿDvo\Lto%u1;[*!6dY~!nwZU[lnY–dnori܋Ed[:jKӅeqY~XPVb\~`vM>U=_OZ,K%vw~/_Е--gW,m.[K:㋰lwYҥu[\,%leן˶`Ao aɲL_ݭY{6Np)`$jag 6\]3w55鸭que)UJSL|MMT/|`ZtY_%?ǞUmevuDe[{8`WN7SX,??f߂%įFsO !.ɲ..jA\.ͺ҅7]&_dw[%sOq⽕mvwO:%/_4XD~rg_3_"򙫸(/,Kv[tt,K,;ېLҕ ;/.:-6H/LD_i\.w~dw/)L|]uŬZr ϫ2".{~W.v!,:?tKX-ȎEwnnwIxv._Գ)L3˗ p/t2~WqI!½dwX$wd]6qڂ]Mvâu`_iaq:Weg?K_,j[KU˲ yqSe'_[qDn\vW-|f N2a H%=_/ntɿ?o^~粘Up0]\]3)}8knc(kW?.8Yd#L8]!2mHM2b?}#>. 4&BhȆ@U/L""ۖ?إwƳ]3 2o .6bL$i9ʦ@Ӷ)B! X7՛SɃTG)wȺUF={2ϏS̯IOg&!2x6& G``G"sy>nvpjђ!ԍ^UyI՜Z#\ӹ^K^=4PXçcMJx(!N ݷLj:YWF21% d!e&KG-eW Q;?I~݌-}ܑ S׉#:%s"=K!Db}n޷9==seuoMt27w):W8(X/Z OxT!> W7KWM>!Q ,HA+ ΕzTXtDescriptionxMAJ@}N 3a@N=?IARtUFr{W6j&l(.xC:pk)u#)^ ΈF'1ؖi iYyoL\C-P1qZDmMG"IVbI;Ȧ`A_xHBykLwnW#sIENDB`pillow-2.3.0/Tests/images/zero_bb_scale2.png0000644000175000001440000001340612257506326017641 0ustar dokousersPNG  IHDRLPLTEyIDATx^A @Yf1? Jjܹ}iKSIc ` &LLL))0S0` ` &LLL) S0S0` ` &LL)) S0S0` `LL)) S0S0` `LL)) S0S0a ` `LL))0S0S0a ` `LKnWڿw0su!Y=U5W:"'ܱ*]1Fw̚{cs1bs=m̈o̼37fW1aָv\9O}=椋fa޻s`Vc1S0S0a ` `LL))0S0S0a ` `LL))0S0S0a ` &LLL))0S0` ` &LLL) S0S0` ` &LLL) S0S0` ` &LL))`[q0;.`/WP`B_ӜD0|%Emr~A,e(,%󏉡0_DD`I*1}_q9/,_)ϥ baлM~p; ̒FLTa.k&n"~<$X50->|UTjy`[^A#A:Yw޶yDk;OKbpfFyU槄30SA ɁyTEPs:x% jvT`^fvGMF>aa,7;~%*0,92tPIypf2ᥗm{8900Hr8~8O--ߝek"~@osOo~wn+-,j̎yPۮMJVEJ~(fW8OӴuG8YNT=V$pN!V7}|+[ZZvR$0o2K71"ʌX_6ߧ(fZt8,uF0KA4&iYE30?cDއ,*UNqhf_1!x<_uk,U 'ƣeV\@Z `"5`n,Ysyfk 30,5&1QjuLeflK6Q31h& ϲx4UL\UL"Ux4Ve1kتcx43WaS^ʣ6#9TeaD() A`f5'C URS[ 0`.)CMԄLLԂ͏f`WY\IEFLRKsjLWfE30ǫިGJt7yU;W<ݛ&6iFS7/N8M6/9s*ŏWonDn^eL>1R m~0쌆iZhѼ84MWY`"1NZьdn^eQ;N8F307P |J L0e+IF&1NRF=07MZoG;o> 31ඊf`XaTd },+W)嗨R?M#[G30a ,KB 驶` wbӉf`U6%Vc ^^(DEz =v1f`bYRuBE({shfY(3s=#$Wkf`6VYPY<6!YYM ̆`ʓ9k>U6f`fЋXUY5 ̌ ~41d2}i2 h@(NXR4G30v4kU8C_,wmQO/0ѬdI@JNQl,O^ydE'FsoR /q@EiZGyRS4Ӻ22гKyM/yF8unf`ZU{4el+x8Bjh^>*VLPG2X[)`_5̐j_BpJ:CEm\6]Ldh&wāl@46Y7?\9ffDƋc6SnLa4ޭQ~tL(?~4+OO8ka[Yrm|/OXҮi&&.2O!TJ+)[L.&,JD3n9%cM4 V>?U|vB}EW8WJ}w4lfkoF)uY\'e]60Ӊ&G1q P LK!{qLCf4L3S{xS{o4Ōo`:,yS׼:61ӈ&,0&90eQLMrӌfj, |o4AC2 Mv0Ӫ)a"|N8rkt0S[4 Cg@JΖc.cl/i4ff#ff\h0uI 1)43@QsQ_Mbfw4aA(`fX^@&,Qssi=t4X h,6}xe`p/~0ܑ@}30ݾ=oiFͺ @}b30K D3k3fyLDAUѼ*h2r_ ̢1R aVm`]i[D8>튉\t⯏µ^% r~}I01K}{2U8lD" M08y,$J˖X` @(&J 8/(\ݘ&|YBvS4}2813Z7y'Lp.(=`:P2S{ V` 7쯏&VV(5"Dӵ+>J\s+,D^LRyƼH;>m3]Q՜WD5H9쇒}̙1桻|G?ݙ1}Zr0epΕ0쐰. aN߬)~hι1~Z![+U<.*`i?K7\%* 0/4QjsLX~(>C]ExO~DYϴl^)ݖ}aϋiُ+7]y['Qj6ppR45I~9U6H ֍gޟPZ0n , M0J+0֭Yu/JҺL`޿a6ݭ&L } ,,'w EvSqL,LV";&K 8rDٚRd{>]0U,QtmWaZ8&R̃ h§8 zqS``9P`Ϛ4O0jշ& iBN sY0)ev(N !3iO` V`iڎm)?ulf`扁 30g8y 30ľU5SƉy 3e>7כ=B.xߐo<!_/yw,]3wQ&tIt'%u5!00S8Dy 2<9/@8 L^j;p,fɡE60{ LNa^ ^QH"Yfkbj "\ǝj;e` 7OKX,/>k_7n47nwl`Lt-T`Nt 'Xoue& $~*B[I0LWQs @°W`}Te/iX;/&< X16.) LfUl#E60{ӤGUb3ev~- E+0GVz4 `+@Ysm`H1\|4E|y "Sf |3 3 (03 (0}KXn ^UgA ylgV &9v:PS|U1LLGW$*Ju/}ąT\其[j˼|e;P`( Oo#j!цkͻl-#} LB*~Uj aTan L0phI|[H=q׳PeYAϯ=L]0}_Pz&3K;.E0B4Lz|,ô\o(U *]"_ͺ" ?>w e@7@2#쒏Z璳jW3T]3fOhMݫy0SXڗl9%qSS.>$=AU08GJrjb69i_X8R`^:5K&WBl8R`^95Y~nNŇI#)^LM>-ɷR250U#afj) ɗR .,6䘉Ld"2LdD&2LD&2)DLd"ȔLd"2LdD&2LD&2)DLd"ȔLd"2Ld"S&2LD&2)D&2e"ȔLd"2Ld"S&2LD&2)D&2e"ȔLd"2Ld"S&2L }MmIENDB`pillow-2.3.0/Tests/images/flower.jpg0000644000175000001440000007777412257506326016302 0ustar dokousersJFIFHHExifII* z(2iCanonCanon PowerShot S402003:12:14 12:01:440220>Rn v~   |f0100px2003:12:14 12:01:442003:12:14 12:01:44 1  (D ;  & FP0 160!IMG:PowerShot S40 JPEGFirmware Version 1.10Andreas Huggel*z 9"@R980100 (HUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*UUUUUUUUUUUUUUUUUUUUEUUUUUUUUUUUUUQUUUUUUUUUQUUUUUUUUUUU    !#"! $)4,$'1'-=-167:::"*?D>8B3796    OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<Iڵ򷶹 g5V*7XY*çZ`oZ.8xFSpjM68^X+“F 7^N  28oZg2Diޠխ>ް+FW+nL4ZEA/{eqK*Lv7?Z͙ o~R_{ !EZ}l1-⾸&'xx RG||y{?Xb[4zo#2*z ~ӵH<}\j2Tk&(7%G¥ZYe$drJqkFYn"FAw+F&*T;E0= =xK7*ޒmrpz l]8JĚ;+zBr**ǦSZrZЫȪt#UƚYhŚCM{ܻy}Z#{YW3 T5ClHZ4=MtuRu!> M} ٦ aW+{.t,t G58F[͏xo'k9o5{o8iJDj7H̜{}if1ʤ27K{')ZKe1z37~E]Ј+ܑ_"3qzY fBk9nKuw…9ɂ-hE2IG,Y޼]~ww~dm`($޺m;òi_lXf 㹭ҧ3iQiM#8G'n&$2zA9]hN?~+:9ϠejA ~%^<}9-㼴n_ݖ4!q1/iCwZ>S>*cgMH[ܩ9,>WVN9@4jǁcӭ>fUJr?Zni]$▟e( rAsJQy/#kwǸ'^sUe@㞧WEһZ.pBf_0\9W;w>"kF)D8K}s?N[ߎƼcR}oCz:4N/B9%{+#`N;P{R Z0gh9&%&SqJeF"d?\6m5$,xGVWFʳel[2Kr?O}qƿwi(]i]^M7Og6%7VW ZKE9BKk^TRJ1sުi|Y ~@=3ްqV[ӽ9[Y8GD,kZpI!'Fsa&ؤqsL*:dv?ZIYޢpʖIݽׁH~6,g('\o%N'OKiKF;O38=>jG z˞z|1M_kQS]):t˷ q^{=4"3OA,0@ vՑbb,_0oӏL֜uCUL!aTֹt 0וsXJr1$ ZG]q~^{P*HPf6]i\sx}3]}/R}ҷlj3}+U կu6+C4~ #SS=@XU5 n`+®ؘ#ב\egg ^riIo&e'"O>5bmluR}QYZ־QSoiV qB+þ ڵfӠϔ rU{㜞V5sɥ߱**)iJ-Ey)dNq+2 ŧ|>+S-9'nx5EY%OrQrpE^Uw:"$zƗSGe JMWQw(a=ttТ_[[bӋ`j OӥHƹެw!*y BX_-\6&T]k:RzN=џks&vPq`r꺀22DSt ½EJQki:Q·摥{3&8?Vo3etdNQթ96;0{]SG.{)cma6aiϠ> amӭWˍP8D^?۔t^8{)=)Y}Q\׿ֹ/;>X׏CE'g-2P֌p,c_ֵgmvBE[2赯[)C٫[4(H-CVGq 3jD*v%Q#ib*<ުs\iѪuwQN7fwj)_Ho|C(m9Gނnu[gqQkXRKҔ_ բX˙6PE$VrBo,޸jgʾpr܎nm4=$\(#!GW5˨\AjeF0(KXn8z5ܚ%^J`O01֥o[G,Vosҵ:b+|)yeˏ1Q:qK]MyC6:-9Tƽ}+-wa# < ޿_oƱQ5FڭQy)a@Jt^brUkN^:,~{d?5n"T+2nǺU>fn TؑF>h2dAN]%G"G9zƪ~H +c(jܞr\I;o7(=EJIpIس&3E.ȀICj8 V = ȫǎ@_ 85N? #ߑ#ȭ=Yy vRjVZ]xbH.ZYTd)MӴxUoރʺ?NZ] 7QOI'iywn͜n`,W 6 dPa:!ѵj:;x=Մԥ~<`sЦx"sXw kTdӓzwI]21!>v5˻^;}Z-:;#цEl^';M60{S/Ft矧B&fV@qU`||ǯ֐*Tu=XZ-9=Wfw4V<.W9Ͻ?d%qu3hR3ȸY1ZɣFu1|g=iI`krVdAwzx3CkIo1Hq-F1-šόB EY&n.7.>Q\sLvoVbhEi$č>nkѴ!2YOQZ]%}ɖKԠL’:GY-sXr;hm'9\M1PjKnfC<74IE֮Tr(^'9jx]F%_=l|T ,nHC#+DUkM *BPض1jimWI :)E8O=Ss{Pda]//h|?Xcb~C4RX*=F;8 DR=D P݆[:E-p_ޜF1Se\Ҟ n g95!9 ;@LIB팚}qUˆL);@fxh$Tvsqn()Xwn¶Nc&먜+â} e9cڹ-vF1Ħ$!D ssQHI'zn׵Qp)X)]Jr:Ӎ9SJ`% (M ^]Gjic4`W9 q>O^bf:W$ޮAަD )f@ޏC-&#sl y_Vm\w5[m,u8&^E|<-9zΝP˰*㘭zqK;OI>XW1e4su +܍[~u=\Z/񱶑΢pS[C= YX\_6!LյFCޑ+Q!Oza *(J2"] tҧ]qdeOҸIOM{D[ ҌUb2HMR^Uh*3 4'H16”R ^zѡvEu؃A:@_#P#4Qtb{@ҘbƙŲ\tWUrEqcWsAʒf+KSwwN6H9[#*{qSM s1mRU v5*V`nCaQB$ JHf鰦cJQHi@lCQԝ:RA@[$+ajceSU.1Zkrfk%pRC 3'Qd#yfJ)ҩ1viVAHu7N99R!bFYGIirƒrKwVN޺fW.Q%P, vO|F g(iR9`O*][`l)07:ll)l >1ڎ* p<ý9ϭWC$L r٧<'}Ae96&p;1incwCڒvOc9ʕF9GjaԧIR r +FPo5ocSTqgWx*LZ&|n@)F֤BI8w'~l'q&}a556lND#7BT:\Q )ziűAz$,WjGZm4|HWY;Ksܨny/jdR (Zkm {="#DVOVl²Ow)U*a8ce;֮‰;z[r tD-!X[\n^@3c#J0FFҏ WNKH e?qS47dhFPzhM٩tQL3IdR9;1Y4fRe#*FUL9y<$"=!aI:$"?ҕ@ήCEy |rCB9rēM(7/q yG.돔c~q#OPbv8&:xcܹ⅐Q K{άAUr9BX6ǡklsI~nN`Sz(m0)6޸#zf9sDVucrEsƪBpIؚ%J.QI93 k+1݁۰:rG֢J@l>S]1c@[pp;O,]zKzy"ر>Q,JiF1Q&!N1ʐ0?Ў݈9# HһRqRPwE 2gj]#~Duά۱#J1~@Fz67^^2Dq4x89lu4rq <ʠimEj>Ҫ];{jV˳{ EW'K0dvŽAyvgcsI{LBm{[[ǩ5k?OٌmVe*"s>rNPϑ!èHG)ySAT׆X:)R1W3 0;pEh 2l+|X'K7-c.-TNå׾$TO#U|NF᫋N9:ҽ>0*6S_A[K$&QMzn! 'WP^ì"6䚲ymb%@8,hJ/)q X%{ =HɪsIWhCE(yg@1ٜ{5HR\S ׄ4 SBWT]levkm@@sgh|.&e dNHHf{xH=WN_IF]TR$Tm-b{3]]֐.޵1j[3)殐b@i2Ms7ۻq<PȥX ҁ1U'Wr9y9u-˲Ӟ BB)+̨pHgz΢rz҃K+.iVr5C!ԟjr+gAA{e})Zf%wj=Ƥڑ0rPy3"55IƸ\.ؕooJJoq{[d?ēL!F .kHnk֬8puje^dC 8]pi⌼2I; |Cdlkc!Tk⋞/&o;Foz<$!TBr,H<( 2)Jd)q\LS'n{TdYN7C1*3&u=TeiЁf=q▚ .h0 lۃX;ֻeXCN P)qT!F :P6F=UcU+ Y gC#D~k$\ҕdM* eXn#"''jدM8T;iONe`,3S4v{KU^tSxگnKʣ"?kF(l<)k@<=+gG\1;;vMEX69WJT?P*/D d`A۵My^ºcnmټd`Y9Q]GTso$`t c;۝p W;mڊ˂A3Q cmT[;Rzrh䇕)H JR) r*$M6fA1)}ӡ vSy`Cu/U5 xbڰ@&"ƛ #NQ._*@WS|.K{>0C`7V cO^TOs [A/Cڍba=9K'lPX:]rRqh,&τo.?J=TI4G$f%: Xp{k]3mWi 8c7ۈ!iٞ4Ҵ`t*B+1\Fcf2-|clSNhjsl>VlU=W?mg(r*,{qz;ҕ>eƒ9N]Qޝr .[ֈXw܋j8dQr-Wj8 ģ=E_5*CΖ;6@<0"3)ӕFhFۃlr"~GwݘT6>^B| s'GqL#}Zf @uQxeẃ“"Tcוd5D7Bv 0íE,2H=U$zPKԠԓ 3@.`d0ҩ.8MٌU\H#@fK4^eEjz? 'G"䍫yɨ\&F{AƐ'乤agW]FX{ BI9&SJb ʂu$07"mcOl~ 9'z:YP2Gz/h'a5KAçd8uJ5ŷ bHe?/" {Ғ_@dcB"Ζ95BV^jH`HSApƁ]i(ޑTqV|VFM?j{ҒJ7"X 11ffQYؼ~.{VT`E'r/Y<NheGZ\HΓQґX-cHl>Ƙ([8=w*}(pfbsFT]mc#rXե>E Pt)WSB &j̷Y1^~BP;?Kc!Vu8˳)Zaޥ"O:֏o@ԍ Vɫ X!u5W /?jFY aBemBwSeGֳ"*ۻ|Z2[*G.n3mBGҫSBAEOzӭ ‘ՍWu!vaך]4đHR^x&BJORq&PIՕORhR8ʚY7`Q\G?DK(z+*2}ӌY> ; hY{yx1Rjb "YZFs{Xqƻ#_JjT{ʡ,1򌊮N+#"XOZn֮P ~g " շޏN=(NUhk [;sqjPrqK1Jm61dFcOlW'(rֺ5 |wd6vYgα.;.rcE W!x3ҡ_qe8T8gr.cuɓ}&(Ct'(#d;o*^ 0TNqo^T)g,sNq(lAᐖF*}:~$r?dp)wahRRLw #(bH#A{VnJ4' Çt]1EƟ7aP-RoX8y  fϓ`(3 [ D)XYiDlO1j|(s@#ە 60{QrXQN_s vm:Z蹑ܨNwh DwLjx)ڟu-j4G?CΞHޤ[D_*WGK{{X} om+eT6KZ?h:K0.I;Ԧm W&Ib @*y\y$2H%BX)0ik0"Kx=S]=jp`WS U/̭qdIEUMq(Ihe郃[坳E3r^:߉.m@FzG'yA[A.F;`Ub>e4m)dOF"~3u6t/Agy]>ן  [cT[Ko!IPU$8i8o6O<`yFO«ox%ݘ/Ĉ~t~;љǖDyT|c~f I[Vj:l8i4͙PyI?0uF#|K#%hQOC?9/N"eՐgzrOlJE3yʝ U1j;i sM^qNDsu' .% j3s7ҌHwPnapPgYV 8b0qoW|f.aZ2F1<ϧQ5*;2@IJ ]]keEiTq߭3&X! XyIT)&u@;jI,d[#EUP9c&V=;͙%gqq ipb`axKؔ,J1ArKxL *UpqQxm6F %JSƨ~n#n//b9f$[s^j jT`YoH -31Ҵ Lrc8Q+ܝ. ## ՆA3iKep_^Ma#zn J,y5YD>%"HP'bR1Spp%9޲HWHmk%i oNP6v5,D !i_-j l5/ cqI<szVwn"!m*ESOsjn;ĝτT?a\X~NGMb4_ 8dFAqpvҶQUHbU ]Wj͚Yemprj5+f(O`^ͽ/|?qY(L de?@]pp쇳 |lwҿzE)&Gc=z/hM?3vQFD`k#vB='2owG- N,/Q&}K$pi8a* ό`uD#sM9B;Hz!W4D H30G % SM;#}BNd|Q8|Xrt#$S>z3I"1VCEh>3H0#ڲw~aJɞKhXq6ujbLcq'^Ug2y8ua^iy OjIEyȗKŇYn" $y+)}åkmJ߭i9TGZퟭRk}Gj*vT<$W \-z4Sq`!‚u銓wjn%1Mc85g_X0jh+7<`ᇕX3RᛈXJfcl*"x Kgw ^jqxmQ|{쯊>!k #Cn!`yc9ޫ%4ăJke[9h. `>7Ǽ!#,$l*M'2{G8hga 50⼣'Xv^km0>ٯ\P]|:vqGδځt.'jЖŚq^=itۑkYO4r& ,C{s\>d xD# #FֱRD0^+p|8PrbNJ9kI6g'۞+[kX_qqs >:++D&푂ǩ=zE3*z>+ 6V3K,ǖb@]XYe/\"'äa#&4! ]G#ӧښfeFWK<2Uyx#%Of4,qC`Jե4lvhMr7kpILNY4nzJF㣀3m E5'hxdz j?6:ӰtGYo3chhE!ۘSI%zN[ɔh-G]pE8&f~[-N67unOζ|BωV+c >\;3,bՋ|{bqeL,hIdˤه#ZOo߇N rLZ6 HQ(p{WKjKllXn|y4v~.#E(oGP߾+W%(|n<79 V.>+;?Ǖv'#u_SUg_ _gmMo=|5?}ooe8lV6Qp0>5vrU*-±D^Ck hy03E}vBUF=j#~/dy@|+-n_O2C Di$\docU2Qux?Gs6cWSQs&y(+U)w8^KŁͶ@@#IT6wl|ue1l]CO\Qں«ipw iJg8eIu HU~a%o%0$@qYK2] /q۪a,ߥ? M/4rϵa)HS\(-(Rcs]in O3Z|4JGC֊(cqSEEfr]i$%'HwM- Տ!SHP]'$s;ttKO6x$& `THF⮢L6JfgDjJxL< :)Sczc>|iE?9|uN S\} u,Κ϶ka~@&i =h`s\ēwJBY)ԀhZa6:tvv=7:$V+9;aPrsJI9v#qO@5W!dO}h %/ cV1F\S*y<9lTu&jF=Eu7Þx&6'OWU)s`,n2`2j^׈ CuhڑJe/THٽz z{H$zЫ, S8&vE$k|mqcZ;␗QF;cO"n9u8e$Pktk˨ԳA?N? ~&lyAc[U\ pF6mOnٮy| Ek (2ګˏSqZ~I(`p ex6 v*Me?Zf*V(xl7?k:$DEKEH5UqpRx2w m NhJE98˨r=Zjɵt,m. .NڋXxm?ef<n'i$ČGEi87 Zq!Y/Q^Η-›9?l{d p5nGGM+Y?vtdQ9n8^faj#V4$2174gٳ֋1x=imC& # 0UX i3{T\S3|SiiPѪf%2;ArNnEm“E 8 iłƪ۲Ӓ&ݪRrue|zT-(oLH۹]xrc):HUeRDǷJTr\zO3",83E"1U$ k9yu6'Aь΄3̮D~nusmr+%[hl0)a$xbqN;@hj*䣲H~,H)㌻G[C)9Wh^,yJC?.:瞒 e|zԭlW $`mI,Obr \IupHs)CrNx?oJ1ȃ\%A_sQ@VRr6zR9`+7v)҆doאVؒ}*C">i3~􅱷/N``H7?jS;sw8k_Mw<X(: 4c#ǵ)d9V3K'ggtySj]^ ,yՙAh03(SDDtf3!ؚ\8wi1#M6V߄Cw?Zpobcy %ݷf56rlqj2i)e䫱ڰF3n.mM~b׭i ,r) 0v"Onx. q˔2Tf PZŰzF) Ajuɫ^!PH=yՄqwE/:QTzT.H"0'{HKwuQj$f6P䎆r,1OIHxꏒ=iǮNFLjw#'ļv!,g"R)y0޳ƻ6hd>SĴ.Ud2$IB۝n9k%%T+Xvkʤb5 Y4tk9#WOj{iiSprizߨz)g=uqO71)۵EJB"c9Ǧ}8`lH> F8`j|ت!QA<*0P@03X~>p$ t/သ5S2V\2`|2#sȞ)Msc4Ke)sPwCJ1CCVXWT! FCzˌ8^¥NU(pK)7gŇa _9)U,zhaNH $J<4*-C!q!@#OsEY2ڏd#s9Ap=iھNy&M*኷Z]'#gpÝX1R.QqtT`pAƶY ʤMAs]9T).,x|#+F~hn;׿5H.fk%ډgQ aix|sXISsv"7/j5GSNQ֚Bzⳓ1Ge :mmH Ǘ!\*zWޥ{uzѮlm]X֫'W&M+CYIPҳs,'cS!CFʹeiT0 9-g@:iUdRO3PT2T65_6\ ZȤHvo0$㍴2vSf2Ϋ>"ۃMwѱSL+9!#*CQPA U6w\ _- 4qD|7R{r?jG0ϑq+zecuof|B ̺H^9>#ʤ|Eo8uڻqdX7~~bc:ȹmk$vPODEni͚-7`zsjQӸ=͞}N1rQi/3 +ER ,8mLq1ڄYߠ¯3@U!ncjE}+Df+K9J;إZdpjH[L!I~U.je /F6܎=mm" Yg,ͥ߅eJ0;V2G3xb0#;Qkڽ]>սyU_vrֳgє]7Ks(( ^b̿Q|mr&Q3Ҩ8|:de rXi= מjٱ[Ec6(q]=^He[&9&j[o0zf0]NA!W_2ҳTJ\I 5cox~n2&YQI]&Xu9GX{ֵ~b>7G]R=H^jH#~9]N?Vrspl/_\W*HdNj2nDI2#ռrbɃUbFelup\}IZ5Mш:Xc4]M1kew֒C!P{Rڰ2ӂiha@lSٴϽAf2HRkk3Aa~vV(L-YBdUf5cE`K{–kuI; ,ZdiUF|BnBJ?Zs:=J"q۸#UӪ lS+H],֓pQYS zW#G#O4~i\ '5Cִ:H@lU-%QG1:a$=k).C+ ]Fig7S#^y'Ǚ4|p7Ɠ#p:N2;2q:19zӔ7ngp!X -֎bsz=1OprZʼ aWdNSǹJ!bUrO*SSu?ڑA緥* Xۧ:<.TnF :*%I[їd2W5+#BrI0|=:.Nq z1AȯLkh~;>5h$Njh0^o'jKN\Wjjh6RZOsZڵ<. hJ XE_W[e- XO 8K1{ixn-PjPޜ2Y? ?o jx1sW@T"SYYx4p|8xZ>r%t}ՇkGםaȅ'5a0}x 煰NmnoS+= LsoҧsfّN?yQK/TjuCiSR譴y k>1l!Pɮ\Err DotBG\h JNٸ-ΕTѤ&IZm攰i0Ȼ<6m"C#aP䳹BcQLC.Jnw+28=zR:8Kwcc =SNpU>AiLE /\aI8`Qu4 ) ݨ顑 ] ^tIUO9gz@@ .Rw=JH|axvG*? Rs?1#~Aօn ,Y33tj `(bO^˶1v ,Ky㩣"r?j =ŊZ5Y; CnOJH: )͈aʘxnF¯ i8$D%Sr!KhlI *FW,'3NUMHŭ©O&b]B!8:L(`Rj9(7RI:@> ) a0f Ϝ=I59YO?$ݕwAhVL'r֤Ȭxu qE'rc=};Ǟ⦆|\:ެ?Q^"S*mf\h|d+N8Wk:qS"jRm^]3҈GF<)-;,HPJ⥵.Ncq3KmbI'.«nE~pHDlEPyMhQQD#J?11S@ˍ W~4iҤJFkXdR31J"}R=TjNqHpJDZd4zkFnȵ47ތN?͚}ip1Fb,T֏/|k&hjYXb8"c5dϯ0H8 4=␈&K`yrCڣ@Փ {RHXUo$=$h+`]mQcRX@jN pw?IXߝ#Z0LzP );rE *GoZHRczb(ѱ=@'މqΙBqNTʀ;錏KT!m`1qTW&oN|C<]\U qvOp,˿AQhKWRH~siׂ)MapJD7p*HҶ3ÀݾTwQ/q$l>r0W߆YтFZU"pӃ "T%ś?HBy 1\{U2~NwLo&*[Vp̑MSMܫE`WEOK5:P-mdžڟ=kW~eTxc&wG%yK ӹL;s",AM*뤰iYn'R{9e-5Όn%oGYU?b}qPOg4D5/.uHwF=EEY8'c,fBM+7N{P?tyzFYU0ɰS-TNJe_\fRAkyC8i|]bTfO(=x C5yS+m-\N zTHҠᒦ. Lelr8`ji$XH:jCQF1&csAa {Cdj@EuJ:&MAM9ϵ#Ff#JM*OxtELcU˥OT> W 03FEѠ>ҹT2ix\mNUSySl(e$҈kܔWi`}k$G1^+\qo2"&_; Y""Zh+W=*\rijvSU`GWr&:\bޕ&RPqΝ\ ]Ky/D,V~)i W :f$5L =*"Y>žUiJzѲGFk049-"cܠTq^ kl;1ڃh䕦T$lpv":ذ̤ǒՄ*YƓǟ궳ӓtWTZNGw&lIP.m9ڧڡ\`{Ce *Iedk$;Aި/L\]1CUP"0\VQi5٦RI&]\GĮb_5O,H坙ci12*ɾkyp@#zFLn+ߵ4+~ԙȥR>Ի9#;SE0e_` 4.nxJҽ`k̔=OüP6rAkFSuR}jl0@szaQ ,Lc  vA;f`G"~b:ja\-]L!8w\sU(nT gv5uôy¡VT~>$ĠG.eP:} "Ld LBsxy@?枋Hj:D3ZfslmAM+eAo;!$@ tjv H s3ntCh^4h1:K׆{9Ug<^"}v$U :fSDzխPڣ.oy5+iXv}on !=XG _Zf v2ztq92 "UK,Fgn٧2 9vMnu Jr}dOiʐ0ɦ(A#qޗQq~29Le9SJT>WRԝs@ R-nMA?ehn:WL9]%FszLԬw)$# p5:0*E7YuirӣH<ߥqgje5R^M? Y?sHCFC?#e5cۮbjF J-ǨǸm:QVqknV5tZ]Xiz\9>F*N#ڣxԒ3dۨb,4JQ,^Z`rF:Fv uCo@3lӲqSA@B[Er!?6HPxZx2O?ځ[F`pqD XxKNyy-+v9'F#G*3;6K7ĉ;\IA)1sE4G+?QUZiC0Fjh6 *AT6zpY- fCtvU<ҭJc4jO*% v\0) }ZƌNkv IR(ep0ip0q9k?g"RK;S pN"9MvާLOUVĀw-d${ 7]]ik',P C˯uEK2linTw'1R ԏki7bK%/*OjB0D-eU Skg18dafBVFErUQ:?kU-b`ABIuuf9#zS WT26޻9Ԅ0g#C:[WSZ3{N]]@ v=GSWWP0lن:RtChp@y1t8!{w  +$L9K)Dϧ>0 Ačuu !_I!dꭸ]wQ̆>h/w 81Jk:ݏ0NzvS]]T AQBۃocNk8ʣHۨAۭ&I} ^ǹA]]@guup8S!" uuz7¿,8}ִ2 `qM0_c \EXKH˱)kM0m5y߇ l<0[/1ΫUv5E0@n7I"Yx{ )o(b ܒ 07,R?bl{T9~"qQ $ku n;ho Zބ _ХJ9s蓄vB~ p2hQDv <24%$W5[}hH_s'=~h9n8erd8nB7}<]0/l !l;doY]{P@ je'EJ Xvyw | dENY&*̄Xehi'P ey8r4" 2G뼇0R2Ҭ8 2; Y}nf&ƷY]ͷ%Eû`\ .*{e#m}26Ƕs`cl*l +G@6IaxZ9~gْ"}YuutA3Yl9FQ8e,9,6UoZbn>kxL>fђ } V>ܾK.!)mK2>V4< vkqV=ŢA8rD$6[q`9(w\ sȵ=(4<8}s"ģ1@mk#81u$뾎VI(N/ɪ^ 4Zwk YgLp㷂86@ӆV~X${"O>Pu~"c'ePt6M,7[yxZz)>DNco;9lA{0q о÷+P\;Ulr6򊬉6e#}G[23Vt!І fae|CJ3om6NKk]JɧX1@u y qV(lO06&YdN1ӌgm߂.%ֱHZv} CNrǐQ~U(L)}B[a&SD$Z>Sb˰x:f5VYU-Š+ Yl0 x^rN isԝ+˴Ή V$>">H s oa^8x3jxù.hc] qtAUOiǘ_淈qf)qd.QF۵ѼZN;5/:o [e2|xm/)M`183A(34xL$M/%' r9ZZxNe6=XalSBBy8+ UHcX!Zcm :wGtdNhڋUX-{A8U)* d-j8fѬ y޲jҝ"$;%]y욠w(g2>wHjM3b'٪^b V.c&a#6myhRKtF`U>P,wq9ER_DBZvQxxFL2c58J܋xLJyuݶ( e-xݥ:lKʼnieE~ }0/@6?͎Z}9q||2B'<2 kitثڱ tg* Zu=קC {k QVٹא"m~OقQl4LYE=$[4n bPޏ~s;vZQ]D@A ] xxv2raV,rui OD׹ ;DpTit#"{s!]]t% ݄\IUD,nj/%tG5tV}S'.᱀/Xg )ۉnۍ6c:|PIY$%{ `x2Ex^<ʪg%7 x)2Tw1yXAr\Nt]hSP4"VjD}d¤v\l&eU 4T,\TXg [La.Ś^N\6Zq%qiʺXdM|"TA,Ӣou,2,3G۰C7gS=}%e67BGx&;c7a,v:|:fUe ıs q.TtT2m=ع+#EF-Eurd[on&Z=Pbv^fsd*XqJۇZԳ{ t>%d_`. ~7p+iY*M֪ hڰκ2#sHbmDw{{g3*35^-dאrU[PWPQ'r[ڋ5^$C )M>ȩ *2<ݻx.Q_RǢH$Zey9}nVҝ; pSu"ΨZѵvTϲFG}8) WӲUW(]3{P硷d_Vi NWHj2hAݢSu u2YQ?۷V&ρ};7/V ݄źSy*(Ŭ5uf,^$UUj>ylix"&Vm82ecuZsT[47t~WOH\et: |Yn_(nueT݄E^f d& r:-l,vnpKпnV[GqYyC_CYx\/AĶgchbuX Hك=殸OԋH'.oc5Xi{%uU#_TG -c'2D\TE3#GX;D$D8}RO/޸˱͂nx̅hŪ*>aY!qWgbF"Oϩ>QhNX𲛯6F Ug>U%P&qFu\3t֙U-oH;ߧSg!:]Մm̦dΩ u¬;UI]˒[ O(~Tw-CeaTL3GhwgnYz aҥw t*Di3fGm5vGR:VaYޤ9,g_ζuVdMq"GPYto:3hŪaޒx0nErBUa v)$.ź`s*EME$n뺫գ*:ͱS6cD]-:-/aW bnsj6xc!נ_ml ]d?BS , ml3"9<>(\;lʾ]q5!Ƿl{GTujW C9[o zlQ%ԷjDΉVx66!<'-STE=։`iՕ>`GIgVF r:ػAtGvZT^|: Ex=/{JuJ=x3]"ӧ?պyU:7ds2>}x V]u.n'?ט:l %T@@  H@n^f()12bit.MM.cropped.tifHHpillow-2.3.0/Tests/images/non_zero_bb_scale2.png0000644000175000001440000001256112257506326020514 0ustar dokousersPNG  IHDRniPLTEyIDATx^A0@Yf1?j}lB}KSh ZAh @hР:{Wϕxt}Cn}2WU]cT\鈜sqq5cƿsԄ~8 z9k_T#>*hot/ꫠAט7kL_Р穣S뺇te ZAh @hР@-Р4h-РA 4h ZA 4h ZAh @hР@-Р4h-РA 4h ZA 4h ZAh @hР@-Р4h-РA ;Ln[G[Nh1,=9CpO/2S):|Яͥ57tLoqk@> `qHJIrqRP~CXNnH oohNh~F~C^`Y m׆Go+NkjnepAM|CӎE D ͵Psiê .h?o9W-hSM'zoh<tD = \VoM|Csm91 :ŚR8ٴ)(}Bf#,iG+B-W @ÆN]jMC- vu.26z6w;9 I 5'p@WWz0s*O^~m%T 걡qmY= U7G[5 A2aen &)rih-ݳ/ ÇΘk-k/tx\A>#: Pg|?.͡v Z co:W. 3t =աN菢ׅtG],iўP*t.h\%h$ zQ99>rAh834rM\DБIlhUR LtPK!%)z w\:.hRN8iMJVsMW՘Ht4@/L͕&.gr%h5S P̴?Z.m"žn4LH7Cu2As}ؤ栚 *Æ#AA2Lh?Ԋ7#ғCԵ j2%K-%h#fG^@PP wdPŀnǁX [:9JKW҉@}*}h#="tݤTBIpP>~sQ qPЍThBw#=?4YDd0oǛ~gzh4w.-Ш:Ss9-hFߓ:#x4tWi:p͏dsgF64ޭXy9 ["Z+ûF-́#4nL}%\]H ;͑%Y.tmO4丝-T dhVDzZh}Jb%LLWi3Vre0 HO kN!@dI!BG\#𾤢Bn-.{" 6#j>Dl :4֌A/i6Pʓ%(Z R{kiN K. z uJ9L0 2YP'y#"g=Vs ʏOPs =]j~зevB"B}e$Z.kM#wF11UtCU;[%tH`Cx.ԇvDzNhuwYaZX#=teGGD͋v_6,$-ƀGf#>Q>!?npjtGm386:CEoD;%GKUX!bc#uu+2aJ"3H6;ǣ@#ʜ~ žHkڏtv WU,'*BM4/nCИO1#ʴF=Êch,=2/3bua21i8wAc(?愶#K/4o6G:Hu-i1FZaaGZJ6h3\[Rڢ{Glف"9,F9%|~Wr&:GMWM .:㇙"--˲N 0v}J }/i;[@=t6`qMEz}&SkYھMzlЙ;tܧײwu:h١$ȝCA߅A=tͥ3|/UCe=t>4v 3O4, :3t/L 2t76B O(.hP}[KYo]Ɗ#Рx4V1hnőƊUTȼzYA=$4jhg:hʒ;X@ ԃ<2  3yѻ3{-Or4͝-Azᑙ\aF 3R g>2 BUgfFkvyY?瑙\`>0ڥ:[ַ;#8 =lLjK^M}64 v0]M]Q@3}63t(h*jtڭ}E-Th4ò+cGė TZmr"44FcgQsh2 zhә{$:gs>4A Ƃ[ #'%UMt[Acb>u1fP3 *m@'&ehޙJiB >8`DRB?fC@ GZYsO*0YVҷڵx=h RN>8POKzBųOq !(˲TZ.1<XZ󮅐<賊Ҷt,|>4ONi[[BШeci+{ zhh2B qTC8F{-Z_o;cjKܐsJRR:4;_{wH 4q>H,gE! `' dp] wgA[;?>; 4xwgFsbI]suor~IFctۤ<Z+*8}erMÈc:4-u9/u(CXc24Qv JжBY0p~vGh"1B'A74@e;߬_ C_Za zh? kE^-;A']Y`'P- jqLmo OZyШ+=( A @x۩v&e#&lX ˨~$i/LПM+5GAa n40P/B?uy7hf-߬;Mk$PΆ/Yւ͂ .W`qXkA.脵7} ]Сf[_ :\ci#QӨ] HpA @'A8 H}H-ݛ\68 :3 Ѭ(?.T(hQ9ʹm>'(1R٨/^}*:F_A/TAOs%G_aW˾Bʛ5_ ]ЪXXbO 3#^[bA/cu -p誂.誂.肮*肮*Sk^@ߡ`h0~V6yf0PXx0z0, ^Ƃ1x. {A 4`iYyseۀQXlBiFnKdm֔Nn+6Y2-4LQͼʼmzjF4el-0x9[CӖM-f^v@7@m} fVo;A @OݍMOFO\&+hrOd}t4+ݨ =HFWMP3\ `0#V޼uүQ:'Q1t!sޣVQ-:G(آ28 |뾀yWhyXZ jI0hmD7a󿥨}]ww-YKIC`^}*GyYX.;qQmh%؊g-3̱(@d薀.8W+ jϭF3x֫YMz܀̴96QxA('Džl]BA~hB9ֽTyi\6f.HcyaKdVjXmLP~PojqKgZZdSo,Ҳٖ-?>R DOa.\Mק)ښ,L*o*gW\zg|$뀖7u/sׁ5@uz܅EPkGX8rVqPw 6@KzwT`0Ex`eel}g27nT`IqEŇs XдsV :Л]"YA)$@)l,}q9b/"&L8:,]:vn'!v%Mq(C' #U ߲xr^ w|[,ZOI0֮}k4}' 2xf~ߑBD,fXNcƷ19_ynҝW.xWdi+FJܺ}F X몮 dі; CzcCBk"1Zۯ|I`+@mUp,*"J)&^ hBK 90ϫ9@/n/M<7u[Ɔ쬆M%_y%Vrymc%WHDdK:9xʡfꎰq>8;6]ez]z:!*N8(/$'`zVdQK3n# #|oK㯩a jSFՊ6>a6],{(;[_<*F4&= ƜϚ%X.bsT>inf2|^I7BH1!zRwz5_Zvde3 M F|tF o^(8Ve- Jr9u4⊐nQmP@ih_"0(+ 舳mA!CM"G4K~W=\g 6I~WK8|1Ҙ$ ˞~džS" lPR A`C5(!,ǝks( җ|T@HB* (F/nZp*K 5y(Vw3]g&14@%1qϋ4:ԉ0LF`"`0(7ˀ-< S*whBx+J2x򪳺2{%֦I^X:z~88\-P""ժچ_bkhU|/oZba4Xa[:3â/vexkګcƬ =^x\ҽ^) `' Y:Xp_ݕKǥxqe=t zVrܯ_6#m4CXc1+A!gi9 ޷BBAdN6PI}`u757mLR0 N*FJ ^kV>˱V|7xNP?CZn$0{Wo@.4&cp\p2q1v7}^8?Y>3T>mg#z8!iک8Vh BY$d>X )ס r>}̟x|y}W0qLYɡiCj8[$(X5B.x[+bs|nZ#3*ر)Eaқ Q+cJdf Rˊߖө1B)W/q=zopۅBwl4By;٬E^nS1dTl 1DN ϧYĒK'^sSu>nqki{7snʌtfyq^j8?\Yďj=R?¡mwMLp˫.]'(M.T JY ˅HovDCT v6tT0hP7>Vl wѷQ-6=0)〵Ouy3ΙU]gw{I}Bт,ac\2@JK96!8 *e Lq ؎ # F6 " I#23wOfFŖIUU]v=|oJ=qJFJ/ 9uӫB!h2B@@3WT]K8@3pRsHMXöa Yظr't^_\ d'߸IK zBsPV~Kid{rpRc6'UɍK밫h8'BwIW;0N4eǥxj4.㝤ktuԍ`D#o!盗g7yW8'{jAY2`*n} }p11qZԩl+?aّ Q ULZw bF=MqY,%[b{OEk1mNo=^ ʲ*syf[ EgL`cEBQz6ȉ~vS`&6kEU) eyޥ.ܣh&f[Ԥڋ,:?e+;F^.g4=A̽t!6%ۄ"m_2FhW*BwI}si7 M 29$[j?NW&[) >CHQ|jC6 697\-!G&KȎG*bٔ5 }uJ}= -tP4:Q>Q9QbCbS]_&5uW[yfU=BoGq_5M8ӧ,Mgxٕ̍~m%H1|Ha[r~!^e%~q[~!1.HJj#PlRר7[N5̓5gӁjr3RK8u]}<՚ͪU#e2ic;%T@K5a>WjBFUyKP ᳿s`3'NcK[y{oǐ l ںq.z=rumR&(H V ۃj*搁V /v/rZ'+%L?-)e=kഌ?SF (p1gRHfn9 d8A {SwxXz2s2>1W=Ͱep˜.]r;QЀqˏ雥S]V42uIk|mH"ҵoVTavI3y#^tn!@&ٿv[*,8-Ѐ@MK.ާQ 唢 VygG wɚ B5-ۏށ!k$@=WdGaTQKS/; lT sb9Mf%!v1rΒ"ݿ!| .T^1ufNBphX.w';8RxuPE5@BfmWn{Q(Jfk M]yof^ް632@Mni @[^ 0U`?y+ujgWz,gxt}x͂!a/))z \:D|y)yUO4:ƛk`Osh=BK! ٽS."÷ nTG!ʾCُLϥp ~ZzkGi*PZ)b Sk1"ba ;灆WGd^Osc2s3{# MS=Elfz^xkkB%Ar3dF8h扻S7 n͓Ӓ&4šJFL 4X3x>y񑊽qR?^NX~I?m  Oޱp г;?]` FU W]GWnXlxy^:Ǹ8(q/ޛ3Gm򉿾.ޚmOT>,ݒ|jV.;{l ӳ&nAJ>&E夝vNI;i'`wDMw& c 3QD$1a5l@\޿|׵vtі/ ˲eCέصoa5Z%ĄDk% #[Jωv:vYg\uKv /a歔G'vꉰ+iA zf!FDq*cRJJs,[U=08E~5[z7iȇ{vB@4ZA{PsK>|6=^ncBKŶ6ZZ|,^ˮ}cguޘ}VADr>"j&ʲ/?EU;F0nB.m]`Ņ\$e?ᙲ%0zhKשM@,րRt˖LװD*"cUݧ&yQ/4 6&8m, 6c6Wx '7ks'R6LoEҿ)6twNomWCqSIX:Ka@m\~E;ZSn[mYY)pg1F%FjFjIզ 0 _LUVU.+=,01bC6'DFkǪq4d5qaL0x>}AqĜ֝Yf-0VC>Z*@ݫ6m OU7b抛Y(QNr1&N?L7ck]r?æ"|lڂ"AQ}0&X=f3J,ml4("C2nn#pN12P\Ч!>,g3N+jit\PIyxh‚Pk~y0] թ8sMG>ͤc]Xgt5^_=S&AL"*J[@<-}Lu@zښҟ[2 v=@&tqyB r RXDHZLAъ[]}?T5)`#8i&]ٗ}x͞:3? |4Q gl/Ig<Ё+>.U}C5g n2I)$5uD-r?^%Iye_XKA}pf6ϰG2p߆mX4G/~S qCQT3xE^wήar(?/xɈ[Or+;c|齅VGNYar24g<ʄ}!\_}5™ʫ |L~s`}}y?faƈ LJo^#l U,EF`hYK~y;=?k<+eٲH} OnWjm%0zkϜdV,W$ޙGqWsUtϪbɲ-o]( INX~N @{^/ ,ŀ}1XcyeI#i4=ia[1=ԣ[ߺ߽{/V/Z' I@3\A\aΆ|MfÎ0i#r4xJL+?g_W?`0g}avc)gg9g v724%e (*~w-g=3u>=#bHrQ E-\=>&\#FN!grEzz&wb^9d;V0_/19М iV7Sv]$V嶴֑"'ݗ}E1Vo37|'Zu hJRkvK,<22cy;\AY߸_{pXyJl°QDqZJ c =(I*s(HɕǛU'\u}Ɯ~~[nm _} ps^hިҋCu=\3Aλ oSaw5DžkKlQE&&g౟ 1Հ+\O53y1^g afOk9 MU"i* [ Q4Y50PQ# N V z$Q }ʉZ&ob͹xB!{s㴕ul8v{_oi[4ƅ_ +e+7ǥ'M>gÆ6r/Zu1D[}ذ%GU"0@@%Z{'vhB   =%p`n2TpTqeCc,Nx .ԧʃkXF a Cem=⿒Chd=yxZN+9>0?e9<}b{DPVN;icpbqˉc>ׯ|zNJcŰV* >, 6}xWSJ#Pt wR y%Ri UhB\򽂭B>IpCþgU1t 2@J{3 i_9"}.ٯFB V^Z¨.ıûν|E0ײo 0LQ *&^eʼnF1!/|rp2<01#0%i6g!D6R&F?nL#Ztm R6pUQp꥖JU*gYk'2T1kKPyեH2på!컉{v8I>+[@`@AJ:}rB_^O ӋJ_)f>r#9N0aQѫ5/nklpݳ okx$DѤne -Ye$t.>"J\&Lw;l#fDcsϏh) s߉yB MO?EiN' 12zDkHc'DVUY7đR.~çYo92=x1ګW2 %aʵ`qNtvܼi{uyNVmє-%Z/"UAqX_:ǝ}s%\Avq$Z$wB'}}׸|lzm/g_s ݀ZAQȰEn~JJXZP~Xh(y:!dvTҊ8PTr>\t*MU<W]^"TUe2u/JC-p;\7%_B ɋ5NF=J~Ny!_$t#ĉ,;DP-SDS+އFE⺊B?%Ñw$V avPIj.yet!&tQkl rZ^iJ̐L"WKj0uCȲ?|M^~?ۈ=0l~{*o7w_}v_$)B:ũa%J<>{GY0?c%P!!F %rH'Ώ;p˺v 򭰥JTi@2Rb'8_ȍS~ .yq|XҘпVZ"a>6m>ǰv` /^)m_/=F߰zW*&geaG\l|MkIg*<G?S,^SomչMM&m [ʩ)̶̣Ҙef ZON+N-(c!9sʆlM?}i 5֜_4  =-R߯RYs9XusNk\`,TtX {GJpeon:çIؙ 4p.] I2*"*s bbԵ=\8;xesҳ =.p ScZ eA)/ E8q6!wzO?ESaQ/j'}h섉I%'!L] ^"ܩi_ihT擸KS_eoB:N a*^rJYָ$01:akb!h@@`.^Mg]j_%[& 4?ū_2ʳ_ecOhyp걊{0<ڈ9ԃƱ%^0O0} 7+gD[Wk AsVg.#MK9$fO3%㮩ti'q4ɚ)R.KڸğWn-\)-ި9gT^|yw۲zԍP.F)DccWlR*5>#Vtk  7@gQmsi+МҪ bp> Z[bgj'V ܘg5qjJqwBVكʣ3c bfo;ξB$IՉzo'^b@ /B7Q LID1՘CoưTVN7DiDv@yZ>cء⩊tYwCpw>m%E p}6/|O6 3 1:6*FZ09=_#6IuJRaeYilNI&fmӖ%'zJVO< ={GuNr,s1MFoU/,zJjْȈkqF hԔXZiɒ ȫI=$J쥓dg,deaJDS7 gt&I^`)jLLwUd=.hTWm4g'm%0,5O7DTXVʒ:?7S%_2;GZӚ2' I2$QNM9Mpմz]cSX$AbUc1ttBuQ"4Dڏ4C  aOV %:]Q22&S^%[^MTyixz3"˝LH~p Ck^%BrmT%7Mp9 pFN͸PA(0׋"Q2aۧ[IX3$1ti3ySf`ђ* ^ӱ%Q^|1#fIu tPHLB=Zn>L@2飝 tflr|6M#UHfc W6y&Fc`io1΢)}t@b#is'Y;klmrnT6`l+'ݪ) y28(ӻԋ˒?RxV<OŽ>crTQ9*GrTQ9*GrTa幎%YkWoUF*=[O(Q`-&A#"DpCo!ǚvO fQ{λwg@|99)\ƖOyCǐ#1ܢGX!B +F2b96jTJEf@cW_ ר{ ("KbEסWR$YsP?yqp߶wjW*[b|u0Vb]q¸qsxaPȃBzJeP*) Ge`#+9+ IDATJG;}=ċjɉq1=;h5jX h6x~bmL aEKΗ"7ᣗw}^ͬ>ZpU9jS'oρ9|"~} 1 $ $q 2F,RBCOO?z?)V( S=|c0?J$ /Pq]п~3Kfd;eGftoYRSu#.?@,.59$+M 8ᴑa~e_ו?}/P?0F.gX\#"yJWCZk)`u7G :7'̖ޏn f,-)-?bi_ɳ"ٔ.ZSA(Mp+ܪp8ōyfw 8rksK/Cǝ=߿;Or9|7B n>:<HL:L_˻SܲMZôKE kC+?"򼵈nakE[–/s#|z\΋!|&T9>@8?c[ؾ= IғBC >PL~mymeKҭv[YA8t=ke*&_R4Hhkjt)7F7Y"a F0Elce> :WQ[S^'7Y%[ >}'~Te®ٔ, l$ J&=^2IJ)Q*W b55 vAa5aHbβ>oJ@}=0Ȭ4nz?P'IWqKjXc; Յ-vB'9S.rFubb":ċՅ}w?4;_~"~|N;=O<3Ǎ Fw bfԓXCOjӿaR'wqij i5+Lf PO{|Ȧ۹ItrO$7FGxeB|6qWа;PDbDsZ^+|"^1`+ZQ9 Q< t34j8G_j66Rj>0CX%/a$:85#Kjj{y[mjV.:^p-9c^3>v,|)<{DZ-}IS,/2_YD`cH38.:9t 3sKPYc=d1:浰kO19g=y "D؉#jG^g!-16LφSBtLfi#PePy{,gAIx>`r[Ǖ"œS*m;%uc }YJ[˽n&Ak,X w =)h6clhM-{ь 2D ;Pw'w(BB(Cm|C4ā6,g_Wws/IKIؚSk Rf YpV(䰞PU DhV.eqB=cm w-(? S~gj*ߓڙ ۞<1JYci .˛J6eȳ6l9g.f{NK/=C0CD!b)QJ4`r hWbJ%䔕58 رsdN}cgSI)xaVey-Xt;CsYd?Xu+r(㒐<=a>p җDt.Dc ;P0P!Nu"a eu9eycn ۫%vV ol02劗y~o5frs%rcW];tnFx/~U˜Ua4e1^]}aY7AWAz E NZ ϡ\A+ ߞT>؄z((9SajC3Xv{ŏw]93ܷ]heɒlye/'$0N d>I83dC3|&!@H K0`66[ؖmYe-KV۫?^-S!NG\c{f%/+~qtȺW@~xo뎩# 1+[%x<L3}QY jpf#bD&"} -cnڢ 7pXqab,)K3;Ln^Kq۟~!u0P E"䐸[T2oZ%|"%sЖEYA }qlb\i1y0IY +,JoqaǷa#(G 'q*uLYb& MsΤ3m? |6lA 8Md>3qryЌoig^uS?}_t koq8~W~MZH? ~ ՙwgKesBGp}qGUWf UG~=/ވpſ`'-(4;Ddw@ĝdKEyC&c$[\1AUTO+|wh8ĄC. ` ՚&<4S, +YzjHrq˵Wr _ufmJ)+9l%"W|GȈ%X~TgW?A ~cРSc\(DRUc 4fh p׀,)Ag-U$W( kT!k'ORU -0Aq7'bNl J#:a#Ns/[ !xAV(j3.y|7?5ڷVf_s涐5K363-/-gÚm+84}(<'+g| <(FZ.٭QIb&Atן)OLLs@'@в9oO"WȁCB8<܅Y>{٫ܯ{4Ce0Pmws A\L5Z4C s> BEoup!f 9i !2J/03vȀ8hd11ԎOvWH%TUi"TPb#I+n]8<05QOitK6`y-GʪV\,BFn1m_a1wx"{|;ҳTYuгryaSJ泣̎L7xbiUjՊR;јsk ("RO/?GI#*L)!PmԾw-arņ p1xoPv=VFJ>30rl2vLy|wȑDž&uePuAs19ɐ(1qvҧĝ";Q*.:gf|- aYnټy5^4rV˷A_=D- ٖKC[wɱV"Lo|KN7_QKoPsG GэGZ/r% Pfղu 8љj ,xoyGR&Rm+,4+K(~17X rS AsOp\! ,*15JAR#s@",Pn rIQRj(9\'drA +bBzzihӛeiY%Ú [wR1b/tGoiD4ey+7t쳌L G /Cш N*[{qu2i:r0M޲\}G#2&52Pmm!Gw7OY|a5&Cf6׆(۬p񫅭|zBd,XTrW)^aò|/8ezy6f(yem923?/`*T>,cSk Y!~#5ԋfmE:3(#93JgZ`˂[R. Q*J&'B@yВ' G,˗ W xK<pذm}0a 2zL8t5Ld% +G|ص+0\7?- c|Lt|ˡ)>B.#LT&k:! }W#Z̰oF+}`Lm5…k 7Gޥ"GLM.&^ w4B4P&* j , H)EJBN2FUƾ*[LӜyoOĢ-3yqS"H%7y0rț8!3Q0x2 %BӳVp|LPq\PS.3HN5=',=Q}PVx0T "z"LOD -3OmWer9AzcO6c~{8\K!-?⫡9dZsӟDօ`HGVh)-g CLW vJ QDy.\lFfk =ky/Fhr%Sp N'7<-Kd( jゕVSi6Qȉ0R քD_ E7B,ZE0)pֵWsmW; -\B )Ы8>ЄBN;Jc֮1T%bj1̃ReIF-8: ٬`rqm)QdiXl!\l v¢KIZLF/rp{/Z9?2ǢO1JgJv-| m%GC.zÿˡq2AYuRU0v3`=(_O*4-: +) rEp9na[!M+,ܾ~8,)u֠|M|oD-׀B H$xSZjpYk7.x!er(aUh @od%lK pL G,_򔑃^t +xt8zl9gDnXE9Mz GyDU€p`ME'}#mO2iӮ˓/⪍F%W2ނ0b; ?b uFdCz%‘80 ] (F3p,3A2phYW7=OM(C›>(Qt}nr;bG!,A=5o{|,ݶvBqscL\cfH TPZ*T BlqΫe⺊mAX|FF0VQ6ICw ltHUdb#^lS72fEHJG5V׻~@L$Y:$q@_Y8w>>s2. QQ k6 }wX^厣f6BQe=4ǹC/kacP`.aRǘz"@"p3B~t`ɀW"5dMA8(N 8E+  K9ݛ|v|$SXm8zͪC'2=Y0GqWӟu'Nϗެ\>A,>銕?Ou_{.Yߏ96,@Cۢ09]M;KGJ}1KXXpA4E [ !\QY*+BA))J>V'Y?R^-\+ W(!Mi*F#w7G*wpqς+:8f &PbX-~W apIn $Dm^RrzSj N׷#ޙZn`:A>ܝ{匹U[=ss$?:-T~^:B ޼42AYg(⭵w ^m8sCn>pYֽ+*BsLhL=C9Bɳ8Ğu8ƒ7UE#(W} j[78x*,eEʱv`93ِncMd"*9OrtRh3B#0=eu)rcI)7ڣh#[^LXM'ih颚IAtw:D2DM+9␏X\i-ƿ=M"TIDATqtywÉJ43 }kcӚl n^p31t?gcT~Al^{`kP9QIɝ.Ney(nR\`6w-zoi$ !) E+[.R(|o+ ng<< 7fCō"6;΍^ݰw2i T| LaqUm.U]@lLs DHFNCO@NOoݩ&夻Kzy!vwcJ-P:(:R; V eMaf_-.֝*J0 aCzVy{?Wg [ e$XƝl83lX.g_ d* 5=/zd]Odg51Q7Y ` ZXjȜ`h!@FƣNs$D, 1"'afmp6|h~f%D[k%Th7] "^s\na~o 󅨮A؀0PV\mȼLѦr6jeIc,r_:<}{%07ke G,+cت-C_aYo/û[|in3G\ճBʅIMg]#ʷ@msToHW]Oa'Ch9l=AZ3p)8b3L'ti]+if>1ߜrk}ͮD׫:Qݡ0,̲?\a`頹wY֯qXpcd[ΘM|!^NaL c&N XPs>?ሉB Qb VE@|6.VO@9@rlu~Űrqk}͝ aG>䌳`w-ǰ8X*_\tKigSD^{o4Wo>3 7,J3BBdf~ G,5axJpgk,fSeY $c†cSNpϟy-`{\. ey Ǝ.A>SxE%(Doocx,~R"ݝ {NĆF|R~Z8l+!y%`|Xp=%hmZAo~3Qb{Wv1?(7gaZS9vXH4ah04f#bڼsOk>aPEZNC#ͽ6f)EΚSOf$f%B3Pvw{\rTӘ_&ڴ.NQ)15ϵbʴDz:8 lbp!ӄ" l-c)-c3_kC-'-˳T7dNnYY 4eJ+\k-J}=ŽRװH B} 5uGOɪ -}Q u6+AKZ4u)`1 VىO5goY[/Ζ$sk)gzڠki*~3eS3H2F1M *XuDQJLI!fry ҮҠ<6-hޕ'\~1jӖ#:>l,Ǜz;z@"Tsey>y/Z0#l>ȭ{[Iyڽ4/To=b_p \x "%BE :&1:UU=Y^“^ubtM"b#$]R.]V.BUה֖ 6beԢxFB8bPV79cwŌ3MhZ3u%]bY#~“#u&YZtmpӠJ]`ƈEg.(n=bבk~hP#N'2Xww"e&tcEy8 |vH,t&rq2Kٓ11L!=/2RzƁ߅w!CmݗŨ3 qpx٢3ipB{,ڟe$Va[ġB R[+(o'e,[Ύak cR;_sOwBԙoO,ua 3OTkIN[0v&]A,stm$0uN:o)mKbLS<΃<܉Jϫߒ~iME85:{%^ P(.+mOk}.O+G0@3*<\{l?6%zwwpX>K tR29n/q\'ua?㶷6sBb%0ّpOc@&\:w5_R(-|j5gڎЅ|iVmGh;,> FMwn&. ov{0ґi@qI/Z0O$A<`3:?UmY:d\,9=$!O,.$rbZK(KrV_2O$G%Z ؖlcI'u+%uO,='iblwT) \a-˥?QNbGzliNVNNv&L `B'[~!hsbG1yDً^ @;EStN):EStN):E?/9SIENDB`pillow-2.3.0/Tests/images/pil_sample_cmyk.jpg0000644000175000001440000007126412257506326020140 0ustar dokousers ExifMM*bj(1r2iHHAdobe Photoshop CS Macintosh2009:03:06 22:15:00dd&(.HHJFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?6;~D6;~E$.t|xY5ّX!:5UdStdNS9$HRI$I$$I)I$JG 65Vul/ݹ@R5tq I[fY^1?uWKOۜ?xk,Yz%Q$isDI0$5S]3.m2DmlD ka$%?/ɪ lɪcohesb ;H"|x)f]PekqؑyDfxSr\p5|߳U$lo1Wse?1i-[sh4m>xi;{)BÉfG湌k7:mvmU2A}@h'ayggB`7[{sϐzDN)O꣋񪧫PmdhNwKGWK2jo?m@涰yu{u; ulgiD8Ϝ,cr(/=Z-0tk|YnFMhqk~.:Qsm#Agzevzl\ѲScjs'S#,2RދK3-@`ַrX>ls Nl뙾a{wL{g]qv5A˩lE}$bYx}w{D4X842O.c/ع6PMf>f >U[Mkw|c"YDlGՃ0f󐟵PrI$8cif=1VLh<}wz瑛Ɔ"ֵp S2@<12 *ރus}溫Ccp%n)Vf6kѨporok3ZmȾ}~DnD~pd{EH-oO,u_(J<_*Wc]U=VlnǴ Zrj.V汻c]uyVc Rrm=ޝ com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName A4 com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH/8Ag{HH(dh 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMIdd pil_sampleddnullboundsObjcRct1Top longLeftlongBtomlongdRghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongdRghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM dd,u0JFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?6;~D6;~E$.t|xY5ّX!:5UdStdNS9$HRI$I$$I)I$JG 65Vul/ݹ@R5tq I[fY^1?uWKOۜ?xk,Yz%Q$isDI0$5S]3.m2DmlD ka$%?/ɪ lɪcohesb ;H"|x)f]PekqؑyDfxSr\p5|߳U$lo1Wse?1i-[sh4m>xi;{)BÉfG湌k7:mvmU2A}@h'ayggB`7[{sϐzDN)O꣋񪧫PmdhNwKGWK2jo?m@涰yu{u; ulgiD8Ϝ,cr(/=Z-0tk|YnFMhqk~.:Qsm#Agzevzl\ѲScjs'S#,2RދK3-@`ַrX>ls Nl뙾a{wL{g]qv5A˩lE}$bYx}w{D4X842O.c/ع6PMf>f >U[Mkw|c"YDlGՃ0f󐟵PrI$8cif=1VLh<}wz瑛Ɔ"ֵp S2@<12 *ރus}溫Ccp%n)Vf6kѨporok3ZmȾ}~DnD~pd{EH-oO,u_(J<_*Wc]U=VlnǴ Zrj.V汻c]uyVc Rrm=ޝ 4294967295 100 100 1 72/1 72/1 2 2009-03-06T22:15:00+01:00 2009-03-06T22:15:00+01:00 2009-03-06T22:15:00+01:00 Adobe Photoshop CS Macintosh adobe:docid:photoshop:903dad88-0c2e-11de-aa32-f3694bed6de0 image/jpeg Adobed@dd       !1"2#3&VY AQUWr$t5v8x: !1A"2# B$VQaqb34%UWXRst5&v89?ꝱTl7}h\yƟ74_3;b_}cp諯Q)aq4U95 ,'~QuȥQfew&^u289ncxm:R:[RHXGpJHGMt>]vYwl|g/){].1̬y!s]i߷MwNk_1Uk. "$^%=?[K.IޟSnuح7Ty>ZMnjZK1:joŒ0v-|]#d I,X*Q2H(t pLP1ΠG1o)*ÌGqӴ|'MNN/hf`3D4bݡܬu\M=\6V-%NlOgRݒQuZ$ޣdGĮFJ~f;F49;:enH. \W+uܪUdU]BlC]ۥ!9 >*Z5kk-x܅ĉǖ~SCH+Pf,Vޓ%Ҕum6iV:Z-xFvYs-K62.7X*NJgrrư@ DPWlRP̩+Z%99Nr" ra Q9URJ[V@*ډJ:@'M#kVsn;xK;y#\~dܰ rҥ!MV-Il+rIӣzҵCqv][;8?iBmM_~fY(N["9@qrPc[LRQ:bjBΘ0} PQ3~J!C3#y1EA8%'CLO::pZڥk(6 M#i R ME$- A#Q N#vqүPköWtFR(V=ꌚH;WGApM@)?NӔG<6GV䂲Lt6>vh&tQrNU("s(& !N]c/PNjR)i Z* xqOq=wz^'a4.Z+(}Z4OimG돩im+<)x*|n䶻vTm-Eױ]gk0[.2!*tGofY5IQÕ&q{33*D V{leSh*@z9qUw|ŴTn R @Hn;xK;y#\~dܰ rҥ!MV-Il+rI}j?soJ}Ɲuo⟨@>?E}6~d;nL"StwA:ЂC QJE i,f$ [3A"kHaC~l=.ځ3u (RAxZy&z$qB.aS,NEڇVu*lE}"*CdrU)JmX ȆZ+]y|ʮ rVUTy*NO_o&uD,|QNG騛Rӷ.Bc&LX1.ѽ#ŴKDǞ!r5~M9W,ߠ &}ŭ@ JE4\&]y+m/[:jA-=­vգίp+*OxV'._mV]mEF6@o:7>z}CF{i~6'kqn暷ظËlMo&[{a޻ٯwg(vnWdwUZC y1vf ~ ?տsw1ܗ-Yct1o|r{-i4K6k2lH6dfd--&ٯiO$ z= {kœ).; *1}"pz:Fw'Uit/q .M0[4r6q![Vm,dl[b"<}Pw=!1w\2lu3S(8v5>̺\M&w gnjwY~%ضFlLec#+B-6 5ijZk5%Ti쾪;GEPL=ɦB~@ʇq]q6!q]kh(+sTRW}\ENVMC[O8-Ql]%[etӧyxke:QG_rգ#_yRI&ŌnEy oαM8ҳRR8Mxc%X[M^|juVUԅFʪq0 SP90 uW{\!h~r, Im % s 4( 7|ېݸ̮!J&ՊI] 'Udqu.s9)sqT%nD"K,WfO$ֲIlnctޣ:i%>Hh_Ӓtz^H/GSp\)КjpS.;qԄy!-0k`e% *<ܵr`N9JVӔ& t}'ho$^rǦQ = *}-7#HIʢIyvW:ZfJ)^ze9Rl8X% , -@e!%jԖАs]H vy7\.+w.ȲbȷcWsB dqq.[\\qՕFmXP&A/CuŦ2B*ۓ[ѥGqM<˨Ȯ+mi!I?%*$^bkse*:׭T[Y5Qz")NA)SxWYG)JF Qr6)&LELr[@g uK @$!) $)0JTHp-E.<7/ynlw!>a>rLfu)帷d_nݛLL9;Y?e F+fTd*Ubk}ɺ]ySƽ=-FYCfO_>Z̾U ̇BiV}Ogq{&\5Է.Bc!G[Ulޖf?/tɊg׷tyʖ}4~;k:]HFQ\vOM7M^r9{W,]fKoY~3/Cw=gSէ!#ʏl_};7=ܩS?EgiܞYmGw\[u`.ܳz k nnIޤPPCC1xW—(IZ(*^Hi@5Xmw\őlsb!7)Dn:вVѿ?ʓprWM_H׊r&ٲ9 4消Tͧ].<I]y&Rƺ:QFu$$:WjjR’3tlnCחl`Tf"m;Ȓ1[Y J m|̵E}?6|{=]NdY,vpFA63n]"Xc\y{OdyֶIo%j)a W=]Fg42hM)2њfɋ]7.leA׎B/$'ԩM>&pJ,%$\RExtw vM"~ QsEg\>L%_(45Zj7-JR}vc񤛃S2V!z.O1%e2v԰;S嶋ŤQ;#/>NWo #j½uy 3њίi#e+50JjX$e]"M<#2䭊XeQoLN=k;gdY7jkx Жz RL.Mf=A(7\}յ>?.y8ŧ>v?45F"'krW_2YdcҒw.@y ŦB7P:+mS}^%mHZe= -;^OɟLݝ#95۾ҺNudC<[Ak @t d;Vevp:Cl\D]voRz-Zmn>]Y~P==3]oj^nqCztE"tΣI&^'ާ1sJ{Gepg;G WxܮqpH`tdmRFFhO'ƺQT=gG':[O+hﹱ]&wֻOLlltָ ;4Ǟ<{џk>b}VC'1&Nc/^6w_՟_M/uԯn޷ ~l7m-^=wg_9WLS/·^͊'7C:oս}?ޖA}#uٶ6}`~/+?Uuc{5cP?9WKxË/}خ_\iꞪ=c g @W[reAڿ,:ZbO,n?Ƴ̋Q̺ߪm`&lH6kքׇ7fI0DT A/~-MzRu /un MůԴw*:XΨ rp'ia]:Mr-E U2kdp]O +3Mx%"P*';)r=4FzI?һBvgW$"u6tzJ5!2<UX?u%$Yk C*K k(!c=%Y`t7C>?çAtٟշ.BcƯ8hHe%-շ۔ܖIzfTnm{V}nɵCZI $)7kxXǚ4:l(s+bH;>?zrG 䱘ؗw܄m % 9kqwY{ӸK%) \mz:7 6/J7EV$w;hir`&YS>;nh‚'\JU$N@8c`p)(<ʳ=BN=@!)P[ FöF}*1R72SNw$u45Mvm0E^sloF%Ynvw;ڽiw(b-,Kegʷ_5GyZBi|f8}qOVǨa`p) 0ɷS^+qבRT!`~C >9jzmQ Ht`XA128Mon1A CL ɕw-hq$)YaM\no8ϟT¯ h\YPX8K@1Ln4NM\P-2RnmKK >H֝F;kt(FF 5e<.m} '5ԨBS*39N4Yx6#n[pdۻE@Q#vpj܋ ;?!ۭ6˓3-1uTNTOX$|dW/dVkȹ tƳ˰[AyϗԆe4Ӧ3 ֔]J7)o-zE]ɮn_MmmY[ɯZJgt"6*'+j+* cC}VbfW4ZNQt UQӗ*J$qiX*"| 3-yV@Bx\%!Fb% $jGcMN]_<}p˼soqO[q2$81Z/qP9!A(1 l5|1嶖\{m-])Qэ/*uzT]GV\^6 Mf]@pF/(k3(d3a][VI\~I2*|Ćx[HU?ꐠD˚qK+lΆ!q}NF> a|Iه5K&"^ԋThqJCEKmM@f*bMߊ/3M_ndj(FJvɤ,?I\+3& "gƸ+ OVDQ17PLt냁_P^mO2gkͥG*nJw}ξ5leý;jțy&3ElZH\gT4ˮ4t  yIǞTpQC폣ݼmuFϭҁThIQ'pjrylzne SUV Ux5=S-StʨԇPdjX\S @@7@ȭ̲. T%!FR% :jGdskwy>sxVx`ŜSfKe8tfHh(*='vԘ ZViI):(t>+%bC͔DAs=S=K[ǐo{N!o@дx-xٺq{N5MweG]d >X3xI3Bk K5.(C4ʳM$>/Z"]슡 G>7'!RU};\;c}(PC 5ܪ<[Kme:Bz$+]9JAϻ XmXoY Lz\r$l%%MqeL);.xȯ)}Z\rլzs.d*.>/k!VbĴM3^M4w阕+h6p[)YcU8(2H)*~oe8߯28%,:ޡ:%?zf/8WN)ĐEmf#jPnVCxWND9kȝ=j]w5z.ٺ*7BodA1͢`a3VEhLַ.Bc$D|״ǎQçnppuUT1"c,|/1bew&!_JR4 JBJ@E޻^$ |}k~D6S$}[ 8  RB0Fx1܃bwd-CBj]hea3!.2KK!amځAҴתF<߻'e7QuĿn-qk b]-+Q\$|F%P_WV e>W_}?TN~Y#OK?;~`ҿ_177#v8r?igsFE7+8 Z3nQ04/DR:mILu'n-KQ'J$|? \%a6Xn3oX <(a:%(Ya 4B| nvG7-o6#^¶O],r*RA 9~*CX>1Jg׷.Bc1Jc1Jc1Jc1Jc1Jc1Jgз.Bc1Jc1Jc1Jc1Jc1Jc1Jgѷ.Bc1Jc1Jc1Jc1Jc1Jc1Jgҷ.Bc1Jc1Jc1Jc1Jc1Jc1Jgӷ.Bc1Jc1Jc1Jc1Jc1Jc1Jgpillow-2.3.0/Tests/images/lena_webp_bits.ppm0000644000175000001440000014001712257506326017752 0ustar dokousersP6 128 128 255 ߜoߜoߜoߜoߜoߜoߜollmswx{ܓmxX^EaJdNfPkUkUkUjTiJlMpPrS}]}]}]}]Іhυf́ca~_ác͂d΄d΄d΄d΄dІf́b́bІfІfІfІfІfυe΄d́b_́b́b́b́b΄d΄d΄d΄dχḋcɅaȄ_Ȅ_Ȅ_Ȅ_ȂbɄdǁd~d}e{ewao\iVt^ǀjّz垅ޘ{ޘyޘxޚsږkږiږiږiהfהfהfהfۚkۚkښk֜kНҞ۪̗ij?tM]dFΉooVyhyhyezbz]{Z{W{UȀ]{[{\āciOt^䨔ޤߜoߜoߜoߜoߜoߜoߜollmswvyڐkvV^EaJdNfPkUkUkUjTiJlMpPrS}]}]}]}]υf΄e͂d́ćc͂d΄e΄e΄d΄d΄d΄dІf́b́bІfІfІfІfІfυe΄d́b_́b́b́b́b΄d΄d΄d΄dχḋcɅaȄ_Ȅ_Ȅ_Ȅ_ȂbɄdǁd~d}c{dwao\iVoX{eԍvߘޘ{ޘyޘxޚsݚoݚlݚlݚlۗjۗjۗjۗjۚkۚkښk֜ky﹇˗Ҟ͜䰁h=rJxT{]rWx_yeyhyczbz]{[{WyUzZˁcǂex\w^oǍzeQߜoߜoߜoߜoߜoߜoߜollmswrw֍hrS^EaJdNfPkUkUkUjTiJlMpPrS}]}]}]}]́b͂c΄dυe΄d΄d΄d΄dςdτbτbτb҆d́_́_҆d҆d҆d҆d҆dЅcτb́_]́_́_́_́_τbτbτb΄bχdΆc̄a˂_˂_˂_˂_˂bɄdǁdb}c{dwapZjTiSt^͆oړyޘ{ޘyޘxޚsrpppޛmޛmޛmޛmܛlܛlۛlםlڣq{ӟ̛ĕXlEtPDžfjOya{eycyczbz]{[{[{[Ȃex]x_Ămm_N~H8r;/ߜoߜoߜoߜoߜoߜoߜollmswpsԋepP^EaJdNfPkUkUkUjTiJlMpPrS}]}]}]}]_́bυeІf΄d΄d΄d΄bτbτbτbτb҆d́_́_҆d҆d҆d҆d҆dЅcτb́_]́_́_́_́_τbτbτbτbІdΆc̄a˂_˂_˂_˂_˂_Ʉcǁb_~a{bw_pXjTcMpZȁjԍsޘ{ޘyޘxޚstrrrppppܛlܛlۛlםlԝkڤrﻈԡ٨ǘ氅iAyUz\sXx]yazbzbz_z_z]z]z_ybĀkm{leWv=0SX%ߜoߜoߜoߜoߜoߜoߜooqoqrorӉdoO]D_IcMeOiSiSiShQjLlMpPrS{\{\{\{\΄b΄bυcυcυc΄b΄b΄bτ_҂_҂_ӄaӄa\\ӄaԅbԅbԅbӄaӄa҂_Ё^π]҂_Ё^Ё^Ё^ՆcՆcՆcӇć_́_́_́_́_́_́_˂_ǂ^ǁaǁaǁb~ay_t[qZoXiSs\·mݗz{~{trrrߜoߜoߜoߜoݜmݜmܜmٞmɓaΘfzȕצ̝ƛɐikGlNŀew\x[z]z]y^y^{cŀhDŽlyfАyWMq71_*%^*&j87ߜoߜoߜoߜoߜoߜoqqqoqrorӉdoO]D_IcMeOiSiSiShQjLlMpPrS{\{\{\{\́_͂a΄b΄bυc΄b΄bτ_҄]ӂ]ӂ]Ԅ^Ԅ^ZZԄ^Յ_Յ_Ԅ^ӂ]ҁ\Ѐ[Ѐ[ZЀ[Ѐ[Ѐ[Ѐ[Յ_Յ_Յ_Ԇ_́]́_́_́_́_́_́_́_Ɂ^ǂ^ǁaǁa~^z]t[qWoWiSs\·mݗz{~{trrrߜoߜoߜoߜoݜmݜmܜmٞm͖dΘfפq칆ПȚȝ񸐯rNmOsXwZ{[{[{[y\yazdiȄrŅxwham20X"d/1i8;i8;ߜoߜoߜoߜoߜoqstqoqrorӉdoO]D_IcMeOiSiSiShQjLlMpPrS{\{\{\{\]ˁ\̂]̂]φa΅_΅_τ_ӂ]Ԃ\Ԃ\Մ]Մ]XXՄ]օ^Մ]Ԃ\ҀZҀZXXX~W~W~W~WԂ\Ԃ\Ԃ\ӂ]π]π_π_π_π_π_π_́_Ɂ\ǂ^ǂ^ǁa~^z]vXqWoWiSs\·mݗz{~{trrrߜoߜoߜoߜoݜmݜmܜmٞmӜjϚhΛhܩv‘ΟΣҪДphIpUwZ{Z{W{[y\yazdƀoˆx͌NIr:7h11^)+Z)-a29l>GooooqswwoooqoqӉboM]D^IbMdOhShShShQjLlMpPrS{\{\{\{\~\[̀\[Ѕaτ_τ_҂_ӂ]ԁ]ԁ]Ղ^Ղ^~Z~ZՂ^Ղ^ԁ_Ѐ]\\\\\}Z}Z}Z}ZЀ]Ѐ]Ѐ]Ѐ]π_πbπbπ_π_π_π_π_ˁ\Ɂ\Ɂ^Ɂa}^y[tXqWoXiSs\·mݗz{~{trrrߜoߜoߜoߜoޛmݜmݜmܜmڝmԚiΗeӜj괂٩ңΣeBpPtS}Z}Z{[z^ydzkƁsȅ~__d+/l68c14[*/f8Af8DW*6pppqvyzwjhjlqq҈_kIZAZF]I^JeQeQeQfPhMkMoPqSz\z\z\y[{[}Z~[}Z~[~[π]ӂ_]]]]Ӏ^Ӏ^Ӏ^Ӏ^cc}a}_́cxZyZǁb{]xZy[ˀbςe~a~bՅibz]ֆjy[ԂcvVՅbҁ^~[~[~]~_΁d~ay^v]q\m[t^ɂkՎtבtەvݘtrpppppppooooߜoݚlږiٗiґcըϢ׭ᯇmE[yT~\}ct_Ȇxāxwt\_]%,\)3_-8b0:a2>_1=_0>_0>oopqtvsphhjlpq҈_lGV>XE^JbNeQeQeQfPhMkMoPqSz\z\z\y[{[}Z~[}Z~[~[Ѐ]ӂ_Ѐ]]]]Ӏ^Ӏ^Ӏ^ҀaҀd~h}e}d͆l}bz^dΌpȆjd}by_zafЅjτífd҅hՆh׆f}]vT}[{]}]}_c{bx]t\q^m]saɂlՎwאwەxݗwspppppppoooolߗkܔhړfӏ_˝УܯƚšopFpJbhqax}\]l07\)3\,:a1?b2@a1?_0>_0>_0>oopssqpmhhjlpq҈_lGS:WD_LfSeQeQeQfPhMkMoPqSz\z\z\y[{[}Z~[}Z~[~[Ѐ]ӂ_____ҀaҀaҀaЁcЀfj~h~fƁiy_y^fw\y^zax^fƁih}cɅj͆l}aЇiz[ӆh^Ӂb{]{]}_}_}ay_t]r\q^m]saɂlՎwאwەxݗwspppppppooooޖjݕiۓf֏cԐaݝoҤת֪澓lDtQjOpXrxr]\v69^"*a,:a1?e6Dh8F_0>_0>_0>_0>opqwommkhhjlpq҈_lGO7VBbNiUeQeQeQfPhMkMoPqSz\z\z\y[{[}Z~[}Z~[~[Ѐ]ӂ_π_́_́_́_΂a΂a΂a΁d́iˀkihŅlhl͔yݤמȏt}cv\}dh~deŅiłfb_~^aևi}_{_}_}azaw_r[pZq^m]saɂlՎwאwەxݗwspppppppooooܔhۓfڑeՎbהdՕf~˝͟ҥ׬kjLjQtas_Zl12^")^$/d0>c3Af7Ek;Ia1?_0>_0>_0>opqwxlِa֏\jjlorsԋboIW?VB_LeQcOcOcOdNhMkMoPsUz\z\z\y[{[}Z~[}ZЀ]Ѐ]Ѐ]π]~\~^~^~^υeυeυe΅f·q͇sˇrLjrӗӛ٤峘գᯔ긝뷝츞ᩐȏww^w[{^}bx[Όm̆fay\~b}b~b}d{dwcs^p\p]l\r_ȁkЉrԍsבtڔsݘpݚlݚlݚlޛmޛmޛmmllllِdِdِdאd΋[חi֚l﷉ϢթݲoQzcwfSId,*^%)m3>a(7j8Fd4Bd4Be6Db2@a1?_0>_0>opqwpِa҉ZՎ[jjlorsԋboIT;S?\HbNcOcOcOdNhMkMoPsUz\z\z\y[{[}Z~[}ZЀ]Ѐ]Ѐ]π_˂bȂcȂcȂcΈiΈiΈi͈kՑ}Ґ͍}ǍzҚϜԣްݱ֪ܰңܭ涟֥rcqUf€b̆i{]}azc{c{eyevcr^o]m^k[q^ǀjЉrԍsבtڔsݘpݚlݚlݚlۗjۗjۗjݖjݕiݕiݕiݕiِdِdِdאd̈XΎ_ˎaӛmϢ٬ߴԭݰ~jVGtA9X$#U%j3?h3Bm;Id4B_0>b2@a1?_0>_0>_0>opqwݕe˂S~NҋWjjlorsԋboIQ9P=ZF_LcOcOcOdNhMkMoPsUz\z\z\y[{[}Z~[}ZЀ]Ѐ]Ѐ]́_͇ḣj̇j̇jˆiˆiˆiɇk͎zˎ~Ȏ}ŏ}ɖŖǛΦհӭԯװիڭ߳溣©ܱ˛}avWvZ~a~bzaxaycycwcsao^l[k\iXo\~hЉrԍsבtڔsݘpݚlݚlݚlٕhٕhٕh۔hۓfۓfۓfۓfِdِdِdאdҎ^̌]̏bō_뺍Ԩ۰Ţsad4&b1+W%&X%-l8Fj8Fk;I_0>\,:a1?a1?_0>_0>_0>opsw֎^wGtEЉVikmprsԋboIP7O=XF^LdQdQdQdOhOjOmSsUz\z\z\y[{[}Z~[}ZЀ]__̀bЋkϋmϋmΌmāeāeāeizjrxŌ}ҝΜ͟ԪϪ̪Ұݸܷٳܷ㾥㾢̬彟ܯx\rVkP~bzbybxdxdvcr_m]jZj[hXoZ{eӉp֍oڑqܔqܗoܘmݚoݚo֓eהfՑbٓcِbڏbڏbڏdڏdڏfڏfِdߚjӏ_֖hȍaϘpŜϥӲƝoc_1*Z*(T#(d2=vDQd1Bf7E\,:\,:a1?a1?_0@_0@_0@{tޖhrDX*f8׏_hloqrsԋboLL4L;WG_ObQcSeUfTfPiPlTpUsXw\xZwXzZ{X~]^xWy[ډmqUwZ{bŀeya{cfjxjłwƆyswȓΚТ̣Щ۶˥¨ۻ׹ڻ۾ĥȬ߷ǚw^mU}ewbyejVm]xh^Nwfi[hXmZ{c׍oڏmݔlޕmܔqڕqڕoۖmxהdҏ]ٓ_ڐ^܏^܏a܏b܎f܎h܍jڎh҇Zߗh۔hڗmƉc⪆˨Թ̛a11W&*^-4a/;k9Gm:Na-Aa-?a/=c0Ac0AX%7f3Ge2FW$8{qΆZf:W+k?׏_hmprrsԋboLL4M;XGaOcQcQcQcPePhQjQmUqVv[xZwXyXzWzZ{[{]ce}bqVtXx^{d}fĀiĂmńqqɄyɇ{LJzŇzȍ͔˗ݱШԭݸܺݾҴť¤پٺڹӹ˳իv_q]\Jxfwf̀qj[wiVHi]hZo[zc܏qޓompڑq֐pՐlԏfݚoٕeԑ_ב^ڐ^܏^܏a܏b܎f܎h܍j܎hi֌^ܓj֑kӔrӘzгΛo>9I[)3j8E\*8l9Mp=Qa-Aa-?c1?c1?b0>o;Ma-?V#4T!2}ݔkpGV-S*mEՍ^jmprrsԋboLL4M;XGaOcQcQcQbOePfPiPlTmSsXxZwXyXyVyXzZπbՅi{bhMrWsWt[v^}fĀiĂmńqǂsƁsƄvˋ{ɍ}ŋyǎ}˗٬ԫӬ⽡ٷ޿αȫԺ˲ʹ׷޻įȲmXm[dSm]j[aS̀slaf[hZo[zcޑsqopܔsՏoΉeȄ]Ʌ\Րhٕj֏cڐa܏a܏a܏b܎f܎h܎h܎hޔi׍bܕl֓oٚzޥƑz}J;e32[*1e3>k9F^,:b/B[(=O0c1?c1>b0=b0={IT]+6b0:S]鹿ẍ́^jET/W2mHφ]jmprqrӉamJL4M;XGaOcQcQcQbOdOeOhOjQkPqVwXwXyXyVyXyXπbՅi}cmSrWsWrXr[xb{d~ijŀozk~mȈxNjyŋxƎz̘ė~ٰԭҬҰǩڽ׽̳ٽӷںƱDzιͷDz[G]LvezlZMrfi]hZo[{dvrooݕrԎm˅d~ZrN͈dڕq֎iڏd܏b܏b܎d܎d܎f܎f܎f͂Wޕlۖpܚyݞ˓])W$a/0],3^,7c1>h6D_,@b/Dk8Lc1?b0:b0:b18yHM],0PPΞyԉhpNX7P/^=tSφ^hlprpq҈_lIO8TB[I_NdSdSdScPhSiSkSmUtZx]{]z\~]xUxW}\az^rXlQoTrVw]zcr\w_}hj}hǂqĂp}iɍyҗИ˗{Ӫ¦ٳ޽ۻƦҷ¬ҶֺDzιƱDz濪^LyiaS[NmcbWcUmZ~fێpropߗtԎmɄciIQ2hJՏrܓtݑmߑjߑjߑhސfޑdޑdܑdۓf֑i褂ϏsۡVIZ&p?:Hb18j8BsANp>L]*>Z&;q>QZ(4],3o>Bq@Dc31yIEܑ۬s}^dFU7Q3[=rTӉdhlpropЇ^kHO8TB[I_NdSdSdScPhSiSkSmUrWw\z\y[zZzW}\ЁaπbpTjPmSpUsWw]xar\v^{fjŁlDŽoĂmkĈqΕ}ИǕzƚΥܶڴ߾ӳҴж׸ĶοǷп͹Ծηι}jVGpcf[WL_TaSjV{dێproqߗtԎm˅eiL>$S;˄mݔzݑpߑkߑkߑjޑdޑcޑcܓcܕi͋cԕs媐iZUp>=],0b16vELj8B]+8\*8c0Df3H[(9\*4e49vEHvFDzLE{p˝ԈmoTW=U:T9U:lQ֍hhlpropЇ^kHO8TB[I_NdSdSdScPhSiSkSmUpUtZxZwXyX}Z}\zZtVlPlSpUtZtXt[s\r\w_{fj̈qDŽlĄkLjpʼnpȏt͖zǕxƛ~ҩӬԯճӳҴ̺ǹŶзϻjZ[N]Qf]\P\NfSxaێproqߗrԎm˅ehNx1=*m]Іqݐsߐmߑkߑjޑdޑcޑaܓc֓e֕p̎o͓~l6*Z%$Z)-Q#*e49m=D[)3O*c1?j7JwDX]*;b0:p?B~NNQJzoɜ˞r}cdJT:hNX=U9jN׏ljkptqpЇ^kHO9TB[I_NdSdSdScPhSiSkSmUoTsXwXvV{Z{[wVmOfHoSsWsXw\vZrXpVx_{dŁjDŽl֓{̈pȈoҔy̐vɐtǐsđtyڱҪɤţݾ¦дνȻȻͻν־Խ̻zQDvF:bWZO[OdQv_ێqrpqrԎm˅hiPv1x2(ZSsiܐzߐrߐmߑkߐfߐdߐcޑdܕlόky;/[#l:>Q#,h:Fh9@f6=\*4i7Di7EV#4j7Ja-?f3;MPOJskϡyhϣ[H\F\F[DZ@X;qQ֑kkotvwr҈coPP:TF\JaOeQeQeQeO_ImWhOjQsXrWvWz\vVςdwXmPqTqTqTqVz_pWt[ȁhev]v]ĀhՑzόťsБyƋqmčqȖ{ƚƜȡɤƬƬǬǯͻ˺ǶƳκϺккտԾӿŶwpE8TLTL^Pxcڍrsop}ߖxɅldQp2(U}FHfeҋ}yvݍj݌efljvmbe"a$+O)f9Fi>Ij;G^,9_-:l:Hc0Ad1Bj7Hj6Ei1:MPspƏΘpœl֤}\J\J\H\DZ?Z=rQՐjkqvxxt҇eoPO=TF\JaOeQeQeOeOfPoXmUoVpUrWvWwXxZy[rTmOqSqSqSpUrZpWsZy_e˄jɅjŀhόtόťsˌsĈolŒpƔyyǝװ⽤©©ĩī˸ɹȷȶκϺккӽԾҾӸwF@UNWJȂoڍrtpqrݓt͈pm_t83X"$h7>QVmbՋvЅjԈfoրb}{l;7t04\,b-=f9Fe:Ff7E^,9b0>h6D]+9_-;_-;e1?y?GhiĉyČs՞٣}̗k\J\J\H\DZ?Z=rQՐjkqvxxt҇eoPO=TF\JaOeQeQeOeOkUhQmUqXmStZxZtVІhpQfHiJkMkMkMjOmUt\x^t[ǀfԍsӎsƁiˇpЍv͍tƇoƋqljmǛҨ⺣ǯƳǷ˹ͺͺͺκκϺӿҾҿ̹PILDVIĀk׎rtpqrݓt͈pm_y=8]&)U$+l:>kalܘܘxȂbȀ_y韆䜉VL[r3;a(4f4Bh:Fe8Dc3A_-;e3@c1>_-:a/;X&1k8@eiĈŋrČsܥߪ̗m\J\J\H\DZ?Z=rQՐjlqvxxt҇eoPO=TF\JaOeQeQeOeOiS_IjQlTjOtZxZqS}^oPqStVtVtVsXoV{cev\ǀfҋqЌqƁiƂkЍv͍tjt[z_lɗ}߳߶⺣㾥߾޾ݿİƶ̺Ͼ̺̺̺ͺ˸Ͻооͺλ˽p90_QoZՏrtpqzxˆmcUx;7c,/^-4[*/b,#sbo{_ڢ֜{Ɏsowir61a$)c+4l8F[)6k?Gh;Dc4@b0>a/;f4?i8?d3:b16}JLƎΔɐ͕К~Ԟ{ע{٤z\J\J\H]E[@X;mM͈bmrwyyt҇eoPI7N@VE[IcOcOcMcMpZeOpWs[jOsXhIqSxZfHiJqSxZlNtZs[x_ɀf΅kɂi˄j͈mΉq}eҎwԔ{ƇolS}bӜ廥ݶڴݻܻ۽©ɶɸȸȸǷǷǷǷ˹ͺλоҿˣpeH9w_ݛ}ߗrijzẏok]E@h13\+2]03IQAԨӳɩ仞ݳd6,\*+h7>\*7m;Id6Ae9=\03d6Aa/=a/;k:Ae49\,,qA?~ӜǎǏ{՝ӜϚwӝwۥ\J\J\H]E[@X;mM͈bosxzyt҇eoPI7N@VE[IcOcOcMcMiSbLlTlToTqVhI׍o𥇴jLbDdFjLtViJmSrZx_ɀfφl̅k~dƁfЌsӏxybqXzbϔzޥ鲖峘ܰܲ޷ợݻܻƬƲƴŴŴƷŷŷŷȸ˹̺λӿܬp;+s[Ljiٔm}mvޔvˆmhZx;7U!IL%a83ڶԴɪܽݿȳAU-4^3?_3B^1>l>G^13^13i7Df4Bc1>a07_00m>9f_ƖxȐzϗқ~՞٣՟z͗q\J\J\H]E[@X;mM͈bosxzyt҇eoPI7N@VE[IcOcOcMcMdNbLlThOw\mSkM񦈶kMrTvWrT́cvWv[yazb~deɂi{bdΉqȅmpXs[ɋrꯕ气߭٬ڰݶ޹ݻŪٿİIJ²ŷķ·ķƷȸ˹ͺҿҿŹfUrXbۘqyvrڏqƁidVk/*V"k:AaiӻݿݾeMIO08O*9b:JW+:j>F_22b22c1>f4Bf4?a04c31ZS͝tϘ}֟қ{՟}٣՟z͗q\J\J[H\EZ@W;kMχboqwxwr҈coPJ4O>VE[GbOcMcMbLeOeOpWiPy]pTmO̭x]>mOqScEtVhMfLτkfy_v\}ceǂhȄidLx_٘밖ٟ֞岛ᴝ۳ֱԯĪݽӴܿ޿ŴĴ´Ĵƴƴɶ˷лӽֿ_GČlߡ~Ҏc}ݔo֍ofcQ])e61ϺǺֺڥJ/8M+9_9F]2>\08l;?_/2Z(4d0?j7Ah69vE@yեxԟٟ١ןԜzИwԜxܤcScScPcMXAV=jNՆckqqqvqԋeqSM7Q>XE]GaLdNfQiTcNlVhOqWkNkNhGɨޖsiGeFrTiJqVv]}dw^}dv\{b̅k{bw\y^{_ڗ{討⣋ޣڡ١㲜ݳڳڳٲױڳấ⿩аٸݽ޻İİ޻dzŰηηϷϻװfҔt{ՎeޖqzsV\AoG0ϰ̺Ų˸ҾԱN-6[7@^6A_2>X*6tBM_,7b-;i2@\%/p:?vrΛ˘˗ԝ֜~֜{֜{Ԛ{Ԛ{ԚyԚycSbSbPbM[DV?jPڇekoooqoԋcqSN6Q>XB\GaJcNfOiQcNkVhOqWrUoQDždǤ֎khFfGpQfLrZt^t^w^}dv\{b~dw]x]~cוwܚ~ח~͎vڞݣݥ㲜߶۳֯ӫܴڲխխڳٶ۸ᾨůůįں׸ɲ˲̶̲˽Ÿɻ˷᳚Εyݛzꦂ먆„bxX˝ɯԾɻιɺ̽ӌmoO+3^8A_4?^1=X&3l8Fa,:i2@^(3[%+LN̘ȖϜ՜֜{֜{֜{Ԛ{Ԛ{Ԛ{Ԛ{cSbSbPbM^GZBmT݋ikoooqoԋcqSN6Q>XB\GaJcNfOiQcNkVhOqWsVkN椄̄aeDiImOeJv]s]kUw^}dv\{b{bzaǂhӎs䢄֔xɉpLjp՚⨓⪖⯚ۯ׭֬Ԫ֬׭֬խ⽤ڴײ⽤㾥㾥©«ٸԴչǰȰɰɱɸ²ֿ˶Ƭ֢h֘yӕvИy̭Ũū«ӿ̽ɺһ]?@J&/a:D_4?\/:W%2_+9d0>p9Eb+4i38vr͚ɗƔ֤՝~֜{֜{֜{Ԛ{Ԛ{Ԛ{Ԛ{cSbSbPbMaI\EpVߍkkoooqoԋcqSN6Q>XB\GaJcNfOiQcNkVhOqWmPbE騅{XdBjJlNeJx_s]dNw^}dv\{bǀfɂiՐv䟅ݛ}ˈlƆlԕ}ٝ欗⪖ޫΟӦۯ߳ҥթۯ߷ڲխ㻣⺢ڲڲỢ߽״ԳַĭŭƭƯɳ˶Ӹݽ徥߲Оɕy߫ɬ¦ΦջǰƯɸ´ɻP12G#+_9Bb7Aa3?[)6[&4k8Bq:Ds>B\[ɗœɘץ՝~֜{֜{֜{Ԛ{Ԛ{Ԛ{Ԛ{hW_P_NfQ_H[DoUތjoqrrtr׎ftVQ9UA\F_JcMbMbJbJcN_JlTjPiL^AȨ䣀ӋhyWtUdFeJt\lViS҆mzbw]}cԍsړyЌq֑wΌm͋oӓyݞٝ֜ןڦⱘ֩ҤҤ㶜ޱ٫ӥ溡լӪḝ形ڱ֭۲㻦⻪⻪߻ٹֺպӻª¨ӹɫῥª㺢ªݴͳζٿDZűɹ¶ķI*+S/7X2;X-8\/:h6Bb-;k8Bi38ZVӟ}̛եϞ}֞}ם}ם}ם}Ԛ{Ԛ{Ԛ{Ԛ{hW_P_NfQ_H[DoUތjoqrrtr׎ftVQ9UA\F_JcMbMbJbJcN_JlTjPhJbEŤ楂ݕrυc_pQiNrZiSlV̀h{c{b}cړy۔zˆk̇l͋lˈl͍s֗͑zҗܤ߫ڨצ֥ک۪ݫެޭⴘ٫֩ޱ㶚ޱݰ޲⸤ḨḨ߹׶ַԸӹջ̳ɯϱݽ޾ůԱӾۻư˴ֻݺᾳ˩H)*U19]7@_4?b4@j8E_+9e2:s?>vmΛɗƕ}Ξԥҡz֞}ם}ם}ם}Ԛ{Ԛ{Ԛ{Ԛ{hW_P_NfQ_H[DoUތjoqrrtr׎ftVQ9UA\F_JcMbMbJbJcN_JlTjPeHfI覄y֌jІfwXlQoVeOpZx_}dɀf~d֏vאwǂhȄiՓtύqϏvՖ~njtӘᩕڥףڨܪݫԢ٤ݩ߭ޯ۫٩۫ޯ㳕䴖᳗᳡޳޳ݴձԲӳдͲɰͲֻҶϳչ׻дι͸кƲĶŻհհݸǾvSLT13W3;\6?f;F\/:i7Db-;j7?TP}գē}ɚ{ϡ{ңzӣz֞zם}ם}ם}Ԛ{Ԛ{Ԛ{Ԛ{hW_P_NfQ_H[DoUތjoqrrtr׎ftVP:UD[H_JbNbMbJbJcN_JlTjNdGkJ騂sՌdφavTpQlQcJr\rZ~ë́je̅kҋqȄiΉoគڗ{֖}ۜȍvܢݥɕ~֢ݩݫ۩ףף٤ڥ۩۫٩֦٩䴖鹛㲚߰ޱܱܱ֭կӰұ˫ֹԺŰͽ̸̻̳оܿİ̸ǴὭ޺ƢĞL%#_;DZ6A\6@h=HN!,_1:d6?yGJxmƑ̘̚ҟΝyΞv֤}֞}םם}ם}Ԛ{Ԛ{ԚyԚy^N]N]L]HbJ]FqWlmpqrsrpmQO>SFZL]N_L_J_H_HcNcNdLeIcBvQ﯂k׏_χ[Ї_oMZ;lQiPԈpԈpӉpӉp˄j·mҍrԏtύqה{֖}Ֆ~媓ɏzƎz괡ԡԡ٥ɖڥ㯗oΛȗ˚ܫܫԣ鸢۩㳥ްТ̞۱իɟӫ㾢ῢ߿­İIJĴԾǶɹŴɺ˹²ƴ~ӫzҩׯϦQ*/W-@i@WU+>I!/e:EW-2lBDjc˖ΚҝԟբҞ~Н}Ӝ}ԝ՜՝~՝~ԜzԜzԜxԜx^N]N]L]HbJ]FqWlmpqrsrpmQN@SHXM]N_N_J_H_HcNcNdLeGa@WݗdԍWχW҉]qLcD}bτkЅlЅlφlφl·mψoϋpҍrה{֓zАxߡňtܢמΘ̗М˖ףݩܦڤzҟӡƔ빨̚գ䲣Ĕ͞ϡް֩ǚƘݱ迦㾤ῤ߿޿­°IJIJǶ±Ŵξ̾ͽױװqGHU*2]0Ff9T]0Fc7F]2:a78{SNv˗К~ԝ֟סԝӜӜԝԝԝԝ~ӝzӝzӝxӝw^N]N]L]HbJ]FqWlmpqrsrpmQN@SHXM]N_N_J_H_HcNcNdLeG_?͋cߚfړ]׏_ݕi~XjJτiڎv΂j΂j̈́j̈́jҋqЉpΉo͈mzbŁǐsm⥔՚ڡϘǑբƓ~j_i_֣Ңե֦ϟᱥϟްժ㸭Ę}ݳű޴ܴῤ߿߿޿­°°İ˷ƲȶпȸĴƷҫyҪmbٰ?V+3b4JU%?c4HqDPT(-h=;leǜ˗К~ԝ֟סԝӜӜԝԝԝԝ~ӝzӝzӝxӝw^N]N]L]HbJ]FqWlmpqrsrpmQN@SHXM]N_N_J_H_HcNcNdLeG^>ՓkoflwԋemN~cτk̀h̀hˁhˁhՎtҋq͈mɅj̈pᝅlޞҔ‡}]Wvqcb_ahibcӡǕ]^٩ըᴯėX-#śz±㽪կڴŬ߿޿޿­­­­Űιҽ͹⾬˹п֭dShZ~rĽϦAh;De4IP7c3Fj;GO"%tHEyС̗К~ԝ֟סԝӜӜԝԝԝԝ~ӝzӝzӝxӝwbQfWfUaLdMfOw]ߍkmoqrsrpmQG9LAQFVGaOaLaIaI^IePfNaBZ9~VxoߗhyӉdpPtZpWs[̀hӉp҈oԍsЉpˆkȄiy]mUӑ}͍~ɌxsɎr}cpP]sAN˘ĜjwoANeqrzfjsHIlA>jc]8/ͩɺϬů˱߿­­­ŰŰŰŰ͸̷Ʋͺ±իVEXGwP?v˿I!V,-^28e2FU6m9H_,4[)*kfŕ˘М֟٢ۤ֟՞ӜӜқққ~қ{ЛxЛxЛvЛtbQfWfUaLdMfOw]ߍkmoqrsrpmQI;NDTHXIaOaLaIaI^IePfNaB_?mFqՍ]ߗk΅_mNv[v]w^́i҈o΅k·m͆lɅjȄiȆjݚ͌y̌qkszt_sojrmshsE[^1Il@SyM\f;FS)-T*,X20tky׶ıȱ϶Ӵ­°°­Űŭŭū߿θ㽨p^J_MaNXG~ԬܴqHAZ1/_67_39_+:\"6k2A\$+l66z͘Ɠҝסڣڣ֟՞ӜӜқққ~қ{ЛxЛxЛvЛtbQfWfUaLdMfOw]ߍkmoqrsrpmQM?QGWL\MaOaLaIaI^IePfNaBhGW0ɞǔpͅUِd҈coOtZqX{cτkφlˁheǀfȄiɅjxZӏwdžsfZϐq}rd~Qok;Xm>[tEbTqkUvpAcmS(BavZ1?=U-2Ъۺ¯ªԶªİIJ°­ŰŭŪŪ߾sZcJXB~Q;oZr\̤Ӭ۳kD8L#X0-lBDZ,0]&4j/@o4A_&,VS̕˔˕֞٢ۤ٢֟՞ӜӜқққ~қ{ЛxЛxЛvЛtbQfWfUaLdMfOw]ߍkmoqrsrpmQOATIZN^QaQaM_L_L]JePfNaBmMGϤđɑjDžSۗlܔqsUoXdP}fЅo΄miyb}eǂjɆmԓ~͍}~qƇwSczBWOl[,Nm?asEfdX{\+Nd]}PrW,HpQ)7xPZ۳ywܺٷۺݽۺ߿ڻİų°Űݰ­jQkcGdHmSpVŖ˜ԩĶe;1f=6a64U*+_37U&-d-9}BOy?Gj12tkӜyӞաڣڣ֟֟՞ӜӜқққ~қ~КzКzЛxЛxiXk\hV_JiQhPv\mprsvvvܓktXSAOETHXM_T_Q_O_O_M^JjS^@qPf@ܚp̎vݤlכm֔slUsdᕈ̀qۏkX~k̄qٓs]ԓʼnȍjoˆO\k0Are,Dr@]b3Sd6UpVv]/Nh9XQqkN=J3WirGQի徴޺ܹ״״׶׶ٷֶֹƳչܽͻṭtHBq_lyĜzگ۰ۯޱްpD@S%%e8:j;B^09[+9_-:f09m6;d--}G@ɕƓ~sԢգ֣֣֣ԡԡԡԡϛϛϛϛΚ~̗{ɕyȔxiXk\hV_JfOeNsZߍkprsvvvܓktXSAOETHXM_U^U^T^QaQdPXAiLbBJ%mE˘̎w︂ϔhɋiiS΅yςz׏TFɁqxftfhXܗcVHIČjwFUp6INdr8O^)Ai9UQ#@~OlxIfh9V_1NsrE3bzF,p{ͣڱƸݷ۶ٳٳٳڴ۶ٶdzŰٺ޾jbSVwwm^~㸘իΤ۰߳vFAO"b16i8?d2=i7Ee2D[&6c,6s=?e0+f]Ȕǔ}˘zԣդդդդӢӢӢӡΜΜΜΜҟϝ͛̚iXk\hV_JcLbJpV܉hprsvvvܓktXSAOETHXM_U^U^T^Q^OhTT=kNsTc>_7՜ۤp{];͇qڑ{mfX͇vǂspaҏqylϓxADcoxAOIZTiVme,Hv^/Hk>X\/IZ,Gb4Oc~m@[XsUp@)iz}߷徴߹ٲڴ۶۶հڴڴٶ˶ۻͬ}~UDtF=cdf]tbm֫ժĪ߲Z+JT#&l;@h7>e3>i7Ee2D[&6h1:o8:r=8}ď˗ץצդդդդӢӢӢӡΜΜΜΜҟϝ͛~̚}iXk\hV_JaI_HmTڇeprsvvvܓktXSAOETHXM_U^U^T^QZJiU_HbEmNkFW/o@Ԟ︆ݢxzX}dΆsm]weńqpɉzoevtosqdj\id2@UitAVZ%@a,IkQ";B+oAWX+AV)?k>Tb4JT&=aw\kx߶֭濳侫۴۶۶۶ԯֱٳִٸ߿Ǭ›cPeWebWVh\Ϣ׫ܰܯk=1qA=b20^-1m=Ac29l:Ec1?]*;c/>f09p9;b]}xНܪ֥դդդդӢӢӢӢΜ~ΜΜΜ͛~˘{ȖyǕxk[j[fUbMbJW@dJڇemqstxxޕmw[P?J@PEXM_U^U^T^Q[LcOjSeHtUzUjAN"y͛۞x͎ltWs\r_ȇtxhswl~wtrrqQWNX]mhztDXJ3O;Zzi9VZpX,?c7IpDVTfWjmoBUhzqoy֭ݶ˹Ӭӭӭӭӭԯֱڴ޹ĪͱƬzbT[W]]opqo黬iZU&\,*c33h88o>Ad38l;Bl:E_-;P/j6Eh1:i24}rirӟ۩Ϟ}դդդդҡҡҡҡΜ~Μ~Μ~Μ~͛}˘zȖxǕwk[j[fUbMbJW@dJڇemqstxxޕmw[P?J@PEXM_U^U^T^QcTWDiQjMwWyTɅ\i=‹\ӣכtņc~]X?Ȅkąovcrȃljkq}FQtESa2Edxj:Tl=Zh7WvEh\ye9Ld8GW+:j>MU)8^2A\0?fvZiozٯڱΦկӭҬӭӭӭײ۶ợ㾥ɱũƦĐyfT^VfhyFL˚[Te63Q!%],1_/2wFIl;@d3:b0:]+9\):p;Jo8AILtk{Ҟգҡդդդդҡҡҡҡӡӡӡӡҟϝ͛}̚{k[j[fUbMbJW@dJڇemqstxxޕmw[P?J@PEXM_U^U^T^QaQ\HdMkNdEjEmEc7zMɞϤ~W_cBwWy^hN՝~owjhW]\#0N]l>PA(qD\}OjzLk[,N^/TUtsS(3oDOM"-U*6Z/:^j}Q]ٯ޶⺯忭޹ӭӭӭӭߺªȭƩƥƦުtaB9Z^hjtmqԤm>;IvDN_-8_/2wFIl;@d3:_-8[)7e2Di4Dp9Brt{͘ϜϝצդդդդҡҡҡҡӢӢӢӢҡϞ}͜z̛yk[kXhUbNbJX@eIوemsstzxޕpw[P?J@QEXM_U_T_Q_OWEmZ_HjOrSχdlFjBmEΨȢiFbAzZtWw^ňtvfŒsphmv=I~FVi3HP"6\2Ib7QWslA_i=^cW)F[f{OWS&/U)1qwsyˡśԫݳݴԬͤǞլԫԬԬūƬĪƦ˨Ȧ߫vbD:q33zDM{ITŔ˛X))o>BV$1c1?f6=o>Bd3:k:Ai7A^,9h6DZ&1wAF˔{rȔϜ˘~̚{کդգգգҟҟҟҡΝ{Ν{Ν{Ν{͜z˚xȗvǖtkWiUeSbOaLX?eHֈbottv{yܔqv\UFPEWI^QeXdXeVdTaMdObIjOqV~_~^jJX9ί죅ȂerWhMt\ńqxm[Xv=>v=B]jf->LaX#;f7PtGbZ+Hd6Sl>[X*IVvl?Z]lb3=i:AIkmyyǛݳͤzɟ޳ըԥᰚ˚Пצݰⷚ¥ǩ˫ίũ˭ϯͭΕTM]"![%*_dԤɚj9=c29_,>l9Mh4FvDQq?L\*4c29c29q@EX&(phs}̘Μɗy˚x˚x͛}ϝӡգ֤գԢӡСϟ~͝{̜z͝{̜zɚxǗvlUiUeUbOaMXAeHֈbotwx{{ڕqw\VFPEWI^QfXeXeVeTiUjTmUx_v[lQsVz]{_}acIrZhyd…xnjsyT\IVW/v>Ss:Qt@Xb2Na2Oj;XQ#@pA^b3P^{Xo_0>k=DATVǛ۰ܲٱ庭ݰӡ⯛ӝܤ١ܨ㱔鹛ƥ˩ͭβӶ׷ն՜_Xe*)[%*NQϟm=@e3>b/Bp;Ti6Jr?Po=Ja/9^-4d38i8;k:6~qwɖ˘~͛~͛}͜z͜zǕwǕxɗz˘{̚}ΜОϝΞΞϟΞ͝~͝~̜}ɚzlUiUeUbOaMXAeHֈbotwx{{ڕqw\VFPEWI^QfXeXeVeTkWiSqX}dy^lQmP}_mSzb·pybwbNjww]av=Iq:HHXW#4s>SQf[*Ap@Zi;Vm@[c6P^1L]0JW*Em?SW)4rvvHHƛҦߴ仭}pըڪ᭚貞ɏzۢޥ䫐鴘ťɩͯ¦ȫͬ˫պ걟zsDB](,f69hh֦q@Dj8Bf3Gp;Tq>So;Mj8Fb0:_/6f6:^-1WSyƓǔΜҟҟҡҡɗyɗzȖyǕxsƔwɗz̚}Șzɚ{̜~̜~̜͝͝͝~lUiUeUbOaMXAeHֈbotwx{{ڕqw\VFPEWI^QfXeXeVeTbNfPqXkSqVy^vXpUs[i}fkdžsˌx{ilch1:k}Q/f3GMaX);{J_l>QyLbF/l?U]0Fm@VS%;tG]Pc\-7QTȜmhɞĘӨ꽭ǚܬ㯞͗ٞٝ䥍櫑¤ȩɬ̰гӲҲж䫚zUT_*/V%)~NN۫tDGo=Gj7Jt@Xr?Tk8If4Bf4?\+2h7;V%)kf{˗Ԣ֤Ԣԣԣգӡϝ͛~ƔwœvœvȖy‘wēxƕzǖ{̛͜͜͜lUiUeUbO^JV?cFԆ_pvxy變ޚv{aXHSGZLaTfXeXeVeTfSmWmUhOlQz_}_rW΄mmZȄrȇwyjǍ{rc}a,;t@XO6iX*>J0l@QzN_f:Mc7Id8JsP$7qEWk?QI+U(+c]ᶫɞի۱㶣ҢԢНӝם榍٘ꯕ츜庝̱Ͱұֻ̬ňONV!%Q!$PPⲲSVp>Hq>Qr>Vq>Sh4Fc1?i7AT#*i8=q@Dz{ϜץОҟҡҡգգգգ˘{ȖyƔwđwxxxxvēzɘΝlUiUeUbO^JV?cFԆ_pvxy變ޚv{aXHSGZLaTfXeXeVeTdPdNkSw^rWmSz]ۏt͆pq,e$iZ‡yxk{mX$#d1FP!>j:Vk_2H]3FQ)9sJ[[/>J-X,;h;JN"1mAPapX+7prlfܱ֫辬ǝϥůκ͚fS^Iyazaܚ~❂쭕謓ﶛ湝¨迢˪ϰߦwp~BAX#(U$(VV꺺bek9Dp=Ps?Wq>Sh4Fc1?i7AX(/i8=W[{ƓҞץООП~П~ϝϝϝϝɗzɗzȖyǕzē}đ~đ~đ~vwzđ~lUiUeUbO^JV?cFԆ_pvxy變ޚv{aXHSGZLaTfXeXeVeTdPdNkSw^tZsXςe曂xd};+j-ˏ{}H;qfe37V&LPrtB0iAUiASe?LV-9\1=h=H_k~S^T_Q&2\08}庭۰ܲśڱ丞yrƍtٝeI+@aDאy飍䀹뫓涛߷Ũɩ䴕fdSHAFE^)-U$(}MMڪwzd2=o;OwB[s@Uh4Fc1?i7Aa07i8=y}~~˗ԡץООП~П~͛}͛~͛~͛~ɗz˘{̚}͛ȖȖȖȖyxttkWiUeUaQ^JV?dF҆_pvxw~ޚs{^WHPEXJ_QfVfWhUcOhQrXoSiMsW҈jەvՐvΎ~^Sc)~xje^]f46htf7Sf:^_3UI!:}UiO*:a9IWeJ"-Q)4^3>]eX,4P$*˟y㸫Х躪ӥ㴟麤q[wȓҘpΏyۛt\S9V=~d❅깞ͶΥzadNrbymspcfo=@Z)-vEHɘ^,7m:L{H\p@Se6Hc1?f4?h7;i99‘}tďΘա٤ҞҞ~Ҟ~П~ϝϝϝϝɗz˘{͛~ϝ˘˘ɗɗ{yveUcS_S\O^MV@[>ԋepvtx}{ޛp~^L:NDUH\L^LhPhNcG\>oOhGmM̉iȌh歈Ӝ䰢Ŕtvs@Fo=ISd~J__yXsm9*ZsO&>ZqG3V/BvQ,=N(4[3=]17U(*qooh乬Ҧ̽￱ۦ豤TEaTSMyA?b,(m8/q7,e(˅z΂s{a͂cӍm֔x誏ɫ껥̻}qrj}LFc/-i36IOw@Id19W&-rAFēqxQXl:E_0>b3Fb3Fc3Ae4;OVNoΚИК~К}КzКzКzΛzϝООО˘{˘{̚}̛͛̚ȖƓ~bS_S]QZM\MS?X>҇epvtv}yޛm~]L;NEWI\LhQaIbEjMrUU8mOᢂᦆڢlŔywj=?T[J)~Mb{Ifrp\w~V-E_wb9PVmW/FQ)@H"8\6BQ*3M!$S#!ҡ̜ڬ᳣嶦´˾F:QGj,#z?>p9;p;:}HEjcf*#dSF̀cӇeڑqܗzޡγ齥tfq=8q=;c-0t?Eb+4j3?q>Hj9@Q!(sBI‘~MTl;Bh9Eb3Fb3Fc4@e49b1,qdysИК~К}КzКzКzКzК}ϛϝϝϝ˘{˘{˘{̚˚ȗœ^O\OZNVIXIO;U:΄bpvtv}yޛm[L9TF[M]MfTaJaIiQO9iQx_ċpjОq\Ȝe9=N"*{N]e6OPm\+Nd6W^yzM$;\3JX0Gb9P_7NF4^9LF!0L%0_8=T)(~me̜ⳡ֨ɹǷt9+_So/"v8-OMIGZ%!^+#B8ZJ}_τbՍlٔwߢũγɛtA4f1*xB>]]Œx@F[#,p9Bl9AV%,OVƕSZyHOi:Fb3Fb3Fc4>e48rA;q˖}К~К~К}КzКzКzКzК}ϛϝϝϝ˘{˘{˘{˘~ǖ~Ŕ~ywvx}\MZMWLTGVGM9S8́_pvtv}yޛm[P9WG\L\I_MhUiSaMk\]OL;J9ע⯛ܪW*X-*N&+eqO%8qFa]1SwJpe9]VqoL#:O&>W/FW/FyPhW0DH#3oJVG!*W12_41PG踪ΞӡűcQvecTWIL@Ȍl72QIzpȺŀrtbqTyW˂b͈k認չfPTGVNXSqoל{?Db%-s9Ac08b18^emtɘ^eX_a2;b4Db4Dc4;e66NFɗrМК~К~К}КzКzКzКzК}ϛϝϝϝ˘{˘{˘{˘{Ŕyxrolpvzj[eX_TZMVGM9S8́_qxxy~zߜoŀZcIM7cMhUdQwfsc8+~:3OLea᫤l>4X,&J$%tNWamc;Ob8V]pElci@[wb9PZ1HN%=N%=e=Ta9MiDSN*3S-1]74̜О칤ȲaLmݜЌ}{jdVwlv͚ュƁp{fy[̀^Ӌj֑tݟٽӸoVrzɎϓ۞OQ{=Be)0](-h7>fmX_ΝV]ZaU&0a3@a3?m@D[+)k_yđwҝК~К~К}КzΗxΗxΗxΗz˖zɗzɗzɗzȖyœvrommmmǗxҢܬ䴕hXcV]QWJTEJ7P6]qxxy~zߜoŀZ_@T=bJhQ_O}o{mMFkl„ᨫčoprBB[--wxbhhDOU0@B2wOovMsa7ck]xrc:QZ1HE3Q)@^6MS+?b>I\9>E!![UqfݰްDZɰ^Fxaɋtjב~ݓ˅sĈ}ɕxi{js^ם׍w{]́_҉iӎqݟ̰ԹxҗLJzric[EB==GLAGd/4b18U\[bⱸZa~MTX*3_2>b6>f9;k;7}ov̚}НК~К~К}КzΗxΗxΗxΗz˖zɗzɗzɗzœvsokdjŕs̝xګⳋ뾑dU_SZNTGPAG3M2{Zqxxy~zߜoŀWZ9^AaIfPeUzlzqxtɈҗv>GQ[vELS$+f=ArJQqM)BhBdvOxqJwdxvqH_P(?V-E_7N\3J]6GT09F#%F"!ɤ~pУް䳘\@iOLjp‚jݗߕkݕĆyҝӡޫӚƂk䛁΁cτbχf͈kᣆĨ׽涛ٞԓƄxzqa\ljOPz=?d/4e4;zIPT[崻el~MTa29]19d8>^11SL}qԢ͚yК}К~К}КzΗxΗxΗxΗz˖zɗzɗzɗzrokhoȘwשⳋ湋꽌cU]QWNQHNAF3L2zZߛtzz{~zߜoǀWT4cH^HcNp_obqj❞tj}\&;ppATa4Ff@M^jspSchI_W6PX6VkGl{Up[vokj@U^4IT*?F1c:JM%,S,,d\ܲ⸦įsfNsWאẅ́hߔy靅Ԉp꣍樔ӛԡ洚ף诓䀘ڐtԅdԅdυeȄf橌¦̰跜֛ԓ~ϋ{ɄyvoɂQOGH\&+p?DyHMxGLդqvZ^i8?]/6f9=X,)d[}rե˚xΚ~К~К}К}ΗzΗzΗz̘zɗyɗyɗyɗzqkhc٩ݲ滑龑鿌迈WOUMSLOHQID4H2}bەt}~}{ö́\Z>Q?WEbPi[lbwmrrۣtHja7WW3O{[okx]rG*DH)F^;ZpGkqGht–{Oai=NO#4i=NL1b4@l=:\-&ݴ뿸٩J9r\~dمiׄes힀꬏每寏㭋ߥݛ}ېrۇim~_̂fߟӷ鹛ᩉّۛ{Ӈxwo}xcar44d/1i8;vEHd37ݬ}q@Dj9=^+1a/0_/*{pwƕ}СО˘~̗~̗~̗{ƑvƑvƑvȖxǖtkfrmbiԤ꿖޶⺇濋UNSNPNMHOHA6F4zbەvꥁ{ö́\G0TDaQdUψ{ˋ~qfrrm:No@_h;aa8^P+PhEfb}^DZtiPiN1JL,GO+GV/LsIhkvI[N!0qyj=Lf9Hh:IO!(Z%!mezwӪ彺꾺k80TGp\{dނf݂aozꡅ릉诋鱍鱍歉䢁yosՁeӇlߟӷ湛ᩇݛzۑxԇvyoyt_^t77k76j::j::e66۫j::f46e02d0/m94~x̛СΞ˘~˗˘~˘~œvœvœvƔvƕsljkdhО巑ߺ⽌ŔQJOJMJIELE>2B1w^ەvꥁ{ö́^^IOAQEbUodvxNPViSrrFkZ1Wr[8ZtwW=S:4Q3JeD\]7PQ)DpA^h:Sl?NV)6shtO"/d7D]0=V(/s?:{ϣׯ彺X,)a-%M@p\{dނf݂ajw杁塄頋诋鱍鱍歉䢁yosՁeӇlߟӷ湛ᩇݛzۑxԇv~stp[Zy;;o:9i99]--h88٩̜a11a/0i36_+(UMɗyӢҢ̜}˘~˗˘~˘~œvœvœvœtēqŔrld_П{跐俎ƗȚOHMHJHGBIB~;0@/t\ەvꥁ{ö́^O;SF]Qd[tm[T[UobmAfxT/TkHjwWrz^sX:N_AUS2FZ3IT+Bf9Qh8Qf6MZ,9vIQ{v~~\08;\/2meⶲ߷i=9QeXo[{dނf݂ahs~㞁頋诋毋㫇ޥܚyݓs܆hlz^̀eߟӷ湛ᩇޜ{ۑxՈwρwrmWV}??p;:i99]--b22֦ר[++]+,r>=j61odƔyӣեȘw˘~˗˘~˘~œvœvœvsrȗvēo^hⲇĖȗĘǝɟHAFADA@;D=z8,@/w^ەv餀變}~zm˂]I7\SvmaZd^밭h7;avvzT+QlrOqszyXjQ/AP+>U-AT&=G-\(@o;Ob3?f:@SX~}PV[/4L!yĐJ"N"zG?UHmZw_}a܁_fr}❀먇ꩆ䫇㫇ަڡ}ڗwڏp}^cz^y^ɉm鲖ҶŦۣ~㚀׋yڌmiEDe((j64p@@^//W((˛˛d44f43j62j7/}tӢȘyզƗrΜΛ͛ɗ}œvœvœvđtpmc^Сs쾌ȔȈƎȕɛȞȡȤJDHDFDB>A:x6*>,t\ەv餀變}~zm˂_E3UMtplhSQyJQlyJjTyX0VwQwa~Z4EjBTa4GX(=E&Xodvd6=kl»rGHwLMIvrx泫軸I!U,*sGD\)!PDlXw_}a܁_fr}❀褄楂ᨄߨݥٟ{ԑqӈiրbނf~b}bȈl䭑д̭ן~ߝ}ߖ}Ոw҄yb]=;e((q=;xHHa11T$$ŕŕ{LLf43e1,~J@{wԤƖtϡyǘsΜ͚ɗ}Ȗ{œvœvœvđtpibeᲀ‹ƋƇƇɏ˕ɛȡǥǦNGLGIGFA>7t2&:)qXەv餀變}~zmȄ_VGB>WTcaxvďbetHP]qUt[/TjtbmNidBQ3 \0Ae7If3G\&;Zo}HWhf[0/wLJBM"!GwlɢvrN%#GZ-*~JBh[lXw_}a܁_fr}❀䡀ݤܤᩅמzΌk_ۅfkւf́fLJkݦβָԜzۘxܓy҅s{qTOz32h**wBATTc33Ooof43a-%eXzēz͝~ǘs̝tȚr͛~ɖȖ{Ȗ{œvœvœvœvqh^٩{އ~ƂɅˉϓЛȝǣǦƩPLNILIHF;4r0$}8&oVږv~~{~zpȄ_PAZUtqqppqmozMP[f~Oe~Ook?clDhjN+Lc~M+:lEUc:Hf9HL,d1BZk͘UZwIIW+(e96JӦqjof˚b44O%&d98W(%TJQBlXw]}]݁^epz~~ߜzݞ}ݡ~㦄ڛÿhyZچjpֆj΅iɉmڡܾͯҘtڗwّx̄stmIHp-/f*/}GIVWf46Of60]*yiwɗ}˘z̛wɘr̛wɗzȕ~Ȗ{Ȗ{œvœvœvœvkbh뻎͕꿀x͈ˉ͐ҘԟɞȣǦǫSPJHIJFG=8}:1F7ybۘx~}x~tͅdlZTJslfcqr}qBLSbi[}S&HbrMo]:Xa~zdFZU0?Z3@XhS%2o?M^,9],3diP#NNްᰨ沯wx[-1GW*,c/-jcXLt]xZ{X߁]bepwvx{}yԉjy\Ԅhςh}b}cDžiɏq鲕˩֚vٗtՑyɈxpjb$&f,4q9Bw?Fr=?](*j64{GDڦ[&c-r͘}աӟ˗wϜ{ǔvȖyȖ{ǕzƔyƔyœxœxrhWϟrƕɔȇϐϕϘΝΟϥϨΫέVTNONPIJDAA:PBȅmٚw~zx~tͅdE0UIUMb^yzekXdj}}k=^D9fBa;7w{S2AoIXvOZQ&1T(0T%/{[(0r@D[)*X(#ޯک~}f39T%,d6=f6:Z##VPi[t]xZzW\_eptvw{~}{ݐr΁ddyav\qVtXfᦈ뱐ޟ}ҏǒsɍ}NLd+1e,9c,:r:Am6;e/1p97zE@ީz_*N6ɓv͖yԝ՞͖yқ~ɓwɕ{ǕzƔyœxƔyœxœxĐrd\צwđĎċˏϔϘΟΡΣϨϪϫϫVTOOOPJJHFG@XJАxٚw~zx~tͅdhSB7ldTPhmpAM}Nap@]h9[h@_[yyVt}{^xzG&8S-=lwjrFP#&m=AFbemo~tol79W$*pAHW)0O#t>>e_WIt]xZzW\_eptvw{}}}z։l҆k~e΅k͈mЎr䦉嫍ޞЍt͌ytjj-+i06f-:o8FHOp8>o8:m74h2-ݨ}r=*s[К}ɓvΗz՞͖yқ~ɓwȔzƔyœxœxƔyœxœxĐrbǓfⱁ뿉ƍΓҖϘΟΡΣϨϪϫϫSPJJJLGGGEH@[Mӓzٚw~zx~tͅd^ID8PHmjz{őd6ATf~Nkjh;]?7rNlrOmd{mPjlxlGVtNXaeh=>a33o??tvtv۩a_soܫo=;b,/U"(e7>k=D\+0i22SMhZt]y[{X\_dosvw{~}{{܏r{ٍt杄﬐ĦƨלАxԏ~̉{XO]s9Aq8ExAO^eyAGt>@f0-QעďTAkԝčpɓv՞͖yқ~ɓwǓyœxœxœxƔyœxœxĐr^ϛo깉쾌ɐΓ՚ϘΟΡΣϨϪϫϫNJLJLMGFFBJB^Oϐxۜy{yz~tͅd]HQFNFspɐotUaPclqBdZ-OjBbd@^fDbeFctmOojO*:\e~TVHU)#̛˚۩^]tvo=>X&(s>Bm:@^07{MT_/3_))d^^Pr[y[}Z߂[]cms{]ٌmz{ޑsޑsޑsߓv׌qٍṯ壇ޣזՏƂ{m/-r47_%-c*7xAMah~FLPS_)&MɔďhUȐx̕xǐsϘ{֟̕x˔wΗ{ŐwđwđwđwvttoXܨ{컌œɔȏΓ՚қТУХӫӭӯӯGDFEHIDBEAI@\MΏwۜy{yz~tͅdP;eZUM„opv{rDOhzfNA_V/NP,JoLjmNkcy[{pw~XivOXU+,c92txo뺴pkXZf48r?E^)-MSi:AsELW&+s==hbE7oWxZ~[߂[\clsىkߓtxޑsߓtvvw曂䛁ƫҖ}Ȇz·ef]!o06c)1f-:s=HT[IO}FHc,*X#zq^ɑyɓv˔wК}қ~͖y˔w˔xŐwđwđwđwvttoXܨ{컌œ̖ˑ͑ԘқТУХӫӭӯӯz>9{?=DD~A?E@I@]M͎vۜy{yz~tͅdM8>2yqa]pqw}tFQj}\,Ij;][/PloJi{XwfGdoPphX8ZtI#,zQOϤݯ뻰{JEVQzHL^+3hpp:@d17\-4\ce49_))JEWIeNxZ܀]\\clrsޑsӆhwXٌmٌmٌmٌo靂ٍtُv裈멍ޡޤnjtɆz~?D\"k,4f,4j1>p9B~FMNTq:=i20e0+~tzm~k̔{ǐsϘ{К}ΗzϘ{˔wǐtŐwđwđwđwvttoXܨ{컌œΘ͔͑ҖқТУХӫӭӯӯr76t98{@Az==B>H>[Iˍrۜyzyz~tͅdTA\Qwp]Zy{W^j=He9L}NkX*LyOpW0OjGeqclPojJqvfozT]ͤv乬뽳d^ql~}d26S%]*2U]d/3b03zLSyMUFj47VQQG_IvZ\^]ajqpهhrS\=___πby]lQٍtx^z_U=kPm]ٖr{d#,h)1j-6i18l6?l4;v=BPUj12o74p82tkrdsǓy˔wК}Ηz˔wК}ΗzqđtđwđwđwvttoZک{뻎Ŕқ̓̐ҖНТТУԩӫӫӭr9?y@FzAG~AFGEaVeTАwޝxyz~t˅eZHҌSM}{tyT]VemDXsHdO%FwOorOmT4Q{c~qXvi_fd?Q^hzp۫hi^+1j7=Z&,r?Ek68k9=b3:rGQc7?c27xAALFZJqX{\xUzUa܉eֆckk݆btP{W{W{W{Xقdx]zb}υp͇sҏo6Bj2;l4>e06a+0o=@m79AGUZl-,]Xb(QEƑvǕx̘z͚{˗y˗y˗y˗yɗyĔvĔvĔvĔvȘzĔvsm~X껓ɝϟڦқ͖ҜϜԤרڪӤӤӤӤm6=t=Dw=Ex?Et98VL_NΎtߜxyz~w˅hqcxqGDwxyLWe=M[2IV,J@8}XwpPm_B^pZA\~emdjHcaq~齶eeő䱷S%o;Ai6;T!&m8=l68m8=b3=rGQd9Dc4>yDHPLQFdPtZwUtQۄ_ډfӂ_ߋekk߅b}Z}Z}Z~[~띉ޑ坍ޛ[cX$3_+9b/7b/4a/2m;=w@@?DQUt01[Uh,"L?̗Ŕ~Ȗy˘z˘zɗyɗyɗyɗyɗyĔvxxx•yvsj}W滓ȞΞ֤ΛΗ՟٨զӤТңңңңi18p8?r8@s:@p43QG[Iɉpߜxyz~w˅hQDG@c_qryk>IVfpG^W-LQ*IS/M]>[rw^Fat\yy]}axVozĚȜx{e28vBHk8>\)/}IOT#l68m8=b3=rGQi>Hh9B~HMUSF;ZFoTy\rO~[Նe҂bׅafll~[~[~[~]فfۇl܋wՈwۏّqip8?O*_+9b/7k8>h69i78IIAFQUy46XSl1&zD7ӞП˘{̚{ɗy˘zɗyɗyɗyɗzēxzzzyvriX潔˟ϟӟΚК٣רզӤТңңңңe-4l4;o4=q8>x=;VL[IƆlߜxyz~w˅hOAG@⣟fhjpU(3hx[2IO%D}X4SjJhͰy]yw[?]tUrt~Ԩk8>k8>m:@U"({HNU"(s>Bm79o9>b3=rGQlALj;ELPWUD;TEfPsXqSz\ςd~_օeنdތjo]]]~_ԀemWҀliXᕆ蟑ϋ}F@b*1])8f2@m:Bq>Dj8;c12NNINTWt01TNq6+t>1٤צ˘{˘zɗyɗyɗyɗyɗyɗzēz}}}ytri\㿔͡ҟҝΘԛܦΞҤըתУУУУf/6h07h-6l39w;:f\kZŅkږry}~xΈkXJE>טXZW]xJVsN%=Q(Fb:ZfBaL,IsiPk~c{pQioxcmrw꽿w{^+1q>DN!f39c06^+1i38m79q;@b3=h=GmBMi:DxBGv:8>7H:VAaHoSz\ˁe҈lՆh׆fۉjqq݌lهh׆i{ݏzꝌ䘉螓ԎpfGB[#,b-=j6Dh4=r?Ei7:a/0XXV[HLEFJEs8-a*М۪˘{˘zɗyɗyǕwǕwǕwǕxɘĕ~{yrl{byTըգ՟՞֜՞͞ФӦФ΢͡͡΢f/6h07h-6l39FEmcm\Ąjٕqx{}~w͇jTF?8qmXZPV~P\k{a8O^4S^~E!?\=ZαvZvya{j~yXjzOWf6:q>De28c06^+1wDI_,2h27l68p:?_1:d9Dj?Ie7@v@Es87y82>3F4L4^BqT}c˄jӇlوlۋoݍqߏsw}}꜇蛉▇͇}Όw90w;:_)2_+:i4Bo;Do;Af48c12\\QVGJFGOI{@6f0#ԟ۪˘{ɗyɗyɗyǕwǕwǕwǕxɘĕ~{to{bZƚשբ֟֞֜՞ΟХХΣ͢ժ۰۰f/6h07h-6l39FEmcm\Ąjٕqx{}~w͇j]OD=fc[\j7=b4@Xi[2IM#A{Tsb>\X9VW;WfNitvUdͦyNXiqvGNi8=[(-i6;j7=j7=o;Aq>Di38f02k6:[,6a6@f;Fa2;q;@l42z;8:28)8#G,_Ds[{eˁhԇlێsݐvߓx}霁럇☍꣘ՑɈb%!x?@h1=_+:i4BvBJj7=d26e34aaMQEHHITNJ@m7*֢ک˘{ɗyɗyɗyǕwǕwǕwǕzɗĔ~wq{db͟٪ա֟מל՞ТЦΤˡɟΤɟ滑d/4h07f/6o6;t=:f\kZŇlٕqy}}y͈kUEw82dczBHj8BQ&2dtc;O[2Ld>WV2ND$?sdLflp{wx\lamtIUc6Af8De7@c1;o=Gq@Gc08vBHc-2f39W+3^3>c8B_3;m:@h13EE?=8-y1!4H1bLr\wafӇoڎv{~靂ɇ{ܛleb("i22k8Bb0>h6B{ITe4;b16f69fkJPEILMZUTIr=,ڦ۪ɗzɗyɗyɗzǕxǕxǕxƕ}ǘĔ~wq{ejΣתӡ՟՛՛ԞУϦͤɤŸ꾝Ϣab/4\)/_*0l7;j31^SfSj֕pz{~z€bL:ZUœq~_3E\o^7JfATb:Nb=O[8ME&>ƩžS:UeMjzz]vbvQ,?^7J]3FW+=Sb}M[\*7~JU_-8_1:_2>^1=_2>a3?f8Ap=Es9Ap17GGHA>0?-A-B,P:\DiPrWІh׍mwߗw塆ߜՔNjyqaTp;/W&!h7>\,:e6Dl>Il>Ii:Fk=FXcLUU\{BDb^[Os?/ۨ̚}_aioxxzx}yxwpr\׬ΥժΞΚқӗКŗԭȨӦwQBW)[,%e49\+0X%+b03h30SF[GdՔozzw}wehWzIPԦP&;lD[zTjd?QzSdM(8H%8_AWfNkdJjjMt{iphtZr˭ʼnhO)BS*Dh>SzNarBS^,:P]Z+7X+7X+7X+7X+7\/:_2>h6Bl3@i,4x:=FFWPdWwd΄oЅoՉs׌sۏt}{{ڗyܜ骑촡x[Im?6]03I(c6AsFQl?Ji;GS^T]JTU\JM][ULt@0բtx[x[y^yb~iovv~~}{}q{m}h溚Ӫ֪Ɩǔ٢ٟȑś軘vWB\,X("c12yGJyHMi8=\)/_-1e1-{G:O;w\Քozzv{žp污}LGW&-m@O[1Fd;SqJaZ4G[3EwQbkH[0(~ax}M3SS6]Ąhv~o^AXhH9b8MTfb2Be3AP]d6Ac6Ac6Ac6Ac6Ae8Dj=HsANx?Ls7?x:=WWpith{ílЅo҆p҆mӇl֌mڏpݓqޖsڗwӓwڛ嬔贡趤뽱sspDG]14rFI[/2J"l@D^bIST[UWWUOFzF6̘hc}_z_ybs^tatdyi~oqrsqwhvfzd뿜΢ҥȘɗפ٢ǕŜ̜}fNi7#Z&o;3JIMO^czINf39e37a,)yE8xB/kPՔozz{ח{P@~MHƕU(7]3H:)XofAT\4FvPa\obDZO2IiPmydGlpTsryjOhvb9S\2GsGZyIZS!/Ta]/:\/:\/:\/:\/:]0;c6Ai7Dt;Hm19k-0UUohsfzhj}f́k҆mՉoԉk֌lڏmۓp֕rӔt՗}⩎ȸǞsrO$#h=;i>=e:9yLLJPSZ\^SPI@J:Đyx]rmjit_p\jZk[iXl\qaschWl\o^iPˢĔɚեϝОϝ΢ҢbGj7"l8(m9,VMc^WUx}x}[aNQxD@wB6k6"^D͌ftxy}{͍qiXUPrAHH*S)>c:QN(>x9#d?O}ZlwXoN1HG+GdwsV{}amh~yX2L\2GxL^h8Hf4B~LXd6A\/:\/:c6Ac6A\/:[-9h6Bx?L}@Hk-0DDkdfZȀmԉtiτmԈpՉoَpَoَl׏jӑlߡ橉鰔ũ「跞軥ķ亲qG?GmD;XSLP~FMQTIGr=3bQȕ~đwmmprqkzjyihTjWjWUBaN{i]JU:˞˘֤ե͝潍jU8v@,q;)~H8M@MAUL_Vyjm]ZyE8e0[@͌ftxy{{͍qpytT#*O"1E0X0Gooc;MxhEWs@#:L0LqXvU;[tV9ay\~bompxVorLe~Uotl@SZ*:a/=O\l>Ic6Ac6Ak>Il?Je8De8Dq?LGTT\t79IIibh[yf{f́k҆pԈpՉoԉkԉjԉhӋeҐiܞxߣ⪈鷚뺟ŭ仫zjX0i>3JOzBINP~GEj4+wfƓ{ƔyđtđtđwĐyxro{hs_q]r^\Hq]p_LhI”ϘբΜɚƚ—myJ%o7!~B4VHdVZN\PXMQF{ētqPDb,W=͌ftxy{{͍qעQMrAHb4DX/DH7mG]O*=}UfL&7rOb]?Ulm;#@bElsV~T7\fsv_>VL#=W+>m>NH$S_b3?X+7X+7a3?h:F_2>_2>k9Fl3@T\p24IIwpzmΆsjτmԈrՉq֋pܑsܑrܑpۓmݜt檆孉洖䴖幟辨ɴṤҽqi>1}GIw?FILyB@_*!ȔxȖ{đtđtđwĐyzxt~k}fvaydiTydrfQmԚס̚ϣܱmE]+ ]LZOWMVLVIVIZM_Sqwz]Sj4"V;͌fxyyzy͎opJ!X+:a7LjA[lF^\6Ld=P\7I^;PZ8OJ,DT7P^B^hN1TX9_rTw~_y\xsx~b>WȢW0DyM_G)k9Gr@Mi9G]0=a1?i9GvDPm;Hm;HyBNQZmss12~:6rkwiˀmyc҆mՈm։lێp׌j׌j׌hՍhܚrz}ݤ孌߬洖쿡Ũȭƭī־ҹڴwfvFFp=B}GIvA=W"ݩw˘~mmprx{{rryd}dv]dftX尋ΛЖϘӡФfX7r>$cXVP[Smdr^NWGjXhGLĖofi4$M4̉i}~wΏmiX~LM^,9P"6i>X_7QQ+Ed>WS,EM&=_wdAXS1H[9QI(@oMhyZwN/NmNkoOlb}m{W6MlGZH+O"/qAOsDV_0BX%9d0A}DTo3D_%2GP]b}JDt+$VJm^yi~fӄe׈eڋhۍfڌe܎hߑkߔmsx~⣀諈谎광レĢŤǦȪϳӸ׾jA=j?@{OLb1+^+!ܨǓoƔwđtsszxzytp~i{ai__֣ϚΛש鹐vSS2iTZQ^\jdvl^PcQiQoWN28ioǟǜxqc/!L7̉k餀xϐmŎorF"^0FM">]{P)FV/LZ3Ma:Sj[8OJ(?O,D~WpT0IdB]qQloOjb}jJeokhmN,DT(7\/;Z,9wGZd1F[%:e-@GWt4Db!-~:Ab_vpPGs(XIo^{jhԄa׉bڌdۍeڌd܎fߑjߔmsx~䣀樆诋鱍캔レŸŤȨбӸ׾O&$UNPIa1%ȔzҜƔyđtsszxxvm~k{cw[_Ϙr˔i‘٤ԡϟ΢ץjJU9_L]Vcbidkb^PcPiQmU>"(lNTȡɞy[&H3̉k餀xϐmΗNQr@NH0j?[T*HjB_Q*GN(A_9QO,D^;SG$;F8c}]xoOj~^yjpfGba{X:QO-EdwP$3I)[hQdk8L]):d,={ANt4Ad#,{8=fbka\Po#]LsaԁmلlԄa׉bڌdۍeڌd܎fߑjߔmsx~䣀妅嬈谌趏뺖뿜¢ƥϰҷֽc:3d:2i:1V&ӞȓǑ~Ɣwđtsszxxv}j}f}ayZŏjᬂ沄͛פԢɛ뻐d]>Z?ZEd\liib^T\NcPiUmW;%]?E̡~SF1͋lꥁyБo~q^,0_-;X*@oD_I>a9VW0MQ+E{Umby>2lIaeBZW1IO+EW6PpPk^?ZyZt~^yqQlb}sxX7Nk~^2AZ,9}O\Xip=N^*9c,:o4?k,6h(-EEjadWeWkaMwcքmچkԄa׉bڌdۍeڌd܎fߑjߔmsx~䣀妅㪆毋峍跓軘꿞ģίжջṰT*[,!a1"ףŏ}qƔwđtsszxxskhd^٦͟˚МԡӢĖ⭄kGaDfMaLj\skjaPF^PcShWl[E)/M/4zȡϤSG2Όm릂zғpr]+/@o@V[0Lb8VN&DX1NP*D}ZqH%=c@WjG^H":]9SN,GL,GZ:UoOjjhHcwWrvsczc;MZ-=O"/yLWm>Lk9Fs@Jk4>i/7j+1z:>ca}qp^fTs)fPҁh܋oچjֆa׉bڌdۍe܎f܎f܎fڎhrw}䥄㪆䬈䲌跓軘꿞ģ̬γӹL#O"cPqŐy͘rrtwwttp}ewZ^ԣ}ҦϞ̗Ԝҝ͖͝m\9V:iPcMpaod]QWJk_i\fZcVD(-Q39wɢҦ\(F1͋lꥁyБotc14f4BM4^3OM#Ad=ZT,IxZ3L\9P^;SH%=rOfZ3L@6eD^2-oOjaA\lMhelarI,f9F_2>]/:^,7p=Ev@Fj14r47FEke~ps_^H8"fLҁe܋mڇeֆa׉bڌdۍe܎f܎f܎fڎhޕpvz~㤂⩅㫇㱋跓軘꿞Ť̬γӹϾm\GyckǓy̗{qrtwwttp~cwW_߱ԥ͚И՛ҝǘ⫀^a@[@cLlVo]fWZL[Nh\f[bX_WA%+V8>qyΦϤi4&}B-ɇi~~}}v͎kobsAEf4Ba2HF7S)G^7TlEbS,FlmJbO,DG$;U2IoHaI%?Z8SN/I{\wQ2MW8Sls{z]twOaxh:GX+7rDMc29k9=r=?j12}@>UQvmĂrxbQ:P7hI҂d܌iڇcֆ_׉bڌdۍe܎f܎f܎fڎhڐkߗtߚy}ᢀᨄ⪆ᯈ跓軘꿞Ť̬γӹֿ͸U)mvĐrhqrtwwttobvSbƚץɓ֜֜М՚pwPmMbH\Fvap\]LWGaTdZbX^Z[VD%+\;BlvϨϤp>/x@*ņf{{zyrˌizo=@X&3d6IQ&AZ1LW1J]7OS,EXopMbQ/DwTiW4ID3^;SX7OJ+FyX9TaA\b}t}E&>L*Ab?QU-?i=L}ŖmxxEJj49e//k0-F@aX}qɅs{eH1_EfIӁbތjڇcֆ_وbۋd܌eݍfݍfݍf܎hڎjݕrޚvߜz~⥁⩄⬇趏껖뿜ţˬαӹԽ­P(}cpȖxǖtmppqssrl^}WĘo˛٥ƍ۝ϖ˘魁ljaxTvVhN]Gp[fU\L[LcVbW]W\XVTF"*W1:dmΣǜ}O?s@)Ňh}~{xzȌhtff48j8Ee7IW-BP(?mH[V1DS-@jEW]:MT1DP-@W4Gb=ON+@mLdP1LqQlD$?kLfvVqwrvF$;O,?e>OX,;f9FT_yBNclIM^!!{:4WNpb~pɁo΄oz/V;օiԀbkއdމd݌e܋d܋d݌e݌e݌e݋fیiݑmߖqvz~䦀㪂貌빑쾖ȦˬϳӹսϺe>%w\o–vkmpoooomi~Zcc뻎Ǖڡ˓•w}XpOiMfM^I]MUI[Sh^b\\V[V\W_]E(M%/~S]—˟SBtD+ĉi~}xzǎjyyGJo=Ih9La7I[3GlGW^9HV1AjEU];J[9H[9HZ8GfAQX6HrPicD^P1LsToT4Oa{vssVmlz[8J8"b6EQ^b0=c*7BNo06X~:6UJj\xhzhs_@+Z@օiրbldffߋeމdߋeߋeߋe݋f܌iߐmqsvy}密趎뺔뿚ƢȨͯҷι¶woksvvwxpomk]ddΝmکx~̖֞ܗsvUjJeLbJ]JXJZQ]Zc__\[WZVXUVSJ$-G)sHSϤVFyH0ĉi~}xzǎjǓUXi7Dc4Gi?Q^7J_:J^9Ha;LjEU];Jb@O_>MU3Bb=M]:MJ)A^?ZX9T_zU6PZ:UmsS6MrTkvM%7V*9W*7r@Mc*7t7Bl-3m-/QMi^yk̄syfT@O:kQօiրbldhhߋeމdߋeߋeߋe݋f܌iߐmqsߛtx{~⫂䲋깓꾘šǦ̭жιӻŞ_tTbqvxxvsrmhdƔjēcēb}١ΘҎloNcF_G^JZHWI_V^Z^Z]X\WXTSNMHV09J#,sHSҦ–ZI}L3ŋj~y{ɐlȔW[]+8W);f=OZ2FP+;X3Be@PjEU\:IeDS\:II(7W2BX6H{ZrX9T40tH)DI*EsToZ=TiiG^k~pHZi=LQ$1Q,]$1h*6d%+w78TOi^vhoˀm4!Q=Ѐf׆jaldihߋeމdߋeߋeߋe݋f܌iߐmqsޚsߝvy}᪁Ⰸ涏軖ğƥˬγȰιȱɫimN]=]=hNt_oqsvysƕqc̚pa[淀ަЛꭇȉhjJ]D_J\IWGUHib_Z[UZT^XVPMG~F@N(1L$-i>HӨƚqavE,~]ޛw~szɐlwjVZX&3V(:\2ET,@M(8lGVW2Bb=M[9HeDS^=LI(7L&7G$7I(@rSmiIdbB]pPkaA\]@Wcz~\sc@SZ2DD&m@M^,9]$1d&2m/4FG\Wsi}oscP>~1dOv\׆jقdsdeߋeߋeߋehߋe݈cڇc܌iݎkߔpߗrߛtߝvy{ߩ߭䳍幔žƥɫγԻηӹtU6jIm@"yJ4P>\IeSaNo\lpܫȖoc[դsΗ՝ˑlfIT9[EUAN?UHmcaW_X\U\Uf_b[LEf1*L%/L$-c8BӨ˞wfvE,~]ޛw~{y{ǎjpcPT\*7b3FS);U-AT/?oIXW2Bb=MZ8GeDSeDSV4DZ4EN+>X7OH)DA"=lMhlMhmQ3JP/Fb?Q\4FZ-=W*7Z(4a(4i+7y:@QSzv·}ͅwrbx-L8jԄjҀdmsބbhhhhhߋe݈cڇcۋh܍jݑmޖqݘrݛsݜtݢxߩެᰉ㷑ŤɫγԿǰݷV7iHaB[FTFxH:{L>rB4zJ=QDUAlJ̚r٦}Ϟo۪yϘИ鶂oJQ7J3Q>TDPDXNj_\S^VaXc[c[[S{H@i6-_9Bb:DoDNӨԨpvE,~]ޛw~}~~~dsf~LOW%2f8JT*=[3GV1Ae@OW2Bb=MZ8GeDSfET^=Lb=MQ/AO-FT4OcD^N/Ijoz[v~axaBZV4LlI\M%7pDSW*7T"/b)6l/:FLfhytzpdVE4v+jVֈsوoԂfojhjjjjhߋe݈cڇcډfیiۏkݕpڕoڗpژqڞtݦ~ܪޭᴏ辚ģḵ̌־ҽɲֺX9fFsUsacWPE{L@m>2f7+\,!_-{J)㱉빏צw跆՞ōXS0F-L7M:UGVJ_X_VXP\Tc[h__WPHrA9l;3~WaXb\fӨ٬vvE,]۝w~}atLQO+_1E_6Jd=PS->T/?W2Bb=OZ7Ib?Qb?Q\9La;NE"7E#;^=WtSmP/IM+Fvi~^yN,DN+>S+;Z/:N!,m=De-4y:@QStrxpmbJ;m#_J́kv^e܈l݇izXskiiieߋc݈aڈbوcڋhڎjܓmڑlڕoڗpژqݡzߩެᰌ溗Ŧɯ̳ӻս†[>cEmTl^f^jbbVQGtA7a,\&~G*ǣМrТ䴀X+xD(G6UFOBSHaXd^TOSM\Uf_mf\UxIBm?8pA:XbcljtҦ׫~X?{X՜t}~x{f@{qyFNf3Ee7M\1LZ1JS-@O*=O)?Q+AS0EpMbQ/DlI^]7MG!9Z6O>6rNj^:VjFblHdT0LjphHcN,DM(:X0>S(2T(+a/0~BAB@\U}rhZ:+4!J6{f~fӂi׆j߉k݅ecaccccdddd݌e݋f܌fۍfܐjُhݔlqw䣀䨅㭋崓龞¥ƬɯӺֿӾй޲lV^Ljaidice]VM~D9r7+m1S;䢆ǫԜxkFi6s>-}E?}E?yA;^[a]WTIGSQ^_kljkQS~LMvDEp>?~WahqpzΣթ\BvQ͖mwyz}qJrjr?Ib/Bb2L_4O\3MU/ES,BW1I^8PV3JdAXN+Bc@WsMeU/Ha9VbP)Fd=ZiA^f?\poJfdA_P/IW4L]6G[0;U)/V)+c/+LBaUm_fVv)k@)Յm{b~dԂfمiކfda^bbbbcccdߋcߋe݌e܌eގh܎fߑjqv}壂㩈䱐帚ū˰ζԽӾ\IeWjcidhcf_aUTHL;D1U?̳뫑͏thM}D(l4w@7zDASPcacaSPIGUUX[eilpcfOS{IMr@Dl:>qJTclkvȝӦbH[֟wꭀ~Xd\h4?\)=a1Jc8Sa8QZ3IW1GjD\iB[a>UwTkX6MiF]rLdO)BJ#@f@6pU-JwOl]z]9U]7PX0GX0@f9Eb16c10p82ZMx1#k#~3N7lTx]y]{_aԂcۅdއda^]bbbbcccd݌c݌e݌e܌e܌eݍfސiqvy䢁⨇᭍ⴖ澡Īɯ˲ҺԿҿ\IXId[jdh]j]fZaO\JZE_H垅Ȉo[@I0zA&H4LBNL[Xjh^\IGyB@\\bdormqW[}JNwEHo=@i7:a:DXbakpxŚҥeLyUКqy{鳁bZQ_,7W$8^/Hf;Vd;U]7M[4J_9QN(@N+B]tb?Ve}bz{UoX1NbI"?rJhra9Vo\yXslD[U+>M/]+6U#&W#c)x3$F0]DhMkNoPwV{[}]~^Ղaڄa݆_]ZZbbbbcccd݌c܌e܌e܌eۋd܌eߏipty~ߥޫ߲⹜ȭ˲Ͷҽ˶̹mbS]Qh_i\j\jWeSfSjQjMɄd{^^BF-S;WBQ@PJ[X_]\ZNLHFLI]]ikorhkTWzHLtBFk9=e37Q+4kDMxMWckӨۯ̞pVzVқr{ީwzTOGW$/X%9W(A^3Ne=Vf@Vd>T[s_9QU2IlH%=]:QjD\xV/Lkh?4jB_S+HxPmlxMhb4JU&9_1=[(-^((k3-PDbLhMqSsS~Z{WzTwPԄ^Ԅ^Մ]ل\܆\߅XVV^aaadddehjjjjijqty~ޤݪݰ߷㾤Ǭªӻ̷ӾҿızJ;cTeWiZkWlXpWqWsWlLhGdD_DhOjVbOOBVP_][XOMIGIG[Xrrz}qt_cOStBFi7:d26h69V09f?HqFP_h㸹軴ۭm_ڣz}~ۥsqJ{H@X%0]*>X)BZ/Ic:ThAWf@Vb;TI#;O,D_wQ/FyVmpIb_8Uh@]w]6SmFc8-zQlhi:MQ"0W$/c+1s;9SJiZmTpNsPwPzTUބW^ԅ[Ӆ]ԅ[لZۅW߅VST^aaadddehߑjjjjijqty~ޤݪۭܳߺŪŬ̴˶Կ˸ϽsE2_ObSfSiTqWrWv[xXqMpImLkO{esbaSOE_\VTMJMJMJLI^\zzsvadOStBFm;?k9=l:>p>A\6?a9Be:EZb帨̞yUϘp{y鳁wPr?7[(2c0DX)BU*Ea8QjDZiBXZ3L[4MlIatQiZ7NxUlU/GwPjef?\fQ*GW0Mh@]oGd[vZjm;H_*0k23ID_UcPqSvO{Q}S~PyJtDqAԅXӅ[ԅXֆXۆUކTP߆S^aaadddeߑhߑjߑjjjijqty~ޤܩ٫ڱݸݿȰƯ˶˶ǴTA\I^IcMeNrVw[{]}[tLvMxT{\r\iXbVbZVSQOMJMJVT^\ljwwehSVr@Dd26d26q?B}JNTW_9B\4>^3>U]꾷帨Ԧ\סxx}lFk80\)3h4HZ*DT)D\3Mf@VjDZO)AlF^~[rS0GV3JkH_[4Mf@Z_}L$Aa9V=2bsLiF8rDZTeXcOUHI\Wi^hUwWyO}QP~N}LM܂PԅWӅ[ԅXֆVچUއS߆P߆S^aaadddeߑhݓjߑjjjijqty~ޤܩתׯڴٺ˲߿ɴŲ~ZD\GaJcHrVx\~_]vM{P[ąexbbQTISMzB?WU\ZLI^\vs{yoo[]{IMf48W%)a/2q?BZ]lppillow-2.3.0/Tests/images/multiline_text.png0000644000175000001440000000543312257506326020035 0ustar dokousersPNG  IHDR,dc IDATxkHSo-[-BKYTdEb%* z I Z/&t4**$+,i &fvvlt~^y~=}Uoo/!da.oI0$;;l6H$^;v466Z,ϟ?Xֶ6Bкu5~"DُX,޹sF1L&~׮]bm`Y!'O IHHhll,((ϯYzɓCBB222:;;R9((,L+LF_ M?6))IP(ZJ|$ODQ*55k?m/.{IOO?r䈫8'++R*rHGqa鋵())ɶMIIɲe &L+++ 6>}ڽ388h-\.Z)X\HՔ)SRUU5}tJrOGG+aLL̻w+ׯ^|w#j:--mFϽS\\|Y[oo\bvl Yd{^4W䠠 Lj,X{bPPVUՑA?R;:qDB?h4rZROP(-[v…\ B>|teJJJuuM&N;sLDD> F_~bR7&ATSN---gHܻwL&#^W^*?VVVzN?{N?Ǐs?~`dT*kkk~uܹI& _Ɣn3ǹ8Գnݺ!(/_2699٥z VNKMMEgg'!$11QYVFŋ ~|`<9k̙*nBH|||{{}}}㳲حNsqg׮]ǎmj=>yfdd\.vҜ BHssڵk EnnOdffftw|}"J-MNm2Gz_{dffnٲy\^^j=&ח]񩨨`i!dڴic\Nc ZOtYt{-`())B΢݄H$jmm}:SWWwԩ3f-\.<> tٺuk¼VZ`}. h4+VTTTΘ1n3s׷VUU:tHP[i$`<'ӥwsA':¤3gΤܹs߾}6ms-9s攔TUUkh$rss322/_~eަJL'O?~]c2l3]\߿~"D+Wtc^&Gzӏ= $t{nQQQpp\.PJ.뉉ijj*--e߿jg͚j=72mT*Uaa!ۀ\LB2].]GŢjM6}1⌲Db67o,}ɍzZ[[nܸ;88h0N8\Ŷ' 2<:hLLqLLpNt7#Q;ϯ+kqW׏?FQk\/ϯ+SN&Bp_W8c .ϯ+^"ݻw̱`*,Di6zxp9iPPJOOgǏՅ/lLߏPy?r<''h4Z,TW͕ɓ>>> nt8C vNBbMMM{Fgf~nTZUUUVV6|L6oADTbWloq#z}*12+#/7MXch=nt<BB AH LUZW-`dh9dl mrAwz rJ{TYbgot { " '4?IS[kr@y c z5 IXYf!rt~ngtRNS {IDATxyLqϖiMD>sDson 5Grd331Eɕ(aSnf7wn1xvb\9@ץ+Sw^ş`.>@~g&&,.zw2mǀҏ|>Oc&%>B&C~q"@hHž;~w?z/;Gw׬)1##_"H^>@o?JRK?'.6R@5o#@8oq< .W*COy@8Wqq>q~|Z0x !=J{'^qlhom& Χq?Fp%)|k#a Χ<@!a`=[NQ/sX(0BݓC!z~t &Yx~Ƞ`6}@8e5x>ὁy=joܹ{淪[ 2s_~|H|( O+5_"ߝ~z T)+:Z7mAw樂C}iV`3$' EsP+^a曂73m߄Bsoȿ?AOdP}&wSKIENDB`pillow-2.3.0/Tests/images/zero_bb.eps0000644000175000001440000006336712257506326016426 0ustar dokousers%!PS-Adobe-2.0 EPSF-2.0 %%Title: sample.eps %%Creator: gnuplot 4.6 patchlevel 3 %%CreationDate: Wed Nov 20 00:23:10 2013 %%DocumentFonts: (atend) %%BoundingBox: 0 0 460 352 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (sample.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 3) /Author (mentalpower) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Nov 20 00:23:10 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor LTb 3600 4773 M (Interlocking Tori) Cshow 1.000 UP % Begin plot #1 1.000 UL LT0 LC0 setrgbcolor 3896 3541 M -104 38 V stroke LT0 LC0 setrgbcolor 3685 3502 M 107 77 V stroke LT0 LC0 setrgbcolor 2901 3533 M 891 46 V stroke LT0 LC0 setrgbcolor 2142 3242 M 759 291 V stroke LT0 LC0 setrgbcolor 2977 3427 M -76 106 V stroke LT0 LC3 setrgbcolor 4293 2350 M -21 2 V stroke LT0 LC0 setrgbcolor 2977 3427 M 425 22 V stroke LT0 LC0 setrgbcolor 1639 2658 M 320 470 V stroke LT0 LC1 setrgbcolor 2142 3242 M 1959 3128 L stroke LT0 LC0 setrgbcolor 2142 3242 M 1959 3128 L stroke LT0 LC3 setrgbcolor 3569 1853 M -11 -160 V stroke LT0 LC3 setrgbcolor 3159 1946 M 399 -253 V stroke LT0 LC3 setrgbcolor 4259 1624 M -701 69 V stroke LT0 LC0 setrgbcolor 3017 3294 M -40 133 V stroke LT0 LC0 setrgbcolor 2423 3214 M 554 213 V stroke LT0 LC0 setrgbcolor 3887 2095 M 406 272 V stroke LT0 LC3 setrgbcolor 4259 1624 M 260 -20 V stroke LT0 LC3 setrgbcolor 5058 1939 M 4519 1604 L stroke LT0 LC0 setrgbcolor 2669 3058 M 234 89 V stroke LT0 LC0 setrgbcolor 2669 3058 M 81 -175 V stroke LT0 LC0 setrgbcolor 2683 2722 M 3 5 V stroke LT0 LC0 setrgbcolor 2683 2722 M 3 5 V stroke LT0 LC0 setrgbcolor 2669 3058 M 81 -175 V stroke LT0 LC0 setrgbcolor 2423 3214 M -281 28 V stroke LT0 LC0 setrgbcolor 1870 2842 M 272 400 V stroke LT0 LC0 setrgbcolor 2423 3214 M -281 28 V stroke LT0 LC3 setrgbcolor 4225 2265 M -73 7 V stroke LT0 LC3 setrgbcolor 4225 2265 M -73 7 V stroke LT0 LC0 setrgbcolor 4011 2179 M 282 189 V stroke LT0 LC3 setrgbcolor 2687 2718 M -1 9 V stroke LT0 LC2 setrgbcolor 2687 2718 M -1 9 V stroke LT0 LC3 setrgbcolor 2969 3262 M 2696 2790 L stroke LT0 LC3 setrgbcolor 3699 2056 M 3569 1853 L stroke LT0 LC3 setrgbcolor 3358 1986 M 211 -133 V stroke LT0 LC3 setrgbcolor 4081 1802 M -512 51 V stroke LT0 LC0 setrgbcolor 2423 3214 M 246 -156 V stroke LT0 LC0 setrgbcolor 2423 3214 M 246 -156 V stroke LT0 LC0 setrgbcolor 2535 2860 M 134 198 V stroke LT0 LC0 setrgbcolor 2224 2922 M 199 292 V stroke LT0 LC3 setrgbcolor 4718 1909 M 4259 1624 L stroke LT0 LC3 setrgbcolor 4081 1802 M 178 -178 V stroke LT0 LC3 setrgbcolor 4067 2055 M -251 25 V stroke LT0 LC3 setrgbcolor 4067 2055 M 158 210 V stroke LT0 LC3 setrgbcolor 4293 2307 M -68 -42 V stroke LT0 LC2 setrgbcolor 4293 2307 M -68 -42 V stroke LT0 LC0 setrgbcolor 4011 2381 M 211 141 V stroke LT0 LC0 setrgbcolor 2042 2077 M -403 379 V stroke LT0 LC0 setrgbcolor 1639 2658 M 0 -202 V stroke LT0 LC3 setrgbcolor 2941 3034 M 2746 2697 L stroke LT0 LC0 setrgbcolor 3532 2744 M 58 39 V stroke LT0 LC3 setrgbcolor 4067 2055 M 14 -253 V stroke LT0 LC3 setrgbcolor 4416 2011 M 4081 1802 L stroke LT0 LC3 setrgbcolor 4293 2196 M 4067 2055 L stroke LT0 LC3 setrgbcolor 5277 2680 M 0 -594 V stroke LT0 LC3 setrgbcolor 5058 1939 M 219 147 V stroke LT0 LC3 setrgbcolor 3417 2751 M -21 -36 V stroke LT0 LC0 setrgbcolor 3887 2607 M 141 94 V stroke LT0 LC0 setrgbcolor 2705 2701 M -170 159 V stroke LT0 LC0 setrgbcolor 2224 2922 M 311 -62 V stroke LT0 LC0 setrgbcolor 3010 1915 M 877 180 V stroke LT0 LC0 setrgbcolor 4011 2179 M -124 -84 V stroke LT0 LC3 setrgbcolor 3118 2832 M -97 -167 V stroke LT0 LC0 setrgbcolor 3698 2750 M 64 43 V stroke LT0 LC0 setrgbcolor 1870 2842 M 1639 2658 L stroke LT0 LC0 setrgbcolor 2042 2280 M -403 378 V stroke LT0 LC3 setrgbcolor 3913 3544 M 3188 3409 L stroke LT0 LC3 setrgbcolor 2969 3262 M 219 147 V stroke LT0 LC3 setrgbcolor 4718 1909 M 340 30 V stroke LT0 LC3 setrgbcolor 5058 2534 M 0 -595 V stroke LT0 LC0 setrgbcolor 3010 1915 M -797 93 V stroke LT0 LC0 setrgbcolor 2042 2077 M 171 -69 V stroke LT0 LC0 setrgbcolor 1870 2842 M 354 80 V stroke LT0 LC0 setrgbcolor 2474 2687 M -250 235 V stroke LT0 LC0 setrgbcolor 3698 2750 M -166 -6 V stroke LT0 LC0 setrgbcolor 3420 2721 M 112 23 V stroke LT0 LC0 setrgbcolor 3098 2657 M 266 53 V stroke LT0 LC3 setrgbcolor 4293 2446 M 0 -250 V stroke LT0 LC3 setrgbcolor 4416 2011 M -123 185 V stroke LT0 LC0 setrgbcolor 2213 2521 M -343 321 V stroke LT0 LC0 setrgbcolor 3098 2657 M -393 44 V stroke LT0 LC0 setrgbcolor 2474 2687 M 231 14 V stroke LT0 LC3 setrgbcolor 5277 2680 M -4 107 V stroke LT0 LC3 setrgbcolor 4815 3277 M 458 -490 V stroke LT0 LC0 setrgbcolor 2980 1968 M 30 -53 V stroke LT0 LC3 setrgbcolor 3721 2808 M -304 -57 V stroke LT0 LC3 setrgbcolor 3118 2832 M 299 -81 V stroke LT0 LC0 setrgbcolor 4011 2381 M 0 -202 V stroke LT0 LC0 setrgbcolor 2980 1968 M 1031 211 V stroke LT0 LC3 setrgbcolor 4416 2011 M 302 -102 V stroke LT0 LC3 setrgbcolor 4718 2415 M 0 -506 V stroke LT0 LC0 setrgbcolor 3057 2620 M 41 37 V stroke LT0 LC3 setrgbcolor 4416 2381 M 0 -370 V stroke LT0 LC3 setrgbcolor 2941 3034 M 28 228 V stroke LT0 LC3 setrgbcolor 3694 3397 M 2969 3262 L stroke LT0 LC3 setrgbcolor 4815 3277 M -702 245 V stroke LT0 LC3 setrgbcolor 3913 3544 M 200 -22 V stroke LT0 LC0 setrgbcolor 3887 2607 M -189 143 V stroke LT0 LC0 setrgbcolor 3057 2620 M 641 130 V stroke LT0 LC0 setrgbcolor 2980 1968 M -938 109 V stroke LT0 LC0 setrgbcolor 2042 2280 M 0 -203 V stroke LT0 LC3 setrgbcolor 2941 3034 M 177 -202 V stroke LT0 LC3 setrgbcolor 3569 2916 M -451 -84 V stroke LT0 LC3 setrgbcolor 4067 2687 M 226 -241 V stroke LT0 LC3 setrgbcolor 4416 2381 M -123 65 V stroke LT0 LC3 setrgbcolor 3558 3149 M 2941 3034 L stroke LT0 LC0 setrgbcolor 3887 2607 M 124 -226 V stroke LT0 LC0 setrgbcolor 2980 2170 M 1031 211 V stroke LT0 LC3 setrgbcolor 4067 2687 M -346 121 V stroke LT0 LC3 setrgbcolor 3569 2916 M 152 -108 V stroke LT0 LC0 setrgbcolor 3057 2620 M -583 67 V stroke LT0 LC0 setrgbcolor 2213 2521 M 261 166 V stroke LT0 LC3 setrgbcolor 4739 3256 M 76 21 V stroke LT0 LC3 setrgbcolor 4739 3256 M 538 -576 V stroke LT0 LC3 setrgbcolor 5058 2534 M 219 146 V stroke LT0 LC0 setrgbcolor 3010 2428 M 877 179 V stroke LT0 LC3 setrgbcolor 4081 2738 M -14 -51 V stroke LT0 LC0 setrgbcolor 2980 2170 M 0 -202 V stroke LT0 LC0 setrgbcolor 3010 2428 M 47 192 V stroke LT0 LC0 setrgbcolor 2213 2521 M 2042 2280 L stroke LT0 LC0 setrgbcolor 2980 2170 M -938 110 V stroke LT0 LC3 setrgbcolor 3694 3397 M 219 147 V stroke LT0 LC3 setrgbcolor 4739 3256 M -826 288 V stroke LT0 LC0 setrgbcolor 3010 2428 M -797 93 V stroke LT0 LC3 setrgbcolor 4718 2415 M -302 -34 V stroke LT0 LC3 setrgbcolor 4081 2738 M 335 -357 V stroke LT0 LC3 setrgbcolor 4718 2415 M 340 119 V stroke LT0 LC3 setrgbcolor 4519 3109 M 539 -575 V stroke LT0 LC3 setrgbcolor 4081 2738 M -512 178 V stroke LT0 LC3 setrgbcolor 3558 3149 M 11 -233 V stroke LT0 LC0 setrgbcolor 3010 2428 M -30 -258 V stroke LT0 LC3 setrgbcolor 4259 2904 M 459 -489 V stroke LT0 LC3 setrgbcolor 4519 3109 M 220 147 V stroke LT0 LC3 setrgbcolor 4259 2904 M 4081 2738 L stroke LT0 LC3 setrgbcolor 3558 3149 M 136 248 V stroke LT0 LC3 setrgbcolor 4519 3109 M -825 288 V stroke LT0 LC3 setrgbcolor 4259 2904 M -701 245 V stroke LT0 LC3 setrgbcolor 4259 2904 M 260 205 V % End plot #1 % Begin plot #2 stroke LCb setrgbcolor /Helvetica findfont 140 scalefont setfont /vshift -46 def 5692 490 M (cos\(u\)+.5*cos\(u\)*cos\(v\),sin\(u\)+.5*sin\(u\)*cos\(v\),.5*sin\(v\)) Rshow 1.000 UL LT0 1.00 0.00 0.00 C 1.00 0.00 0.00 C 5776 490 M 399 0 V % End plot #2 % Begin plot #3 stroke LCb setrgbcolor /Helvetica findfont 140 scalefont setfont 5692 350 M (1+cos\(u\)+.5*cos\(u\)*cos\(v\),.5*sin\(v\),sin\(u\)+.5*sin\(u\)*cos\(v\)) Rshow 1.000 UL LT0 0.00 0.00 1.00 C 0.00 0.00 1.00 C 5776 350 M 399 0 V % End plot #3 stroke LTb LCb setrgbcolor 4304 755 M 6229 2045 L stroke LTb LCb setrgbcolor 4304 755 M 971 1500 L stroke LTb LCb setrgbcolor 971 1500 M 984 659 V stroke LTb LCb setrgbcolor 6229 2045 M -952 213 V stroke LTb LCb setrgbcolor 971 3275 M 0 -1775 V stroke LTb LCb setrgbcolor 971 1500 M 52 35 V stroke LTb LCb setrgbcolor 901 1422 M (-1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1388 1407 M 52 35 V stroke LTb LCb setrgbcolor 1318 1329 M (-1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1804 1314 M 53 35 V stroke LTb LCb setrgbcolor 1735 1236 M (-0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 2221 1221 M 53 35 V stroke LTb LCb setrgbcolor 2151 1143 M ( 0) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 2638 1127 M 52 36 V stroke LTb LCb setrgbcolor 2568 1050 M ( 0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 3055 1034 M 52 35 V stroke LTb LCb setrgbcolor 2985 956 M ( 1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 3472 941 M 52 35 V stroke LTb LCb setrgbcolor 3402 863 M ( 1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5343 2197 M 53 35 V stroke LTb LCb setrgbcolor 3887 848 M 53 35 V stroke LTb LCb setrgbcolor 3818 770 M ( 2) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5760 2103 M 52 35 V stroke LTb LCb setrgbcolor 4304 755 M 52 35 V stroke LTb LCb setrgbcolor 4234 677 M ( 2.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6177 2010 M 52 35 V stroke LTb LCb setrgbcolor 4304 755 M -54 12 V 127 -39 R (-1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1025 1488 M -54 12 V stroke LTb LCb setrgbcolor 4625 970 M -55 12 V 128 -39 R (-1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1346 1703 M -54 12 V stroke LTb LCb setrgbcolor 4946 1185 M -55 12 V 128 -39 R (-0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1667 1918 M -54 12 V stroke LTb LCb setrgbcolor 5267 1400 M -55 12 V 127 -39 R ( 0) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1981 2134 M -48 11 V stroke LTb LCb setrgbcolor 5587 1615 M -54 12 V 127 -39 R ( 0.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 5908 1830 M -54 12 V 127 -39 R ( 1) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 6229 2045 M -54 13 V 127 -40 R ( 1.5) Cshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 1500 M -63 0 V -126 0 R (-1.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 1796 M -63 0 V -126 0 R (-1) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2092 M -63 0 V -126 0 R (-0.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2388 M -63 0 V -126 0 R ( 0) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2683 M -63 0 V -126 0 R ( 0.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 2979 M -63 0 V -126 0 R ( 1) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 1034 3275 M -63 0 V -126 0 R ( 1.5) Rshow 1.000 UL LTb LCb setrgbcolor 1.000 UP stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica pillow-2.3.0/Tests/images/pport_g4.tif0000644000175000001440000066635412257506326016542 0ustar dokousersII*H]&ɪ?GU+Q&jZHeF f6.3D&JjZ&DRh,D DVН#>҈b9[<"dJ7B\Ej QMD'GU,TٌH&Жbu؋.63f͘ dqÙ6td2g>a"aˢ(B[;JTõ 6,!öAD7cb)4͹,.E П^/䜡B1qs\e&_pqr14EwtߺMVQWGфaFF6 E"Oþŗ2|7K'ZTn~(p@$L-هR#ѹGF X@ dHwG2:#"(~Smi۽o*P); 0>"L9QAL)p"qSE/#,@Z)v٪T@tvGфa>__m}GM؆1cCmF#"FB!\& P]n TE4,'ЈH qgnŧW=w}GZT,hDD},"1,;е0Eͅ DާM R= ߔna~J5ax#뉷{8I9Pxd|'3R8ˣs00ѓͶ[[CYvWr]a+d;NgnXm}RT]*gjV1pۊ86ź0`D4Dr>2:0h3ȹIhKshP^N 3"D8OqŧW'@yBpY}AkE#u^vqƟ vlDa߱?`ڐ~"װO632v_il/Spx"wSC.0Xy ÎXԎE9E1"]Fl.J!q"19Bh(4# :𩯅{TI_t M;VBҭ߷B|XM^Hmeնa&ѱtoNQ4.#pvɻn#CGD~.;/1a  ~L#򜗔98ffR:˙9eՒ#/]5CNƠ7TI}W/}ʦ*9+F[C㰩1# *AZ"S(t{kj Mh8jzTp^L4JpO 7S"=pЕS< Fkh1 Gr03f@L!S~y?sRkKE87-1T]eԋZ.a(* }[Bz})eoIVqoI:O*~GIJpDz%8D~hu™">hJv^K5+vQU[ް M/y>"Bw֤u&B~j0{[J،EB;_OMU:W-aiZp}U#{r:M}zH6AT75vmR tl0=VGE Pn\"GUa# T0B({Pےj_أq#]e7OEsO&}([]V[^9J>E9{m(@>Lkߡ 7O Va=W&T_imSAAa=7_A"/ 0)dtwA>a ]FA&#FӘ"i iI4,,\;_+aOXS.#w:$;alk8:xH=AC#R{(x;m/Xmm/a_ut}kt t=A*;}4"!PE8 ڡ.-5]m/J+߶&mZNRDt@9kN_b#nAqiq#1Zk?#SoZMt~װzj"%B:6PZ ]TǰݦJb`+XkX7. 0a%AE{ Omz_upƼi6[ְg>XX0-<5C{ֳ]mFοRw O_U h4NiLpQi)m$N:n aLBI֘+ ,0zaaI T[ B# zWiuwwg#ϯ)RiSGҡ ;pڿpmtAknB"D32hGp. iN)"=L B͊ V-1O>˫iNi}Y|iϿPE=@[^GIZ=6GFGWVn}R{+Zq+YB0""""" g5;ӄS&pNGNuaXEDrƃ &<0m#"vPvm-Idudt>vT(qM:, ^fk#_턿ZQZ:ꔎ"E"0P!QDDDAuB"""! "z!0E{tEOb(1 8mIb-6pE>AII6)6~$zf՟g".""""#RB: 0,>#4B,! (":pA0">LB#瓄 bgDWzPclAAu6w=Ko:hG00#0#0#0‘SXqa" ¡*IDސ"8 8i_41 +V[NM8a{Xh?sA DDDDDDDDCB$t-QuA0ELp@!1LAЬ1 i+b DDDL!Q`0B5!иRrV",,rܨ$ eF:#T"#DDDDF#>#0>#* e-1% ~v4#ˢβZ*E.WMGB|DD)D"""/i!GTG*"؍BtwЌ"uGTP-PǔhaWkrd]QԎ%R`$ta)lDm])ؔw">R!2S\G# dtryܰ* | c#;!Ka8A0@SN+hKV@rqAc 7jGeAϑ\aԋ=FlQB(yV͎#Ga.ϥii_ e\">Juސ'`y7aypx.0;do)_fo\wC m ysh)O[ ;'޶ׇtׯ4JM <&H?UGH ײ輏J3醌#8s;C#J|J!Dy;mXl!r=I<2:34BW՗b8Ј- IQuJD":o o߿{7MmSjtڻ]!҂n@@h$ z@ޏ @"pF0C7<#9A C@#C  ŝ06YDt}ttXпU_}x~J\tTWhFG W @꾗]{tbCcmjx>ڦx")Sz]a5u{I>аh'GzH&@h'.)t}d;#;ECMᲇiq#.a0"tt/ٍϦ{) *zl kCXO]oa?<O쿄/I7]wadt*]B ^K_qZqA6) ‚n A"2N%^%;Afwmi6SD,f)@B xg#{>h3Hvm2C[b4J=m55<}utDQ N@7 9,wttC[ S~#ah|gA=oh-HOR:Sم3 S]Zڮv'P]Pjm40isEvhÕ N{m&vN(4ˆqD7ciA4)B O{NϾO~f|ϺZ4X^!Ɵ_T VuhR:a, Z&.7tWQ(sbڿqR#iwڗwO_ vؗ^ Wu|:KVT-MI Qv < H;~l$k "h uujukuwTVlx@N oK3^WUucN5 k@E^FNtuz+8C%Ewm{cƐ@30G^Ԏ^܎wWV WW ][Vս+mtM]Sz^MXEa$tK[[Mn4_L/uޭ_ݵolj߷OfiG^~qƄ\a>6~*8炢ȣzު%bq}؇< Wfh&f ihDjuv[Aڶ{E_) -4k9Kyh0X@ޜקtj馚L}?kJ׶)n1m_3m ?SE=Ay:/[XIb"UP§9PS';IT!1@kGKO}*i7tUj~J4D@T# BIؔƛLS] kT1L 0A1X`M,5}I4X^#HCܺ қttU_wEv¤Y~o[J!6~!!ϡE?##GYj4(^^txNоiAPN-1 }]tlA%:c؃Gb n;V@ ɿ.'GAXkXi0 3dtH YG'z{wm[±IlOR:ݤqDwSR:0$aʏkcuuai{E""""""""""" RpB !prDt: aV+bg6DC6)Ca+x,ZGAT[i> + 4 =8zoAk=F힩iT}}^5:CU^"{};(?OZoFAЈAa0D0x=D0La04B#q)mlPhkaݓt-MZ¶ kEa0pzP4WA7+9^¥I{mui6fi*i -h*db*wȅ## |T80B.!Cz8":] DqZAxGⷶ"m[XÈA 'C " Wdte@C=4wi-WJo{3箓QD\E"!B:#)Fav""""""""!3,!  E=e<‘TKS#)ulEaN؍18qL8,"w({e "m`'wKMMBDtb"""""" vPDDDDDDD0D\DDD08g": aetػ/;/"V\ilkjND|a ٚ>"aa# @b""""""""""! AVT+M#"{U,WOli,mAv6+ Z,DDDDDDDR;uE(!e8DuCH"@W%e7i/"wZ!H#0cf#a!- ꆆ@*-B#6GhB&B^#Eۣ0>DDMDFAb%A+fJ]]$Db/KcICm(}OZA .$N: GM: 3_>PϪoHzԗFZpKwM"<>-&"3 g301(y_0#)T/.0"qoeT @rG3/Xh @jpAkaBq $ .q 3!%“b |! 0g;l}0E0#>aE:C[jCB;<: ~(GVĨ 0' ч_c{|&Q*(P8h1Aġ lD!5 TƜ(C`9)Y&GExtc/x# /F])y^:#HP7/Ih.S5IjB{ & ۆ!a` 8D "ק0&;Dyp34!8cQn""d&hv|}pՍb xVz#}6Nh< tL'` 8a7o N#^("pJj]N# B4a{kz놢~=4:]S a^]o$(}=:L:i$7wUa6c KE `4e봯;T/ձ[]ҋTZ׾+ED 4)WaMGqŴu/K#]@z> VaA:.aC{׭v} W >j/8^ A_8DF=v#BXTUt+PEB.M[}ޟttMiBZN]X]%ѻELt "CQNDFzt#q%rkM&՟޶3o:&#qjƹ9z~E0ÔM)E"(Cc@봛 NIOLCIۥ֓UE5lW_fGU_KEWGtEս E:k\AK~MaUivqv V յ:]C T6zEv7}XՈ%{.%hy^I#! )lJ{|]4 XUM8xmj?}#)XE<Oҭ{zt4=-~#0""YTP@ !e8LAjAAĨ{rXOQ&b^[7n' 0h+ XV'j߄ H)b"""""q'M@ЈNF!PBНLXNa!nbH4˭D{ =[ޮI^UDD{s0t'2 !ag'TBb bSULV+,I$"҈BS0EʄaHD[`Dxk""""8"qI nM}YE"h:TH"("1u"v#"1(;C-( rh"ȭCeHR#-PQdQډ]:!Y QTDJFZ- Kellj+B%q5E*a#2&E-BWB""w"""9Գi[\IDe4"v"h!I6TDM(҄PTDt!NYB"&@hve 2-2;N#DaFKhDNKZ42,"B:1T:@/~ɖ$I4B@ )#"v1 _Ǽ}j %$c8.ΈE"'Diw NӣD!+ _X¯Nl,ZzAvfEB(GTF 3$#(GT#B.3Ds"**jGTC}ciOB"/f$0"":A&voC30U#ia 3uG#gi"tE)t}oUFve g%;XeA@§aAh6x"K8 30ys4gQ:?"/Q#0N"]etf 0G:#NWӭޛP6xP@( ?C h~5Ѡ6"pNh@ˠTaP#ڄ5FnG(.*#=Ψ(GB(FB0"aF})ՒB(FP#xAn$ZZ[h$&8qP lh0L k5"ƍmCXA !ٍ C+L!0t&4EWJsA01cݫlBѦPe>ODgFB:>>#0Vy}U=/JVtiuizOӤE:Tx`}<'EL":Af EEeޢS4`UQkl!N4'wca]8#֑ta_0a Az `a,b(E0uVSL菣0"}*t/u$}DzP S@CJ]+z>O_MMptzqipNSh'&|7͊o%d[bfUќPED0w(fCSx@|C]a =X 3 *%3.PCO؋#V=B2=EUһ +L{Utڪ{l\iE<$ C*@"ӄSEEDuAA7 8l5%\0U\84l [ Ya1?ܧ>^Mp[ ]G Go;mz⒑Q0X@مfVKxNMƺZWNhRtquڽ=:$PQ#&+Wx y$|lÍomsh&7aL Q80Ds_Dc_.GWױa a>"^#ƚV4?مFOˠ]/#jCI A: iS"@Er:?k_u^a5_Ć4^:˂$ND7^q+V֒xG@{[L»0|"fֵ{im[B:CCX׵?½qTkO^. (k ݩU0? Ԕ.j]="(OUF\F(ߎUںLW< +#xEǽ5uMIi㋥1uJ뷺nq0wJ0ׯ&ޜeCm>kOf[~w* t?RywAԎ5/߶qӵm]_۷jnVIuA=wM-0֞{ 6ޞFh߷}>akkח^"*G[B9w0w|?G#?wf\ ^K T"9.TU$`6"Vav?tۅ~l./ . ݵm >NGx7g)a)k!UC7qQFaP\= 5A LP.,&" 1_ BA@쎂@ V@al'եlmnǏ{ 5ai}`} /DzCcҊK[ ?~~hΆ:q>G>vGAAO eT!`zM;M aS b&'D}]60yt0E>\ WaP:6ӤVm*aa;W[; NMרOV;BK(B"""""""""")"6"p 8a0I; T4)Bh;1M BbW QH"]CQMR:jë^m\+a?Uw B{I',RC|_/|_/taFc/ˣ0#0#>"4"""""""^#|Gx"_0"|_/ˣ1t}F0#>eaE)aUmGT4ʂ90 r$9dx2>^#x||_/F20#_/E_/E|aF}Gф}д"""""Ј(i.]CSCAGLBY'B! Ĩ"""v$0/Fa2tG͙r/8m=!DeB CTDL#_B8#T!/ )rAH* WM9Q9 iB"sDDqB""""""d #0 0s!eDKQI"1 DMXN[B"""""""""""""$Q#ꈢ0XB"e0")pTPW[B"""aDEbc>#;,GJDDMPD\D";:%fl<ԎgbQd DE"d&WK#ȴyՒpD[B%~B#q S?-=DtGdM4G323E"0eO}1 j+z:_;#("#sR.1Db:# V}F^;MU(ʵ4@y׬|F3>#b=m#0(@#B`=AYaC Є߱1ب;#)H֎$/0O#a/vGQ`t]ڡ*=uDf( Ú>X؄vv @ncAlNgGF `g2 .faT2sL[ v=+"XaGad0aEaN}J#B"9Tb&YODиH<} hH0L477[GҠ tϿ*ѨA*@C'᎜E#q__f~븯5ݫ?)a=7AtuS.0BŽpNPلC ;@qˁ).shĨhL iCLg{wD Eol~n|)PmSAN"#q`0}x"/.FbU6 _Cʂzt=0ӦA*:Ն #Am68oym/>֖4t7G]M+O-x r-zaZhQQ^ ;ׇA?tiGNLBb)qbB BŊb#}01`± :E:P,[iCK" z"+)wVӮ;V֓kׂ(t""4"4kޭ_:[8ޟ}["ˊUn<5x):(NuB @v*2 Lv>v)!2oN:1رi)amx0#^(`Dx ҄ ijna +MOVgED"t鵙֕f[ fi;J4"A.OR:tE@z\}Vȸ<)"Ŕ>LPFI@;I;OQMTBV'{"!Mbºb(bol$GPa/Ԏpa8} 5EF~]pFGY Rqq:Bg^ ˂$Eʂi2\-FaF2_/a#$GфB#GB!"""""8вg]2TDtӂ*. XLJu*PWN(ÊW'WAց0Eo'{kڛqqxOx"tui}?}Pq w""""""""""C89cLY/y;.eфuFaFayaFaFJ^qDi""""""""""""FBqFGB#5 &"MGMJ4!MqMjMa&HuH0<"67pZ)֟^{-k;vhD}YDDDDDDDDDDDDDDe@%]4PT.SC $:b0X1GaQ GP L0GI@:Au v|w_K?Ozҵ겼+ʂ* * ;APTAPTAPTAw8as9NF9S990""""LDPDDDDqN^jP^݄GRPb'XNX%`` :KMl>N[n=qʂyPWyPT&TAPDIFaB:GDbQ\0Eӵ `41/aM[ mbv)$׆ [K[,"JDDDDnN'NN":v; m%[LqNF$ۑdMta""""""""""""""3b[ꅊGܥv :곴/2GTB!B׻FM2 Ehh#HDC{M*ZGTF#""dB#DLFBK[ZbLd)b!ex\PWUKVO|ʈD+Ov qy#YPR(Y|v9Gb">Jh\fORGDC< %ǿ)aد %ATOaP0#fIHGaf s.*h2>c.vc38`Ϣ9E|H#4tMU㎿(ttGTaN<2:BI]TvgD!vNaԜH鶦憌9NP y1_I0Ӌ g L2 {ZH4JpEzhsNՈ"=0h7P`LMdb.fȎyb8yG#胉: dt}R4D"#戔+ V)t}YޙY%{7_ItƅMt@t 7LPtlsEhS4 #"<Q)DytBwt#Ah"<8 !8{A K!+?0@tG]sr>Fyxfy!,HGU4b":ZW%By) ݭio|at=i!} )  G˟  (sE|"p0NPmdtIFL&Dy@ø;.9CS! 0/g]O›Ժ6)^/Eфa2de"y49}D"(V+u}m CU~_VHmHNE:0]IDV?Mm OAAA'Al?R=26m8A[p'h zs8b#;C"` gD$f:恝2Pgx#]DP0DF*)f_uySՇҵ]jP*.5|ÃaQtm>ҵޅaN  +&A /#Dyu3CtatnDxbP᧦ űCp~# >Pg[u !W`/gfED V<>,Nx8S|}p8#x2YCg_U1t&8^Һد tC7KWOAN]+C8ޠWEԎuj_^7'"zә)GZ:KhO;"8#7ܤHT>g VOU.-״b6'j@B^~~_kkQӥ~~]u޻_׍븠&+ 킜a5/i[VӺww밁~g^TL7}duu~ZJ!ŧa B. G@ %TBGgs"M5ķ7Ů#vamHH돷wJtqH55ox U{lW1 a[&¶>am6VGK]00@K#鴵tMv<.MW"4g&(3GIb~{ CbBD}kt__lG;Sv,W? 2u׽?ݡ"Bf² Xbبا G]Pb7Ń O?PCajS}I.mWs Jj-Z_ub|)"Pi7t]n-4-(( ;t_zpA Ko 8op|FDA!T$t"#VA0PDAhBL@E=YaT nӰ aƛE{L`Il% %v]-ME?PE;.b-8wbTGY-?3ӘAޔq PV+M|(? E>_IIU"#)hDDqQ`DA 3 6T] ݈EEHEBSS WA"Xl[ 0js}GK`K5 M(z |m=t\=un.^ rA*Nkqao~oʔDqQHEB""#B"""""" D a`D])ttaT cMm#lB vG2?8WKO#lImh &;cӽuO~v׷̔хh#" # """"""""""gptM ly7LWM-cb=V#[6tt+pk߶JNQuXv~,D2hDDDG+:(DDC: Bma#:Wzb'uXa*a5`H,-Du҂*)W_IhBq;PB&k#9YUDL G4,zqMb15omイ^Vn% 4""""Ra""ND3paGY0 ջb%:LBu4""dfB% #M"v٩(G""Ј`y$lVD"""dP"Am! H1"4DVB }V!df"B"*DaDB'G0TD)KDQ%rTuGTaD&@ђt"&BYFȤDv$f@#R0DaD")HDDDDDEs= b/D+:es ԭ+R+ 60S"BIpʊ$Zi"Gq C@b*HvZR t7||TjϢ1 iUX hDL|(IEy@~P;Uh+cEqJvDCB=0A гm"Ϛf0SF #B0ޅz푈 \!ԗI*juGT{;Fz݉C+w!Zah![ i,BиS@ЍHxhG8#FaDzy}0#kTGTF%US {%ߢ4(Z# a0A5k킹+;g ShEZ0-Gqha:V BC P$?5:Lx.d}3#"]_0"aGфaFtaFaQHr(z[T&TH#4 9#&|'ZvH?zҪzJ64Af M&w#hG4HPE93XE['0xiCCb)+q TTn.u'q(* + N U9t<jT+ʂ+ʂ;JAu%qq_ (EIqak~դP+V莭4VNn57PpH8M ( MiI7zT4X;8"<q;"<]j*| AiiZ4aѬgу4tjg}F 1њ/5@xIaUX%;SzktC_ݨд­)>uҺt.E>Er:kSoI Pj.tL&c{a t ne@ H"p%@hJpѠ4%<#CE#mAYǪh& a2 g|"X+W6=t*u{@t E;՘ZO)Am tv 7FF`pS0&']g(}0AF|a AȞk*;4_#фG#°ik5e8|7#`]~{}8|2.4BP{Ɲ  lt{ ^7Xv;CFw^ Ti(w!p$ >tuEC 4u] oj",kڜQ?2:cpA"Oi;WON#ۍc[~>><_@՝RM4 :XN==zW Sմ iE<'ZB.ؠ0P69qhÔ"J"<8lhh8> 8q $ :z{{{WW"PkDt֍6?SGy"0"0zN}HF}qoG[*5E^+ yuakDv|v[GA#i6 z8к@h,0XA'VR 64#K(kդۭ}g_~GFڜ@E*ZWT-v}^GA~DǪڱkB(W4gV1C~uM;͢OS ìZa 0 [ ia4պ#{L ]~\&v 0Z qpIu 8iv &WO[uu:}t^!t+cg>>tE@OPE|3H﮺7قc&:O!8= Rݽe:0A+{-qpӍW7 Eݪ}G$;ڵT*?6(7t%mA7ZPGUKJ0WN#P˥EӘItuM]Y؍uN5֭]~OOw.# G^GO[m- !xBբ< ^GX@)֝i(co_]&_L@}kUWiҥA #^"""}-Bv]]0&/n*6;Ƿm. Q&VұPՄ# ֕P@C"< LO0]=@;OߵzkqD+㶥o A@':ӎ5[~pi#YD|&h7 lFl"V;c ꋗsXO+PB"!3<3, BpħO Q OA#Q Dq n[Iűնa6[I_paKZ))׺=x w~m:Fޟ[Aia1ԎlH Wu]"""""ф} t$t(!# *A8e@B!B " B"Ѥ_ !h1GALBp\lJ@ġA(E$;"?GCc |w}+ j6UHa%HOI6-޺8KJIфPDDDDDDq ZB"AQ9a@}}T#P(&,0@0x#1]Oƴ* ސVN{~ nGAr:vti xDb>"a#KQ(A"!E@U@:pB aPEڧv'x"*GC vWq8)w^i uDDDDDDDDGFTG4"4S4!S~6*Bm bADlDDDDS`H* *(S4A a1?b0(LL!)Ba PQA T2PBeVDDDDDDDDfB"B4uD)-U>W%*  v #*ٚ0"ߑ Db& %ܔ YBpl D}Db P!F"5} ^#9TAIR:0jLb"R DELn(ЈA T?N $T$":$GT_(ib#Sh(D" Ψ>-k4P'A AcԈ; `\C0ۣ4 >g0粄_>#YGф_(W:0.DjxHF @u ER:l6( qAl L&aEBi-˚f&pG>|{.EP0"tB'rPצSdJhmBxM תFT4x[%%h3AP0 (T0aCPXAV{ƃ.`F3#00<VP"vb%ph *a'&u(xtal4kW6}  k˶ -#5!*FnGHAS $!aDFAm&8r mh`t( 1>#Dt}f|!m]ST-]u 7M]7E0:ut==}ROM0L&( hiYh7滣ѱDuqi]2:4 A3Pq AҠa +Q Ks0J X[5qQi'^~I]^馛EGIt^[]ShZA"ouLtԱ*ըA Jtc o&쎈R>+艰Z0;Vm}|/5pE?Ax_Oz߈EƚIu֟t! N0nGVlNEEmN.9x4N""d.4u iEdu7>tx!{)&]N.S0(>^~woq TT#4wt2%UgN8(P` ./[z{SG[kz_KyaB(xT(z}A*Xf"=b[a+/\Ao ]Q㟂]n7zP#6DkK \[LSwIt3@ ;NᅉƾlD_EF&V֋6f|7kCO;" {zH"*I8!~u꽱lbWDصaلaVAt*ݤiҹmV<-!J4t'aLy^a7\"Vu8*L6:'ja׾)aճ"(TNPj& 'i[Mm<պA~+MwuҴb T$}髊3vn,#"}5|+-؉\$xbl#)GMzJ?i|]oM`}_ &)ۧZiWIKN+C ^qM:[0ghGH%P>aBa61[bSWA LAb0[^?Ah0ka.o7uoawVGKfݗXE?.f imr(GTPDaE٢:."Pkq*2^E:iBnŧ>11To1;Æ%?bۮ:PE;kK{`+Wa{w HaݍAv80mӥ`'jy}Z"""""""P BmA t,t "ZJwC)' t 4.!v NJNC#T44PcI& :\] BDDDDDDDh" ENS ZB t4 $TD5BAXPD|3S(t!lA-O #$AQ'GЈB0N SP bNQq(P$$ d#;XD">{ W5MDDHLHT! QbRaD)B[Q;TR!d4%DDD"d } q>PTTAPTBeAPT炠<APTAPS * ; sasw;4"WN(F"""""""""".""""""""#]Db""WDb j"%sd)B[(gDM6!CMFDb>DaF"dDȡDDDDDDJa%EedDNƑa!2GTBJDJa`ho"2%&HDiDDDe&򈈕KMIDEa 4FDDDQD+GFSJ2tK7B(p5-EB"1_Db-!2(Q"BdD";JQ,HFSgR[GT} BPc&PJQɰ;$> *hMA2383D#4F"P>B>nVD#|CAS436\8#@sFfdb1F$taB""""v-7kH;m  0wV4q DA pC2엓nCA"eS9IYMeL(" r˿"?0@ya~v_R EH#г B.2";ɢ ∊#0DDzCj/bt/l&\G#p E(u}a(pի:"8NK3Dc+ ~f~&P6]8ɓ66f_4Mva3 JR)]ʶ QDG|;#į(]jLj־*0QSix"_}A7 N+qȢR)FGȚ+LE"(FcC0֫T.4/CЦ/I{ фF#:j0)WӠVJlyD|:!EVWjpޣ~Ո<4Z*5,}?]b)r~"aF#UJ"0B:gU#68 "NԎ UKJADaDEc0$v!K1YPYuAA4tc"%D(A'hpfqa!q!}rtB#OA:w ihG|DৈXvtF03Dzqַ3[MqS;`/.Ap^@z"n'~%CGHdc? \ f@ax!#Mecc8y_GB0A8i8#$t T_GX0z *j#21` !~+)tmmt~UAvUklؔhq ^b4G^0A]P e@p`x6%#:7 4M"a&Vq(3NЋNalR_BMڎ 0V΢W7(|wJ4ňbVՎ68@ȠiPtu6t_ WSʀ'Jt&g 61En8FnPEto jDvp. _9!$9Ea"#Ps(FPk{ƺ٪5Wl!nǔ nھlv}PDtG@%/Wk/^B ne-*}I@ VS[*l[IJ-=6ר8A7з@ u[t* u?A+I⨸o(u߄\ "9Ņr \#0.G#hK!E_:HFaDidW֩5-DGC S֒& m!qqz|Ft|&!`ꒂ/C GH-CalwQ=-)= = gDnv6A4J[wz =QbkзCt#iŠR:j"=(A֟0(zae ZхVh+MH=:.kk޺H|iƛmuEæF #:gw8 HiŤp`ADDLGw˂z׷߯O׽Wm6[#Ɇp`ș~G~cx#n#8!+Tp6~W*ƭl鰊 EES)"Ec .4=h>d| IbުIҢU&$׿ Ot(K4:K~(aCk΁2:"m|EѦl!zMЈ"2 VA)c6ЌW  l ƪ`Fub* +b ·`=T,# oͣ _Rk}˂nӦ҄) !$!N9* tꫢEuZ{IB+"}~G:MˤҴւ(}5kN!xolP[E0GqDC!P16]%.aˮET'N+\D\{>CvijGSGN#N;NkBt7Iؽ;J,-z} "TV(`";uM 8H`8a [ CҦ# jժ1 nZM}Z^^OO>+hf#T"8"8 2#F#  BiLJ~ z J{ ؈"<Ǫ)] X,06@P 6:Ga+H-AO0zwC{L QuD(#(!PW'0)8Qt.v+n&oTM6_b bqb(b>4 \i'b/)T/ ֥Y"agP2< T.”8 TC@h0},h1]W % $a5$$DX@nVWzh!!"#a"4w)" B61 Ci8'$?a(tmGq;E(EB""#ЈaJsPT 7MWyN1 o NBYR "m$DDh0,DDDDDDDDDDDGZ:;%Xd: 2B&Na&BDHF|.#%DF#DDDNQB(Ehn"",wgc"FC-EB"vJ0"aPBQ'GhGЈ)4Zl$ :~$%q4"##K'GF"#0#ʪBDyGC$2x4XYnNR2EE"M;10&VD~G[0D#NT|ˣh.Kph!#"!e0NO A "nplR -;BI1m""'bDJFKQz] th6Putx)SG+DE]"v&R>B""do=^{ ӋUж)8wu׷GCTm^~GDFdF:#fPJ/o?_DF"yQ#c/X'*I ȨR 4s8"|cmDGi 6R#>KD!Gu"+!""J jچ{TUvblEDNDQ(D":lҲ:8kg4[$حGTa h"4D"""&CFal-^o]c mߵ^DDDDLEH(FB!}aDyi6 6lIE[N^73EXD"""""%pc}*݊ R1T!AAb)(n讖(GDDDC+PBN҈a.0ANB"#$bRDQFn(QFDJ,GDb>uB"YTDaGB>DDDDNӢa#TaGB(EEQ#S B&B-$"WDQ#De!BvtKE#Fa (R;3FD[C!tR#%B"&@hDb"""W::2(R B"d)mF >(EZ%.eJNє!!UmDe΢MЕTKs"U,hD]DGTuF]Eb"&EFa#""""v1D"0"Ft["Q!tFab20B"6BdꉲE2 "ʖ(Da(BWlQ-Ј}FH_JGc#>ImB>-}MDDDNΉ)&Eꏣ Z7,B&Z!f!+",HKqtBӢlhPMЉ\M \0B%u4F!2E(hQrP0J!;H"#hDDHR"TB#0#(FB0iTF!>DDDDDDI#}!;D1DDDJ Z>2ʤ(B""2FB:&Ĩ#Y&LQ6Fk j&2V"|;:di>;B)H"}Ta *:(E0DaL!MRD#I/B"""v#)"""""v}j@piŪ/ISL$h\ȫȾaDb!H#2N#DJu GPD> :i;EKO g Rg-$TL"'GB""vV>!R"1\\ Xx8㎤uq=!*mB#)Ҷ -9Y̊s * AC 6Ԧ_LꏣGGItaF]T]eӗNt$TK7SA<"}DbHNDaGT&^E lb0r0m ь/ˣ{.G#a`f}GфR*.("y Q\"PDn[ %HҗZ@>Fa":Fvz@FT!C="&ca2ͣ/>"i&~"H&N!;|n}E=A֯u-= hx&h8a0 Xp®o>=2~t׉Vѭ]h!AGpq SB#)SiĖPX! ENxpe1rLa#/0aE1$GB>#x&bG_tZ@%=F'8]U$Vոp ]#}XjWåT֓i$I7ApN wxa 0<"8 ڠl"p-` 3otw %wj(7XbC - 4dr9Gx.gу>Ǒ|\a":0 1XTD,AH /a^GĔ}xziM۽%q޶ozkqKWt]'Itum "Vi0MB 4 AWA0 x)C9C97R:jYvo-hۈLJy/ g^#'F#YxuT8׎uAHx?)aSYT0E=x-HfMoi/k-^1Ņ b k"Mat҆TGWNl!ŽDqnãd# zP 8"L }H%ҵM0C 6i͠L yr:9#sˣ /Dxe $*qf=}kch_7 Nr:P 0ҽBu|q|k}]l_Z*i M vh8hR$6AQ 6A_Õ a N֩ ;h6 6 g8ˣH&0#ϢF]G q7:'Hw ՔZtGKIծv;TΜEZu Zjt&/#U# ;NƟl!u_뇹eDt+L Z֤t0D~顤T\\tCAڰˆ@A5\S8DmhZ6A a M3=#}HG2޴m: UAVӱn 9QtDGZ֛L2 H"^;M8Q&VG/EԎ.5PMиB.qU^h#.Q} k נMB{lAha@P ͡h|0BM tAkեJ+30MBu4 WһuRuiwP'g;JuxQn/XIF3"O/NT+}tF4(piJ_lgJ[ i*TottڑׄP&NR^›ނ *,@Vr߸Ia[H"<:ºZWJCN;O zRA }u E:)G[nG^*8@]cZCb|E<$c R:f)kqc0!qIo'&[^CAhFƛaoVO7E'jV_Il+DqlI쎺oL)GA":R: 3 mui:VưAYƞkA%ۚ}f ˧'Um}_:qURS 0D8":PE=KP!YaOUX"Eok9ja)gфMqƬZ.#1~"=V"k ->6o醓;x">afvGa`&+(wփ:SR:}]*ipIlzguo8^CHH=Z} 4:t""c8GRnxMԎ&nĘb1_yZ])n_q BFa5A^HԎV">ħIp}q@V(0;Cj8\Gu$ڶG쏥لKa/xAE) VxONЍ4ЫUGI":al0 SfA WNwZ \FO#FZZ:qq:" _X@_t"B`Lgpƃbaj꒦T(vm;RWDqHI*8imULRT?uqcäm US0ل W` 㰇x㊎#F)m.# R:0< M WWаAL v OXDi%i7ƗN"DDDC B"+CH v! "S a6(XwAu*uP)q1 H8qH#=P'l%*aḪ 6ST%SER:tH0Zi)v҆00KC^vgyiIA鿎H P,{mn_IS!C"P< G>GGDFB""jBFф9ta4aCr)uN*,A """"" "O hDC5`=p΃LAI)#OR:nՆ!<;N4!] 7\v E;O}A_#PE< VuK":i4۽?DDDI$2 S9CQsqht}DDDEG+D^PB*%фHTuB!`D2pDD2!pw`SQN+0TqF9SD}Huإx݆jӃa4҄P[, ]Ɯ]7udtyg;r73qr3!  yAHy#GDDDDD\GE 00ϣeDR.B!q|D2]X1q0^#Gr#a!Dq>B$b>ta8*" !DփBE Bb:v+"=IûiKA6!/Մ V׃m)^aDb0#(Gф}"""""""""""""""eZ>0#a )9džG2)фDD0EDDDDDDDDDDuD]E%FIm!2H1J%D"""""" #hA*lm!H#BWNPDaB*#*xP F&Vw&34F3Ea!.C'+We:AR7##7#4uE ӻhu P}E"0B!0tFgbvQ,E!2SGz!8qL $؈B;}/d(aDDM)آ)MdP}Gф}GT2V)/: hqr:"!-HLϒh1M9!AN?Q_(EѵIq*#QZhrDDN A:6wV#cY GpڸO #8H#л]A=S# !a dt`6 Cwf<n 'ͻO쿗GtQ 3FB0tGTaQB(DbJЉ\>MMi mU[IBkA^6͝8 5k 0ZHƎ6%@h .Fp #; =+0Aݶ! PCX X Pa  3|vGA^.x|F>aE4D{uMO iiAaZ7q}&uqqGu޷Pr!n&c*]8?aܧ zN\!#ᵴ?_ A" EC}ytt"Z"u}SJcCV%u4MІHiwPEBWAN=~_^t#u  uz@"#.ՠP/iصݶ3 2#E?0:qՙu4%P˯WMX*Qk?X5,kه8+P@.tEֆD_][]фuGTa\'a]m-=;[ _t^ҭ%GG Vt#OlN31ϧP.pkz!qDMVAO60]=t-/Q7Ŷp؛MXӋb]W# m6A;xDuuuT * Sϧ̈́ܤB S#SaPE][t4aIi]By(OO H44Ot5'tV5KN*&2wD{6aAwvB`(xE:Ԏ°05ovI|7M!u Jn.S0v;W mX{DDQaQe "2,zzeAPSNt8PbbM1LAb1GVԺRN+b b VaXӃp㎟mb;(@)}C"TB"$!;H""#B""""&Wu[e ": k ӻOBa BŠІ1BÆ8⠋Gc#KGZaHt_m^nDP#!"dB""#ܭPԨLe<]M +u( l40N©PbbT\h1 ƃB#hDDD:!I$BT"P(ꭄaa?YN@OPAE83 B!fD"BP n}V LF4UP:+EGЉ\As970q9cxW"-ƔzhXRB"%}UDDDDLXB%uR(]a4"WSDKH+!2C2ZD##,FB(Gp+ȭl&{$i:yؚ1G(Gke2T]$l I819p)ٮY4aFB0DEXECI|lkMޞkΩFD ,&H@!+b $Uq;JaBB&Ejސ>0HW# "X0Ϟ%PNf}"|F_a+FB(GGym@5ZB8GTAr=DE$yaH|DAg٬DiEFuUaibwaLNMc>ؠ.S%t_>#P"]P 0"]RP-.) eфKGswaʂz&8DxEvDtGY+E GHHLeȺGTR#EjWa>ħ$;FhN8aGBӈj LXPGAVq qA1ߍ0yB0#C>фaEi30"tQa$]9UGB"B"a  @AJΞAB2:I :#>9ނaR`!0olv)q)poaĨqM0 @A\X@{j!j,0&x|cq,/F|0#f NKQ6"bG!TaALT4gr( j",! 5 fb_KKM>IWk ޞ&M`oBuiCpL 4Seyv4grU3G{FwkwdtaGdtbCAXC iv"#Ψ(FaFP#˅ Y{ Bu\E悡9N">Es«s!֮={[k뤬+a.M´4TNº=SE>n q 1N`ؕk{mT@N.C]k'qm!#-]E#}ˣ00#3F|Vӥm!pTB 2HuH]\Zq0_,5u֓M pҵtҶ;Ǯ"7CA(A'IdOWTPE:. &pm*ldn)!PM"\Jpf,ƒ:+dtT.#wk(mgYsԌ#/Fa_Aka]|~\ [[GTU]i"7V_?n x@:0ETnX,uqw!$h&"% 7 #i\ 3x"/h^#Xؖ:@40o3#0aa34-'aA:Ǿ!<h.H†u¸DHPD{>)뮞ծxBZcXiD2+L¯#jhDu_J#:\ O"AC /@"ΘTиJTXpMl0X ,; ч _&v=?l1+a z_}[hv[_8.tUw@o^Gؿ P镌(~@o;}zi BE!qZ#[:>Bn=#9"4P2:W>]a~[4~%ӭHꔎԎZ8)nP/eF O ¹BՃQlb5xk܎aFC_u^|Gz}H({t.:I /p\E8~w[қ]]57_mk 🶟IOFfͧr_7vxWn+Ԏ;}HCl-F!%ф_N"@iէqpa/62(,vK40\Q'E5/m&-">-ӻ@nz[kٞ8>U:{k4^GK*;+~:u]Ky0# DQtˬ:{"0,'qCDu;aE?ND ">t'b&GGL0[>`MVc IN}¾CgNISQ# a+TN/Wu 41u/} :ӋDpcb"z\uFi:Ohű.0# "鴪o!1*`bw+{B O֬0XaXm "(_Nam`äÊlaI1Hn4Kӄ Ӱua=uSO~P뭠 _kw߮])MAlE,J REDEp\yA\Y )8bŗ/./1E@ PbOblZh= r5{WX8J^a7. NڶBiN&=ϨW}'է׾5ͥ@B& ?Ј L+W(!D e #N! !0N*!cNMw8oނh80I׆a|&t%P/?NԎ0<}dtS:06kzP]ǯ#A PʀZH]%TaFP>#0"F"1b"#""""""""PS;0L] !exRA&SvN!*A "D}X)Cb Wp\G}|4zqB5C)):]턬OlO#fM}C:]ttÕck#""""!Ɏ #pG G|_/|_/a"|/ˣtB3D0yB)A_/F_#|0|/>B'F3GЈ *4 2<hUa8׈q1C&!;~GNńPP7|˨50<˪%0P/Gф{0dx/F20`G#\a qe<_#21ay>{0B0EE<")"(FB0#\kPHFw#H^$Vw&aE~h}wlR.uEۦt30| 0 3&Fa 3 Ba$-b|WQ#b#VDP dB>VA0֌%E4F$*hK92PDnn%jtA& RˌhaoP E>"a0Pa^ :@, ˠ="BϠT 8i`"!7MϧŢGfP#0 0Ģ6"+DMVv)w\!B>}Gф}IaGBb# *iN/Mai=;Zխ]t:Av֨i7_NиH7M> ACseit+A0Y*<Ѣp=0SI}PE <3hDKGF& =͠6!D- DDL"1eaFYae>"aEGTa(",*@ *U[;KkMi WW맧_]/u^&ZA:Ama:NAJ»0q $ 0^Du + #0.;Xg  bT4\Y8hL' 30! @g 3E h8AРYxeArX XE^yFB04'O] ~!10i?#'}AƓ"m|Zq ӌ'qA0-$ta& +ħRp8šJmF(J|ø-9S !L#Y|)v$*3# 'f5AGTa%) Ω3hϢV}kW4D uiuW ?thOGfGOYzuFּkTim~"au@ U2A?AOMvޅ(m'ƃh;Dl&9hÕ|Ն%kvJќvvs;Gv/[[^'?H]x IOQQ O߿jW)@M_(1{{k{i]aayt)"uXH]_ixxOOOON4=O$]`pEE;/ZӾ}|$=Ů㸎{W|(z)zӄH'I^ӵ#uc_E _uxE=H0" ǼYCHZwEڽc}kګoo{1GFWO סqq'viO tE[PP;\KI:Z!sPKo ZZ_epO P0 C!1TA V]aG\0aa=l,0KuOm..կ+IIUJ 77)";,+*RGw.hΜOYч* D)U΁/3&GQTE?"""""8ER #m<'dp҄o%wi0$H1bSbqb*6(1 w WIՃI<2:(|5mH UnP޶oi:N#%Ipz 0t/xzJh}5CצsQDZAv뭨s{Z)^"""""Ј!:;EXT"*- SS8D}t[mR:pbE;[ [ Hu[e W)NGK]VKl"O#Cէ*kk/.::}Szq]E9'QwA2+*,"Iح1J;XbDWAp@~O 'խ!wpn܎"۠Mc ]o6DF""#xe'* ʅ sTL ʪ<è cn-c!01LAݻ)^E<NK[z_Mpa˨DR:i":^"W+"""""""",HF8(Ԩa F"e8">:V{LB[bg !bԎ5  Væ8b];[KXpιCz,|CB"".""""0'A 6]N9A[N1 8bbP'DAvW6In!J$vaD fB0DDDDYTr a5vD~"c Kt-dG"h†t}"""""".^T&PPEm rȴw5u" |D YF"""""""""" %b+hDDLA"и!6 !]P+6"M1N,Bt"Jd  t-ԡn22P-!;sNw0s;x _\LGoL:.p{gj̩d8"::(ȞeDJ6QB)aƐ'ߧN-7v@R-DEb.d"""&@~h]XH]'e1HuD O#u~P>EVcA?(DHTHxQ[PB΂Ex"qqFpDG)G>dD2(ϲUGk͢1YUUx"]λ*'F?-ݼ}'aCia@ˉ2f)]|:"=3踅s "#+5":3[n"8*?TEJk} A7h&Ҕ:NwHC.Jp Dzˢ3;Lv|!ta0A B GAr##Le#_0f{ ((iL }--ok|4$ǯr{&n'|ZukqH]+g A popj XH V$uiOm&#;Faw"a- `C݄Ι`C.G.G,BW&@hn+V_ =ow~XӶ#NTMM_ ??,$5.ECKAtշtwO_a!qWJ a7CpsnhNˤg)S"-pDz_@RK)ıJ"dMCnZ'h#a^S}t+]=;Ӎ7B*XWJݏuwW^])QtO0YW.ۊcB8Bha@yA`& 1ޖ`=alF`Ρ}ͅdzW>G(2^Oi2PU*l/\q {N0{x]^0T"$IV릿 nӕib:rGAGX@x*:ޟ8ᣎw]H#=zi{X mN~dt_wȯ)R:UƠqa_}}p z0:[ެVI~#%X]/E{+Wp@=p+Ԏr" WJS#x^ŲOKjָq6EԡPatCMMcJ\q2+^II[$,2>ӆ5WWwNa]jpڈW'sH">g l, Vh^ߡqDD7w@_!sQ WAU [ߡ;XXTD"?b+l[  jՆ a5:.[˫ =tT6a%i&IM}z]㯺xKǦWk" 0"{KcM#[M8:2.""S JVʆ/ӱ##bLDj4(0a+6lCIˤpI^V;XaRL,5TޮjGUn]*i%om¼[]Ƈia}R+].J#`GTzbe8ϴ5A*CM4(BN'Drb{"Dx1SQt(OMALM^tdr$VJ0pv]$VpӴڿLEWƃq8XЈT!Љ:za [(pS<!xi7xU1QVQ":4Նڶ]- XiC iYtECPYsDhE""""VDDC(`t})#4)NbPO#A1(*Ɔ4}M"aQ Hqat#R j0^SGRN&w:mh!Hz"v4#FDG#0DDDDDDDDDDDDDDI 0iIBgGЈUs-Q  MΌ#>ꏢB#R$EF"-бB"0"1FB04F4uBWF% B ;}QE7-9;#jDtF#DbaKHJHDDDDDˑB"l#2V>HGcD"%!B0F\$vІdS; Ivjb'EQ^GA.7&=:i8 ed;Tˢ"#L#!HxCv:PE<a6ȾGB0!=F4>EzpA84>"0Aq o@ .!pd{.~r0A8ds#A12C$?'"{CtB8"agi"#=F tNj)X@"04sC* PTAC WA^Taa)I0aJLqT4\Y*4b k : Eh0A06Gac1"99cr+Nxцy#OMb#F_1`E&)yU3;PЎ,b#!m!V0 6#pE [ x$cK m=}6QG&ҋj.EX!h(thI@3=bs>.pe7 .|dtr=E/&$-aAmB]mC>#Z0#0W"#v7GpE7fzw[ZAyE✱j<*SYF\ͺVhDEDDG# "F}B#`lśStgNa@K%ߤ+r:x@OH ^4 aZaai&a<'`vF~n A&G@FpDz%3>+Dybth>txdtb#"at>F\GqlDpa9ta$GA Ta)P1FI3 NKOjzjNƔqtݮaՑv 2wwWu[TB aIoH76, ')f6KHJ)KUx6ABB"fx ԎE\ƈf#KIhG_8iIQV}ui齙o~-XBw^ Kktڨ"uUi]i/c /LGZy:@&PBTS(s@hTB)#DɻEiR 2"7I?L3]'RqKO\x^t ^]_)Zmb6F^|(쎂h|:;^ZZG n _yXLP(~uх"Iиаhvjz фp0rFEфaP憄C"=%Yw-69K1|^>\v7D^7)]ZyDޝKq`#C#)u]}`yc#S zݞ*-0qAPmz A HZNEaQűahdA D4܎pB|&aoO ֩XX~F}Pro#"a)tC ?S$ND_I[vÈ O>  pE=sSzBqIO>E" 6pbr %8kG;NX[=mW^< W}k R:h0D 6>"0qwaHdkjz7HiJ Ԏ3E=y1֗o,lqƱ|ve8J+ E;#I"iGD ~^L,4莓 NDt޵.E= AI`~@j_][IQսuƳ]/]gG"] :o]ZէqkqW}!>R:)a^طjb*ŧA#P@rZD3lEI }$ U.!]$udt_ ^]wztcQN#Xjom*Gj#t{~Zn#]A[LэrtlE"<+]kŽhGq͢9m"lTa0Dxm'q0BF0Ei؄1oQ 1D}&"\b(1A Z x6+ˈ:R:Ԏ(x@#Kvn8b; .#LF>Li7k˯יdt_#@v2=EL%KG}#:E0#(GpD"""""""""""hDD0B""'a tR:iGب@lK/nwaDX0n`+)jdtiz ZOLRqӮz}*ґфa@ XwWdr!9㐶[pVG2vq }"""#D#}FB0#FB0"R B"""""#B Tʂ tϩN*ADM# (Xzq`mFcH}:^!^] Ԏ)ՑշWwT:NlqGAgUfHrsF90Ðqq!DDDDDDDDDD9G gsNg5 DDG#:0'hDDDDDI|e!J adtt)S*1)S##"GնDtZl=O&(((!@APS sS TANw*sw;s9ÓsXCLq xAr3pIْ0FaF}GфPDXB*8""!""FHw]=EaSb4A7 4n%i'FB#uFc.#>#0"aGфa_1/<^#xr.;#Ȏ VWJF""""""""">aFF#s0(EDDDDDDG Сdt(GQDt}E1MEB\DDDDDDDDDDDDDDDDDDDDDDDDDD"10##aE/|_/|PaGF#AD!] GYښTb""""."w!aFB#*)` DDAGT""""""4,hDD4aLKQ+&tD"; f*"1P"1Yt"*# ޚ wGaGadB#0!2SEF""%}KPJtad4GY٪n8!-xQH!+B""dBq.Ȧ K#!.4&"hEO(E) n}:Cj`uD;"zi7v;-GBvB>wЊ5[Bp;st"#DLQGzfy2A"a:|\<# G# 0d%]},iф)֛\"4 $6M2]DPDG[ ҈A 䫠L|4[;GYˑ]}E<=Eٞ]eфP:s1[ !i AvGG@'N]Ӷ;aˣ"*%]a`A =D'rQ*5 C5= ġPM8q C & B{S|3>gфGADCΨ&uFP/qta)#4"4#Y5Q'zz,(JAZ6 u?R6mXE/P‰C\EhmZG/CaH#œJh4 !G |XAq`ArNK̜?4\R#|?Eta#]"a[B-bh"e@*"&] D4} +0֟oVޮ߽oUu6+4C4:HhAxg@H]lv`-vDu.s8U#<;Bm (B"0w'ȿS̏AJ]G#O/EȄE1ˢArD""8-\ ƄFF-kNUGռ}zmIWO&4M+}U&n zmkF1h n\B68P:c/S Rh# B&;B.8*45M Bqai6Fy#B0d}a͢m+0#0Vȍ*:V# ֽ[__ZOu}SqL\}8M2/C}5K hOݦICRX*Qmj~hAvN"3 w3a>GKqðݰQ xwBY?K3لa"#>E_W[jc@Wa~5eҪ~]Wz}1u4i'M_'WIյvҶv A|m  %CP(#8" Q3"=4G0'7b1B )rdcΣ<NAB 4}FB/V_0aGф}GT}UZ{Kur^aCtԎn ;yG|켿Rw]Pp.XMb. ~MmxZkgFwUTWe;0߮Bza#P~GJ;ijDGk >xJ<;r&^-M+~vCOSt]$~&ic4FI%~hA63`&Ѯ6A䝑D (x"ġ ]g {Wi[?U߷gӳDtP4}RISҴ:_>\\z~ St+Ԏ)GR S4}!ťiO_T({A>qժxb8ФmN!(pp5MA8±q^( B3Dn]< ^,&ITէ bЪuޯ}wZF~GT}$^&[]x6+#HuekW8޴NDq8%4B-֗|_=ݗPpV'NYt+i`‚)<,q"'A."XP}P=ITh0tҲ: +Ղ)n]'WKaUNwK~}6zmۿ{}t;M ^#E=S00@B/>qݩ}hjua #\TlZ׵7#mw5:VJjF3ZIƘB:cbOM( mXV[4t)U;[H(E /E=H]>;Xٿ'X@k3&i{q{{AQ#aYtaX@&I' QVި~$Gඒz 0< ViHΈO֟8a4,᫦(Dh1P؂."<{aOIqᵾۄBm&7n¦}XM":t FO0W]UvmmW+[3ӺE=TQ躺+ ㈎;M3s;lE# }O{8waun;DNAe8PB"",) hC#AAV0 M Bjm"A)L"QFv|} b6LF?x-CIՆSV4:Nlu%g8"eфHhqVZ7ޫJ@R:}<&}F;ACqIheE#FS" pDq D1(02dg- !!GKDy<1t+aP&tb/ՉCL1Ml% l&ɻS.@0) ][wK8ҸIt5o_S -'0P#eztaBagN8q`0C+ >v1BP#X8WJŴhmI"0CRº A&ASKշmӿRzf҅0 WGyX#lDDDDDDDDDIE'\D%и`D`2 pA!"0B"!y NPE:@LAƁ#*1n6xIۤzcP]r::P\4 nT*4 5 &ɱJ"#I> *%>*0ԧBN 0Dfp0a9  ti6+bՍj.-a1;e}(tU< W B")(H+0DP"DDDD|DDEAyQ0#TB*ʈ*2!8A!5%dħmdu$A'}uiF )%cMˆh&&!8ЈIEaӡ0,qVAPWЦ" !`DC0B ! !Niq!?chaDyDBpL$DDDDDZJ}@&^@TB80B"$BhȚa$Hf"sPTQR2PHbR#"=ub1(EQ6+F##$ꔨXV [@ *#HEQtJ00fW5 a#2W.B2SDiab"R_DYAL(SDf(Tqy(E"X"4D""""dP>i}};  DbTqD@4GTFv?:/c3E(PԎlEQE0,)PDt>U]GфtGѴF#ȡ]$])A# I Nb#X`!=u23Cjӈ@vA)i.HY\3tH#C2>Fea# Y!E]GԈ*š!qpdb:+YGz#DJh#>:|tg%@q*FcN%@7BTBADhA bBbd4#'DvHb}9m;.g՜|5]E_(E}#GTaGҴ]eґфP  ұ}.DDDanovM"~ tu}N0H'\QĮ?&ld#f%[Fīvn.-8xAB& GA0A ń,!0AY&rZ0cřhpќ88h 0A aP!t!CB Qbn EȜ(EaESNΨD)Gp FֺxPoqwjiK^ztU)ZHQMoA<H4l2 %`l]D0G0.-]C,!am0q'e}"\ȭ#0DȱDF+KT׈#at# OK}uI7B}m8EtmSSalWi:'K\iVpȿB):A7`MlO> ڙdħ*fD-DGzuHASAG#~:eC."{"Pߠt|F]Dl9E*kݒDl#jc Ϯ"t+`z}A~GLE>·b5;. ä0H|PDDG'_m8@~t?B q2}|}p(] k#:\OE8~OT# F7JF#X.Ѝ'6cÏ҂)? Etݺ!"w4m},{tٚ_.knh# Hw+>j!/ʀD|r<~ޓtCˬ*!qtӿuЗvv_ƔGA鶓u{a/]%"_HP*밊{~N7.l-Ka=Fٟt C_C:x@&VR:ֶ[ZeQ#?v*(4@0]0/)5b5״jI}[iB{>X+ֶua+na=aEE4UO]zKPct?X%pUDCR'TZgcPDtA w L:h5B- ! xӆ%>q¦IbCŵl Q))K0u鰶[Q-ac =F>._aVP W]'}讔 i2J+ vTEqa`&Q 8L* P;؄v!Tb^ /ؠ ^(u» * $GVmN]|$X(-t~]Ea \"0@KoDDDDDDDDDDYH+졊QQ S $ 8躝H2":E@ ʀ=i40C!8N8# ؄1G1(tħL\du{ '[`է .T҆""6qhDDDDDDDDDDD\ejWʈyP!H*3h28 WGpa '2qP!1JLB#U6@24?Hh ʍ2Q]No*L!-`Į!DDDDDDDb;&KhGaH"-U&"dV(J""# ^v"!"Ζ4""%~Ieěh#-ɣ,HJ!VDMD"W4B%"dB)x!D#q{[)4B%wB#tR6g̋lwe:lфRdB(Cz&ὦ~DHT~}&T)  2zr̐'@GP Q; c)( "ѕ4MQ[UȚIn"KB#c^=*6]I0 Zi VDGB<gTg̩ ϘS5b% y:<(@yB:/0ŧ@3O #Ԃ"#(N'iGfV#Z#EtB"F"(Ep@jBs2PqȐ m$ 2:X3M ˟q*y:Čˮs5#: >#<#O>) Iut-JTԕY#7a#*>f]*CbŠD}bM0@3@zGF3L! n H ֆ6 -etGB"1@yB:a"1NS>!q߂M&O%6v#fB#>}0뾒OGU{ }Mӆ nL5&.P n'֋qMR/,?yxA LA焆b#h3!0N =Aj,3((GTP"a)5(_M&";C µСϑtc-jIE>-kuv/ V; 6NGZplS"=5mTm8اħd{8va3 jA <"'θ І{/A &fx VSLd还YB>܌Fa# hч*@x@Z4Iluum4Vh+kJ XT/BA7 ݒDJ$a"LxECXpѮ(`EQSwJ43G&P@z0AF ф2! fPP1;|JB0 VN,R#>؊B3#'J|[餜·<>U׷WQSHn(k8 Aa>;BBBI_A0: SEns@D} X\QXtk MآoFv8J0B@t] c&f bc (&P:>#0x"C# ~"S"XOA"uJGNzo 7m+ux0 WT#iXE?WR:H}E!m5 &W"$Ct~ p N(ax*F58,q&f0P agLGA.7p6qM׭}&CzSTmv>0"|zPG#h VHC@"zkx6O.ոC}?A"dt\#'Iu{_եT1ZƫqtBk'I2;>9p\FN"= @ .?,&] f%["kI?#=5{k}cc(t nGL2IRo#EփB!GY"ӵiqqq PW.J|ZQq bNE<{@:GL4Tp8P åb(@RH|*صnH~m[i> \T!!q~7?_R: tDr:eEbmƷqSR:x"PeAQ^x[xU6ꐷ=@hQEL8@;{ /_A3IzUa5ү j-$Hm*KB(~#ߟS#~O]SPaVT*4N-Xġb?DkQdu"IŲ-{{I㰜|EhB{yj_"Lz Cl/A+X{ 'i=i_m&{۫6ˤMi&g Ɨl\hj뱬qv؎}4"?'`{t}jt+Fzlw Ҵw;_0pAEmc6*u SԎل\LDq]cut^#|1E|_/|_/Fc/F20#0#0#0#0#0#0gj?Q(T&2IxPNAg$jSCݦ)">5,En.4N?=mPav #©[ &=aat [K0 tW)!nB""""""""""""""""""""""""""""""@F9rC炜w;_R_/|/|_/E0#taFaFaFaFEфP#0"BP&L5 ݄GMP+؄LlD(ؔ#W (@aU}0m+A[V+$->,P t# 8>wG|фo#t}0">c0|vGˆ 8R8 a9w Csܧ3sܨ*$taґ,GTM*Ј! 0E:aSEN,pP@ӯE">ġTUgH 5{MDe:T0p" +- )APS39ܓsg8QY9#@"""""""""""""""",DEsB""""""""."""0+4(pq.^5 ."W B؅a>0A|DDBKB8#DDER"1DaQ}DaD4q:#x#vG=DDDDDDDq9PB(N} * rGUPe~0>""""""%Q TGхGПFB0T0WhDN"!AQv"""#DDDDDDDDDDDb"""""""""""""""""&JXB>uF_>#0#S;DQYh#G%Q: HDDb"[QB%!2.)f-U0QS+:g`q!TVP+EF4F#L#UIPTHJ)ʖmEiÛ DGEj#1DDDjp*%i0}o / dDuLf>F&H"X(D=b0}H밃lנXhdMLZ$bI5(>#(FB:S-[42V#́+K#h2z+%NeG )fo&$xb~tP#Έ##0EBSDa,CS"ShGhE+!ue4ma;=@"AShg hGAQ>H3% c'Fز (blOqǢ:;B"h(D">D} :)"[$%(Ed1bV8@EFJ\Jn cE"0 d2#փ18fa2:1aa6 A#?OzpfgŨLSOz@T"0E"4#(GфuGaFyFB0FtDTL$[6.A : A 3  't7IjhhSC#\B6]$޾n3 lgD0uB!h2CgAavS gц&AE:Ccc!:yE : >93 Ժ1ҿ]>{ҷIovpN'  Oꝑ]m~{G0V]x،iaO%CFĨ %;"=jPx A@ "$p0 @v4 75,6PL VOД VaFB0Ŀ-I]WzT5 qk};^6﷎QOAWI <<6 E">E8O` ݘQ*# NksCkc'[S"ɻhhA3Ay? 4- h QЊn/фagTuE²/[W$G0ZW_ƟﰓB e>>6:ʝ'+kAp[Q񡴃{Mp@$- : rώhJ2EF-}" q0Ap@tp0z ˡO?2:"1I&f">|GG\i'xW5 ]{!t!MRHԎt@zI'J&t4ҺAS[iEZt! PpA8W 8AYG+An(M=ġʇ69Ĩb4qfGf oC=:E_mul'[㸮TI Xa)߫GC"p)F.z Kzkh;C>.m'kJopp)m!v+ g!6FkcxqvEb#a#pdi[To|A{}邡R:&Wڅaށ#?;_ic1vt;Dj+PE=H VF/0 OAW]lib`׈iS@PE?[־@&486+.j „PT0A Cs>6">EÄ>?f]~<[{A U/њA#S#o}VT)ú_Xӎ4-;s3wx:dcpgAH:ocJT! A$m˧A{ u N57C PDz!l"N _OQN='G[gު+zz}lCn+ЮЃx@3OR:tG ϤҞ @z"g)ŏ kD`dΡ?֜{{"~#>+]?#H.+r:z V4/L&i=t{wj S]66_n ~(IR:a]a-^||EYVDw}޿^6+u#OR:F&Z@T.qj׭At(f-7)a~88I/\ Wk| Va~6 _I0a&M j`)4tV$׽U."#>^#MxI4ϬG'P &O KlAW׸_пtNZMEƛ;#Gb;][#@fFVtOZTqm,plRġb)1GLAbP }! ]Vdt`?FG@vV֡wL}Ǥ"y]PtuM7R:PK^Iӵiaկ_ _"nkY t>0`շ Vu ΨBlDE4)ІWpB(N!UÃ8|1 /"LAV=8l ``R`- +EakJN:A'kT)oM.8an.KVMMVPۯ ls*фF"(DDDDDDDZ Ju84d.mJ0ADuBƁL~ش+A}#4:Xi*)*om{^PbPVDGZ!HGT"""""""""8eBEAH83"D1&b0G;FR'Wgz2,Q+paDK:""!jd6e d(AA#iOE"A@4ӱ2[B#GGH(Q4x[rXBYm[Im؍zZne4MaZuzPKp4Y^qZ4YH!!4v0WbMӡ"(L+ _:KlB64GфPB#oLub:+!L"""#j#1,B""%q4P4Tl[ !&hFKI+[ JݖK9Z0IVUwķNb:-TqDDC_7Zdn"(L]6Klt%sE28d}B `6$ij(C uQ(vS TEmDDED QЖˢBT#Q&"Fi#ꏮZD"hPEa$ؚ#dPDN"F,Q2B""1+X'e MґgTEb%&ȱI2C$E"&ZDLP%[E]">$LKhB&EU,K~GpB#4J6H!D14RS(j[khe7"dbd [jhDꥬ]!,ЌDMF!g+RtM!B !+(QDeuRm4M\ )B s0C6\0336hf0vphm4e\P̒uG)V78gd:4B"1T"nXȣG롏zO**vuWp$!,Ћ]B#vrgթþ7;Ls#{.a(O\"2( DD0}w~'_Nq_8ↅү_#= ("h)IL! 3.ٚ>a{vcx e$(aAuO BqG 89%3ܯ(GF^PRa#0G{=&ʴaF].qƇt2 p0A2Vu70T# -R(P#ABpCT2XC03SG#]E#!# */P]i߻_EGUׂ)k) E4JBX8Ըn]ŗ ECcӋXwŪZxWX@T4-OC! ؈v#UۻƯ~=n^ PpDui[B k]P258vqp8">'p>[}8r7h?a4aa; P&a 0 B /̌NgB#`0#0S~E?Mָ"?3?mS+865Oz:":ä1V4GAaX[Pp$ڼ- vn' 9pNHvCB6` "un D|Dz ӈi 0LO2GTЏBtW k}W"+Ga8DuiGu D%Qjޮ*;|Gwx[v 6Mn] l0CE\( ˻Rɏ`rcK A&; $GS0A#>faΨ>#GJtL"GԖwlqTޟl#1!׎LU~ӨESG^aNOP#ujMbqxAwEB@ppE8":tThhْz.H":dJ)ҩdtM4 &@ &1h4 !dBRn#+!G[ª}ꝫw4?}}CPxDۥ5pzcPD>$}>BVP1$MM?aN#ӴkDjIඅTA5S'EzECNBT; ҄AMEtOڂX]mRܨ}BK߯oA1/vz{PP뵔:l mQxŰOq/ %vGW֤"[#cADuj3WOַVv›/#pC} wm+.Ҷ7wa.J-+6ңDa6/)4]L:ZiT w8l6z/=__}B::?DV;(OWNďKO12Q[xƷ4.X" xT6ׄ 7K"6 H9ܷ#V 01|\-յ)F#7IS:Ojɗk*q$8""QS .C]CЈv#i*2?p (x"C)ئi}i tm\cXpDG`P`iQL"(pwM4kIjK>M4 U;/#J:h jzS~6Ќ*m48PS1os/^uQqő:%_oz"lO0a &5!Z}aRbǍ/ EBiV& Ї ("?Dt P(v ppPQ<O+G5Dun* /]ydtpWuh'e:etXqX@ n) Hr:B)m.xX= C"] ;&its!aҴ7#r+Ю6\1Qޅ[ 1V5bDtq)taVGIMjA^+ipci EлGIvdtхyNgtWN"dǺݽE[PO,s $B"!$B8DDDB &U hwaN,":G]jDun[ƬB#PxpE@ky*ApE>XoX"P Cض)ء(b)jXLDK3B Pa8a. mIUՑi0`IGе,B#@hCR! C0c+Be #EDZ)#DF1 BIC\a:d-*,HJjXAT2Y0Y^uDi(F ъ:aBf: i F,Gި;;|w 4XLO0l Q,D"&ŨU_R/y__#Џa㈾ M(o"d!;HBYtP]!]"aQD"aFBl":<+B%}^mp,Ƚ:g '̢#4GFDuf0H]d(FO֛-Ӣ'aJA8 "&ІGAa0[@N!A${Ly1]rFk8#0#0#͢}FDb2 SMr1ġ/4n0jՄL0GA w!Ɓ@&\;A A'H-'CwETC\4MtP'ħ~QӱQuDZ;E,Wz|uk Sbi#A ƃxn9UPL(ra=r1LC.8\hvDDN7q)({w Ӱ!#ai\"zT6pCA }VDu~°XP׽j)(mYEEc W(#Ұpkvڰ|6+.i"vm.H"Mxz Iof!Uؔ=c^A|Golq1 ;cpP*iS+`uMGdQ0 tat=5#"C\vNA)dІPdMm0ax"b!F #&EhB;C]Xt1"4""",0XA `L)N  BgPD~ B IӇ'8a[~Z= DDDDDDDDJ&lGD#).LATCM0E8w808 ;. P[Ж}""""""""""'Ј`)0TJB,P*""""""""dV"lBH2SE"0MQwDcB#b"%bHb%f-\DiQ#!n2[DرLHDaЉ h"""[ 4uB&PMB#R,YhDQ-QY- D3D"02S$ZC'Bd "W3C-AdB:&h#D؅2[GhDb䈳EhB:4B"nrY1YFPaKxB8FuQ-D$M:DVR)jdUTuE) N,T$ؑKwDB (E#)J""$赂723}tl0y3"%D""(E)PDZitY \DDD"2B;NDK ݄E7XR"Ўvҗ̞eaFwѓ6ga&I*0چTFvGLԴE<:3hDLWkz+CB*ꎨ"XL#>#֛v +tvz:4#E"0# :Z%2 Ψs"kDvNK%?ExO& y `>G,3zP Hǣ34%AAS'_:~b%P4}GTagTZAP#>,2& fTt(."GW0=KuXG>a xA]I8 $G`hBA2C>`3`B#is8# T 5Ox<) Th:,AE>#F^-4"";gT'dǖcGX5'a8H8} 'x"PU#y-ɏDc9ct=]Wv6~-1>E fA 蹘 ^2`؈G:HuGT4aFa#f-=B(v#[iP itjh: H;T\=4nv@/:pN(97pE'%;S=E_#gkUqҦެ_ A@ P dta#! tG  Ϩ0(GqG}JKiXZKltZ)"@GPOuIzzn*xOAa= ' _'mmZE|+)w$9;䇗HE=a)ġŤɻMs-Ulj(L&qNA2:1_ V o8HYGͳ%8 B&N#S LF:>لa_}xG:mb⸨5Cz՗CzvPE?݇zJy}i{T":jXh\CnJ la8cah4)Nǂ) 6vZCPV4!5gA2:\H/Aa7Ahj&11&xb0]Ul-Cm5@י#8=="w]oJF_^M:Rw}o[ZWH"PinA7@H60OR0PORq ꨔ9nPaʆGZvC;#N/C§0Ze@DzY3taf Q $ !e CPTN(pD~!"‘Gu];!9^±ZGJ>s#bXAnOOB֓{A;n0ՠH‚ a:pa[m:bT 1*ScEۓE?(sDnXMmł#ʁa  n`hqYNG'9nS.RC0j"1?"}ulG.ӻ#5c8ZxWǬL-z Y0EDOV6&$mD6%y8h>Xx"pD#9CE:CG[vmFF(Dجkk+qEr:0+Unw I鼎=Sd]c -PE?!@E"pADb|~؅O%OuSFAhu7ڥ!qըnmZvq{Ҽŧp"=aK(PDtٷ]$G];nBi|AסǾqϩƞ$. 2b=_tPxK C޷Jub#qlX1oV+'*/Ջ*6*'a*J֓OFQҴ1w}h\}[ L0ԎC#ga.E:.$PYyDulb;J-5G N ԡGVr:ŦASb\.$:p\"焑<":z(#"# SP Gp2qiÆ0 B }A{bض0E@V-\w8UM !7{VAj0:-0"{8uJc;e=KPoU|v_ ip"""""""""""8EjPIGEE.8&tP#E:EF<0&2CÆN/&wta;ƭ%MDuqOam=NHd." teDiQDDDDDDDDhDDDDD4""'D!Ph(pDu .0 NPi ft%݅ݱ~GY{E:# 5 )X]xj7MmEj 0~{8wlq@JRTD"!B>tv)}P"""""2*0訄SNRN"&E>"? uP)õl u,&$"#":(FfB""""""4""".""u@"'k#4] fqh}Eb W1eK"""."eGхB"#B.#B""aeFC颠$TZ9nP' ajy&NÈEӕ".D<:04q@""Љ Dtآ-#u .jQb#,ѴEغ;B(aX"4#d qވ…"0@q&8ȘD.ϳbg.EȺ6!xADtGGLO.r:vtB"8#*L>ppfU2Pˀwa-ELvC] Xaukô, `bG``@O"jq0!g"h3ǜ":#`gr=af}R)2Q548aEꎨD"#I.vY)ٟG5 W'pvvy(b ":uE~Iħ";[ᅋCR:R:?O[ SN598'n< gC=!0,ròGf#9E菗#+:vGFCˣf)DQGTR#:|EQCϣ릵?S0vxO ]ze:wkzޛ~Lt]q߅݂#p7rvCdt}L;/PvZnݵQүTq0& tt` %Ͳ>}Dr?Eьtyr0a!i G>;'ӯ A7E@uupJVAi:H8m 0ƌ%]wd5Dۚ-])$ˮE#:㰄4(A޺ Q1aPih0m1ʂnwˑ=GфtGT<>_y+`{+ZIEuv 7*q 2nvXR.2P[ɻvC "hYttaUƭclAYxgdĎ)qC3b10gу|4GwXŐB_kΡ+ۭ\]0E?> %[jbj8i*==UߥxTRxZ:ki2>a.Z'v]Jp nI@0E:TcCNE_v) BHE'8#s3E̐y@cDBQ˾=<"PaPlO[յL[bH=`s"^eKmGkC ՍR pY' "pA9t}t"jxwwuW m+k۪4Wj˫EVkj4 ӫä5uDuvEVN׫bړ5];h *P$*p(v- pcڭRtO/кUy~oZT'C"c,$zŖA`NX}QHrWh)֫Wzm-~x=D}ÿ:L4Lt&[Z8'q﬎.B#[hpELMt^6ed.pZPԓ'}}v5qiK]wdt>]\Q4EKvV0nj{H7|yj4Wpץ:)a~h0o!/{ˬ0x\">./8Mb.7C^]^{P#okJz{ ZvmPkNh6Mwg`}lC ;3́ tCu&8 - ܓ ]$DDDZQCB$f !zS PHl #tPiic0%Hx1IPolT~V5N)GA,N 5ZT67h&{c41/wOam##u՘JT]+0l7˜8Co[t${ηuky K\DDDDZ!DaBAˀArtPD}& Dx +@nP0vvQ_~!'1?)v+)jh0V«J]ӈuw o~]A;."NGBv]k& ̬Txo!B"R"uFD8""""""""""#B4 FqC`LG.pp9']Tκ(qp!4{lIa:zV~ qHmb#ﭻ#0ZН#y:RuG "&xp ` XJu[dtӦu JBb*եi7LktUg&/sGNv*DEŠB""v1)غ: B*#DDDDD\DDC(&]VGMJO}Utx01LWS $"00ujXTEЈXEGB>"a)b0DEd0L5T:ivNJ17Ŋ?GeDA#"UDDDDE!#B#(D"(GP !4GDCA@І0Ip _DNҐ]PP4Q:(ۉtPGDDHȆB"!hDQKV)P!GtPq7+B"e)!;^hDaC-H!D.XB"&IJ[NGGE j&"[}Y DK1QƎfm".F[taiM'kh"Db#) ""%q4B6(S <}t}Gф_(F|>})taGTEЈIPD %!t$m\ DJBt}KH qЖ*6DQ"%EQ%t[!+Db)BфF!;JB"d&%pTF#DDDDPuFuhL$B""""3$(4vF#-eلaYtaĤtT,DdGфVTGTYp68: 9B;̋gڑD_Ib;B;E Pg%갫QOJ]# ttCEk#D x򶜡BlP^Vl|E"\Ė+0#b>"".-yuGaˣ 3)R:1dfc}tFB!Bhꋣ ڱEqD#G}#aGT}V}CN㈈8Y3G"3 GiTЈЏ& LьGG>FdNOS#@y}W#>5=߫l VB+>#j""0t(A(Gp"PB,pC`#p G00T0BB">?L",`f4,n<u#L #B>B/G}Ga*.#0{ J44"#]4d[K(D]r "#I'An 4!(r ī almaJaa%@`t7 XFqDx0E8aGF8m#P‘@ˠa$ADdt Yrb!Pf[#Ԩ8s'<9D:/#/#]"]#)ꎫ#ZNg*8}IZ(GTP,T j:^tоTAzҴ:@EB." 5^^50ؕ0=2xJ2[wg.}A80 #Pi8E>,!a  g(D|M02FuE>_)B># R;PDDOOkcM'߻tۇGż[qlzIm'^\0\ EB*ӂ* g(n]k=˱H%CJv0y@͠f4ӈ`D68>h$f3軓"|ϣ#|ϣ0D˥#N;4R ,* H +%^Ԏ^ eф*I"_~ׯ%w'5+Nvz& EDN$GPl": H"E  ϔ|6 1=nga-n VG :P GJGA a0 n $C 4 ˣ]E0'FGDigЈ= \du(pڦkaňkƱcjˠE=oiFO%ztttOR:L0h_ Pt޼;TQq|ZAkZN#IntRhp6; %qxhq.EÈDt8~&83GX" P.4,BT j^ k$svyfdt>Ѵy}GTaFaE>0#0#􆶽avxd]CS. Q"֎qư4~Ǭ=ֽOR:#SA<"Wq'Z}B׵6iPNxPT廬.N@LꢋД8f ,JcF-ÉN CGa! : R:(cpqvϘbN.O(v@iBzMRlWgxmq(B?U[{{@tyը"S07Aa NOE4!M 8X-<:O맡({*^иՎM(t]V QT*pi pDu' Q(lÈDtp `#@ 0RAѴN+!ǭӿ1d (zy 0B(@R]Z=p[VׯN>*&VkyÅj V)WփduT.]vaU_~oATSX!Xk.OnńI# Jbӊfc $lJ5 [U .uwZTt-pӈ"^؍1/kgHӫ/.#^GE½P$S"Cg;`ƚWn jn-"|)>#8l^oߵ~*RAWm_a7بI]zB4/I~Ov. MGPߺZ[ӧbO"~I)a(@ Z R:Ԏ=}'V؊8>Q)8&=1zy)Pޯ("+>ruN׌ x+@~E\ [TaH7L ]:U:#. W)!ǭױLw"<`+ R:At . m+Xj{t[Ҧoc[A7_xZuKN˥S :.}TW HGM'k8B8hZ6: x^" Wk|(;x q?||  W_}ZR:SAXH'xLD! Jt ů xbVIK(x"SuLRVqA:˯`-8mui=6jcbi1b5j,n*6Kh," }ZM#]]'jjGZm[s<$/b_׽޹,<-eЄ鋈~; Z JGTuVC"#pEAH*N4 t)gt0p!'C(ph͍l(1NAN%:؂bP Q1G"= +q k6>„ScMŧMj=ojӳ L‹si|qK0ս⫮ў:W,OY*0Dy_Ig* =㿆6QsDq QBvSPNw +x00vWi!a0h5bg-اbd߱G W|"WaaPawN&qPj?tLN m<b1mߵx_~N(~aAzu̕tvfDDYSB""""""a'+a t2.Nt/TB.y$ p70"q 0&!%?b h0HQՄjtJ؄Pi? :|0t+SBjwN"K[,!ڱ"|4DDDOEDD@2*2 e I0L!i AB,'Pħ\r1M6&% TB"8oGF -j:<jݮ&.{Nly'GTp,luP0 ش""""",P+T]J)Opᡔ0XDtᄖ,Aa+9D H P65ëpx6QG!P*I"#""""ءDʋ*.&w PgpN/!b (a""aCA6 jU҉ C.+#l(\DDDDDq:!Q0N5P]=hpLB! OpbSP0(%"""""""""!a2R44 =BWB""e $#Y]ah%DQF]D"0DDi.A5Whb%H,Dq#"ߣ!*8G*Eϣ0#FAQ>`ϣDJG!t%wE"#Zj=9H" tЈC6R"H (QAM>#PeX;LHCDa#}G}V#]JGTaGrvRcB"GB-6D V9 AA ANjɜfNwDJB,Y(Ny@&a#0(E:P$FDDG#9F RP)4B^# ~AC%? +b&IЏ_! teB" 83 F2:7h;6i/q(1EPb- gLtΈ:0B0#300#00E.b8: 0(pEЏl+["`^'Gz"P1bxbxEFv @ U[T L m@aH0L ( pe&hPh1,Bb"8uOCfe#e@4adtaQaFaG|ZaFpN@% ń8Rd#H!ڢ:&R櫰l+ A 7"P6iC{1 *8C=f4Q8bm(hB,pAA0={O.aBA a8+A.a]@_DO34^sM3 LSX"<#LjF\># "#BP"(zzг*Fȧ0i:B $n$օ")E?I#]JPLJ̸h~v_/Ph>&*'w4/.#K*ՈЈd)R+(p|# X@*zGZ~-xB X- hi'|t= h'PEEI#N4 (uGH@A>q0@%E2 k ]ELէh~cALpe ˠDQʂ!of3 ]34`ϏAb*%+# >#0Du_xq+ 1B!~*6Gĝa=BC" لu"ti%u{J txAB*/V ւzlj EE"=h& h PeEL%M+> s"?SCFcl//FДᧄˣtG r:`3 f0xHa 89hxQ0S4uY:YaIE:>Db(U`aȝu FV[  \i?= }TP@C&)0TT6[[vӽ[Jűva0X6"P  EiXՆ3dĨn!.`C ds0! g" 1ԙ藕 ԟ:"8؈F%D.cja4=qB'uk]cG_qEdukA CMi?@18IUD%?&j!~=;VM$8:؍B|tMM6luMKI 74^P& ]#TXAC hq*XbF0N,#a0!IGF1tb8!"7R:YD]*t] "Mt}rJx ƙNvhvav#Yy2,Q-nPDA?td|R}TRA I^ zi @u+ ơb *6@0E)Α +KEÂHqʆDt(f1<qbx 拊 ;TXJm6"B[N"6!O BӘI)"FL+ޝ8+WJD 9ì\wQd& 1p\dww*mGZytaa> jmX _*ׇCKX)a:]7I MwnXhqnOtuN]G8*!"huu2uZ ԡSxL"cA ^qwhKF "!w.'u>(pi#•JGIQta#ީH h}QMX<":9e@ #taR(zf@_hXJ׎""!qAq#tXf]P""A<_W}8l8r-[g K4 W E=sOAM,u an#Uo=yP 0zau*5q.M +P׆j{>t%CV:;C[m84v)ONT ?Qta#zgZVgڦ-iސCc }W:%QR:龺/\Ыƪk8taDq.< wez^ pb#Bw{A {"{j -j]VO"2:  6 PX"pv[m;MLwVWM m]z]E=&:SjGY'EZJuiv!\q]N>/'^~ zv~x*T#xŅKilGрu@q쎫HOR:ϠZRBL 8#"V 2t&*,1)ӽ!4)(XC !pBb)Jħ`§jPji4`zhJ]OuL{Wki+kk_}M߫kqa< WH݅+BOAGUH)@ 7APށcc89/%;"""""6""""""'F)T NϢ:pEe}1 SIm1]!%=,B'11mňbCLB1LA # vPE8l0(vDQ4 $]&I-! Gx"_V3@:gp l*qQE|G@@ڤ?@z Ԏ) OPE9WFta҈DDGE JʀBeԯ*NPq@PqemwptTA Czؖ (."Sj0mX!1Tب08a 0„ #t_mj鰯Muޞ}.+=?GIva+|.N"4g7|DGHQGPWQ>"PDDǴ#0::.ꏢMFDDl*X|hN;N-!bm1a 3ye3c<2:0#G"""89EVtadt}QZpDvPzxzA'N<$ܜ _3GrEޓv;[B  l&boA3S= 3%\쎌t|\.Gs?F]tO ϙAqi\DD,*N Ph<&; „ A@  Ê 8,+`t{Z0Gr:DCGќ'xnnD߮8֭wxDv(Sl5 X:t߭/@(tjGZ"=j뿨pM \a .") Bm>-BaA<'m ܾx@ᅃa `Et8hv]BWNEN"Epڑ:.Eґ ,¿hkFvhDztUp!H.OWGnJGMSI:V}l*\iL JhDm_{D{^1x~<\(|k~+L W Ψ0]V][ti} ӊ}돈F&]C8"X"?|ÔPuP tIԐTi=^8զJ>CZqfC:ze`r(GA'GVOˠ]'@C5XCB-x=_W_ii"5Vehp֦iE.##9QSf&tm+4/Q[BkammcB87΢W -|E#E=BdqƑP|=7M fI7W]ڶKРL'hZxB5ZDC.+PE9*<ÕB0^+x".w)p@cDoww&∡]7 mnwp]u""d&"}Dئ-G~Ɏa`V * a%[. M)] WD{$ rMNkƸP+f:{{]"l? ") ϣ;3ELjS] D|MO C"8 p[ \E/׋WCX [ APPta0 mzPS 0(ttۄ &4iSb;b rKs41DD0B"""A@G #,T#-#V%=1N1X ՋƃlZ B(8A0hXl0 )&(f"H;. Vi4#"""""""""""""""""""""""E]Ei(aHeAQ Jʂw)APw* * * TAPTAPTAPTAPw;9;sNw<9w;sx)x8sasF<ȱDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEݕD^ZqDV&ZjHЈЌDD(E"#TGU2Ge*#Q"БDF"W&eFН"bDEPDLB"2a6+X(h Da,"M:(B""M(B1l DwFYVQ B"Z"2.[TY)6-BW[Db:1DQn#D"""%pTM(#(ިQ"%~B"2MD""[((>B(n KhK!`#Yr2FAHGQV"(T1;XGc&DKH7tYR7Gp%D%u4"dPCh)D"#DFM,GB(GiQ:"(GTEB:+RܱJ#!""""W[FF"PD#nX!,B"""dh#%!Db"%p4JF#"1Dܡ)gRB"""WSFB"dDJ4F2FEDDe)B"%2IFdV#Ea7SB'kh!Pb!ij;;t}EꊢbئKj< V&܋+"!gDIQR>H qF;HFaԆDTv"<;Da K]% 5]PDZq`!\"DuGTR|(IEb;gC;YЕӢx_CJPmGHGAXE(zYuF!#mLtF Gă5<]TyFaGT}FaGфa_-+^HGbk ϪTyaBڈDB"}!jh!"L!cqxVECV1(# +#hH.GTGG0E.#Yta<]&}F20#0,qށlz+Z 3^B%>R'ᴐAXbUQFѳ(pH칄 CBT&;zS!a8"LJ*ЄPaq (! Bƨb(Z\jgЏeHO#:>E#_0aE&a"}FBOWV |2l&b! KN֯T7cXvA5-@#EA0 0ú=NB%8a;MД;,p-L&PД>#LPq XQ b4#>;Dr38=ta3GG<]NGZh"1$е˦(/|:#_@u M"nMۦTM00Al߰ B e 69< x鰉hч*E`40xD4NCMPN=2WPh1\CwpC IyC(r>#'#..E>6DGa*P@& ku_umZ5b+!aimuOTa?"X"'@tNV4 |^ ł`M556f2 aĬmE#CE<"nwӴ%A  Qz g8&D |䁘G9|#?gT_0aE՞C4bk WwzOiv  2@+a kSta'{b"ӎ-Їhu\}:Mpj "]%`z:SQavVma8%[FH t|nn\GnaZX B§li4#-c)GBZx̏GH/GN]F|F XWݭZ")؆C[5Q_#EFݑ0 O)O y  jGCChq(Glq]'"~{H<'@tuDu[U^֪„v&h i(pan%[DGXD݄ a/ILL  !jF1S?9g>fh# #h߲y"pԺ<S~GNSR:}?MN"0ψ cik#:2#߳~}2B1Sˠ]F t+aH;8"<}P@ WzjŪ8vt >ttPzi5]=<' phƊpEpܧ]ha9pp#Z *дv_? =" b54'4+ϢukOכч*+TE P# c$SᨊFXeӅ~qh?Nt: k Y -zuxX⮂tJ A8kq+(dtCl+ucwl/@mxOT}^bBH!D24lEG^pnLPODFYt!# ?ۋiլb-҈|G+H#mC>M(zow}]Z68ҏk+zM0ʉyBA?0A6 &nT4aw[Vk[T:  ~l/ףL nq a4#<*X"fMuaBE]qFCwyG@s9aoGY(@!Hlh>c5  #.]f7TG>8=":0w0ak."޺K^V!$},F/kcXgg9a~S*{i#Z@'juE6tӭ5C|~aeڤ8A:bCA>:ZF\UO0UEL[{ w᭦-l ujL5a}"OEvM}I6 ;7=[I쎿PjuF t ( VrtN)84qC>?޾"""""#]f}B0ޙPT2(  ]2DYN08B,!"CB:5if' &(u#Bwt+@x#PE.*(ӭҸXmEqm6lMtyC^SnZCV.׶l>&+˨"=i 7Oii-"""""#.8#Y_0(F# >}$R!BA0LLe8CAgr!ЃB"BDF[L*a0S@  ).<(xE:bk lvƚQnI۶>moL V_i |?OH'ӳaxsk&JIB""""""""""""""8H^V~>+쨰F@T!  a!f,,; B! qlU'D} o5a'&6 0 %t XM LQu -n{]W(Jdk0P*DЍ0SegL!>T,A=*8b)Scbb;auڵ]'l(l$ojH"5JU1b""""8B I XDVaDD\*DDDDG#DDDDrPQFBI!f "Ub"}Uf\]:2B#HDDDDNB&H"P|lM)XKtDC;iBaDR"""M6!Ff PDDzoa1p"З&]e"B;20F%"ȡ:]4tED"!HG:?w]E"e>#(FF#0ytЈ= %ET"&NR;SD C?B ` CAҲccp%OD{<aE_:}taFaFP,,>*0o-ţpGqGYtCR:L 'Ag[ /4,!\C@!1QyOP>c)ьEY>aG #t}Fa! /) 6\4lFF"ኪώ7[PaѠ0GeEР a N2:dta AA.dq  !CbYhEmon'I7Mza66oAi6c7|5-HP-L$\8#'nPDxE~p4a+E)EMְEyPƶ; 髅~Puն_H770R̜UH(Dz ]\&ǦSa' Cd܄B!/1SP3 ZOE*Tk6)7[ n';T=<'\F#L"x'uw u{ӊPL@0`eEKT VcM:0:0$B(wx^~T'&DPE~F:"O ;?SGG@„6FqzJ0 Qn:w~a_3;(DB.KS_4KN5ETZfQ݃^GF]XE8 B")"Ou~?b""dVDuD"(D޾k4EB_gґӷ wa ?)]=@ISi8fB"ǩ8cqG]+c7@ZV E>B""d_M +~ZVzܝVm nf> b"G]'G~Xt2""%p4wH6i@. ac j3?N3¸ 8?.vO~y,2"&Fh"PkkՅviXpHT;Mӈm!t{P][H?daB8aT(P 6l%Etul4%p4I%E1ħ>bwġ*P&~"[]xM [J ߰ġӴ0eیlpoqa7?kt;M%D"ZCN&p]2 00a B5'|EhÊD&(1*&n`xE8„Po.bo|5'  wDD::1#FaGeF ;* WFGt.*(AZ :N84 ":p;AXBX'q ,05v'{+dtuD"#}F"""""9Fv"EQ##0pDGDZh>jTeB)ta0XL]0YB5CN'i V8#:;H"""""dPSSJGE hDDDDDDDDDDDDDD!AJQF_\a ,Ќ+2 3).r#|>莌#لaGB>8"""""":Qd):mh 0ZsZ#H(E"(EDb&BrF#C* S sa9Ssg8Øsg8g!#"dMF#DDKrEZhZI** * * PTANQ+)JaC&;a](Db%!tv [6""%s!!H!+)6d(:0b0+LJDi m"(}+Ј"4PDb"""'hFPҐhSFuGTEJ:>B""1-֑6% W5EtMDbt#+ȡ2SE*,w0DQ("fhND+EEM!DDLMDЈ"vjF(EB"1nV'F"$m4)#GTR!!B>M"t} 6-D!2v !2E!DDEa6:;4B""[Gф}S!TB6EGTR"(DDMDJ刮!2+Db0!B;"v&}DQ oȤGЈ\0#Fhq2+GP!;XFآaaDw>TuE0aGфa(GTa"!-ɺ!"1EQaGT}"F&B!-Di"#&DY; nBDDF3 4}DQ"1DP(Z;FuFB>R&0B"F"MЏDDDDD0aQ(Db>#:h#Q""""%pT}#DDDDȭDb:Z(D#Ⱥ?"!O3c. H0fLDb(G܎wX}X)_CTM?qK(E;~]YG:)څt}uV!8a99^xk{3 ")fBF5P~wM~=m-t:{h":@M6#&h^oeGQ !ʵ}M>JB'FF#!q !4# ͣ8eфSsgeEs;(uфaZXE=B~_Ni={cj~\ ]Zz&+0uiфC`pa &|(1=P>a#G莨ꏣ00:(ptj4ZЍ㨈Eݹ:^!8qcQW߿~°d|%uASˮͯa]E *6_ko#M5ń4#B!0Avha8g3=2:  taa ϣf1F 01q:gӠD|R:r:tGq}-D<:"bF0EڗFEC<ꋤi6fGrDݢώM;qEF4Pp3A &GA]aDxj2:!E iOqA .?(~ˣh0Da"a>llDDEGGuN6߷uo"Kzi'|:M!Ww Xj"Dm6*8Cl/a V A#xa@AE#AD}%CBT4\ mƽ Pl}H݂)D Vm(xOA8B68R#Sh0"tuD-uK(~tJjASg $[Oo=WڧipEՅwwwiEP]P[ ӫ KCmBŠ=6o DyGPE90 "An@{It}[J4;q:gEф2=DqFBQ\q@24鐋%uE\Fb/mׄ"ỦZ)VPpEV5.a>SvWuEZ@ʀλg&Vj,[qLqꭤCuE҂),QA5iŅOX-\cdxtaYSvacXb(o7  H"-hGFE[ Eh;Zfg"om ӭ^Ƶv눡loqq<0E::O# H!|5jN5ۥC4.>0qSZGOunaP"Eф`tCP\Dl".*5`dd.Ut)+0ɰð)8HwlOawp>FSC|o5#]Ui'&YKOL)t] (}wzdaRv-"' A02izL V ܧA6xqq\Ea nB@E=HDt `. WDqkY &cPæS@ ":eEXtùva6GINX" a):t{[]vj- qǯ}ͥ/KŘA Vaeґ#TOPCܨ[Uq@_ 4j{F`>]hõO.#Y)t&Wt]$]Qu;mqjkNwgCxuZ 0PSԎ48}S[  't,h'Qoša 0 ִk}yBr:ONWvWB4#CCиls 1|:]("ar3upnzjqJ#B*7 GAO0P^upշt"#8 _PX"P:0P~頁^]w! L+ [{x][;B 鴛\8иCt1˫# H8*iAͧ>L}T=;XpOwX>8`C8E0E?##Y]aM3 wv8uǷ?&Q@Nw0"Bn% DKttF".#H+DDDDDN#(FP%DDDDDhDDDDDDDDDDFYE!haGqq;&HDDDI0;!JdVDJh0F"PR;Db>HF%:4R#DDLB#HfF2DuE#ߡm%0(E#"TF#>J1 LL#ΙE"(uGЈDaGB(EmB"""'bhTRфy|&GEcuˆb%&Is$TaFB01MGNR00DaDDDDDb0DF/fCi;.1a(!;dw6MB;SE>aB""#"QB*B:CC "4DtBR:Q JR;&_:F#]"(DDDJ4.APZVB,!cB.#KZO+cqQlF#l#(EE#Gi(G~~"0G0dta"8ˣdtF#}>34b3F'GEўkX6"5@yBˣ0qp܎ŝU (UDq\aY"""J.!"yF!TKr>a/)M,ANFrLxGK {;Â#).'4hxF1)ޝ @5cj)F1(ta:3g gH0)gB0Y3#0 "dG|>9E2""""B/>P(JGGaF},2CE Ԏ#a$C:R:TȲ\+RM>i cC z z VZ@ A Q)Cdu;gGSGvġS8upp,pf BЗ0OAmgdz/pфG@ˣ.F t+>Q"qqqP"a#="Fi3:}TDDFg]P"#p.=7: Zt+U]}IڡqiPnH]/[H|$Ф{0Ng_SPڧA8"<C!3Ͻ">һ$[v U;,UOaPs>p.#Pu#]E_0a3@aGѭG\D|DDlhDD|Y}F}GфuH˭xCb \niǫ_JO\/Pk~jj6) L% T atn@[BTa(z' ")XFo@n4XQC };6B HBDw'G GG͢;#0ϣw""""?=&mdQvGG@ Vn](.uA|&atWKZL}McՆ#V71t*Ԏ4H}iwO[E[KXvm<noB@"aE=thAaa*SN8"<(=$@N2q@h#!Wtű <"1ʳT/030a.m}ЍCC&!GcM-(m] E?| V}FGXE<h"= IiV/D|ha0R\u`ŅGzO*;X"A߯Iƅ*k]v!! TpNpE@8#\67 w;0S[A! dty$@ 48 (W>=D{kU#xbqaXO|O#yGGT:< i=8}[|;t""E0(tjPWa H^ \OI</ %waX 3nޑn6BFwFj!ka ~?߻O|H]Y^ T.t 4OmW_؍ 0- vF9Fmtq 0MX@L W"}^uvšWacӎ#BDtkta8"Y-EHMEZjhR\\R ;=p`m V4uˬՂ(}UKگnxC=SCV d{4HS \T08a "a$3z':1߽V_I 6[C׭cE=|##¤x@ԎNn:аkuq/tN'.OEwAkjރ=0=f}_~c}>׹G3]k/mV\qa8"0M qKEqġYdu)jYJx@knڥqVǷm،|zho:mvG<'E<>$NcX-,V(}' WFx0C"=֘PtwjҶm BO)oS@O0Oj,:i@=7zAqD6>& T5O0DA?rp5{u#6#w .xL( &-=7m54lD! ">ơV_}, \=KaGKEvGP„ 6WC ~D _)ўҿxlҎr齿?#c@\aץTЎ#B64)<0:a?EP;"NdubB5^\G_>"G\==;)֝E°^E)bqT[c}[c}%V4c:Q#Bެ4'Nꝅ²:N IrI6G:B6եjC[|NcoԎnhx@}5].#,.DqȇP ^]"pn_q}hljxڶm)b#TDMNL`F&`({NGLNiuA!NbcݍZv#b!bN:lwJ"X$Z4A=A'i6G(~OL˥)J jXV|/s};w`]w#Oh(}kӸL.~P: č!: )D .""""",aejSBh^0Cal")P!S.c DǦAi5jPW 1oXpk ]E#}t&"+(Ak .]QB!D! !0MGANT OwTBi]1t!8鈡 wlE q,5"]] 60v"o]]^+G;,EDDF(DDDDH: 00"0!""""""""""#;7X#h tQ#P'_"bV#![~6/##uӤ""" b*"1PDEЈb0D}0"aFaFF#MPVDG B%;pEAQld&-" WTeH!TIb0"}E"0 DDDDDDDDDDa&QSe Gaf+HDqai QuT]FYB"2yC (PDDDEM0})"""!G0D"ЋX!Dq\F T""""1DE:RV"""9BR P,R#P4MP DDhD0TB=B1&h!HDJh#DDDDNEQbAl(S$>OGXDb>##:XDE";P\]D)h;FB>D BJ"b6Ԡ4aY_+h";M>DF"(DDDȕQDE.*% w̺+CҌ HRN21#0#E""2N1QP"yDiFuB"vDFҫ# ݚ9nTޑTyږAUDDE3+>NhR +`V6">F"/F}%BL(]MKΨ¢# =B"d #E":DDJR#HGT5K  kDawi#ȬMB""""%aDb)DD\""Fa_(FфuG:DjAgTt+>$ t .:;B2JDb)(sjB!_R̜3F3ƃ˲#>d|/F|0f]04^'E1ϣEqƅD"1!Z*hG('av%A P*%@m:xR:MA0!l\Cb hXB"1>@#3.B6f yA>H1ȝϣ¢}3>gL$#0tHE"Sϣ>0"9t*"&D,D)4KAA;Aw ~^9 ql0ScGƍ{a!'P憄 "pE##0C HjłpCwkCB!CE/B 15>@SˑNpF{0"B/Gф}B""d0aF¸MH[]rիe KA^n<'ih<'-ж:7h&Tf+5l ~%դkhؔEa ;OiH& 0AU; >IXTܗjN>6"$5ZMz}=մ.>4~zkگaSm&N<)N `Qic64|DuFPDCሉ#E!"dnx@쎁lx*4+uuVQ*;X!>5eMMZAPi&n=7 ~_{aŅI=PluiGߢA1E0DDJb-q:}#Ef50,0{ # Sui_Tu\CkJ{н?cӤ]^ޭE#DDDDDQ4"GфaF0꾻i^-^#ߨ#ckb:]߇EG6P D\;Oi?]Wq_a4(飳4}#~a 9_ÝY-ȸR ?R:w !huWukK a(V 8`kd:?Ep[ Aն鈈"f>J#H/0 EXfgG_tuv:/S5O83ޟuc0{(pytt/lطxjtWN*=l/K"XGҶ!lh([U~nf}B`vAA\":ȏfфCkAf@{kki:ƱŬG]"+{Hiѻ)A :O ^"dJ0{^)Eט]{ּ5tTi? /HkƬa*Lp/ i7#|뇇KaJO0+PEBٚJzQ\5Xko2!aRo +K¿a i=n] 醨?:[.Eӆ>U[إOn8qQ(^+_ކGT""&N0#>!)a_FB78t0|vKMV`[tVr wWv6鮹i>=x"#GXDB""""$ia 0M=l5E! ac@q)DqX)C⶟k Zon[I ¶AnNMW# :@H Z""""&D,Db;SFIPʉ• Pt"4,@B)t A ApwC(pC ' *v SD}bUN#)""_ObZXjj}Cp {it1[n">tv•P\ ELBa4""""""1&R*&"$"4"RPDaEЈDDb M"1-BXF4FHb#F(mȊ"DDDD[G~@DDD"#H>F"S2%B1&E|DDDDDNۣ%L"1D'GTaD")"1PD}!\V4uDiGt}Q B"WtJXGU-$"0DME(E!}DI-tR"lZQ#iD""veDD:!P Q F}aPDwDDFMXF@hFTB"&@nZ#}DJDD "0DDDaGG"'cHB""1+XR0DDDDDNDb0#GJ(_H#(F!-QDDDD;΄LQآ(RGhTB""1lꄷw跴FH#HDi(::}FB;D"+DDDF""""$)!+4D}"dDMDi#0"P"""#S(2:# e.GtN";#|"2΄DJh"#ndᢨ#J,Ge!4uB"'a"#- H"+El !*Z!2[D)!-Q-aD}GTFFb0b%~B"""'eD"[j脮"DDba4a0H)jB%DHDF$]B""&@h)j:(DQhB1-ިDN"P&#"M""#2""$DtdGzP9>!;XGB!PGTuB[GE3TbC9Ӝ[)!I 2ȠV",FXT "DB*tͬS.R#H#GLDNґ[P;qoD( U r:;DtGGT6դtȾJJFuD":EIP>qVtM8R >fzA!hDDWx#6j=Eڧ_Mڈȕ!A AH[,IHvGd]؛.f R#(˕#Cϑ9ϳ{.VyF>0,0(F&H%,F=a,(D"ۆ2G\ٴE8/˜g HSTS㈶4& q1 b5B(4GK丨%7Es0F H^.#1FkNA0 x["%,ö>2 ^0; "0чt;)īhtwEGH֜Aч#ҹjSJۨg4-8,X!0@srS&r^P(rVPYtlˣh=^]E#FG04܎p684H* j. D",_0iza;5_BҠ'FƁZ[A ѯA[]Nyt DE4a8"<h.Ď'"p}#<",p@KOUAmLa6C$r Adq39U3]%#FaFa"aEњ0R(YVEB""#YB!lEanw S"MOJ[=6֖. BPN4'B)A OFUmE"<`z0;}"D#ggE>7t88a 467"h`^TvAl>0#e/#(F};B)#0Q(Db Ы}>>5{Xj!_ ?titoӧ"_G@xP7^][N{STAm6vhUEa4 `Kl"S5SNGȱ@TB#{aQ !2\1E3x@ Վ Y Ā<E荣6tP#B""">"3"/XKG^WUH! "un[NIv[ ;nltzuV TU"OkTPAtiT5O[0 'R!< 0+7PA$8aʀU "pAhd#8wb;q haO !rv_K9xTǃC r+s=H00#1Pz DӪ^Ma Kq.&b_|R>_1]ΨMO#{m6u XB4xA|xc0ҵ]C?#jua^L(N8- ی0tQ$ *QG9Nч#wtc!a8!%n668,(̒Cz7G{#Q]duEw^+ϠX@)t#=Wu)ێx@z_#]'Nߦi:B(!qkxskL%z0DvGRCSҋ p#L$P20 A #dta aM.X!C؎./OO@PEpETH0ED SlV[M}}{RznޛwmIa M}ҙmɳO>l0*.ۇ>$ЫZB0Be'a0:>*)ڛJGA& W^;Tvkjňň] 쏄 'A3 #ˣ'Dth{>48aUIU0VGY il0]/م._/bKZCӋX5}m|Aˠi"vt!U[ۨ,>" ظ)Pc'nmn"L0*)u,s@zP ۱B#1bBȏG_"PE<'W5 E°$qӬ0~!$ 0^;T +laiV]:o]T4:`z OP]  j^OM1+oqh7b}QNO?m@!jDTO8"Tt`qkG~+.*50 J!iA'b z\ Nቝ!VG[a:c"=^l5ck}:tVm!M!&ŦMݥ}tHꩆ `=HSK#E>P)KiRzwHpctݺgфa6~GE"+UƷAN FFԫ VC +KSԎ#ˆB;*"@B"D3D3M0XXaΩ؄BUaAPPa(| La"?h"8qAdm0QQKVj a`쎒S) ; T1h:7.0Mt1iq .: OP$ VaEiR:u\hvЈx#'.hq#*(":a(aOC!gpDDe8B,C0`B#B! b p&%?#bgG⼎(uNݯh"":Mᶕ7Cl&Zm6[bi{a-m y)0]>a'{{aQv6~lϬ ݑ0 zx_rT]qDD\DDhq1GT}^P&$|CEh: qCB&Ff;bHQ.ذt#G# 0P[nj0/Q0(c ROl+ +ҘY𠊉ttn^+"m~=$DDDDFB"""""a"-ag"P DXE&Y'gpB""" $#""u>ۖ:ZN+)ƊqEGQ ЌP0^7wi  c\\nҸw ¦e)E) H;!6 K'0F'89uG:ED00DDC)Ј} !S:>"*'^쨈  2#v!@b<P)""JxE=8:aQN".#x"R#> ]Bu*"4"! : !(hb"'kIGL2XBvhDDDDDLi@CG"@}GEDLJ4"!F^""dĮTDDDDDDDDDDFYKdDb"菣l;,E%EQJ!+4E:"%";TD D#"DuGB([6ETo;B+DQPH>PR,!X0vDFdOaSR5d] JkAS qv|DuDQЈ###0B(_I&iRsr:R":R:R:!B 若I$^A"1GTaDb"K}wTIŧ8VE<)dbDb"GBBn#>!B"a!;4Eakb;^zC*OeP@08AQO%2B AAa&uT2"fф|#>"})(Yt})PFF_j8b*"#MVQpF0_!tB|BGTUuFF8aJXB( ( PbG& rAyhAML՞K2'aϢGOtaGFqe0YET]TSRՄ A6eA7 P#TDuB#dg!YcaDanF&5T4ktP\;P涊"^#= j2:R:>„-  Ы;CM mSx@'̣#P0E<]ecFkF(˥1GTaE'YEnWA+cb%#{qd"0":(JF&aD^&õJZox"XNL `6l0Ĭs`Ǎ6_PѠ4ka0E[Fh=GG":Dyߦ0E8 V вBAA0 a 40C ' lZbb :2t_>"">P @)!FYFt"#FuG ϣ-&ED\q֕֗'pސo$ekx"*)jn&XNˆ+tUv8H֢UJ`hEg|JT2:>^&-GG h2:Y! i -0[a!A60DE*l_gcAJ2>(1t}#0 E<(FFaFtaFaGфafHD-"(h@HDb_u_ |ki/ŴU7AҿEEkW jHPE:.:#z a= cGjlE\eGş1+#4(g)J" ">7|Z8PDx0=}!6a 0T1T!C ۊ'P 0g}:ˣ0"RT>"Ј#lAu˥#OJUx.omqZa>-:XE+zz u)ӂ(t")t"WOM!6tl0RGlDXK\JE۳.Xv("Jpa8";]ǑAR:PSB1y?OtP}F@3:&aG 3FaF" D{]}C>]){JWag"#E=JQZao#S+ ]XW8/;5q =i67a;Padb@ QK uҸMP͑4i!όfQG̜8bU;aG ! `@e (UN-A? A/9":#wR:A_.Gu׺o xB; qWqa+c[]{l#aA5#XE?P' oz~?+ߴ 0t&ꋫEDCP~N(u@)THS3Nh5H>GJ;a^AE(x Q EZqWhjF^JtOOA0H2:^uOEhGq*1N#BB4:[[]VDr:LK#LPT2GO2[. plR]ZE0Dt6 AA7Bc"Q*, OդߦܺHkո-am>GHCqo__E"`<O0:O VA ZuBn",!Rl0ş)@n Zdtt06un">.u/]/(EjO @ԎkA8РX#^8NUm G]5ϧ#D[ հMS(y,z_A.kGƬiÈ'iQxACJp#:U# 4zkÍ^i4؇|o]Z.-s#ʤt+A@#[gxS4 &{^pET Z#x0gEx"tm5M4;O#"&5#i')фt}f]@v^u)Nt+ZuX8v][Ih6+j}kumZ)/o鷧ޞՏo/ؾ.#Ѝ8(߇hq:OZ:0+J&X c˜%Z+SDe@#t"41J-X㏸㸎ӆ565K+Zutv4-!]lk[Kmzawڭk-x"v<OYE[kxb=](㸹lor(F@_фaEA:6qj_uI)PSR:"+0Z)N* T)݊c؄$ӱ ث "LqGԎ=v»jڦմ.]qPۄKpEwm%/ Pֈ G@xEtV|LƼE_wIŅE0]IR)r:T.v}t64ٜ444GE@ADEB!SsA.( W, (H a8a5N;bx`&1 ": J>O݈"LwZML0EHa:խ[ka_pa6µwUGF]iytvX"X""# -b0t# /˫4EpDu  $4n'pV1SSSӰt@֯B \E!Dq{BDDqe|Ъ;NE)`N 2㧄6d; TNwcإVN;`an.[QnS)7ubߺY:uj+>#BZˠ}&MAWP}tE<&uHDDDDDDDDDDDDDDDDDDDDFĝ8aHE!;8N'#vCA1LB&%=GB(~GIP.a:ml%PºV61-5N=}PhDDQ>*#E@B.N02vq H(1(1P:ˠ}Quiå#R:Ԏ[njMɣ"hDDDDDDDDGġbabaTY*ԧL㦥 S ,+vqbwbi؂+iH"PQ#!gqb""""""""""""aB$T'`@+4 2+h' Jpl&V&B""ӑLIGT}QqsF##EJh""")ODD!"tGф""(#F"D",t"""W[YBި$!a"/L"RGфFb>,#>:0P#/IjKNA)C&$Dҫ)ʰ]JK6qCg$+`) '+RcB* +ʂ(wqab7B."b"*YE !}Db(FQ}>#:dGB#aB"""""'iGф}EXڒ󢷻S0EE3 {DDDq9Sʢ#a)2 DR#ި4}̉a#0Db>#v}P>"_ΈYBTJtuOtB8 y(JCEQJGAu# 8E$ ٮ$t,ޥ, Vy`~A Afv- EQIz3{<@'<LD`Ψ|0d}0E//3Ϣ}EӞGG])G5FaQNFE\Ewɒ"J*{AԂFҠ6#Pn;Eh0BSh调NeрtB!ń!,$i lCP9rCQܹ0AxJGԇGb>tG>]g_0#_00#O#Fa/!a)I.»Z:+a:PTTvGA H h] =F2!.]lG2<@ Dam C#8"=P[< aKB4Љ6w0ušh^an BJB86N#.6ceOF}G.PYEDa#G_TԎ CJGE 6𮬎^(uSE= E;E?xXDuvâmx&5-Jٓa j]0 cChlt>OFۉPч[FqR:gdt@GJGHCڧqGA3 $h|hXA =f .a"B/>_ F]E0)TaAe0iEl" FDb!K^[֟X. 6*x&r:t#r:Du:#t)ւm ITM!8ŗvkq*óFA(&ħdta>,O0#0>##> W"OzKz0}z<&uAzuu#mm B5㰇uV!ƅ_xM.%)e* 7?M4 v%baKmp8A#[o%;FvġhÂ#փAN8f;NBGAC;=,{cF]_Έ}F}FaF}#0Da# DFߊ^%-a1~%MPk 8Y  W-_ium>>:h_Oˠ?a:8kohm?4XI$NO@=4GUWOZOAGMmVz)x]ذ60aq@C% @GHC`D2u q|C5S;;GO~Gk{B<# W (8q#k..G޺ڋCzN~{iSuK(z sHH"EV u}[= &^N=E*E<" Mӏal0vfE0E @Mth5PHE2!a00m}BAW8-Vgr>8ҭ&ZsPDoG]>AK{h;XO>B:q\\ES_|LaU Wa(~WP ][I5axC*5t?I|=pE?#SEDEDSE\NSNMS563\5 leN3^kq]zDEki?]iyf뮿"~A W Z}Mon8kgr_qE{r:ӥ#M uzv]40+kt7yt+%˪.6mb47v88XN5bOZ XE<$ RQڱytOC˥׷[&/'A$_ &9uZZKWt=OE?xv+ ":oIF@]-Hr:[grq+q"x_`#DcI鿪y0"+qP_ԎLC0jh=HZmmaSBڎ: pCh">}w`u{ ?˥tm(i6|z b|Ln=RN7[׾}dtuDtG^GW(n٠+ШJ8~GJE> XNi=+Cb)Sj] OL(zyS+F iGVE;[m} {T~k@ƶi]}}˥ˤ鰊x"GAS)]PpV]ֿ{u\_ǵt_+_[Z= Sta #/w*3p!QxƇ c4?G #yaxE"0&l(J"481U!X2(xcb% [D~+x`u $]e~ ۽V¶~ki80wװTaxWNXnvGAmm}(^aa‘VoR(gb##AG$&uYB.:a?8ի5ދ8Ue"O'A>`t+:SΫ#N4(}hapGÆCL OM 2p.4G bTao[Dy n+0/[LGav+֚Mսl=8ik[QuҷIֶ]{ w.C h5SiZgK}zm*!q*-U8/MבEMGZ֒A#*ч [ IXո?DDGhDDDA0 HZeD3;MBza ;i4cMC5MbXvp*qLA+m">T}GYSBl0AAG^#0tM;:qaL[ջ}mm{iz] 6aP"F)Vz>a+4"⭈4 ]{eфadttB+RDDDqDDDDDG(B"""PTDC(b t sS8 Eƣ>! ! )t("C6)Ԏ][P¦v*)1ֶv^] $JF")SS-JZx\F(k 4ӧ""6*""""".&`}] Wtzpd* L ʄ 0k!i{D~LB.. RvA6;c1Lw{[# % WM)"t5BX[q7"8Ť@ʂHSp` A!8AXzV)؂#G@ƚjG@{ & IhlWQ#}Ꝋm&ˠJt"""""""""""""] ʄuFgф!(s:aL*qdqb<1LVޡOv+W$aB&"H0CTLЈ"".""""""N"$T.u@F5NmT# `Dv"db4:1FB"8".a db0DaEB0#B%C4%}DDD GHG$4"=DDDDDDR+"!DDD&˥HRl*MXGHDȭYwb1@(Db(EDDM7(B"".v5,B(GzV2.DKs4F"%qtaGTaEyZ"S*u,o[ȔdDtaGTRGTayTfʦEI1&hDDJDb%DcDyItaiT""B#TE}(DFf,Bv4uF#(E":^"!5+d)GUyN{k¦c Dv;%;D"(GaDb>##N4a)0}Y ^;_#B84ԉ0P'OZF0#DTFR#>#0"C Naq"!H ##Di+@l(!0a !`"Yv$@a eѴgA. 1є8Ga9sC0E< g3!#a!Dp#]@fY"rk&1 b)03#YuE(G&hEqhE\I*I}ciI7tVO a@$PHm&ٹ%Er)e Üp68VQ\Qq{Z->1Hq@Ђ#C `&gL2:'G3N" "%@f8MY=ȇ VtΨDb>B/,Բ}F"Gadi?#Pra##WZzWtN~mu|_Q޺{VWtozjh(h&uL>M(xE>E>P'A&Ä :ӣZ +'lM%@}>DԜE }U*a8jEz`GEAA0:i2;.0B 6#tcAE&<b6*"Ϣ#F#>>>#>>hD\qN?§PE>;.SMB)bNX"p*m%uzu-S[]}ii'Ɯ~=A7t!i (pwR:G)"6Mч)jlīhrp&b#80!0ADpˈa H@g qN8x0HDb: 0}Q "aSsyvmtq+ p鮺Ƅ+Xn{Qun* xE(~=<:U].[iZ4*iEq :i ~C6-6GIJWN"[wBU94f{ KEwa;M `FBG"dt`(@#08HaP`8u2:8"EȚ>-`Έ6##qߧ(~kN:"84l!OuuHPE?utE )t{޷V54Ӵ;4PL t0'm' XjvPS(sDA7. $\8s[ݰhdl%6" !ވHD+ CGˣwPDyZķOkkjkVq GOUR::_؂)):nj5Nvj cB;^.AE"A:PE<6+Te§:fPgpD|XU1*b憐 ClޞA"ߕ ? SY.6Tng* /* vo[_{;1ЌM FkD};64ydTm|&aP I@zg=]]+JGEV^GA1VAwq`hXN48 6ڤ>6XET`AVZu8va C6ށ BqD8"?|DP(p@@GG'y7Hվ թpwIԱQ 6+ap"@NuAPPd_]^ki!ETr: ,Ne+SSa?:.i]{Ʊ\]+j~y]}2mg쎔.s?3K0ZjlEQ@xE:P^+"iө`ut+\vS؈uu YȶP(hk؋C[X{| kdu] >=ۦv߿tNoZz]BI5P[:..S] 毻M봚5!M[CU} ߏ@^4JEE? ;Oٜ{j`b CԎPEA 3 PE=7˥SƻGqZ0!0=b¶Il$ N VLu`MJE:N {ڻm}m6+KTjcmumrٴ_L W t]3ONEG uuzе+"!\hq# <Ċj:~g;OpEi80{8tOCM2P &x1Aqb(1LS^"꧂2nxKwoֶg82⠯sBOs"'Xe|37 7M4b0EBbPDqkň">1Q,S)tNNŶ)#:KvǼom'V|>ڻ]pE=ˠ+r|wqOXhUE`_"@ WT""""""""$#B"""""#B""B!W0C.i aJpMNw RJSh1^Tv(qōƶOq *GXj}xaaA X"_6ս[V:m8"GDy# E?_vb;ZCb-b"2OJKCDDDDDDDDhDDDDGDDDDYH"ӑф"Pi 0+a.$ 8Et#ipEi" b$8"?&!1,ba.+ خHt]FGVA"GY7FnMbn:^>> f DŽE Vaa3EʴWMYggB9C"#S")Q#]<&PԷ]4]L]0tp Aئ7w1BG؊"C6ظlz"jGN](@BaSo{UF< LB;L(C PyR>"B0e"DDDET;+RN/a8E8R EA'NM VňchMWlSD~`A`aІ!e"#"4Z """(!;|S* (GaGф}GF&hDDDDDDDDDDDDDDE@NP!#]L$ST&5I*jE]!>¡' -4#DwGASmNGTF"hDDDDDDDDDDDDDDDDDGt&JQ3Ll4!GVQ;4FFB0}XDDDTuDi"DiG}A BvT#HjD"}KIeQB0(#(F)CGB"&GE"#Db0R^FW E)M'B""""h>#! GB0DUDDb#H!;,GTdt""""dAM#!2_0#jEфKBa!+ djCcj d/d"3c92"1:T""""W:;%F,Bd.B#@w#ҿӵQ)3qSvDD Gфa#i]Jn~qd:gHv$a#DFވDDDN4E0uC:" B%UjхQF+!R#)׎*#UׄPG:#Fe tǏ"aDNHDDDJ[4B""8؍b#㈔"YF/#"FaQaWF-]""!,Na@aJGK"!1;&iGTPDB! 90~$9yѻ/jGFs>Dc9FlHe"~8#㏏CGUd0#0#>#aF%*B"e04@HDqLG#GAqq)(A) ڝ$C43DNSsLfEф+ݑ|>캸d8 t"6R"""#v!FEXG"] .DF#)M("pЂbU'=ДSB+_NDގX@L#88!0E"mV)3 e6GS60gDqG2C C;2*tC56G<(vmF"8RJzV'ICL Tu~жB'}P  69x鰌9Q#'l"]&v8.E8":-C؉V3vQvv軷*! H`C#qs3\} (FYϢfl4F$tcBfx4A>P yB(FB0"10._҅@SNE#p@\N&IG҄ {tn Xtw) #SNg;/v}E"@':GZ+OnQq1\|7O 5Aa 3 SOWUV7‚ 8^ҶGWEv]QBS%)e({O]Hzi5Nҋ"?E޶bmϝ=9ii]vC>;b"" ؏cB#8I h*ZaDL 0#]IaW"+IɎqtK[CMhack}?F5#7 |+K Xb"*;N*--OB֯E@H#kݵazZvAIҥ[^޿Il(A>(~sN֩HiCIml!ƻEҋDZqW귩(z}9Q xMe H^_zGּ0*0CZLx"u+n^;C4 ߶GI0itaXjJ tՂ)խRNkNvci{ knF. ϪE:_r~.Dt[ۧYa]4$89CVwKFQw*"@ #?O5b#Ŧo up}}!U]1"Acbb)J(`l%il0 -Ca-6 # =:J(ht#4;ӫ]WV+umЮ6=  tDt}# YtjuIW}ŤzF+a>(x"T0"AF+>o;})^v:A 0Bg'PXv:jNE$#"㊧ئ-!cV l/ !A\ 4Cp.#ӗV#BA캢0VҺZ{qE7W~6t] m`ֿƶC8mcmxg^ˠE> Wqa"""hDAaA0LFgS",# w PEԡDqשlQ&ǽ/l{G؎(7 F#b) !cQzJ::[/"JO#TRT2 ˤ[t1}]\-j+TKב uI:\0[^C,E\FP)a80B GT""0L":"^:&`(FRFaS `"VCi #)-\G؋H6HXOL4h&; a}9aPJz}4 bbtۄ -o~, [x@"#BvH>E":@PTD0aa`!ej)ATSDDBuDb0H#ꎈDHDDDDDDE8B",)<""@s8DtLt"M+] @ (ziEX4b+0k <[PpRRDDDDDDG0 1FaBRGфaYd00G҄TH}GDDDDzgq 53]P]P"nPbg ST bP ui: q栚Db""""2:Dqq\*#³ˡDZe"" 2 ! `4"2q""WTX#O0A'cga0a# #L#DDDXB"2tM!r"iX;Q +QB\MD"(DGz"XD""4$I8DhiVR"I(D""""&C DiEFtaFaFaQ(B"""""tUЈ%m0R#HDDDDDDDDD"h#Gфa#0<FMKs4JhDDJhGTB#0R>DDDDDDDL1B""/f@ΈeߣGpDDDL!E UJ4ЅT!j"'cyMB;:!H)ŪO yaFB0/aE 14Յe.eD}EꉺR%0vJ~""""*"#Џ%>d)QM1VDesR(B""d(E~VH!I:(E:0 H"(qASMQa#F,"$",Xa"D">ˑGGˢ}2r>ǦDv#D_0Nf_(:FFG|ZqhDDZG 2UGTaaAX]D("JE:]&)8wrq!!1PBK=j7Y b"rX˞xGFbF":>NG2R:0:#`"c#h/AaDtaE3D#:BCFN-=GD"0uF$-U8~seфaFc<#>4a666MOth " ѭNDG#z&:8uh;Oqz*CABXXq B cB!!>@>E`Ϣ|/E.B"8e#tP"x/d|>#0#0#ꎫa~""""8 O]%)MX""8;.y*ZAAM:BWAN=<&<&Ս nN, ,0[JB06+0fK6=ikvo{{Mk[M}b<TB\ l0A J) 575>-m1*n^<P%T4klJܧa0A4#("3t(3.VBXk G#b#Qi]C<0D^8$NXy'+P9w?3h0({V""ЈЍƷWWZ|khZǯVoiFDˏZbi7]]C^CM< ]C[)VնH7OVN*/ AA ;A3eF63V ״kq+5DlS]8 NM#S"pJy!)ADcidtial41fG* c#2|Q0}# ."|/E:0#VS! < |24*֔ΈZE<# %Iƶ뵷iZ[QBﰩ\4_+ P^GPPE;@0 [q8AE_l o>?ylh90TvF)'򶘄lPB!ڎF! AC{<0.Eњ#A0F0a}*'{Vucwqhxω FߙWv /Ȫ"tԺԎR:O0E=$Akb[B- PAGiN(z)uWXA}nIV+(t{la6-MxaT*!"n D Q)8 v]A N%vTq.'N!_ѿEB0.Pvc9C83c8"=vEN ik}8Q_n>B85G<-]7~y$"X@fTa 躧[U!wƇ.C Ztum&"80pv (MA6"@. Ĭa A6 ^fhPZ.Ѓ{UFv#U:"cϤw:a9QPu{#J+ X0at@R:z}W*Ӯ_ƆuK Z،qq_Լ#x"+,O'AT#F#BmRL+{_E XL"æ*'"iT ?uh.ufzsD+0s?ﺳu u:Ҋ"X5wߡ*ٚ(HTA^GIHpDG@ta Nϥ#H]Dwn>58J.:#qq[.rsMAº a Wiqjqk{zvQk]K6oOӳi][c.O("]PD{~ˣ.MHa^;":8B Ƒ$HB5N8CNIE=<"GF^G@zfDcDw}ZB<|aTDX?(}A=3 VE< W)"Ez#}OGAjfAV vˤIG^GAr:W.u X7߆#^[\u3nG^GFdta$+m;)}v陮躨CTB5c>:;Bs "uq@a#۴>i#X؎5-".ȃ c\/0ŭcLQAZz /I>6Նa,7.H Z[t8H V_iPM WxKSqiƺu:ݥcQ:\vT(E֤uPTH":Mu׊B"߂KKJK@.AՆat]]'Qn"9Hb%G؂(* E @/bS_ B J|N;J$b% ZT*,j: c +X1®5 WP]k܏4 WEMa] vCէMZY_ W #E<T}&CHLv`^*qOQ.!•0)"EА:$p>B! ͨB8a39Qa gp> Avbw4ĨobgE=0U"}&Bcoa{c*աn;l$-6 ۧIE`i Neфa I6մ:6ՊV,!h} mng9{Ј""""8ПNaNP"*%ØF}EΨ )Q0Ϭ•l# AulHaa02FaB"gL! 'F7ڂB"+0 OhBYqFD}H0l[wᶽBl{dZzF)Ga a,ޡE|KϬ0)Q>*&+ʂaB)qAia D\D3B"B,Bd 2Q t@'bq;@ZTX([FlC⡂(t8=bWZL8qmB;H"FB:!Q)4P00#"R B"""!DeVR!uDQD0#>>!;R#DSuGфa} *H4(FB [0"a"""""""9R0>#>#0#,D";SG""""2̈́6RDB"""""""&Kh>aGB""vuEQardDb/ulҼFFlJVG;D_!4P}GфB!er'aF+#"Foe:% V"!'eDDRdGH"AB&C}QEmW}:>h 0ADDS Fggdd % "a )W]EQPo+ ?%ihJGTP#Pe=ZVE%PuD">FԈbSo Y82>S!EAG)7Z206G>_>Ff# I4Š"!D$"0>ChDDvT;Jg4T4hX!A8g" pQ 43X%D U 4##s3Pzxϣ(G//@v])aDx:="a]EyaE0­0qhFD\G4})0 E<>#(GE>[Pr bU G㮑#9OFh^v֞'m[F"<;aj5OS vmڠN՛M#aHb ҈c, aE\I>!>)\#Oc.dxaFs32t_u<"쎌#&aF|0#0#0.6"dQ.""8 U}:VK 6OB\<&Blϟ涧4]k J "4X"BEhapT8 C&N 00[.Aۈ-Vh0*b! lZb+g8vaE}^.2:t|+?E10#>#ˣ:%E5٪>"•z).#"G^[u HA>_'InZI ^L(O K4n 6 -f('''C4aw@'acgfaFO0E[IF,p|h"?qa=4L Ac,NCb^ DgH)YGG\Fc.#"}F7C85n>"ӋqVWawpӅEEp+A\"4Jnt,& !zzDDG`0B4=Av>9v懃(vG"?z)Eq2A;Mc[i,F! A^ \3]у0grˣF_0(DMw+(z{Py: k[ۂ(xN]Pum+W ~40jDZ,!:o#o܎-ڬ.(r/[Oi_#ϣA(}A=4t#]'CWJh'TCt- $Nq8ԸmKv"qCńHGhfD;#CuMb4;Nab!b"#^Ө`)΁?kڌ*_ }R"P My tDtRf+iH\D 1juu[b7bPOW&Wiá )ҶK `P6)" 0A` A_ VaZ5D@хz0sL" Tt֓=SxdDw]]t#aӈ؋0J")&Dt=:xr%bEC໯GF GDQ [+k6 :iI<+zh;;poWl"8MTB(t 'E?UZ{o j >PMn>QA?]^߾9s]OBaF "n 'DcX@ˠIS˪ Tҵy' Uzt}WjoCDKZBiłƱ[e6P0z50@":# 0 Vt]H4E8zx!ǵl1"q CXfz>uF0A0טAO#>P.:SHZA_}r:FבՄ )NE۱Nb#Nئ%: Aɽ"?Рt>ئ (t}#6&MҦ4Վ!`(1lRbq4-} +][P?0A5lXa>L]Uyt=3#cbӎҮ}pИ[lP0 EB.t]'quB;5b#ć Pr!e D,!D`DC08DCDCCCCBab! ئ 1\P"lQQ_E>PʼnC1qZ){@+Mab)\SCؤ)XmKXIp`po)ڂ)L& O#@w_XpPK }D"0"")"""tB4a4B!Z.# T$&BeyAe9DD2!B 0@!C!!""  SPDrð1N0F*cb FǶ6 SW) ŵx=mt=mJ4مX.Uml!"; @FF"Y*'# > eD+hAtt",)ІP !  &&jx &'GL:he')ӲCAqJiV?b]duDxE ۢB)HN""""""""""""""""""4""""&(L,r0AT&R-2&P@0DE  a !8eŊiWw Q1mI  "8tqV4#IvɢuE >#0!:!EBO!0 EDDD&;XF0"[GTwD(GuFI(d_."aGфc9F2<""2DuB"Wt""acBt4>aX?BMR,B;EQG#0PhDDDDDDDDDLHb"W"#H"uFTB""""""e!H>#>(DiDDDDDLDEF#0#ꏣ0iDNB0"J*#H!GTP"P*hMDE]mPDD "R#""MőM)gSB"%rB"aQAQ B%s7aGф}P_DaFGHE)b(E0#DDDDLB>djD+DiFM]iB"4#DDiDuD7!;#!`Tv "-E)Q60g)B""%"}PDȚ6B&h!&0)T"("R*:1Da(FR##DDIZ;B"B'fYF]M#ꏡnRI(B""$غ(DDKuVB)vt}EaDb"a)n d"""""$KB"""v "WDQB$K}#}FB:"DDLQF""%tDGT""""""WtPuB'~B:0DeV%#(B""""%rTKBh"""W[Db(GTaGB"W:>)6 Ќ#(F4B""""#ntv"""$tP(ER1"4#>#B"d&"B"#2}QF#DDDDDDN(DEQ!taDJD"""? 㲊H6  Wk1]E):%8u98_.A8!Yf'aԛo)ʅY.אb1Luv+`-Z)e !;TFHGiDr)H#:-өd#""$ةKu$aDDKrTF#%;(G`FN}Jh!&>F"Y !D@٢0DMRljKqtvPDDF%Z&HE $EB#-BI5-0h"PBMdB#JYXEDDKp4a"} \F"%tJ#.B""vE"0!B(EA!HRDDDDDDQK(hLKBZiEK~G#[%4"MGcőd"MΏ}%+FuE"adF"PfZB""WK!ěEDDD6JI2F K*""2ԩ!HK4W5dtMEaP>ˢ"fBJ4 dGkP.IHa2}Gф}GD}[GTR!*+;TFE6i^Έ=B D뉍NƑ| E0#0#:DDJBEڝE"#O Z)jGZG.),DDDF(EaD(E"(D) Bm4DuI#N*.aRtB#3 aDX9l"۪oB/C #.E k(EM`,7-mb0$dtaQuGфa("y͢ duy2vuUS'd|E쏞r(GF2/|":3Eь(ˣ0#? &aQ"ABM_ XN."""""[(XHąd"0R BCU8! b0C)Ɓ>E5BsPC(3F|>`Fa3(Y}dtGB G]CTFD׫JxA"#GjFBkD~ơ;% BivjE(&HH<'A AA#|a8aD1BZ} A`jG~} r:!yDRNI=Xxa|'Z:' eøpDt— $P麖kq8#SM":fHD݊&7EDb k6QDч(w  8"Gϣ}ˣa)aEt}$]FP(Gt#_nF t !In]'^B ]l">jFNPJuOTVM<-!o B a`0PXBۤ$\CB 3Xl7=v"40EB.@$h㿂#TbI kCp?)isa3|Gg1ф}#¢E>P]pj?zl|lPAt*7C :ni8ЈI ]M& VP_wPE?C.S 0YIWh APlAMcHl(H0avsFp0;q(pExDu3 HxPˠ#A:c Pz-4;J,3]3f:| Y3Etc0#01D"UKe_ˮ.۠E<@:H^C^ޱxEAVXд;I J:xc8mҭ*7WuU"X"a)A:Zl(M+x5qзo1Aa`أavaʆHS&3хzGsAAP\A„0ȹ * @x"wKt|ִ(.߈")q>%{#ݍ}(yA>u)G^,a,0jtCjGO ;.8B*☏b8 ]_莂ENa("Ժ#Th#Vt!!x'a 8a˦;A[EFpDxhPT7n0ƒh Nݱ' ({]hP -Bt:! qn;c\P8iag/%[P]1(x@H+0ϫ}cHw!x.;UN4.߸O)ܨj]+_uP߷H\\qqO A c]h -4G3Ūk681>LAaxd oRDu~(ԎR:');O>AO>F=7FtE]CEM k}ձE2 ԺKS("`x@aa0|:] kh\a==$ȣ֟Ih${_=ytPn `u:?",}E9C)*- 7~iQ*.%IMuQvuqXǦ|1Eu{ X))# 0nNHP\7=sEGeB`e}N0;"aD32!BB 5S<!LJw@C#"8ؠD}AEjY;oL0?ovC-'Ål%7}]dt+jxN;TiԎۦ.IƇtϢ.PR:0h W_mb4"vTF TYQ>#!j;  Vgp,0(t""""" &C8DPJBc }"<0 D"')ƅF:^IWظ7 m'cj!& C#GFw]}ñgc+\8#$DR!GTS9EB(EZEB0>!C]Ph2ІSaa8ba4! ɺbbJaOfVTG^V" [a&GI ` (ACaPvij-%tӻJ{oLG-4"DDDDDE0P-E•WTCB@pL!a2!!a80BʀMb ݊v "DtN"bxl- '`ۭi^tMnAGMGV?+;BHDDDDDDDDDDDDDFDD E (E a[ЄT0*0Sg苈5 iOj7b)cզ5#E8+-aob1ai 0PL]\;4X"""""8yB T*eC)g>;Fw5 MRDD";B.suGei!HDDDDDDD@ eyQa H{]2'jh">ƑaDDJhD1lDDDDCQGaؚ(FMh%1Q:-)Uc&讦"(DDD"B8K'#;4GЈغ!HDb!aDVK h"%ꌉy;=lݘς"1,DEj;DQ)aʂ:>*ApB"[#>J"dP>>#au8".j0]B"W[Cw}= EEP][J-$حE"0DVݯv\|!Hr9t"""d#;NM@H0>}Fq'~}G}QFPE?0#F)GTR%!jDj""MЈAA,g/l $NB9D~Ϡ`6Jb|y|:Ȕ32sˬ=:|P|0"a_h  %@36CTvᜬA#BTa xGap 较L gA:EA0GA#A!A$CBCaCB(2>>1}?0%ڷINQo&pEBtiXAa8 a4mYGٳm! 68C7D#@h09NчGq\0vv4#H:}V ^Aki~Ɲ[m&¶8YCSJ҄GQ Gy:Qi(x"P l(AzHCMZ |DDDL!Ӆu_]G^n5;m Xл8ڸimNG[i= "H6a1DDm!+o.+Tu.0(}/ Si'HtwE`aX"V X"$фF!xEjmA!|E"Ɨ""Wt}Q,Db>DDDNQXEDjk<%_t']uVr?coMxЃ qy">8_O-::l^("1D"""Wa#"(B"eEMGB{I o?.^]FKjj Ax Z ]t}C+])#-ΎB"""""""? 4i5eGMz.tXӈk~8k;0(@k"FTф}"%}FGdnR=:^\+{W[VT5#lOL"OUoE:jݭTSlRńKt)ct""[D"%0DDDj^mDtiJmF4pv¼<6a>j:W[zM{#˨}AjX;0&գ"l"}CCMunĨA_\.EG&!2Oߠő6%PjϤ#&:c#ZGDtt}0: p. EGSIi+'%HDLDF"'D"",haJpgt" L":EAQ zE8&xw !S!6L&!AбB,E0@! B1({p!+,D) 6E">Jު""""""""""""""""""8+X"+B EEA<4aN:.\"t&q„@g \;aDNQXB1DGDE#(FFHDJ*":B2ȑPB""""%u4B̓#"WGgEb0(u4R+QlDF#H!+Ȅ}>]QNYЕЈDD&YQi޴EI;JE"!t}B%rh)dXEQ#"""[;wʰ!HJԲ!-(\ %fK5B,4uFJHD"E"*h E,hDDDG2#!"eȚ"ʨF"""#-4vfAB )e B$EDL} K(h"DeDJh#ZFBT"%4}D"-DaB"DJH#>##ф}“sDR"JDDJ䨡hB0J"(D"WEaQB,B""WNH#""MC,hDDKBDYD"(Db(DTaEEa -(BMD&">DaH%##Q G;(B"""%s4uDQDDDF""""d&"XB"#SG;FXGT}"1:X"""""Wɣ!)(Z0M6SETJC,I4"%u5&h2B[" %#DKrTE,F4R"P{EDhވDJ hȡx6N+!2Duiiڝ"n7fF3tDvWKwGۣFd4% FBHP&_vɗ dD!x2amh\DZi#@⹑|  h4"4DAQ2=ƑB):0G#"(qWa#T3TDb+0#JG:r-5+~M92 e c9C8l 110y$"tHGT]6>@GфKQ_DQE .#@0:x@D (#Y3FW5_qN03pA@P`@#@!B#B A0A0 ! iAF2 BeNpG׆H&#B&Ѝ#^mQ(E.aFB>GEa Dt $)DCߋvzCqи4!a=B% g4qA Ǣ:1Ѓ?(pa  a<)L ˠð#rs* ۇ&=1(`0DR#tYeфP}A0#<:0y [G"mDiSU0] ;qEǚAԸdu. ;Ph=9C'z&\Q7 u(uPDzhh8"=>4ջ'MJ8AhqACADs00it3t2,eш |@Ԏ3@|pbcB60lLeD5B=YB'GDHYa#Qth7'PhRqKviO' 'I!$T5H: B @-#ox@S]A3l7Fe# hrS.FƍcGdz[aƦ Li;; a0 0@In1 f !E<g#ACuTNG|&f dU&F,#-{*_OH°}](4ݿ; [񶽄 iFqTƜT|ReBOC  ==:Z*!m ѲhÕJvQ*!{)Ν\P C!`8) Dx| $21aD"} B(G\(]"aUmZOƆ{{Ct+ЄPVŮl}wMmZOS0k*9$ E֝mzNݤ #H~nH+H^ uÂ.AP@cN5cpڦu+?A0y{zQP}ҺhqƱq xU8O_#aꓤXmLp'v-߈MlhVa2Odov#' &NOӱxbl|R ZA(u (i0StamiӮ Vw&T[_q{?~XwkA.0_ZGG,N=V)֯_$ȇ}X"hh*zOݦS烸&x;hH}B.ЃT AaCDu(t[GA~(bPLLb)b7aAj%?V Bئa(a>-X{p °5@U$vPi=_aXJШ{n)65mG[g#E=43MBg՘@uj?[OUV"8#߈a8DDDDDDDDDDDqE|DMHfZa"LPGл;GAp25\Xb#bjݧ llJxp Bzb1b PlT0JWDt t]aՃ"}C]5`=8z[_TJ=ں?P0E=.[ܮa$vDuGa}RnhhDE-2!jPUOhE)&bn5[.;A&!0V߆[}շ{V+taf|VDDAa,FTDib""""""""""""""" e Tte@AƜ8h;h;1bLV 9 %õMcW8b+DE"0DE"""""""""""$")!R8k ErS$i){U;{0 0LE֡$!+!; wkeip*0fB#2dEmE FR#àJ GKl[""""&Iw Vj("sE-"F#CmyTYtP"痑G7 E"+"oh)L+4DtCDF9㨈غSDafB"D%u4I$!pRe1\@"z8#|x ]E(E#8GE.Hfhnu3Rc VadIP."#d4uB%a]Ej%Ew3;b3ho`L4b(1C#XjqCbg2 }|)33,C쏟f3Dqw"6m B0x a t>"<C!PL4%@a E@Dt9N'EE(;fpٞMFҰq-ӣ(GFdSGHMRNkڤz_Xж'A5p&7' ќEhG'3nD:0DB!+菢FZÂ#GAp">: Vu)-?njivKHm]"Z{[߯WB;Vm+Cx-BJY^]]>)ґׂ)]oE v&"1(C=O?B0HTO-i3 U-]~Mju^lV-(xb=b"""Yh¯_KIjj1 ;JFC xOG܎E;.-uaC/GNR:- hE!{}O}=<ʀHÕu}=:PExܧD8vPq#DžGBM֐f^z۵|.녏XB]|!AS~nh( pKt聣!֫UXt*;Kikog0uVկ#byroDuB"?zW֯n>7>~^gI3?||G]}zDtJJ>"C>_WAMo :][[I=z}:IK"'aHEQ ~;hJO VAM +P=O]/W5(4ar:E<-\TKpELOn[#aGDaQB:"4E vÇ)P- WLl!QLJ78鈔%=vVG1QQ "jIU`#"""""""&D Qa-haH (""48M1-DuH!+7%#DaaDDDJEk#aDe&*0B;hG̨2&*ˆm`4a4}uG~cB25F4GЈr4""[GDEB!2%RlD!+b"MEЖ"nnЄVF"[49"M"D}_TWB""&B"dtFaFs4v1"2SB"""W. ڈE) "F(Db#H B&ĨDDDDbYEXBM"DI0ZbltdQ(B#&ޏPDFa4aB"&FhQ-F,FaDr>aQaɲ(D"0B#R#GT}QF"tPDDDDDuDiGфPDMQKB9B{#42|ꋃdG(]!ˢ0._/#لaFaFaϣ!B;B"""""""&PDF"uGB(GTa}#(GDDDD"(FޒIꐧXqqDP"bF A:rH5'@D?(2r/E/Ѵ}GP(E00DaDDDDDDDDD"f#FaEFR#IueT)0Pa2::(sANXM$E:D#POjҺAQ"i &ŚJFvl:FR>Pb#G|OEaˣE0"aڢ>"Vm]D45#І~Ƅ({e.E;7.SPF;.=1蛞9"?IbtSqƢ"҈qb/ce* ̛䠨&rNqr7hx)ANtANRBe+ԭE *E]> a#IׅLSzo7taY>0fuG!GvzEg[DQQ]E҂eC8s:",wL)C #-6-139tuF 'B>}t}F2$"t"""/ J, VP# K N,8)PpR:On);i!x:sjzerE),E MTaOR:>%A"ta'фaR}/~X3֩*olX[I8zuFk.m pD]!##Xлݎ*aSF W]`.#B D;O =WRR:0 aF3°+.# A)G]L>]TִMZI=MpYEuffE)I֕o[}.]nMz^pZMqa%i8a[1{n<*O# {t/#GH3i 1àE;<CkUUCZqq.= +ł*'R:o;V?:9(|RV,0qK# SCS}6=">/lD-an"Hh1mPCN :]A]i@_.'Dta%: C_[ r:uխ/!U]au[k &pt"(*p5!HQ!"?B j!hj,WǤ/$85D*VC?׿"4"l*5Y(UCL7kAȓafz&})%yjI=lGVE 6Ѫ/Ϣa)$naˤltThh7a:=L!3j)\}$ lSqᆒTQG@P"E8eG@0¨a *=˥}u 00:&a(ux@ZT-3 vCBxwRx|hG0R'#FH[#P&T m[] :0qD\8D(#D~Cy:X<##I2>\!/гM!ִ{*&X@&gѝP#EM::_~U+mЊӌ!4+lmu0z D"pʀX"GI%Q7 Ƣ*EjGO25fEzS˧ŮzkwHvK zY#9aʋ0)NlOꫫž#G S]쎯atCi#Q A>w*JCp g5QFzAU+(\k]556#'Z448 pӠkH{t,گ]'IB+Q0qhGżoSEO _TviVW8?FR#"F/Ei&+L M ([c[L%aTk⣎"5CWIiUªur QDu]aBSmc5N!VMG@~ɱRp.#] ህ1E1H! j ~v-!*hZ CP@+AD#=0T NZGZ_ YaQtaE~|ˣ0,SE@j:">#ޒ;3QhDDDD0CΙt8Flç؅][Jh8"u[ hj#lBb)b!V#X *C0T„ ȺGB C)S(qЈ6dtIŦ.Mb-ЫP#LdQP0#³Ј0DDDDDDD3^PVDa*ʾa3X$u))H3Rb'TZD\qq])D]LETa VNxZJKD#>aQaGTDJt}FB: B"""'d0#0#0#(FaF}FaEфaFaFaFaFaFaGBDPDDDLQ7.DDDDH&GeE0!MFF#>#>>"&PBnG|GTtFaGF#(E2%B2lDJ;D"$фK} B+6[DblHDDDDb%I 6DQCUtPB"#H#(B#&TFH"h2GT"""""'d#n Db(GB#H)0!GB4"'~TIe*>Db#ۢ%B"""'cHGB(GJF}B0RPB:; E)aD"#-D)%4}QP"1# #B!DDiaF"VPDDDDDN"""2l,4)!Db>DaF"[DDiQ&hꄮVфaDDfKDN"Qw譡0DvtR!2DQ"E":(Y QaPƐ!\t"""WDiD"0Fa"4DEЕΎ(EFHenavDDDDNDPķ%Db0BDv#EDi-Db;K0 6uDb;DDDD#DDe|F} \dVDJH0:TЈ"%J㫻qtUB"d(EDDDDHaF̅vdFFHDKs$F\M긶ѐD2 Av;Jb""OٞAoD)v J!@˭A%nU)H B I &TiY,FNꏣ:##+B[2aM#*u~IiVuGfBaPVϻB"va#>F"Jd :±Qq;(ZA=\whDZ XDb."h:0$ ):)10qtHL+)AH(!PPBeDtQL>9Pw)<0uF}ˣaF}#"yEB#00#>#"FaGфaDi#OlGKH!DDV(0API]HDM?,*! aPHXT41@tirOŰCc# HD^q:tHFG}Fr:>#0#?FaF}aQuYnUP:Ǝ&aD$E MЎ"!< W4E#@aVGF})baYdN ߪ'Q>D'&:H҅kߒvCj({ uޕ% &0ih8A}b: 6X&*NN2֑8#"ÜyC‹ t~i -kbpгckc lHFn%:ajmUP/BA !j„H Ʈ!hz%#Ͳ0fF]R }6a;"DXm#jD=pd|r+yu*?K$/(~v}5J~8}{A8it&IA<"MuG"7(zuPNCa4eһ;Y6XaD 0a\0;PX@"nчqjtC{Lvp N4zQP"<{E!pW"7t"i!-b} uO(uptEM?P}+*!F|Gk]qqڑI`xP}x" pEjT(MNnlli7'cf#]8"PP)P}nu'D6w8\SCݯw]P hE< ˭r:(ydu)6A~mTGvEV.Z0K"H PO G: @7Wv#v8wC_(tk[KZjWw&f1{^r͘BPDu)Ў{ wxErܨ ~* ܨ }S)"GN#?Cq}.:(I-mDZ#hS{X>&VAjB##@=X‹klL_fL,"IQS81q:tŻlBb 1vŴa.PҲ:Jj[KvPOaE9ogł*(_TUUO1-dzNYϡowG$mA(u"a] GGe@Mqw %c,r^wJAGGZ+U0l Vq; d8e9)n0'(h0A|ӆ'_ڶ?N)t]FE¨L48b.XPOUe:>)US(y^1V}Plc] mb5J;wlw'FCR:A}]&7,F8?,\j]!%D#19AH*ʋ2a2TPTe9ӄP$0 8L +5]4&GA,&d-?h4tF>a…T :#bE<ߧb0i8m6Xv+m&[ka-/SՅ(zvGZ N(yAT} ݄/c>"aP$"ʈ" . "_""8ǡ1&T&WA00DtapACN΃L&jV$8 kApW,VՃԎ}Mn0 OHC47mS0 QAc# VOҶQƉƇGoL)^eQC0"""""""Ј4!PPڕʀH M<4S(thii!1 (1b1*+qQ ,ƶtVa b8_b-ߥ_]tˬ G](~$] 44-FH"wPb"""qu3!pEAP&v) Bp)! 45A2nX}-b)ujCmZJ֮l,lq{JK:bs#]LHDDDDDDDEDDDDDDsGt.)h"+E@">pt&A1; SD~#3 V"G(L0J‚A5LP&B"""""""") ]gEtʀ0MB8iÍSQ)HN3aBa8غDDGDDGE@B,@2 M! `NB"R:DDDDDF&A\S)pBAH(!EwN"4)_!:(DB&Bh!"X;@ )`2J++pS9aZ2qJAJWS 0 FN>) P TvS"3%#4B!-ő}Q""'`hE>E,+R[A9EH(Tӎ2$DDvZ)=D%Da%WpEV#j'R(e XR#E%!O!r;QJ'Db;CHW8#xCXXJ"TN?':n"} af1'ĨndMˉĹ)ty 0:0a.hO//,ԋґD]gP&R#0%Htzc"IXMhE$t,LEat*%*RR2 O'A tdt`D[B!L$ (( e ːC8G :ء(h0SsE>}OP(y_>#O>#0Sh/FFTGT}Y . BU)DuGBE 8B*L>C(EB"!?qq6El4̓fVıO ;Hc[8qggqJF4@ H0E<&GQ,$C.-aB_3GG|'.ΨGDaDb0#/܎tPdq"4a#:0#{8R3'ESΈ Q}ONC5 ƛ Waan˸'kb.8p#J5f"w-ńN:݄PŢDŽ S.S N_x-S4,S=Xb*x&aEO9}#0gB0FaAT: 6#K#vaʷ4 u c-^ںN":A:OHumAmDI\A<фa4m3Amyckbf㤅ya?q)M 9nqTyX]vG^GH4&u@XEBH PQCqcv P`&NyvGZeaahaG0фaFf}QP#0\A xF+:}VPTp冖5oKhmact!CTI5tiƕ'Ɵ_i+_wat8"8Aqh;sf lhca (ٛ>1f͎'z4a[Fpbq쎐8yaAP0G! (,n11:h% N 2:>s'EGGь/фP^{n3@@o +_PQC*TH+]EꞨZLtb.JzzSФE=(t"m n *:1AE5B#5068.mrp4n "Pġ0q ! 00bL!|g8{ͮE 0:DuMJ,!􁑎PIta(Ik#A莡)TAuJuPl" ¶]-kcX}~y*__A:0V#TW{9Sx,?C*.㌱2?(xE8|::.zKM!xl;I!k1||St>=pq"= \qp;XO{]_.uX0Z}|wK^!|_A! ^GAS8 PpO-Ԏ5wT;Z]Ôu[.?xDo2!ܡ]Z+qRq7]7 E<Pv+A*)PBz@m[]{k뮃]{OYiJ^]{jVP!\FաQT- %y+#:T;ˠGyq㍿p^Z7zbiw)ʅ{*Oq9NňF4>1±0P[P0MaPih0pƻ ҺOPh- $}avam>׊ޛShKu#g*8DqȢW2P怌$S +:aT:t!0a8 b,JpXL ĨN!Obm">,1RG! =Q" SM":v v )j T:PznPO]AoZSnsj8з?C)ODt6, V $(yPS) WDDDDDFDDDDDDDDDDDDCb#ԭJBPVw`Nv2 "0@ AT _aJp !8Ait5 N0AA.,B!1 ؝*c@b®nGA<:`MZMxup7}Q]'H0ѻ#9ĵcAET8464؎Qku# HTDDDDDDDDEDDDq +R"4 0EWeA_]2]"t:R:gpzd&aN* DJS W* `0ASa<&+{M^bՌ,CW+ R9)A<O0ˠ[E֙鑥HDDRDDDDD8)@#AS.u*^MPqFh1B&bN!dt[@0E@kt 4m\Hm&F FiHQQTqeDe * E@ ` GMB:E@"8E8"h2o!Sl* B SG)L" W ,'`h$ظDtD"hR@s3"PB*.ZބCl&Ӌƃb%u@yD}$uG,!۠E<D\DDDDDJG9+ʂa2+* Q# DDDDDDJ|Db;N}#X""""""""""#DL#$EDFΉB># 1SȊ#;\DDsDDD"A DDF%sr;B7 :"EGTa% \ RFF[QG͢%5F"%x"D"(Db0#0PDDDȕDDLTE"88Da":]Fa#"""""""vF"(>PNۢ1F"3 DB##tB#VGZҸ8%Q%qB#P0F}"tkD)v.;:!}G"4"""".#etad"% Bj-P"""#0bR>a>2 0""""v4̋uFaD,oq׼BO#G^Iv+2i4u #&=Dt6!Q:yJK:"aVhDQQ#MiD~o(/23Db(F}R8BԏBaf3ȏ{#lGF"(A AP}d< dUC14.b%StGH̺R|LjL"!4ͣ$"Ϣ1&mGфyGB!B0#Y&*$t=W׵:GDSښ ɞL؈)2f"='j *hq*.-#[і9N /*%C=ٝapDvP`08=!`jbAe@ˣ eс DtsC2{0e! AF0!a A q&ЪB!Eet#0"1Y_a*DWAHÝ 0_vǻ6C?&6am 0_u(xEڠl"6#@Gt0DyN0p,SGؤ'1* E:VxChBE =gT >?s BϠs1(C˼*] \5#&h#(E E=":0:х5B4]&X@SDu)]t] +uwnOWV׫ joqKzqpm&Mx$H7[`o#R@jl آ44ba lA";8ea2:0eх00D\3_> DS\{uVF# ˣ0 E?S(Dhq5Bv(T|B:/K 0E>B(><.R:j림v qhANvPWLhwz C"kt>M@u)XHfaց6 Hwħ v00#@ e֤t340Ԡ}5#P"S 3OOhRZ~qoh ӑDuta[2~ڧں !i-'x&n7 l4ao@uؚ62q,GX)DŽq@вa"8a  >=,ΜEU!LqD׏ VG O\"GKJH Wt6X!DETC>ˬXUSS:azծ;и6 O #V le u["9P C>d049,(eB55La;t+ FyuMG##x*0VT{6w]v*qFkdvI'ޤttPL>Dtb,5MBשu}ya ~wA[1IC$&(6A.UuGY;~iX%|D{wL\D]s&Tt6Pw* }FDӴ9%/Iħ;IqeTqBi`x@x ah VaIMk)CՌt޽., R:S +ziQu㶂 aM:NOuSSEEz'K3뇤6h8hmFCb#ӈks5WC7ּ!p}<YzFa4|au ?p@>G@4]o9PqF*BB"-Np2 > ez([u(pN EAOpjIRJm6T]"*bAS Cb1!CXb1 88`GA(dq`…M[kUqƛjƜ|]+Hz<(aڭy E;(#Pw]4ʀM i4[Ŋ bb"OGqAb{QG!;@ L0Tv9'ڄ k#u: "F"wB"")`DSb>tF"#$#DDDDDDDDDDDDDDDDAB BixfnT-8D}bEM1~,W0`` +NնûXۋpUD7""""'kM؈"""""""""PThgAI:*T!b!V% BUpئk-# YB2N0adDlDDDDDDDDDDDˣ 9*5L 1-JzDz TDrD!hDEDȚ/_0eь/EьuFSF""""""""""" C&RЈ!dr#>GˢaE0"aFaGe!DDDDDDDDDDDDDDDC:QB::#PS s;sw;92l#Ga.""ʂʋ* * * * r* * * * 8r;sa-QR"P7 QF!qh\es(#Gd>2;B"""[n$|P0tTH/ƼB"h"0 /^eZ#HFAiG]y٪M1iަF:#":%Y Th~nb")ugfAYa:0:ʄP{靭Y3fw2PB!!eфP"0%##t}mun"*"""8ЊXRt}@a^JQ0uDĭ"""".4Ў"NB<>#>d0m ,T|UDta'FHƄZ 3G 'LXLB#DDGL~L(FDbey]0T+>i"&psxAlܐM ߲NR@A0MlFƏECѱAJGA8fD0SGF":GUÝaLAFz%S[%= O[!:D3#!GSGиb v0 hY gr>(!.G2y)>0E>o[nMo4haX' l V&(pZN(Bwv,PF A;Dr;p](@ؔ9uܘ{Xx8">m(l~:\N#zs/p_:ΈR:r/SON)Qڂ T!u]C&'&޻鱫 SI L A@3 l`sCD NJv8w gmD[!r:GC瑶Oϥ#7GsQItaq&_uu Z*?Cqb Q/ ߫)Cqyֽ[SCV"ӊPccЪtPPtm+h]kA #(L4 6A@M['WA9:u ʈ9WXBXCѽ=ќ s tCRnR:SԎ$H ^"NmoЋڊƷ8KK03/SI I{M)ն#OVnC>;ިkpa+I45|u,-+}+L:8H##߄PAfh>oV=_ T_פ6)4"\Gqioawͅ'<@u@E=mewNI;Hk؍w#[JGTdtOZQiq Q@O>eYuPI]ni]E[IV*=+،SjY^JifG@z)hOӅ3X@&8?!F'e 'Քw;.FsG)@Duuw ׈}x Odu  hӶ7*J08mJ#P A`+a=IB6m&= t5.~imڑצӰ|v[5ct;Xׅڠq[^gC?)gݟTi=ysEnT-r:ZqGA~GXen+"Cty)*j׋ =%ڈ;#P@PE@. N؈K B!lPiDtmNb턻I`uհY$2:L0iVdtE<(d~#4 $EM4I+ltJIzvoX_[3B װ7}z" lC~cXѺ@x*/Q8" ܨ*>+蛝DqD0""" Ha$ Td >#hE: vNO‹#J¥%:"<ġ1qn6/m l>]v]):L W X]< Y֚muMӥ;ZҾ @KAEjA#""""'fJZ0,#B0# 00T*EDDDDDhDDDDDDDAD! a[p@DuEա 6o[1F"G<[Qx Vˬ YM(t," y*IҶXj՟B"""""""""$O/"0"|_0aF:S#+0#00#0H#00#0#0#"hG'BS>hDDDT4"""""""""""! )":aaLS ALK}6cavt11lF8ݡC1"eBu)t ;#OP¨@0Ot+ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA!9cR8B<^#_VG|_/E|c.+.<0,1ayaFaFaGфaFaVmgB>B>0#>}"""",aCeA( BSꡗ" B+UCb(E-#acX?aQHp# V^~a"aF2/E_0E1ˣtmF0# #0#0#YtaL"PDDDDDDDDA`! a”9n BчX"8bE VANw<炠<sw;9;w;saasȐw8sܜs9Pg8+rC9X""""""""""""""""""""""""""""""""",!_.|%0faE0#00F}E00#JaD)"! 6фQEaˣ0#0#0#0#0#tc.#1Fc.#G|Gq#00""""""""""""""""""""""""""""""ЉNaL+ʂ<sPw* * * PT98q90a90r $9 ڢ)HMQ4B"""""""""""""d ##DDDDDDDDDDDDDDDDDDEʂ** Tʂ* * g;sx;93sPsA@t""%tVђTDin}E"0! G#>>#>#0#0#–Fq%Ff̏ˆ.Gc|"#DLS'i2>v1B0t}DB"(DFd8#z%8)c<`Q X>M "}GR::!AC>D,DJфPDF""4/ ؇rFPDфa"1d4UE>1Jh n""*"#MEF}$#;"e)B(FHЏta;.<0Eфat|#P"h..$+VЈ.8."؟Y d#HꏣL## EaDbnm"t#DDDJK,z ' A #A0h]WiM6<0+Ro8!GˑtF9^P$"Pdf쎏mO|C..CSNБlDD|aG ф}G+ˠE:4RD TGHÕE9M*#P&#T08mJ'MŦ$Ф#EGQ  Z  XA1` gЗlHELf).rB.FDqFz"L#/'ȆCEW#!#DPN) ^Pq'`<'Xgjbdta"n䜔4MI"pvDJ z$;E-TP!PS(p(vL;!qJq71tA`x AtDqBpCq :9APf)Gt_0f a&a(DbCGoa=<> $A6ziڪp!PTO](l$\E.b ˻.[Du⋶'9'az 4MD0pIP$8a O##oTnӉn4iBӢP#!b.#-qamz[o-]:*nh$ Մ*;N@E)iECtAa't}5 RvXe(A*!ͱEM—]ppѢDԐwa7ݢnVMł#i#DDLfIq0"tyP2<@ ~a* wNUn">xkqGDVhqj PO դKHPpE:T;E=~ttx$arH&?TEJDLRķJjF4=cDDA^6C_"8t@tta)v jC.ӡǷWB5XUT". D]n8EprD"S*)"}"pT YPS F]#:u3H=LC;0w %b6)X:Վ-b1ðpE@))x" "@tl00GI uI];}G6!tOw~g.#EDQDa C:L@te"A@a4xE93]5NGIGNtp~FdcFw8bqЦ18&)ƘbU¶0ϫA"ӸU[L`DLuEF""8B""""""""""""""#B `#aa 8 T'.""F]"x"t)pE@DtNOkr鰊pݬ4ꛦ-Q,cSqX-oquȚ0!2+E>0aGf0#(GфP#:4fЌ#0DPDuGTuD~DDDDqVeVtPt L8FMTL#d]S# 'BWOj.i؈"""""74ȧG}#0#0#>#0(FB""""""""""""""",qB!eH/GN(">Oe">ȭDid2A^FFTZE":QP >1VաDDDDXB"Wa-1Qd GTuD)qE !hGTP"}E">#>#(GB>B0#00#0aFT"""9B#DDDDDDDDDDDDDDDDCGiD}F8)eB#Fj(B!2 ,)9J)uܺEH"R#DD."GuGфaDT}CF}FF#(E0#00"@JB"""""&DGфa;}FaGфv4CHF#>ꏣF)!CEyC Ԥ * e(aZXQ,"""""""v"EaTuE"%DD:0"a#6.DDDDDDDMIJEQDB"D%s4F#)d[B"%IGfhDDȡDJ"1GG|NґPuG2ld:"""#+;B(E"GpIP#0RS4}ɢ4#0DJDDDDND#6Db(B"d!PF)'B1B2ȶ(D)E"0DYhfCDDDDWF#/B[nDI*(GTw0DR!#)HKrD"""$DvM4aꏡI"1DJ])4U2XQZ!H0"(#EI(B"'d(Fa!6"M"XKKE}n Mi # %Ph#"#+"t} \;JFK}}QB#0#:B%uF]+B1+1F\R"+DBB\DFW"MB&Q-LTC2uGgFAn&*;H,GJ!HGT}D""eHJDb"""WR#Hː0"R;%D"+#.E"+fBH!$NDQ3 +iEAPR nVSGnNӣ>DF#jD5;!D@B"P#e[H4DDE^yGg"GEE фaYY(Έ!H/ܷKGB>DD*>(CHU2+Z$:qDq׈aE)"vADa!4#B")jP@Bނ.'Pq&K|"Va!%ѫ!+* )6SGyKt}aϣ/Q}tHE\ ' (3L$r3 5QDtf#B$">"FJЊ7T Gqۣ:N ؟XTC M>- #C] QGpаEa.a[AÆa" a 0AH ҷ`3Bhh^&G\bd`uFP#'gL#Ψ%+ # SyI„6B(sACPWTG#D)"Ô4iGhJit AIm(Ml|0cFF؅{S[FE`@hÂ# 8G@GH24!HKR /A 3&G@0C ›HXS= `hg64m Gy_0_ | VP(F wqAԺb.) t"CЈB,!x*G?W<NE=ya)WEKMt'y$8"u@OtT-յ78DtXQ,&kX&]Ƌᩡ,p(G:Af@L4 0EBAb448l3OaECϢB/FN#0#0#"V5x}qޕ *q4#uւ.4$` r:0(yHAo_"C*m`9A="=~ n!J3ݪMOp¦xF0Tawa;PA4#> q=>1/b\?B1FB0#0#aFaEфa9c<]K n(wת# S H<t@׾ilE]Eša+b1lGkLkzt]'i%H Pa~#:#m EDQ.$*ӄGG&7Im+4ᄍmi%[5YF&]Mt@@ $aCL!`lFc#bF߸'Gl919dﴁ2'Cbn lqMn#C oqt/#0E<4aui) ,+O0HTЧ]t_jt>0a4"<ASAAMçT5)va8aB ' ,c)v%]-s@lO Q;0a#}(]D0AD3C#D Vl0I3 GKl5Z"bPgsJEA/ NPw"~}OajAkVЍ֓6>8@]փEDP"Ch+ miA0Dbc\CN"C$)PN &.wmu-k0:4>OV7rn~0P{z,r/"VuߑuKhE^~}[@-wֵA wbaVuA0ZcU8аN8'  uCPE@`~iP(tQ`ThTj]8Ba -[Tt V+UO^ jD*  Qʈil]q@&r&x*{HÕ@_w w O G^F4׬vb~}.tH)ZjZ==< hqzyt]\:<O("GK?g {úivVi^oK3_^ u݉F*GA)Ty`|5LO Z;^k(EՋ+[_,s]?U{Y)ԧNMNT:B"+v#ES$a~/M׵[U"B~5lCr:5=0E LdtuGH>X"uMQN]xp鰶4tÿ WLuuy-l-׏ UVqFg}XPh<:>OSJ!թ}3C#'}*q+ۈСB ?|wkԺ WB OT}IV#؄GQklEcW Mwa^:]7M_a+;.V6/T4Xw6S~mhm1Pkik^mX"{)tj ՟@W"GU)tTMЈ")uiG[0n »VMK 'PE #cl-aV"ASm I|6҆l~JCqUzp[W JqznkۄPӴ쎂 =HNߺ֍8kuqSO][S7vx*[ vg*3w0n@ʌ 0@EtE e!21pDt&ik иqh1;vbP%!)TA͈ACئ% SV(1_S">E& $u  (XaAMmpqGFB;. JPD !b"%}QEQ n0qdT2P#^"Mq4$i**1exL(AHGTFEZ:`DPР#uGt.GEE?\MΈ):(Gф}b-"E"mkGPl @аHIꏣ #P̄u^P%<P##Et}# HGфP#E>$h=J;DJFdtaa.#‡ s#  ) &AH& qA ldDSV|y>t/#$фPPaQB0<# }40::MΏ 1G-|"ݢݳ@zb`z2 i@A3x@GFO( G#mgX|&ǗDt0!a3e#plq [1M1zХBф}F*,HDatrl%G V":A:0N"C0hA ;C4GƋQÔa+<GpqٜQ)EE\n4[q"0E GGpy p@"`ϙ0Nta e eф4Apa"?!*%LQB(GхnbBD\vh 4) vBMZB!zn(~+AEIAKS H& " aⰑCf̷ ⋌>MDcġCc# LwEdD">2[GT""!+G`hDDȡL@= uw.wLz~0bRlqqX}{~duv]bm&+ }y]mH<"jGXNuGOu#ؽ\DDDDNkh0:0h}G)q0˨쎁aH":R  < _R 7ֱF1BX,+5}=Swt9XטM BvF!+/炠# T0EANK׮x;)RnwK[;bb%q rb; 8B"#ҏOFG^GH{"R)t` E|E;H"+=H(yOلaO*>8{ǧ " !DB.GYBԨN#O4IYPч;SE/Q@V r6/!|8kq gt}FQ "E=T/#t]Ԏ pqKs9[sOEQl%CqDu$ mv5aO.r:k~࡚* AʅSAP)؈4M1,o7 oj={O7lv *3A^ڄ7AVQR?Dq]q "(eGtC V0jvuZ 'Vtam+A)zm&omv*m=+]wlբ$GM>3&uV WZV q2SGXbb D2c;+ - 0X45SVP - 54N&h V[MN+i V׆J{mG]<;$"4ЈPt u)$T8DtD~k#" acNLaO؅ qP  BbDZTM\ @N#9$WOGUu"(h0I+2QqP42  R  DbGr 4:jMibAڊj't#Q(1O^?LS!)b ;+E)GГj!#:茈JQaDDD"O(`E>v+2A(D~AJtE9' B!""ƐeHDiGTa9uB""""")QrV4#C˧QD)B" n&DTPT&4DDLB!htER"4"-d'DDRDM \#ꎪ"""&Z"4""&BhDb>(E";%pTvDDes$PPKrTR*.Da#Db0DDDDN:D}(QZ)JG(B""""&FhP҈n.Da_DMF!"%!HDF% D"ME&hm0et%#D"["hDL(atF#Fb+ꏢaL1ḞFC#hꎨ>DDDDȕ##0H4v""#-!:gt"YqB[)\I eE)bPNDJh!HDLB3Dd1ꏡ-X4D2B'b""&E0M "eHDDJhښ#uUZ;HJ;DN#fC"""MLFDID""EtPpHDDD !;JBꈢ!e,FR!nMGфuE)B"12D"0B2G7+"1Z!H"4:a)a#mdErhDDDDLQ#DDL}!XB"&Fh0DNƑdFBhK*"""1-d2&ZfjZBH#GpD3*"XPDaGTR#QB;'iJ"""&AH1#:#B0##4"""&Fh!-̐DDDDDDDDIt&^:1ꏢ1GTaGeh#>JhFW5"޹E Fh$"EфuE%DDDDDDJ; B""[" آpXh4Ⱦy@s0"O͂#u#@sy#@B4/@{A/|C<\i݆kd<_\]Qqzi*vL!Y+DiE"#B(JGFB(Y:>0([0B2tF|DN"P'B#<!m;N+## E=a=aJ3eu(39J""""?!PB# hUi)u)ҰP R:EEնeiքGh}<09 ;@@:3L8G\GGȺ#)GbGфaPS0PǗj\E]|[QC|@fll6Gˢwft8"=Dtq(D6!cn M0lD4 "BƓCm<&o=0 @  pjCSK(xEi鶒TSB,(MbqH>5$ *pl tæP'A6`">8Fa5SނYGwmI;ƇbdM#uY]PEW ȞכpTzPK.7-F48}GK0n+#nAs:."W]S4i xCv N0p? ߄ar:B"e mՈ{wP"-!#'ҼSM]'Vay)+UvZV4pQiDqሻb/MESV"PPߪ^PhD7$$0S R:P{aWҏ۶;{Gnzerŭx|kac#R'N:>.(~]Dq`y WH7ވ1Zťu_qquU&E{+4#Tuk+0S:xzE(} rDGR4M8GzZ];]|}z"8qSẗ́x WA:.L0IFnu{h1 =}V"(tJˣs0~}ꋥ]l.wWqiXCl[ n+ DP,D;DZ'Z@MӮX~\;o "u ]XjM! jGA8E@); CXac"uD?bTGEx n*7rxKr:4IP/@L)JiZ/G qכ8rb""""""'~tDiG" AаJ(ab"" !`DDD2vwSPtu׻#S.<+bS)N؊|LJH;HDDDDD~ġva,Db0 }#B"#0DE a zB~GGT#E!hEDDDDDqS>#ˣ5"D":(GaF#l&""""d&P,"*kHDDDDDDDG[%>B0Db%:+Qo3 hI48h@"PDB[++(+fW+Z 5](GT"""""eDL#QuC+!H!"F#:)DDDNDDI#4dDDDD"vMaGT}GehLt"&JhKDB""""'hDb0V$B"""WB""v-q!-Ta1D"4DYѓ-PHDI;%DQK=h: 4R"aaGk d)[GTV4E#!_Tv DKuGTF#DDN4uGE(FGTuGTEuw(DKzB""""[;D2Ql G~DNґ0"14F#!n#$vhDKqtPB!H1DDDDDmE"(B""1(EGfhDD#$#ˣ"EVQv"""dt"&B(Q,B"FB+MKwB#&hDDDKqtv (Eܚq4a!23GTF"( FQ}GT} _aGXFʈ"E}DDDb%YB"""dV"Eꏢ1GnNґ EmI!lV#4BDvtU ($PDNHJw!4D)HDM#@B0)&@KBuGaB2&DF#ED$ !ې;;tuGB>"GT""""&Z"DL Ј#4F@(DQE"0DiEc;'څ,HB!B"%rh;#;4FZR (GTF#0!+MDDDDDD]Q0SF#B'e!HD)B2B;XEM""#-P4%pTF%D\JW&B"%~D DK&:"P"Dm:>F#>#!$0aJhP.SFWф}E0##(E"0DahDDD)Si3$:ec;HKph"VDDDDDDDDN(GTP"O P#&I3!=B(x@= R:w שItv(/aJaF;&#@hwU/7dM~I7Xb1бuhtEXF3FuFDuGF%F2A # UW>+Y4XEۚ&.F3} X"uZXfIh0G+P+\HTHx0MS:R:08dtaDbE"Tغ:(GUi"dg0쏗ϙ`a"r)}Z՘DGD_"a"aFaE P"aB0Daj+Ašf(D4EejP +aF'rbv, "0Pq*VASR P;Nq O)C CB/"VNGr5GgfvH˙.{=2rR>Oˑ)GH7r:0#0#Gфt}Gz#$,%QP#^yXGaQrt}g %UlhF0l 'FDaM:M?ST2:@tc#Jp'ƌ  Na8ںn,4ШšGq:!M  , {.A:@$ 3j>fb# aEF}3aFaFaE}D"0U ."""9A E@fTFG66#,]^cWC{Pzq l &AO ۟,!A4!M>=چ"ue 0$8hEE;IMBml!Fӈ*CĎ$XC2:`r<:0Eь0.х@yB>#P#0#"8F"N ʂ0-V-0ZEiJ)@uW]j?Sތ**vjVi'RMB}m,0 j{c@읺 IHm Ha=]MrGHa9c7xL#;0@w)"pABx""m 8{.F}k34aA\#aFaOX";L~AkƱ-}\&Du PM(ᾫ߯Ai}P„SWI# 0E<"`S-wM T4aP|n GnlscI 1*AHޘE#FvP`y!XF(ra#ׄAڋCńYtc.vhF`(DxaH5#0Q/@~}_H W߄ HAjѿZfX@pA:'GIN}C00%;FE=Hut,Zxcţ0ĸ`^ $j)EAO8*R:0, Pf׬&C؊($i6MA< EDjkJ}%fuW< fiH"Qut0N$0] 0S)[M68հB-&b5C7GqFgX7^yVs'XD@9NEDoZkUb)Wchq#b,]("@H69v468bV}Wkul6*5mq,4;b^|0D|b+x枺)фaa_u#E<>~qI Vtٴt:Њ8B"fv 7Ʒ^>(5]0H(@N#E<&pl?5`at])MPC"pafdt0^#B)שt+' ut>v)UUW o+ B;[V-t"I8^ӈ4fO0E<Or0:00*%JGXOSXBC UmlB";7!_ل})PO 0E?x#Cwڶ #URc\v6hwl(uz#_L[ j V~+`p F+ F3)Vv[k q-Ņ`15yGۢ:\/A VC:S,C n;YCw5aT]ay' EFa)\?#"1ֿ N=">D}$P18.=n$)P\D 1N; ;{ÄBPˆ PgYU(wv~Gtˤ8a=H V)EPol(@iZzb8# Omt)UVґфQNCzw~ڱ|ZxB#/i/DEZ(P!4 Bh3- bLBbU<Xci#""XB.#R:obxicLl08M780m ڸ&Q t.-({酆3 #Ga n](@_ŸN)bvjO t}`ESDtG(XYB]9H AX*-Db#tZ EG**DA:#eAZC"" 9#2g5 #T!1 ؄Y1_qQP@:bc(HQtuE *aڇ,D+ / ht$ pᅶ&^H_; FUA#""84F}A0#fJI )Ћ"ʀDD02h00BgLU! g!>8J#30&%<1CجP%)F{"iC&aa=0Ea$쎐` a##- u(y դ""""""8TweD§FPQByPe@B!pg0pA ck"A-""tn*lxEiXN"4p#Gфa&a"GB""""""""""""#% 0QTL# QEC8 D!Sr!>xLO"HQu(Gjh)C;&R:BDDDDE"""dDb>0#(E#聢(#"""""""""9B0# #° hDIAIXd DDN!r4aD"(GUb"""""""#gFa ED(F"}#>0(GaTOED(F5̨*DDDDDD+#ȤDb:Gߪ̓DDDDDDDDDDDDDF"$}4"""""bȡQJGFT4aGTE,FB"$ 0"e(!A ,)."""1,;%D":(B;HBE;B)H![EQIZ) D]MVUDJ0WD">FB0$+M0:u]r%."F%>.5)&yDB#0 D}#:P!EB""=!R y(E b0:#0#!>B""""""""d#FB0D:%#M~GPZa$rܧj݈}>#菣GTBaDDDDȭ_FƆ#a:4DDDDDDDDGB}!-s'ˢ}}E|ꏣ}#0:#PY0#}TaGaGL#(@aFyE@tat]a""""MaDga $ʱlla%7 nG,0hvm KjgCQH1a 8gL.#"ؚ%!HEr""&@D%Z)H:JE">mm@\?ݣ;;Gp`zCPh"< XLAȺ@┎ f0\C & b""'aXB""#pIN:V iM 74ӴP#[EL!FȆEjNqܔĨfJXDb+Ij:ntSoTuSX"ւI#h":m y]pơ6N""d 0"1E:0#0)2taݥձ:ޝީ_IFp!Za_І.Uv"}E"0FaD"(EFa#%h#TDb!HB#aFBӫi2ajG@xAZWZэ=|L~])"N(yXE ]/qX@q'O {k>#H:0DDDDDDD"}#B|E+B4mR<;ljԸ@A ]m!DDDDDL:#DDGS^W\D8_ E;WˬOvEutFGIEBpZi!۱ n.!(E0ɡ;,DiE„ DS@e!BN_S58NlwFg> NC~=r*j ?+E!;,DFB""WG~'3{m HW_'^@.yjOAx_pnϠ8J}=7NDDL" DaF"}E:4";]=R 8tgm/480ޘ_ /ZUktd!DijЈ:-жi7V#C% ڶ& K~.O W`}Po^'0wJ>DDL"PGTJB'EDMDQXiZq[m]pl+iZؤ7pSi? j[ ))+ / m#%0DDDDDQ>DNJDuE!Hbġb1LA &;ؔ )-;:(" ju]&R" rպЈhEDGaآ(FYN">s`CGwL(=ܨv+ʄeL30$CL ɼC)8 B Bq ! bVvaDb>-aQ* TwD""""""""8""" J*t 馃* 2+pA4ADDI4R#;tR#"1 $vJ\ *:[Gk FEh"4:!٢l!S%dDDHB:-Ό( oȷ&BЉ]M0D")B4hLB(G"GЙ)1QGjh8mvꎨ>#FaFB JB""""#&h4"(QDDt}FMHj#!GTJnGDDK)R#!;3G~ЄDLF[!Ɉ)Dan$taD #4"""WaAQBa \"#+!l uGTB"4DDDD:;F#F%62EE)FB#}#DDL0#"^(DVTB%4B#GT""""""vJD}FDDDR0DP_DB#艢Pe B""9\DFB#B&j%Ώ>#a>a>#-D}bMDP#(GЈFDDFZ`ȭQtJGXB"""d#>#0e#H;J"[B"#2&#>D""""'f"""WDQEDiGHaDDDDDE(E">DDL"42!,F]"""""""W&>"}E0hDb0"""1m#H>#!H!2&B0Dy!F#0#DDJFFDvGB!uD)t"""""""'jh"aڢ2DFa#FDb2H4F#C,D)Di%0R!HB"""""""'kh::bEфB#0aKфP""""dTDv.!+GTE!vV2DDD-}"F0#GBWN"}(Gc)}DЈ"MQꎨ)H4R2XB"""1l B#(GFvFF"aGфaBd&##B0UԈDw)o0ߡ;GTF#>n E"%-ˣ#"T""""Wta#HQ+PDB&)DDDD"#KB#4PEEa>"""[hV)HDDLFۡ"Db2PDa0ta"1""v(D}Rˢ0;(B""MGgDFuEDDDDDDNЄDF[DIuF}F TF#$DQ \GTFHXE4""""&Bh"f] ;UF@"%0DDȌFJDi#,w&)d EGeDx;(d%DI;F##P#㏝&-I+WIPZ:VaF"G~# [ْDtPI12B R0hQ}cT%hTcVHRD;NS(taEc+#R*tK0D"B,'DaVN C4}FB>"aG:(GՐ>#E璝SBЍ0GtD9N#!a&aaGe>,cwGzDtutE){dfG^xwhh4":#P=%/">v["8'sR0>"})a#(FuYaFH#qDDZQtKQE:}c&>{>}Q}PAXŦP3M jgT<&].A2(p2AG. 0`B ΘL ˣ G#{ ah/bX8c"a "B/"ԎXDфuE#>#0"tPfaF}F}EN#>#(DOЍ"#o.#F-#I_cHv*nX P,XI7bl[EUX ø4X .f400H f<APDAN G@&CX! gADvGD!0X1(؈Ab6I TEE[D|o|(E"0#>0,"aE¢:P!IH"%=nl~n ; ll9C`<aI"4;EhpDtˆCN#)Cr:D$(xEKH=+v&; *! '!H! eGa!Na3e 3 1@ˣ 0E#b"$v"?фPD6ꎨ# DGfXdu&<"VajNn4M!icA;ڸz8 B`M}uLse˶Z/4ܡMN$^}B#1ݢPwD'IqR' "p"6005‰PU\F!@N2nǤ@1800G .r=_1 1 @ˣ2C&b%0E"aGфaFaFGGф>7"*kt]=E܎TP:v}EaРa\6!Ava5 t PAXAx6pnE i: &PA(u(yPM[@+a]I#Q.pi bUbU @6gDv3G{ϲuwzzkzzAA@l!/;WooucSG5Wy:SHuO#)=jF<ڴw'8xDq DpFGA>"jGT(?.SPv^V#}zh|GiިV"OP@6)U׈khF"ַTroiUxKT^(UX׷||T|,zPTnN (z_jGU<(sAP7Pw; #MlN9Pkdc '|\wB3 O#5S`qqaa~cMwtOW~"@a6P\GﰾW_}a(yva쎌wI A?҂(tSآpq DEph|Cb?~#R"r'Z z)fܨ*(=0x@8*T+3=ZWvxUGtP"8L _u@}CȁQ{ qz)vBP+ wqFm 7mzՠ?ݍ0k ҄~˪E@aW)"dt] ۿ%#9Qzmv_b"(?фaPr:A* PʉB'@V18_[#"ETL#؄c{b+u7xEE8T6*OaT/l,pv~X{ *:mop҃qƖ"/i'5#7I@?VGVG[*ZH+3d0馐">)tC(tIAn aq؊)cbI{`" )CTZT0E;PPa+Z-qaE5{G_F;hCDtA"DDDDEDDDDDDDDDDDDDDAEu`x` iaW({tGQ{0[AlC:.#yf#",0EH10MB#""""""""""T"• # T.'h0E D}@觟ApmDyc@!a4:E/ds#8t0ii^;~P)(a9겴ꎨ0DDDDDDDDG'B"hoT;D}cq[>*ħB,J lqS1+ V>"2P%3B#b#B""'gGqϣ""0#>"4DDDDDDDDDDC:>w)[OL[U]I8"<7 MmLAgt"[""""."""$"0#0#0#0#E!DDDB"&# AQv $:آ;3PGfiLO>X"""""""""""""Z"I# zeyZ(LnDDNXDXVD*B"v1Ft$tR#$TAPTAPTAPTAPSAPw*APTs39sPq93xMc-̑*lVDE-BPGӸbA(E "[B"d.a(FuGa!0EF"2"DfA/4mF1-aFF}DDDDDDDGTa"""#pȷ3E)aGTB#+-P"0#>B"""&N00,&e4""""""'`GTP#0(F""#8uWSB[#+>! xnJDPDDDM#>㵖EdMoș"}G"""dDuGTaFB#eDS<3ȹGa3ˑta"33#s yFEDE>DR!.GTaF}D";TQGD8a bXǰ@mlӣ"""WFD">uFB""""d##H0uC0PDy×l"":)ġʉtxa L7Oe"W%DiGTaFPDDDDNTGфaGЈZIxON4*- t4Ӡ[X -Db>(GDiQB)DDDLDa!J_Oz WH MzkInU*)}"4DG;XFQWZ\EZQo&T""W:;[GфFDDLP!#$Eic./՘ Y`ZtS!a"%B""""8dxI_o,hB$k[,jGфuDb>2Db(F"H{&T&~vzoxn ɣ#DDDDQGЈ"4kqTcma,D)DDs4P>#0"U]E!2>B:!B>bt٧3/?\"%>}#>WukDI*:2t}QuFDuE"$#>aGфPl+a:)E4T" [f)'dFaQ1uFE"""""""vXұSPSahpÄB -ͭAɹGe2:>DDDDtJFP"aE0DF (F}FB000<@ E@ 6 %+OaM(GфFDDDDLDDq fDDD%Gф}#0*2%GT}GфuE0#0#0@"!4EmȄFZ(B""""""%)#GфaDJEDDLQuF#0#E0#0D"""&Bh#>G,DLDb>#"R!4BaFdMFꏣ>"az",Pu$B#B""""'b#Gф}"1!}4R#0#>DuDb01#h&";"%#0B#"hDDDDDDDDE">#B""""""1lDDDL#0PQP#!2GTa#(Db\DEH#"b>DF#DDDF"""""&I,E@E"%F##H>Gc2EB h"G`DDDDDb""%#HM\]"MDiDQB'~DP0#>#0#>#RMJ Db 62FB(FEDDDDLaDDDI+"4aE"}FB0D"'fDFGTV4!-G}Db>Z>"1PDDDDDDDL"F#蕣>DaDDDDDDDD(FGTaFF"yDQGB(GTaFaGф}GaKtZHȭuEB""""""""1,ʑDDDDb#E(G,DDSGz##!+G|DDDDF$KDD:0D!aDb>#D:h+G3Ea4G`hGT}FDDDDDDDE""R2%GT}4}GTa!GT}F}F}GT}F,RI""[t}aGфR!%>ɣDDDDDDDDb"%qtW3EZ(EQEQB0D"uGaFaQaFnVB:2a"""""""#-SDDDD:}y"1#DN:Qa)ePB"WGB"1Db!bM;SF#0D}B"v#0!)d3Db#,Db2tK@$"""""&Z#0B!DDD-֑P#0#00!IB:1E#PЈPB"}G}Qt}FB>"PD#D}E"JDb\:4P1E """""?FHD|1=#A<|#MnqxAE4Gȡͳm3Ah9s0Ihf2*M,GZ9>P aÙà xA;bټΞO;Nދo|'Y1ܡ*2ܮH&myȌ(g!W%9FFd_)K4[ށvA7~nAj_tW>3zf >#][[x$-UWgҿis"{/YCTtw3DtC? ް~RѩmCȷz}m{moj~C>0AEgш&GX#4^.33#B:fhayec9k2]C'h5kvU.wZYK;xpwuFƍaBT4X6"4\<.x 2@@xAt {@"a"&pg93SF#N N~$ue R}~$G3^[u~"P)Nti7a6ih'A6WSh.īa%\#cGƏ#f0Gx |#[5p C;P@ g a:C;B:ٜ34> 3f=HFE>~LIu{&B0!D*'J  7N6{Tm &am': [?=Ə0a9aۣ.E}ٞg!Auˑ3<̝Q:4h2}6o!@q{GVOc]um6OkZ ]& <6 -u`5kpQ @ &ySi0@ϊx\pax!wjb$W{ZMZu=t]lHDS+yw{{O_U*X & :OM/ m)[GƍFƍ[GaAՍ8.z/]= 86x*Ws2?n[zuպ6h'A< `#QyEϧD>AL в`*9C `aQ SLVPb5o a#AcaQL0°pZլ6ڷiZMiZjޝa/KMi]i^}wV~Z?V"""""""""""""-0B! ҵ2DDDC:D!N db1 B+iS#݊l">[4a&).m kMKJ7ۿ^<ϵ4[hDGahXB &)iðMS_ J{LkjiC-xik~DDDDDDDDDDDB"! hXB-E݄ħe/cajV״VIomz"""#B"""!8!LSġO{Caa/騈`D0A`a!;XJ?1y莙Z.<""3%5B FB3<3yHfڦs88 ~w\ve: __74 Ԭ&T# Q31\ jvp| 칚0fi#4TeٝQ3ZOˢ6Ja[XѮ7OmÞpS{!3Ѡ8#]xGZ &#gH0E: Fg 7.fgo32vaN7 ]C$_뤓IzIMzvo'~=>ޓTMm !A:< ' Ÿ>1XF#[0v IJv-t X!G AA0| ՗31#x gFNfh,(t~ƿKIW+V녥i6֓}UuA- ^ 0h˺ ]e5khѭٸ#cVFh JwTGh5703<3L"v{?GDa;'d8!}'xoK++}֕~}j6SV7A|PNt=t?PPHW6*a#[ .4?%C & 3a""994FCvfeC~f/6L _/oact_O5:]>xWt{{t?Azo 5A6o䍎W+JaWPva##g a000A#pDq_F#k)s>]kX`\'h_dAI{{XW_MzNMi`Hm-iJ$~ A%]ÿs_d}nkPWnL9P wr{X`: ` Z'@{x/-G,jowJڧA6pVzvi>Kop_K_Iҵ{n;yQ^/"wNGl"K8t?zH}wmk_[?]W{W3y_K*ҿ=Ս\&a x 9v su^߯z`zai[[}ꝏK+?ZYo_ץ"n}3z+kWkimjZ۷wwukvn?Mgvz7I`τؔjMKچ# D~JÇ4i,=tm{I]Otm[NK;_]viW?K_]gKMsGFp" 8084B,BSMABKbS؄ T"91 cbbPaGaNXZl$:akڶNi_կmׯwVq6aX? ^b"8Ј"""""""""" bCBA`D4ЈpJbNLJ!bAaa 6հմ[K[ui7] uۨSjoO3?4DDDDDDDDDDDDFDDD0B""'M Ĥ/LB(1[;6cbbݍX1]n>a\/iNivrK_m&֫QFq0Aa AaxbHmJ[ V /maհ%"#a1AW1Ǯ#ȟD7Fd;>Wȯ[Wq";#"iNW ^v)?;I#ˠȄ}hY4"s4"sL͚(B<͚8e$ud8PyY졓?iޡ7=bVqUJa'Ga0R: v{ThaDxP x xO703m0@ePHN3EEpr?33L32P!2L#&"]=Ei#gѱ7>4lr $kqAG֏lmA$kq*4kB#m5V. 4'wM4Za3?03a{  I<0#=~HhA3B `3d9<ݚdHΖO+_}դ'WpIC ~+I &`<7m J/@ -J64khؕmA5 #`q.=kw<0Ĩa/ZhJy&] a3@$ 0 a31 3 !rAf=s !;^;~uM[_O^{׿I:O?Ӡ'Ԫ6A[  `Q*9 -Jž5kq*A4:'wF"= A Aι:e/c[v6.]]߼G~%M_ս6OzzzH6aSta>7 n 7lq* T4k Fhh  d{/ #3͢34aFqsC엲_ZW []ӽ}El7sozZ=[{Jӿ=;6z& mFJAJ݄XѠ8#AA1 8tGa?#0k[pe8X{w_U]鿫|{[WIKJPzShī~l0kq*QTIVF7#mBI22 GF?B&0lՓ|J^߸*u~#_z]~#}&^I5߿z_AV׳9cֵ7J7>;ڷzB_޻n}w{#f~ߥvgfO_oz}oA_Q &:}(>=)_Ww}_kc~퟿}/ݶ?{P__k 09}YUJ+V_}n{m]wKT{JӮ_][ߗu|lW_~몭j?^GH_WG΁=PV$J),0\5ax`av_5 0ool$m;[[[mm'JҴm';t]-OIu/=K4_Mxm%m*F7#A&%D11AB B!`4NA&%G BNt)du}A⢴ئ 5X5aޛJM (aP{ޝaS}|m?1vZ_UIZ """8B"""8AsS:L&CD;LO!1B V B B Bbd+ }ucxbaI0l6Ma'_zv];.^?kUw퟿ЈЈ"")hD0DB4"`Š˄[A)v'{LTA_)+i mv/~uK؈J"8`""",i}C[)c] u;K_X""""",І0C< T[2OEwa&'_C"#a5`xS[ALJ+ʑqUk/?o>3<Q,NdF V]5e )YD6Qji ZFk|Oq %=>9C[pHazh&tNzl0PLS- zIu\/Iִ}^}_MZ{]={5}%}ucv}+oU__o{r<}ˮV'_W?o:_?^(tLo߯M? ?6~M(izU_כ_6Һmmnm/Omo{nҰ_a}a(amJ .*6'l%6m[StDDDDDDDDDDDDDFG ": I""""""?&+^<^s^pport_instructions.tiffPhotosmart Plus B210 series  ImageMagick 6.5.7-8 2010-12-02 Q16 http://www.imagemagick.orgApple Mac OS XapplmntrGRAYXYZ acspAPPLnone-applkTRC wtptcprt#desc ydscm curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmXYZ QtextCopyright Apple Inc., 2008descGeneric Gray Gamma 2.2 Profilemluc enUS<esESLdaDK8*deDELfiFIFfrFU>bitITTpnlNL@dnbNO:ptBRJ&svSE8*jaJP&koKR"$zhTWFzhCNdruRU:plPL@Generic Gray Gamma 2.2 ProfilePerfil genrico de gamma de grises 2,2Algemeen grijs gamma 2,2-profiel1I0O A5@0O 30<<0 2,2-?@>D8;LAllgemeines Graustufenprofil Gamma 2,2Generisk gr 2,2 gammaprofilProfil gnrique gris gamma 2,2Yleinen harmaan gamma 2,2 -profiiliOglny profil szaro[ci gamma 2,2Perfil Genrico da Gama de Cinzas 2,2Profilo generico della gamma dei grigi 2,2Generisk gr gamma 2,2-profilN,000000 2.2 000000| ֌  2.2 \ |u(ppQI^ 2.2 r_icϏu(pp^|ep 2.2 cϏeNpillow-2.3.0/Tests/images/lena_g4_500.tif0000644000175000001440000007301212257506326016660 0ustar dokousersII*xt<])R9##8!8rG#&R&A!"GFlYq8A9!$91yG8"qDHQA"$c!L8,q&9@Dq&8DD##:DHDFG;f!,q0O:HO#$rq0 *028DB"& YäX)eБИ&YNLqe"I#dtGB Byı8 BXLvGY)C80Da"aDDË#vPBy tYD8 BXa-A60@K(qLqK1 %P!(q##"]Dt8H9CGLJs"%#.xÖ8rCCp0(rcq8Éc91#D9D8 B"&È9CCAFh<0%."q9,q8Ǜб ) C"PDdx)B8uq(s&‘t^:I CI<#:##ME8r8 ,qC9CDDÔ8N8A c1D L97&8&8 BqbDs Ü|ġDE(!$9!!A #DJADDB%qD BDJÄ DB'H@.FP a }BqDL8 B%%X B9&!,q&8A ccccDL88I!8BHDE-9$8FBaa>ĘEB,Dpr"B!!A@D%$c<""9NSX\":]'HN8Dt84q LÑ4#&!DCs##>n'|Ȏ aBG8 C8j"&&9$89dvGdq0"X"aL9$X %Lq(r2N G 8Lq0"XX@#@L%""BaY !!ds#B$Q81$8@N9!891Ärc#/^ 89CcDM<"aBÔ8cr8␉!!0%%Hq&9!A0 BCBP&W%PAE(p@(r("a#a9;(rCqKÄ;#8h# DD;pÉ&B%aġ Rve=J"<:R:rcC"X%"$ADL,rcqlDL8rc9C8qq qDG؉C: @C8AC"B"PqɎ!d}! #8r>G"8vDXAA La ,qb'#$t(""XØq,q0q8qDDÔ9!Ң(ppBX&Ö8c*N!"q91ų$lj(qiH Ä9BA ;#B!(8 B(q!HDpB#0D[D L8">ı"s"a1K!8aıL9C9cX A9N"a8cqL8rt "$q B%LsB"P!%" lXLr8 BP&Gdp.G@N=8KVP&DBmLÉ(r1ȣ%""aɎ"a89C&;#+#b%aA,sEL8C-Ds#(xbL0ȁKɎB"a8A0AB%DJL8 @PB%& E@cE!AHDDsPaDD"*("#iDɸc9!9!`ɎPÂ'C8A D b BDL8Aq8PH BD8>CC;#RG60yKI'9cc89c!9GA #]A$cıDĐL9#a8vT"P B#A F!B"aɎq”8v"PBXN9!ĐG#8UaD Q1a88,sLrCG8F9c BP"29C B&$9rcB"r0QKR&8A N  0Hr1ɏ1!,s&9@ÄBġBB#ȘL9,qKBX10 p(rc8H$KN8&9&B"&D8Ɏ'LTa!3Ss$c8A !È890E8} Hc98B;"P"PP N$)BF"[9!ı8q,q,sP 1DN8 B"Hq! #00XJ0""P%&E)BDb" c"#PqȃG A(RA@@ $cr0aDB sA8ò>GdvKØsD KN8 BX帊A$f#8|(1,qqĘ"'D28QELp CpР,qdppG8%q(r0 G |FP&9!(s,">Ä8 BHrc8a\"" B J9Hq8c"8(t#ixDDJÈ:Bq8 BR쎄N&'!0q$8qq0!8aɎ$8LvG#,q$f"0t8쏂#F91Ɏ&q0JGr80ġ,q,r,xbP%ĎCrsBB"%B%B:BP(s! #0(qC:BB%BHs$c>%PR1HqaL8 B%Hq!38HR,rrcDDL9ccc88q%60 B'R00B8!"P&#A1qqD!&GaPJH:HPcq0DDØq,s"&;###8r>GeIr,r8PD!D89q0B#0HC#a㈔8A&GGDsD#DDB0 DD$&8 B!Ad$88B'Écr(XE"Hq!,sq890qIKL9cr"e98qC90  !B!HDA"aK;#"GJııa BX'DE"׈8 Bq9(v]bP"F8qKDDKD8EHD%"$r0 CLrc9HqIO$PIX J Jr!B$AD&BHsB8A "aBDDDJ DE5D,r&8G&T 8!DN9aĘD9!AbX)YE"X LrC9c91K!!CA28чIaP"DCq Dqp@H)&ı#DɎ"aDK"aI"a&9CBD%G 9C(t"qB%$ %PCC91ı Ҝqő#>G C#&L91m",sqȃ80q(r !!- BLN8A 1 "%aD xn8";D6V!@D8 cq0(q,vGG BLI' X!HN;7 q;\Ô9r&9c$uqI%""MɎ"aK"""""PP PRd|1N8A""$8"6!a"aE.0CC88X%aD DsX8"q>GXH0 :EA,r@Xq#D,r1DL9,s"P0A(t9!㈘rDD$""a80VWØq#!!8!0A!&8Xl(L!,|TB%X$ ǵ"aN:0F""a8c9,q,q,q,rc8Q0 Eg0 ,q&8;K88䜱dxa cp(rBX%LrA8PAr,H( D Y1IPAcq0"BXD0"qd8,,sAqK"%@tG!Ë#8qqDÖ?(r!dxq0$dp0GqĐ@EX%aÂ'DDL9Cp@DDD"Pa8ȣ  @C8 BAhr0gJ#B] A "B"!!#s"B$ABHq(q,q0)C8CqCYdqY&8KÉ@L8Écq0aġ8,phDgĐ"@sXi L3N,!8q#)b )8A G88""Lp@X"t2N%P"LvGdpr>\sXÉ!ĐLsLrܘ*""XS91eqD0A bB"1SJ Y#Ó!(u(pLq ) &Hr8!@JDDRaC8rs0"P"LrCLs) !BDØvDTY(q rC9 B8q$8(9dxx1㉇!"9Cq(rPJDÔ8">"GL9(qPFc8s B""Xc X ` X9N B#i 189cqØq,q ㊄}X@BsaD@ Â"XDK㈈0D9r0XE㊜q-(XBX#"P !8 J(r1 L9!I8:'BqdQKÜq&8qcq888UE M28 BHQ!Hq88 CA!" 9188XKB0Ur0(q1DR$cq"P!HN9!8Lc8Lp? 9 ㈍%qH"q!(qvGEsP# qЈE"XdvGDqDs#89!!L:bPG%%H!&b,ġBD#lÉNcØs#HB dy:.%cqF!,q$8D㈉HN88&X @ *@t8HA,Dpyc91%PL)B$9!㈈aIA dxL @BY8<8cad|!0(uB3C,rJȎ̎쎈G&qGdtˆr ";<|D0baL88.9C,p@jvGGLI!!6,qGtĊ89dvGEw8qDI8N;b ׉(p@Jrڔ91L8A #B)%LsLp CA A H6a ʀ$PDAB$DDD9QtDdtNqq!!]  8Ĉ<2cD87bN;>G(rcccVPfKıĊ8#1L9C.D{LԒi "PH Dt]DJD!,fD8AAza L8@ NXa88rc89$89C I!;#9DıG$N""qYBPжcGK(t#toJ yLj@ 81fGC&91D8#r(X""!!pQHE B&97b"aDDɎqDDЈG! 0GHJ#r1Ď""aɎqɎ"9CP$c8A A}H6"baR86ec#3# 8=!HA (L &8q,rB"1(sP$&8">9CC'r@FZd|R(Iq -8Yt}I"B"&Du8!%aDt:8Jt4Lq&9"(q,q,rIX@sXLq!Xb,"a DıDI8L9ccc% ÉCձ&6q "y11ȃp CCCA8JB-.PМsB"FaȣL9C"XjS9Lq,q8@F}4".CXsqX CA"B CGA)BDÈ I ICbTJ(L!CCrdtaBaDLr&*J""VR$P YByX"Pb,"%a#c#4ч}bG&UP@PmQq0(q91DÈHq(28#L9,s #E DH(쁡ő!2!Ċ8qG!dxG`A2G]&Q8#)8":)ЉE@!D3C8##9HL8 BaııPq ("n$QAZEЈP#HJJq!HB 1Ę"$W(r(wGAiÉ0YJuA 1KB1@90DrA㈖91Â&a88A8A B!PBq8cDm F:9!!#&G29!ds# !(q$88A#h("C#v#:80c8">]PqČs""PTrc89F9,q%P!0)D8 B cq9cPC`p%PvGd|dpG PI J.,I B""$9ccı&JDD!A "1(s&ä"!DDD%a9!#ECFDDJġ!;AC\qCr,sF9"DL8,q,qln908Èc9#à"LpD} 4GXB a&ò8ta AÈ(r&8"GЦGt$Eq!0qDsa㈉GIB"1A,Rb$E!(vf"9<D BX"CP򖖋D!ÓıɎaK(r(JDJÄ :A%$!DBs& _ˣxC"anjwL8Lq&9!dpH H":8 h8DBXc,rc88#4C Bq&8!D "A!eqUVbB  C8P쏡!#ÌPA DD9 8A s(!A NDA'"$0 E88qP%"aHrC9C8aAAtDt#C B1m88p@K㉇$8r:A"(r#0C80LqXP:#XN81AJ"9d%Pqɽ D!(p@B#891888㌝" 㢨r&8@Xȣq"P&8r0) $91Ɏ"(P%q#ABPaDGC00$AőALsXAA$LAqG$8ApD|0H" cqILqe """ ZCD "0(p !&8CXF9cr0ARz 9o!ıGG"8I"q$8pDxg!(r!?Q9"hÂ"]B @",p@# Xy@r1ı9cGSq89&9CXfP #qbNp "cq@HL88f{ILqH!iU p9!*È8s%"9saDZ#di2P8"P8h"P& ÈCGSPP )$` RtB}(p@DPaXX0"P'N8R B[)<!0HrCq{&9!Jıā #I| DN:DDt]FhQ 9cÂ',F8 B#i1J8 (+"%PDDLvGЉC")r|DÖ8q !0rC9a #%"aDÑBX[,rcq (zHD#ib"XM#8q(vG##,8F)F(H(|$,b%qDDcvGcq8H}#cA3Z.1 Db! Z%Lpf"%P  BP".#ޢ C`ЈA,r1$tKÖ8c8 B%$ccqR# ::! C \N8E8B 9dtGm!(vG$+l b;EpLr&:.Qc91ĐJF88RCg\cR%* 4bHV"@ Eqcrl PD~l1'P#:!Ô91ɎP"Hq1aDÄBeqH+ 0h9&8rb880 c8Idw!r(2!,sa!8KCJ%e";E&G5$".q!bP"t} |ɎXX(tGEИ@r1Ɏ%"X&E09 =Q a9cbB$t]Pb8>Db,!1#qY:,c9 G2*,|8C8XF8q8D"P09HÐD ,E""] tq f$S* D8q#hh DY^TAp88%Xc9,rcq!,pD~"LqHlK$0 L!!@]"(qb'N8A: RHkb]I#Ⱦm +(q$8=9DlILr0 GlAG_!9]DGa8PPqd! 莎!6'f厎hTDL;D A #hPd| ('Ia"B1Ô84@ ,ru"!㏌DGıiRHÈqhA+&9CN8SYye@Bw0$cS0L{ #DBBXX)E #>!,cq #L9!F(p@N8 (L̎eȎhC8>"PPD:&V4P8:BqXÉcqtABADu"q#P쎈 $y GFБ#'ġPBX0ч0P%E$C;b;  Q!XL(rc8`@(|pDtJDIqaadGm9EGsqı,8厍0"P*#(P1#"1 DvQ,A (q0NLr(qdqA!dt)q""X"P !6(! :#tJq(ubF8"qiHX#q D!DDR!D}=rcr #X"8Ô9sBL9(sG #ÊF,|DDDqXCq1g%,6CP;E":qJHvG &*Y0#.>X쏑(AFGhrP9c("tmIB @0!X9!ʂ!e8k ƑCApȃ>,XLn,ry"&9!#84 dpo,pDv9Q,s%Sc͢DA9Y)JA>#XBIb!'Dd|D A38R@PF)!,sXDG 9cq!G ;b3pEF"ayL9<aDF!HDQ91hJB%՗DtL09n"aĘ09A0&9"P9Cp@|q] < "9C @*##DR$>Pq쎍rqP"C6;#R!z1㈆0X#3PD\">x2;#IB͢D(qYGm Du!DL9!ƂDGϡ#FA2È#"8 B"Hrc1qc8"= 10&P31!:D3(4HY0I28+ c,| !#q,}!8s ,%,AA(pa HC~C$DB#c"=w",(r)KüBH`sb' B !Eak8@Dcq!Crc xGA81D,X!ф(rc!ߍAsaDPE>ࠎD"Üp@GEl!! DbcXqhD":bAqD bQE]$# LHVG s 9 }!"1N:#&J!!&9({gЄLrc69CC18AA#A8C7%""q(wbhPDsD(:"& N$2$=B'X88rc8`vyR@&9ؑԈ8@Hh#b/ qGdtG(p Q8; GEBY!LK; 9C!,rcr!0쏑`>(ʱ8X9C3A8A 0!Ñ"& 8AAC&9C;#!&?ĺ<."B,10crG0!#&È"":uL91yBDDc(r #EB ypG@e)q!,DL9&9 20G) EÑX"%X Bq98XA !.AGq09BQYR<P`0889c#8DDhP #@aYcc1DÔ8XCØrcq0#Hq,sX9P I V"ab$8 D8896\"dx2:#:BaAG?DtGF+! a8DKE"aAH=q8 B"'v]JĊ8!qb$t%Y@x9LÜsB%qőDDxD4LqcB %F89Du8!D'q&?8#6p,qo9sC"a!"#8q2tE" G%'$u&9c8Q@ÈLvGds#:!Bq"qG@( @AAc>D tmQH!8DD((p@6qs":C!XA91fDIC.EH0E=Ԏ""P鈈GHAt cD$8cqw!GhIHq(q(qH6w,r1ȃqFQЌW%YGBP%H[ `r( '7A fBWeSDX.DA#$QESC8q!,s$BAa82,|AP%(rcp&jEJ(@"P&8 IT0!A:P8'8␜rIN88r[I !dqE,q,s>aŲ 'HCDuqDИC@DˆahXa&98&#jGar(+ȃ:B@ vBP@ XR 8AbC>7Ј B$ ;,q)G$9r(N&%XD 0Ar&8r!0"E= O%PI0 "cP #BC"(r hDJDR'D":qDQkl!)ı#B"'XBFA!ƂHAhC9I9I!R:A"C8rc9C!L8 PFЋc(rcĐЂ1!É w(|ZD !FE GF"P I>G$Q8EA `pz!9C&90% @$3$>HtGFt"iY¡8m!BP< D} CG(q!Hs!%DN8#7(dvG1(F"] K(s"AЊGQ8&㈖9DÜqtq Рdt "c 9Ѵ !84644%#8k̎G0Bq81>EÔ9,s"!Cn DKrc8A!!;ˣh  BXf#8A D4!.@RdqHGrC#qYO˫#1D Јc80$ds#p$RA8AV#9!sPqB 9C",̎#!$9P!$5B&д8FtP##rHaıYq8$#:#ɂED|C A"D: B@!$&:F](X!8(sqi"HDN8cq8cq(pA0&h҂":4TKı(p:RC8q 9 1 qPℎ!i8A C.4), @Ba"Ŗ9C^쎄O! 1&?!D|"YL GHBqı9qdtG#}!u!%Y9Ċ9C"%DI&jBX~@CϠ@å%'ÊB9dvrs!1ˆA \ PUeX'qȣ B B ;E c9C0&ÂtHjaxt} ,qBø{& q(q ",s, WB$t&C(p#H .ć~=" ㈖8sP%aD㈈4&Kx"<#8Iz,r@!(rnBC9AѴ'"GO!,qP>@h(q8QaDDKÑG(qGBCX}v% Bm t!rc BTtɎC9 %"PI)#B"GBm ,seq,r0qɎa'JB!kMa #s#,L#Hs"BHȏI DYB% }:DFDG&88h=>ÉcrCaDČp!9yArrqGQ#$PI":&DDAHq !8=D# B8C#BX]9,sa98R;DHkXa aL;#r":F'B$cDpO ?ˡH#i dshÌ q8G C!ȣ9s8Ŷq9A""%qXaE!C,s&DNB"a; (qDt"9:#q193q4aG L0BP%XbP"XIq8DAA"A}"a Dt8@qDBFKXDQEF:@cc&8"<Bh? cT[#8ceMGPqAqbHA(sSb"XL$6]"bCA ز9DxxI'A0hE8H 28Yr"XA8AN?BF90%%%,P,E\t@8F8091+88A!wta R 4 l8 B!$cq8JB$%EÈ90'8X,TC0|EH %'|!aA )K")!A2>G='8 B%Hq8cb'"c8 B"Prc0q88A BDr&%*""DJdpY#ptᰁTGД9cA 8A GLGGPD}@90X"'E!0"aD9!(qa#8G{qa !A8(vHGP"#P#XALqXXK㧼 fc8rN4#+F"/0Pe?bq8 DmG*"B!8"?"!,)Yc1|J6PH0X":!J#!8&BV(29, \U삐A,q(qa34E8 ÊP4*#:6":G")$2;# rI3^PX0M91KD!8XC_GÈ11 bر.qL A8gBXaIHz!G$919,qԇB !ıɎ"$ܘI:0$!8"%Lp(| JDDZ#h"6(qr C9"qɎqb40h@D(s%9qD|F;#:# ;#!#鴢GC Ba&K BP%'yϣDDH5qR- D~""$cC"p(KDPġDI!|fj)?#a9!QDB6"9C"PCA G#aD D$,A c8csF9c8A cXn$t(!_ >L|Q4(AeP29BBBDu!B27c'D #q!K㈊:6BJD8B"aAqe::!"qjIq$:Sq(rcPD0 d5 QC6!,rC%9!x2:b܊91 (IP%'WAZ,">GN8@$Ls"q@A0EpqHJBDÈ BXf("": 1ȃpILBq c8 QiyǢ 9aı81é1ġ(sa!#GBfd4ҫS%(p@!0ˆGG쏑B#Gq,q8B#ULAdxD|\C9Kdxq!0a><N)r T)' ÈcqGH N8GHDD㈈K"#&>) f*BB' DH >X#9CrcHq|戝BDA␄!"aȃ918Ald GA#(|DA(rcr##;#XgH!%a@q(GDH&91ıD Q L%91ġH?3S!  J 18A GY,pI%$Q%J'B]!: 80X"a##%DDc0EJDÈ<ᘄ8!DÉHA,~8bqB >%P$08AWx Y1 !0DD AÂ&DD#c9CEjD!d ЉW,sB!"%Cq":bB"P ?!!09C!ı80u&A0ÉC}؛XbG"9$09Aq@<‚#qpDE! q LqKDt,9c"9*9Dz8Ô9&82莄dl!(rq!"!0QA8!$("B"&,"? ÓBKKÉC'ı1G-cq0X>D#E>Hr1H8CPMGHE@#أE9r1ĂA8"%&FyDD"2c8Lq 8ATq#!)9 8ɸCx(sLqccAF}Ћw!8A "'CDIX !u(rcF8A cL9Cɔ; lD;#B##8EvG @AN:BB$8 B$5DHJD ,sMN9C: EćB$,q,qfhB(rǑ1JHDA"%X")d!d}bq 8F8q$8DØr#9PSaJFN#8(L[AjN8tI8E$=cE$Ɔ&"cY5280\)#9Du$% AD8X(rq#D BP&G#!@ɎqP Cdq;#80GGL!p鉇1L9#q@DD8="8e cqlؐ8@#q1%B X90@8"BB"q(rcCq@D0MFN88S8:.crcr,q""%"DL8b%q9cŐP9aK%!G0crH$9CccrcP!G0#X0ci!dppr8B8T00AɏIa!8!МLJr(q1Đ[vGdpB8!B8PBHq,q!qD89C8P&PGGDs#BP%B^rcDtĂ'c;GF(q",28G#'GLBDØp,raGGD& -7q(r0a'J&G+!|D hLrKQtaDÔ8c(qDD 1Pǡ8 |b,EA`p!0qD HA88CCN;GDql4q/Clp@KØq%%%Ls"X&DKA"Dc8~Q:dpB@%Bq#DK!Gc#KXDK!Gqb,X)(r q0DDK!DØq#q,q,x!,rcG8Aq8G˦ACTqdrLd|!B""F8$(q0$ DDÈA cq'DDDDDL8&9Cȣq(r(ERc91K!,s"Xa91ãhI  8$9c) !0$8u!dp{9 8ABCN6VB QKı"%%BP"XaD E BDÂ"X!0;c8VC"Arp09C9cX$c)L:BX,A C!1L:D,q,rcc;#pB8.GdtG">G>Hqr,q0XADdGB;B"qDEB:#s#DYsi89tDJDJBCLqD|xWDcsaɎPKÜs"X""aAǍ#!#8j   nuot|uu()1>u>u?ulena_500.tif  ImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.orgF@V@(@`@@33@ff&@ @< @pillow-2.3.0/Tests/images/l_trns.png0000644000175000001440000000221412257506326016262 0ustar dokousersPNG  IHDR@@.tRNS["EIDATx}WMoUբUL¢ae+ n ;\~?hBصFK b}Iw=3sfh$@ _"=  ,$k   ܖ$@A Uyk]rs'n;d@Bw{0'|&FxF[0TB2;$60G4拥/BLf${xiiF_ "I=XI9 PoädX( ^~ CH9q^6S'Shz>%jyԚ D&Dt0J%2{lGvS :/T7(!g?D٫\yc Q "R3}u+s+A_!\ ot]Dz#,pGHeSkA"Q!b+J BGI1`8/IxpD|6 `mQ(qd| %Y !Dt"E ÜqJ A!NRtI">h a,C#.ġIt, 9j0`CA)I0i":R:>q9C(pDz2:#P L#mDbL#QHqE(zzZ(r+c9CǶ L$"fqFBI! 4%NDq#|baJ<0&Du82;>BLjA \eD BI=8؊qAxͦaB%xhâ:ġ3JP0ðB0MT CA CPCfE×A,AơFq tbP# CgPAa $)!Lc~BxZ0+JL9NB.">"Tq ƒt5# ": E#:IjtCXra$8AB"@s8.@DgT*3Lp@If6 $(t]A8qt>BIaI#DޑNѴ%"F +GG9CG@%Q e1 J@D488Du&3 $"˩3xJ]$PZBa#Ë  (֡4IBc#G_lQ&8bUGA:A #:;q`!!G]` `oՄ8"? pW!" :"9I=8#fy/`Iq8AA1b'Fz)\ÄbЈ"?PDE$¾"PH"GH:>8.$Q(scJDynD$!&q: 8 HB$$"aL,<a !>#1#e9kIb9C"^% r PH|y_Fq=hP"@ƶr1-*P#PdYt1 G|X B #%Ht"GqBI Pp!;G">HJ]x$H$2G2c">dž~QCEDBGU@C_.(p8ƻ#]B XcFPQ(y t Qt, JZET%qH\}Bd4E4  qN5igc㈥(q_tp@"=C$-cF/3CEքWJA"Ԍw1tqAXYG$d,pp 8&ipED9f>GhÈ BQ?EĎjP(Y\UE= CCE$q#:B#t:#C8ˠ8r1D &GDs#. 8A4DDP BBH8A N!   ()1>lena.g4.tifHHImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.orgpillow-2.3.0/Tests/images/pil123p.png0000644000175000001440000003114512257506326016160 0ustar dokousersPNG  IHDRgAMA1_PLTE   Qw<..?S#  k  'zEl?=a$>QE!2;+1:N1 2  5Hz63;\: IDATx{ 8?3.#ĸ1[Ê1J3k]kOÆ#eIQ %T%E5Tl(t|G?Ͼ__y}޷RROcJϿ69=sLqs8DRAܶ+yj`CZeQÞmFF6;Cƨ"دWYXhBasG|h]kG<㊄s)ˇ9ՃeH܌5mcprtJj97dƗ\h[ƿUZJ2NV3?:g " P8*~ FNH7(aΰ Vv5NWcTU<`@.`8|6_c<}3%GIJ^$ܔz:Xd(ŇWavg}N)mlx@I0)+¤g)@t DqtT4Io ]_n={sU8B"H)W i 5i(`G oH;44%//.V)R۵57۸YДqErFE45V,&jLL$xS}iꝂ3 c|׿[4F&L'd}"Maw1 p^Cq,Wc(N&P rB6W6R}'Stm[/5ÒG=YAZ>%g[%"sgٖbi\*J+>HMFYy eOU%YYSJZ]솩)JE; f88Xb! }fn`q=~-tIj?O{% ˿",O솭ʑ^/QUWs8ZwXdaVywkl@EDf)˰?3Uf,}:ɓej4P8bOlK$X G_~EB۩BlO>YdS5 M5V()[d6߭LɌh8~nqbS)F{!ʀ QWٺG,A-0^nM$zH c!`i=SSa.㭭}أQھ}i'k55ڃ7Gxݐ+YGz-mD wtt2MՍ<=={γ]l;vozsBe6uGkQQ%G&#$Qp#kݞF?Ѧ꺺vLqktAAtPˌhˣ7 Z]OTړ5 v3=?qSMnc|td2h ` H$T99iVy8u6jnrW/H,\k58Oض>62(YMH@ QrK6>7r`K=z\sr?;v`&T2GDQW<>To[1W T #"-ѧfw ao{x{8;G ْosܕX]Sm"?`oiۂٖ fl?B_wz"Re 84/o .x{nÍ?Oׂ4/@Wr8sg㏗|aDl/uzڮ2F&OWN$y9m>֐xS9:;SzDxJSuu[kTvF5mQ;T?$MyW>DML^QQA=2LGO>IK+8sN5\a*U^WtaNoݺ?s""Ha:sVxv?__)H=&p槁>O;LOjLTqRwL~&h9-pۻͩK2ECt(#$Dz^Ew) C_CUu҇)HOo(T\$HAl ~yu'ttؤ$Am+P%7WW]vPpYQu9 B'8BEsDpxMk~1筆GD†N'`W3"6W/v<1TsJ\@A܄ {EayGݙ⮴Hx!4̆ z'Z1F`\]rBEP^EɈge)q 5H oH4Fi#Gw6jqJMZSی---%5~\@7CD)Y \JQ 26\ol[Y|h.;;B \mGWַhRGM}J7k2 MuB:xNHV:3"6W7]ZV^^ 5xBa[W +"v`= ʑDb?6`9ۤ5445$x]JŜLK8pgVPTRR\8zz_s sT]4cҚj2q.XY8]UIA^&9I< I wv!--^ sG_5d05(6k jXt0Y٭#F{5ЪMSf<)nxdܢD$7Ϊk49 >?;XXgd/:bXK]D_{b AqDς(r"#ΤͲ =}M0-X3ș0N,&yEU^>FhɏzՃy&3Z"q-0vsb-iоZ|5B$v2mk'8z)6_UR}QaD|Wshs)1CJ'&qL@胾7ٖ~..sv[)R&=oXrϬ鹉1p-o&@lF5lMMjIEKۿZP$Rn|dI=Psfp0ckٚ] MioP '82eX&ӧn;АL0>j`mFa54.`kIq)*9NcaDL4 MKk˸ L#CRJ廠 <# Uղv=PqaQY$2%Xδ6x{Fu}M cЦCN`c}:.*=M~er2iG$btcM=LX6Iw=FhooG G] Dk8H pJ+uٍ?Iڮ:Rkgw\Kf X~[wК]JXGM͇}ܹ3#F::d& k%埵H$-$R~;uaQViO=uшlî1a0uFGvo&ugnc쮏ȭ8 /#Vj۰]YYi^vloemqsױL4u 0$e?BHG ݏfUUtϭ {q p43imFz Lh2jJ[(ǖÙ;%JU<"a3~zdVH&7Y6oBAu߶i[sߩ&+XSk46!\eJAӦMd;/ (t!- 34q5,6dz;mt!m$+mZn!|d߆ dz'H%K 2 V[][[66,C>2T.L)1GVu*\p Cb|NRm6`Uދ~q̎JMQLFlszf[dX.r'^<`7xds(%5@E[mX ) {˖VjkKt}B;=ZD StORS*U*۟w Sޞfk|bR](N5k>g}TɪG>t\PǁE:AuWQ3ͨ?^/}` fXXX C2IB$`= @G#!ds4 !!0Lg /`8w@U֒ӧH !!AU "VR5] `s<04tn r Y VQi,?{ 9U@!$@909N4"7{E 2[e?$P` lghnxZ"0qXς~mx@Q[O:ռu+tr6=,&,ȈC[OD<ݞ,XOY6arlt4q,qHkF@!2H@66 z/5ʮe%ëm4xf&W+:=o .Cj"  F"*wlWTYk m2"S΂ $NL9|gx9RX.kkmհV}'xy*K;\7ihL](^.x<^^.$%1W_Xxrb@rRw뼈-O*; SrTE_@i b}}gM#ࠌx:T'B&W13oKgvgũ()(8@Gip9zAfGPO$&Pvvhhh}F{! :9u>M/K8 CVб@!}N0+I9Zo"V Iq #Oxɲ^}](;:gEwBMv)<3B,g Lr<\נɠ&}_ MtA Kmq AV*d&IIW.Hz$] ?=P dA̓E"p$NAwvg)Y޿xxœ l R{PP o3fOݭt {] (A# CeI,Hjhq{ᮧODzWi鋇z!hA ZZ 0N$!+{v -L ͈GaXhE^OI e=<,LKKmX{ CI<$n2k 4Bp$/E<M}IU ¡9TNKn)1tPo/[@bيuB@0;~KP%&`m5` &Ird_kl1}LMM]'q IDAT11aX|q69$=ssUͨ]ٖhgȒ) čz0zAz\ncFl HJp)pZ@hqJ#Iԭ!ny{~TDynYh",:ĄrDQK,ysjJ +8f lQ(P}Q1hk~@uҜv#4sp\Bq8?OH0zW+x͍iAኢC3S3ٮ{n9rKz|V;/u^3 ƵNgg8pOdJ)[n&x&"o?}8C39w!ߛ`0zS?ȣX"F8*ȱ Ii,\چgDE 0PE.s:"ҥccc.1{X@=~"gz v. z AlnRy?XI7BnbM gS&H4Њ"g1mƯ>DX=$;@Ďbj蠒tİq,4z@Ɛ ~w0]>lOҦפ`6Ehr5hfk`;v `lB;nL&EbZr1mL*T*a&T`(8) EOl/1!_fmϰؐc.  c³x({T{pqeĩ*~ 2Y\ 5‚ȓM\!wѴ/VD[o >mqG L/@-t-}|0j6@Br b f@6=OǏi:ѠD5;*Rs5Dq{*ּ|}6@"ۍ{XFsjœaIf,i4) ,a0.GzPP@`;Z}||hKXFW .?lĖ-y/ovtxB3r{͈ˏ]֢ٙL_{I>zu׏V4Sې#K/ !EQt%T! M&YQ@0=樓Q C6J<9=;Twv)Po`dPV[4bc7?O<8 56KTh+a-Kc%:w"Qx&N $ir]tǏP0 |}(^v1sr+ 3F?&\\'R<^:%H8A~ ữyl:DPd+V`\ܮP-ӓRd=b_<{˷GvF|!ǭg馝4=ŹN1^0Z8y K, bLr GPȓq):B0JJ2w{VF2*g*z=|yt~g@k7S6hmnRTmW=!fs1p {3|-vP{S 3't:2ڒʸqO[4F&X{eP<5U'| H:^_+ʎ-`J }b8Tp~\앲Xv 0) ylvXVٳǯ222JJ%.r҃ ^2T3z(u~@w>voˁ;?Bо!avmƆ\n bc8,;A5yxr2$!' 5:к>IᩙG;:r*~_3yۭ_nIUٮԴvVE5~ 9!>!9> =6m"ޑw.Wq024M2 *]EqmO'w j~Eά)m2[jvUpqL-1bvv0 SIw/rڟT *Tọ򺵦 i(,lWZϘ+ {a/Twd`1&<>;@d䷨w^7V88BL0 ݨ7**;]ZWYH];I'()q$GG;a\0$[(PT*etp%]+L0FDeվ_wtn6N^B&`,A%/ !X.N(胼d2U7A% rԬ)#rWzP6DDͶjpy*| $ An+G3F4Y̓@Pp1Xwm1B# Esi׮"ϟ^yx7wA7s^h( tb%SV8j^ڃWu,4Nv.[ '|wyfC.o2֢sN ۹s.d:$49 }zG'$NA5IENDB`pillow-2.3.0/Tests/images/16bit.cropped.tif0000644000175000001440000002015612257510072017335 0ustar dokousersII*@@n@ qfevKVNRQ=uwVeqwsi_{bXPpgfdwvPs{=VmNN3Op|bwXbN\gxjcvnYTtT_j~rx{yzgwMal]c}^gbz|Xqfoi`^pljw~v|zibwu`aeXj^|jxt^i\cehn}_z^kYyVXLdb_QCqSkp{~wP}nYxYmYxbxYPY|noa{jjSNfr\ywxFU]riqwnBow_UYQCq|mVmDH wzg^yLQxnzvoi_fizql`Jmzwzwe]JRRYVfkpJ[pqy|\Yjixyl{~WtTnmKO]FR}m_akcTf}~rn}{r}pplmmghzP}K{nO\]^vur^][ubi_``pO|otz`6t}naZecw{a}eSf_[kDn\fTy^Ccwcw9\fk}Oo~]j{Rrsy{Tf~s~q}^jdkeuVlzaeuf>{df9zjWfps{uxiywtysVcKqkvfgRsvs~tIpcq~}q{wugbyvRP[3W|_OKgccZ`ntqxrq@zxzaw^kmyzovjkhVmp]^]nP3pjk[c~E}yFoyh`ehh_[x\pxvzWZiry~mcfmipUmd^ihZdcJmH`ZfYmWT{zClhrd~\w\^|wcmSUzkSxwVlvzvjjd}MwrgWxb_vrZl{cTlsVzgT^\QmrmkxbhSrtQofiwQk~{\kzW}cIQeR]jjuSvnql{vn{v~|lQ`P@Z}kepkWw{ky|}towrxgqlpVuvMvvvBx-i{}nzn^vlpyI[w]pnmW`]lcc|ymi~|{vj|umsp{vn-fH`Dv\ekqWetevx\{mtu|ghO]ulzbZ`xjlqi]C^{Y\[|`~xopdztvndAd^^qQjXqh~dojYZiv?r|b[bj`epnYg]ZZj}{xxkg}wnOvveeay}fXhzigw|FtfZ}\g]`znamfXRgOwh~}y`vze|f}jpRghfs~e_|fcU}tupt`bbqlgskhb^yqJ|ujcezdQ~~NwX{i@\dhr~r{Vk{^ePOnw|oed#Xhlsiclw__zNVub[|[hvN~jWr@rvg]fxrbxyxgaVchmvERb:{zko@uz|}arsgk}edqqYay|]ml\Pkm{kW{|vO5|ensvXn_pptrRj=SW~~ULb}]MW^zgldlnmvr|AwZknifTXj~mxbvrrSd}n]uxs}csgrbk`bc`KXPs_h[p~z}]hu[`i|ilklwcxr]a{s]dmxxukmjhu\l)m[z^m~{gpos|{^^x{zqzrYvNS4njjshkNVyl}w`j]oyhmyny{mMVMHJcbeazxut^y}pqzfrYO^^pv\du|ts]_W}upSotteOux_}jbxsztSYe]W}Rul|mb\hc}aeixZAxy{|nsxRyf\lOrqyzxpjrz\Tvxqxwy{q]v[yopTVf_Tt[_L\w_rWb^\pyw|z[ptc}l_fvhZgQHjdsQ^_iVdS>_\mmrs|l\TUn{N|as~jznbqgqlXpPOz~x}K9abI\dLTfdSLyqcG|ePeo}kstfx[hkgGr}{{jktJ_cMz^rYb}_|vfuiQq[u_uRVbb~l~e{``]jtm]dxYLebd~ml2qb~~amVrTv}k\S~Antt|ud~tQc}yq|bSRZ||^wr}wu_fIdb^nvwsapn |rqNNOo||Ob[lfXHUacugw|Lbs|~mrW}x}k%Hi'vTv|itJQrW_TZ~iVRUkglelcblndkmnijVyigsnlq{~ccuI|X}`xUnYvn~}osrvfqxi}tuho}i@mRXk{vpW<P0iR}pvikeroki}aqamrway{SLiZoh{KgmkuZ{~|uxdgUN}jiI[jiifvRo<vXsrgWMsoGY^}}|k~ozwwqf|abvhlq`u;j[~qjklrfykMIQuxzjxymb}e>y}:uvkflbmX6^ltnpbnmvwxlPrs{myqt~g^{lxNuikpt}tRNpkr|sfonwUpqbnxxydtqdzoQ\uvdh}{bx[g^dqg_pmWjvUoyWpzx_cvmtzzxPosqxut|W\m}Tb`feogmf@o]/Wmp|eL}wh^l}Xohj{b{uu~jIFd|fiY{Z\Tr{oLQxxNjz|u_vwutixyscbn[~drQQ|wp]h|y~jxTnmwNUbrS[wzv{v{^n}oRvt[ztgpSzrkZm^xxdozlxspocNg\^}b`q`v}Iaei`hRMvfJ]m}guyutthpmu`z\|n{ojfqtfpaxq]lxvfb<lu{\[sxq{EdVWhqaVvuUeJiw~aF6pJ5 }rsrdeqkflm\L~Vui[Pkea_Xs~`w{fdVdk[fdaPFnh}dmAnv][hY:KLDswcepillow-2.3.0/Tests/images/create_eps.gnuplot0000644000175000001440000000214512257506326020002 0ustar dokousers#!/usr/bin/gnuplot #This is the script that was used to create our sample EPS files #We used the following version of the gnuplot program #G N U P L O T #Version 4.6 patchlevel 3 last modified 2013-04-12 #Build System: Darwin x86_64 #This file will generate the non_zero_bb.eps variant, in order to get the #zero_bb.eps variant you will need to edit line6 in the result file to #be "%%BoundingBox: 0 0 460 352" instead of "%%BoundingBox: 50 50 410 302" set t postscript eps color set o "sample.eps" set dummy u,v set key bmargin center horizontal Right noreverse enhanced autotitles nobox set parametric set view 50, 30, 1, 1 set isosamples 10, 10 set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover set ticslevel 0 set title "Interlocking Tori" set style line 1 lt 1 lw 1 pt 3 lc rgb "red" set style line 2 lt 1 lw 1 pt 3 lc rgb "blue" set urange [ -3.14159 : 3.14159 ] noreverse nowriteback set vrange [ -3.14159 : 3.14159 ] noreverse nowriteback splot cos(u)+.5*cos(u)*cos(v),sin(u)+.5*sin(u)*cos(v),.5*sin(v) ls 1,\ 1+cos(u)+.5*cos(u)*cos(v),.5*sin(v),sin(u)+.5*sin(u)*cos(v) ls 2 pillow-2.3.0/Tests/images/non_zero_bb.png0000644000175000001440000000476012257506326017265 0ustar dokousersPNG  IHDRhK#PLTEy IDATx^(Ҫ.0Ҝv%i: 햠GA 7%k'^^^hVQU/9XUn&"&!%%UV vִ=Z"zǍM9 c}H͎WݾmѾ :ZV5XUn}0 EۣXfcH#۠(=|pư Шbvk-Dr7AoG~"?٨;+SG:F!VsæjQ{ݣS¦j`|Hvzlʎ|c@۝& dE=;@ ᤉީjQ\tܯ^m튨Sќ:]:fw6X vµ%4ƅA{5 5 Ȗ:4\Z+Xqס J!ؖڦ5htw)P N+McPtsŐA u4ځktImf](fhvxhWGQK+B#lp;Q^mǎG_Vg MOތܨ2YBNKZzEƕԭەЉ:̛WoO =֪upZFkGiNg頑1kGmu& 6:=#uh_eșFZGNGbXh\_u]F:\Muјgؔbjt*Nߜ>qWh_: ~^Û˫7pb'YnG>L]7AhNuC)"I#joQ`ty9C_ODUu3ף2/1@#.!˟B6//?4 ho=GMECo%#֭m{\7g1{\xN ̏NA:iG^=MH|N{j%O]}4ӞĘNDQX7.~MxjL8W*4WN;hׄFgOMd'|^[1mI2<=x!>S>R"dpž "!gQj]%] 9g)BF@ۧf>Q~pR&XWե8?lAJw6m\BQ>Wjjhї !C^¯\$6~ rwSh\[yE{fO!@[6r~4' (OT7:T;M ZݫAe tO@  =QD}m3Y6.59ga>E1Chyܺe8iK&-|%&#nRsҒ|iZktƿ,:&U}ݸ_*!6]Vq4WFt8ZXfefe9M2ܤ'Q)47iBw()IO4Wc0QThs[“;%WF&wǤHyj몌ߖp1e i+&n>nGl|"B-ʌGe`B_Sbၬ.E#^!(fI .h- 'i!_nV#Unt#4ʝQRQv}*Oz[4NbrG/!Ͳ=%&gQW$Mr_|4~4NߕMg?z+Ⱦ?KrC|lq!<-,L,^DI8.%"Ql:,LB"|"2Bц iFhR aʤYL@+|UIΘ/e%b S\Sc/ zlU$C7Xy6^l[d5(3\G#OY(OJBJ[ #_y+0hF^C>N!dM0o150&5zzzz`NF՜IENDB`pillow-2.3.0/Tests/images/g4-fillorder-test.tif0000644000175000001440000000124212257506326020226 0ustar dokousersII*g*Lq+)B!B!eH9& KlAڥWXB! 0JUFE4 -8wY]ת^J!KKT/InH*/H oZ/Ik]zK}%˶Blh( .,G`ڔ@T  6!T6>FN()18V2/home/erics/Pillow/Tests/images/g4-fillorder-test.tifKofax PDF Filter - version 3.75.% % :G!@Kofax standard Multi-Page TIFF Storage Filter v3.03.0002005:12:07 07:38:25pillow-2.3.0/Tests/images/lena_bw_500.png0000644000175000001440000004403612257506326016764 0ustar dokousersPNG  IHDR' cHRMz&u0`:pQ<bKGD#2 pHYsnu> vpAgL<FVIDATxm [Wu ՑXǶʟu$XNmH%!?: ?K7Lc)=_(2<^ҙMڙq$;. _0SxL"1qRǖ8lIgZkspΕ:{^{i3s2@œ.(6T XE!7c϶@_dt[?gAt]W Aݥnno@t`[YשE+ x~$m(O~+߿? );*-L }|}Rǽ"d$~)Xv 8^ßhgpY Ҿ N0KbݭZ9kY%ϹWc_xރ IKpBR#5 .t~t'~A_hTpb@-AYdY߸uI5 zwI$HرOZҏوG!spw0@V:NI\Qp_׬ ND@:NX R1AY%tXP.˻^ҭHkM{hsٳeՐ|6HE&5R~kfAc ,kQ a})8JjTգ{ʄw_.4ө*F F!Lny{B"B{ROȂ@yp' Zjr߻rg_Ѻ-VC~|޽/-HkD8H9<*Q+ڷ>oJ EU 6@B&AQ纶,knZ,b+wEOf[Cy:$"[9]u׫7@_fDqH «'?zCFl@v)SDGj9oE%Qu:_}/ f>&sܥOH06C&DRV&nL Oyc=>i0d˄3rV|ɔAuxy4R⑴T$ IVkG| J7#mgפLNC RFIݠK 7FN>0h C WQKPg`N{(HlVOw..h^;il͒RP~Pj<^naīEeHePO"B,O>\\:DCݯ7WVI[# qV* @\g/ B7P1 BkaJbęyuqW9x?/f<{/UDk--©֧%ղ/s8fhPsQd-͵p=i@R/ueQg :>ʯD'H<ӱFocx2t:!JNӑ-tX2= Lp/}MV⿥{ם,1U.wRY{i\U eW;zwe޶S4ɲ$6.I o,g(r Z_&l*lU~\>nI.sx4zE<7o3< VF돿HJ-S.Z>Zi=$*f]USb~Q dD " (Fo El<(8v.Nf_л=, ^g;99XAH$#<$!R`!oD:v,?-~CRBr,Ƒ㊩ Qh?}HDuAv#ёqI#6g>^v(@D8 TQ(4yU*_z77*+CHnb8}F7"OXȮ.:h6ϫoz^s-^E 돍^_HTh9Zlp;-(Tl _C >AtH™e'2dܟ[Pɗ-t#pخ?Jնp(Gn!r,A4\̊C?kЊۥe6ϱDԣQsW.$8iDQUOG-^D~4@AqPT<7u-&hEsGSltSkRY*4G,X5p7^$I+?`0]&]b߮I4Πi{+GcEH0|_hTI\"ܘGU$C ]Gz&>@f$]ȹ~lڅ c F5 e:_Eo݌׏ht'?7*ȧj53ύ[:D)TF sCmh˦$@|C KR!d/ o׮=Ui )(IL<'SO*zMl0lDZ|u%zĖ-$8F<`DP39Y @*bOjUV+2_HD]m'/< Գ T ~ jztѼX"PR0]qǂkbD8e(JɐPM)qP]Ͽflo\9GOj*/1}O+0w)/zE#oib"Sc y)oAi=cK upPXG*eq0F(bgo7a>0S +He$Uux!>+v>Pw^XܦJ?M^q[(܈]|19bhRP\#{D} W򥬔÷M?8:Eo໒l<[|;}p]=6E;As+)@e#N8$}E/_.FYri.Ow.*nb}I?JǤR ^;G| aMG6BiV.ݺgۙKitWXߑe"OO>G9^EaaUDeY{)VR,`hp%-/cEi%Kyr8I$(gͥ(J#*TXߣ4&RE^\,@bQ^ 3=~ހJ'a?XPU~DKK*@?-7En]ɣ$X'OR>2 '%> =_q |14ڥF؞ 5A cgg0Dx։"HAsmks1˸zct ػ0`ԐP $s'c.S*V?ot"[*q+12jWDi #ZGrGC]-ǖEUhC*^mS;˂ ށ9A%P,w='9v~ pN22G&mf[Rxy1O]bՏ'"Zrv$-JFf?sj #Ui)75mj jU|?AO${7V) & :.T 1\8elq%/m/h95ea{$O{Ӕjx=#!q~uU޸g{yuwʝYC hoBAz|{*_4wˀ{fU<>D:wkfސgK՘PJÔ\1- J4D5 >gH?z5|u~i=vQݽ#޶V9zLW&_GLk}cHIv~ZL:"hA=p`(LT#%|j*&&{waO9P7宆['yC}5N|qMRĉ,>[;Otn/,үIx+ ]. T9$2yQ7ҭg&z( ]pv|Z߻4i@=Q_D`ԁ/ax+b+mjE{k_ H<KX8z_҄^WwJW!vA/z=$}> /ȼwvc 8)XW( Wͭ|K- Q?N-QrHeNa˪~ qckЦiyb%南*m!O#WLH1t)aX 9 ?A3L^9"FhI!@m^KH&w~'P$Y<{9 ۷ҳ,wx?/ 5M_KK5m OɳDݛ}ORdB\ṔLwxN~^ڧ|X?k&i 5= <gNSӴڜe1}6<᷄"A6˓E]dxYg(K:~`|!|1lJC^n]u(Fھڲf5Ëf]Y8 ;lk[0sQWI6kkxu_So(GA]* &pvMCno)Cx%~FsDI YGQ;:OÝ|p> ^ƑP~"N]g~[q#/wShL3Ѯ~imrN SvЍlŒrUŏ57΃D?LBzW@] ロjax6g#Gv㶋qgh|/x׾^_'o?0~ґL[+\em|`P`S𣏕.B~6ozjݽcwma F"z)x;mc)[΍/ FQ~h]ে,.&NJ,X|[~]c\r)ǘU `>R2a&Y}9%&х={sj©%GN6fȝ#,7ByeaaܟBO=9B),c`oLM29_aQ=JY /qK"wh٤YqaPŢHɅXCivyWO`O֥N-cC]KL gSߩ&vbso)<⊦evUw c݉0t>Yԥpt((}dތ6nP%iAU™z5dj9j2EOD3D? *zvUdMɈ|_/.glOOջ ݽTl(%(D}TŬ_\T={uB(z6$8hWW z|h8R ݮP%0i1A g;8I#zeޥʿ?;CdD<.Q~GWzQg=z()^K,UJVyrDEODk۞&3Syk|W)+dfW#)? pIOwy?h?K|: •&YȞb:R]!Kmi܍LžGhTyzn$)#RNY($VɒVZDe((Y¿#<2oŕTB6dͼqn.޺…eKYGRF@ ?7T+@'Dh!L]H#4H;p$__Gp*ƄB;#>0h<8zݥ4m>HVF;6CO*^+w oGܖ _i9gʯ󓿢OY.8]j8lD]^$-{BjAOe?-Oee"DJ0lEͲ s#;N{ė\+#x P4rIغR11< )~RֶF5TrڒrIkZB$kH:6R*A4ƪ0kU,?j *HSxtuROxkE|ҧ[Qv tLT /AOL 풯P:Hz)˯ohQZ[{{Q3S qq08Ƿ^q8\\ڔ?PgH c[!K?J'2ю˓΋@4R_C4<B|WK7q"] GWj}3>`9?_S_D7k@3VUTHRKn?O*喒a{OI4ǹ|Ȝ2PЍ~1Rs8u᙭<х{&l6'PJ+Ln&'yf=Fוz?:q}:Sw|fOxtpHj " Xd ߺe=B|fi5^~"?M<Ư$a9䤙WຆU;.`t͜)rQrRr̦\7BOZ ]5N JZ?sf5ګJtOEh1LI[T_yTT{D첻qщa:bGQOكp}Wf r=CUMo"LTƣ%W tWJRXGs`J/Jh 'Vr^~m;ޠq2 K/0`}!"xqMg!\,_+!<v28\ 7|+m /C \<ۆm$Κs:Ѩa˩ht鮻ޮt`Sp+q,;#I{TwݽKUViZw~.X=cVIVIǮ)tuٛmFM"{;5,%ea>,"iʐ 27Fn?y棟MڿB(A0wHgKO&4 pXiVs|^ ^m~۞eQ3Ѫ Bxއ}4) Ay8|n7Q}N.Spf|J(4۶X?p]_{b%4e༾M,M ?IBG M[u;n6bzـ@~>I.ȸIcw{t6\X /֜_tT9:sNJTEF?p#_]:ѾreٴDg 3KbQޮ'TA Eb6Gjߧ3۔i}ˁwb ַw ŷ-:8 O]2JzϢ7dx㧨^}L fK#>bXmaM ˮBKZ)87x4\45Q= R&D-AIS]foY4.K<ʪyķ#wVv]+%zy2?RY D#j+㯊CO <e'uQPv)2?"~6r&AgQfxk39 H2ҴPTN  :Bi-DVtmH;Dٓ_W?MQk=Pc: 7 >v]!(y돢SGf8cB=2\ؤi˥+zjW(U)5sѡ3}ȦkT|FmYnjoһ&J6miKO6~E*^}iK?$;8LתXTF !qrG@|]j6$ 72%F^'!T5_=2DGˮi"Nd (t[kxo~$gNBIGxgϺ| @^mtUM硫yMΧ<àh׏U{3ƕKP}:qzTpI٩؃}__Y9h;f#?!`^rCH vp ߮Ga!BnJ@t@&'3Dztg0PH,ct"xfޢOWO>TG&8v6YUcA_YU0Z?~Ѯ@ۑB׿dߎzոG>hc!Մ \BE*D7 W飩 tƥ;T%mæ-4ET!5Y}<9Kv!Ax (%{9b!npqV51,0kn.SrQt똼%=RDwQ1<:S+En 6Q:>연W._ǷH%U m@0Q2`Y쫔s)_GN/-q0ӢG?D6XY_Z{k:$8h?:}S!<䗽#4?+aj{_Y]Z}$Hx؟o](fQLj{:e^$t˕dY m(\i'B6fZi޳ڮ^S|8̃&,MOu{Ŷ4Eno'Y>#Id>Kї]+}JWO9S 8 f ыoE|@eh^mQ3<7l啤R< 숯ı}VMRݡOѱr8Aw*~9~@K4JN>i bǧ)20oݻn'"@}/i$]<'VFH9 ev xAT-!z|&kmM1l bۨah;>^rTh|K#Jܫ ?8eۼ+Hiҳi5~M1A>cDzS >3M^Qjg`ؚ TCŌEN\`~%ymu10Nn;M!ΚDS.q`7W }.S梨3 [HB=:FmUud:~ӕ6xq0C}0ׄ>='7Ljkf|K_3MJqs:?bڣBvmf&R.o9}߱eI/f^7@42*W ?s-y6:GdxV"[Q:To;N-)Im ''WMAKZ> {5?oL%!eb"\Ol__=6Ÿz+;k; {h6Ff̏f_ Jlwh}:.aM[?E0jB/vNZum4O߰/q'qj:|ږ-S$w͌ːl |)"vY]8'&/4s֑`OѡD_Z0S{}MeAT`}.F7~X%{Çhx7o4XT'ĝq}+aIx˺鑸,Y^7':]a[ ~]zt@fbڏE;PD-o0҇r)&Zӈ|;3w(>N¹Ѝ?Kֿ2-|}o3=wFV!.49;"ql;zfیdnz_s&'UjzOwWvB3=_Cg`GߥUU) "xjCDq=xȿݠ¾B2D'zvC&`Мg k"Y;r9/_P*)NEsDwSO`jb"0TB %Nۋ'ڿX7g"s"nYp)?N1? ӽ)S+{h'~wb /_̋t }K{[֗M  ^"f?Sf> K'w^Ii?J|ND7_ٖJ?## KN&;/͵cxgV_zKo-7#TeÓ]bwq=h=g/|ܹ<H{2b퉺 я=43p5G Z)eОhL~B*O»k}M< @Q^͒uT}4%ȿ/=~ނi磿?N׬1^wVduƃe fm'1DV AMߛWM-J96p0;fptQq*<.1.tA? uڊ06-'Qh!bAoU䏚p,}oP3,XЗL SCg D$>ߞ]a=#G|^m1>4I:N'BܱMԜ{3ÇRt:֑jxW‰*iF=$vXMWu'ïxm uhݝEaHOtOfw!qyw S4/Z.01G7 x:ao' ZEZaG.y!*8UMe@\kM}>L9Z=T7}~PS[t,G ~`2ǎEkz"AT",&$$Fryvn,;hЇw$ C~.&t0C*l%Q- y h/;3vWT8XhsIIvQdAF}4̤ 9Pb7w㊘yu^(MiuC?:Fi n6޶%鲲R.PjBhmi̸³]!مrQ[9xTIQ/ԶGkD4 bxE-L>rH__kV^m v$($tx\tPҳl6**5Vj\b]u>`"h}O;DDaP"觐}fXoa2Ȝ?q,OJϷu!Gbo;?j9W$dlg+]:1?)=Qߪov#x䊃v&=U2k.|f2 PEePØ*62CC gEtODMJQ%cc#g+Ɔl \W1҃>_ޱĶZ}еl6MaS? x/db -x:6SJۢQOeh\4_uޮ#L5,X2`EEЉhjj&.%Hh? =Ӹ2c@0ׂ :Rm1|\yHy5i Jp?m0$6忿õ'⇁[ @L]?]Y P1(x?E'_DC[57_ERZn^E{rqL5iaLA]E%E-^g"h{}vmLRUKEEz@CNcx]. dD2G>o?Eb(ݔ%>94s{)',TJ>k޽"jaW?}xW3,WNuy@QJHt&K'5I?JVFnK"IMqURELOQ@pT6̆սM)83cf <+ WZG,ӕ;dO,­7g.} Wscxz< -o[lxB=Ͽ "hWp7+) Obќ3E,` )ᇟr9__I'UݸO:ϛv*6@k^"5!I"T|oYnE/p>o9όK^x PQY0 /!zb|kl;Ȋ64 '~n:9zuZN+(_әVc`CySխё;?GuCMWJ2nY]d_-dv?;!)2|`SNl?:1~!/k-!^U\1 nZ=*Wh__QM ,uȀT3u7*99Dҍ=l-"T#߉bb*!9 )*27C-vIg 5:GQ+&u9u3'c."g.14nuhXP>E#˯>Ӌ h^Y$%Ct:bxj8MZw^S9>]bnDHi e-RM LF=1߼,C7_pf4ů0:~ȷӞu8Qo0h1@9WǴUJA[D-mIWo(`R7x|w ꜽנ=2IsMp]ج:>G:)#i{ݕ˙~5&܌ѫ?,s P{9NDn2%?rڎ?cMNp=~' ~6zzl\wl?L4bȐ]iןmz͈*ny.( ۶*v_6#;$W_g ՛ӛ*Qhl%Ӗ[pa41STJoTx~HoD_1 zYc0A?j&)orM]_E^=>i} k gua6"MjYX:R\N o t_fhnգ K~M' \a ꡄcr Oo!IoЀܮw{G&ߎd=D $!S9N-z=xd,_vznRTgB"p  h}\d^xDbxwsk_v&'tw=5?jOop,zW!v(ՋqO5Be6PwԬP($ |Xn o2u$0h|*ӫ_ 0$5~~ Wv&8>z5IҠÒѤP*ᢗ)CASZN8DKGQTtp I "R(ѻ5.'8w_6 ZKчpeu\Pg[{}Xdoz_.;ci ׁrixBonŰ`>+wy(6cݮ ;Q/v`4~ȍ -;f=iHξͱ̘CѲ(9E%ܚlfN>Us( K$^*_l1~¼4~&FS!x7Ģ6*[U]eޑcO42Y4SU;NumK {"jt?)m@xw*9ޔ2MMcYס`T`!dlҊvÍ^jhTu[-P aw fP'pmcy;5t\UWq r =B3YcA=jkUD=T^Qz9pa uk2J+%tEXtdate:create2013-03-11T20:58:52-07:00ކ%tEXtdate:modify2013-03-11T20:58:52-07:00ztEXttiff:documentlena_500.tifgxtEXttiff:photometricmin-is-white;tEXttiff:rows-per-strip5007KtEXttiff:softwareImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.org}N%IENDB`pillow-2.3.0/Tests/images/lab-green.tif0000644000175000001440000005747412257506326016635 0ustar dokousersII*  ] , (122^;FI@!<i_ ' 'Adobe Photoshop CS3 Macintosh2013:10:15 21:26:01 image/tiff Adobe Photoshop CS3 Macintosh 2013-10-15T21:24:43-07:00 2013-10-15T21:26:01-07:00 2013-10-15T21:26:01-07:00 uuid:746A39A95A34E311B432EB92488C2511 uuid:756A39A95A34E311B432EB92488C2511 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;643A14E2CC6D44DCCF726A66839E3C30 10 10 8 8 8 1 8 3 1 10 10 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;76E873547D6C5EEF6EF8C950264DC120 9 8BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMI Untitled-1 nullboundsObjcRct1Top longLeftlongBtomlong Rghtlong slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong Rghtlong urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM F @*JFIFHH Adobe_CMAdobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I$$8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong9 ^FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong9 ^LCntlong8BIMRoll8BIMmfri  pillow-2.3.0/Tests/images/pil_sample_rgb.jpg0000644000175000001440000007123612257506326017746 0ustar dokousersJFIFHH ExifMM*bj(1r2iHHAdobe Photoshop CS Macintosh2009:03:06 22:15:29dd&(.HHJFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?6;~D6;~E$.t|xYUّX!:5]I): sNY')朌zI$V$IJI$RI$I%?G 65Vul/ݹ@R5tq I[fY^1?uWKOۜ?xk,Yz%Q$isDI0$5S]3.m2DmlD ka$%?/ɪ lɪcohe\؂bwtȮ-xur/%jscvc6$z^`-`?Gܗ?x}zjtM_I'+x?j ՎQIC$EbUGn5N[\׽~e.}tmn߷ulv~яڽC ;/!I֟M9dX[D2Xoe>_Xq,1fXNͣq[+4v!}zV}*fW.1 D⑙8Y9=_zkFˋ\F{zuT.݆A0xm,\u&Z5{˲p!?LCA߇VJXe1P9n?u^έ{qch:5,ȷ#&8۵oR[?ES>}ͤ{^v鲩sFuM#qFl9LJ#z.U,̷5 c 7޶RZnKgM49sicV s7:n?YajY] PC2s@}>_I:X^32]h_1\(qY|G-?殏ٺC|5E; ؎/`'/!?ků\IZq_cifcҬ~1Wy٬hkr-kZ 3$ s)J@ރus}2溫Ccp%n)Vf6kѨporok3ZmȾ}~DnD~pdw>-N+xx% GJvS몧͍AvmV]ޭcw!'ydmk\-/ǖis?9ThgܛwO'[łrbhˎ"9Js l:pխB"oZWXݡo%&ȱ}gsI( kɆSO_UqK_5UwsX} ֳev}dkp{ ic{C?{/&8 nd9*B8 com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName A4 com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH/8Ag{HH(dh 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMIdd pil_sampleddnullboundsObjcRct1Top longLeftlongBtomlongdRghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongdRghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM dd,u0JFIFHH Adobe_CMAdobed            dd"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?6;~D6;~E$.t|xYUّX!:5]I): sNY')朌zI$V$IJI$RI$I%?G 65Vul/ݹ@R5tq I[fY^1?uWKOۜ?xk,Yz%Q$isDI0$5S]3.m2DmlD ka$%?/ɪ lɪcohe\؂bwtȮ-xur/%jscvc6$z^`-`?Gܗ?x}zjtM_I'+x?j ՎQIC$EbUGn5N[\׽~e.}tmn߷ulv~яڽC ;/!I֟M9dX[D2Xoe>_Xq,1fXNͣq[+4v!}zV}*fW.1 D⑙8Y9=_zkFˋ\F{zuT.݆A0xm,\u&Z5{˲p!?LCA߇VJXe1P9n?u^έ{qch:5,ȷ#&8۵oR[?ES>}ͤ{^v鲩sFuM#qFl9LJ#z.U,̷5 c 7޶RZnKgM49sicV s7:n?YajY] PC2s@}>_I:X^32]h_1\(qY|G-?殏ٺC|5E; ؎/`'/!?ků\IZq_cifcҬ~1Wy٬hkr-kZ 3$ s)J@ރus}2溫Ccp%n)Vf6kѨporok3ZmȾ}~DnD~pdw>-N+xx% GJvS몧͍AvmV]ޭcw!'ydmk\-/ǖis?9ThgܛwO'[łrbhˎ"9Js l:pխB"oZWXݡo%&ȱ}gsI( kɆSO_UqK_5UwsX} ֳev}dkp{ ic{C?{/&8 nd9*B8 1 100 100 1 72/1 72/1 2 2009-03-06T22:15:29+01:00 2009-03-06T22:15:29+01:00 2009-03-06T22:15:29+01:00 Adobe Photoshop CS Macintosh adobe:docid:photoshop:903dad8c-0c2e-11de-aa32-f3694bed6de0 image/jpeg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@dd   !1A Qa2#Wq"3$5&6v9 !1"AQ2#q$ԕV aB34%U&WbrSstĵv7G9 ?GI?X;sQ?0YoKo?D_C8?V;2mZGfAnsզa,~Πʹ^Ss!M9(br.~)DyDDf/ZSir-8Щ(WXT^9Os976=MCh/o}IJ\ae;]V)'jHwV)LR1OF*>ZT)_"b)LR45LR1Jb 1N5"T⧥1JbS)LR8LSZb)W"؁җ1aֺx|#&0ۛNt" iU\j#*=3&S.[s2LJ3zlk]- ޕGZβvYf<5eY.6ԕGmi%gҰSU}mFRsZ2=ov!-{i]^7ONnƙn\N6reه5ͻvۮMtC^o~vLv+-R~CD/v;^bskz7ikWW\VbuDZ`"΀ջTDDN/! SD C~9 9V^𠝏!ܯGt5/ޔ@cY9~f*pJHud6da !NðdQ7ݶd߰`E,D;IG,#ZQÅAq:)L{Υ]}aEIQ JB% G+=r lDKAKPJKeH!ӪZP xϷ.oԉjck[MN&QEWj3:pF,2A/!L@G?>ƭL 77fFT3N㮃rど5~jXǥbͮF͆Ǯpڜ,BqOv@RL]^ĕ$)[v */~Rć2')o:’kj[⒥0S˼zCQn #7k|*uJԴ.ؐ\w?eՍ U$o4"V5MZBx(zf&%?#kk46{EYe;e#H)dQɺa3e1laA+-OM 8 Bw%]<_q-W'+K%{*z2'Se0m T8ZyG96W?/'~_[7exJYP6+T_W+3*'\_uNk$g]ubZB@O;+FAUul͇VM~{!Sjd%dhNVIwEhn*ŕ^{=9.J$;.VWI[{J/!w]Z/-c)Z=c3&F-^-B%Z5I3Lpy͙G/+%~j^e7[~׈SeD$JSiO0xզ :hP'ɉA`g-I쟫SrC!n:#iRW\vKڱ+S:ȗxxƛ- [T~ "Ԅ2o3)x՜n)K.ܣkTTR9k$vme[^j^h02gãb둰ؓuw -h2K%Q j#//+"D":|Z+ bK3`|D8q;Tt:ʛZTw<⺅ >_K+$g{EDIOeӉCϲ?u:@=6IDϤVTf];5I50C*nq]Na0rznY/"\eljMO đ/^@܏~~$lOWZ IY%nw\svg]xZ+#5Hk5Y^[t5,\nnCKx%!܂S(k%2_!!yV30jCI6bBPAsn]u'6%_ߓRdc#d%4h0( ʫ07j^*AEHnXFo KJK}/BR ID1s9?,rhL|qBmbi9nz޵4-.rR32knFk^;"dV+WbO/"o"$E1tNcr 89匆lGN4Wӯ˵aIҸ1{rHre{w6[s/JR*mԍN`j|jefO"\G:\{ީnG?3O7W%>g/#_S1澖ݞ-\oj߼URjw&*UȈlM*m̖[%I09S "Pspd>ć8#-ڝpе#UhԌ!^m})2쫄`m Z\ C #Z-=ҐVP_h8'_d׭2YHC"&_U Bqnx JT`Gs P RS fqCp-=Wo/nTER9yABPEqv/MrmY4›LyM?Muuy]T6tRNunȪU6NᱫشmaL*5{w%HO$0t@!B8L`pq3tW7cULHGsQT{?/< |nZͽ(qWjHoϡnROA+kKby7^$JB (MTĥ8U3>e ǯ F ǽCne`%{Ht=G+WAnW,܋i3p:CRh!* 8}*jIc)a24laghC;22S $ L"Yfȗj3%1V[PZ@oN'@u $Sx^{|>fuFLv0&[-^]ݏ%!KHJ%}vNUZĸlz)>jK.̍d7+LǺ2%PC?/0ɁFCaqX~J:JQHOuʆ7ٮ'O^Ho2u"GnmYCJRS$nR6JqvN!JOZ>MLAI2x #GA:nG8(Cx3(…2ψ N8!iH*CPAkI\~ %CXdnԘ7!B BmeR^եHVJtP"+b%=kFk2g Ua`r&M9A!9PGKI鋌!S+V>SZ#/{z¤oJG!s]F䴔=n[A@DmS/;ʼZ/(&ʸH1fg~ZF2"m0$xm-j!#Gi(U:nQJ5~A<9Bs\].(I!'D!#^FN"Ώݻ!c~2aŢDA6LK&ݫF&R&e)R[xݓ'!)jʔRPI$$Ik^n`ǕCEi-2i2h(m6$ HJ@*_W޷[mMMbov>hD>^HyCnYiƋwe7nwlJuSշr& γQB&|3;!͝טqsb7~hҫO}o$S")n}I{DLR( /\RVVN̒I$M]As6E! %)HRH:cj ."8A h'3 YV*V{" 5(CgAnK0pe2#B$A j|~RɦYY'${z+nr3PR^Zq*I[e*J {o׶x|_aߒvϽXJHP_߮eM>wm~?> ÿ$z"A~㫗5Kl]aX/w)PZ nb7'/ g%zX'yw*2' PŲY`ő+0m^BRSAt=*нrG"dNK緫Eŕ&t-lKnb jN=讵T}oo^\;?NiW\}oo^~|~I>c)Ezs/W/jNX')dɨQ*3oeN?7Wbĉ Džc! 蔀@/E=Ax:%oHuǝQ**%N8-DJQ$TORMyU."}TF*qSiS֘1Jb?n2+1JbOLR1Oܦ)Q8)LS")LR1Jb:S)LRG⢿"EN*i~1Jb)~1Jb*1Qҿ"M>>8blR٨XM1Jb˜1J|~LRpillow-2.3.0/Tests/test_file_png.py0000644000175000001440000001504712257511240016201 0ustar dokousersfrom tester import * from PIL import Image from PIL import PngImagePlugin import zlib codecs = dir(Image.core) if "zip_encoder" not in codecs or "zip_decoder" not in codecs: skip("zip/deflate support not available") # sample png stream file = "Images/lena.png" data = open(file, "rb").read() # stuff to create inline PNG images MAGIC = PngImagePlugin._MAGIC def chunk(cid, *data): file = BytesIO() PngImagePlugin.putchunk(*(file, cid) + data) return file.getvalue() o32 = PngImagePlugin.o32 IHDR = chunk(b"IHDR", o32(1), o32(1), b'\x08\x02', b'\0\0\0') IDAT = chunk(b"IDAT") IEND = chunk(b"IEND") HEAD = MAGIC + IHDR TAIL = IDAT + IEND def load(data): return Image.open(BytesIO(data)) def roundtrip(im, **options): out = BytesIO() im.save(out, "PNG", **options) out.seek(0) return Image.open(out) # -------------------------------------------------------------------- def test_sanity(): # internal version number assert_match(Image.core.zlib_version, "\d+\.\d+\.\d+(\.\d+)?$") file = tempfile("temp.png") lena("RGB").save(file) im = Image.open(file) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "PNG") lena("1").save(file) im = Image.open(file) lena("L").save(file) im = Image.open(file) lena("P").save(file) im = Image.open(file) lena("RGB").save(file) im = Image.open(file) lena("I").save(file) im = Image.open(file) # -------------------------------------------------------------------- def test_broken(): # Check reading of totally broken files. In this case, the test # file was checked into Subversion as a text file. file = "Tests/images/broken.png" assert_exception(IOError, lambda: Image.open(file)) def test_bad_text(): # Make sure PIL can read malformed tEXt chunks (@PIL152) im = load(HEAD + chunk(b'tEXt') + TAIL) assert_equal(im.info, {}) im = load(HEAD + chunk(b'tEXt', b'spam') + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'tEXt', b'spam\0') + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'tEXt', b'spam\0egg') + TAIL) assert_equal(im.info, {'spam': 'egg'}) im = load(HEAD + chunk(b'tEXt', b'spam\0egg\0') + TAIL) assert_equal(im.info, {'spam': 'egg\x00'}) def test_bad_ztxt(): # Test reading malformed zTXt chunks (python-imaging/Pillow#318) im = load(HEAD + chunk(b'zTXt') + TAIL) assert_equal(im.info, {}) im = load(HEAD + chunk(b'zTXt', b'spam') + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'zTXt', b'spam\0') + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'zTXt', b'spam\0\0') + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'zTXt', b'spam\0\0' + zlib.compress(b'egg')[:1]) + TAIL) assert_equal(im.info, {'spam': ''}) im = load(HEAD + chunk(b'zTXt', b'spam\0\0' + zlib.compress(b'egg')) + TAIL) assert_equal(im.info, {'spam': 'egg'}) def test_interlace(): file = "Tests/images/pil123p.png" im = Image.open(file) assert_image(im, "P", (162, 150)) assert_true(im.info.get("interlace")) assert_no_exception(lambda: im.load()) file = "Tests/images/pil123rgba.png" im = Image.open(file) assert_image(im, "RGBA", (162, 150)) assert_true(im.info.get("interlace")) assert_no_exception(lambda: im.load()) def test_load_transparent_p(): file = "Tests/images/pil123p.png" im = Image.open(file) assert_image(im, "P", (162, 150)) im = im.convert("RGBA") assert_image(im, "RGBA", (162, 150)) # image has 124 uniqe qlpha values assert_equal(len(im.split()[3].getcolors()), 124) def test_load_transparent_rgb(): file = "Tests/images/rgb_trns.png" im = Image.open(file) assert_image(im, "RGB", (64, 64)) im = im.convert("RGBA") assert_image(im, "RGBA", (64, 64)) # image has 876 transparent pixels assert_equal(im.split()[3].getcolors()[0][0], 876) def test_save_p_transparent_palette(): in_file = "Tests/images/pil123p.png" im = Image.open(in_file) file = tempfile("temp.png") assert_no_exception(lambda: im.save(file)) def test_save_p_single_transparency(): in_file = "Tests/images/p_trns_single.png" im = Image.open(in_file) file = tempfile("temp.png") assert_no_exception(lambda: im.save(file)) def test_save_l_transparency(): in_file = "Tests/images/l_trns.png" im = Image.open(in_file) file = tempfile("temp.png") assert_no_exception(lambda: im.save(file)) # There are 559 transparent pixels. im = im.convert('RGBA') assert_equal(im.split()[3].getcolors()[0][0], 559) def test_save_rgb_single_transparency(): in_file = "Tests/images/caption_6_33_22.png" im = Image.open(in_file) file = tempfile("temp.png") assert_no_exception(lambda: im.save(file)) def test_load_verify(): # Check open/load/verify exception (@PIL150) im = Image.open("Images/lena.png") assert_no_exception(lambda: im.verify()) im = Image.open("Images/lena.png") im.load() assert_exception(RuntimeError, lambda: im.verify()) def test_roundtrip_dpi(): # Check dpi roundtripping im = Image.open(file) im = roundtrip(im, dpi=(100, 100)) assert_equal(im.info["dpi"], (100, 100)) def test_roundtrip_text(): # Check text roundtripping im = Image.open(file) info = PngImagePlugin.PngInfo() info.add_text("TXT", "VALUE") info.add_text("ZIP", "VALUE", 1) im = roundtrip(im, pnginfo=info) assert_equal(im.info, {'TXT': 'VALUE', 'ZIP': 'VALUE'}) assert_equal(im.text, {'TXT': 'VALUE', 'ZIP': 'VALUE'}) def test_scary(): # Check reading of evil PNG file. For information, see: # http://scary.beasts.org/security/CESA-2004-001.txt # The first byte is removed from pngtest_bad.png # to avoid classification as malware. with open("Tests/images/pngtest_bad.png.bin", 'rb') as fd: data = b'\x89' + fd.read() pngfile = BytesIO(data) assert_exception(IOError, lambda: Image.open(pngfile)) def test_trns_rgb(): # Check writing and reading of tRNS chunks for RGB images. # Independent file sample provided by Sebastian Spaeth. file = "Tests/images/caption_6_33_22.png" im = Image.open(file) assert_equal(im.info["transparency"], (248, 248, 248)) # check saving transparency by default im = roundtrip(im) assert_equal(im.info["transparency"], (248, 248, 248)) im = roundtrip(im, transparency=(0, 1, 2)) assert_equal(im.info["transparency"], (0, 1, 2)) pillow-2.3.0/Tests/large_memory_test.py0000644000175000001440000000133612257506326017105 0ustar dokousersfrom tester import * # This test is not run automatically. # # It requires > 2gb memory for the >2 gigapixel image generated in the # second test. Running this automatically would amount to a denial of # service on our testing infrastructure. I expect this test to fail # on any 32 bit machine, as well as any smallish things (like # raspberrypis). It does succeed on a 3gb Ubuntu 12.04x64 VM on python # 2.7 an 3.2 from PIL import Image ydim = 32769 xdim = 48000 f = tempfile('temp.png') def _write_png(xdim,ydim): im = Image.new('L',(xdim,ydim),(0)) im.save(f) success() def test_large(): """ succeeded prepatch""" _write_png(xdim,ydim) def test_2gpx(): """failed prepatch""" _write_png(xdim,xdim) pillow-2.3.0/Tests/test_image_crop.py0000644000175000001440000000276012257506326016532 0ustar dokousersfrom tester import * from PIL import Image def test_crop(): def crop(mode): out = lena(mode).crop((50, 50, 100, 100)) assert_equal(out.mode, mode) assert_equal(out.size, (50, 50)) for mode in "1", "P", "L", "RGB", "I", "F": yield_test(crop, mode) def test_wide_crop(): def crop(*bbox): i = im.crop(bbox) h = i.histogram() while h and not h[-1]: del h[-1] return tuple(h) im = Image.new("L", (100, 100), 1) assert_equal(crop(0, 0, 100, 100), (0, 10000)) assert_equal(crop(25, 25, 75, 75), (0, 2500)) # sides assert_equal(crop(-25, 0, 25, 50), (1250, 1250)) assert_equal(crop(0, -25, 50, 25), (1250, 1250)) assert_equal(crop(75, 0, 125, 50), (1250, 1250)) assert_equal(crop(0, 75, 50, 125), (1250, 1250)) assert_equal(crop(-25, 25, 125, 75), (2500, 5000)) assert_equal(crop(25, -25, 75, 125), (2500, 5000)) # corners assert_equal(crop(-25, -25, 25, 25), (1875, 625)) assert_equal(crop(75, -25, 125, 25), (1875, 625)) assert_equal(crop(75, 75, 125, 125), (1875, 625)) assert_equal(crop(-25, 75, 25, 125), (1875, 625)) # -------------------------------------------------------------------- def test_negative_crop(): # Check negative crop size (@PIL171) im = Image.new("L", (512, 512)) im = im.crop((400, 400, 200, 200)) assert_equal(im.size, (0, 0)) assert_equal(len(im.getdata()), 0) assert_exception(IndexError, lambda: im.getdata()[0]) pillow-2.3.0/Tests/test_image_getprojection.py0000644000175000001440000000175412257506326020445 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() projection = im.getprojection() assert_equal(len(projection), 2) assert_equal(len(projection[0]), im.size[0]) assert_equal(len(projection[1]), im.size[1]) # 8-bit image im = Image.new("L", (10, 10)) assert_equal(im.getprojection()[0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) assert_equal(im.getprojection()[1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) im.paste(255, (2, 4, 8, 6)) assert_equal(im.getprojection()[0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0]) assert_equal(im.getprojection()[1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0]) # 32-bit image im = Image.new("RGB", (10, 10)) assert_equal(im.getprojection()[0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) assert_equal(im.getprojection()[1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) im.paste(255, (2, 4, 8, 6)) assert_equal(im.getprojection()[0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0]) assert_equal(im.getprojection()[1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0]) pillow-2.3.0/Tests/test_001_archive.py0000644000175000001440000000111212257506326016414 0ustar dokousersimport PIL import PIL.Image import glob, os for file in glob.glob("../pil-archive/*"): f, e = os.path.splitext(file) if e in [".txt", ".ttf", ".otf", ".zip"]: continue try: im = PIL.Image.open(file) im.load() except IOError as v: print("-", "failed to open", file, "-", v) else: print("+", file, im.mode, im.size, im.format) if e == ".exif": try: info = im._getexif() except KeyError as v: print("-", "failed to get exif info from", file, "-", v) print("ok") pillow-2.3.0/Tests/test_imagefile.py0000644000175000001440000000347412257506326016352 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageFile codecs = dir(Image.core) # save original block sizes MAXBLOCK = ImageFile.MAXBLOCK SAFEBLOCK = ImageFile.SAFEBLOCK def test_parser(): def roundtrip(format): im = lena("L").resize((1000, 1000)) if format in ("MSP", "XBM"): im = im.convert("1") file = BytesIO() im.save(file, format) data = file.getvalue() parser = ImageFile.Parser() parser.feed(data) imOut = parser.close() return im, imOut assert_image_equal(*roundtrip("BMP")) assert_image_equal(*roundtrip("GIF")) assert_image_equal(*roundtrip("IM")) assert_image_equal(*roundtrip("MSP")) if "zip_encoder" in codecs: try: # force multiple blocks in PNG driver ImageFile.MAXBLOCK = 8192 assert_image_equal(*roundtrip("PNG")) finally: ImageFile.MAXBLOCK = MAXBLOCK assert_image_equal(*roundtrip("PPM")) assert_image_equal(*roundtrip("TIFF")) assert_image_equal(*roundtrip("XBM")) #assert_image_equal(*roundtrip("EPS")) #no eps_decoder assert_image_equal(*roundtrip("TGA")) assert_image_equal(*roundtrip("PCX")) if "jpeg_encoder" in codecs: im1, im2 = roundtrip("JPEG") # lossy compression assert_image(im1, im2.mode, im2.size) # XXX Why assert exception and why does it fail? # https://github.com/python-imaging/Pillow/issues/78 #assert_exception(IOError, lambda: roundtrip("PDF")) def test_safeblock(): im1 = lena() if "zip_encoder" not in codecs: skip("PNG (zlib) encoder not available") try: ImageFile.SAFEBLOCK = 1 im2 = fromstring(tostring(im1, "PNG")) finally: ImageFile.SAFEBLOCK = SAFEBLOCK assert_image_equal(im1, im2) pillow-2.3.0/Tests/test_numpy.py0000644000175000001440000000735312257512376015602 0ustar dokousersfrom tester import * from PIL import Image import struct try: import site import numpy except ImportError: skip() def test_numpy_to_image(): def to_image(dtype, bands=1, bool=0): if bands == 1: if bool: data = [0, 1] * 50 else: data = list(range(100)) a = numpy.array(data, dtype=dtype) a.shape = 10, 10 i = Image.fromarray(a) if list(i.getdata()) != data: print("data mismatch for", dtype) else: data = list(range(100)) a = numpy.array([[x]*bands for x in data], dtype=dtype) a.shape = 10, 10, bands i = Image.fromarray(a) if list(i.split()[0].getdata()) != list(range(100)): print("data mismatch for", dtype) # print dtype, list(i.getdata()) return i # assert_image(to_image(numpy.bool, bool=1), "1", (10, 10)) # assert_image(to_image(numpy.bool8, bool=1), "1", (10, 10)) assert_exception(TypeError, lambda: to_image(numpy.uint)) assert_image(to_image(numpy.uint8), "L", (10, 10)) assert_exception(TypeError, lambda: to_image(numpy.uint16)) assert_exception(TypeError, lambda: to_image(numpy.uint32)) assert_exception(TypeError, lambda: to_image(numpy.uint64)) assert_image(to_image(numpy.int8), "I", (10, 10)) if Image._ENDIAN == '<': # Little endian assert_image(to_image(numpy.int16), "I;16", (10, 10)) else: assert_image(to_image(numpy.int16), "I;16B", (10, 10)) assert_image(to_image(numpy.int32), "I", (10, 10)) assert_exception(TypeError, lambda: to_image(numpy.int64)) assert_image(to_image(numpy.float), "F", (10, 10)) assert_image(to_image(numpy.float32), "F", (10, 10)) assert_image(to_image(numpy.float64), "F", (10, 10)) assert_image(to_image(numpy.uint8, 3), "RGB", (10, 10)) assert_image(to_image(numpy.uint8, 4), "RGBA", (10, 10)) # based on an erring example at http://is.gd/6F0esS (which resolves to) # http://stackoverflow.com/questions/10854903/what-is-causing-dimension-dependent-attributeerror-in-pil-fromarray-function def test_3d_array(): a = numpy.ones((10, 10, 10), dtype=numpy.uint8) assert_image(Image.fromarray(a[1, :, :]), "L", (10, 10)) assert_image(Image.fromarray(a[:, 1, :]), "L", (10, 10)) assert_image(Image.fromarray(a[:, :, 1]), "L", (10, 10)) def _test_img_equals_nparray(img, np): assert_equal(img.size, np.shape[0:2]) px = img.load() for x in range(0, img.size[0], int(img.size[0]/10)): for y in range(0, img.size[1], int(img.size[1]/10)): assert_deep_equal(px[x,y], np[y,x]) def test_16bit(): img = Image.open('Tests/images/16bit.cropped.tif') np_img = numpy.array(img) _test_img_equals_nparray(img, np_img) assert_equal(np_img.dtype, numpy.dtype('u2'), ("I;16L", '= (3,0)) # some test helpers _target = None _tempfiles = [] _logfile = None def success(): import sys success.count += 1 if _logfile: print(sys.argv[0], success.count, failure.count, file=_logfile) def failure(msg=None, frame=None): import sys, linecache failure.count += 1 if _target: if frame is None: frame = sys._getframe() while frame.f_globals.get("__name__") != _target.__name__: frame = frame.f_back location = (frame.f_code.co_filename, frame.f_lineno) prefix = "%s:%d: " % location line = linecache.getline(*location) print(prefix + line.strip() + " failed:") if msg: print("- " + msg) if _logfile: print(sys.argv[0], success.count, failure.count, file=_logfile) success.count = failure.count = 0 # predicates def assert_true(v, msg=None): if v: success() else: failure(msg or "got %r, expected true value" % v) def assert_false(v, msg=None): if v: failure(msg or "got %r, expected false value" % v) else: success() def assert_equal(a, b, msg=None): if a == b: success() else: failure(msg or "got %r, expected %r" % (a, b)) def assert_almost_equal(a, b, msg=None, eps=1e-6): if abs(a-b) < eps: success() else: failure(msg or "got %r, expected %r" % (a, b)) def assert_deep_equal(a, b, msg=None): try: if len(a) == len(b): if all([x==y for x,y in zip(a,b)]): success() else: failure(msg or "got %s, expected %s" % (a,b)) else: failure(msg or "got length %s, expected %s" % (len(a), len(b))) except: assert_equal(a,b,msg) def assert_match(v, pattern, msg=None): import re if re.match(pattern, v): success() else: failure(msg or "got %r, doesn't match pattern %r" % (v, pattern)) def assert_exception(exc_class, func): import sys, traceback try: func() except exc_class: success() except: failure("expected %r exception, got %r" % ( exc_class.__name__, sys.exc_info()[0].__name__)) traceback.print_exc() else: failure("expected %r exception, got no exception" % exc_class.__name__) def assert_no_exception(func): import sys, traceback try: func() except: failure("expected no exception, got %r" % sys.exc_info()[0].__name__) traceback.print_exc() else: success() def assert_warning(warn_class, func): # note: this assert calls func three times! import warnings def warn_error(message, category, **options): raise category(message) def warn_ignore(message, category, **options): pass warn = warnings.warn result = None try: warnings.warn = warn_ignore assert_no_exception(func) result = func() warnings.warn = warn_error assert_exception(warn_class, func) finally: warnings.warn = warn # restore return result # helpers from io import BytesIO def fromstring(data): from PIL import Image return Image.open(BytesIO(data)) def tostring(im, format, **options): out = BytesIO() im.save(out, format, **options) return out.getvalue() def lena(mode="RGB", cache={}): from PIL import Image im = cache.get(mode) if im is None: if mode == "RGB": im = Image.open("Images/lena.ppm") elif mode == "F": im = lena("L").convert(mode) elif mode[:4] == "I;16": im = lena("I").convert(mode) else: im = lena("RGB").convert(mode) cache[mode] = im return im def assert_image(im, mode, size, msg=None): if mode is not None and im.mode != mode: failure(msg or "got mode %r, expected %r" % (im.mode, mode)) elif size is not None and im.size != size: failure(msg or "got size %r, expected %r" % (im.size, size)) else: success() def assert_image_equal(a, b, msg=None): if a.mode != b.mode: failure(msg or "got mode %r, expected %r" % (a.mode, b.mode)) elif a.size != b.size: failure(msg or "got size %r, expected %r" % (a.size, b.size)) elif a.tobytes() != b.tobytes(): failure(msg or "got different content") # generate better diff? else: success() def assert_image_similar(a, b, epsilon, msg=None): epsilon = float(epsilon) if a.mode != b.mode: return failure(msg or "got mode %r, expected %r" % (a.mode, b.mode)) elif a.size != b.size: return failure(msg or "got size %r, expected %r" % (a.size, b.size)) diff = 0 try: ord(b'0') for abyte,bbyte in zip(a.tobytes(),b.tobytes()): diff += abs(ord(abyte)-ord(bbyte)) except: for abyte,bbyte in zip(a.tobytes(),b.tobytes()): diff += abs(abyte-bbyte) ave_diff = float(diff)/(a.size[0]*a.size[1]) if epsilon < ave_diff: failure(msg or "average pixel value difference %.4f > epsilon %.4f" %(ave_diff, epsilon)) else: success() def tempfile(template, *extra): import os, os.path, sys, tempfile files = [] root = os.path.join(tempfile.gettempdir(), 'pillow-tests') try: os.mkdir(root) except OSError: pass for temp in (template,) + extra: assert temp[:5] in ("temp.", "temp_") name = os.path.basename(sys.argv[0]) name = temp[:4] + os.path.splitext(name)[0][4:] name = name + "_%d" % len(_tempfiles) + temp[4:] name = os.path.join(root, name) files.append(name) _tempfiles.extend(files) return files[0] # test runner def run(): global _target, _tests, run import sys, traceback _target = sys.modules["__main__"] run = None # no need to run twice tests = [] for name, value in list(vars(_target).items()): if name[:5] == "test_" and type(value) is type(success): tests.append((value.__code__.co_firstlineno, name, value)) tests.sort() # sort by line for lineno, name, func in tests: try: _tests = [] func() for func, args in _tests: func(*args) except: t, v, tb = sys.exc_info() tb = tb.tb_next if tb: failure(frame=tb.tb_frame) traceback.print_exception(t, v, tb) else: print("%s:%d: cannot call test function: %s" % ( sys.argv[0], lineno, v)) failure.count += 1 def yield_test(function, *args): # collect delayed/generated tests _tests.append((function, args)) def skip(msg=None): import os print("skip") os._exit(0) # don't run exit handlers def _setup(): global _logfile def report(): if run: run() if success.count and not failure.count: print("ok") # only clean out tempfiles if test passed import os, os.path, tempfile for file in _tempfiles: try: os.remove(file) except OSError: pass # report? temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests') try: os.rmdir(temp_root) except OSError: pass if "--coverage" in sys.argv: import coverage coverage.stop() # The coverage module messes up when used from inside an # atexit handler. Do an explicit save to make sure that # we actually flush the coverage cache. coverage.the_coverage.save() import atexit, sys atexit.register(report) if "--coverage" in sys.argv: import coverage coverage.start() if "--log" in sys.argv: _logfile = open("test.log", "a") _setup() pillow-2.3.0/Tests/test_image_resize.py0000644000175000001440000000052612257506326017066 0ustar dokousersfrom tester import * from PIL import Image def test_resize(): def resize(mode, size): out = lena(mode).resize(size) assert_equal(out.mode, mode) assert_equal(out.size, size) for mode in "1", "P", "L", "RGB", "I", "F": yield_test(resize, mode, (100, 100)) yield_test(resize, mode, (200, 200)) pillow-2.3.0/Tests/test_image_convert.py0000644000175000001440000000215512257510072017236 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): def convert(im, mode): out = im.convert(mode) assert_equal(out.mode, mode) assert_equal(out.size, im.size) modes = "1", "L", "I", "F", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr" for mode in modes: im = lena(mode) for mode in modes: yield_test(convert, im, mode) def test_default(): im = lena("P") assert_image(im, "P", im.size) im = im.convert() assert_image(im, "RGB", im.size) im = im.convert() assert_image(im, "RGB", im.size) # ref https://github.com/python-imaging/Pillow/issues/274 def _test_float_conversion(im): orig = im.getpixel((5,5)) converted = im.convert('F').getpixel((5,5)) assert_equal(orig, converted) def test_8bit(): im = Image.open('Images/lena.jpg') _test_float_conversion(im.convert('L')) def test_16bit(): im = Image.open('Tests/images/16bit.cropped.tif') _test_float_conversion(im) def test_16bit_workaround(): im = Image.open('Tests/images/16bit.cropped.tif') _test_float_conversion(im.convert('I')) pillow-2.3.0/Tests/test_mode_i16.py0000644000175000001440000000470112257506326016025 0ustar dokousersfrom tester import * from PIL import Image def verify(im1): im2 = lena("I") assert_equal(im1.size, im2.size) pix1 = im1.load() pix2 = im2.load() for y in range(im1.size[1]): for x in range(im1.size[0]): xy = x, y if pix1[xy] != pix2[xy]: failure( "got %r from mode %s at %s, expected %r" % (pix1[xy], im1.mode, xy, pix2[xy]) ) return success() def test_basic(): # PIL 1.1 has limited support for 16-bit image data. Check that # create/copy/transform and save works as expected. def basic(mode): imIn = lena("I").convert(mode) verify(imIn) w, h = imIn.size imOut = imIn.copy() verify(imOut) # copy imOut = imIn.transform((w, h), Image.EXTENT, (0, 0, w, h)) verify(imOut) # transform filename = tempfile("temp.im") imIn.save(filename) imOut = Image.open(filename) verify(imIn) verify(imOut) imOut = imIn.crop((0, 0, w, h)) verify(imOut) imOut = Image.new(mode, (w, h), None) imOut.paste(imIn.crop((0, 0, w//2, h)), (0, 0)) imOut.paste(imIn.crop((w//2, 0, w, h)), (w//2, 0)) verify(imIn) verify(imOut) imIn = Image.new(mode, (1, 1), 1) assert_equal(imIn.getpixel((0, 0)), 1) imIn.putpixel((0, 0), 2) assert_equal(imIn.getpixel((0, 0)), 2) if mode == "L": max = 255 else: max = 32767 imIn = Image.new(mode, (1, 1), 256) assert_equal(imIn.getpixel((0, 0)), min(256, max)) imIn.putpixel((0, 0), 512) assert_equal(imIn.getpixel((0, 0)), min(512, max)) basic("L") basic("I;16") basic("I;16B") basic("I;16L") basic("I") def test_tobytes(): def tobytes(mode): return Image.new(mode, (1, 1), 1).tobytes() order = 1 if Image._ENDIAN == '<' else -1 assert_equal(tobytes("L"), b"\x01") assert_equal(tobytes("I;16"), b"\x01\x00") assert_equal(tobytes("I;16B"), b"\x00\x01") assert_equal(tobytes("I"), b"\x01\x00\x00\x00"[::order]) def test_convert(): im = lena("I") verify(im.convert("I;16")) verify(im.convert("I;16").convert("L")) verify(im.convert("I;16").convert("I")) verify(im.convert("I;16B")) verify(im.convert("I;16B").convert("L")) verify(im.convert("I;16B").convert("I")) pillow-2.3.0/Tests/versions.py0000644000175000001440000000063012257506326015230 0ustar dokousersfrom PIL import Image def version(module, version): v = getattr(module.core, version + "_version", None) if v: print(version, v) version(Image, "jpeglib") version(Image, "zlib") try: from PIL import ImageFont except ImportError: pass else: version(ImageFont, "freetype2") try: from PIL import ImageCms except ImportError: pass else: version(ImageCms, "littlecms") pillow-2.3.0/Tests/test_imagetk.py0000644000175000001440000000017512257506326016044 0ustar dokousersfrom tester import * from PIL import Image try: from PIL import ImageTk except ImportError as v: skip(v) success() pillow-2.3.0/Tests/test_image_save.py0000644000175000001440000000006712257506326016523 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_file_xbm.py0000644000175000001440000000206712257506326016212 0ustar dokousersfrom tester import * from PIL import Image PIL151 = b""" #define basic_width 32 #define basic_height 32 static char basic_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x02, 0x80, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; """ def test_pil151(): im = Image.open(BytesIO(PIL151)) assert_no_exception(lambda: im.load()) assert_equal(im.mode, '1') assert_equal(im.size, (32, 32)) pillow-2.3.0/Tests/test_locale.py0000644000175000001440000000125512257506326015662 0ustar dokousersfrom tester import * from PIL import Image import locale # ref https://github.com/python-imaging/Pillow/issues/272 ## on windows, in polish locale: ## import locale ## print locale.setlocale(locale.LC_ALL, 'polish') ## import string ## print len(string.whitespace) ## print ord(string.whitespace[6]) ## Polish_Poland.1250 ## 7 ## 160 # one of string.whitespace is not freely convertable into ascii. path = "Images/lena.jpg" def test_sanity(): assert_no_exception(lambda: Image.open(path)) try: locale.setlocale(locale.LC_ALL, "polish") except: skip('polish locale not available') import string assert_no_exception(lambda: Image.open(path)) pillow-2.3.0/Tests/test_imagewin.py0000644000175000001440000000012012257506326016211 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageWin success() pillow-2.3.0/Tests/import_all.py0000644000175000001440000000047312257506326015527 0ustar dokousersimport sys sys.path.insert(0, ".") import glob, os import traceback for file in glob.glob("PIL/*.py"): module = os.path.basename(file)[:-3] try: exec("from PIL import " + module) except (ImportError, SyntaxError): print("===", "failed to import", module) traceback.print_exc() pillow-2.3.0/Tests/test_image_show.py0000644000175000001440000000006712257506326016545 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_file_psd.py0000644000175000001440000000043712257506326016211 0ustar dokousersfrom tester import * from PIL import Image # sample ppm stream file = "Images/lena.psd" data = open(file, "rb").read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "RGB") assert_equal(im.size, (128, 128)) assert_equal(im.format, "PSD") pillow-2.3.0/Tests/large_memory_numpy_test.py0000644000175000001440000000141512257512250020324 0ustar dokousersfrom tester import * # This test is not run automatically. # # It requires > 2gb memory for the >2 gigapixel image generated in the # second test. Running this automatically would amount to a denial of # service on our testing infrastructure. I expect this test to fail # on any 32 bit machine, as well as any smallish things (like # raspberrypis). from PIL import Image try: import numpy as np except: skip() ydim = 32769 xdim = 48000 f = tempfile('temp.png') def _write_png(xdim,ydim): dtype = np.uint8 a = np.zeros((xdim, ydim), dtype=dtype) im = Image.fromarray(a, 'L') im.save(f) success() def test_large(): """ succeeded prepatch""" _write_png(xdim,ydim) def test_2gpx(): """failed prepatch""" _write_png(xdim,xdim) pillow-2.3.0/Tests/test_imagesequence.py0000644000175000001440000000056512257506326017241 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageSequence def test_sanity(): file = tempfile("temp.im") im = lena("RGB") im.save(file) seq = ImageSequence.Iterator(im) index = 0 for frame in seq: assert_image_equal(im, frame) assert_equal(im.tell(), index) index = index + 1 assert_equal(index, 1) pillow-2.3.0/Tests/test_image_paste.py0000644000175000001440000000006712257506326016701 0ustar dokousersfrom tester import * from PIL import Image success() pillow-2.3.0/Tests/test_file_gif.py0000644000175000001440000000222412257506326016164 0ustar dokousersfrom tester import * from PIL import Image codecs = dir(Image.core) if "gif_encoder" not in codecs or "gif_decoder" not in codecs: skip("gif support not available") # can this happen? # sample gif stream file = "Images/lena.gif" with open(file, "rb") as f: data = f.read() def test_sanity(): im = Image.open(file) im.load() assert_equal(im.mode, "P") assert_equal(im.size, (128, 128)) assert_equal(im.format, "GIF") def test_optimize(): def test(optimize): im = Image.new("L", (1, 1), 0) file = BytesIO() im.save(file, "GIF", optimize=optimize) return len(file.getvalue()) assert_equal(test(0), 800) assert_equal(test(1), 38) def test_roundtrip(): out = tempfile('temp.gif') im = lena() im.save(out) reread = Image.open(out) assert_image_similar(reread.convert('RGB'), im, 50) def test_roundtrip2(): #see https://github.com/python-imaging/Pillow/issues/403 out = 'temp.gif'#tempfile('temp.gif') im = Image.open('Images/lena.gif') im2 = im.copy() im2.save(out) reread = Image.open(out) assert_image_similar(reread.convert('RGB'), lena(), 50) pillow-2.3.0/Tests/test_imagetransform.py0000644000175000001440000000122512257506326017436 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageTransform im = Image.new("L", (100, 100)) seq = tuple(range(10)) def test_sanity(): transform = ImageTransform.AffineTransform(seq[:6]) assert_no_exception(lambda: im.transform((100, 100), transform)) transform = ImageTransform.ExtentTransform(seq[:4]) assert_no_exception(lambda: im.transform((100, 100), transform)) transform = ImageTransform.QuadTransform(seq[:8]) assert_no_exception(lambda: im.transform((100, 100), transform)) transform = ImageTransform.MeshTransform([(seq[:4], seq[:8])]) assert_no_exception(lambda: im.transform((100, 100), transform)) pillow-2.3.0/Tests/fonts/0000755000175000001440000000000012274164154014136 5ustar dokouserspillow-2.3.0/Tests/fonts/FreeMono.ttf0000644000175000001440000220556012257506326016403 0ustar dokousers FFTMY/ TGDEF`GPOS P~%>GSUB ܜ xOS/21f`cmapFC<cvt Tfpgm/QXegasp-glyf*)dxX X+XgX5X3XqX+X X XXEX3X3X+XfXHX3X.X(XXFXqX3X?XX5XX+X?X<X=XDXXzX5XqXXFX:X+X5X|XHXRXX^X+X+X+X%XX"X+XZX+XHX+X+XpXBX0XX0XQX+XPXYX+X{X'XdX3XX+X+XX>X@X\XqXqXTXX XX-X3X2X3X X,X+X>X X+XX\X3X3X-X9X X5X3X3X+X?XHX2XX(X2XIXXXX X+X@XX XHXQXlXrX7X?X XgXAXAXFXXX4XAXHXAXXTXfX3X X3X5X`X X X@X XlXJX XXX?X?X+XrXJXgX\X\XuX"XX+XFXAX3X>XX+XXXX X X XXXX&XX&X|X|XX"X3XHX XX XX X X3XHXX+XX+(GnX3XAX+XlX+XX>XrX>XrX>XrXX X\XgX$XFX$XFX$XFXX X5XRX5XRXXX?XTX?XTXHXzX3XX3XX(X3XXXJX`XJX`XJX`XXXXXqXX X$XFX9XXX5XRX5XAXJX`X X4XqX XHX XHX X X+X?X2XLX2XLXX X\XgX`X_X3XAX3XAX3XHX3XHX3XHX@XJX2X3X2X3X2X3XIX`X>XrX X X7XX(X3X(X3X\XgX9XXX3X?XXX-XFX3XAXIX`X)X)X+XX"X"X:X)X X5XX?XX.X)XkX5XX!XXZXX=X*X+XX@X X)X X\X*XAX\XGXX3XZXXXXXXXX X4X+X!X,X+X}X5XX5X5XIXXGX8X5XGXBXPX6X[XXGX5X]X XGX5X,X,XgX5X?XyX XiXHXZX,XXX XdX1X XX<X<XX<X<XXX<XXX<X<X<X<X<XXX<X<X<X<X<X2X1X<X3XXZXZXZXXXXX$XgX(XeXXXDXdXXXXdXXXXeXXdXX(XX(X(X=X=X=XXXaXaXXXXX\X\XXX(X(XdXdXdXX(XeXdXPXXeXXeXdX2XXXXnXX\XDX\X\XyXqXXXqX(XeXXXXXXeXeX(X(X(X(X(X(X(X(X(X=X=X=X=X=X=X=XXXXXXXXXXaXaXaXaXXaXaXaXaXXXXXX\XX(X(X(X(X(X(XeXeX(X(X(XdXdXdX(X(XX(X(X XPXPXPXPXeXeXeXeXeX2X=XXXXXeXeXeXeXeXeXeXeXdXXdXeX(XX(X(XXXXaXXXXnXX\XX\X\XyXXXXXX2XfXjX]X5XdXdXAX@XgXcX5XfXcX:XdX]X5XjX5X5X4XbX5XhX@XjX5XfXPXLXfX2XjX.XnXbXuXWX]XeXX+X+XHXX X\XHX3XJX2X XTX+XXhXXhX>X4XXBXHX@X X2X#XX3XJX*X3X9X?XXJXgXXXHXX5X XXhX(XXTX+X\XLX&X2X XMX;XHXZX X\X)X2X?X?X?XX4X+X2X&X(X+X(X X#XX3X3XHXQXX>X<X2XX+XXXvX:XvXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhX1XXX}XX-XpXXXX~X~XXXXXXXiXiXLXXXXWXLXXOXX-XX-XXiXLXX~XXLXXXX~XLXLX XHX+XX+XX+XX?XTX+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+XiX?X?X5X+X5X+X5X+X5X+X5X+XqX\XqX\X+X?X+X?X+X?X?X\X?X\X?X\X?X\X X X X X X XX5XX5XX5XX5X3XHX3XHX3XHX3XHX+XX+XX+XTX+XTX+XTX+XTX\XgX\XgX\XgX\XgX\XgXHX+XHX+XHX+XHX+X(X+X(X+X(X+X(X+X(X+X XX XXXXXXXXXXXX(X3X(X3X3X3XgXsXgXsXgXsX+X+XX3XHXiX XHX XHX XHXXHX XHX XHX XHX XHX XHX XHX XHX XHX+X?X+X?X+X?X+X?XX?XX&X+X?X+X?XqX\XqX\X3XHX3XHX3XHXXHXX0X3XHX3XHX3XHX3XHX3XHX3XHX3XHX(X+X(X+X(X+X(X+X(X+X(X+X(X+X3X3X3X3X3X3X3X3X?X?X?X?X?X?X?X?XXXXXXXXXXXXXXXXXXX~XX5X5X5X5X5X5X5X5XXXXXXXXXXXfXiXXXOXoXXXXXXXXXHXHXHXHXHXHXX XXXXX+X+X+X+X+X+X+X+XXXXX+X+X+X+X+X+X+X+XXXXXXXXX?X?XXX5X5XXXHXHX+X+X+X+X?X?X?X?X?X?X?X?XXXXxXXXXX5X5X5X5X5X5X5X5XXXXXXXXX+X+X+X+X+X+X+X+XXXXXXXXX?X?X?X?X?X?X?X X XXX XXXXXX5X5X5X5X5XXXXX3XXXXjXjXfXX`XZXqXqXXXXXX+X+X+X+XXX+X+X3X3XXXXXXX+X+X+X+X+XXXXXFXXXXXXXXXXXXXXXXXHXHXXXXXXXX2XBX]XVXX|X|XXXXX3XXXXXXXXXX"XXXiXXXiXXX?X%X=XpXXXdXdXXXHX2XXXX&XXiXOXQXQXqXXdXqXjXXdXHXhXXXXXXHXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXX?X?X+X?X XXXXX<X+X X+XHX XgX+X?X X>X?XHXP 6@)XXX?XX?X X X\X+XX!X"X"X1XVXVXuXXX XX4X+X3X(X#X+X XXX1XFXFXX+X X?X+X<X<XX<X>XXX2X7X7X3XjXXbXXXXXXXXXXXX8XXqX1X!X%X+X%X XXX(XXX?X?X+X X\XOXX XXX+XX?X3X"X"X\XTX?X X)XX6XXXXpX{XxXX(X(XMXMX(XX(XX)X>X*XX*XXX)XFX)XFXXXXiXXiXX*X)X(X(X+X&X;X9X!X!XXX!X1XXX)X+X)X)X*XJX*X!X!X8XX8X8XX2XXXX,X,X*XX*XXX X?XX+X+X#X+X+X&X&XsX&X&XsXX3X3XqXHXHXHX`X`XqXXX X X X%XXXFX1XCXXXXX<X<XGXIXX8XXnX8XXnXnXnX;X;XX<XHXHX<X\X\X\XXfXX\XJXJXHX3X3X3X\X\XJX\X3XdX3X3X3X3X3X3X.X.X3X3X3X3X3X3X3X3XX3X3X3X3X3XAXNX3X3X%X%XXXXdXHXNX+X;XHXNXHXNXXXXXHXFXHXFXHXFXHXFX3X3X3X3X3X3X3X3X3X3XIXIXIXJX>XJX>XHXHXXXXX#X#X#X#X#X2X2X2X2X3X'XXXXX3XwXIX"X3X3XyX"X{X{X_XyXHXHXXX\X4XdX<X<X<XXX-X-X+X+XXXXHX\X\X\XXXLX8X8X3X3XGXGXxX3XNXNXXXXX8X8XFXHXHXFX4X3X3X3XHXNXHXFX_X`XHXHXXCX$XX7X2XXXXXX"XX"XX(XX(XHX#XX7XXHXX'XX'XXYXdXdXX XX>XXXX+XXPXXXXXX#X#XHXHXXXXX)XIXXX#XX+XXXXHXXX+XXXXHXXX+XXX#XGXX#XXX+XXX#XHX3X\XNXHX+X\X\XXXXJXJXXX+X?XXX+X?XXXXX<XXXXX2XXXXXXXXXX#X#X#X#XXXXXXXXXTXTXTXQXXQX,X,X,XdXXdXX,XXXcXXcXXX<X<X X XXXX"XXXXXXX(X(X(XXXXXXXWXWXXXXX@XXXXXX+XX XX,X8X.X#X-X#XX&XXjXsXXXuXhXoX~X+X!X+X+X+X"X$X#XXrX!X#XaX_XiXZXX!XX(XXXqXXjXjXjXjX XX X#X XbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXX,XXXXXXXXXXXXXXXXXXXXXX,XXXXX XX,XXXXXX,XXX2X2X2X2X2X2X2X2X2X2XXX2X2XXXXX#X#XXXTXTXXXyXyX#X#XXX9X9XXX^X_X#X#X#X#XYX#X#X#X#X#X#X#X#X#X#X#X#X,XXXXX#X,X,X#X#X#X2X2X2X2XX2X2X2X2X2X#X#X#XX2X2X2X2X#X#X#X#X2X2X2X2X2X}X}X2XX/X<X$XXXXxXZX#X2X2X2XqX.X&X2X&X2X2X8XPXXPXX#X#X2X2X2X2X2X2X2X2X X#X#X#XXX7XvXvXvX@XX8XXXVXX:XXXXXXXX XXXHX,XTXXHX,XQXXXX6X6XmXxX=XJXJXJXJXJXJXX#XXXXXX-X X X[XMX#X-XXYXYXXXX X XXX}X}X-X-XXX X X X X X X X XdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXXXX+X(X(X(XEX3X?X?X?X@XX*XXX?X>X?X?XXX2X2X2X2X#X#X#X#XXXXXXX+X#XXXYXYXxXxXXXXXXNXcX{XHX\X\X\XXXFX XX2X|XXXXXXXSXSXSXSXSXSXSXSXSXSXSXSXSXSXUX)XSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXS#'GGXSXX)XMXGXX XBXXXZX<XXXXXXXXXHX3X1X3X1X<X<X<X<XX<X<XXXXX<X<X<X<XX<X<X<X2X1X<X3XXX<X<X<X<XXX(X(XXX(X(XXX(X(XXX(X(XXX(X(XXX(X(XXX(X(XXX(X(XXX=X=XXX=X=XXX=X=XXX=X=XXXXXXXXXXXaXaXaXaX(X(XXX(X(XXX(X(XXXXXXXeXeXeXeXXXXXXXXX2X2XXX(X1X(X1XXXXXXXXXXXUXXXXX(X(XXXeXeXeXeXeXeXeXeXeXeXeXeXeX(X<XXXXXdX<XXXXXX&XXXXXXXXXXXXXXXXXeXeXXXdX<XXXXX(X(XXXXX(X(XXX(X(XXX=X=XXX=X=XXX=X=XXXXXXXaXaXaXaXXXXXXXXXXXXXXXXX\X\XXX\X\XXXXXXXXXXX(X(XXXeXeXXXX(XXXPXPXXXXXXXeXeXXXXXXXeXeXdX<X2X<XXX@X@X^XIXdXIXdXIXXXjX|XjXXXX~XxX3XXXXHXHXxX3XjXHX3X|XXMXX&X3XXqX|X|XmX-XX-X&XXXdXdXqX((, , ,,~ 37ouz~'V_WEMWY[]} d q ! !!!"!$!'!+!.!2!;!D!K!N!!!!!"#######'#,#z#####$&$J$i& &&&)&S&g&o&''''''(***?+ ++++T......0/6<>ADt $7Ptz~$1YaY HPY[]_ p t !! !! !$!&!)!.!2!5!A!K!M!S!!!!"########)#6#|####$$@$`%&&&&&.&`&i&''''''(***?++++S....(.08>@CFpv{yoljZTPGEDC? d~|{omWTQPON>;:987641/*$# trqnb\[XXB!a]\5tsqihge" $ ~ b$377Potuzz~~ 4`gkmojn$'t1VxY_aWYLYF EHMPWYY[[]]_}GVdj} d p q t   % ' * , 5 7 8!! >! ! H!! V! !" Y!$!$ \!&!' ]!)!+ _!.!. b!2!2 c!5!; d!A!D k!K!K o!M!N p!S! r!! !! !! !! "" ## ## ## ## ## ## ##' #)#, #6#z #|# G## ## ## ## $$& $@$J $`$i %& && && &&&) &.&S &`&g &i&o %&& ,'' 2'' ='' >'' F'' N'' P(( X**X**_*?*?`++ a++o+++w+S+T.......(...0.0/68<>>@ACDFqsptv  #?   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk [vj L s P Qgw Q l|:cn T 4 m}b : yjq|}~zk,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-KPXYF+X!YKRX!Y+\X E+D E+DY+3))&#.,!1\\\\dp ` 8 $ @ xl$\  !T"4"#$%P&'$($)8)*+<,t-0-.//`/0 0X0123`4D45678H89: ;`?AABC(DDEhF FG,GHHI<JLKpLMNDOP8QRS4SSU(UtUVWXxXYZ[[\@\]p^`bchccccccefgg g8gPghggghhhhhi i$ijjjjjjkm m8mPmhmmmopxpppppqq q8rTrlrrrrrs|tltttttuuuvv(v@wXxxxyy(y@yXypyyyyz{{{0{H{`{x|~~~0~H~`~x~~~~~ x $<0<T(@Xp(@X< 8Ph4Ld| $<Tl4L8$<TlX0H`xlHD(ppLH00 <L@8`„48аѼӸ$$$Pڨl|۔۬0`pt,D\t(@Dd| $<Tl0H`Hh(@Xp0H`x 8Phhpx 8Ph     ,|(8((d !#0$$$%''((()*++,-/p0 1 122345686L6`6t708494:;l?@ABD$EE$EFGIJ<KMxNPQSxU4VVVWYZ$[d[\\]^_`P``aaTabbcDcdTdhddePeefff$f8fLf`ftgg`gtggh hhidijPjkTklPmmnlp pqrr|rsPsttptu u0uuvvv,v@v\vpvvvwHw\wpwx0xxxxxyyDyXylyz8zLz`ztzz{|{{{{{{||$|||}$}8}L}`}t}}~d~x~~~(<,@Th|(t88Pd<`|   4PdxTp  4H\p |$<Tl ,HXh 8H(84D $<H4D0@dtH `($4 l (@P|0HDT@P,tňŠƈ|njǜǬȈȘȨȸP|ʌp̀͜ϨќҔӼԼָ`HXِܸݜޘߤߴ\ltl|tl 84DTl|,D\Tl|x| l       4L  X8,h dx\ 0"# $%P&d'(x)|*L+p,-.01`23460678p90: ;;<=>@A$BhCDEFGIKK,KDK\LMNOPR S0THU`VxWXY$Y<YTYlYYYYYZZZZ[[ [8[P[`[p[[[[[\\]h]]]]]]^^(^@^X^p^_8_``aHblcdefgi0j8k4kDkTkdktlmntoXpxqrstuvwx\y8zp{X|d}~0~xhx,hd\|TLp|PH `\D\,\°Hà@TDǀTɌl P̼XΈt`,tDxטdٴ\ڜ܈ݰ(Xxߌ d|04LdLd$x(<4,@Tdx4d4D\t4Ld| 0H`x4Ll  ( @ X p   H   8 P h        ( @0H` 8Ph (8HXhx< 0@Xp!$!#$%& &(d)`*P+, -8.T/ 02345678::< > >@ACDEdFGGH H H0H@HPIJKLMpNOpOOOPQRSSU8VlWXY[\4]^``aabbddd(ehfg`hxikHlmnpqhqxrt(u\v w`yzz{{{|~L 0Td,0`H4DH8L(|<4pP,tT,tTx|4` \l@0|,D\t@Xp 8Ph(@Xp,D\t4Ld| $<Tl„œ´ńŜ|ƔpLjǠǸ0H`xȐȨ@Xͬ $<Tl΄Μδ,DD\tҌҤҼ4Ld|ӔӬ $<TlԄԜԴ,D\tՌդռ4Lאר4LڨܨTlބޜ޴,D\tߌߤ߼ 8Ph(Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@XpL,D\t4Ld| $<Ld| $H`x 8HX,8Ph4`<LLLLLLLLL X    @    8  tHLlD8`4H\8`  4 X       !!"#x$\$%&'P''((()T)h)|))))))***0*D*`*t*+,H,--02$3846P7:<@4A(A@BCEF|GI,JKMNOPQ Q Q4QHQ\QQRLRRSSUpVVVVVWWW,W@WY\P]D^`@addeHfgiDk$l8mmnpqrrstvwyz@|~t 0 \p ,Ll ,DT L4D PdttxhD( xL8l(l<d$l($p@d|4L4<|4dlȤ\pʼx̌x  lЀ$tXl|\p<|֐֨0׼,D\$x۔\ܜ(@0Dh\8(L`|4L80H`8Xx`d0Pp4Lhx(D\t4h  P l $   `xlD<4,0HdxP\t   0 !D!!"d"x""#p#$%(%&'P($()**+P+d+|+,H,\,--. .$.<./|//0000012x223h3344$556$68678 8$8H8\888889; <\=`>d?L@4@P@l@@ABpCDxDDDDEF8FFFFGHGGGHHHHHI,I@IJL4LHLLLLMXMlMN\NO`OPPQQR RSSS0SHS`SxT\TtTU|UUUUVWDW\WtXXXpXYY,ZZZZ[[[0\\\\]] ]8]P]h]]]]]]^^(^____`abbcc cdddddeee4eDfg<h hhhi klpm nDo\qrs\tuuvPvvwPwdwx<xx{ }~$X`  DxD|TdL X hDD,T|Dl ,Ll 4\Dd LDP 4<xP|,<lT4T00($x t dH@xlP8`X$ŜƀdL\pˈ̰Pΐ ϰ@Xќ,xҸdH԰՘lP׼4ذ,Lph ݠ߈8 T8|X@HP0hH<t,P@`@\8 `  0 p   $ h   $    \    \  XDD<D0Hd0tDL,$(T 8  !L!"8"t"#@#$@$%H&&'(l())X)**d**-./4,5<5778\989H9:;t>d??ALAhBCDEdFDGlHHI|IJLJKdKL|M MPRS|TWxX XZ`[l\p]`^_aDbcdefhjklndoprst|uvw8xyyL{| |}~p(t@@Phh|Xht8|lH0h$H h@`8X0xP(pH h@`8X0xP(pH h@`8X0xP(pH h@`8X0xP(pH h@`8X 0xPĘ(pŸHƐ hǰ@Ȉ`ɨ8ʀXˠ0xP͘(pθHϐ hа@ш`Ҩ8ӀXԠ0xP֘(p׸Hؐ hٰ@ڈ`ۨ8܀Xݠ0xPߘ(p|xHlHd  4p d 8p(tXxHdT@,xL   @ 0@ ` D    H8h T<\Tl\pDh   8 T p     !!!0!H!`!x!!!!!"" "8"P"h""""""####$$ $8$P$`$x$$$$$%%%(%@%X%h%%%%%%&&&0&H&`&p&&&&&&'' '8'P'h'x'''''(((0(H(`(x((((()) )8)H)*H*X*h*****++ +8+P+h++,`,p,,,,,,--.t./t041 1122 2x22222233@3T3h3345l55555566,6D6\6|667888899 989H9X9h:P:h::::;(;8;H;`;p;;;;;;<<< <8>>4>L>\>t>>>>>>? @@AA A8APAhAxBBB,B<BBBCDDEhExEEEEG GHHHHII$J,KLLL,LDL\LlL|MMMMMMNNN4NLN\P P$P<QTRRS$S4T TtTUUV\W8WHW`WxWWX`XpYYZ|Z[H[X[p[[[[[\\\0]$^D^D^D^D^D^l_ _`\`aXbtcPdeeffpggh hhi4ijxjkXklPlmnn$n4no0oLo\oopTq|rr\rtrsXstXtu\uvxw<x<(0)-1%+++*/.V+ % + +%+1/+V+2/*ִ.V+.++   "+(+(/"+ +/+-V+3+(9 99  9999901>32#"=>54&#"#"532+"&46!%!! >?(PbG^XMP>=D :UE8L,)D%E+2?"),,-!hj6++/ִ++ ++ +01#"'4&5463232+"&46R-  3F **;\ </ 3+2 /ִ"+ +"+ + 9013"'73"'"4"4\$$$$\<@c / 5$3/?@$2  +@ 8 +2/.=>$3 ($2 +@ +#2A/!ֱ%%! +@%2 +@%+ +B+6?+  ?T+ !.'6!++  + + + ++ !+6(6'+.6'+/6'+56'+=!+>+?+@!+ !'6........@  '(./56=>?@.......................@017##"&5457#"54;7#"54;7623763232+32+#"&54#3A[ WY NQ&[Y[ PS [ [$ ~~ ~qDd+ +3  +@ +2/,3B2B +@2/ +E/ֱ"6"+::/6?2"1+ 2-2-+))+/3F+6+ $&H€+ $'+ +++m+ $%$&+$&%$'+&$'+$%&'........$%&'........@:8=99-1B99999B289)5=$901%4.54675432632#"'.#"#"=.'#"=432326.EPE.Q?!,I.4I.EPE.ZL#HW7@S$,7,6P44<(=+!) <.;PwwO 0=Wc !,<+"+  + ' +'=/ ֱ%% +*++>+6+ 56.--.56....-.56....@ %"'$9 $9  999093;99"' 99901%2#"&46"32654&2#"&46"32654&#"&547%632i4GH23HH2#12#"214GH23HH2"22#"21 { I52HIfI&2$#32#%2H52IIfI&3F33"%2z z  i/8y+7+*'/"/ 9/ֱ44 +:+7-9'*04$9" 1$99901!'#"&5467.5463262&#"6732+32#/32-C;V;4"I2!!  ! 2,o+ &qi(/>)70@^@4M7$1F  1>E:FS+)V ;)/F;l\ /+/ִ"++013"'"2\$$&\$/ִ !+ +  +2+01%4>32#".&=D ' d C54'&54632#"& ' d C<=D h ;GI mNJn q\)r*/ֱ++6+ .)!"+ .!")........!")......@90154327632#"/#"&54?'&54632 Q  RQ  Q  + *p  pp  p* H R/3 2 +@ +  +@  +/ְ 22 +@ + +@ ++01#"=#"54;543232#@oT /+ /ִ + +0173#"&547υ   H+ / / +01!"543!2nvt 5++++ / ִ++ +01%32+"&46' (( ((t%8&&8%q/ֱ ++01 #"&547632  G yH   qj =+ + /ֱ++ $901"&=462'"326=4&hhhhDNQADNQ_dvvdwk^Yb^Ybqd>+ 2// ֱ +@ +  +  +@ ++0132#!"54;#"&54?Aq  dq Tj"x+ +++#/ֱ +22  +@  +$+ 99 99  99 $9014632!5432!57>54&#"#"&hmMIo5[:vF+V93S  -ghD-OU$M"4N<- `j/o+(+( +(- +#( +#0/ֱ  +%%/% +@%! +1+ 999# 9(9014>32#"&546232654&#"543254&#"#"&}'V3KeA&;B{V; *N1DcjIN:*;   ('YA:D U3Lk; T:;Un1A i\f+ 2+ +3 2/ְ2 2  +@  +2 +@ +@ ++901%!5332+32+"54;5#xT"""LЩ/va`\&x+! + + +@ +'/ֱ + +$+(+99$!$9!999901"#"5!2+632#".463232654&<'>& I;MdsY'M3 *N2I\Ob nT_y!  &&bOCTj,j+!+ + + ' + -/ֱ$+2.+$ $99'! $901"&#"632#"&5463232654&#"!(TL1=iDcdIYp{ / J<8KK41# 3%DtG&znLQp QQX@;V1i\P +++/ֱ+ + 99 9 99015!#"=!#"&547u  !#LA qj'x+"+ +(/ֱ   %+ )+ "$9"99 99 9901"&547&5462&"32654"32654&wpnnpfiixrOO98P=UU=54'#"&54632#"&546.#"32>!(TL1=iDcdIYp{ / 9J<8KK41# (%DtG&znLQp wQQX@;V1v ;++ ++/ ְ2+2++01%32+"&4632+"&46' (( (( (( ((t%8&&8%-&8&&8&o^ , ++/ִ++990173#"&54732+"&46Ӆ   (( ((  &8&&8&H, %#"'-632  _ c C 3%w  ///+01!"543!2!"543!2 DDNN,4632 #"&547-&N ^ c  A)%+++ % + +%+*/ֱ+   "+(+(/"+ +++(9 99  9999901>32#"=>54&#"#"532+"&46 >?(PbG^XMP>=D UE8L,)D%E+2?"),,ip-6+/$$ +$( +/5//7/ֱ!!+22.+22  . +@ +8+.2$$9 (+995 99/901"&=4632+5#"&546354&#"32>3275"32+WknUD[! :NaOB3DWVI*5 _@;L7+>or\EH5=S/4D~c]~ (:-&/ O3 $6+3 222+"2$ +%/&+01%!32+"54;#"54;32+"54;'#6Ox%LGpl%+3*y+'2+2& ++/ֱ'2' +@ +2'+   +,+' 9&9 9 9017#"543!2#!"54332654&+4.+326|6IbUaD_@RJ7O&M65J)S>J.-d?Z<.,;&%A?@+a(+( +! + ++,/+ֱ+2-+(999!9999014>325432#"'.#"3267632#"&5? "2Z9eHgCSvX4R(  4T,fE7J<+Ep.DYGZ*0  &+ e+3D+2+2 /ֱ +@ +2+ !+017#"54;2+"5434.+3265h"aa'Q5Hp)j8k66ۑwb--+3'+ 2+2 + + + +@$ + +@ +(/ ֱ2 +@ +  +@ +2&+2""+)+0132+"54;#"543!#"=!35432#"=66Ƒb--?2@/+ &+!+ ! + 2+!+0/ֱ +#-22(2 +@ +  +@  +1+ !99 9+#901"3275#"54;2+#"&=46325432#"'.;>Z)|lFIZa{mcC`6N@Ifu"4vJi6[&65'33+-3 (2222+!3&222 +4/ ֱ2 +@ +2  +@ +@  +3+2((3 +@($ +@(+ +3( +@3 +025+01!32+"54;#"54;2+!5#"54;2+32+"54;6-x66x.6q3G+ 2+2/ ֱ +@ +2  +@ +2+0132#!"54;#"543!2#@? TG3\+ + ++2/ֱ  + +@ + +@ ++ 901#"&'54323265#"543!2#oM0V6KI=U( Jk)1DR:e+<32`+.3 )22+3$2223/ ֱ2 +@ +2  +@ +24+ 29901732+"54;#"54;2+%#"54;2+32+.'K66K-vIP88W7VGݴmw?3Z + 2 +  ++2/ֱ +@ + +@ +2++01!5432!"54;#"54;2#=``  Q3, +$3)222+3+222-/ֱ +@ + +@ +@ +*+* +@ +@" +* +@*' +.+*999901%##32+"54;#"54;32+32+"54;#F.J"cd"Ja\23" +3 2+3!22#/ֱ +@ + +@ +@ ++ +@ + +@ +$+99 9901!#32+"54;#"54;#"54;2+4K"6j1J"13%@ F++ / ֱ++99  999012#"&46"32654&,jghhVzzVU{y@y)Җgl+3!g+ 2+ 2 +"/ ֱ2 +@ +  +@ +2+#+9901732+"54;#"54;2#'32654&+66PmvUA^U;_a)J43I3%@%0++ ++&/+#21/ ֱ)).+ 22+.) #$99#9 999&+ 9901"#"&54?.546263232632#"&"32654&>0_ ZUqБh6(*G5 IE4VzzVU{yY Aj||{( $pҖgl+M3$-+ 3 22+,2% +./ ֱ%2 +@ +  +@ +2)+) +@ +/+)$99%9901732+"54;#"54;232+./32654&+K66Ik/@=9BU9rJhU6]?a0 Rkzg)D0-E\@7++&+5+ +8/-ֱ)22)-+)+#  39+-+099 &5$9995 #(0$901%4.546325432#"'.#"#"'#"=4323264M[M4iOV<R:>Q4M[M4tZj?bDF]*4?2BY;g-m9`>@ps $xp(033<+3 222 +-3%(22224/5+ '990132+"54;'32+"54;7'#"54;2+7#"54;2+E>@n+-o 3%3&X+ 2+ 3%222'/ ֱ +@ +  +@ +(+ 9 901%32+"54;5#"54;2+7#"54;2+Biio&(n g3v+ + + + +@ +/ ֱ +@ ++ +@ ++ 999 9901)55!#"=!!5432vH]:;v:4\ 1+//ֱ + + 2+0132+32#Aa3zq/ ֱ++01#"'&54632G    H    @\ 1+ / /ֱ + +2+01#"54;#"543aS(qbg! /3+/+  901#"/#"&47,   g   X/<+<+/+01!5XK22@!/+/ + ++01#"/&54632r  r vd  d  H ,+* ++ + +$ +-/ֱ''+!22 +@ +.+'$9*  9$!'$9901463232+5#"&5463254&#""&5&#"326}&F[6_YfFVu^;MD7.b &45YzF5CSG9AQG%- Z;/'/(\#w + +++$/ֱ 22 +/3 !+%+!  99 9 !$901632#"'#"54;#"543"32654&Ik[~ZnF_66JhhJIig\g]^hX jkjJNkT%c+   + $ ++ +&/ֱ+ 2'+  999"#99  99901%#"&546325432#"'.#"32762"7Z/bd]?]?SghRmN  X !$|`c7 [(7gROeH ?G\#~ ++++$/ ֱ+!22 +@ + + +%+ 999 !$90132+5#"&46325#"543"32654&6_GoYYnH6}JhhKJhg\YihjLMjjKNj?9++ +/+ 99901%!3267632#"&54632!."` nQ/b  De`e`v fdO_ 8a[{@DRQi\*p+2+%% + + +3 2+/ְ!22 +@ +@ +) + +@ +@ +,+01".#"32+32#!"54;#"54;54632.A1>bXXWCFE'/&=O=7G ?F2'z++ //#(/ֱ!!%+22% + +% +@% +)+%!99# %$9901532++"54;26=#"&4632"2654&_6`Ert3GBiUyyUjgFbbbaNSl@^H3a|{)bcbFIb+'\-+'3",222++./ֱ2 +@ + +@ + +-+""- +@"% +-" +@-* +/+-99014&#"32+"54;#"54;>3232+"54;D7*7) -.6_&F.FY-- -9!0  .&O=\p^+ 2+/+/ ֱ2 +@ +"+/ +@ +@ ++0132#!"54;#"5437#5@v;OhhuFpI+ //+/ִ"++ + +2+01#"543!+"54;265#5WD2A;xCFXB3hh?\)X+"3'22 + +2*/ֱ2+/ 3++)999017#"54;#"54;7#"54;2+32+"54;'_66_/- \\D+ 2+/ ֱ +@ +  +  +@ ++0132#!"54;#"543@u\  Q7,+330 &222+3#27+38/1ֱ&2&1 +@&) +&5+5/.3&+++ +9+&999930%$97#5901>3263232+4&#"32+4&#"32+"54;#"543p0 @!7:+>"J(26"J'27"m""4$GG@,?+R<-RO51+(3 #-222++2/ֱ 2  +@ + +/ +@ + .+##. +@#& +.# +@.+ +3+. 999901"32+"54;#"54;>3232+"54;54&?! --"K+B/CZ"m"A  OE0#N:+;H D++ / ֱ++99  99012#"&546"32654&,`^__NmmNMnl_\^\)jkjJOjF(++/ 2 /$)/ֱ !22  +@  + +@ +2 &+*+&  99$ !&$9901>32#"'32+"54;#"543"2654&(R9]}~\pCb66JhhhfR4,yz` cFGcbFIb?FG'++/2/"(/ֱ  +%22 +@ + 2 +@ +)+ 99"%$9901532+32+"54;5#"&4632"32654&_66bCq\~~]ooKggKJigOR`zy)bcbFIbT"e +2++#/ֱ2 +@ + +@ + +$+ $9901"&#"32#!"54;#"54;>324"IS`KtEV&(< X*0LOf?10 g6)+$+4+ +7/+ֱ'02'++'+!  38+6|+ ++ #99............@+).99 $4999994 !&.$901%4.546325432#"'.#"#"'#"=432326D``DaJU4H98JD``DoU`=Z@BXu%(2,1@.E"(+  909K6 S"14+3$V+ "++32%/ְ22 +@ + +@ +&+ 990132+3267632#"&5#"54;5432<4*_  @GTJJ&. -C8 w+ |+ + +32!/ֱ + ++2 + ++"+9 99901!5#"&5#"54;327#"54;32#Tb+ .. .. ........@9901!# ##"54;2+3#"54;2+2[Y3To5HV3YE2ox@3%3<+3 222 +-3%(22224/5+ '9901%32+"54;'32+"54;7'#"54;2+7#"54;2+I AD o.0n۲3F%%1+3 222 /$2&/'+$ 901!#"54;2+#"54;2+32+"54;s46nAxKsv + + ++   +@  +/ֱ +@ ++  +@ ++ 99  9 901!5432!5##"=-$8a$T7`\(a+/& / )/ְ2#2# +# +2# +@ +*+ &"99  99901#"&=4&#"54326=4632#"3248C$$C84 )NN) h;3+,+*4;  !&LR%! @\/ֱ +01"542@((A^\(a+'/ /)/ְ 2$2$ +@$ +$ + +2*+ $99 9 990146326=47&=4&#"&5463232#"#" )NN) 48C$$C84h !%RL&!  ;4*+,+3;\\2 / //+ 99 99901%2>2#".#"#"&54632* R%B;   L,E;'& P0/ R0/[hI/+/ִ++++/3++901632#"&574#"&46;2-  nF **qv/*+-/'3- +@# +/   +@  +0/ֱ,+2( 2(+$21+(,99 99#99%999  999014>754322632#"'.#"32>32#"=.q H4?)>0DYWB,; b2I^7,=2 kj$= 'S@?S(.qqi?B7+ 2,+5&", +3&28/)ֱ) +@)$ + +   +@  + +9+) '99 9,/5$9" 995&)/19990132+32>32#!"543>54'#"54;&54632".#"cZ9 1##7h^S:3N -)<`#hG&7mEU$;T@ =g_2>3+3 +@ +2++1/919 +@1 +,2?/ ֱ6 6 +@  +26<+$$< +@$) +2@+6  99</$9$"&9991/993 "&$9017#"&54?&547'&54626327632#"/#""32654&9  8#"7  8,:9-7  7"#7  8/6773II32JH8  8/6;+8  7##7  8/6:,8  8#"I34II25I3%3@+2'+43#,/9222' +32 ' +;32A/ְ22 +@ +>2@ + +@ +2@ +B+.9# .901%32+32+"54;5#"54;5#"54;'#"54;2+7#"54;2+32#AVVtn''nv<dd<@\/ ְ2 2 +01"542"542@((((A N B[1E(+ ( +($ +/ +@ +F/ֱA+/A++++&+"6"&+G+A 9+>99/2954&/&'#"f L9(5;HA8/ L4%6PH 1AoG+ 8($PC"-/EmE-41&CS:$.+G#-c ;/3+ 2+/ִ++ ++012"&4632"&46((c((TB%0<,+7&+1,& +n+ +$ + ,& + n+=//ֱ44+n++ 2n+:+)>+ &,17$9"$99:9)./4:$9  901%#"&=463242#"'.#"32>22#"&46"32654&<";ZR9+.$4"+=C.& }z~x{jgm "Z;- +6 +&& +&) +/+ n+//3527/ְ222 +@2 +2,+"22, +@ +8+2 9,  )$99/,2999 "901%#"54;2463232+5#"&5463254&#"#"&5&#"32U,8?65,7K:-$C *+7"7Y/%,#+6 , ; $? +3+3/+01?632"'?632"'?          H 0/ + + / ֱ  +  + +01!"543!#"5|H+TB )4@0+;*+5 0* +33n+2!0* +n+ 0* +(3n+A/3ֱ88 +n+!2 +@ +  +@  +%+n+%+"+>+-B+% *05;$99 29!-8>$9 3990132+"4;5#"4;232+&/32654&+72#"&46"32654&$`.;& '96?8*1'MCz~x{jgmf$$$4), (6$w$z})jiki@)++/++ +01#"4;2((Z| B/ //ֱ++99 999012#"&546"264,:U)=*,==VHa+/3 2 +@ +  +@  +/ְ 22 +@ +2 +@ +2+01#"=#"4;543232#!2#!"4@on-(((({n/ n+ "+/n+ /ִn+ 2 +@ + +2n+2!+ 9 9$90146323542#57>54&#"#"&@-+A;}$&+) =<) Es'+{& ' s.t/n+$/)n+/ n+ + +//!ִn+, n+, +, +@,& +0+$999)9901"#"&54632#"&5463232654&'&54632654&,  E",<.:G2%M :$"34($' %5'+$4,?$ "**  !/ +/+ ++01#"&54?632r  r  Wd  d +8! ++  +@  + +32"/ֱ 2 + ++2 + ++#+999017#"5#"4;327#"4;32+5#"6_3(eRJs"KPe9&()2[((;KO \%-+ 3 /3$2/&U+./ִ+++%+&2% +@ +% +@%" ++ +@ + +@ +/+$ 99&9'901.=46;2+32+"547#+"54;5\qyb=>bHa:MMP r Q/;$ wD/ n+2// ִn+ +@ +  +  ++ 90132+"5432#"&546?G'A $   A O +// /ְ2+ 2!+ 99 9901%#"54;22#"&546"2654>UW<=VVk\@AZAV>;VV=$90132+"5432#"&546"&54763246;5#57332+32+"75#G'A   ^  / 9  U9kd$   jb   + 9"$9$=d$D5+.n+5+2"+/n+2=/(n+=( +@=B +/E/ִn+ +@ + +" +%+@n+.2%@ +@%5 +@/+:23n++2F+9/@ ( 9992.6999+:999%@999( 9901 "&547632%32+"5432#"&54646323542#57>54&#"#"&  ^  G'A *@-+A;}$&+) b   }$   =<) Es'+{& ' Dd.=TXS+An+N2+ n+ + +$+)n+DXS) +H3Dn+L2XD +@XG +S) +n+Y/!ִn+, n+, +, +@,& +B+U2Nn+G2NB +@NQ +J2BN +@B> +@BD +Z+B9+**;+,;, +;2 +,+2D+*>99;9!99=8,999014>325432#"'.#"3267632+#"&5463232654+5.5? "2Z9eHgCSvX4R( &#Z) A,#> ,.llE7J<+Ep.DYGZ*0 # ';$  EM+ #o(+#n(+"jt(+"j_(q #o(,q#n,q"jy,q"ja,3.l+*2 +!2 +(3#2//ְ2*"2* +@*& +* +@ +@ + 2*.+0+01#"54;5#"54;2+"54;4.+32+3265hMM"^^"w )F+Gqh8h,<1#}O2"d13% #o23% #n23%"jx23%"b23%"j`2vd!762"/#"&54?'&54632,     7     (0]'/h++++#+0/ ֱ&&.+1+& 9. !)$99#+  ($9017#"&54?&546327632#"'&#" 32654A  EBhVHB  FChZB ;IVzl;JVz3R  WXr|BS  XSx|l;i[;i^(0 #o8(0#n8(0"jx8(0"j`83% #n<+3(w+ 2+2  +( +)/ ֱ 22 +@ +2  +@ +2$+*+( 9901732+"54;#"54;2+32#'32654&+66PmvUA^U;oFO_a)J43I\:+2.+88. +83 ++$ .$ + ;/ ֱ +@ +  +@  ++12+''++<+ $).8$9899+99 )9'901%4.+"54;2654&#"32+"54;4632#"&5432326,A9&:B,*@n6Y:@W:HA3F  $.20H$3!*>8%S5QS?<'.T]D1%FH"oDH"nDHr"jDHD"DHO"jDH"~ D B2?G++!3>2+ 3-E2- +-0 +G  +43G)26 'H/$ֱ;;+)322G2 +@ +I+;"'$9 99  $3;$9-'9014632>32!32>2#"'"="&5463254&#"#"&5&#"32%.#"Gb%>@$IHH2.! ])J2(8TkL),3%$> ,# J;.3B*Yz .&'-}kLb BM"DT@6G <#2 ] "*6'5TS>+9+*+%+3 / + +/V+?/"ֱ66++   +@ + + + 0+'2-@+%399990 19-;<99 939"/'<$901%#"&5463232654+5.546325432"'.#"32762%1K+A,#> ,-2K'd]?(\?SghRmN  X;$  C*1>(c7 [(7gROeH ?"o H?"nH?p"jH?O"jH\"o\"n\t"j\O"jHl,7|+2+3  2 ++-',- +'8/ֱ005+9+50"$9-2"999,$99  9901.54632?2#"&54632&'#"&547"32654&. /e_ KKX`_^)@)5D[ WNmmNMnl%  0* "@Sl^\c1* jkjJOj5D"QH"o"RH"nRHv"jRHD"RHO"jRH7/+//+/ְ2 +2+01!"43!22"&5462"&546n((((5#+h++ +'+,/ ֱ**"+-+* 9" %$99' $$9017"&4?&54632762#"32654&#"B  B9_R>@  @;_P3BNm2ANm#D  CBS]1B  AAV]Y(jLD&jLD+"oX+"nX+r"jX+O"jX3F%"n\FN(t+/ 2 /$/)/ֱ !22  +@  + + +2 &+*+&  99$ $901>32#"'32+"54;#"543"2654&(R9]}~\pCb66JhhhfN4,yz`cFGcbFIb3F%O"j\ O"m\$H"mD O"|{$Ho"|D eY348+/33!*222(+$62 /=+ + +8( +9/ ֱ33 +3 +@3- + 3 +@  +:+3 9 9012632#"&547#"54;'!32+"54;#"54;32#3 #  1$(MuL86Ox%:Jpl{   :$!)"`%He,4@$+> ++00 +03 +/=+ + +*8$ +*A/'ֱ;;"+,522" +@ +"  + +B+;$*08>$9$ 99>  98"'5;$9*,90146323232632#"&5467#5#"&5463254&#""&5&#"326}&F[6%+  1$(#*=YfFVu^;MD7.b &45YzF5 %"   +CSG9AQG%- Z;/'/(? #n&T"nF?"jy&To"jF?"}e&TO"}F?"kr&T"kF+"kp'?\#`8G3?G\&2+- +!+%+''% +323/ֱ**+02222 +@ + 2 +@ +# +4+*99-  9'*0$90132+32+5#"&546325#"54;5#"54;"32654&666_FoZZmH6_JhhKIigJQa]\`+jLMjjJOj+"m\(?"mH+"||(?p"|H+"}a(?\"}H+e$3<+12 +@5 +8++!2 + + /=+ + +#0 +#0# +@0, +#0 +@#' +=/ֱ1"21 +@ +21.+$2** +;; +; +;2+882+  />+2 99859 9012632#"&547!"54;#"543!#"=!35432#"=#!5432  1$(Mn66ۑ::{   :$b--w+"?e+1x+(++0 /=+ + +, +,2/ ֱ** +* + * +@  +3+ 9"%99,9012632#"&547#"&54632!3267632!."  1$(6f`e` nQ/b  5@5v fd{   2!b[{iO_  $"2"kDRQ+"kp(?"kH?2"j u*?F2"jJ?2"| |*?F2m"|J?2"} g*?F2^"}J?82@'*?F2"_J5'"jx++'#jK5'3?C+ 3222++93'04>222$+233!@22B$ +BD/ְ%21A22 +@ +.2 +@ +@) +"2+3@222 +@ +@< +2 +@ +72E+0132+32+"54;5!32+"54;#"4;5#"54;2+!5#"54;2+!!.66-x66x)(T(eeeD+'\9+33.8222+*+ +!3%2:/ְ2 &22 +@ +@$ + +@ + +29+..9 +@.1 +9. +@96 +;+9*9'9014&#"32+"54;#"4;5#"54;32+>3232+"54;D7*7) -.666_&F.FY-- -9!0 (6_(z.&O=q"c,\D"q"m[,\"mq"||,\n"|qe3+}+"2+ 2 /=+ + +,/ֱ"" +@ +2" +** +* +@*% +2-+ (99%9012632#"&5467!"54;#"543!2+32  1$(#*? % {   + %"\ep&*+2+ /=+ + +)/*++/ֱ'2)"+)/) +@) +@) + +%% +% +@% +,+ #99 9012632#"&5467!"54;#"54;32#5  1$(#*v & X;{   +O $"hhq"}c,\D+ 2+/ ֱ +@ +  +  +@ ++0132#!"54;#"543@vO;36&+* 2+ + +1+3-2227/+ֱ  + +@ # +42+ +@+( +/2 +  + +@ + +@ +8+ 9&#(9901#"&'54323265#"54;2#!32+"54;#"54;2#FI/> (%8-_m,,, Pe*0)JBe|Fp*.+#2*+3&2 /-/3.+2//$ֱ$ +@ +$ +$( +@$! +$"$-+,"++ + +@ +"+"+/"+0+01#"54;+"54;265#532+"54;#"5437#5QzWD2A0;@B8l;xCFXB3hhOhhTG"jln-uF&j+8<3'.?8\'NF?"ny/\#nO?83'/\8\'O? @#`/\\#`O?3'y/4\'yO+3-l+ 2 + +(+$2./ְ"2 2  +@  +@ + + +@ +&2@ +  +/+017632!5432!"54;5#"&54?5#"54;2#  <`j  ~` P  \ޡ>  J\\&`+ 2"+&'/ְ 2 2  +@  +@  + +$ +@ +@ +(+"9901763232#!"54;5#"&54?5#"543?X  lW  ku\3  >2  =2"nt15"nQ823'158'Q2"ks15"kQ"Q` 5 A* +&22 +)+++/ֱ2 +@ ++/ +@ ++ +# +,+9)  #999$99014&#"32+"54;#"54;632#"&5463232P=aK--"KKeIi> .i+q|`qES 595+2)+ $+ 0/6/ֱ%2 +@ +"+"/" +@" ++-- +@3 +7+)90399 &99$ "901232654&#"32+"54;#"54;>32#"&546,.;A7! --"K+B/CZV=> A3J+;  OE0#N:?X 3%"m]2H"mR3%"||2Hm"|R3%"6p2Hz"6R N3$1 +*2* +* ++-2- +- +  + +@! + +@ +2/ ֱ%%++2#+2+ 3+99 %990135432!"&5463!#"=#35432#"=%;#"Rrm;N-X= =X-\}q` )NK..KN B"*5+30 2 +3+(2* +*6/ֱ..3+*23 +@ +7+3. 99990.$9*399+-9901632!32>2#"&'#"&54632.#"'"32654&+-W//I0.! ])-ME*>\[>)H +Y-DD.,ED=r1`BJd B@79>\Y>&6mnnGJn+M"nu5T"n U+8M3'5T8'U+M"kq5T"k U\"nw6g"nV\"jp6gr"jV\S@M8%+ + 3/A+<+K/ + +/ V+N/'ֱ#,29#'+# +  + n+ + + 2+H >3DO+6+ 74+7574+674+ #96749594567.......4567.......@9'%*99 /F$901#"&5463232654+5&'#"=43232654.546325432#"'.#"4M[M4lXA,#> -/\1bDG\4M[M4iOV<R:>Q'0C3F\;$  B <p1DI7*4?2BY;g-+9+#3I+ +)/22) +2/ +7/$V+L/@ֱ<E2<@+<9+$$5+&5& +5, +&+!  3M+6|+ ++ #99............@@>C9999$ I99&599972&9I !;C$901%4.546325432#"'."#"&5463232654+5&'#"=432326D``DaIV4JpJ>Qh2fSA,#> ,.T.Z@BXu%(2,1@.E!)+ "pH;$  B , S"14\"kn6g"kVHS33 +'3"2+ 2++2./. + +/)V+4/ֱ+ 2"(2" +@ +"+++ +@+% ++ +1 +++5++901232654+5#"54;##"=!#"&=#32+#"&546,.ii ilA,#> r QIrr I/;$ +C3"zWH"kq7+e#`WH3( +2+'2++#2  +32)/ֱ+22 +@ + +@ +@ +&+!*+0132+32+"54;#"4;5##"=!#"&=#Accii`` Q((Irr I+30q(+ ++ 320-( +3021/+ֱ22 22+ +@ +2+ +@+/ +22+-"%99015#"54;543232+32+3267632#"&=#"43JJ<4*_  @GTKewwe(~&. -C8((0"c8+D"X(0"m[8+"mX(0"|}8+m"|X(0 "~x8+"~ X(0"6s8+z"X(e03:+#+,3'1222 /=+ + +;/ֱ   +@  + +@ +  +99 +9 +9&+33& +@3/ +&3 +@&* +<+ #99&9799 799012632#"&547#"&5#"54;2+3265#"54;2+  1#)<'Tr"J[CB\J"!//!{  !2$tUQD\]CQ-J/(,"+e,4+!++)3$2 /=+ + +5/ֱ + ++#2++ +' +3++  /33 +3 +.+6+ !99+3199 199!.9+,999012632#"&5467#5#"&5#"54;327#"54;32  1$(#*)TbbXXWCFE'/&KO=7G \ 1"+&+* ++1- +3122/+ְ 2%222%+ +@% +%(+(//33%+3+%"99&(9*$$901"32654&%5#"54;32+632#"'#"54;#"543BJhhJIig6_Ik[~ZnF_66jkjJNk+Tg]^hX38 +$2+'2  +.4  +.9/7ֱ++%+2% +@%" ++ +:+%+14999$99'.67$90132654&+4.+326!2#!"54;#"32#"&46@RJ7O&M65JRIbUaD66%! %9<9<.,;&%AS>J.-d?Z!  7R4,3\ (+++ 3#+)/ֱ 22 +@& + +@ +!2+*+999 $901"32654&'632#"'#"54;#"543!2#BJhhJIigIk[~ZnF_66jkjJNkg]^hX .%N 3m+2.+ . + 4/ְ%2 *22 +@1 + +@ ++5+9. %+$901%4.+32632#!"54;#"&54?54327632&M65JA_0aD62  FJ  &%Ar24?Z#  0B%3  N 5++ +@* ++ #+6/ְ'2 ,222 +@3 ++/$3+7+999  $9!90132654&#"'632#"'#"54;#"&54?54327632hJIigKJhIk[~ZnF_6-  AO  kjJNkUg]^hX  -C'7  ?@+_%+% + +++ ,/ֱ2+"-+9%999 990172326=4&#"#"=432632#".54S #H.XvSCgHe7Y3# f+S5!}&ZGYD.pE)325462#"&54&##"'.#"3267632#"&5? "2Z9eH4R7   gCSvX4R(  4T,fE7J<+E%;8& !$p.DYGZ*0  &+ eT2+-- +-1 + +'+/3/ֱ**$+ 2  +4+$* -999 /0991$9'- "$9 9901%#"&546325462#"&54&##"'.#"32762"7Z/bd]?4R7   ]?SghRmN  X !$|`c7 %;8& !$[(7gROeH 33 ,k+2 +2"( +"-/+ֱ+ +@ + +.+%(99"*+99014.+3265!2+"54;#"32#"&46'Q5HpCaa"F$! &8<>j8k   7R4:,3&w+!2 +2 +@ +$ +'/ֱ+"+2" +@ +2(+9$!90135!#"=!2+32#!"&54>;5#"66Da0_{J5ЕiQCb^@54 /FL\ ( ++ +3&+)/#ֱ+ 22 +@ +2 +@ +*+ &999#($901"3264&7!"543!2+32+5#"&54632KgiIJhhh66_FnZ~[kIkNJjkjXh^]gD9 EJ+3)"+(2(" +@(% ++2 +@ + " +  +@ +  +@ +*/"ֱ(("+(+ 2)+ 2) +@ +2++"%9(901##"=43235!#"=!2+32#!5432!66>:--bw2@B\@;++'+"+16" +6QWA0@57ID1pH^I5HA,BY;g- ' A3b--;J Wj-k+(+// 3#2./ְ$22 +@ ++ + +@! +@ +/+9901"&#"32+#"&546323265#"54;54632)3?``V=> ..;``W@> 6 @3W?X A3WA[ ?x<9+(+ +,09 +,529+/ =/<ֱ%%*+22727* +@73 +*7 +@*. +7+ >+*%9997 99,(79999 9990146325462#"&54&##"'.#"3275#"54;2+#"&5?mcC4R7   `B>Z)|lFIZa{>i6%;8& !$[&66N@Ifu"4v0"3=_+%3 *2226/ >/9ֱ +3?+99 ,.6$93#9 39$901%3254.'#"54;2+7#"54;2+#"&54>, !<o&(n  50/6& &"%5Z  !("#:IN56-E\8+2+.+#(+ 7+39/ֱ$2 +@ + +@ +! ++++1+1 +15 +:+(91+9.993 %*+$97 5901%#"'.5'54+"32+"54;#"54;>323265#"54;EG;@. D$3-.6_-)5&-)Jst8L9 % ]5 %"&432A%2;=fD) D "!G9(EW q3#j+2+ 2#  +3# 2$/ְ2 2 +@ + 2@ + +@ +2@" +%+015#"543!2+32+32#!"54;5#"43?dd_A((+f3?+ 322 +-3%(22293 +9@/ֱ&2 +@ +#2 +@ +2<+1A+<(+36$93 '999901990132+.'32+"54;#"54;2+%#"54;2#"&5463265.#IP88W7VGQK66K-v$<8& !$ mwI4R7   ?j2c$+3(22+-+ + 23/)ֱ#2#) +#0 +)# +@)& +4+ (!"99901"&#"7#"54;2+32+"54;'#"54;4632k)3?/-._6W@> 6 @3'A[ \\!g +2+  +32"/ְ22 +@ +@ + +@ +@ + +#+01+32#!"54;5#"4;5#"54;32 baaub) (:&f<Q#+3*2228+<+ +0#<+=/>+0*98,-$9<9012763232+"54; 32+"'"&54;'#"&54?'#"543H  Jn85n  N  P^f 1  40 T86  87 Q37+3#27+2++33 &02228/ ֱ+/+  +/ +%222 +@) +5+.29+99 99759 2%$901!5#"'#"&5#"54;327#"54;327#"54;2+32#0 @!7:+>"J(26"J'27"m""4$GG@,/+R2-RT3&%++3"22/ '/ֱ +@ +@ ++$$ +@$ +$ +@ +(+%99 9% 9&99017"&546323265#"54;#"54;2+#?4> ,!(6jJ"4:@V A35H1+ 2++)/-#22/ֱ 2  +@ + +/ +@ + .+##. +@#& +.# +@.+ +3+. 999901"32+"54;#"54;>3232+"54;4&?! --"K+B/CZ"m"A  OE0#N:J+;3%@R3U ){#+(+ ( //*/&ֱ+  +++ #($9 %&$9 9(901"32654&32674&#"&54632+#"&4632,VzzVU{y8:$! &8;%BghhPҖgl   7R4UzyHN *}#+)+ )+/+/&ֱ+  +,+ #)$9 99 &$9) 9901"32654&732674&#"&54632+#"&54632,NmmNMnl4?$! &8;%4^__HjkjJOj   7R4=T\^\R~ 3-++22+#/4//ֱ +**+ +@ + +@ +5+  &,-2$9*#9999 /9992&901"32654&'63232+"54;4.#""&54632TY\QR[Z)f?:W(!(3<pspf!qlnoIJ* "G)~~T /+2(+.++ n+0/+ֱ +%n+%+ +@ + +@ +1+  !(.$9% 9999!+$9. 901"3264'63232+"54;4&#"#"&54632tJK9:L62^)9..#!=-?gCGdcH+lPKfj{<;1?!'.32#"'32+"54;4632hhfLJh)3?(R9]}~\pCb6W@> GcbFIbc @34,yz`_A[ //ֱ" 22"/ +@"& +92/" +@/+ +42"+ ?+"99)9!.99 901732654&+53232+.'#32+"546;#"&54;2+a>ZI,C\:@+/& 2)7'q?  --  ?.#*+B2*4 |$ {j_    \@7)0+5+&++ 8/ֱ## / 2#2+)2..2+/9+6;§+ !D+ !!++!!++ !+! !+ !........ !........@#99 &5999.+099 &+3$90174>54&#"#"=4326323267632#"=#"&\4M[M4Q>:R+ !+ !+ ! #99 !...... !......@.,199$* 699999' ,4$901326=432#"=#"&54>7654&#"#"=432632D``DXB@Z=`Uo1MOL J89H4UJa>-1'&(41"S 6K9*6  +("E.@fA4Qj '+V+ /"/V+(/ִV++V++ +@ +)+999"  9%9999999901"2654#"&54'"&4632326322##2#>=V7L77&@W;., I"""X?& $56J5[Ar3A +934 +## +@#( +++32//5/ ְ2 2 +@  + +@  + +,, +@2 +6+  #99,&9/29 9#9012326=#"&5#"54;543232+3267632#"&546..;KSGTJJ<4*_  V=> A3;!C8 ww&. c?X 3'|!+%2+2 ! +!+(/ֱ&+& +@ +& +@&# ++)+& 999901"32#"&463!#"&=#32+"54;q$! &8<$ ii   7R4r I+j/e++*+%+3! 20/ְ&22 +@ +- + +@# +1+!9901"&#"32+3267632#"&5#"54;54632l)3?<4*_  @GTJJW@> 6 @3-&. -C8 -A[ H93 d+2+ +2/!/ ֱ  + +@ ++"+9 901#"&5##"=!#"&=#32632>=V ;., X?:Irr I3A (u2+ + 3 2220+'/-3/ֱ +@ + +@ ++$+04+ 999$!*-999' /901#"&5#"54;2+3265#"54;2674&#"&54632#sTUr"J[CB\J$! &8;% UtsVQD\]CQ   7R4+>52 ++-+'+ 3221+3/ ֱ  +  ++2 +@ ++$+04+ 99!'*-$9999'090132+5#"&5#"54;327#"54;2674&#"&54632"KTb75##"=33>54&/53#"=#+.W&8-}MRS1\+= AD A_+6&Z%4';[,ae``.?.532+#"&5#"54;2+,(+^ 4U]51M 0# NPx:=%33+2.+3 222#). +#4/,ֱ  + +@ + +@ +5+ &)1$99)999#+,99017#"54;2+32+"54;5#"32#"&46;2#(nii$! &8<$o    7R43Fj52N-+'+ 32220+/ 23/$ֱ04+ 9'/901 32+"54;7#"54;2+#"54;2674&#"&54632#AGs46n$! &8;%xxK   7R4g3! + + ++ +@ +  +32"/ֱ +@ ++  +@ +#+99 $9  9901!5432!57#"4;75!#"=!32#6:vMj]Q;(v:(s+ + ++ +@ + +3 2 /ֱ +@ ++ +@ +!+ $99 901%7##"=!32+!5432!57#"43(x^}GjM7`$(8a$(`3/+' +2 +@ +- +- +@- +0/ ֱ +@ +*+1+ #99*%$9-' #$9901"&54?##"=!2+632#".463232654&#" ?&,MdsY'M3 *N2I\O?4\:7` nT_y!  &&bOCT(P30+   +  +#+*2# +' +# + +@ +1/ֱ)+%)% +@)! +2+) +$9%.99 .99901".#"32>32#"&54632'#"543!#"=#&@&?O\I2N* 3M'YsdM,&? :TCOb&&  !y_Tn `7_b0`%+!+2/   +  +/ +@ +1/ֱ +@# +2+ 9 /9901%".#"32>32#"&546;'#"543!2+l  "/AJ2$<'  !C"JZSE  ȴ  Z>Ek%% UMs~ X8A3+ "+'2/;; +;@ +)3" +)) +@ +B/ֱ66 +6 +6+.. +@.% +C+6 9 )3$9.(9 .9901#".5>32>54&#"#"54?#"&543!2+2#"3267632r;2E8^C),88"   (51$H25E=1-Mh)7 2+<6 1#-   ~/%22$% ,Tj0++ ++(( +.321/%ֱ  %+/ + 2+22+ +@ +2+%"9 (.$9+ 9 99"%+99901+!5432!57#"4;>54&#"#"&5463232 ]J:vW:$V93S  mMIo15 <$M<(99 4N<- -ghD$:3P3,+' +2 + +@ +-/ֱ +@ + +@ +*+.+%99*'$9' #999901"#"=#"&543!2+632#".463232654&<'>& - GI;MdsY'M3 *N2I\Ob nT_y!  &&bOCT_*+!+ 2' +' +@' ++/ֱ +@ +$+ 2,+999$'999'!9999017"="543!2+6;2#"&546232654&#" %P\QG>Y7-97=G 0 y JD@R2 9160 32/++ 2/ +'3"23/ֱ+2)!2) +@)% +@) +) +@ +@ +) +,4+)/99,999017543232654&'5#"54;5#"54;2+32+#".D=>PMXii--ii^GbP(?>"D)"?2+E%Qoo6,L8EUF )}++%/ 2*/ֱ 22  +@  + +@ +2 +'++ %9 '$99%#901%654&#"32+"54;#"54;7>32I10$+DMb66_3#R.%W;G)+'+44' +@40 +'4 +@'+ +E+>;9'6:99!  :;999 <9=A9990135432#"54;#"54;2#32>5#"54;2+#".'5432qY((  _2s   S+e  "FGp-1 + 2 +  ++/221++%/)2/ֱ +@ + +@ +2+-+!-! +- +@-' +!"!/+0"+0//"+3+0135432!"54;#"54;2##"54;+"54;265#5``QzWD2A0; CFXB3hh|Fp*+#2&+***+++ /+/$ֱ$ +@ +$ +$( +@$! ++ + +@ +"+"+/"+,+01#"54;+"54;265#532+"54;#"543QzWD2A0;@B8xCFXB3hh X3C&+3* 2+ + +1+933-4>$2D/+ֱ  + +@ # ++ +@+( +@+/ + 3+BB3 +@B< +3B +@37 +B+  + +@ + +@ +E+3 299 9&#(99-*3B99919901#"=4323265#"54;2##32+"54;#"54;#"54;2+0R*$u2+f&Z*u"jS1ZD%6Q(@&FGp"6: +3 2+3!8222:+(+$./2;/ֱ +@ + +@ +@ ++ +@ + +@ +6+*6* +6& +@60 +*"*8+9"+9/8"+<+99$ 9(901!#32+"54;#"54;#"54;2+#"54;+"54;265#54K"6jJ"QzWD2A0;ACFXB3hh FGp3GK+-3 (2222+9342#+?/CJ/K+L/ֱ 2  +@  + +/ +@ + 3+((3 +@(+ +3( +@30 +(G+;G; +G7 +@GA +;";I+J"+J/I"+M+ 99799014.#"32+"54;#"54;>;232+"54;#"54;+"54;265#5a8*  --"K'*"BT"m"QzWD2A0; ++  OE5N:OCFXB3hh O"kq$H^"kDq"kq,\l"k3%"kq2H^"kR(0"kq8+^"kX(0 #q+"ql(0%/9I+ /333  2,/53&+02J/ֱ +@ +.+)+2+ +@# + +@ +3+8+8/3+K+)&,998=@99905EH$9  #$901#"&5#"54;2+3265#"54;2#%2"&4632"&467#"&54?632sTUr"J[CB\J((r  r  LhhL0/+ֱ +1;222&622& +@&" +2 & +@  +2?+ (/99 &991901"3275#"54;5#"54;2+32+#"&=46325432#"'.;>Z)|lFIZa{mcC`6N@Ifu".??E4vJi6[&6?F2 4$+'+-// 302/5/"ֱ+&22-- +-* +22- +@ +6+$$9- 9-!"&$9'*901"2654&+"54;27#"4;6=#"&4632532+32#Fbbba~M+:$ > +$@/ֱ #2  +@  +@ + +@ +@ + +%222 +@2. +2 +@) +28+8 +8< +A+82959901%#"'.'=#32+"54;#"54;2+35#"54;2+3265#"54;DG;?/ 6-h&&h5&-)Jst8L9 % g&4IqBPMb66_C19b@,377UMɆCC& -2"C6q15"C< Q O 04>H+*3V+%/222/4V+/23#V+;/EV+@/5V+I/=ִBV+2=B +@=! +BG+8V+J+GB@ $235:;$9(-$9#!9@E<=89995901#"&54?632!32+"54;#"54;32+"54;/#2"&46"2654:r  r  f6Ox%LGplc'67L77?2##2#d  d v^5'$56J5!"""H &~&Dv N"vq B^"v(0#v5"v O#0$H#SD O#1u$HV#SD+#(?z#H+#Hu(?I#OHd#!,\z# q#Xu,\I#W3%#"2Hz#"R3%#Xw2HI#XR$M#5Tz#.U+M#;t5TI#dU(0#"8+z#X(0#Zw8+I#?X\8@&6g8'VH83&7+83&Wp@6i)+-++ 7/ְ+22 +1 +$8+(-99 !./4$9 -$$901%".54?654&#"#"=432632#"54?>54&# 'Q>:R54&' J89H4UJa M(  %& 5 f +("E.@1- !J+%V V#I5'"kq++' #kKF:A*+2'+#+/ 2+/ֱ$2 +@ +!+!/! +@! + + +@ + +@  +,+ '9%99#!90132+"54;4&#"32+"54;#"54;632--P=aK--"KKeIiq|`qESg93%+ +@ ++   +@  + /&/ֱ   +@  + +2 +@ +@# +'+ 99 9 #99  99012326=!55!#"=!!5432#"&546..;H]:V=> A3*;v:4?X s9#+ +@ ++   +@  +/$/ֱ   +@  + +2 +@ +@! +%+  99!99 9 9012326=!5##"=!!5432#"&546..;-^V=> A3*$T7`$8?X O"}_$HO"}D+S3@ +43-2 +1 ++2 + +;/; + +/6V+,  +, +@,( +, +@# +A/ֱ-2- +@ +2- +66*+ 2&&8 /88 +> +&.+44.+/B+&#(99.94198901232654+5#"54;#"543!#"=!35432#"=#!5432##"&546,.66ۑ:A,#> r Qb--w/;$ ?D2+3 +#/,,# +,) +1/V+ +3/2ֱ2 +@2 +/+ / +/& +4+2 99 /91, 9999 9017!.".4632!3267632#"&5463232654+hv fdZw`e` nQ/b  DA,#> ,.DRQ {iO_ 6/;$  3% #qH"ql3% #qH"ql3%"}e2HM"}R3% #qH"qu3%"qX<3F% "q\uF1+ //ֱ + +2+01#"543!+"54;265WD2AxCFXB3H De?G !u++ +@ ++"/ֱ+ 22 +@ +#+999 !$901"32654&43232+5#"&4632JhhKJhgg6_GoYYnHjLMjjKNjYih' fj ,++"+' ++ -/#ֱ22# +* +# +@# ++.+99 9 "$90132654&#"7"&#"632#"'#"54;4632hJIigKJJ)3?Ik[~ZnF_6W@> kjJNk @3g]^hXA[ T(X +++ )/ֱ2+*+9 999 &$9017232654&#"#"=432632#".546g #O4RhgS?]?]db(K4( keORg7([ 7c`| T|/5+(302 +@, + ++#3, +#6/ֱ/+2)02)+ 22+&7+/99)#3992 993&9#99 9901".546325432#"'.#"354632#"&5764#"HEe3d]?]?Sg+S:7029  )B>*FF&c7 [(7gR :8"D3?9.gb |I?9\ ,++"+/'-/ֱ+ 22$$ +@$ +$ + +.+99' 9*9$901"32654&#"&=#"&46325#"54;32632JhhKJhgQ>=VGoYYnH6_;.. jLMjjKNjX?ihz3A ?j ,~+ ++' +!+-/ֱ+#22 +@ +* +.+!99 9#$901%4&#"326"&#"32+5#"&463254632gLJhhKJh)3?6_GoYYnHW@> NjjLMjj @3[YihA[ ?9+ + +/+99901723267!4632#"&546%."V,V8Qn `d`eD df V_Oh{[a8 EQRD? HGC)1_ +-+%  +%(22/0ֱ 3+ 0!99- +0$9%9!"*$901%#"&/#"&'%&#"#"&54632732632'32654*. `Hqn9p/b  D@k!:+ !6fRh ) ,.[{H>T 892J KeI$g@++&+!+06<! +6A/ֱ+3+2 ) +--/#3)B+-3!9<$9&+99) 99< 9996990#+$9017326=432#"=#"&54>75'&46325432#"'.#";2+"XB@Z=`Uo .aJU4H98JDP0D-A u(41"S 6K9(  b@.E"(+ ) g@3+.+>+ + . + A/5ֱ1:215+21++#++/#B+53899199 %&.>$9>+08999 %&99"#$901%4.+"54;2654&#"#"=432632#"'#"=432326 A-D0PDJ89H4UJa. oU`=Z@BXu  ) +("E.@b  (9K6 S"14gT$++/M+R+C<8R +< R +2U/&ֱ"+2J"&+FO2"2+2+@@/V+J&$)99"HM99@F/7:R$92998/!)999<99  H99C@FP$9M901732632#"&/#"'#"=43232654.+"54;2654&#"#"=432632:+ !*. = oU`=Z@BX A-D0PDJ89H4U/PwJ ) 3% (9K6 S"14(  ) +("E.L <+'+;40 +4=/ִ#<+#*+*+88/>+#98  '/2$90'9994 # $9;901747>32#".'.732654.+"54;2654&#"LEZ.Ja= oU%  G,jBX A-D0PDJ8`OJ@13% (9K  Z@O%S4(  ) +F !W+ 3!2+/"/ְ22 +@ + + +2@ +#+01%#"543!32++"54;26=#"543;;WD2A)OFXB3?Fj 1 +, +&+/!/2/$ֱ+(22 +/ + +@ +3+!&99!9#$($9 &901%4&#"26"&#"+"54;26=#"&463254632aGFbbb)3?+3Grt3GBiUyyUjAW@> Ibbcb @3:.6H3a|{aA[ ?F &g%+% +@% +/ /'/#ֱ+ 22 +@ +(+ %99 "#$901"2654&5432+"54;26=#"&4632Fbbbaa+3Grt3GBiUyyUjbcbFIb8SC:.6H3a|{M2+!+ ! + 23/ֱ +#022(2 +@ +  +@  +4+ !99&+999#+99!&901"3275#"&54;2+#"&=46325432#*#"'.+Sbg`;>u  OUm|`T; QWA6JN\  v&hX7Nq( C &48('/[!+3 &222/,0/ֱ**.+1+*9.999,($901%3#"54;2++"&=47#"54;2+274+2o% %o1%S{J3%%2LL-!!2&.8+4/ 3)%-222) +29/"ֱ+117+ +:+"'9)9971+$9  -999 417$9+/$9)'9901632#"=.#""&547&#"#"=43263263232654E5H5^5H4F!V@@V"<"!S/Z/IH0Z/S99uPw".."w+E' KR3'j6+03+5222 ++'+7/ֱ#2 +@ + + +@ +6+++6 +@+. +6+ +@63 +8+6'9$9014&#"32+"54;4632#"&#">3232+"54;D7*7) -.W@> )3?&F.FY-- -9!0 A[ @3s.&O=39j:,+0&2+5+ +!/;/1ֱ&2&1 +@&) +&8 +1& +@1. +&+ +@ +<+& 99,9!0901"&#">32#"&5463232654&#"32+"54;4632W)3?&F.FYV=> ,.;D7*7) -.W@> 6 @3s.&O=?X A3J-9!0 A[ \p$z+#2+   +3 2/+%/$ְ 222$ +@ +2"+/ +@! +2@ +&+01#5#"54;5#"54;32+32#!"54;>;vphhXF+ + + + /ֱ +@ + + ++01%#"&5#"4;32>32A%2;=fD) D "!G9 (W G +2+2/ֱ +@ +2 +@ +2+0132#!"546;#"&543!2#Aw  yy  x   O  \\0!+%2+ ! + +@ +)! +1/&ְ2 2& +@ +2& +@&# +2& +2+.999) ',9999901746325#"54;32>2#"'32#!"54;5&#"#"&\L,$u/* R%'*   R&'& P# \\&0n+2+  / + 3 21/#ֱ,#, +@# +,+'22 2 +@ +2+/*99901325#"54;32+32#!"54;5#"&=464&'; u 2'33Y/2   6"%1n)/9\G+ //ֱ +@ + + ++9901#"&5#"54;32632>=Vu;.. X?cz3A b7\? +27+++2(/5!;  +!;! +@; +@/ֱ2 +@ + +@ + +8+%%8 +@% +8% +8. +A+8!9% 9 5.199;%899901%"54?#32#!"54;#"54;!2+32#".'&5463232654&#"*xk5 ESZJ"C!  '<$2JA/"  ~sMU %%kE>Z  Q P\ FQ7+3#2++33 &02227/28/ ֱ+/+  +/ +%222 +@) +5+.29+99 99 99015#"'#"&5#"54;327#"54;327#"54;2+32#0 @!7:+>"J(26"J'27"m""$GG@,+R -R  9@ +3$ 220+43 2++';/A/%ֱ,2% +@ +)+)/"3+ + +88 +@> +B+09 29 499;>9 9'$ -2$9+)901232654&#"32+4&#"32+"54;#"54;>32632#"&546=..;(26"J'27"m""J0 @!7:+>U=> A3i+R<-RO4$GG@,?X 95-+1'2#++ /6/ֱ 2 +@ + +/ 2+''2 +@'* +2' +@2/ +7+2 #9 9-91 999901"#"&546323265#"54;>3232+"54;54&?! V=> -.;"K+B/CZ"m"A  ?X A3E0#N:+;595+ 2++//&&/ +&) +6/ֱ 2  +@ + +/ +@ + 2+##2 +@#, +7+2 9&#299"3$9901"32+"54;#"54;>3232632#"&54&?! --"K+B/CZ;.. >=VA  OE0#N:3A X?P+;6( +32+!3'22)/ֱ +@ + +@ +@ ++ +@$ + +@ +*+999901!#32+"546;#"&54;#"&54;2+1@  - ] ?  k   O B  H U++ +/ ֱ2+ 2+99 99012#"&546.#"!26,`^_iIHjtjk_\^\F\]E(E^^ K&/$+.2.$ +. ++( 2( +( +$ + +@ + +@ +0/ְ2++/+ 2+2 + #1+ 99901705463!#"=#35432#"=#35432!"&#; |y5KKr$u\nh Xiq`\wMOS^+(!9f.+(3 2+7:/1ֱ++%;+.9+7999(9 %+1$901"32>=43232654&'.#"&'#"&5467>3233_:*"  77= T UG*0*&IT1]B;g 8d7Q&( 1)xG6G!"&P;5332+#5#"&53;#"4&+3265p D0"-5?N D0"-5?N-?%163,W<(163,)*J;(+J;1,Q6%2+6%T UqT[  q49C+e&+ +2/ + +,/"ְ2" +@ +@ +" +@" +-+#)999017232675#"543!2+32632#"&=#"&546I4"IS<`;.. >=VEV&(< I*0L^3A X??10 TF"c++ /2#/ֱ2 +@ + +@ + +$+ $9901"&#"32#!"54;#"54;>324"IS`KtEV&(< X*0Li f?10 i9&e!++/   + +'/ֱ2 +@ + + +(+ $$9901"&#"32632#"&5#"54;>324"IS;.. >=VKtEV&(< X*0L3A X?f?10 TD+2 +/ֱ +@ + + +@ ++01)"54;546;2+"32`WD2AFXB3T8B+ /2/ֱ +@ + +@ + ++01"54;4&+"54;232#A2DW`3BXF^<)4+%3 22+/21 +5/ֱ02 +@ + +@ +2*+* +@# +6+*)9919901732+"546;#"&46;232+.'74.+326?  -- @^@:*;2 28K4)$ a;]  M E/$99I XIx2<)4+/2"+3 (22." +5/ֱ/2/ +@/% +/ +@ +2/*+* +@ +6+*/99.990173>732++"&46;#"&54;2+4&+32>q4K82 2;*:@^@ --  ?];a $)IX I99$/E M  2g9B%+@@% +@@: ++ +4/++4 ++. +C/7ֱ(<2(7 +@(1 +(7+(+"  3D+6|+ ++ #99............@7:9 %@99999@ "'$901%4.546325432#"'.#"#"'32632#"&=432326D``DaJU4H98J>Qh2oU`=;.. >=VZ@BXu%(2,1@.E"(+ "89K6P3A X?"14WjQ++ / /ֱ + + +@ +!+  9$901"&#"#"&5463232654632)3?V=> ..;W@> 6 @3l?X A3A[ Wj,q+ 3 2+'+/-/#ֱ# +@ +* +# +@# +.+# 999 $901"&#"32+#"&54632327#"54;654632)3?`kI.> .<P^W@> 6 @3[*3 4 A[ WjV +  + +/ /ֱ +@ + + +!+9 99901#"&54&#"#"&5463232632>=V?3( >@W;., ;X?3@ [Ar3A Qj ' +" +/V+/V+(/ִV++V++ +% +)+99999999 99" %9012654&""&#"#"&4626546322##2#,.;W@&77L7V=> <"""N A3rA[5J65$ &?X +3 W#+83$T"++32/ %/ְ22 +@ + +@ +&+ 990132+3267632#"&5#"54;5432<4*_  @GTJJ=&. -C8w+*2+0 + +)3$2 ++33"223/ְ2-!2- +@ +2-+#+222 +' + +24+-90  92990132+32+5#"&=#"54;5#"54;!5#"54;!327"""KTb=V-^;., X?0$T7`$83A s ++3#2 + +@ +( +,/ֱ +@" ++$22 +@ +-+#9#9 "901%3267&'7+"&=#5##"=!3546;2v)/>0  -^ѣ6"%1)/ ),P O$T7`$2'33_b0X +2/&,/, +@, +1/)ֱ) +@ +2+)9,&"$9017"54?#"&543!2+32#".'&5463232654&#"  ESZJ"C!  '<$2JA/"  ~sMU %%kE>Z  p8 H"+:+5?2/ A*: +A*A +@*/ +I/ֱ'+FF' +@F= +J+/9' %-4A$9F@9 9 %$9*"'1F99901'&#"3267#"/#"&54632654&#"#"54?#"&543!2+2(Q   ),8$35A/"   /E"%m+% - . =%3-+4_>Z   ~'>=6aA$+ 2+"+%/$ֱ  +   +@  + +@ + +&+ 9 99"999901>3232+"54;5>54&#"#"5 >?(PbG^--XMP>=DUE8L,%E+2?")A$t+2!+!+%/ֱ  + +@ + +@ ++&+!99 99901#"=&#"32+"54;5.54632D=>PMX--^GbP(?>D)"?2+E%,L8EU3$j!++2%/ֱ+ +@ + +@ + +&+!99999017543232654&'5#"54;2+#".D=>PMX--^GbP(?>"D)"?2+E%,L8EU?8B+_ ++(/( +! +,/+ֱ+2-+(999!9999014>325432#"'.#"3267632#"&5? "2Z9eHgCSvX4R(  4T,fG7J<+Ep.DYZ*0  &+ eH "q+ + ++#/ֱ ++ +$+  $99 99990132+"&4672#"&546"32654&' (( (("`^__NmmNMnl %8&&8%_\^\)jkjJOjI!)+&2+ 2% +*/ֱ&2& +@ +2&"+ "+/ ++& 9%9 9 9017#"&54;2#!"5463732654&+4+326- @VKpU< V8C;10;)O >-8!!K/B '" "S'g8n+++ + +9/ ֱ( ++3:+ %&+$9  9%&3$9(901";2+"32654."&54>75&54632.8JDP0D-A XB]I"@.Uo =aJ+E,+P+ )  (4`j&0jK9( %31@'0)u  OUmNq( %;8& !$C &WA6JN\  v&hXS ; +43-:222+%3 +222  +;#"543!32+";267;gb4 7MR1D m$85' &Fphh!IPC/5<O  ( />8?E N\\Z +2 + ++2/ֱ +@ + +@ +2++0135432!"546;#"&46;2#s SS  xl O   ?Fj 0~++ +%+/2 /1/#ֱ+'22 +@ +. + +@ +2+ %99"#'$901%4&#"326"&#"32+"54;5#"&463254632gLKggKJi)3?6bCq\~~]oDW@> Ibbcb @3`zy`A[ A2+2++# + 320+3/2ֱ..+$2 2 +@ +@ + +@! +@ +(+4+.9+990#(99+9901>3232+32+"54;5#"54;5>54&#"#"5 >?(PbG^ii--iiXMP>=DUE8L,6ooQ%E+2?")A2+ 2/+#'/ +3#2/+3/,ֱ  !+(22! +@ +@ +! +@!% +@! ++4+!/99' ,99901#"=&#"32+32+"54;5#"54;5.54632D=>PMXii--ii^GbP(?>D)"?2+E%Qoo6,L8EU)9\ -%+ 2(+ % + ! +++ + ./+ֱ&+22 2 & +@  +& +& + +$/+&(99 99 &+$9 901732654&#"73%25#"54;335432!5#"&546R2-:=,,R6_V/E=LkiLNjk]O7@$8a1A~b^b=\ QL+H+C3+++B2 + $/17L +7 +@7< +R/OֱJ+22C2CJ +@CF +JC +J +C4+!S+J *L999C-94$/999!9L1*-99HF97C4!>JO$9B9 901732654&#"725#"54;!2+32#".'&5463232654&#"#"54?#32+5#"&546B, 07=,,FR6_ ESZJ"C!  '<$2JA/"  &O[0@=@whMNjk@~sMU %%kE>Z  1A]^ S\ 5AE +-3C 22 +9++B+?%  +F/ֱ66 +<22C2C +@C + C +  +C4+!2/2G+ 6 994C D99C 9B%6<$9?901%3267&'7#"&546325#"54;33546;2+"&=%32654&#"73)/V/E=2R6_=6"%1>0  2-:=,,)/[1A~b^@$2'33# ),P OLkiLNjk]OK3D++28+4+;330@2+04 +@0 +E/.ְ52B:2B. +@B> +.B +@.2 +B +!!+' 3F+!$999990 !'$9942>9901%032654.546325432#"'.#"+"&=#"54;543232+@F;UU;OH(0=168;UU;]S=VJJ@@;3)%(2,2?E/)":0;IX?ww3AFj<+*++7++ 3%2=/ְ2'2' +@'# +' +@ +'-+  -+44/4 +: +>+4'*99* 0999 14$901"&#"#"&=#"54;543232+32654&54&546323)1B#Z:=VJJ||90-?#[=> 6 :-7TX?ww3A=+A ;S |O6OW@+4<33 *P22@ +@@8 +M+I+33E2+!.U8 +.X/CְJ22C +@ +C +@CG ++$$;+*25P25+2S 1Y+;$ ! @$95.U99S99 @>9U 199.$99E999I!G990132+327&546325432#"54&#"354632#"&="'#"&5#"54;5432>54#"//<4 ;`T+8"O9@H8&./10KJ  0)#GTJJ%=/84&.8ve~ [%:eT)6!D4>8/;5b `C8 w#">I9?\CG.+2(E22+>> + +9+35D2 +#/H/3ְ:2E2E3 +EB +3E +@37 +@30 +EF+( 2(F +@(+ +(+ +@ +I+( 99.952' 999#7901".#"3632#"&5463232654&#"32#!"54;#"54;546323.A1>>O>PF9> .772?E-NDDWCFEZ'/&=ESN:@W D0J,:ZO=7G OP\60+ 2+  ++*7/ֱ  +@ + + +-.2-+3' 3#8+6+ ..1+ /.11)+ +/1./.1++ 0.1+.1/0/1+ #9./01......./01......@'-9# %99*%3$9013"54;#"54;32654.546325432#"'.#"#"W>H;UU;OH(0B-68;UU;]S 0(#%/*2;E0&! :1:F%2\z +22 + +++/ֱ2 +@ + +@ + ++ +99901!35432!"54;#"54;8W$8a On'[u[H4V+ + + 2/ + +2/ְ22+ 22+01#"=!#"&=#"=!#"&=q   p pkp p E&h.+"++'+ +2///ֱ +( ++2 +@ +@ + +@ +0+9999"  %.9990173275#"54;2+32+5#"&54#"#"&54632A0D3-.6_8,=X>( 744-;c$&N<Ot BU9Wh7+)+"+1+-62 / + +8/ֱ&& + +&++2 + +@4 + +@/ +9+&9-)&9991%9990132632#"&=#"&54#"#"&546323275#"54;2+   5.88,=X>( 744A0D3-.*4@ VAl$&N<Ot BU-;cz}2 /*3n+#1222/n+/n+3/ִn+2 +@ + + +2+#n+#2 +@#' +2# +@2. +4+299   .$999014#"32+"&46;#"&546;63232+"&546;wL% V  B%;.= V A:!   J  13(   }82/37n+#+222'/n+ /V+  + +9/ִ*n+2* +* +@*/ +* +@5 +*$+n+$ +@ +$ +@$ +:+$*'9972 ./45$9'*99014632#"&#"63232+"&546;54#"32+"&46;82%E%;.= V L% V -0  32)7k  >1 U0,' a2  C,  _wWw -v+!/V+! + +(/n+/3 n+./$ְ2n+$ +@ + +$ +@$ +/++9%9901232675#"546;2+32632#"&=#"&546)7k  >E%280,' 2  <  0-C,  f$-%+%++&3%+/ #33%+2./ִ&%+2& +@ +2&*+%+* +@ +/+*& !9999%9 9013>732++"54;#"54;2+32654&#V%7+%(*ZE0##o1c$7D0QCO F5?)= 9 -,n!t/!$3 2"/#+6+ . >t+ .! ....!........@01#'#'#"54;2+737#"54;2++<8.6I/318+H  &9!/%2/ 3332'/ִ+(+%901'#"54;2+7#"54;2+32+"54;&z K ddG 6> v / + /ִ+ +013#"&5465&PW   &]]Av (/ + /ִ + + 901#7632KPW   v / + /ִ+ +013#"&5465&PW   v (/  + / ִ+ + 901#"/K*  W , @ /V+/V+/ִ V+ +@ +2+ 9012654#,##(57&""!4'$5, @/V+/V+/ִ V+  +@  +2+901"&5467",&75(##!5$'4!""_/%+ + +/ִ%++ %+ +%++9 99901>32#"=>54&#"#"5))4@.= 923)(,  7-$2}- )Q/%+ + +/ִ %+ +%++%++9901#"=&#"#"=.54632 ,()329 =.@4)),) -}2$-7 S */  +/ ִ ++  9901#"/7632n   > b` S fXsS ,/3  +/+  ++ 901#"&54?#"',> aa n  S hXs, /3+/+++  901#"/#"&47,  kk  l  XX  !/+/+++01'&54632762,  kk  m  XX  @{!/+/ֱ +01"=42@((cbb@qv@CE@l[ql8~N:~Pr 7++/ְ 2+2++990132"/&54"54?62#d6666p p_p pr )++/ ִ+++0132"/&54d66p p,ub,uc @+ 3 +@ +/ֱ   +@ + +@ ++01#"4;54232B(B(BB(oxXT+ 32 +@ + +@ +/ְ2 2  +@  + +@ ++0154232+"=#"43(BB(BoBB(BB(@)++/+ + +01#"4;2((l=/ + + 2/ֱ+ +99012267632"&54>-^c ./++ /ִ++ +012"&46,(c( P/V+ /V+/ִ V+ +V++ 999 999012"&46"2654,'67L77?2##2#5'$56J5!"""e@+ /=+ + +/ ֱ + ++ 9012632#"&5473j  1$(M/:{   :$!)"]: +2+ /3/+++ 9012632#"&#"#"&54632j0 ?V &  AW-. 40- 10y1/3 +2/+++9901#"&54?632"&4?632#a  b  b  b  Q^  ^  ^  ^ ( /2/ִ  ++  901732632#"&/._+ !*. ;b3J )!#A/3  +2$/+ 2 +2%+99 !9901"&54?'&546327632#"/ //  //  //  //   //  //  //  //  #+h/(%+/ "333%+2,/ִ&%+&*+%+-+&9*$999 9( $$9017#"54;2+#"&547'#"54;2+274+k!H zv I g   0! 2 Q/ %+2/%+/ ִ%+ +@ +  +  +@ ++ 90132+"54;#"543:hhL  S 7 %/5%+/ %+  +8/,ִ(%+12(,+=+(+"=+  3%+9+6Xy+  W+  + ++ #99............@ %5$95"'/999 999014.546325432#"'.#"#"'#"=432326,?>,?07" /%$1(5D H7>(  ;)+9  *- %%1#6 "3S/3%+ 222/%(2333 %+-24/ִ+5+ 99 '$90132+"54;'32+"54;7'#"54;2+7#"54;2+>xV*df,WxjHXY Ht  aa  tf UU $x/%+2/!%+%/ִ %+ +%+ +@ ++%+&+!999999901#"=&#"32+"54;5.54632 ,((429U=.@4)(,) -  2$-7 2 -+/2 /ֱ + + +010!"5!"4M}( (2 8 +/ +@ +/ ְ2  +@  ++01!"43!542"5U((a(} 2 : ++ +@ +/ ְ2  +@  ++01!"43!42"5U((|(b 2 8 +/ +@ +/ ְ2  +@  ++01%!"43!42"5U(((& 2 2+ + + /ֱ  +@ + +013"43!42MU((d 5+3 +@ + /ֱ +@ + +01!0!42!2(U(Z{ 8+/ +@ +/ ֱ2 +@ ++017!2#!"542U(((P8!/+/+++01'&54632762,  kk  m  XX  7! + //+01!"43!2!"43!2LLr((b((dW\8! / +/ + ++017632'&54632,> aa vn  8X=8" + +/ ִ ++01#"/7632n   d< `^ 8X88~X~mo'R~\955vDn 0/ +@ + / ֱ + + +0132+"5jB((Bn 3/  + + /ֱ2 + + +010"=#"43n(BjB(n]W|[zx86/ +2 +/ֱ++015432!5432 U~~ Ux8 0/   +@  + /ֱ   +@  + +01!5432 )~ U;8")// //+ 9017632!2#!#"'< BTB nT ) CCevCej9o]Ce@q@++/01!"43!2RL((Cel|c}4ucjt0"U// + +#/ֱ ++2 9999010"&=4>7&#"&546;2  26  8&(4L      63 )68w1~CeyCek{l${1 /3+2+/ ֱ  +01"=42"=42((x((cbbbbCey-/ 3+2/+ + 9901&54632#"/&54632"'  b   b  Q  ^  ^  ^  Ce#}@|GiH |27_U` a .9=CO8/vrNB" 4 +/ +@ +/ְ 2 +@ +01"=#"4;542(BB(&(&B5.)]x5. ++ +/ֱ  9014&#"&54632+"&546;26! &8;%B B$  7R4  8v4nEPx-kEMX8:zNU7{o94+ //ֱ  +@ + 99012326=3#"&546..;)V=> A3*0?X 94+/ /ֱ   +@ + 9901#"&=332632o>=V);.. X?0*3A c}d9gzjh89~X8f $/+ /ִ+9013#"&547DJ  4 zS!zeYJ`A8 -]z Y/32 +@ +!/ֱ+  +9 999012325432325432#"'#"&54B66 1./2,0+ 9 9 .34-JDlkZ;E] kNPp|f:I\ | A9i ? |:u:/ +@ + +@ +/ + + 9901"&4?#"54?63232J  $V J  $V<   <   8l @lk @,BZ,Bt,/3 /2/9 9012632#"&#"#"54632]"L ^*&$Pa+"c.40-00l @9#'/ =+  +@  +/  9901"&54?!"543!'&54632 J7H  (' RRJDak0HP}1LVs8RTb9zXPv9FSiJGOlHKZUPPP{@UWKWteNzYXnE|[Xv]v1]9-/ +@ +/ ֱ +901#".5332632>-!)%. :(#/ o^q!/  +/+++01#"&54?632jW W  v  #P+3+2$/ִ+"++%+" 9999901#"&54?6322"&4632"&46W W    v  B  Wk##v 5++++ / ִ++ +0132+"&46' (( ((&8&&8&Ok#'GVm#)/ k#$+7Lk#(1'Ui#60Im#,:7"J O3$+3%>3Z+ 2+ 2  +  +/ ֱ +@ + +@  +2++01732+"54;#"543!"=!66()b O3&+22 +2/+01)"54;#"54;32%!#4x%x)+3(g3=5'3+3%@$/ +*+%  + +@ +2 +@ +20/#ֱ(( +2+2-+1+ %*$9*"(99-99%#'9901%#"=##"&=463235432'2#"&46"32654&  sjghhVzzVU{y--  00حy)Җglq3,+<3. O3 ++3 222+ 2!/"+01732+"54;#"54;32+"54;#lOx%L) Q30231E3 '75+,,5 +,( +12 + + +2!5 +!! +@ +2! +@! +%28/5ְ 2,2,+ 2+"2-+24 29+01"=!#"=!#"=##"&=4632354322!54632!54t   | 2dd--  00 ee 3%@233'w+3!%222+ #22(/ֱ%% +@% +% +@ +@ +%"+" +@ +@ +" +@" +)+017+"54;#"&543!2+32+"&54;!32, - 56 " "+33fAf+ + ++   + +/ְ2 2+ 22+99 9901)57'5!#"=!!5432|ʨ4<:yH373%3<.*309,+0&2+2 , +23 $2, +132:/ֱ +22&122& +@&) +2 & +@ . +2&6+";+ !"$901#";5#"&46;5#"543!2+32+32#!"54332654&#.BRI;>:P`hV,us,Vh`P:s>;IRB>43=YSUTTUSYd=34>(03;J3A+2,+933' 3?222 1, +3 2B/%ֱ..*+*/.+22@2 +@ +@= + +@ +@7 ++ +C+901%26=32+#32+"54;5'".=#"&54;3#"&54;+Z/[K"+4("h!6@," J[1 T dE.L- aa+W9 FaU  F31+ 3#2+  +2++%+ + 3%22/(ְ2"2$+ ++2 /23+( 9(/9901%35462#532654&+";#546235.546;2j  3"32654&#"'543267654&IAR)F=d:@t; "G3CML6Kgj]E+ <\M@'B JA_u((U/2#1AedFHH!-8=F!!V+ 3222 /2"/ֱ +@ + +@ +#+9901+32+"4;5#"4;2+#"4;!A= n58n((y((L(D(8 +)2/&/& +@&! +& +@ +9/ ֱ55+,+,+##/3:+# )2$9,!992) 999&990132#"&54767.546325432#"=&#"2654.#"P>cK1b]/9 &6G;69*2Rf,5*Nj77 *V7Z\\^1: 3$8<'N'&oL*E( mOL87E+V+C/>7/+=+7+ +@72 +F/"ֱ:2((/( +@A ++ 2G+&+5$9-/3999999C99>&97-(9901732>75432##"'"=#"&5'467&54632#".#";2+"48    .:@].+NO@S]  +@'1? & *,w>  JB7 #? 96HB  ##2)$ &6zF\.(+++ +@ + +/#2//+ְ2 2 &+2& +@ +@ +& +@&! +0+ +9&(999 +9901##"=!;232+"54;654#"&5467^F4=-'-=" ~-"?S=I37`$AeK/A$/8 ?&-Y?SyC5F,+ 2++(/#-/ֱ 2  +@ + +/ +@ + )+#&+.+) 999901"32+"54;#"54;>3232+4&?! --"K+B/CZ"KA  OE0#N:H+;qj N+ +  +/ֱ2+2+ $901"&=46226=!"!54&hhhhDNQADN$Q_dvvdwD^b'^bF+ + + + /ֱ +@ + + ++01%#"&5#"4;32>32A%2;=fD) < "!G9 (W F(R+!3&22 +322)/ֱ 2+/ 3*+(99013#"54;#"54;7#"54;2+32+"54;'_66_/-O:&f%5+3 222+ $+&/'+ 90132+"54; 32+"54;'#"54;2n85n G^U 9T+8w5 i++3 222!/ֱ+/"+6“+ ..  ....@01!##"54;2+3>5#"54;CFt91b)4@!E#F)x+?[]-(+[BY-|F\<%+1+717 +@14 +9+/2 %1 +=/(ְ62 12 -+- +@9 +@ +"+" +@ +" +@" +>+ (49" %+0$99 (9+91-9901;2+3232+"54;76=4#"&5467&54?##"=!$7%4 4TB& ~/+|Lr\P,B^#3  04j/! $@FFUi%9P 7`= HRR%q+ 3222+"22&/ ֱ +@ +  +@ $ +2+ +@ + 2 +@ +'+01!2+32+"54;#32+"54;#"54m~""x--w!"OO8&g+!+/ 2'/ֱ 2  +@ + +@ + $+(+$ 99!99012#"'32+"54;'4676"32654&=Wz\n@b6D3,6N`eIHe^z_\|[Z@k+fHIefHJd^a.i,+++ /%//ֱ(+ +2 0+( ",$9 9990174632432#"=&#"32#"&46326=4'#"&^o?76@co`> KQ*$ 5Lvpz'E4ccL[#/*  &v+ G ++2!/ ֱ+"+ 99 990172654&""&546763!2+J^`abGZx./.K Y#<bOLhjg)[>Q('  Bs5E#=+) O+ + ++ 2!/ֱ +@ +@ + +@ +"+01%#"&5#"5463!2+32>32A%2;  D) D "!G9  W +)i++ 3 22/ֱ + ++ +@ + +@ ++9901%26=#"54;2+#"=#"4;(:M15]U4^<A6(PN(.E%8! )f +3!2  +@  ++3'2*/ ִm+  +  ++2(2$+++01%+#5#"&=#"54;;3226=4+! @-+--?O2 $\3(2b(; 3,d1)*F;)2y*+9!YF)(B+ 322!/3%22)/*+%!999 901"4;7#"54;2+32+32+"54;7G@1-4 L)5y(( "F-\-y$+3 2$ +@$ +,+3)2,) +@, +./'ֱ' +'+ +"+2 2+ + +/+017;462326532++"&=#"&=#"4;=-  *%2V -H9)  +9H)R1-  6' :K L:(+(?s+:3$2/ ,4333 02@/ֱ+!!)+7A+999!=9),5:999)7=$901"&547#"4;2+32>=43232>54&'#"4;2+#"&'IT7m+=)!  7!(,n6TH*0*\XS((TS7O$( 1)$O73H+((SYa{%Z;"jJ+);"jVH"P+)" V+("$Zpf &0u+*+ '  +'  +1/ֱ  .+2$22+.  '$9'*9 9 9$9013254&+"32+".4>;2#;2654#B69K(>: ^H5Q++O5D` N:8BD7;gw"$"-!E[32#"&'#"&46;2326=4&#";2+"&r&F-ShhSEb! , "fDNQA 5 t5I;*wdviY   ^Yb!/8)   0(3"X+3+ 3 n+  +  +#/ֱ +@ +$+9 99901%0#50&5476327>32#"'&#")  $   C3&O+3+3$n+$ +@$ +$ +'/ֱ(+9$ 99901%0#5#"&54?6327>32#"'&#"2)f  r $Y  d  0("jBbQF\ ;g"+3 2" +@" +-+532- +@-2 +;546232<(163,?%163, @-+  5(; @-+  5(; 2+6%2+Q6%)* *+)* *++(=v+3(72 +22>/ְ2##-+44;+ 2?+-#99949;=999(0;$901"&547#"543!2+#"&'""+32>=432327654'IT76UG*0*K`1:*"  7@#:\^SS_b%P]7Q&( 1)Z/6[QPnT2'//&(/#ֱ+ )+67+  + +  + + #9 99 ....... .......@9 9 #9901#"+"'5;254.#.546;TDaaD)J;)   `lɯ =C)*$.(A  RYYm'F//'(/$ִm++ )+  $9 $9901#"#";2>54.5463ldYG&@; 6 9%1/ERE/~(ki4.%!/ (  B1{+3$~+2+ 2 + +" +"" + +%/ֱ!2 +@ + +@ +2++&+01#"=#32+"54;#"543!#"=!32_66Ƒ)--b{Lc//  + +/ + + /ֱ2 +@ ++ !+99901#".#"32#"=##"4;4625W.D)f=;df<~Wk)--(9G'1(D!+3%22+ 322)/*+%!999 901"4;7#"54;2+32+'32+"54;7'OIp.*{1 L~&2usy(۱( xdB#/]//*$/0/ֱ '2  +@  + -+1+- 999$*99012#"'32#".='4676"32654&=Wz\n@CIC32#"32+32Dh26W5M`cJCe8(NA(_AE_+&C,q+&jsw61+%2++"21// 2/)2/ֱ+ &2  +@  + +@ + $+2!!+.3+!$9)'901326=4&#"32+"54;##"=!"=#6732#T=QHDL%6x|t(|)O RamO`S84+ItrL ?AKj>&q@@/z,+!!, +!% + ++, +0//ֱ2/ +@ ++2 1+!,999 #%9999014>32542"5.#"!2#!327632#"&5@ #3Y7dJ((hCSuXbL  4T,fE9I;)Ep.DYZZ  &+ e\@6q3,q"jr,TG3-H3,5+3 .22 +@ +'+#22-' +6/ֱ!+! +@!% + +.2. +@.* + . +@ +.2+7+!9-990132+"54;##"&=432325#"54;2#32654&#T(UwnPst6$; .:/ֱ'2++/3+$2 +)2626 +@62 + 6 +@ +-26:+?+:9990132+"54;5#32+"54;#"54;2+35#"54;2#32654&#K1UwnP\[[C3Z+ 2+ 2  +  +/ ֱ +@ + +@  +2++01732+"54;#"543!"=!66()b 63%+22 + +2+ 22&/ֱ+"" +@ +"+ +@ ++'+9"901765#"543!2+3#"=!#"=;#"Yc<)""bbb"+3(P3N2+&336!+222A+ 33=FI$2O/,ְH2!2! !$+) +)/L3$ +2P+,);9$!9=6 -H$9012+7#"54;2+32+.'32+"54;5#"54;>7'#"54;2+5#"543^V2=98RKd3?589=2V34pXu"9r]Xp4\@<'+"+1++<8" +<=/)ֱ%.2 %)+ 2%4+  +@: +>+ )',99 % 99"17$981$,999<99 999012654&#"#"=432632#"'#"=43232654&+"543"AWQ>:R43=YSUTTUSYd=34>(03;2&3'+!22 +@% + +3222(/ֱ +@ + +@ +@ ++!! +@ +!'+#2)+01)"54;#"54;2+!#"54;2+3#"5f.66.JI&32.+2(2+!3 &222. +3/ֱ +@ + +@ ++2(( +@($ +@(+ +( +@ +024+9901%5#".=#"54;2+32675#"54;2+32+"543O+J>x6>N"M6x.)=1.133+&222+-33 $(2$24/ֱ&& +@&" +& +@ +@ +&'+' +@0 +' +@'+ ++ +@ +@ + +@ +5+01%3#"54;2+32#!"54;#"54;2+3#"54;2+@6.,66.)O35+!/222 +@3 + +(33#-$26/ֱ +@ + +@ + 2+!! +@! +! +@ +!"+//" +@/+ +"/ +@"& +/5+17+01)"54;#"54;2+3#"54;2+3#"54;2+3#"5&Z[[J-3#z+2+ 2 +@ +  + $/ֱ+ 2 +@ + +@ + +%+9901#"=32+32+"54;32654&#@UvmP6);U^A ba_I34J Q309+3# 2222*+3& /2221* +:/$ֱ222$ +@2- +$2 +@$! +(226+ + +  + /3 +2;+1#990132+"54;#"54;2#32+"54;#"54;2+32654&#ee7UvmPe;U^A a_I34J+2!a+2/ / 3"/ֱ 2 +@ + +@ +2+ #+ 990132654&#'32#!"54;#"54;2+;U^AUvmP66v"I34J)a_@@/x*+* + ++ + * +0/ֱ2+2'' +@ +1+9 *999990172326=!"543!54&#""=42632#".54T "H.XuSCh((Jd7Y3# f7h5}&ZYD.pE)32"&'#32+"54;#"54;2+%"32654&s`fpspJWZSZ[RQ\Y9s~~ސonlq /3-+'3",22+ 2  + ./ֱ +@ +-+2""- +@"% +2-" +@-* +/+- 99 99015#"3##"54;>7&546;2+32+"54;6UhJr9UB9=@/kI66K$E-0D)gzkR 0a?]HDQr"-+( +#/+./ֱ&&++++//+& #($9+9#(999 9 901%"&54>35432"&#">32'"32654&~~ %4L`A<0BH,)E8[~JhhJIig_`:JO-/&P#?,.WjkjJNkl(+ 2+2( +)/ֱ 2 +@ +2 $+ $+/ *+  9(9 9 9017#"54;2+"546373254+32654&+%FI Y<@ L^veo/'PC^)O IB$$*)r] +2+2 + +/ֱ +@ + +@ +@ +++01#"=#32+"54;#"543!--"M[O7(%+#22# +2+ $22&/ֱ+ +@ +#+# +@ ++'+9"901765#"543!2+3#"=!#"=73#"M"ea·) %[[) O?H MSp+E33 @JO$2+*733"%/2<$2T/ְ$2O02O +@OR +-2O +@ +(2U+$1N$901!#"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+32+"54;.'32do#?Re0c#o#c0eR?##E.oAAo.E#g@3+.+>+ + . + A/5ֱ1:215+21++#++/#B+53899199 %&.>$9>+08999 %&99"#$901%4.+"54;2654&#"#"=432632#"'#"=432326 A-D0PDJ89H4UJa. oU`=Z@BXu  ) +("E.@b  (9K6 S"14A3#+3'222.+3* 2224/(ֱ2( +@ +12( +@(% +,2+2 +@ + 2 +@ +25+*'9901%5#"54;2+32+"54;532+"54;#"54;2# -x""x--w!"xx3+OA&XF(R+!3&22 +322)/ֱ 2+/ 3*+(99013#"54;#"54;7#"54;2+32+"54;'_66_/-OX*w+!322 +( + +22+/%ֱ+ +@ ++ +@ +2 +@ +,+017325#"543!2+32+"54;#+"&'5432"M""x-J"A7O>4%,+ 3#222*+3&222-/$ֱ$ +@ +$ +@$( ++ +@ + 2 +@ +.++99&#,990132+32+"54;##'#32+"54;#"54;k""m"}~(nbwOOA3#+3'222.+3* 222#. +4/(ֱ2( +@ +12( +@(% +,2+2 +@ + 2 +@ +25+01!5#"54;2+32+"54;5!32+"54;#"54;2# -**--w!"xxOHRA%q+ 3222+"22&/ ֱ +@ +  +@ $ +2+ +@ + 2 +@ +'+01!2+32+"54;!32+"54;#"54\""x--w!"OOFSTFff+ 2+2+ +2/ֱ+   +@ + +@ + ++01!#"=#32+"54;##"5f-.[P[3F%\ F8="+4+ +3#,2/"2/3).25/ֱ&&+*22-22 +@ + + + 22+6+#)$9015#"&46;5#"54;32+32+"543";3#32654&\~}]6^]}~\6LfhJDJhfzyeyzbIFbSbFIb3%[5'|+!22 +@% + +3222(/ֱ +@ + +@ +@ ++!! +@ +!'+#)+01)"54;#"54;2+!#"54;2+3#"5r"-- "m"8OO`-+2(+ 3$222 ( + ./"ֱ" +@+ +" +@"& ++2 + 3 +2/+ 99 9013275#"54;2+32+"54;5#"=#"54;2#fH "m""m"%A"xx+#I P3+&222+-33 $(2$24/ֱ&& +@&" +& +@ +&'+' +@0 +' +@'+ ++ +@ + +@ +5+01%3#"54;2+32#!"54;#"54;2+3#"54;2+A"m"! j""m")OOO L5+!/222 +@3 + +(33#-$26/ֱ +@ + +@ + 2+!! +@! +! +@ +!"+/"/ +@"& +/5+1+27+01)"54;#"54;2+3#"54;2+3#"54;2+3#"5# k##k""!k!>OOO@#z+2+2 +@ +# +$/ֱ+2 +@ + +@ + + %+# 990132+32+"546;##"532654+@%:@<@ #p›2$cIf> OZ#%S N19!+3& 2222-+3) 2229!- +:/'ֱ222' +@20 +'2 +@'# ++226++  +@  + 2 +@ +2;+9&9901%#"54;2+32+"543#32+"546;#"54;232654+-x""x*:@<@ pB2$c)OOIf> O#%Sl!g +2+2!  +"/ֱ2 +@ + +@ +2+#+!9901#32+"546;#"54;232654+%:@<@ #%q=2$cxIf> O#%SJ,{&++ + & + -/ֱ2+2## +@ +.+9 &999 *99 #99901723267!"543!.#"#"=432632#".546^ #O3LgeM?\=_dc>n6 kXGJ[7([ 7c`|+/  N&1$+-+ 2+(+2$ +2/ ֱ2 +@ +2  +@ +@  ++2**0+!3+*90$99- 99!*0999(99017#32+"54;#"54;2+3>32#"&"326543p."d2pY^rs]Wo\\LK[OYua^p&hNOhhLQX'/"+3&222+) 2." +20/ֱ,, +@$ +,+(2 +@ +2 +@ +1+,'9999).901%#"&546;2+32+"54;532+"54;#";X^9A<@ "$r$.3#bI32? O"&S?l&C6?\&j+i\D"+'21+5/ A"5 +A.*"5 +;3.72E/(ְ/26<22( +@ +@: +( +@($ +@(, +32+ +@ +F+A9'=901%+"54;2>=4&#"32+"'54;#"54;5#"54;32+>3231A@$&D7$ -.666_D'D[%9O% @-,:  "6_(!K@rb'J++&& +&* ++ +# +#,/ֱ#2# +@# +#+ 2-+# &999()99#9 9901%#"&546325432#"'.#"!2#!32762"7Y0cd_=\?MegLlN  X "#|`c7 [(7[JGXH gV\pL\["juFpM"6+3 +3 ,22 +@  +&+"223 & +4/ֱ +  +@ $ ++,=+2, +@,) +, +@ +,0+5+3 90132+"54;#+"'5432325#"543!2#32654+`\9A<@J<"V3#bJxI32?O>;7"&S<5=+3 6222"+03'+222)" +<3)2>/ֱ(2+ 3+%2+*26=+26 +@63 +6 +@ +.26:+?+90132+"54;5#32+"54;#"54;2+35#"54;2#32654+^d9A<@ !cc! ^^3#bRxI32?O"&S+'\>+83 3=222+#/# +/# +)3%2?/ְ2 $*22  +@  +@ ( + +@ +! +2 >+33> +@36 +>3 +@>; +@+> /9+901%4&#"32+"'54;#"4;5#"54;32+>3232+"54;D7$ -.666_D'D[--,:  "(6_(!K@Fb&Al"C63F%\&|>)+3$22 +@ ++3 "222*/ ֱ +@ +  +@  + 2+T++$$ +@$' + 2$ +@ +++01!#5#&54;#"54;2+!#"54;2+32D0""x--w!"PPOOD4>s+93$2/*2333 .2?/ֱ+  '+6@+999 <9'*39999'6<$901"&5467#"4;2+32>=43232654&'#"4;2+#"&'D[ m1#K,*/ +&,S!2n^H+@A{:#((7p -$ "- m;#((#;t(!+(Z8z#,+ %2$//"32 +@ ++2-/ֱ +2%22 % +@ +%!+)+.+$ 990132#!"54;##"=35423#"&=#32654&#ƧUvmP7d( `;U^AKa_6_00_ 6I34J-&++2+32+ +2 +@ +& +./ ֱ  ,+222, +@,( +++#/++"#9901732654+'#"=354323#"&=#32+"546;қ2$c _:@<@ #)#%S&O00O &If> O<@L ++2 + +/+?#+33(2# +@8 +* / +H3*C2M/ֱ)2+!3+&2++2JB2J +@JF +J1+:25N+1J /;$95999*1;99#?!&9901%2>32#"&=#32+"54;#"54;2+354632542#".#"32+"9 &!>/`DWZDr`p( 5#OYm& )#$h kEp${][ TF7+,B+F<2,7 +,0 ++ +3 2 +@ +; 7 +#3;(2G/ֱ< 2<325432#"'.#"!2#!32762#"&'#32+"543>Z*__=\?MegLlN  "7Y0]}*Z)O[s7 [(7[JGXH  "#pX O32d+)33 $.$2"+2" +023/ֱ22 +@2 +2 +@ +4+29901%#2+"54;5#32+"54;#"54;32+"54;'#plk"v6!i%y%u%8l%ۼ O2d+)33 $.$2"+2" +023/ֱ22 +@2 +2 +@ +4+29901%'#2+"54;5#32+"54;#"54;32+"54;'#ljk"s6i%y%u"2oƉ``O``X3@D ++933&14>$2+%3B222  +A3222E/ֱ2 +@ + +@ +2?+44? +@47 +?4 +@?< +F+6D+ B.&.B%&1B2B1+AB1+%&12AB......@?"D$94C9017#3732+"54;#"54;2+3#"54;32+"54;'32+"54;57#f0_6i,vm-I -c C|Sl&*%SJNF+)7333J $.2<@$2+3 L2221NF + 31">22O/ֱ@ 2@@C+H+H/3C+ 2@/+$$/ +@$' +/$ +@/, +P+/C:>N$9$LM99017#"54;2+37#"54;32+"54;'#32+"54;5#32+"54;7#32+"543%'#9ZF%yM&I CN A "ZJE)O``````P448g,+ 330%222+89/&ֱ& +@ +& +@&# +:+&569980 '5$99901'&543!232+.'32+"54;5#"54;>737#n&n&11" 85?3d3?588=U(^<#=]C]r99r]Wp4,&2/3(+33,"2223/4/*ִ'+'#+# +@ +# +@# +++5+'*-9#03$919 299993, $0$999017'&54;232+.'32+"54;5#"54;>737#XXD?8:FdG88!7d(H!ORaM  Ie[H3wP36:?C&+ 33* $21+-8B22:?&1 +:D/+ֱ;92;+ +@;# ++; +@+( +;+ +@ + +@ +E+; 7>@C$9A9?*;$9:@A$91-6901332+.'32+"54;532+"54;#"543!2'#>7#737#d1=785?3dFPWY-<+}(^=4oW]r9 fp5? &>6:2+'336",222/:2 /833;/ ֱ19224+4/ 34 +@ +-+""- +@"% +-" +@-* +"++<+-78$9"99996!.999:9 90137##>#"543!232+.'32+"54;5#"5437'#$(HS%_tXD?8:FdG8EG*wc$-N!ORaM  Ieyy|FO)+@+6/;02LG) +L/ + + 2P/>ְ2+2+> +@+3 +++2! 2! + +@J +!C+&Q++><99#)@F$9! 9G@&9L#9!9012267632"&544&+"&546;2#"32+"&54;&5632654&'#"&46;26>-#.  C7A/`MGYA  !/jF2QI  C|FfO)+@6/;02G/L// + + 2P/>ְ2+2+> +@+3 +++2  2 +@J + C+&Q++><999)@F$9  $99G@&9L$9 9012267632"&544+"&546;2#"32+"&54;&5632654&'#"&46;26>-4  1, !nAAA  !/j0*2@  !J39"F-\Y3%@"2N6H'N J3>++3 22 +@ +/ֱ+ 9901!#"54;2+33"=# MO(  [J8++3 22 + +/ֱ+01!##"54;2+33"=#PF)Am(,xx] J&lJ]& FT@%6A.+=+'+7+3 $2 /$%22B/3ֱ::?++C+6M+ .   ? + %..% % %+ . %........@?:'&.999+"9=+3:?$901!#"54;2+#"54;2+32+"54;2#".54>7"2654&H; 519 `-W^A!LS.A"!p;;:x:9x,VeE-TeBCdUpqou FJ%06++5++3 $2&+2 /$%227/.ֱ336+(8+6M+ .   ? + %..% % %+ . %........@63+&99("95(.36$92 $901!#"54;2+#"54;2+32+"54;2#"&546"25H; 519 `-WKSRLMx@dyzfd{)3%W'b / +/+(/%ֱ+)+"$9  "$9$9$901"&'62>54&'632#"'.546[F]^F>E][YrsW Ytu  X\?qj mnH(b!/ +/+)/&ֱ+*+#$9 ! #$9&$9$901"&'62>54&'632#"'.546[>PP?>=PNPggNPhi b@Aba>Bb:{SOz {RQ{D&')B+(r'*')D &GX+(&GXx(iU/ 3+ 2/ֱ+2  263+  ..@015432%#"&5 > d~ Ie~ Gi UnH 3n&H+B3;G222 +@? +&+43"+/9222/ + + 2I/ ֱ,2 +@ +)2  +@  +@ $ + +H+.2;;H +@;7 +H; +@H2 +E2 ;H+/ ;A+=J+999H 9"-99012267632"&54 32+"54;#"54;2+5#"54;2+3#"=#"54;>-wD \wAn5H%+3)222%) +@% +0+3, 222E/;;E +;6 +?2I/*ֱ2* +@" +32* +@*' +.2G*+8+2 +@ +2B+==/B+ 2J+869=DE99?9,)9901%5#"54;2+3#"=#"54;532+"54;#"54;2#2267632"&54 -x"=i--w!"x$>-+H't+  2//32 +@ +(/ ְ2 22 +@  + +@ +2 $+)+ 990132+"54;#"4;546232#32654&#UvmP666  ;U^Asa_(L L(I34Jl't+!2/$/3'2'$ +@' +(/"ְ222" +@ +" +@" +%2+)+!9901732654+'5463232+32+"546;#"43қ2$c) --:@<@ #-)#%S+ +(`If> $(+34"+&2-+) 2 "- +5/'ֱ 2' +@ +' +@'$ ++2+126+39919&99 399)19014632654&+327'#"/+32+"54;#"54;2  H?U;>  I(466PmJAc I&>3I = J_FO3@F<6+ 1+-&/* 2/=/+ֱ 222 + +@ # ++ +@+( +/2 +92>+ 6;99999*999-39;$91 /901$4632654&#"327'#"/#"'32+"54;#"54;>32C  J?fLJhhJ,$D  D2Z+ 2+2 + +/ ֱ +@ +  +@  + 2++01!32+"54;#"543!54266( br]+2+2 + +/ֱ +@ + +@ +@ +++015432!32+"54;#"543--"[O>3$v +2+#2 +! +  +32%/ְ22 +@ +2 +@ +22"+&+0132+32+"54;#"4;5#"543!"=!6556((@(ybr%}+2+ 2 + +%" +3%2&/ ְ22 +@ +@ +  +@  +#2@  + +'+015#"543!#"=#32+32+"54;5#"43"MNN--*!W((>032+ 2+#2 +! +-/%  +%3/ֱ $2  +@  + +@ +2 +** +@0 +" 4+-099012326=4&+32+"54;#"543!"=!32#"&546W..;]A:66(ƬUwV>> ' A3e4JbaFk?X rD3+ 2+$2 +! +./&  +&4/ֱ %2  +@  + +@ +@ + +#2+2+ +@1 +5+.199012326=4&+32+"54;#"543!#"=#32#"&546 ..;E9Z--"MVN^V>> A3-1O??X nP3Q+33! 222! +@ +,+9F33(14>AK$2R/ְ32 ?2 +73 +<2 +I2S+&9 M9ADLQ$9(! 3@$901%#"=#.'32+"54;5#"54;>7'#"54;2+5#"54;2+7#"54;2+P*5?3d3?589=2VdV2=9)w]r99r]Xp44pX nMU%+33) $2%) +@% +2+?L33.7:DGQ$2V/ְ92E2 +@ +B2 +@ +=2+ +@ +W+ GJRSU$9O9.)9F$901%#"=#"54;.'32+"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+MUR?#o#?Re0c#o#c0)w.E##E.oAAo\S@R=+8+"3G++(/11( +1. +6/#V+RN8 +RS/?ֱ;D2 ;?+ 2;8+##4+%4% +4+ +%J+  +@P +T+ ?=B99 ; 998NR99#GM$9%9961%9NG:B999R99 999012654&#"#"=432632#"&5463232654+5&'#"=43232654&+"543"AWQ>:R ,.X5bDF]XI=7;21B<-g;YB+BG6F^;$  B >p1DI75@gSV+ +K38+=+.Q/Q + +/LV+'# = +'W/ֱ 25 +1:2  +LL+NN +T +N+H@H+++/@X+599 3899 1#%'999L"(.=$9+NBC99N9# H999'BC99.3;?@$901232654+5&'#"=43232654.+"54;2654&#"#"=432632#"&546,.M5Z@BX A-D0PDJ89H4UJa. hQA,#> r B/ S"14(  ) +("E.@b  (7J;$ $n538+322 +@ + +-3%(22229/ֱ&2 +@ +#2 +@ +2+:+(+34$909'9901%3#"=#.'32+"54;#"54;2+%#"54;2+SI76L3&J66J"v.DUD)w;]6+  :cFn*+3 22 +@ ++#3(22+/ֱ2+/3+ +@ +,+ !)*$9&99901%3#"=#"54;'#"54;#"54;7#"54;2+Iu_66_/)wO$43@+3 22'+:3#,5?222.' +.R+. +@ +. +@.2 +A/!ֱ-2! +@! +%2+/2 322  +@  +B+  9.9#490132+.'"=#"'32+"54;#"54;2+35427#"54;2+Lq'8X"`B(J66J8(v1yvqzIZa;F4+3 22 +.3)322" +"R+" +@ +" +@"& +5/ֱ!2+/3+#2'226+ 9"9(901%32+"54;'"=##"54;#"54;35427#"54;2+-(_66_(l/֭~AYObFl$43Bz++3/%22<+ 38A2222+352C/0ְ62%22%0 +@%( +?220% +@0- +3:22D+2/$9990132+%#"54;2+32+.'32+"54;#"4;5#"54;2+QQ"v.DUD8X76L3&J6;;6J(g :cE;]6+ (3F4w"+3&223+ 3/22,)"3 +3,25/'ְ-2!22!' +@! +!$+$/*1336+)& 9990132+7#"54;2+32+"54;'#"54;#"4;5#"54;++/-_6@@6_U(=(#438s,+30&22+ 332223 +@36 +9/8ֱ441+&2&1 +@& +)21& +@1. +:+30%9901!2+%#"54;2+32+.'32+"54;##"5J"v.DUD8X76L3&J6c3 :cE;]6+ [ *c+3"22+3% 22% +@%( ++/*ֱ&&#+2# +@# +,+%"990137#"54;2+32+"54;'#"54;##"5 /-_6cO[5n'35+3 222 +@ + +.3%)3222' +'6/ֱ&2 +@ +#2 +@ +@ + +(255 +@51 + 5 +@ +,25+7+01%#"=#"54;5!32+"54;#"54;2+!5#"54;2+'~66-x66x)wRn5+3 222 +@ + +.3%)3222' +'6/ֱ&2 +@ +#2 +@ +2 +(25 5 +@ , + 25+127+01%#"=#"54;5#32+"54;#"54;2+35#"54;2+i--w!"x--x")wO5k35+3 222!+/3&*222! +3 +(! +(6/ֱ'2 +@ +$2 +@ +@ + +)2 +@ +  +@ +-25+17+01#32+"54;5!32+"54;#"54;2+!5#"54;#"5Ac.66-x66 RV5+3 222!+/3&*222! +3 +(! +6/ֱ'2 +@ +$2 +@ +2 +)2 +@ +  +@ +-25+17+01#32+"54;5#32+"54;#"54;2+35#"54;#"5,c"x--w!"x--xOd3? +3$ 222++'022:/2 + +2@/%ֱ% +@ +% +@%" +@%) ++ 12  +@  +@ . + +@ + +77 +@= +A+:=9 9012326=4&+32+"54;#32+"54;#"543!2+32#"&546..;I5`.66-R\IcV>> ' A3'7N9?X DI? +3$ 222++'022:/2 + +2@/%ֱ% +@ +% +@%" +)2+ 12  +@  +.2 +@ + +77 +@= +A+:=9 9012326=4&+32+"54;#32+"54;#"543!2+32#"&546p,.;E9X"x--w!">"TN^V>> A3-1OOH??X ?|@19+*3 22 +@. ++ +$7. +$:/ֱ1+ 2+22+4+(  3;+1 99+$799499$ 9901"&=4>325432#"'.#"354632#"&576=4#"Eh "2Z9eHgCSvZ7029  )B>fS7J<+Ep.DYGZ3?9.SXb 2O>IT|/5+(302 +@, + ++#3, +#6/ֱ/+2)02)+ 22+&7+/99)#3992 993&9#99 9901".546325432#"'.#"354632#"&5764#"HEe3d]?]?Sg+S:7029  )B>*FF&c7 [(7gR :8"D3?9.gb |I?e@<+/8+++( /=+ + +=/ֱ,, +;; +; +;%+2!>+; (99%/8999!2499 ;99(/#46$9012632#"&547#"&=4>325432#"'.#"3267632j  1$(0f "2Z9eHgCSvX4R( W3:{   0eS7J<+Ep.DYGZ*0 &K !)"Te8++4+++% /=+ + +9/ֱ(( +77 +7 +7"+2:+7 %+$9"499-.99 799%+ .1$9012632#"&547#"&546325432#"'.#"32762j  1$(1 bd]?]?SghRmN  P;:{   0|`c7 [(7gROeH ; !)"Hn3q+ 2 + ++2++2/ֱ +  +@ +++ +01%#"=#"54;##"=!#"&=#i )wIrr Izmm+ 2 +@ +/3 +2/ֱ +  +@ ++++01%#"=#"54;##"=%#"=v.tdt(wO[[3%3&X+ 2+ 3%222'/ ֱ +@ +  +@ +(+ 9 901%32+"54;5#"54;2+7#"54;2+Biio&(n 9:'X+3 222"/&2(/'ֱ' +@ +' +@'$ +)+' 99& 901#"54;2+3#"54;2+32+"54;)AD)23#Oe{3%30u++/%2 +3222+ +3#21/0ְ2%2%0 +@%( +0% +@0- +@0 +2+%09901%#"4;#"54;2+7#"54;2+32+32+"54;^^o&(neeii( (8:1q+&3!+222/ 2/3-22/ ֱ +@ +@0 +  +@ +@  +3+  9990132+"54;5#"4;#"54;2+3#"54;2+32#B23aO)AD)P#||(sO((n035a+3 222 +@ + +-3%(22226/ֱ +@ +7+09 '9901%#"=#"54;'32+"54;7'#"54;2+7#"54;2+0u>@n+-o)w3n%5c+3 222 +@ + +-3%(22226/ֱ +@ +7+0599 '9901%#"=#"54;'32+"54;7'#"54;2+7#"54;2+%uAD o.0n)wn&3++22 +@ +%+ 3222%+" +)2,/$ֱ  + +@ +++''+ +@ ++ 2-+01#!#"54;2+3#"=!"54;##"=!#"5d6.JfdD w[ ++22 +@ +%+ 3222%+" +)2,/$ֱ  + +@ +++''+ +@ ++-+01#3#"54;2+3#"=!"54;##"=!#"5"d"m"8"cDxO[O[Jn33+ 2 +@ ++,3 '1222$ +$4/ֱ"" +@" +" +@ +" +&233 +@3/ + 3 +@ +*23+5+ "9$ 901%#"=#"54;5#".'5#"54;2+3275#"54;2+~6 E%!.4x6sK)6x)w#35`n4+ 2 +@ ++-3 (2222% +%5/ֱ"" +@" +" +@ +" +'244+02  + /+36+ "%99% 901%#"=#"54;5#".=#"54;2+3275#"54;2+^"%A-"x->&H "m")w #J39+2,+3( 1222#5, +3#2#5 +@#! +5# +@58 +:/&ֱ33& +@3/ +&3 +@&* +3"+522+2 +@ +@ + +@ +2;+(5901%675#"54;2+32+"54;5"=.'5#"54;2+542<=#6x.6 5 (>N x6 `(-ZY"0/j`:3+7-2+&3 !+2223 +32 +@ + +@ +;/ ֱ +@ +  +@  ++228+ 2- 85+$30 +)2<+9901%"=".=#"54;2+542675#"54;2+32+"54;5B(%("x-N(8"m""m"8799J31 +3$ 222++'02 + +2/%ֱ2% +@ +@. +% +@%" +@%) ++   +@ + +@ +3+9$901>3232+"54;5&#"32+"54;#"54;2+ E%!.4x6sK)6x.vB#35`2 +-3(222+2!  +!3/ֱ2 +@ +@ + +@ +2+(( +@(+ +( +@0 +4+!9!901%5.#"32+"54;#"54;2+63232+"543>&H "m""R%A-"x) #O@< +66 +6; +*+" * +13"2 * +=/ֱ+#2323+0>+993 *99990;99"9901%54&"#"&=#"&4632#";54>32!3267632[vv 4T,f&%;9% !%& "2Z97Y3# EX4R( 3 YY &+ e4R7   7J<+)32!3267632#"&'#"&4632#"3hv fd6 Ze` nQ/b  D`%;9% !%DRQESliO_ 8|[4R7   e@N+@J+4+/=+ + +,4 +;3,2!&4 +!O/ֱ))+-2=2=+MM +M +M+:P+)!$99=9M4@99CJ$9:EG99M99@EG99&,9901%54&"2632#"&547#"&=#"&4632#";54>32!3267632[vv  1$(0 f&%;9% !%& "2Z97Y3# EX4R( R1:3 YYF   0e4R7   7J<+)32!3267632hv fd  1$(1`%;9% !% Ze` nQ/b  D1:DRQP   0|[4R7   SliO_ ' !)"q3,P"|q M_"|$3>+ 2+*3"%/2229/1  +1?/ֱ #2  +@  + 2 +@ +2 +66 +@6- +6 +@< +@+ %(19996099<991$9012326=4&+32+"54;#"54;2+%#"54;2+32#"&546 ..;WGJ66J"vK[qV>> 3 A3e:D\Kk?X FD4 ++ 3%22//'  +'5/ֱ 2 +/3 +,, +@,# +, +@2 +6+ '999,&9/29 9'9012326=4&+#"54;#"54;7#"54;2+32#"&546..;E9Z_66_/#N^V>> A3-1OH??X 9n'3-%+322% +@% +% +@+ + + 22./(ֱ+"" +@ +"+ +@ + +@ ++/+%9017325#"543!2+3#"=#"54;##"&=432b! /QI~66$:P'wB%'*"Xn,+#322 +@ + +* + +22-/'ֱ+!! +@ +!+ +@ ++ 2.+017325#"543!2+3#"=#"54;#+"&'5432"M"=i-J"A7wO>5937+ 2+(3#-2222/! +!8/ֱ  2  +@ +2 +@ +@ + +"2// +@/+ +/ +@& +@5 +9+25990123265!32+"54;#"54;2+!5#"54;2+#"&546,.;6-x66xV=> A3:?X R97+ 2+(3#-2222/! +8/ֱ  2  +@ +2 +@ +2 +"2// +@/+ +/ +@& +@5 +9+2599012326=#32+"54;#"54;2+35#"54;2+#"&546..;-w!"x--x"V=> A3OX?X 5n'35+/3 (4222 +@, ++!3&222, +6/ ֱ2 +@ +2  +@ +@  +5+2((5 +@($ +5( +@5 +22(.+*7+01!32+"54;#"54;2+!5#"54;2+3#"=#"54;6-x66xI~6wAn5%+3)222%) +@% +0+3, 2220 +6/*ֱ2* +@" +32* +@*' +.2+2 +@ +2+ 27+01!5#"54;2+3#"=#"54;5!32+"54;#"54;2# -*Eq--w!"xxwOJm34/+)22+"3 '222/ +5/ ֱ +@ +  +@  +4+ 200+2)) +@), +@)% +6+499 901%075#".'5#"54;2+3275#"54;2+32+#"5KQ F$!.4x6sK)6x.~(#35x`n4.+(2. +@.1 ++!3 &2221 +5/ ֱ +@ +  +@ +3+2/+ +$2/+2(6+399901%5#".=#"54;2+3275#"54;2+32+#"=%A-"x->&H "m""^) #w nQ3. +&3+222  +@ # ++3-222//ֱ +@ + +@ +@ +,+, +@ +, +@,) +%+!0+,999901%##32+"54;#"54;32+3#"=#"54;#F.J"cd=Ja\w4n%.!+3%222!% +@! +,+3(222//&ֱ& +@ +& +@&# ++ +@ + + 20+-99(%.990132+3#"=#"54;##'#32+"54;#"54;k"=^"}~(nbwwOOq3G+ 2+2/ ֱ +@ +2  +@ +2+0132#!"54;#"543!2#@?  O&|qHY&| O&jrH[&j N3 B+&|q?\&|2@)`+ + + +*/ֱ+2$++99 999901%265".=!54&#"#"54>32nvv7Y3# X4R(  4T,f "2Z YY)n3e+ 2 + ++2 + +/ ֱ  +@ +2+++01%#"=#"54;#"543!"=!_56()wbrnh+2 +@ ++2 + +/ֱ +@ +@ + +  ++01#"=#3#"=#"54;#"543!Hu-"M[wO Q"jp N["j7936+,3 '2+2 + +1/ +%3!27/ ְ2' 2 ' +@ +22'+.. +@.* +#2. +@4 +.+8+1499012326=#"54;#"4;5#"543!"=!32+32+#"&546I..;6556(ƍ!V=> A3*@(yby(0?X 97+-3 (2+ 2 + +2/ +&3"28/ ֱ22(!.22( +@(+ +@(% + ( +@ +@  +2@ 5 +(+9+2599012326=#"54;5#"4;5#"543!#"=#32+32+#"&546,.;3-**"MNN-'V=> A3*(W(0?X (903E+;33 6222!+.3&)3222@/F/ֱ== +@=9 +@=1 += +@ +@C +G+=4699@C99(99012326=#"54;'32+"54;7'#"54;2+7#"54;2+32+#"&546/..;M>@n+-oV=> A3*0?X 39%E+;33 6222!+.3&)3222@/F/ֱ== +@=9 +@=1 += +@ +@C +G+=49@C99(99012326=#"54;'32+"54;7'#"54;2+7#"54;2+32+#"&546%..;NAD o.0n  V=> A3*0?X (03=S+ 3222*+73&/2<222# * +3#2>/?+ 9&#190132+32+"54;'32+"54;7#"4;'#"54;2+7#"54;2+W>@n+-o8((3%=S+ 3222*+73&/2<222# * +3#2>/?+ 9&#1901%32+32+"54;'32+"54;7#"4;'#"54;2+7#"54;2+aio AD oio.0n((\@<++ -+(+7( +=/ֱ % ::% +@: + +20+44/*30>+4: !"($9-299099 999!"997%*29990132+"3267632#"=#"&54675.546325432#"'.#"60=IX]FDb?jZt;3'1iOV<R:>QW7@57ID1pH^I6GB+BY;g-75'&46325432#"'.#";2+"XB@Z=`Uo .aJU4H98JDP0D-A u(41"S 6K9(  b@.E"(+ ) 993/ + + + +%22*/0/ֱ+  +@ + +'' +@'# +' +@- +1+ 9*-9 90123265##"&=432325#"543!2+#"&546,.;6$:! /QV=> A34B%'*"'?X X9. + + ++$22)///ֱ+  +@ + +&& +@&" +& +@, +0+),9 90123265#+"&'5432325#"543!2+#"&546..;J""M"V=> A3>7X?X 3%@4?FGTD3::Z-<3I`+B3 =22+(3 #-222J/ ֱ2 +@ +2 +@  +2K+ I9901732+"54;#"54;2+7'&546327#"54;2+#"/32+.'J66J#  )V"v|*  2.DUD8X76L3&)h  $@Z(  ,b :cE;]6+ F=[+631;22 +3#22>/ֱ 2+/ 3?+=$9 9013#"54;#"54;7'&546327#"54;2+#"/32+"54;'_66_U%  +7/X+  1R-OC  %+E% +A3n&3(+3 '$2 +@ + + %22)/ֱ +@ + +@ +@ + +'' +@'# + ' +@ +'+*+01%#"=#"54;!32+"54;#"543!2+0&66-)wAn(}+3" $2" +@ ++%22)/#ֱ# +@ +# +@#' + 2+ +@ ++ 2*+01!2+03#"=#"54;!32+"54;#"54\"=i--w!"wOOIn&34$+3( 222$( +@$ +/++2 / +5/)ֱ2) +@! +22) +@)& +@)- ++  +@ + + 6+9901>323#"=#"54;54&#"32+"54;#"54;2#O+J>4i6>N"M6x. =1w.1`n0 ++3#%$2  +@ ( ++2 ( + 1/ֱ2 +3  +2+## +@. +#*+&2+  99 901%54#"32+"54;#"54;2+63203#"=#"543fH "m""m"%A=i)+#OIw)oD39++&3 !+222/6:/ ֱ +@ +  +@  + +-- +@-) + - +@ $ +;+ 49994901".'#"&5#"54;2+32>5#"54;2+2/83 0Yn#KYC$9"L" y =)xTNE^'/% N2! r)7C++2+  + *& +* 2,/ֱ2 +@ +@ + +@ +++  + +@ # ++ +@+( +-++99014&#"!2#!32+"54;46232+"54;]ACYtL#qo#fxHZ^DmOVuuV9+FD +z+ 2+$) +3 2,/ֱ''+!2 2  +@  +@ + +@ +-+'99$)9901272+32+"5473'#"&5464&#"3264R- JJ6fCo]}~gKLefKLfD%3?.*mZ{[]yJbbbcQC2+2+  + .* +.$23//ֱ$$/ +@$' +/$ +@/, +$+2 +@ +@ + +@ +4+$901232+32+"54;4&#"32+"54;5460K)YY#k[B%;!f#pC"1<,mOD^'0# 99Wt"03/+ +2+&" ++3&0/ֱ2 +@ +@ + +@ + +-- +@-) + - +@ $ +1+ 901"&5#"54;2+!2#!32>=#"54;2+'Xo#KuYC$9"e"pySNdE^'/% 99Wu"6B (+ + +@ + + & +&)/ֱ## /2 +@ +#+*+# 9999 9&9 99901#"&54632!"'"=423!24&#"326&kmlm7+((!Av8zZ[z{Z[y֎kl#t8(HZxyYZxy:3a+ 2 +@ ++ 2+ / ֱ2 +@ +@ +2  +@  +!+01#"/!"54;#"54;2+!!3 F__7&Q ; Ed)Q )1C$w +2+#  +#2%/ֱ +@ + +@ +$+$ +@ +$ +@$! +&+$99014&#"!2#!"54;46232+"54;]ACY~6#qo#fxHZ^DOVutW1 T?1< +2+*8  +*.3  +"3.2=/ֱ +@ + +@ +.+33+22%2 +@ +>+3*999.3 9014&#"32+"54;4>3232#"&##"'&5!46#32765fTOkK# /W7Z,'-0_5 %2/&wBaiM;.A5&sP69R)h$c T4$+*P5<3 .p+!+ 2 ) +3 2//ֱ,,'+ 22' +@ +' +@' +0+',9)!901"&54>;5#"54;2+32+'2>=#"Wp"1<-`"__pW$9"D^ZxW.I) Wu)'/% ZCE^;31 +$2++'02+  +32/%ֱ2% +@ +@. +% +@%" ++ +@ + +@ +3+9901>3232+"54;54&"32+"54;#"54;2+ "H)Rq#fZ[AA"b !yR%%C_^0?2X+2 + +/3 /ֱ +@ + +@ + 2++01)"54;#"54;2+!542;bbb* 5P37+!+%2,+(123+ 3228/&ֱ22& +@ +@/ +& +@&# ++55+ +@ + +@ +9+59!#9901%26=#"54;2+#".=#32+"54;#"54;2+3s4L$fYO64n#f[LF\Wo)Q8dXJ.&<  S ++  +!/ֱ+ "+ 999 99901#!"43!2#"&546324&#"326 s0kmlmgzZ[z{Z[y' (֎klZxyYZxy)132+2)+%.2 +2  + 3/#ֱ00# +@0, +#0 +@#' +0+2 +@ + +@ +@ +4+0 9901%2>=#"54;2+32+"54;5#"&=#"54;2+,,B -y##:aYn#KY&80BLxTE^k;#T"++ " + $/#ְ2 2# +# +2%+"9 9901%4.#"54;2654&+"54;2"5>)ASQ0Eg9(b(%+84)5O<+D/\5AH*2 +.221/ #//'3/$ְ 2$ +@! +$++ +@ +4+ '/1$9. 91 99#990132#!"5432;27>54&#"32+54632;&#"F6v54( 4>Dy^M]ox`fLMN'> ?#XU5YK'0' *@^xbN(&^}FGVEC#w+"2+  +2$/ֱ +@ + +@ +#+# +@ +# +@#! +%+#99014&#"32+"54;546232#'"4;]ADX$p#qoJ4xHZ^D11XsuV(!94!(t+'22+ +3%2)/ְ 2'2' +@ +@ +'(+( +@ +*+('9901)"54;#"54;>;2+"3232'4&+!%!:JK;6$%vRv>zYGwU>O(8-rQ@ZK4/|+ +3(222$+0/ֱ +@ + +@ ++** +@ +*%+"1+9$"901".5#"54;2+32765#"4;2"54&+ )6.#KW=S/L_("(G ,I-NAbY+N*|+',<1#Z]2++/+ +@ + +@ ++ +3/ֱ+%%   /  + - +@  +4+9 "$9/%9"99901%4&+"4;2654&#"#"=42632+"543!26g1\_1QT5*= (>OIj9&.ED2A%7;\(<+0@^0.XA(E_/3N8:3)u++ 2# +(3#*/ֱ +@ + +@ ++ +@& + +@! +++901%#"&5#"54;2+32>=#"54;2+%O6OnX%W;)>M"32#"'.54632'4'.+"4;2"=&'&#"D*H'! 4T,mG-'fbM).2:<6(8I1M*  &  ', G-RFgH<# (/*+$2?-Y*2C%n + 3$222+&/%ֱ% +@ +% +@%" ++ +@ + +@ +'+901463232+"54;4&#"32+"54;hpXVn#K[BCZL"xSxtWOHZ^D+J$0/.(/"1/ֱ++%+ 22+6E}+   + + + + #999 9 ........ ........@%+"$9.99(9901#"&#%&543237"&546324&#"326 !lGW$bab)mOPlmOMog/& /_'dabaPijOPjk?C6+ 2+'2!% +3!51 +5+27/6ֱ++6 +@+. +6+ +@63 ++&+& +@ +& +@&# ++   +@ + +@ +8+&9014>3232+"54;4.'32+"54;"32+"54;W.[>\s#V ?,#o#CV$o#x#A@'qZO-8'Z]D9@H4*4 + 32 +@ +$+12 $ +25/!ְ22 222-+- +@ +6+2!99-999  9+912-990132#!"'"=432;2767&#!"=4;2654&+!2>>g1* '=[' B%D9[8%0|X.2U>:&)]$$.f\/>8d6Ne NC+&+3*  222+ & +,/+ֱ  + +@ # ++ +@+( + + 2  +@  +@ + +@ +-+ 901463232+32+"54;4&#"32+"54;^pXVlPP#K[BCZL"xSxtW1(OHZ^D)13(n++ 3$222)/ֱ&& +@&" +& +@ +&+ +@ + +@ +*+&901%2>5#"54;2+#"&5#"54;2+,$9"L"pUYn#KY'/% NWuxTNE^ '4/+2 +2)+%.2 ) + 0/#ֱ# +@, +# +@#' ++2 +@ +@ + +@ +@ +1+ 9%90132675#"54;2+32+"54;5#"&=#"54;2+|XA;^"e.^>_Tp-pWK]W7*T{V&\@6*2C$u+#2+  +2%/$ֱ$ +@ +$ +@$! ++ +@ + +@ +&+901463232+"54;54&"32+"54;hpXUo#o#ZZ"xSxuV11HZ^DAR*4 +** +@*% +/ 1/n+5/ֱ33 +@# +23.++6+.3 $9*9 91+9901%2654&+"4;.=4632+"&543232654&"e=xXnnWzC8VonYNaFG`H`clruVX?5''G[\`K\GE]KD#5+2+) + 3 21 +6/ְ 2,22 +@ +@ + +@ +@ +$+7+$99)199012#"'!2#!32+"54;5"4;5464.#"32>K[tuWqBdo9\\| 56Gb*>2.D#DlQTiX(JK([p+? RA+? -.3%@2Z<,3: ++82 +&-2;/ֱ 2 +0 +32228'7228 +@8# +84+<+6a+ .)3)73'3)++ (3)+(3) #9'37()......()..@ 9989& 9$901%#"5&'#"=4325.547>;2+"4&'>.[>Y9X9PX4>8WX $="A>A>IL>W66":r0@AB237RI-2 62 FZc.v`n[ //+++012632+"#"&5463j0 ?|&  A-. 4- /C?S _/3 + +//ֱ +++9999901432#"54623254#""5)4[F  1:I8({3,WT ,078CL0/  +@  +/ִ ++ 901'763232# T  2L#T  2 Q1+.32*+% +#33222/ֱ  +/ ++/++2%%!+!/(+3+ 9909!.99*(9%,9099901"&5#"54;327#"54;327#"54;32+5#"'73#L#45#L"28"K#L54@ 6N  *S,S)8DD4B-+++ (+$ +  +/!2,/"ֱ)22" +@ +@ +" +@" +&2+-+9$*9( &9012#"=4&#"!2#!32+"5473#"54;6JC]L1;[d59_FbNRk1Ah7Wa+BF!, + */2%/-/ֱ((+"22 +@ +@ + +@ +.+(99 9%*9901232+32+"54;5#"&5464&#"3264R- JJ9dCo]}~gKLefKLf%3?.Z{[]yJbbbc!BC7(+ 3,"222+/ /28/-ֱ"32"- +@"% +"1+1/1" +@1* +"+2 +@ +@ + +@ +9+"9/,!49901232+32+"54;4&#"32+"54;#"4;>/%:"[[.qA5!</."K!<!) 3< $T*A,0<$ + + +@ +++%/ֱ2 +@ + + + +"2+&+  9 9 "9901232+5#"&5#"4;!2#!32754#LRaMB#*+ / 2/(%/#+/ֱ#%222# +@# +# +@ +2#+$2,+#99%(9#99012#"'32+"54;#"4;6.#"!326Caz}]nD88aJfHJe` cBAb}Y\zZ*KZF]\G(;532+32+'2>=#"Wp"1<-K#`_pW$9"D^ZxW.I) Wu)'/% [CE^5B=- +2*+' /$2 * +./%ֱ+2% +@ +)+)/) +@)" ++ +@ + +@ +/+9,9901232+"54;54&#"32+"54;#"4;6C&; #n"B20C)."KM!* /902A*MIB<+ /2/ֱ +@ + +@ ++01#!"54;#"54;!2jXVB==3+ 2+-+++3'2/ 24/ֱ 2  +@ + +/ +@ + ++&2-- +* +0+5+9 209-&9901%#"&5#32+"54;#"4;3327>?#"4;32+5%7#"4;32+"54;5.C #n"C1#:#L/I"2'p/9$*K5<- + 3$222*+' * +./%ֱ+2% +@ +)+)/) +@)" ++ +@ + +@ +/+9$,901232+"54;54&#"32+"54;#"4;6C&; #n"B20C)/.!JM!* /902*MGOa&2+0+$ +* +/n+ + +3/ ֱ--+'2$+4+-  $909*$ '-$9901%+5#"&5467'&54;'&5432+32'4&#"326OLEwblQC_BsC_}#glN[cmOPlP``X{ H = F_NlrHOjjBBR/!+%2,+((  /20/&ֱ-2& +@ +*+*/* +@*# ++ +@ + +@ +1+9(%.99,*901232+"54;4&#"32+"54;#"54;6M+? U+>.()..#LM!1(=-8 #T=MP<'f+&2++3 $2(/ְ2&2& +@& +& +@ +&'+)+'&901%#!"54;#"54;546;2+"324.+3BAA51?NQn(%7+PU>T(m|S1H!6)=,+'++ "+-/ֱ$$ +! +$+  +)2 + +@ +.+$'99  99'9)*999"9  990146;2+"32+5#"&5#"4;3275'&3 c7`ROM]B[/ 2 / +@ +/ֱ +@ +@ + +@ ++ 9 9012#!"54;#&=42;2w0D(&DFF$ I BQ;+832 +#33(2220/4*2M,D PUPF.4@2/."K(F+$ '/(:T*>(%,|+++3 2/ ֱ  + ++2 + ++ +99 9901%+5#"&5#"4;327#"4;32LSbM?F2JyA+2+ /ֱ +@ + +@ + 2+01$#!"54;'"54;XX((S BP<7+- +4+1(+$$ /28/"ֱ**&+&/*0+26260 +@6 +63+3/36 +@3 +6 ++9+3*-99 69- 9$/6$9(&901232+4&"32#!"543?#"&5#"54;327#"4;673#L#8@ nn4273#L#35"L6N D*31;N *S*;i e(r+2++$+ 3 2)/ְ%2 2 + +@ +@ + +@" +@ +*+$9012#"&#"32+32#!"54;#"54;5469fb$0@dYYZe -)?T?9GHRZB<07>+$3 <2+12+//%2?/ֱ44+/40+ 722%;22%0 +@% +@%( +0% +@0- +%8+!@+6Q+  . 7;77++ 7+7 #9 7;........@9 !$901.54325.547>;2+32+"54;"4&'>CzX9PX4>8WX $="nPdZA>A>IL>WWB0@AB237%J[I/0 62 F,<s ++ +@ ++/ֱ + + +2++  99 9901232+5#"&5#"4;32754#LRa=#"&546;#"'32+547'&< :?5 ^| ;>5 ^| 8,~  d6| 8,~  f4|<0? +2/ /ֱ +@ + +@ +2!+01232#!"&5463!4.+"&5463Z 4 I ('%    %&(  -Q+%3/./ֱ +@ +'+"/+'(9"%9(99013"&54676754&'.'#"&546;2#"/^5S #)I Q(,$ V$4# `'%   #>)   9*<8+/3/ֱ +@ + +@ ++01!"&5463!2+#"&5  Y     ] < &@+ 3!/'/ֱ+ +$ +(+!90174632#"&!2#"&5.'.'!"&546_   +JW   #'   PW %&%   @*+//ֱ + ++01"&5#"&5463@  Y 4   8+/3/ֱ +@ + +@ ++01#"&5463!2+"&5} $ ~     ] <*8+ 3$/3*+/ֱ +,+ #9012#"&5.'##"&54>7#"&5463}'-    (%&;  W #>) %&%( :  3/  )T+/3 %2*/ֱ + ++'' +@# +++#99013".5#"&546;32>5##".4?3#135 ^ ($'j$'( ^s  ~ !G2  &%(  (&% ǧ@0/ + +/ֱ + ++01"&=#"&5463@  Y    <8// ֱ+012#"&5.'#"&5463T13   ($'  !G2 '$(   <%. +/%&/ֱ + +'+012#!"&546;>=.'.'#"&5463T'- MS &%(  %& #>)NY   (&%%'   <i?+ / +@ +/ ֱ ++ 9901!"&54?>=!54632!  I  +  ~ u-+< 9+/3 /ֱ+!+901!.'72!4?#"&5463hi (%&'- E*K h&%( )#>))*K  <0d+3 "/3(21/ ֱ)2%+%/ +  +@  +2+ 9" *99012!"&546;.'#"&5#"&546;72326kR_  ($'eh    :}.H_  '$( h    uu8@0/ + +/ֱ + ++01"&5#"&5463@  Y l k  4+ // ֱ  +@ +  ++0132!"&546;4.'#"&546*IX (%'$ OQ  &%(   <.D+$/3 //ֱ +@ +(+0+(901754?#"&5463!2+".;76=.'a*K %+P 13h &$I (%&o)*K  0(O "GAhn&% I&%( <$+$ 22/33 22%/&+6+ . .  ?+ ... ........@017#"&546;3>7#"&546;#!"&5463B] I8 %""V ( AR )  I3*  TP  <8*J/$/3*+/ ֱ +@ + +,+ #9$9012#"&54.'#32+54?#"&5463}'-   ($'eh *K #>) %&( h  >)*K  <3V +(/!-/334/)ֱ!!) +@!% +!+ + +5+!,9012#!"&5463!2>=.'#32+54?#"&5463}'-  $%&(  ($'eh *K #>)  (&%&%( h!  =.&K  <8T/3 2 /ֱ +@ ++  +  + +!+ 90175#"&546;#"&5'5#"&546;Y  YZ   Vd "  F2"h+/3  2#/ֱ"" +@ +2"+2 2 + +$+" 9 "$90175#"&546;!"&5463!55#"&546;QY 5 Y   UT  R"  C18%G+ /&/ֱ +  +  +'+ 99 #9013".54?6=!"&5463!#"&54632 ] -a     "  7"7  <*+// ֱ  +  ++01!2#"&5.'.'!"&546P+JW   #' PW %&%   3:0+( )22'/*333221/ֱ(( +(# +2+6?+ )..) *?+ .  .. )*........@0132+3267#"&546;#!32+3#"&546\ 2Q?6 "2 `' <)^ 52   r0P  #3  r  *M+ 3$/3*+/"ֱ" +" + +,+ 9$ 9012#"&5.'.'#+"&546;>7#"&5463}13   $'|+ $0)Z  !G2 %'# ˂  !65  ZI+3/32/ֱ + ++ + ++01"&5#"&5463#"&5#"&5463  Y P  Y 4   4   ZQ+/32 +@ +/ֱ + ++ + ++01"&=#"&5463!"&5#"&5463  Y T  Y    4   ZO/32 + +2/ֱ + ++ + ++01"&=#"&5463#"&=#"&5463  Y P  Y       ;r\ /+/ִ++013"'^<4\$$;\ 0/ 3+2 /ִ+ + 99013"'73"'^<4^<4\$$$$X(70+//)/3"=+2" +" +'22/5n+8/%ִ=++ =+,29+6>r+  ++ #99............@%)999/999/079)9"95290132=42#"'#"''&76326=4232+ #"4; 'D  !  aAT7 S  x   O$X(70+!+&=++)/0! +) 0! +%+2/5n+/%+8/ ִ=+ +=+ + + +9+/079& 9!929901;2+"&54675&546;2+";2+"32+ #"4;;,JM8K()B0$3-6 -24]aAT$. ?-%77"7 )&3$$H03>*+:+3 /$U+4//?/ ֱ!! +@! +!-+77'+<222' +@ +@+! 9- 997$9'*/99: ($9394,-7<$901%2+#"&=7#"&54?632326=#"&4632'"3264& AnLOl + [ W?/ֱ + +)+/)5+/?+9)9+95 !$-9$9;397)/+$9$ 99901'67&54>75&546;2+";2+"632+"74#";2  =aJ8JDP0D-A yhe08JfPMX^GbP(?> D)"?2+E%D),L8EUA,,d81< /82/ /1,/&=/ֱ+ +55#+// ::// +>+95 9: 99#9 /,928 99991 99,#99901%#"&547&=76323265"&546;2+"3"2654&?3 ++ @b'66'77Q)/=++W;M M-6.05$'5. 'F/ +% +(/ֱ + +"2 +@ +)+901%"327632#"&54?&54632"'&G  #l E46& ~  ? (7%4  &G ] &He8'H<8G&I2dp'H=@G!++/ֱ +01"542@((33(b0&ae&f;(0P&afL(0&ahB=86'e!=86$E / + +/3%/ְ2"" +@" +&+9012>32#"&5467#"43!2+"D*H'! 4T,r:2X|1M* &  ', u?j!($3?-Y=8&d!4+ // ֱ  +@ +@  ++0132!"&54;4&+"&546*C^ E8$ W( Fm  &d#a96/ + + +/ֱ  +@ ++012326=42#"&546s.Kd(}[> VJWj a9&d2%X/+!'2! +@! +@!% ++/U+0/ ֱ  ++ 2"+''++1+999901%+"&=7632326=432354232654632X!^~] G0.Cu(. LD:BB:;M M-$)(%~Vtt(R X'hV'X 2+2+//U+/ +@/ +/3/!ֱ,#,!+(,2+22+4+(,%92/99999 "%+$901%32654&#"'432>32#"'"&=763232659ZI)*,"'c)_02CD9HZ^~] G0.C(+"(N.N(D>26?:BB:;M M-$)(%X'd)\4 $~+"2+$+$ +%/#ֱ2# + +# +@# + +&+ 99 9" 99901%"32654&2+>32#"'#"54;~'cZI)*,/_02CD9NT_6N.+"(^(D>26? \4&dP+8-Y /)/#/./ ֱ +   +  +  +/+) 9#99901;2+"&54>75&546;2+";2+"XBUo =aJ8JDP0D-A C(4K9( %31@+ ) 8&d-(0H&fD(80F&kdp 'Ndp&fdp'hVX(++/+01%!5X((((0'deHP'fPLbd0;':s/+0)29+/9 +=+ +$ +;/ִ=+ + +!2 +@ +<+909993901"327632#"&54?&54632#"'&732#!5!&'&54632   ?( 2''  @Ox 7$ (' (55 PO4]+ // ֱ ++ + + +9 99 99012+#"&=763232650lMPk W?32!"&5!4&=) A%FS  6!  "!_J* T3NeN&d(,3+/ֱ  ++ 99901"&54732654,v7~7vM!,+",ho8-+=l2NP&#Qe8 %h+ / + +/&/ֱ+2 +@# +'+9999901%"3264&2326=#"&4632#"&5467.Kc&77&'6}[> *VJ6J55'UWj dp28X'g]&BBG 4//,332 +@$ +/25//ִn+,+2n+2, +@ +/9,*2999*99!999"/992'901"3&32+#.'#"54>763267"&54632O$) () # . /-!! %&  08  ! 8 "W##"-8? / +/+  +01#"&54?632     >Lm I/=+!/ִV++V+ 2 99 $9 901654&#"''7.54632- H+<< && *  r)CE&&  *8BY* /3=+V+ + + +&+& +& ++/ִV+"+)V+)+ V+"9)99 9&)9012=4632#"'##"&=462326=462T       y "!    jJ/=+/ִ=+ + ++=+ + +990132654'&5432"&547632  $4&   $%   0W] @.8]HB@cLl CIlu0S HS MXsi^ * /++ /ִ++014632#"&e! L{ "a / =+/=+#/ִV++V+9 !$9 9 !9$901654&#"527.54632'+ . && < /A   0:$' J'$"  %"'& #w ./++ /ִ++ +012#"&546,=> =?A== ??F?l?F+ + ++/ֱ+6@Z+   +>n+ + #9 ..... ......@01#"''&6326=42J:K2& 1( J0#6*$9C$S 1*),2!nF+++ !33%+32++,/(ֱ+ -+6@Z+ !.!!+>n+ "!+"! #9"....!"......@(99990132=42#".'#"&''&6326=42\ /;*f  2& 1( #$!$*$$S| 'S 1*.'/$7)a ++!'  +!*/ ֱ + + + +++' 9!999017;2+"&54675&546;2+";2+"XBnsTp<=dG,,5MDP0DKM5E^D7S %Q3R="(:N\: B++/ ֱ++99 99901#"&5463264&,VzO\tzVBe_H@gg:,if~lg!VWjfD4 H +2/+6=y+ ........@01'!"43!2/ .:!  (\@;+ +3/ֱ  ++ 9  901%#"'&54632632?      \@ZX3yHX +//n+/ֱ+  + +99 99901"&54632#"'7."326Da]GH^'1)Mj@F28H\@COQEQW<2>;32B@q'df'dx(_8/ + +/ֱ  +@ ++9012326=42#"&546..<(V=> 7 A3?X v`qP V(0M+   +  +@  +/ֱ +@ + ++ 9901)57632!54320 ;P PeH - +/*U+/./ֱ''+#'+-+2/+#' 99*9- 99  &999 #$901%"3264&#"&4632#"&=76323265}&77&'6nLOl W? .Kd(Z ),+0 VJa9'e%80'M%a9&e:&%ea9&f%a9&h%a9'l~%bXn'e'dxj'8X'k'8X'hnV'k'fX'g)X'hnV)\4'hPV+8&-h(0 # + +@ +  +/ $/ֱ +@ +++2 %+99 9999901%"3264&!57632!5#"&4632G &77&'6*;P P76J55'(b0'e(b0'd&e(D'h(8D'k(D'leHZ'dFVbeH'hZVb(0FG+32 +@ ++/ ֱ  +@  + + 990132#0!57632!&'67632& &G w;n n]^d (0"_ + +  +#/ְ 2 +! ++ $+99  990173!2#!5!2654&#!"&54767632/o2ME)& #J( /)^d (0F 0+ 2 +@ +#+-# +1/ֱ +@ ++*2+99 -$9*!(999- 99#*099901"2654&32#!57632!&'67632#"&' & &Gu C'+) ^;n n]nT 0.+%d0'd7d0'h7d80;&k7(0F&I(0F&I0|'f`x(f0F&g(80F&p N'h`PPO&8HPO'dn8PO&hx8P84 <'+8U+<+# /3+2 ++=/*ֱ5,5*+15 ++++++/+;+$$; +$ +>+ 5.91 999'8$999 99 $9#8+.9901"&462'"&4623"&4622+#"&=76323265 )))*X )))* )))*/nLOl W?9J& "/ R "!=8&dy'HX7.+   +/ +++01!#"&#"#"&54632;X) + 9*2 8XI'H>X'fe8 ,7+3/m+/ -/8/*ֱ+00++529+*(990 $9-3$9"'(999%*99939-9901"2654&'26=#"&4632#"&54632&5467"3264& +:&77&'6}[>  +nX ),+Q6J55'UWj +*e8 +r+'/ + +/ !/,/ֱ$$ +)2  +@  +-+ $ $9' 9!99012327#"4;6=#"&4632#"&546"3264&w.Y1e} &77&'6}[> 9(!6J55'UWj *e8'H<e8'C <e8'c<e8'N<e8x'ft<e8'hV<dp)t//)$/*/ֱ ++''+++ 999'$9)99$ 99901%#"&=76323265"&546;2+"3څIGa R17k'66'77Q)GqFJ;M M-25\35$'5.p+1~/ /1,/&2/ֱ +@ +#+// +3+ 9#999 /,9  9199, #$901%#"&=7'&76?6323265"&546;2+"3IGa ]   R17k'66'77Q)GqFJ;2H M-25\35$'5.dp&He8n'dj<(80'p8X'k(0%A+3/ n+ + +/+99 901%0!5>7>32#"'&#"0[.z((('"(0&HjE6+ +@ + + +/ + ++01%2+"#"546;2>~5:6:E! 1+/ ֱ  ++ 9901%#"&54732654,4./311b9'A)1*)5A.-54'N#a94'N%#wS?FTFUnFVF%+  +#+#+ +&/ֱ  +  +'+6?`+ ""+#"+"...."#......@ $999 #90146;2+";2+"'#'&63&aJ8JDP0DU0P! 1( 21@+ )# 1\:'L+3#2+(/ֱ%+)+% 999# !$901#.'#".54632>73254&,Vz / &(& . zVBe%'&7$Lg:,i$EE* )EF'g!VBp:X7'c++ % +3(/ ֱ + +@ + / )+ 9 90146;2+";2#"&546767"&cH6LEO0S('/ "1Gk2I4!1(<,IA%EX#%$?\@Z\@[yH\bX'e(bX'e*8&e<.Pn'J.'JD70$'Je'J9N02 'Nfl(V/n+/ֱ  +n++n++ 9 99$901#"&5472654./7sRSt ^]%8:2#K8CQ]\R+9,%BHHB*63'SWjl'7 /5n+"/8/ ִ2n+2 n+/n+2+n++V+(+n+9+9 "05$9.9(,999"5 .$901"&54>7&54&"&''657324.'326^**pr)4X&2#$ (0l"$"0F@[DCZ.1@! 9,P[[P-E%="G ?D a[1*'.(*++FBEF]H"3+n+/1n+4/ְ2.n+2. +V+#+n+5+.9  +1$9(9# &991($901#"&5467654&"&54624.'326yVWxJ;f9P8!MnM*+$#-0 851cHGdTa`U=^~(89''(6NN6 % (9#$>+(:4 '5'ELL5B#'3 +(3!n+%2#+/n+/.n+4/ִn+++n++1+n+5+99 !999+91#%$999 .99901#"&547&#".#52.54632632'"32654&#VKEP( )/DX>f- <Ǘ05)Y@5*)3EU>@^USC:AEJHG!-9$G192105) 47EHS( /4J&Al!.:+/8n+2/ n+/"n+)/n+;/ִ,n+,+5n+5%+/+n+<+,")$9%5$99/ 28$92899 99 9"99 9),990127"&54>7#"&'5>26=4&#"4&#"3260QUFaec* %5HJ3":6&.,,cP76ON78OGRH[ ?bEFdcG!Ei I5,3K-7!&5A/0@7OP67ON@d,"+ 3n+2/+n+-/ִ%n+%+n++n+.+%999 9 $9+9"$901'654.#"#"&546326324&#"32()G+ +F6FOHM?+#7>A>46<@1r8S-IV<1*)/3O8bFOi..m:6ML71Cge> +n+/ִ n+ +n++ $901&'654&#"&54632G ?f;=d$ G{JKzQ\ QF:ZX<%S WVIoncH'`/$n+/n+(/ִ!n+!'+ 2n+2)+'! $9$999901%4&'#532654&'7#"&5473265W00?1G" 4*;#vSTuPC`EDb(=N$G1, 8(.QZNRbbRTA5ECMMC5#@-+.n++338n+;?22:+=+A/3ִn++n+ + n+ +n+B+3-.99+08999:9 $;<$9 =9(?$9'9.-$+99 3$901'654#"#54'.#"#54&#".#"'67.54>3262632#G@>##?$ >c@VGZ(z&;U9A*+`,b+m^[\{#RIWJ{H  5,>, # /J14&&&&fl'!+n+/&n+/n+(/ִn++#n+# +2n+)+9#9 $9!& 9999901#"&463254&".546324&"32hGHggH[0__!tRSs$RrRQ:9OdhhGALMA,&Pb`QrSR9:Qcl+n#+ n+/)n+/n++n+,/ִ&n+2& +n+-+ & $9#) 99901#"&#">32#"&5463232674&#"3261WK0EK(IggIHfZ>K%0QR:7TR9;QOE0 %ffgH:>[ 9RT7:QQ:e#`+3n+!2$/ִn+ + n+ +n+%+ 999 9!99901'654&#"#5&#"&54632632E>.60 #$56.>ECEA((CECUaXJ;P!*0R^\S3<1*CHIC8M$-%&# E=3ID0HN]H1+/n+(//n+#/ n+2/ְ+2n+,2+%n+% +n+3+($9% #99(99#/%+,$9 99!9014.'>73267#"&5473265#"&'7326B' 2+2J-xUWxN AcHFc:IM7:E$0-(80# ')Sb`UTA 9AFKLE& 7NM</:85d2+ 3-n+023/ִn++n+$+&n+&+n+4+*+-$9 )/999$ 099&9199-+901'>54&#"#5&#"&54>765363262$"050 #"7d>E6VWY#$^I\5A(&D0S4!&>9R=:`cSMq@+,(WKuF88fjlp/ n+/n+ /ִn++ +@ ++n+!+ 99999 9901"&5332654.5463"qq$\BC[ 4(7! P^^PAIIA /!&#$%  75D#i (>+n+$+ =+/;0/(V+?/ ִ6n+62+2&V+2&"+2-n+2-)+n+@+&24999"/0:;$9-+9990; )6$9$(+-24$9 999901%".54>7&5462&4&"24&"24'"&5472>#6dd6&K5!:P:"%4%%4%$4&&4{ :P9{.WvW.>m_88_m>8\X?-'99'.5a4$$4&w4%%4%;(99(;7_U22U_5H#>+37n+;2(+*+9+/ n+$/1n+$1 +@$ +?/'ִ.n+.+ n+ 4+!n+!+n++n+@+.)*99 $199!49 7$999 ;999$ 991"'.5$901"&5472654&#"#54&#"#"&5473267>32632#nqPB]Z+-#3&(8E'!-!0"2-AV]^UX>:AEJIFb+) &5>)50 %+&!.''@-4H$8C+;3n+2$//n+/An+5A+n+D/ִ>n+>'+,V+,9+ n+ 2+2!n+2E+,')<999*;A$9  $/99925$9/!')999A9 9>$901%26=4&#"#"&54632632#"&547326=4'52'4&"326D7%/RIKVVHE*);4KB+kZUs # ]IHZSArB@;:@0-M&6*+8GliJIh//L4ML!A:X_ZS"( !GHIG%Z$y:SS:=RSbL&|/n+/n+"/$n+'/ִ n+ +n++2n+(+ 9 99 $$9$901"&547265#"&546;&'>tuMAb`+>@+8V?GT]^TR@7@DJIDv,):,@5-  ,5B#6+ 3.n+32"/(7/*ִn++n++n+8+*$&99"(.$909 3$99("&999099901'>54&#"#4654&#"&#"&'63&=4632>32#+,09('9$;&(9QC[+ p 78\N7K'=#7N!;Y./UJ'89&X&98'EHxqS J}E6MA#M6hH'z&++/n+/"n+(/ִ n+ +n++%2n+)+$999&"99901"&5473265#"&547326=3lpO! [GHVU'@cMN10g$U\\UQB5%FGFG"1R@>M/1=X/Y@l*5/4n+./n+//3#n+(26/ ִn++1n+1+n+++ 2n+7+991#3$9%9+(.4$9.4 99999 %99901"&46324&#"#54&#".54632>324&#"26opoQk0.!0 #<+)<-P9K(7 /E%XCBZZYO\\\C!/@59I*;<)*-1$8Q>!EWAFG@AFGjf*+n+ +@ +/(n+"/ n++/ִn+%22+  +n+,+ $9 99(9" 901"#4632#"'632'654&'4&#"326,EY$^C5LgA-)=aTn$!!\7%5H++2Q^3DvK5?ORuTIMKCA]%7`6:5G#6{1/ /n+7/4ִn+ +!n+! +2.n+)28+  16$9!99 ',$9 .4999,90132654&+5232654&'.53#"&547# mlKS;$ 19$#" # '5,"N\3?7N)ocI8+ +.--,-+-...+,-.......@#99%9(999 %$901'>54&#"#4654&#"! &54632>32#Q1"5#4 5=F1B"91FjrI)$"1. / , /*&V 1F: F@LH HTB+3+ /n+/n+/Sn+N/%n+./9n+U/ ִn+" +Qn+5+6n+6+'2n+?2+n+E BV+B/EV+V+Q39529609@  %.+>$-c $,<jlG/n+%/*V+5/6n+?/GH/ִn+"+-922 n+22I+"@  (5B$9% 999* 995-9969?999012#".54732654&#"#532654&'&#"#53254&#"#"&'73>/))77#;A#1S>A13@^6@ & j)$ . gH 2 9:$7#2 5= &C&8A2>4%+ /9&8$)'$6+D.r*Zf"+=+C/=+J/b/T=+g/HְQ2=+[2H +@HM +_+W=+W +@=+@ +(2;=+72; +@ +h+HG9_T9WC99 #+/4>$9@99J>@999;HQ[$9"99b+7W_$9T-4990132654#"#"546;2654&#"#"546;27>54.'&543232#"&'&'#"&54>7>32>54&#"'4?0;R= % K0* &  ''/ !$4+,$%eGNo  !w4 .HTM09Ag<(F:m '( !5#34!4"OFY!]  r. =4&#" z< s&.U;54&+5326=#"'7327F:8G4W`4.<9+.TN/Z@F%NpTVdhg]`h@kb;8T-  &H1@\ lNuHm8%+*n+(+'V+0+n+/ n+/n+(%+* 9/ִ n+ "+-n+-+23n+2:+"  99- 9 %'06$9 9996939(0"-9901#"&54726=4&+46;7>54&#"&54632&#"32jMLkJ=VzVJ4& -;A)1@C.%50.*#7W,$4!KZYKL=1xDE<&4J =-(A?1.C!/#*U7)FUWk,5++3n+2/4//3 n+2%/n+6/ִ2n+2+(n+2-+ 22n+22- +@ +27+-(399/49%+901##"&546;5+"&546;23#3'54&+";5#"26_bDE`bD0_4HH384H___4$8#44$_06MLlLDbaEDbXH43II3X$X|X$45#%3ނLlKK]8Xe HTFc{0+3'+M35H37?3 9$+323+/82-+ 3$- +:/'ֱ +!!-+  - +@ 6 +- +@-1 + + + +;+ $*999 -9!'$9*9017"3264&7#"5432654&#"#"&5467>75#"54;2++>=,*>>Yw^MmlN;`/LCY\ M@)x ++$+ +*/ ֱ''!+2+++!' 9999 !'9999012+#"&5463232654&#"542654&#"$3- Kt`fpscdoJS[\RQ\Y3$'7s} monlq\pT+ 2+/+/ ֱ +@ + +@  + " +"++01%32#!"54;4327#5@ ;)ohhH@C+ +0+++:!% + +3!2D/ֱ2(+=(= +@(# ++ +@ +7 -33E+(997= +&$9930599! 999:%(-59990132+#"'#"=43232654&'!"54;&546325432#"'.#"g*1tZj?bDF]30dTiOV<R:>Q0 A+$GI^Hp1DI7,/#WBY;g-54#"!6-Y3U{yWjghR:+424:!<F"B2 29gly|W[B%AfED;J36+2#+(24# +,# +,=+,V+7/ֱ)2 +@ +&2 +@ +!2 +22 +2 +2 +/8+ 92,94 /$901%2#"&54654&#"32#!"54;#"543!2+632326 /<2;#(?%2,7B"  .7Dx)N+&2&3,P+  +  ++#3(222-/ְ2 +@ +.+ 901"&543232>7#"54;2+#"54;2+&6  $-n*.p:SF1 .7"Q 'gg O3$TG3-+3(D3"*++ 2+*!& +!  +3 2+/ֱ$$+ 22 +@ +@ + +@ +,+$!'999&$'$9* #(9990137463235#"54;2+3###"&264&"yP83K.HKˠT,L48'8N99N%pPA1/2CN88N8h@-"+&2+   +  +" +-)" +3-./ְ$2'+2' +@ +@ +' +@'+ + +/+  99 - 99012+>54&#"#"5463232#!"54;#"543V=Q^FR?]kYvbon<n_KISH7(*[[a=3+3+3#2*+1,* +4/ֱ  &+,2+  +-25+& 9)199 *0999# &$91,'901#"&54623>=!#"&54623>5462!54&"=5()7  !!3()7  !ts=\]j%;8& "%%;8& "$UttIC]]Ch3%y+ 2+ 2% +% +@%! +% +@ +&/ ֱ2 +@ +2 +@  +2#+2'+01%32#!"54;#"543!2+35432#"=#7?)-->3%4$@6?/++3 2 / + ++</ +$2@/4ֱ+>>9++'' +@'" +' +@ +A+ /$99>- $9+99  -7$9<9>$90172327.54323265#"54;2+#"'#".546654&"y 03'-!)ac)!-'5J .#1881*539> J+#H9669HCu8:@LL&"%WVwOnVUoOD3 + 333+333 $2!/"+6p+ .   >+ .   N%+ . ?d+ .. ...@   .............@013#"54;2+3#"54;2+# z<m58mDj98n>Cmp $ B3'5 +0+ + +&+  +&;+6/#ֱ..+(+ + 7+. &+0$99($9+0#99&999901.54632"54&#"#"&546324&#"32> 6 ?(1E(.  $%&AE(ZoccXS[R?\`@+A":96&*$Q:(9'(1L-C_/^_Iv6MHT&0H3)~!+%2+! + + +*/&ֱ& +@ +& +@&# + ++++9999012#"&=4323254&#"32+"54;46SPmOQ1N?tU;>W6m3_FK\9:,0!%~3I<+z;U@@:+8'+"+1" + +@ + +@ +;/ֱ55 +2+. $3*<+ 5"199899*',99891$,9901%4&+#"=43232#"&=4>325432#"5.#"326=):U'@G%f "2Z9dJhCSvXHb$=--P14Q-eS7J<+Ep.DYGZS O3, +$333)222+33,222-/ֱ +@ + +@ +@ +*+* +@ +@" +* +@*' +.+6Z+ .=J+ ..,.,.......@01!##32+"54;#"54;32+32+"54;#D."m"cd"m" 2&C5+ 22+''2 +', + #2 + 2 + +@ + +@ +6/.ֱ**+2 +#2 +@ + +@  +7+ '299#!9901%32#!"54;5.##"=432254&#"#"=>32_!-$#/"V326541# #</>5->N1 D^-O?" &-& ("2'%4fLXDc&:G<<+0B!-9C8ZU@%1+&+#2 +,, 3  +2/ֱ//)+ 2$+ 2$!+3+23+)/ 999&!99 )/999,9901%#"&546235#"54;2+32+"54;52654&#"s`fpspJWZSZ[RQ\Ys~~ސonlq3%33+-3 (2222+!3&222 +4/ ֱ2 +@ +2  +@ +@  +3+2((3 +@($ +@(+ +3( +@3 +025+01!32+"54;#"54;2+!5#"54;2+32+"54;6-x66x.6J 3-y+(+ 2 +./ ֱ +@ +  +@  +++/+ (999("$+$99 901"#"547675#"543!2+#".546232654&*#839>\t~c/Z7"  NlRhg\\}]`|$!  HeORg*.30Z%+n++3  222+% +1/)ֱ) +. +2++)999 901732>7#"54;2+#"54;2+#".54;2#PD #)n*.p8U#"+nï5*I'ei j^3%@R93*+++!3&2 + 3+/ְ2( 2( +@($ +( +@ +(+ +@ + +@ +,+(9901%275#"54;2+#"&5#"54;543232+:IIKZaGTJJ>"4C8 ww&.?2@*D<*+ 22!+ +& +++/$ֱ(,+6?+ + .   ...... ........@99017267>3232+"54;.#"#"&5432h(E0&C Pn$F/0(A),4'b(>51S,:8.+;2"J3$g3=J3A+ 2+2- +" +'2A= +A72B/ְ2(72( +@(% +:2( +@ +?2(+.2   +@ + +@ +C+(9014>3232#!"54;5#".5#"54;2+;54&#"32+"543V2L-No_ .)%,-%="V<!>'-1CkJQ 3 $0:R1%R@ 5 ++(  +(( +" +0  +n+6/ֱ  +44+++ +% +.+7+  994299+0990 +$90172654&#""&5463263232632#"&54654#"S[\RQ\YTfpscKe2,<" $(&@@onlq)}^Q)F+& ,9Q *$H3!k+2+ +2+ 2++2"/ְ22++22#+01%35432!54323##"=!#"&=#A8  )Irr IIrr I>=6+ 3"-2" +" +@"( ++27/ֱ&+**/+ / +/ +8+&"$9*$99/ 92" $901"&54632#"'#"&54632327&54323254&#"f:Kj"UBO7MNL %%2@: (:R:#5A{UR9 k6w )D&]dM2Uv^j5#@/8+5&+*3 2& + +& +9/ֱ+227++-- + +:+&9972( $9 *99527$9 (-0$901"5432654#"#"5467&#"#"=4>32632'2654(&v'-!)ac)!-'4 0"1881]EB9>+2H9669H+@",LL[MCCwOnVUoO O@.:+ 3$+3) 32) + ++99+;/!ֱ66+,, + +<+6+ .>; + .   .... ........@6$)1999 99!/6$9'19901"54>54#"#"#"54326;23&54632632'654#"32'p9}</  o\Q"'/+!>"+? :9)%G!(%3, GQ >=B=+83 !2 = + +1+&= + +@ +C/@ֱ++#+4D+ .=$9 )+:$99!&18$9 :999#499&+.990123267&54632#"54&#"3254&#"#"&54632#"'#"&546y %%2@ 6"%3/61R:#5f:Kj"UBO7MNL )D&]d!'/ֱ4 (( +@(. +49+"22 29 +9 +?+9( 16$96 4999139+99%"99901%"54632#"&54675&54632542"5.#";2+"32654.2 *:<Zt=1XgQV<((R;?OUC0>E[]EAQ/- )]^I8^QAN;g-<7010VnI (03 )+& +3 222" +*/ֱ#2# +@# +# +@ +#)+2) +@ +) +@) +++)#901#"&5#"54;2+!5#"54;2#!3265sTUr"J32#"&'##"&5463234&=#"54;2#32654&"!"1LT ;'AJ("<1GlpW67 14 $68"!3+T "#"#(jOugIAO74([wJu7:3>H>7MA/ /(+26' ;:T3"+ 2+!" +32" +@ +" +@" +#/ ְ22 +@ +  +@ +@  ++2$+!"901%32+"54;5!5335432#"='5#6KTOx/+}(*+2\350+4*2+2 0 +'0 +6/5ְ 2*2*5 +@* +@*- +25* +@5 +@52 +27+ "999' %)$9$901%#"&54623275#"543!2+632#".#"32#!"54;$ %R )/?&,L   ,P &'&R $L D >H:++-+A- +-% +4: +I/=ֱ+DD?++77++"J+D29? 4:$909/979+%'-$97=99429-@ 0?DG$9A901%4&#"326'>7.4632>32#"&4>54#"632#"&544#"36,8%$98%)4[ '"(1+$ -) $C.UQ20Sp!76D64S2%%B(#%  -'* )LE?AE;>Bw&23;+/3 *4222+ 2 +\+ ..   '.. &'........@0+(99)9999)1$9 +99016323#"54;2+#'##"54;2+3754632V A9of}9429}fo8@ *    M @@++$1+=+339+.+ = + A/ֱ!2.+>+33> +@36 +>3 +@>; +3'+' +@ +B+6+ +)  ++*+)+ #9*+)9 )*+...... )*+......@.99> $1$9'39$99901"32+#"'#"=43232654.5463232+"54;4&>Q0 A41tZj?bDF]4M[M4iO9@4B1# $GI^Hp1DI7*4?2BY52;3&z +!+2 +@ +  +'/ֱ+ +@ +$+$ +$ +(+$ 9!901%"5432#"&5##"=!2+32654&;T B.UE8`1>8:<M6+3!_fRTGA&'7H3$n++ 2+ 2%/ֱ##+2   +@  +2 +@ +2&+#9 #99901#"54;2+32+"54;#"=432rZYYZ f7Z3&| ++!2+2 +@ +'/ ְ22+2!! +@!$ +2! +@ +(+  999901!"54;#"=4325!#"=!2+32#*Z66f7b O39\@6)/@*3+0 +3) 2) +@)% + +4/ֱ--2+'+##+5+2-99' )99# 99990-2$9) +$901#"54>32632#"&54>54&#"#"54#"2654!)ac>a,C)O,>Q% $$47:&F9>95Dx33J,.L  #3,4`twOnVUoO2&@ ,4>'+382+4?/)ֱ55:+$ .$+2 +@+:5&'!9992. $999948@   $)/<$901%4&#"26&5462"&5467'"&54676264&"264&#"#""$"88D879B9 ~} 9B9#"$""$"$""#r!78@88%I0HH0F(sA#1QQ1$AZZA$1QQ1$C>//>/\ 88@87?@ g + 2 +  ++ + +!/ֱ +@ +++"+901!5432!"54;4632#"54&#"=`EU.B 8:>1|Rf_-(*5G?3/?@&<3#.7+4+!2.  +/33.22 /(8/ֱ++ +$21217+2"27 +@ +27 +@7 +9+ +9(.9012+ =#"&5463235#"54;2+!54&#"3#3265!K)+<8'%5JK$*.>=/JhhF2.CB/OO**!.)hLTTL4$@6?+<++/3 2+ + +$ + +$2@/%ֱ% +@ +% +@%" ++99>++4A++99>9- $9 /$9 <9>$9$ -7$901"&54654&#"#"5467&#"32+"54;4>32632'2654 03'-!)ac)!-'5J .#1881*539>M J+#H9669HCu8:@LL&"%WVwOnVUoO+332&@/y%+% +! +-+ %- + 20/+ֱ+ 2"2" +@" +" +@ +1+%-99+990132+"54;4&#"326542#".5!2TP>0L0#  ->0Ea(|T9I6%Lp_Oi2(<@a5 N>Ne &>pI(m&23T++3 222 +@ +/ֱ+   +@ ++ 901#"=32+3#"54;2+#( h F b(03=+33 .8222+2+ ++ ++" +>/ ֱ2 +@ +@ +  +@ +29+..9 +@.1 +9. +@96 +.(+( +(% +?+(.9+ :9901732+"54;#"54;2+7632#"&54654&#"32+"54;766Kg:"$*-6J;b4"> ,B - +<3.(0D$i+#+2 +%/ ֱ  +2 +@ + +@ +&+  99# 9901#"&546325#"54;2#4&#"32*]@^~}]rBf`fLJgfKL=M5y][{ZqbbJIc L@:+1+++ +@+( +$2;/ֱ.<+6>*+ 45  z+ (.*="+  +#+ +*)*(+ #9 #9)*(9 )45....... ()45........@+1@   #&7$901%632''#"&5463277#"/#'#'&#"326?3730 &0(( IHfpscJI ((0&   qQ\YT9=   <<<31@*}";02<<<2000f4lq&f/00#W@J1+A+<+,/##, +#& +1< +2F1<+K/6ֱ+   +@  + +@ +> H3CL+1<999>/9 AF991/9F699>901"32675#"54;2+32632#"&'#".54>325432#"'.#8# (>'%/-k(!. >.: I=C]1+;4cC`$5+9!:(1 3A C6 -UdAHn?' 6[&69C1<F+.32 + ++'3C72G/ֱ+EE@+%+::4+*H+ $9@E0$9.994:'"99C@ %*024:=$901".54632327.54323267.5432#"'654&#">54&"*53 03&*'ac+"*#*X.MT5-.fA425= 7">&"%W J+#C8779C}`o=U]XGG12>K>24$T4t$nVUo]3%@ *K++ +/ ֱ+,+ #$9  $9012#"&46.'3267654&#",jgh/E(&@-zV4\/yW6]/F( &A@yK)11(02i>\.4l?6*10)3%C/:+)+ + +6+;/ֱ994+!! +-+<+49&99 !)99-96)!-0$901"#"54>32#"&5463232>54&>54#"!!"-BuBhR:+4!6-Y36b824:!< #3A #FK6Qr|W[BB"B2 29hEjV%AfED;H@ #d+!! +! ++$/ֱ++%+!99 99! 999014&#"6&54632#"54323264 $30' 0L08KgQV%ZED_]#8# U|32"&=4632#"=&#""32654zc8axyyS2S7KIBbcONd"(\Y[_^\f)VC1~UFGFFJ>=L+ 3"C2" +" ++HM/ֱ&+@@E+ N+&"-1$9@$2K$9E 3:H$9H" 8$901"&54632#"'#"&54632327&='#"54?3737632#'3254&#" f:Kj"UBO7MNJ %%2@:    #(:R:$4 @{UR9 k5w )D&]dM3M + 3000+ %+ w`j>\#:+&7+ n+/+ +/;/ְ2$2 +@! +4+ 4 +@4- + (+<+4 &+$9&99+!$$9/97 901724>32#"'#"=.5462654&#"542>54&#"S  "G3ZI)F=~gE4 5p4dj]*.<1CM  s/2T9'B JA]^*2  IMDFJ (-81A<350+/3+$$ +$ ++ 2 +3*6/ֱ"" + +@ +  +@ +'+7+6f+ 0.1=+ /...1....../01.......@ *9'$99*$9901727>75#"54;2+#"&543232654&#"#'4&54R 8 2"ZZV[0>)H6PL&1 L4$G%,2\\|^?*6%_USf"+%{2&j5$+3( 222+-- +2 ++6/)ֱ2) +@! +) +@)& ++32 02  +@ + +@ +7+-99(901">3232+"54;54&#"32+"54;4632"54&5&F.FY--D7*7) -.hNFe(IAb.&O=-9!0 BZI3 1;@E,+7+ #,7 +(2F/1ֱ+** +@*& +* +@! +G+ ,7A$9*B999*9 #1@AC$97=B$9012#'#.#"3275#"54;2+#".54>32776( : -01=- #/L0FIZaNn9'8J7)'+ /  >00+$ 4`?<(3"4/VeAJp<%  2))Qk`.ggl5{Gwn: ! /ֱ2+ +01##3#3+}))x''g{v@++/ ֱ++++  901#54.'#3'"&54632+-U_>))Qk`.$ggl5{GwnM+ +@ +22/ֱ2+  ++901#54.'32#4+#3+-U_>1!,)$1))Qk`.ggl56%R1!{Gwn  /ֱ22 +01#3'))M{R : /+/ֱ22+ ++ 9901#3'7"&5462))oM{R  /ֱ2 +901'#3'))d}{@y/ֱ 2+901'#37'7__))______DFFT{EE8EE_EE  /ֱ 2+901'#37'F_))____79FT{EE8EE_  /ֱ2 +901#3))t{Ao/ֱ 2222+01'#'55'553'Aoo)oooo)ooU@@s@@q  /ֱ 22 +01%'#3'qo))ooo{@rq  / ֱ22  +017575573#ooo))@r@ |/ֱ 2222+017#5755737Aoo)oooo)or@ck@s@@/ֱ 22 2+01#5755737A)oooo)ok@s@@  /ֱ +901#3#7')),g{Axt@/ִ ++01'7ZA@/ֱ2 +01#'#2){/ֱ2 +01#373))2g{ >/+ 22 +@ +/ ֱ  2 +++01"&5462#373Kd))2{=/ְ22++/++ 9901#&5475373)++)2g/65 (D 3 # # 3+**+F?dkD$).5i"+ /,6/ֱ''1+7+1'@ # )*-5$9, 99"$%(./4$9999013##"'#.54673632&"'727'654&'+0431**/55/+ & COO. & CP-$-='(=EN='&<H&0*zOU0*=) N /ֱ2 +901#357'))뵵g{A $ /ֱ2+ 2 +01#5'#33))))g{E (/ֱ 22+ 22+01#5'#33')))))g{.t/ְ22+017'#57'53Aoiio)oiio)@|}@|@}|@k4/ִ + + +/32+01#&5473A)++)g65j'(  /ְ 22 +01'#'53Aoo)oo)U@@/ֱ2 +01%'#3o))o{CG/ ְ2 2  ++/++ 99 9901'##&547'5673AMh)+Ke)'[@|q6Y@x~A/ֱ+01#3A))g{k4/ִ + + +/32+01#&5473A)++)g65j'(hr '7'55A@@A1' /ֱ 22 22+01#5537A))ذg g  /ְ 22 +017#57Aoo)oob@ck@b/ְ2 +017573#o))@~}  /ֱ +9901#'53@))ŷ@;@ //ֱ + 9901'#37'7))b{?-,  /ְ22 +01#35373A)2)2cp 757p3'@A#+/ֱ+ +01#3))g-bA/ֱ+013A))k 6/ִ++ +/ + 901#"&5473k$#+),,5{'~ /ֱ +90137'5)Kf@@~  /ֱ +9901#573A));@@/ֱ+901573^)g;@7/ְ 22 +@ + +@ ++901#.467573q)))b'4<(0(q@  /ֱ 2+ 9901'#37))+{q  /ֱ 22 +017#3qooo))@r@{  n++/+!/ֱ 2 +2+ 2"+ 99 9 99  9999901'#37"&5462"&5462))+R{h  /ֱ 22 +013 ##3+*))F?x{i , /ֱ+ +9901#373#'))))g{;i 6/ֱ 2+2+9 99901#373#'57'))))g{ͷ@.L _/3  2 +@ +  +@ +22/ֱ+ 2 2++ 901#.5353>53A)ak)XK)IY)m^gepZ Vm k //ִ++ + + 9014632#.$#+),,5'/ֱ+901#3' ))g{@7/ ְ2 2 +@ + +@  ++ 9013'#&546)))b@(0(=4'W'77Ӟ>L 3#'#7'7'376Ž56Ž5>D -/ֱ   ++  $9013# #B.**)kd{BzO  #'#7'7756ŽӞ>D # /3/ ֱ + 9901737'#'))?<-,/ְ2 2+013373#'##2)22)2 D //ֱ+ 9901#'5737A))ě?(T+DleJ01[2LcnAݨUT KJ&/uHIzN|w:YXXrqi ?/ֱ 22 +22 + 99 $901%#373#%7'/75'G))))4p.{@͗@L XA/ֱ+013A))4~ / ֱ+ $901'7#'557A)@@@@ /ְ2 +9013o))gML+32+ /32/ ְ22 +@ +  +@ ++ 22 +@ + +@ ++ 99901%3##5#53#53533#RR)TTXX)TT))gg))``)Ln . /++ /ִ++ +015462"&&8&&8& '' ))n#89 2 +3/+ / ִ+ +  990137'#75""""!!"~  /ְ2 +9013'#5))r@ɷ@L #/3 2 +@ +22/ 32 +@ + 22$/ְ 2!2+22 22+22%+ 990153>53#4&'#5#467.53)IY)m^ak)XK)IY)m^ak)X& Vm pZ Vm OpZL {+3 2 +@ +/32 +@ +/ֱ+22 22+ +999901#5.546753>54&A)`ll`)]nn]IYXsLWXgop tm ) UZ1 8O3#~X$H8#~XD+"}o%"}sE+h3#}i%Q\#}RE+3#q%\#qE?S"vqTS^"v+"}k'?G"}sG+i3#}j'?]G\#}^G+3#q'?G\#q G+T3)5 +312+/2$/$ + +/V+6/ֱ11 +@ +21 ++!! +' +!5+7+!9 901232654+5#"54;#"54;2#"&5464.+3265,.""a]A,#>  'Q5Hpq Pj8h.;$  ,. YYnH6}JhhKJhg\YM+;$  FhjLMjjKNj+C3#jY'?8G\#jNG+ :B+2 + +<+?.? +. +@7 +. +@.2 +%!? +,3%!% +!) +C/ֱ-2 +@ +#29+/255+'+++/'D+9 9959+9)99%!#901#"/&54632!5432!"54;#"543!#"=!35432#"=#"4;2r  r =:>66ۑ\d d  k}X(v)K((?"C6q+ 9A+2 + +;+>-> +- +@6 +- +@-1 +$ > ++3$ $ + ( +B/ֱ,2 +@ +"28+.244+&+**/&C+8994 9*9(99$ "901#"&54?632!5432!"54;#"543!#"=!35432#"=#"4;2`r  r  :>66ۑ\d  d k}X(v)I((?"vq+C3#jY(?8#jNH+o3#k(?i#eH+S"|{?Dn"|+"}o)i#}I?2"q Y*?F2"q J5'"}o++'"} tK5Y'3#}Z++T'\#}UK5'"jj++'#jK5S'3J +0>33+59222+$3)222E/E + +/@V+8  +K/ְ 29?229 +@9 +9 +@ +@ +9+BB +@B< +B +H +B6+2++6 +@+' +@+. +6+ +@6" +32L+B901232654+5#"54;#"54;2+!5#"54;2+32+"54;5!32+#"&546T,./-x66x.667A,#> r Q/;$ +S'\D +$833)3222++.?/? + +/:V+E/ְ 239223 +@ + +3+<< +@<6 +< +B +<*+* +@" +* +@*' +F+*<.99<9.901232654+5#"54;#"54;>3232+"54;54&#"32+#"&546R,.0.6_&F.FY--D7*7) -.A,#> r Q .&O=-9!0 /;$ 5f'3#||++f'\#||Kqq3#m,\np#jLq '1;+2/3"./73(+22/ֱ#+?+#,8$9 $9&/89;2,901#"&54?6322#"&46"32654&'2632#"&#"#"&54632r  r  jghhVzzVU{y0 ?V &  AWd  d slޛ$\ar. 40- 10H#v3% )A+$3+93** +6/?-2/3+ 2B/ֱ""+++ + '+C+6q3% %-U+ '+** +./ֱ#+/+#999 $901#"&54?6322#"&46"32654&7#"4;2r  r  pjghhVzzVU{yd  d slޛ$\a^((H"vq+"v|3Fq"vS+"}l3Fa"}S+M"}l5TZ"} U+nM3#}o5To#} pU+nM"qXTo"q +M3#q5T#q U\"}o6g["}V\O@#}P6gK#}LV\ CS\2+A6+$/G//+T/9ֱ5>259+'5++ +/! 3U+63†+  ),V+   ),),  +k+  +  +?+ )*),++),+*), #9+9 )*+,........ )*+,........@$GJ$9!OR99 99$A@ "'/4JK>&iOV<R:>Q&>KJ>&tZj?bDF] r  r   (j!*4';P5\)6;-( 7(BT@e-=BHd  d g#}\ CTt2+A6+$/$ +@$ +/+U/9ֱ5>259+'5++ +/! 3V+63†+  ),V+   ),),  +k+  +  +?+ )*),++),+*), #9+9 )*+,........ )*+,........@'GJ99$DM$9!OP99 R999$A@ "'/4JK>&iOV<R:>Q&>KJ>&tZj?bDF]  kk  (k!*4';P5\)6;-( 7(BT@e-=Bm  XX  g#}#\O"}p gK["} H"}l7+"}]WHl3#}m7+^3#}_WH3#q7+3#qWHC3#jY7+83#jNW(W03#jX8+X#jYX(g03#c8+d#`X(803#jN8+8#jNX(0 5M+'/"+33302?/E36B/K92N/ֱ$$ +@$ +$ +@ +$*+* +@3 +* +@*. +O+$H9* /3+ 2B/ֱ(( +@ +(++$2(.+. +@7 +. +@.2 + .++/ +C+(99+9. 99!$27$9012"&4632"&46#"&5#"54;2+3265#"54;2#'#"4;2((lsTUr"J[CB\Js((LhhL0q::^"C>ZD"vq::^"vZD"j]::["jZD"}b::]"}ZoD3#}p:t:#}uZ(0"}];3%["}[(0"j^;3%["j[3%"}_<3F%\"}\g"jq=sp"j]g`3#}a=s`#}a]g3#q=s#q]+'\#qK+"j\W:"~Z3F%"~\H&#bDi#}A jO3#}k$H\#}]D O #0v$H#SD d #vH #v9O #CeH#C a #1vHd#4 O 8<Mo +23$-7222/<'/:3+ /3 /2N/O+$ "05$9+')9 =C999 9012632#"&#"#"&54632!32+"54;#"54;32+"54;'##"/#"&47j0 ?V &  AWO6Ox%LGplj  kk  . 40- 10*l  XX  H# jO"j{FH\p"jG O 04G+*3%/222/4/23#D/::D +:5 +>2H/Fֱ77<+AI+7F499<@ $-23CD$9A 1$9(-$9#!901#"&54?632!32+"54;#"54;32+"54;'# 2267632"&54r  r  6Ox%LGpl>-H"va O 15H++3&0222/5 /33$E/;;E +;6 +?2I/Gֱ88=+BJ+8G5 999=@ %.34DE$9B299).$9$ "901#"/&54632!32+"54;#"54;32+"54;'# 2267632"&54r  r 6Ox%LGpl>-H"C$j O "CGZ++=3/V+%8B222$/GV+2/E36V+W/MMW +MH +Q2/ + +[/YֱJJ+ ++2O+T\+JY$G99(1W999 L9EF9997M$9@V99TO#D99/+(-;@$96249M99010"&=4>7&#"&546;2!32+"54;#"54;32+"54;/#2267632"&54  26  8&(4!6Ox%LGpl>-H#Sr O 8<O +23$-7222/<'/:3+L/BBL +B= +F2 /3 /2P/Nֱ??D+IQ+?N<999D@  ,5:;&KL$9I9999$ "05$9+')9 9 9012632#"&#"#"&54632!32+"54;#"54;32+"54;'# 2267632"&54j0 ?V &  AWO6Ox%LGpl>-H# jO"|qFH\p"|G+n3#}o(?_#}`H+ 'Jv(?#O H+"b(?4"H+d #v? #v9 #CN?#CX #(v&0 #c+ ):R + 2 +  +/ +@& + +@! +/3 + +D/J3;G/P>2S/ֱ2 +@ +2(+2$$++/T+689M$9(*3GJP$9$-0;>D$9A99  99D*099;M9PGA9017!5432!"54;#"543!#"=!35432#"=#"/#"&4?2632#"&#"#"&54632:>66ۑ  kk  0 ?V &  AWk}X(v)l  XX  . 40- 10?#+n"jq^?_r"j_q 'Uv,\#W qk3#}l,\ip#}jL3`%@#}a2H\#}]R3% #Xv2H#X R3d #vH #v9% #CZH#Cb #2v0 #c3% "->v+(#/ /3 /2?/!ֱ&&++@++&1<$9#( !%&$9 .4999 9012632#"&#"#"&546322#"&46"32654&'#"/#"&47j0 ?V &  AW1jghhVzzVU{yW  kk  . 40- 10slޛ$\al  XX  H#3`%"jqrH\q"js3U#vbHN"vc3U#CRbHN"CI%c3U #TvbHN#Yc3U#bHN"#c3aU#}bbHYN#}Zc(\03#}]8+a#}bX(0 #Xv8+#? X(u#vq+>"vr(u #C5q+>"C+r(u #Yvq+>#@r(u#q+>f" r(^u#}_q+^>5#}_r3%"C"|<3F%c"C(\3m%3#}n<3F%#}`\3% #Xv<3F%#X\3%"c<3F%4"\?G"PB?G"B?G"]B?G"jB?G"^ B?G"kB?G"_B?G"lBOQ#P#OS##^#]%#Em#j#Ej#^#Ck#k#@#_E#D#l!#J"PF"F"]F"jF"^/F"k.FMg#P 'EGg# '?Xn#]'PXj#j'P}Nk#^'FWm#k'O5F"PH5F"&H5F"]H5F"jH5F"^H5F"kH5F"_H5F"l HHf#P )!Lf#)%m#])[m#j )]xk#^)Qyj#k)R#_8)[#l7)^"PJ"Jf"]Ji"jJ"^J"k JO"_Jo"lJh#P+i#*+No#]E+g\e#jH+uJj#^6+cXj#kZ+qX#_r+qX#lf+qH"PPH"PH"]PH"jPH"^PH"k/PBd#P"1 Sd#1.tj#]1Oxh#j1Spj#^81Ksj#kQ1N+)"PV+)"V+)"]V+)"jV+)"^V+)"kV+)"_V+)"lVZf# 65h#j6dm#k6g#K1+("PZ+(" Z+("]Z+("jZ+("^Z+("k/Z+("_Z+("lZ+f#P:9i#:'kj#]:Yuh#j:cfg#^@:Toj#kS:]p#_b:^p#l::^?G"|B?G"B"| F" F5F"|H5F"-H"|J"JH"|PH"P+)"| V+)" V+("|Z+("Z?9G"?9G"?9G"?9G"?9G"?9G"?9G"?9G";VQ#O 9;VS#O&9;~^#O@9w;cm#O9;ij#O49;wk#O:9;\#O'9;Z#O)959"59"58"58"59"58"59"59"8Hf#O868Lf#O868m#Os68m#Ow68xk#Oh68yj#Oi68W#OP68#Ox6+8("+9("+8("+8("+9("+8("+8("+8("8+f#O8689i#O@68kj#Oi68uh#Ov68fg#Oj68oj#Op68*#O/68(#O16?GY"|B?G"qB?9G"?8G"B?9G"=?G="QB?9G="G O"|~# O"qP#Sm#|#yj##* 8O3#O6#U 0/ + /ִ++ 9 9013#"'&54?N@  5i`+/   +@  +  +/ֱ+01%#"'3326324u) 9$#/" M 0/ + /ִ++ 9 9013#"'&54?N@  5i`]: +2+ /3/+++ 9012632#"&#"#"&54632j0 ?V &  AW-. 40- 10!+p/'3+"2 /3 /2,/ ִ+*+%+-+  999%* 999 9 9012632#"&#"#"&546322"&4632"&46j0 ?V &  AW((. 40- 10J((59"58"H59"?5FA"QH59A"VDp#|'<Qj#'IRm#|)+Xj# )138%3#O6)&|>P&N0#QPjY"|Jj"qJf"zJ&{J`0"QJZ"RJq"|~+q"qP+i#|+j#0+4&|J&!#Q+)Y"|V+)"qV+)"zV+)V8"PR8"R+)="QV+)"RV3%"|~63%"qP6Wg#|62Xg#63f#3#P+3+2$/ִ+"++%+9" 999 901&54632#"/2"&4632"&46  W x  v   L  a! / +/+ ++01&54632#"'  W v   +8("+8("Z+8("_+(="QZ+8(="Bm#|1%g#1Pj#|:>,i#&:F83#O6:q\ 2/  + / ִ++ 9  9901#"/5B  @5`i5+ "/ /++ +01!"543!2+H.H. / / +01!"543!2nW. / / +01!"543!2< W.uF 8X&BBqv (/+ /ִ++ 901#57632fva -qOWg\ (/+ /ִ++ 9013#"'&54?va -\Oj%o (/+ /ִ++ 90173#"'&54?va -oO2W\ (/ + / ִ++ 901#"/5- a\OOBqv'R.]W\&iV{&W\'V+|\T+ 32 +@ + +@ +/ְ2 2 +@ + +@ ++0147263543232+#"5#"|_d|\'k+ 3&2& +@ +/3#2# +@ +(/ֱ$22 22 +@ +2 +@! +2)+0147263543232+32+#"=#"54;5#"|_Q ./ + + / ִ + + +012#"&46.'9:()9:Q:()9:R8VP /+/ִ ++01P}}]T 5++++ / ִ++ +01%2#"&546+TT B+3 +2+ +/ִ+ +++01%2#"&546#2#"&546T3%T  T+33+ 22++!/ ִ+++++"+0172#"&54632"&46:#"&54d((T(^y"4f #-7AK,*+=33V+F2 +V++3V+2 + +.$* +83.V+B2L/ִ V+ ,+1V+1+V+5+'V+'@+EV+EI+;V+M+6(+ . ......@1,99@  $*.3$9)9IE8=>"$9.3+,';?@$999 999012"&46"2654& #"&547%6322"&46"2654&72"&46"2654&.@AZAA--->-,@ v .@AZAA--->-,.@AZAA--->-,fB/-AB\A"-@.- !-z  z  B/-AB\A"-@.- !-"B/-AB\A"-@.- !-Rf #=IT_Y4+,033]V+AR22 +V++3V+2 + +X94 +&<33XV+GM22`/ִ V+[ +7V+7/[V+ +V+P+UV+U/PV+J+>V+>D+)V+a+6(+ . ......@U @  49X]$9P2;999<9J=0MR$9>.$99D&,"999X]).267;$$999 999012"&46"2654& #"&547%632632#"'#"'#"&46326232654&#"4&#"326'4&#"326.@AZAA--->-,@ v y";.@A-;" =;" =-AA-;""v3/-, -", -- ,, -- ,fB/-AB\A"-@.- !-z  z  4B/-A4444B\A44o#+- !-- !,-@.. !,-@..W\ /+ /ִ + +013#"&547}  \ iV\&aWV\''9W\ (/ + / ִ + + 901#"/FF  \ iW\&aWV\'9'[.+ +2/+++  901#"/#"&47,  kk  l  XX  ?8 ++/ִ ++01?632"'?     %++ +/ְ 2 ++901%#"&4?'&462     =3  'I/+/3+ 2$/+J/ִ++%2+!2+ +K+;>DG$9(08A$9 *-36$9356;>$9(08A$9$*-DG$9012"&46!2"&462"&462"&46762"/#"&54?'&54632o(|(((     K(((h(Ȏ     pj-9j5+3.+2:/%ִ++2%8+2+++2++;+%(,99 9901#"'&5463232+"&46 #"'&5463232+"&46-  -  3F **F **A 6+++/4+7/6ֱ22!+'+! ++'!+/*2',+8+ 29$/9994*,$9/ !'$$9901%32+"&46>32#"=&5'&54632654&#"#"5  >?(PbG^ yP>=DU,,UE8L,) :G2?"){WBdR;/ + +2/ֱ+ +9012326432#"&54yc754.5432#"54>=.*;;*)(  =,%%,= #VA"EQ]M+X3F+R2+'392 M +33 +02^/"ֱ+   J+P+P/J+ +E+AA2+...V+\+\/V+.6+*_+P999 992A%=99.'999  -99 *C$9#9901>32#"=>54&#"#"5%>32#"=>54&#"#"532+"&46!32+"&461-NR:YS@@< 91-NR:YS@@<  Q  SG;K*)D#E-3> )D SG;K*)D#E-3> ),,,,&Hj:FB+3;+2!+3++*-B! +*+8B!+G/:ֱ66,+(((?+E+E/?+(0+$$++2++H+E69(,!399 99-*'9998$09939!901#"'&5463232+"&46>32#"=>54&#"#"532+"&462-  7 >?(PbG^XMP>=D 3F **UE8L,)D%E+2?"),,'j:F+A3+;2!+3++*-! +*+8!+G/ִ+2++:+66,+(((?+E+E/?+(0+$H+ 99E69(,!399-*'9998$09939!901#"'&5463232+"&46>32#"=>54&#"#"532+"&46r-   >?(PbG^XMP>=D 3F **UE8L,)D%E+2?"),,iR ++++/ֱ+ + 99 9 99015!#"=!#"&547ul  f#LA O \%-+ 3/32/&U+./ֱ +@ + +@ + +&2 +@ +  +@ +)+#+/+ 99&%9-90132+"547#+"54;#"54;2'>=4&'@aHb>=byq\:MM:HHTC/V  W?a.{   $HH~m+3n+/ 3n+2 +@ +/ְ2n+2 +@ +2 +@ +@ ++90137332+32+"4;5#Ojj7  `'  >  $>|(|/#n+/n+ +@ + /n+)/ֱ   + + &+n+*+ !99&#$9#999 901""&=32+>32#".5463232654&48 ,>F48,)/'M$bF16H3('+v'n%+n+/n+/n+ + +(/ִ n+ #+n+2)+# $99% 9012#"&#"632"&=463265&#"[< 8N,31440CAb7 )'"A= \A7C4$ChINq(+/Z4vE /n+  +@  ++/ֱ   +@  ++ 901#"&547##"=3` ^  , 8u%}+n++ +/"n+/n+&/ְ 2n+2$+2n+2'+$ $9"99 9901"&547&5462&"2654"2654X@?Z?@;=T=G@#$>$$>*'D'4;+<<+:3'99'4p"('|.&%r "o/ n+2 /n+/n+#/ְ2n+ +n+$+9   $9 9 99901267&#"7.54672#"543232658G#${)3/940D@dG<"2Q&8S.&44H5$ChJVnVX /3n+2  +@  + +@ +/ ְ2n+2 +@ +  +@ ++01+"=#"54;543232#= SSU,` `VV-P (/n+n+ /+ + +01"54;2#-t&$ `t /ֱ  +@  ++014632. C #< ((;FCU/Zp4l`N X~2+ *333n+02/&n+ V+3/ִ n+ 2  +@  + +/ +@ + +*n+* +@*. +* +@ +4+ &9 9!9#990154;54&'"32+"&54;5"&54;2>3232+"X&"Q ! 2 #(;C  ! 0'BH{ItEuFDFHGDTW#' 8t8NXXK#/ /- '// + +0/ֱ**$+ 22$ +@ +$ +$ +1+$* '-999-  99'$*99901%232+5#"&5463254&#"#"&547>5&#"326.0AF5?0=Q@%+&!@ [\$'/<$ 61'!+3(/9 # 0!L!P/ + +//"/++ 2#+$99013267632#"&54632%3.#" A/";  ['Ea[BEY ;*);(,4  ]C>UWH ,%,+L B/ / /ֱ++ 99 99901#"&54632'"32654&\AA\\AB[/BB//BA?YYA?ZZ/@..A@-0@Kl0P/3 222/!$/333*21/2+$9#0999'-$9012+"54;'32+"5437'"54;2+7#"546;2#VPQVoaH BD  GaMMk^@@ ^L G?rJPXB+36K2B6 +@BE +,+3L,L +@," +++Y/ֱVV+H+CCH+C +$$3+)2/Z+6>D+ . >D+ .J&CJJ +>C+ +  + ++JJ +>C+ C'C&+5C&+6C&+BC&+JKJ +LJ +>C+ N+O+ Q +R +  #9Q9R99O9N95C&9'9@  &'5CJNOQR................@ &'56BJKLNOQR....................@HE9C9/39;99L6)1;=$9,S901&'#"&54?.=4>?63276325432#"'&'>7632##"&54?&''   + ++"E +13"'2" +@- +I/Hֱ+7#27 + +7+2*2J+799'/9E$9-<>9997$*/6$9"99014>325432#"'.#"#"54;>32#".#"23267632#"&5? "2Z9eHgCSv`H3\0('2 !4R(  4T,fE7J<+Ep.DYGL{ Z9#/ -&*0  &+ e+35*+.$2 + 2 +  +15* +31"2* +326//ֱ22$22$/ +@$ +2@$' +/$ +@/3 + ,222$+7+015#"54;5#"543!#"=!32+32+32+"54;5#"543|666pppp668b8?BC +C2%+. % +;3@2 % +8332D/"ֱ1"1 +@" +21 +2A;2A +@A> +62A+E+1" C999A3999%(.$9C99."(*99901%2>32#!"543>7#"54;&'#"54;&54632".#"32+32+ 1##6lj ^QS:3N -)<nc XU9)&7kC3;T@ =)5 hG Q;FL0+%334 <22204 +@0* ++3AJ2;+ 37A +@ +M/5ֱD2D9+9/23D&+=2 G2#+ ++N+D5*,99&/99 9# HJ$9 99 9974'=CGL$9AH9;99901>3263276232+4'32+5"&54?#"54;#"543754&#"32?&#"p0 @!7:!  !"J "J  ^""}w'27"  264$GG (  ((?z  O-RR23@DHKN +32#+,3'122 # +:AE333?I222 # +8BG333%3L222O/ֱ22EL22 +@ + +@ +@ +!22K+&A222922K +@= +62K +@K* +P+K$CFJM$9K9N901!#'#32+"54;5#"54;5#"54;5#"54;35#"54;2+32+32+'5##3'##3'4K"55556juJ"!!!!)((j +@\X +D\ +@DI +\+ =+2$  |+tt n+/)3n+/2+ $ 99|"'6$949t-299  9i<>bg$99992!"999F$4999K6)HX999^'P9lxt901%"'#"=43232654.5463254632#".#"2632#"&=#"&46;5463232+32+"54;#"543!2#'32654&+1;13/5  #1<17%(  " + (   g glz66XJcnM5ZG9 "*! /   $( $ 5 5 {&&A<8G)-)+)W38^g7@+Z3D:U22+V+ ++K+Gf26'K +6n+- 2+9_K +9h/Eֱ:_2:E +@:= +E: +@EB +I2:c+OOc+ =+2O$++)2n+/2i+c:RX99 $ 99"'4$929  9D=BX9999992!"T$96$99-)99']9_QR99GO901%"'#"=43232654.5463254632#".#"%32+"54;#"54;232+./32654&+1;13/5  #1<17%)  "KIifA"-JJrGMS6} "*! /   $(R]?AV}`!&/m~S.;nGB.C BNNBBBBBBB):(<.n+*3 +@ +&/.2&. +& +//-ֱ''+++ 0+&9.901%2674632+46322"&=.+#"&55"      (&%~  )+.I 9  '$( ] +3'lZ @G + + ++5  +?3D2  +=382H/ֱ22?8E22? +@?B +@?; +? +@ +2?2+' +2*I+2? 5$9*",999'%995",99%'9901%2>32#"&'#"54;5#"54;>327632#"&54654&#"!2#!!2#!W,C .N,_  \4_ S?Kn,y $`<a^  $,fR<Rn+<3ADz+<3 722+'3",222 +3@B333 .22E/ ְ2C22 +@ +2  +@ +2F+ D901732+"54;5#"54;5#"54;2+37#"54;2+32+32+.'+K6556K?-v'=+8W4Q>9ݴlnxH3B+ 2'+!/2'+$++24+C/&ֱ"" +220922 +@ +?2@6 + +@  +2.+)D+ "9$ 19901%32+"54;5#"&54?5#"&54?5##"=!#"&=#762762AiiZ  p^  t V  lZ  p)<  KD?  MIrr I9  HD<  K H3%9E5+39!A22,+(?2/ 2, +F/&ֱA&A +@&7 +*2AE+11E+ 2  +@ + +@ +1$+G+$ 99959$99901%2#"'32+"&54;546"32654#"54;2+"5434.+3265+A>.& ` =M>$'% naan+'Q5?FHp>/.>V  .B*(%&`j8k54&#"2654.''#"&54?7.5432#"54[ /+&0<"Tp20 R6Q& $2M_$[;7P6%)!&7LFH8&@dqg wB-$:m!pH/Ai+3=BI +2&+"A2+/C33*>22  +  +9334D22J/ֱ 22>C222 +@ + +@ +$2G+E22422G +@27 +-2K+G?992*:99013267!32+"54;#"54;5#"54;5#"54;232+32+#'!&+!654'(F6555567Y c>,E!aA/0(,5/XA?2p3>3+3"423" +@3 ++ +35!2 5 +@  +&* +&/2+?/ֱ<<+ 422!22$+22121$ +@1- +$1 +@$( +@+&"19569901#"=.=46754325432#"'.'275#"54;2+'Pk}fS<R;FI2iY_)-H' e( mJd0[#4"3+(4>,I\r O3@DU&+3* 222?+;2-1&? + B33-2284&? + A33822E/F+013'#32+32+32+"54;'!32+"54;7#"54;7#"54;7#"54;3'נJ\L6&7%L86O73BXgHx̂I;;;;>@Qp ++6+;+,; +J3O2&"; +!E33&@2R/ֱ +@ +$2/ 33//82+2 > +))/>>) +@>M +C2S+6+ !.GJ"+ !+ !+JHJG+IJG+! #9 9HJG9I9 GHI......!J GHI........@391699/9)';FP$9>@9  99999,&19>9990173267632#"=#"&547#"54;>7#"543!654&#"#"=43263232+!2#!]FDb?jZt3?cKQ>:R754325432#"'.'267632#'DZ .R3YAZ=3Q( 4S,)Lgg%[S4G<->p*B+/ &+!- {SGO}H3&u+ 2!++ 2++2'/ְ2 + +@ + +@  ++$2(+01%32+"54;##"=!#"&=#'"543!2#Aii )cIrr I~P43+ 21+ 3-2/)n+4/"ִ&n+&2+,2  22 2 +@  +@  +2 +@2 +@2/ + 2+n+5+2&99-)%901"543!2+032+#"''.6763267#"54;5umxnpE+  "*  Y0U . #9)Y {| w\_<   <  'y'yyo'y'y'yxy: H/R+/R+/ ִR+ +R+ 99 99012#"544&#"326?4/m+/m+/ִm++m+01!!!#.QB VWzW:N/R+/R+/ִR++ R+$9 $9014&#"62#"54 32ȱxeDeȯ(gwx<  6f!E / 3;92)/F/ְ20220"+6{-+ .24EB+  . 97  +i+ +2324+X@+ 7879+324 #99879 #9 9@ 23478..........@ 34789..........@"0999); 99901"#*.45<>23:<."#*23:>4f 8%qS]HKb*; %ydzyiv#,!lYmlZk!4'UE@>GT(2QLa"0 4%VA@j]g kWl^P[ZQ]88M/ -!K9@8 '9b,/n+/n+/5://ֱ  +n+ +(n+ 9%99%90174'&'!"3!267#!"'3!2654'&'#!"&547>3!2$$>I$#H33H$R9-# *=u'6Xc+ n+/ n+C/G3>b2\/Mn+S/:S: +SV +d/Jֱ__Y+DO22>>Y +@>A +>+n+ +n+e+_J79Y*:-GMV$9   25$9%99  %*-$9 99>CE9\JY_999M5O99S2901%#"&546325462".#"32>32"&547632%463232+5#"&5463254&#"#"&5&#"32>"E&=OQ>:'  -"3782!1Y  ^  DU,8?65,7K:-$C *+7"7@ TACW% = ?85; b   e/%,#+6 , ; $K^3Bdo"+1=+_+F_F +_b + "_ + 3=++JO"_ +S3Jn2Yh"_ +Yn+p/Vֱkke+P[22JJe +@JM +J(+$=+-2 V+2$+ V+  3=+q+6[+ . ++ #99...........@kVC9e6F9SYb$9$+9 1>A$9 991 $+69$999  9JOQ9hVek999Y[9_A>9901%4.54632432#"'.#"#"'#"=432326"&547632%463232+5#"&5463254&#"#"&5&#"32(,?>,A08-$$.=^"J8<'8)+70  ^  %U,8?65,7K:-$C *+7"7O !*+ L1 6 b   N/%,#+6 , ; $?@)/o&+& + + ++0/)ֱ..*++21+&99999*+$9014>325432#"'.#"3267632#"&5? "2Z9eHgC7-7>4R(  4T,fe<E7J<+Ep.DC%*0  &+ exAYGVC A"+" + +/+)+;++ ) / V+/V+B/ִV+%+??%+=+?,+520C+%  $9,")7;$909 3799 ,9/;9)99014632#"&264&"2>32#"&=>32542#"'.'.#":#(49$%7\'$0$",*> &'E.cZ/D%* SE+ 2 + +/ 3?n+2@/>3 n+-2"/+3&F/ֱ$22Cn+C+ ?22 ,22  +@ ) + /+5n+5 +G+/ <959999 9@?32!5432!"54;5.54675#"54;2+5462#".'5'F/=`6ED7``-   #)*.. 1R<=UFF = =30: MP =L+&+%& +0n+ & + 6& +6n+6 +@6; +M/ִ3n+3"+(n+( ++N+"3 .6@C$9(,;99 9HK$9  @C$906+"HK$9012#"&546"2654%#"&546325462".#"32>327"&547632>UW<=VVk\@AZA"E&=OQ>:'  -"3782!1  ^  V>;VV=327"&547632&"O2 #(;Ct"E&=OQ>:'   G3782!1  ^  ! 0'd TACW% = 4?85; pb   \@R+@9+ + +/+4+% 4 +  +@ +  +@  +:/,ֱ(12(+2+!2;+(, 99999%499% *29901#".5432326=##"=432354&#"#"=432632f,T4  (R4XvSCgHe9Z2" ESe +&  0*Z--YD.pE+/(ִ<V+<7+.=+. +2 +@ +  +@ +2&+2""+?+7<149+$96<9997;990132+"54;#"543!#"=#35432#"=4632#"&264&#"1Wgoi9$(49$%7\'$$"b--,&37%'24 1" 1"!;337.+32$(5$2+3 4$2 '. + 8/3ֱ535 +@3 +@30 +56+( 2(6 +@( ++2(%+ 2% +@ +@ +% +@% +"29+01#"54;2+35#"54;2+32+"54;5#32+"54;3f26x.62)(0 "\6+43.$2+3#$2(+ 7/ֱ++ +@+1 ++ +@ +8+6>+ .$.$>+ $+%$+$ #9%9%..$%......@ +901%46;7654&#"32+"546;#"546;>3232+"]-480*>36-.o6_60N.+ I.I< >+ 2.1#$>+ <<+<+;<+IJI +;< #999#2;......@ $1;3232+"546;7654&#"32+"546;  T6_5  U0N.36-.S  :I P$  ;w.&=2   %,!0   1.8<j:+3,:,+)/=/7ֱ//7 +/2 +>+/799) %/47$9,'999:9012632#"&54>32327>7>7#"&#"#"&54672!]!. (#9M7R (3:$ & c0  K,!L '%B*);Dc#;C 2 cLxd1 $*BV3*Z&++2+/ֱ +   +#,+ &)$9#  9#)$9016232654&=47#"#"5463!2##"&54-)<)9 1#C#7)S:3NW=)(hG&7nE3#;T@VB*]+ 2&++/#ֱ +  +,+# 9 &)$9 #)$901".#"32>32#!"543>54&54632-)<)9 1##7)S:3N=)(hG&7mE-;T@ux2])//3/.ִn+. +& ++4+.099999"&.$90167654#""&54>7>3232>32#"&'&547v8 -g 5C31iF.$7!  ]>!,/R1  6Ifp+G2]55 d1!71.J =+ 2;+5+/033$+22$ +@$! +(2>/ְ2 #2 +@ +@ +  +%2 *1222+8.2?+5;999 28$901%2654&#"'3#!"54;#"54;54323543232#>32#"&';6*H@<%%@JEP9!>UcMhmIHocW&Axeiy>B3"&+3!$22+ 3#222'/"ֱ$"$ +@" +2$%+% +@ ++ +@ + +@ +(+99!9901#"54;#"54;2+#32+"54;3PJ"47(3 = J3 @3+-3?#+&3+23# +3# +=+# / =+A/6ֱ<<+00 +@! +0%+--+2=++=+)22B+<39%0$.99999?%999 $9012"&546"2654#"4;2#"54;32+##"&=43232#12E119, , (6j4)"- 1$!11#"1 ((&r&&)#XX& 3b+4j5?+   +@  ++#/=/3@/&ְ*2:+2:6+  ++A+6:#(.$93999= &6:$9 (*.8$901%#"'332>54.#"#"&547&53>324'326*L2m(';:. @-20/+(..(+CV/JUC.ZR3"%*DH$-I5&1Q0%)+M#0CG.WeCoR1JV0zAYRC4-+3 %u+ 2+2 +&/ ֱ2 +@ +  +@ +2 +""$+'+!"$901732+"54;#"54;2#&+32?65466PmvUA )8_a (8<3%@%05+( ++./+#26/ ֱ441+&1& +@1 +&++ 27+&199+ #$99#9 999.( 12$901"#"&54?.546263232632#"&'32654&#">0_ ZUqБh6(*G5 IE+4U{yW3,)HY Aj||{( $gl]Mts(1>_3+3CC3++3KK +KW +`/]ֱSS= 88/=SU ZZ/USF+..'+ a+=];W99U?9FSCK99.,99'+$9  999C?99K +.;F$901>327#7632&547>54.'#.5463232654.##"&54654&) @!6 *!!qF h!# z 7%$  (3!( 1C84 $() '6   )Ci1bc>   p'GH,*   F#M3-1(+3,"/222+ .22!( +!2/-ֱ/-/ +@- +*2/0+"2"0 +@"% +"+ +@ +3+" 99!9 90132654&+"543!232+.'#32+"54;3DJhU6kIk/@=9BU9V(0$D0-E]?a0 Rkzg+M39B+63 122+A2 : + C/ֱ :2  +@  + +@ +2 >+"D+> $&9999"/9 &)9$9:$9"901%#"&54?.'#32+"54;#"54;2763232+&'%32654&+i  K7#K66Ik5&L  I$9'rJhU6<  4(/]?a0$64  3"?G+D0-E R?5` +=+T+W3PV+\2 +I/)833MV+=C^222$ 3%+a/+ִ'=+02 =+'+!=+  3=+!N+CV+CN +@CF +NC +@NK +C>+^V+^> +@^6 +>^ +@>; +b+6/ˆ+  +  S+ ++ #99............@')9 $3$9N!R9>CUW993I6;FK$9PM@ &.1?V$9 9TRZ99014.546325432#"'.#"#"'#"=432326+"54;5#'32+"54;5#"54;732+32'9:'<,,# ) #)(99(C37$ 3%'0yU%R S%U ;SQ< M '"&2! ;!  (#)6)@&&*X3Da=K+#33O (E$2K+ +2X+R`2X+U+\28KX +8 +@A +8 +@8< +/+KX +6333/2+/ +@+3 +b/WֱSSP+EEP +@EH +PE +@PM +E_+ZZ)+72) +@)& +-2C+92??+52#02#+ +@ + +@ +2+c+#39/+990135432#"54;#"546;2#35432#"54;#"54;#"=#35432#"=32+"54;##"=3#"&=#JJM G#m!8 >u7`L É8aJa8VBkk BV3G+;>33V+6C222++2//33 V+$*4E$2H/ִV+ +V+ +@ +  +@ ++V+5+*V+*5 +@*- +5* +@52 +*%+EV+E% +@E +%E +@%" +I+599%*<>99 '(=999&)990132+"54;5##"=3#"&=+"54;5#'32+"54;5#"54;732+3265G U%R S%U ;SQ< Ijj I1'3+2 + + +2 +@ +/ ֱ +@ ++ +@ ++ 99$9990175#!#"=!!5432!5U8!: H)#v:4;F3:F) :X) J+<3. O?H+3 )33<<0<>ow++2+ +/+/ ִ+ +@ +  + /  +@  + +/++01$#!"546;5#"546;3#5BB" zNC# zvdd22 iiy4@r3+JNtqV+3D$3Z@  .8@IP$2_+[f2-NV_ +-hOV_ +hOh +@Oq +hO +@hl +>:V_ + "+9M$3>&22cV_+u/ZֱPg2PZ +@PS +ZP +@ZX +]2Ps+i2ooe+aa+2+2+$2+)2v+6>S+ 8.M.8.M9.-.M+N.M+-.89MN......@os69ae<91?BK$9  999 !99 "+$9N- 9O!99901%2+"543'2+"5437'"54;2#7"54;2##32+"543#"54;2+"54;/#'32+"543"54;#"=#35432#"=!5*%$->9. ''d4K_E4  'Gz&Ɲhhvv`H^rI&u&2%B*d273/T373Z+ 2 +@ ++ 2/ֱ+   +@  +2 +@ ++01#"54;2+32#!5432!q```= 3%3<X3j HS&/6"&f$&fb)O`#u ~Of#tY#u X`# ~Xf#" tYXc#uQ# Xf#L" B`##{X Bn##Q H`##{X Hc#" uQHn##Q 8Hf"# 3`" {Xq3,1'3V+ 22+ 22/ֱ +@ +2+   +@  +2+01#3!2+32#!"54;#"54wkkAkk  !73e +222+222 /ֱ +@ +2++ +@ +2!+01!2+32#!"54;#"54#3#3#<KK!KKgggg3)%33 $+ !22+3"222%/ ֱ$ $ +@ +2&+6+ "."!>A&+ .  ...!".......@01732#!"54;#"54;26;2#0 #s956% fc '$'u) (E*+,3P ++32/+6= + .  ... ....@0132#"&##"'"#"54;26#! %," 3(E*%33 $+!222+ 3$222%/"ֱ" +@ +2&+6&+ .    >^+ !.  !  $ ... !$.......@01#"56;26;2+32#!"56;073#e'$* cf "659D) *G( .3#' +$$2+3"%$2(/ֱ''$+$ +@ + 2)+65+ .  >Z+ ...........@01%3#32#!"56;#"56;26;2+#9s_'$,OR "(*)*G(G3'++ *$2+"3($2,/ֱ+**++  + +@ +%2-+6)+ .  ?b!+ .   ... .......@0173##32#!"56;#"56;263!2+3lq) UK-;> " H(()*G(J327S(+3,"4$2+ 3/3$28/-ֱ4-4 +@-* +129+/,!990132+7#"54;2+32+"54;'32+"54;#"5437'*,xx(n"2xx4**pB3)(03;E327S+ 36$2&+3"+.3$28/7ֱ7 +@ + 29+"-990132+32+"54;'32+"54;7'#"54;2+7#"54#38++3xx2"n(xy-BB3)J37;`+ 38$2$+13 ),69$2V+ #..#"!".. !"#........@01%#32+"54;###"54;2+3#"543%#5##5Dm57UFI L7B;2;)OxOx.hhhhcp,048+33 222+3$'$27/.2338+-1229/ֱ527"+7/7 +@7 ++123"+3/+ -2  +@ + /"+/// +@/* +:+6 + .%$%>V+ '..'&%&..$%&'........@013#3732#!"54;###"54;2+3#"543%#5##5##5D?57UFI L7Bo;2;-;xOO)Ox.hhhhhh? p<@r+3 !$2+)633$.1;$2?/@+A/ֱ!=2!?"+?/?! +@? +@? +B+ 09901%32+"54;'32+"54;#"54;37'#"54;2+7#"54;2+%#5i L LR 'PBmXP;:D;۲Oqqhh3%["+p@w+ 39$2$+133 ),6;$2/+A/:ֱ2: +@ +"+/ +@> +B+ +9901#532+"54;'32+"54;7'#"54;2+7#"54;2+3#"543;=" LR K mXP;:DTin'phhqqO":p159>+ 3<$2$+3 ),:$28/339+22?/=ֱ628"+8/+22 +@ +4"+4/4 +@4/ +@+=8<9 +9901%#32#!"54;'32+"54;7'#"54;2+7#"5437#5##53Dm LR K mXP;:;2;Ti)OxqqhhhhO\\OTF?G\G QP)&/ +@ +/+901%#"/7632!2#!  `Tb mm 56& &/ ֱ +@ ++ 901"/#"5#"&54?  46 ln< `Vb 6&/   +@  +/+ 901%"&54?!"543!'&54632L bT`  65 mm& /ֱ + 90174632432762'& 64  nl bV`  ?%+/ +@ + 2&/'+#9901%"&54?!#"/7632!'&54632n bb  `6`  66 mm 55 mm,%+&/ֱ +@ +2'+#990174632#"&54?#"/7632'& 66 mm 55 mm b:b  `` pg%#"/#"/#"/  >i { k > {f!H /33"/#+6V¯+ .......@017"&54?#"&5&5437#"'#&=7 k = f  >h xmM/ ֱ+6i+ ........@ 9014632'&54632'&5475632'&x   ? k  i =  m0 /2/ֱ2+9 90127327432276 h>     = k (0-a/*3%2 +@ + +@ +@ +./ֱ,,+"/+,9%+999901%".54?##"/76323763232+Y $b  `.  %h}- H6 mm 5[  IZ (0-a&/3*2&* +@& +*& +@* +@* +./"ֱ,+/+"%9,+999*&90123'&54632#"&54?##".54?#"54;76 %`  b-  $x. I5 mm 6Z  H[ M v*/32 +@ ++/,+6s+ . ++ #99 .... ......@9901#'>32#.#"#"/".M)T.'Y('C('>#)19v  , !$/- % )+e /{M v,~/3  +@ +-/.+6+ .++ #99...........@ 901%".#""54632>?"54>7#"&54?,''C'  (Y $,W,b1)# % -.$! ,     e+)(0+7/(3#2 +@ + +@ +,/-+901%#"/##"/76323763232+ Nb  `N `b Y6 mm 5X 56+7,/(ְ2$2$( +@$ +($ +@( +-+$(9017"&54?5#"&54?#"/#"/#"=Y6 mm 5X 56 Nb  `N `b (0 X2 X2)%9/ +@ + 2 +@ +2&/'+#9901%#"/##"/763237632 b  ` Y6 mm 5X JJ>/%9 /  +@ # +2 +@ +2&/'+ 990174?'&546323'&54632#"&54?##"&> `  b JJ X5 mm 6Y*6@ +/ +@ + +@ + /ְ2 !+9012!5432#"=!#"/7> `jb   4ac6 ln C +2 /ֱ +@ +@ + +@ +!+901"/32+"54;#"&54?  4ac6 ln< `mb *6;+/ +@ +/ ֱ2+9901%"&54?!#"=432!'&463f bj`   6ca4  nl&2A/3  /ֱ +@ + +@ +@ +!+9017462#"54;2+7632'.  4ac6 ln `kb , /4+0/ֱ$$ +@$* +21+$-990132+"5474632#"&54?#"/7632'&  66 mm 55 mm  b:b  `` )'-/ +@ +/$(/)+901#!#"/7632!267&+"&546;284b  ` &A& &1;c&16 mm 51  2F7'-$/$ +@ + /(/)+$90146;2+"3!'&54632#"&54?!"&5F;1& &A& `  b48c%2  15 mm 61&)'2@ /3(2 +@ +//$3/ ְ 2(24+ 901+"&=##"/76323546;23267.'6.9  b  `6**49%!d #2E E6 mm 5$-;2Z F7'4@$/3424$ +@4 +,/5/"ְ(226+4$90146;23'&54632#"&54?#"&=#"&554&'3F4**6`  b  9.6! d$2;-$5 mm 6E E2#,$ ?;@'/3 2#/7327'&'463"'4?#".#"#"&'#.'?2"  `  )  b* -b )  ` !5 Q m 6! 6 R m 5X;r&/382&8 +@& +8& +@8 +@8 +2232#"'4&#"6 ln 4 *I/8P'PB)>!b  `32763'&5>324&-@! *E-2L(4 S l6L`$>A% :@/#2G9 ` *  b\q+g0; '+"/3(/)+6‡1+ .++ #99...........@"%9901"543!2#"/#".'#"/1a     i i k %.Z0> &69;!++)! +) +@)& +! + +@ + i)9nfh(w[2$ k>Z7#"'"54657[w(hfn9)i '.Z.> "WqsSam  `Vb .mm 56mm 56+/ F@)1/@/ +@ +!/! +@!' +0/1+9!*901%4?!"543!'&54632#"&!2#!#"/7632L bT`  > bV`  . 65 mm 65 mm)/D/ +@ +-/''- +@'! +0/1+9-9'901%#"/7632!2#!#"/7632!2#!  `Tb  `Tb .mm 56mm 56*&. 1J2/ ֱ +@ +#+# +@ +3+ 9#*,99-901"/#"5#"&54?"/#"5#"&54?  46 ln  46 ln< `Vb  `Vb J1/D/ +@ +/   +@ ' +0/1+9-9 *901%4?!"543!'&54632#"&4?!"543!'&54632#"&L bT`  bT`  . 65 mm' 65 mm*&. ,6-/ ֱ"+(.+ 9"999(901%0'&54632432762'&54632432762nl 64   nl 64   bV`   bV` !a %0 /  +  +"/" +@ +&/'+01%#"&54?!"543!2%7632!2#!"54 `  `T:m 5 m 5 !a %0 /  +@  +/ +# +&/'+017&543!2#!#"'%#!"543!'&54632)` *:T`  5  5 8 H$)= + /3(2&/32*/++ 99&(90132+#7##/?237332+3{.g    (t23   HH.3D+/3321/3+24/5+!"$913#9990137'#73'&'463"'4?##7##/?23737#7^ !d  .k    (!*  c    28H(=+/ 32/3!2)/*+9990137'#7"'4?##7#"54;7#"54;733'&'463 n  ~.t(d g 4  8&8/ +@ +/ +@ +/ +901!2#!#"/762!2#!|   T   &(/ֱ++9901'#"5"&5>7"/#"5L  b 4   e  2 "///+901!"543!'&5763"&56?!"543!7V    z2    (/ֱ++9901%76327672/472432  b |[   e  6H#)&/)'/"*/++')99901&'463"'4>?!#/?2!7'! !d      9'yw  c   \ !'8+(/ ֱ%%'+' +@ +)+'%9901#"&5?"/7632/46327'7     } i!!      )",+ W2,+'7/32 +@ + +@ +(/)+%901%"&54?'#"/#"54;76323'&54632Z bG`c*",,b^>`  67c-,b65 mm*.H/+/+/ֱ+9 99901#!#"/7632!2!55!.  F)HJQ^*CE E@*. X2 E@5 %i++&/%ֱ"+"/3++2'+% 99$9999901#7#3'#"&54?+32'&54;CECEHJ$HJ     O37++3 222 + /!+9017#"54;2+##"54;2+#3;N9M9qw )?;j-j+++ + + % + ./ ְ2((+/+( 9  $9%+ $9012#"&54632654.#"#"&546.#"326|pYIdcDi=07;+! / +74KK8naJ-  /CpaI=Q]]V@>7*  ,K`m>-  /Lfm{3]P+-3"++/+90133%!+,:3(+-3 X3& C ///!/ ֱ2 + +22"+ 901;2+"&546;2+"!2#QgU eg Vf Tk  gh  gV  &8>//3>22;/03 *2 ; +@ $ +?/ֱ>2+ +@6 + -22"+'@+=99"@ !*19:$9999>901#7;2+"'#"&54?.546;763232+32#'7#"4-}V ##1  0;Egs8  0R eY Y`Vf9Z  h  g yGhx  g   (gVsn1 ////+ 9 901;2+"&46;2+"!2#:/HPPHd />abk& >0&39=./#3342.3 +@.' +/83;2 />/*ֱ%%+ +@ +0228+<2 ?+%*-9@  $49:$9=9879 9 :99901?#"&46;7&+"&46;27632+#"&54?#"&46;267#73&Z T$ +'?  ?6?ee,  $` SUg`MF     tEg]  L  kT̤rsn C/ 3p(u+ 33"/3& 222)/'ֱ' +@ +' +@' +@'$ ++   +@ +@  + +@ +*+01".543!2+32+"&54;!32+"54;b - 56,F  kk3o Rqo'V+ +@% +/ +@ +(/ְ'2"" +@ +2)+901!!76;2#!"=47&=43!2+"'ܮ4WGrM H. / / +01!2#!"54cn.H sXHt#y\`3 "&547632  ^  b   `3&54632"'h  ^    b  qw } B+ // ֱ++99  99012#"&546"2654->UW<=VVk\@AZAV>;VV=32326546~ *  @,/'6  "5 M.@7 $"R.H8"=k(/$332 /3:2 : +  +>/6ֱ+!?+6&9$:$9!<9 3!&+/7<$901265474.#"2#"&#"#"'#"&54>32326546326.   @+*  @,/53':  "51:&$"R   N 2'N.@018 $"R.H,,J2AP/!33B,322J/;3322Q//ֱMME+>>6+R+M/O99EBJ$9>@H99963;$999B99J $(0$999012632632#"&#"+"'#"'#"&54>3232654626547&#"#26547&#"%%#%( @,/!,)#(7  "5  @ j  @  'N.@8 $"R.H$"R& N$"R& Nn07A/!/31=+922/83'=+ 2/++ + +B/$ִ5=+5 +'122822  +@  +<+ =+C+<+99 9!991"92 $99901#".#"#"&54>32326=.546754632>54&'"& @D\\D,/'6  "HbbH51 Z3 W;:V 8"8>ESak/3&F2L/i=+d/b3]=+_2X/ 3424+T2l/-ִ;=+;)+0922OZf22OI+_b22 ?22B+=+m+;-"9)$99O9IFV9997T99B 999L&"Q$9i*J999d->9E?$9] 099X7990132".'#"'#"&54>32326=.5467546;267>54&'26=#"'".'63254&#"327"+ @'QD4,/53':  "E==E51/f;+*23)b "!+O @#,. !%, Mr YHAV.@018 $"^:9]t.H,,#i;G F40N$" 2Mki J$/7w}>[/V_33 j22/3=+42/03=+%2/*J338<@228 +G +/qִ|=+|m+tx2222 +22!,322!+%022SL~22S+P=++|qf9mh_99]99  8[$9!#Y999*:<$9S(9>J@999PGH99 [Y]99bf99Rn99OPqxy~$9Mt99(98:>9901547&'26=#7#"26=+547&'32&+3272632632".'+"'#"'#"&54>32326=.5467546>4&@ P H%  7 H@:97 %'$%)  @5CB6,/!+*#(7  "9IH:55-98F*23 f& Mf$"zz:$"|z1g& Mf0 Mq_v^.@8 $"a@=an.H'OfQM`Nn&Q/?/:%+/3=+22//"R/ִ=++212 +@ +L+5=+L5 +@LC +S+L"+995(@99? @$9:5=C7$9G9/(+9901#"&54>323265#"546754632#".'7632'&547632454&'"&@,/'6  "7'&547632454&'"&#"&#"7632#"&54>32326=.546754632@0F ;1H6)Z'Ng iF !9N|.@7 $"{kIHhg.Hn&V:/EI/63=+20/ 3+%+/3O=+'2$/S$S +$ +W/Lִ=+H+O227&22H7 +@H= +X+IE=A99J9099+99*3L$901>7#"&#"#"54?.'"&#".'#"/#"&54>32326=.546754632@5J0 >F1)ZMg\?  Ca |.@7 $"{kIHhg.H;#yN#yANy; V^#yKy<#yK#y#yBKyBH#y H'q#yKy<E#y#y#yB#yB \?#y"y (\\2 / //+ 99 99901%2>2#".#"#"&54632* R%B;   L,E;'& P0/ R0/\\7/ //+99  $999012#".#"#"&5463232>&Q  %9D,L   ;B\P &'/0P /0`@/e/3 2/%3*20/ֱ   +  + "+-"- +"( +1+" 99 -$901%"&'.#"32#"&5463232654&#"&4632)L>-A@. =VV=/&27.@A- Vf, ///ֱ+$901$2>32#".#"#"&54632n(  G&4*#  B, 6! X7A7+, W7A+p ('@\^0a/ +@ +)/) +@ +1/ֱ 2+ 99.999)&,9999990174632763232>2#"'#"&54>?.#"#"&\L,F N+* R%"1I + &   R  "'& P& "%V  J' (J& (SH^E+>> +@ +./$322.2 +@.( +/ +@ +F/ֱ G+ 992956C$9>9A$99014632763232>2#"'32+#"&547#"54;>7.#"#"&\L,$) ) 0 * R% (  n/       KR!Q ` '& PT+ c  3y%&  (3%'Ce"+/32/3 2  +@  +1/((1 +@(, +5/@D/E+(1:=99589@.9017#"4;7#"4;763232+32+#"&5472>2#".#"#"&546324 4+ * R%B;   L,E;R(h(6 &(h(U '& P0/ R0/3%"Pt$/3(2$( +@$ ++/3/2 / +@ +6/@@6 +@@J +Q/R+  1:=$963FGO$9@9012>32#"'32#!!2#!#"54?#"54;7#"54;7.#"#"&546327632" R%5FG7 '.HFB# %  L, !8 6  P TqX  ?qi &' RZ  W\& ( (S\^UB+7B7 +@BI +/  +@ +#/./PV/GֱLW+LG P$9 (+99#!&$9.0999P12#".'#"&547&#"#"&546327.#"#"&54632763232>2R%#* R%*2 8   R&"     L,+) 0 * PD '& Pd p OD RQ _ '& J '& (S (\#& (' (O (3y%' ) dY%b+3/!! + +2/&/ְ22+2$ 2'+!99 99012326432#"&54"4&#"#"&54632yc54'# D:z)""3z%E& ~3z%/|X 3z%&j 3z%/jX 3z%J/  3z%'  3z%J/Pr  zI/Ip/H/G 3z%/"  3^%'Y/32 +@" +/3 2  +@  +(/ ֱ  +@  +2)+ 9017#"4;7#"4;763232+32+#"&5474(  4+ (h(O ?(h(U 3k% !// //+01!"543!2'!"543!2!"543!2 DDD3 %;/83 32 +@ +/13,2/*3%2 +@ +7&547.54664!    EE  !    FF  7$$#\7"  ~y"  7"  '{"  ``bd Ao"+63/== +@ +2/&B/ְ 2#24+29@2C+4<=$9&<9" (19$901%"4&#"##"&54?#"&546?"#"&543232?632>5432c< V  D*5 [F)Ttc< ^  L'/ UD)RpY,- { $ "?ID',-  " != JD&H &)1*/ ֱ)2+++#'$$901%#"/#"&54?'%76327632%7 o  pg  OW [ BC|  X  0 K}XN&)1*/ֱ+)2 ++#'($9014632632#"&54?#"&54?'&7N x  zW  ?G wb  Hw  ]  ( Bxa+ S36I +312  +@  +./)n+&/!n+7/8+&)054$901%#!#"&54?#"54;7'%76327632"/!24  %#v/B  $P }k lTqZ ASt  ?%  :m  oyY5;S47I+3  2 +@ +%/*n+-/2n+8/9+-* "67$9017632!2#!#"&54?#"54;7#"&54?'&546327Va  \\R4  %%Ls \ C  HZ A7  Kt  vKH s&m (Nr&!l (H CFd +<+3G/ֱBB+ +@ +H+B99@ $./2#".'7 %   @&>*  \ J 8>2) R%2$+1i9M h ! Kfv  F3 Ir o.''& P"`NCFR +<+3G/ֱBB$+)H+B9$@ #,./2#".'7 %   @&({ @ :  :2>2) R%2$+1/M h ! KoD Z~ z  [.''& P"O>#?+ +$/+22+!2%+ 999 9901#"'-632"&54?'&54632  &  &   >#?+ +$/+22+ !22%+99 99014?'&54632 #"&"'-632 & 2&     <?B_++C/9ֱ33+D+3959@ %&/2>?AB$9,9992:=>@A$901"&54?'&546327'?6327632#"/#"&4?77'7 7:q l+   *>h b   *~E-  > ;@A$901"/#"&4?'?#"&54?'&5463276327632777  7Rz y  D  DQz z  S b -CZC Y@e c  -CZC Y@e   H'  1/ +@ + +@ +/ +901432>7632#"'.#Hdzr  YY  rzd(/W6  00  6W/F)   fR2H 32] +2/!/ +@ +3/.ִ)+.) +@. +24+).,$99  901432>7632#"'.#432#"'.#Hdzr  YY  rzd:aV]!  %1.(/W6  00  6W/v(/\=  He'F,48!/4/ +@ + +@ +5/6+901#"#"&54767&'&546323#"#"&547>3 dzr  YY  rzd#]ia   ^Va:O(/W6  00  6W/o(/V7 =\/H o' ( ffF p' ( geH 305=(++0( +6/7+0(%!999129999014326?63267632#"'&'#"&54?&#?Hn7t  Ta(  EK  :  {Q0 (  8L  907  o?  F 3057++  + 6/7+ $9 1299%90163232#"#"&54?#"&5476?&'&5463267&  qU3u:z  XW%  B J  8'  ( 5G  {:87  l?33q9/ //ֱ + +2+ 99017"&463!2#!"3!2#HPPH4:6;54qabG87K3q nM53%.y/ &2(/32( +@ +// ֱ+++ +@ +#2+0+ & $9  99( 9017#"&54?.546;763232+32#%#"3S  KCKPH]  Uryy:6;5q  `EHb  )G87K3%.y/3'2 +@ +!/&3%//ֱ+ +@ +#2++ 0+ &'$9! 9% 99017632+#"&54?#"54;#"54332654&#`]  UCJPHS  Ksy,y5;6:  aEHa  )K78G3& n3' o3)2;o,+!302,0 +@,% +5+35 +@ +;% +32/<ֱ1,2<1 +@< +!22?+1<)991799#&/9901%2#!#"&54?#"54;7#"54;7&#!"543!27632+326543  6Hy4%,  *5PHGi5;%F  -b:  70VHabsK7E33i +3 2 +@  + +@  +(+". " +4/ ְ 2++ ++ +%1225+(. 9901#"547>7#"4;763232+'"&463!2#!"3!2#   HPPH4:6;54^ (/ (abG87K33i +3 2 +@  + +@  +*+." . +4/&ֱ22&2 +& + ,225+*"129901#"547>7#"4;763232+7!"543!2654&#!"543!2   345;6:4HPP^ (/ (K78GbaI/e+ + +2'- +''- +@'! +0/ֱ+1+*999-9'901#"&=432326=42#"/763232+ef| hRMp(  d{}f g~~g TilQoo 78I"y I& zJq>/3  2 /32/ֱ  2 +  +2+0170!2#0!00!2#0JsqS>q {X5J'  {>' |H 3 +3 /2/ ֱ  +2+010!0"5!"5H((>fH X?' t/2/3 2/ 3/ֱ2+2 2+ 2+99999901"&5462.'#5#65#?桢+ m\*ӿossr]\m *\m?' P// //ֱ2+ 2+$99901"&5462."!26?桢+0ssr]]vv]*]vvD) T/ // ֱ+ +@  $9 @ $9012#"&54%&"'64'2डtsHH;;f;YF(toot@::HK*J;D* J/ // ֱ++ $9 $9012#"&54%"&2654'डts`9HAU_9A)tooty]RBH9(^RA9#5& & #5'~ #5)5@ֱ--+3+9B+6+ .)!"+ .!")........!")......@-<999*06$93 ;$9*0'9>$90154327632#"/#"&54?'&546327"32654&'2"&546 Q  RQ  Q  _^]Zkܛ$+ *p  pp  p* ]_]\(mnom#5'N #5'{ 2& X+ 2 /3 2 /3/ֱ  2 +22+2+013!35+33535#2绻) ̾(2& ;+/ / /ֱ2+ 2 +017!5!!!5!\^*6^( 2& L+  //ֱ ++  $9  $9013!7'%'726ӶѴ Ҷ!cҵ2&& & 31I>/  +@ +  +@  +/ֱ 2 +@ ++017#"5432!2#!\F+'%I X1:G: ++ 2/ֱ   +@  + +@ ++01"543!2+#"59:V XGI>/  +@ +  +@  +/ֱ 2 +@ ++017#"543232++IJ/ +@ +/   +@  +/ֱ 22 +@ + 2+017#"543232+32++g31IJ/ +@ +/   +@  +/ֱ 22 +@ + 2+017#"5432!2#!!2#!\FF+gwI O/ +@ + 2 +@ +2/ֱ+ 2  +@  ++017#"5432#"543232+f++I$I $^$/$ +@$ + 22$ +@ +22%/ֱ+  +2 +@! +&+017#"5432#"5432#"543232+rdf+++";I![/ +@ +2/   +@  +2"/ֱ+ 22 +@ + 2#+017#"5432!2#!!2#!#"5432rrc+g+31I#E#/3 2# +@# +@# + # +@  +@  +$/ֱ 2%+017#"5432!763232+"&54?#\    +    31I*.T*/ 3.2*. +@* +@*$ +-/3 2 - +@  +@  +//ֱ -220+017#"5432!763232+32+"&54?#?!\Ak  VFiXl  VW+  fg  f)ggyI$.U+$/3 2$ +@$' +2@$ + $ +@ , +2//)ֱ%%+ 20+01%#"54323763232+#"&54?##"5432 j  T9Y  Cag+w  ^d  K+"CI 37e3/)37$237 +@3 + 2@3- +6/"326 +@ +2@ +8/ֱ+ 6229+017#"5432#"5432!763232+32+"&54?#?#Kb e  P4WLe  OzK++  fg  f)gg{F.F(+///ְ2n++2 + +0+  !$+$901%#".54632654&'->54'#"&54>3212 )  AA  ) 219֢(#&6 6 6 6&<v{F W1_NTS/+/ֱ+6K+ .....@90175%CHyNT XHp' H& /BQ #F/3/ / 2$/ֱ%+9 999901"2654&%2#"&'##"&46323>y""0""R'9:(#76$)9:*!46)"""#(:()9-#".:R8+ !*BQ X\Q >/ ///ֱ+ 999901%2654&"'#"54;>32#"&""0""G6$)9:*!4"""##".:R8+4!% '&/3#2(/ְ2 2)+01%#"=432#"=432#"54;2!#"54;2Ab̐d9>/ 3 +@ +/ֱ   +@  + +@ ++017"543!2+#"5Zl<.' l<3' <3' D0Z+2/   +@  +/ֱ 2+ +@ ++ 9  901).'46232'.'0   q `  w  (dD0D+ +@ +/ֱ  +@ ++ 999013"&54762%!(    +"    ("-+2&+3/ֱ + ++01#".5473#"',    #    -+2 X'+- X+-;/ + +2/ֱ  ++ 901#"&542326542-gi(z^\~(eglYN?^y H+6Av=/7+/ 3"22/,+B/?ֲ#4222:+ /222C+:?997=$992"9,&)$90176232+"/#"&54?#"4;'&5463272"&5462"&546,  zz   {{  ((7  z({   {(z  W`\RX J/ 3+ 2 /ֱ+  + $9 $9017'757nn;{<;{Jwww\RX 0/3+2 /ֱ  + $901%'7/͖tn3wwww.W;{\RX X4! +3+/+ 901%#"/#"&54?'&54632   !  4!+3+/+901747632#"/#"&!     L& )Q86 fB@86 T03q,b//'#/ /-/ֱ+%% +% + *222.+'9#999017"&463!2#!"3!2#%"&5463!2#!"3!2#HPPH4:6;54/632==qabG87KS/'*32/3q M5G3+ %2333++ +4/ֱ+//'+"" +5+9/29'+$9"%9  9+9901754632#"=4&#"#"754632#"=4&#"#"Hef| hRMp UX8:U ;,(@ g~}h UhlQ CNNC 36<- G Wx"Y+/32 +@ + 22#/ֱ+22+ $+"9015432#"=4'#"5#"=46@Tk/>U]<<OBd :/CO3%F37+#3 /233-422  +@ +2/+533&228/ ֱ22622  +@  +2+ 422%,22 +@0 +)29+01!#"=##"=#"54;5#"54;54323543232+32+'5#u??)?gg)ggN, ^2N,' U2!sR@'f 'f@ f sR@ W'{/fV%f'{/fVef8 QN8 PBF, iTH 3 6I.+/  +@ +  +@  +#/67/8+ 9.6+99901$#"#"&54767&'&5463236#".'&546323 dzr  YY  rzd:aV^   bh]#(/W6 00 6W/v(/\= 7V/H YHM++H// K +N/Cֱ??+O+?@  #$2>FIL$9=9H1399929$9 KIL99 #9990164327&#"4326?6326763201#"'&'#"'&'#"54?7HDFc> w;D 4^'  @F  4L  /;%;>+11% +@1, +@14 +D/ ִ+2+6E+2@  $19@A$9CA9>@99%$91;9901$#"#"54?#"&5476?#"&5476?&'&54632763232#"63Q`G 6X+  C{9  ST  #TR O<#.NNN(. 8R ~=O?m  44  B] (K4=/3q+2+3 2)/3-2)- +@)" +/3324/ֱ33 +@3 +223 +@+ +5+3"(99017!763232+32#!!2#!#"&54?#"54;?!Jc=  *!@6Q3  /5 SS  :OG  .O)3</3o)+!+03%2/32 +@ +/3124/2ֱ2 +@ +2 +@2 +#25+2)/9901!!2#!#"&54?#"54;7#"54;!"543!763237R4  !.6e]=  *OG  .OR  :)3/k+.3 *2 +@ +  +@ $ + +32  + 320/ֱ  2 +  +,221+0170!2#0!00!2#0#"547>7#"4;763232+Js   S (/ (3/i+.3 *2 +@ +  +@ $ + + 32 + 320/ ְ 2  +  +21+010!"5430!00!"5430#"547>7#"4;763232+Ks    (/ (H ' -8N' - B!H ' f -8F ' g -8_+/ֱ +6K+  . ++ #9 9 ..........@ 9017'?6327'"&54?75y  OIՄ  4_7,S  ]H   4A-`+/ְ22+6K+ .  ++ #99 ...... ....@ 9017632"&54?7'?'@  ~j  @0fC|N+  1\}  LO(-H#&*+"+2"2+/)ֱ ,+6K+  .)% +%(%)+(%) #9 9 %()......%(....@ ) 99017'%76327'!2#!"&54?#"54;775X  .(Z3   -V0nGx2^h  6Aj  FS'H#'*m+#+2#2+/ְ2'&2,+6K+ &.%%&....%..@'9901?7632!2#!"&54?#"543?'?'Oag  ]ve3   ,A^"Lz  n(Kv  51> ^& ' F C @$4' ' *4   @7!)1T,+%'+/2/"ֱ//+3+/ %'*$9, "1$9013265472#"'#".54?&5463276&#",6B^A T-vRG8T T-wSF7Tw,4C_"k"^B6 U7GSu-T U7IRt-Tw"]A8,2&Y /+ /ֱ+ +90137%!'24`( ! /3+/+ 901#"/#"&547   &8~ XX'qx (&q'qx (6 0/ +@ + /ֱ + + +01%!2+#"(~"A 0/  + + /ֱ + + +01%#"5#"43!A(6 X"A X|0//ֱ +01#753@)*S(((|A//ֱ +013##53((T(0|+/ֱ +01%#33#@)))S((@|+/ֱ +01%#573((((SH 0/ +@ + /ֱ + + +01#"=!2#q#5  Sa+n+/+012%&54>& ,>j@-.@i9NNa$48' (82#7,j(+ ( +@( ++/#-/ ֱ  +@  + +&.+ 9 #(*$9  %&*$9017232654&#"76".54?&54632#"' :4COooMPp*; ?6`^_T@? ;*oONpnND5: ?AU_6?4?[,7;FQ\Q+433'922/ 3DZ2T/?33)822K/03"2]/ְ2WN2WR+G22 :22 +822A(322A<+-2$2^+RW 999,->|?X>>,CC,>>,->|>-,>>,CC,>(''C'|)'C'''''CC'''->>-BB,?>-,?{?X??,CC,??X?{?%''C'{{k'B''*C'''B'''HnX]1 0/ +@ +/ֱ +@ ++01!#('@  8@81Q 8 @'8@Q XX8 0/ + +/ֱ ++0146;2"&54&#">4/- *,b8ND/ -1+Y8@  XXd;/ + +2/ ֱ++901%"4&#"#"&54632ch Q+ 22/ 33/ֱ++ $9 990137/!!73'3#fD$~pon@茌(@ooooZ XZ/ ְ22+014632#".547&   F  NNXh Xh+-E %7S++8/ֱ  +   +9+  $)2$9  -6$901%%'7%"=42#"'&54?632#"/&547632-((U  U jU  U ؕ(||bb1  1  -1  1  WC/2/3 /ֱ +@ +2 +@ + 2+01!"54;#"543!2+32< ^CP,///ֱ+ +01!%!!Pph^(X&  `X& `X&  `X&  `X. 9 `#5F!y +/32 +@ +/32"/ֱ+22 22+#+99$9901"5.54675432>4&,ggfgVwx~Wuuig Й@F ~WY#5&  H3//3 2 +@ + +@ +/+01763232+"&54?#"543  ʥ  +    H3// 32 +@ + +@ +/+01&5463232+"/#"54;h        X&  `X&  `X& `X&! `)F%I+#/32# +@# +# +@ +&/!ְ22'+#901%#"/76323543232+#"5#  `vxb mm 56I0F%I+/32 +@ + +@ +&/ ְ22'+#901%"&54?##"5#"54;54323'&54632_ bzx`  65 mmX&  `X&  `#5%-X+$+/./ֱ!!(+/+(! -$9+$  &$999012#"'#"&547'&546326327654&#"0kK HZnT  EF^LX=[F9mkN 7orN  /DVA`_GAY\&:V&q +-F J+3 2 +@ ++/ ְ 22+ 9  99013632##"533+ )3YWX&  `X&  `:U%,U+ 2-/ֱ** +@ +* +&2222#+# +@ +.+01%2#!"54;5.54675432>54&55GG57JK6'54Q&12(bR76RS96Sa_='*=<''<HM3&O"+/ 32'/ְ2 2  +@ +@ + +@ +(+ "901"/32+#"=#"54;5#"&54?  46 lnc `b X&  `:&qY +-N X3X&  `X&  `:G%,g++ 2-/ֱ## +@ +#+22 &22*+* +@ +.+ &'$901"543!2+#"=.5467557>54&96HI56II6'34O&32rS86R~}S77Rr<((=<')=H#D/3 2$/ְ 22 +@ + +@ +%+!901746325#"54;543232+762'& 64  nl b`  X&  `\&q +-3&q ?&q &q #5&q G&  X&  `#5&  X& `:'Xp +-'Xp q'X q'X #5'X" HF`+3 2 +@ + +@ +2+/ֱ+  ++ 99013432>=3#"'.5H+PTMX+v[ao\^ aR^~ }g3F(j +/3(2( +@ +"/3 2)/ֱ%%+ 22 22 +@ +2*+"(99017"&46;543232+32+#"=#"3HPPHLL:6;5qabggqq)G87K\c'OaN,c'l!Ho+&+-3#+A++( +,/-+( "+$9 $901!>32##"&5467!632.#"+u ?!Z,u  pvL6(*<3 j3 D  .C#'/'\j6/++# /# +/# +7/2ְ225!+5/ +2&+2)!+8+219 "#/999 25999 +$9&)99901"63232754&#".#"326%54622#"&'"&54,DNE; QPB;QA@Lhh hSOg A^0/$9b0/$by@ww  vn  \F)m+'/' +@' +/*/ְ22 +@$ + +@ +++' )999 999!$99901!#"5&#"#"&54632543232>2#"'@*   L,%* R%&# R '& P&qeX& L `X&" `J.C+/)) +@)& + 2//0+ "-$9) $'$901%.#"?3>32##"&467'363232w>6 r\\)M  = l  B*7E;/*Χ D ' +z 0/J)5+$3 /*/++ #$9 99901'#&#"#"&5463273>2#'. < ;.)   L, 5 _$ ; m*g,3I 1hD Ru& B +J8R+(Z?G&Bq&nq& ?q+(& Aq?GB8W@EK&+3I?2I& +@I7 +/3 2L/0ֱDD"++4A2228H22F+==F +@= +M+D09"999F&999=?9901$#!67632#"'&/&54325467#"'&5&'&54767542!54'36W!,4G I**I G4 7$$7(6$!*_IH (((< >  %L L%  =$% 1/12/0 !!/ 01,33D656D9VG++ / ֱ+ + ++01+#!"5#"4;2!4;V`_u v(U(jV1%~+32/ 33%"/V+&/ִ%n+%+ + +@ +@ +'+%$9 "99%9901%+32+"=#+"4;5#"54632.#"V"xtty!$ih((lpl8// ְ22 +@ +  +@  ++01"5.46742@1@@1(1@@1(I32JMIfIM<m/D`T) W'+}d4)+}4)+}4)D)X#q#qg/D)D)S!-5=OasH+}3Nw2?+t3E鰀2 %+ + +I+/+%+ %+`/3Ze kbZ`+nnW Q//632:2% %+/ִ(%+(+"22%+ ++(%+$9 SWw{$9b`\i99k"(99nZSr99%W#9/9NJ{99EA9901463232+5#"&5463254&#"#"&5&#"326'#"4;2!#"4;2%'&547632#"'&547632#"%#"'&54?632%#"'&54?632X-;$>:B.8L='2,$@',4@("#9bbbb/\\\ \f\\\\-# +6/%*5.: &n((((N! " ! " " ! "  ! X`+ 2 /3 /ֱ  +++!+ 99 999013!2##3.5462654&#}[[,20>LLfMebPZ\`96\` ^BDbgNMf2&p_/3 2 /3 2/ֱ   +@  + 2 ++ +@ +2+01"5423#353#53E((Uo(\(( (XX 4+%/% +@%! +/** +@*. +5/'ֱ++#2 26++ $9 0$9%$99 4$901%7'#7 '37&'+32>#"=#"=435432,8,Ժ8B++8%*  *%88Ժq$3K2/ 6 CbD 6W*2!+-3$12/** +@ +3/ְ22 +@ +4+6=u#+ '('(....'(....@$9* 901.5432#"54>7#"+"4;2?63#!"43!+  ?*)@  +.-T:+!Ci<& )<;) %=VV(VV(( WD mJ+#+LJ /G3 2_[J# +8333_3222 # /%32n/Zְ`2 2Z +@Z] +K+ 222H $222H+29329 +@96 +o+ZQUaei$9K@  NXbl$9H@ '1;E$99*.2:>B$9L>FBMQU$9[ ;ENX$9_@  '1bl$9 &*.ei$90167'5'67'7&'#773&/542763232+#"/"=&'#"'&54?&'#"54;67'&5476326^i$<.Li%<.jj.54%!."'xah&$qq{|}|@o2:fph=X4==XIBK+E+88E +@85 +@8; +/L/ֱ  /+I/I +@/+ +@/2 +I+M+/  5999I(G999%8C$9E@ "/BIK$98?G999299901#"&5472654&#"&'632#"/#"&547654&54632326327#"'X}2ⓓpE1L[~|Y  _/8  X58}[L,Lono 4 X 30_ XL98 :F& ' Tt rV]L +32+/ֱ +@ ++ +@ ++01$+"5!+"4;43!23VnmWZX((#("XG#V+!2+2$/ֱ +@ ++   +@  +%+ 990146;2#"+"4;2653547"26izHUUv>} 8iYY\]^e(jWBc.(eF@oRl?g#5%+/ 3/+9901!7#"543!2+7', #5 ZX#58+// 3/+999901!7#"543!2+%!'7,:z 漼#5 \X?y$/3322 / /!+01$+"4;6#!"43!+"4;"+"4;?jjkkjj((((((((D $/ / / + 9901%#'73'#3DqLJX,///ֱ+ +01!%!!X^(;/ִ ++01# gU W 048<DSc*+-3F*3+2+++F9+/S>/3C 2C> +@CA +O/93N+;+6/7+H2/ 333 222+2T/@ֳ26:$2C159$2=+2C!+&22RGJ22R! +@RN +R+/  +R ++*+2-2-+/-E+U+=C%9 $9!#9 I9NO$R99;"96#97&%JK$901#5#532#53#53##54;#!"=#535''754;5332#53#53#53#"=33!73"&'($8r__^^(/99*9z((((((( 4( FnKTq:v ((((( 4(Ei 8ccc/$P(3. I! V 7LTX\`h}+"6$3 222++2B+A+I+<+BBG+ 3>+2b/OY]333gQ[_222S!+e2-/3&(+2V/933W+2%/2i//ֱ&&d+'+>FV$2g)K9IAL901#5#532#53'#53#53#53##54;#535!53#5'"543!237&'#5ᘀ537+5353%#53#53#53#"=33V(&((^^((((9(M^ Y((m*,j6(# (Sw(&(U((K^^^^M(9.(iY(ji.B((S?i`gLI ILFB(j((((*X%94+ ,/%-/*32$/"/:/ ֱ11,+2%%+## ++2+&+;+%9#9&+89$9"901%#!"&=4>75735##%54&'!3!2>X!#f* #G!p)|*#E8'#-48 P@8/B8V#oo @tC-Et@{B+BX_$,1L+ /2/ֱ+3+ #%)-0$9!$&*-.$901%+"&=46;254&+";26"''.''&5X[[[[(ExyDExyDA+(:u[[[[yDDyyDE;*] !*T8  /ֱ + ++01#7632(  - T8| /ֱ+013#T(( T / ֱ  +@  ++01#"&/&3  (V -Q8 hXX8 /ֱ+01#3((Q  fXX,80/ +@ + /ֱ + + +01##32م(,8T /ֱ+013#,(( , 0/ +@ + /ֱ +@ + +012+3(:d8, nXX8,  md,  lXX8 0/  +@ + /ֱ + ++01"#4632DV(nTB;"NX,8@ !/ ְ2 2+ 9013#4.'>5(05 ()GN.*5G) Ս9 /I.,+G/ %&8! %/ /ֱ   +@  ++012#"&53Tn(V;XN";B8@ /ֱ+01#@( c8@ tXX8, !/ְ 2 2+901#67.53@(05 ()GN.*5G)+9 /I.,+G/ %&8!c@  rXX8@ /ֱ+013#(( 8X/++/+01!5XxPP<8  /ֱ  +0165463<~~ XrV rV<8  //ֱ +01"&54.'2~&DE-VrX9P)Vr 8:l _/ n+ +@ +/n+/ ִn+T+/ +@ ++  9 9901'5!#''%5!j4/0(@7uA6@*+ : e+ n+/n+ +@ +/ ִn+T+/ +@ ++ 9 9 901373!57 !5%H(0=q @6+zX 3/ + + 2/ֱ + +01!#"=!#"5.X`X X Xs/ X X"8A E /ֱ +6?+ ........@013#&54632^)j, ; X /++/+01!5X PPX5$++++/+01!5X5PPXT/++/+01!5XTPP#Xs/++/+01%!5XsPP *+/ /ֱ + ++01+"5476;((q 2+   +@ +/ֱ   +@  ++01$+"'&5423(((p(/"r /3"2/32 +@ +#/ֱ   +2222+$+"  99999901"=.5467542>54&'#?gd(cg(UsvR(VqsTfh[[hgn}VYz~}(/"(| /3(2#/"32/3)/ֱ&& +#2222 +@ ++*+(  99#999901"=.54675#"43!2+>54&'#?gd(cgUsvR(VqsTfh[[hgX((}VYz~}(/"(| /2/3(2#/"32)/ֱ&&+#2222 +@ ++*+(99#99990132#!"4;5.5467542>54&'#?gd|cg(UsvR(VqsTfhF((Fhgm}VYz~}:U /32 +@ +/ֱ2222 +@ + +@ ++  9901%+"=#"547542'#:((5(.__jj{{:!e /3!2/3"/ֱ2222 +@ +@ + +@ +#+!  99 $901%+"=#"5475#"43!2+'#:(5(.__T((T{{:!Z / 2/3!2"/ ֱ2222 +@ +@ +  +@  +#+!9901%+32#!"4;5#"547542'#:|(5(.J((Jii{{>,r/+3 8+%/7+2% +@ +-/ֱ"+2 2+V+.+9 )99% #999901746324232>?632#"'"5&#"#"N>4>(@3  O=4?(?3> Ak6C8  Bi6T7< ->2|"/138++/7+2/3 3/ֱ(+2%2%( +@% +%+V+4+%"9"$/99+)99990174632#"43!2+32>?632#"'"5&#"#"N>4>@3  O=4?(?3> Ak6-((8  Bi6T7< ->2|$/'2/13 8++/7+23/ֱ(+2 2( +@" ++V+4+9 /99+ )999901746324232>?632#"'32#!"4;&#"#"N>4>(@3  O=4?|?3> Ak6B8  Bi6((?7< -W ( /3 /ֱ +@ ++01+"5#"43!((G(W (/ 2/ֱ   +@  ++01#!"4;423|(-((G X XJl +=+/3=+22/ִ=+ + ++=+ + + +999901#!2#!"546;2+!#"43ZO2  + ;&H)i /# # +@  +/ +@ +/*/ֱ)+++# "9!99 9990132##"/76322654#552>53B]c@  wg*HJPre<"RW; jv)}xCE+KxT@+ +/+01!7!5!(( R'J+#/&// 2 +@ +(/ֱ   +@ +)+01%#!"543!42!2#!"43!#!"43!+"4;R(Ik77ppct((s((t((RO!V+! /3322/"/ ְ2!2!+22 +@ +#+01%+#!"=#"54;543!232#5!5!RRDDnRCnnllPX&+ /3!2 +@ +'/ֱ%+(+01".+"&'+"#"546;2>32;2D l&%l =-l  #l-=P)9 **9)8X XVDf++ /ְ2 +@ ++6?y+ ....@901%#!"&=>;2#D)!- )-&&| |+-E&} W. Nt,+/ /+9 901#!"54763!2!!N  ?Ac L (T,8F+3/'/ 3829/:+' 998 9937$9012!2#".'!"547>#32>%." $   2++/  $!         - ?9 .   2 !  ,.v/1%/8/u8*y/6/2+n.-y/7/;n6#-v/(/7;n-0v/(/27|#0v/4u/1(=u/$/&.z&.u/%/(/uc7/6,h%rwje6/+Yv7:esd9//^y)BdXd8/7Dd9Uxud7/)8d)gwhf7/&Tr5-foe9/6Pt6,j~d7/6_r,4d+4t/(//'!t/'/&y+0t/'/&+3t/'/&+/t/'/&"3v/$/.p1$8y/1x/6<#9v/(/7%;x/& /$1{rl//(do0.l!9y/6/8%#6u/(/6&ad7/)Sw6;i_c5/6Eh*Kpib7/5[w6;gZe;/6Ej8M{b6/6gq38b!7t/'/(/~NG((6/ +2 +/ֱ++01%5432!5432 *U~~ U=g/1 M /. X,+3-/.+01 "&547632"&547632'"&547632P  )    ^   ^  r   b   b   qA)$+)++$ ++$+*/ֱ  +'+!++++999 99901#"=&#"#"=.546322+"&463D=>PMX^GbP(?> D)"?2+E%D),L8EUA,,9O + +@ +/ + +/ ֱ+++01"=#+"=4234;29((|j;+3/   +@  +/ ֱ+ 2+01%"5!"543!42((I(I_!jF+ /3 + +2/ ֱ+++01+"5#"542!42((3(D!_Ij Wj#g+ 2  + " +2 /3  +  +2$/ְ2  2  ++22%+01%#!"=423#"=43!2"=#3542((_((f zN 1 /ִ R+ +R+ +  $901- 5#'N"zNUU@ R+ + + + + / ִ ++2 +2 + 9901#53#53#3@Xq Aa \ +  +/ + / ִ ++++ + + 999901#53#3#53A__AA#4 O +3 +3 + + / ִ++++ + +01#53#3#34__``XBB K T +33  +22 +  + / ִ ++ +++ +01!#53#53#53K__b+3/ +01!#3#3..h..JXX ,+/"2'// -/ֱ#+# +@ +# +#* +@# + +.+#9 999 9'" $9$9901"32654&'2"&54632+"54;#"&547/mlkgxGKW  0lmkj({|}|^. XX 8+*/"&+2/2 +26 +/ 9/ֱ+44#+/2(2#( +@#* +( +:+49# !2$9()9 9&"!+992 /$901"32654&'2"&546463235432#57>54&#"#"&/mlkgx>?4F2{/"D 0lmkj({|}|*DD+ ..r$M<*C XX G+(/17/;A/A +@AE +/ H/ֱ4+%4% +4+ +4> > +> +@>9 +% +I+>  "7$94971 +%-$9; "99A9901"32654&'2"&5464632#"&546232654&#"5432654&#"#"&/mlkgxK6FF&+#\B6S 22BG.,B/5")  0lmkj({|}|==+%$,$-Q= ""5 7!$ XX .2+)/-#2/!3221// 3/ֱ.+/2#2#. +@# +&2.# +@. +@.+ +# +4+. 2$9 #912 $901"32654&'2"&546#57332+32+"54;=#/mlkgxT|70lmkj({|}|/KtXX >+//:/)) +@ +#// ?/ֱ+$$ +$ +$<+,<, +<2 +, +@+9$9< )$9,9: ,25$9)$901"32654&'2"&546"#"=32+>32#"&546323254&/mlkgx'A 6MO+(/732"&5463232654#"/mlkgx; 5RN$]zf`R&K '%KaK0lmkj({|}|&\\ 1C7Rr[sq+ !<$mOXX )+/ +@$ ++/ */ֱ+'+""+!! +++9"' 999!9 '$9!9901"32654&'2"&5465##"=3#"&547/mlkgx˦m  0lmkj({|}|FA XX -5@+/<7/2//)/ A/ֱ +9& 09?+5 + +B+& 950@ #()67<$9+97< 992 #$9/+&9901"32654&'2"&546#"&5467.5462&"3265"32654/mlkgx% J?BG#CnCQ'*$Z34,+50lmkj({|}|0+9FC<,-&(-:;,'(@K("r0'(..'&XX XXXX "/E+7/;12 *#/ 02# +@#@ +/ F/ֱ<+11< +@14 +<1 +/ +@ + +@ +/ֱ2 +@ + +013!!( ( 8X A/+ +@ + +@ +/ֱ2 +@ + +01!!#3@((TP48X N/3 +@ + +@ + / ֱ +@ +  ++ +01#3!!#P( ( 8X N/2 +@ + +@ + /ֱ +@ +++ +013!!#(P@ ( 8X A/ +@ + +@ +/ִ+2 +@ + +01#3!TPP  (8X Q/3+ +@ + +@ + / ֱ +@ +  ++ +01#3!!#P(4P48X Q/+2 +@ + +@ + /ֱ +@ +++ +01!!#33@P(TP48X D/+ +@ + +@ +/ִ+2 +@ + +013!!P4P48@ >/ +@ + +@ +/ְ2 +@ + +01#!5!3@(((8@ A/+ +@ + +@ +/ְ2 +@ + +01!5!3#((P8T N/3 +@ + +@ + /ֱ +@ ++ + +01#!5!3@(P (8T N/2 +@ + +@ + /ֱ +@ +++ +013#!5!3@P(@(8T A/ +@ + +@ +/ְ2+ +@ + +013#!5PP@(8T Q/3+ +@ + +@ + /ֱ +@ ++ + +01#!5!3@(P4P8T Q/+2 +@ + +@ + /ֱ +@ +++ +013#!5!3@P(TP8T D/+ +@ + +@ +/ְ2+ +@ + +01#!5!TP P8X@>/3 +@ +/ֱ +@ + +@ + +01!!#!X(@( 8XT N/ +@ +++ /ֱ2 +@ + +@ + +01!!#!5!@(@@( P8XT N/  +@ +++ /ְ2 +@ + +@ + +015!!#!5@(@P4(8XTA/3+ +@ +/ֱ +@ + +@ + +01!5!!#X(PP48X@A/3 +@ +/ִ+ +@ + +@ + +01#!5!TPX ((8XT Q/ +@ +++ /ִ+2 +@ + +@ + +01#!5!!TPT P(8XT Q/ +@ +++ / ְ2+ +@ +  +@  + +01!5!5!!#TP(P48XTD/3+ +@ +/ִ+ +@ + +@ + +01!!#!XPTP4X >/2 +@ +/ֱ +@ + +@ + +015!3!(( (X N/ +@ +++ /ֱ2 +@ + +@ + +01!5!3!@(P (X N/ +@ + ++ /ְ2 +@ + +@ + +01!5!3!!((4PX A/+2 +@ +/ֱ +@ + +@ + +01!!5!3@(TPPX A/2 +@ +/ִ+ +@ + +@ + +013!!5P@ ((X Q/ +@ +++ /ִ+2 +@ + +@ + +01!5!3!TPP (X Q/ +@ + ++ /ְ2+ +@ + +@ + +01!5!3!!P(4PX D/+2 +@ +/ִ+ +@ + +@ + +01!5!3!XPP48X R/32 +@ + +@ + / ְ2 2 +@  + +@  + +01!5!3!!#((( ( 8X \/ +@ + +@ + + + /ְ22 +@ + +@ + +013!!#!5((T ( P8X \/ +@ + +@ ++ + /ְ22 +@ + +@ + +01#!5!3!@((4(4P8X U/3+2 +@ + +@ + / ְ2 2 +@  + +@  + +01!5!3!!#((P4P48X \ /3 2 +@  + +@  + /ֱ +@ + +@ +++ +013!!#!5P(@ ( (8X \/3 2 +@ + +@ + /ֱ   +@ + +@ +++ +01#!5!3!TP( ( (8X U/32 +@ + +@ + / ְ2 +2 +@  + +@  + +01!5!3!!#PP( ( 8X l/  +@ + +@ ++3+/ֱ +@ + +@ ++ +2+01##!5!3!T(P4P (8X l/ +@ + +@ + +3+/ ֱ  +@ + +@  +  +3++01#5!5!3!!#P((4P48X l/ +@ + +@ + + +2/ ֱ +@ + +@ +  ++2+013!!#!5!3@P(T( P8X l /  +@ + +@  +  ++2/ֱ +@ + +@ + +3 ++01533!!#!5(P@4P4(8X _/3+2 +@ + +@ + / ֱ  +@  + +@  +  ++ +01!5!3!!#P(P4P48X _/3+2 +@ + +@ + / ֱ +@ + +@  +  ++ +01!!#!5!3@P(TP4P8X _/  +@ + +@  +++ /ְ2+2 +@ + +@ + +01#!5!3!TPP P (8X _ /  +@  + +@  +  ++ /ְ2+2 +@ + +@ + +013!!#!5PP@4P4(8X X/3+2 +@ + +@ + / ְ2 +2 +@  + +@  + +01!5!3!!#PPP4P4X@/32/ +01#53#53X(((XT#/3+2+/ +01#53#53XPPP8@ /ְ22 +01##@((( >>8h #/ְ2+2+ +01##hxxx >>X|/// +01!!5!!XX((8| /ֱ+ +013#3#((x(( 8X| =/ +@ +/ /ֱ 2 +@  +2 +01!!!!@D(P(\8X@ A/3 +@ +2 / ֱ+ +@ + +01!####|(P(@(  8X| H/ +@ +2 / /ֱ+ +@ + 2 +01!#+!!T(P(|(\D(8@| =/ +@ +/  /ְ2 +@ +2 +01#!5!5!5@(|(P(8|@ A/3  +@ +2 /ֱ +@ ++ +01####5|(P(@ (8|| H/ +@ +2/  /ֱ +@ +2+  +01##5!5!(T|4(4(X =// +@ + /ֱ2 +@ +2 +01%3!!!(D\(P(X A/2 +@ +2 /ֱ+ +@ + +01!3333X(P(  X  H // +@ +2 / ֱ+ +@ +2 +0133!!T(TT\((D@ =// +@ + /ְ2 +@ +2 +01%!5!5!5!3@((P(| A/2 +@ +2 /ֱ +@ ++ +01!53333|(P(( |  H / / +@ +2 /ֱ +@ + 2 + +01!53;!5!(P(TT((8X J /  +@ +/ +@ + /ֱ 22 +@ +2 +013!!!!(\(P(\8X  O/ +@ +2 +@ +2 / ֱ+2 +@ + +0133#+3T((P(( ( 8X  _/ 2 +@ +2/ +@ + 2/ֱ+ 22 +@ +2+013##43033!(T(CC((\\(8@ J/ +@ +/   +@ + /ֱ 22 +@ +2 +01#!5!5!5!@( (P(8|  O/ +@ +2 +@ +2 /ְ 2 +@ ++ +01###533|(P(( (8|  \ /  +@  + 2/ +@ + 2/ ְ2  2 +@ +2 ++01#3632##!53|((tMC(4D4(8X| K/3 +@ +/  /ֱ +@ + 2 +@ +2 +01!#!=!X(X(\(P((8X@ N /33 +@ +2 / ֱ  +@ ++ +@ + +01!#####X(P(@(  8X| i/3 22 +@ +2//ֱ 2 +@ +2+ +@ + 2+9015!##5!"0%##654'430X(U(CT(((ww(\̈wX  K// 2 +@ + /ֱ   +@ + 2 +@ +2 +01%!5!%5!3!XX((P(\(X N/ 22 +@ +2 /ֱ +@ ++   +@ + +01!533333X(P((  X  g/ / 3 2 +@ +2/ ֱ  +@  + 2+2 +@ + 2+ 901!!3!53#"565033X|tMC((D̉w(4wT\8X i/ 3 2 +@ +/32 +@ +/ֱ22 22 +@ +2 +@ +2+01!5!3!!!!#!5!((T(\(P(\(8X m/33 22 +@ +2 +@ + 2/ְ2 2 +@ ++ 2 2 +@ ++01###533333##TP((P(( (  ( 8X  /32 +@ + 2/32 +@ +2/ְ222 +@ +2 + 22 2 +@  +2+01##5!0!##033)533(T(((((\\((48X@ / /ֱ +013#"#46ddcQ(g@(Qc,ug8@@  /  /ֱ +012#4&+5dug(Qcd@gu,cQ(@  KXXX /  /ֱ +01"&53;ug(Qcdgu,cQ(8X 6"ʴ,8X 7X""8i  ' 7 C&""&"", 22,@"// +++01!!,@(,@ /ֱ+013#(( ,X@ R,8@, S ,T(/++/ +++01!!,TP,T /ִ+++013#PP ,XT V,8T, W XT/++/ +01!5!5!!,,,(P8T /ִ++ +0133#(P, XT/++/ +01!5!!,,,P(8T /ִ++ +01#3##P(, ,X ./++/ִ+++01!!X 8X/++/+01!!XK}8X2/++/+015!!X28X/++/+015!!X8X,./++/ִ+++01!!X, 8X5++++/ִ+++01!!X8X&/ִ+++01!!X&8X/ִ+++01!!X8X /ִ+++01!!X 8  /ִ+++01!!  8 /ִ+++01!!> 8w /ִ+++01!!w 8, /ִ+++01!!, 8 /ִ + ++013# 8 /ִ+++013# 8K /ִ+++013#KK ,8X /ִ+++01!!,, 8& #'+/37;?CGKOSW[_cgkosw +33<+22#/33 <+22//&*33,<+$(22/33<+ 22;/26338<+0422G/>B33D<+<@22S/JN33P<+HL22_/VZ33\<+TX22k/bf33h<+`d22w/nr33t<+lp22x/#ֳ8Ph$2"<+ 9Qi$2"/+D\t$2.<+E]u$2.+4Ld$2<+5Me$2++@Xp$2*<+AYq$2*+0H`$2<+1Ia$2'+ F$3@<+048<+ m$2>W +$$2V<+%$2V; +h$2:<+ i$2:S + $2R<+!$2R7 +d$26<+e$26O +|$2N<+}$2N3 +`$22<+a$22K +x$2J<+y$2JG +t$2F<+u$2F_ +,$2^<+-$2+01%3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#22d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d2222222222222222222222222222222222222222222222222^222222222222222222222222222222222222222222222222222222222222222222x8X  #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKOSW[_cgkosw{ +P@$3T+RB$2o/.~$3lT+,|$2/VF$3T+TD$2/*zj$3T+(xh$2/2"r$3T+0 p$2/ ZJ$3T+XH$2/6&v$3T+4$t$2/^N$3T+ \L$2/:*z$3T+8(x$2/bR$3T+`P$2/>.~$3T+<,|$2/fV$3T+dT$2/B2$3T+@0$2/j Z$3T+hX$2/F6$3T+D4$2/n^$3T+l \$2/J:$3T+H8$2/"rb$3T+ p`$2/N>$3R+L<$2/&vf$3R+$td$2/A $2T+A $2 +A $2T+A $2o +A hptx|$2nT+A iquy}$2nG +A @HLPTX\`d$2FT+A AIMQUY]ae$2F +A  $(,048<$2T+A !%)-159=$2 +A  $2T+A   $2 +@ $2T+@ $2 +@ $2T+@ $2 +@ x$2~T+@ y$2~W+@ PX\`dhlpt$2VT+@ QY]aeimqu$2V/ +@ (048<@DHL$2.T+@ )159=AEIM$2. +@   $$2T+@  !%$2+013#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#3#'3#3#3#'3#73#'3#73#'3#73#'3#73#'3#73#'3#73#'3#73#(000000000000000000//2000000000000000000//2000000000000000000//3000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//d0020000200002002002002002002002002002002002002002002002//0400000000104000000001B0400000000104000000001B0400000000104000000001B0400000000104000000001B0400000000104000000001t0040b041+0b0b0b0b0b0b0b0b0b0b0b0b0b0c1X /++/+01!!X } 8X /ִ+++013# KK 8,,/ִ+++01!!,, ,8X,/ִ+++01!!,,, ,, /ִ+++01!!, 8X $/ִ++++01!!!,, 8X $/ִ+ ++ +01!!!,,,)8X $/ִ++++01!!!X 8X 0/ִ++/+/+01!!!X ,,X /ִ+++01!!,, 8X $/ִ+ ++ +01!!!!,,,+ 8X 0/ִ++/+/+01!!!,,,2&5++++/ִ+++013!2 2&.+//ֱ+ +013!%!!24\ (2&;J+#3/ ;!2!"'./3!27>75&'./!2 8  ,8 <  (  * }"  ,8  ,<   *  (2& F+/+ / /ֱ++ + +01753!%!!4\}} (2& Q+ / ////ֱ  222  + 222+01!5%!5!!5%!5!!Z\\\\(YKK(KKK(K 2& ]+ 222/ 333/ֱ++ + ++0173##!3##!!KK(KYKK(K (\\\\(2& #'+/37;?C@+6%2225/$3332!2221/ 333> -222=/ ,333;(222:/ *333AD/@ֱ61:=22267+08<222222+222 222+ 222% (,222%&+").222CE+01%353535#35353535#35353535#35#3#35##3!@KKKKKKKKKKKKKKKKKKKKKKKKKKKKKsKKsKKKsKKsKKsKKKsKKsKKsKKKsKKsK(KYKK(K 2& T+ 2/3/ֱ 2 +2+  $9 $901!!5+5%332 'ު\ުx ̥x2& T+ 2/3/ֱ 2 + 2+  $9  $901!#75373& ͥxޥ (ުƪx 2& !$'+v++2'/ 3(,/+ֱ#2+2*-+@  !"&'$9'@ #$%$901%3'5'7'35'7'7'?#'?#'!!E(D}UUUUUUDDDUUUUUUrDD`ED lD`DDUUUUUU9DDEEUUUUUUrD`DaD( 5++++/ִ+++01353.+//ֱ+ +01735#53ת((2&,$++++/+013!2,2&,.+//ֱ+ +013!%!5!24\,("+/ִ+++013!, .+//ֱ+ +013!%3#, (?,$++++/+013!22,?,z+32/32/ +6?+ ..?+ ..........@013!%!7!22:&\,(#5+/+01)5 #5+/+01% ! (N("+ +/ִ++01)7)+/ִ++9901%'!7mAA(jj(T+/+01 5 T+/ֱ+01 %5 y "++/ִ ++01%充 )++/ֱ+9901%'7]n;{@y ++/+01% y[++/ְ22+6K+ .....@901%'%uSCH#5+/+01 5:#5 +//+901! l v:"+ +/ִ++01%'4+//ִ++99901%#7'mAj9+/+019  9+/ֱ+019W    "++/ִ ++01?充)++/ֱ+9901757n@{;^ ++/+017%^_[++/ְ22+6+ .....@90175%HC#5+/+01! ,    #5+/ +01%7' ,  8  #5 + / +01%'77' ,    #5 v+/ + / /ֱ  + ++!+ 9 99999 999 9012#"&467"32654&'2"&546.'9:()9:+_^]Zkܛl:P::R8~]_]\(ڜomY? ++/ +9901 77+Ҝ?&#5 F+/ /ֱ ++  99999901"32654&'2"&546/_^]Zkܛ]_]\(ڜom #5%/7?GQ[en+ +  +l3h2Z/&3U+2?/F3;B2P/03K42/c3^2+o/)ְH2.M2=.)+99/=.#+\2a2+2 2 +f2j2S+22W62AWS+Ep+)9;>99.=+&KP$9AS05UZ$9EWBG99  99 #fk$9\a$999012"&42"&42#"&5462#"&546'"&5462$"&462462"$462"%4632"&4632#"462"&462"&$      R        +            "     X  2    z       b  a  #5 !}+ 2/ 3"/ֱ++   + +#+9 9 9$9012"&54667&'>4&0kܛ'$#P'$$LZ08*01ڜom)@Ch)hCo7`I_l_#5 )%+/ // */'ֱ+  ++#++ %9 $9$9#9 '$9"9012"&46"264&'"32654&'2"&546.2IIhIJ4#32F22 _^]ZkܛJ34IJhH(1#$22F2]_]\(ڜom#5 5++++ /ִ++ +012"&5460kܛڜom#5M +//ִ++ + 9 99 999012654&'2"&546-]Xkܛ>]\(ڜom#5M +//ֱ+ ++ 99  9 99901"32"&46+[]pܛ\]moڜ#5I++/ /ֱ+ + 99 9901!4&#"4632#"&K„]\(mnom ]Xkmn#5I+/ +/ֱ+ + 999  90132654632#"&K\]monm[]pnm#5 F+/ /ֱ ++  999 99901"3267#2"&546/_^]kܛ]_] ڜom#5L++//ֱ+ ++99 990135"4632#"&J^'mnom Zkmn#,"+/ִ+++01!"&5463,ooon,5"+/ִ+++01!2,onoX:+ +/+/ִ:+ +:++01!"32654&Ԙ*:9)(:9XX8R:9)(:XX n+n+ +n+ ++/ִn++++n++ 99999012#"&5467"2654&%!!/V~XY~\pܛeXZY|2monm#,XXI+ n+/ 33 +/ ִ n+ + n++ 99015>32!#!#5.#"K\X#X#gm, Z|}Y , ikX, I+ n+/  +22/ִn+ +n++  99013!33267%!#"&'5##mgX\,, ki Y}|Z# 0 @/  +@ + /ֱ +@ + +9  901##5>73/ X{(hzW g, 9 @/ +@ + /ֱ +@ + +9901'3#5.'-h({X(g Wz,9 B + +@ + /ֱ +@ + +9  901%3>753#- X{(h(zW g#0 B+   +@  + /ֱ +@ + +9 901%#.'53/h({X((g Wz# 5G/  +@ +2/ ֱ++  9 99015.#"#5>32 X\(mg Y}|Z ki #5I+ +@ +2/ֱ  ++ 999013#"&'533267 (gm(\X ik Z|}Y2&+/+01!&  2&+/+01)& 2&+/+013!22&+/+01!2 Q B// /ֱ++ 9999901"2654&'2#"&46-""0""'9:()9:)"""#(:()9:R82&1+//ִ++ +013!'3#2 (2&1+//ֱ++ +01)!#& 4\2&2+ +@ +/ֱ +@ ++017!!Z4(4 2&2+//ֱ +@ ++901!!\(\( 2& ?+ 2/3 /ֱ+   + +013!#332( \\#5 3+ /+/ִ++ 9901%2"&46 !,( (N(#5+/+01%!  (N(#5+/+01%!, (N(XX D+/ /ֱ ++  9999901"32654&'2"&546/mlkgx0lmkj({|}|2& F +/  /3/ ֱ 2 +++017!#!!35Z ( ̾2& F+ 2 ///ֱ 2  ++ +01%3!3!%35#@\4( (2& F+ 2 ///ֱ+   +2+015!35!!5#\ (\42& F+/ / 3 /ֱ+  + 2+01#!5#!#3 ̾\ (#5 r+ // 3/ֱ 2 +  ++ 9 999 9999012"&46#32654&35(pܛX^vPtmoڜ)Vw_Wu#5 r+ 2///ֱ2+   ++9 99 99 99901!"&462'>54&#"35(kܛXWv^XtPڜom)W_wV(Qu#5 r+ 2/ //ֱ ++ 2+ 9999 9 99901!"&5462'53.#"%#>0pܛX^vKPtmoڜ)Vw_Wu#5 r+/ /3/ֱ  ++2+ 99999 99 9012"&5463267#7.'0kܛXWv^XtPڜom)W_wV(Qu2&*+//ִm++9013% !2:^y^2&*+/m+/ֱ+901! 2y^ ^2&+m+/ֱ+01) & :^2&.+//ֱ+ +013!%!!26^ (2&5++++/ִ+++013!2 }K:+=+/=+/ִ=++=+ +017!%!!}^%K^&}K5++++/ִ+++017!}^K^2&+/ִm++01 !& ^  DD#5AS_kwX+^+x++3 +2v/p+Kpv+(3B+12a/63f<2/dִj+Ojd+ 3F+2jl+T2sZ2s:+@+$@:+-+-/3$+2+jO K99FB$9:-1z{$9$(99pK$O99B-F|}$9a{9fz9^x99  9901#"/&54>32%2#".54?6#"/&54>327#"&46;22#".54?65462"&#"&46;25462"&"&=46 * *2 * * * *8< < f * *   < <   5JL55LL * *6 * *| * *   f * *B< <   < < LjLL55L/#5/  +  +++/+99017&54632>322#J#.V?';):<@l*(2 <2k+  +  +//#)333+3/ֱ +4+-9 )999'9/ !'-$9013"&5462326=462>2&#"&#"&#"&#"%+  (  !  !  !  !  3' 2 X`E[[E    $9"@mqw{V+&p+33l22p+3 + 2+++"+++~V +~z{V +z,0V +:K`333,>P[222V +3鰽2 鴯V +3鰹2jfV +5F33jAn22V +3鰒2+3+2/ֱ鰣Y+#鰐2Y# +@Y^ +# 鰥/#c +88c +@8< +8+k2p2 +@h + ~+z22}x22}+n2A2 +@D + 2+I2I +@2. +I) +Sr2S) +@SN +S/St++$9Y$999#[$9a98:?e999Ϭ$9&V5$9}99992+0G999IK9S!Q$9t $9$9~#SY)$9,./?+6+ ,+=7+ '&+ '&&%@ %&'+,..........@ %&'+,..........@01%"/"&54?'&546376272"/#"/7632'&547I  I 53O%' | 6ss6 о  o  P ]^ x%<+ +@ +/ֱ +@ ++990125432#"546;'6  I%  J Z+n+ + +@ +//ֱ +@ ++  +@ + +99999015432#"546;'7!"&5!2  I    J  + #5 v+/+ / /ֱ  +++!+ 9 99999 999 901$463""32654&'2"&546_^]Zkܛ  ]_]\(ڜom2& 2&E++//ֱ++999013!%!!4>32632#'&24\   K  !\ ( u4 2&/J+*+3/0/ֱ+1+ 99*-99013!%!!2#"/#".54?'&54>327624\h     ((    q"2#/ ְ22 +22$+ 901&54632632#"' #"&547      &S  5   5  . '1;EOeP+ZZP +Za + +2+882+$$L FiPF +msy333i+.i+(2&#"&#"&#"&#"Q  F n   < n T%+  (  !  !  !  !    Z  n  P    t    d  3' 2 X`E[[E    &&O+ /+//ֱ +/3+999013&547#"&463!53#5#"&547&54P$I!#$f!$\4 $D( ($" 4 22M+/+/ /ֱ +2!+9 9901#37+#3!2+PP$!f$#!I\ 4 "$((!"$ 4&&%-5=++ + /<73 +7&. +&$  +(3$/>/ ֱ""+,,+:1:+/1:=+'4$2+?+,9197<939.9&9 9$ 9013&547#"&463!53#5#"&547&547!"3!35#"";5#";P$I!#$f!$ $ ) d d\4 $D( ($" 4 _7(7_2& 2'@22'/7?+ + /982 +8(1 +(!/ +3!/@/ֱ+9 (1$29=+ 6 =+ ,+%+A+ 69,989 92919(9/901#37+#3!2+'!264&#3264&+#3264&3264&#PP$!f$#!I$ ܤ d \ 4 "$((!"$ 47_7_78, 8(@P`?m+/8322/03"*2" +@"' +@/ ֲ#222)19222 +@= +@6 +  +@ +@  +A+01%"/"&='&546325#"&46;5#"&46;546232+32+T  h T X X  X X h \1 < 1  T  N N  T  < FoHQ+P35/ 39%/222=/F333A2 /IR/-ְ2( I22-( +@- +(M+ S+M(9=9 '.H$9I 9901#"54;2+7#"54;2+32+"54;'#"&=32+"54;7'#"54;2+732654&+6RksXe`Z p-r u0q [^)hD[R>wFMOZm n[8217P`+i)+/$32 /32 +@ +,/+ֱ22&22&+ +@&" +@& ++& +@+ +@+ +-+01#"&46;5#"&46;546232+32+"&5 X X  X X   Z  T  N N  T   :;5+:.2/,32 +@ +(2 +@ +"2/3/2BG/.=`pܛ  6  \(58TEI-](moڜ2& ,++/+/ + / +0135!%5!%5!2  dddddd2& 2+ + / +/3+2/+0153%#55!%5!^ ddddd dddd2& 2++ /3 +2 / +/+0135!'53%#=!2dddddddddd2& `++/3+ 2/3+2/ֱ22  +2 +2  +22+0153%#553%#55!^,dddddddddddd2& 2+3+2/+ / +/+017#553!5!5,  dddddddddd2& `+3+ 2/+/3+2/ֱ22  +2 +2  +22+0153%#553%#=!^,ddddd dddddddd2& `+3+2 / 3+2/+/ֱ 22 + 2+2 + 22+01%3+5373+53'!!^ddd dddddd2& j+3+2/3+ 2/3+2/ֱ22 + 22+22 + 22+0153%#553%#553%#5^,,ddddddddddddddd N* [agmsy"H/A3~2H +@HE +V/3bn333[-\h222x/3 2x +@ +/Uְ 2b\2Ub +@UY +bG+w222B}222Bn+h24-24n +@41 ++bU T99G@JPSa]_degtu$9B99n@ (+69kqz$94,599H@I99V@ +899'-3$9#  799-69 %*05:$9017"5462#"'."&463"6463"'"32654&'2"&546TzT ;T<Q_^]Zkܛ->>- &&    ]_]\(ڜom#5&2<8+-/ + + 2 /3'/3=/:ֱ**+ ++  # +/#+ 0+6>+899'-3$9# 799 %*056:$90172267632"&546463"6463"'"32654&'2"&546>-^    ]_]\(ڜom#5&0,++/ 3U+ 2 +@ +/%3'+1/.ִ++++*+2+,$9'99 "+$9*9.9)9017"2654#"#"&'.3>4&'"3>4&'"'2"&546\\A./A%  Ikܛ1DD1 )*0! 0 !0! 0 {ڜom DD#5AS_kw6X+^++3 +2 xv/p+}/鰏B 13K+(2a/63f<2/dִj+j+鰌F O+O/ 3F+2l+T2sZ2s+{- 3$+2{:+@++jO K99FB99{-199$:(99pK$O99B}-F99a{9fz9x99 ^ 9901#"/&54>32%2#".54?6#"/&54>327#"&46;22#".54?65462"&#"&46;25462"&"&=4654&#26 * *2 * * * *8< < f * *   < <   >XY??YZB,/CA/.B * *6 * *| * *   f * *B< <   < < Y~YY??Y-B?./BAI#9/++$/ ֱ""+%+9901%#"567>4&'&'432>54.'Ԟ&GPPG&BUC/0EW?jCDk=*97I#G!/++$/ֱ+ +@ +2%+! 9901.464632#"&BUC/0EW?jCDk=*9햹 44 v A1++"+ +@ +251 /,3:&2<1 +<%2B/?ֱ +3+;2.%2.3 +@.* +3. +@38 +.+""+/C+3 99.99999"?99 9901"32654&'.543226763232+"&=#"&46;5.546.2DRvTTtT   x2@KkkLKj(Bh3+'+ +#+/+ +324/ֱ,0U+,$+$ +@$ ++ 22 +@ +5+,29$0'9999 "299'901>32356732+"=#"&54>54&#"#"W29=Y ( & ($ &=FG:ou    14X0+2- 8>g; +%+4/, /!32 +@ +7632#"'.'##"&5467"32654&Z <7 gg :; Z(f 2C bb 7< f*>J0-M<(31 34|:^2 eXX^  /Z>bb>L=  Rcc[ 2^:G+-MH2/A &1"!165:ga + /32/`30F2b/ֱ.. +022E`22 +@@ +@ +  +@  +H+]]H +@]X +c+."9 '699;9HO9]ST9901%2+"=#"&46;5.=#"&54?632#"/5"&54?632#"'6=#"&54?62"' }(w wXl 7 7   7 7   87 mV  ii  UP 88 y 88  u 88 PUVm -_+ '+( +./ ֱ '2 +@  + !+/+! 9'(9901%2#!"&546;:#4.#2>  %&F(:!(77]A53/WN@CMX-(  E  %2,A' (86Xo)k+ +'32*/ֱ  +$+++ 999$9 9  $901"&54&#"#"54632632#"5654&#"?  J56:QF;>5_BW@1)V` W\J8-IaLMbG.6L:h 8n+ /29/"ְ(2 /2 " + , + +422 +7 +:+ %999 "992%9901%2>54&"2#".5467.54322654&54-2M)rss-AHAH)8J0<]1 J@DGus,9(VopUVgRB,7nL/ֱ99 +@ +29=+= +@ +2?+=9& 99 99;9=$9&648$901#".#"#"54>7.5463232>7632#"'632X4>v`26d2=0U'-T+ +9m>. *- 5 &.**56RU G88#+(4 r 1+  ")"%  Wd -9Z&+& + +?+S?S +?: +D+3.2J4&D +3J2[/Mְ,2117+GG+  +!Y2\+1M 97ADJ$9G&?S$9 <$9!:94J9.!GM$9DA901%2654&#"23267#"&54632#".547"32654&%".#">32#"&54>3231 34V"2Y8j,NJ01J9`j<2^?1z31 34#,gE*.LJ0-N'=VU01]@11"!165V! `W L/-ML.YC #1"!165V"K0-MI1GlA(J:9D +-7/"3:2:7 +: +?/E/ֱBB +//=+44%+*++F+=/27?$9%4 -99*"($9?:%4$99- (2$9014632.546323265462#"&54>54&#"#"&264&#"A7# B,kuw-6-0 "-  E20H-5-kb-5-A67Ax&))& /(4DOJ)nn,Z@X*1*% 6AI./`BS$YrGAk;4CD+H+-"!->Xi]j+3%+ f333*49?222k/!ֱ+  +iic+Bl+!019949 799[$9i<99c?HXP$9%0177&54&""&54.#""&54&#"&4632>32632>32#".'#"&7>54&#"/?$:%   "     $ %!C))  <- /#    Q %-&<1(36JJ6V '(B>V ,T  "#>#%V`S^uOY+ ? .WdZFtjX$U 0q+ +', +3'21/-ֱ!-! +@-* +!+ +@ +2+! 9,'#99!99017!2#!"&46232+"=654&"+"&46;546+ CZw Aj@  z\(   \e  OHJM  _bWhPA+33F:+%+ 33*/522/<< +@N +Q/!ֱ++99P+KPK +@PD +R+!,9/92959P9@99<9A9F!9$9% ",28$901#"&54#""&54.#""&54&#"&4632>32>3232>7#"&46;2"&5/(&*4"  8   + # #$  #1% $: o  % >;@@T (3%T 6J  7 "#YOT"0 %  o V[+0/ +@ +,/ֱ  +@ +-+017#"&546;2"&="/#"&54?'&562c       d      S]2B+9+ 233+?C/ֱ33<+D+6+ 2.0  +0102+102 #9 9 01.....2 01......@3(99<+$9 9?9!$$9(9+901"&463!2632#"&547"&54767>732654&#" ! M8K #jlK\xYSby ' /&9>Qm]&55   1&vo`ov=6*n - ;T(ZL[d;Q8qC+9O33Zd2ZC +Zm ++&32HUC +_3H>2! C +33!+2! +!4 +r/Rְ2J2Jg+.2o62s+JRO99g9U$9o4m99ZCM9H3232654&54632".#"#".#"#"&5463232>3232654&54632(  .(5 9$)#*&  :#(  .(5 9$)#*&  :/9//9/1:1q CU0;0/8//8/8  ,@A/9//9/1:1q CU0;0/8//8/8  ,@AQq;+83 /033*22 +@ +#27#"&54>7#":!$7u7$!*D,=$9=< -25)=,D+A##A+B=+%=26X7.M01'6 +=,,@:n+ +3=+/25 +;/ִ=+,+=+<+, !)/$95!&)$9, 38$901.'.5463267632">54&#"#".'&-CY2#F3E) )92H,9(3!+3  7=9&.+3'   / =qtAI&4F=$-.E0.\G:+=:D-!'UIJQ'*..'"=TD  ++/+ 9901&'67>7.+/:=80||0j.%xC'3B1l,WV(4(J:8 + %+2'+ ' +13+729/$ִ)+)$+%+/%+ +@ +@4 + +@ +:+$!&99)'-99"+$9'$)9901%!5>7#"&54632&5462>32#"7 &8$z$9%  A4JC0 KjK   0CJ4Y/%&/# M55J-)3HH3)- J55MHC !K@+,/=+-%+*27/J3=+2L/:ִ=++G=+M+:,-99@  (/57=DJ$9G*+99-(09979@@ "5:=DG$901%3&'3254.'3263!527>7#"&54>7#".  !@Z+0:82-0*E!$7u7$!*D,=$9=< -25)=,Dm $OP(#(G.,E'$*&*O-+A##A+B=+%=26X7.M01'6 +=,,?! ++3/+ 901>32.'.54632-H,2H+CE? CY2#F3a=9E0,\UWm6=qtAI&4FQD ++ / +01&'6(/:=C'3B1lJ: 5v@+@+A%+>2b+!S1@b +3Sr2Y+@b +3Yl2w/Vֱ.._+##I+6%+6I +@6? +I6 +@I@ +6+dd+ox+_.+1SY$9#\]99I!)KOa$96 999  b$9dfh99lr$9S91N9+ )6IKo$9Y]f999!#_d$901%3.'32654&#">54&"&#"32>!5>7"#"&54632&5462>32#".. N  g.>6,Y,V,  ]",6>.+# &8$z$8&   4JC0 KjK   0CJ47!c  _3-+' (! /;;/%#'+-3(#9(( M55J-)3HH3)- J55M"6@N++ +/ִ +/ +/+99013"&54632462'15#  4$%  !@$_++ +%/ֱ"2" +/"+&+9"99 !99013"&54632462"&54.''15#  !((!  "*:4$%  '"2(G/ 4G*!6<+++++/ֱ   +/ + +/+999999 99901"&54632%#"&54632'15#4$'15#R4$% 'a!$% R!6<+++++ /ֱ 2  +/ +2 +/!+999999 $901"&546325%#"&546325%'15#4$'15#R4$% a!$% R!aMam| P+/ +@ +/ֱ  2 + + 9 999014&#">>32462:H!& 5k\%TO  '@9@amMMh xY[ + /ֱ  22 + 2222 +6 + .  + . .   .......@01#53%++=+7m793=V\R /ֳ$2$2 +@ +222+$2 $2 +@ + 222!+6 + .. + . .   + + + +  +  +++++++ +++ +@ ........................@01575375377#5#5577YY++YYYY++YY+W(!((!(>!8J X +=++ =+ ++/ ִ=+++ +=++016462"!!!&&< |&&ZzJt+=++=+ ++  + +/ִ=+ + + +++=++01$462"&462"!!!f&&&&]< |b&&&&ZzJ+=++=+  ++ ++ ++ /ִ=+++++ + + +=+!+01$462"462"&462"!!!&&L&&&&]< |&&S&&&&ZzJ#'!+'=+&+"=+!" +3+2!" + 3+2(/!ִ'=+'+2+2+ 2+2$+ =+)+016"&4626"&462462"&462"!!!&&&&@&&&&]< |&&&&&&&&ZzJ'+/)+/=+.+*=+ )* +3 +2)* ++#')* +3#+20/)ִ/=+/ + 2 +$2 +++2+2,+(=+1+016462""&4626"&462462"&462"!!!&&"&&&&@&&&&]< |&&5&&&&&&&&ZzJ'/371+7=+6+2=+12 +"3+&2 12 +3+2+/12 +3++28/1ִ7=+7+(22+ ,22!+22%+22%4+0=+9+01$462"&462""&4626"&462462"&462"!!!g&&&&@&&&&@&&&&_< |&&&&0&&&&&&&&ZzSE+ +@ ++/ֱ   +@  +@  ++ 901$#!"'&542632!S!(L(( l!! #5&  Sp 5+ 2 +@ +/ֱ   +@  ++01$#!"43!42!S((((6P8(+ + +$ +)/ֱ  +''!+22*+' 99!999 99$ $9012"&463!2#!"&5463!2#!"2654&#"B\Z]]n}|o2DF0/FE\\\\7΍(vw(D12DDdCP8 5U8UJ// /ְ2$++$+2!+9999 99012#"&54?654'.54Rm+P+H1Rm+P+H1\LTSJs5 \LSSKs6 UM// /ְ2 $+ +$+2!+ 99 $999014632#"54>7654/&mR1H+P+mR1H+P+\  6sKSSL\  5sJST-+2#y X' 3D%u/ /&/ֱ + +#2'+6<%+   .... ....@ 99 9901#"&547632"&46;2+";2# yHPPH97;5S   |bcH76L 3D :OD[YG /3 2 +@  + +@  +/ְ22 +@ ++01+#"5#"4;43230(c(cMVC /  +@  +/ֱ +@ + +@ ++ 9014.543!2#!#"54>s & q-V<.(nwI~#5"y+ -+K 9X@HM +2 +@ +22/ֱ+++ 901%26=42#"&=42342@_(x|(^()e|fYn =// +/ִ++ +@ ++01#!"43!422#"&54I(,(IL.Yn A5XR-XV/3  /2/ ֱ++ 99$9 $9017'#"4;5#"43'75gggnnXwwww((;{<;{R-X C@RIXd/ 32/32 /ֱ+!+ 99 $9 99 $901?'%32+'#"4;5#"4;732+nnPnn(>>>>>>>>@;@;(ww((ww( I6// // ְ2++01%#!"=#"4;543!2!Invv(([q I FR\ B+ 3/2/ֱ+ +@ + 2+0132#!!2+3Ebb(^^Sz\ B+3 / 2/ֱ +@ +2++01#"543!!"5433b^S(z}[2 #&' 6   >[  df}["547 &547563    >y AC -+[2 #&' 6'2 #&' 6   >   >[  df  df-+[%"547 &547563 "547 &547563 ?   >   >y AC  AC 0O/g/ + +&/*m+2&* +@&" +/0/ֱ + +1+&-$9*99012#"&54323264&#">32#".'&5432>cdc32#"'.5432.#"32>32#"&54632>11:oMRrrR%D*n>cb^-* ,% %, 'Kgrr 1x}_a _^X{|}|__XX "R+/#/ֱ+$+@  "$9 !$9012"&5467&#"7327'654'1x-H\ag?=IaaI=@X{|}|e=YI``H@@I^`J+-& y(0'y//3!2! +@ +! +@!% +(/ֱ+"22 +@ + +@ ++ )+9901332653#"&5%32+#"=#"4;5432(+z^\~+ginnnn[jlYef4([[(f(0 3 +3 /2/ ֱ  +2+010!0"5!"5((H(z^(0 ;+3 + + 2/ְ2 ++010!042!420((^Eq + / ֱ+ + $901%5'?'S显ded|S332R3?+!B+m+ +@ ++"/ֱ +@ +#+9017'&54?'&547637#"'&'"?7_   e2_ 3b?+a@?,a@@+a"G F@*.4/ + +@ + +@ +/+ 901#!#"/7632!2.  F^fE@fE@?+7'&54?0'&547637#"&'"_ 2_ >+i@?+i@?+i"G6+ 3/  + +@ +2/+ 99017#"/7632354632#"=    5mF@2& 2&@2& &@2& 2&@2& &@#5+/+01%7' ,  8&  #5sX#5s#5@#5s5@WX5++++/ִ+++013!VXWX.+//ֱ+ +013!%!!VX("h./++/ִ+++0153x"}}"h,///ֱ+ +0135#53(((xJ-U}}R0%!&&q[R0 o /32 / +6D+ .<+ ..... ........@01!'%!5^1_&&qJ"+-E <++ /ֱ   + + 99 9901%%'7-ؕ(||#%O+/+01%%%ؕ(%M'!!Mו)&XX 5++++ /ִ++ +012"&5461xX{|}|Y++/+01!'7,Y ++/ +9901%7''7,8x+/+01'+x+/ +01'77+}}~񤤭LM /+/ִ++01%'7.L~QB / +/ִ ++01'+WWUBs~~N?4/ +/ִ + +999901'77+WWUU ?s~~11::D>{D@D>|D@N&&!J'y#ry#c"%#"&547%632'#"&547%632  \    \          {>b/H&j\5&~a\'y a\O\&ya\' ~ \&  F'yLJ'yJ'yLy .IF@/N@2&'y80'y0'yh'yy0|A)$+)++$ ++$+*/ֱ  +'+!++++999 99901#"=&#"#"=.546322+"&463D=>PMX^GbP(?> D)"?2+E%D),L8EUA,,Q 6jvwG @S/ ִ+++01#"'4&54632RL_ OS'/ +/ִ+++01#"/&54632RL S.+ / /ֱ+!+01;26=4&+"+"&=46;2|!!!!(55((55(X###D55DD55DS,3h+,-22/%// +@ +4/ ְ2)2)0+2#25+0)-992,9017632+"&=463!54&+"#"546;2!";254#"YR?;\6''6,!!+26'!!];Q*)).[4E+D3?""804EW"M"4,S9+/ֱ ++9 99901!&546323632  wSS-4|+'12//-//5/ְ2$2$ +@$ +$4+ 2!26+4$(199/'#9- 9"9 901%+"&=%54&+"32+546;2;>3#"325*26'!!Dm'66'w!) 1;QQ+L;H804E ""-E44E " 6!)^4S8%a+ /#/ +@ +&/ֱ 2  +@ + + +@! +'+ 9014&+"32+4326;2#"54326!NT;d6l6'13!`"^X0F4EhK.SD+/ + +/ֱ +@ ++ +013#"&=463!#"=!";2D6''6U!!=4EE4h?""S *x+3("//   +@  ++/ֱ 2+%%*+2,+ 99*%9"( 99 9017#"543232#"&546;54&+!#"325|j6''6*.3%4!T`444EE45-"2"?S2P+)"/.323/ֱ&& +& +&-+2- +-1 +24+0135#"54?632+"&=46;2+";265#"54,!  =  (55('6]V!!!,˜!  =  D55DD4"""1S8+ +@ + +/ֱ  ++01%+"&5432;26=432'66'!!yE44E3""S1P+ /3122/"ֱ02" + ++2 +  +  +3+012+;26=4&+"54;2+"&54632#"/,!!!V]6'(55( =  !"""4DD55D =  !S(.+3-!2 /&32  +@  +//ְ2- 2-.+22"+" +@" +0+.-9"9 -()$9013#546?54#"#"54632732#"54;4&+3%>%!3NIj6']4!RZ)BP4(03[L9#8/ak4E1"=b+ S *P+ / /)%/+/ְ2(2 +@ + +!2,+0172+;26=!546;2+"&=%4&+"!P!!w'66''66'!!`)""UE44EE44EA""=S!t+32/!/  ! +@ +"/ֱ 2 +@ ++2 +@ +#+ 99! 901732+432732#"54;5!7!54&+|;dq6'd;#=![)4E|)"S-R+ /*//$./ ֱ  +2(2+/,3/+01354&+";26=#"54;+"&=46;2#"54P!!!!Py'66''66'y7#""""$32#"'32+574&'#"&46;2#"54;4&+"3$$<+"//"2]:4))46']4!!!$$"/D/-2n24E1"F).g+!3%2*/ / +@ +//ְ2.2.+/.(+ 2( +@(# +0+013"54;5463!54&+"#"546;2#"54326=!"H '6,!!+26'13!!yE4?""804EK.""S84{++)/5/ ֱ%2 +@ ++,, +@ +6+)/$9,2929&,/999)#901!#"54;'&54632654&#"32#"&5432>32y 6deXMV!7-W0]MB X C36VhY",M)$)\Y>O Z S8Cu++ A/17/;///"D/ְ2.22+2.5+2=&25= +@59 +E+ +-90132+;26=4&+"32+546;2+"';26=#"54;#!"&SyP!!!!Py'66''6 En$00$Z#""""$00S 3+*3/ $/ /22 +@2/ +4/,ֱ(2(+ + 25+(,/9$99 !99 999 '9$901%#"3257#"'%632#"&546;.#"#"543224) `P@L2(5*26&* c7,c! v| ?`T"K5D57+!/1>"}fSS8;/+ 9/5//%/S(+^+)!/3 2,/ֱ%% +% +%+ + +-+%)*99!)+9901%6=4&+"54;2+"&=46;2+"73'!5((55((5!ss1*#5DD55DD5#+ SSS8S-e+#3(2/3 2./ ֱ + ++)+#)# +@)& +/+9901"+"&532+;26=46;2#"54;4&#/C46'd;!/C46'd;!$A84EI"$A84E1"S8J+3"26/C@/:/*3.2K/9ְ2@ 2@9 +@@ +@@= +@+G+&22G2 +G, +L+H99901!"&=4&+"32#"&=46;2;26=4&#"5432+"&=32+;26=#4C/!!7-'64C/!!7-'66'yP!!8A$"",ME48A$"",MjE4/D"# "l SS8C{+8//>/B'/+1/!D/ְ242 +@ ++,<22%2@+@/)3E+8901#!"&=32+;26=+"&=46;2#"54;54&+";26=#"54;$00$nE 6''66'yP!!!!PyZ>00>& r 4EE44E<$""""#S8 &w+ +@ +/  /!'/ֱ!2%++2  +@ +(+99!"$9017;5432#"543265#"&53'>=|!R04!j6'B5"iK."a4EIzOOQS#I +/$/ ְ22 +@ ++%+99015373+"&=32+;267'#"S--(55(yP!!2llD55DA)"#.rqcS#n+!3 +@ +//$/ְ22 +@ +@ + +!%+ "99 #9901732+34&+"32+546;2#|;d-\!!Py(55(0)w""*D55DS:+ //7'/+1/!;/ְ242 +@9 + +,2%2 + /)3<+ 799 99791+499017";26=#"54;+"&547.546;2#"54;54&+"32n!!Py'66'?'66'yP!!87h# ")AE44EK$*E44EA)" #4%S$i +32/3#2%/ֱ + + +2 +@  + ! +&+  9 901%#"54326=#"&532+;5#"54;-7!j6'yP!RPyyM,"4EI"WS *_ +&//+/ ְ2#2# +@# +#*+2,+& "99!990132+"&=%54&+"32+546 ;2656''66'!!Py'b!!4EE44E "")AE4 ""S%I+%// &/ֱ"+'+"99#9901%+"&=46;2'&+"26%;26="(55((55(7WhW!!HyD55DD55DA5FF##pD1++++/ִ++01462"#m#"'%&54632| -_`'m/3 +/ 901"&54?62"'ԅ    C\  dd  Gam// +@ +2/ֱ  +01+"&=3;26=$0r0$)dm>00>%%Gam&&8)M++/   +@  +/ֱ +@ + + 901%";26=3+"&546$.B()#16VU)).'&>0A;<98)&S +/+0162>32".54632\M(" +2 2 > +  +@ # +2A+01"&#"354632#"&#"32+32#!"54;#"54;546323*'?,D 3'HHHSMM?," r22%;;5K 2%;O;5K OM\$(v+ %22 +  +  ++3&2)/ ְ2(#2( +( + ( +@  +(%+% +@ +*+0132#!"54;#"54;54632#"&#"#KSMM?,D 3'O;5K 2%;OG \%k+ 22++3#2&/ ְ2%2% +@%! + % +@ +%+ +@ +'+0132#!"54;#"54;5463#"32+MtSMM?,XX&HH\O;5K 2%;G\:> +<222$+63-2$ +$3 +++(33;22?/ְ2<'2< +< +< +@ +<=+)292= +0 ++ +@ +@+01%#32#!"54;#"54;54632#"&#"354632#"&#"3؄+B<=VJJ'HSMM?,5)||;., X?`2%MO;5K4k3A sI't.+ + + 2/+  ++0143232>32#"& B&E,)I`.56Zq'<$+$ 22/33 22%/&+6+ . .  ?+ ... ........@017#"&546;3>7#"&546;#!"&5463B] I8 %""V ( AR )  I3*  TP  D1++3# /22/+ְ2##+ +@#' +# +2  +  +3+#+9 /$99#+9 /$99014632>=#"&546;#"'32+5467'& [:L5 ^Q:  8I5 ^Q: D,~  :Qp  +I,~  9SrD8+/3/ֱ +@ + +@ ++01!"&5463!2+#"&5{  Y     ] D &@+ 3!/'/ֱ+ +$ +(+!90174632#"&!2#"&5.'.#!"&5467   {JW   $&   PW %&%  D%. +/%&/ֱ + +'+012#!"&5463!2>=.'.#!"&5463'- MS u%&(  &% #>)NY  (&%%'  Di?+ / +@ +/ ֱ ++ 9901!"&54?>=!54632!0    +  ~ u-+DD +/3/ ֱ  +@  ++ +901!4#72!4?#"&5463h~*K h~))*K  D*+// ֱ  +  ++01!2#"&54#!"&546({JW  ~ PW %~  D$S+3/ 3$%/ֱ + +@! + +&+ 9 9012#"&5.++"&546;>7#"&5463  =@|+ $0)Z  %A=˂  !65  H>/ 2 +@ +/ֱ   +@  + +@ ++01"54;543232#c3BW&1:W&3BW&&i1:W&&i<&<8&<'<0&&2<&<&@&ۤ&ۢ& @&۔V<8&<&<i& 0<&&<&<8&f,<&g42&۪18&<&3:&i&,@W&<0E&<E&<E&<i"V+/#/ֱ+2 + +$+ 99 99901%#"'&=4632>=#"&546; I  :?5 ^|   8,~  d6|dX&J(80n(8X&pK8&pL8X&pM(80q(8X&kK8&Lk8X&Mk(80s(8X&mK8&mL8X&mM(0m(X'o.K^&o؈LX&o؈M(0r(X'l8K'ljLX'ljM(0l(X'qK'qLX'qM(D(X'hP&hNX&hO(D(X'lP&lNX&lO=86w=8X6'p8&p8X&p=86v=8X6'gf&gfX&g=86y=8X6'k8&k8X&k=86z=8X6'm8&m8X&mf&g#fX&g&f#X&f&h#X&h0'q#X0'qa9&h%a9X&ha9'q%a9X&q(0F(XFF+ 22 +@  ++/ֱ +@ ++ 9901357632!6763203(& &A T;n nW. (F +3 2+/+0132#0!5!&'67632G w(]^d XF(0F(XF&AIF&IBXF&CI(80F&@&Ip(8XF&A&I p8F&B&Ip8XF&C&Ip0|'fjxDX|'fjxE|'fVxFX|'fVxGeNeNX q+ +@ +/!/ ֱ  ++2 +@ +"+9999 9901%3##"&=76323265432~~mMPk W? R "!DJ& "o*@' ((#">#R + +$/ֱ""+%+"9$9 9 901%#"'+5327&5463265465,84/3,&*1(DS99#$*@'1*(#">9J& "/ R "!X'`+3 2+ (/%ֱ+)+%#9 $999 9  901765732654'3##"'+5327&5469#$l9C84-,&*1(D> R "!DJ& "o*@' ((#">(X%A+3/ n+ + +/+99 901%0!5>7>32#"'&#"X[.z((('"1X#+3 +@ +/+01%0!567620Xqz(((% (X'Hj`1X'Hja^ ./++ /ִ++ +012"&546, )))*+)) *b^d&dFdffJ&dF&dPd8hJhX8jK.d32#"'#"4;5Q:6,^9()"/2/ g v(%!% 8 #/%+! 3%+/%+/#%+$/"ִ%+2" +@" +"+ +%+%+ $9! 99901"32654&'2+>32#"'#"4;5\:6,^9()"/2W/ ? N(%!% (0J'h~7(XJ'h~&hFBX&hFCe8'C<e8X'C e8'H<e8X'H e8'c<e8X'c e8'C'H<e8'hV<e8X'hV e8!,r +(/ + +/"/-/ ֱ%%+*2 +@ +.+% !$9( 9" 9901"54;6=#"&4632#"&54632327'"3264& &77&'6}[> .^0c6J55'UWj >*e8X$/+ ++/"" +" +/%/0/ ֱ((+-22 +@ + +@ +1+( $$9+9% (-$901"54;6=#"&46323##"&54632327'"3264& &77&'6z^> .^0c6J55'&([m >*e8'N<e8X'N (80<8sd'd'd8&pL8X&pMALXMdp:N N,)5%R(: f&gLfX&gM]?X&4?G @&XU++ +@ +/+++01%#"'&5463223XJ;     (() 8A BX &B4Lm CX &C48D8X(&D4YEX&E4jFX&4X&G ] X &He8e8X'H 8G8XE&Idp32#"&5467#"43!2+";#"&=432D*H'! 4T,r:2X|1M* A3?X &  ', u?j!($3?-YwF.<(V=D '+/3 /+9011052>7#"4;2+"7rIE +&MGPs)'.1( %54%X-+3 2/3 /!+901%#"&54352>7#"4;2+"Xt 7rIE +&MGPs(( ()'.1( %54%=8"=8X&d&dX&d#XE+32 // ֱ +@ +  +@  +@  ++01%0!"&54;4&+"&546;2XB E8$ *C^(( Fm  W$X&da9%a9XL+ +@ ++/ + +/ֱ2 +@ ++01%##"&54632326=42Xz^> .Kd((([l VJa9&a9X&d2X'X0+3%22 +@ +@# +,2+/U+1/ֱ ++2 +%%)+.22+ 9999.)0901%0!"&=7632326=432354232654632X^~] G0.Cu(.  ((:BB:;M M-$)(%~Vtt(R X!H+ 22 +@ +@ +/ֱ  +++01%#!535432354232654632!9u(. LD(VVtt(R Xn+ 222 +@ +@ +2/ֱ  2 +@ +  ++ +@ ++901%!5354320354232654632Xu(.  (((VVtt(R X!X(X'hV'hVX'hVX)X*6+-+3+2+ +@+ ++ /U+3/%7/ ֱ  ++!+220+(28+9 9990%99(*93+ "(0$901%##"'"&=7632326=432>32!32654&#"X8(HZ^~] G0.C_02CZI)*,"'c((:BB:;M M-$)(%~(D>2#+"(N. k+2+ +@ +/ !/ֱ22 +@ ++ "+ 99 9990174320>32#"'#5;32654&#"_02CD9HZ)ZI)*,"'c~(D>26?(+"(N.X$+322+ +@ +!/ %/ֱ22 +@ ++   +@  +&+ 999 9! 9990174320>323##"'#5;32654&#"_02C(HZ)ZI)*,"'c~(D>2#((+"(N.X*X'd&dX&d\4+\X4(+3 !22+# + +)/ ֱ!2! +! + ! +@ +!&+& +@ +*+&!9999# 9 &99901%##"'#"54;32+>32'"32654&X(NT_6X/_02Ch'cZI)*,(( ^(D>2#N.+"(4"x+22++  +#/ֱ 2 + + +@ + +$+ 99  99901150332+>32#"'7"32654&X/_02CD9NT'cZI)*,( ^(D>26?N.+"(X4&+322+!+   +'/ֱ 2 + + +@ +$+$ +@ +(+$ 9999 $9990115332+>323##""32654&X/_02Cr(&`'cZI)*,( ^(D>2#(N.+"(\4,\X4&dP4&dPX4&dP8-8R+2 //ֱ +@ + + +@ ++9 901153&546;2+";2#!aI8JDP0(/1@+ *(X1 +3 2/ִ++99901%#"&'+53267.546323X(CY42J ,&% 6#((("$&('%% 0.%")8.8&d&dX&d(05(X'dP&Nd X&Od eHP6eHXP&1;E+&+-/U+ + +'/"7/@32+<2F/ ֱ  + +* 9+5+*+/2%2 +@ +?+C+C/?+G+ 9 99*267$9C5"'-$9<@A999-9'& */$901%##"&=7632326=#"&4632'"3264&'2"&54632"&546X~nLOl W?+*> +=+ +$ +C/,ֱ1,1 +@,* +1+=+ + +!2 +@ +D+1,459999599>8901"327632#"&54?&54632#"'&!57632!&'&546323   ?( 2''  @& & 7$ (' (;n n55 FBXF +32 +/+0130!5!&'67632G w((]^d PO48POX4"w+"+!/#/ ֱ  ++!2 +@ + +$+ 999" 99! 9901%##"&=7632326532+XlMPk W?R(<.((("$&(;8l3B8J98XG+ +@ ++ +@ +/ֱ   +@  ++01%##"/"&5'&5432X  \   }((  h ,#   \+ +/!/ֱ+"+ 9 99 9$90174632#"'+532>732654&#"7&'67&2"@}}$)P%53'&5)(  X)h+ 3 2+!'/*/ֱ$+++9$99!99'$$90174632;#"'#"'+532>732654&#"7&'6$}}?"22"@}}$)P%53'  ())(  eN:eNXn'djQ^&dLX&dMX&N +"+ +@ +'/ֱ+2(+"99%901%;#"'#"&54>7432&=32654h 5;@3.-6J6^  E.5"F)A(4$ +3&-&   ^8X%1 +33&22/./2/ ֱ22&022  +@ +"++22" +@ +3+"$9  99.9901%!#"547#53&5432#32654.'3>54&#"X%2*``*2%B:,$:(()");l4(((4l;)")(-1@!#@#!@1e8<e8X(y++$/ + +/)/ֱ!!+&22 +@ +*+!99$9!&$901%##"&54632326=#"&4632'"3264&Xz^> .Kc&77&'6](([m VJ6J55'&Y*dp=<8X'g f&gLfX&gM@&G@0&G^ &HI0 &Hd8G&II80E&IdG!*|+% +++/!ִ<++%#+2% + +(U+(/U+,+(%"$9% "$9012+6=42+467.53254&0(N5,6;=F=17%,BvP/4w_9%Z(8 &,9^.)CJh;y!I',I0E4&+3+23+ + +@ +5/ ִ<+ +@ + +0+0 +@ +0 +@0) +6+0,9"9+"0999 149901#"'.532+3;2+"&5+"&54;2>=42  HPb0.1 , **D{4c P.c=(  3|?l7*SQ3 >> e8<v/-yT/%2 o)-/+.//+0132=63232=>54&#"";264&# D=>PMX^GbP(?> E%D)"?2+E%D),L8EUA,,FFj3?+3+/ֱ2+2 +990154&+'32#"=%#"5%YE)jrqN)coo|3 ` ++ + / ֱ2+2 2!+9 9990132+32654&+4&+326|Kte/8H)kBd\9|f@ml9n3U54&'#"5432KqoQ`_   SZ3 mf 'H% +3&/ֱ  %$2  +  +2'+6+ .+ . o+ %.$@  $%...........$.......@017#"'%#"5432#"'%#"/;  B qG D+I D*&H +/ֱ  222  +  ++6+ .o+  . .............@01#"/#"5432#"'%  B b* &I D~5 +3+3  / / /ְ22 +@ + 2 +@ +2!+6j+ .  st+ .. + ++ ....... .......@01#"/#"'%&5432'&5432xx^?x3 A++  + /ֱ2+ 2 +017!5!!!5!)h(3.3%@ !T++"/ ֱ  +#+  $9@   $9012#"&46654'&#"'2%7',jgh$;>WV>>$@yAJRcMMДMq@ON@H  /ֱ +01%#"5432@'H/ֱ 22+017#"5432762"/   '   HV + 3/ ֱ +@ ++6 + .... ...@017%632#"54320  .D IHG?+ +32++3/ ֱ+ 9901'#'##"53737632nA?0B JDD(EI Sggi,lmov HG0+ ++/ֱ+ 9901#'##"53632C( J  , x3 ^+ 2+ 2  +3 2/ֱ 2 + 22+2+013!5##35#353#3xh)wvvvww3.3%@2j37+ + + +/ ֱ++014&+#"532#"5YEjr*N*cH3I+3 + 32/ֱ++ 99 9901#'##"5373#"5#C( JK  ,3D%@ _+3 +@ + +/ֱ+++ 9999901"32654&'2#"=.546,VzzVU{yWj_bҖgl)q v||3B++  + /ֱ2+ + 90132654&++#32C@f^7TLE)|IvK.+Kw54&,j_bNkjxPnn@q v|+ `ddcJ//ְ2 2 +@ + +@ ++01463254327632#"5& jk 6  $qj|33|3B ++  +/ ֱ2+ + 90132654&#+332T7^f@vI|)ELK+.Kx=c3emI> /  +@  + +@ +/ ְ2  +@ ++01432#"5!"543!.-+F'y@X2@H)-+F3+3 +/ֱ + ++ 901#".5473#"',      = &2 7H&/ ֱ  +@  ++ 901#"/#"5#"547, hg H gf 9232+3 2+#3(22-/3/ֱ   +@ + +@ +@ + +2** +@*& +* +@! +@0 +4+ 9-099 99012326=#32+"54;#"54;#"54;2+#"&546..; K"6j1J"V=> A3*1?X d B// /ֱ+ + 999 9901"3264.2#"&54=N33'%5Z*,(3('22'&d ./ + + / ִ + + +012#"&54N33'%53('22'&qj'3i F/3 ++2/ֱ +  +0154632#"=#5432 * 4 `!!` 5S ! / +/ + ++017632'&54632,> aa n  fD" ++/ִ ++01#.74?63Yw   w  ^ ^ G/ 2/ =+/ֱ+999901"#"546;>32#"&7"274&%)U+:B(  10   (X^+32 +@ +@ +/ֱ  +@ + + +@ ++ 9901%30!57632!54320( ((;P PA ;+32 + + /ֱ 2 +@ + +01!0!50!54320A(X @+2 +@ + /ֱ +@ + +@ + +01%!!5!5432A((( ] + ///ֱ+2  +@ ++9999901%"3264&!5%5#"&4632,Gw`&77&'6*(66J55'X k + 2///ֱ+2 +@ + +@ ++9999901%"3264&!5%5#"&4632,`&77&'6*((66J55'(X % + 2 +@ +  +/!&/ֱ +@ +++2%% +@% +'+99!9999901%"3264&!57632!5#"&4632o &77&'6*(;P P76J55'6MS +A  $   ~    4 n $   V m H  t    `>     f X!N" J$& 0'*:- 9n       Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors.FreeMonoFreeMonoRegularRegularGNU: FreeMono Normal: 2012GNU: FreeMono Normal: 2012FreeMonoFreeMonoVersion 0412.2268 Version 0412.2268 FreeMonoFreeMonoGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This font is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this font. If not, see http://www.gnu.org/licenses/ As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlthng?@O<V9NormalNormalNormalNormalNormalnavadnoNormlne1KG=K9NormalNormalNormalNormalnyNormalnormalusisvidjsNormalemenengahNorml 8 > . > ( M /StandardNormalNormalNormaaliStandaardnormaloby ejnnormal=>@<0;5=Arrunta2Q  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS softhyphenmicromiddotssharpAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsbbarBhookBtopbarbtopbarTonesixtonesixOopenChookchookDbarDhookDtopbardtopbar deltaturn EreversedSchwa EpsilonlatinFhookGhook Gammalatinhv IotalatinIbarKhookkhooklbar lambdastrokeMturnedNhooknlegObarOhornohornOioiPhookphookyrTonetwotonetwoEsh eshlooprev tpalatalhookThookthookuni01AEUhornuhorn UpsilonlatinVcursiveYhookyhookZbarzbarYoghYoghrevyoghrevyoghtailtwobarTonefivetonefiveglottalstopbarinvwynn clickdentalpipedbl clickalveolarclickretroflexDZcaronDzcarondzcaronLJLjljNJNjnjAcaronacaronIcaronicaronOcaronocaronUcaronucaronUdieresismacronudieresismacronUdieresisacuteudieresisacuteUdieresiscaronudieresiscaronUdieresisgraveudieresisgraveeturnedAdieresismacronadieresismacron Adotmacron adotmacronAEmacronaemacronGbargbarGcarongcaronKcaronkcaronOogonekoogonek Oogonekmacron oogonekmacron Yoghhacek yoghhacekjcaronDZDzdzGacutegacuteuni01F6Wynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Adblgrave adblgraveAinvertedbreveainvertedbreve Edblgrave edblgraveEinvertedbreveeinvertedbreve Idblgrave idblgraveIinvertedbreveiinvertedbreve Odblgrave odblgraveOinvertedbreveoinvertedbreve Rdblgrave rdblgraveRinvertedbreverinvertedbreve Udblgrave udblgraveUinvertedbreveuinvertedbreve Scommaaccent scommaaccent Tcommabelow tcommabelowuni021Cuni021Duni021Euni021Funi0220uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjaturnascript ascriptturnbhookcturnccurldtaildhook ereversedschwa schwahook epsilonlatinepsilonlatinrevepsilonlatinrevhookepsilonlatinrevclosed jdotlessbarghookgscript Gsmallcap gammalatinramshornhturnhhookhenghookibar iotalatin Ismallcap lmidtildelbeltlrthooklezhmturn mturndescendmhook nhookleftnhookretroflex Nsmallcapobar OEsmallcapomegalatinclosedphilatinrturnrlonglegturned rhookturnedrdescendrhook rfishhook rfishhookrev Rsmallcap Rsmallcapinvshookesh jhookdblbar eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzretroflexhookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap epsilonclosed Gsmallcaphook Hsmallcap jcrosstailkturn Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod primedblmod quoteleftmod apostrophemod apostropherevringrighthalfsuperringlefthalfsuperglottalstopmod glottalrevfrontedbackedraisedloweredverticallinemodmacronmodifier acutemodifier gravemodifierverticallinelowmod macronsubgravesubacutesubcolontriangularmodcolontriangularhalfmodringrighthalfcenterringhalfleftcentereduni02D4uni02D5uni02D6uni02D7 rhotichookuni02DF gammasuperlsuperssuperxsuperglottalrevsuper toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombcircumflexcomb tildecomb macroncomb overlinecmb brevecomb dotaccentcmb dieresiscmb hookabovecombringcmb acutedblnosp caroncomb linevertnosplinevertdblnosp dblgravecmbcandrabinducmbbreveinvertedcmbcommaturnedabovecmb commaabovecmbcommareversedabovecmbcommaaboverightcmb gravebelowcmb acutebelowcmbtackleftsubnosptackrightsubnosp anglesupnosphorncmbringlefthalfsubnosp tackupsubnosptackdownsubnosp plusbelowcmbuni0320hookpalatalizedbelowcmbuni0322 dotbelowcomb dotdblsubnosp ringbelowcmb commasubnospuni0327 ogonekcmbuni0329uni032Auni032Buni032Cuni032Duni032Euni032F tildebelowcmbmacronbelowcmbunderscorenospunderscoredblnosptildeoverlaycmbbarmidshortnospbarmidlongnospslashshortnosp slashlongnospringrighthalfsubnospbridgeinvsubnospsquarebelowcmbuni033C xabovecmbtildeverticalcmboverscoredblnosp gravetonecmb acutetonecmbperispomenigreekcmb koroniscmbdialytikatonoscmbypogegrammenigreekcmbuni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035auni035Buni035Cuni035Duni035Euni035Ftildedoublecmbbreveinverteddoublecmbuni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosbetasymbolgreekthetasymbolgreek UpsilonhookUpsilonhooktonosUpsilonhookdiaeresisphi1omegapiStigmastigmaDigammadigamma kappascriptrhosymbolgreekuni03f4uni03F5 Est_varijaYoDjeGje Est_shirokijDzeloIzheiYiJyLjeNjeTsheKje Izhe_varija Uk_kratkijDzheAzBukyVedeGlagolDobroEstZhiveteZemljaIzhe Izhe_kratkijKakoLjudiMysleteNashOnPokojRtsySlovoTverdoUkFertKherTsyChervShaShchaHardsigncyrillicEryEri Est_obratnyjYusYaazbukyvedeglagoldobroestzhivetezemljaizhe izhe_kratkijkakoljudimysletenashonpokojrtsyslovotverdoukfertkhertsychervshashchahardsigncyrilliceryeri est_obratnyjyusya est_varijayodjegje est_shirokijdzeloizheiyijyljenjetshekje izhe_varija uk_kratkijdzheOmeghaomeghaYatyatJestjest Yus_malyj yus_malyj Jyus_malyj jyus_malyj Yus_bolshoj yus_bolshoj Jyus_bolshoj jyus_bolshojKsiksiPsypsyFitafitaIzhitsaizhitsa Izhitsa_i izhitsa_iOukouk On_shirokij on_shirokij Omeghatitlo omeghatitloOtot titlo_combsmjagchenije_comb dasia_combzvateltso_comb bukvotitiloIzhe_kratkij_khvostatyjizhe_kratkij_khvostatyjPoluerpoluer Rtsy_mechenyj rtsy_mechenyjGlagol_rogatyjglagol_rogatyjGlagol_precherchenyjglagol_precherchenyjGlagol_zagbenyjglagol_zagbenyjZhivete_otcherknutyjzhevete_otcherknutyjZemlja_otcherknutyjzemlja_otcherknutyjKako_otcherknutyjkako_otcherknutyjKako_voscherknutyjkako_voscherknutyjKako_precherknutyjkako_precherknutyjKako_bashkirskijkako_bashkirskijNash_otcherknutyjnash_otcherknutyj Nash_glagol nash_glagolPokoj_zagbenyjpokoj_zagbenyj Ha_abkhazskij ha_abkhazskijSlovo_otcherknutyjslovo_otcherknutyjTverdo_otcherknutyjtverdo_otcherknutyj Uk_prjamoj uk_prjamojUk_precherknutyjuk_precherknutyjKher_otcherknutyjkher_otcherknutyj Tverdo_tsy tverdo_tsyCherv_otcherknutyjcherv_otcherknutyjCherv_voscherknutyjcherv_voscherknutyjShhashhaCherv_abkhazskijcherv_abkhazskijCherv_abkhazskij_otcherknutyjcherv_abkhazskij_otcherknutyjPalochkaZhivete_kratkijzhivete_kratkijKako_kruchkovyjkako_kruchkovyjLjudi_khvostatyjljudi_khvostatyjNash_kruchkovyjnash_kruchkovyjNash_khvostatyjnash_khvostatyjCherv_khakasskijcherv_khakasskijMyslete_khvostatyjmyslete_khvostatyjpalochka Az_kratkij az_kratkij Az_dvutochnyj az_dvutochnyjAz_estaz_est Est_kratkij est_kratkij Schwacyrillic schwacyrillicSchwacyrillic_dvutochnyjschwacyrillic_dvutochnyjZhivete_dvutochnyjzhivete_dvutochnyjZemlja_dvutochnyjzemlja_dvutochnyjDzelo_abkhazskijdzelo_abkhazskijIzhe_nadcherknutyjizhe_nadcherknutyjIzhe_dvutochnyjizhe_dvutochnyj On_dvutochnyj on_dvutochnyjOn_precherknutyjon_precherknutyjOn_precherknutyj_dvutochnyjon_precherknutyj_dvutochnyjEst_obratnyj_dvutochnyjest_obratnyj_dvutochnyjUk_nadcherknutyjuk_nadcherknutyj Uk_dvutochnyj uk_dvutochnyjUk_dvuoksijnyjuk_dvuoksijnyjCherv_dvutochnyjcherv_dvutochnyjGlagol_otcherknutyjglagol_otcherknutyjEry_dvutochnyjery_dvutochnyjGlagol_precherknutyj_kruchkovyjglagol_precherknutyj_kruchkovyjKher_kruchkovyjkher_kruchkovyjKher_precherknutyjkher_precherknutyjZemlja_obratnyjzemlja_obratnyjLjudi_kruchkovyjljudi_kruchkovyjQaqaWawaKvakvauni0524uni0525uni0526uni0527 Aybarmenian Benarmenian Gimarmenian Daarmenian Echarmenian Zaarmenian Eharmenian Etarmenian Toarmenian Zhearmenian Iniarmenian Liwnarmenian Xeharmenian Caarmenian Kenarmenian Hoarmenian Jaarmenian Ghadarmenian Cheharmenian Menarmenian Yiarmenian Nowarmenian Shaarmenian Voarmenian Chaarmenian Peharmenian Jheharmenian Raarmenian Seharmenian Vewarmenian Tiwnarmenian Reharmenian Coarmenian Yiwnarmenian Piwrarmenian Keharmenian Oharmenian Feharmenianringhalfleftarmenianapostrophearmenianemphasismarkarmenianexclamarmenian commaarmenianquestionarmenianabbreviationmarkarmenian aybarmenian benarmenian gimarmenianuni0564 echarmenian zaarmenian eharmenian etarmenian toarmenian zhearmenian iniarmenianuni056C xeharmenian caarmenian kenarmenian hoarmenian jaarmenianuni0572 cheharmenian menarmenian yiarmenian nowarmenian shaarmenian voarmenian chaarmenian peharmenian jheharmenian raarmenian seharmenian vewarmenian tiwnarmenian reharmenian coarmenian yiwnarmenian piwrarmenian keharmenian oharmenian feharmenianechyiwnarmenianperiodarmenianuni058A dramarmenian shevahebrewhatafsegolhebrewhatafpatahhebrewhatafqamatshebrew hiriqhebrew tserehebrew segolhebrew patahhebrew qamatshebrew holamhebrewuni05ba qubutshebrew dageshhebrew siluqhebrew maqafhebrew rafehebrew paseqhebrew shindothebrew sindothebrewsofpasuqhebrewupperdothebrewuni05c5uni05c6uni05c7 alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrewfinaltsadihebrew tsadihebrewqofholamhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni0606uni0607uni0608uni0609uni060auni060b commaarabicuni060duni060euni060Fsemicolonarabicuni061equestionarabicuni0620 hamzaarabicalefmaddaabovearabicalefhamzaabovearabicwawhamzaabovearabicalefhamzabelowarabicyehhamzaabovearabic alefarabic beharabictehmarbutaarabic teharabic theharabic jeemarabic haharabic khaharabic dalarabic thalarabic reharabic zainarabic seenarabic sheenarabic sadarabic dadarabic taharabic zaharabic ainarabic ghainarabicuni063buni063cuni063duni063euni063f tatweelarabic feharabic qafarabic kafarabic lamarabic meemarabic noonarabic heharabic wawarabicalefmaksuraarabic yeharabicfathatanarabicdammatanarabickasratanarabic fathaarabic dammaarabic kasraarabic shaddaarabic sukunarabic maddaarabicuni0654uni0655uni0656uni0657zwarakayarabicuni065auni065bdotbelowarabicuni065duni065euni065f zeroarabic onearabic twoarabic threearabic fourarabic fivearabic sixarabic sevenarabic eightarabic ninearabicuni066adecimalseparatorarabicuni066cuni066darab_dotless_beharabic_dotless_qafuni0670alefwaslaarabicuni0672uni0673uni0674uni0675uni0676uni0677uni0678uni0679uni067auni067b teh_ring_arabuni067d peharabicuni067funi0680arab_hah_hamzauni0682uni0683uni0684arab_hah_tri_dot tcheharabicuni0687 ddalarabic arab_dal_ringuni068auni068buni068cuni068duni068euni068funi0690 rreharabicuni0692 arab_reh_ringuni0694uni0695arab_reh_dot_above_belowuni0697 jeharabicuni0699arab_seen_dot_above_belowuni069buni069cuni069duni069euni069funi06a0arab_dotless_fehuni06a2uni06a3uni06a4uni06a5uni06a6uni06a7uni06a8 keheharabicuni06aa arab_kaf_ringuni06acngarabicuni06ae gafarabicuni06b0uni06b1uni06b2uni06b3uni06b4uni06b5uni06b6uni06b7uni06b8uni06b9noonghunnaarabic rnoonarabicarab_noon_ringuni06bduni06beuni06bfhehhamzaarabic hehgoalarabichehgoalhamzaarabictehmarbutagoalarabicuni06c4uni06c5uni06c6uni06c7uni06c8uni06c9uni06cauni06cbyehfarsiarabic yehtailarabicuni06ceuni06cfearabicuni06D1yehbarreearabicuni06d3uni06D4uni06d5uni06eeuni06ef zeropersian onepersian twopersian threepersian fourpersian fivepersian sixpersian sevenpersian eightpersian ninepersianuni06fauni06fbuni06fcuni06fduni06feuni06ffuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13d3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni16A0uni16A1uni16A2uni16A3uni16A4uni16A5uni16A6uni16A7uni16A8uni16A9uni16AAuni16ABuni16ACuni16ADuni16AEuni16AFuni16B0uni16B1uni16B2uni16B3uni16B4uni16B5uni16B6uni16B7uni16B8uni16B9uni16BAuni16BBuni16BCuni16BDuni16BEuni16BFuni16C0uni16C1uni16C2uni16C3uni16C4uni16C5uni16C6uni16C7uni16C8uni16C9uni16CAuni16CBuni16CCuni16CDuni16CEuni16CFuni16D0uni16D1uni16D2uni16D3uni16D4uni16D5uni16D6uni16D7uni16D8uni16D9uni16DAuni16DBuni16DCuni16DDuni16DEuni16DFuni16E0uni16E1uni16E2uni16E3uni16E4uni16E5uni16E6uni16E7uni16E8uni16E9uni16EAuni16EBuni16ECuni16EDuni16EEuni16EFuni16F0 Aringbelow aringbelow Bdotaccent bdotaccent Bdotbelow bdotbelow Blinebelow blinebelow Ccedillaacute ccedillaacute Ddotaccent ddotaccent Ddotbelow ddotbelow Dlinebelow dlinebelowDcedilladcedillaDcircumflexbelowdcircumflexbelow Emacrongrave emacrongrave Emacronacute emacronacuteEcircumflexbelowecircumflexbelow Etildebelow etildebelow Ecedillabreve ecedillabreve Fdotaccent fdotaccentGmacrongmacron Hdotaccent hdotaccent Hdotbelow hdotbelow Hdieresis hdieresisHcedillahcedilla Hbrevebelow hbrevebelow Itildebelow itildebelowIdieresisacuteidieresisacuteKacutekacute Kdotbelow kdotbelow Klinebelow klinebelow Ldotbelow ldotbelowLdotbelowmacronldotbelowmacron Llinebelow llinebelowLcircumflexbelowlcircumflexbelowMacutemacute Mdotaccent mdotaccent Mdotbelow mdotbelow Ndotaccent ndotaccent Ndotbelow ndotbelow Nlinebelow nlinebelowNcircumflexbelowncircumflexbelow Otildeacute otildeacuteOtildedieresisotildedieresis Omacrongrave omacrongrave Omacronacute omacronacutePacutepacute Pdotaccent pdotaccent Rdotaccent rdotaccent Rdotbelow rdotbelowRdotbelowmacronrdotbelowmacron Rlinebelow rlinebelow Sdotaccent sdotaccent Sdotbelow sdotbelowSacutedotaccentsacutedotaccentScarondotaccentscarondotaccentSdotbelowdotaccentsdotbelowdotaccent Tdotaccent tdotaccent Tdotbelow tdotbelow Tlinebelow tlinebelowTcircumflexbelowtcircumflexbelowUdieresisbelowudieresisbelow Utildebelow utildebelowUcircumflexbelowucircumflexbelow Utildeacute utildeacuteUmacrondieresisumacrondieresisVtildevtilde Vdotbelow vdotbelowWgravewgraveWacutewacute Wdieresis wdieresis Wdotaccent wdotaccent Wdotbelow wdotbelow Xdotaccent xdotaccent Xdieresis xdieresis Ydotaccent ydotaccent Zcircumflex zcircumflex Zdotbelow zdotbelow Zlinebelow zlinebelow hlinebelow tdieresiswringyringarighthalfringslongdotaccent Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07 Alphalenisuni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15 Epsilonlenisuni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27Etalenisuni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37 Iotalenisuni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45 Omicronlenisuni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67 Omegalenisuni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEB Rho_dasiadialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspacethreeperemspacefourperemspace sixperemspace figurespacepunctuationspace thinspace hairspacezerowidthspacezerowidthnonjoinerzerojoinuni200Euni200F hyphentwo hyphennobreak figuredash quotedashdblverticalbar underscoredbl quotereversed quotedblrevuni2023onedotenleadertwodotenleader hyphendot lineseparatorparagraphseparatorlrerlepdflrorlouni202Funi2031minuteseconduni2034 primereverseduni2036uni2037caretuni203B exclamdbl interrobanguni203Euni203Ftieuni2041asterism hyphenbulletuni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferioruni208Duni208Euni2090uni2091uni2092uni2093uni2094 colonmonetarycruzeiroliramillnairapesetarupeewonsheqeldongEurokiptugrikdrachmapfennigpesoguaraniaustralhryvniaceditenge indian_rupeeleftharpoonaccentrightharpoonaccentuni20D2uni20D6uni20D7uni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20e2uni20e3uni20E5uni20E6uni20E8uni20EAuni20EBuni20ECuni20EDuni20EEuni20EF accountofaddresssubjectCbbdegreecentigradeCLcareofcadaunaEulerscrupledegreefarenheitHbbplanck planckover2piIscriptIfrakturLscriptlitrelbbarNbbnumero recordright weierstrassPbbQbbRfrakturRbb prescription servicemark telephoneZbbOhmmhoiotaturn degreekelvinangstrom estimatedFturn alephmathbethmath gimelmath dalethmathuni2139uni213aFAXuni2141uni2142uni2143uni2144uni214buni214duni214eonethird twothirdsonefifth twofifths threefifths fourfifthsonesixth fivesixths oneeighth threeeighths fiveeighths seveneighths onenumeratorOneromanuni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Foneromantworoman threeroman fourroman fiveromansixroman sevenroman eightroman nineromantenroman elevenroman twelveromanuni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbse arrowhookleftarrowhookrightuni21ABuni21ACuni21ADuni21AEdownzigzagarrowuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnarrowsemanticlockwarrowsemclockwhomeuni21b9arrowanticlockw arrowclockwuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21dcuni21DDarrowleftwhiteuni21e7uni21e8uni21e9uni21f3 universal complement existentialnotexistentialemptyset Delta.mathgradientelement notelement epsiloninvsuchthat notcontains ownersmalleop coproduct minusplusdotplus divisionslash backslashmath asteriskmath ringoperatorbulletoperatorcuberoot fourthroot proportional orthogonalangle measuredanglesphericalangledividesnotbarparallel notparallel logicaland logicalor intersectionunion integraldbl integraltrplcontourintegral surfintegral volintegral clwintegralclwcontintegralcclwcontintegral thereforebecauseratio proportiondotminusexcessgeomproportion homotheticsimilar revsimilarlazysinvsine wreathproduct notsimilar minustildeuni2243uni2244 congruentapproxnotequaluni2247uni2249uni224Auni224Ballequaluni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256 ringequal correspondsuni2259uni225A starequaluni225c definequal measurequal questionequal equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299 circleringuni229Buni229Cuni229D squareplus squareminussquaremultiply squaredot turnstilelefttacklefttackdown perpendicular assertion truestate satisfiesuni22A9uni22AA forceextruni22AC notsatisfyuni22AEuni22AF lowerrank higherrank triangleright trianglelefttriangleftequaltriangrightequaloriginalimagemultimaphermitconjmatrixintercalxornandnor rightanglearc righttrianglenarylogicaland narylogicalornaryintersection naryunionuni22C4dotmathuni22C6uni22C7bowtiemulticloseleftmulticloserightuni22CBuni22CCuni22CDuni22CEuni22CFuni22D0uni22D1uni22D2uni22D3uni22D4 equalparalleluni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni2300uni2302control caretinverted projectiveperspcorrespond ceilingleft ceilingright floorleft floorrightuni230cuni230duni230euni230f revlogicalnotarcuni2314uni2315uni2318uni2319uni231cuni231duni231euni231f integraltp integralbtfrown slurbelowuni2324uni2325uni2326uni2327 angleleft angleright deleteleftuni232Cuni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Cuni237Duni237Euni237Funi2380uni2381uni2382uni2383uni2384uni2385uni2386uni2387uni2388uni2389uni238auni238Buni238cuni238Duni238Euni238funi2390uni2391uni2392uni2393uni2394uni2395uni2396uni2397uni2398uni2399uni239auni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23AFuni23B0uni23B1uni23b2uni23b3uni23b4uni23b5uni23B6uni23B7uni23BAuni23BBuni23BCuni23BDuni23BEuni23BFuni23C0uni23C1uni23C2uni23C3uni23C4uni23C5uni23C6uni23C7uni23C8uni23C9uni23CAuni23CBuni23CCuni23CDuni23ceuni23cfuni23DAuni23DBuni23deuni23dfuni23e2uni23e3uni23E4uni23e5uni23e6null startofhead starttextendtextendtransenquiry acknowledgebell backspacehoriztablinefeedverttabformfeedC_Rshiftoutshiftindatalinkescapedevcon1devcon2devcon3devcon4negacknowledgesynch endtransblockcancel endmedium substituteescape fileseparatorgroupseparatorrecordseparator unitseparator spaceliteraldeleteuni2422blanknewlineuni2425uni2426uni2440uni2441uni2442uni2443uni2444uni2445uni2446uni2447uni2448uni2449uni244Auni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469 lthorizformuni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256euni256funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257auni257buni257cuni257duni257euni257fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259auni259buni259cuni259duni259euni259f filledbox whitesquareuni25a2uni25a3uni25a4uni25a5uni25a6uni25a7uni25a8uni25a9uni25aauni25abuni25acuni25aduni25aeuni25afuni25b0uni25b1triaguptriangleuni25b4 smalltriangleuni25B6triangleright1uni25b8uni25b9uni25bauni25bbtriagdn triangleinvuni25beuni25bfuni25C0 triangleleft1uni25c2uni25c3uni25c4uni25c5 blackdiamond whitediamonduni25c8uni25c9circle dottedcircleuni25cduni25ce circlesoliduni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 bulletinverseuni25d9uni25dauni25dbuni25dcuni25dduni25deuni25dfuni25e0uni25e1uni25E2uni25E3uni25E4uni25E5 whitebulletuni25E7uni25E8uni25E9uni25EAuni25ebuni25ecuni25eduni25ee largecircleuni25f0uni25f1uni25f2uni25f3uni25f4uni25f5uni25f6uni25f7uni25f8uni25f9uni25fauni25fbuni25fcuni25fduni25feuni25ffuni2600uni2601uni2602uni2603uni2604 blackstar whitestaruni2607uni2608uni2609uni2610uni2611uni2612uni2613uni2614uni261Auni261Bpointingindexleftwhiteuni261Dpointingindexrightwhiteuni261Funi2626uni2627uni2628uni2629uni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleJupiterSaturnuni2645NeptunePlutoAriesTaurusGeminiCancerLeoVirgoLibraScorpio Sagittarius CapricornAquariusPiscesspadeheartsuitwhitediamondsuitwhiteclubspadesuitwhiteheartdiamond clubsuitwhite quarternote musicalnotemusicalnotedblbeamedsixteenthnotesflatnaturalsharpuni2680uni2681uni2682uni2683uni2684uni2685uni27c0uni27C1uni27c2uni27c3uni27c4uni27C5uni27C6uni27c7uni27c8uni27c9uni27cauni27ccuni27d0uni27d1uni27d2uni27d3uni27d4uni27d5uni27d6uni27d7uni27e4uni27e5uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27f2uni27f3uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2A00uni2A01uni2A02uni2A03uni2A04uni2A05uni2A06uni2A1Duni2A3Funi2b00uni2b01uni2b02uni2b03uni2b04uni2b05uni2b06uni2b07uni2b08uni2b09uni2b0auni2b0buni2b0cuni2b0duni2b12uni2b13uni2b14uni2b15uni2b16uni2b17uni2b18uni2b19uni2b1buni2b1cuni2b1duni2b1euni2b1funi2b20uni2b21uni2b22uni2b23uni2b24uni2b25uni2b26uni2b27uni2b28uni2b29uni2b2auni2b2buni2b53uni2b54uni2e16uni2E17uni2e18uni2e1auni2e1buni2e1euni2e1funi2e28uni2e29uni2e2auni2e2buni2e2cuni2e2duni2e2euni2e30 lowcircumflex colonmodifier shortequalsSaltillosaltillouniA900uniA901uniA902uniA903uniA904uniA905uniA906uniA907uniA908uniA909uniA90AuniA90BuniA90CuniA90DuniA90EuniA90FuniA910uniA911uniA912uniA913uniA914uniA915uniA916uniA917uniA918uniA919uniA91AuniA91BuniA91CuniA91DuniA91EuniA91FuniA920uniA921uniA922uniA923uniA924uniA925uniA926uniA927uniA928uniA929uniA92AuniA92BuniA92CuniA92DuniA92EuniA92Fffffiffllongs_tyodhiraqhebrewunifb1eyodyodpatahhebrewayinaltonehebrewunifb21unifb22unifb23unifb24unifb25unifb26unifb27unifb28unifb29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefmapiqhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewunifb50alefwaslafinalarabicunifb52unifb53unifb54unifb55uniFB56 pehfinaarabic pehinitarabic pehmediarabicunifb5aunifb5bunifb5cunifb5dunifb5ettehehfinaarabicttehehinitarabicttehehmediarabicunifb62unifb63unifb64unifb65unifb66ttehfinaarabicttehinitarabicttehmediarabicunifb6a vehfinaarabic vehinitarabic vehmediarabicunifb6eunifb6funifb70unifb71unifb72unifb73unifb74unifb75unifb76unifb77unifb78unifb79uniFB7Atchehfinaarabictchehinitarabictchehmediarabicunifb7eunifb7funifb80unifb81unifb82unifb83unifb84unifb85unifb86unifb87unifb88ddalfinaarabicuniFB8A jehfinaarabicunifb8crrehfinaarabicunifb8ekehehfinaarabickehehinitarabickehehmediarabicuniFB92 gaffinaarabic gafinitarabic gafmediarabicunifb96unifb97unifb98unifb99unifb9aunifb9bunifb9cunifb9dunifb9enoonghunnafinaarabicunifba0rnoonfinalarabicrnooninitialarabicrnoonmedialarabicunifba4hehhamzafinalarabicunifba6hehgoalfinaarabichehgoalinitarabichehgoalmedialarabicunifbaaunifbabunifbacunifbadunifbaeyehbarreefinaarabicunifbb0unifbb1unifbb2unifbb3unifbb4unifbb5unifbb6unifbb7unifbb8unifbb9 arab_quad_dotunifbbbunifbbcunifbbdunifbbeunifbc0unifbc1 ngisoarabic ngfinalarabic nginitarabicngmedialarabicunifbd7unifbd8unifbd9unifbdaunifbdbunifbdcunifbddunifbdeunifbdfunifbe0unifbe1unifbe2unifbe3unifbe4 efinalarabiceinitialarabic emedialarabicalefmaksurainitarabicalefmaksuramediarabicunifbfcyehfarsifinaarabicyehfarsiinitarabicyehfarsimediarabicuniFE70unife71unife72unife73uniFE74uniFE76unife77uniFE78unife79uniFE7Aunife7buniFE7Cunife7dunife7eunife7funiFE80uniFE81alefmaddaabovefinalarabicuniFE83alefhamzaabovefinalarabicuniFE85wawhamzaabovefinalarabicuniFE87alefhamzabelowfinalarabicuniFE89uniFE8AyehhamzaaboveinitialarabicyehhamzaabovemedialarabicuniFE8DaleffinalarabicuniFE8FbehfinalarabicbehinitialarabicbehmedialarabicuniFE93tehmarbutafinalarabicuniFE95tehfinalarabictehinitialarabictehmedialarabicuniFE99thehfinalarabicthehinitialarabicthehmedialarabicuniFE9DjeemfinalarabicjeeminitialarabicjeemmedialarabicuniFEA1hahfinalarabichahinitialarabichahmedialarabicuniFEA5khahfinalarabickhahinitialarabickhahmedialarabicuniFEA9dalfinalarabicuniFEABthalfinalarabicuniFEADrehfinalarabicuniFEAFzainfinalarabicuniFEB1seenfinalarabicseeninitialarabicseenmedialarabicuniFEB5sheenfinalarabicsheeninitialarabicsheenmedialarabicuniFEB9sadfinalarabicsadinitialarabicsadmedialarabicuniFEBDdadfinalarabicdadinitialarabicdadmedialarabicuniFEC1tahfinalarabictahinitialarabictahmedialarabicuniFEC5zahfinalarabiczahinitialarabiczahmedialarabicuniFEC9ainfinalarabicaininitialarabicainmedialarabicuniFECDghainfinalarabicghaininitialarabicghainmedialarabicuniFED1fehfinalarabicfehinitialarabicfehmedialarabicuniFED5qaffinalarabicqafinitialarabicqafmedialarabicuniFED9kaffinalarabickafinitialarabickafmedialarabicuniFEDDlamfinalarabiclaminitialarabiclammedialarabicuniFEE1meemfinalarabicmeeminitialarabicmeemmedialarabicuniFEE5noonfinalarabicnooninitialarabicnoonmedialarabicuniFEE9hehfinalarabichehinitialarabichehmedialarabicuniFEEDwawfinalarabicuniFEEFalefmaksurafinalarabicuniFEF1yehfinalarabicyehinitialarabicyehmedialarabiclamalefmaddaaboveisolatedarabiclamalefmaddaabovefinalarabiclamalefhamzaaboveisolatedarabiclamalefhamzaabovefinalarabiclamalefhamzabelowisolatedarabiclamalefhamzabelowfinalarabiclamalefisolatedarabiclamaleffinalarabiczerowidthjoinerunifff9unifffaunifffbunifffcuniFFFDu10300u10301u10302u10303u10304u10305u10306u10307u10308u10309u1030Au1030Bu1030Cu1030Du1030Eu1030Fu10310u10311u10312u10313u10314u10315u10316u10317u10318u10319u1031Au1031Bu1031Cu1031Du1031Eu10320u10321u10322u10323Engsami braille_off braille_on zeroslashedtitlo_cyrillic arab_v_decorarab_gaf_decor arab_waslaarab_ba_teh_finalarab_ba_teh_initarab_ba_teh_mediarab_feh_qaf_initarab_feh_qaf_mediarab_feh_qaf_final  o}~-./0abcdpqrsijkl>?FGGHKLLMRSbccdIJQRST[\cdkluv}~MNNOOPQR\]_`ijlmyz|} & ' ( ) ) * + , 1 2 2 3 6 7 7 8 q r u v v w } ~P BDFLT&arab4cyrlFgrek^hebrhlatnx  MKD SRB ISM $LSM $NSM $SKS $ ccmpJccmpPdligXfina^fracdinitjligaploclvlocl|medirligzero     $,6>FNV^fnv~jn b>pt x Z <>3Pf|&.6 z x t r~ u s { w | y }6",bqcr28RX ,>Pbt     .     / $(,28DHLRX&8Z| PNLJ jhfd |zxv QOMK kige }{yw ZXVT [YWU7 v8  *&.2"BuFNJTZ8 !"#$%&'()*+,-.56789:;<=>lmnqrsvwyzv8   +'/3#CvGOKU[8 !"#$%&'()*+,-.56789:;<=>lmnqrsvwyz@    )%-1?=!AtEMIQSWYac@ !"#$%&'()*+,-.56789:;<=>dlmnqrsvwyzN ,  BHNTZ`flrx~  vDFLT&arab0cyrl>grekJhebrVlatn`mark mark&mark,mark2mkmk:&.60 > pN (RX^djpv| $*06<,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G@G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,Gqqsuwz~ &,28~ $*06<BHNTZ`fl):D)10#')+16:BFHJPVZNPQ]^_jklz{|V\bhntz 4"JJ*. %D**&r  F&\   "#% 7 7&' "(.4:@FLRX^djpv|*Fd :v| $*06<BHNTZ`flrx~ 3631>36363>303,4^363636363.43,36363.3,4/3.3.3.3.3'EK'K''K;K#yayOK.L';,E;';K''''''&-3(3W$=D]4bc5qr79jk"%&')* ' (7 * +9 2 2;< "(.4:@FLRX^djpv| $*06<BHNT&/89,,. ,E?@BCFKc$*06<B,H,H,,H,p,H.G~ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`fl,,,,,,,,8,N,8,~,N,,,V,0,,,,,,,8,,8,:,8,,,,,,8,,8h0h,,8,,8,X,,:,8,:,,,,0|K8N,,D,8,8,0,L,,,,8,Y,8,,,,8,,,,,N,8,,,0,8,0,8,0h`,,,,,,8,,,,,,8,,,,8,0,8,l,8,,8,,8,D,8,,8,,8,D,,,,,`,D,`,,,,`,,,,,,,D,8,D,8,,8,,8,,8,,8,,8,,8,,8V88`0,,0,8`0,`08:hBB,D,,D,,D,,, ,D,8,l,,l,,,b,V,l,8,,,8,8,8,D,8,,8,,8,0,8,,8,,8,,,,8,,,,,,,,,,8,,8,,8,,8,,8,,8,,8,,8:`r`,`,,8,8,,,,,v,,,80V0V,0,8,N,, ,, ,,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,,,,,,,,,,,,,,,,,,,,,,,00,0,,0,00,,,,,,8,,8,,8,,8,,8,,8,*a,*a,,8,,8,,8,,8,,8,,8,,8,,8,,`,,`,,,,,,,,,:,,:,,,8,,8,,8,,8,0,,0,,0,,0,0,0,0,0,0,80,80,80,8,,,,,,,,,,8,,8,0,8,0,8,0,,0,,,,,,,,,,,`,,`,,,,,,,,,,,,D,D,,,,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8,,8r8r8,,8,,8,,,,rtrj,,`,,`,,,,,,, ,, ,,,8,,8,D,8,D,8,t,t,,,,,D,,D,,,V,,V,,V,,V,,,,,,,,,,,,,,,,,,,,,,8,,8,,,,,,8,,8,,,,,0,8,0,8,,,,,,,,,,,,,,8,,8,,8,,8,,,,,,,,,,,,,,,,h0,h0,h0,h0,h0,h0,h0,h0,,,8,,8,,,,,,8,,8,,,,00,,,,|,8|,8,,,,,N,,N,,N,,N,,N,8,N,8,N,,N,,8,8,,,,,,8,,8,,,,,,,,,,,,8,,8,,8kk88,,V,,V,DT >ab*df,h/cs?FHKMR ccNTZ`flrx~,X,:,,,D,,D,v,X,,,:,D,D,,:,:,,Dɉo1Y:pillow-2.3.0/Tests/fonts/helvO18.pcf0000644000175000001440000023111412257506326016062 0ustar dokousersfcpdL(< F@T $!xd2$07=?MTcdozKKb  $262FPbg g FOUNDRYAdobeFAMILY_NAMEHelveticaWEIGHT_NAMEMediumSLANTOSETWIDTH_NAMENormalADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO10646CHARSET_ENCODING1CAP_HEIGHTX_HEIGHTFACE_NAMEHelvetica ObliqueCOPYRIGHTCopyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.NOTICEHelvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. _DEC_DEVICE_FONTNAMESPS=Helvetica-ObliqueRELATIVE_SETWIDTHRELATIVE_WEIGHTFULL_NAMEHelvetica ObliqueFONT-Adobe-Helvetica-Medium-O-Normal--18-180-75-75-P-98-ISO10646-1WEIGHTRESOLUTIONQUAD_WIDTHvvx|~{~u~|}u{}~|tx{{u|{{}~~vvvuuvtuuuuvuuvuu|||||||vvvvvv|}}y||~~48p$Xh8LT\0d4h(D|0hH(` @ | $ \  < t < \ d p 0 X 8@h(\4\4@D|8|$<PXTL0t@L\(`,p X$hT0 h !T>>> ?h??? @T@@@@DA|AABLBBB CTCCCD`DDD$EXEEE FDF|FFF0GxGGGHHHpHHHI8IIIJHJJJKHKKKLLLLL MtMM NPNxNNOLOOOO0PhPPP@QQQRdRRR8SSSTTTTTUdUUU,V|VVWXWWWXXXXX,YlYYY0ZlZZZ[<[t[[[[0\X\\\\](]8]H]T]`]p]t]]]]]]]]]]]]^<^H^`^h^^^(_l___8`x``a`aaa,bpbbb v<`0 n>  > 88`pp|p8p Ɲc333g7``08   < x       8 x  c> |~  8~0  |cc33aac3c3333 fv6  `0   ````000008llf cn {cxcpx ??    ```0000  l<>ffc =3c c c 8   x```l|<> ??    cs3c c css{k  p8|f   x0 `0 0 000 8````00``0 s & >8008Ffx0  8x  ~<0 #bD"@@ 1" <fx,6.l66l??0 #BD"DC!!" 333``0020 8d`00 0 0 0  |6<_ON,$$$   8ll666ll6  c 30   c30  8d ` 00#184`00``p8>``08``08 ``08 @``08 ``08``08 ``08< |   ` ``   0 8l ll    ?? 8< l l l f8 8000 8 8000 8 8000  @8 8000  8 8000 p8lg?8 <631c3 ` | |` |00 |`0fv6   ~ls0`cn`cn`cn`cncnpcn?11 | 0`c`c`cc 0  3 66 x0````00 8l<{0`   `   `      `0fl<8 00008   fl<8 ``08cn ```08pcn``08ppcn0< x`0c0< x0xc< x00c0< xx0c0     ffF3x   ?? x c pc 00c `8 8c00 x0c08 x`  `8 x 8 x`` 8 x``@  `` 0 <f  >>L> L> >  "6  000 00    000       6 3ffff3330`c>0x```0000  |~ ``@  l<>ffcl<>ffc0  0     00       ff <  8< l l l f`08< l l l f``@ 00 08< l l l f`0p 8    8< l l l f`x88 8000  `8 8000 p `8 8000 l8 x<ca?1? `0l| ``@ l|0 f<l|`0>~`0<>`>~0x<>>~0``l8<>006>~`<>0  00~~  x00 ?? 0  ?? >>` |`    |    |p      |p   ` |`    |`8 8   0`aac3c3333`c c css{k0xfv6 `   x0 fv6  `0 `0`0  `0 00`0  `0 ``0  <   ??  ``0000   a`c`c`c03060606 8 800?? 8 x000  < < ,|    0 `||  8 |>000 ```0000  0``08x0cn3  3 `8 8000 x00 |`   00 |   `00 |`   000 |`   0`00 |0`    ``08cn``0800cn> ``08?118 x 08 x` 0 |~ f< l<>ffc8 8000 pp08 8000 pp0x0```0000 8 x` 0`8< l l l f0```08`0pcn0  ``08?11g?8 <631c3 8l<{>~00 <>0   ?? 0 f< ``0800cn 0``l8c006 8 8000  @8 8000 `8 8000 008 8000 00|fv6    x0 ~c```0000~~    ``````0000800 ??    `p008l f c c ``0xlxlfc`000 33     L>l666$  0 0 0  |6``08pcn8$$``    {   00 {    {|`< | `0 |      x     ``x00     x|     `px0``l8     `x0x0` 0`c` `0c 0xc<f |2cL> 0``l8pc006 px ?? 8 x    `` 00`` ll  C`p 0``l8 p Dl8```0000 L>``000 L>`0ll 0 66  |~ `0 l<>ffc |~ `` l<>ffc |~  l<>ffc|   >  >  >000   3000  3 8l| 8 ``>~00<>>~00<>```0>~```0<>``>~```<>00>~0000<>000   ?? 0   ?? 0 >00~~  0  300~~  3 |   ll ||2   L> |0x   <f`` |``    |   0dcc33|2cs3cc33 cs3 `aac3c33330`c c css{kaac3c3333`c c css{k``aac3c3333c c css{kaac3c3333``c c css{kaac3c3333c c css{k00 ``  p8|f   p8|f00fv6 ``   x0 ` `0 0x`0  `0 00`0  `0 `0 > |66 ?? pc c css{kp   x0 ``08``cn ``08`0`cn` ``080``cn   ``080d`cn0``08``0xcn ```08`0pcn0` ```080`pcn ```080dpcn ```08``pcn 00c` 0dc` `0`c0`` 0``c` 0d`c` 000xc  8 8000 ``8 8000 `0``8 8000 0``  8 8000 0d``8 8000 ``0x 8 x000 `8 x000 0`@8 x000 `8 x000 `` |00    < < ,|   ` < < ,|0`      < < ,|    < < ,|00   00 0fv6 0`   x0 fv6    x0  0dfv6 `   x0 ????6 66$66$ 6000 ```000 008 <&2`04Lq    ``0   20 8d`00=3c s s 8< l aa??33800    333<3 33asom666 |~ ``08 ``0  <ff<` 0`0 88`pp` 8 <f` 6<x|8>38l f<px px cccpxccc"  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~c,,yMMHM,,,,,,,,,,HHH,c ,A  cc,M,,,,,,A,,,,M,NNHM,,,,,Mr,HMMHMMM,MMm,BBBc     H c,,,,,,y,,,,,,,,,,,Hc,,,,,,,,,,,,,, , , , ,,,,,&,,,,, , , ,MMMccc,,,,,,ccc,  ,,c,,H, ,,,,,,,,,y , , , , ,,,y cc,,, , , , ,,,,,M,MMMMMMMMMMMMMMMMM,,,,,,,,,,,,,,,c ,,,,,,,,,,AAAAAA,,,, , , , ,,,MMMMcccc,,,,,ccc,,,,,,,,,,,,,,,, , , , , , , , , ,,,,,,M,dMM,,MMMM,,^MMMMMANcHHHHHHHHHHHH '.6@LVajou|  *4AMX^`bdfhjlnprtvxz|~!,3>ELVbpvy !$-4;GQX_kuy"(+4;BNX_fr| !)07COZelsz*7COTY`gow~ $).5<CJWdkr~ "+4;BO\cjot{   + 6 = D L T \ c k s {    # + 3 ; C K S [ c k s {    ' 3 ? L Y f s {    # + 3 ; C K S [ e o z    ' / 7 ? G O W _ g o w  '/7?GOW_gow'/7?GOW_gow'/7?GOW_gow%,3=GOW_gow'/7?GOW_gow'/7?GOW_gow %-5=EMU]epw~ %4=IUcks{ $,4<DGJchar0spaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitildespaceexclamdowncentsterlingcurrencyyenbrokenbarsectiondieresiscopyrightordfeminineguillemotleftlogicalnothyphenregisteredmacrondegreeplusminustwosuperiorthreesuperioracutemuparagraphperiodcenteredcedillaonesuperiorordmasculineguillemotrightonequarteronehalfthreequartersquestiondownAgraveAacuteAcircumflexAtildeAdieresisAringAECcedillaEgraveEacuteEcircumflexEdieresisIgraveIacuteIcircumflexIdieresisEthNtildeOgraveOacuteOcircumflexOtildeOdieresismultiplyOslashUgraveUacuteUcircumflexUdieresisYacuteThorngermandblsagraveaacuteacircumflexatildeadieresisaringaeccedillaegraveeacuteecircumflexedieresisigraveiacuteicircumflexidieresisethntildeograveoacuteocircumflexotildeodieresisdivideoslashugraveuacuteucircumflexudieresisyacutethornydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacuteCcircumflexccircumflexCdotaccentcdotaccentCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreveEdotaccentedotaccentEogonekeogonekEcaronecaronGcircumflexgcircumflexGbrevegbreveGdotaccentgdotaccentGcommaaccentgcommaaccentHcircumflexhcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIdotaccentdotlessiIJijJcircumflexjcircumflexKcommaaccentkcommaaccentkgreenlandicLacutelacuteLcommaaccentlcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacuteNcommaaccentncommaaccentNcaronncaronnapostropheEngengOmacronomacronObreveobreveOhungarumlautohungarumlautOEoeRacuteracuteRcommaaccentrcommaaccentRcaronrcaronSacutesacuteScircumflexscircumflexScedillascedillaScaronscaronTcommaaccenttcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuringUhungarumlautuhungarumlautUogonekuogonekWcircumflexwcircumflexYcircumflexycircumflexYdieresisZacutezacuteZdotaccentzdotaccentZcaronzcaronuni0186uni0189uni018Eflorinuni0197uni019Auni019Duni019FOhornohornUhornuhornuni01B5uni01B6uni01BBuni01BCuni01C0uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01F0uni01F4uni01F5uni01F8uni01F9AringacutearingacuteAEacuteaeacuteOslashacuteoslashacuteScommaaccentscommaaccentTcommaaccenttcommaaccentuni021Euni021Funi0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0250uni0259uni025Funi0265uni0275uni0279uni0287uni0289uni028Cuni028Duni028Euni029Euni02BBafii57929afii64937circumflexcaronuni02C8macronuni02CAuni02CBuni02CDuni02CEuni02CFbrevedotaccentringogonektildehungarumlautuni02EEuni037Etonosdieresistonosanoteleiamuuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacuteWdieresiswdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1EA0uni1EA1uni1EA4uni1EA5uni1EA6uni1EA7uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC4uni1EC5uni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED0uni1ED1uni1ED2uni1ED3uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2010uni2011figuredashendashemdashafii00208quoteleftquoterightquotesinglbasequotereversedquotedblleftquotedblrightquotedblbaseuni201Fdaggerdaggerdblbulletellipsisperthousandguilsinglleftguilsinglrightfractiononeinferiortwoinferiorthreeinferioruni20A5uni20A6uni20A9Eurouni20ADuni2103uni2109trademarkuni212Auni212Buni2132minusfractionperiodcentereduni2236uni2259uni225Anotequalequivalenceuni2262lessequalgreaterequaluni226Euni226Funi2270uni2271fiflpillow-2.3.0/Tests/test_imagemode.py0000644000175000001440000000100212257506326016340 0ustar dokousersfrom tester import * from PIL import Image from PIL import ImageMode ImageMode.getmode("1") ImageMode.getmode("L") ImageMode.getmode("P") ImageMode.getmode("RGB") ImageMode.getmode("I") ImageMode.getmode("F") m = ImageMode.getmode("1") assert_equal(m.mode, "1") assert_equal(m.bands, ("1",)) assert_equal(m.basemode, "L") assert_equal(m.basetype, "L") m = ImageMode.getmode("RGB") assert_equal(m.mode, "RGB") assert_equal(m.bands, ("R", "G", "B")) assert_equal(m.basemode, "RGB") assert_equal(m.basetype, "L") pillow-2.3.0/Tests/test_image_load.py0000644000175000001440000000022412257506326016477 0ustar dokousersfrom tester import * from PIL import Image def test_sanity(): im = lena() pix = im.load() assert_equal(pix[0, 0], (223, 162, 133)) pillow-2.3.0/map.c0000644000175000001440000002355212257512250012626 0ustar dokousers/* * The Python Imaging Library. * * standard memory mapping interface for the Imaging library * * history: * 1998-03-05 fl added Win32 read mapping * 1999-02-06 fl added "I;16" support * 2003-04-21 fl added PyImaging_MapBuffer primitive * * Copyright (c) 1998-2003 by Secret Labs AB. * Copyright (c) 2003 by Fredrik Lundh. * * See the README file for information on usage and redistribution. */ /* * FIXME: should move the memory mapping primitives into libImaging! */ #include "Python.h" #include "Imaging.h" #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #undef INT8 #undef UINT8 #undef INT16 #undef UINT16 #undef INT32 #undef INT64 #undef UINT32 #include "windows.h" #endif #include "py3.h" /* compatibility wrappers (defined in _imaging.c) */ extern int PyImaging_CheckBuffer(PyObject* buffer); extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); /* -------------------------------------------------------------------- */ /* Standard mapper */ typedef struct { PyObject_HEAD char* base; int size; int offset; #ifdef WIN32 HANDLE hFile; HANDLE hMap; #endif } ImagingMapperObject; static PyTypeObject ImagingMapperType; ImagingMapperObject* PyImaging_MapperNew(const char* filename, int readonly) { ImagingMapperObject *mapper; if (PyType_Ready(&ImagingMapperType) < 0) return NULL; mapper = PyObject_New(ImagingMapperObject, &ImagingMapperType); if (mapper == NULL) return NULL; mapper->base = NULL; mapper->size = mapper->offset = 0; #ifdef WIN32 mapper->hFile = (HANDLE)-1; mapper->hMap = (HANDLE)-1; /* FIXME: currently supports readonly mappings only */ mapper->hFile = CreateFile( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (mapper->hFile == (HANDLE)-1) { PyErr_SetString(PyExc_IOError, "cannot open file"); PyObject_Del(mapper); return NULL; } mapper->hMap = CreateFileMapping( mapper->hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (mapper->hMap == (HANDLE)-1) { CloseHandle(mapper->hFile); PyErr_SetString(PyExc_IOError, "cannot map file"); PyObject_Del(mapper); return NULL; } mapper->base = (char*) MapViewOfFile( mapper->hMap, FILE_MAP_READ, 0, 0, 0); mapper->size = GetFileSize(mapper->hFile, 0); #endif return mapper; } static void mapping_dealloc(ImagingMapperObject* mapper) { #ifdef WIN32 if (mapper->base != 0) UnmapViewOfFile(mapper->base); if (mapper->hMap != (HANDLE)-1) CloseHandle(mapper->hMap); if (mapper->hFile != (HANDLE)-1) CloseHandle(mapper->hFile); mapper->base = 0; mapper->hMap = mapper->hFile = (HANDLE)-1; #endif PyObject_Del(mapper); } /* -------------------------------------------------------------------- */ /* standard file operations */ static PyObject* mapping_read(ImagingMapperObject* mapper, PyObject* args) { PyObject* buf; int size = -1; if (!PyArg_ParseTuple(args, "|i", &size)) return NULL; /* check size */ if (size < 0 || mapper->offset + size > mapper->size) size = mapper->size - mapper->offset; if (size < 0) size = 0; buf = PyBytes_FromStringAndSize(NULL, size); if (!buf) return NULL; if (size > 0) { memcpy(PyBytes_AsString(buf), mapper->base + mapper->offset, size); mapper->offset += size; } return buf; } static PyObject* mapping_seek(ImagingMapperObject* mapper, PyObject* args) { int offset; int whence = 0; if (!PyArg_ParseTuple(args, "i|i", &offset, &whence)) return NULL; switch (whence) { case 0: /* SEEK_SET */ mapper->offset = offset; break; case 1: /* SEEK_CUR */ mapper->offset += offset; break; case 2: /* SEEK_END */ mapper->offset = mapper->size + offset; break; default: /* FIXME: raise ValueError? */ break; } Py_INCREF(Py_None); return Py_None; } /* -------------------------------------------------------------------- */ /* map entire image */ extern PyObject*PyImagingNew(Imaging im); static void ImagingDestroyMap(Imaging im) { return; /* nothing to do! */ } static PyObject* mapping_readimage(ImagingMapperObject* mapper, PyObject* args) { int y, size; Imaging im; char* mode; int xsize; int ysize; int stride; int orientation; if (!PyArg_ParseTuple(args, "s(ii)ii", &mode, &xsize, &ysize, &stride, &orientation)) return NULL; if (stride <= 0) { /* FIXME: maybe we should call ImagingNewPrologue instead */ if (!strcmp(mode, "L") || !strcmp(mode, "P")) stride = xsize; else if (!strcmp(mode, "I;16") || !strcmp(mode, "I;16B")) stride = xsize * 2; else stride = xsize * 4; } size = ysize * stride; if (mapper->offset + size > mapper->size) { PyErr_SetString(PyExc_IOError, "image file truncated"); return NULL; } im = ImagingNewPrologue(mode, xsize, ysize); if (!im) return NULL; /* setup file pointers */ if (orientation > 0) for (y = 0; y < ysize; y++) im->image[y] = mapper->base + mapper->offset + y * stride; else for (y = 0; y < ysize; y++) im->image[ysize-y-1] = mapper->base + mapper->offset + y * stride; im->destroy = ImagingDestroyMap; if (!ImagingNewEpilogue(im)) return NULL; mapper->offset += size; return PyImagingNew(im); } static struct PyMethodDef methods[] = { /* standard file interface */ {"read", (PyCFunction)mapping_read, 1}, {"seek", (PyCFunction)mapping_seek, 1}, /* extensions */ {"readimage", (PyCFunction)mapping_readimage, 1}, {NULL, NULL} /* sentinel */ }; static PyTypeObject ImagingMapperType = { PyVarObject_HEAD_INIT(NULL, 0) "ImagingMapper", /*tp_name*/ sizeof(ImagingMapperObject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ (destructor)mapping_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ }; PyObject* PyImaging_Mapper(PyObject* self, PyObject* args) { char* filename; if (!PyArg_ParseTuple(args, "s", &filename)) return NULL; return (PyObject*) PyImaging_MapperNew(filename, 1); } /* -------------------------------------------------------------------- */ /* Buffer mapper */ typedef struct ImagingBufferInstance { struct ImagingMemoryInstance im; PyObject* target; Py_buffer view; } ImagingBufferInstance; static void mapping_destroy_buffer(Imaging im) { ImagingBufferInstance* buffer = (ImagingBufferInstance*) im; PyBuffer_Release(&buffer->view); Py_XDECREF(buffer->target); } PyObject* PyImaging_MapBuffer(PyObject* self, PyObject* args) { Py_ssize_t y, size; Imaging im; PyObject* target; Py_buffer view; char* mode; char* codec; PyObject* bbox; Py_ssize_t offset; int xsize, ysize; int stride; int ystep; if (!PyArg_ParseTuple(args, "O(ii)sOn(sii)", &target, &xsize, &ysize, &codec, &bbox, &offset, &mode, &stride, &ystep)) return NULL; if (!PyImaging_CheckBuffer(target)) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return NULL; } if (stride <= 0) { if (!strcmp(mode, "L") || !strcmp(mode, "P")) stride = xsize; else if (!strncmp(mode, "I;16", 4)) stride = xsize * 2; else stride = xsize * 4; } size = (Py_ssize_t) ysize * stride; /* check buffer size */ if (PyImaging_GetBuffer(target, &view) < 0) return NULL; if (view.len < 0) { PyErr_SetString(PyExc_ValueError, "buffer has negative size"); return NULL; } if (offset + size > view.len) { PyErr_SetString(PyExc_ValueError, "buffer is not large enough"); return NULL; } im = ImagingNewPrologueSubtype( mode, xsize, ysize, sizeof(ImagingBufferInstance) ); if (!im) return NULL; /* setup file pointers */ if (ystep > 0) for (y = 0; y < ysize; y++) im->image[y] = (char*)view.buf + offset + y * stride; else for (y = 0; y < ysize; y++) im->image[ysize-y-1] = (char*)view.buf + offset + y * stride; im->destroy = mapping_destroy_buffer; Py_INCREF(target); ((ImagingBufferInstance*) im)->target = target; ((ImagingBufferInstance*) im)->view = view; if (!ImagingNewEpilogue(im)) return NULL; return PyImagingNew(im); }