pax_global_header00006660000000000000000000000064147521126470014523gustar00rootroot0000000000000052 comment=6959cc97361c8cc726d6d7a45beab04552ac61cd libvips-lua-vips-6959cc9/000077500000000000000000000000001475211264700153065ustar00rootroot00000000000000libvips-lua-vips-6959cc9/.busted000066400000000000000000000001611475211264700165730ustar00rootroot00000000000000return { default = { helper = "./spec/helpers.lua", coverage = os.getenv("TEST_COVERAGE") == "1" } } libvips-lua-vips-6959cc9/.github/000077500000000000000000000000001475211264700166465ustar00rootroot00000000000000libvips-lua-vips-6959cc9/.github/workflows/000077500000000000000000000000001475211264700207035ustar00rootroot00000000000000libvips-lua-vips-6959cc9/.github/workflows/ci.yml000066400000000000000000000066041475211264700220270ustar00rootroot00000000000000name: "CI" on: [push, pull_request] jobs: unix: strategy: fail-fast: false matrix: luaVersion: ["5.1", "5.2", "5.3", "5.4", "luajit-openresty"] os: ["ubuntu-latest", "macos-latest"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: leafo/gh-actions-lua@v10 with: luaVersion: ${{ matrix.luaVersion }} - uses: leafo/gh-actions-luarocks@v4 - name: Install Ubuntu dependencies if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install --no-install-recommends libvips-dev - name: Install macOS dependencies if: runner.os == 'macOS' run: | brew install vips echo "DYLD_LIBRARY_PATH=$(brew --prefix vips)/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV - name: Install lua-vips run: | if [[ ${{ matrix.luaVersion }} == luajit* ]]; then luarocks config --scope system rocks_provided.luaffi-tkl 2.1-1 fi luarocks make - name: Lint with luacheck run: | luarocks install luacheck luacheck -q . - name: Busted tests run: | luarocks test spec/ -- -o gtest -v spec windows: strategy: fail-fast: false matrix: lua: [ #{name: "lua51", exe: "lua5.1", version: 5.1, incdir: "/mingw64/include/lua5.1/"}, #(two tests are failing) {name: "lua53", exe: "lua5.3", version: 5.3, incdir: "/mingw64/include/lua5.3/"}, {name: "lua", exe: "lua", version: 5.4, incdir: "/mingw64/include/"}, {name: "luajit", exe: "luajit", version: 5.1, incdir: "/mingw64/include/luajit-2.1/"} ] runs-on: windows-latest defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v4 - uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: true install: git make mingw-w64-x86_64-toolchain mingw-w64-x86_64-libvips mingw-w64-x86_64-openslide mingw-w64-x86_64-libheif mingw-w64-x86_64-libjxl mingw-w64-x86_64-imagemagick mingw-w64-x86_64-poppler mingw-w64-x86_64-lua-luarocks mingw-w64-x86_64-${{ matrix.lua.name }} - name: Lua dependencies run: | if [[ ${{ matrix.lua.exe }} == lua5.3 ]]; then cp /mingw64/etc/luarocks/config-5.{4,3}.lua fi luarocks config --scope system lua_version ${{ matrix.lua.version }} luarocks config --scope system lua_interpreter ${{ matrix.lua.exe }}.exe luarocks config --scope system variables.LUA_DIR /mingw64/bin luarocks config --scope system variables.LUA_INCDIR ${{ matrix.lua.incdir }} if [[ ${{ matrix.lua.exe }} == luajit ]]; then luarocks config --scope system rocks_provided.luaffi-tkl 2.1-1 fi - name: Add to PATH run: | echo $RUNNER_TEMP/msys64/mingw64/bin:$HOME/.luarocks/bin >> $GITHUB_PATH - name: Install lua-vips run: | luarocks make - name: Lint with luacheck run: | luarocks install luacheck luacheck.bat -q . - name: Busted tests run: | luarocks test spec -- --lua=${{ matrix.lua.exe }} -o gtest -v libvips-lua-vips-6959cc9/.gitignore000066400000000000000000000001101475211264700172660ustar00rootroot00000000000000.*.swp lua-vips-*.src.rock # LuaCov luacov.stats.out luacov.report.out libvips-lua-vips-6959cc9/.luacheckrc000066400000000000000000000001461475211264700174140ustar00rootroot00000000000000files["spec/**/*.lua"] = { std = "+busted", } exclude_files = { ".install", ".luarocks", ".lua" } libvips-lua-vips-6959cc9/CHANGELOG.md000066400000000000000000000033221475211264700171170ustar00rootroot00000000000000# Changelog All notable changes to `lua-vips` will be documented in this file. # master # 1.1-12 - 2025-02-09 - add `vips.Connection`, `vips.Source` and `vips.Target` for true streaming support [rolandlo] # 1.1-11 - 2024-04-16 - add standard Lua support [rolandlo] - add `vips.Interpolate` [jcupitt, rolandlo] - add `vips.concurrency_get()` and `set()` [kamyabzad] - add `hasalpha`/`addalpha` [RiskoZoSlovenska] # 1.1-10 - 2021-04-18 - fix NYI warnings [kleisauke] # 1.1-9 - 2018-08-03 - add `vips.leak_set()` [jcupitt] - add `soak.lua` example [jcupitt] - fix five minor memleaks [kleisauke] - update links for new home [jcupitt] # 1.1-8 - 2018-07-25 - cleanups and some reorganisation [kleisauke] - fix regressions from 1.1-7 [kleisauke] - add `find_load` [kleisauke] - add `find_load_buffer` [kleisauke] # 1.1-7 - 2018-03-23 - cleanups and some reorganisation - renamed cache control funcs, the names were missing the `cache_` prefix - fix `image:remove()` [kleisauke] # 1.1-6 - 2018-03-23 - add operation cache control # 1.1-5 - 2017-10-09 - add verror: handle libvips error buffer - add version: handle libvips version numbers - add `gvalue.to_enum`: wrap up enum encoding - add `composite` - add `new_from_memory` - add `write_to_memory` - remove `[]` and `#` overloads -- too confusing, and they broke debuggers # 1.1-4 - 2017-08-30 - small doc fixes - fix get() on gobject enum properties with older libvips - test for gobject enum properties as strings # 1.1-3 - 2017-08-08 - more Windows fixes - fix a callback leak with buffers, thanks wuyachao # 1.1-2 - 2017-07-21 - fix "-" characters in arg names # 1.1-1 - 2017-06-19 - tweaks to help LuaJIT on Windows # 1.0-1 - 2017-06-04 - first API stable release libvips-lua-vips-6959cc9/LICENSE000066400000000000000000000021001475211264700163040ustar00rootroot00000000000000MIT License Copyright (c) 2017 John Cupitt 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. libvips-lua-vips-6959cc9/README.md000066400000000000000000000565351475211264700166030ustar00rootroot00000000000000# lua-vips [![CI](https://github.com/libvips/lua-vips/workflows/CI/badge.svg)](https://github.com/libvips/lua-vips/actions) This is a Lua binding for the [libvips image processing library](http://libvips.github.io/libvips). `libvips` is a [fast image processing library with low memory needs](https://github.com/jcupitt/lua-vips-bench). `lua-vips` uses ffi and needs either - luajit >= 2.0 or - standard Lua (5.1 up to 5.4) combined with the [`luaffi-tkl`](https://luarocks.org/modules/sudheerhebbale/luaffi-tkl) Lua package. On the x64 architecture `lua-vips` is continuously tested - on Linux and MacOS with Lua 5.1, 5.2, 5.3, 5.4 and openresty-luajit - on Windows using [MSYS2 MinGW-w64](https://www.msys2.org/) with Lua 5.3, 5.4 and luajit `lua-vips` should work on arm64 (recently tested on a Pinephone Pro using PostmarketOS) and possibly x86 (currently untested) as well. The libvips documentation includes a handy searchable table of [every operation in libvips](http://libvips.github.io/libvips/API/current/func-list.html). This is a good place to check if it supports some feature you need. Read on to see how to call libvips operations. # Example [Install the libvips shared library](https://libvips.github.io/libvips/install.html), then install this rock with: ```shell luarocks install lua-vips ``` When used with LuaJIT please first exhibit luaffi-tkl as provided by the VM via: ```shell luarocks config --lua-version=5.1 rocks_provided.luaffi-tkl 2.1-1 ``` Example: ```lua local vips = require "vips" -- fast thumbnail generator local image = vips.Image.thumbnail("somefile.jpg", 128) image:write_to_file("tiny.jpg") -- make a new image with some text rendered on it image = vips.Image.text("Hello World!", {dpi = 300}) -- call a method image = image:invert() -- use the `..` operator to join images bandwise image = image .. image .. image -- add a constant image = image + 12 -- add a different value to each band image = image + { 1, 2, 3 } -- add two images image = image + image -- split bands up again b1, b2, b3 = image:bandsplit() -- read a pixel from coordinate (10, 20) r, g, b = image(10, 20) -- make all pixels less than 128 bright blue -- :less(128) makes an 8-bit image where each band is 255 (true) if that -- value is less than 128, and 0 (false) if it's >= 128 ... you can use --- images or {1,2,3} constants as well as simple values -- :bandand() joins all image bands together with bitwise AND, so you get a -- one-band image which is true where all bands are true -- condition:ifthenelse(then, else) takes a condition image and uses true or -- false values to pick pixels from the then or else images ... then and -- else can be constants or images image = image:less(128):bandand():ifthenelse({ 0, 0, 255 }, image) -- go to Yxy colourspace image = image:colourspace("yxy") -- pass options to a save operation image:write_to_file("x.png", { compression = 9 }) ``` # How it works libvips has quite a bit of introspection machinery built in. When you call something like `image:hough_circle{ scale = 4 }`, the `__index` method on the `lua-vips` image class opens libvips with ffi and searches for an operation called `hough_circle`. It discovers what arguments the operation takes, checks you supplied the correct arguments, and transforms them into the form that libvips needs. It executes the operator, then pulls out all the results and returns them as a Lua table. This means that, although `lua-vips` supports almost 300 operators, the binding itself is small, should be simple to maintain, and should always be up to date. # Getting more help The libvips website has a handy table of [all the libvips operators](http://libvips.github.io/libvips/API/current/func-list.html). Each one links to the main API docs so you can see what you need to pass to it. A simple way to see the arguments for an operation is to try running it from the command-line. For example: ```bash $ vips embed embed an image in a larger image usage: embed in out x y width height where: in - Input image, input VipsImage out - Output image, output VipsImage x - Left edge of input in output, input gint default: 0 min: -1000000000, max: 1000000000 y - Top edge of input in output, input gint default: 0 min: -1000000000, max: 1000000000 width - Image width in pixels, input gint default: 1 min: 1, max: 1000000000 height - Image height in pixels, input gint default: 1 min: 1, max: 1000000000 optional arguments: extend - How to generate the extra pixels, input VipsExtend default: black allowed: black, copy, repeat, mirror, white, background background - Color for background pixels, input VipsArrayDouble operation flags: sequential ``` So you can call `embed` like this: ```lua local image = image:embed(100, 100, image:width() + 200, image:height() + 200, { extend = "mirror" }) ``` To add a 100 pixel mirror edge around an image. # Features This section runs through the main features of the binding. To load the binding use: ```lua local vips = require "vips" ``` ## Make images You can make images from files or from buffers (Lua strings), you can wrap a vips image around an ffi array, or you can use one of the libvips create operators to make an image for you. ### `image = vips.Image.new_from_file(filename [, options])` Opens the file and returns an image. You can pass a set of options in a final table argument, for example: ```lua local image = vips.Image.new_from_file("somefile.jpg", { access = "sequential" }) ``` Some options are specific to some file types, for example, `shrink`, meaning shrink by an integer factor during load, only applies to images loaded via libjpeg. You can embed options in filenames using the standard libvips syntax. For example, these are equivalent: ```lua local image = vips.Image.new_from_file("somefile.jpg", { shrink = 2 }) local image = vips.Image.new_from_file("somefile.jpg[shrink=2]") ``` You can call specific file format loaders directly, for example: ```lua local image = vips.Image.jpegload("somefile.jpg", { shrink = 4 }) ``` The [loader section in the API docs](http://libvips.github.io/libvips/API/current/VipsForeignSave.html) lists all loaders and their options. ### `image = vips.Image.new_from_buffer(string [, string_options, options])` The string argument should contain an image file in some container format, such as JPEG. You can supply options, just as with `new_from_file`. These are equivalent: ```lua local image = vips.Image.new_from_buffer(string, "", { shrink = 2 }) local image = vips.Image.new_from_buffer(string, "shrink=2") ``` Use (for example) `vips.Image.jpegload_buffer` to call a loader directly. ### `image = vips.Image.new_from_memory(data, width, height, bands, format)` This wraps a libvips image around a FFI memory array. The memory array should be formatted as a C-style array. Images are always band-interleaved, so an RGB image three pixels across and two pixels down, for example, is laid out as: ``` RGBRGBRGB RGBRGBRGB ``` Example: ```lua local width = 64 local height = 32 local data = ffi.new("unsigned char[?]", width * height) local im = vips.Image.new_from_memory(data, width, height, 1, "uchar") ``` The returned image is using a pointer to the `data` area, but the Lua/LuaJIT interpreter won't always know this. You should keep a reference to `data` alive for as long as you are using any downstream images, or you'll get a crash. ### `image = vips.Image.new_from_memory_ptr(data, size, width, height, bands, format)` Same as `new_from_memory`, but for any kind of data pointer (non-FFI allocated) by specifying the length of the data in bytes. The pointed data must be valid for the lifespan of the image and any downstream images. A string can be used as the data pointer thanks to FFI semantics. ### `image = vips.Image.new_from_image(image, pixel)` Makes a new image with the size, format, and resolution of `image`, but with each pixel having the value `pixel`. For example: ```lua local new_image = vips.Image.new_from_image(image, 12) ``` Will make a new image with one band where every pixel has the value 12. You can call it as a member function. `pixel` can be a table to make a many-band image, for example: ```lua local new_image = image:new_from_image{ 1, 2, 3 } ``` Will make a new three-band image, where all the red pixels have the value 1, greens are 2 and blues are 3. ### `image = vips.Image.new_from_array(array [, scale [, offset]])` Makes a new image from a Lua table. For example: ```lua local image = vips.Image.new_from_array{ 1, 2, 3 } ``` Makes a one-band image, three pixels across and one high. Use nested tables for 2D images. You can set a scale and offset with two extra number parameters -- handy for integer convolution masks. ```lua local mask = vips.Image.new_from_array( {{-1, -1, -1}, {-1, 16, -1}, {-1, -1, -1}}, 8) local image = image:conv(mask, { precision = "integer" }) ``` ### `image = vips.Image.copy_memory(self)` The image is rendered to a large memory buffer, and a new image is returned which represents the memory area. This is handy for breaking a pipeline. ### `image = vips.Image.black(width, height)` Makes a new one band, 8 bit, black image. You can call any of the libvips image creation operators in this way, for example: ```lua local noise = vips.Image.perlin(256, 256, { cell_size = 128 }) ``` See: [http://libvips.github.io/libvips/API/current/libvips-create.html](http://libvips.github.io/libvips/API/current/libvips-create.html) ## Get and set image metadata You can read and write aribitrary image metadata. ### `number = vips.Image.get_typeof(image, field_name)` This returns the GType for a field, or 0 if the field does not exist. `vips.gvalue` has a set of GTypes you can check against. ### `mixed = vips.Image.get(image, field_name)` This reads any named piece of metadata from the image, for example: ```lua local version = image:get("exif-ifd2-ExifVersion") ``` The item is converted to some Lua type in the obvious way. There are convenient shortcuts for many of the standard fields, so these are equivalent: ```lua local width = image:get("width") local width = image:width() ``` If the field does not exist, `lua-vips` will throw an error. Use `get_typeof` to check for the existence of a field. ### `vips.Image.set_type(image, gtype, field_name, value)` This creates a new metadata item of the specified type, name and value. ### `vips.Image.set(image, field_name, value)` This changes the value of an existing field, but will not change its type. You can't use `set()` to change core fields such as like `width` or `interpretation`. Use `copy()` instead. Image references will be shared by the operation cache, so modifying an image can change an image somewhere else in your program. Before changing an image, you must make sure you own a private copy of an image with `copy`. ```lua local new_image = image:copy() new_image:set("orientation", 7) ``` ### `boolean = vips.Image.remove(image, field_name)` This will remove a piece of metadata. It returns `true` if an item was successfully removed, `false` otherwise. As with `set`, you must use copy before removing a metadata item. ## Call any libvips operation You can call any libvips operation as a member function, for example `hough_circle`, the circular Hough transform: [http://libvips.github.io/libvips/API/current/libvips-arithmetic.html#vips-hough-circle](http://libvips.github.io/libvips/API/current/libvips-arithmetic.html#vips-hough-circle) Can be called from Lua like this: ```lua local image2 = image:hough_circle{ scale = 2, max_radius = 50 } ``` The rules are: 1. `self` is used to set the first required input image argument. 2. If you supply one more argument than the number of required arguments, and the final argument you supply is a table, that extra table is used to set any optional input arguments. 3. If you supply a constant (a number, or a table of numbers) and libvips wants an image, your constant is automatically turned into an image using the first input image you supplied as a guide. 4. For enums, you can supply a number or a string. The string is an enum member nickname (the part after the final underscore). 5. `MODIFY` arguments, for example the image you pass to `draw_circle`, are copied to memory before being set, and the new image is returned as one of the results. 6. Operation results are returned as an unpacked array in the order: all required output args, then all optional output args, then all deprecated output args. You can write (for example): ```lua max_value = image:max() ``` To get the maximum value from an image. If you look at [the `max` operator](http://libvips.github.io/libvips/API/current/libvips-arithmetic.html#vips-max), it can actually return a lot more than this. You can write: ```lua max_value, x, y = image:max() ``` To get the position of the maximum, or: ```lua max_value, x, y, maxes = image:max{ size = 10 } ``` and `maxes` will be an array of the top 10 maximum values in order. ## Operator overloads The Lua operators are overloaded in the obvious way, so you can write (for example): ```lua image = (image * 2 + 13) % 4 ``` and the appropriate vips operations will be called. You can mix images, number constants, and array constants freely. The relational operators are not overloaded, unfortunately; Lua does not permit this. You must write something like: ```lua image = image:less(128):ifthenelse(128, image) ``` to set all values less than 128 to 128. `__call` (ie. `()`) is overloaded to call the libvips `getpoint` operator. You can write: ```lua image = vips.Image.new_from_file("k2.jpg") r, g, b = image(10, 10) ``` and `r`, `g`, `b` will be the RGB values for the pixel at coordinate (10, 10). `..` is overloaded to mean `bandjoin`. Use `im:bands()` to get the number of bands and `im:extract_band(N)` to extract a band (note bands number from zero). lua-vips does not overload `#` and `[]` for this, since mixing numbering from zero and one causes confusion. ## Convenience functions A set of convenience functions are also defined. ### `array = image:bandsplit()` This splits a many-band image into an array of one band images. ### `image:bandjoin()` The `bandjoin` operator takes an array of images as input. This can be awkward to call --- you must write: ```lua image = vips.Image.bandjoin{ image, image } ``` to join an image to itself. Instead, `lua-vips` defines `bandjoin` as a member function, so you write: ```lua image = image:bandjoin(image) ``` to join an image to itself, or perhaps: ```lua image = R:bandjoin{ G, B } ``` to join three RGB bands. Constants work too, so you can write: ```lua image = image:bandjoin(255) image = R:bandjoin{ 128, 23 } ``` The `bandrank` and `composite` operators works in the same way. ### `image = condition_image:ifthenelse(then_image, else_image [, options])` This uses the condition image to pick pixels between then and else. Unlike all other operators, if you use a constant for `then_image` or `else_image`, they first match to each other, and only match to the condition image if both then and else are constants. ### `image = image:sin()` Many vips arithmetic operators are implemented by larger operators which take an enum to set their action. For example, sine is implemented by the `math` operator, so you must write: ```lua image = image:math("sin") ``` This is annoying, so a set of convenience functions are defined to enable you to write: ```lua image = image:sin() ``` There are about 40 of these. ## Write You can write images to files, to ffi arrays, or to formatted strings. ### `image:write_to_file(filename [, options])` The filename suffix is used to pick the save operator. Just as with `new_from_file`, not all options will be correct for all file types. You can call savers directly if you wish, for example: ```lua image:jpegsave("x.jpg", { Q = 90 }) ``` ### `string = image:write_to_buffer(suffix [, options])` The suffix is used to pick the saver that is used to generate the result, so `".jpg"` will make a JPEG-formatted string. Again, you can call the savers directly if you wish, perhaps: ```lua local str = image:jpegsave_buffer{ Q = 90 } ``` ### `memory = image:write_to_memory()` A large ffi char array is allocated and the image is rendered to it. ```lua local mem = image:write_to_memory() print("written ", ffi.sizeof(mem), "bytes to", mem) ``` ### `ptr, size = image:write_to_memory_ptr()` An allocated char array pointer (GCd with a `ffi.gc` callback) and the length in bytes of the image data is directly returned from libvips (no intermediate FFI allocation). ## True Streaming When processing images an image library would usually read an image from a file into memory, decode and process it and finally write the encoded result into a file. The processing can only start when the image is fully read into memory and the writing can only start when the processing step is completed. Libvips can process images directly from a pipe and write directly to a pipe, without the need to read the whole image to memory before being able to start and without the need to finish processing before being able to start writing. This is achieved using a technique called true streaming. In this context there are sources and targets and the processing step happens from source to target. Sources can be created from files, memory or descriptors (like stdin) and targets can be created to files, memory or descriptors (like stdout). Here is an example: ```lua test.lua local vips = require "vips" local stdin, stdout = 0, 1 local source = vips.Source.new_from_descriptor(stdin) local target = vips.Target.new_to_descriptor(stdout) local image = vips.Image.new_from_source(source, '', { access = 'sequential' }) image = image:invert() image:write_to_target(target, '.jpg') ``` Running this script in a Unix terminal via ```term curl https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/600px-Cat03.jpg | lua test.lua > out.jpg ``` will feed a cat image from the internet into standard input, from which the Lua script reads and inverts it and writes it to standard output, where it is redirected to a file. This all happens simultaneously, so the processing and writing doesn't need to wait until the whole image is downloaded from the internet. ## Error handling Most `lua-vips` methods will call `error()` if they detect an error. Use `pcall()` to call a method and catch an error. Use `get_typeof` to test for a field of a certain name without throwing an error. ## The libvips operation cache libvips keeps a cache of recent operations, such as load, save, shrink, and so on. If you repeat an operation, you'll get the cached result back. It keeps track of the number of open files, allocated memory and cached operations, and will trim the cache if more than 100 files are open at once, more than 100mb of memory has been allocated, or more than 1,000 operations are being held. Normally this cache is useful and harmless, but for some applications you may want to change these values. ```lua -- set number of cached operations vips.cache_set_max(100) -- set maximum cache memory use vips.cache_set_max_mem(10 * 1024 * 1024) -- set maximum number of open files vips.cache_set_max_files(10) ``` # Development ### Setup for Ubuntu Configure `luarocks` for a local tree ```shell luarocks help path ``` append ```shell eval `luarocks path` export PATH="$HOME/.luarocks/bin:$PATH" ``` to `~/.bashrc`. ### Install ```shell luarocks --local make ``` ### Unit testing You need: ```shell luarocks --local install busted luarocks --local install luacov luarocks --local install say ``` Then to run the test suite: ```shell busted . ``` for verbose output: ```shell busted . -o gtest -v ``` ### Linting and static analysis You need: ```shell luarocks --local install luacheck ``` Then to run the linter: ```shell luacheck . ``` ### Test Run the example script with: ```shell lua example/hello-world.lua ``` ### Update rock ```shell rm *.src.rock luarocks upload lua-vips-1.1-12.rockspec --api-key=xxxxxxxxxxxxxx ``` ### Links http://luajit.org/ext_ffi_api.html http://luajit.org/ext_ffi_semantics.html https://github.com/luarocks/luarocks/wiki/creating-a-rock https://olivinelabs.com/busted/ ### Running on Windows using Mingw-w64 Installing `lua-vips` on Windows is a bit harder than on Unix systems. We recommend using MinGW (Minimalist GNU for Windows) for the installation. Here are the steps: 1. Install [MSYS2](https://www.msys2.org/) to the default path. 2. Start Mingw-w64 64bit console from the start menu. Check that is says MINGW64. The following steps happen in that console. 3. Update MSYS2 using ```shell pacman -Syuu ``` 4. Install the build tools (including Lua 5.4 and Luarocks) via ```shell pacman -S git make mingw-w64-x86_64-toolchain mingw-w64-x86_64-lua-luarocks ``` 5. Install `libvips` with (optional) dependencies via ```shell pacman -S mingw-w64-x86_64-libvips mingw-w64-x86_64-openslide mingw-w64-x86_64-libheif mingw-w64-x86_64-libjxl mingw-w64-x86_64-imagemagick mingw-w64-x86_64-poppler ``` 6. Optionally: If you want to use `lua-vips` with LuaJIT instead of Lua 5.4 install LuaJIT via ```shell pacman -S mingw-w64-x86_64-luajit luarocks config --scope system lua_version 5.1 luarocks config --scope system lua_interpreter luajit.exe luarocks config --scope system variables.LUA_DIR /mingw64/bin luarocks config --scope system variables.LUA_INCDIR /mingw64/include/luajit-2.1/ luarocks config --scope system rocks_provided.luaffi-tkl 2.1-1 ``` 7. Install `lua-vips` via ```shell luarocks install lua-vips ``` or clone the repository and run `luarocks make` in the `lua-vips` folder. 8. Add `C:\msys64\mingw64\bin` and `C:\msys64\usr\bin` to the top of your `PATH` environment variable in the Windows Advanced system settings and restart the console. 9. Run `lua` or `luajit` and try ```lua vips = require "vips" print(vips.Image.xyz(3,2)) ``` ### Running under Wine (Windows emulation on Linux) @jcupitt used the luapower all-in-one to get a 64-bit Windows LuaJIT build: https://luapower.com/ LuaJIT on Windows searches `PATH` to find DLLs. You can't set this directly from Linux, you have to change the registry. See: https://www.winehq.org/docs/wineusr-guide/environment-variables Then add the `bin` area of the libvips Windows build to `PATH`. ``` z:\home\john\GIT\build-win64\8.5\vips-dev-8.5\bin ``` You must have no trailing backslash. Try LuaJIT: ``` $ ~/packages/luajit/luapower-all-master/bin/mingw64/luajit.exe LuaJIT 2.1.0-beta2 -- Copyright (C) 2005-2016 Mike Pall. http://luajit.org/ JIT: ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse > print(os.getenv("PATH")) C:\windows\system32;C:\windows;C:\windows\system32\wbem;z:\home\john\GIT\build-win64\8.5\vips-dev-8.5\bin > ffi = require "ffi" > ffi.load("libvips-42.dll") > ^D ``` The Windows luajit will pick up your `.luarocks/share/lua/5.1/vips.lua` install, so to test just install and run: ``` $ ~/packages/luajit/luapower-all-master/bin/mingw64/luajit.exe LuaJIT 2.1.0-beta2 -- Copyright (C) 2005-2016 Mike Pall. http://luajit.org/ JIT: ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse > vips = require "vips" > x = vips.Image.new_from_file("z:\\data\\john\\pics\\k2.jpg") > print(x:width()) 1450 > x = vips.Image.text("hello", {dpi = 300}) > x:write_to_file("x.png") > ``` libvips-lua-vips-6959cc9/example/000077500000000000000000000000001475211264700167415ustar00rootroot00000000000000libvips-lua-vips-6959cc9/example/array.lua000077500000000000000000000016701475211264700205710ustar00rootroot00000000000000#!/usr/bin/luajit -- turn a vips image into a lua array local vips = require "vips" local ffi = require "ffi" -- make a tiny two band u16 image whose pixels are their coordinates local im = vips.Image.xyz(3, 2):cast("ushort") -- write as a C-style memory array, so band-interleaved, a series of scanlines -- -- "data" is a pointer of type uchar*, though the underlying memory is really -- pairs of int16s, see above local data = im:write_to_memory() -- the type of each pixel ... a pair of shorts ffi.cdef [[ typedef struct { unsigned short x; unsigned short y; } pixel; ]] -- and cast the image pointer to a 1D array of pixel structs local ptype = ffi.typeof("pixel*") local array = ffi.cast(ptype, data) -- and print! ffi arrays number from 0 for y = 0, im:height() - 1 do for x = 0, im:width() - 1 do local i = x + y * im:width() print("x = ", x, "y = ", y, "value = ", array[i].x, array[i].y) end end libvips-lua-vips-6959cc9/example/buffer.lua000077500000000000000000000010431475211264700207160ustar00rootroot00000000000000#!/usr/bin/luajit -- load and save images to and from memory buffers local vips = require "vips" if #arg ~= 1 then print("usage: luajit buffer.lua image-file") error() end local f = assert(io.open(arg[1], "rb")) local content = f:read("*all") local im = vips.Image.new_from_buffer(content, "", {access = "sequential"}) -- brighten 20% im = (im * 1.2):cast("uchar") -- print as mime jpg local buffer = im:write_to_buffer(".jpg", {Q = 90}) print("Content-length: " .. #buffer) print("Content-type: image/jpeg") print("") print(buffer) libvips-lua-vips-6959cc9/example/combine.lua000066400000000000000000000011221475211264700210540ustar00rootroot00000000000000local vips = require "vips" -- uncomment for very chatty output -- vips.log.enable(true) local main_filename = "images/Gugg_coloured.jpg" local watermark_filename = "images/PNG_transparency_demonstration_1.png" local main = vips.Image.new_from_file(main_filename) local watermark = vips.Image.new_from_file(watermark_filename) -- scale the alpha down to 30% transparency watermark = watermark * { 1, 1, 1, 0.3 } -- composite onto the base image at the top left local result = main:composite(watermark, "over", { x = 10, y = 10 }) print("writing x.jpg ...") result:write_to_file("x.jpg") libvips-lua-vips-6959cc9/example/hello-world.lua000066400000000000000000000003351475211264700216750ustar00rootroot00000000000000local vips = require "vips" -- uncomment for very chatty output -- vips.log.enable(true) local image1 = vips.Image.text("Hello World!", { dpi = 300 }) print("writing to x.png ...") image1:write_to_file("x.png") libvips-lua-vips-6959cc9/example/images/000077500000000000000000000000001475211264700202065ustar00rootroot00000000000000libvips-lua-vips-6959cc9/example/images/Gugg_coloured.jpg000066400000000000000000004071621475211264700235070ustar00rootroot00000000000000JFIFHHExifII* z(2iJCanonCanon PowerShot S502004:09:18 10:00:420220>Rn v~   |Nf0100  2004:09:18 10:00:422004:09:18 10:00:42 1   .\"  X `  1 "\@ 1 "D2  ',,,***IMG:PowerShot S50 JPEGFirmware Version 1.00D AT S [' R980100 (=\px5?qyO"1ehծ#*8/ӹ\zWg>Ck+ƆGt ʤ69zp45Fuzy?Z{FkySֵav*^E2^6c,Cilpzqq 2 1( hQXJ{c;_-ʁ?]P\+ߎYWSYLupčWx43T7:|SG8u ]]eʰDzry+Y$B+GM yl8*=JF9ZX92^A0;Vr3    !#"! $)4,$'1'-=-167:::"*?D>8B3796    OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?TTzR3S'?wnծ݃g*Ĺ ZĚd]4'1Ee=#4w-&3%@JE$IUנW=jy]uZ둂:o_mkҔe+9JcQ/[؂FFpz+;.kQ ^] Ջ׾s 1YW_ujuCagJ-A64\,ۜqYw3[Ė2k U,{ *]= ]I`jRW4凥hG*Ξ~Gá W|qX%ƲeKc$| Y}PI'ZqDHp'vZmi6%w\1+bp1\oc)$\uUF,O$7A3ׯaWu7*lEEsNL 8'qUӠ&8^3lLhWvNkt=^#NE{#`-T\ijU)E#I2ϓ:_@)'hVhzn 'xwv 34J`͍g"bf x<k٧Ǣ} r>cGW2 d-wt%E+pu"ob>&%@6J1\VJ o[ᯧi$٬ێ:zד- Ӿ$G gcXGu,Ht%ڿgQ۸9-.a1;큊']R澖3LH`N[;\_7 KVkwܡ$]cN6=n;K5fx5 $0损t?e}䁝=9}A/#>I^\anHƥ׾]: 6zIf;Mz+2tUOC/ F*I6am'!3YN2r+RU*u%( o0P~^8a^<՞ttB"Yb#wqdӶD/A67zTV)|ɍ&,䎂o=TW-ܣey:T6#Q7KEdˁ~T=MhĄK dٜsӥe-כ1FP\Ywsơ[䙌NO>NiJ㇧-1UBrbJW/#tX^*#1kRxjQirwb `\vV럛]E%犧vCz "{&X ڳ %eGb#wnH2R0WN1E:|LFt tJjW5ZZoA] QVg֜[cs}kR;h@sQ6㈓lDI-wM X{$f x>D޵v3n5 үtOQ-E\ Y ~5c V#N k)w3$hoZ6ER9ؔZӵ7V*GٔTXn($Nfc+fF H2ƕƇ{ҖjP2|k+K1YSmMb`8iFI 5@7GANCVJjE]/?XdWo@45{pZEͶM7L8p+˼YCxˆ oj*X O= _ !C8<-*Qvvl֖2v~~17uckgvSJW,l+OR ~~ߝ|%b([..g^LH63\4k2:C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=FM *G1BJiOJkkub1@?J](4{ݩΤZaQ+?PqޘgbWNH8ivG&]=+ =A39hM쭠#֜1٩6#!Ojwh!sOٔ*0pv֎a7&pAnϱ\-ؕvfPG+ct?{#S,)h=D!"ĕw(EOqQ5O(hjH~ In]$6 aSGuosJie;0'HV ҆@M1irh\:ӈVV _6p~ &Ot?;>x??V[+F;۷F5QcO~C9x3kW\zp*?­/]1(.#܁R>\çZ1?S&w`Ud"nCoșe==E>_r%4Ԅ,I'J otڎH=GALH2ERB ݘD^y̰1?3^53늯2|ޑIG)a,x+J8śQ?I 'ƄZ\1Gs>5fKVUe2+=P7pqN 5.UAY)RYcn 1֔FrǥRm Ig.Ê@rCN@8f v? ڪB N.g`}B%*yuD.=u[h`ٛlTNGG8KSȀ5V&he4ጊ63*_3E+Y`t*τ*`~a}Ex t=j;H9gi!iRq}{aȣm=|BY9E,2JRF(zizГ*#44g`ѸEi [2j*<=ݡ4DQM$YWUY1e_ӟW%f7tVFPdV.n/9751)'+kDglu?ҭRG?m#e!"ГspGm'4a吒IU7;~Z/FDu0ȌHQOS$Ztu8V@cCfלP?;X[ 8*M0suCM2Q'XPT74:RG5QF((QE )i QK@ E-QRLb@Q@ KE(Q@ ޖGJ(E((({ 1{EhZLP)i9h)I@Rb ( wQ))hbwQ֘ %-&)i? ͤu 7 ^a pE=zO"P@@`S=&h  Ӹ8aIn9@(SY)ۍ4*G6+L7{tJaeaS<,ւc#t_=T̸ x#bXnVێةqACNv/Όw";؎FGjZ*))|0좉" Sנ{$Cޜ7 7 "+ Z.BNf>&'hlr?#I2:HCn‚O4ƹqOZIpS>%jGDa?Z> nm So "K -AJ:3 P@!R(dⷕAsUԄT<.* $*Cճ#N:lL֤W4jwyѝO>*V1zDCj]`}?./c!m֤PirGTnxG@ j/ȕ{FO*&P&`teNVV UUz2>&# OQh?)q֘b,CL xrx)\ EsII=4;~1 H)4mՅ4JT48IOQNۺXaMYF9OMB29ʄ v'"xA@+R8QLȣV7eP{t5mza8??DB  RZ&SrAtzS=8Z겙("PYt/V)0 Ip"F,J.I/~6a2SժVeC*3#]JU)Xۅn+w"E6cy588 U[ i+/!֮@M5'C5NU t2c " 2uG#*Da}i~ @>i7ij+0vnr5i~T F` .;?Zb@z;Unio)kGz!tƟq6{*Zh6]lrk!a߯SR[O$aʀއnsRBG۴dU_rjD@TܸUT%YȆ-QU=[q(Q(A? ? ((b1EvZLs@)((sK@ F)MP}(PޒQHs@b.=KGZ(-I@((P(EsEZ({ڊ(1KEZ((.3E%▎/S(8-~4,wKL@FL24yirZBMȡ7cK}3M9ӰޔyJ}:΄S֤i!?ѧr)Ɓ 1GeA-i9X'?ZFߝ)$Sw~ɡX}sS:MVm<M{Q$*zLdQ`\[#dv&c/?O?Wuw+G'M7} jCD .A$6GdZ&AV~?ΜS(q! q(T&GRwFxn3Ͽ#NF~M|dC^%ӆc?%W#̐ Ǘ3d>K[,Iww'z _r6W+XMMd%-3 ;f(1@j(@((ڊZJ(K@ KIҖRъJZ(@ E-){Q@'zZ?@%RvZJ((Z((Z(QQGAEPF(bԴtPIKE)hCE-(@zQJE%`y&(@u!.x0A8Qs֚GCSp F|SZJ&#K7~iR?9{ӲiRmju-N9G` @JR%)xxCcD#,*6|fyW*̧aޥuCQL'dOB?1U>!qNx`MAiПREWXB$cOUjsRo.$ /1V{SWhHV52ee2R7$v*3Q\.!lzRz3mjas$N zto7+pA*Er846 RVc2v;TWj3ӚkFr)I)J[VJ j*0ڜN2;/r?ZWȁ^5ڪ$Г+ʬAqunѠ$G~s]ӥM;%J8՚F%8#SEdWcU&:#%|Y؎[P2J~->ʤu `=R!$ۂz4WtY1*ȋɓBW |ߏϥOfpY U/"_oez]`ܳ|4WG>"٨ݥH\n%2HSبlZ[XW?K]>_I[;KI@z>R! vL@%-P(E%SQ@Q@=袊(Q(QEb)hQKJ)hP Q@@(j( NPES NP!(-(>R@ ފZ((KE'j=i)(-*Wޡv/J^mj?E<8\e]֣i8*s4?t~T$.  Tq4KB `4fkt /lѵMeoXDQIb1QYF`=5:=qFJ+ON_ѧf- KUǎCF?4h2HY(_‘_*rȩsK&Wv%NA>!C R4jB,\ƿAL|6iC+&Pǽ H&J[U*J> ԑ Jû|8`ɦbT՜,+3u6NP0")WR1 @ӊC'( ER"fy!E\(zgFoh7s #Mn*l)p#|O/?_)X-q /` P@k%R(< [#HTAZ*}%BL`trOn8#86/ٿƚArx$?+S,V>hU'-Dq"Flo֨{g ZܹI^  G*TdpQr _$lb"Klmv<< 6~?.ԖUqs!<j̲[/eROZY"<6c<;/!Hq8Y 2QS9B֩j lIf'֊(p(1@Q@(Z((Z1'J)ht(4Q@t})i)QK)ZJ)qI@Q@(Q@QހIKE%J)hAIKI@PQKE%R( E-%QKLZ%(("<(iԮfXlMƑgQiɃ4>:AGH?ϯ)r.ò09棹QbiO;%31Qvr.ܤO@Ԯ{Wy #ӭ^I%FB;^ n@ ̲D>uT@t [uF AM52F@aR1€-QI&ywJ'IjNTA9@eM6_ ?^n^\~J^ւEO YQ}qˮ-%VqzCh-nEtՖд+YgI== >6FC)%s+΂&#ջ\])ʌz}EW?4ʀ5K|ZJzw j6jZ(jsҊ)ibj(F(c^J1KF)R@ KEZ(@%- (}((QE (4w (Q@QJZ(RSZJ((((((((QEQEPKH~\V< C*or+;.pZ)RQ:WHUO#4 IU ;)i)7Fo2CO֘CPвHF{f/qXRH.=1@'4:W* `~$} J+N OAjUa08px ԉ,GH=*59dԬ;zRG8+цB)Xߣ -ׇ-FL1M ;>Hb8ijy|bzSl}`>6( )?0ʅI 3}dǖ?11g!^L ӻZCHcğ0:QJ~uz}-Ge;zNS֝`1Ǎ%=*J}8wqV sQt rxFW1nQi@N)7| DfW0/h?V4,0꧃Q|R܇YPUT~29LP3?2?^9W{j DZ[YYըJ/'1? 삎R LRڎRRLAǠ)QE(EQGEQ(Qފ(%^? (PQKE%RJ(QEQEQ@QQ@Q@(E-) -Q@zJZ(?)h(EPG4Q@ E-RR@ B)ԘccR#OZv)*F0))<ir{=B Pw"SCKabzSMapqJKP8 9$FE'i2 ?oS1c[*Z{IU\Ney 9 g4bBYF |ÑS4 C(nSЃU enJ}APЖymTU?<K;уґy${@N)Ű??ʕʵP5Xʓ Ti-S+4JVP~j̪7Z=*8qs5f4P.ÚdT/VZ;=jڅ#"yj1;X=<6+4ZF`1g ?I6׊u(VA24 Ky9;ק+ TeaCѨMTxPV܈s2NmW֡s`S5Ga!&X"0,|7t55{IWgP>Fx492/!Aҷ̳9ێE݃(p1wd4 ("}rO-ڕkfpniCvҎpQҙEPAJZ(@%-RR(t%-QQ@g11E/ZJ(֘Q@^Q֊(PEQ@%-Z(E (((-%b\dяzJ)p(J)h-RJ(h{ր CN4rHP3ZFR ҼHzÏQP=9Aʘ曟\SvS r`W=(ܾT?*nP9$9b.ŸqHޓ94zS`‚åD~E7F(P@w9m4ݪ 5`17e^ԏ H*$'c1#{P<ՄV56DOu 1֦FG1!42ī1EgbE :8DA~4]*F=jUq CDC̋q6OqSiPGITI'E ? z.;Rj( B IEWِ uB:?FjZ/4؛TTՒEfqO4 HI#`OyYy6BeMȪCp {#U,GZ/[P TssN`.n}4MT Tr #+:%07# }jaPL=f›@WC `o6У@\ aehع/Xcx؄mLTK#1] uC$Y]<*[g?R[ ,G+Ȓ Hv<Ԡr'?9_\\09 p @D ק#e=6@1Єl$wHM 縙)6ǀ $Z5;袂B(QKLRPEyJ)hA (Z\ڌ_Ɠ4g4) GJ(%-QE(4Q@ĥ%/Q@4Q@E%0 (-'E/zJ(t4PyE{Gj1F( (Eb;PGZ( ( 1E}(RPE-4<)sR`Ep Ja$#"-R M54(;h担i47C `QJ)VH[9 {(,bέbߊ[q8"h=*y$-_֬2VSh5(sO ɊqV >ebu Heи# 5k j6A)$$a!i0W m֏H)im\z㢣1' cޑ"x_.Bw)) C/TS}24$"4^uw|Jlvi*bz:~?ҩ14j1xv> v!K$cB?ֵ[j2|恴.3OwW}< !?UG)V9A 1*ARN>pmb_;BX 9X#TIn\ubh^՘L~$6?OֻR.yo h΋Js190(@( (REP(w ( ;QGQGj(袊(((EPQQ@wZJ(ފ(q@P)(QE4u@Ph QLPGJ1E w{E)PRۥRZJriN(E.ʹ Ƞ{+)Sű QKGB)XFVҐ04?pS@=iS\h\7Cnc5Ԏ0OJVz,{ ]XD7R( (1EP0QEEJ({ 1EF׺ѥP9f ƀJ)FCp?r>9QOmB:h Lb Q@–)QIE1zZ()R Z()iqJm 6WQO>\,6y+ Aa 1Na~=p)p}(ichm4l⋅Rޔ%AF.jMRr)Daqc֗0HQ9i}l 0) c6(9H1EMǥ!\^bPE;1F8)qL,2mjW (( 3LKMXvLkS]Ƹ6DQSV%mjRMjCBGKW$wSUx)=Of84=b\t;Q#^CHbﶝ:QӸcjp1R%JiMۻ8QLtGCQUqX@"ƽIT4"HюM'wC𦲮FGJM =i}*Ac)Q@Rp*0BA? ~ȅyߵ:=A*$.WGVJIMry}ڰ`d{E#qv#()@'.`Q7ѿ:H|5?{w@V$nYa 4G֟hCD[iU[R/R#+2H m҂Y• 8lj`)$sH]0ny?ҋj;ܰsٍ>S#f7xʜ493.GCОhZ$cT&S_ПWJ$8ԏV ,0+ʹ?1Cqp NTHZ_(֯,1*tJGOp.bR WGMBG-,_uQڊ -R3* q@V{Pew?JI 8&T.O߁P= vN^$'}\X~U(_p4%/?sUy$XztC3ғ94Ԙב==U>Vuު?ZKS{sSN&3Xs?Z<rzn"3/NI[iuEiXvvJ5]Dc?1u܀q+ $ڗdpwua3zjS՛/mU@1\$ҵKÜv+PT})-˂1 a`2YMX+Th]W:AfR&N[Oj2@Z08eXV@IHɏꤍw<< {̿Ț54,Ȥ'nsI)A⣸mm;'%B56lH0} q>\HDX>+DA3+!;n@eHb9V fAw>@g.6szXykg ? HY$(>lGuB6xTh5[>vC)q5nhNr$\yD%b =?jCgo/*(_(xܢI9/œ$*sH\p+Td7#T@уVosܞONOέQ]Gbwjv-ycL? vwT:A! ciOn*O(瑜QYrqU$dGz!S㊐H܅Gbd9=Vn[HʅW.GGDߩ38;I穡>e= "e##}]JPxUT&0;zQ7OƧUnHɥ;O_JǔW->RҠ cCt"D >nԬ7c|!`Ɠ|\~85O(㌎XB}C&Ft'GJNy f,N hQ烜R҂$+|9}4}GZLzqJcFHסcM(j,C֓'sM&+sc[/”DIsPo8.zJ̢fch/Qs;=!n4o'-q4%8u?֯o!K`> քMh{ V`v6~dt͜2T RbEH85jЋhȿy)x0jyS?;Fn+殨UZkeTTF4}SAT]>49lU=}֜.Zſơ;B唑סOB%yFԈNPz(Q)ȱXԞ\OQ cڔ1G(8GqWi!$ H:Rsƪ8aM㆛ϧzNzZP7 6kOZ:=`DpI4x4'>4ai_n9)$?=s-’Z'\v*E490,JqnC &i#dqU}d9VD[k EU1ց,pAOK\*֔`nUv;z}j#ҞnGQ>Uk̮ƨ q@#4oH|m O^*ĄeL8c񧋁<~iԤ@IbHm>Ԁ4'ZN v' қL,@h?ҔD%+[Qv1\ܕ#ށ*c㨩)CT?QgT?1  &GQȕz71sAcZ;î3MiTY"G%Cf}QOw"O5I*F,0:%9Sۨ Z^-:=M9lnuW)fOtFf0#V H=fLDV2Á5U/th-f qUn-ߝ͍d?#A"\;Փ~sNրf~t7[K1c֮"Y@k/g݊$B2OlpIecb:j}I˕ayUJs,ONki[qǵhi1Rqyx?$sC2+ =$l0Zң#N;uNhY%^ 뚍#J,2/0D(B#*f۹r21S WQARjNG.=HXOcAժ!ln)) 9 Tbf`섴6?S(UN;PlB BOojiF 1OVL#$\7A5!oH?4XkrWaMSGq!I0;SR+x,aw(+ny5BM}2)j5XGߒ`0ħ dn N>gsdRn^j4B ~Hߑ-Zj?`߽BLJg V5"'52;\DpV#׷Mg j,J!s93߯҈RVdBT?ƚ3 E=~8M6v4z<✿|cH#UbJΣ\z ,_xO 3yP~T˷M'J"֬E"WF9"̛MCvF9'afp>S4)ZMΣa r) NIb9ju9>9媸9 )NpeSJr=+I B$@i>LOaeC| w@\\/NNJ,,6 'đG*AJN)IoOImSg)s1c~;?փjpD9CHMSN (I.?շh) '1$t$sڔHۯv5#TT>6w<x~tw'=iҽqڐ 3ɡ.&;AhZc#J5'b7a3rbLU&Yg5'bӡPdZ,DG|9Z('=҇xoA zT߯St2?Ҫ- Y 8ZHOܩD#OŜAN?W!O_;՟&?7zFOa&(WBKuяaN`M;j_ּk-qwT&BpqSN +y#Ն&3=P{jRNq¦D j{g K`WRH vzZ ®eҦGU*3S˪Z NF+(ŋdsPaQlkŲ:4rǐGэ9=[H|Șّ*G ,\r@8j}.xL\[_j~0Ҧvc̸G`E<6. ex5s[⽍nv1Q4tb/i,$9ǥlnoE3Mtu*skP)>dWv&(.yj#_Ԑnha)20zin)\,?u;GI@9L,.3KILLUTG$a *<߅.xp))iy(Kޛށ֋7 p}iR1@ԫ@ 9OZAځb#dF)a2s#c֪3L"ǂ#?4.bu)4"ČDa硩Y,}iCudqOVBpA@BʭB@*DcЊUU1L`' x2cwv] M;e-^QLl?LbmVB>`9#xՅ_b;WTb8U2[;Hr~aoZ 6Cmҟ yGºi|JK`v(~^MV~sr&7FUA?IH W_U9-vT)Eu<'ĄNlQqkX:t74٤[&Ô%rTtu#9fB֬,NFNq^EM%s)j\S?dA219`"|9sD+8 T U;y)!^3Y$ 0c(qW\ p8LRpK`LNYsDn2z"njeD?ldӿ(Z@=;SXjח; FQT n{P;*)FqrrJ4Aw׃Rc OJիYvvСpȼ3e?֟:ޠ<+QBG3L)0OnP}Δ1kVDό{PdB;j%hV8L-??KqQFO<|$G?=xPgh*8o>vw_3Lc9Ǩ2.J<4yq#U2uu|0&AVM݅{Sp(Wt֙W1DxBcdQDvڧ?세T`sM7XC<OkjF#@VtPI88\sϽ O";Q qՅyqCHa%T g+3h56m>uɴvZiQb$a}M L?ZTc;^ G3ҳ2B$1*%֭1b:8tcKq_JRI(I" sŠ~K9?AWA1f=248=LRv&jE葕*1~JP~ҼlU#|f'?V6ъN$JGA5>)qZv+O~F\ iM$XI|֦ b1w恌[#~ J!8Y&ީ,HtPX~5%!>TX?Zp4 sYj('4sVR/Ґ#oΏ,yjNiXoΓhؤ?|P?ѦApjL-5{ɦn'oΥE$iyPb]6PY/J"sPbSqu}"lB/lA#wJO4*Cd !Sb#$`)bk7@J8?E!I_w3=;,@iJv dg4]G 7) 8? U XBqӊrO)WeqdlMXBU횧hFFj0ǂrOUŝWbs؛Q0p-h1)'RX*} @<).WlُkTݐGhFs tb gr ѸTܬmcazUI$, drEжn'kye׷XLX2=4N1iHZq!=e%fn#4ia@');sMWXeLUGd]+MTrn1NiNjT0^PNĹORE?$9TǚNb99 }M;ȓ?20_ӭ>In<SS V  ZS!ZIexr -j[6?9)4qҔ6Jwcv N?sʜcQ$i63G@F)Y0>f|$ѨXzýL&}: <_E&j9_BzץX8I4QLK;h1zNz-M_FǷzNҚW;RJ"S@PO0CL8SUP+w){Ry? _㎦̈tzf8ǛM[_Q}Gb zuFzdBsҐvH0qRJIߥJ?yҥ(NQ ~9q&8(r\ƤwQx*y)\-a > z"ҟz!9sCc EYU2(6)ZG@<[.`'Y>G{q c+\OB;ZV^3@9߀Ԋm!EgPqc+:;eEcFwɉ8/&{ta@1ڤk+"H,wG\*p)CWMk%Xg'ҹϦ+΋a}Awp%fN<SfC2 '=LHv-_/ &;k(a7\ǭeNX8= "PQ,3[#Xkx$@(= 'p*Uv:J[b&Y±.Yڎyo!Tyvڱ.ndXmpsQ[@ c\ILgySm.8I9;cӯ(R<@m22U};Ӹ K![iDOsBZ~=8LD@d}$SO;S6@9S㚔< _ŗ)< zm#خOi}jP?R=q8~G(۹E$Q̇C_¥S{umʟz?KNRLY~iNIޤ6=m 0ITّ;H!m~u_O`SjfGPF5/n_u8X@m(q8ҞFH|9Ӄq;5q<9Oʿvfؚz΀[hRk`GR4y F>bjFU;A#`COB+:PZ\ X(wh0FO $>R\3XbKq1~ВZDrc?g $,7oێg*\#,Jx9#v8C1ˏRke"F\|jaĘF?|~dղ);MFF|Fi 0\cips\Ϙz-?3}s+*:kV j=w͉7On?ckP ڦH@1osW扢U 2w\zXYSm)3 TXG<*9B*YfSpĺZJ8~U%tͶR?Z{Fx(0gu=>EKqJ|fZ!ϵ/M&dVE8+g`SfM|zW{EIV]\ xERN{\(^7?AqQrHH ?Z-|kJ5ϗftv,eIX)!=",9q|2O6i'؂U5?O_)y%_ 91F\Eju h4-/x^yIS7`t/1#_, XރvQ MeW_/ˋhץd&b,$4v0,!`r0Oxr$"m"Anr*~\v>J\6dFӌiV1Q5bgIz%Vt[Udc'Ў']uGlu9[ QO&عŏ1y}i=pMM~?3Isgؠn}zbQ9c*n;p֕FStc46\=GI ǴCĿjWX(zSӯzI=qAanZ!iqVBCK׶C ?֜e= Q*ǖ'~gBOqt&@;Sv$ZD3ɍÞ)t+c=C`:ʰ,@‹"#8#D_j_gM4c|ӾCRc?0NY2zR==bYcb;GҋIHڇ`#'h֞``yo|y-IXz8?(?7ot}1S4l*~`Gq]t{II tP? >1?SRD@9J)1ݑlcq|;HߝGϧ^eϘV#=ؚ W:rxR8;O>s=x7,iIǪT CJc`q*;čv?==VT$'_,9Nv&/n3L)rM7SD+ԋm1Lү #{1SGM=sH=ȬwcL20ޠ`ß3nM?ttH??L=GZN}/s<;qJGpp( 淍:2H@?ӗllǪ9\1mvq]JXhXKl$ 8' Gx]x*Þ|e"ځ TnA]*iF/hijFhWFWoT1FoMNZZ++8U#q޻ib9;D̐o_ʂ7998w\r!"\,9l~'X !f+QXԭ^a.훎E@x'5=`3>^ bcزr?ZmKVG}Ka:AX&gđa:"G˒*T(Ų<~ƛ}'o&ʰݣ&Ijy$iks,e44NY-sEied}OLV#qڎÃҝ[q9K8hBCOvJLW.z1'סTޥ֗~VhtjIPA MRSEQq،f9b4{}<,F7TPzR ;…G>ۀAs o r &=Vv>BO#JÅQ 5V.>{*gtOJN; hx7\}O}ҁWv/c` D3R(QfNdgRf,/LPzr:5&J<Ҕ2 Pr9ztCvsϨG7+Pt;mtT9gT Kx qڀ}LsMJsL"TB 5trj=(ؠ`pJ6ȫp"F'fg$khw6ҝ X~n0r?k#jk,zp1Y@}h^PGwki??C׵y5e+yl? 階#4/SN7#i\,JLKN`43LGջsN"n{(R݌0{RRJv9MRb0qKޔ AҞԃC'ހ&9!isHÊie!b2ii֜# n3L4nO4 ׈t# f\JgمD3+OMFى2/IunKf)O!lE b1׿!ҵ/ӵZZGb}ꏻ&F# &,y2 jzEf/wJ4dNd"Z)yP ݴD/'Mc;Y{=L.\N=dr1 \jq+l.,?w?`麹;~qc,j͓<{Gz9YJ;LՔ?F't95|w.'Z<.4Vm v^?ZjlmM-Jp\>A";a%}R$_ y(]D}Oa;T{!?ΐGsj7Sn7f[a?mvSz\ /py€TVALH؀ {4IakuZW/oiN}*FJ iE11Zm'1EZZtE, Wsvznjtg{fkejrsZքeI*ՋC^)򑬅vT}y8jf{@&)?VDdaA5R~ wNtS~7qMpsU4!8 )3pt*H0FPq0 >7dp'i (N5~{qT;FKIU%<̗ϓ|e'9D^)ʧN1wcs.13ԚKװD 3pAi6 zsw 8ai{#PʂxćLtRq%04$䜁Te<Vg'.T=OJTNܬwwxh#ڣ=҂Ak_\! &LB"VFܓ8 +0wNFFLxOCǥ8Iy8hGM2}>*rH9480wJH5RƈN~T. 'Nⲻ+,Sǭ7i֑AZ;l7Z4H.5_sOϯ5W*'' 3ΫƬC;nx43zNhc&zƦQKCH3y?HZl)R|Qt*FS>?''ޮybGNVd!iDzJL~@=ӷKꟑjwOAj0I]ÄjByEjE\N%s8KQp<]4A.?:Rp8+P>\{JhCI꿕4h=wS99M#0+ǵ=ẋ_G uH:Srx??ݨ̷4`>rzg֧cP$3j.z|eTO$1+ ]Õr?1\xrU#i!< 7+|D-;)Z:{"ᢖC0Xd-ֵ#gj]p)s}i7 iQSi F*xm'Vh"P R6m\)ob1T\}c h]ʯ5Bv;_NkJVD;dcҗk/Z|*^I}ͫ"hiry4LrkhBNv[A!RHĐ3] cs)4zQ?8ŻqFH׬xV<7fsFJR:kм;=i7d{gsf0%iZڔI8xYZȲU~ܪ-CsjFgR7sd1ߕR7F?/*U~UFX亷r˦Id,rg=jDo[eln°wS[j.Hӻ' ١ۼeKgiV Xb(+]]vwq@C)@xoj{"&F,a*1!,1fq~}X$M0Z1jJLyȍq#~U8i95d⮘OW;u$ >ztLgўzXڝRe)2 8QT pRyƱUԷA߸8_Q?5ҜڐzֳM= @DqNM[OҞs/㚇NvPE nGn#zSfN=&NHh`:~u^旞y5m5 qlg)} C"=4dh.M-rs9pWpipj&%Y3pJr&+x>:~W9ccʒZDb3cK3U^LesQAF? p.x1@1(j(-q\vP7`Qʇo ILQ~xQJi}ޓArpisF)ywtxQ9>Qsn*zP\KiH2hM (>ƣ# RD~aM )j&))qNqH:Rf=iX. ҥe_44rjLU U5@LLKm?pQ$.1 GHxշ0O9x# î;nIHI_npLP19'V1Ƙ_{'<:Wҹ݄w0OEBw7?0*%&RWG[E'fRf2;ϷjӚnq5+ :a3T5X"ޟijEf\t=\+Q3I8pi\p*՝; @N b=TE{t8ictN #J"8FU~|S%IIp>Pި[ۙUBMLȹ~V&R8C¥O.֪}e$+AWcHzt7$ 1Pz"PBwyZD[U%qK`%Ԡ3{U3~%h<c9ٸfLDSY,kO]o5VLygIÉ~_<zvi|C)Zıp;3(9#uGZ J aP)$DA(0J3ߏjC O&숷szs`8M0[ 9[BsK8C/qt4SJO3*'S㸣+IZ[ 3prnӦiCzpwѱȧZtåģ7n'8ҟ}?ΚW=wA湟}w9ϜHsQKt=iO1==BTp:wdr(iXRl]O^TQ Fy"Ԯc ?qƙRݪ؛B<"?M&2Ԩ1n97Z?CG9@/'jvbR2tj`B2rqҟF%R/?Ơ)G9b%C1i|ǥU4)5Җ"C x?G dgDaYQvCGM7/b?Ц3} W6qL+H'yyLd~4ӐC֜zf'h?ާyc?N }iO=4Ef RU aXMaqIDi9X4=E7tAѺO֧f-cڜKZ7$\+EE?٥ ~E l/_$FU2i_-G֤7b;Y 7 qO:lPk8KYux9ޯ\Z\B|nj]UzHI]߻9l6pʀ}Sǔ,# TN2q} ЈDN O,SM80ljqd9ȪF2J-BHmcM]\,e\/#I`!!XGZ >Jї`Z0i#ӽ+GZ39b'4p3OJK,3RUj8$elqRM%z a=)d68Z6Jv{fhV`6篵H69=Щ-ur޺;,}.}5΅b~rxM=lLCy`mU9e-F)1ΔwS[~Y[!Zz:Es) μֱ#{t2æoP}\H]ȖȖ[s|o_ӵgJ#CGIf%͏˥ZMVۈ! WM\B9:VSMϙ'c<V[XnX žfOt9'5sxAg{<ֵ"ݬY% QT(+^.",e%]D.zN<)VcVxU0m͖FsZ:JY%$n$y%`܌qn-[# xMuEYǿCA0#0>; Htd⤅$FJE O.P;8Iӎ7@lOOʌf (7IN xKOc@ fYp`8eNFS'7ccJǞ r(d3riFEW,spjZԻp ؼ;  h GLoc{H?M S1'DǟƚBl\ĘϥJ&^q CF|8ir۸4dB??j<ػ!<Ms2exmqdfݿ MD;~7&oGz9I!1>c)7r_)2ݍ&0{Vj oiAPJP1c4EjU3xi1E9(socG(mq#?K< i8r-A0Âצy8?2R\sm AuܟRm]ԞؠjWc%Y2!s;G~tQ4?O_J<**;c7Fnne4#|cGֵS~ ㎆@<3wiI6r8s{?i\cV}3L=:ϽsITQrzS0i3i ڛ*p*U?-2_-a>"9O8vlnj- SnJ)ہi NOc Dc_UɰQvGzwii{ӻqNJj.Lh("iGzhC⒎1Hi3Fh"H80cO0R ;HRa/G3(%?ʡ~~JhCj6# ?GjjҸ%H0-?hd껁GZѭ;n2FN> <-⸳(bd"*N)w5:)2.VB%,ʌ1PXО=k\hڹCM)4~۪=ŶDܠ<8 (Vvs?⪴|F#5d,)Irc*' 1Jz)R)%{чk.;vnzdpj^Fr>4y^kW%Jqx_MFN8 .1<ʑY=qc޷QP3'Hj֚" R;y?RW#89 1_?F*d]Њ=Mt6G66G)k ":ܓoYUPrH!k=Y$[`[ܼQYdPOElSY}.J*^3Ͽ5-q-DA#ssAv_JÐFJt?(- lp&2DNnO^dX]F`pJpOMBw1Reon= !3}pFhϵSK@8ASd╆jl4<[*}=O4܌488\Q/Q6j3t4$dy,I1OԆEO-ߥ7=SkvZkL@>QGj!s2O2,]NJfsdRc&@ɼK|ѕ֧WlczcUR9qUˡ.L΃y8z&lG\5_(Ie$ !ȗӵ@3N|̟̋<}: BOCގVbfO>a?'H8kQyҏ/`g5_ wf__h3#PNԘ;HRp%NR$ |Ori̻~|C֥zIg9VJP[h$^wFq)BHjAsC/(!syA9" 2gf gPNISUI)r89IۊjИA!oʣ AL.Φz})0?J<sF&?U;蓜wޙ9yr7Y=tc֔\# q>]MU+k;wJ_MK2 #D[>^@'V5n@q׎iJNo&OJsƒ+-*aLsi+ F;P*8:ytfxozqڴjXP{RSQLf銔(4Eɇ+sN R1@Qp\iv sO!Y(QFKRsd]njBҢBqҝ+f?ҁϵ6>H950QN {T:w(A(5cj *OJ9ÐHjY"} |±8yQHE sCM$ZYϵBI]hkOMZUZ^6<.mn]LImwT wb2Ml}Ax՛%iQYOњRQ3|s湐M^af_r7!ayTLi.Q:p8i]޾t{DjKגO9#D9s^Uw!w`5YyJiCZF lCŖWIč%t7yGq5e|͓xA8PÁ jţєm ~p~NM,9F1Ԝ`ӕV8DEڮv w>S3ژ~,J&M=0kUM=Q6Cabۂ0sJ8AD͜~DhU4b!\t[sRSϴMCږo?Σ'[sTZ}~x!帓x<قk9"D?SDcS7|F߭9]203j*̏=zӋR18^t! }vQ6~f4R2I6y*GjVw`}Oz8ڶbW,D?FM6Τt#*>)NsȮ{>;|dHAJA\lsNIhk*I#|FxJd`0Tkr'V<Q~;p4;|If ö0?!p0f7aw!i+֗ΐEY t S,sZKSmQ]GXNrJ) P3Qw9Wr1ך6zKT?PY"IWXeC"[8\z7hϵH"zž&S w5>zb/dtF=>SxJL.Njk?>҇M JpI"Ep&ٛhRk7b]9%7+Tgx9$qm?>g=jT9.1Uzgi#ipWӭZڞxqp`7+7JPjxm*$R79=Fv#Y0p\&7rIS#dcBMws[tk{h+FG]JC~EKW`T.4+ hkoǥq04}$C˷Xy 5^-E3H+cSWO40yȄh27zӼ?#nsy.z!'>9$]$cC;,2_JkF~,}K'9v94{["#4HT?*vE3 @9%M˄ Qh+ۮ֍ܻl{BHM146K*N˙ظjԛ[K`QN2iʌ~x{*}Hi@Ֆ rsT~q?Jswc]ȇzT c}*rUpQЃJ28`;dV?0ɪeUUNXڝȨǽ`zG\V:8R .{ұW*+ԕ Q`"jN*(:ԜP x4tqC@IӚrޠ$Ɨ+1(OV7sJG(فFDR})SJXb_`(J9QG/5\ǒ3@jea{9b@iK\~84ҁBtnzU5UN XCRcD") 4œUQ\V 1Y#ȿζ87k|;h4DH%ew*̥d tvQ(gJ­kOrB߻+0h\T* Q  f=MrqvvdJrNҗ̋,{}q\sm7 gӌ쫔X;ki#()4& (@#A""NߕG p+'،)T1M\HgM.؎O?*h9#V)cԤKh GdyD{Fv`9Ǚ Ǥ-v EzԄu曷=Rat!T<Ɯ)v;y5) z֗|_{ 4 yp0G =2?_J.š bo)oʚ׵Z6A|cۥ'0'n@|=so.Wg**4SjL~*ڻ0iZwHFiCӃC|mq'!F?zzSc9d|秭+# 6pAb;T4Z`c։ne@5I0i#"N@31b)q30 Č9QR7 1z֌:ۻ3Cñ*pO qWʠdsQJ[n"+nV HQ'i=>Q)'(mP'ς3Rh.P)u5;q}{RG$}  G̉O<O2]a<2÷cJNJ8nW 'jCl(:.9=$Ee_3^ k:I8*,8Ev1->jgjpeЌ~t2޿+'P2*p xqv;"GQMR(inwOZ+vP2 )+ѴdTIN:^ Oo^RtQR1})Lq,V-i'$͖[8} cYD (BU} \h{f{S%;RlڻƽH,I -o倗*6u|Ն$rqLK@jĭbEFs\y`d}) ] <#c[0?ݔ3HM4:֎!ugZG+Ǵ34e$9pTOGG€2'p2qXQm)9b6Ou?֡ ,g 69Dy%6W$"} K nO?*Qs"e?AR ņmSҥ#bS5\t_Q塌E۞AQ;Λ~_M:}8ٚBc?)(ղ>*`]m6 p&\EܸaO9ܟZz~Tg9U6u45u*bQʯRE8 ORXjuڿ0AQMߥ;K=j`UOl'i ??K~LҗwlOʜʘ7R !}Q2R`*p8Rpr;P2hp; 6>ҭF٤#A'aGuQ2jUQj9X]:$j(*Iqԍ/I#> uQFT,X#W2M G,Up@0TGҴcz9f&_}5pĞKGuE.+с uS\im/ m 4or7Iۼ(ruKHћ6ޠ~G))f+Kg,nl 6wtR}JI7DQn7cXZi̞eʤHt>EѝMsq\wU>I[ɤ#xUVh%IS\sYlRH-$9ojih4弶(ݝRPcuhzUrpw1 FI# 9+B7zbx԰e&,#rP =#?XY(%m6ՂY:PYtӸND k&vp1,VIaIcY:KCEPvaRyQޜERvPXJp}@?j YO<@(.Z3XcsXJl"g1 }pN덾J1/S&2 +z3SH+ H`BE#8U$Ԣ~3 `:dgHỌ֑c^?EX>r)Bw6sp?/9=*[ɓdquOj.8 #qzNH{5NוLE&6$cRi5P|.# jA&^8ϒ/?4ܜbӏ֨')Z4m6d] grA2qlo8D3Ua (0PBv'_'d/+?.?%?g$d1FcUԴd*%(sB"lkKn>S 3?HeBcs?:ft48018Mn?4ٛ4ynmdžIo >ɥ #>jK.3Ӷy$u29<)hkܦR>ϗq=FJyzo4\N24rq֐Lqڐu1gg3O0,iYt}/?횱59U9{ TCBuΥO8_?tH;g39=:.eUb1 gg뿿u_dD1GqS-Ę}U”?_z|*nʻ1Y#flr_%~`V4?JUCAOYqi73}6%9f08GZw?4IpAcAIVWH榍XP ATx#n拗qW@8@9Q=qb Hz]㑜ѲE݊G5)dV 2:ƆxȌⷘSA'cvG T8Mʼ)Vyo2 ?ci<[y 1w\N{i;YY@0APzn@=iX&QNqN J+`1W.(8M*N%tF;t-Vgboԭ4QV`|Ė>RE*9,sldwMXF,YҪ0J "ˆ5O@<*ê~T,p`Pi6s/;j]aMETӂTxE.^i /B.&ր&ڸf\4gR~XU_QNT[Kqր%J]ҡ1Lk8oo8(Q['\{Ҹ[1HTd pzxb0&ME1SzHSJO3 QKf3s eZxj.+?Κm?JcSNÌD8SF5hF*j+9f :. ;R}*>*:e P0L1 lvW?֧ź30D]þl49$aYtyn!Ue g=jl'A?*\з5Pp.<^mjj9D!.Y&uH2I409|O*J0PNNg-ҡ9[~y!M 53;)#T[.`U>s2sw['řlqU).m 2\X$G,YP)ۼ2{spIHTF+ʑ+|-%eZOϦ}E b8vx}Z(xě~l#ŝ:"/3Ҹi+UbR%$:֦U`Cq1 3EvPH-]v i@Vb:Vd#I`?séjnX[+#\^tem:6 U]6<фV`3>qR|up;iYS$ jft$47'S.BBě7)G@O8,݉Q)nV+pF$%z~;Gl#l}iE *TBz.eUN &N68&v>V*9UB^ɹH$BqN]5ae#mPy4GtQ&J?嬟٥3qd?3\d( +V-OaQQo2}i]I:Sxb2?4.+V=W1BܟkIn$x]@ y~Z;#(8of3M>:M[21: 8]Z!$&D߻(9gEݎԺLJP6Xhc7@e]҃gH\~*O򮅯g0Ir~c׊j](!e0QJ;owo*%RGu4sF$R$LG*uQ/R*ǂ3҅ C 0ִlmaUVwsN5~y#6yRe6ͩrSlg;0[`IIr*IT8?Hf<}>ΣStQ`*.J*UB h*yV>>Gibc1Sw9Wr%͸VTb$&Gz~5q?zݖD.8'?Ax??J촑^E9)yVr9sׯ>5IGB3"=*O9?3|rR(܂}=84+(9=*RW?s2jn_C:6c6q+@gj`XT<R<Ҹ|fi=uón®@*w#,e@=Q/JlrG^_),?¥Xbb> Jj$yʘ 9VfXN7QlMQ $Rv#ueaGHmЎq3Je|ޡASEJd㱦Ӗ.5 B1֕$yj_4h\OH5'bxқhp y `@F/C} |hi3LJp~cSLrAƨ$=G(LHizs}vyMHmOfv=:` piŸ9V!#5'i(t$4$%vҽY'GrUr*8?UķM'w#y֭6>o*a[ߥ V@TriKFč} }b_q `% ge c<]q>qO[E-.(",!oQr1ZTdBэ1>v_h E/[mǹ4$:+u稈gfeD5Ww3^R8gmD|Ϛ%FGj?CΫp~Ziҝ߻_~yœ~ɩ) pt̍ש%nP,)Ϙ߹9vm-?MCҥ2gyEycT򨿐$(?YYG( bAb}6֭膐8TmWS0?3k@IL>jƢLhCyD.i\+F]e>\Cv5;ʦ-qLc~NMbÑ;ncbM{;>ܓTglȪJ #=\i-Ѐ cեc(9g21{f7VuĭL'{}urD,z^5 1`0CzaZSIYwEI__6_*OgTb|ȏJVI2Mg'$Bfc Z%w!aKFG0vFD4.QIOD/a04`?SJ:#sړ'j|gYP j.W(2=vn;U֤(h_pQ&L/j:E/MjnCO6T?tMm0"sN/PЈHzKO ?“uI).=F/>W!kr~NmwG40xǩOFج#R.-O7}~旁G0HpfjHs „HˍǞQ){u&p;i'r*k+J朣JhxR9U(</.{/^Ih;ntXHR%;_Q")Ԝtlue8c4K ?vNܜwu)o^VEΞnFBZm!N#~eȐPMoogP{5+8H۽cM6$`@BQTQ !֪D8@Mҳ"p[{Sϴ0Qf9-JxSw sZ2FJH皀E.S(ԅ~8SB/q/ށ<4c}}9@<HUϳ'@zB}jה4fXSV:)B\L3Ձnҋ 5Z'4r֔1=хqI/j,*je"M!#K5`Dih\=.9B%ҝr-Ob4 P @,zTZ3ҬF*YDަW5 Qa21V=*X2i ) twy,:eejԠTv@0G2)aUZDMzdA=lbVh 0h;r OX~@OU °1q\3Ҷ岴S̕Yw8ǽ`I #:s>x50fI(RW9#'\,ѽYP8e <ޢ-s<`sTJn 4Av;=zcFӘK+">8!q(+G894`6󎹦;xd⾖ڹq: 8PL*@;WpH$)bBj#ӊ%A'kڊB]Ӑ&4;(R80Ӏ)!)]i6;]~̮>圂M>sXMH`X7WCgl-88z9W&1*0div' M5-Iiw@\ J:w$1H2F吷u*#?jq!Rܝώ?eMّQ20ocM`O^? ,XRMMcқq ICvQQfWS::A5;qܻvM:_f; +VAȕO.>zz/siwۈdR7yGD@g~5aRJ贌F܃*HWu d ^Nx*ZoT:=sU~)4EI"=j}Ў~_/Nf+q{M7\ܮ\RIH̙U"^?إq -Fq?̌B MzWC =ڴSUr?yز2ZY =HnjFJ jn"Cm0Tn.dku=FSn"Ha>$aL?s1"jƞX7QKԶr2%8E(Qzu *݈}֛{iVm^Oǽq)K B_#Ҫ1u;ѫZYS?gkp `t)s!ggLTIYeWF8>EқiJZҞ ^8 /i\Q}kiqV%X \p85`>9m47I)IzvU Pjqn:γv)Aˏ&hkd*4GH34&1vӰm.eЅ?R?C@eP (Me'׭[[fNY4ĩTz!yeޠ1իvD#y=}蔕g:`\? PL"NP+UJ#\ƪ,; L?6jz>kXБ8~UTǦ?Vwt#wa5|+[iG9jdv䁡lpݏqO6{S ߧ%t'fDҳ.LlUɏu(FNO HH2OA}뚤5s O>2Wǘ3zք̇֏;`# Y@ lҋzN9W1@6GZ7yTnpiP{I ޣWifTB 0=o{.%J39R fEJ$L n{҆K/=jEހ$хL^Iָ@K{U=i|hϙKC/Oz֜85O9=iU.6NT*ҝ悇>\V&Uި,$)չS2I !r՘#5T_iWGȪ;@`zZU#M)LLʑJPSy;S`6[[ȣ8W6YYSDN*EvJǼ ~VQ'B3~T1F@>lIm=L3Nxht$ķS@';R]w|L9_JC ve$Fc-U+o2Zu_37}N Eނ?$d}篦* =H8<3^KW2J@뎽jy=MJskM;NŌ}'FC.IՔ)iO$•!qx} B8߭u)BB[*OTFq&P|Ѕv0}+ZTi4i确W# pֹ5X:׎zg:!\)~bN l8;W!N&"'!GCRCD&aHg;']P0W:UH$# ۹d̊P|%sXvɒԭ0'#ۆ7rI` K4O1s'Ld`{Ju"8QJΒ,HTn-v,ONv;]Bk1*!hVE-:+vy09"D 2xѵ!q@RqʷN 0VuμcT<kӓҘ~zjjR]B-ݑgTc}RYL#67wL2)Si I[RyGF#Byuj%qĈ[=Tש-~YyP zݬ@֥a @z(m|nBV SlYNIkI+\ιq5== Ny>I6DVXd4Hz؉VcV2O;r"- lb9ii8̣ 4=TaKV{Qa֤1DsCIE=sF''BZ9n;ԞT@o_?Qs[1y\uSLU#,'!q|Q5Rأb *H,zjHbA~ݹPЃ#ߥ!=)?CFMʱ?ʧpO^?­m!I1Y!aҪޯG(UNz~x5|ؿ¦/]M1TM5f(Cy.ݠ"rJr8Qޒi1#i|s[Aeʹi $R)Sf"#_S~tZcYm궬GLb 7UtFN9{vNB#318?:|qeƥZӱZty-#]˅g&ퟴ^[[ rJGԕ7˻Y 6c+´5;% #?S ]RHHj1'YcIts>.r6zRo9hWBҏi|z4V d) {tEl?GK'9:,Z|9і8bO"[ӁZ# sx>1KJ-D}.5Ùۧ!NkW҈Uki1D2(\$oQWig^#Iiv>`r0E JaHp+@`G%_jg٬MUj.F>dQUbN2S;]^ߡ i]^G+dD-_PmA{j?ZOs}.kG+ $+N =dS|qubKdz7ƋD}kt9ED3Q OsCL&-"\li?Ǣfl qo')ϫ 2 4>gZ̟zWr&n0PummS;y*[0co$LedBU!a x"[?u8>jY FW~ɩT+ʎb}}ң3đv+Oa֑3Hn W֚3{Fxˏyv]Sr1gBL &VMzJ)Q$6x%q=ёJRy?x@I*rGn9d:oZY t,A= {Tq$Q ;gj&؊\qjr>'޼8ES(y5tdՏ4m=4ʾISMgb:z2w#s VevRH\n隚R9h$3 =p^{=eFK.Fs:Xi+y|!GȣvhBpt'&DUHlGNp6zf ޹?jL|k]5&fc¹WGhGm#_+FmOM4x@%!RA+BON{|"R 滈+Os]қ_`1$M2q$c8R5k \h'RJ"2RjI%+; Ȋd HTqcN ]`μz_*P~oP~U1 l< ΚN8*JcƣhNJt6Y޸bdb21sFݷ[O?M!dv3ڟl{{V毹2(1=zR~}*,(ғHGQLȧÏS@ZqsKNRm)NERjۍQ\ZFǩMxG>(+P ǘP~KG=DGՐEjȱz\{%ӉAdy儀_cn3VcjluO*WOpm9)'bucc?M\ORvc#R͏l՝A<`OKuКȧ ?ƧM,RcQEۓ~*5~(L Fp ѥGoppMX>hDM0yƭb"3#N߂94gS̖Ko_jlU%#Ȍ}Pd9E'koʄW$guPа>c" <;G+\SNp>n(9-2dʓȐr*n!=Ko''޷yRv8mǧ5i!QN҈?O?]w8uT?A5|A9gLY܏5$<7n)e %&Z3N+O 3X^f^yd X?t\x]23Z7(\P82:{Cc tanjx[F;8,+19X?:?~q8V [PniOWyQL1G0zT?ؕ[GuS_ݨ>hĚ ?.!6O x3_NKWk&?-ru+ ; :6@ <ﰹs};TF!H.n+j'n1_h֗W>{NR_V=}(vGQ ]@{gSpGSaJ1.ݘ{4syi7'+>%$mG?~4٣oX[4@F?"H5}B+( ,iܠۯZ.`[+c<ʍ aỎ)I ٣\_OӖey*r?N&4 ?{YG8oyӅ@#~iT҉9?GL3y<ۮ)~ߚgl䅃QH&]=xX`cnssӠM畂Ɔj~h=f!=mҐ][`F} k3  SuOH^ksmdE*.}Z+UE,V ma&ȀiZ[~ U٭|K40ōKe}x }OnuKھ~cWU5G֤]bM?&iڔӥ[7)|xn&hҍRp ~Xʪϧ[ų0^(f Ȫ>h!yy*4O. n9 ;x)9Tnv.rwMxt4I 'N;uAf0Ee#jnOL|ݵy)uk\CUگy|Lt&w.򅌼ÂWq椒FwFi2LHOZ!3~PvNTvV9u)ɓ<>gLqn $qڤeSH8\[}& ʜ /rh(LɃP=+B$=*hJ0<Á[X3[Yt {ҽ+J;J^圞]z眎O4VmmgU`NYMjmZ-$펧8'WSJr=*ɠ`A89['=}y$(oGLC β8 !<\7#ɝs?hk \2y '3d5IǓ IX9;p?ZZkCT`u3Qo^3D#皐Ltb/g[\<̟I$kgqsfCPjd^jXQP%sƭEitdf,@'EĊbrx1|ԍgz񦽥ve5ic۸ШGJyS,QN/̊n=Jl1 @_gHX L#c=V%rsMZ[4ӺgX_pPFR֯aGO0ʗ$}Aԧ>G1Lkp>#0.-zGкd8m; &|SpǨ9t,9}Gf|!nVqjn_W7M3n@gqggm#Njz3K@*QsZ<GUuOy GtԂ}5ёbMMP3H#UqS~u\wSW8ОEPN#P)uȮjs;+oarC g@5 ҵ)ݴuo[n(Y>sj0ǐ@cCRZȢu$sKA%Fwl:h̬%% zcg#(ioVݕDpN;TsJ޷u#&&$dG?'2Ƀ@$j"3q[^^ȕ9ٵ8CS?!?U+4FqFNiv6~;K0$T@?mM?O{QǐME֨v ֧TNۥ:!9!Xp3ޡ( DMSbw5m3n?儿 t+12x4ԈeHL P\S.#*p$_1L"U.}+'kFSN jhqzZB-^-N25s=i\?-֚%$I#3ֈ#+l?7%LwH|4^TFt"_WԁxuAT+ۨw`]:rǯe?۱sCZ1޳h.9He>o?qjK7q?"6YRyV2[<6"+LjCK* k^EкbېL_j ᵔ;Īua>W ^/M3]t8ʂPg#a}@FXD篻`5xss>̺:B/FĒ9vFpO&IyǪ#u$UX0dbq֘b^igTO*5+ɂ//MHAR*  ^=k_LG!`>NԞaHmIؠyHw \r_ϕRl[#]8AA :j+hF{sH!|:A+S26)hQ\ |au>!d𾆉s*D]-@e Iך}NWZZHK{Q&+(sߎ+?B.K50!ԉɿ3J6S,E|=Y>/QO} Sn֚mG_ryce<[ ""8~] ?){>uEYRo#vYj:,Zht{f"ʆ"`I;試jzեcyBDT {jG Mc4jY/|y @ N@6G4m\3.[?z->P%MK+c:2;o!m;kKLi_CZM$4b4(zN=/|%A\8+'Ъ5[G9ivJ5;s]m›;)?i[&_X'6'v-ҷ>jЏjFJyCy# wGV:{!;G! n.7';[ڰ^ء8~ҬkL]Jv+Gg JYe2noV;Y212p#kRYӈV&Szͼvky@}jxWۨɶT\ک1)%p6$r*$79UisуUqc8Frish(i61 9f籩6J.$@JE7'533B[H=@t]Ƥs55N)6n~3S^C=k.iL~cFsJ-fh5吙2đ 5ŵ,ˏtpr~-yue9gzy5,g<Y3#yO76|@d6SX^Img7 pjݲg\\HMYK4rNL$K)IF|?Q@ZD'14#q+9v<)@ҝ.Mpc˜y1)>?5/zi"iN'ߝ/#C1Ea3=iȤG6GF?BFnysK>=8#dc66Av AOZW7rяZOqq Gtm@|M3"8u%e%= 5eg˹Wc['ڻ*{uz%wڭ6(7]wNVe=e$gϣN:Z -K+"e ݷzHDqH([ii)q-B=2uyUNnGy[v;f+='Od'y _& ://Mn踬N TnK;b3U yO=?}'<?*AckG=fI-DK݆$Su:ޡ,eh85bVխm2FHf#zUz̀Ev8WԿ dD!O ۞dn[߿U쉍"pC/dTU]BnO%:Aimdd[#bP'MxH9r< ֩EhrTSk{ JcqNR5Po4:nX f|bODEa1*SM<='U&)Y h=L?TyDӦv!5iW.rMsmhSRYT=I5aKǬ5o{j滷UX~'ٯU!sZ;N*5f PKbU'&$VRLˌGRIML<fER52`M7 4,ÌV@?ʚYI*pA)G\A<#LU#޽Xԩc=vHEM 6ps }I};E$G"%?zz柮ZZX vR :Sm,.EFd6+,XFR kFQ!Ud#S!XJ:&7T.9,cױδfM-q: TpH&+3Rs徢ʧ&7Pk!{M蛿E%JK0?߶?έU{5gY+rd^?͕){WW`0v=9QuN|M I>y5=F( O=p&g 8GI|.dCqK.??Y_4G.>RS56f܁`Vj]d6=U.*מ!*'t0Ў:$ǤۏҳbbHM\ _8>ƧKg M܂88?QT`j p1K83J0ƪ0:,?EЂO ꬥ·e(cPyCUfb,xgF룴R봃V I??.P?;ʬ %RNբBckf &l Zx$?dw}H wzխ%ڔ2pvw%@O&aL3Id&ݏjhWM$Y(f8XS:ȒV uWԃ'!"gJq!S/-匇w?8DžWm2לc?|3؀X9 Ji2Z$.slmGO,[[?E ;@sSW{ݏ03G'JѰ%ad@vw1¤F>#Cr*cz^P\D[' VqӮo\R/}r f?1;4О߼_񬆋RBqsyרtZPuV;sх7lO+)ݩ2qjwW~8YzoԻd6l>w[RPIǨ_ ޴ & C>??4}i].7rQO4juHe[58jwyŸFA 48pð c5->OwoGQOY9o;rLx=9Tnb=?ʥ8ՁB?@_JGPCn]:8q؃F̤#:֖ >T"=GJI TܘRШY=Ke %E/GO+*SڡEܢTUel1ȪsrsV܇%кG|Á#cҪDO3.?UK @?Rerj[h8):qgX^Ow:VEԶy<*_9,~f\H|9?x1hiAwę#&'pi?f$zwNzU+ޒ`Ufn54W$JTˌqqEQb$u49_Xܗh#k' VBϓ0bsUzBRQ5rП|?>*4-i˼֜rԕlnjQy+ ہfq>99Hm Q>ӥ>TUٟ45ִ/AX:>kDE.T m\2| \0< };Ջds*Lٍyp@, c=j"U2kyDaYF>?7Wz3XҝT`FVEyF?yzβVo2˰ !Z!>ժ2NKc>XCt[4V}]|.VrR@|1m^k&?җ{9lC(qّ7٩c&хen{YU|2gO?ӄspvO%y*@?x*x$kEIWZ,sE&NkzCp/%*Epd+08*mGўX ]Jb9ȥή[H OJq!N}ZV;N"{LCc^??i9$q B&}KBsow IB3E?z9>Vg!Îr>ẋ6Zo[Z.?:8G1+º? [M Ѓˀy}6z$miZ&ɺ k #RMhTS9au{2p2s>f d sQg}ϺrjfrGz.Г˜* y7 )|gFVa[CW5;X2FS:DIZocyO1PU {P  hGz6Vc3L~+cTq6vájܗz+g [?~߶?=`ԇ-c4~,.&eMٜ@N<= 7cZjWMcX_NwkejaՕl8Ϲs*ʪț1ٹX|ƒvM9!>n@D폘Հ8%bqjCDHx$>8r7c=Fi cj9;ճ0gbޙ<"G9 8┭`wQpF [OhK21GԨɀ7 }ܸ /ZKh@a#֥Y7*IO3O#ȗODZN$pCtzPXl/gC)%P+pDR/QխJ N}5yFԈӝr= _ob)4M(6.㝖i)-+5v:П'887Z ):c!`? *36O1i- 91?5n;uʁz|_ȡ߁Sƭ(_ٙ5x#y끞ޞdB˚|̻#F])Fh.Wc G@U?ʚt!r?}Ne,P5(t aNzqR:h$_*ӭ@%U*O-:w"m.}12ZRMc* L^F$Zj?Ɓ-\gs2<=t. $wpF[TƠMsU88aUmRE?g$^!֕8= X?Z ,14uǰ{Iw4!On`iGk74Q9]OXǧ֡MMͪߜz5R)Gs˹;_9ԯI5OH'CLHx;FO&ΤU9r#m\HCJy499r/[s>m}*^[p>hH"Tr)Z,`01|aFp(db>{SFprM=9K_A:( AJu`܃>?L8=δЯ1h֔TM(=1M Esa/^jɨFx0C֔c4czsH8)} Q{ԷGj9=  sRc>tG~=('*9?v◞48 }L)9=Hs@ƌzc,}TbSNӃ*qsғta2fioPU!QJkxdIjuG?ֳ Ma\>iѸ Ʊ{)UsI,Cd=2%is?GY;:>?w;˸ƙVHpr翱"G.>ʜxp{df,?Mب.4 }'?Q/w4?>nLJ1Fhb' 2E%1j@58i?NDF>XwZk$se*ϕӊjiYIjUҞtX`T ڷW f4bR>ռ ~ n4#Gy3AK <*gȻlY-҇ M?JpSAĊۭ%ٺnh+N?ٕOS ya&sDZhy04kr%v֗8ݮ~eGmw<ʫq?IOWܡipea$Lw-mqLQM?"ǶbܭVzٔ!48`g?O <,C09PS aeQbi N=?xOr g@( 4gZ.vy?a![d.aݹJR-CgՏ iiw?ʪVBcc0J[hdFw5-1gARRVv ƣ@AN<w*FhݮOfCegMSVsj?lV~(qE)3MuXO nSIY.bs+fԉiFcąO@8=.SY9ZBN{ӳ.exe$H5)?fAH8qK;DZo#G'Z}:[壱ǕO"GF4s8Dϔ9S*s)814fW~ TZFW;Mp<}b)"nB?J5 SXVG;;.0)-q+IRT ~~M}zUYؐdv2I(@܀`A&Z+#U70lZ"m5pK">KN}\sW+ۨiD3,δ~ruC ʹ \0n#P܉GR0`cU#-̀IQlc-0FhĢii94,%J7 5x ITel Of2]x7C:"O~1sXĄbw-4dk^cSޓ`cƨO!q1UB{H$'*y )lh`mSqsL[cmϚQWTTLiiSRP8Sݤ79!RJ4ӂ8Kޝj7o[b4hnE/jv~n4XJ9?*@@CGj,cIJp^i48Rq7AQsSݯsAӵ;YeG@fcKۑ nlu.)QpJl?%.: t=NzҀ{ }h=FޗwNiҧ~OwEI?I) 7R`z߭91h9M-!="Z@tǭK@悹O4@8拀<)B9NRF(#@}:O)AON9y$=h|;Όwa!OsѴu~tR 3:MРqEp3Ε%4ҌA(?J@.8iRisIΥqPAL=(h8>ȠD>ZvF);@ iӊ3blQڗabo<oқ )Zab<v>Pv;qXsHN8Ig;x֛AAJ.;h))' JNhAi;H'<;I:'|Rg;cb%(>s!o^LLqGM(<h<ނ)=qIJ4q@)K(uM4 kR?'jS@j4ѽ>;4͏f2vঋ'jAwpR$ w)Zi2{ 2qhZN@= &c袋ęQaC=[B8%Z~jGqڴf9\ZԏE?p#=EV[֏)kj.A=jE/ޢH\m85WoQA)J7 "oQ@qHew+ uSaJ!$g"7:PSl"!qOPдa`֫LRy-(kx"p#VXOhӷj!8(;xSt1F>a֫f?? Fa~T8u)uU0R֐҇Vb(~T $QC=:1=GGc@[1{Qn(;xP2#ΗzΪ)~Gq'Us)>?*5dw#)$_sn}F~ ~H t'ΫҁO) 1~t13 1)BǚACf8ߥ/(4, cĂ4d}qk-ߥX͏?|UQcҍ@Gh1P}ҏh hמh>͌|l3F?IG*h8ʍCBo>#@>@-?|gBo>>(~?h8hOWs!Q aHmq}/_ݍ;ѨhIGbEu2i~̿oΖJn |ߥ!7Q14}Gv '\Y#'򨅲%:wٓZh?qJn?'O4g o#k}ʐڡc4n<E/Pߕ0Gt}s3ѿ*jO~:zol_OG}1jB{)b4g!tjޒ?==v4bjCzIHbҐHt/ZJD '#`J /ZODR ;~H+dBjO?3@4@>G#}8;9fsN¸@MicA_ʟ1~T$/A'5(jiccy~1tq 2G@-FDR݇+J\`ք ;xs9O֗; b(;b~Tz*JdR(Ms(nd~O$T ۃR?)FJGJ?aT'Vqޚ41 fi80B:}iy=9! 1H)í'zZ:04 ^EEF4LsP )'`:))򦁈~M;JB9vB'~)3;1 L4m&44})) PhtpM;ю(֗5B}?:Zo(튑zRw>fV$NZuOGQNEB1gZ3PъVN;Sk.))h/A~Tv{SC4RIځ!tL4qLCMlb␚rM!= jNg/jJ iږ~@ ;Q3;ځ֐q!٤i3KFh(BhARgZ<@♺٦M @Xy4)7cC0'9?Z;ޔr8=8@ E8+]8AH O4m`bLIBXM$zBGN*0~44O,i`DrAB߮)q\2+Ytnf]?vx<uU74%-Qi3Ҏ3T@J\qHz vJO5dJi1Nui =sFA'恁HaK:QFxE'.x^3H:}iw%/JJh>14s#rh`)yM΄ӗڂ3҅4Pi}(qA!1ޗ f8~i n)r.Gҟjth@n4MsJ8t1A⛓KH3R3G#Ҙ`v4jbcG|QEdR`vX !gSqK!3BBRcR|oZ.DL8?O~>8@OSN?(;xA9 c&FA2,M0 ^y] ҥn].RX>}d;@e*I]lxjX7q{VHW(3 r ] ЈXnJSV/5~ @,:jvcTM}ɧ\#E(vOS:sϭkw.Hm8%e[ ƪ:8kTܐ̻$ꐏq֩; j%,X; 0ԗ$š:mvlTL.{RK+*{vA@NJ5˔JQ:PO5d (JK=zQґNEPS34da>Ԍu*[) )`Sh)P=) Mc D.#=2~;p6րdi:qQr~SKO 3E{ݩ3MǬn϶iMcS?S@EڠsR f4ν!Қx3qNC(?(ZC""S8ǠlsTQW#:u9'TQ#;Ҁqґg֑0nqm^~D@!zRssV=ǩ0*ƀE`#;r3RhiV0?vsiFGue9,V^2⋊niYOSZ6?ZR;bDo~s@\f=(XsV6>1yn?.fB#ǯK{ԁkvDn:X{O}4P4n:~5;=(vcN ` S㊖r,gj2 yjN;˜c&1cҚՊ6Nj;Ҫ`9Ginv➣:iƑɅ.ZƢ<̽-ȑr=*Qy33q9v*np+N3jסP+HpJ6~"aĊRcҙsds52Q)'cd'$8@\{SYS\;E$3pMg#>ƪ#)0H d59&O U +sjr9'jF?H ¿)< Ja`00z86ꊊ}[QwE+j@I}jЍ#e\F LRc|1&u ,$>`!QCk]ɸqU:&,pl<jCq[ # IJNgQw./A 4QC]}iDy\L C,1֢{Ə)3Ӹ=@3CY~Ti1;+&Bp#ȩR.:/H|>4Ӛb"߼qJ"^cO=tS(~R1' 8Gl;PpM^t/sIךb)޴qM4)ڜi 84M^H9 PGz'Ju!8@4P!h8M&/G4%8SE(҃ޛ 5HLS֓4H}i9_j`R s05_!Q[qե>5$m1彔6Gk˱ffG?+b\լQ{Ao2lc®s^**'|NF ƻXW: vV+}?:_~u(B8^=I9>_|JrG?E5ec9XѭKg{H]>ϧJX79X|vwSIo+7mT$c"JFZHb}9;֭-?l0KM]"d`?K;+u\GQv !94f'DppBɟ= $=%DV0LN J7O?mN\#4Ț}>b%LT6juٍ]X?eש%oc:`W-(Rǹm"Ʌn$*皠)qǽ;qW'_-p2LOr! j06 BH⯈S!Ħ|SCOx$bvΫB56z~c|Ԃ#HahRq'ڦJw:wDWg(VCNTzdR~AeWCWՍ|cDb1K d-YN cp(*)}(oR!Ҙn#=iB}3N;9*$dѰ}EHݔR8 GsV?EJrqMle;7u%1گC3Mh'jԾ%-:bX3S*z$s֍$-⤡M4/'TH0iڟbZ^ ]gp=i{h`)yIyaRfSSbE&hbAFii<?:bCf^?AL2OJ53G?%JW  bZ<~tFO,LeOS|OT`~Qv;3֛=JB)]Aِ/ǰٞrF3M m=vsU=P$8؜ Hp;ǹ*J<0ST2$z%c2;OHbbs&?32 r>Jbh~Vt~4ηpI\d!}žq\wr@(ޥpcҕ sh@MI@9F+PyҞPzt7|9,W 1ҭr[CǍ>K C4E3 ݞJXȣGAV6*D }?H.WHwNp+`J-ӟV*[!b4>'I38˸1h<86p3J۝/UEܖﳰ𦭹,9!IﴏxrA30#۪?Mh}rj8)隣ɩ`P)q!\y:M&ӻ%#5dd)N}i :Ɨa#q5.:{6ߝr?(ppzzDJ:?5>2zQZn4"Uaɧs4ӋJ>4{Ԁ)rW1LqN'!i=R?S$Dg4Fk2z.N3Z?Wԗt4&LYp##sO"p*Aqޚ1 ڔRg:`8ڈO$ (-=(5BG}i ӻFG988\4򏠩I<6qM :5GM hUq:Q{K·KϠh4>>݉vq@ )ߥ79HM{0iB .i 0=ihFqFOR%!`eQސGӚ@i#ӸX צ*+]皒#RpNp<7D}|SN9R-̘!1Q<`9t5k܁hӄؓB]9TC?tNMr$qv]TCm-hT zqiC.KoF9.+y풿0 Zn!bթ-fITϙjam9 Z -22D?7JBȬ1[jqUOB($vJpW1,4vHpC+`>!LB?t~6;JZ4dm@ex!BB<~jO`nFġ!mEcHݏJdܬJ4d0w)`+WQ+ -'uQ6E+2 {TwYVXwGN e#1QA7 xU "+;u?,Ԣ59bn?pI I}U u N+}MH6R`a4 D?]oni Ԛ\""z,Z!d?4No@ ="U0) A=oJ<UUU'?xz\RCl^#ns??zƞ}RQ Au1朱 atŽԫvqI_ Z|=*' O\-n:UP)꼁D`9kxgP1O+)r܋?ZQOƎbw63N5m=1N 1P+ ) ԘI#1;xSRs3@;x&o4sJ:`w;!J@NbF$Q攑ǭWFO!U<1~))GT3zncW:tޛcFzH=# $hϽz@<)qQwխdړ(ii1[ZOj䏔W=6R3QPCT>e5YW\t'K8OZQ hPPsJzRw>ƀ Q24ȧnhfǠ sȥ֣eAM鼟ҋ jid{Qm9jUSZ7To#M+n8HaZR\֝sLϽ;<:@ʔnΌ@ :҃MP1r)Ҋ^{Pޔrzg>gP!IP}#C!p$Pތ*32|7*.j ;W,N[eQj=.aؔ;sHec!A-FNLQMDLzFHf"C>}$C&ҋ R v=TM1j#9'#Ȩqג=?=KLSq׵}U$sOF3i빨*ߝ81$W"3a@R9l?cK¶PC5[XIuKeX d+@zdqxvHePw=TM5edQ͚u> O.%osjJr5a('đ.aaI+gbCӾ*%R\_i}.f.jTT+fU)z=ETo~A rckCFy$LN9)\~BkHx9;df+UR/m & &?G9w?* Iq!L-ޕӑgQ̈4tS{w N*r FLJ316?+ңx?eR>g~ḓJ6d sӸVX1?,֦K$kW#oȪf {_'bʞ#c.w)l^Cd d6=9];v4=Xy)Ɲw4\#\RQ@)fbc&i縫U+v|m5&ܹڗCÌqM'w9vN[ո~9Tjj"ī30fprr{yi^gޏƊ9O#J^haT4 L)riKqIR +c]zuf4/JmPlJ3isG1HӏA U-R1Kp=i.{1izPރC8ҝGZx uv74f \s֓8.;F8!֤sfFb׎)uɪ[ L qF֝^GLCeY?O~ [bɉ/aCȫ{WJ :O#0@#pqz ȣZUe?8Yǵ!>N2>~TA8yc c"#QvH(74th擽sƛK펴ާfS4M.i M!lu☃fuQ4T W^OA@eL}hL.z>g 1}Y Aݡg_ҕX@\!9PбNKS j-@Aދ0*煣ch=)qXwZCސ#Ky; ~PK厴Z, ^Ri;Pc)Q^g8}{B?WɠwѳOsR kvGޡiqOH!8[E4JR5ntR#U'1Ft@C1[<{םנiW,.p3՞)Iw][Hqn0ǡDVOmUFwBεn.vȌ!=͑ ?kԳP}.׷$Gcxw#ʶ3C4y_ZqVW$n c^CÃWR_h?fI%!1ɴjl3)V5_JiapNEy`BKk0NМ~Fn!9f0=:V̑>DJfdHi&WG̨5SIV& , ʧY@z7flRCX N|ons){԰ddRdv o"+w>ԄqCSsFhnmb7$|OY#>nj>HR1֣\q~U尰TI cNo~c> %@ H\v4FIq zg;(v{@Bi)9JŢrx=;bMn&s)“ n84),JBR$2C N? <}s;[QU8[x'򧎝*huBC#`\zխGIh(})9JCiޚO#Z} -ޔ ё@9QU=1@PsBviap}i*n; whoSah4)#yQ7j7=z3IAcir8|T9lҞ_Ά~( `)iIjUǕJ) 1yGqj"g'=rb)pi:RUIg`#"RXdLH!8d`Z$5RIӡ9RJqn&֣IwQdCċw<5fBBʥ$V̈́O?TyuXH ϙXc)#=4ti]1buaP=(D*Mw43†w4Ґh\o=9&E;+yc4)Qzv{S@(@ ь;ъlBbKhM(z3qӰ=):3F=23J '>*9"Ӝ OέT\IOX޿„ӁP( G/~Ο;@I Up䚑c@8QN)\,Es Tf99㩧G`ֳQVGCe$)p V1,\8*??ά^$$} G#wm.35 ov2b-"G%❃VI$mynw [*'u$m#WwZ 5>X}9]M% 6"=3P}1 >ePF}j8eˁưd2BZ h#)qQԶFفlST&ܕn5,E?jխQbdQЉ:}Fi7'0(ȀFzxϦR XF~yXu~}Hp98;j)3@ ԜPO4t=jKj9VD{fOm#Z- qP gQu-&I=E)c !-<Ԫv~\ (aUt)2M(QP!Tq`dc4ϽWA Wzъ1c(F1FRy z[;~tZEB)8UO'YR n 9q-OO( ϹGzMݤtQI?q@1?>q4@&i4@ g4t4J9(>z7v"MT{3@MASK0v 'd FK_½OG3Zz3f_΍¥Y -jLwc.MzQ3[l!I,&w5hW-\䛥dZݽ;_=le YFiq7~{p%_1['ڧDUTٌ2gʬx'bCX@+&^}Wc@&N T.^I.YttctR\S%׸&v N׵Zoli-Ӛhӝc`29 , HCҝKsn7MWR)D .aݷȱG-=>֥u &)$) 1Uqf~ɫ2M{`bXp*C}M"xA7#:\_ҍG&@#RHWQޓIc=iOf" 1J:cX9i}$w8RdwRgF$JRuZ$Dtd~݊NJdZF>TkՇ)TzTASnt i7Zc_8@;gO)nG;Hdz.qS hRM w]0)8tqAϮ PB#x ^G ~JС9MFpN#~cSqUkU}>=s 1[;"xrCZHr.' TƼ{RyrưTFJ~fnڗvE4*G4njAk? !1>?8gLcn-ݾ"/CR&Q^B0Gp)6! n{ pr$Qq .=ܸR@p)iN)j c4vz ICM9>.4J2<ӂK8 1٣8n)z8'nhZi#vPMY[K+yAG=A#U)GLJTisSYh8b3: :| 266#cnjq ^,T-T&y+)UT [푺9p*%yď@cQR3(W7b=3L. ҅ߕ;fGW&с/xӰ;01ބ1ҚG=qO'fHZZa`\ѿU7n(ɠCsAƚ=iw/j qRwA) gҏ$JlB)4(1yIRW7aHUGݤ \ƣݩ 7qh1iwzcJ>HIj‚q ,nWhb1%r)#/&Gjy&}8Tg()n7Se`p@槸l=z c"U!Ԋ ><%NI$DAl~5e/an[QY:*}N+X-+Fq-krW +`UrΥYcjN@>򏩧[y,]窢 eQzIԝM#uDϣҖu(iCje5:q{7^pM ,m*EqjXP)w y%s*4+"KVT :=3\庙fE,GJI=媤΅`ERsH[#҂?is+0)>^is=/N@F@XR ?*B=<i4VR"!ۚv~֔(.4G;4c.Mg|qJ bE.}MOjv&(sM!楤4 RRqE& ɥV><1KHa Lv@&o4i9qIJc3u8`48I4m)= Rc׀hDž8<}iH=116㸯^} chOO4s1D,ڜF>j])B:Uݰ*Kaxp>iTpm"9Z^$rL"W4ϸw.U~, q >'wJ]EBc9UoO{(P!1n|oNbp_毠)abMMˑT7n<⿨9X8"~}?M-7]Io524q*B&sP*?[8@*@BOPۖS Ԝ{gus$qq] Fl3r~@IaHٱ:1s>UMg(vAMxj̛ӳQM.ӎ:R'moZsq;?M$& hr:Sx4;Sp91PM.yGؠp)y)M#1CFySwigKڌQzP$. i:S҃i#ߍ! M )yK))67Bӽ.h*}(22EZ40a{`lKg֋,7 zN=)Fq9J;1|tރu `Raȥwgby=p1Iu')@8InR09ƔF|P@9Nǽ7w֗4.8GriҤS@+zV~Ã@O8Z6{\0)wKLRRqސM " Pӂy(){rE16')R{I@@)SKh Rd6)zU)C t"vNێ5S? 9=iw%!Lzi8E-D35inxc;-n3ؑZҼfHҌ˅^D 3!lwV.3D݉JY. a*X3 ruFjq+)cHy؇"$Xmoz^Z𥨃q qZ%af\JzbdSs$8NqI\sRzuD٥a ʃ£,6.f<+cRybi /twO- r2CKGj[ɰQX?F\|7D, 5r;c#硨Hfzl]0;Nf?1͜Sri֜H4sK;PXƁQ?pGR #x)F8h0*),ą*yT H=qJi&ػE»zUGMVH];{eAy4Ue\$*S!~g;`g8KN>^D3"4HQfym\FÓںrk<]dc7T#$0~ҀǵxFğ1LAS7>3Γ{gh@KSX7LRaN`*EqM*qR=*ϭ!sA M db (}igdoKژ 6n 8)J])OzqE7mJV x=P},Ac6FC)Mf=Kiϥ)Ԁ?zjEc9&PT\T%Zu4 \PHq@X ԛx 8  ϭ8RZpzQ}@h'&r(<cM>hcr)sn)N;P(8y@#GrjOq7CFؤ\V3R4ҺHL7Zg6jz,ԋX`G=#E5&4[F7pK*c- >\Ѹ T#B}k5lTD4;ُ2TS~^dM]n =;Ӱǩ'HA=Ȧ`l99Pִeᘐ*UnՌQS8+Va19=ۆ6THQQJ±^s:(1:WaЌH@S(*/&N1@ r;Δn}E.~H&3ҜqLR{f}H123K>@=1@%OAMJqSS1J`nsIx0NhL,.@=)c=iy(ۏcœ=OJs!<=2MR&2z O,pzΞzd "JSGP)i۳޺'(5QQpOY~G 3Pޢ *ܠEe1~*N{G^⹂Dg#B@Ss┣lz4bhaAR zҶ [J1 JSb᳀ث0A#V2yʁjXStfl尮9 ֟&zyFbU'9⮺3!  [.Î9ayI@&ϗҟȎ1?SZ4䀨sQO/ 9H^PF"EqWg9Kvdio#DE,($˸6#,?cĉ{z&wRFMTb;]ƒT]A0,@m 2'5n)Myk9C|)k. ؜rܬ n҄\qG(ҫL |ȶޚcOM*ݠ.GHPgTZu'w"ۃajq zΗOzh{z_-1κ`fݸрGJx0:t GH֤(ھQ.?*_% ړ.+Jlrai8QHVԊb21xxzYXK:PiO!=iwJ)"_CM9pF(q)0=E;Ҕ:xP}(Ȧ;oSQRmi<Ť޽sf )vą3ӱK8 ւ=hކ(iH>C5LsJ"y\{Vkݪ9ӑFjO(Z_({t+n6J}d N Ubj0'%zF8"ԬM!qڭ9h")!p<y}tbU=B(*lF `^\NY>tM+t?<I.qql G~\ԁ8)Xg^nf|$ӏZ*P4jG(+ɩC)kʂ?+o8iTF@ǵ1S\PI厛M+Dp;b=P1r1FjC8٦K+⃑M8cO9WGR)sҔ+d`S8G(0HBAIJ3H43Kh4)ԝ $(G=M7#֤`)EH.Cn=5:ă3RtW+RӅsP={ UW”p(ڔ ^Ԁ!z3F ! lfF>~4"JzҀ ҅>@(g1 Qs@P}~cV#[ 3 yEv^2*,q:e6Hxv+A[Bed>ь, XLj-{w\*_??#ˏQ1EZVI7*ӶbiݨG@=)R`W 4&ZH0TB֌4J}ZBIXޜRz ֽ**8~-HPS)3^` BQO&CBiv '澀#"e8UC٨bGC]QRG;U@҅jR:]Bɸhau;4O\iI\`=#~zќjۚ8DU.z6,g,{fI f7fXk,H۶oa.Z]2Ic ?s"9%-s|8;sE c<>vʹc9E- z悊zQsF>ĖMo& l`c+TzuPF@\ٕHΜl4<%{  {Wqr:SZB13J) `i ;rz rz>茜Rg֬ x'$Ԃ8p9B$qծ=)ic-T/lz#3҂nƄq@}iuJqz L'IHc6Rl5&x旷jf>=qJ3ӑHX~7=8) oASȦi1(M ~-, ̂l5m~gI$MY 4[X\%]#3*:LHCv9RGւr1Fj*g?9'OdIhԸ4`Qq繠CK= *:j@3TGݪ~)0G9vԠ\Z\ =HqIzq,+g?z=ʠԪGJNS! }9`Ym*SՈnriPl5#S ښRlǭDW`F@IF9>4&FNΣ5Ԝgƣϥ;'l6B,~@7Ӌg)>]ɶR@]ixR86.zaK~} 8#"q5v(f=?֗?F9N@n+hfE63}2TA}wTX~Ѓ`dC.xn;L:Rӫ@zTXnkQP.8G8i>[s,uT4,KXO,OOoJ^sKh3όHۅZ*/E$~T;~x@\UHd _O™)Bn4'R-(tud^s9(#y"n3A}h҆%ƌJ`b ,zS&yo1@ ?Jn: VzoJ$_QH,/Bp1\w ݎ4au┸1 玔9A<PWVCXgegidIc $r=)6fHbS$zՅHGYq[۪IБG?J@1NŽ TɌNˤa17:˱5Nbpr:\VPVU1Z9]ܥT~6{,!^ضvɪpNS'=j@SAcXkuwڵ]%RG,6.JAp+iQ" hvFj7d3}܃bsDVN#F?dO49,򤹸 .ɤ@ە(|ƅOz'q,}iUPJ?eqӧ_lbfzRG RC!sSIqp)u8w() ^qJGҎ} \@xz/Ƴ1dyNH"p!i{Vka+]goJB KlV):6ьUFM; i#)Ҙ'^swQQY9ƣ'Tp˜HJZh֟zӀ8Alh+ hO`gڌs֐&)im6:LdҔCMoZb0M7$Z2hp}iBdXb>>)rzXU`bMn+ҫFM1X S I/`)VrI *sM RힴjZDP٧cޚsR)8ɮt6>QFx]Dq=I&sQD{) ņ9''0 I9ZTBKFJx<J`Wnp?Bv@ %7v% 5]1ⲯ%UYh&S^lbdh9QZJ6%3֗7LFwӖ|D8 x<;xnv~TVX{{jiUoCM恜k\348'1FF6?ǖxgc0*IQǹZcש0N{ 5BC<zr=zt'̵w,0AOztfok̿4?ړ4܊PG+[ĊpFFFzVG`Am(s VUq>ƔT}+؇kbCV9jb#h=Sڗڀ[?toJ( mݦn4 zC!8.v5!AFaq>.R_@>?J]!X"cu+/ҋݔ=M.Xo84 h4y.A;[ښ3[c74n!! ֥d׃Jcv]`!QǑHQb=ǜgmԧ\!M w6сIeHi*tRÒCڈ|]N9aR/ta8r ڎpwg(Pu܌TzR"w<< Y_ ,N"XpFF8V],ܲᢉ@(@vmvYHǔ5P9PjvrX^LF8y$q:gW$ hhn? EW)n3¦ܗͳ[a`~嶂(HAcUV#>2Aл˽I]p>|Ef4 `:VZ8({ a;GAT-K׶[IF㒻qUmD-5&Bّ&08Lqf%Z;[T$~5 }H-&B@)!Xo_J[qEBIW,yh$e8+TFw'&"'hI5fvr14۳ZQ'f57+l#w1-&ǠZa#op:46—V#i6@ɭ,eq"%b`i2='^KK?\PJip8" ā]rctVvW4+N+HnjLwcU-r9'1Yd$fIJO0c(LTyCZie '8GncK)F8 j4SRHgH u<y CQ^‚hzMQ?A@\PqKOqۆzzJ1Jb硨(&$H)45i ~Abii':֝3Ң?5#&N1MR);6E5ښ w_96%WR1UNZvTw#i#]ѐ]kj4i3J:4Pǂ54 H%ȮHνNRr4zJǠ IJ`;#4Q4RqF3QQC1CߞVOkURڿt ?WQԥReF2ŝҕ7. jZ|I%*#pJHK7Q.X85fihHo&ۻɔ/?1F#E?c(|dmzA܊Fո;#ʪ3۞i+D>F@aUϚ^}p*;LRwj2һ~PX$QZxoR1~P{P2B1uq厈&`*}?QӦ2)VY2JkPr!BWU숞BU1@*#zcv mvm"@ôz*_;8q ) .>M|U4mEik\Lc㏔uVҭ"ԯkg|c߸G\W4rEfmnHi9cI2ZTxUc8/3یFI^z۱%xY?ʨ_'fF8L!\sB;cU9(W!AZuPXWr:}k&G y!xJuCc;4>$ddcCKGӸgGn2N#ڔ2 Ҹm87uX [mʃNHաlW8[)<0?;1\ӵ\&H}>A"D0[i8NlP= cy+ւ֜A☀!)T_)*r).8Р֚xMJq4sNVQ {r})GzUax&)aI|,7FGqJ;1ҹ[lvu├3jMޠU)RbrO^=9Shn'*o,zӄcր!AOc<p@WuHV"X(D * hP4JKz CH9qF1JTXvQJz`j7MbI!y1f<5'?P$sO+/u`E#ԯCږ7q«gkw Mѡ_[(i ;I=MmXxK/$WYmRxaX߅jѶm};[: kyY3o_I'YүmMD''lwu;|}B=4r$Tti^3-Jnۙ>i2q{ը7Weqƣ\(,{nmV9+R,QO{ xroc@SM}?N>&Pʤde WrFOJX#-`ϭ<ᑐ3㧿po'XI7g3<ԒGdv9f|z׃4KjΆQ8?UY0>>? va6ExXBH~UM m}ZLSQ媔.lX.Y.bS`u}*FwrI4! i"b$la=qCI1&6q֕ vQ(4h=B?>@Y}%dS 8=rM(T$0.}TN5 JQ \j~{/qRV+舌rw\}i}v>?*iğ~帝<Z/O0~dM*"DuZG=?JaGWa&*>5& ӗڗg@)(g94))H<ӽ! 6"<ґOJDt"iVR20i &;V. tP=M 'jN2H.ғhIV`ԸrzPOpqNߐ) h: RAJRgA4w(aL}x sҐH3rq[ (Q ^NUx283G=*6+ws?(fPҀ4:gGRP6(FE3 X֛0\M uc=V#?;GͫYFk3T/dNQee>ͨU;ԃEE"4.T]ޗq5D:R`ȧryK;Bv#N5Cǘy5L\Y^Ix% .^OaK_ϔwC}Nꆙ<.1ҫKpPt\\J*q ֯q4 Q`:8AAŹ 0XԤ5[$hd:| ~u* oNOqN!!LOZ7f/(9!@LJ%nKXݱ QF?aj[m|xc%sQB4VtdacRy?Bj) 0#`{ !7j {ԋe<|V?Rax Y'jtQ\*BS.P+ ! 8JCթABAc:ֱVaJ.4Dd%x=)@P*=u҇Iz!cғ͐2:qz6M`9AjB2u=dq@l<oy\}k(ǚT\+uL@eq/CK s(+{cǹ6_ OHnqMsLH*GnE; c4a!4!=E RoQDZO 5L, RM9GZ⋁ B֠Ҥ3P,Lgޓ"w 4̓ڜF)hZ4JL惃{SA8A@G?7^Խ3Gh'44P1x4=jOj(9=4wHAS@ 3Hq)p*]j.=XJ j~N ㎴s֭T"G(%FLw@is-JS.* `ƔH]0\SN3R}&sXQl UH(9*?1qsJ"VJ HHiy)Ԃ~犏KǮg:Aa:f+\Z;ni րs!|N) '$TòSIHsH]ONiǚ-Ҙ(jPOMH&*,ӁP1Hs^Lhb G YC `W$0d']Eob$o$л`}N EQMrQHT֝ӽ+??SGÜjskedRO3~3(,O+.9V9$kWÊK .prFGX8SZ InD1 M<N\ZAaHjE=t ֆDF7Y@1G Fi3} ܯ<р(Q!}hlp4÷qL;3ݟœ/&qǵGGT:޸Pu\#(T~A4X#B'ZַCv b,N0-L+Iӵ݋hF84nT&:~ÁJŐ)rjG҈ILEUF3Ld֫X&!p)zuUP?q@XzpޫQBti#)*$`mieWځX֟ک|IeʜjI=ُSg#K%ğsLYC>SR2E tj1w4~4}h$j3/Z&8.):{3ךbE7ƐnݚL{Fh7){*v.}:QR,3Hr{}()h'ހMh4y؊n9F 0di4)q(biMsM;n;E7a={>nkNh1X^qJO@hT2{T1JҤI ta;9$=xI1H_q]Mp֓nI?ʍw4gʐ~KRg.z6 ?J06*S/Za pf18A)c=)S}iJ`J;Rn}(9/fw~ ucB3޵k* DsB\H9śM6La^b[r6I>+;:\\ecP~)v4tѶ=)1r"ֈS41$g4~,K|?"9@ry"Qd i{Z' eAԺh}*UW(r ҜRj4 =1Z: ^|x, R ^NF܂)c?iu*eHNE;h-J:Jdtys(8PGFtһFy%b2erɧ>Zi\.;J{PXS!0oB8Rd"ƄgJΘ*PN? xSAqNV>#HXHR1(JGjCM'Kv$3R Ϊ,3Z᏾3Ofyfm-"N=i(bkbL0q3sv4@E!=("1OIU)UݨF^"#Ҹ]'pN޸#P1[($K($7\猓V ᘎ1P(*xTrWpIZݚ[.E?w@Z08'ǐwgj4ƔM(5%?֔L󔁕&2tZDJ#*?>0'A09KJA֣nj8?Egv;=?1Q+zS#?:k&4@R1RSmGjd>(y 5%fPȡTSA\S\q7Fh 01֗C@( dS)␜nO< r)z$Sǫa2;FO8汃zsۥTI4>[Y/P1pN7UBu[ 9Dm>Py\nĎ98Hbn sy(Rt⋯_'g̒:!;Ng}2rm1S%?5)˴?4 d#j1Ɨ$'? dAR"9$-FK# sާv',{1?=g5LvzzJ=XI9]qnv1KcL9iJ )Qҙ>wݤ>INq@8yJF~,HҥJ>\TAhOSpl&j+OR3fziP@A1N 鬠$MqӚ9(VJ*!d:,t:73OU˥ T9aDi cSדڔ#jh ̴K=1ī&tQa41^lTDmR-I*d+R(\t+A9ʒy1'OI&6#F~ke7^T=oA"WJ:A;311>Th՗fYeB8VsL"08܃iاq“wڑWGCv91 cP:RGAHE hn48An…c0E)$v,Jx\=ǭ03PpirJBڐr@(F^x&RۧI}h 4.}oq@ Z]ߕ&RgfIۊ@.8QPKd)M`t'M<IM8ݺpM =i@)2s҃ @&Fh,# )*9~3U%% ?ZNm0i\ SqN#nG  piFM8'$=)6#61OPh 8& @iL<2iҔjF V5(m斴ZThsƐ/goΊCZbg-!iF{4֌ɷvRCCKJ$RHeq9L4g\mJ,(F[4tBCtOD*0ڣXIbT\~+ ČN8\q^SNuv?W m/:<|![< U(zd1[^vX 'P Ţkj .0[?em+OqS!$&({U$ T Sp&uaAyN2F|zd֐0'ޚZZwւInQUgW b=E4@6Ry`i÷n>7r6 QDs>3֞Z4OA@P.}<(F> wGLPҚsҔsҏo@S.Hs֍81ɧM {R╀~ph ߡNW#-te }i=JfyvBĒ* (]ǂ'pĮI{4ocwF*0Y$cU ﻕ5v1ncnT :{n~4'5"ήq5 ǧ:WyR`34XW+E *F!'M.9'=xBv(˷Ӛ$ '?J1qf?wO'JN`5,Ddd 3ߥV㊶_$H O=*sn8S գњn9;&H)z SX'9if<ҚHV΢>Nr?) iMXC' GM*E-5qC$+N)cl!x]y87,p.; ԣ9h3iFi)E+!ݙdkpc?vp)fP*Qk9\dcԊ I9Ps3/R&#+WhBfy~[}9>Tee0vI锧@cE>V;vErG#wi1>@:)i@oK~"=*.doΔPOҫHH V4\V-y(5X sى!@b3iJJa s=$fuf;-=) WSc 2| pU'| trn. {R*I?9qҔ=@8JpG^h AnS81j0GB3IdYG?^) !.V<6:ӷ(#jJ{~Bc$R(p✟f+c¤6{JSbch6i2#qN5c=2jm1BʔXHNրlX5 q?8ay;*TD<\58Y}y* F*CԱR!M]架Q>F* 9 Mb2p[F֥A•EiTc;C`Hأ.PImq- >iT FNJ lA |r30(G cd+85a=7ƬZO@UykX)*=@R }6RcEkUuNJz0Ni.?Ѣ]V98 g; *EQd>b;7  ~IzRS0QKdz*\(\ZVb SV[yfuZSain3]}G5ړ#ދsr:K/&+Hi8Q>c,R=Ƿ54r1HL-NeOpHTf( F|jeP;b"hFh9 ڌeeBsq#7S?;Ox ?$h*[JT.)F{bnE _SNǮ( @8=( ;31@iAy:LM=i(v9Fx&Kbm_LRu8&rs G MRoaLS¨F/\.@4:qPA sI2!%-MHF٣7&ӃHbdS)03څH8qHH+~2d g>9 d.d9H %O=))(R?Uȧ;qiiArUČ=?'DewӎJ}E'{`g $aF?9w$(#>vN sU l r@43pZHxM<)=R2{Wh9޴j6 c*DzRg4Qw5D !oG>FF)HHFhG>4m éӑ^q1qE7jvcւ+Qn>g'\ vPz њ0()ir34COz]bh@V:p(sҕx\tj`sN(0Nr8Q4dq@ϵyQ)2J^ &(֓9. !A&-&@7 ;␞zS 24g׊iZbiKZnNhhwv4Ӛ:fh@QME:L[&hqQ3@"@(8Ҋ7❟jNO< >^⃷ߚL1#$S=3@ (㩥,rZDcB88 'Bb~@BG9 ;@n0),3ީ,sґ1*Tv *D#h$ +RUݒWgTܐ#&v u2?4qRv$J3F@i g^u◷JoJ3GZN.GJ)8@4v=1QL㠥{S0Rfh cIP8ҏBI&hO掝h&Fi 7 Ri }h@~PG4g'HOz^i;c(`2(z3Si3h#)x18uB!#o !io&Kth0` uz6yDuNK7(GL$ґ34<0K~=^XH9B! BNp ǤS { >B!FwxӇ0H4[+ssڇXUwU%pVbj3j6Xΰf\3-O9&Jø:ˌ|3V[vLJ>Â%R:4s@SOdn3B!R=Ǟre-+ޑ.X\mXIga+e{oۺvst(ep49eA>'H3RGP.NaXK̽LӂaCY֌iEjiHsd1hָ.Bׅ~KwػY$Zϟ{D.QkC/)#9ֺ[TeFLPWk`a `r;jG=m(1?p,ʉi=%0b `ZaĄoHb\1s2Xo=);ڍX({L/1zOcNn?J Яo ~oo\>u}`cccco666hsgW~ep_/#&RS YQǝ:+Y&9Tq; ,NW}Ut᷀>6667354ہ<ӏ䉱kSgwd80' WG:JNGv掵NOn@OZcNFw ZPK=HX_\JG1>5T޸ݘtƟx[?cyɏx(5MYA~$;,fU7*B1 )v^U]Y47wjYM8]{r666lll#?hgOLx<1\ J;Rv@`7Q80hDyMqƈD`Au,GX9ɤdAVR֨k_ QAu;,0&3'Q }ȁ~[mGk}L ~_fcc_vxwI˻Ox„,qQή<89 {GɃlg=ꈃ45Xtg5-ppw??q]C~O@}??3BQāџYΔ'u['w5HNt2;BOf[ғ%x[}B2ZcYǺ^J"#l$,wsRv#vMĎķx~.Ğk6uG) Ko666WIS\L8U8'U{E8).\L& #.&bp,;ɤWv2'{;Z|FYW<(uY4~ _yěldcv^{_h;Ži/'ʎyX… 12T&0t*z'iǑG %P)(z|d zc$d I'2'ӿgn#/#}}Oiun#7|&w'|ώG/vY:׻WdǓEspϟ &s {w0).d9I{LY lN(#8 MS5GQjR;ѠiU?9q>p%:RXGrO,{qޘc!-UJb DIz2wcƒVY:nL *P* VyXG@άw[kHdg;}v[۞(Wȅx?kȊKaWO9lll\U.l =*~I,\Tgǻ{¤gRt';G#xUf(s6E}y3ݿ4a/4Q `R턃b`4I TlV;ٳO lllldcK'G;DLM/Ď䈎-,[WВ,L阑| f@aNn,{JZe)F z|(r 2d ^2 }7)}ӱ@\xaĕy=&*" @ >p}` _?Mbcc,ONuXL n<㨺Hu7}tQ8iK: _,Eqj$j/ FS$PJ+F(Q5wo"tcbcc-ll ޹~G} q G>ąxbY=*  _?q뼽((TiPɲ[}̽ ,t QְPZP+z!2$ 1\Yϱ_yYG'sud u,u +{Juu"&vIYP*Sßfcc'gah'Q$W4gY3]tŃ{Ջ0 fa])ةFޟfE8 &vTBYvB׾iH̀=f;[(/gxf>>gꉘGԟ~cY[n?q}[·ځZ8JjNǜ^/R*>r线Tr BeEO{2-7w,{rtNOJtwIrF$QX JPJc(2쨅<$eܩ Q+gbxPTgū4JGQhhWh5;႓A8 NtŠMbjNES L{aRbW^G줦(iפ30M;P{_[ؘ>Qwgqv= A_7|/g>ywDhҨj$"x/c ݗB)Z[zT k )A&=k7\Zu]{Oܒ9uDzά^>(I:j j" u$ m +1;Ne]i;d^X ?_yěGųHg;;އWE5z<+2_bgpbG9}pfPFtBZ蕨B P*h\jAP0@b.Hs;Gn><.鈎$}BVoA$R*µ;z \w\zO666vz49(^5OV^R]:+5,> 5TŃf8W Y3D1 T4UUPHJ@ bzb/YTƨ(g;0J)LQ`/UŨ"'΄o666׉g{\=|'BȆ1qr{g~>Azcy:SFvwMJ(@_JK: k*= @TugX " o#ɂ7p5u% 3cF㮝Ln%e C(D ב{e4Hr@+@4œ$*8z.dcj_ZL{G΃yPa[ $d$Hj'A&n#hXǪ'KuDIQJPJMtY*P*dIzvz+9;f:=j ^}AzTQxT<gIU*Z ((B# !E(.]*D HN BQ M)QP7i: Uӥ<:'ox 2Wn'5,' I[,_ן߸VaO<>1=py8( bDQu-PȂBWj s%h D %1>tK9&_F#D&-YHj"JChS"%(II-%0Q+&v Ivp66y`vjR|8=Y5 ϊpR4դTꫪQQ TtݢH!uw֕KQ&$!z E'jZw*BCäH;( 8(* E.B@66eG9/#ˁO̯ˎ o'Zߙ++G7ۏo3oOy>__<;1]؟GBh,X ^p!~u[A։%ѩdCBpC3z`Nn%)k2Ňjq(ZP$H"i sPPQD!G@O #%{7I>cу3T/x}~& v uհN0jBRPATR`R Єj(B'R.5aP}UQ*8*PQ_=kFT)ҤM5̊7Oê_H){#_/,;r` =3DX~[nȷ`7ˑR<'vĞ2RdH8+Fj!+KHjNCI"Q Ɍ݇/nI,ICI; *@jC# *YY2X  #@b&\f:27|aA,D'y66' ;gՃIz{*pBFňQSU#IS) B!I*!.̘u߄w/7>+R5 7oS8*fճnF$UhQŤhR]n"ualcc_g/W'|b~_yq@ ?*kQH2,\DH)(Hው?D=x|g`o{ZYwQ C_qI:p(9j GE:)NxTv^8PIGAw |?QQ B|aupŌE&}Q}CE(@A,}*I`6y,fɢ( 5,Ƀo66Ed ;5dп'BW}d JO;+2w 'Wڙ~(GJH\+YyR\p wu z!+5d:jВHwoc^J:=X($|5A)(!էBFTTDF2>HmaDfNɆ9) F,66K<89kzGQG''\Q=?Ծ->1+Uu½{fA1+ QA@  Pb,b'W߻j+9FM:sjpYA>Z=[QL()ˌMA2hV|F+$g@A-8C gu,I$-9H@S?M͠,-QThHN+n.4^} O:z7җ[s/I׸k+ qI)(Ca՘9`,Ң!ų L4|̨3<')0P8+;q?Ax½fgf1D3 MZHQ bf.nufJ.J*ݕ;H%t7^?wȋ^9y O-%-;s-+sr baqR,gd]gs5#8^O蘍 ٬]';qa,<%Os)¬G`ƥ  PAY4,0hAb LS Ћ%&t,dz1Ai$ \<:sȁ$P `_dB8/>/䭓VetҭpМkeO C)(4͢!,RhR{b| 0AC 4@#PvrGeY {Yyp ,n13HtBN[aGY i6N31 \nSNΆn jNxy@^->pqg\~H!āѸ (F1Ђ#bgYY/8JeWmB\; g,yC^JX7D>Sp1 &U`L0I`G+"hEa@2cD e h+4bBHk $!v d3^$ *䄦'FX;;lzw^GxoWxo]qxkt#JkJ8+I ! "5ke`((|J OM92Ǔ(ʓY*PR i>bGa`? Csta14*uG]o߂Hfƽ׮yы&`p =svzvG]%r'4dN[8&c#,J\ю/W[__L0ѯ8 {<4у #^`U"X6XPI"CC(4HAK-8Lp8"=BGfVd$,@LБDE$5hSI{QqQ+)rZյ(KW>VJBTrf<ڌCO@e>_J)f̌A)P҄@ e p/`x/],:xo]V$#v MJk֭.BIC34e]NQH5h,vŵ__@^o8__ӿ l'Fr>0.޽8Hk aaYW0zc%pqM?`؂-87 O;`=;{%bЃ(}=ؓDs[RF 3%cF b-cA/*HD>6>1B`-:d ƁeÑq0Vc_n\uf|!(|s7xR ך+UX0PJ(PBR&y4D{%!@ |Jƌ&2@E#̋4=H!< g?k6i> CShb]) ev ]uaх҄EXpr҄JHa }ͭ_@^s-S2~H?_q n9/#VtlE%DK`]~fF4i3`+ȸaXgCñ2N{iYK?C>P zހHZ1 =W`)HSoR FЊ $E"W>׆88IwʍŁ kqԄR RB ċ|!I T J awI('JHG(x'.fYrA9hnlv1tCم veǬ0KZ)+&.'9pєD^_^E/k—[o&|AΒ-@_-^=,1x֣bራZYz~C!ĉ퀆l$!f'\\wF,{ ja/$<JzLؘ1d P8PZ'K<A~N!ؓHN-8bc$kg[XlW1S^ K|iu[͏|[Pz={|J7RH!(!@gsiݣrvttgimP?CWJ $( D5i!5O&&Q\6rPAq ءń+؂=l|1lE ЈzRH"0E`,89FXHF@s^O'>>@:˄1&D \SgA jcKyw/^KY涺[[v Ф!§.4bxpp{GcS6ݣQٕan \dc0Rͧ0{Ŝ1D &\) !]4̄z% kT kC v-'B"\iVpuK<:.GϪyыNs&~/XR_>'^Ϭt+D#` =hEbB֨=8lC0!e}ёE`+< ʜ%d Fk=yB.Ӟ(1A%DQPhD>]'4l1_ϼiwV7 Duz"H.썫P_n4/z?_wBz >\VRRz5ng}NJEx-@+6ddug1R  &؍a#BDΙEQj2AHCx6a<+L.+>x,f&ѐ6ktą.i::J !@I7 Ma%J67J՟ B^yы>wŗE53 ^Qԗ5uBcACQ"Z x!J%E4b{@aؒ>AE1aG yӲPD1 63+6adz1=Ol up.D I ɘ/> >U1 E$cj֍ OllԎw^_~⭓WI粪;g+>ל WreH5J@AOM9>*vg]uDi40 zLc}7>3Z)2BMHadq\A<;حѓT4B g$󊰢DV̈́!5a9\UráJ-c׾v󝳳/z E1 zK.gV33x=!@-F$;@Q 2XOA%KCpH-=QtTA1BeQ:* ¥x(>x\@Y i8 ={N_'y'󦆽&s<.l$"x *@|~1 8NJn6B^zJ3G7VogVw۹UY,JB&O9n~ǣu2ie++]L65RHϏӝM"@jbADSΚG]ٔk8Ο䃣:ˡ4%U(kPЄFXߟYQn,F RmP lYvvBȋ^꯲!_S3sv#kĊD`)Z88 HDЦqKI9)zЃN4Q'[ЅaL3&<x*@1X` *y*.^0AcGLǚesg.Y3XGwKI v *=[R{LA=qH z"6w^_9~Ǎqx-P;3J:(V`B) &A;<*1<)v\|{裋'MfDH!vaQb203"Ѥ!t&v4ФU"'J9aHOCلQz:CQ)+]rREwjW4!q6iG RY4,WfEt *MV2673}yы~tK{ g3333!|F#@SkH,PDKЂCRXdfGT Jb 1ذ0eQAFw>!d< .˳8(P$L). 'бqƳa ^ b j fQ;JFP;@ᗣTЃ% 큭zb _{ы~g}G7.j ٽ@p^)ҝrTn\  BB`Bȧ 'O<>(mq;g=xrq޽2!$BXDMHņ&` GB C }:潶bc$s:`sN,l%'|K5 P:`LkIo }ap<qY8wԋ^?_kG?0|a_gk+ZV!&,7 ?猘1P8{G; + Yh+o#E(5"*((48wdكQ×ʵ('XT10 O=~o;ef?|}g_{<8ypr00&Z,VG!4&ERHļ?4$sD]R*;Ga7 ]aO•;ʪ;56W 'V7JW )4,B 9]26-PTi1UlBZlfU{Yz:EE/:n?f[9%ڈ#>Uhjf0[6 I4 /6\2؊>%OL|p @` 0{< >\ xy::0?KLx ѓb$$*YߡC<{ƅrg`Ec'} p!;̛~ы>w5ړ7^)oϥV'7­!NX ՘DPj!}`v_}7|;g{QץIM8Z & Ҥy(,yUh2TJW&PxmtRʕ\ d\+6"ӱM7upkZ*͕o5aA %e̟DAQإQV庥+:$#ˢS=G/z_yK ׌//;nBR_<# EPt 6Լf# &ШF%nZ??w-?]&`bQtA<[(0yPhR!&ų"B9<ʃ?ޣ?ј 6CK']"]9 ŕIK5(!5RJJG`WfNDf*î,6gS@b*x]ÕAs-Q8jH cPJHd eQJ)nҨ%OYY}Ews&?'~@ez[3 p~w> q C"JF ³&SfQ|{uP>߿8;Q؃vb`11؂qd)` `6($>dPS.3#`{`BI?Ӯ|gnB}pcY E/.WRw#}! _jnu_XU~h>p4pk(%QOjAhR aR2Rt.Sx{ǽ:& ]`㬐XU5 VAZ4E11t@g1[( >iQ"J*]w2,ZkBtSftXbq+,& 4R >P@-]F CHUMH9vkwqks Rȋ~;ox9uC}n|Ff4Hf}0jƝcЇE4'R%cA<8O5x߁|"A;@F|9duN"@hT  L2YD+ZЊ" `ﹼg{=#OiȸA^DR^/,KEߪ7Q^NV?>S _-w_kV-n ,[ %?튚q ʷ]NC묃(b-Hd8:,ྸ .؂e$hߡ ?eW9S#}#xXf=Rg".޺9wpK~`|ś{W޹qdsO:v6;ݍBXk+ЅP2@ ,jA(()vic7o.Bw:cv%I4ǙWH) Н4)J7cyow](C Gi#%Bxg[,5gMT9Iɚ&UbX{m6!@Y @0$DaEVSּ]!O.ݵN+/zKE}Ѯ%>ómw}W53fAF( e5c̎f3@`/×xM5 NQ@a @t }Kgag/.)ֆ"b$ࡸL{ "|@v%֝s `-r:" TC>| *8=ˠ8"@U˄ǟr ?#.|iֆX;ѱN&qedg\^W ;5W*Zy%|RjV i cZgBаLD Ԅ@[qıQ,2c<p~3}y_qO~|G8FnⰢXVgRD Υ^Y{?t->8t|fwg܆ P P(CRL[E# |%<(MLv..$$ڴao]{mrp֍WҊu@Ǯl]fP63BM((! !@y12qbFWJ4'e5NE9´maHa0V!?Ɏ4!T4,RS"HMB)KTs& '5qv^@-7P^N_2g7 9!x_GQb}P6UT5Me6*`+$Vwj> A Q*(``+|1x^d~:hE"ЊH"TLK $iP ^7I/*&ܡ;~γ.e;._՟_c{O<;Ђ334dP|o]_0X|N3>c9s?~_e}JOݹsmq/]8L+!@2(E )gRX5JB&X+͟(Hpf>d]iŬsQ \fϹasn( v\ 9 f* Cgeeʪ[rt*Bf\*%[]Z JJHДD"PJPQ¢jbw\% 鶑ʓRKOgMZ]'^0-\{ы~?09yq\UW7~*0(g-Vb0V0 `f?T2BIkj Zj2h"R.„0PAAQ@a 'ާi6h53 "VH";Tof MOȢM كoWȁ`?~k.G]?= 1X;}avX~@.\-kޝɝEy;^in}ݗ[5Xnu7•p>Su!@H `R$H lI(\ڏ.Js% :rgue9 YpڍgƳeV t@ 85;[ &'t"lR*@)q`tAdGZ avīL D`>iaPg YWZ+gG\F­XOE+Myы^`/.?ma!~/gxK'MN/( `7^l&R9T!8$$CRIKv`x08cG5F` `c)"NK,hhECz>4,0J4[a>,18! `{Gȇ?w_?=x1}W2J^wNוּ13G/~ٖ/VE8ѕkkp,A@7; )ʆ &\Ăgnݸ-n8y 3G !u݈1c(PHF2T!X+0gCRJͧf^yKmJ|_(JSJbaǘhB!HtCH)ʰͮu M9E/|xC oq75uM\W>ч 2RswJ;栤<BhByV)48@t ; t`/7ݺvp֭u8sZ8 G2fbFgc(5J P fEj11! yMWc!7CST ҐJX ()3fA` g%BGt:ivYadH'7xE/ TW/w!uGR?5b 3T UL3}{@;z00sXUt,IbOF 5nBSW1!h^y@aC-bVPH#h5[, Z'n@+ɞT"|/ ;.%q,A/ PO?3F=r~Ow\pAax`OYy^"oq~l_??窼CY,:խgZ]:^)IIo@`B !A@!%hbMCWn4 ,Jڄnط(彴K&49IGo,nf~Z't T݄1]a )Q]BRRgGbg;++R J 0&J 1& xVA !4eخ(!0$PxĎBI;vt,0⧮Ce0SgZ44HFNzjВ5cG=o~f5#Og?gicwtbő\%W&mڙԊ5yo>sʕ-WuY1@8YApPHO='ˬ19| 'nnO.޺kyW^;ÂĂ0cy7'@)UCHP21My*QR vCC)\/Fsf3y?BjH%YV!pʎg?,p;mVы^ /Q.w~׸*nWToQALr9^쨜pl$ WsL` 2P-؋j;e~f^< @@*3 LG|qxDÄ )k簳 C{ZA$ H/fgǠ uXL-g|ˏ<|:vo5ba!O>nш+џIY؉%8]؂\mτ7~׍rpKõZR^i[Nh[ᨔ @Jֺs,0;G7{R cZ.u.g\qʄ]hhX 6P}TJ" %`Κ % @̓ߡ+@G®41QF0iBrgteD0a1"joMŵ᤼RE/s/zYv7-y/ON_HݡJg?&pLobG1d` Ӵ, BT`b%윃˅;{=鍱Pވ90H&xPLЦb HbP*Lih%X*e?KѦ_{0۩=qu`4#{ڙ ;OeϿQ Y2|gUp1ɯp~{y?.uڃj~cVgg ךj ]H(Pb4 0`|]CQ|<ح5<ؽMxk-Xkb.5zm8Y*gB7t/UJJC}>e0@ ОA %0fLViAx;Hz洹X&uØg6&0P%G|Q1Pؔ8 bfbFZpѼ+7.\yE/sEuW+ |A\QofunWg=9ʄiбcƂ3[ Bijf% Fv.ӅsŽd~`D#u"E!@b)&tt(`ttOx,Cdz VC&[уK`+΃3G>#[zc?b`<+1X YgQә{$Qzo~OsYPZz;`fD +r'%a @(@0>jPJص"uQRް;Q9H7bf;+\KtG  ]WfAGWvC)ۄ Ϫ!-ۄfBG*Sd JW32 : ރ7NtaHO¢t4l:P*CǬ);+MڄYDX{(wƵ͕)EZ/~noԗzC^QWg_>`}LǎKIL"|ђ#A@Pq67ST+Ɗ+D 6X~R< 3s$"Tؓ/M`9h†%,T7ک _s(<\DӿӟU m_ #Xg*6E .{ƅ{l7.-/|+uGGg'NBz|.h4TBR*%OHwP E\aЃcXk赛];eQQ[ifA\ 6M}.0 ҧB(&QM伲@@ B ,P6%횃]ٍ dnkjF ) L(cLۉA-n`Wu0\{]Myp&t'~E/s ;\o_ #'#_`+`A֒B9PhIDHƙO?3<=?;#OӅ##c%(r`%D6fČ1Xiy.v`/( dH*<9| 0/nbcX֢}9iƅwt۝r39S6>UPA4yW85w3W^Y_tF8zGo斻 ore4 5.R y%@!O`wSBW.FA8xŒE=ZE rFZf ̕0A>ۥzӗ2~YhBT $ @ @!4^5 B?wvi9FIv&]|+" (Mؕ†EuCOnugjtᬹ7*\y+^?-/>9||IѿQJ;KS/j( P$9`I:" 1cdc@ q7Ԡ?p'lo/W?hJ" l+ D0,dGqTDD,H *1͜%Fc+.OE$ ˉl6Zϻ'molVue, qItTjC5؏;|N:cd[Y_y/-Iw{[vo*o+í*RJjߒH@ |?&|@!D}z3npZX2\PBG7v)8zڂk;vJuY>h?R:! 4@>Ej @iݐJ?o*fH4&4XtRCJ!څ+MƂfp' w^+O]p{/zѯO/`-%-9C-udf_+N 2Œ( sHD3d!YD4ž,x3> +s~{kx3Ό%hWT `- Bu19Nt :w!A5ǎ0T_PX ٲ G?ko7ϱNX%Vb%(Z6|v">Њӎ/jw=+y+׎,/GݢBЄf(Fyg|2n^Gz i/ @@P3O#HĄ r+d`A ACE 贁N @I4* I=dW@-%hI ,#@cy鑷w?kGl7;xN. : 5HQ}g;y&_mBȋ>znru6 ћ6_[݂n54]CBW hȌ3"B( %M"*87jUѭiBb3-˭R_TR͘@H %@8az(\]8KEU6]ZnQ6"R`HUURx[nh67E/>0Nw,׌/zM2nđH 0pIG b1 yo0 Tߓ@@؋9h1ZnX>tc [Cl׌ܲP + # 2( HL Ziqជ)o-o^Sj/V'ÝrTVa:;(t%.h eB;@G|P) !H;e(a .JJ*i7v+TVDr%D!R @wv0t]~*).VG'C`GsѤR!5 e!PwX][+\iv; ,69&Lv'yQ_ߐ_pf.zŶg 2mƿ-(@"cIYCҒM x;#OGO垏яy.gDh+zMKGKc)HzQD;i> ڄhDP3~='@'~ T?kBx @Q{S>r_Mo&&D9:'",X 2 QtUDP#5ƙz` bgދb}V';O^))4ҝ᨜LPNv0tCG(!<ðH) (28dkuz~?npxX`pŊؑV,I"jG!H TRm:5|#տ_yo~ѝ;WOnt>W^1 ])T(!X8 %wo@ ]i|!0TBQCPc`8(Uefy b(eJ~00T hEGJ FijUЄ4B1J!1Pѽ+g>lt&cnGb8)]j6jZ$iجafhg~A^%X/q;Grs ~~dNhA9Mj> =+0OZp *i  Sꏨw OdǼȏ?Xvn`rrEhъ6Dg-zh;i;7P+#HgTPA¯OA 0pZFtDp'r!\/XqOn?v[gs0;T``E{pHNfkg#7Sמܸs╜;dw-]fx]hR"4"4^AR(@)@G xvЄK:1J蘐C膎]v;.RʯS)^$Bb1!@Hsǘ(@ǂB!@LK(eW [Ϊc㠙8 F@a QBeqQ ͓bd*g+E^E_|Mf_f--l.%d84 ~&d`Aa 0A'x$aGgcO_}t͗\-W_'_n#X,à,v|պEnF%Ya4qiK`_O,I%x對!ʣ4$QBcqPz#>%,Ү,RwvG)kBғ4wv<8hxE/ /z -Ojj%YuRыB5%'k(8Ah8{gƙ_+oPy]1+wo93ַ\v3[߰\^.!YAAu;9NA^A!fvjeeGC0z{7> QX   LBq˺\V>n7?G<. Nԁeak:N"LXT e'v. ?ͭvX-t3_jn)o Wʕ``@JÄUbB4)BQtݘ1s]ͧbP܂](bBlB7 >mvCa| MD B !AH30PhRX13kWWOVH]s0ДDsԙM)%L+Ҕ&-IL$].1[ 4E8qb+\u6Kc zmLN_> @} W?;.bΜ<}dxwÕ\N›;4*#kĬsٕX8%bّ,XfcԌ;;:YgK &EM)> i8t|Fy8tR47\/#|zK2 i :hQ(TQJQT1n;yOJ.g;@/ӗnx{w^;9Zn>ʍf :t14ӚDhBwP20ؕg,ŽOS@ 0Ą ]9tC7j1!lsT$UJBPR@FTJ(!QJY `^(5GaWo\O\'a 7>x~dGYl8[`fTYV,4CQiX&6:Q+DxH/zџ]/D-s7lGY<31}KF %¯W q^l9;O?> Nj>ڍ+_8Fyxc_`!U"$MJi9QČCy~sŘpPü5-PsM!t a?>Ǜn(|~tB8y"9}!h*?9!l>_sER`խ(<9\.^]X+24GCiPq#=B牌B£2N`qy4!p6LY@^+xJ'rb[ial؋ !&|L89Aק PAؒPÅ<=Áo$Ra7NhX Mȉ@H$J !icɔRIIWŵBӐtUYHY"E44aGX^"cF; 8VB lRIOh 5ˮ^tˇc=1~ [q$*U. Y-hA&t@ÂWbЊ<;.%p'7?G]gFc[j#'ܲi+k#*ɕ@U dcBG>7$#03G]9P lNOy;s~MkDkÂ` DEZQ(1ؓ ZA#OoX|sū?E?֕U˭xе)kB ) eBXR\h@JBLf])e.®LQhB 2 ]P '59 3ׁ9H _ P E| ȨTHͮ9 D 2@7V;Nx%=($|t⧞,^y]\rHQâjeQzEB=JT (l6ɣpkãWOR+]땜Nx-kVY\LFC&kɒ` Z?%XG0!{p)9xZyx6;7Fkӳ-[źH.p8@,6!D. AMKE+VynZ?*f$= r;zD.v?Zɍ^;y#1|aq9>p% i gthvfУaH"B C)H,Kfց`I}b( LxV泟Հ-#P`$g*$BT0&,! f&0 B)$B Ph!Ě.=Zlnd-ʵ'Pn[8UG@$R"Ba$6) O@Y 李Ë^z]ѝqxc->Wo?µkeapj,WɄ˴_g\p1x1xj;O-{ү 1mor8\5+7'Mع 3 >*˭#B_ߜڏc XhG$;׌ jf Ḧ)0"rzAPAGI9stOę#[<=^U;^Nk?pZxŝ 5GaE=kW MǮۄfxԤ1.]J@Ԅ>crBJLOJФ`^3q a7;+MR>UD@D HHQfBS!'ڕD  @ %@RM`X&ЄE 6'OR k դkҕ=7Ԣ PB(&y`w1jBYם}}^EDA2ޒ'g*"ㄌ<$ >,t .3O{ :uo8oia#պrZcpwūNUqS,;ٱQ;a'/N !A1fc_~? $ ؈"(FdA 4$2B(Q* 5R0i#(2g"h }'X.X>;O;{ѯO3oX8x|!,>N8N@(Â]3 ҃^( ]ICۭV%2PʦL(+>"6b ir>OUմ]"b mQB"UD҈#vm"_OvJBI! U MjHCX-H%lVOR8TŵʣIW  a (]x2 bs4ݣtw^yQg}9>~nXi KC<|:= 0`|2Ϧ bq>x}p.Ѓv ,xbeZ]q\ZX8uwG+ip]g[NP31vZ',Wj7@?ғߐ`BC }O "*"p,OS@#࡞m'\$颾X,®9I]hlM*Ga坪qksukXb5 fh"PעI4e38(ݓ͘Vv\mߞyы^E~&,U;RoxMީf"ĬpHZpL2Y*gЃi #ɀ9W RAn:cv 6<Ƭhq=&9BWBR:`ЄlmO`{MѽVu+@s5b'ʘo aM093/ 8,͓o˂E/rϴ+>'?#_ZIʚdfCrj F@ z0u T ̱A  <O/'<̹ydG F`f-uWű8׃#Wwk-ѱ]8_~/kh v7oU/d2(` AE!:ͣXVT<0DR31GzYzą~ jy#k+W|nW|փj&԰<{ýg_랰\bYys)e0,Ϻ7RD5T Q)aq0Ѣ4)1l]W>k'z`3k@ 0!QDULL,[l C eʐRC`a` Jb11 ሰ8I8JBik夻 WυWAEjqt+hH1= )$H% {63z> P>8藠{o׌QhzWjA.1*VTЊD`PA *bF@`+v\'i@Xv%ypӆuOlH^2D4V}`"T,4 O]Bh£ PMمĎE)) E:8L,) ^JOYd5jCb`.B ,ȓxEQ8" m\5 JBZfQ01t#Fu%*AE P 311R6aĐʧ#1Ӻ[P.R`]*eAb(%ɉu1g YDL ͮ (},L6VJ'`aH0HHC4!&*ŝ^`3HY-藤k/b'u8;HQ'2ER(:v(Z0PA:B A$F/$0 *}9pg< ; ZnLhȚ Nrz:A D1:Kwt.R =o"TPTq8UЋxn 3sa` y ӌ bsA(2 ;u,_xѯR?ux%١pe\9؜5;.ExP vOv](O6_y7>ڥʃ!mͣ;wª{\[‡c10(bJJ( ]O0fθ3<*I;{4 H"*K!u9Q`">V0E aHePyxMHDV ͵r;X5{7p+p0hJ |% B e | ͓F tWxы~A-.^[p\+nĸ#81-*D!بCRI$L3d^&0DOQPl85;6dY2,`-:si +#qKb?`͂ymS0,YVE BMlSM9bw 6]IaQRiUh‚G͕` 0EEHФaUQڑB"J(>.nUIg]9,ck.>H.=*]sΞw?hJJҡ ]WЙO TnGv| Е'!af؄XvW~iaHC'<ţ!@ W{a(J`jbު aVRi5Ŧ\ DSJ3&2gHԳP(JJv|TFx`nAzk{EF-zOmw'zymĉ@:pHD0-@ Zy HB!D0eBeB t*(IOiKp66A5h`C̸b)Xqsr'X^V<؊Ӗb s+Wӛ* MQTЋ-b/gV.PXQ@5}ER6-43()`¸a# ~Ƈwˋ~+NV+88HG" 0|TxT>Jғ(]l<͍+a:f£ \ Ű6Y5^TPC1bHPEWvP<QwV aB| ÓnXl+,vO2VWoJXl҆tvPBZH @M)fV 1t /:ڭ~,4t V҄1} R s< 𨼙h ¦|i/z/݋^qFTۈAA`B#Eg[V0.D'`I $vjF5FQ"3[ӅHkDŽ` *bHsWQyD hFOT`O;((iA+ @0V*@?G"~*LK#0:7` q #"14((FRB- >DG^,yW^dJrVRWeB)]Jouw6v;v OVµiv1yފP(Qe( E0 <®{ G{elXkN3?2\۔4'eۤͪٔ[nh&h.N `[m . $JH.S)i(e؅E"pD 0M9!9:bHHͷ':sGJZEH2vɋ^Xlg&#X. )b(*Z@UUdY`Ek(Mٗy9KcK.A *N9 HpuE+" ÁQ}{#>PtYN/ $=Ѩ6!$|텏 ЋJ.\A>9P H@G"A4(,5`>h<*@x_xIyQ磾psD6 DQd9KR(3&dJPVFUh#1;6X胑4@ V d)ja~/>"PDI4bE@|<@ @c/vtDȢJ*GF2e>e>jւ$E {Ё0T(H3*p=*0 !B^oG+;~||藥ZhVCCӥp-`6à t+6Xcֱ`cv.1tt@V*.h`Py<_(V{>*v 'e.{)]uaUa9[P^QSCinuqvMj.b a.LT|]i E l_b"u)R k@X4+xavqQ6^ /\ظ'FhzÅ6rmiBAG&:u#چF,gl~GpF.Qlި* -1iDޡBƴbڧ@ы ʴBLHcF>s ^%6D #'bgp! ?WH}-XYN W7ԙ/V~sͿ"zKCaѤr J3\Ke >Vlؘ˚ғhbJݰRt߰P,@Il:?YyTA``؜=poN8]EҢpگKݣ2,n棰$9Ke uiEwpv01 e4ݎJ"n`@ n.5bE/ZH/ WԅcOA,gԉX; `B(,hɎ6X}${Њ=8t2`fX0,>U@`@ǕK#:p8qnǃſ꽋b 7^9;24WjC ),`:ips0$--1`If(ݦPʦJ]2PR:[uAk#)ξvq& Op`wy% *C:jB6mگZ}R}PR%9};ݕdf@ &Kl a鬛(,.201Ur[ɄXB&*mFiVC(4  ,JL >Q[Cnu4 #֋yљזD: eHd-R@A jg+ƎAu{'q:qЉ 9$}C!e':hD J&cG0 y@(d\/# `$ d,h7N>@Mi[5 dp@05lI@}€"Iv - q5@&x/}C?@X]8{k<'7[ejH(t[#?EacEՍJ,B.p2 ; 5efJ,B#|\ lq1M*nse |p9=9`6Y8_Pf@JeEYҢ9. ꢄ[mn==аܲ+0K0aD$a8#Rxk.tL Or֕6ݦV׿xw?Q6κ.Y- R'aANv98xԅ.5\x|5bHTf`[%&pM= bgJMaETJH̬@LPDa@!%ʊkϯ}.+ы^=Լ/+x͸a9ɲЮXqd)X7DPED}Z @jX$m>m$ g';U("y W2) ~na [1ygl;ֹtft@=_r5y/ v\c cKCIT8 oo` L?Ysl{™Xaùy^tvmtFq'5^ ' B< =t\ Onm_ғ!xڵ[yu5W;Go#ªn(a $|>(;Ax?7ʣvlh"5aqrbq8Z"RN]~ QtO'fw٢EhJW(%%YN>Z.;zrٗuM&8 4 f4*x )3 M(C @̣PJ ϟB a @x" QA}ÙS;#Y`L9_;٨2!k >Q0@!($„Q\&>AdBIcT"OW~C/ P@}2`$Y b7|fP($1|Xg}v='~?y;>wrZS,^95⨹6\ GYٕI7rox"|bihN^qpru\;x'wW#Vtݮ+]#@񄏯AW>(gvÃ9-ДfuX-V&x4Hĕ r{ݻY@iBȮtetB Rw)]u Ov.욐6 ga.BSBbOJG#i(0!@(PB!̘}2.B^I gc~KEyEaYW3q3cZ9N(O2hϖ&U!(,!942^ZXKPbTPK6A YB@-A>$me,gL~oH@pyvAЂQ AkVEXD|K ӹO{0cG.,'rcy৸H{?O^}uEsvo>jur--J3ʰ2 OfW~#x>wV'n|qt-\+khhV%B=C єFg|#<)-m.=z6ĆOivBsRjVa, S{t`,Q6.l6t4B oӕoGW.6G;_x`  e5,JS*nQ4PBX/RyłDjϖcB)׃gx`dAό%G3\yы2ȋN~$k|FCd4d"@ |U1@ij! X@\=EqP !/Μ}F,dԴ "1K+5( DѨuǟSg#. &8B/FP@%`Eg8Y;4zB~^3־|TP~Fg9ęΗC/z :J'ŕNnqWMs H!0 F p1,&>d rZJVF:W_Gza=D?S0pƉ}LbŘpb)"iXcDQԧ0@bz@b@w>xNH\xƒ}_{t9h.^[ U8nVJؕGQAi,bY,•[{muXuFze'hJX)4Mߖ[q)h㕏ʣ'm:Q}jڂ0}8HGGך Bj 4 񩆿T9Ὃo~7paK+R"!,c3 ݵɃ[gמr'9;)blբa52Ґ`](¼YDДB j!!5Еp2;t<|nGIE^zy?B] ^ѯP5ՁPE&0 x~}13c#hAؘ bӳ%]OEb`)6Kc ` By(4f$Q3>2}!F52c37'bB%9^$ 0ӊHA1 0b$Q39 PA%LD=G /k9r kjx%]+7%QҮe>C2"N]+utyͩ[W:Ҭ)0s !`'8)?Ѽ6 b7l./>tէvr88rt9Y]Y\K 0=4#(A@alxN{џܻ}} @jV!@" ѓԭOzIX*'g R9B* (M"&00$J B(Ӡy0#l >L8#YY>$:> y"xED }/bЂi;Bw۪4-Y@rH$ܚTuT0b#؋6=PީTgtr;B,DRF00m9-nX"XЈDR __CMxd#g800EO`A$Ȣ!qdx! $ 泾6'@b$ `ݬynYrqڍrcx`ܺbyl2an5jfsVךJ̚5, g<<ǙiUκGʕ ,FŠVP4?_1mrFΓl>.}wmZZ,rZ/ڃWG$ *-XuG) s6 >"0O#&RIx3.%L dCyvჲg+5> tfHi+ѵw^jyљohG}XqVzATQ"> P@`(2h,c*0Pt gt|,(`BS;IPQT9 ^9W@9p$V (,d.?~p{'Y 9δ#=X@NxACdP#uLP)" @aZ!Ϣs. !h滰1lȘِ<]h?xѽkWnux$PNr.\PB)2tbF:ex]鶚4;|S4Wz("B 4%AY>pY2 aQďh5|NfD8Y\;\I+=_oQy'W<9{ddht a! !MXՃ40:zX=:9;xr5=ulVBV슃'G4eխv! )4 }b2:B(MY}Hy@0R<c> ЕwBaf^AZxW)Bx!ҥa]@^+Ⱦe_kJ55  5<ˆd(@ 3a (b,6 '<""NAu` QA4|"hV: #H4´_w~;[rKm\@}xӏg=?G޿?2h$P;aebИJRM(͕<x֯Ni>Ggٕ'.nto]|@"ULt),11rgK&B01*V9|N a$M3"|-t<,'yG<}}.zzxl,~N.(Z#qFf\DϗuF@T2A}D%2X@ψ>ij:Bt\}vaቯ:>s^3ka1J`+CۜkZZ4'C*]+oruSŝJwt,CI!!9OjBR]]yҽpk=(W&A::Jٳ;9dq#ent]H[V'BY"+g|{y٦f@N iuhudfsV逜U WSfh9]yr3n~$V]Y 2t+v!Rz R)R0#9g!>G!o8 HOx7a ?4a‹ߗ~bhB^zM \4~본/z}yExCo'Fcܐ )tT @3(B}dBw+|qO\g.A]X\uFb%^O]`,`  B@8ހ9L/1UoK#-2[ٹox_Xy8:7јr%ऻÕE 'RQZPNvotEp N^ QCVC*K5J( .jJL0PB8cÃPjK%ۜ=)M)A"q沫kWN^[XXjsU8jҬ T(ٵ}8KOᏅlx1ӷl88uB JivaН|m]y`ݹ.hs0ptv,aER0D 4󼚞E 00cE PŽ'Q9.m, .m8]]^ / W+yC>D0PcolxH=1vFC' @\_T '"c.A \@(2.>P@f  Da+f mb 8VN^p&fw|  =mic&,̾6OޑZYT@sIo=0y$P=Y  h'֏\6G.ŋ\2'n \ G)p4GKCӧ ᜃB"Hvp#*Y#i1PBA .Ԇ%s5GpA6Qw֝al-sUsɵkGo\%n-nY\ _r' GcH@O!K'KVOB4]8-<)aǣE8'pgB3w=׀&Bi<4 J!$x)0K]WxsgÄ{1 _a@(E= /zo#wxM^QWqXk0 2yz`q~عܳ?F{;7 , @L 3,iGKЂy 1 Pm5guI lDA1 {`/.QtTQ0@$3vAbq~"mÅ{oؾ?W7{#vt=w,QZY}.Yt~pmw.=Z't ۬-n5,f6DJ] ԱH =)5$Yc:,(!1bQ(=I;RʰR*%$fR!< 3#74͂@^W+p6L36˙yz@*'jA=Xn.L?36 l @^!DӪ>LL_Am!@b>s'EкH̬Ug:XY{|d)7 ၧz>c 82Y8V,DÉKI Vd`$\C5eY $ $FPfc$0|_ԅG֯hg_ŋv?y-ga5r2ݕYb T4aK%.W斯3HGQ؅B jkahY(7%^yLH]'<]]YOORS i])e @I9A!%AYA{l;aŽL\_ V4JX!\ 6᥄3Gg/zoHkQtԅ~G˙1<ыHS;5fG EO?fs̼\ޱ?`0vjwD'U TXVlo D X3.! 3XSwуVHХŰ$ eWNoBIjZi6ȋ^[ /zlEyG%yE7^B_vv<s}鈝H20 9X퉧'FRA$aچePAvxh3WO=['pE]7^;6XY$9 +{4e4$(21 EHU"~6KP\ATv3_05 J(a(1a`,XECJo'h^YJ7 910(@n*p>((?XÂ6Y-\s9:LhN¬Ÿ9xНf1 k6ݛ_> АB nsv^uc,@{Ep OF/6x{r6;<&g;_<ٞ35>puYWA >lX8p ; 0>ҟd "?"Fe`eg9pˁ+s6֍HAG@~3c`23:+ABpڨ ޹<sY7?ޣOiHAi`jd[1bDpSēm%0IA` Zq^hļA`$F Z'}GxpXۋukgͰI']YU M"ЉRCaX!Pl\ %aBQ)Eر:n4OvB*sĠ:bwGJʵ^h8Z I㬃9Z$Rs P0M: _+ t'-n8JP+'),NB aѐVS5;®4tM(]jOhX3(*,RLK!}"i)-£c(Ԕb(tlH M3?]$  %,.ŏ #V&8k7ʢ[&|Φ8k.  qGPW,`=[3_w>|ldCVj Q@[~鉏g><#}mL@ucPE,Ta:syowG =AQ ( j4tF<;ewv@'߬s(,ł6Aa:A+w2A s #^0%2 ˁ! Ո#n @G@2XHFI+Dx^@Qsz g@pDhbP5aqϾ{#o.ă?.^t[aڼ.U9aA8I@+2hEE *" bHi0"EBn"EGIB ?U JeI .y5V\Iq^L+斻5f=EOWZp/=).[]lˮ\+W4ljֹmpsTGi*1T ]*rQ HYpe˯ a55!B}2& Üe %\ 5g٬tvuros-R?$8*(teS;~ _ /e'NWÑ880c`pfw>n|3?wÙIufBH}wΏ<<~>»'6P"FD:ۄ\{{}ֳG#H<0;<(D2 HDAq0sw61%>)FL/!Df'ucz`ND=?P?G}73Vfxzb=n"78H:2񬎣`$d1 {2b^[DZɱ3ډMafA,r#~E]7NnٵE ]TsPJ( BD))E H RE 1竆PPr^J>~& v$ҰZ66^V$UMم' <)qoOW]V'ڕ;+eڟ OU2.m9MJa۬)d혵!}dz3nB8&@!P/ 08J}OX}jDz('AZE1\ C)yы~E;kZ2n%'p^ Ѓt\v;O19jT4h+O;N@q%p~e?Ù^3Q,>{qXh؂j?߳=y|H5OOQWzta]B; ,8vj Ydxfo֮WŮRfd`D'|8cߓ'ǛyR)i4ae[9VAfdДPfFd%@bi>e ͏ȝAhңi&N61[P!'| 1sރ|yolI+I q {gSS[ r-nNlBK{̇G~t?3.s81.}^{p~r~=7rŎ FHb%^"hA Z.,'|BpAkРA"?  | X(@0&=A@v#mf@87@`+46(BΥQaeOSc$2CqĠ̬A`)B{{O#_=mxwnF:vtQᕴ*QG: @C %3A ITQF aPQ61-h̸ͧK߄rK9J8 WHFIZp'|*+ $½tAི&'2psGUI''+\uraf_խH[X\4 R B*2"VifD,Ϛ.>)i<,v*RJ B"1F 1&Bv,(\Uei9wr܊Ma8*JÕ! ;VᬄQs mοy{wpC-pK$yX$blp)ΈF0-x(zpXY9,dbm?1vv.?9s. ~ZSw>t1ȠJ4r%v,AKglp}w?ӄ/儏WBճ^.I`X{Y! XyhˠM;rE"veHw{ȋ^ώGG7kXp-tMH!!bDâKAhi1a+R(I= .,K0 -7J8Jo̥E _:xP(a VBмVz7^knxm  ;ˬH Ͻ](bws !RXV Rƴ}G3(ɉ>4!yrF9,R-O+\Igt42Zw38Ah6V "==Z1[uiV!-3bӳdOxnefE:ʄaBBz1c/Q 3R7\&võ$Y#KO0lʓQJӝ/m hf; qy*Au *8"كsЧ_2ϖ\%Z(2|yw!8YBH&ygꁁo6~·ΥȤ@52)tBE1@,FЦs,B.&pE Ed" uNTuHԧT  ql#3./#q?{;9hw/7lkܑ+F Ș?ӄTcH= #n:&|tXqUα&d[p=o>py…=.^ݵy ppcuP=\ %DꚐRzXH@! T?/ebЕ+̘eDJ bΆ!t)xT廩~p+ Y•p^K;镣W3bvw`s{Eg\%ՌIrDX,VEM9f>ِ9jbLPruO}_=დE9XijfrcJ(5 ef?T$D RF % e0`E2$BP3.0B(6W p{i41N"ylx\KokJ07X<."ffEJ !90 '|sh3CM?$jzfD̹E(5%P&2єt'@Ya2'\@y/nCw?-뇜^w%>N Qd0AñX3L<_l >AXq?V q1 ܽ=uϹ?'>>“}]y#] ' MsUwU*nq")#hBECʮa(e`D)t] b`kR(1M PӺNp H"eR(])a:+Z^I8hN dU \e ajRN&4MwnML)RykƦ Y@!|qhڄ@ Oؔv.̌'(7+V9*hl(]lʆG)nX/j^[eY{K]f+uG "j<`I:dx 2J7'bp\:ɺR  |TV(ʱMm8\fVp\hU{{3oŋn6\98 *&@:)VI $!B3ʎ2*Jٕ& Cg L8#.&x ߒO|SKBۿZpD(+p5Rz^(M7MD6sٕ1!"id&4Ϫ/1-3 ٭&֠d?O{H @|8++iWRSZ9|tăt0<(] /j^ۦ:qX^D/ZL(\\l- SrզcBȁÑua8>k Ѱ vd˼Z,4r=%T_Q[/8㩨`OFPd7jeۉleamdgm,A ,K0D!co|@+b,3#XB` NϚ<>2:yzozͿky?x;.@B;uL b f=Ab$sH y}:=:ԟ%KycG97ċl:[ ݝtٍ٬pXU*&Ղ@X٢bABG fGل*%et#J(%RRA,0@ Cѻ|;@GW0;d>i2]g*pUf26On &B"g31`5ÂUYu>|Jx(M<NC!&sy̐ừCXЕ 7J(VHefpPNx>(̈́(yEUz=Я|X p\8wyݜūSrx}i? _ӒxY'HTwDST$yj{p.1=TϟegrH`mV<A!-I Qs1FА( !T  a/'jcw~W'n{˟] 3%iXkh:PRc%:A< q58L9<~m;S|x7?E:A2WH$HMy $Bf#JhRE30 QE u#LA!Q ( 7ZBIӞ|շ9ĴX"P+ @h؅#RXp#jƫtT;B4M8u @ RVMibtg<,Jz)PlH>/+! ;eM|>-;Ͱx4cݔ3vktimEzZ p:ەT1$Ђc89^p;7 G|~ʫ+mcM(2XVtoSKb& Wވ>D4#}'JK#xhdRE$٘[:0kJ #ID!Dq]쁠'@_}GjE TPH HM,7zg_;W׷apynwry1^W8QFp 8Kp ڠስhTJ@ ;`> @ʤ~L/SQ@|k۳$Ӄt39"1o(4ОC!ԴYĄjyYnHm.u확!&r cFtMM vfؕ>g7bug+Wf|PB@~ OX*\ (tPkGF(< ,|c(G/ 葼wb6lNԑN0P8$`LPВ*d Kr~ȏ[7ga!sc*=HDr'R]qKD9HKw*e:+<*A [+ u<˄`-3$$6I@PA`įvUnJ (Q  Г "P#H𵯜O<$ꊿ;[_{5uH $ c '(2ɍ`>Iv"X;YAi(=R\l;bߤ_@^t"-pZ)u!bѤ䳸EhtD RؕRLP+UDnT(@ ЅB |;ķ)|u"a5Ǟg:껨 w&hUZDts+9bviv1!cs>Ѕ}Ȯ"&0ЃyO) &uK(!@|]2PVnpAx&ۜ ҽݐEmzmwH? D[gm$86g@rL.|r^x}xuڸ^*V;KKOl׍UuJWb+7d$UdT\lXsd#8N9hu%@ Ui@a':*@w@`{wD=${WlWT~f%㚧Ϲ|?^1^1P'l2?C \ bd1DYqw RhŴQ~ә|9ދlJ ,\K)#p- í@J!2Ja J JGt!)2 @(PDH]Q1oi_}WByniLy7(xHׇiEg(bWqV)66lz "e(CaBP+b̋R)%<C!bZ).Y!,3Jo#BV3ӑGҎ^V +/mQMij6t >ү t$yjx}`ƾ\ 7'"ZH\/d?8jqhV~"7bMh,+yBwB +9+:w3oWFA A Fh4d5AClhXjTq dE s@a NH\QPXf-~B҃F&W^QX\E!(~Ee } $֩aCR(j T@؎'G.Q7=::x6sq!A:+ WJT Ъ!tTAB*#*PB+ ]aQPJ 'ˇừ(@21PB7%B\+ +(yg!.u\]9TuNTWAv9^6dy?k1Qi~`B 8 }bBYY 5l C B|z` Qv;J(W800.\<->zo^2 /#2k*RW\ᚎ$QZ$pŁۅە|XY&e{&CҋCcp ^%{R7^XW$b1*Q]AD,SG #-xdd0`Isr :d QHQTN z0A : I'}8-5n+/pb|Iok@c׃N`fB,HH@A+NYT؋=ySg~|`|Ç{^'Ox_LGMâ9I(ҵ WEO*?J0-! Ub9Rn[!$%@D'hP t aUq~2RmE %2MS9Ǥ49X'9G &lq'ͦGfEy2 l)VWa'~66gYanb 1q PR(RBdJ @Bz!2$<x]ԋ~k /u ׬ yb&r;N0MiᲳ$d ZP^86Ձs ^Ke!@׍%`2qpV^X(O',5C6Ďw{ ^-!kfwn\Y&B;@` ($d`Z zT+.FUqA:dڰ*Fg+" "AtZcYD0~y1|w`i*zE$aVX "AAZI+CjE첞DtU ]..""R"7Ѕf% 2Ico3|ަLj>wH)hJPҌavg X,bd@^H'$FR7B~F#@⸰$%Z84T0n3"9 %85j>[j.ih-*ObmNbl%2!cF86krL]ENɲPŒTBc$=yI35m:#f'^Q3pP4Wʪ%̆ܨO65m B(0C(@Hf<#*B{VN1] ~XfL)*T @y*!`άV!VM{+uM)tvgIƓ"c"]^Fp(Y݄ǐ t*C+3LR<b$B @H@( |aڽaxRtyo^E. ˑpb;o[ >тJђCcqZ9rrH"7c#7qXuwzTEBb +[BJ,MuH^Ցn9q X}iqgBpH  @ p#g=m:0#fXF1hŊ׀ ,ϳ[sNÄlgr|= !藣ppXa+nō4@"0g0c %4ЬZ!AAV" 2L(1헠_"xa'Ӟ^G(4iH˄fhJBs$=IB.5\>},t0EQL4PB(5cv]ag~BЅ aQJ<| W>ƃ^½3@^4l ԁ#hk@Ckc ĄY%@PE@kc6tjD0?\hQJN 1{ы%2Q̌c 73srl\hmf@[ s@H;~P;Rv"BB(| ~y*>30g9盒::6\n9!v̇!.b``3I Ow)jPJWdzj݈#,Cl)YBإ.lR`hqQv+(O{<< @^t榱78 ѩdP% @ *Y]C$k˺2UX8-*ؓ5vb@vTDGbAC !&,seY#QE-"H⓬&P(|  $PAd;+Q@@w\q|(&D^5֠I{ F"pD+kpбYDL+Aa)h_ԉoxz{W;~τqBJ:*=B`MH!AZbBD! #PݰJ CK  PxY,, en+c.~B.ts> ۴>-OW!51ǁfTJJԌga t#;:|c+ 7ߥJwi)?V.{2|e'3~Ez=^S+-+jT℅| hs*s,C'*fVB&(44e5"@bjI dfl̺KN߸Z-6v(2 r?0Ut״@~ˆ`@g @o{ʙH&1fF+Ys%j PAB̀Tr*$ fAD*x> _SX>+{/_k%XZ:jB9 'J[:} !20 q!4jJaİ;b('Y:UW!~I1@Q&!*RG ]ؔnpB ;.ob-AHY=JjVi"TB( +ײB*C v!K)PJ>6wCW6w>wZ< g/m ꚽ׌WN] /DLk($Է_•$1iĞbv zPTD Zb ]N30Dbm@*N(d2Hjz,Ϧ=(,@:A"bg=+`PTP߲ l1JNӯk,Mq ֤ ۄшd䄐 cqxA;;=kq1.{ƯEr$JZ S_#ynMsi2e^;십l0.vO' BITYP1mH!@(yBW NW'xl„P _E ias0K 0af?9ʌ P)ψO60sY64<to9"6rg@^, O_#/*h (|G i(dV<@PE5} vxމ`t$FUB30;fRD}({g. &LNuЂh\V2ك,b[$&4Fы}pdie dŎKv<>wx<40ε׎]ẅ́[݃p/ t} 08!4JÐX@#RY {E Teu CG *J9*AP0φ.iՅRJ (j )&C8NY,&2P5UM0 (l{aX]QV M(@H9L3 ]v ]I<*kOO^H E -9g}E ;4v"a!H$Q@ h@no_E#JVsPiTqHXSb W3!G nD1:ܩFDIFH_|@}aPE 4_~ @PT\6X #NN 4"ًHѾ HةFaG{qDa 0Hlby'6q|d{ys߰xѯF->Je1槆[|- He |O %tJ 4ig|9;u,ԥ0v4.nuARtRJ(#D !R0q0P5JǠB Ԯ >i69iViBYaE`,f(3 D MP5TP^]҆. a!-J)9\>1tAh//x_*<=>O$z'W@ 1  QW|۸ zP?Y(Ğ+B`E.w7"X H ԷUҨ``؂ I`OKSSU(dѱد3o kx +KrLn 8%AKZDђ*gY8 >Ղ X<04\? ~ٿEQW<჋[*J m@*B P 渪<*;.5|W`wȓ $t$ݓ7(P?'5 EP!D%:RuffĎAe>W|o8H)U 9"Hjw݈ͨn UT 1 ,&a34!+E"&I9Fz0 a{4Yp /KE5ko5B{>4V$ 49˳Ŗ! @ "D5u\BQ؋녇Bow(}DbL0f?>ݩj:`'@BVc NuW\+*ЂD[` :9A #A* }#=G;_i ɏ9=Pp,b m1 ~/6.+?q&mx0gͣI9G(@b !M(н6^ypnsvuM'x0,"kRJ!"AT! TQB] QNJ|7J)x B ų8% @)vjf>Q!A5)R#i@$!RJbHŠfՅ./z_:=N?޳"a%W!G@V@ U!O-vCK C "Y8'Qj тy]^7sWWɹ<Ӏ EDɀEu*BG/w$CR ' A5: BCI9n@ y]1A @':E ig||v{%M?ŝ{H0b-\Əiy5\nQQ 3U=yl#2issq?ǿ?v{]0:pg'.wrD:73mbu|Ŵ,|[o+|~ă=[a;'L冇ͼU4"1]`kZn@pXd$\/Af}o|7o__y=}҄je$@H@^Mx쩰$\䩝~]*09FBj&=S^k#P!$AdN@讫cF2^Z1,1 0 K"' ʲ&0%,"R! taYBUqJ$KtL!<5 ^4;M -o3rCKȆ!v$0bU DyũHϓ ǙdFHYSdsPRL#5e@F0A"[ |u(Ȅkn0q= QFm @ >@z&7)A)T 1$d+dD:L(:-(VH@BPɌ18Z3̶lr=͔y۟;zh5=V$Y<(Nfj9).9sp܈ʽ@`F5}r1/bF#3a pxE>&hrKόxv>oZT^9ّczv,>iJ.r 0S׭m{6+ѕj 6v=\)fg%oؕ~C@DG ܼH )H٥q*B"*˼qt"*iue"CXHP"&eڒ_)4],4͘LA[ cf<%`~U*q×@Hd6Z!:sg#K!w٩^2AID)_"@$YZKD':%pC@@7׼a=A5ƠtV Hzge)`-$j5k|==|q,@SIH W Jzyjn͕sCu4?\j?VN "MYZ~nz|$H4t@!" D4"$]@$`D!;uP% Z(bP/k0,˨(嵸IJKcPiHM EF 9D#t@E*R{i';NtT-ܞ{oPa\9P; PHUL$Z `A41WJ JR уl2` TM@Ge|zM# &ʊYdPֈ҉Bg@:>*X AI .`Pd2\+NAIw ^,0;0WN :Z&I&-i8tz';SQq~t7gw?×;qw>K#cRq*Y+HLN6lX,LG ȁ&6(hhəFGS@%)+*$'G'#._ӯFنӻSx~I9Cx)x\J,Żҥ+..i) jU0*Hii4t#o!@H!@ DN:D#F>!F ĈE>T*HȐ P\zBUt)XVBRGAgQPpЭ*\`l ; ݬ[UQ&0 Sަ'P_ ^ݼ5"PNedIQ+ eʂN4D)O*35(HBHoz @\_F*d'SK|5 k8TQ(AMJbL ;04JI P& ^3*xbzzcN$59$Phlss[ ǸOWe__TqTܡ%H%f$1A+  Ȋ5yD_w-~wɈ (D^ۗ$oJ@_~鉸շų#@|N@M+mqssݹg^83)عV:AUrp3:6965t} H4)d D"uI (k!Q,견j)4G)PR\. 2("n)j.U !P/)@"ЅPOX g+=fńV@n .F+9aO\?DR^@&D|Eۑ^K!d6$R]\Ed\Ia*dRCى IG@5Ox$$`Ѽe dGLIDGa@T@D$Ib( HIQғR䐌26SQ :PPD!րD"AtZ0Ѩ3ccdchEPam)l8'i['d>INuu$ˤu}g3/ٔRج9NʎGAnP0bF"%$3|SqX#PVBT Dog~mT8[] !$&l3v+jf;g&0jf+M7 ][ZH˞|ͬZ!~7WG ] 0_&u22\.Y㑤WQT`%Tjŀ/.]%:2C*Rӓ@b^#Bfř nH0K;I[i¤t+uyR}!XaMXWR(d?"S"N&;mh].'BҊȂ`XBѦ.I$IKz@L򊹗e*XhA Ƞx@ H$ 2>%kI$;8* 0$l [qdDeȤ4zg蔠v VJ V^A,PQ$$3'1Q(*N$=3yg<:/8\;c_O~>O?.r᧓?6@nӍ:ߚ%_G|GOx ^TB4zD8 $@ (t%ܓ{$ eay $=NB$xY:p4|xƏ?{;>x!;Z٩B |Wx{<=՝;29<ʧ&* Tll 6QTBb@%B,s: D ]Ht @EcQ6 FEׯ(# K#DAt]Z%*BFK͇4Lpԅ\zJ)36/r[~0#=(H oۖ!$ hʪ֬&99V !BE'QQex_y#@&)N΀B˘N)T4?8*fwxs#P(o8 JXUFK8jtLI6ZgD$1E$Q0dHJ0cNJ\GP@Ǫ3%s'ے1SQERl8TvϩV/9)3oxJ}Uxo'X_N IBz3/;ɋnَ3nO=1~cq!oc,T@`@"P{%~AO<&D"9Y(I~B=bC##QP^+ wwϽ+/ AhRL{\BX/0٤ ".t5FX"$%R EׅХ$IIt=!BdoNڣ E6T"\(]XF!AU$n%4< 1.D҅%¹tq^\USH>f-|ʴ jP+j= ~J% ZqVvH2tGGf*-H ā(@RYR27ҿO$T (=$b2ĵ+URJp'lmNJ' \u+=` $Nd&+ 3#;=FvvzghF H6Xsn8zJ<)yoŏ$>,'x+琍OOg\M?;ӯ0gFX/3u\NxGy;ɠtb08;B>`Wڐe *"dLP^O"?|?˟S{v˾]W&ҥtfun'~ICGCEG4l UleP!A~I7!h@)@K $䵻 ɔ2sd4kUq+k @4RtGDYHM.R _R8fEvҤݡҤ[nyr%Q3rE+ Hr"h2XD|ڏpE>~A YPkMRBI>0uJzgt@B _ )]q(hN|P(Hv/%?F1OkYRbdp!DH):sgDKɰ*|LJP:saW4&FO28XıHV\N 3%.}g1KÏ%{[$qwNW'k|;3GϹYb@ŸDGr-T @(A ]F?<$/-/#(8%YĚ:R6ؑHt@"n\s{qI{EV_~o3o\KQ~n~0 Z8/F5xʯT>ǘp<T E^1}xÏ_~nJ 䄉hL HdƼCtA'  {#M!1Qj7+&T;y_y[?mǍ7Lՠ4{-[ E_! hT+Ek(;I&)%";YBq^j<| E6VµiVFE,ayNQT$ 4IF]^$YVu]t] -ۮJ@2^MX~/ko}=~][n'31}Ml3>fo8j@I sjrm,J% ں)0;  舠'u@ZW#dC!gҹ^ҿ`2@ݨ)耎d> fw/0+Rʺrl0@aӘ0$;5;=Td 1X` *):  Id.}L"gvIaCR<83 '|zAO_#> Ñx7|ukK kq |< ~ Ƽ\zyo?Ï{wybٱ1!C2alD2FC'~@l=y (P68ޡR2@G܈jZLā 3$:esw8+%T4W<ǀ@+页RU@E n ХBDB"Q :H Y)zǵSBQT B 0(.$f"ɦe.Av=H']}In#@p]NHtBh'KWҬ7^J>rKnWʈJ5 qL1{㈀x5Dݗ`€9iII2id E-\B!C1h)'=`#y  pWd@&YɊWY@| Q("P1 EE?_ϰ]`KS:eGi5ual㎠ΌNmDK$ccMhMXCYP0=( tH&d2cD5sd:;}$}fSXcNv&3+%9r#.?L/o|#CO~6nk18P mᗎOV""$8u<_~:?vwxXAk7̝Cr|hL>N,hNtb 6G=Kl@b([n<03qv"(ު9OMGMS1.(PQX +w`vbv"N YL$BJTYiJ)|Wj4QV RXn%`Tm aTkKf).-c^ɦHH" &(-C H&p] / [չpKrOjhn}_gs@QŃ'k2cYLz!:F/M)H*29YKcB"{MIGWo HrGĈVȎN&(Hʍ"u!q-󌉾o >Ȕ:ڰXg5DžhÐ Ʉ샞EXԸ0CP2 @\;LI̝1) %ѨrA3G>/|+~6uT(dzo]N6rT  &^Qo@\oK0*y,%FT455 ؑ;+rϼ%X }E9hff8:d"Hu^p'' 1ZDdXu@h7#HZrt,}fN":HjrN<+^P_q_G;x0qca1@GD;7_/:n{-=C#DIrsH5`@Et\l~ǿw7rgû+l3Ny.Y1H$Q{#Y ccZPPx ,{ed;: ݫIZpKD#Ӏ.Is s|~v\w=Y=h~iCj{I4Z@TbE ")2ȁPʏ&?6GV||ķ-\^pƏv6*ޝ$VꊻN fD# QHy̕zľS&Vg q\h3b Fěߤ]ttRVD;31Qfk# {rEH5_ý_' Ľ=o͔8 6;9~kLZHV D` #F>d&: {#:Ht^CMH智cx~`ޓKvM) ӁU#щ$` @YFDǎy_;[=caxhpީpX8֚Z;RkR$H.ԉ&H t PH@ b FEU5VzP77{uf$ Ѕg˃Er'`yލ-X$ߴ!:Ax,͊s^5+K[[ny{ aG(;kYclqrz z#I-d h!@r32i](ʡ2JuR 6qCpQIȠ=ϤA( r"(KcQȑ@B0'.>r>#X-9y vˉOWdc?9oy|C0dH=Pd-1j\ˆ"@bFVQ'%(A TjC)-g^;'gw}]Of 9{cF,ї҉ : J vĆ,d ^/%J'ʽKV;fQ@L/DYDrrB_"$ 3%ÖaX{s`2a>aDGIɞ3^p/v_0rNϻXwy  o&H@%"|c}SGKXs"Z{fn-)?mXƼc@[Ɣ!@  PI$g@7< H=GjTm jDYTuR^N@eL2"SBr*R*%Fxxk$)^<,}?$<f/'ǹrLQ7Gd8&3=IOz=)A)(5!D/dG p@=`5"ƂG`)YTLHZP D>"E>*u5QiIA~`˴HGdg" c !Zd@GCIXaD0$rb>4_ zCJy0x 9aF# P$3%Gi-@$65JT}W?<%F蝬 IoaEP pN]Zį!)^ߡ^0lh#9Vcf(D'gʊ: /F*|;W8S.~/sq3W~?l֜$ }~:%F $(ڽӯ=omhWwier$X10M?@G  $ht\KwE@DL4)eL8:,7 {,\1Tp74@ ]R2! ͌G(6&%dLY&VKW {k-| -\11c O6qByBdZ';H:cHQ:^8dЂJ aD )ca\Qp(S@$5dH"ˑ72" x|@t:uNhl +ײ|'3s3.9v\N| HeuB Dg<#V=$5ϑ I :VǵvI-HA/.O˞=;{Y|g:+ȇt$:* +։%Q&a$zw#|B"iJ$9NQqǰcLa`׉E@֍:Q 9FfZQ7O¢ز:0-9KYՑ_;p<{#%% 3V|{_O" GW @ }?".9 ,BjjR(BRARJА@#1  ";$33A $%IBWfi"\,  ¸eި#[u)$)1"~oHnvZ!6B> |3 iGt&lM&[^-  5XyI$6 dG PIOH$=;fc=$= s0EC^1T` W):U6VIá0tX[$PމZRP\R;DꞒ́L +ihK8pxN?g>p+nj̅s5cm6RV@*z %|n$UAI"sK>w)ʇμ뙯48>ut4tLH$E(:*#rDA J@X^/:fʌNhH{7ĆB$ `P+Z)&b$:#1ti]үK9uǶS][ T / (7ޏ1w|Ns397% FЯ̅X3l(r @Q I`mw=O~G|ˋ'(o!1_Fe}2yD &ʖhj!PV$TrCNg(=|6Ј21a;l:%IQw5̔d7s\f ^eÇ0Ї|{ځej{e$x|l&OM\|'mk6L4dH[+r2 .EH@'C tA " e~7>čqPp=QQ!)relٖސ)YP|1]Z>)L\v$@U$H Hon{.ǸΤ'xLwa҄Or[n9`O`>!P $tN`iP 37$ B)$M Y~@$3E+V}* 69h)6!Y#KZ 4 |$:1S': YAE&C|@?#f@L^.y%Ko=?[nO4r5 Φ Dި׶w5luO|~_-4;Ћ}mspc@:I=&(K$=pB(T*6@L;$;2-x` (m荨d'::QeLx1]H4rE-'8l  '__zׯߟCw)y3&<0]Vy@LL$Dkz[70A͎~mU MG!/R$k@DXo"Eld_d]Z$!5 P1X$dP#̚*5ڝغBShRׅ%!tWA5h(Q3N $p:ox:]).n/\ђ[ny3-|䊨(!P}C *q@OZw%swcA"P+A}E-HhA  ! ~WC/G!k!8&v!dw$֓D$ T@gBJcZQ:m ^BV2$pF;g=<9%ڵǜ' )}͡.59Yg p{|[>737S??}7E;AGc@qMv\loG9PkH$ @J(kbXcb<0< 5}M s^1\.u|O$z3OosGK S lx¼#b J!;1QS)K-kkA>ߋ?7?#Ny3Cʇ?XO(RP/ kS2tcu"TBJoh1BG)ѵRekz H 72bGŨ,WM躽tPd0lA\EjḦ́(}43]j̖up}(2_|(μ/B(bG䌙-a '0q$(TX 혫<2Ҏ+DvCG`C.+sIٲR^S3 Nv2P`6m`^l}՞$$=PL6.If THut?Z1s?H: BH$&"W(Ј{t΂ugl1.WkNш=1Q;6Lwٿ /X_0=esv^{hJIŸMwFވȗv~o:[ $7Bn0el7`CE3z#5+>=uwcqy´t@KMR2W^5tH D^H  pc bT*]ՅP"`4K5dooI7nj"G%u)KIF M2 !D+[Kg™pXqgҙ`-| +rcb9 :c=uj!phZ2DN̍1HԁvI_U+2"Ql0vZ3Đ0'ٱD JA$5kc Ix@G`ƈ3K.#({ru` 5YNs/n1/qt ӞrB/q˺ ]-cBZ}Tg~o|˾4 0kz! @)Q;D>ĴŖ%YϬV}/Żi猅L$p~]%Y?-ﳣtp| [>l+  GId'+]`o?xoɊ;`IM{c"HD':2u\ɂSK&pc[VosgEQe2J]) _'6X H@  : Q^"!$ TURa̺T4Y7cHf ]rB V9f0S6Ȣ U*͈񒓰Hs+b x [3ŌGҷۥ }k^rm[~+e ,u uGT=+ =Jf*LLόAY:e$Z {c1T6IĈuʁ,ɾjD':@3A$")A$ke $Q AI(՞idL)}EE"|~NUPq-rS)3Əj ә[ff3:Z"o*"CВHA{>-o(__wp_Y*P&GH"-c'{{ʊ3x\+K7{7bkl~XcGbCb锾]6L9LВZiء3}z]vqte~j/{<wIAAk̍>?07ы9* D.ID@H }FK::c(dHV{#y~F#;@9#dL`1` 8 XYM! bO&ubm0Џqph%HLzd*;=ߔ;.W}~葇w@< |N kcG$Ј(γ ߼_pux/*%Fow8޲:gs8Џq\z1S$_rD puʸ'r9Fo1؏l'K3>f2ѱ&xȰo1ۧ;c~H(\a"yÐ$S( 3#ϰ}vMB HÏ/TiѤ&B _51GB.H5"RdRL麃YwCl*G!K5A7Z͎kR E.a =xl+*.ř*ҥj'[nx-|`]80qEO(;y*l5{M΅Dvz2t.dg~ٞDoFV( !)h耎@@R=*QM Q"R@/ hQ0`QgpY%+@s^`vcNTbd_΀]2b^C|sV>O/~q0,PQ,h苈4zQ_ny"x  ^rR?!?{ɝ V5Ӛy#/?e0}7lU`3-D?aúPXq2:.*Ğ 9Ђ3]JWss&8ڈvD dR&zPLbO)(D#Q*Kw<7$ew/ycy~6拍QdYbR Bդ"LH$"W!t$NH+R Tk@(bрY4{fL ioo6:88YىHdͥcrbTBdDW"$v*ᤫD>5҄ gx~;VVs-_[wKv'pIVjV\%jaCw.naK&}pڸ칳0326U_1 ;FL{K%삹E LɼrLA"LDb"F: т2Z C(0i݊h9FY %d]1tVeƑ >*>{{SFzgG;&MtJ/5_\}G;>)9+zm? <%W5eů`|}S7cߏm[n9Z6L#S9W 1=e{}~3 x͖Bs`~S51@X%=@0GL#=ACz OxW̝ &z'ɜAl(@oD$Lç[HD"o؅}˦d7Hi :֊YkU"H5] (/IT%H 7"PbP)YGìt{\麭] 7TD7ge q98W's zl#"TEB(Hi^N7Jz_s D8 e9r۪ۢ[~0 r pn)1)bG IOH Z1%3U|O䞯A!Ǭ/c"9^sWNt.EpfW\kNY>_I̼gx%Hoh3dI(S$@ǀD1%2(K]DJ^l) օ# GK' {VGԙqS;=rpB;"hd]" F0 ! Xy} [ 8.+Vsj[n [8K'59P*lZ%0`S9CKZt|h]5:_)1u2>+aec{W[Z5(# k :]AipzFd0];! Zj&rdNIvĆts%kK% 8ZQl K6+֧x#.}l?aO@Vwd9"~ķƯO|6}/걫ЏK7V~c#UWğ@yh!_ʏk3Ƥ@ݑ.{W/çx{L;VuC@TõHqc&$t HJQs!6U[@LŤHP\t#R}MPBװR \ojQD ͦ( ()"UF#R46fޙsf;]7MBhFɕmrlEcbmc2XEU2TU2TqM8&Zؖŧ^:ÖE8s\gfs[~` p-_TaC_aTq ')(UHgW5UВH jal;-:s2wfD q$CrlpYΔB)K@[\xsN'^1N xeEP 8b\ڼic|y9yO{W|g NwqEv{i&'rF' 1G{ ^CDo w]"P1yɏ$?%~IǬ 3CR ኲcz#OΙ (DAEbH/ -xdANY2d=^|~  %@ @e\  Ė@2+9A+a_rx$לoQ}[):BP ʵa .&b)tfi!ha~͞jXBPPU!,$UQ7ؙl^+Ҭ`4TUZFG&VNUeAU % DU xnJɛ x Zpi9^ Jx$tV[x[~@ ncWq/a/ NNU>9 lF'3_1=b OA@Q0bFC :sfSj)R1gU+=G;JIdq–B2U <SmUbcڞԤ荾 {P1Y|]QO/d82>~Ϭh34+*f!PYҠU,$HBHDE,(*Z.kE=Pҥp莪ؙL4{âMk1FCllG}Î %RYXĨuZP032(YOL+Jpl(XY#tƤGV;$OgLL8B]0!ȯ~~Ly!/mL;aqcG?5rF"шN1\fW&ȉ0e|e#_^M'ss>L]{qg39A&H@C Q޼*3[RL Ȋ+6Z99x,{2%{JXPgeXS @GBm" 3_+#}$x@ q|PMóVŠ #Buň. D(B׌¬8̺IS]R,XDb ( RHu ˜zdĨ(``o,hBub֬ck81=ZXőjXF(RxUI{%|>΄Rǧ 3t!<Iwp-r:.0`+@P.Y'}CL].M `U0mtw;c'/\%}ϰ^GJb=8,J^$gB`4qbnpr`5C۳Xo9*5f.2Ӑif7qĪ&""s 1S7l&PDa`W޸;D,3beIpYwB:qA"!>)&qDAj'G\2ڗWGoỾ{ v~>:r<-1miͼa7k8O&{j?Ŗ82 ^ϩ'&!&~g_ݑ3=g>,1 H$Ѱ(3e "{ZƤH"|y9䰥><8CN~A-) Qc5|oi|eJ+EDBWB&dL$BՍ%""E:TT] 0"P(jB+BQpQpPQ#'Bm 3j\=)Z :d7Px^Xj[{` 8Bn542Pi8_3)/X29씹;%7om_~>9Y{~Tw ySw2W?Gnc|_}?尦ni_,pN $Xu HSiO ;ZmhD"g3$*oa6o½ IE`ϸ=gU!YHt$ ܐ2꺤@)Wxqc D.%E<&jRc"P%*e bK0RA@}FbL & QzwΗ]{/)B]b @,R1 !-ۭ*͚6hFUD$B{ɶ\ ˈB(|aDPq.ƱY3+.6XUTi^kYQIF:YT)@^/8!Ba0 xG"#|;V3ۀS\j+5+vƄ[l *jw9OiDž>adHƒIВw::py`٦CGgXm9 Ӟ;-%3a2rA۳&hkNd kԁВhL\iImiD$H`IM%-:k #0ho{>=_;[{}r>>9rWd~D|kůɊ_Y%wCP1b8`ʍN8zANvi9I@:Ω;DY(NɠmA";D\IJ.D#rD==:$M@.XYmY~k?f 3 Z2HMH2x ҵL"ikF'}Ώ9/$2H-s^p<34JI@ٗ8N\2P7 #$8TTr%~3/ Ε>2=W jU ]1 n4(fE3MҰ̏4]VB ] TRJ0H!P0 byk*i/uEZ+f{VdD .&EQ +I2(VDZPG Ba>Œ3a% g8g Kdm2x˭{XဧX2\P0\Rxz`{7&6+*O[n\aHNugHN;ovQj$ L<9Z1䆱Qufd9sڷ,X<곷@1R(MQ1KɤRX`h@Pz$e(R5#Pq-ĀI*QST[]UcRqJ.6QF2"2"$귗ZB8g83 4f'r˭{I/02ҟGٓsnEefN2 v <1w^xdqu֍^gtX߰Ah®1MqjnзwXu^a]V!V%#/:]*Q`b1i#F 6P(5d4}78_Sr6r`$:c_*s)fڗ L8>+__8c~-v${L$ rGS~g_]8xEƣ~G#޿b  qEiĖS&Hz(ĄBq]0QoS>eC' ^Nc/)L{ ī]5H7%!l(*P2uH$ҡIzOaպC$MK/خ9`_tĺQIhhLDO :H :H<㰢d>W$"RdAOOS;VQ$AŤ)ͺAu,ܺQHM f]J]BfE \QkGv &*˜HYBU5F5)±٥J: B aaũ!PYf υ3luO3 Is L[.s ǔЈA B  QgɃJǽUPp_9)l*af3ݑ^9{wl8ŋ`]YѸJ2F C%'xQd&YXZ>9MPP(?[qdgL6>;``$2Pp^#GU=u92=㑫~'ִDE"5z&=O5< ٍrc*Oq;|._=\IDI$ZcE9Oܧ优Fb.73 瘨]=)$11Xgך ^0]*Iܨݐt@2cUPXa*hDtK)Ҕd1*Ǽ8A8j&9=';N;$vdZ\JCvb :ÎHK}־O^~4/vU+H(d6#"Rf]H M0&A((Y]E4 %tEPT]P1H(V@$ kpWGh©ZAAu#"*p OX]i+<] xi&͹n{r+ c< 1& *lNЉ0%5HсAlR{pi)hIQ2օă`?^pK\3bq5'+jav8:!8m<^NC;QL,Y=|1r361X:|X¡s3Q,l;`ctV@D wd)"qϋ?cw; +9&_B@H!U8hEgT]E&Qu )rQQD 4 Rb0bJ F)TF 'hܕ++' 6(nP$O/@g.qYђy.EWo=n[Z) 5I|xrB=Q^aUɤ#*Ur Og=̃5)$`\ycųƝ53Ѓ@9&+#1sjt`x{EwqA媱ƈ3bsB$H*^Ǭ+CgHr}$ ICbNk| hz\n;]G]+|<)ע^7qrߋݯcʚ~ dAI2-1d)~xws򘒋4bF-EdF#ǿI tx93K 2@2(VЊ#ae/|cs! n.!A\dQ=^H_pgҫ #DxlI@I6 Hb HNl+D'嗢K!u!c RKu4TMKz J.5EJH!\kQH 5U*b0a֭uo apB\B: .-YI[Ut3LD.Ks k r62aFǀ)ަQD~%8.̝Mǿ8NRd0a=RW$NWDa]xgE-dpJ# pUhA\4+l&r^sLw]P SIrg$8n>MOOi ё|[NfVpCDtrIkF%  $iE 'ٙJ6j(}/}WP>{J3uTHjH)D js:EQ34TM) )TTaԑZqF8`+t @6@(7\`/=a VT\1鮬- -oء`c@xYϴ=ehA W§{|㘷*wŒUe.l;vؠ$睧3y0Yٚ]vO1p2,^xLN; )mƽgG 89"abhXϬ 彿96q7HD.2D0&S ⦈jr ̟WS s6u?Sk> '[SFH9&&e",qc yzIE@6 D`C,cL9I/t%"Xq9ѶLH JX7ƙA⨇!ҫR2bHCzz|^xPB.8qrÉ ˘Љ@,ĵ$m,H_D# 20Q! Ow>> RBs=+QtҠH)5Eɕ +,THUH]@VA U@U[Dq!))@KB'DH Jx+ia48dEBwLfb[ng<ǀsLxD`1Me*l ԑ1#kVTidˏrp2* #-XJI$px{`-?Gs53:Uy;uoEM̍/yRƒgyڲ '#[\LfPx>iޞal$1QW}\ $' VXx@N(25E#=uGJVݣ;gͣ +=H3\r-w)@E'LoN/ NQ6F&qc[Ä-}Gd֝>0y`xYJ|@*HUץ"!:*cTd EӉzTMFHE؛AFfTU\d$b F!c7%^ ]b x&3\(Lu0x[~ -Ep bX"Pcи OVުN x80Hl p\ɾ<<' x{ցٞ .ɁZWyN#tZrhɋg3A:q`NBfE/!K4)kt(taԲ`nG(SPh/{sG<^ $=D;0)IΔ%ȉV A@id>a}2c&##sY$\i_-BHtPH!u]Es@%BVCt AEQhQU..c5Rs+!" RAЕE-J/fáI{1<OwsR{k[ XZbȰTr2 N #,"h]I9BT,Qvqv^* YOxoE9 hXF$2oW*GKb rflkZu긼QЂ/3ƻ# wDr0@e(L"9 &_ u2̗6|2`Yc=)MpyɆEBu 끱acrD11d@XaWH< n(?O?J((7:&4$,3!)ɟo||;g Ξ%,#ۯr-`%_ (%!HE>DfzB(Z;Hs.j+m$ *Y@E!\)Xdθ[t7HM>I4$d" 8 ׺⚄D#r$g2}1::Y A&\1uFI|7̟7lBvŠ P2+]"4)-SJC.г 31SgӃHXhƬP$`0E, $l3:Ret ]}x@pmcZe] hc)&,ۭ˥Gx+ 043{v㖗s+ >aF 11ܥ#ypn8h33 H"XW $ 63w|'8-<+>ȃ7bp<0aD+dH䝁-d73JIc]H.p٘ݳ@tjtJr48+0PsNGI t?v"?o:f47l^>0/@*ʍCo໅?6+[yo8~ +ĵ Oh*v%k%z% 2B$@H(R'CFڏiBd% Yd*+`.2*d;K|%KN:&"!Qv 5* }J42qB}AGQ^kfDڏU_1;P':ѕ*Z," H$*"Y=Q" ߊ$;V*\bY1Z )t0HPDAJ׻fBly",E A K"3p!\㙺lZMvj~-r-}+]|uwWSF/T~P#\қ)Q:!E>ԋߺC ;1SiC4/ z!+AV_Ƽswt@{7Z#LN.3r-,3$NV3h'ҍp:w $k>Lvr6әcM_NHTHT$U8y<|jysc?1eefƮq܉ƪrLX' #AO>1\/<)~iu#P(r-H>6!G?yp͟bPw׆^R1Le_;4`WUz#Qa0Y9u0nPIHAHܤ>37J3lRNVa6~B!@'#3a|)~aP 2ThQh@"TeL%U7Q @d$CJ9 TakB% TMRRRD蠃Yk M@Ӆf">*R @D+{#ݹ Kߏ+V[_[n[>;x'"KbbwHC( !҂Vq/#,Y$`#/*{'ЁH.GG 'Ć6NFNĵH=] \^0'HXFA%j}GbT!"FTȪEiSi'4[|+lrAi[n咡QN(idU'Z;'80g_"@Μu`J cPUdA ʪ:__y2 xd$8*I vMВ!(H68,-XcJ29@"&;#'φҺ(GlÌ;|/aāH@'&b$ȁܐ@} ?kQ%'>~uď?Vq z%a\2!tz';=#/VlVB@/t-x|K(d%}$*6ZC'aΜz6Š("+Hܡ>ױD镜s'G_S6D,R%V$ @U NBHD0 .rRUR^zt52DtEU БB2.$h2,؃L!Dɒ+.42tZ.%X!`yp@Y•t'y.5;wu0+jvf}{;nw!OX'CйJ3e~srLC-c|I棓p苀$9Y(hTDAv}UrsF"S1d S3t63q@ +ve0w.3d N9eeKItf*Xӏ'^Ck"nH[/?.q14 JJݴH nخxgR`X^9zG^r*XcEߡ-W#dw̍u($rjOπ ܠsHB& @ž|$yB-TX ̪Ndv%!UnYZt%S(u%CQe<"]Y ̮ !AHE˼,"u,RI0K!ut}4K0r'uQŨHaDhtwvV ;Iϱ 4Mz*F#o[n= OY=`fe{rĸG&$mM-Ĉd%\܁,`t$KI夰k ԑm ZCg%T$R D< %'3&N q}t*ҷ}W=P#H>^(ώQWBٮ $RS",TL )rGPDf+]k9$I!"U˃X]u3$Rb֭ƣJE͠+ t!uf\ &t*:sl;wFDPU\MVUГd%D$+I\V 0tvs;/ $H3>*_8FS-^AAap]c{چᇐ\RΨ%^%Θr ޺Oz3ƒ`̴Wz:1ct-M2-) z#+%hQ1P @QP1ws 1T낂 !^#+c IOvlg 5,JGp92ZP S!2 ^=OaZi@"^\$7N8=`~8|?qE+@+\О~RܽVeQ;^#nH$J$Bx It(i75Ϥ9JڡZ!6-*YolZB ֿW?7}/_w^:v6,;';)7_hH!!u Y7?Λ$dNh$Ow%ӖHـ@x)~񏠩UL3hJv= M(H̺@5KaUJB ).RG :H*4I!Z:^&d& *QL +ŅbNX(b7/\Yb:؛->`[n=39\sy۞K| o5H@k$DŽؠ 0&LvAŸ/ͫSq-ʍyGAf&Gw? g}oi{@ x/S.u8~\ЄI) (9"] -@v]~M1(RQABBGf˺:ԥ+h(B UPOt:x*X_ٹsNTW rnk@n9s 3.q5fln k`lL3RqEv6̈N$SR3u;k)AOJP+:: sHR+iXW"j@MwGf~ӆy&6`Ŵ!9l(X'Ȃ@EF0RpY=oN\U-wT'*1H)((A&%kbYH sjKӜ쒞iz!HYȠ'Y$z! Ze]>0_ ܯQ1ÐD4@C#F+$l/ e</y-ѲD+ //_o*'LIBLb$ w)w>=ҟ-+ERh$%f3B$*]RH@H{\{ EpM/RץRUUa&CAnj pI¥I…j9SLFWV5[n=ͭrg>Fp bČ cڎ%UJ! @5}"FP`(tH:Pv i`^QFbIe+Y!ֹ[9KFS.7Z˼couON@X*G>8PJy,>22Bz [- ;Zq*֥8B)N3txݘǩz3I3LUdzdA&$bY_D'KQt`kelkb<}Xa$ Vѐ@t p`NLs_wÌ~- YB<adh9s!g()=ֿ+{ ]QY..uM̺. P^zޥB4M RiBAHHLwU ;u]q{l-q٪΍p;&řlgIfGv.r_3 -\aS|41`1N؏NffJW@+JAPeGH t@A& gKc7LˮydA0p:̜Lt9:wv]~ }Vqh ŀ85nLT+ryMO/hOBIM8zPqbl)JA`&䈼tt~tJ[_ $^^7r]4g?z Ht,|,V8$Yۭnh@4 Ib&3 %:k_yr;{>Xƴ%ꄒ]1j/ J"M E;IVqA3(HnQaIP:kOe R2FNE"P fW*S01( \.FYښ}8s-r-M +EF`:`р-`j@D'*-pk ݐW<7 \FHG5qLO*rK";e>0M~nsTʊ8LЂvƝߌu'H8,c?Gw DIy`.PCZZPJq-Nώ9 $H²@=B. ۰ZJʃqo⯑M3+t2@#1ѷL(L.#^ItT_1"2R.i!KX}%O:|bVr-',c7kr5"rY*Lb6UEH)\@\(H])I -tfiKfc3a20 X3i/mU붪ʤ:}[3]c[ . 66BӒZF¼BaXmШ#:0aT]uʁ$0rN++v# ydHڨ[dZq|N`8\R:uj˯>t>5ՑH_J5@/uYeƴf+NNF| :PXL"L(SOw{Ćwerx&+jRͺHˤt$H 躂R`ҭT#H]PypԪԥDQtVRח"St8Ssbثs\hkv`ePI-V@nS%pMF(8'HL ؏^;Zrq(.q0+ 1&4 3m\'13ȁر=o+bD6zCPFZcu<&w3)I?tu=َwpĸW YQ @Pq1݁-Gb|H"\:I_Yu7"r__/@GE82f/=)Hst@FJ&r@A Qș)c);c7ǾuR+@ z@ @҃tc.9sܨ^;\]+r$I&^p7o+Hk dc-2JNOVI tD͏"B>:%[*x/#;8>$ZOͧF] Ou+wOp7Uԑt))t!]E"HЗ"׀]CU[~ E"Bx UvU[^Pl1[yYg3讄Ppe2i[nep-gx;3`0% 91海LRj3bOĵjؠ#PQ z0-"(+Zk34%({rv{L= VӉx痣yN? 6S+ڞPA@xGk"e;@рJ n H){Wlz)">*L2ݵdYz@/tx» xf{53VKZ3ЮWB7+_Ha< ύ=gg,`0uU7JH! j$PQhZQP,Yѥmvؙf W]q&tSq8Ӥ[BڢY:m]ٛ]U<1[[n9k'fGրcgɎ uŐ\` pfň@ Ê~`Pft уrڕxA d4V3rrƋxhw N::1BCGXS7K tq8bb:soq^A$$ёGF7x|;ZO)]ِ5HE8d3?wnHt+Ĵ 5@|vWt?(h(H*ng߸0x֥~XIUV8b\ ĆE;A ,qH) k=ͻ4T0#zPLB5֬>ťa΅Yf+\b^c^s6}[p-|r-\,p{l0!_xŪSWfj\U0"Ft40:H#'sr8&'*İS:Ko\?Z@1$!0o+#lpy=d"D+|3H_H@TX]у,x|axgeh# 8=*f$1ax[Wbt)h(| OÖ_jʻ~G\!5#N4]ql6beaݩna%tGJ݀RBW0aIgT!qP+ KIM [lU[S {|{[nx[ny%/p`szY^Q*:6(x F֘0Pi΋ y~=Y OAiιZs>2<Fy yĝd r)N~+ӣKq|GY{.0 pCइcFJ1BX [芐 Kk:E0LcU{l+^K݊p)]kyΥIwVE[nx[n\Pp;+-6 4n8 +X摾eb=3mF V3#2h3yǼаÆL+;s_<}w\ >@"0|qH ڙI& *YPhI@ܣ"gbaW\DoLu ؾA,ȫjG7NByÐHY~K0M>&6?wy:E`@ &h؂cyuD%_>|pxoyS_O1` J:)q.Kj X +b4#=(RAwPeI!FN_6,bV+in#{ͤHw-|A*n/;qΩ>F-cs4\Pw v̝iՎ@\1_ϙ3 Vg\] :0  ~@(DPdEbjQ5j@R.(W=KoySorgd7u䲞د^h;NR<;g3+LhKZ3c9~!ow֝ *9`Mɡk/%} kk?zufpL_~_^IbV;A1RW΅.]vy[Vx*Xx&Ds9WKOKݥ^H /)pԂHϥsSi+];<&Y1333333333a;yZyRkJw'ݟtT=V+ߧν#anˑpi 1j摺xWqP8ڢJ8`^ӓ1a@)K  vL}wOMS*&9 `rf/ (H(LnҽI~56񃩀J;o9HwyI&gPV$ P1^w(9W Kb|']aMС|cxƒƃ njVZuA"Əa-nNyozힸ^b{bi.Ta[Z(-S!:;T E`*L, n:t1&:!Z ,LzM,1W :KUN2±U`KhUifc 8qWpwI=KG ?3VYe@8 "dJJa;Bqe8fW+Ĝ7񺗸I#_ƛsݏd 2Y}mX\yL p=]xDKĚ# j5xy|J/\|7o%TT 4VaB5| .%S%.VOދ{ܘyZ= n9YMӼ4M`tʀaծC *']ܣ;y<[7$yK#`4d %A\1Ẕ8I+'Vߦθ ^J9鿉}=O+|+u.)[7you~wmhi^@:zτD8y.b@`Ury^ {w8Jr8.uaj`RzP^m]q89z,OGugsfc>ﮀ &_| |eʔiiiM 7 #أP{=ót~Y9t1" ƂHve{m$[ՕK/kV3°zr>T:[j, * !$o++?4'xfদi 4Mt&N t t T$|3^x^ݏQHkDb`k/!|豫qci2՟YpV$"Vʊ蹂:}?< <ė=rYGŀm*Wwx-M4hi ]c)-= *L.Go} r>2Qi,T0DֺmG7ʗ؜FabDXqcXyXyqoӱBv؝ GC=K9~?z̯ ^[KHLjDۈiSl'[oGUza y)/IƳܽΛx `p#k6)}%m` ^mw,Ɲ?HT *:&z;ү۞e@eq([?_dʩGZӘ@9w@*)tJAElxaFSHDx3Frz5MӴi61ᨰna LK"I^D]%!ypd@c9H@Qg|ɳ|fcz}`51g>*ƝaH@td%'_)eîݱG4zM4CpIȇH҆Rvރ% r 3Hcx?GH%D9 S5*컼Go< rRJ zܺ·Y1˜D!rAcI.\ ϿyHO}&ۨ*=XɸV?rk @0I0d 0ex>r`lBq'4MӴ4̓ H2t> Aݥ\@%c%|I sũ,W}_2VCb߸ҟ{y=k>'1`@993|ʔ6Cz8ϤgYB}5u=!d nOkii)DeoqI:$b)\>*}wAqBh68f$z.|᳎81+k'8%|v9$)p*jLo&DAgssrF$ݻBlsk뚦iZiA xGE@|hWL*Q gT] K$**Xz8Fݎqw?Xs[|wC oIQpD v>yu}S9OkYimy2˕J$y]mzeb@l@wA$AXy~%(%ѣ:w񿾑alr]׷ηeձC|UWj|6?xAAGNPdEwVK! rPt$!އmvw Ohiiu~r?{8I^ V 98M|epIބ +H`5ȇo07XqV~f=pQ3~|=x?N : >9 j\GZ/Q=6WE4MFA4so@@;w\A Ām6W/m 2P "Vs^.n(~c}w;IT>O.^?<P0):\dOꑫKۼi5 inpCb@@]\VBP<_|goVQϷ`d, 0/1?c46޼IBȩpa%kËG~MϯN^*(H$ R8|@SܸM4c4M6"69MN ||/$+sHTV$6ݘ08)0faʳomXv2&5ȁ{.Hǿo-$]ni~Oqރ91e:* 7u<4MӌM&h遻8Ƌx5gU:%cUt(8d)L[omy6o|ea+m䖨(,jE`QSS"QkSDEAADAT0Hh遟?Opu⠰\L% @VL(|/-iflRh_X`F`UEdK#h0W0eb a<{~޸.| ,'tPQ@6Rg3Ro/b@H@+ĩ RQNeRѸ9p7D*A1uze虸`` qmSǛVM4hyiGg,F6^0$3 [Y> Y$CnnEkfA"Nѝ!|\ޤߣn82&\  ::\T(]a@Wڔh+iwE BB%TXƝ$exLl̹=x}cl`Ƅ ] U)O (dGd['$GuR 1P' .`ylMxiiCp׊^AL^cWe>X3xx)#2Ï}:%S=X ĂBc,8b\ifhYI^DX$:8S9A:匞Kh3$xA S#'6EݣN I$>ם\6Z);D?j~)eS% qX[f&ii;%H{PbC8 X 5>6ئ54MhY~C`8f~>GsԳ y9_ՀTC ٚG$ς$ML]gaBn!{S$g?6ë= 3ʜK\Z/{(<^hYQ4MӬ!^HT27aX.=!WY7H+DL>D+ "~PKKCw=* ARW: 1r<"1uHPXNjፚiim2R ĪJ@Yr8!W•q9T,Y @'CZV`rѡ X u=~XKؠDITT@ I1V3LׄU qFD $8)=c w߄\nj 66 f& 1>ϩ3j"]xP($c[+<\1@4Mif0ش 2] ; C9wU^Ħi ^3c᭼|W0h^b|:jUA"18`T"i_!^Q${8|@J ~EYޥpGEzxcU=(Vn@i M4c!P/c@Ժ>Jԁg!<<&G6L*.G#XXZoV8#,_!()?g?6 pIf=*{00 cDŽȎϳ|+,䦛Rv3Ki M4cyp;N5wal>*#fe@7>y#w Kyv"$*V8Ο#1H1~ʛvI\pH< Dv A2 s,c~!,T`X?(ۡi hd g=,P .QHʱKJuJ7Y1᣸*C lOȄ $+Q4X "K}%MG_#gycwmO\$z^! (|31dJ U sZɊ/0;'Sև% Ĕ2C*O4Mi Vc Ɏ):@"PW*1f̍s($^˭n0us6KH /{>qzB?@GK_|_oC~db@ J <"qLdP crF]DOΩwaqIJB\a}~-wكiiƾ2^vJK a*ʔ1`u=99r|P!7'f#y'3Xr3seUDiAT,ǃN*QX}8!Py_ 8ABY Hg#ef6vAo@x bIݏǔwUi%9wrK<.񣈉(sJ0,*1Pb G G,g =C:@KT$!N֒4MS@4ђWȕ:HrE7 ĀrK   ,zv=XΨR+ 4֑B*P$|Du>Oj zT"<:u%|@" 1ݒ(SD%95uI9Ok=B `lckA4Mi:\Y,9@EΠKLVG#SewAS|  +Waf7<9$gX bNqNỈ*ëCG^z*933J!s%.X 3eO:pRR !]X'%݂''B4M4M;C/ACdB7XǔqHy8 M?Tcvy,#d c!%%eACsbU@ڎXX4{%DGJ$eBaJb zsL90EA` } Avmvy|1H$dz @qb2t^ P9eF,P7.V)|@;dyHOwJL uuIeHT/g QyQAr\R_pLG̏`.͕- iki83$5C]&SJ+qH$*|$z=O|$|GG?3Hz0@c dOc"m.a%DE5\nx(OY5-%@S 6,S*b,VppŜ~V ƦMiuZi­^rw`{J"c,p*ĒD6eBS#c?7N>ScVfƮP]3X`NYWu .0'NȰZS03;, }Gl3-pj1ÒST(c$3WN:! Db7ihYv+=<3Tje|CcיvD!*X[H,_`c3l׈n SٵFVIT@TXbI3,0njSĜG+]e%s4=|x?zd<Ĕ~EHTb"OjIg DC`dEb5 ̏Y.ĪٱU؝4M -4M/a6,+Ce@㱫-&慠91ާĀ)qQ3M$M]/N C*`B=oX5+Ad9fsbqr'-7 rI39 fL X^N+Vt e%C(zxH,qLEŪ-bǓǖL5MN M4Y~aG&abCW)ał b  r Y Yc%ƖX ɣpC?Aw v*#08H0$-H3jO$lXU P j,(iiinp{I?Tg]En:~>!걫J$a3!ˤʳt;Vg6SyC?!0Ay/%&=uFd% 5-:C Hz Hl>ĒSYSWqK4hiBNmATw9.-J ƟK$1҆f:rJ0|0z" $HzYK̡$HS{t嬨5&.9!S]rRzrAsvЌTx$g, IL0দi6H4oƲP $5I)Ӆq-Jb +Y1P{1GdGWv~a$!$%FAc!;B(%t⤺ 2yI:t 0~li#sq֌I\eJ`e$8,Dł0a"De5|XbIgQI+֔M9G6P-PP] .Lak5-&':0w;&cJ"va:`t] R``U`Iߧޥ̘$k+ԫdGnX|@Y"7@A>"1P%~  A4Ziy!8 ^2CR+= :L)[+_ԻVo|WYo泎ag IlWJ&,ȓ$|JeW<ȋ tdB P QnZL'IgckZlדbD{D$ K*na~ FϞ=f&Df@DTBD9{[Rzzn/mAR:{ $CC+2Dk{ oC 1شX*.bBÐ B8g|+ RUdN5cF(̴-$aV4k@B RK4`i5EˠUW0 jN@^ZсP#AaEPRݝ3mحiwX dKRR(#B|@+ڊ 3 Hv=9g>6dVq-s @\ BÄ3M1wjs+23%K;NаB?˵>5yߟ3j P$Gh(|}8)<j_< PhAY Nk i($Ƞ9ҋ1 U$@ѪGBoUWDCըBJ B)'ļ[묮9?9BQ#(0Vi~ #9!5 A5203dM8=_v@%tb.:sys EoxB*lX tz6[M̘p?Oyw!+ rv; USy0c"EBy#+$2 bPX4CV4 H @ ]O3AAhJ躖H/ =E5UJNaHA FJAr;e3]z@{05No{N/@f(*)?0B|͐f2Q[.=4bڸX,"|gO LsC!]yAAMLQL?g S@q7;/^'(*XQ#iͱ3a,3HyL!?@h^EBRI ŬTh@ +MBB@@HQhbDo$ahԌdUT1 A U$REPR^$@t@! ̉zEPAyw;y|͆>Xn2 NV~xNhU0c B%#.pL,K,cyxSc FꀙȞ X獧x&4Oy ᣼Pr`Lr{Z4ZZ!kR-F hX Q0 )T#UH$e@J*(DD S*UTC臽S$EB=єuJٵX2yANZqmB}vC_Q '3S )m`*Af̀PܰX,bX,ޟ+8= | ̀u*h;wwmxW㉢⽝R7n2ž0ъX't|Ěj1\."Cnd.S#a@ F#C(%iED ]D+D UF!*= RHG(RNC Et'iJPHZcTzk6UW a@0=p~<15lTi!gq1rfs{FSPt9c0Щ"AG#3 zttfX?%Xbq;3O >fcApټc_Տ 0oh+uP(tdO@Db j.գ8`h2tdA P%-"PHpaB -%\ R^ "-"Hd Er0=*РC(E+J W JO )=\BфhXmٞA*aNN-kgQܜ11 (1ܠ]&z!(00 [z\q-1}|B t mW6 3?$.|H#(*3mB37^U(:ԈPTQޯ\t숇pj`l-\ @֮CX1nlebUd4M U -4W_[+JE<mAm_?K}~ᗿ&jsUר5ilpk`5"T0c H#;d͢7b>-dX,h<Ƣ86{QpI6ާ_o:@x uUkh@0`V( i݁hh1$Vahw 1\ʼnʘ26ZsLhЌ֚à Q44MKDK4ha;р9 _\ס*J߯}= mO̯w_?K_\>>vbwFO7 P 8ysmkTaiԀ j3bָX,ȽΛ)C8T2c¡`ĀFqz͓d}*?Ecz@ъzѨFP #*& zkZj  -9X#P48FIDt @ͤpI΢ CH5I ҚPF *=SAH0#PRp]yi(@G>AhVzR*Z+]T)M({*^::B:)Ά^Ssa^/Co!=hq5>,Ȇ}ԈsVS 3c? ﳹ`x@?LýZcX,#Nj?6 >'7/>Ͼ1S'wG 5bO$BadϬ Z3J5Z %+@hB14"h9CJT!w:G(ҧhc7X:T PbS #hth]D*@!8@0ۥT 3BbXuõx zK/o"&tL(@=?_7>=cd$3u7間n3'b-3 bý|cwwxg<~/ƿK=t{"12Pj0BӖ5Qڐ﯋m -@S*EEZVPHJ CPX+0~X[)X9h\Eb@QJZd.B Z#EA9\UkA&4fe}}kXm/Ѷ+9̀`3񹆅BC9huB| ^YDH`Exkj7 wulO0>%p~]gb,; bΟ{(SX}^1+!RTi@ h[ZbX׊? /hmIx{\zL/@Ni.WP#5`ƀ@0ޚMAKhD) Z@ UR"-"Q8 @|0)/a(]KRV*JHhs[4B@ޛp,(( sn.[ ک=AaVtY7u:&;2;AqoL\N U$ؓA`23mُy0bCmRPd;?|X) S> ] Ձ:-T݁ $f t k8MB5 -ZHBCH!U t(#AGZ)FAC ı*U*ҋ^@|05ިVQP*:: ]\*&* U-TVehA͗RElr=o.vC 2]ޚ )<F&4 A#b=0Y,ya F'potܿ5AB¡* Th@0P)s!x'Mh )5HB 8[SJIP!P*R T$TPa@U )$! ݼ@J@F̥sI+Dƀ!ILHn7qY΁n$NbhQ}MQ7:Q$l8P&z71aPX4ǽc@'R` aT\c{Ʉo6-?Ԛb!?p3ɟ9{LgdBAQ+MVDk! h-hBC'5P5cށNZ1$(A`BGa"-4 $0 Z0h^ 8IcR߯jx>WA.̛2*RꠔtH)Ci᬴0ʖJZ ]~؇: 5cÌu⇱\X,W%GEy#)?gwNOHc"f *5J/Z3hc NY2$RCD!TF (P)4PA)]  jZ0zpq>0p 7a(HCFUR"UT΋BKz١ftg9NF&+[rS TRf5w4Ua Gy ُLc7  tCI0_g?p9ree?;ĀbCkbP|c|(c5Ҟ?δ|{+*Ԋa M֌Cf@PŠ;%aYf(4ҁj\2aRj(`XJP`&U~ "!R + :)(USnip߿9 /s#=5 q\UkZQ! 3="jІAjopeF*Rs^Ry(EJACJ!(:ZD@yw 0P CG*(  GCD/X/u@x7q3<ş*N 3`P]m$2̪(iQ'_ 1 <*Cօ:|OT8Q k&}/v,b!Yf@kx8pUPcz+0ޮ*TJuы9~(@R(GZP8<PU|P0QLhN %}wO//+^%Wu˼U_]Ͽ¥z$id&%im"faYxq|UnTqcqaE?e~-O{)Y1ΰe/bXbм1p/iG~]8bq>b|k ?g<<V@ȆtBSl7VZ(z^wͺjN*Bsf5H+HíTGK)PGSAE@4(rBHh :TEcǟ398Á2w@B"B~0/~˼ Cዦ}o+UO0\jCW6*F[+FGhyݏ€/c7q ΘoL5z@/k[bhC2w:<ԟ3 ~>$u50#W!4&~/c/ǡP1bBGQql= E!.:B*T15T[ f UE 97QR$p  PGáB^̤=C>f*GRL6e.R(RG&r1ӊ}~[PA`@j闯O[+7)̘*I >йq[ !׮ǓlO s|ċŢY,ϦxxC}ؗ]PHP+a ^n[c opUΐ2\6g#5Rպ] sa󃹎|KJuE+u8KJ@E D9 N?9RǤ]VPd"hsd>=Dh=rѿqUǏwc{w Uq~w-3C_Q1}ĠLۥ||I(?xnWŒ=}Mm{3,XCŷν9P0JC35:a3 "[*hgLe;M.W+kE"js:9֭G:Я6y[5CJj,}JI5c($P*T!WDB EjVPHsQЎHB0#I SU=2A*_=?EVjHGz; G`[?cɣw 9hh4 _G r"ϮفB:>T\OsrO%BwYrxS3"w_c|/|Ufꜯ|cƋa:\_vLn{eBr+ϟ,ɚ%|ُg5@ ]Vt;_gz~g;bX C643ȇ3p(Q0Њ>`z.9-sB2 jl6C3X(̴KN 1H R#%RIjHGUAkA"9(3)L"*)@  )%28*2*f25LDѦh)7,;LՌ8|f#H>^џ֞&?YM"Pg橩mݠv43_c> LV{>D?n bv0;P(&wkgŢY,Y^.|v 1w>*B)H2 T/ӾeP r\ߎ73 5]EVxUj+TjRǀB)T#B1TtLz]=WH\Wq "VE6)Z =ھޮd&6Q[^7pCe z}VNTUM2վsQ +nlnL_=/.Ƿۅ5mvϘN=$0e;;gX,~dX,W[w_廟~*~->%PBG X3Z1F& mk@;Snp֨F [31pBPR ^@'u:`&s"cmz'p} sm_WW}jd_wǁ(<Xo^ШSUIM+u?N~>m0Oi}n=_7F! C{7:bbx1 }Mn*_|W^ko7/9Q61tZ5sa`Eб}( ˥C!A@9z0x0RUTl^?_+%tAE@Uz9Ec&sSL%s^\LE'C(#H'\nvp6j;!74_Ch}.NIFΞ'U)̌#5O'o/?klOn9a~v7{3y]m]Ƚ~bX>bKw߮ఊ}z7_`"_ns~ A@TiE5;t~vY TL.7<36);;Hq͑*P;_㩢BDzQEFG'm {#Hm V3H=y Wdz6Gx3oެa%$[&叫 GYd씓 'o?wS_?_'o ؞)ۛ\001yojwexLNbXl_e]:n$5r}3>v@Gqn@P *hT/nv@)xsϬR(tjpINI+(t z(DDDRA @p8; EFtc ;63s1 N5P3Dڗ]w94p,ziMn9x4@P`F#U*p|)RHG"J"! :A~PC#L4l U(R@:+XsB9jTG; u;?csu~.l75cB 3NßO~m|s3=K[n4K~zc{M=FQkkb@C+@pu^ofzpbXCͤ s;!Q{IÈ #~W|]V_(X,nX,~ _ ?124i&3ȈW`_ oq{O<@P"1cQLft*haլFW`~U&G}VΜ1p!UT : B U`."U+yr,%@!])@EP^ir81cA4tW֤w6ܿ3b|ց20@:ipNkLa&[@=f :jvokH_bxqgX,~?;saEm"'o23>piӞ֩"臿9PTÌ`rUj1@=*| ` W\Dݏ:e՛֋x G+8Ps;/׾ܽ=bύ'Fgʑ* 8>G+N.ȣPf Nuvk y -+8c*ڊ>R3|If :-ϲ.h3&H] /ɰ2|cֿ߰X,b_>{mR]f4^3<u.c@Ph =\N }83B  prF1]c:i[Vm"#Q  Ш5 `3gXaO;6&{wbxb;o<湁(Z:)|;/:<5-Ƨ9]~Pyqb}S[:=>mO:A05،BRB :.&sblzNS ъď@Dġp|soM~gс~Ǘ@MGep){UjfVW)trСϟ}Aؚua.LP \u3Ot jdBmiY_2َa0Pd"3:3Lיn86ɷ +{-Ż++v0`f贉|'歛wosn2 ǡP#_NfV[ A縇mFf\֭Rjl(*NMu3U9HAVW P>d(Tq׾c{oj×K{e %Xb|jFxAՊ*w_\zLkXճ טC1~~~B]8 {/YYec|{Q`G.PhAU[ TC-ABJMl fu#6=LDz E>xHx'_zC.U~l<ӢT)]͓jPF)Skop7(G|Y%#=m ^)}CI.WMvgVtdƖP$Lo Ap5Woj_kąbx bXX| б_gx|͋l=\  l3Q鰡ql&֍Bᒱy7z'ڐS *8G#k+4 JwDCQ ʁ|볳UD36 hh  ׽Gg_>m>x6ULwsY$$%Q9Q{g;Q-N?Onӡ#uj&3 т9'#01`{M%(3߮c仆[v 1jY,?; bauasVw8c N>ǹa51 Ꝑp S:\ж >g= O9}QHalG( %THCd.u ͪGH(( &_K{h;:zB]{<]YauR"JFIS͗qχğ_h֊ƍb] nCvaf+زdYu_gZQķ oV[N7/-cGgx P7?ΝOr5= #אbUꄂKŖauu@(2Pa̍I\?R#lQfȀZVM`.?U$ct{H$( }/`VP(44ǻ!Ph6hU[5ZӮ0דz;1WVzo>?qC0bŪ*'c:s,Y~xMn/i×׵!JN7rrbKb.^yx54nr n">˽K iΟvWHMdP VdbR#;Uǿ) qFߑ)0a@а+{<ȡAG/ۧ)RtgCpUfUe5; jUǀ_zBةʩn(ה(@5zС 2OOe\[vSğ˟ş'kl"g g׬qR$/ %mpX2)S~v] BÈ FC&K2ݙ]/&^X,иX,G| _.O>?[{L7~񌾦mv 3mǀ037* ږmg.(! kܢ7ܥ @QƫBH& N7`Y3w3λlwmF!5awDp_~% fx< (4 iruUuzP@h8.uo=uqo׮q;.yyX]>afuz`FS{K}掙Ld~x:(Ek[rdz'Ed4 ~״>^6 겛^RY̗,2X,.9|7@4O9]+N&j5jMFjGmuE 5 3\rQw(S 2BЌ e EepnVAt ˫TJ(ܽ9FÄzG AA5'eoR^+R:fEfR(kLh(RBaTPa.}~ --4\z0p-c$Ļ)c xH 18~OP}|'g)v'؍#}Eo(dOKSH5V 6XsrSgl ÆռǚRb6{ʹ-a@CH6LWy 6O~CmɯW1䂹'?>b biµ8an 7Or,O46T05 QE Ua"+ioqt-"J[QohT@85- 1M oML4In8V :A݉ٷ1a~H(@GB¿iuyCCh :턶~ k&A;#i#uaÚa:a}>VkF P!+*(̴0ӊc}6[Vg̷؟0og%j5jvn~D~ X,X,g(xα3 8ŚitP(R@ U F4 P;5w]Sfh]T*(3u٬b  DH֪_}Gz %~yɖȞ@ 0Nn2ִ5ujux P?-㭟}liP{sֻu3L~Ck_6_6Le7|/,ŇdρcX,o>PiY3GYMNb YC]ոchhyՆ vPqZcPuY&O4i ߚ]^kVıPC A<* 1BS~a~ 6ѠSpyB5f1Ph F\cafr(rMIh+٫J̿Pb[bY,,a.6iʁ`'1tU0XOspxgdFxB @L&Zn7mGAQ@:B ^2m5˶Bcj S@PU|o~W(*1Ni?=aMdMy|AHIǎL_Մ{t/wD+t"@noY k&^R4|>-@?=h\/4>@hOrvl~k?ǭ묮1nhn1`84@y@uh|t)8 C~#( =~.ǂ%l˰/CLb81ǹ "¡86O^h3S(O3~w::@5ttR!dK'[-m5z'gabdbzm^4kF~>_b#2-y6.g)㉻\Nkl+ YNFc&25v3)}$'LPQ8T]GCǡr7'hXBV}99J9V*(Rz'0uN;VsRCA96cK6%N!}Ah! Ԅ-fzq@pӥl_a5~yxbXhkb'bqC8TOr13!} im#-16~Mڈk0@ 8H0S TTltNQ_6U z1ӻß_pB&k}j (p윶;5XШ"E +lԊiclq_4NZ2N/߸ŷqbX>bxE`Cű`Gۓ./ acu[\L{V55S0^2nB]͑2qRl&'3SM:QThfjf'lt1ÞCfBp|brrҌ@="|K C;CT>o׷O醚oPV?o(>dG'U(t̀5)}%!$okw4ojK󋥾e'bwθX, ?Q| (c x(&0S[jŽL4(R@Y  ϊFS3)L=3ZciQ{B]0mw%Sa~OMT1c2ߞlt:4{i;C^ a jjx[[_2ܓ?zrW>ي1PtvI䒌1 VXS+ [=86%]ͷ zm2}L??=|bX6_pmf]L@Q P)8bɌw6Z3h (NL߳ldNf6W#[=9gg~.P;@!ͽflܙgwuivҶvu><_Ч軧W; 2%jx}p?:މ>GQxSnQ>`DCHTE&o0]߿zu/[,DzbnMS#3f„# #c {0S3 v+ ֍Zgښ>P{ƉqOfR9z.8vl'.mz`gk*xM6[NTw|P{p)i}igwSۏOKemsOV{lM_^_6+#@т{BTP#NmVdWy/, bwU?7=:S(f᪪Щ0UHC X(A0W+Qu{<̝HSj5r#z4(.F.ڍ[VgҜk%JN醾~c^e':˜z nIs{G>v8VqFN?(Aıܧwo{|bj|bXAPts7KV@أ0hdiF;iU b #&9GMwV pgNP1'h@ ude\_Иϩ''ߧ =mxKY4ʣ?=ӿ//\ OY}O82=s%~ hh d 0#@Ў{XQ/1e}TƗ|kblܭ,tڥ^vxڏSNTwȆ69،BÎVEKLM}k_n+/bo'- v7WnӸ^<žڒN-vf)iXOȊ~r0#haS ;θ#2~̟§?Sv!7Y)BP0SVZmփz67Ջ;>`w*0\Ǽ*ޟo_o[Wj+'~vbbW%s{Z<}dLu]2 m 5bͼ6&N?M+~sVuzuHr 4q9iٖ+aZc~mgm/e}Gw %h(445ı݅$I0GDfVUGpco12uwAf-)RwF{栥LQPin9dQIf%+5rG>oѿy:惷Ǘoƣ}l6WLl6R<~UM[tg%,X#LM@\G?.hkыLX{r"w+NA\|\~%+W  O MrGJ&B3@x(/'{bzzyCAAEQ9qB*BDb$rsy%N{ ύhIJFdyd g7&/_o'[_7_m?xnl^1fye㯊Ë_ͯ|Wo<4dj #&r /i#94p<@'d#=}$gxkv7Ln>2vݲJ +\;vwnGBg! WB7I .u"s"|gzBy0 (r}=P#0OFtZx6o];^zvo\{_U{/?r>z{l6ڶl6?l*Ųp{0n[NL3`:}"x yY q"*FT4N92.\?f&z\#Y=0<^#L[vBֵ9 /9VBJ(|}|˘A@BHX#Uؑ{'B9ϙ-X#' T/{?+i}ދ_O~׷o/>%ܖf[ N'/^8l6Vl6qt4ٕǦ|,G28bO6 y eNi۵hO~uҮՋ`r-B&\PF .#ddש7@EHv]=yY=C,/HH'k$@t8I,>f 20".MZE#y;=\}ao]GRzn"T" {~&:D!Y ?Oa)K(/r/ Okz}XW<y"ebs9D u #Yl77@/9wo۷~Ma[D+)Spkl>[[l6&صfv.0?rEG'yٕ @zؽUȤsa)X  Q&N#XHk1I=y=&,'Ə(wHxM~"T=Y"G_>I. #1'rvɑϿ΂0#GTЈZPDG~{]5=W>|;}|ƃE1niɔXzR.Kq];>fټB3>6Rt2=~l<K;6}h$+d'3- FhX0K#NT$̘} r $L{}. CCD<,@Y{7䡮 E"e@ǁ^Q1}}OCkj:Df hUSOD#fb =]|>x8=҅LJQ#֌j)0LK)A{9E)Lfy%Tf 8S ExV:OؙꝨ8D'׬s9̝ Ka FMJ'& ܓD$3pZ#d 0 ׌7LG"߱ |JH\`ySԛ]PUD$#9Z|LX`kzVJv KG(*H|J,?b+g_-XOwǖ¥3 LFѻ1-nYuk~Vwl67~f,ŅX:n[0`ԥC*`D%'ޑA}2ut$2$##8ЉJƔ,3zIGGs H/$>x0a;ůQ{"D@"互Qb} sOzrZ|gSXx~gyI_W8|DKK~WX_W5.^צ TKݲà`Ex;xc)ň,< Vjl6jl^ 3}\CJ(T0zwxttXr@yxV=vg uc-NQɁ$J$e6B | 3a^Ή@Џ`_H :E1|Y:{듞ȝqm>?JG樂4t &0b@AB XhD? &˟>|haxp/㕨#PZ=f28FFٻs> ?7fټBf;nw ;R, zѓ%vhԏ|(s\Fv$NrH/Ӟ6;>q,, @5apJ@&7MAޥ2%Rt_ U /e;}ZOty㜏XpBgPxLkO)> E;hm8?%V='.vW_BD9 0x;Ӹnz:vp2"2͙y6U_p_vʿozP2}&3e2]fR)ꐩ-3E!aWޅfyTf Ge(Zz7M=YmWYPNDRCy#K6w,'z'Ú+hhDRR1b !aβb"S"!_2OKw;E% =RC ,ĂJ2$6 k3,u4̟sT §[&"QgM ~SyZG;z9wQrDx-Bd*!q!qDt?3ݖb&l6W;g$fk L8:xԧҚc)PTN =}'ߵP0Fr@r,DrXd 1Sv$d%+:@GY3]d棱#)S(#!M'U?j+?hwz9S2P"X'r&(D`B/&?*CaїǮ7xrz1$dOV5"V}Yi2fX k J)uuI9!Ӌaݵ4g61\]l6nnL+֚i,INZLZ O7 KC}bT]}J GZ%%=VBvĈ˫1F& ~"ߧ=),IZuԆfcȅ%b0>wwv 9>dY`ڑ~ZKJ#ZeO=Áp_31оA YM}n.odq7JQ3ŲL%ShлDf( ULxJ RLCkl6ζkl{Ѿwa0p^bL˕ҫ8"ҨLr: u$IP FD#vB"{2P$?YG=r&Ӌ@У9^ 26|2jG+zpv$?}ӏY^NN&O[k8f:\RFb@S>5#oNOq>~7|7.}x<N2 J(@)J)"SU#5*GAD@nqp,`i͋񲨸l6l6u'D|xCIhȂ IBG*Y+ H@Y3e?&D+dR 8 xGWE^yK(7^~P3's>Ɋ5 QoXS1숂1C3L=C[>o>}+Qĺqa\4."d!fdEHB0(( }ܕE1\w]N8=f fGW٭ I'**4 R(E&IͤVB=QO>rzj<#t$ K#1w@AH -3DzdCsEː{eѾݍ_bAxFSi1^9)%C%|q7?>ǗGO?~_ y}lb? vàDQMjU2- "Ka-B"BH.J}`"SNjGܬgZ l6W{>Q&l6UdbYл\O'y8+.KQ]Kq|$Kۖ'S?RGzH45d!, }x(đaG mCdAȂN1'P \Oo'2䉀Ӯ޵KH$:Ca>"؝pR~s(xd7Qpv܇pM>9frx".bixM\ tVOŇwwN&e2SRjtb Sf;a@#|=SC uUX^fy `l^e72Elݲ"]k2Qu$Q73~(7E|MB*Iv*q !{҈d! : ykD8Ȥ$5 ?wOFWGEn1CiR(~~OK4TttzO=Mo‘ؓpI&GL/pGЏ8';ܐ/Pp$x]Ve1ݩ5}Dּ>vb_,ּeڡypclFɺ5J"X"2M`XѡFhv9fz?l6aYl6ͫZsDdؚa&w,DК@"Rng@Br;,NM7mCwo8Sf2XT*C{L=Ruwd!:duίw")yY RJ/ǟ]5ͩ2CD"pKu^i|R,y0Ѓ$v$Q#qC@Zu7~E^ŭzA`f\䲨kA2OKqh)Bؚ]2e1֚,EY9bsʵ!30EXj`@UՊf60 j4)ӮqtPC)ʺmFʺ+kӤB&("D9.|ilWaPx't4CԂ 4:YIt 7^B& <%gA˲n)Ema*!LRaCџs[i~"Hd:t -a rK-piK|h9~02/ʲ(,)Ō=)nݲG-ӘIVOp*žeKa]E8Rnq#z."\gjbµflfd: =JGدR\o/0 iݣV)#D)"ZE) dA Jo0&tPWj0 wzmhH0đd%I$ :lF- 5C!x8/ˍIZE:y![2LF(ڗwou}jsQE=fOC+tJ28 ˯I(x?K{7,o%85d:N.y֑by-HL0zwf_iRyn7#A0RGFd*:*"Ր;z qֻ#R(ł[l6Wo6UP23X0Ō鴾6b-H>NZ)ngJq;9ݕ[WY>x"^ӣkmRFo̝3HY I I3;e~;DA,lh>gKT #b4Bܱٳ9Aق ^x$ؿ^|׾Z>N1IDwxwg8ԟFi$z\{K8r-WWzc kskZ)b,*p]&V瓰pc q|3]תAfIf,l+ f3-}R2+Ų;0Fm/뱻"snIhM/E,ZdX7|X}~` |)aZ531н| at?g=Q:1Jp#5 QXkP,6KwST9 my6G@x(ɂY藌f|_}w`yU}z$3Eݝi lge-@Ȳ(ŔEN&"m0V玷"eDs.Eܔz}Tl6WfyQ?aaX"G9:20ϖaJ&3EjkV!33m2 Xk~\\-πeI׌#3p%w9 a  JtOB<~D*|Hǩ9,^'l߰+O~YxG9q$ I+ 5e1N)y`ɴ/E&wskkU#ܕv.~0dz#SoMD)z5 K5Jќ 1Sdgl^1fټn[Vu}cVq)FLG{wAJag)ѡwz`ޙgѻwŒ w[(ov٥n=n^~8 L2DYy+"Qwњ#YA."(/O.O;o}$@y4+O>T?rԻsriIKj'F4 J~|/(H deV@Β (,AZ\T:>eeu()YU jdZ0}#(+J$J)畎@Jk: ZDzLF8Z ./eqWysQǸnJq, YzeeN w{YF8r.oqY4f {f*ֈ,*ƩAS=3֣qv1R@FD8fU'ȴ:j2Y6G8n@"[ens).Af8E(]""Rȴƹv,Ԫ+: *v#f l6ͫbU}&蘐k}x G~B~XJ؀ښsᱮD(ŋRȤֆEϪp+[kݍa:hxKeYӇlz#Jw[͒D#<&3zB @"xYB!c^7JD#Qr ,L#zg VuKRd2Z)><뵪TXS)Eyn~z熶=u=*k5,0OUkuS)~>ٻqZLWdRr3+!y8i\JqVfy hl^?i͗=s)R2-W~k>ښ@G y%$"d)XP SbY $B[Jkm Y }m.Ayȩ<]I, 5\~( ϔS."NEcgGj90EPsEyu-{H:;DX iZDF/<ܓ'{Ad 2s>B!l3yjΝɹw*`|YY +kZ WUY{{ǵV"HߗD"x-xyOZ5[dXB0\h]ط*;J; `=۩rnAp+Ү:N{߄ ւd~qN殻81AKn#&ڥ秘1q͘q] y8b2֭ KΧr?p:q'u׫EqLBl6uwQ DA[y!4,W9zt;cf4߈' >BCsηg~+AVyQ伫; Qբ5^g̝9F9 &1W^sD"j%H$^&$7sQ*څxsG\jzҺà 3Ϲ9 VR3qmz'ztga?CZtLZ \Lʷ6sMԷgX zoWȉ<̵E.ߌ51vE^+^-m|ubH=y$!O!!!T̛-+b41H1<R%H$^k:l;y8;00n@oonE `c!DH1E4& Hb"#r%,sup\A)2]U4>IX9*nkahYami+C>stwȜ}/=C:L.=b j!E H^.5GߣFnqEy[WDbz 7!U6m(؆|핷s0l] i~YhdH(]?D"x%J"H8qɾb q;}oc5nಹy{"39?!@ЬH=Oh{CU~μuеz I9&S }e?ӹ-}< Țu =@*jȘD˅W+Ͼ&_fbya!`T7R@6kl0ƋCygye6!R}F OLE^]hpϭ"5)B=}DCoI$$ D"oGH { ;Hx7C10Y ':kV|14C0he\W]ɼGpJTɕ`̇V.WbY>|[qo6M0 Cd58{b?*,moɈkVQkDB&%߀}&h̵ ê$o,yZ5:ǘۄ&}ܔމ(B˓vSfo);4t<::U3*ͶK輿zFs |gEQ;7[0!ƐmlT l0Q5'^ Ugy*F [rpb,&뵒 .\sM ([m"1w{Ndw*_㬾"wyvz1Yt_"M'~G9 rD_пFχ$@z@DánG&Fv 0J1^\`.!|bw J<_.u߬$z@Ttcz}]9 n`Hn-u'A5)4hsձX#TB\ z ӻ*LMQeP//fn!NEh~T ^"7ooDk! H"HBn)[r$/)G:C!(Y:^[kT50V.ty w؏„@k7J<ȀD<(.Xx!f%p/JF1ɂ︳' 8),J&7YXgQ2H̶wC; zx{j !"A;ypxG'N" &f2(ꢆK"H|]$I$ 1ZtrQȸ6" WݝZfXz[Z+#dĀxk$\1*/I1\-  a]G$5t+o X>!<0%myߢ`""ObBMzkB*fy&q"ʓWl+`s =2i_K?~=uOx 31VH$_I@D ]٩'ͦ[Hb JN!h Z<![?ρbI7j(X;h!!w炬Ʈ B^|.YTBHΪpj^ 殔\a8ˍA6jX'$+(,2L5 /;ݷ>D4L<+^jk&!ݯ x<}tTªNߘCdyT)Y{(ax/exD" H"H܎DzQm> . 1QG56'DF =ue8qND皮\B,wU*sBsG;\t_ƟM>t/Yi1e_NnfuY% :' e^ #n4 ͜ ~yCzF?VL"u@/ riiuB;CHEd+1Q.сcD 8ϡ!wy&Ω f\D LXcfO%H$>$D$޾l*_×z9j>%c.dԺ*4 vvR:9%*39Y$j4g q RA=ˈߙd @/L+ųB©a% ^,e8kzj73Ջvl>tG;ޯVPM S$he9Dz|pX̐ kM=(m%nWF0< lĺ7؆lnV!rç ${q KݖGdH<_D| wWB@(U^" "ȴ,/ D脶 >yT7H$,HH$|=Bv+՗^ yLL2|@82]\ʃ^k^n߮8=Mȓb7) q᩹-:-ˌ* (g ؐ ߩmc2eYr< F^.wJ8ˤmBh{:Zy,:M$;Gc"OřC]E搛qQ k/qy}R_%z97+D"CD"x5DuC;Ҫ5$ CFٹAzZ@ oXT^QɈz]C 1O4ƪB/8F&U*j!b|8em2 e "!$Uotk %GH LJ.B;\j+°P*C5|pf<<;F(6"$@"4A*Q߶y<;JCvB_=,u"H9$H$޿cs8E_Byxc~V-c+ ie5I`aq:"= 8gnPbr:c P>w 泺i/EB!'~%/!f"5 U=bUTUIbgBseͪw 'VdZfƂ]AF|rs¯z83XL3uHdA" y/D"˿D"xxD㿡 :M\M pTm&Ն!j F.|Fͮ8$X y r)NȢH\_ o d% =;F`E,$0 J!Q{x6(5zqT -^@L>brp  VaY½!ٮ@;Dz!σ̘xsv"(_P4WgSQDD4D"xK"HV<y~.?mDUBqakyaX؊A\K?9T^qBU zVr?Xs4Ar%X/3YC׭//YS@wo4[Aɀު!"@ N߹+?/y2L];y=J_*;(VG1\amA(m"%$+C>D"xH'tUI|qW(ͱv R^vz5 cL:8pQqū 8˻qRGpsg iAoU|pzh7;$i$ޏ/rqx'8L! FM9 o9>(Tq8r]r)\WCz+޾-{4=nialB3>'q'yo+t϶~'lt_=Fe^GyJB|;? RDςI$ ߪgD *'uQ*)Ś#z?d7 }DBa1%NM{dUx<(DnGȕ 'r?HD!s{VybIM ~˪̫;Jz)Bƿ.t?#l"S'B)Jد-;^ʿ@aWUA^W׮湎C\>W(!˸3zd UT=ߵQ$uQ+ЇUC 9]#s".®8EZ$)Cr(Y"HO%H$^-jՐۭ#/ %x=0kt  c<)A JCQsCFDl+qmYmq]l/gz C`J4>ʰW. ̦DH^9վޅ~PҤV5jX^ 6 BCW)mv'oX kh%3<5b_sCG]<ϪGG%7xcqH$^O$ N`b 279J@O %| yw0^T!"#\NnxBnYy> >=L*OTҪW +~_ wǤ 73L(%A ^ζȉ_ fwǸV,J?ڇq>Εި`M>a p抈bB&z&*:oX`YWsmaLB:'xn_QSFňu^FEޣH$ J$W}"l q 11!MP&seq R$y l"C$h䧨$/J\{GHHW F8QF/eq" rZL@j>iXmVYxZ{u>ndVWu/w%nSq4"Q/[4h ᾊk"Ob"Bd!7uB߇xK6Mr)Eƽ:o{X< t:գ~{4kE&:E;7l3ɉ΋nM8zkz:IwgCn!3J"[u'o'~ksUb%D/$ D"Q5Y1>v+oBv$4kak%_ϰ!Y;I\^ &Ƭ9}-23dc!<=DžlbCF0&C6"!8{a`׼\h}\ : ͍$SrVߔ 9Z=/;ٮ60R՚P~XWLjTǼ{~ st 猵]L0x{^AaW-p32*U5Qmcs;މp̬WI߇l@NΌ7.D@D"]H%;BH+MS ژxsrB61Pz@d"&sH%j&B,zțIrxe^!iƸzRw!"2j*Aケsr@:bdR1㻺_Dm{fA΄aND8ǢqY2/ Z- {JZk}=$ &kEf"J՚?BTp?-E6>;!G3J*7m"rFD"$H$޼)aFcy;MA&淡 2[]0FN"߈tPewQt(t4ͱ[uvȏ ] C&_Q<*'] G7Yv7քܡ C܄lܗ##>9x$Cl7)Gf1a˄z%ׂ`4tbg\=(¹D4/4'm=: ϐa#H$q$I$3 HWr  id"R pH%8 =th606e,C.0JpM奰~#H0Gp``R5s&kќ!D3Z(o ZqM+:O} Fy>\F'q ~yz L;dz7,Q*`Y?5ؚuÿLN{MSz};8د܏I>W+B(H"H*%H$aD]Jl|"'d_%_ |Uhk j#R34[¢B:RPg6Wl\רψs#=XZў!"y2Z}uV<h=b{qݘ8 čsB\%l,"({ga0!_H(WBWB1 eƉIuwxcֺ JF4ʻ1 <ź$t{UsB:p-E$u9۫ЪE'1VF> l@BO"xOא;  }3Wz%" UCF}as:m2 `{?M>>/ 3:1yB" <)ȯAIw%oE̟to+}g-sI$o I@DBya51̷/0c4"dEH21&w ob+N<^$^ A_ ^/`cM>&%3j)9 #Rs=.1d%a CEgUBZ] "k仼'Y]c'ģ_`MD ܋5DƄ$Ƭl7"oFI.ug~" \ >4 /#9^ &'DD"{B*p#^^poH7 1nWD4Fy$ d)܊ps ԬnǨԅ}g35c ܏<kÙE ZyeyJ&'1GD285)o\'GDU8nTШwu]<;WJ x9)i5 /I;Ta̼Ȉft59d6D|N[uVޛrt zg @J"H|sHH$|?A]au 1@DT\ 5eWjާX/B B3(;WCt^^{NF0Ękr<8煇F騆7{ eKs@3D"4GBD>1uө!C18f繩Cp -!<$Ȱ*_D@#ד^l7aTοY'7!kC)%B>* dgy@n(I$$ D"tFs ڹ\S|(A$DҩR'2dQR^".\kU[ì5(ڡ_5DE4\oe}]eLO] ?%P+倐sp =?=H5dǺgOREnW{cTUp_ޯ:s@}*/#E95xS;<$yEn%H$9$I$K#@aHo1cƝzY0ʥP;F҅MGlicrK/#uvh;!EINoDB{YVbPB{O Cr;%7z%Yͦ#}} dnC$G1gVKhZBtY 4M:AJ0ǁ"n듺>&>/۹"bxFsn%"V2񘑿Z85 ⫌ &LR}J9RКQcZ-}n-bߧ@ BQ@ T}7ŧ&o"?yļ'k-B9q3UzXŔ*LL&6m _&gZ }.! uNF ,fvtkabLV9 rPechbw]4~q!;ysEΌ9<π@Mϑ/ysaզRg$x jck'ڎ9u-(CBN͓b $MV^I+.@ Gd@@܈5+jU[N(G|DhPl6p6|Ld22⚩dI2QL8?|kǃ;Wh!Bc1~tv"q4Xe^.Y0~uId(߄Ɉ|:#5z͒=!ףy} "&gZwkxF] ?x ]:kے5(âDץjtuqu 4 \,?n"K)}j2ubPZUcm,d^~kL0wTl12mW|ηYd@'2"իK[_EFneא~G~gV#u&2fkv}XTnW-GSbGgN3 ,mXX}ԌFPٗqHz&kkk,QF  'NNs_0gc2@ iA>p/2a&oiŘWp6V ɄzΞ,勘׮gEjnҳ+k/6=&1d(6vM9d0d+l7/iN9_}g Wug0 q{t} |mw.>M\nտf>gpk/hN>"87+Y{z,ُռzW<| nIS߳k;Ŏ 6k[gBrJ%Q-'g3@i@GГ$A,>W8+6ϾL魙:ɷ-]Y:ߐt=A; C|r& ߨ-Eݩy\R}KǞ 58 in@lPz/s!75>Xw*H >Llj#dnZe^7d4nփ}@ǭW|2jOu&Kƿ&@C D:2lluV{e-|L€ܕQG8{ᯥ-*R-+kBmWKgjɂ +5_}e]_.z{ZO|Y9O>w)jY.U q9[\|p뫌k'Ei#ݘϧ.{3qȁT ΄D ^Ozt-Ld3LSڸmbq(Gl1( =>ZcX ?R$RI{'>@ $l~lQl )~%?9cA{b0P"/B{$\#y4ӀT.! ݛ܉~^YaA-3NEXk0L a!],<a:kA8d7ȯȠЇayg͜Lbx fWb:ֳedZ򐋖&mgzLt-Ic$cj`̵K8&/ϯmd' GLAnRr|?nR_,@ߧ?#7"$ 20 |)0Jme&IOY%3`JXz5}CF`KdqgfU˭KKb ȔO=|Rt-HE]ߖc[zAFxW_3Ͽ*Y~1g=FJLm]!!ql~/ßէ^W.΂@TXkP!GN[3r@:c ߗx&&ɿ]U34;gd@ߨw؆g!x`.7Xɀ1;  ; xYi:.y⚏6zdBAV8RL -GLުP;gcu7d?<{:e2m A@@khCYmx"īThmGy.\^7s22TxRS78֌h.Ԯ4vZOC!$|B2geY'޷/YRy=0!s38WA*(W G+MG?i~"xzJGxN]LKY1_o+2ɴ¨38|]QNFz<"r$5V=)|9vt(ÀMgV_(2!8nOB!Ϫg{ɉ]mE]Kxa-bﻴ4xzhd,zZmY.4W3YaQcYnjc&l'rّpGxʃ'Ʉo$QzZ^ىϾ<_|1"_&NiBE`MzW'_q\9c3o8Ve=;ȎFTѠ8E7׊2~=^ĜL#3'w{R䎩<eLN;Nh$1On 6cYPA l\UQmcՌ0Ō@ k9 ۮ~ (̏f}߈_L>|/j~>I (>>>=jwȊ@L>Ȕkc0B<ɺh|Q0/@X7j[dC>+gd+&@ H vt_oFsɱ,6 Zm.G@zU+($cFD*o!E'BJF-O{l/mh8[г1gQC𦷛6m!L58ˎ]or}g3k|kU Zm!k\bjL*|_,1G}o:GM^" ȵ>6S !F/Gy*n{V6:~5}Y1*W]yt{V+277Tf-7W9"v z޼I@ @ )qmW7>ep}k. fLΠ _/p}9Wl}h4(akx+]Nml',\2Nw3 -6(5_W̴)~m嘔?ىYw#^XliǜׯӍ-wMig_(rNA4ƅVKN2b g&4Qiqj4vVڭoC,4jAAqPQv* :k"`6򉂄 Z~}X7*l^,u_1t}ϧAۖjٙ<)ksMC[ B6dxcˤNj^|ob |\-/}, Я0ڲ$f:57!d3XBUww H&[흲!7@TLB\. r2ʤm傍\<߾>,}mWx٣iNk|^3?@ $GjI+#T}'g?3:9r23?rEۄ{_>[x'p<@6o^Hϸd$\Cce]ɹdC8RĻl"|bmN0@L.\ڳ XXOʕ!! QY%![,idHȈ8Sr[&4b*zƳn.YVG{Ȅ_=b]5L dzR H .Q]t]&;6)D-HR嬼Qdo8>Edtdw"vN Zb}΀4MNݹMIE4EY5D- )$&Ei1:iH3'n*`v=S9je"By'CmH &Amt^so4vO$dgpjޯXքt&Ƌ^=|p$Y ο1?P,:*_˚1^ʏ /ѯ J&d~ *Qi @g1"{W?vؠDV#W?OZY~?I^pR4zG.wꟅ`0d~A8Šɚv=bͺ~CegRR6cR~#|򅈬,x_yLDzow|VG^~b=ٸ\kvUnn{yh֖PcU/i2/yO>3fJL*JGbnjxhN~e@4u=Fxߓ"5ֵGn|!&d%}8QN D2BVߟ "?>ٷT.dݱ@ d@@ FY6$ͱ*K͈-R5z+f`BXn۸抝8VECsӤz;B盲3^h%ٽ,BUDϵ)?_eE+gOhoZY~x] G dr9{?V{V9:#?7 }փƣ<Gmַ]7 &@ ` izU$#CxZ6YPYN":U@/dFkք̀x ڐ-Z\ԋx(ңa>E֎ʃhz, ~*%)jI'pwB2ʦO\j&?_"+GjWw\=L<QQ129m!$jhN:A/;)+*w ႃ{5NddO q@ Y[Ѧ@ 0 @27 2Aր _D胳 k7$߽8G}rYky.!5S:u"!cʛ!">5Yk|';j\{ ްy/mkT^Wжs0cᘷ1fc+GrEjg*6^;ɀ,AF愂[%]}HtP\P}{L:C !$񎾞a 2L^@@ <}&!W'okYor+=n~a l ~y쀀T"! =G@py^,  ~0h+jtsޢmDwg+[?G,L%>e|:ӱOۆsod7Q\j[dĞw5vT($>[ 5. bs?y  :kCj^J;׫JJc#[Qp/ -߼ɛHZ׼O'?PgwkxLl֞'ֱ=~ Xdjb|'yKg&ka^%A ksaAnzW.2d^s.Ry$/de(8XI+t*oX'vK "\7[kln|lUlȝXɖmMf'"&E2Iyv_'"sV6!t ˒NA M@3|4Fk=X~R=@ H λ7c]kglJHz߂r;@ًW]9M>cֿg55:'yl|]:aܩknwY ExxnW ?*V.|V a8Ӗ?SÃ,1ւ(r{2[D$@ $:W&m_;h׾zlG*c֊<0GbIւ@>3,:XjU$C#{uR65Q(q1kٍoWޠd g5w^$A=7Pɿ=. -dkv!Gq X[7?Qj;YuG  @J+uvcm¼E[l9fVq6wYTO~9Q"r#OF+8ֽʝnSeAcݟ|uu/%d=ʶ7Ygzk=;qP=v˘s¸j+E֠P~锺Ecſ׿Ӂ@ ˛qL]a~ҟ->.72X}9KkGMTZOko\{PٕXhQvx,\^. %E횟[NA;2{0WK<,syğke"uBu&Y4TiO7t6">BUFg16&&D -4l#?%?-!"}2>զ?hN<79{_ nG~N}C<7aAjL㙔@>܆\@ N_|=֪>i=Jح+٠~322%sw+Vȧ !kZd $dvq_9Cҩ?Y6c^{48ʷc\& F$?ll4BY;_wV"bHBNFT.n`c{d-BNd;Ȥv["!&gCG3{޸39O&̫}1k]<%@ޖIuA&oy81| =?i۴WʿV+Lu1E!Bp') a#fg`q u]} 2O ~zjOnFh5B4"pA͌xd90#s(ǯ|-SɆ}kvId=d{"@ |"@ $Rw]Z ٤l<]Q{yWXe8]bazG"} RC&"? ,`(D>A5'$6ϼ Gva|>g;3hºroCm4G&=z쁵{Z~pF.uVߌuX-F 8 H j#0|,k'nRhX#3sY_f9nR3gBG[DtYb;~ᛱeT3EնK;d0grQ19^YGϕwg=kO&f< #~wH`q>(A\WaK*"ǯR4lsηOf73]-…8{Nbd3F猎3Aj 1}oQ!'D&ɟW/>} 8#L@ @ dh@(n |{Uns& 0ku|HcO#m6'Ȟ IFo#mȓI5|.b-3x9+q37\x,_7 AِG|*}φÙHIFAHLX'=k8Krg3{1992ُozkq -٘]! sà/dLlh;!y`T9ZXY q{&@ X@ knM+j/zu>|ԏeaHW s@ήxǚFkB.[ȴl)DZ-gUkCY kBUcϲ-1&xhN}Ưk^{W!y|TT$l򼞾@ "2 @ pf@$[ ,++-+KrS0j/mf)~㍟;c=oi$Z%v2lIcύGHd Ăߧ[ӣG2}˞f/p@ H ."䮪@_'g 9py9@LXbo,fשׂ 0hւ5HK}Ul݌4u#&1=m|wh\N dhh{ 259Y}`UK~D#q o ޸rE(צ =D"7=lZ0Ƅe!V4oRlM@DXٰF.c~ovrVaaj SѦ8q}@ Uca ]؟DbOaCt٤ BBv۶=̬d#}GuZku!-kB`3 Hޕ* &og5QuT.* ?d_mdS5stXkn7+unle5mUVŎZ.9ng[ٿ0V0rrojg>zybC殮2{a򲟫 R E=sX>;ӜF*gIENDB`libvips-lua-vips-6959cc9/example/noise.lua000066400000000000000000000026111475211264700205610ustar00rootroot00000000000000local vips = require "vips" local size = 1024 -- perlin's "turbulence" image local function turbulence(turb_size) local image local iterations = math.log(turb_size, 2) - 2 for i = 0, iterations do -- make perlin noise at this scale local layer = vips.Image.perlin(turb_size, turb_size, { cell_size = turb_size / math.pow(2, i) }) layer = layer:abs() * (1.0 / (i + 1)) -- and sum if image then image = image + layer else image = layer end end return image end -- make a gradient colour map ... a smooth fade from start to stop, with -- start and stop as CIELAB colours, then map as sRGB local function gradient(start, stop) local lut = vips.Image.identity() / 255 lut = lut * start + (lut * -1 + 1) * stop return lut:colourspace("srgb", { source_space = "lab" }) end -- make a turbulent stripe pattern local stripe = vips.Image.xyz(size, size):extract_band(0) stripe = (stripe * 360 * 4 / size + turbulence(size) * 700):sin() -- make a colour map ... we want a smooth gradient from white to dark brown -- colours here in CIELAB local dark_brown = { 7.45, 4.3, 8 } local white = { 100, 0, 0 } local lut = gradient(dark_brown, white) -- rescale to 0 - 255 and colour with our lut stripe = ((stripe + 1) * 128):maplut(lut) print("writing x.png ...") stripe:write_to_file("x.png") libvips-lua-vips-6959cc9/example/soak.lua000066400000000000000000000012001475211264700203720ustar00rootroot00000000000000-- a lua version of -- https://github.com/libvips/pyvips/blob/master/examples/soak-test.py -- this should run in a steady amount of memory local vips = require "vips" vips.leak_set(true) vips.cache_set_max(0) if #arg ~= 2 then print("usage: luajit soak.lua image-file iterations") error() end local im for i = 0, tonumber(arg[2]) do print("loop ", i) im = vips.Image.new_from_file(arg[1]) im = im:embed(100, 100, 3000, 3000, { extend = "mirror" }) -- local buf = im:write_to_buffer(".jpg") -- im:write_to_file("x.jpg") im:write_to_file("x.v") im = nil -- luacheck: ignore collectgarbage() end libvips-lua-vips-6959cc9/example/target.lua000066400000000000000000000005721475211264700207360ustar00rootroot00000000000000local vips = require "vips" if #arg ~= 2 then error("Usage: lua target.lua ~/pics/k2.png .avif > x") end local infilename = arg[1] local fmt = arg[2] local descriptor = { stdin = 0, stdout = 1, stderr = 2, } local image = vips.Image.new_from_file(infilename) local target = vips.Target.new_to_descriptor(descriptor.stdout) image:write_to_target(target, fmt) libvips-lua-vips-6959cc9/example/watermark.lua000077500000000000000000000022511475211264700214440ustar00rootroot00000000000000#!/usr/bin/luajit -- add a simple text watermark to an image -- ./watermark.lua ~/pics/IMG_0073.JPG x.jpg "Hello world!" local vips = require "vips" -- uncomment for very chatty output -- vips.log.enable(true) if #arg ~= 3 then print("usage: luajit watermark.lua input-image-file output-image-file text") error() end local im = vips.Image.new_from_file(arg[1], {access = "sequential"}) -- make the text mask local text = vips.Image.text(arg[3], {width = 200, dpi = 200, align = "centre", font = "sans bold"}) text = text:rotate(-45) -- make the text transparent text = (text * 0.3):cast("uchar") text = text:gravity("centre", 200, 200) -- this block of pixels will be reused many times ... make a copy text = text:copy_memory() text = text:replicate(1 + math.floor(im:width() / text:width()), 1 + math.floor(im:height() / text:height())) text = text:crop(0, 0, im:width(), im:height()) -- we make a constant colour image and attach the text mask as the alpha local overlay = text:new_from_image({255, 128, 128}):copy{interpretation = "srgb"} overlay = overlay:bandjoin(text) -- overlay the text im = im:composite(overlay, "over") im:write_to_file(arg[2]) libvips-lua-vips-6959cc9/lua-vips-1.1-12.rockspec000066400000000000000000000031621475211264700213200ustar00rootroot00000000000000package = "lua-vips" version = "1.1-12" rockspec_format = "3.0" source = { url = "git://github.com/libvips/lua-vips.git", tag = "v1.1-12", } description = { summary = "A fast image processing library with low memory needs.", detailed = [[ This rock implements a binding for the libvips image processing library. It is usually faster and needs less memory than similar libraries. For use with standard Lua, the dependency luaffi-tkl is used as a drop-in replacement for LuaJIT's ffi module. ]], homepage = "https://github.com/libvips/lua-vips", license = "MIT", labels = { "image" } } dependencies = { "lua >= 5.1, < 5.5", -- standard Lua or LuaJIT >= 2.0 "luaffi-tkl >= 1.0" -- provided by VM with LuaJIT, use `luarocks config rocks_provided.luaffi-tkl 2.1-1` in that case } test_dependencies = { "busted" } test = { type = "busted" } build = { type = "builtin", modules = { vips = "src/vips.lua", ["vips.cdefs"] = "src/vips/cdefs.lua", ["vips.verror"] = "src/vips/verror.lua", ["vips.version"] = "src/vips/version.lua", ["vips.log"] = "src/vips/log.lua", ["vips.gvalue"] = "src/vips/gvalue.lua", ["vips.vobject"] = "src/vips/vobject.lua", ["vips.voperation"] = "src/vips/voperation.lua", ["vips.Image"] = "src/vips/Image.lua", ["vips.Image_methods"] = "src/vips/Image_methods.lua", ["vips.Interpolate"] = "src/vips/Interpolate.lua", ["vips.Connection"] = "src/vips/Connection.lua", ["vips.Source"] = "src/vips/Source.lua", ["vips.Target"] = "src/vips/Target.lua", } } libvips-lua-vips-6959cc9/spec/000077500000000000000000000000001475211264700162405ustar00rootroot00000000000000libvips-lua-vips-6959cc9/spec/cache_spec.lua000066400000000000000000000015041475211264700210200ustar00rootroot00000000000000local vips = require "vips" -- test cache control describe("cache control", function() setup(function() -- vips.log.enable(true) end) it("can set number of operations to cache", function() local max = vips.get_max() vips.set_max(10) assert.are.equal(vips.get_max(), 10) vips.set_max(max) end) it("can limit the number of operations to cache by open files", function() local max = vips.get_max_files() vips.set_max_files(10) assert.are.equal(vips.get_max_files(), 10) vips.set_max_files(max) end) it("can limit the number of operations to cache by memory", function() local max = vips.get_max_mem() vips.set_max_mem(10) assert.are.equal(vips.get_max_mem(), 10) vips.set_max_mem(max) end) end) libvips-lua-vips-6959cc9/spec/connection_spec.lua000066400000000000000000000033211475211264700221130ustar00rootroot00000000000000local vips = require "vips" local ffi = require "ffi" local JPEG_FILE = "./spec/images/Gugg_coloured.jpg" local TMP_FILE = ffi.os == "Windows" and os.getenv("TMP") .. "\\x.png" or "/tmp/x.png" describe("test connection", function() setup(function() -- vips.log.enable(true) end) describe("to file target", function() local target setup(function() target = vips.Target.new_to_file(TMP_FILE) end) it("can create image from file source", function() local source = vips.Source.new_from_file(JPEG_FILE) local image = vips.Image.new_from_source(source, '', { access = 'sequential' }) image:write_to_target(target, '.png') local image1 = vips.Image.new_from_file(JPEG_FILE, { access = 'sequential' }) local image2 = vips.Image.new_from_file(TMP_FILE, { access = 'sequential' }) assert.is_true((image1 - image2):abs():max() < 10) end) it("can create image from memory source", function() local file = assert(io.open(JPEG_FILE, "rb")) local content = file:read("*a") file:close() local mem = ffi.new("unsigned char[?]", #content) ffi.copy(mem, content, #content) local source = vips.Source.new_from_memory(mem) local image = vips.Image.new_from_source(source, '', { access = 'sequential' }) image:write_to_target(target, '.png') local image1 = vips.Image.new_from_file(JPEG_FILE, { access = 'sequential' }) local image2 = vips.Image.new_from_file(TMP_FILE, { access = 'sequential' }) assert.is_true((image1 - image2):abs():max() < 10) end) end) end) libvips-lua-vips-6959cc9/spec/convenience_spec.lua000066400000000000000000000110261475211264700222510ustar00rootroot00000000000000local vips = require "vips" -- test convenience functions describe("test convenience functions", function() local array, im setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) -- vips.log.enable(true) end) it("can join one image bandwise", function() local im2 = im:bandjoin(im) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 2) assert.are.equal(im2:extract_band(0):avg(), 2.5) assert.are.equal(im2:extract_band(1):avg(), 2.5) end) it("can join images bandwise", function() local im2 = im:bandjoin { im + 1, im + 2 } assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 3) assert.are.equal(im2:extract_band(0):avg(), 2.5) assert.are.equal(im2:extract_band(1):avg(), 3.5) assert.are.equal(im2:extract_band(2):avg(), 4.5) end) it("can join constants to images bandwise", function() local im2 = im:bandjoin(255) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 2) assert.are.equal(im2:extract_band(0):avg(), 2.5) assert.are.equal(im2:extract_band(1):avg(), 255) end) it("can join images and constants bandwise", function() local im2 = im:bandjoin { im + 1, 255, im + 2 } assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 4) assert.are.equal(im2:extract_band(0):avg(), 2.5) assert.are.equal(im2:extract_band(1):avg(), 3.5) assert.are.equal(im2:extract_band(2):avg(), 255) assert.are.equal(im2:extract_band(3):avg(), 4.5) end) it("can join images and array constants bandwise", function() local im2 = im:bandjoin { im + 1, { 255, 128 } } assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 4) assert.are.equal(im2:extract_band(0):avg(), 2.5) assert.are.equal(im2:extract_band(1):avg(), 3.5) assert.are.equal(im2:extract_band(2):avg(), 255) assert.are.equal(im2:extract_band(3):avg(), 128) end) it("can call composite", function() if vips.version.at_least(8, 6) then local base = (im + { 10, 11, 12 }):copy { interpretation = "srgb" } local overlay = (base + 10):bandjoin(128) local comp = base:composite(overlay, "over") local pixel = comp:getpoint(0, 0) assert.are.equal(comp:width(), 4) assert.are.equal(comp:height(), 1) assert.are.equal(comp:bands(), 4) assert.is_true(math.abs(pixel[1] - 16) < 0.1) assert.is_true(math.abs(pixel[2] - 17) < 0.1) assert.is_true(math.abs(pixel[3] - 18) < 0.1) assert.are.equal(pixel[4], 255) end end) it("can call bandrank", function() local im2 = im:bandrank(im + 1, { index = 0 }) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:extract_band(0):avg(), 2.5) end) it("can call bandsplit", function() local bands = im:bandjoin { im + 1, { 255, 128 } }:bandsplit() assert.are.equal(#bands, 4) assert.are.equal(bands[1]:width(), 4) assert.are.equal(bands[1]:height(), 1) assert.are.equal(bands[1]:bands(), 1) end) it("can call ifthenelse with an image and two constants", function() local result = im:more(2):ifthenelse(1, 2) assert.are.equal(result:width(), 4) assert.are.equal(result:height(), 1) assert.are.equal(result:bands(), 1) assert.are.equal(result:avg(), 6 / 4) end) it("can call ifthenelse with two images and one constant", function() local result = im:more(2):ifthenelse(im + 3, 2) assert.are.equal(result:width(), 4) assert.are.equal(result:height(), 1) assert.are.equal(result:bands(), 1) assert.are.equal(result:avg(), 17 / 4) end) it("can call hasalpha", function() local im1 = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local im2 = vips.Image.new_from_file("./spec/images/watermark.png") assert.is_false(im1:hasalpha()) assert.is_true(im2:hasalpha()) end) it("can call addalpha", function () assert.are.equal(im:addalpha():avg(), 128.75) end) end) libvips-lua-vips-6959cc9/spec/enum_spec.lua000066400000000000000000000026221475211264700207230ustar00rootroot00000000000000local vips = require "vips" -- test metadata read/write describe("enum expansions", function() local array, im setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) -- vips.log.enable(true) end) -- there are loads of expansions, just test one of each type it("can call pow() with a constant arg", function() local im2 = im:pow(2) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:avg(), (1 + 4 + 9 + 16) / 4) end) it("can call pow() with an image arg", function() local im2 = im:pow(im) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:avg(), (1 ^ 1 + 2 ^ 2 + 3 ^ 3 + 4 ^ 4) / 4) end) it("can call lshift()", function() local im2 = im:lshift(1) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:avg(), (2 + 4 + 6 + 8) / 4) end) it("can call less()", function() local im2 = im:less(2) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:avg(), (255 + 0 + 0 + 0) / 4) end) end) libvips-lua-vips-6959cc9/spec/gvalue_spec.lua000066400000000000000000000046711475211264700212500ustar00rootroot00000000000000local vips = require "vips" -- test gvalue describe("test gvalue", function() local im, values setup(function() im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") values = im:bandsplit() -- vips.log.enable(true) end) it("can set/get an int-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.gint_type) value:set(12) assert.are.equal(12, value:get()) end) it("can set/get a string-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.gstr_type) value:set("banana") assert.are.equal("banana", value:get()) end) it("can set/get a bool-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.gbool_type) value:set(true) assert.are.equal(1, value:get()) end) it("can set/get a double-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.gdouble_type) value:set(3.1415) assert.are.equal(3.1415, value:get()) end) it("can set/get a enum-valued gvalue", function() if vips.version.at_least(8, 6) then local value = vips.gvalue() value:init(vips.gvalue.blend_mode_type) -- need to map str -> int by hand, since the mode arg is actually -- arrayint value:set(vips.gvalue.to_enum(vips.gvalue.blend_mode_type, 'over')) assert.are.equal('over', value:get()) end end) it("can set/get a array-int-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.array_int_type) value:set({ 1, 2, 3 }) assert.are.same({ 1, 2, 3 }, value:get()) end) it("can set/get a array-double-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.array_double_type) value:set({ 1.1, 2.1, 3.1 }) assert.are.same({ 1.1, 2.1, 3.1 }, value:get()) end) it("can set/get a image-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.image_type) value:set(im) assert.are.same(im, value:get()) end) it("can set/get a array-image-valued gvalue", function() local value = vips.gvalue() value:init(vips.gvalue.array_image_type) value:set(values) assert.are.same(values, value:get()) end) end) libvips-lua-vips-6959cc9/spec/helpers.lua000066400000000000000000000024071475211264700204100ustar00rootroot00000000000000-- Pre-load the vips module require "vips" local assert = require "luassert.assert" local say = require "say" -- TODO: Wait for https://github.com/Olivine-Labs/luassert/issues/148 -- Meanwhile, we're applying patch #150 here. -- Pre-load the ffi module, such that it becomes part of the environment -- and Busted will not try to GC and reload it. The ffi is not suited -- for that and will occasionally segfault if done so. local ffi = require "ffi" -- Patch ffi.cdef to only be called once with each definition, as it -- will error on re-registering. local old_cdef = ffi.cdef local exists = {} ffi.cdef = function(def) if exists[def] then return end exists[def] = true return old_cdef(def) end local function almost_equal(_, arguments) local threshold = arguments[3] or 0.001 if type(arguments[1]) ~= "number" or type(arguments[2]) ~= "number" then return false end return math.abs(arguments[1] - arguments[2]) < threshold end say:set("assertion.almost_equal.positive", "Expected %s to almost equal %s") say:set("assertion.almost_equal.negative", "Expected %s to not almost equal %s") assert:register("assertion", "almost_equal", almost_equal, "assertion.almost_equal.positive", "assertion.almost_equal.negative")libvips-lua-vips-6959cc9/spec/images/000077500000000000000000000000001475211264700175055ustar00rootroot00000000000000libvips-lua-vips-6959cc9/spec/images/Gugg_coloured.jpg000066400000000000000000004071621475211264700230060ustar00rootroot00000000000000JFIFHHExifII* z(2iJCanonCanon PowerShot S502004:09:18 10:00:420220>Rn v~   |Nf0100  2004:09:18 10:00:422004:09:18 10:00:42 1   .\"  X `  1 "\@ 1 "D2  ',,,***IMG:PowerShot S50 JPEGFirmware Version 1.00D AT S [' R980100 (=\px5?qyO"1ehծ#*8/ӹ\zWg>Ck+ƆGt ʤ69zp45Fuzy?Z{FkySֵav*^E2^6c,Cilpzqq 2 1( hQXJ{c;_-ʁ?]P\+ߎYWSYLupčWx43T7:|SG8u ]]eʰDzry+Y$B+GM yl8*=JF9ZX92^A0;Vr3    !#"! $)4,$'1'-=-167:::"*?D>8B3796    OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?TTzR3S'?wnծ݃g*Ĺ ZĚd]4'1Ee=#4w-&3%@JE$IUנW=jy]uZ둂:o_mkҔe+9JcQ/[؂FFpz+;.kQ ^] Ջ׾s 1YW_ujuCagJ-A64\,ۜqYw3[Ė2k U,{ *]= ]I`jRW4凥hG*Ξ~Gá W|qX%ƲeKc$| Y}PI'ZqDHp'vZmi6%w\1+bp1\oc)$\uUF,O$7A3ׯaWu7*lEEsNL 8'qUӠ&8^3lLhWvNkt=^#NE{#`-T\ijU)E#I2ϓ:_@)'hVhzn 'xwv 34J`͍g"bf x<k٧Ǣ} r>cGW2 d-wt%E+pu"ob>&%@6J1\VJ o[ᯧi$٬ێ:zד- Ӿ$G gcXGu,Ht%ڿgQ۸9-.a1;큊']R澖3LH`N[;\_7 KVkwܡ$]cN6=n;K5fx5 $0损t?e}䁝=9}A/#>I^\anHƥ׾]: 6zIf;Mz+2tUOC/ F*I6am'!3YN2r+RU*u%( o0P~^8a^<՞ttB"Yb#wqdӶD/A67zTV)|ɍ&,䎂o=TW-ܣey:T6#Q7KEdˁ~T=MhĄK dٜsӥe-כ1FP\Ywsơ[䙌NO>NiJ㇧-1UBrbJW/#tX^*#1kRxjQirwb `\vV럛]E%犧vCz "{&X ڳ %eGb#wnH2R0WN1E:|LFt tJjW5ZZoA] QVg֜[cs}kR;h@sQ6㈓lDI-wM X{$f x>D޵v3n5 үtOQ-E\ Y ~5c V#N k)w3$hoZ6ER9ؔZӵ7V*GٔTXn($Nfc+fF H2ƕƇ{ҖjP2|k+K1YSmMb`8iFI 5@7GANCVJjE]/?XdWo@45{pZEͶM7L8p+˼YCxˆ oj*X O= _ !C8<-*Qvvl֖2v~~17uckgvSJW,l+OR ~~ߝ|%b([..g^LH63\4k2:C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=FM *G1BJiOJkkub1@?J](4{ݩΤZaQ+?PqޘgbWNH8ivG&]=+ =A39hM쭠#֜1٩6#!Ojwh!sOٔ*0pv֎a7&pAnϱ\-ؕvfPG+ct?{#S,)h=D!"ĕw(EOqQ5O(hjH~ In]$6 aSGuosJie;0'HV ҆@M1irh\:ӈVV _6p~ &Ot?;>x??V[+F;۷F5QcO~C9x3kW\zp*?­/]1(.#܁R>\çZ1?S&w`Ud"nCoșe==E>_r%4Ԅ,I'J otڎH=GALH2ERB ݘD^y̰1?3^53늯2|ޑIG)a,x+J8śQ?I 'ƄZ\1Gs>5fKVUe2+=P7pqN 5.UAY)RYcn 1֔FrǥRm Ig.Ê@rCN@8f v? ڪB N.g`}B%*yuD.=u[h`ٛlTNGG8KSȀ5V&he4ጊ63*_3E+Y`t*τ*`~a}Ex t=j;H9gi!iRq}{aȣm=|BY9E,2JRF(zizГ*#44g`ѸEi [2j*<=ݡ4DQM$YWUY1e_ӟW%f7tVFPdV.n/9751)'+kDglu?ҭRG?m#e!"ГspGm'4a吒IU7;~Z/FDu0ȌHQOS$Ztu8V@cCfלP?;X[ 8*M0suCM2Q'XPT74:RG5QF((QE )i QK@ E-QRLb@Q@ KE(Q@ ޖGJ(E((({ 1{EhZLP)i9h)I@Rb ( wQ))hbwQ֘ %-&)i? ͤu 7 ^a pE=zO"P@@`S=&h  Ӹ8aIn9@(SY)ۍ4*G6+L7{tJaeaS<,ւc#t_=T̸ x#bXnVێةqACNv/Όw";؎FGjZ*))|0좉" Sנ{$Cޜ7 7 "+ Z.BNf>&'hlr?#I2:HCn‚O4ƹqOZIpS>%jGDa?Z> nm So "K -AJ:3 P@!R(dⷕAsUԄT<.* $*Cճ#N:lL֤W4jwyѝO>*V1zDCj]`}?./c!m֤PirGTnxG@ j/ȕ{FO*&P&`teNVV UUz2>&# OQh?)q֘b,CL xrx)\ EsII=4;~1 H)4mՅ4JT48IOQNۺXaMYF9OMB29ʄ v'"xA@+R8QLȣV7eP{t5mza8??DB  RZ&SrAtzS=8Z겙("PYt/V)0 Ip"F,J.I/~6a2SժVeC*3#]JU)Xۅn+w"E6cy588 U[ i+/!֮@M5'C5NU t2c " 2uG#*Da}i~ @>i7ij+0vnr5i~T F` .;?Zb@z;Unio)kGz!tƟq6{*Zh6]lrk!a߯SR[O$aʀއnsRBG۴dU_rjD@TܸUT%YȆ-QU=[q(Q(A? ? ((b1EvZLs@)((sK@ F)MP}(PޒQHs@b.=KGZ(-I@((P(EsEZ({ڊ(1KEZ((.3E%▎/S(8-~4,wKL@FL24yirZBMȡ7cK}3M9ӰޔyJ}:΄S֤i!?ѧr)Ɓ 1GeA-i9X'?ZFߝ)$Sw~ɡX}sS:MVm<M{Q$*zLdQ`\[#dv&c/?O?Wuw+G'M7} jCD .A$6GdZ&AV~?ΜS(q! q(T&GRwFxn3Ͽ#NF~M|dC^%ӆc?%W#̐ Ǘ3d>K[,Iww'z _r6W+XMMd%-3 ;f(1@j(@((ڊZJ(K@ KIҖRъJZ(@ E-){Q@'zZ?@%RvZJ((Z((Z(QQGAEPF(bԴtPIKE)hCE-(@zQJE%`y&(@u!.x0A8Qs֚GCSp F|SZJ&#K7~iR?9{ӲiRmju-N9G` @JR%)xxCcD#,*6|fyW*̧aޥuCQL'dOB?1U>!qNx`MAiПREWXB$cOUjsRo.$ /1V{SWhHV52ee2R7$v*3Q\.!lzRz3mjas$N zto7+pA*Er846 RVc2v;TWj3ӚkFr)I)J[VJ j*0ڜN2;/r?ZWȁ^5ڪ$Г+ʬAqunѠ$G~s]ӥM;%J8՚F%8#SEdWcU&:#%|Y؎[P2J~->ʤu `=R!$ۂz4WtY1*ȋɓBW |ߏϥOfpY U/"_oez]`ܳ|4WG>"٨ݥH\n%2HSبlZ[XW?K]>_I[;KI@z>R! vL@%-P(E%SQ@Q@=袊(Q(QEb)hQKJ)hP Q@@(j( NPES NP!(-(>R@ ފZ((KE'j=i)(-*Wޡv/J^mj?E<8\e]֣i8*s4?t~T$.  Tq4KB `4fkt /lѵMeoXDQIb1QYF`=5:=qFJ+ON_ѧf- KUǎCF?4h2HY(_‘_*rȩsK&Wv%NA>!C R4jB,\ƿAL|6iC+&Pǽ H&J[U*J> ԑ Jû|8`ɦbT՜,+3u6NP0")WR1 @ӊC'( ER"fy!E\(zgFoh7s #Mn*l)p#|O/?_)X-q /` P@k%R(< [#HTAZ*}%BL`trOn8#86/ٿƚArx$?+S,V>hU'-Dq"Flo֨{g ZܹI^  G*TdpQr _$lb"Klmv<< 6~?.ԖUqs!<j̲[/eROZY"<6c<;/!Hq8Y 2QS9B֩j lIf'֊(p(1@Q@(Z((Z1'J)ht(4Q@t})i)QK)ZJ)qI@Q@(Q@QހIKE%J)hAIKI@PQKE%R( E-%QKLZ%(("<(iԮfXlMƑgQiɃ4>:AGH?ϯ)r.ò09棹QbiO;%31Qvr.ܤO@Ԯ{Wy #ӭ^I%FB;^ n@ ̲D>uT@t [uF AM52F@aR1€-QI&ywJ'IjNTA9@eM6_ ?^n^\~J^ւEO YQ}qˮ-%VqzCh-nEtՖд+YgI== >6FC)%s+΂&#ջ\])ʌz}EW?4ʀ5K|ZJzw j6jZ(jsҊ)ibj(F(c^J1KF)R@ KEZ(@%- (}((QE (4w (Q@QJZ(RSZJ((((((((QEQEPKH~\V< C*or+;.pZ)RQ:WHUO#4 IU ;)i)7Fo2CO֘CPвHF{f/qXRH.=1@'4:W* `~$} J+N OAjUa08px ԉ,GH=*59dԬ;zRG8+цB)Xߣ -ׇ-FL1M ;>Hb8ijy|bzSl}`>6( )?0ʅI 3}dǖ?11g!^L ӻZCHcğ0:QJ~uz}-Ge;zNS֝`1Ǎ%=*J}8wqV sQt rxFW1nQi@N)7| DfW0/h?V4,0꧃Q|R܇YPUT~29LP3?2?^9W{j DZ[YYըJ/'1? 삎R LRڎRRLAǠ)QE(EQGEQ(Qފ(%^? (PQKE%RJ(QEQEQ@QQ@Q@(E-) -Q@zJZ(?)h(EPG4Q@ E-RR@ B)ԘccR#OZv)*F0))<ir{=B Pw"SCKabzSMapqJKP8 9$FE'i2 ?oS1c[*Z{IU\Ney 9 g4bBYF |ÑS4 C(nSЃU enJ}APЖymTU?<K;уґy${@N)Ű??ʕʵP5Xʓ Ti-S+4JVP~j̪7Z=*8qs5f4P.ÚdT/VZ;=jڅ#"yj1;X=<6+4ZF`1g ?I6׊u(VA24 Ky9;ק+ TeaCѨMTxPV܈s2NmW֡s`S5Ga!&X"0,|7t55{IWgP>Fx492/!Aҷ̳9ێE݃(p1wd4 ("}rO-ڕkfpniCvҎpQҙEPAJZ(@%-RR(t%-QQ@g11E/ZJ(֘Q@^Q֊(PEQ@%-Z(E (((-%b\dяzJ)p(J)h-RJ(h{ր CN4rHP3ZFR ҼHzÏQP=9Aʘ曟\SvS r`W=(ܾT?*nP9$9b.ŸqHޓ94zS`‚åD~E7F(P@w9m4ݪ 5`17e^ԏ H*$'c1#{P<ՄV56DOu 1֦FG1!42ī1EgbE :8DA~4]*F=jUq CDC̋q6OqSiPGITI'E ? z.;Rj( B IEWِ uB:?FjZ/4؛TTՒEfqO4 HI#`OyYy6BeMȪCp {#U,GZ/[P TssN`.n}4MT Tr #+:%07# }jaPL=f›@WC `o6У@\ aehع/Xcx؄mLTK#1] uC$Y]<*[g?R[ ,G+Ȓ Hv<Ԡr'?9_\\09 p @D ק#e=6@1Єl$wHM 縙)6ǀ $Z5;袂B(QKLRPEyJ)hA (Z\ڌ_Ɠ4g4) GJ(%-QE(4Q@ĥ%/Q@4Q@E%0 (-'E/zJ(t4PyE{Gj1F( (Eb;PGZ( ( 1E}(RPE-4<)sR`Ep Ja$#"-R M54(;h担i47C `QJ)VH[9 {(,bέbߊ[q8"h=*y$-_֬2VSh5(sO ɊqV >ebu Heи# 5k j6A)$$a!i0W m֏H)im\z㢣1' cޑ"x_.Bw)) C/TS}24$"4^uw|Jlvi*bz:~?ҩ14j1xv> v!K$cB?ֵ[j2|恴.3OwW}< !?UG)V9A 1*ARN>pmb_;BX 9X#TIn\ubh^՘L~$6?OֻR.yo h΋Js190(@( (REP(w ( ;QGQGj(袊(((EPQQ@wZJ(ފ(q@P)(QE4u@Ph QLPGJ1E w{E)PRۥRZJriN(E.ʹ Ƞ{+)Sű QKGB)XFVҐ04?pS@=iS\h\7Cnc5Ԏ0OJVz,{ ]XD7R( (1EP0QEEJ({ 1EF׺ѥP9f ƀJ)FCp?r>9QOmB:h Lb Q@–)QIE1zZ()R Z()iqJm 6WQO>\,6y+ Aa 1Na~=p)p}(ichm4l⋅Rޔ%AF.jMRr)Daqc֗0HQ9i}l 0) c6(9H1EMǥ!\^bPE;1F8)qL,2mjW (( 3LKMXvLkS]Ƹ6DQSV%mjRMjCBGKW$wSUx)=Of84=b\t;Q#^CHbﶝ:QӸcjp1R%JiMۻ8QLtGCQUqX@"ƽIT4"HюM'wC𦲮FGJM =i}*Ac)Q@Rp*0BA? ~ȅyߵ:=A*$.WGVJIMry}ڰ`d{E#qv#()@'.`Q7ѿ:H|5?{w@V$nYa 4G֟hCD[iU[R/R#+2H m҂Y• 8lj`)$sH]0ny?ҋj;ܰsٍ>S#f7xʜ493.GCОhZ$cT&S_ПWJ$8ԏV ,0+ʹ?1Cqp NTHZ_(֯,1*tJGOp.bR WGMBG-,_uQڊ -R3* q@V{Pew?JI 8&T.O߁P= vN^$'}\X~U(_p4%/?sUy$XztC3ғ94Ԙב==U>Vuު?ZKS{sSN&3Xs?Z<rzn"3/NI[iuEiXvvJ5]Dc?1u܀q+ $ڗdpwua3zjS՛/mU@1\$ҵKÜv+PT})-˂1 a`2YMX+Th]W:AfR&N[Oj2@Z08eXV@IHɏꤍw<< {̿Ț54,Ȥ'nsI)A⣸mm;'%B56lH0} q>\HDX>+DA3+!;n@eHb9V fAw>@g.6szXykg ? HY$(>lGuB6xTh5[>vC)q5nhNr$\yD%b =?jCgo/*(_(xܢI9/œ$*sH\p+Td7#T@уVosܞONOέQ]Gbwjv-ycL? vwT:A! ciOn*O(瑜QYrqU$dGz!S㊐H܅Gbd9=Vn[HʅW.GGDߩ38;I穡>e= "e##}]JPxUT&0;zQ7OƧUnHɥ;O_JǔW->RҠ cCt"D >nԬ7c|!`Ɠ|\~85O(㌎XB}C&Ft'GJNy f,N hQ烜R҂$+|9}4}GZLzqJcFHסcM(j,C֓'sM&+sc[/”DIsPo8.zJ̢fch/Qs;=!n4o'-q4%8u?֯o!K`> քMh{ V`v6~dt͜2T RbEH85jЋhȿy)x0jyS?;Fn+殨UZkeTTF4}SAT]>49lU=}֜.Zſơ;B唑סOB%yFԈNPz(Q)ȱXԞ\OQ cڔ1G(8GqWi!$ H:Rsƪ8aM㆛ϧzNzZP7 6kOZ:=`DpI4x4'>4ai_n9)$?=s-’Z'\v*E490,JqnC &i#dqU}d9VD[k EU1ց,pAOK\*֔`nUv;z}j#ҞnGQ>Uk̮ƨ q@#4oH|m O^*ĄeL8c񧋁<~iԤ@IbHm>Ԁ4'ZN v' қL,@h?ҔD%+[Qv1\ܕ#ށ*c㨩)CT?QgT?1  &GQȕz71sAcZ;î3MiTY"G%Cf}QOw"O5I*F,0:%9Sۨ Z^-:=M9lnuW)fOtFf0#V H=fLDV2Á5U/th-f qUn-ߝ͍d?#A"\;Փ~sNրf~t7[K1c֮"Y@k/g݊$B2OlpIecb:j}I˕ayUJs,ONki[qǵhi1Rqyx?$sC2+ =$l0Zң#N;uNhY%^ 뚍#J,2/0D(B#*f۹r21S WQARjNG.=HXOcAժ!ln)) 9 Tbf`섴6?S(UN;PlB BOojiF 1OVL#$\7A5!oH?4XkrWaMSGq!I0;SR+x,aw(+ny5BM}2)j5XGߒ`0ħ dn N>gsdRn^j4B ~Hߑ-Zj?`߽BLJg V5"'52;\DpV#׷Mg j,J!s93߯҈RVdBT?ƚ3 E=~8M6v4z<✿|cH#UbJΣ\z ,_xO 3yP~T˷M'J"֬E"WF9"̛MCvF9'afp>S4)ZMΣa r) NIb9ju9>9媸9 )NpeSJr=+I B$@i>LOaeC| w@\\/NNJ,,6 'đG*AJN)IoOImSg)s1c~;?փjpD9CHMSN (I.?շh) '1$t$sڔHۯv5#TT>6w<x~tw'=iҽqڐ 3ɡ.&;AhZc#J5'b7a3rbLU&Yg5'bӡPdZ,DG|9Z('=҇xoA zT߯St2?Ҫ- Y 8ZHOܩD#OŜAN?W!O_;՟&?7zFOa&(WBKuяaN`M;j_ּk-qwT&BpqSN +y#Ն&3=P{jRNq¦D j{g K`WRH vzZ ®eҦGU*3S˪Z NF+(ŋdsPaQlkŲ:4rǐGэ9=[H|Șّ*G ,\r@8j}.xL\[_j~0Ҧvc̸G`E<6. ex5s[⽍nv1Q4tb/i,$9ǥlnoE3Mtu*skP)>dWv&(.yj#_Ԑnha)20zin)\,?u;GI@9L,.3KILLUTG$a *<߅.xp))iy(Kޛށ֋7 p}iR1@ԫ@ 9OZAځb#dF)a2s#c֪3L"ǂ#?4.bu)4"ČDa硩Y,}iCudqOVBpA@BʭB@*DcЊUU1L`' x2cwv] M;e-^QLl?LbmVB>`9#xՅ_b;WTb8U2[;Hr~aoZ 6Cmҟ yGºi|JK`v(~^MV~sr&7FUA?IH W_U9-vT)Eu<'ĄNlQqkX:t74٤[&Ô%rTtu#9fB֬,NFNq^EM%s)j\S?dA219`"|9sD+8 T U;y)!^3Y$ 0c(qW\ p8LRpK`LNYsDn2z"njeD?ldӿ(Z@=;SXjח; FQT n{P;*)FqrrJ4Aw׃Rc OJիYvvСpȼ3e?֟:ޠ<+QBG3L)0OnP}Δ1kVDό{PdB;j%hV8L-??KqQFO<|$G?=xPgh*8o>vw_3Lc9Ǩ2.J<4yq#U2uu|0&AVM݅{Sp(Wt֙W1DxBcdQDvڧ?세T`sM7XC<OkjF#@VtPI88\sϽ O";Q qՅyqCHa%T g+3h56m>uɴvZiQb$a}M L?ZTc;^ G3ҳ2B$1*%֭1b:8tcKq_JRI(I" sŠ~K9?AWA1f=248=LRv&jE葕*1~JP~ҼlU#|f'?V6ъN$JGA5>)qZv+O~F\ iM$XI|֦ b1w恌[#~ J!8Y&ީ,HtPX~5%!>TX?Zp4 sYj('4sVR/Ґ#oΏ,yjNiXoΓhؤ?|P?ѦApjL-5{ɦn'oΥE$iyPb]6PY/J"sPbSqu}"lB/lA#wJO4*Cd !Sb#$`)bk7@J8?E!I_w3=;,@iJv dg4]G 7) 8? U XBqӊrO)WeqdlMXBU횧hFFj0ǂrOUŝWbs؛Q0p-h1)'RX*} @<).WlُkTݐGhFs tb gr ѸTܬmcazUI$, drEжn'kye׷XLX2=4N1iHZq!=e%fn#4ia@');sMWXeLUGd]+MTrn1NiNjT0^PNĹORE?$9TǚNb99 }M;ȓ?20_ӭ>In<SS V  ZS!ZIexr -j[6?9)4qҔ6Jwcv N?sʜcQ$i63G@F)Y0>f|$ѨXzýL&}: <_E&j9_BzץX8I4QLK;h1zNz-M_FǷzNҚW;RJ"S@PO0CL8SUP+w){Ry? _㎦̈tzf8ǛM[_Q}Gb zuFzdBsҐvH0qRJIߥJ?yҥ(NQ ~9q&8(r\ƤwQx*y)\-a > z"ҟz!9sCc EYU2(6)ZG@<[.`'Y>G{q c+\OB;ZV^3@9߀Ԋm!EgPqc+:;eEcFwɉ8/&{ta@1ڤk+"H,wG\*p)CWMk%Xg'ҹϦ+΋a}Awp%fN<SfC2 '=LHv-_/ &;k(a7\ǭeNX8= "PQ,3[#Xkx$@(= 'p*Uv:J[b&Y±.Yڎyo!Tyvڱ.ndXmpsQ[@ c\ILgySm.8I9;cӯ(R<@m22U};Ӹ K![iDOsBZ~=8LD@d}$SO;S6@9S㚔< _ŗ)< zm#خOi}jP?R=q8~G(۹E$Q̇C_¥S{umʟz?KNRLY~iNIޤ6=m 0ITّ;H!m~u_O`SjfGPF5/n_u8X@m(q8ҞFH|9Ӄq;5q<9Oʿvfؚz΀[hRk`GR4y F>bjFU;A#`COB+:PZ\ X(wh0FO $>R\3XbKq1~ВZDrc?g $,7oێg*\#,Jx9#v8C1ˏRke"F\|jaĘF?|~dղ);MFF|Fi 0\cips\Ϙz-?3}s+*:kV j=w͉7On?ckP ڦH@1osW扢U 2w\zXYSm)3 TXG<*9B*YfSpĺZJ8~U%tͶR?Z{Fx(0gu=>EKqJ|fZ!ϵ/M&dVE8+g`SfM|zW{EIV]\ xERN{\(^7?AqQrHH ?Z-|kJ5ϗftv,eIX)!=",9q|2O6i'؂U5?O_)y%_ 91F\Eju h4-/x^yIS7`t/1#_, XރvQ MeW_/ˋhץd&b,$4v0,!`r0Oxr$"m"Anr*~\v>J\6dFӌiV1Q5bgIz%Vt[Udc'Ў']uGlu9[ QO&عŏ1y}i=pMM~?3Isgؠn}zbQ9c*n;p֕FStc46\=GI ǴCĿjWX(zSӯzI=qAanZ!iqVBCK׶C ?֜e= Q*ǖ'~gBOqt&@;Sv$ZD3ɍÞ)t+c=C`:ʰ,@‹"#8#D_j_gM4c|ӾCRc?0NY2zR==bYcb;GҋIHڇ`#'h֞``yo|y-IXz8?(?7ot}1S4l*~`Gq]t{II tP? >1?SRD@9J)1ݑlcq|;HߝGϧ^eϘV#=ؚ W:rxR8;O>s=x7,iIǪT CJc`q*;čv?==VT$'_,9Nv&/n3L)rM7SD+ԋm1Lү #{1SGM=sH=ȬwcL20ޠ`ß3nM?ttH??L=GZN}/s<;qJGpp( 淍:2H@?ӗllǪ9\1mvq]JXhXKl$ 8' Gx]x*Þ|e"ځ TnA]*iF/hijFhWFWoT1FoMNZZ++8U#q޻ib9;D̐o_ʂ7998w\r!"\,9l~'X !f+QXԭ^a.훎E@x'5=`3>^ bcزr?ZmKVG}Ka:AX&gđa:"G˒*T(Ų<~ƛ}'o&ʰݣ&Ijy$iks,e44NY-sEied}OLV#qڎÃҝ[q9K8hBCOvJLW.z1'סTޥ֗~VhtjIPA MRSEQq،f9b4{}<,F7TPzR ;…G>ۀAs o r &=Vv>BO#JÅQ 5V.>{*gtOJN; hx7\}O}ҁWv/c` D3R(QfNdgRf,/LPzr:5&J<Ҕ2 Pr9ztCvsϨG7+Pt;mtT9gT Kx qڀ}LsMJsL"TB 5trj=(ؠ`pJ6ȫp"F'fg$khw6ҝ X~n0r?k#jk,zp1Y@}h^PGwki??C׵y5e+yl? 階#4/SN7#i\,JLKN`43LGջsN"n{(R݌0{RRJv9MRb0qKޔ AҞԃC'ހ&9!isHÊie!b2ii֜# n3L4nO4 ׈t# f\JgمD3+OMFى2/IunKf)O!lE b1׿!ҵ/ӵZZGb}ꏻ&F# &,y2 jzEf/wJ4dNd"Z)yP ݴD/'Mc;Y{=L.\N=dr1 \jq+l.,?w?`麹;~qc,j͓<{Gz9YJ;LՔ?F't95|w.'Z<.4Vm v^?ZjlmM-Jp\>A";a%}R$_ y(]D}Oa;T{!?ΐGsj7Sn7f[a?mvSz\ /py€TVALH؀ {4IakuZW/oiN}*FJ iE11Zm'1EZZtE, Wsvznjtg{fkejrsZքeI*ՋC^)򑬅vT}y8jf{@&)?VDdaA5R~ wNtS~7qMpsU4!8 )3pt*H0FPq0 >7dp'i (N5~{qT;FKIU%<̗ϓ|e'9D^)ʧN1wcs.13ԚKװD 3pAi6 zsw 8ai{#PʂxćLtRq%04$䜁Te<Vg'.T=OJTNܬwwxh#ڣ=҂Ak_\! &LB"VFܓ8 +0wNFFLxOCǥ8Iy8hGM2}>*rH9480wJH5RƈN~T. 'Nⲻ+,Sǭ7i֑AZ;l7Z4H.5_sOϯ5W*'' 3ΫƬC;nx43zNhc&zƦQKCH3y?HZl)R|Qt*FS>?''ޮybGNVd!iDzJL~@=ӷKꟑjwOAj0I]ÄjByEjE\N%s8KQp<]4A.?:Rp8+P>\{JhCI꿕4h=wS99M#0+ǵ=ẋ_G uH:Srx??ݨ̷4`>rzg֧cP$3j.z|eTO$1+ ]Õr?1\xrU#i!< 7+|D-;)Z:{"ᢖC0Xd-ֵ#gj]p)s}i7 iQSi F*xm'Vh"P R6m\)ob1T\}c h]ʯ5Bv;_NkJVD;dcҗk/Z|*^I}ͫ"hiry4LrkhBNv[A!RHĐ3] cs)4zQ?8ŻqFH׬xV<7fsFJR:kм;=i7d{gsf0%iZڔI8xYZȲU~ܪ-CsjFgR7sd1ߕR7F?/*U~UFX亷r˦Id,rg=jDo[eln°wS[j.Hӻ' ١ۼeKgiV Xb(+]]vwq@C)@xoj{"&F,a*1!,1fq~}X$M0Z1jJLyȍq#~U8i95d⮘OW;u$ >ztLgўzXڝRe)2 8QT pRyƱUԷA߸8_Q?5ҜڐzֳM= @DqNM[OҞs/㚇NvPE nGn#zSfN=&NHh`:~u^旞y5m5 qlg)} C"=4dh.M-rs9pWpipj&%Y3pJr&+x>:~W9ccʒZDb3cK3U^LesQAF? p.x1@1(j(-q\vP7`Qʇo ILQ~xQJi}ޓArpisF)ywtxQ9>Qsn*zP\KiH2hM (>ƣ# RD~aM )j&))qNqH:Rf=iX. ҥe_44rjLU U5@LLKm?pQ$.1 GHxշ0O9x# î;nIHI_npLP19'V1Ƙ_{'<:Wҹ݄w0OEBw7?0*%&RWG[E'fRf2;ϷjӚnq5+ :a3T5X"ޟijEf\t=\+Q3I8pi\p*՝; @N b=TE{t8ictN #J"8FU~|S%IIp>Pި[ۙUBMLȹ~V&R8C¥O.֪}e$+AWcHzt7$ 1Pz"PBwyZD[U%qK`%Ԡ3{U3~%h<c9ٸfLDSY,kO]o5VLygIÉ~_<zvi|C)Zıp;3(9#uGZ J aP)$DA(0J3ߏjC O&숷szs`8M0[ 9[BsK8C/qt4SJO3*'S㸣+IZ[ 3prnӦiCzpwѱȧZtåģ7n'8ҟ}?ΚW=wA湟}w9ϜHsQKt=iO1==BTp:wdr(iXRl]O^TQ Fy"Ԯc ?qƙRݪ؛B<"?M&2Ԩ1n97Z?CG9@/'jvbR2tj`B2rqҟF%R/?Ơ)G9b%C1i|ǥU4)5Җ"C x?G dgDaYQvCGM7/b?Ц3} W6qL+H'yyLd~4ӐC֜zf'h?ާyc?N }iO=4Ef RU aXMaqIDi9X4=E7tAѺO֧f-cڜKZ7$\+EE?٥ ~E l/_$FU2i_-G֤7b;Y 7 qO:lPk8KYux9ޯ\Z\B|nj]UzHI]߻9l6pʀ}Sǔ,# TN2q} ЈDN O,SM80ljqd9ȪF2J-BHmcM]\,e\/#I`!!XGZ >Jї`Z0i#ӽ+GZ39b'4p3OJK,3RUj8$elqRM%z a=)d68Z6Jv{fhV`6篵H69=Щ-ur޺;,}.}5΅b~rxM=lLCy`mU9e-F)1ΔwS[~Y[!Zz:Es) μֱ#{t2æoP}\H]ȖȖ[s|o_ӵgJ#CGIf%͏˥ZMVۈ! WM\B9:VSMϙ'c<V[XnX žfOt9'5sxAg{<ֵ"ݬY% QT(+^.",e%]D.zN<)VcVxU0m͖FsZ:JY%$n$y%`܌qn-[# xMuEYǿCA0#0>; Htd⤅$FJE O.P;8Iӎ7@lOOʌf (7IN xKOc@ fYp`8eNFS'7ccJǞ r(d3riFEW,spjZԻp ؼ;  h GLoc{H?M S1'DǟƚBl\ĘϥJ&^q CF|8ir۸4dB??j<ػ!<Ms2exmqdfݿ MD;~7&oGz9I!1>c)7r_)2ݍ&0{Vj oiAPJP1c4EjU3xi1E9(socG(mq#?K< i8r-A0Âצy8?2R\sm AuܟRm]ԞؠjWc%Y2!s;G~tQ4?O_J<**;c7Fnne4#|cGֵS~ ㎆@<3wiI6r8s{?i\cV}3L=:ϽsITQrzS0i3i ڛ*p*U?-2_-a>"9O8vlnj- SnJ)ہi NOc Dc_UɰQvGzwii{ӻqNJj.Lh("iGzhC⒎1Hi3Fh"H80cO0R ;HRa/G3(%?ʡ~~JhCj6# ?GjjҸ%H0-?hd껁GZѭ;n2FN> <-⸳(bd"*N)w5:)2.VB%,ʌ1PXО=k\hڹCM)4~۪=ŶDܠ<8 (Vvs?⪴|F#5d,)Irc*' 1Jz)R)%{чk.;vnzdpj^Fr>4y^kW%Jqx_MFN8 .1<ʑY=qc޷QP3'Hj֚" R;y?RW#89 1_?F*d]Њ=Mt6G66G)k ":ܓoYUPrH!k=Y$[`[ܼQYdPOElSY}.J*^3Ͽ5-q-DA#ssAv_JÐFJt?(- lp&2DNnO^dX]F`pJpOMBw1Reon= !3}pFhϵSK@8ASd╆jl4<[*}=O4܌488\Q/Q6j3t4$dy,I1OԆEO-ߥ7=SkvZkL@>QGj!s2O2,]NJfsdRc&@ɼK|ѕ֧WlczcUR9qUˡ.L΃y8z&lG\5_(Ie$ !ȗӵ@3N|̟̋<}: BOCގVbfO>a?'H8kQyҏ/`g5_ wf__h3#PNԘ;HRp%NR$ |Ori̻~|C֥zIg9VJP[h$^wFq)BHjAsC/(!syA9" 2gf gPNISUI)r89IۊjИA!oʣ AL.Φz})0?J<sF&?U;蓜wޙ9yr7Y=tc֔\# q>]MU+k;wJ_MK2 #D[>^@'V5n@q׎iJNo&OJsƒ+-*aLsi+ F;P*8:ytfxozqڴjXP{RSQLf銔(4Eɇ+sN R1@Qp\iv sO!Y(QFKRsd]njBҢBqҝ+f?ҁϵ6>H950QN {T:w(A(5cj *OJ9ÐHjY"} |±8yQHE sCM$ZYϵBI]hkOMZUZ^6<.mn]LImwT wb2Ml}Ax՛%iQYOњRQ3|s湐M^af_r7!ayTLi.Q:p8i]޾t{DjKגO9#D9s^Uw!w`5YyJiCZF lCŖWIč%t7yGq5e|͓xA8PÁ jţєm ~p~NM,9F1Ԝ`ӕV8DEڮv w>S3ژ~,J&M=0kUM=Q6Cabۂ0sJ8AD͜~DhU4b!\t[sRSϴMCږo?Σ'[sTZ}~x!帓x<قk9"D?SDcS7|F߭9]203j*̏=zӋR18^t! }vQ6~f4R2I6y*GjVw`}Oz8ڶbW,D?FM6Τt#*>)NsȮ{>;|dHAJA\lsNIhk*I#|FxJd`0Tkr'V<Q~;p4;|If ö0?!p0f7aw!i+֗ΐEY t S,sZKSmQ]GXNrJ) P3Qw9Wr1ך6zKT?PY"IWXeC"[8\z7hϵH"zž&S w5>zb/dtF=>SxJL.Njk?>҇M JpI"Ep&ٛhRk7b]9%7+Tgx9$qm?>g=jT9.1Uzgi#ipWӭZڞxqp`7+7JPjxm*$R79=Fv#Y0p\&7rIS#dcBMws[tk{h+FG]JC~EKW`T.4+ hkoǥq04}$C˷Xy 5^-E3H+cSWO40yȄh27zӼ?#nsy.z!'>9$]$cC;,2_JkF~,}K'9v94{["#4HT?*vE3 @9%M˄ Qh+ۮ֍ܻl{BHM146K*N˙ظjԛ[K`QN2iʌ~x{*}Hi@Ֆ rsT~q?Jswc]ȇzT c}*rUpQЃJ28`;dV?0ɪeUUNXڝȨǽ`zG\V:8R .{ұW*+ԕ Q`"jN*(:ԜP x4tqC@IӚrޠ$Ɨ+1(OV7sJG(فFDR})SJXb_`(J9QG/5\ǒ3@jea{9b@iK\~84ҁBtnzU5UN XCRcD") 4œUQ\V 1Y#ȿζ87k|;h4DH%ew*̥d tvQ(gJ­kOrB߻+0h\T* Q  f=MrqvvdJrNҗ̋,{}q\sm7 gӌ쫔X;ki#()4& (@#A""NߕG p+'،)T1M\HgM.؎O?*h9#V)cԤKh GdyD{Fv`9Ǚ Ǥ-v EzԄu曷=Rat!T<Ɯ)v;y5) z֗|_{ 4 yp0G =2?_J.š bo)oʚ׵Z6A|cۥ'0'n@|=so.Wg**4SjL~*ڻ0iZwHFiCӃC|mq'!F?zzSc9d|秭+# 6pAb;T4Z`c։ne@5I0i#"N@31b)q30 Č9QR7 1z֌:ۻ3Cñ*pO qWʠdsQJ[n"+nV HQ'i=>Q)'(mP'ς3Rh.P)u5;q}{RG$}  G̉O<O2]a<2÷cJNJ8nW 'jCl(:.9=$Ee_3^ k:I8*,8Ev1->jgjpeЌ~t2޿+'P2*p xqv;"GQMR(inwOZ+vP2 )+ѴdTIN:^ Oo^RtQR1})Lq,V-i'$͖[8} cYD (BU} \h{f{S%;RlڻƽH,I -o倗*6u|Ն$rqLK@jĭbEFs\y`d}) ] <#c[0?ݔ3HM4:֎!ugZG+Ǵ34e$9pTOGG€2'p2qXQm)9b6Ou?֡ ,g 69Dy%6W$"} K nO?*Qs"e?AR ņmSҥ#bS5\t_Q塌E۞AQ;Λ~_M:}8ٚBc?)(ղ>*`]m6 p&\EܸaO9ܟZz~Tg9U6u45u*bQʯRE8 ORXjuڿ0AQMߥ;K=j`UOl'i ??K~LҗwlOʜʘ7R !}Q2R`*p8Rpr;P2hp; 6>ҭF٤#A'aGuQ2jUQj9X]:$j(*Iqԍ/I#> uQFT,X#W2M G,Up@0TGҴcz9f&_}5pĞKGuE.+с uS\im/ m 4or7Iۼ(ruKHћ6ޠ~G))f+Kg,nl 6wtR}JI7DQn7cXZi̞eʤHt>EѝMsq\wU>I[ɤ#xUVh%IS\sYlRH-$9ojih4弶(ݝRPcuhzUrpw1 FI# 9+B7zbx԰e&,#rP =#?XY(%m6ՂY:PYtӸND k&vp1,VIaIcY:KCEPvaRyQޜERvPXJp}@?j YO<@(.Z3XcsXJl"g1 }pN덾J1/S&2 +z3SH+ H`BE#8U$Ԣ~3 `:dgHỌ֑c^?EX>r)Bw6sp?/9=*[ɓdquOj.8 #qzNH{5NוLE&6$cRi5P|.# jA&^8ϒ/?4ܜbӏ֨')Z4m6d] grA2qlo8D3Ua (0PBv'_'d/+?.?%?g$d1FcUԴd*%(sB"lkKn>S 3?HeBcs?:ft48018Mn?4ٛ4ynmdžIo >ɥ #>jK.3Ӷy$u29<)hkܦR>ϗq=FJyzo4\N24rq֐Lqڐu1gg3O0,iYt}/?횱59U9{ TCBuΥO8_?tH;g39=:.eUb1 gg뿿u_dD1GqS-Ę}U”?_z|*nʻ1Y#flr_%~`V4?JUCAOYqi73}6%9f08GZw?4IpAcAIVWH榍XP ATx#n拗qW@8@9Q=qb Hz]㑜ѲE݊G5)dV 2:ƆxȌⷘSA'cvG T8Mʼ)Vyo2 ?ci<[y 1w\N{i;YY@0APzn@=iX&QNqN J+`1W.(8M*N%tF;t-Vgboԭ4QV`|Ė>RE*9,sldwMXF,YҪ0J "ˆ5O@<*ê~T,p`Pi6s/;j]aMETӂTxE.^i /B.&ր&ڸf\4gR~XU_QNT[Kqր%J]ҡ1Lk8oo8(Q['\{Ҹ[1HTd pzxb0&ME1SzHSJO3 QKf3s eZxj.+?Κm?JcSNÌD8SF5hF*j+9f :. ;R}*>*:e P0L1 lvW?֧ź30D]þl49$aYtyn!Ue g=jl'A?*\з5Pp.<^mjj9D!.Y&uH2I409|O*J0PNNg-ҡ9[~y!M 53;)#T[.`U>s2sw['řlqU).m 2\X$G,YP)ۼ2{spIHTF+ʑ+|-%eZOϦ}E b8vx}Z(xě~l#ŝ:"/3Ҹi+UbR%$:֦U`Cq1 3EvPH-]v i@Vb:Vd#I`?séjnX[+#\^tem:6 U]6<фV`3>qR|up;iYS$ jft$47'S.BBě7)G@O8,݉Q)nV+pF$%z~;Gl#l}iE *TBz.eUN &N68&v>V*9UB^ɹH$BqN]5ae#mPy4GtQ&J?嬟٥3qd?3\d( +V-OaQQo2}i]I:Sxb2?4.+V=W1BܟkIn$x]@ y~Z;#(8of3M>:M[21: 8]Z!$&D߻(9gEݎԺLJP6Xhc7@e]҃gH\~*O򮅯g0Ir~c׊j](!e0QJ;owo*%RGu4sF$R$LG*uQ/R*ǂ3҅ C 0ִlmaUVwsN5~y#6yRe6ͩrSlg;0[`IIr*IT8?Hf<}>ΣStQ`*.J*UB h*yV>>Gibc1Sw9Wr%͸VTb$&Gz~5q?zݖD.8'?Ax??J촑^E9)yVr9sׯ>5IGB3"=*O9?3|rR(܂}=84+(9=*RW?s2jn_C:6c6q+@gj`XT<R<Ҹ|fi=uón®@*w#,e@=Q/JlrG^_),?¥Xbb> Jj$yʘ 9VfXN7QlMQ $Rv#ueaGHmЎq3Je|ޡASEJd㱦Ӗ.5 B1֕$yj_4h\OH5'bxқhp y `@F/C} |hi3LJp~cSLrAƨ$=G(LHizs}vyMHmOfv=:` piŸ9V!#5'i(t$4$%vҽY'GrUr*8?UķM'w#y֭6>o*a[ߥ V@TriKFč} }b_q `% ge c<]q>qO[E-.(",!oQr1ZTdBэ1>v_h E/[mǹ4$:+u稈gfeD5Ww3^R8gmD|Ϛ%FGj?CΫp~Ziҝ߻_~yœ~ɩ) pt̍ש%nP,)Ϙ߹9vm-?MCҥ2gyEycT򨿐$(?YYG( bAb}6֭膐8TmWS0?3k@IL>jƢLhCyD.i\+F]e>\Cv5;ʦ-qLc~NMbÑ;ncbM{;>ܓTglȪJ #=\i-Ѐ cեc(9g21{f7VuĭL'{}urD,z^5 1`0CzaZSIYwEI__6_*OgTb|ȏJVI2Mg'$Bfc Z%w!aKFG0vFD4.QIOD/a04`?SJ:#sړ'j|gYP j.W(2=vn;U֤(h_pQ&L/j:E/MjnCO6T?tMm0"sN/PЈHzKO ?“uI).=F/>W!kr~NmwG40xǩOFج#R.-O7}~旁G0HpfjHs „HˍǞQ){u&p;i'r*k+J朣JhxR9U(</.{/^Ih;ntXHR%;_Q")Ԝtlue8c4K ?vNܜwu)o^VEΞnFBZm!N#~eȐPMoogP{5+8H۽cM6$`@BQTQ !֪D8@Mҳ"p[{Sϴ0Qf9-JxSw sZ2FJH皀E.S(ԅ~8SB/q/ށ<4c}}9@<HUϳ'@zB}jה4fXSV:)B\L3Ձnҋ 5Z'4r֔1=хqI/j,*je"M!#K5`Dih\=.9B%ҝr-Ob4 P @,zTZ3ҬF*YDަW5 Qa21V=*X2i ) twy,:eejԠTv@0G2)aUZDMzdA=lbVh 0h;r OX~@OU °1q\3Ҷ岴S̕Yw8ǽ`I #:s>x50fI(RW9#'\,ѽYP8e <ޢ-s<`sTJn 4Av;=zcFӘK+">8!q(+G894`6󎹦;xd⾖ڹq: 8PL*@;WpH$)bBj#ӊ%A'kڊB]Ӑ&4;(R80Ӏ)!)]i6;]~̮>圂M>sXMH`X7WCgl-88z9W&1*0div' M5-Iiw@\ J:w$1H2F吷u*#?jq!Rܝώ?eMّQ20ocM`O^? ,XRMMcқq ICvQQfWS::A5;qܻvM:_f; +VAȕO.>zz/siwۈdR7yGD@g~5aRJ贌F܃*HWu d ^Nx*ZoT:=sU~)4EI"=j}Ў~_/Nf+q{M7\ܮ\RIH̙U"^?إq -Fq?̌B MzWC =ڴSUr?yز2ZY =HnjFJ jn"Cm0Tn.dku=FSn"Ha>$aL?s1"jƞX7QKԶr2%8E(Qzu *݈}֛{iVm^Oǽq)K B_#Ҫ1u;ѫZYS?gkp `t)s!ggLTIYeWF8>EқiJZҞ ^8 /i\Q}kiqV%X \p85`>9m47I)IzvU Pjqn:γv)Aˏ&hkd*4GH34&1vӰm.eЅ?R?C@eP (Me'׭[[fNY4ĩTz!yeޠ1իvD#y=}蔕g:`\? PL"NP+UJ#\ƪ,; L?6jz>kXБ8~UTǦ?Vwt#wa5|+[iG9jdv䁡lpݏqO6{S ߧ%t'fDҳ.LlUɏu(FNO HH2OA}뚤5s O>2Wǘ3zք̇֏;`# Y@ lҋzN9W1@6GZ7yTnpiP{I ޣWifTB 0=o{.%J39R fEJ$L n{҆K/=jEހ$хL^Iָ@K{U=i|hϙKC/Oz֜85O9=iU.6NT*ҝ悇>\V&Uި,$)չS2I !r՘#5T_iWGȪ;@`zZU#M)LLʑJPSy;S`6[[ȣ8W6YYSDN*EvJǼ ~VQ'B3~T1F@>lIm=L3Nxht$ķS@';R]w|L9_JC ve$Fc-U+o2Zu_37}N Eނ?$d}篦* =H8<3^KW2J@뎽jy=MJskM;NŌ}'FC.IՔ)iO$•!qx} B8߭u)BB[*OTFq&P|Ѕv0}+ZTi4i确W# pֹ5X:׎zg:!\)~bN l8;W!N&"'!GCRCD&aHg;']P0W:UH$# ۹d̊P|%sXvɒԭ0'#ۆ7rI` K4O1s'Ld`{Ju"8QJΒ,HTn-v,ONv;]Bk1*!hVE-:+vy09"D 2xѵ!q@RqʷN 0VuμcT<kӓҘ~zjjR]B-ݑgTc}RYL#67wL2)Si I[RyGF#Byuj%qĈ[=Tש-~YyP zݬ@֥a @z(m|nBV SlYNIkI+\ιq5== Ny>I6DVXd4Hz؉VcV2O;r"- lb9ii8̣ 4=TaKV{Qa֤1DsCIE=sF''BZ9n;ԞT@o_?Qs[1y\uSLU#,'!q|Q5Rأb *H,zjHbA~ݹPЃ#ߥ!=)?CFMʱ?ʧpO^?­m!I1Y!aҪޯG(UNz~x5|ؿ¦/]M1TM5f(Cy.ݠ"rJr8Qޒi1#i|s[Aeʹi $R)Sf"#_S~tZcYm궬GLb 7UtFN9{vNB#318?:|qeƥZӱZty-#]˅g&ퟴ^[[ rJGԕ7˻Y 6c+´5;% #?S ]RHHj1'YcIts>.r6zRo9hWBҏi|z4V d) {tEl?GK'9:,Z|9і8bO"[ӁZ# sx>1KJ-D}.5Ùۧ!NkW҈Uki1D2(\$oQWig^#Iiv>`r0E JaHp+@`G%_jg٬MUj.F>dQUbN2S;]^ߡ i]^G+dD-_PmA{j?ZOs}.kG+ $+N =dS|qubKdz7ƋD}kt9ED3Q OsCL&-"\li?Ǣfl qo')ϫ 2 4>gZ̟zWr&n0PummS;y*[0co$LedBU!a x"[?u8>jY FW~ɩT+ʎb}}ң3đv+Oa֑3Hn W֚3{Fxˏyv]Sr1gBL &VMzJ)Q$6x%q=ёJRy?x@I*rGn9d:oZY t,A= {Tq$Q ;gj&؊\qjr>'޼8ES(y5tdՏ4m=4ʾISMgb:z2w#s VevRH\n隚R9h$3 =p^{=eFK.Fs:Xi+y|!GȣvhBpt'&DUHlGNp6zf ޹?jL|k]5&fc¹WGhGm#_+FmOM4x@%!RA+BON{|"R 滈+Os]қ_`1$M2q$c8R5k \h'RJ"2RjI%+; Ȋd HTqcN ]`μz_*P~oP~U1 l< ΚN8*JcƣhNJt6Y޸bdb21sFݷ[O?M!dv3ڟl{{V毹2(1=zR~}*,(ғHGQLȧÏS@ZqsKNRm)NERjۍQ\ZFǩMxG>(+P ǘP~KG=DGՐEjȱz\{%ӉAdy儀_cn3VcjluO*WOpm9)'bucc?M\ORvc#R͏l՝A<`OKuКȧ ?ƧM,RcQEۓ~*5~(L Fp ѥGoppMX>hDM0yƭb"3#N߂94gS̖Ko_jlU%#Ȍ}Pd9E'koʄW$guPа>c" <;G+\SNp>n(9-2dʓȐr*n!=Ko''޷yRv8mǧ5i!QN҈?O?]w8uT?A5|A9gLY܏5$<7n)e %&Z3N+O 3X^f^yd X?t\x]23Z7(\P82:{Cc tanjx[F;8,+19X?:?~q8V [PniOWyQL1G0zT?ؕ[GuS_ݨ>hĚ ?.!6O x3_NKWk&?-ru+ ; :6@ <ﰹs};TF!H.n+j'n1_h֗W>{NR_V=}(vGQ ]@{gSpGSaJ1.ݘ{4syi7'+>%$mG?~4٣oX[4@F?"H5}B+( ,iܠۯZ.`[+c<ʍ aỎ)I ٣\_OӖey*r?N&4 ?{YG8oyӅ@#~iT҉9?GL3y<ۮ)~ߚgl䅃QH&]=xX`cnssӠM畂Ɔj~h=f!=mҐ][`F} k3  SuOH^ksmdE*.}Z+UE,V ma&ȀiZ[~ U٭|K40ōKe}x }OnuKھ~cWU5G֤]bM?&iڔӥ[7)|xn&hҍRp ~Xʪϧ[ų0^(f Ȫ>h!yy*4O. n9 ;x)9Tnv.rwMxt4I 'N;uAf0Ee#jnOL|ݵy)uk\CUگy|Lt&w.򅌼ÂWq椒FwFi2LHOZ!3~PvNTvV9u)ɓ<>gLqn $qڤeSH8\[}& ʜ /rh(LɃP=+B$=*hJ0<Á[X3[Yt {ҽ+J;J^圞]z眎O4VmmgU`NYMjmZ-$펧8'WSJr=*ɠ`A89['=}y$(oGLC β8 !<\7#ɝs?hk \2y '3d5IǓ IX9;p?ZZkCT`u3Qo^3D#皐Ltb/g[\<̟I$kgqsfCPjd^jXQP%sƭEitdf,@'EĊbrx1|ԍgz񦽥ve5ic۸ШGJyS,QN/̊n=Jl1 @_gHX L#c=V%rsMZ[4ӺgX_pPFR֯aGO0ʗ$}Aԧ>G1Lkp>#0.-zGкd8m; &|SpǨ9t,9}Gf|!nVqjn_W7M3n@gqggm#Njz3K@*QsZ<GUuOy GtԂ}5ёbMMP3H#UqS~u\wSW8ОEPN#P)uȮjs;+oarC g@5 ҵ)ݴuo[n(Y>sj0ǐ@cCRZȢu$sKA%Fwl:h̬%% zcg#(ioVݕDpN;TsJ޷u#&&$dG?'2Ƀ@$j"3q[^^ȕ9ٵ8CS?!?U+4FqFNiv6~;K0$T@?mM?O{QǐME֨v ֧TNۥ:!9!Xp3ޡ( DMSbw5m3n?儿 t+12x4ԈeHL P\S.#*p$_1L"U.}+'kFSN jhqzZB-^-N25s=i\?-֚%$I#3ֈ#+l?7%LwH|4^TFt"_WԁxuAT+ۨw`]:rǯe?۱sCZ1޳h.9He>o?qjK7q?"6YRyV2[<6"+LjCK* k^EкbېL_j ᵔ;Īua>W ^/M3]t8ʂPg#a}@FXD篻`5xss>̺:B/FĒ9vFpO&IyǪ#u$UX0dbq֘b^igTO*5+ɂ//MHAR*  ^=k_LG!`>NԞaHmIؠyHw \r_ϕRl[#]8AA :j+hF{sH!|:A+S26)hQ\ |au>!d𾆉s*D]-@e Iך}NWZZHK{Q&+(sߎ+?B.K50!ԉɿ3J6S,E|=Y>/QO} Sn֚mG_ryce<[ ""8~] ?){>uEYRo#vYj:,Zht{f"ʆ"`I;試jzեcyBDT {jG Mc4jY/|y @ N@6G4m\3.[?z->P%MK+c:2;o!m;kKLi_CZM$4b4(zN=/|%A\8+'Ъ5[G9ivJ5;s]m›;)?i[&_X'6'v-ҷ>jЏjFJyCy# wGV:{!;G! n.7';[ڰ^ء8~ҬkL]Jv+Gg JYe2noV;Y212p#kRYӈV&Szͼvky@}jxWۨɶT\ک1)%p6$r*$79UisуUqc8Frish(i61 9f籩6J.$@JE7'533B[H=@t]Ƥs55N)6n~3S^C=k.iL~cFsJ-fh5吙2đ 5ŵ,ˏtpr~-yue9gzy5,g<Y3#yO76|@d6SX^Img7 pjݲg\\HMYK4rNL$K)IF|?Q@ZD'14#q+9v<)@ҝ.Mpc˜y1)>?5/zi"iN'ߝ/#C1Ea3=iȤG6GF?BFnysK>=8#dc66Av AOZW7rяZOqq Gtm@|M3"8u%e%= 5eg˹Wc['ڻ*{uz%wڭ6(7]wNVe=e$gϣN:Z -K+"e ݷzHDqH([ii)q-B=2uyUNnGy[v;f+='Od'y _& ://Mn踬N TnK;b3U yO=?}'<?*AckG=fI-DK݆$Su:ޡ,eh85bVխm2FHf#zUz̀Ev8WԿ dD!O ۞dn[߿U쉍"pC/dTU]BnO%:Aimdd[#bP'MxH9r< ֩EhrTSk{ JcqNR5Po4:nX f|bODEa1*SM<='U&)Y h=L?TyDӦv!5iW.rMsmhSRYT=I5aKǬ5o{j滷UX~'ٯU!sZ;N*5f PKbU'&$VRLˌGRIML<fER52`M7 4,ÌV@?ʚYI*pA)G\A<#LU#޽Xԩc=vHEM 6ps }I};E$G"%?zz柮ZZX vR :Sm,.EFd6+,XFR kFQ!Ud#S!XJ:&7T.9,cױδfM-q: TpH&+3Rs徢ʧ&7Pk!{M蛿E%JK0?߶?έU{5gY+rd^?͕){WW`0v=9QuN|M I>y5=F( O=p&g 8GI|.dCqK.??Y_4G.>RS56f܁`Vj]d6=U.*מ!*'t0Ў:$ǤۏҳbbHM\ _8>ƧKg M܂88?QT`j p1K83J0ƪ0:,?EЂO ꬥ·e(cPyCUfb,xgF룴R봃V I??.P?;ʬ %RNբBckf &l Zx$?dw}H wzխ%ڔ2pvw%@O&aL3Id&ݏjhWM$Y(f8XS:ȒV uWԃ'!"gJq!S/-匇w?8DžWm2לc?|3؀X9 Ji2Z$.slmGO,[[?E ;@sSW{ݏ03G'JѰ%ad@vw1¤F>#Cr*cz^P\D[' VqӮo\R/}r f?1;4О߼_񬆋RBqsyרtZPuV;sх7lO+)ݩ2qjwW~8YzoԻd6l>w[RPIǨ_ ޴ & C>??4}i].7rQO4juHe[58jwyŸFA 48pð c5->OwoGQOY9o;rLx=9Tnb=?ʥ8ՁB?@_JGPCn]:8q؃F̤#:֖ >T"=GJI TܘRШY=Ke %E/GO+*SڡEܢTUel1ȪsrsV܇%кG|Á#cҪDO3.?UK @?Rerj[h8):qgX^Ow:VEԶy<*_9,~f\H|9?x1hiAwę#&'pi?f$zwNzU+ޒ`Ufn54W$JTˌqqEQb$u49_Xܗh#k' VBϓ0bsUzBRQ5rП|?>*4-i˼֜rԕlnjQy+ ہfq>99Hm Q>ӥ>TUٟ45ִ/AX:>kDE.T m\2| \0< };Ջds*Lٍyp@, c=j"U2kyDaYF>?7Wz3XҝT`FVEyF?yzβVo2˰ !Z!>ժ2NKc>XCt[4V}]|.VrR@|1m^k&?җ{9lC(qّ7٩c&хen{YU|2gO?ӄspvO%y*@?x*x$kEIWZ,sE&NkzCp/%*Epd+08*mGўX ]Jb9ȥή[H OJq!N}ZV;N"{LCc^??i9$q B&}KBsow IB3E?z9>Vg!Îr>ẋ6Zo[Z.?:8G1+º? [M Ѓˀy}6z$miZ&ɺ k #RMhTS9au{2p2s>f d sQg}ϺrjfrGz.Г˜* y7 )|gFVa[CW5;X2FS:DIZocyO1PU {P  hGz6Vc3L~+cTq6vájܗz+g [?~߶?=`ԇ-c4~,.&eMٜ@N<= 7cZjWMcX_NwkejaՕl8Ϲs*ʪț1ٹX|ƒvM9!>n@D폘Հ8%bqjCDHx$>8r7c=Fi cj9;ճ0gbޙ<"G9 8┭`wQpF [OhK21GԨɀ7 }ܸ /ZKh@a#֥Y7*IO3O#ȗODZN$pCtzPXl/gC)%P+pDR/QխJ N}5yFԈӝr= _ob)4M(6.㝖i)-+5v:П'887Z ):c!`? *36O1i- 91?5n;uʁz|_ȡ߁Sƭ(_ٙ5x#y끞ޞdB˚|̻#F])Fh.Wc G@U?ʚt!r?}Ne,P5(t aNzqR:h$_*ӭ@%U*O-:w"m.}12ZRMc* L^F$Zj?Ɓ-\gs2<=t. $wpF[TƠMsU88aUmRE?g$^!֕8= X?Z ,14uǰ{Iw4!On`iGk74Q9]OXǧ֡MMͪߜz5R)Gs˹;_9ԯI5OH'CLHx;FO&ΤU9r#m\HCJy499r/[s>m}*^[p>hH"Tr)Z,`01|aFp(db>{SFprM=9K_A:( AJu`܃>?L8=δЯ1h֔TM(=1M Esa/^jɨFx0C֔c4czsH8)} Q{ԷGj9=  sRc>tG~=('*9?v◞48 }L)9=Hs@ƌzc,}TbSNӃ*qsғta2fioPU!QJkxdIjuG?ֳ Ma\>iѸ Ʊ{)UsI,Cd=2%is?GY;:>?w;˸ƙVHpr翱"G.>ʜxp{df,?Mب.4 }'?Q/w4?>nLJ1Fhb' 2E%1j@58i?NDF>XwZk$se*ϕӊjiYIjUҞtX`T ڷW f4bR>ռ ~ n4#Gy3AK <*gȻlY-҇ M?JpSAĊۭ%ٺnh+N?ٕOS ya&sDZhy04kr%v֗8ݮ~eGmw<ʫq?IOWܡipea$Lw-mqLQM?"ǶbܭVzٔ!48`g?O <,C09PS aeQbi N=?xOr g@( 4gZ.vy?a![d.aݹJR-CgՏ iiw?ʪVBcc0J[hdFw5-1gARRVv ƣ@AN<w*FhݮOfCegMSVsj?lV~(qE)3MuXO nSIY.bs+fԉiFcąO@8=.SY9ZBN{ӳ.exe$H5)?fAH8qK;DZo#G'Z}:[壱ǕO"GF4s8Dϔ9S*s)814fW~ TZFW;Mp<}b)"nB?J5 SXVG;;.0)-q+IRT ~~M}zUYؐdv2I(@܀`A&Z+#U70lZ"m5pK">KN}\sW+ۨiD3,δ~ruC ʹ \0n#P܉GR0`cU#-̀IQlc-0FhĢii94,%J7 5x ITel Of2]x7C:"O~1sXĄbw-4dk^cSޓ`cƨO!q1UB{H$'*y )lh`mSqsL[cmϚQWTTLiiSRP8Sݤ79!RJ4ӂ8Kޝj7o[b4hnE/jv~n4XJ9?*@@CGj,cIJp^i48Rq7AQsSݯsAӵ;YeG@fcKۑ nlu.)QpJl?%.: t=NzҀ{ }h=FޗwNiҧ~OwEI?I) 7R`z߭91h9M-!="Z@tǭK@悹O4@8拀<)B9NRF(#@}:O)AON9y$=h|;Όwa!OsѴu~tR 3:MРqEp3Ε%4ҌA(?J@.8iRisIΥqPAL=(h8>ȠD>ZvF);@ iӊ3blQڗabo<oқ )Zab<v>Pv;qXsHN8Ig;x֛AAJ.;h))' JNhAi;H'<;I:'|Rg;cb%(>s!o^LLqGM(<h<ނ)=qIJ4q@)K(uM4 kR?'jS@j4ѽ>;4͏f2vঋ'jAwpR$ w)Zi2{ 2qhZN@= &c袋ęQaC=[B8%Z~jGqڴf9\ZԏE?p#=EV[֏)kj.A=jE/ޢH\m85WoQA)J7 "oQ@qHew+ uSaJ!$g"7:PSl"!qOPдa`֫LRy-(kx"p#VXOhӷj!8(;xSt1F>a֫f?? Fa~T8u)uU0R֐҇Vb(~T $QC=:1=GGc@[1{Qn(;xP2#ΗzΪ)~Gq'Us)>?*5dw#)$_sn}F~ ~H t'ΫҁO) 1~t13 1)BǚACf8ߥ/(4, cĂ4d}qk-ߥX͏?|UQcҍ@Gh1P}ҏh hמh>͌|l3F?IG*h8ʍCBo>#@>@-?|gBo>>(~?h8hOWs!Q aHmq}/_ݍ;ѨhIGbEu2i~̿oΖJn |ߥ!7Q14}Gv '\Y#'򨅲%:wٓZh?qJn?'O4g o#k}ʐڡc4n<E/Pߕ0Gt}s3ѿ*jO~:zol_OG}1jB{)b4g!tjޒ?==v4bjCzIHbҐHt/ZJD '#`J /ZODR ;~H+dBjO?3@4@>G#}8;9fsN¸@MicA_ʟ1~T$/A'5(jiccy~1tq 2G@-FDR݇+J\`ք ;xs9O֗; b(;b~Tz*JdR(Ms(nd~O$T ۃR?)FJGJ?aT'Vqޚ41 fi80B:}iy=9! 1H)í'zZ:04 ^EEF4LsP )'`:))򦁈~M;JB9vB'~)3;1 L4m&44})) PhtpM;ю(֗5B}?:Zo(튑zRw>fV$NZuOGQNEB1gZ3PъVN;Sk.))h/A~Tv{SC4RIځ!tL4qLCMlb␚rM!= jNg/jJ iږ~@ ;Q3;ځ֐q!٤i3KFh(BhARgZ<@♺٦M @Xy4)7cC0'9?Z;ޔr8=8@ E8+]8AH O4m`bLIBXM$zBGN*0~44O,i`DrAB߮)q\2+Ytnf]?vx<uU74%-Qi3Ҏ3T@J\qHz vJO5dJi1Nui =sFA'恁HaK:QFxE'.x^3H:}iw%/JJh>14s#rh`)yM΄ӗڂ3҅4Pi}(qA!1ޗ f8~i n)r.Gҟjth@n4MsJ8t1A⛓KH3R3G#Ҙ`v4jbcG|QEdR`vX !gSqK!3BBRcR|oZ.DL8?O~>8@OSN?(;xA9 c&FA2,M0 ^y] ҥn].RX>}d;@e*I]lxjX7q{VHW(3 r ] ЈXnJSV/5~ @,:jvcTM}ɧ\#E(vOS:sϭkw.Hm8%e[ ƪ:8kTܐ̻$ꐏq֩; j%,X; 0ԗ$š:mvlTL.{RK+*{vA@NJ5˔JQ:PO5d (JK=zQґNEPS34da>Ԍu*[) )`Sh)P=) Mc D.#=2~;p6րdi:qQr~SKO 3E{ݩ3MǬn϶iMcS?S@EڠsR f4ν!Қx3qNC(?(ZC""S8ǠlsTQW#:u9'TQ#;Ҁqґg֑0nqm^~D@!zRssV=ǩ0*ƀE`#;r3RhiV0?vsiFGue9,V^2⋊niYOSZ6?ZR;bDo~s@\f=(XsV6>1yn?.fB#ǯK{ԁkvDn:X{O}4P4n:~5;=(vcN ` S㊖r,gj2 yjN;˜c&1cҚՊ6Nj;Ҫ`9Ginv➣:iƑɅ.ZƢ<̽-ȑr=*Qy33q9v*np+N3jסP+HpJ6~"aĊRcҙsds52Q)'cd'$8@\{SYS\;E$3pMg#>ƪ#)0H d59&O U +sjr9'jF?H ¿)< Ja`00z86ꊊ}[QwE+j@I}jЍ#e\F LRc|1&u ,$>`!QCk]ɸqU:&,pl<jCq[ # IJNgQw./A 4QC]}iDy\L C,1֢{Ə)3Ӹ=@3CY~Ti1;+&Bp#ȩR.:/H|>4Ӛb"߼qJ"^cO=tS(~R1' 8Gl;PpM^t/sIךb)޴qM4)ڜi 84M^H9 PGz'Ju!8@4P!h8M&/G4%8SE(҃ޛ 5HLS֓4H}i9_j`R s05_!Q[qե>5$m1彔6Gk˱ffG?+b\լQ{Ao2lc®s^**'|NF ƻXW: vV+}?:_~u(B8^=I9>_|JrG?E5ec9XѭKg{H]>ϧJX79X|vwSIo+7mT$c"JFZHb}9;֭-?l0KM]"d`?K;+u\GQv !94f'DppBɟ= $=%DV0LN J7O?mN\#4Ț}>b%LT6juٍ]X?eש%oc:`W-(Rǹm"Ʌn$*皠)qǽ;qW'_-p2LOr! j06 BH⯈S!Ħ|SCOx$bvΫB56z~c|Ԃ#HahRq'ڦJw:wDWg(VCNTzdR~AeWCWՍ|cDb1K d-YN cp(*)}(oR!Ҙn#=iB}3N;9*$dѰ}EHݔR8 GsV?EJrqMle;7u%1گC3Mh'jԾ%-:bX3S*z$s֍$-⤡M4/'TH0iڟbZ^ ]gp=i{h`)yIyaRfSSbE&hbAFii<?:bCf^?AL2OJ53G?%JW  bZ<~tFO,LeOS|OT`~Qv;3֛=JB)]Aِ/ǰٞrF3M m=vsU=P$8؜ Hp;ǹ*J<0ST2$z%c2;OHbbs&?32 r>Jbh~Vt~4ηpI\d!}žq\wr@(ޥpcҕ sh@MI@9F+PyҞPzt7|9,W 1ҭr[CǍ>K C4E3 ݞJXȣGAV6*D }?H.WHwNp+`J-ӟV*[!b4>'I38˸1h<86p3J۝/UEܖﳰ𦭹,9!IﴏxrA30#۪?Mh}rj8)隣ɩ`P)q!\y:M&ӻ%#5dd)N}i :Ɨa#q5.:{6ߝr?(ppzzDJ:?5>2zQZn4"Uaɧs4ӋJ>4{Ԁ)rW1LqN'!i=R?S$Dg4Fk2z.N3Z?Wԗt4&LYp##sO"p*Aqޚ1 ڔRg:`8ڈO$ (-=(5BG}i ӻFG988\4򏠩I<6qM :5GM hUq:Q{K·KϠh4>>݉vq@ )ߥ79HM{0iB .i 0=ihFqFOR%!`eQސGӚ@i#ӸX צ*+]皒#RpNp<7D}|SN9R-̘!1Q<`9t5k܁hӄؓB]9TC?tNMr$qv]TCm-hT zqiC.KoF9.+y풿0 Zn!bթ-fITϙjam9 Z -22D?7JBȬ1[jqUOB($vJpW1,4vHpC+`>!LB?t~6;JZ4dm@ex!BB<~jO`nFġ!mEcHݏJdܬJ4d0w)`+WQ+ -'uQ6E+2 {TwYVXwGN e#1QA7 xU "+;u?,Ԣ59bn?pI I}U u N+}MH6R`a4 D?]oni Ԛ\""z,Z!d?4No@ ="U0) A=oJ<UUU'?xz\RCl^#ns??zƞ}RQ Au1朱 atŽԫvqI_ Z|=*' O\-n:UP)꼁D`9kxgP1O+)r܋?ZQOƎbw63N5m=1N 1P+ ) ԘI#1;xSRs3@;x&o4sJ:`w;!J@NbF$Q攑ǭWFO!U<1~))GT3zncW:tޛcFzH=# $hϽz@<)qQwխdړ(ii1[ZOj䏔W=6R3QPCT>e5YW\t'K8OZQ hPPsJzRw>ƀ Q24ȧnhfǠ sȥ֣eAM鼟ҋ jid{Qm9jUSZ7To#M+n8HaZR\֝sLϽ;<:@ʔnΌ@ :҃MP1r)Ҋ^{Pޔrzg>gP!IP}#C!p$Pތ*32|7*.j ;W,N[eQj=.aؔ;sHec!A-FNLQMDLzFHf"C>}$C&ҋ R v=TM1j#9'#Ȩqג=?=KLSq׵}U$sOF3i빨*ߝ81$W"3a@R9l?cK¶PC5[XIuKeX d+@zdqxvHePw=TM5edQ͚u> O.%osjJr5a('đ.aaI+gbCӾ*%R\_i}.f.jTT+fU)z=ETo~A rckCFy$LN9)\~BkHx9;df+UR/m & &?G9w?* Iq!L-ޕӑgQ̈4tS{w N*r FLJ316?+ңx?eR>g~ḓJ6d sӸVX1?,֦K$kW#oȪf {_'bʞ#c.w)l^Cd d6=9];v4=Xy)Ɲw4\#\RQ@)fbc&i縫U+v|m5&ܹڗCÌqM'w9vN[ո~9Tjj"ī30fprr{yi^gޏƊ9O#J^haT4 L)riKqIR +c]zuf4/JmPlJ3isG1HӏA U-R1Kp=i.{1izPރC8ҝGZx uv74f \s֓8.;F8!֤sfFb׎)uɪ[ L qF֝^GLCeY?O~ [bɉ/aCȫ{WJ :O#0@#pqz ȣZUe?8Yǵ!>N2>~TA8yc c"#QvH(74th擽sƛK펴ާfS4M.i M!lu☃fuQ4T W^OA@eL}hL.z>g 1}Y Aݡg_ҕX@\!9PбNKS j-@Aދ0*煣ch=)qXwZCސ#Ky; ~PK厴Z, ^Ri;Pc)Q^g8}{B?WɠwѳOsR kvGޡiqOH!8[E4JR5ntR#U'1Ft@C1[<{םנiW,.p3՞)Iw][Hqn0ǡDVOmUFwBεn.vȌ!=͑ ?kԳP}.׷$Gcxw#ʶ3C4y_ZqVW$n c^CÃWR_h?fI%!1ɴjl3)V5_JiapNEy`BKk0NМ~Fn!9f0=:V̑>DJfdHi&WG̨5SIV& , ʧY@z7flRCX N|ons){԰ddRdv o"+w>ԄqCSsFhnmb7$|OY#>nj>HR1֣\q~U尰TI cNo~c> %@ H\v4FIq zg;(v{@Bi)9JŢrx=;bMn&s)“ n84),JBR$2C N? <}s;[QU8[x'򧎝*huBC#`\zխGIh(})9JCiޚO#Z} -ޔ ё@9QU=1@PsBviap}i*n; whoSah4)#yQ7j7=z3IAcir8|T9lҞ_Ά~( `)iIjUǕJ) 1yGqj"g'=rb)pi:RUIg`#"RXdLH!8d`Z$5RIӡ9RJqn&֣IwQdCċw<5fBBʥ$V̈́O?TyuXH ϙXc)#=4ti]1buaP=(D*Mw43†w4Ґh\o=9&E;+yc4)Qzv{S@(@ ь;ъlBbKhM(z3qӰ=):3F=23J '>*9"Ӝ OέT\IOX޿„ӁP( G/~Ο;@I Up䚑c@8QN)\,Es Tf99㩧G`ֳQVGCe$)p V1,\8*??ά^$$} G#wm.35 ov2b-"G%❃VI$mynw [*'u$m#WwZ 5>X}9]M% 6"=3P}1 >ePF}j8eˁưd2BZ h#)qQԶFفlST&ܕn5,E?jխQbdQЉ:}Fi7'0(ȀFzxϦR XF~yXu~}Hp98;j)3@ ԜPO4t=jKj9VD{fOm#Z- qP gQu-&I=E)c !-<Ԫv~\ (aUt)2M(QP!Tq`dc4ϽWA Wzъ1c(F1FRy z[;~tZEB)8UO'YR n 9q-OO( ϹGzMݤtQI?q@1?>q4@&i4@ g4t4J9(>z7v"MT{3@MASK0v 'd FK_½OG3Zz3f_΍¥Y -jLwc.MzQ3[l!I,&w5hW-\䛥dZݽ;_=le YFiq7~{p%_1['ڧDUTٌ2gʬx'bCX@+&^}Wc@&N T.^I.YttctR\S%׸&v N׵Zoli-Ӛhӝc`29 , HCҝKsn7MWR)D .aݷȱG-=>֥u &)$) 1Uqf~ɫ2M{`bXp*C}M"xA7#:\_ҍG&@#RHWQޓIc=iOf" 1J:cX9i}$w8RdwRgF$JRuZ$Dtd~݊NJdZF>TkՇ)TzTASnt i7Zc_8@;gO)nG;Hdz.qS hRM w]0)8tqAϮ PB#x ^G ~JС9MFpN#~cSqUkU}>=s 1[;"xrCZHr.' TƼ{RyrưTFJ~fnڗvE4*G4njAk? !1>?8gLcn-ݾ"/CR&Q^B0Gp)6! n{ pr$Qq .=ܸR@p)iN)j c4vz ICM9>.4J2<ӂK8 1٣8n)z8'nhZi#vPMY[K+yAG=A#U)GLJTisSYh8b3: :| 266#cnjq ^,T-T&y+)UT [푺9p*%yď@cQR3(W7b=3L. ҅ߕ;fGW&с/xӰ;01ބ1ҚG=qO'fHZZa`\ѿU7n(ɠCsAƚ=iw/j qRwA) gҏ$JlB)4(1yIRW7aHUGݤ \ƣݩ 7qh1iwzcJ>HIj‚q ,nWhb1%r)#/&Gjy&}8Tg()n7Se`p@槸l=z c"U!Ԋ ><%NI$DAl~5e/an[QY:*}N+X-+Fq-krW +`UrΥYcjN@>򏩧[y,]窢 eQzIԝM#uDϣҖu(iCje5:q{7^pM ,m*EqjXP)w y%s*4+"KVT :=3\庙fE,GJI=媤΅`ERsH[#҂?is+0)>^is=/N@F@XR ?*B=<i4VR"!ۚv~֔(.4G;4c.Mg|qJ bE.}MOjv&(sM!楤4 RRqE& ɥV><1KHa Lv@&o4i9qIJc3u8`48I4m)= Rc׀hDž8<}iH=116㸯^} chOO4s1D,ڜF>j])B:Uݰ*Kaxp>iTpm"9Z^$rL"W4ϸw.U~, q >'wJ]EBc9UoO{(P!1n|oNbp_毠)abMMˑT7n<⿨9X8"~}?M-7]Io524q*B&sP*?[8@*@BOPۖS Ԝ{gus$qq] Fl3r~@IaHٱ:1s>UMg(vAMxj̛ӳQM.ӎ:R'moZsq;?M$& hr:Sx4;Sp91PM.yGؠp)y)M#1CFySwigKڌQzP$. i:S҃i#ߍ! M )yK))67Bӽ.h*}(22EZ40a{`lKg֋,7 zN=)Fq9J;1|tރu `Raȥwgby=p1Iu')@8InR09ƔF|P@9Nǽ7w֗4.8GriҤS@+zV~Ã@O8Z6{\0)wKLRRqސM " Pӂy(){rE16')R{I@@)SKh Rd6)zU)C t"vNێ5S? 9=iw%!Lzi8E-D35inxc;-n3ؑZҼfHҌ˅^D 3!lwV.3D݉JY. a*X3 ruFjq+)cHy؇"$Xmoz^Z𥨃q qZ%af\JzbdSs$8NqI\sRzuD٥a ʃ£,6.f<+cRybi /twO- r2CKGj[ɰQX?F\|7D, 5r;c#硨Hfzl]0;Nf?1͜Sri֜H4sK;PXƁQ?pGR #x)F8h0*),ą*yT H=qJi&ػE»zUGMVH];{eAy4Ue\$*S!~g;`g8KN>^D3"4HQfym\FÓںrk<]dc7T#$0~ҀǵxFğ1LAS7>3Γ{gh@KSX7LRaN`*EqM*qR=*ϭ!sA M db (}igdoKژ 6n 8)J])OzqE7mJV x=P},Ac6FC)Mf=Kiϥ)Ԁ?zjEc9&PT\T%Zu4 \PHq@X ԛx 8  ϭ8RZpzQ}@h'&r(<cM>hcr)sn)N;P(8y@#GrjOq7CFؤ\V3R4ҺHL7Zg6jz,ԋX`G=#E5&4[F7pK*c- >\Ѹ T#B}k5lTD4;ُ2TS~^dM]n =;Ӱǩ'HA=Ȧ`l99Pִeᘐ*UnՌQS8+Va19=ۆ6THQQJ±^s:(1:WaЌH@S(*/&N1@ r;Δn}E.~H&3ҜqLR{f}H123K>@=1@%OAMJqSS1J`nsIx0NhL,.@=)c=iy(ۏcœ=OJs!<=2MR&2z O,pzΞzd "JSGP)i۳޺'(5QQpOY~G 3Pޢ *ܠEe1~*N{G^⹂Dg#B@Ss┣lz4bhaAR zҶ [J1 JSb᳀ث0A#V2yʁjXStfl尮9 ֟&zyFbU'9⮺3!  [.Î9ayI@&ϗҟȎ1?SZ4䀨sQO/ 9H^PF"EqWg9Kvdio#DE,($˸6#,?cĉ{z&wRFMTb;]ƒT]A0,@m 2'5n)Myk9C|)k. ؜rܬ n҄\qG(ҫL |ȶޚcOM*ݠ.GHPgTZu'w"ۃajq zΗOzh{z_-1κ`fݸрGJx0:t GH֤(ھQ.?*_% ړ.+Jlrai8QHVԊb21xxzYXK:PiO!=iwJ)"_CM9pF(q)0=E;Ҕ:xP}(Ȧ;oSQRmi<Ť޽sf )vą3ӱK8 ւ=hކ(iH>C5LsJ"y\{Vkݪ9ӑFjO(Z_({t+n6J}d N Ubj0'%zF8"ԬM!qڭ9h")!p<y}tbU=B(*lF `^\NY>tM+t?<I.qql G~\ԁ8)Xg^nf|$ӏZ*P4jG(+ɩC)kʂ?+o8iTF@ǵ1S\PI厛M+Dp;b=P1r1FjC8٦K+⃑M8cO9WGR)sҔ+d`S8G(0HBAIJ3H43Kh4)ԝ $(G=M7#֤`)EH.Cn=5:ă3RtW+RӅsP={ UW”p(ڔ ^Ԁ!z3F ! lfF>~4"JzҀ ҅>@(g1 Qs@P}~cV#[ 3 yEv^2*,q:e6Hxv+A[Bed>ь, XLj-{w\*_??#ˏQ1EZVI7*ӶbiݨG@=)R`W 4&ZH0TB֌4J}ZBIXޜRz ֽ**8~-HPS)3^` BQO&CBiv '澀#"e8UC٨bGC]QRG;U@҅jR:]Bɸhau;4O\iI\`=#~zќjۚ8DU.z6,g,{fI f7fXk,H۶oa.Z]2Ic ?s"9%-s|8;sE c<>vʹc9E- z悊zQsF>ĖMo& l`c+TzuPF@\ٕHΜl4<%{  {Wqr:SZB13J) `i ;rz rz>茜Rg֬ x'$Ԃ8p9B$qծ=)ic-T/lz#3҂nƄq@}iuJqz L'IHc6Rl5&x旷jf>=qJ3ӑHX~7=8) oASȦi1(M ~-, ̂l5m~gI$MY 4[X\%]#3*:LHCv9RGւr1Fj*g?9'OdIhԸ4`Qq繠CK= *:j@3TGݪ~)0G9vԠ\Z\ =HqIzq,+g?z=ʠԪGJNS! }9`Ym*SՈnriPl5#S ښRlǭDW`F@IF9>4&FNΣ5Ԝgƣϥ;'l6B,~@7Ӌg)>]ɶR@]ixR86.zaK~} 8#"q5v(f=?֗?F9N@n+hfE63}2TA}wTX~Ѓ`dC.xn;L:Rӫ@zTXnkQP.8G8i>[s,uT4,KXO,OOoJ^sKh3όHۅZ*/E$~T;~x@\UHd _O™)Bn4'R-(tud^s9(#y"n3A}h҆%ƌJ`b ,zS&yo1@ ?Jn: VzoJ$_QH,/Bp1\w ݎ4au┸1 玔9A<PWVCXgegidIc $r=)6fHbS$zՅHGYq[۪IБG?J@1NŽ TɌNˤa17:˱5Nbpr:\VPVU1Z9]ܥT~6{,!^ضvɪpNS'=j@SAcXkuwڵ]%RG,6.JAp+iQ" hvFj7d3}܃bsDVN#F?dO49,򤹸 .ɤ@ە(|ƅOz'q,}iUPJ?eqӧ_lbfzRG RC!sSIqp)u8w() ^qJGҎ} \@xz/Ƴ1dyNH"p!i{Vka+]goJB KlV):6ьUFM; i#)Ҙ'^swQQY9ƣ'Tp˜HJZh֟zӀ8Alh+ hO`gڌs֐&)im6:LdҔCMoZb0M7$Z2hp}iBdXb>>)rzXU`bMn+ҫFM1X S I/`)VrI *sM RힴjZDP٧cޚsR)8ɮt6>QFx]Dq=I&sQD{) ņ9''0 I9ZTBKFJx<J`Wnp?Bv@ %7v% 5]1ⲯ%UYh&S^lbdh9QZJ6%3֗7LFwӖ|D8 x<;xnv~TVX{{jiUoCM恜k\348'1FF6?ǖxgc0*IQǹZcש0N{ 5BC<zr=zt'̵w,0AOztfok̿4?ړ4܊PG+[ĊpFFFzVG`Am(s VUq>ƔT}+؇kbCV9jb#h=Sڗڀ[?toJ( mݦn4 zC!8.v5!AFaq>.R_@>?J]!X"cu+/ҋݔ=M.Xo84 h4y.A;[ښ3[c74n!! ֥d׃Jcv]`!QǑHQb=ǜgmԧ\!M w6сIeHi*tRÒCڈ|]N9aR/ta8r ڎpwg(Pu܌TzR"w<< Y_ ,N"XpFF8V],ܲᢉ@(@vmvYHǔ5P9PjvrX^LF8y$q:gW$ hhn? EW)n3¦ܗͳ[a`~嶂(HAcUV#>2Aл˽I]p>|Ef4 `:VZ8({ a;GAT-K׶[IF㒻qUmD-5&Bّ&08Lqf%Z;[T$~5 }H-&B@)!Xo_J[qEBIW,yh$e8+TFw'&"'hI5fvr14۳ZQ'f57+l#w1-&ǠZa#op:46—V#i6@ɭ,eq"%b`i2='^KK?\PJip8" ā]rctVvW4+N+HnjLwcU-r9'1Yd$fIJO0c(LTyCZie '8GncK)F8 j4SRHgH u<y CQ^‚hzMQ?A@\PqKOqۆzzJ1Jb硨(&$H)45i ~Abii':֝3Ң?5#&N1MR);6E5ښ w_96%WR1UNZvTw#i#]ѐ]kj4i3J:4Pǂ54 H%ȮHνNRr4zJǠ IJ`;#4Q4RqF3QQC1CߞVOkURڿt ?WQԥReF2ŝҕ7. jZ|I%*#pJHK7Q.X85fihHo&ۻɔ/?1F#E?c(|dmzA܊Fո;#ʪ3۞i+D>F@aUϚ^}p*;LRwj2һ~PX$QZxoR1~P{P2B1uq厈&`*}?QӦ2)VY2JkPr!BWU숞BU1@*#zcv mvm"@ôz*_;8q ) .>M|U4mEik\Lc㏔uVҭ"ԯkg|c߸G\W4rEfmnHi9cI2ZTxUc8/3یFI^z۱%xY?ʨ_'fF8L!\sB;cU9(W!AZuPXWr:}k&G y!xJuCc;4>$ddcCKGӸgGn2N#ڔ2 Ҹm87uX [mʃNHաlW8[)<0?;1\ӵ\&H}>A"D0[i8NlP= cy+ւ֜A☀!)T_)*r).8Р֚xMJq4sNVQ {r})GzUax&)aI|,7FGqJ;1ҹ[lvu├3jMޠU)RbrO^=9Shn'*o,zӄcր!AOc<p@WuHV"X(D * hP4JKz CH9qF1JTXvQJz`j7MbI!y1f<5'?P$sO+/u`E#ԯCږ7q«gkw Mѡ_[(i ;I=MmXxK/$WYmRxaX߅jѶm};[: kyY3o_I'YүmMD''lwu;|}B=4r$Tti^3-Jnۙ>i2q{ը7Weqƣ\(,{nmV9+R,QO{ xroc@SM}?N>&Pʤde WrFOJX#-`ϭ<ᑐ3㧿po'XI7g3<ԒGdv9f|z׃4KjΆQ8?UY0>>? va6ExXBH~UM m}ZLSQ媔.lX.Y.bS`u}*FwrI4! i"b$la=qCI1&6q֕ vQ(4h=B?>@Y}%dS 8=rM(T$0.}TN5 JQ \j~{/qRV+舌rw\}i}v>?*iğ~帝<Z/O0~dM*"DuZG=?JaGWa&*>5& ӗڗg@)(g94))H<ӽ! 6"<ґOJDt"iVR20i &;V. tP=M 'jN2H.ғhIV`ԸrzPOpqNߐ) h: RAJRgA4w(aL}x sҐH3rq[ (Q ^NUx283G=*6+ws?(fPҀ4:gGRP6(FE3 X֛0\M uc=V#?;GͫYFk3T/dNQee>ͨU;ԃEE"4.T]ޗq5D:R`ȧryK;Bv#N5Cǘy5L\Y^Ix% .^OaK_ϔwC}Nꆙ<.1ҫKpPt\\J*q ֯q4 Q`:8AAŹ 0XԤ5[$hd:| ~u* oNOqN!!LOZ7f/(9!@LJ%nKXݱ QF?aj[m|xc%sQB4VtdacRy?Bj) 0#`{ !7j {ԋe<|V?Rax Y'jtQ\*BS.P+ ! 8JCթABAc:ֱVaJ.4Dd%x=)@P*=u҇Iz!cғ͐2:qz6M`9AjB2u=dq@l<oy\}k(ǚT\+uL@eq/CK s(+{cǹ6_ OHnqMsLH*GnE; c4a!4!=E RoQDZO 5L, RM9GZ⋁ B֠Ҥ3P,Lgޓ"w 4̓ڜF)hZ4JL惃{SA8A@G?7^Խ3Gh'44P1x4=jOj(9=4wHAS@ 3Hq)p*]j.=XJ j~N ㎴s֭T"G(%FLw@is-JS.* `ƔH]0\SN3R}&sXQl UH(9*?1qsJ"VJ HHiy)Ԃ~犏KǮg:Aa:f+\Z;ni րs!|N) '$TòSIHsH]ONiǚ-Ҙ(jPOMH&*,ӁP1Hs^Lhb G YC `W$0d']Eob$o$л`}N EQMrQHT֝ӽ+??SGÜjskedRO3~3(,O+.9V9$kWÊK .prFGX8SZ InD1 M<N\ZAaHjE=t ֆDF7Y@1G Fi3} ܯ<р(Q!}hlp4÷qL;3ݟœ/&qǵGGT:޸Pu\#(T~A4X#B'ZַCv b,N0-L+Iӵ݋hF84nT&:~ÁJŐ)rjG҈ILEUF3Ld֫X&!p)zuUP?q@XzpޫQBti#)*$`mieWځX֟ک|IeʜjI=ُSg#K%ğsLYC>SR2E tj1w4~4}h$j3/Z&8.):{3ךbE7ƐnݚL{Fh7){*v.}:QR,3Hr{}()h'ހMh4y؊n9F 0di4)q(biMsM;n;E7a={>nkNh1X^qJO@hT2{T1JҤI ta;9$=xI1H_q]Mp֓nI?ʍw4gʐ~KRg.z6 ?J06*S/Za pf18A)c=)S}iJ`J;Rn}(9/fw~ ucB3޵k* DsB\H9śM6La^b[r6I>+;:\\ecP~)v4tѶ=)1r"ֈS41$g4~,K|?"9@ry"Qd i{Z' eAԺh}*UW(r ҜRj4 =1Z: ^|x, R ^NF܂)c?iu*eHNE;h-J:Jdtys(8PGFtһFy%b2erɧ>Zi\.;J{PXS!0oB8Rd"ƄgJΘ*PN? xSAqNV>#HXHR1(JGjCM'Kv$3R Ϊ,3Z᏾3Ofyfm-"N=i(bkbL0q3sv4@E!=("1OIU)UݨF^"#Ҹ]'pN޸#P1[($K($7\猓V ᘎ1P(*xTrWpIZݚ[.E?w@Z08'ǐwgj4ƔM(5%?֔L󔁕&2tZDJ#*?>0'A09KJA֣nj8?Egv;=?1Q+zS#?:k&4@R1RSmGjd>(y 5%fPȡTSA\S\q7Fh 01֗C@( dS)␜nO< r)z$Sǫa2;FO8汃zsۥTI4>[Y/P1pN7UBu[ 9Dm>Py\nĎ98Hbn sy(Rt⋯_'g̒:!;Ng}2rm1S%?5)˴?4 d#j1Ɨ$'? dAR"9$-FK# sާv',{1?=g5LvzzJ=XI9]qnv1KcL9iJ )Qҙ>wݤ>INq@8yJF~,HҥJ>\TAhOSpl&j+OR3fziP@A1N 鬠$MqӚ9(VJ*!d:,t:73OU˥ T9aDi cSדڔ#jh ̴K=1ī&tQa41^lTDmR-I*d+R(\t+A9ʒy1'OI&6#F~ke7^T=oA"WJ:A;311>Th՗fYeB8VsL"08܃iاq“wڑWGCv91 cP:RGAHE hn48An…c0E)$v,Jx\=ǭ03PpirJBڐr@(F^x&RۧI}h 4.}oq@ Z]ߕ&RgfIۊ@.8QPKd)M`t'M<IM8ݺpM =i@)2s҃ @&Fh,# )*9~3U%% ?ZNm0i\ SqN#nG  piFM8'$=)6#61OPh 8& @iL<2iҔjF V5(m斴ZThsƐ/goΊCZbg-!iF{4֌ɷvRCCKJ$RHeq9L4g\mJ,(F[4tBCtOD*0ڣXIbT\~+ ČN8\q^SNuv?W m/:<|![< U(zd1[^vX 'P Ţkj .0[?em+OqS!$&({U$ T Sp&uaAyN2F|zd֐0'ޚZZwւInQUgW b=E4@6Ry`i÷n>7r6 QDs>3֞Z4OA@P.}<(F> wGLPҚsҔsҏo@S.Hs֍81ɧM {R╀~ph ߡNW#-te }i=JfyvBĒ* (]ǂ'pĮI{4ocwF*0Y$cU ﻕ5v1ncnT :{n~4'5"ήq5 ǧ:WyR`34XW+E *F!'M.9'=xBv(˷Ӛ$ '?J1qf?wO'JN`5,Ddd 3ߥV㊶_$H O=*sn8S գњn9;&H)z SX'9if<ҚHV΢>Nr?) iMXC' GM*E-5qC$+N)cl!x]y87,p.; ԣ9h3iFi)E+!ݙdkpc?vp)fP*Qk9\dcԊ I9Ps3/R&#+WhBfy~[}9>Tee0vI锧@cE>V;vErG#wi1>@:)i@oK~"=*.doΔPOҫHH V4\V-y(5X sى!@b3iJJa s=$fuf;-=) WSc 2| pU'| trn. {R*I?9qҔ=@8JpG^h AnS81j0GB3IdYG?^) !.V<6:ӷ(#jJ{~Bc$R(p✟f+c¤6{JSbch6i2#qN5c=2jm1BʔXHNրlX5 q?8ay;*TD<\58Y}y* F*CԱR!M]架Q>F* 9 Mb2p[F֥A•EiTc;C`Hأ.PImq- >iT FNJ lA |r30(G cd+85a=7ƬZO@UykX)*=@R }6RcEkUuNJz0Ni.?Ѣ]V98 g; *EQd>b;7  ~IzRS0QKdz*\(\ZVb SV[yfuZSain3]}G5ړ#ދsr:K/&+Hi8Q>c,R=Ƿ54r1HL-NeOpHTf( F|jeP;b"hFh9 ڌeeBsq#7S?;Ox ?$h*[JT.)F{bnE _SNǮ( @8=( ;31@iAy:LM=i(v9Fx&Kbm_LRu8&rs G MRoaLS¨F/\.@4:qPA sI2!%-MHF٣7&ӃHbdS)03څH8qHH+~2d g>9 d.d9H %O=))(R?Uȧ;qiiArUČ=?'DewӎJ}E'{`g $aF?9w$(#>vN sU l r@43pZHxM<)=R2{Wh9޴j6 c*DzRg4Qw5D !oG>FF)HHFhG>4m éӑ^q1qE7jvcւ+Qn>g'\ vPz њ0()ir34COz]bh@V:p(sҕx\tj`sN(0Nr8Q4dq@ϵyQ)2J^ &(֓9. !A&-&@7 ;␞zS 24g׊iZbiKZnNhhwv4Ӛ:fh@QME:L[&hqQ3@"@(8Ҋ7❟jNO< >^⃷ߚL1#$S=3@ (㩥,rZDcB88 'Bb~@BG9 ;@n0),3ީ,sґ1*Tv *D#h$ +RUݒWgTܐ#&v u2?4qRv$J3F@i g^u◷JoJ3GZN.GJ)8@4v=1QL㠥{S0Rfh cIP8ҏBI&hO掝h&Fi 7 Ri }h@~PG4g'HOz^i;c(`2(z3Si3h#)x18u 2017-05-26T14:05:94 Pixelmator 3.6 1 5 2 72 72 200 1 50 4PIDATx[Ep @HDMT BbDAM$o-/&5J" D.^ \-Җ^,(`E5{t>>={O盙o.k֬fiOk@^z 5k@£y5ᰦ{KS6KF&wSVgM渺 鿇e/γ^$$ _|m }z)3.hmsmʴyfY cx|,B}Fqpe4R(fK#_G&&l׆ O[ܖ;˳wmCŵfAidtr#R~@xf +®KSm@_G/׎ZwE4 ,rvt;7u4ِ2dvKA|(i}yu_]u tEj^4lq{Bp[Gu)\KǤ ׅŹ^j`Vd/7/!ڔqvP_E!'4^hwPڄpFmaZ8Fgt -.<}>Rc. ԋ2Wd5`9ȃ asX(yʗ$sO7f GhwhkuOC?xb$pD(^-8?CN+,;O{0Ŏcx*:[#G232G뛲:7~-cO hX;W _vv%=tp<; |s8n7h0滓X1:}Yyqq%ᰀѦqi96qR<2G=NWvR皔7F°]?;;NuᦰnWҾ'9ԧ ,Bqb@ ;$uGCpޖHt܅ƺdSnBw̯8|w؅S{gO 8\~6lUjʺ&<5MX%/-,aIwϒe=G>I'ZR –p\!{mO0Qxg^+}vxH6UgaOɎlQj{/#[QI҆v{$éʸꗃ<9~Ɲ0 C / :H1'Rإ9/F2{1ƴ@]˥|W}F/oLr5D/Űֆw uS۰Pim |afG9+l!d!sG%_^ꯀ^x90׀fLCq>G5FX<0>Has};ݬh]ƑShq] 8Ʈ[z̄SE<\*cwdg|m(?/,xNCΡ>xDPk[y$䈓p=ѡ{ CA4_iSgPxTxR>םNJt0dze9l rO @ v9.<Q6dKxDC' amxnxhȐ]:2Ю_ԏKHQjlOpRoF?Ip̋[\g#OڙJ~y,˨>~0,FHp,0N_q:a2=)#s (|(@8&O-LrQ/tK:]Y`t|xcp\H'@"NR..Hzkh8Knk1C’'7lIw_gBN`4Es;GrfuJE5}$7pP^|9Ģ2x2e!Rb2N=)JD&8a!}8]_h yxv¸=ͳqpRA:= 9᎐qKi5{$_Wt"AU2|f&7 l!ԋ 1V,/c)e+H[d.}~<[ڪ7n;h26A;Q8ţ]t'ڠd(=1}^OLdP'C.. \vq)ʳμd5z.-ckhU0nR I-Yȹe_ۏ++[k`5;,Z/~@ M@22oJۣC:^EO2 <xYxbӴu8/Ƀl$gIENDB`libvips-lua-vips-6959cc9/spec/interpolate_spec.lua000066400000000000000000000017341475211264700223100ustar00rootroot00000000000000local vips = require "vips" -- test image interpolation describe("image interpolation", function() setup(function() -- vips.log.enable(true) end) it("can rotate an image using nearest interpolator", function() local interpolate = vips.Interpolate.new("nearest") local original = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, } local rotated = { { 0.0, 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0, 2.0 }, { 0.0, 7.0, 5.0, 3.0 }, { 0.0, 8.0, 9.0, 6.0 } } local im = vips.Image.new_from_array(original) local rot = im:rotate(45, { interpolate = interpolate }) assert.are.equal(rot:width(), 4) assert.are.equal(rot:height(), 4) assert.are.equal(rot:bands(), 1) for x = 1, 4 do for y = 1, 4 do assert.are_equal(rot(x - 1, y - 1), rotated[y][x]) end end end) end) libvips-lua-vips-6959cc9/spec/meta_spec.lua000066400000000000000000000033041475211264700207030ustar00rootroot00000000000000local vips = require "vips" local ffi = require "ffi" -- test metadata read/write describe("metadata", function() local array, im local tmp_vips_filename = ffi.os == "Windows" and os.getenv("TMP") .. "\\x.v" or "/tmp/x.v" setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) -- vips.log.enable(true) end) teardown(function() os.remove(tmp_vips_filename) end) it("can set/get int", function() local im2 = im:copy() im2:set_type(vips.gvalue.gint_type, "banana", 12) assert.are.equal(im2:get("banana"), 12) end) it("can remove metadata", function() local im2 = im:copy() im2:set_type(vips.gvalue.gint_type, "banana", 12) im2:remove("banana") assert.are.equal(im2:get_typeof("banana"), 0) end) it("can set/get double", function() local im2 = im:copy() im2:set_type(vips.gvalue.gdouble_type, "banana", 3.1415) assert.are.equal(im2:get("banana"), 3.1415) end) it("can set/get string", function() local im2 = im:copy() im2:set_type(vips.gvalue.gstr_type, "banana", "tasty one") assert.are.same(im2:get("banana"), "tasty one") end) it("can set/get through vips file save/load", function() local im2 = im:copy() im2:set_type(vips.gvalue.gint_type, "banana", 12) im2:write_to_file(tmp_vips_filename) local im3 = vips.Image.new_from_file(tmp_vips_filename) assert.are.same(im3:get("banana"), im2:get("banana")) end) it("can get property enums as strings", function() local im2 = im:copy() assert.are.same(im2:format(), "double") end) end) libvips-lua-vips-6959cc9/spec/new_spec.lua000066400000000000000000000222571475211264700205560ustar00rootroot00000000000000local ffi = require("ffi") ffi.cdef[[ void* malloc(size_t size); void free(void *ptr); ]] local vips = require "vips" -- test image new/load/etc. describe("test image creation", function() setup(function() -- vips.log.enable(true) end) describe("test image from array", function() it("can make an image from a 1D array", function() local array = { 1, 2, 3, 4 } local im = vips.Image.new_from_array(array) assert.are.equal(im:width(), 4) assert.are.equal(im:height(), 1) assert.are.equal(im:get("scale"), 1) assert.are.equal(im:get("offset"), 0) assert.are.equal(im:avg(), 2.5) end) it("can make an image from a 2D array", function() local array = { { 1, 2 }, { 3, 4 } } local im = vips.Image.new_from_array(array) assert.are.equal(im:width(), 2) assert.are.equal(im:height(), 2) assert.are.equal(im:get("scale"), 1) assert.are.equal(im:get("offset"), 0) assert.are.equal(im:avg(), 2.5) end) it("can set scale and offset on an array", function() local array = { { 1, 2 }, { 3, 4 } } local im = vips.Image.new_from_array(array, 12, 3) assert.are.equal(im:width(), 2) assert.are.equal(im:height(), 2) assert.are.equal(im:get("scale"), 12) assert.are.equal(im:get("offset"), 3) assert.are.equal(im:avg(), 2.5) end) end) describe("test image from file", function() it("can load a jpeg from a file", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") assert.are.equal(im:width(), 972) assert.are.equal(im:height(), 1296) assert.are.almost_equal(im:avg(), 113.96) end) it("throws error when file does not exits", function() assert.has_error(function() vips.Image.new_from_file("/path/does/not/exist/unknown.jpg") end, "VipsForeignLoad: file \"/path/does/not/exist/unknown.jpg\" does not exist\n") end) it("can subsample a jpeg from a file", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg", { shrink = 2 }) assert.are.equal(im:width(), 486) assert.are.equal(im:height(), 648) assert.are.almost_equal(im:avg(), 113.979) end) it("can subsample a jpeg from a file, shrink in filename", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg[shrink=2]") assert.are.equal(im:width(), 486) assert.are.equal(im:height(), 648) assert.are.almost_equal(im:avg(), 113.979) end) end) describe("test image from buffer", function() it("can write a jpeg to buffer", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local buf = im:write_to_buffer(".jpg") local f = io.open("x.jpg", "w+b") f:write(buf) f:close() local im2 = vips.Image.new_from_file("x.jpg") assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) -- remove test file os.remove("x.jpg") end) it("can load a jpeg from a buffer", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local f = io.open("./spec/images/Gugg_coloured.jpg", "rb") local buf = f:read("*all") f:close() local im2 = vips.Image.new_from_buffer(buf) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) end) it("throws error when loading from unknown buffer", function() local buf = "GIF89a" assert.error_matches(function() vips.Image.new_from_buffer(buf) end, "unable to call VipsForeignLoadNsgifBuffer\ngifload_buffer: .+") end) it("can load a jpeg from a buffer, options in a table", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg", { shrink = 2 }) local f = io.open("./spec/images/Gugg_coloured.jpg", "rb") local buf = f:read("*all") f:close() local im2 = vips.Image.new_from_buffer(buf, "", { shrink = 2 }) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) end) it("can load a jpeg from a buffer, options in a table", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg", { shrink = 2 }) local f = io.open("./spec/images/Gugg_coloured.jpg", "rb") local buf = f:read("*all") f:close() local im2 = vips.Image.new_from_buffer(buf, "shrink=2") assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) end) end) describe("test image from memory", function() it("can make an image from a memory area", function() local width = 64 local height = 32 local size = width * height local data = ffi.new("unsigned char[?]", size) for y = 0, height - 1 do for x = 0, width - 1 do data[x + y * width] = x + y end end local im = vips.Image.new_from_memory(data, width, height, 1, "uchar") assert.are.equal(im:width(), width) assert.are.equal(im:height(), height) assert.are.equal(im:bands(), 1) assert.are.equal(im:format(), "uchar") assert.are.equal(im:avg(), 47) end) it("can make an image from a memory area (pointer)", function() local width = 64 local height = 32 local size = width * height local data = ffi.gc(ffi.cast("unsigned char*", ffi.C.malloc(size)), ffi.C.free) for y = 0, height - 1 do for x = 0, width - 1 do data[x + y * width] = x + y end end local im = vips.Image.new_from_memory_ptr(data, size, width, height, 1, "uchar") assert.are.equal(im:width(), width) assert.are.equal(im:height(), height) assert.are.equal(im:bands(), 1) assert.are.equal(im:format(), "uchar") assert.are.equal(im:avg(), 47) end) end) describe("test vips creators", function() it("can call vips_black()", function() local im = vips.Image.black(1, 1) assert.are.equal(im:width(), 1) assert.are.equal(im:height(), 1) assert.are.equal(im:bands(), 1) assert.are.equal(im:avg(), 0) end) it("can call operations with - in option names", function() local im = vips.Image.perlin(100, 100, { cell_size = 10 }) assert.are.equal(im:width(), 100) assert.are.equal(im:height(), 100) assert.are.equal(im:bands(), 1) end) end) describe("test image from image", function() local im setup(function() im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") end) it("can make a one-band constant image", function() local im2 = im:new_from_image(12) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:interpretation(), im2:interpretation()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) assert.are.equal(im2:bands(), 1) assert.are.equal(im2:avg(), 12) end) it("can make a many-band constant image", function() local im2 = im:new_from_image({ 1, 2, 3, 4 }) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:interpretation(), im2:interpretation()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) assert.are.equal(im2:bands(), 4) assert.are.equal(im2:avg(), 2.5) end) end) end) libvips-lua-vips-6959cc9/spec/overloads_spec.lua000066400000000000000000000173741475211264700217670ustar00rootroot00000000000000local vips = require "vips" -- test all operator overloads -- make a table of x repeated n times local function replicate(x, n) local result = {} for i = 1, n do result[i] = x end return result end -- apply an operation to a nested table, or to a number local function map(op, a) local result if type(a) == "table" then result = {} for i = 1, #a do result[i] = map(op, a[i]) end else result = op(a) end return result end -- apply an operation pairwise to two nested tables, or to a table and a number, -- or to two numbers local function map2(op, a, b) if type(a) == "table" and type(b) == "table" then assert.are.equal(#a, #b) end local result if type(a) == "table" or type(b) == "table" then if type(a) ~= "table" then a = replicate(a, #b) end if type(b) ~= "table" then b = replicate(b, #a) end result = {} for i = 1, #a do result[i] = map2(op, a[i], b[i]) end else result = op(a, b) end return result end -- find the sum and number of elements in a nested table local function sum(a) local total = 0 local n = 0 if type(a) == "table" then for i = 1, #a do local new_total local new_n new_total, new_n = sum(a[i]) total = total + new_total n = n + new_n end else total = a n = 1 end return total, n end -- find the average of a nested table local function avg(a) local total local n total, n = sum(a) return total / n end local function test_binary(name, vop, lop) local array, im setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) end) describe(name, function() it("can " .. name .. " image and single constant", function() local im2 = vop(im, 12) local a2 = map2(lop, array, 12) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " image and single constant, reversed", function() local im2 = vop(12, im) local a2 = map2(lop, 12, array) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " an image and an array", function() local array_constant = { 12, 13, 14 } local im2 = vop(im, array_constant) local a2 = map2(lop, array, replicate(array_constant, #array)) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 3) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " an image and an array, reversed", function() local array_constant = { 12, 13, 14 } local im2 = vop(array_constant, im) local a2 = map2(lop, replicate(array_constant, #array), array) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 3) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " two images", function() local im2 = vop(im, im) local a2 = map2(lop, array, array) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) end) end local function test_binary_noreverse(name, vop, lop) local array, im setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) end) describe(name, function() it("can " .. name .. " image and single constant", function() local im2 = vop(im, 12) local a2 = map2(lop, array, 12) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " an image and an array", function() local im2 = vop(im, { 12, 13, 14 }) local a2 = map2(lop, array, 13) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 3) assert.are.almost_equal(im2:avg(), avg(a2)) end) it("can " .. name .. " two images", function() local im2 = vop(im, im) local a2 = map2(lop, array, array) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) end) end local function test_unary(name, vop, lop) local array, im setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) end) describe(name, function() it("can " .. name .. " an image", function() local im2 = vop(im) local a2 = map(lop, array) assert.are.equal(im2:width(), 4) assert.are.equal(im2:height(), 1) assert.are.equal(im2:bands(), 1) assert.are.almost_equal(im2:avg(), avg(a2)) end) end) end describe("test overload", function() test_binary("add", function(a, b) return vips.Image.mt.__add(a, b) end, function(a, b) return a + b end) test_binary("sub", function(a, b) return vips.Image.mt.__sub(a, b) end, function(a, b) return a - b end) test_binary("mul", function(a, b) return vips.Image.mt.__mul(a, b) end, function(a, b) return a * b end) test_binary("div", function(a, b) return vips.Image.mt.__div(a, b) end, function(a, b) return a / b end) test_binary_noreverse("mod", function(a, b) return vips.Image.mt.__mod(a, b) end, function(a, b) return a % b end) test_binary("pow", function(a, b) return vips.Image.mt.__pow(a, b) end, function(a, b) return a ^ b end) test_unary("unm", function(a) return vips.Image.mt.__unm(a) end, function(a) return -a end) describe("band overloads", function() local array, im, im2 setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) im2 = im:bandjoin({ im + 1, im + 2 }) end) it("can bandjoin with '..'", function() local b = im .. im2 assert.are.equal(b:width(), 4) assert.are.equal(b:height(), 1) assert.are.equal(b:bands(), 4) assert.are.equal(b:extract_band(0):avg(), 2.5) end) end) describe("call overload", function() local array, im, im2 setup(function() array = { 1, 2, 3, 4 } im = vips.Image.new_from_array(array) im2 = im:bandjoin({ im + 1, im + 2 }) end) it("can extract a pixel with '()'", function() local a, b, c = im2(1, 0) assert.are.equal(a, 2) assert.are.equal(b, 3) assert.are.equal(c, 4) end) end) end) libvips-lua-vips-6959cc9/spec/write_spec.lua000066400000000000000000000113211475211264700211050ustar00rootroot00000000000000local ffi = require("ffi") local vips = require "vips" -- test image writers describe("test image write", function() setup(function() -- vips.log.enable(true) end) describe("to file", function() local array = { 1, 2, 3, 4 } local im = vips.Image.new_from_array(array) local tmp_png_filename = ffi.os == "Windows" and os.getenv("TMP") .. "\\x.png" or "/tmp/x.png" local tmp_jpg_filename = ffi.os == "Windows" and os.getenv("TMP") .. "\\x.jpg" or "/tmp/x.jpg" teardown(function() os.remove(tmp_png_filename) os.remove(tmp_jpg_filename) end) it("can save and then load a png", function() im:write_to_file(tmp_png_filename) local im2 = vips.Image.new_from_file(tmp_png_filename) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:avg(), im2:avg()) end) it("can save and then load a jpg with an option", function() im:write_to_file(tmp_jpg_filename, { Q = 90 }) local im2 = vips.Image.new_from_file(tmp_jpg_filename) assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.almost_equal(im:avg(), im2:avg()) end) end) describe("to buffer", function() it("can write a jpeg to buffer", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local buf = im:write_to_buffer(".jpg") local f = io.open("x.jpg", "w+b") f:write(buf) f:close() local im2 = vips.Image.new_from_file("x.jpg") assert.are.equal(im:width(), im2:width()) assert.are.equal(im:height(), im2:height()) assert.are.equal(im:format(), im2:format()) assert.are.equal(im:xres(), im2:xres()) assert.are.equal(im:yres(), im2:yres()) -- remove test file os.remove("x.jpg") end) it("can write a jpeg to buffer with an option", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local buf = im:write_to_buffer(".jpg") local buf2 = im:write_to_buffer(".jpg", { Q = 100 }) assert.is.True(#buf2 > #buf) end) it("can write an image to a memory area", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local mem = im:write_to_memory() assert.are.equal(im:width() * im:height() * 3, ffi.sizeof(mem)) end) it("can read an image back from a memory area", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local mem = im:write_to_memory() assert.are.equal(im:width() * im:height() * 3, ffi.sizeof(mem)) local im2 = vips.Image.new_from_memory(mem, im:width(), im:height(), im:bands(), im:format()) assert.are.equal(im:avg(), im2:avg()) end) it("can write an image to a memory area (no copy)", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local _, size = im:write_to_memory_ptr() assert.are.equal(im:width() * im:height() * 3, size) end) it("can read an image back from a memory area (no copy)", function() local im = vips.Image.new_from_file("./spec/images/Gugg_coloured.jpg") local ptr, size = im:write_to_memory_ptr() assert.are.equal(im:width() * im:height() * 3, size) local im2 = vips.Image.new_from_memory_ptr(ptr, size, im:width(), im:height(), im:bands(), im:format()) assert.are.equal(im:avg(), im2:avg()) end) end) describe("MODIFY args", function() it("can draw a circle on an image", function() local im = vips.Image.black(101, 101) local im2 = im:draw_circle(255, 50, 50, 50, { fill = true }) assert.are.equal(im2:width(), 101) assert.are.equal(im2:height(), 101) assert.are.almost_equal(im2:avg(), 255 * 3.1415927 / 4, 0.2) end) it("each draw op makes a new image", function() local im = vips.Image.black(101, 101) local im2 = im:draw_circle(255, 50, 50, 50, { fill = true }) local im3 = im2:draw_circle(0, 50, 50, 40, { fill = true }) assert.are.equal(im2:width(), 101) assert.are.equal(im2:height(), 101) assert.are.almost_equal(im2:avg(), 255 * 3.1415927 / 4, 0.2) assert.is.True(im3:avg() < im2:avg()) end) end) end) libvips-lua-vips-6959cc9/src/000077500000000000000000000000001475211264700160755ustar00rootroot00000000000000libvips-lua-vips-6959cc9/src/vips.lua000066400000000000000000000035131475211264700175630ustar00rootroot00000000000000-- top include for lua-vips local ffi = require "ffi" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") require "vips.cdefs" local result = vips_lib.vips_init("lua-vips") if result ~= 0 then local errstr = ffi.string(vips_lib.vips_error_buffer()) vips_lib.vips_error_clear() error("unable to start up libvips: " .. errstr) end local vips = { verror = require "vips.verror", version = require "vips.version", log = require "vips.log", gvalue = require "vips.gvalue", vobject = require "vips.vobject", voperation = require "vips.voperation", Image = require "vips.Image_methods", Interpolate = require "vips.Interpolate", Connection = require "vips.Connection", Source = require "vips.Source", Target = require "vips.Target", } function vips.leak_set(leak) vips_lib.vips_leak_set(leak) end function vips.cache_set_max(max) vips_lib.vips_cache_set_max(max) end function vips.cache_get_max() return vips_lib.vips_cache_get_max() end function vips.cache_set_max_files(max) vips_lib.vips_cache_set_max_files(max) end function vips.cache_get_max_files() return vips_lib.vips_cache_get_max_files() end function vips.cache_set_max_mem(max) vips_lib.vips_cache_set_max_mem(max) end function vips.cache_get_max_mem() return vips_lib.vips_cache_get_max_mem() end function vips.concurrency_set(concurrency) return vips_lib.vips_concurrency_set(concurrency) end function vips.concurrency_get() return vips_lib.vips_concurrency_get() end -- for compat with 1.1-6, when these were misnamed vips.set_max = vips.cache_set_max vips.get_max = vips.cache_get_max vips.set_max_files = vips.cache_set_max_files vips.get_max_files = vips.cache_get_max_files vips.set_max_mem = vips.cache_set_max_mem vips.get_max_mem = vips.cache_get_max_mem return vips libvips-lua-vips-6959cc9/src/vips/000077500000000000000000000000001475211264700170565ustar00rootroot00000000000000libvips-lua-vips-6959cc9/src/vips/Connection.lua000066400000000000000000000026111475211264700216600ustar00rootroot00000000000000-- abstract base Connection class local ffi = require "ffi" local vobject = require "vips.vobject" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local Connection_method = {} local Connection = { mt = { __index = Connection_method, } } function Connection.mt:__tostring() return self:filename() or self:nick() or "(nil)" end Connection.new = function(vconnection) local connection = {} connection.vconnection = vobject.new(vconnection) return setmetatable(connection, Connection.mt) end function Connection_method:vobject() return ffi.cast(vobject.typeof, self.vconnection) end function Connection_method:filename() -- Get the filename asscoiated with a connection. Return nil if there is no associated file. local so = ffi.cast('VipsConnection *', self.vconnection) local filename = vips_lib.vips_connection_filename(so) if filename == ffi.NULL then return nil else return ffi.string(filename) end end function Connection_method:nick() -- Make a human-readable name for a connection suitable for error messages. local so = ffi.cast('VipsConnection *', self.vconnection) local nick = vips_lib.vips_connection_nick(so) if nick == ffi.NULL then return nil else return ffi.string(nick) end end return ffi.metatype("VipsConnection", { __index = Connection }) libvips-lua-vips-6959cc9/src/vips/Image.lua000066400000000000000000000003241475211264700206020ustar00rootroot00000000000000-- the definition of the image class -- -- we have to split the definition of Image from the methods to avoid -- recursive requires between the methods and voperation local Image = { mt = {} } return Image libvips-lua-vips-6959cc9/src/vips/Image_methods.lua000066400000000000000000000505761475211264700223430ustar00rootroot00000000000000-- an Image class with overloads local ffi = require "ffi" local verror = require "vips.verror" local version = require "vips.version" local gvalue = require "vips.gvalue" local vobject = require "vips.vobject" local voperation = require "vips.voperation" local Image = require "vips.Image" local type = type local error = error local pairs = pairs local ipairs = ipairs local unpack = unpack or table.unpack local rawget = rawget local setmetatable = setmetatable local getmetatable = getmetatable local vips_lib local gobject_lib local glib_lib if ffi.os == "Windows" then vips_lib = ffi.load("libvips-42.dll") gobject_lib = ffi.load("libgobject-2.0-0.dll") glib_lib = ffi.load("libglib-2.0-0.dll") else vips_lib = ffi.load("vips") gobject_lib = vips_lib glib_lib = vips_lib end -- test for rectangular array of something local function is_2D(table) if type(table) ~= "table" then return false end for i = 1, #table do if type(table[i]) ~= "table" then return false end if #table[i] ~= #table[1] then return false end end return true end local function map(fn, array) local new_array = {} for i, v in ipairs(array) do new_array[i] = fn(v) end return new_array end local function swap_Image_left(left, right) if Image.is_Image(left) then return left, right elseif Image.is_Image(right) then return right, left else error("must have one image argument") end end -- either a single number, or a table of numbers local function is_pixel(value) return type(value) == "number" or (type(value) == "table" and not Image.is_Image(value)) end local function call_enum(image, other, base, operation) if type(other) == "number" then return image[base .. "_const"](image, operation, { other }) elseif is_pixel(other) then return image[base .. "_const"](image, operation, other) else return image[base](image, other, operation) end end -- turn a string from libvips that must be g_free()d into a lua string local function to_string_copy(vips_string) local lua_string = ffi.string(vips_string) glib_lib.g_free(vips_string) return lua_string end -- class methods function Image.is_Image(thing) return type(thing) == "table" and getmetatable(thing) == Image.mt end function Image.imageize(self, value) -- careful! self can be nil if value is a 2D array if Image.is_Image(value) then return value elseif is_2D(value) then return Image.new_from_array(value) else return self:new_from_image(value) end end -- constructors -- we add an unref finalizer too! be careful function Image.new(vimage) local image = {} image.vimage = vobject.new(vimage) return setmetatable(image, Image.mt) end function Image.find_load(filename) local name = vips_lib.vips_foreign_find_load(filename) if name == ffi.NULL then return nil else return ffi.string(name) end end function Image.new_from_file(vips_filename, ...) local filename = to_string_copy(vips_lib.vips_filename_get_filename(vips_filename)) local options = to_string_copy(vips_lib.vips_filename_get_options(vips_filename)) local name = Image.find_load(filename) if name == nil then error(verror.get()) end return voperation.call(name, options, filename, unpack { ... }) end function Image.find_load_buffer(data) local name = vips_lib.vips_foreign_find_load_buffer(data, #data) if name == ffi.NULL then return nil else return ffi.string(name) end end function Image.new_from_buffer(data, options, ...) local name = Image.find_load_buffer(data) if name == nil then error(verror.get()) end return voperation.call(name, options or "", data, unpack { ... }) end function Image.new_from_memory_ptr(data, size, width, height, bands, format) local format_value = gvalue.to_enum(gvalue.band_format_type, format) local vimage = vips_lib.vips_image_new_from_memory(data, size, width, height, bands, format_value) if vimage == ffi.NULL then error(verror.get()) end return Image.new(vimage) end function Image.new_from_memory(data, width, height, bands, format) local image = Image.new_from_memory_ptr(data, ffi.sizeof(data), width, height, bands, format) -- libvips is using the memory we passed in: save a pointer to the memory -- block to try to stop it being GCd image._data = data return image end function Image.new_from_array(array, scale, offset) if not is_2D(array) then array = { array } end local width = #array[1] local height = #array local n = width * height local arr = {} for y = 0, height - 1 do for x = 0, width - 1 do arr[x + y * width + 1] = array[y + 1][x + 1] end end local a = ffi.new(gvalue.double_arr_typeof, n, arr) local vimage = vips_lib.vips_image_new_matrix_from_array(width, height, a, n) local image = Image.new(vimage) image:set_type(gvalue.gdouble_type, "scale", scale or 1.0) image:set_type(gvalue.gdouble_type, "offset", offset or 0.0) return image end function Image.new_from_image(base_image, value) local pixel = (Image.black(1, 1) + value):cast(base_image:format()) local image = pixel:embed(0, 0, base_image:width(), base_image:height(), { extend = "copy" }) image = image:copy { interpretation = base_image:interpretation(), xres = base_image:xres(), yres = base_image:yres(), xoffset = base_image:xoffset(), yoffset = base_image:yoffset() } return image end function Image.new_from_source(source, options, ...) local name = vips_lib.vips_foreign_find_load_source(source.vconnection) if name == ffi.NULL then error("Unable to load from source") end return voperation.call(ffi.string(name), options, source.vconnection, unpack { ... }) end -- overloads function Image.mt.__add(a, b) a, b = swap_Image_left(a, b) if type(b) == "number" then return a:linear({ 1 }, { b }) elseif is_pixel(b) then return a:linear({ 1 }, b) else return a:add(b) end end function Image.mt.__sub(a, b) if Image.is_Image(a) then if type(b) == "number" then return a:linear({ 1 }, { -b }) elseif is_pixel(b) then return a:linear({ 1 }, map(function(x) return -x end, b)) else return a:subtract(b) end else -- therefore a is a constant and b is an image if type(a) == "number" then return (b * -1):linear({ 1 }, { a }) else -- assume a is a pixel return (b * -1):linear({ 1 }, a) end end end function Image.mt.__mul(a, b) a, b = swap_Image_left(a, b) if type(b) == "number" then return a:linear({ b }, { 0 }) elseif is_pixel(b) then return a:linear(b, { 0 }) else return a:multiply(b) end end function Image.mt.__div(a, b) if Image.is_Image(a) then if type(b) == "number" then return a:linear({ 1 / b }, { 0 }) elseif is_pixel(b) then return a:linear(map(function(x) return x ^ -1 end, b), { 0 }) else return a:divide(b) end else -- therefore a is a constant and b is an image if type(a) == "number" then return (b ^ -1):linear({ a }, { 0 }) else -- assume a is a pixel return (b ^ -1):linear(a, { 0 }) end end end function Image.mt.__mod(a, b) if not Image.is_Image(a) then error("constant % image not supported by libvips") end if type(b) == "number" then return a:remainder_const({ b }) elseif is_pixel(b) then return a:remainder_const(b) else return a:remainder(b) end end function Image.mt.__unm(self) return self * -1 end function Image.mt.__pow(a, b) if Image.is_Image(a) then return a:pow(b) else return b:wop(a) end end -- unfortunately, lua does not let you return non-bools from <, >, <=, >=, ==, -- ~=, so there's no point overloading these ... call :more(2) etc. instead function Image.mt:__tostring() local result = (self:filename() or "(nil)") .. ": " .. self:width() .. "x" .. self:height() .. " " .. self:format() .. ", " .. self:bands() .. " bands, " .. self:interpretation() if self:get_typeof("vips-loader") ~= 0 then result = result .. ", " .. self:get("vips-loader") end return result end function Image.mt:__call(x, y) -- getpoint() will return a table for a pixel return unpack(self:getpoint(x, y)) end function Image.mt:__concat(other) return self:bandjoin(other) end -- instance methods local Image_method = {} function Image_method:vobject() -- TODO: Could we use `self.vimage.parent_instance` here? return ffi.cast(vobject.typeof, self.vimage) end -- handy to have as instance methods too function Image_method:imageize(value) return Image.imageize(self, value) end function Image_method:new_from_image(value) return Image.new_from_image(self, value) end function Image_method:copy_memory() local vimage = vips_lib.vips_image_copy_memory(self.vimage) if vimage == ffi.NULL then error(verror.get()) end return Image.new(vimage) end -- writers function Image_method:write_to_file(vips_filename, ...) collectgarbage("stop") local filename = to_string_copy(vips_lib.vips_filename_get_filename(vips_filename)) local options = to_string_copy(vips_lib.vips_filename_get_options(vips_filename)) local name = vips_lib.vips_foreign_find_save(filename) collectgarbage("restart") if name == ffi.NULL then error(verror.get()) end return voperation.call(ffi.string(name), options, self, filename, unpack { ... }) end function Image_method:write_to_buffer(format_string, ...) collectgarbage("stop") local options = to_string_copy(vips_lib.vips_filename_get_options(format_string)) local name = vips_lib.vips_foreign_find_save_buffer(format_string) collectgarbage("restart") if name == ffi.NULL then error(verror.get()) end return voperation.call(ffi.string(name), options, self, unpack { ... }) end function Image_method:write_to_memory() local psize = ffi.new(gvalue.psize_typeof, 1) local vips_memory = vips_lib.vips_image_write_to_memory(self.vimage, psize) local size = tonumber(psize[0]) local lua_memory = ffi.new(gvalue.mem_typeof, size) ffi.copy(lua_memory, vips_memory, size) glib_lib.g_free(vips_memory) return lua_memory end function Image_method:write_to_memory_ptr() local psize = ffi.new(gvalue.psize_typeof, 1) local vips_memory = vips_lib.vips_image_write_to_memory(self.vimage, psize) return ffi.gc(vips_memory, glib_lib.g_free), tonumber(psize[0]) end function Image_method:write_to_target(target, format_string, ...) collectgarbage("stop") local options = to_string_copy(vips_lib.vips_filename_get_options(format_string)) local name = vips_lib.vips_foreign_find_save_target(format_string) collectgarbage("restart") if name == ffi.NULL then error(verror.get()) end return voperation.call(ffi.string(name), options, self, target.vconnection, unpack { ... }) end -- get/set metadata function Image_method:get_typeof(name) -- on libvips 8.4 and earlier, we need to fetch the type via -- our superclass get_typeof(), since vips_image_get_typeof() returned -- enum properties as ints if not version.at_least(8, 5) then local vob = self:vobject() local gtype = vob:get_typeof(name) if gtype ~= 0 then return vob:get_type(name, gtype) end -- we must clear the error buffer after vobject typeof fails verror.get() end return vips_lib.vips_image_get_typeof(self.vimage, name) end function Image_method:get(name) -- on libvips 8.4 and earlier, we need to fetch gobject properties via -- our superclass get(), since vips_image_get() returned enum properties -- as ints if not version.at_least(8, 5) then local vo = self:vobject() local gtype = vo:get_typeof(name) if gtype ~= 0 then return vo:get(name) end -- we must clear the error buffer after vobject typeof fails verror.get() end local pgv = gvalue(true) local result = vips_lib.vips_image_get(self.vimage, name, pgv) if result ~= 0 then error("unable to get " .. name) end result = pgv[0]:get() gobject_lib.g_value_unset(pgv[0]) return result end function Image_method:set_type(gtype, name, value) local pgv = gvalue(true) pgv[0]:init(gtype) pgv[0]:set(value) vips_lib.vips_image_set(self.vimage, name, pgv) gobject_lib.g_value_unset(pgv[0]) end function Image_method:set(name, value) local gtype = self:get_typeof(name) self:set_type(gtype, name, value) end function Image_method:remove(name) return vips_lib.vips_image_remove(self.vimage, name) ~= 0 end -- standard header fields function Image_method:width() return self:get("width") end function Image_method:height() return self:get("height") end function Image_method:size() return self:width(), self:height() end function Image_method:bands() return self:get("bands") end function Image_method:format() return self:get("format") end function Image_method:interpretation() return self:get("interpretation") end function Image_method:xres() return self:get("xres") end function Image_method:yres() return self:get("yres") end function Image_method:xoffset() return self:get("xoffset") end function Image_method:yoffset() return self:get("yoffset") end function Image_method:filename() return self:get("filename") end -- many-image input operations -- -- these don't wrap well automatically, since self is held separately function Image_method:bandjoin(other, options) -- allow a single untable arg as well if type(other) == "number" or Image.is_Image(other) then other = { other } end -- if other is all constants, we can use bandjoin_const local all_constant = true for i = 1, #other do if type(other[i]) ~= "number" then all_constant = false break end end if all_constant then return voperation.call("bandjoin_const", "", self, other, options) else return voperation.call("bandjoin", "", { self, unpack(other) }, options) end end function Image_method:bandrank(other, options) if type(other) ~= "table" then other = { other } end return voperation.call("bandrank", "", { self, unpack(other) }, options) end function Image_method:composite(other, mode, options) -- allow a single untable arg as well if type(other) == "number" or Image.is_Image(other) then other = { other } end if type(mode) ~= "table" then mode = { mode } end -- need to map str -> int by hand, since the mode arg is actually -- arrayint for i = 1, #mode do mode[i] = gvalue.to_enum(gvalue.blend_mode_type, mode[i]) end return voperation.call("composite", "", { self, unpack(other) }, mode, options) end -- convenience functions function Image_method:hasalpha() return vips_lib.vips_image_hasalpha(self.vimage) ~= 0 end -- addalpha was made a VipsOperation in vips 8.16; earlier versions need this polyfill if not version.at_least(8, 16) then function Image_method:addalpha() local max_alpha if self:interpretation() == "rgb16" or self:interpretation() == "grey16" then max_alpha = 65535 elseif self:interpretation() == "scrgb" then max_alpha = 1.0 else max_alpha = 255 end return self:bandjoin(max_alpha) end end function Image_method:bandsplit() local result result = {} for i = 0, self:bands() - 1 do result[i + 1] = self:extract_band(i) end return result end -- special behaviour wrappers function Image_method:ifthenelse(then_value, else_value, options) -- We need different imageize rules for this. We need then_value -- and else_value to match each other first, and only if they -- are both constants do we match to self. local match_image for _, v in pairs({ then_value, else_value, self }) do if Image.is_Image(v) then match_image = v break end end if not Image.is_Image(then_value) then then_value = match_image:imageize(then_value) end if not Image.is_Image(else_value) then else_value = match_image:imageize(else_value) end return voperation.call("ifthenelse", "", self, then_value, else_value, options) end -- enum expansions function Image_method:pow(other) return call_enum(self, other, "math2", "pow") end function Image_method:wop(other) return call_enum(self, other, "math2", "wop") end function Image_method:lshift(other) return call_enum(self, other, "boolean", "lshift") end function Image_method:rshift(other) return call_enum(self, other, "boolean", "rshift") end function Image_method:andimage(other) return call_enum(self, other, "boolean", "and") end function Image_method:orimage(other) return call_enum(self, other, "boolean", "or") end function Image_method:eorimage(other) return call_enum(self, other, "boolean", "eor") end function Image_method:less(other) return call_enum(self, other, "relational", "less") end function Image_method:lesseq(other) return call_enum(self, other, "relational", "lesseq") end function Image_method:more(other) return call_enum(self, other, "relational", "more") end function Image_method:moreeq(other) return call_enum(self, other, "relational", "moreeq") end function Image_method:equal(other) return call_enum(self, other, "relational", "equal") end function Image_method:noteq(other) return call_enum(self, other, "relational", "noteq") end function Image_method:floor() return self:round("floor") end function Image_method:ceil() return self:round("ceil") end function Image_method:rint() return self:round("rint") end function Image_method:bandand() return self:bandbool("and") end function Image_method:bandor() return self:bandbool("or") end function Image_method:bandeor() return self:bandbool("eor") end function Image_method:real() return self:complexget("real") end function Image_method:imag() return self:complexget("imag") end function Image_method:polar() return self:complex("polar") end function Image_method:rect() return self:complex("rect") end function Image_method:conj() return self:complex("conj") end function Image_method:sin() return self:math("sin") end function Image_method:cos() return self:math("cos") end function Image_method:tan() return self:math("tan") end function Image_method:asin() return self:math("asin") end function Image_method:acos() return self:math("acos") end function Image_method:atan() return self:math("atan") end function Image_method:exp() return self:math("exp") end function Image_method:exp10() return self:math("exp10") end function Image_method:log() return self:math("log") end function Image_method:log10() return self:math("log10") end function Image_method:erode(mask) return self:morph(mask, "erode") end function Image_method:dilate(mask) return self:morph(mask, "dilate") end function Image_method:fliphor() return self:flip("horizontal") end function Image_method:flipver() return self:flip("vertical") end function Image_method:rot90() return self:rot("d90") end function Image_method:rot180() return self:rot("d180") end function Image_method:rot270() return self:rot("d270") end -- this is for undefined class / instance methods, like Image.text or image:avg local fall_back = function(name) return function(...) return voperation.call(name, "", unpack { ... }) end end function Image.mt.__index(_, name) -- try to get instance method otherwise fallback to voperation return rawget(Image_method, name) or fall_back(name) end return setmetatable(Image, { __index = function(_, name) -- undefined class methods return fall_back(name) end }) libvips-lua-vips-6959cc9/src/vips/Interpolate.lua000066400000000000000000000013071475211264700220500ustar00rootroot00000000000000-- make image interpolators, see affine local ffi = require "ffi" local verror = require "vips.verror" local vobject = require "vips.vobject" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local Interpolate = {} Interpolate.vobject = function(self) return ffi.cast(vobject.typeof, self) end Interpolate.new = function(name) -- there could potentially be other params here, but ignore that for now local interpolate = vips_lib.vips_interpolate_new(name) if interpolate == nil then error("no such interpolator\n" .. verror.get()) end return vobject.new(interpolate) end return ffi.metatype("VipsInterpolate", { __index = Interpolate }) libvips-lua-vips-6959cc9/src/vips/Source.lua000066400000000000000000000022451475211264700210240ustar00rootroot00000000000000-- An output connection local ffi = require "ffi" local verror = require "vips.verror" local Connection = require "vips.Connection" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local Source = {} Source.new_from_descriptor = function(descriptor) local source = vips_lib.vips_source_new_from_descriptor(descriptor) if source == ffi.NULL then error("Can't create source from descriptor " .. descriptor .. "\n" .. verror.get()) end return Connection.new(source) end Source.new_from_file = function(filename) local source = vips_lib.vips_source_new_from_file(filename) if source == ffi.NULL then error("Can't create source from filename " .. filename .. "\n" .. verror.get()) end return Connection.new(source) end Source.new_from_memory = function(data) -- data is an FFI memory array containing the image data local source = vips_lib.vips_source_new_from_memory(data, ffi.sizeof(data)) if source == ffi.NULL then error("Can't create input source from memory \n" .. verror.get()) end return Connection.new(source) end return ffi.metatype("VipsSource", { __index = Source }) libvips-lua-vips-6959cc9/src/vips/Target.lua000066400000000000000000000022731475211264700210130ustar00rootroot00000000000000-- An input connection local ffi = require "ffi" local Connection = require "vips.Connection" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local Target = {} Target.new_to_descriptor = function(descriptor) collectgarbage("stop") local target = vips_lib.vips_target_new_to_descriptor(descriptor) collectgarbage("restart") if target == ffi.NULL then error("can't create output target from descriptor " .. descriptor) else return Connection.new(target) end end Target.new_to_file = function(filename) collectgarbage("stop") local target = vips_lib.vips_target_new_to_file(filename) collectgarbage("restart") if target == ffi.NULL then error("can't create output target from filename " .. filename) else return Connection.new(target) end end Target.new_to_memory = function() collectgarbage("stop") local target = vips_lib.vips_target_new_to_memory() collectgarbage("restart") if target == ffi.NULL then error("can't create output target from memory") else return Connection.new(target) end end return ffi.metatype("VipsTarget", { __index = Target }) libvips-lua-vips-6959cc9/src/vips/cdefs.lua000066400000000000000000000251531475211264700206530ustar00rootroot00000000000000-- all the C declarations for lua-vips local ffi = require "ffi" -- GType is an int the size of a pointer ... I don't think we can just use -- size_t, sadly if ffi.arch == "x64" or ffi.arch == "arm64" then ffi.cdef [[ typedef uint64_t GType; ]] else ffi.cdef [[ typedef uint32_t GType; ]] end ffi.cdef [[ typedef struct _GValue { GType gtype; uint64_t data[2]; } GValue; void *g_malloc (size_t size); void g_free (void *data); void g_object_ref (void *object); void g_object_unref (void *object); void g_value_init (GValue *value, GType gtype); void g_value_unset (GValue *value); const char *g_type_name (GType gtype); GType g_type_from_name (const char *name); GType g_type_fundamental (GType gtype); GType vips_blend_mode_get_type (void); GType vips_band_format_get_type (void); int vips_enum_from_nick (const char *domain, GType gtype, const char *str); const char *vips_enum_nick (GType gtype, int value); void g_value_set_boolean (GValue *value, int v_boolean); void g_value_set_int (GValue *value, int i); void g_value_set_double (GValue *value, double d); void g_value_set_enum (GValue *value, int e); void g_value_set_flags (GValue *value, unsigned int f); void g_value_set_string (GValue *value, const char *str); void vips_value_set_ref_string (GValue *value, const char *str); void g_value_set_object (GValue *value, void *object); void vips_value_set_array_double (GValue *value, const double *array, int n); void vips_value_set_array_int (GValue *value, const int *array, int n); void vips_value_set_array_image (GValue *value, int n); void vips_value_set_blob (GValue *value, void (*free_fn)(void *data), void *data, size_t length); void vips_value_set_blob_free (GValue *value, void *data, size_t length); int g_value_get_boolean (const GValue *value); int g_value_get_int (const GValue *value); double g_value_get_double (const GValue *value); int g_value_get_enum (const GValue *value); unsigned int g_value_get_flags (const GValue *value); const char *g_value_get_string (const GValue *value); const char *vips_value_get_ref_string (const GValue *value, size_t *length); void *g_value_get_object (const GValue *value); double *vips_value_get_array_double (const GValue *value, int *n); int *vips_value_get_array_int (const GValue *value, int *n); void *vips_value_get_blob (const GValue *value, size_t *length); typedef struct _GObject { void *g_type_instance; unsigned int ref_count; void *qdata; } GObject; typedef struct _VipsObject { GObject parent_instance; bool constructed; bool static_object; void *argument_table; char *nickname; char *description; bool preclose; bool close; bool postclose; size_t local_memory; } VipsObject; typedef struct _VipsObjectClass { // opaque } VipsObjectClass; typedef enum { G_PARAM_READABLE = 1, G_PARAM_WRITABLE = 2, G_PARAM_CONSTRUCT = 4, G_PARAM_CONSTRUCT_ONLY = 8, G_PARAM_LAX_VALIDATION = 16, G_PARAM_STATIC_NAME = 32, G_PARAM_PRIVATE = G_PARAM_STATIC_NAME, G_PARAM_STATIC_NICK = 64, G_PARAM_STATIC_BLURB = 128 } GParamFlags; typedef struct _GParamSpec { void *g_type_instance; const char *name; GParamFlags flags; GType value_type; GType owner_type; // rest opaque } GParamSpec; typedef struct _VipsArgument { GParamSpec *pspec; } VipsArgument; typedef struct _VipsArgumentInstance { VipsArgument parent; // opaque } VipsArgumentInstance; typedef enum _VipsArgumentFlags { VIPS_ARGUMENT_NONE = 0, VIPS_ARGUMENT_REQUIRED = 1, VIPS_ARGUMENT_CONSTRUCT = 2, VIPS_ARGUMENT_SET_ONCE = 4, VIPS_ARGUMENT_SET_ALWAYS = 8, VIPS_ARGUMENT_INPUT = 16, VIPS_ARGUMENT_OUTPUT = 32, VIPS_ARGUMENT_DEPRECATED = 64, VIPS_ARGUMENT_MODIFY = 128 } VipsArgumentFlags; typedef struct _VipsArgumentClass { VipsArgument parent; VipsObjectClass *object_class; VipsArgumentFlags flags; int priority; uint64_t offset; } VipsArgumentClass; int vips_object_get_argument (VipsObject *object, const char *name, GParamSpec **pspec, VipsArgumentClass **argument_class, VipsArgumentInstance **argument_instance); void g_object_set_property (VipsObject *object, const char *name, const GValue *value); void g_object_get_property (VipsObject *object, const char *name, GValue *value); void vips_object_print_all (void); int vips_object_set_from_string (VipsObject *object, const char *options); typedef struct _VipsImage { VipsObject parent_instance; // opaque } VipsImage; typedef struct _VipsConnection { VipsObject parent_instance; // opaque } VipsConnection; const char *vips_connection_filename (VipsConnection *connection); const char *vips_connection_nick (VipsConnection *connection); typedef struct _VipsSource { VipsConnection parent_instance; // opaque } VipsSource; typedef struct _VipsTarget { VipsConnection parent_instance; // opaque } VipsTarget; VipsSource *vips_source_new_from_descriptor (int descriptor); VipsSource *vips_source_new_from_file (const char *filename); // VipsSource *vips_source_new_from_blob (VipsBlob *blob); // VipsSource *vips_source_new_from_target (VipsTarget *target); VipsSource *vips_source_new_from_memory (const void *data, size_t size); // VipsSource *vips_source_new_from_options (const char *options); // void vips_source_minimise (VipsSource *source); // int vips_source_decode (VipsSource *source); // gint64 vips_source_read (VipsSource *source, void *data, size_t length); // gboolean vips_source_is_mappable (VipsSource *source); // gboolean vips_source_is_file (VipsSource *source); // const void *vips_source_map (VipsSource *source, size_t *length); // VipsBlob *vips_source_map_blob (VipsSource *source); // gint64 vips_source_seek (VipsSource *source, gint64 offset, int whence); // int vips_source_rewind (VipsSource *source); // gint64 vips_source_sniff_at_most (VipsSource *source, unsigned char **data, size_t length); // unsigned char *vips_source_sniff (VipsSource *source, size_t length); // gint64 vips_source_length (VipsSource *source); // VipsSourceCustom *vips_source_custom_new (void); // GInputStream *vips_g_input_stream_new_from_source (VipsSource *source); // VipsSourceGInputStream *vips_source_g_input_stream_new (GInputStream *stream); VipsTarget *vips_target_new_to_descriptor (int descriptor); VipsTarget *vips_target_new_to_file (const char *filename); VipsTarget *vips_target_new_to_memory (void); // VipsTarget *vips_target_new_temp (VipsTarget *target); // int vips_target_write (VipsTarget *target, const void *data, size_t length); // gint64 vips_target_read (VipsTarget *target, void *buffer, size_t length); // gint64 vips_target_seek (VipsTarget *target, gint64 offset, int whence); // int vips_target_end (VipsTarget *target); // unsigned char *vips_target_steal (VipsTarget *target, size_t *length); // char *vips_target_steal_text (VipsTarget *target); // int vips_target_putc (VipsTarget *target, int ch); // int vips_target_writes (VipsTarget *target, const char *str); // int vips_target_writef (VipsTarget *target, const char *fmt, ...); // int vips_target_write_amp (VipsTarget *target, const char *str); // VipsTargetCustom *vips_target_custom_new (void); const char *vips_foreign_find_load (const char *name); const char *vips_foreign_find_load_buffer (const void *data, size_t size); const char *vips_foreign_find_save (const char *name); const char *vips_foreign_find_save_buffer (const char *suffix); const char* vips_foreign_find_load_source (VipsSource *source); const char* vips_foreign_find_save_target (const char* suffix); VipsImage *vips_image_new_matrix_from_array (int width, int height, const double *array, int size); VipsImage *vips_image_new_from_memory (const void *data, size_t size, int width, int height, int bands, int format); unsigned char *vips_image_write_to_memory (VipsImage *image, size_t *size_out); VipsImage *vips_image_copy_memory (VipsImage *image); VipsImage **vips_value_get_array_image (const GValue *value, int *n); GType vips_image_get_typeof (const VipsImage *image, const char *name); int vips_image_get (const VipsImage *image, const char *name, GValue *value_copy); void vips_image_set (VipsImage *image, const char *name, GValue *value); int vips_image_remove (VipsImage *image, const char *name); int vips_image_hasalpha(VipsImage *image); char *vips_filename_get_filename (const char *vips_filename); char *vips_filename_get_options (const char *vips_filename); typedef struct _VipsOperation { VipsObject parent_instance; // opaque } VipsOperation; typedef struct _VipsInterpolate { VipsObject parent_instance; // opaque } VipsInterpolate; VipsInterpolate *vips_interpolate_new (const char *name); VipsOperation *vips_operation_new (const char *name); typedef void * (*VipsArgumentMapFn) (VipsOperation *object, GParamSpec *pspec, VipsArgumentClass *argument_class, VipsArgumentInstance *argument_instance, void *a, void *b); void *vips_argument_map (VipsOperation *object, VipsArgumentMapFn fn, void *a, void *b); void vips_object_get_args (VipsOperation *object, const char ***names, int **flags, int *n_args); VipsOperation *vips_cache_operation_build (VipsOperation *operation); void vips_object_unref_outputs (VipsOperation *operation); void vips_leak_set (int leak); void vips_cache_set_max (int max); void vips_cache_set_max (int max); int vips_cache_get_max (void); void vips_cache_set_max_mem (size_t max_mem); size_t vips_cache_get_max_mem (void); void vips_cache_set_max_files (int max_files); int vips_cache_get_max_files (void); void vips_concurrency_set (int concurrency); int vips_concurrency_get (); int vips_init (const char *argv0); int vips_version (int flag); const char *vips_error_buffer (void); void vips_error_clear (void); ]] libvips-lua-vips-6959cc9/src/vips/gvalue.lua000066400000000000000000000250451475211264700210520ustar00rootroot00000000000000-- manipulate GValue objects from lua -- pull in gobject via the vips library local ffi = require "ffi" local verror = require "vips.verror" local version = require "vips.version" local Image = require "vips.Image" local type = type local error = error local vips_lib local gobject_lib local glib_lib if ffi.os == "Windows" then vips_lib = ffi.load("libvips-42.dll") gobject_lib = ffi.load("libgobject-2.0-0.dll") glib_lib = ffi.load("libglib-2.0-0.dll") else vips_lib = ffi.load("vips") gobject_lib = vips_lib glib_lib = vips_lib end if version.at_least(8, 6) then vips_lib.vips_blend_mode_get_type() end vips_lib.vips_band_format_get_type() local gvalue = {} -- make ffi constructors we can reuse gvalue.gv_typeof = ffi.typeof("GValue") gvalue.pgv_typeof = ffi.typeof("GValue[1]") gvalue.image_typeof = ffi.typeof("VipsImage*") gvalue.pint_typeof = ffi.typeof("int[?]") gvalue.int_arr_typeof = ffi.typeof("const int[?]") gvalue.double_arr_typeof = ffi.typeof("const double[?]") gvalue.psize_typeof = ffi.typeof("size_t[?]") gvalue.mem_typeof = ffi.typeof("unsigned char[?]") gvalue.interpolate_typeof = ffi.typeof("VipsInterpolate*") gvalue.connection_typeof = ffi.typeof("VipsConnection*") gvalue.source_typeof = ffi.typeof("VipsSource*") gvalue.target_typeof = ffi.typeof("VipsTarget*") -- look up some common gtypes at init for speed gvalue.gbool_type = gobject_lib.g_type_from_name("gboolean") gvalue.gint_type = gobject_lib.g_type_from_name("gint") gvalue.gdouble_type = gobject_lib.g_type_from_name("gdouble") gvalue.gstr_type = gobject_lib.g_type_from_name("gchararray") gvalue.genum_type = gobject_lib.g_type_from_name("GEnum") gvalue.gflags_type = gobject_lib.g_type_from_name("GFlags") gvalue.image_type = gobject_lib.g_type_from_name("VipsImage") gvalue.array_int_type = gobject_lib.g_type_from_name("VipsArrayInt") gvalue.array_double_type = gobject_lib.g_type_from_name("VipsArrayDouble") gvalue.array_image_type = gobject_lib.g_type_from_name("VipsArrayImage") gvalue.refstr_type = gobject_lib.g_type_from_name("VipsRefString") gvalue.blob_type = gobject_lib.g_type_from_name("VipsBlob") gvalue.band_format_type = gobject_lib.g_type_from_name("VipsBandFormat") gvalue.blend_mode_type = version.at_least(8, 6) and gobject_lib.g_type_from_name("VipsBlendMode") or 0 gvalue.interpolate_type = gobject_lib.g_type_from_name("VipsInterpolate") gvalue.connection_type = gobject_lib.g_type_from_name("VipsConnection") gvalue.source_type = gobject_lib.g_type_from_name("VipsSource") gvalue.target_type = gobject_lib.g_type_from_name("VipsTarget") -- gvalue.*_type can be of type cdata or number depending on the OS and Lua version -- gtypes as returned by vips_lib can also be of type cdata or number -- cdata and number are not comparable with Standard Lua (using luaffi-tkl) gvalue.comparable_type = type(gvalue.gdouble_type) == "number" and function(gtype) return tonumber(gtype) end or function(gtype) return gtype end gvalue.to_enum = function(gtype, value) -- turn a string into an int, ready to be passed into libvips local enum_value if type(value) == "string" then enum_value = vips_lib.vips_enum_from_nick("lua-vips", gtype, value) if enum_value < 0 then error("no such enum " .. value .. "\n" .. verror.get()) end else enum_value = value end return enum_value end gvalue.type_name = function(gtype) return ffi.string(gobject_lib.g_type_name(gtype)) end gvalue.init = function(gv, gtype) gobject_lib.g_value_init(gv, gtype) end gvalue.set = function(gv, value) local gtype = gv.gtype local gtype_comp = gvalue.comparable_type(gtype) local fundamental = gobject_lib.g_type_fundamental(gtype) if gtype_comp == gvalue.gbool_type then gobject_lib.g_value_set_boolean(gv, value) elseif gtype_comp == gvalue.gint_type then gobject_lib.g_value_set_int(gv, value) elseif gtype_comp == gvalue.gdouble_type then gobject_lib.g_value_set_double(gv, value) elseif fundamental == gvalue.genum_type then gobject_lib.g_value_set_enum(gv, gvalue.to_enum(gtype, value)) elseif fundamental == gvalue.gflags_type then gobject_lib.g_value_set_flags(gv, value) elseif gtype_comp == gvalue.gstr_type then gobject_lib.g_value_set_string(gv, value) elseif gtype_comp == gvalue.refstr_type then gobject_lib.vips_value_set_ref_string(gv, value) elseif gtype_comp == gvalue.image_type then gobject_lib.g_value_set_object(gv, value.vimage) elseif gtype_comp == gvalue.array_int_type then if type(value) == "number" then value = { value } end local n = #value local a = ffi.new(gvalue.int_arr_typeof, n, value) vips_lib.vips_value_set_array_int(gv, a, n) elseif gtype_comp == gvalue.array_double_type then if type(value) == "number" then value = { value } end local n = #value local a = ffi.new(gvalue.double_arr_typeof, n, value) vips_lib.vips_value_set_array_double(gv, a, n) elseif gtype_comp == gvalue.array_image_type then if Image.is_Image(value) then value = { value } end local n = #value vips_lib.vips_value_set_array_image(gv, n) local a = vips_lib.vips_value_get_array_image(gv, nil) for i = 0, n - 1 do a[i] = value[i + 1].vimage -- the gvalue needs a set of refs to own gobject_lib.g_object_ref(a[i]) end elseif gtype_comp == gvalue.blob_type then -- we need to set the blob to a copy of the lua string that vips -- can own local n = #value local buf = glib_lib.g_malloc(n) ffi.copy(buf, value, n) if version.at_least(8, 6) then vips_lib.vips_value_set_blob_free(gv, buf, n) else vips_lib.vips_value_set_blob(gv, glib_lib.g_free, buf, n) end elseif gtype_comp == gvalue.interpolate_type then gobject_lib.g_value_set_object(gv, value) elseif gtype_comp == gvalue.connection_type then gobject_lib.g_value_set_object(gv, value) elseif gtype_comp == gvalue.source_type then gobject_lib.g_value_set_object(gv, value) elseif gtype_comp == gvalue.target_type then gobject_lib.g_value_set_object(gv, value) else error("unsupported gtype for set " .. gvalue.type_name(gtype)) end end gvalue.get = function(gv) local gtype = gv.gtype local gtype_comp = gvalue.comparable_type(gtype) local fundamental = gobject_lib.g_type_fundamental(gtype) local result if gtype_comp == gvalue.gbool_type then result = gobject_lib.g_value_get_boolean(gv) elseif gtype_comp == gvalue.gint_type then result = gobject_lib.g_value_get_int(gv) elseif gtype_comp == gvalue.gdouble_type then result = gobject_lib.g_value_get_double(gv) elseif fundamental == gvalue.genum_type then local enum_value = gobject_lib.g_value_get_enum(gv) local cstr = vips_lib.vips_enum_nick(gtype, enum_value) if cstr == ffi.NULL then error("value not in enum") end result = ffi.string(cstr) elseif fundamental == gvalue.gflags_type then result = gobject_lib.g_value_get_flags(gv) elseif gtype_comp == gvalue.gstr_type then local cstr = gobject_lib.g_value_get_string(gv) if cstr ~= ffi.NULL then result = ffi.string(cstr) else result = nil end elseif gtype_comp == gvalue.refstr_type then local psize = ffi.new(gvalue.psize_typeof, 1) local cstr = vips_lib.vips_value_get_ref_string(gv, psize) result = ffi.string(cstr, tonumber(psize[0])) elseif gtype_comp == gvalue.image_type then -- g_value_get_object() will not add a ref ... that is -- held by the gvalue local vo = gobject_lib.g_value_get_object(gv) local vimage = ffi.cast(gvalue.image_typeof, vo) -- we want a ref that will last with the life of the vimage: -- this ref is matched by the unref that's attached to finalize -- by Image.new() gobject_lib.g_object_ref(vimage) result = Image.new(vimage) elseif gtype_comp == gvalue.array_int_type then local pint = ffi.new(gvalue.pint_typeof, 1) local array = vips_lib.vips_value_get_array_int(gv, pint) result = {} for i = 0, pint[0] - 1 do result[i + 1] = array[i] end elseif gtype_comp == gvalue.array_double_type then local pint = ffi.new(gvalue.pint_typeof, 1) local array = vips_lib.vips_value_get_array_double(gv, pint) result = {} for i = 0, pint[0] - 1 do result[i + 1] = array[i] end elseif gtype_comp == gvalue.array_image_type then local pint = ffi.new(gvalue.pint_typeof, 1) local array = vips_lib.vips_value_get_array_image(gv, pint) result = {} for i = 0, pint[0] - 1 do -- this will make a new cdata object local vimage = array[i] -- vips_value_get_array_image() adds a ref for each image in -- the array ... we must remember to drop them gobject_lib.g_object_ref(vimage) result[i + 1] = Image.new(vimage) end elseif gtype_comp == gvalue.blob_type then local psize = ffi.new(gvalue.psize_typeof, 1) local array = vips_lib.vips_value_get_blob(gv, psize) result = ffi.string(array, tonumber(psize[0])) elseif gtype_comp == gvalue.interpolate_type then local vo = gobject_lib.g_value_get_object(gv) result = ffi.cast(gvalue.interpolate_typeof, vo) elseif gtype_comp == gvalue.connection_type then local vo = gobject_lib.g_value_get_object(gv) result = ffi.cast(gvalue.connection_typeof, vo) elseif gtype_comp == gvalue.source_type then local vo = gobject_lib.g_value_get_object(gv) result = ffi.cast(gvalue.source_typeof, vo) elseif gtype_comp == gvalue.target_type then local vo = gobject_lib.g_value_get_object(gv) result = ffi.cast(gvalue.target_typeof, vo) else error("unsupported gtype for get " .. gvalue.type_name(gtype)) end return result end return ffi.metatype("GValue", { __new = function(ct, pt) -- if pt equals to true you'll need to -- g_value_unset() yourself after calling it, -- it won't unset() automatically! return pt and ffi.new(gvalue.pgv_typeof) or ffi.new(ct) end, __gc = function(gv) gobject_lib.g_value_unset(gv) end, __index = gvalue }) libvips-lua-vips-6959cc9/src/vips/log.lua000066400000000000000000000041111475211264700203370ustar00rootroot00000000000000-- simple logging local logging_enabled = false local type = type local print = print local pairs = pairs local unpack = unpack or table.unpack local tostring = tostring local str_rep = string.rep local log = {} log = { enable = function(on) logging_enabled = on end, msg = function(...) if logging_enabled then print(unpack { ... }) end end, prettyprint_table = function(p, table) local p_r_cache = {} local function sub_p_r(t, indent) if (p_r_cache[tostring(t)]) then p(indent .. "*" .. tostring(t)) else p_r_cache[tostring(t)] = true if type(t) == "table" then for pos, val in pairs(t) do if type(val) == "table" then p(indent .. "[" .. pos .. "] => " .. tostring(t) .. " {") local length = type(pos) == "string" and #pos or pos sub_p_r(val, indent .. str_rep(" ", length + 8)) p(indent .. str_rep(" ", length + 6) .. "}") elseif type(val) == "string" then p(indent .. "[" .. pos .. '] => "' .. val .. '"') else p(indent .. "[" .. pos .. "] => " .. tostring(val)) end end else p(indent .. tostring(t)) end end end if type(table) == "table" then p(tostring(table) .. " {") sub_p_r(table, " ") p("}") else sub_p_r(table, " ") end p() end, msg_r = function(t) if logging_enabled then log.prettyprint_table(log.msg, t) end end, print_r = function(t) if logging_enabled then log.prettyprint_table(print, t) end end } return log libvips-lua-vips-6959cc9/src/vips/verror.lua000066400000000000000000000005561475211264700211060ustar00rootroot00000000000000-- handle the libvips error buffer local ffi = require "ffi" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local verror = { -- get and clear the error buffer get = function() local errstr = ffi.string(vips_lib.vips_error_buffer()) vips_lib.vips_error_clear() return errstr end } return verror libvips-lua-vips-6959cc9/src/vips/version.lua000066400000000000000000000010431475211264700212440ustar00rootroot00000000000000-- detect and test libvips version local ffi = require "ffi" local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local version = {} version = { major = vips_lib.vips_version(0), minor = vips_lib.vips_version(1), micro = vips_lib.vips_version(2), -- test for libvips version is better than x.y .. we use this to turn on -- various workarounds for older libvips at_least = function(x, y) return version.major > x or (version.major == x and version.minor >= y) end } return version libvips-lua-vips-6959cc9/src/vips/vobject.lua000066400000000000000000000060351475211264700212210ustar00rootroot00000000000000-- manage VipsObject -- abstract base class for voperation and vimage local ffi = require "ffi" local verror = require "vips.verror" local log = require "vips.log" local gvalue = require "vips.gvalue" local print = print local error = error local collectgarbage = collectgarbage local vips_lib local gobject_lib if ffi.os == "Windows" then vips_lib = ffi.load("libvips-42.dll") gobject_lib = ffi.load("libgobject-2.0-0.dll") else vips_lib = ffi.load("vips") gobject_lib = vips_lib end local vobject = {} -- types to get ref back from vips_object_get_argument() vobject.typeof = ffi.typeof("VipsObject*") vobject.pspec_typeof = ffi.typeof("GParamSpec*[1]") vobject.argument_class_typeof = ffi.typeof("VipsArgumentClass*[1]") vobject.argument_instance_typeof = ffi.typeof("VipsArgumentInstance*[1]") vobject.print_all = function(msg) collectgarbage() print(msg) vips_lib.vips_object_print_all() print() end vobject.new = function(pt) return ffi.gc(pt, gobject_lib.g_object_unref) end -- return 0 for not found and leave the error in the error log vobject.get_typeof = function(self, name) local pspec = vobject.pspec_typeof() local argument_class = vobject.argument_class_typeof() local argument_instance = vobject.argument_instance_typeof() local result = vips_lib.vips_object_get_argument(self, name, pspec, argument_class, argument_instance) if result ~= 0 then return 0 end return pspec[0].value_type end vobject.get_type = function(self, name, gtype) log.msg("vobject.get_type") log.msg(" name =", name) if gtype == 0 then return false end local pgv = gvalue(true) pgv[0]:init(gtype) -- this will add a ref for GObject properties, that ref will be -- unreffed when the gvalue is finalized gobject_lib.g_object_get_property(self, name, pgv) local result = pgv[0]:get() gobject_lib.g_value_unset(pgv[0]) return result end vobject.set_type = function(self, name, value, gtype) log.msg("vobject.set_type") log.msg(" name =", name) log.msg(" value =", value) if gtype == 0 then return false end local pgv = gvalue(true) pgv[0]:init(gtype) pgv[0]:set(value) gobject_lib.g_object_set_property(self, name, pgv) gobject_lib.g_value_unset(pgv[0]) return true end vobject.get = function(self, name) log.msg("vobject.get") log.msg(" name =", name) local gtype = self:get_typeof(name) if gtype == 0 then error(verror.get()) end return vobject.get_type(self, name, gtype) end vobject.set = function(self, name, value) log.msg("vobject.set") log.msg(" name =", name) log.msg(" value =", value) local gtype = self:get_typeof(name) if gtype == 0 then error(verror.get()) end vobject.set_type(self, name, value, gtype) return true end return ffi.metatype("VipsObject", { -- no __gc method, we don't build these things ourselves, just wrap the -- pointer, so we use ffi.gc() instead __index = vobject }) libvips-lua-vips-6959cc9/src/vips/voperation.lua000066400000000000000000000217021475211264700217510ustar00rootroot00000000000000-- manage VipsOperation -- lookup and call operations local ffi = require "ffi" local verror = require "vips.verror" local version = require "vips.version" local log = require "vips.log" local gvalue = require "vips.gvalue" local vobject = require "vips.vobject" local Image = require "vips.Image" local type = type local error = error local pairs = pairs local unpack = unpack or table.unpack local tonumber = tonumber local str_gsub = string.gsub local vips_lib = ffi.load(ffi.os == "Windows" and "libvips-42.dll" or "vips") local REQUIRED = 1 local CONSTRUCT = 2 -- luacheck: ignore local SET_ONCE = 4 -- luacheck: ignore local SET_ALWAYS = 8 -- luacheck: ignore local INPUT = 16 local OUTPUT = 32 local DEPRECATED = 64 local MODIFY = 128 local function isbitset(a, b) return ( (a - (a % b)) / b ) % 2 == 1 end -- find the first image, and recurse local function find_first_image(array, length) length = length or #array for i = 1, length do if Image.is_Image(array[i]) then return array[i] elseif type(array[i]) == "table" then local result = find_first_image(array[i]) if result then return result end end end return nil end local voperation = {} voperation.argumentmap_typeof = ffi.typeof("VipsArgumentMapFn") voperation.pstring_array_typeof = ffi.typeof("const char**[1]") voperation.pint_array_typeof = ffi.typeof("int*[1]") voperation.pint_typeof = ffi.typeof("int[1]") -- cast to a vobject ... this will create a new cdata object, but won't -- change any VipsObject reference counts, nor add a finalizer -- TODO: Could we use `self.parent_instance` here? voperation.vobject = function(self) return ffi.cast(vobject.typeof, self) end -- but for new() we can't do self:vobject():new() since that would -- attach the unref callback to the cdata object made by the vobject() -- cast, not to this voperation voperation.new = function(self) return vobject.new(self) end voperation.set = function(self, name, flags, match_image, value) local vob = self:vobject() local gtype = vob:get_typeof(name) local gtype_comp = gvalue.comparable_type(gtype) -- if the object wants an image and we have a constant, imageize it -- -- if the object wants an image array, imageize any constants in the -- array if match_image then if gtype_comp == gvalue.image_type then value = match_image:imageize(value) elseif gtype_comp == gvalue.array_image_type then for i = 1, #value do value[i] = match_image:imageize(value[i]) end end end -- MODIFY args need to be copied before they are set if isbitset(flags, MODIFY) then log.msg("copying MODIFY arg", name) -- make sure we have a unique copy value = value:copy():copy_memory() end return vob:set_type(name, value, gtype) end -- this is slow ... call as little as possible voperation.getargs = function(self) local names = {} local flags = {} local n_args = 0 if version.at_least(8, 7) then local p_names = ffi.new(voperation.pstring_array_typeof) local p_flags = ffi.new(voperation.pint_array_typeof) local p_n_args = ffi.new(voperation.pint_typeof) vips_lib.vips_object_get_args(self, p_names, p_flags, p_n_args) p_names = p_names[0] p_flags = p_flags[0] n_args = p_n_args[0] -- C-array is numbered from zero for i = 0, n_args - 1 do names[i + 1] = str_gsub(ffi.string(p_names[i]), "-", "_") flags[i + 1] = p_flags[i] end else local cb = ffi.cast(voperation.argumentmap_typeof, function(_, pspec, argument_class, _, _, _) n_args = n_args + 1 -- libvips uses "-" to separate parts of arg names, but we -- need "_" for lua names[n_args] = str_gsub(ffi.string(pspec.name), "-", "_") flags[n_args] = tonumber(argument_class.flags) end) vips_lib.vips_argument_map(self, cb, nil, nil) cb:free() end return names, flags, n_args end -- string_options is any optional args coded as a string, perhaps -- "[strip,tile=true]" voperation.call = function(name, string_options, ...) local call_args = { ... } local vop = vips_lib.vips_operation_new(name) if vop == ffi.NULL then error("no such operation\n" .. verror.get()) end vop = vop:new() local names, flags, arguments_length = vop:getargs() -- cache the call args length local call_args_length = #call_args log.msg("calling operation:", name) log.msg("passed:") log.msg_r(call_args) -- make a thing to quickly get flags from an arg name local flags_from_name = {} -- count required input args local n_required = 0 for i = 1, arguments_length do local flag = flags[i] flags_from_name[names[i]] = flag if isbitset(flag, INPUT) and isbitset(flag, REQUIRED) and not isbitset(flag, DEPRECATED) then n_required = n_required + 1 end end -- so we should have been passed n_required, or n_required + 1 if -- there's a table of options at the end local last_arg if call_args_length == n_required then last_arg = nil elseif call_args_length == n_required + 1 then last_arg = call_args[#call_args] if type(last_arg) ~= "table" then error("unable to call " .. name .. ": " .. call_args_length .. " arguments given, " .. n_required .. ", but final argument is not a table") end else error("unable to call " .. name .. ": " .. call_args_length .. " arguments given, but " .. n_required .. " required") end -- the first image argument is the thing we expand constants to -- match ... look inside tables for images, since we may be passing -- an array of image as a single param local match_image = find_first_image(call_args, call_args_length) -- set any string options before any args so they can't be -- overridden if vips_lib.vips_object_set_from_string(vop:vobject(), string_options) ~= 0 then error("unable to call " .. name .. "\n" .. verror.get()) end local n = 0 for i = 1, arguments_length do local flag = flags[i] if isbitset(flag, INPUT) and isbitset(flag, REQUIRED) and not isbitset(flag, DEPRECATED) then n = n + 1 if not vop:set(names[i], flag, match_image, call_args[n]) then error("unable to call " .. name .. "\n" .. verror.get()) end end end if last_arg then for k, v in pairs(last_arg) do local flag = flags_from_name[k] if not flag then error("unable to call " .. name .. ": invalid flag '" .. tostring(k) .. "'") end if not vop:set(k, flag, match_image, v) then error("unable to call " .. name .. "\n" .. verror.get()) end end end local vop2 = vips_lib.vips_cache_operation_build(vop) if vop2 == ffi.NULL then error("unable to call " .. name .. "\n" .. verror.get()) end vop = vop2:new() local result = {} local vob = vop:vobject() -- fetch required output args, plus modified input images n = 1 for i = 1, arguments_length do local flag = flags[i] if isbitset(flag, OUTPUT) and isbitset(flag, REQUIRED) and not isbitset(flag, DEPRECATED) then result[n] = vob:get(names[i]) n = n + 1 end -- MODIFY input args are returned .. this will get the copy we -- made above if isbitset(flag, INPUT) and isbitset(flag, MODIFY) then result[n] = vob:get(names[i]) n = n + 1 end end -- fetch optional output args for i = 1, arguments_length do local flag = flags[i] if isbitset(flag, OUTPUT) and not isbitset(flag, REQUIRED) and not isbitset(flag, DEPRECATED) then result[n] = vob:get(names[i]) n = n + 1 end end -- garbage collection during vips_object_unref_outputs leads to crashes on Lua 5.3 collectgarbage("stop") vips_lib.vips_object_unref_outputs(vop) collectgarbage("restart") -- this strange if expression is because unpack -- has not yet been implemented in the JIT compiler -- of LuaJIT, see: http://wiki.luajit.org/NYI. if n == 1 then return nil elseif n == 2 then return result[1] else -- we could extend this if expression even more, -- but usually one item is returned. return unpack(result) end end return ffi.metatype("VipsOperation", { __index = voperation })