pax_global_header00006660000000000000000000000064125132505030014506gustar00rootroot0000000000000052 comment=2b165cafcef3ad7f510590fcdbb928ae742ce2f4 xmobar-0.23.1/000077500000000000000000000000001251325050300130615ustar00rootroot00000000000000xmobar-0.23.1/.gitignore000066400000000000000000000002521251325050300150500ustar00rootroot00000000000000/dist/ /TAGS /IWlib.hs /StatFS.hs /XUtil.hs /src/IWlib.hs /src/StatFS.hs /src/XUtil.hs /web/index.html /web/releases.html /cabal-dev/ .cabal-sandbox cabal.sandbox.config xmobar-0.23.1/Setup.lhs000077500000000000000000000001461251325050300146750ustar00rootroot00000000000000#!/usr/bin/env runhaskell > import Distribution.Simple > main = defaultMainWithHooks simpleUserHooks xmobar-0.23.1/license000066400000000000000000000026721251325050300144350ustar00rootroot00000000000000Copyright (c) Andrea Rossato All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the author nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. xmobar-0.23.1/news.md000066400000000000000000000462171251325050300143710ustar00rootroot00000000000000% xmobar - Release notes ## Version 0.23.1 (Apr 14, 2015) _Bug fixes_ - Vertical alignment for icons, [issue #216] - Improvements to vertical text alignment, with many thanks to Jan Palus (see ongoing discussion in [issue #221]). - Better error handling in `Volume` monitor, [issue #215] - Compilation with ghc 7.8 and 7.10 (thanks to Edward Tjörnhammar, see [issue #225]). [issue #225]: https://github.com/jaor/xmobar/issues/225 [issue #221]: https://github.com/jaor/xmobar/issues/221 [issue #216]: https://github.com/jaor/xmobar/issues/216 [issue #215]: https://github.com/jaor/xmobar/issues/215 ## Version 0.23 (Mar 8, 2015) _New features_ - Xmobar can now use a (semi)transparent background: set it with the new configuration option `alpha` (thanks to Edward Z. Yang, see [issue #114]). - Multiple fonts available by means of the new configuration parameter `additionalFonts` and the template markers `...`, by Markus Scherer. - New variables in `Mem` monitor for available memory as reported by Linux 3.14 and newer, by Samuli Thomasson. - New configuration parameters `textOffset` and `iconOffset` (see discussion in [issue #171] and [issue #201]). - New template variable `flags` in `MPD` monitor, by Duncan Burke. [issue #171]: https://github.com/jaor/xmobar/issues/171 [issue #201]: https://github.com/jaor/xmobar/issues/201 [issue #114]: https://github.com/jaor/xmobar/issues/114 _Bug fixes_ - We honour the `-S` (show suffix) monitor flag in `CpuFreq`. - Better `Weather` parsing of wind direction, by Dino Morelli (see [pull #212]). [pull #212]: https://github.com/jaor/xmobar/pull/212 ## Version 0.22.1 (Oct 11, 2014) _Bug fixes_ - Fix compilation in systems that don't need mtl newer than the one shipped with GHC. ## Version 0.22 (Oct 9, 2014) _New features_ - New `MarqueePipeReader` plugin by Reto Hablützel. - `Network` monitor has now adaptive units (`-S` is used now to switch them on), by Axel Angel. - `Weather` now offers `dewPointC` and `dewPointF` instead of `dewPoint`, and the new `windCardinal`, `windAzimuth`, `windMph` and `windKnots` variables, by Tony Morris. - Strings in the configuration file can now span multiple lines using Haskell-style multiline script, thanks to dunric - Icons can now be also xpm files (if xmobar is compiled with `with_xpm`), thanks to Alexander Shabalin. - New `borderWidth` option to set xmobar's boder width, thanks to Travis Staton. - Support for multiple Xft fonts, thanks to Phil Xiaojun Hu and Cedric staub (see [pull request #196]). - Icon patterns for several monitors, that allow you to specify a collection of icons to use for successive integer variable values, thanks to Alexander Shabalin (see [pull request #192] and the documentation for details). - Upgrade to libmpd 0.9. _Bug fixes_ - Much more efficient implementation of the `Locks` plugin, thanks to Anton Vorontsov (see [pull request #195]). - Not colorizing total disk size in `DiskU` ([issue #189]). - Avoiding zombies on click actions, thanks to Phil Xiaojun Hu ([issue #181]). [issue #181]: https://github.com/jaor/xmobar/issues/181 [issue #189]: https://github.com/jaor/xmobar/issues/189 [pull request #192]: https://github.com/jaor/xmobar/pull/192 [pull request #195]: https://github.com/jaor/xmobar/pull/195 [pull request #196]: https://github.com/jaor/xmobar/pull/196 ## Version 0.21 (Jul 1, 2014) _New features_ - Vertical bar indicators using unicode available for most monitors, by Eric Mrak. - `CoreTemp`: support for linux 3.15, by Tomáš Janoušek. - New `CatInt` monitor, displaying integer values read from a file, by Nathaniel Wesley Filardo. - New `` tag for safer input parsing, also by Nathaniel. - New `UnsafeXMonadLog` monitor (by Eric Mrak) and their xproperty counterparts, `UnsafeXPropertyLog` and `UnsafeNamedXPropertyLog`. _Bug fixes_ - `Network` now reports status for ppp connections (see [issue #89]). - Fix for very long running `Cpu` monitors, by Robert J Macomber. [issue #89]: https://github.com/jaor/xmobar/issues/89 ## Version 0.20.1 (March 13, 2014) _New features_ - Back to picking by default the first available screen, with a new configuration option, `pickBroadest`, for choosing the broadest (see [issue #158]). [issue #158]: https://github.com/jaor/xmobar/issues/158 ## Version 0.20 (March 10, 2014) _New features_ - Mouse actions now support multiple buttons, by Marcin Mikołajczyk. - Non supported monitors are ignored in configuration files (see [issue #139]), by Adam Vogt. _Bug fixes_ - `Disk` monitor now ignores non-existent devices (Reto Hablützel). - `Weather` is now non-blocking and doesn't use curl (Ben Boeckel). - Fix for `Memory` monitor in 3.14 kernels (Ben Boeckel). - Fix for infinite loops in `AutoMPD` ([issue #76], [issue #111]). - More robust AC readings in `BatteryP`. - Fix for `Top` monitor's readings for processes whose name contains blanks. - Fixes for geometry computation on multihead (Dmitry Malikov). - Fixes for missing XDG configuration (Thiago Negri and James McCoy, see [issue #133]). - Compatibility with latest `directory` (1.2.0.2). [issue #76]: https://github.com/jaor/xmobar/issues/76 [issue #111]: https://github.com/jaor/xmobar/issues/111 [issue #133]: https://github.com/jaor/xmobar/issues/133 [issue #139]: https://github.com/jaor/xmobar/issues/133 ## Version 0.19 (October 27, 2013) As of this release, the old bug tracker at Google code is deprecated. Please use [Github's tracker] for new bugs. _New features_ - New monitor `BatteryN`, a variant of `BatteryP` that lets you specify the name of the monitor in the template. - Support for configuration file living in `XDG_CONFIG_HOME` (see [github #99]). - `Com` uses safer `runInteractiveProcess` instead of spawning a shell (David McLean). If you're using shell expansion in your `Com` (e.g. "~/bin/script") here's a workaround: `Run Com "/bin/bash" ["-c", "~/bin/script"]` (cf. [github #127]). - New plugin `UnsafeStdinReader` that allows actions from stdin. Now it's possible to have clickable workspaces! (Thiago Negri, see [github #125]). - New monitor configuration option (`-x` or `--nastring`) that allows specifying what string to display when a monitor is not available (defaulting to "N/A"). Cf. [github #119]. _Bug fixes_ - Using the width options `-w`, `-m` and `-M` in battery monitors watts display ([github #118]). - Using the `-d` option in `CoreTemp` ([github #115]) - Fix for systems not supporting PCRE regular expressions: we use now BCEs, so regex-compat should be enough everywhere (see [github #117]). - Weather monitor: support for stations without name (Sergei Trofimovich, [issue #65]). [Github's tracker]: https://github.com/jaor/xmobar/issues [github #99]: https://github.com/jaor/xmobar/issues/115 [github #115]: https://github.com/jaor/xmobar/issues/115 [github #117]: https://github.com/jaor/xmobar/issues/117 [github #125]: https://github.com/jaor/xmobar/issues/125 [issue #65]: http://code.google.com/p/xmobar/issues/detail?id=65 [github #118]: https://github.com/jaor/xmobar/issues/118 [github #119]: https://github.com/jaor/xmobar/issues/119 [github #127]: https://github.com/jaor/xmobar/issues/127 ## Version 0.18 (June 5, 2013) _New features_ - All extra argument monitors taking a string (e.g. `-O` for `BatteryP`) accept now template variables (see [github #109] and [#110]). Thanks to Todd Lunter. - New battery monitor extra argument, `-i`, for the idle status. _Bug fixes_ - Safer standard input parsing, avoiding injections. [github #109]: https://github.com/jaor/xmobar/issues/109 [#110]: https://github.com/jaor/xmobar/issues/110 ## Version 0.17 (May 5, 2013) _New features_ - Icons support: it's now possible to insert bitmaps in the template (Edward O'Callaghan, Alexander Polakov and Tomáš Janoušek). - Initial support for reacting to mouse clicks (Alexander Polakov). - New `TopP` and `BottomP` alignments, taking left and right paddings (thanks to Dmitry Malikov). - New `` field for memory monitor (Peter Simons). - New `allDesktops` and `overrideRedirect` configuration options, providing dock behaviour in tiling WMs (when set to True and False respectively). Cf. discussion at [github #105]. - Experimental `-d` (start as a dock) option, may address [github #67] in some window managers. _Bug fixes_ - Partial (as reports go) fix for [github #77]. - Safer volume plugin (Dmitry Malikov). - Battery percentage capped at 100% (RJ Regenold). [github #67]: https://github.com/jaor/xmobar/issues/67 [github #77]: https://github.com/jaor/xmobar/issues/77 [github #105]: https://github.com/jaor/xmobar/issues/105 ## Version 0.16 (Dec 3, 2012) _New features_ - New monitor `AutoMPD`, which uses asynchronous events to display MPD status (thanks to Ben Boeckel). - New monitor `BufferedPipeReader` displaying data from multiple pipes (thanks to Jochen Keil). - New monitor `DynNetwork`, which detects the active interface automatically, by Reto Hablützel - New monitor, `Locks`, displaying the status of lock keys, by Patrick Chilton. - Extension for DBUS signal handling (Jochen Keil) - Hide/Reveal: one can send signals to xmobar and make it (un)hide itself (Jochen again). - `PipeReader`'s default text is now configurable, by Reto Hablützel. - Dependencies updated to latest mtl and libmpd (thanks to Sergei Trofimovich). - Dependencies on the deprecated dbus-core removed in favour of dbus 0.10 (thanks to Jochen Keil). - MPris2 now includes genre and composer among its fields. _Bug fixes_ - `DiskIO` now can report overall activity in all partitions of a device which is not mounted itself (e.g., sda when sda1, sda3, etc. are the mounted partitions). Thanks to John Soros. See [github #73]. - `DiskU`, the disk usage monitor, works again correctly on Linux, instead of randomly crashing every now and then, and reporting wrong used size. - When using antialiased fonts, we were causing a memory leak in the X server by repeatedly allocating colors that, apparently, the server doesn't know how to get rid of (even when told so!). We're caching them now and X server memory doesn't grow. - Compilation errors and warnings with GHC 7.6 removed (thanks to Raghavendra D Prabhu for his reports in [github #71]). _Known problems_ Some users have reported problems with xmobar compiled with GHC 7.6 in ArchLinux: see [github #78] and pointers therein. Please, send reports of any problems or successes in that regard so that we can fix any remaining issues. Thanks! [github #71]: https://github.com/jaor/xmobar/issues/71 [github #73]: https://github.com/jaor/xmobar/issues/73 [github #78]: https://github.com/jaor/xmobar/issues/78 ## Version 0.15 (June 4, 2012) _Incompatible changes_ - `Batt` monitor no longer uses `-c` to specify the charge file: it should figure things out by itself (cf. [issue 69]). _New features_ - New command line option, `-C`, that allows *adding* commands to those specified in the configuration file (Ben Boeckel). - Dependency on GHC's threaded runtime has been eliminated. - New MPRIS (versions 1 and 2) monitor, by Artem Tarasov. - New monitor option `-d` to specify the number of decimal places to display for float numbers. Defaults to 0. See [issue 58]. - New compilation option `--with_threaded`, to use GHC's threaded runtime to compile xmobar. Disabled by default (cf. discussion in [github #36]). _Bug fixes_ - Stricter build dependencies versioning in cabal file. - [issue 56] vertical alignment of text improved. - [issue 64] display of `watts` in `Batt` monitor fixed. - [issue 69] miscellaneous battery reporting issues. - [issue 67] compilation in DragonFly. - DiskIO works also when device path in mtab are symbolic links to the real device file. - Wireless monitor honours padding settings for ESSID names. - CoreTemp monitor fixed for newer kernels ([github #38]). [issue 56]: http://code.google.com/p/xmobar/issues/detail?id=56 [issue 58]: http://code.google.com/p/xmobar/issues/detail?id=58 [issue 64]: http://code.google.com/p/xmobar/issues/detail?id=64 [issue 67]: http://code.google.com/p/xmobar/issues/detail?id=67 [issue 69]: http://code.google.com/p/xmobar/issues/detail?id=69 [github #36]: https://github.com/jaor/xmobar/issues/36 [github #38]: https://github.com/jaor/xmobar/issues/38 ## Version 0.14 (Dec 10, 2011) _New features_ - New brightness monitor, courtesy of Martin Perner. - New DateZone plugin, for configurable timezone and localized datetimes, also by Martin. - New keyboard layout monitor (Kbd). Yes, by Martin. - Rewrite of the event handling ([issue 53], [issue 57]), you guessed it. - Cpu monitor now also reports `iowait` field ([issue 55]). - Battery monitor: the full charge file is now settable in the monitor arguments (olpc systems use `charge_full_design`; see [issue 62]). _Bug fixes_ - [issue 45] Fix for crashes with AC status changes in battery monitor. - [issue 48] The field of Wireless behaves like a percentage. - [issue 50]/[issue 61]: `MPD` monitor now works with libmpd 0.6. - [issue 60] Fixes for crashes on power resume for battery monitor. - Template sections without fields are now correctly displayed. - Catch errors when reading battery status (Ben Boeckel). - Compilation issues with ghc 7.x (Sergei Trofimovich). - Fixes for CoreTemp monitor in new kernels (Norbert Zeh). - Fix for pulseaudio problems in volume monitor (Martin Perner). - Fix for parsing errors when a `Run` entry ended in an array (Martin). - Fixed compilation in OpenBSD (Ivo van der Sangen). [issue 45]: http://code.google.com/p/xmobar/issues/detail?id=45 [issue 48]: http://code.google.com/p/xmobar/issues/detail?id=48 [issue 50]: http://code.google.com/p/xmobar/issues/detail?id=50 [issue 53]: http://code.google.com/p/xmobar/issues/detail?id=53 [issue 55]: http://code.google.com/p/xmobar/issues/detail?id=55 [issue 57]: http://code.google.com/p/xmobar/issues/detail?id=57 [issue 60]: http://code.google.com/p/xmobar/issues/detail?id=60 [issue 61]: http://code.google.com/p/xmobar/issues/detail?id=61 [issue 62]: http://code.google.com/p/xmobar/issues/detail?id=62 ## Version 0.13 (March 28, 2011) _New features_ - New `Volume` monitor displaying ALSA soundcards information, by Thomas Tuegel. - New `ThermalZone` plugin substituting `Thermal` and using linux's *sysfs* interface (you need this one if you're using a kernel version equal to or above 2.6.37). See [issue 44]. - xmobar app new has WM_CLASS, WM_NAME and _NET_WM_PID xprops ([issue 38]). _Incompatible changes_ - In the process of solving [issue 14], we've broken those configurations that rely on including alignment separators in the input fed to `StdinReader`. - The MPD plugin does not accept host and port options anymore: use the environment variables MPD_HOST and MPD_PORT instead. - The `Mail` plugin now takes a second parameter (a string) specifying its alias. As a side-effect, this solves [issue 30]. _Bug fixes_ - [issue 14] `StdinReader` and other plugins accepting external input don't get confused anymore when characters from `alignSep` appear in their input. - [issue 27] `BottomSize` placement now respects its width argument. - [issue 28] Compilation in Mac OS X fixed. - [issue 30] `Mail` plugin can be specified anywhere in commands list. - [issue 36] Battery monitor now supports non-standard locations of the `/sys/class/power_supply/AC/online` file. - [issue 40] Battery monitor now supports the new power_now, that replaces current_now in linux kernels for v. 2.36 and above. - [issue 42] More accurate net monitor rates. - DiskIO, Cpu and MultiCpu monitors are also more accurate now. - Text is now correctly centered vertically. - `FullBM` border spec fixed. [issue 14]: http://code.google.com/p/xmobar/issues/detail?id=14 [issue 27]: http://code.google.com/p/xmobar/issues/detail?id=27 [issue 28]: http://code.google.com/p/xmobar/issues/detail?id=28 [issue 30]: http://code.google.com/p/xmobar/issues/detail?id=30 [issue 36]: http://code.google.com/p/xmobar/issues/detail?id=36 [issue 38]: http://code.google.com/p/xmobar/issues/detail?id=38 [issue 40]: http://code.google.com/p/xmobar/issues/detail?id=40 [issue 42]: http://code.google.com/p/xmobar/issues/detail?id=42 [issue 44]: http://code.google.com/p/xmobar/issues/detail?id=44 ## Version 0.12 (Dec 24, 2010) xmobar has a new [maintainer], a new [website], a new [mailing list] and uses a new [source code repository]. Many thanks to Andrea Rossato, xmobar's author and maintainer so far, for creating xmobar in the first place, and for giving me the chance to become its maintainer. And a big thanks to Ben Boeckel, Petr Rockai and Norbert Zeh for their patches. [website]: http://projects.haskell.org/xmobar/ [mailing list]: http://projects.haskell.org/cgi-bin/mailman/listinfo/xmobar [source code repository]: https://github.com/jaor/xmobar [maintainer]: http://hacks-galore.org/jao/ _New features_ - Window borders: configuration options `border` and `borderColor` allow drawing borders around xmobar's window. - New monitor, `Uptime`, showing the system uptime. - New monitor argument (`-S`) to enable displaying the `%` symbol in percentages or other suffixes (e.g., units in Uptime and Network); the symbol is now never included by default. - New 'run once' commands, by specifying a 0 refresh rate in `Run Com` ([issue 26]). - MPD monitor: updated to libmpd 1.5. New fields `ppos` (playlist position) and `remaining` (remaining time). New configuration options to specify MPD's host, user name and password. - Battery monitor: new `watts` and `timeleft` fields (Petr Rockai), and specific arguments to control coloring and thresholds of the former. - MultiCPU monitor: new `auto*` fields that automatically detect all present CPUs (Ben Boeckel). - CpuFreq monitor uses just one decimal digit for GHz values (Petr Rockai). - Mail plugin expands paths starting with "~/" (Ben Boeckel). Ditto MBox. - Weather monitor now skips not retrieved fields, instead of displaying a long error message. - New compilation flag, `all_extensions`. - Documentation and website updates. _Bug fixes_ - [issue 23] Wireless monitor is now compatible with iwlib 29. - [issue 24] Swap monitor's used ratio display fixed. - [issue 25] Percentages only include `%` if requested using `-P`. - [issue 31] MPD monitor now respects `-W` argument. - Fixes in CPU frequency formatting, string alignment and colour boxes in monitors (Norbert Zeh). - TopMem and TopProc now use the `-L` and `-H` options correctly for memory template fields. - MBox skips non-existent mbox paths instead of hanging. [issue 23]: http://code.google.com/p/xmobar/issues/detail?id=23 [issue 24]: http://code.google.com/p/xmobar/issues/detail?id=24 [issue 25]: http://code.google.com/p/xmobar/issues/detail?id=25 [issue 26]: http://code.google.com/p/xmobar/issues/detail?id=26 [issue 31]: http://code.google.com/p/xmobar/issues/detail?id=31 xmobar-0.23.1/readme.md000066400000000000000000001707241251325050300146530ustar00rootroot00000000000000% xmobar - a minimalistic status bar # About xmobar is a minimalistic, mostly text based, status bar. It was originally designed and implemented by Andrea Rossato to work with [xmonad], but it's actually usable with any window-manager. xmobar was inspired by the [Ion3] status bar, and supports similar features, like dynamic color management, icons, output templates, and extensibility through plugins. This page documents xmobar 0.23.1 (see [release notes]). [This screenshot] shows xmobar running under [sawfish], with antialiased fonts. And [this one] is my desktop with [xmonad] and two instances of xmobar. [release notes]: http://projects.haskell.org/xmobar/releases.html [xmonad]: http://xmonad.org [Ion3]: http://tuomov.iki.fi/software/ [This screenshot]: http://projects.haskell.org/xmobar/xmobar-sawfish.png [this one]: http://projects.haskell.org/xmobar/xmobar-xmonad.png # Bug Reports To submit bug reports you can use the [bug tracker over at Github] or send mail to our [Mailing list]. Note: the old bug tracker at Google code is deprecated. Please use Github's for new bugs. [bug tracker over at Github]: https://github.com/jaor/xmobar/issues # Installation ## Using cabal-install Xmobar is available from [Hackage], and you can install it using `cabal-install`: cabal install xmobar See below for a list of optional compilation flags that will enable some optional plugins. For instance, to install xmobar with all the bells and whistles, use: cabal install xmobar --flags="all_extensions" ## From source If you don't have `cabal-install` installed, you can get xmobar's source code in a variety of ways: - From [Hackage]. Just download the latest release from xmobar's hackage page. - From [Github]. You can also obtain a tarball in [Github's downloads page]. You'll find there links to each tagged release. - From the bleeding edge repo. If you prefer to live dangerously, just get the latest and greatest (and buggiest, i guess) using git: git clone git://github.com/jaor/xmobar [Github's downloads page]: https://github.com/jaor/xmobar/downloads If you have cabal installed, you can now use it from within xmobar's source tree: cabal install -fall_extensions Otherwise, run the configure script: runhaskell Setup.lhs configure # To enable UTF-8 support run: runhaskell Setup.lhs configure --flags="with_utf8" # To enable both XFT and UTF-8 support run: runhaskell Setup.lhs configure --flags="with_xft" # To enable all extensions runhaskell Setup.lhs configure --flags="all_extensions" Now you can build the source: runhaskell Setup.lhs build runhaskell Setup.lhs install # possibly to be run as root ## Optional features You can configure xmobar to include some optional plugins and features, which are not compiled by default. To that end, you need to add one or more flags to either the cabal install command or the configure setup step, as shown in the examples above. Extensions need additional libraries (listed below) that will be automatically downloaded and installed if you're using cabal install. Otherwise, you'll need to install them yourself. `with_dbus` : Enables support for DBUS by making xmobar to publish a service on the session bus. Requires the [dbus] package. `with_threaded` : Uses GHC's threaded runtime. Use this option if xmobar enters a high-CPU regime right after starting. `with_utf8` : UTF-8 support. Requires the [utf8-string] package. `with_xft` : Antialiased fonts. Requires the [X11-xft] package. This option automatically enables UTF-8. To use XFT fonts you need to use the `xft:` prefix in the `font` configuration option. For instance: font = "xft:Times New Roman-10:italic" Or to have fallback fonts, just separate them by commas: font = "xft:Open Sans:size=9,WenQuanYi Zen Hei:size=9" `with_mpd` : Enables support for the [MPD] daemon. Requires the [libmpd] package. `with_mpris` : Enables support for MPRIS v1/v2 protocol. Requires the [dbus] and [text] packages. `with_inotify` : Support for inotify in modern Linux kernels. This option is needed for the MBox and Mail plugins to work. Requires the [hinotify] package. `with_iwlib` : Support for wireless cards. Enables the Wireless plugin. No Haskell library is required, but you will need the [iwlib] C library and headers in your system (e.g., install `libiw-dev` in Debian-based systems). `with_alsa` : Support for ALSA sound cards. Enables the Volume plugin. Requires the [alsa-mixer] package. To install the latter, you'll need the [libasound] C library and headers in your system (e.g., install `libasound2-dev` in Debian-based systems). `with_datezone` : Support for other timezones. Enables the DateZone plugin. Requires [timezone-olson] and [timezone-series] package. `with_xpm` : Support for xpm image file format. This will allow loading .xpm files in ``. Requires the [libXpm] C library. `all_extensions` : Enables all the extensions above. # Running xmobar You can now run xmobar with: xmobar /path/to/config & or xmobar & if you have the default configuration file saved as `$XDG\_CONFIG\_HOME/xmobar/xmobarrc` (defaulting to `~/.config/xmobar/xmobarrc`), or `~/.xmobarrc`. ## Signal Handling Since 0.14 xmobar reacts to SIGUSR1 and SIGUSR2: - After receiving SIGUSR1 xmobar moves its position to the next screen. - After receiving SIGUSR2 xmobar repositions it self on the current screen. # Configuration ## Quick Start See [samples/xmobar.config] for an example. [samples/xmobar.config]: http://github.com/jaor/xmobar/raw/master/samples/xmobar.config For the output template: - `%command%` will execute command and print the output. The output may contain markups to change the characters' color. - `string` will print `string` with `#FF0000` color (red). - `string` will print `string` with the first font from `additionalFonts`. The index `0` corresponds to the standard font. - `` will insert the given bitmap. XPM image format is also supported when compiled with `--flags="with_xpm"`. - `````` will execute given command when clicked with specified buttons. If not specified, button is equal to 1 (left mouse button). Using old syntax (without backticks surrounding `command`) will result in `button` attribute being ignored. - `` allows the encapsulation of arbitrary text `str` (which must be `len` `Char`s long, where `len` is encoded as a decimal sequence). Careful use of this and `UnsafeStdinReader`, for example, permits window managers to feed xmobar strings with `` tags mixed with un-trusted content (e.g. window titles). For example, if xmobar is invoked as ```xmobar -c "[Run UnsafeStdinReader]" -t "%UnsafeStdinReader%"``` and receives on standard input the line ```foo/>``` then it will display the text ```foo```, which, when clicked, will cause `test` to be echoed. Other configuration options: `font` : Name of the font to be used. Use the `xft:` prefix for XFT fonts. `additionalFonts` : Haskell-style list of fonts to be used with the `fn`-template. Use the `xft:` prefix for XFT fonts. `bgColor` : Background color. `fgColor` : Default font color. `alpha` : The transparency. 0 is transparent, 255 is opaque. `position` : Top, TopP, TopW, TopSize, Bottom, BottomP, BottomW, BottomSize or Static (with x, y, width and height). : TopP and BottomP take 2 arguments: left padding and right padding. : TopW and BottomW take 2 arguments: an alignment parameter (L for left, C for centered, R for Right) and an integer for the percentage width xmobar window will have in respect to the screen width. : TopSize and BottomSize take 3 arguments: an alignment parameter, an integer for the percentage width, and an integer for the minimum pixel height that the xmobar window will have. : For example: : position = BottomW C 75 : to place xmobar at the bottom, centered with the 75% of the screen width. : Or: : position = BottomP 120 0 : to place xmobar at the bottom, with 120 pixel indent of the left. : Or : position = Static { xpos = 0 , ypos = 0, width = 1024, height = 15 } : or : position = Top `textOffset` : The vertical offset, in pixels, for the text baseline. If negative or not given, xmobar will try to center text vertically. `iconOffset` : The vertical offset, in pixels, for icons bottom line. If negative or not given, xmobar will try to center icons vertically. `lowerOnStart` : When True the window is sent the bottom of the window stack initially. `hideOnStart` : When set to True the window is initially not mapped, i.e. hidden. It then can be toggled manually (for example using the dbus interface) or automatically (by a plugin) to make it reappear. `allDesktops` : When set to True (the default), xmobar will tell the window manager explicitly to be shown in all desktops, by setting `_NET_WM_DESKTOP` to 0xffffffff. `overrideRedirect` : If you're running xmobar in a tiling window manager, you might need to set this option to `False` so that it behaves as a docked application. Defaults to `True`. `pickBroadest` : When multiple displays are available, xmobar will choose by default the first one to place itself. With this flag set to `True` (the default is `False`) it will choose the broadest one instead. `persistent` : When True the window status is fixed i.e. hiding or revealing is not possible. This option can be toggled at runtime. Defaults to False. `border` : TopB, TopBM, BottomB, BottomBM, FullB, FullBM or NoBorder (default). : TopB, BottomB, FullB take no arguments, and request drawing a border at the top, bottom or around xmobar's window, respectively. : TopBM, BottomBM, FullBM take an integer argument, which is the margin, in pixels, between the border of the window and the drawn border. `borderColor` : Border color. `borderWidth` : Border width in pixels. `iconRoot` : Root folder where icons are stored. For if path start with `"/"`, `"./"` or `"../"` it is interpreted as it is. Otherwise it will have `iconRoot ++ "/"` prepended to it. Default is `"."`. `commands` : For setting the options of the programs to run (optional). `sepChar` : The character to be used for indicating commands in the output template (default '%'). `alignSep` : a 2 character string for aligning text in the output template. The text before the first character will be align to left, the text in between the 2 characters will be centered, and the text after the second character will be align to the right. `template` : The output template. ### Running xmobar with i3status xmobar can be used to display information generated by [i3status], a small program that gathers system information and outputs it in formats suitable for being displayed by the dzen2 status bar, wmii's status bar or xmobar's `StdinReader`. See [i3status manual] for further details. ## Command Line Options xmobar can be either configured with a configuration file or with command line options. In the second case, the command line options will overwrite the corresponding options set in the configuration file. Example: xmobar -B white -a right -F blue -t '%LIPB%' -c '[Run Weather "LIPB" [] 36000]' This is the list of command line options (the output of xmobar --help): Usage: xmobar [OPTION...] [FILE] Options: -h, -? --help This help -V --version Show version information -f font name --font=font name The font name -B bg color --bgcolor=bg color The background color. Default black -F fg color --fgcolor=fg color The foreground color. Default grey -A alpha --alpha=alpha The transparency: 0 is transparent, 255 (the default) is opaque -o --top Place xmobar at the top of the screen -b --bottom Place xmobar at the bottom of the screen -d --dock Try to start xmobar as a dock -a alignsep --alignsep=alignsep Separators for left, center and right text alignment. Default: '}{' -s char --sepchar=char The character used to separate commands in the output template. Default '%' -t template --template=template The output template -i path --iconroot=path Default directory for icon pattern files -c commands --commands=commands The list of commands to be executed -C command --add-command=command Add to the list of commands to be executed -x screen --screen=screen On which X screen number to start Mail bug reports and suggestions to ## The DBus Interface When compiled with the optional `with_dbus` flag, xmobar can be controlled over dbus. All signals defined in [src/Signal.hs] as `data SignalType` can now be sent over dbus to xmobar. Due to current limitations of the implementation only one process of xmobar can acquire the dbus. This is handled on a first-come-first-served basis, meaning that the first process will get the dbus interface. Other processes will run without further problems, yet have no dbus interface. [src/Signal.hs]: https://github.com/jaor/xmobar/raw/master/src/Signal.hs - Bus Name: `org.Xmobar.Control` - Object Path: `/org/Xmobar/Control` - Member Name: Any of SignalType, e.g. `string:Reveal` - Interface Name: `org.Xmobar.Control` An example using the `dbus-send` command line utility: dbus-send \ --session \ --dest=org.Xmobar.Control \ --type=method_call \ --print-reply \ '/org/Xmobar/Control' \ org.Xmobar.Control.SendSignal \ "string:Toggle 0" It is also possible to send multiple signals at once: # send to another screen, reveal and toggle the persistent flag dbus-send [..] \ "string:ChangeScreen 0" "string:Reveal 0" "string:TogglePersistent" The `Toggle`, `Reveal`, and `Hide` signals take an additional integer argument that denotes an initial delay, in tenths of a second, before the command takes effect. ### Example for using the DBus IPC interface with XMonad Bind the key which should {,un}map xmobar to a dummy value. This is necessary for {,un}grabKey in xmonad. ((0, xK_Alt_L ), return ()) Also, install `avoidStruts` layout modifier from `XMonad.Hooks.ManageDocks` Finally, install these two event hooks (`handleEventHook` in `XConfig`) `myDocksEventHook` is a replacement for `docksEventHook` which reacts on unmap events as well (which `docksEventHook` doesn't). import qualified XMonad.Util.ExtensibleState as XS data DockToggleTime = DTT { lastTime :: Time } deriving (Eq, Show, Typeable) instance ExtensionClass DockToggleTime where initialValue = DTT 0 toggleDocksHook :: Int -> KeySym -> Event -> X All toggleDocksHook to ks ( KeyEvent { ev_event_display = d , ev_event_type = et , ev_keycode = ekc , ev_time = etime } ) = io (keysymToKeycode d ks) >>= toggleDocks >> return (All True) where toggleDocks kc | ekc == kc && et == keyPress = do safeSendSignal ["Reveal 0", "TogglePersistent"] XS.put ( DTT etime ) | ekc == kc && et == keyRelease = do gap <- XS.gets ( (-) etime . lastTime ) safeSendSignal [ "TogglePersistent" , "Hide " ++ show (if gap < 400 then to else 0) ] | otherwise = return () safeSendSignal s = catchX (io $ sendSignal s) (return ()) sendSignal = withSession . callSignal withSession mc = connectSession >>= \c -> callNoReply c mc >> disconnect c callSignal :: [String] -> MethodCall callSignal s = ( methodCall ( objectPath_ "/org/Xmobar/Control" ) ( interfaceName_ "org.Xmobar.Control" ) ( memberName_ "SendSignal" ) ) { methodCallDestination = Just $ busName_ "org.Xmobar.Control" , methodCallBody = map toVariant s } toggleDocksHook _ _ _ = return (All True) myDocksEventHook :: Event -> X All myDocksEventHook e = do when (et == mapNotify || et == unmapNotify) $ whenX ((not `fmap` (isClient w)) <&&> runQuery checkDock w) refresh return (All True) where w = ev_window e et = ev_event_type e ## The Output Template The output template must contain at least one command. xmobar will parse the template and will search for the command to be executed in the `commands` configuration option. First an `alias` will be searched (plugins such as Weather or Network have default aliases, see below). After that, the command name will be tried. If a command is found, the arguments specified in the `commands` list will be used. If no command is found in the `commands` list, xmobar will ask the operating system to execute a program with the name found in the template. If the execution is not successful an error will be reported. It's possible to insert in the global templates icon directives of the form: which will produce the expected result. Accepted image formats are XBM and XPM (when `with_xpm` flag is enabled). If path does not start with `"/"`, `"./"`, `"../"` it will have `iconRoot ++ "/"` prepended to it. It's also possible to use action directives of the form: which will be executed when clicked on with specified mouse buttons. This tag can be nested, allowing different commands to be run depending on button clicked. ## The `commands` Configuration Option The `commands` configuration option is a list of commands information and arguments to be used by xmobar when parsing the output template. Each member of the list consists in a command prefixed by the `Run` keyword. Each command has arguments to control the way xmobar is going to execute it. The option consists in a list of commands separated by a comma and enclosed by square parenthesis. Example: [Run Memory ["-t","Mem: %"] 10, Run Swap [] 10] to run the Memory monitor plugin with the specified template, and the swap monitor plugin, with default options, every second. And here's an example of a template for the commands above using an icon: template=" " This example will run "xclock" command when date is clicked: template="%date% The only internal available command is `Com` (see below Executing External Commands). All other commands are provided by plugins. xmobar comes with some plugins, providing a set of system monitors, a standard input reader, an Unix named pipe reader, a configurable date plugin, and much more: we list all available plugins below. Other commands can be created as plugins with the Plugin infrastructure. See below. ## System Monitor Plugins This is the description of the system monitor plugins available in xmobar. Some of them are only installed when an optional build option is set: we mention that fact, when needed, in their description. Each monitor has an `alias` to be used in the output template. Monitors have default aliases. The sections below describe every monitor in turn, but before we provide a list of the configuration options (or *monitor arguments*) they all share. ### Icon patterns Some monitors allow usage of strings that depend on some integer value from 0 to 8 by replacing all occurences of `"%%"` with it (i.e. `""` will be interpreted as `""` when the value is `3`, also `"%"` is interpreted as `"%"`, `"%%"` as `"3"`, `"%%%"` as `"3%"`, `"%%%%"` as `"33"` and so on). Essentially it allows to replace vertical bars with custom icons. For example, Run Brightness [ "-t", "" , "--" , "--brightness-icon-pattern", "" ] 30 Will display `bright_0.xpm` to `bright_8.xpm` depending on current brightness value. ### Default Monitor Arguments Monitors accept a common set of arguments, described in the first subsection below. In addition, some monitors accept additional options that are specific to them. When specifying the list of arguments in your configuration, the common options come first, followed by "--", followed by any monitor-specific options. These are the options available for all monitors below: - `-t` _string_ Output template - Template for the monitor output. Field names must be enclosed between pointy brackets (``) and will be substituted by the computed values. You can also specify the foreground (and optionally, background) color for a region by bracketing it between `` (or ``) and ``. The rest of the template is output verbatim. - Long option: `--template` - Default value: per monitor (see above). - `-H` _number_ The high threshold. - Numerical values higher than _number_ will be displayed with the color specified by `-h` (see below). - Long option: `--High` - Default value: 66 - `-L` _number_ The low threshold. - Numerical values higher than _number_ and lower than the high threshold will be displayed with the color specified by `-n` (see below). Values lower than _number_ will use the `-l` color. - Long option: `--Low` - Default value: 33 - `-h` _color_ High threshold color. - Color for displaying values above the high threshold. _color_ can be either a name (e.g. "blue") or an hexadecimal RGB (e.g. "#FF0000"). - Long option: `--high` - Default: none (use the default foreground). - `-n` _color_ Color for 'normal' values - Color used for values greater than the low threshold but lower than the high one. - Long option: `--normal` - Default: none (use the default foreground). - `-l` _color_ The low threshold color - Color for displaying values below the low threshold. - Long option: `--low` - Default: none (use the default foreground). - `-S` _boolean_ Display optional suffixes - When set to a true designator ("True", "Yes" or "On"), optional value suffixes such as the '%' symbol or optional units will be displayed. - Long option: `--suffix` - Default: False. - `-p` _number_ Percentages padding - Width, in number of digits, for quantities representing percentages. For instance `-p 3` means that all percentages in the monitor will be represented using 3 digits. - Long option: `--ppad` - Default value: 0 (don't pad) - `-d` _number_ Decimal digits - Number of digits after the decimal period to use in float values. - Long option: `--ddigits` - Default value: 0 (display only integer part) - `-m` _number_ Minimum field width - Minimum width, in number of characters, of the fields in the monitor template. Values whose printed representation is shorter than this value will be padded using the padding characters given by the `-c` option with the alignment specified by `-a` (see below). - Long option: `--minwidth` - Default: 0 - `-M` _number_ Maximum field width - Maximum width, in number of characters, of the fields in the monitor template. Values whose printed representation is longer than this value will be truncated. - Long option: `--maxwidth` - Default: 0 (no maximum width) - `-w` _number_ Fixed field width - All fields will be set to this width, padding or truncating as needed. - Long option: `--width` - Default: 0 (variable width) - `-c` _string_ - Characters used for padding. The characters of _string_ are used cyclically. E.g., with `-P +- -w 6`, a field with value "foo" will be represented as "+-+foo". - Long option: `--padchars` - Default value: " " - `-a` r|l Field alignment - Whether to use right (r) or left (l) alignment of field values when padding. - Long option: `--align` - Default value: r (padding to the left) - `-b` _string_ Bar background - Characters used, cyclically, to draw the background of bars. For instance, if you set this option to "·.", an empty bar will look like this: `·.·.·.·.·.` - Long option: `--bback` - Default value: ":" - `-f` _string_ Bar foreground - Characters used, cyclically, to draw the foreground of bars. - Long option: `--bfore` - Default value: "#" - `-W` _number_ Bar width - Total number of characters used to draw bars. - Long option: `--bwidth` - Default value: 10 - `-x` _string_ N/A string - String to be used when the monitor is not available - Long option: `--nastring` - Default value: "N/A" Commands' arguments must be set as a list. E.g.: Run Weather "EGPF" ["-t", ": C"] 36000 In this case xmobar will run the weather monitor, getting information for the weather station ID EGPF (Glasgow Airport, as a homage to GHC) every hour (36000 tenth of seconds), with a template that will output something like: Glasgow Airport: 16.0C ### `Uptime Args RefreshRate` - Aliases to `uptime` - Args: default monitor arguments. The low and high thresholds refer to the number of days. - Variables that can be used with the `-t`/`--template` argument: `days`, `hours`, `minutes`, `seconds`. The total uptime is the sum of all those fields. You can set the `-S` argument to "True" to add units to the display of those numeric fields. - Default template: `Up: d h m` ### `Weather StationID Args RefreshRate` - Aliases to the Station ID: so `Weather "LIPB" []` can be used in template as `%LIPB%` - Thresholds refer to temperature in the selected units - Args: default monitor arguments - Variables that can be used with the `-t`/`--template` argument: `station`, `stationState`, `year`, `month`, `day`, `hour`, `windCardinal`, `windAzimuth`, `windMph`, `windKnots`, `visibility`, `skyCondition`, `tempC`, `tempF`, `dewPointC`, `dewPointF`, `rh`, `pressure` - Default template: `: C, rh % ()` - Retrieves weather information from http://weather.noaa.gov. ### `Network Interface Args RefreshRate` - Aliases to the interface name: so `Network "eth0" []` can be used as `%eth0%` - Thresholds refer to velocities expressed in Kb/s - Args: default monitor arguments, plus: - `--rx-icon-pattern`: dynamic string for reception rate in `rxipat`. - `--tx-icon-pattern`: dynamic string for transmission rate in `txipat`. - Variables that can be used with the `-t`/`--template` argument: `dev`, `rx`, `tx`, `rxbar`, `rxvbar`, `rxipat`, `txbar`, `txvbar`, `txipat`. Reception and transmission rates (`rx` and `tx`) are displayed by default as Kb/s, without any suffixes, but you can set the `-S` to "True" to make them displayed with adaptive units (Kb/s, Mb/s, etc.). - Default template: `: KB|KB` ### `DynNetwork Args RefreshRate` - Active interface is detected automatically - Aliases to "dynnetwork" - Thresholds are expressed in Kb/s - Args: default monitor arguments, plus: - `--rx-icon-pattern`: dynamic string for reception rate in `rxipat`. - `--tx-icon-pattern`: dynamic string for transmission rate in `txipat`. - Variables that can be used with the `-t`/`--template` argument: `dev`, `rx`, `tx`, `rxbar`, `rxvbar`, `rxipat`, `txbar`, `txvbar`, `txipat`. Reception and transmission rates (`rx` and `tx`) are displayed in Kbytes per second, and you can set the `-S` to "True" to make them displayed with units (the string "Kb/s"). - Default template: `: KB|KB` ### `Wireless Interface Args RefreshRate` - Aliases to the interface name with the suffix "wi": thus, `Wireless "wlan0" []` can be used as `%wlan0wi%` - Args: default monitor arguments, plus: - `--quality-icon-pattern`: dynamic string for connection quality in `qualityipat`. - Variables that can be used with the `-t`/`--template` argument: `essid`, `quality`, `qualitybar`, `qualityvbar`, `qualityipat` - Thresholds refer to link quality in a `[0, 100]` scale - Default template: ` ` - Requires the C library [iwlib] (part of the wireless tools suite) installed in your system. In addition, to activate this plugin you must pass `--flags="with_iwlib"` during compilation ### `Memory Args RefreshRate` - Aliases to `memory` - Args: default monitor arguments, plus: - `--used-icon-pattern`: dynamic string for used memory ratio in `usedipat`. - `--free-icon-pattern`: dynamic string for free memory ratio in `freeipat`. - `--available-icon-pattern`: dynamic string for available memory ratio in `availableipat`. - Thresholds refer to percentage of used memory - Variables that can be used with the `-t`/`--template` argument: `total`, `free`, `buffer`, `cache`, `available`, `used`, `usedratio`, `usedbar`, `usedvbar`, `usedipat`, `freeratio`, `freebar`, `freevbar`, `freeipat`, `availableratio`, `availablebar`, `availablevbar`, `availableipat` - Default template: `Mem: % (M)` ### `Swap Args RefreshRate` - Aliases to `swap` - Args: default monitor arguments - Thresholds refer to percentage of used swap - Variables that can be used with the `-t`/`--template` argument: `total`, `used`, `free`, `usedratio` - Default template: `Swap: %` ### `Cpu Args RefreshRate` - Aliases to `cpu` - Args: default monitor arguments, plus: - `--load-icon-pattern`: dynamic string for cpu load in `ipat` - Thresholds refer to percentage of CPU load - Variables that can be used with the `-t`/`--template` argument: `total`, `bar`, `vbar`, `ipat`, `user`, `nice`, `system`, `idle`, `iowait` - Default template: `Cpu: %` ### `MultiCpu Args RefreshRate` - Aliases to `multicpu` - Args: default monitor arguments, plus: - `--load-icon-pattern`: dynamic string for overall cpu load in `ipat`. - `--load-icon-patterns`: dynamic string for each cpu load in `autoipat`, `ipat{i}`. This option can be specified several times. nth option corresponds to nth cpu. - Thresholds refer to percentage of CPU load - Variables that can be used with the `-t`/`--template` argument: `autototal`, `autobar`, `autovbar`, `autoipat`, `autouser`, `autonice`, `autosystem`, `autoidle`, `total`, `bar`, `vbar`, `ipat`, `user`, `nice`, `system`, `idle`, `total0`, `bar0`, `vbar0`, `ipat0`, `user0`, `nice0`, `system0`, `idle0`, ... The auto* variables automatically detect the number of CPUs on the system and display one entry for each. - Default template: `Cpu: %` ### `Battery Args RefreshRate` - Same as `BatteryP ["BAT0", "BAT1", "BAT2"] Args RefreshRate`. ### `BatteryP Dirs Args RefreshRate` - Aliases to `battery` - Dirs: list of directories in `/sys/class/power_supply/` where to look for the ACPI files of each battery. Example: `["BAT0","BAT1","BAT2"]`. Only the first 3 directories will be searched. - Args: default monitor arguments, plus the following specific ones (these options, being specific to the monitor, are to be specified after a `--` in the argument list): - `-O`: string for AC "on" status (default: "On") - `-i`: string for AC "idle" status (default: "On") - `-o`: string for AC "off" status (default: "Off") - `-L`: low power (`watts`) threshold (default: -12) - `-H`: high power threshold (default: -10) - `-l`: color to display power lower than the `-L` threshold - `-m`: color to display power lower than the `-H` threshold - `-h`: color to display power higher than the `-H` threshold - `-p`: color to display positive power (battery charging) - `-f`: file in `/sys/class/power_supply` with AC info (default: "AC/online") - `--on-icon-pattern`: dynamic string for current battery charge when AC is "on" in `leftipat`. - `--off-icon-pattern`: dynamic string for current battery charge when AC is "off" in `leftipat`. - `--idle-icon-pattern`: dynamic string for current battery charge when AC is "idle" in `leftipat`. - Variables that can be used with the `-t`/`--template` argument: `left`, `leftbar`, `leftvbar`, `leftipat`, `timeleft`, `watts`, `acstatus` - Default template: `Batt: , % / ` - Example (note that you need "--" to separate regular monitor options from Battery's specific ones): Run BatteryP ["BAT0"] ["-t", " (%)", "-L", "10", "-H", "80", "-p", "3", "--", "-O", "On - ", "-i", "", "-L", "-15", "-H", "-5", "-l", "red", "-m", "blue", "-h", "green"] 600 In the above example, the thresholds before the "--" separator affect only the `` and `` fields, while those after the separator affect how `` is displayed. For this monitor, neither the generic nor the specific options have any effect on ``. It is also possible to specify template variables in the `-O` and `-o` switches, as in the following example: Run BatteryP ["BAT0"] ["-t", "" , "-L", "10", "-H", "80" , "-l", "red", "-h", "green" , "--", "-O", "Charging", "-o", "Battery: %" ] 10 - The "idle" AC state is selected whenever the AC power entering the battery is zero. ### `BatteryN Dirs Args RefreshRate Alias` Works like `BatteryP`, but lets you specify an alias for the monitor other than "battery". Useful in case you one separate monitors for more than one battery. ### `TopProc Args RefreshRate` - Aliases to `top` - Args: default monitor arguments. The low and high thresholds (`-L` and `-H`) denote, for memory entries, the percent of the process memory over the total amount of memory currently in use and, for cpu entries, the activity percentage (i.e., the value of `cpuN`, which takes values between 0 and 100). - Variables that can be used with the `-t`/`--template` argument: `no`, `name1`, `cpu1`, `both1`, `mname1`, `mem1`, `mboth1`, `name2`, `cpu2`, `both2`, `mname2`, `mem2`, `mboth2`, ... - Default template: `` - Displays the name and cpu/mem usage of running processes (`bothn` and `mboth` display both, and is useful to specify an overall maximum and/or minimum width, using the `-m`/`-M` arguments. `no` gives the total number of processes. ### `TopMem Args RefreshRate` - Aliases to `topmem` - Args: default monitor arguments. The low and high thresholds (`-L` and `-H`) denote the percent of the process memory over the total amount of memory currently in use. - Variables that can be used with the `-t`/`--template` argument: `name1`, `mem1`, `both1`, `name2`, `mem2`, `both2`, ... - Default template: `` - Displays the name and RSS (resident memory size) of running processes (`bothn` displays both, and is useful to specify an overall maximum and/or minimum width, using the `-m`/`-M` arguments. ### `DiskU Disks Args RefreshRate` - Aliases to `disku` - Disks: list of pairs of the form (device or mount point, template), where the template can contain ``, ``, ``, `` or ``, ``, ``, ``, ``, `` or `` for total, free, used, free percentage and used percentage of the given file system capacity. - Thresholds refer to usage percentage. - Args: default monitor arguments. `-t`/`--template` is ignored. Plus - `--free-icon-pattern`: dynamic string for free disk space in `freeipat`. - `--used-icon-pattern`: dynamic string for used disk space in `usedipat`. - Default template: none (you must specify a template for each file system). - Example: DiskU [("/", "/"), ("sdb1", "")] ["-L", "20", "-H", "50", "-m", "1", "-p", "3"] 20 ### `DiskIO Disks Args RefreshRate` - Aliases to `diskio` - Disks: list of pairs of the form (device or mount point, template), where the template can contain ``, ``, `` for total, read and write speed, respectively. There are also bar versions of each: ``, ``, ``, ``, ``, ``, ``, ``, and ``. - Thresholds refer to speed in b/s - Args: default monitor arguments. `-t`/`--template` is ignored. Plus - `--total-icon-pattern`: dynamic string for total disk I/O in ``. - `--write-icon-pattern`: dynamic string for write disk I/O in ``. - `--read-icon-pattern`: dynamic string for read disk I/O in ``. - Default template: none (you must specify a template for each file system). - Example: DiskIO [("/", " "), ("sdb1", "")] [] 10 ### `ThermalZone Number Args RefreshRate` - Aliases to "thermaln": so `ThermalZone 0 []` can be used in template as `%thermal0%` - Thresholds refer to temperature in degrees - Args: default monitor arguments - Variables that can be used with the `-t`/`--template` argument: `temp` - Default template: `C` - This plugin works only on systems with devices having thermal zone. Check directories in `/sys/class/thermal` for possible values of the zone number (e.g., 0 corresponds to `thermal_zone0` in that directory). - Example: Run ThermalZone 0 ["-t",": C"] 30 #### `Thermal Zone Args RefreshRate` - **This plugin is deprecated. Use `ThermalZone` instead.** - Aliases to the Zone: so `Thermal "THRM" []` can be used in template as `%THRM%` - Args: default monitor arguments - Thresholds refer to temperature in degrees - Variables that can be used with the `-t`/`--template` argument: `temp` - Default template: `Thm: C` - This plugin works only on systems with devices having thermal zone. Check directories in /proc/acpi/thermal_zone for possible values. - Example: Run Thermal "THRM" ["-t","iwl4965-temp: C"] 50 ### `CpuFreq Args RefreshRate` - Aliases to `cpufreq` - Args: default monitor arguments - Thresholds refer to frequency in GHz - Variables that can be used with the `-t`/`--template` argument: `cpu0`, `cpu1`, .., `cpuN` - Default template: `Freq: GHz` - This monitor requires acpi_cpufreq module to be loaded in kernel - Example: Run CpuFreq ["-t", "Freq:|GHz", "-L", "0", "-H", "2", "-l", "lightblue", "-n","white", "-h", "red"] 50 ### `CoreTemp Args RefreshRate` - Aliases to `coretemp` - Args: default monitor arguments - Thresholds refer to temperature in degrees - Variables that can be used with the `-t`/`--template` argument: `core0`, `core1`, .., `coreN` - Default template: `Temp: C` - This monitor requires coretemp module to be loaded in kernel - Example: Run CoreTemp ["-t", "Temp:|C", "-L", "40", "-H", "60", "-l", "lightblue", "-n", "gray90", "-h", "red"] 50 ### `Volume Mixer Element Args RefreshRate` - Aliases to the mixer name and element name separated by a colon. Thus, `Volume "default" "Master" [] 10` can be used as `%default:Master%`. - Args: default monitor arguments. Also accepts: - `-O` _string_ On string - The string used in place of `` when the mixer element is on. Defaults to "[on]". - Long option: `--on` - `-o` _string_ Off string - The string used in place of `` when the mixer element is off. Defaults to "[off]". - Long option: `--off` - `-C` _color_ On color - The color to be used for `` when the mixer element is on. Defaults to "green". - Long option: `--onc` - `-c` _color_ Off color - The color to be used for `` when the mixer element is off. Defaults to "red". - Long option: `--offc` - `--highd` _number_ High threshold for dB. Defaults to -5.0. - `--lowd` _number_ Low threshold for dB. Defaults to -30.0. - `--volume-icon-pattern` _string_ dynamic string for current volume in `volumeipat`. - Variables that can be used with the `-t`/`--template` argument: `volume`, `volumebar`, `volumevbar`, `volumeipat`, `dB`, `status` - Note that `dB` might only return 0 on your system. This is known to happen on systems with a pulseaudio backend. - Default template: `Vol: % ` - Requires the package [alsa-core] and [alsa-mixer] installed in your system. In addition, to activate this plugin you must pass `--flags="with_alsa"` during compilation. ### `MPD Args RefreshRate` - This monitor will only be compiled if you ask for it using the `with_mpd` flag. It needs [libmpd] 5.0 or later (available on Hackage). - Aliases to `mpd` - Args: default monitor arguments. In addition you can provide `-P`, `-S` and `-Z`, with an string argument, to represent the playing, stopped and paused states in the `statei` template field. The environment variables `MPD_HOST` and `MPD_PORT` are used to configure the mpd server to communicate with. Also available: - `lapsed-icon-pattern`: dynamic string for current track position in `ipat`. - Variables that can be used with the `-t`/`--template` argument: `bar`, `vbar`, `ipat`, `state`, `statei`, `volume`, `length`, `lapsed`, `remaining`, `plength` (playlist length), `ppos` (playlist position), `flags` (ncmpcpp-style playback mode), `name`, `artist`, `composer`, `performer`, `album`, `title`, `track`, `file`, `genre` - Default template: `MPD: ` - Example (note that you need "--" to separate regular monitor options from MPD's specific ones): Run MPD ["-t", " (<album>) <track>/<plength> <statei> [<flags>]", "--", "-P", ">>", "-Z", "|", "-S", "><"] 10 ### `Mpris1 PlayerName Args RefreshRate` - Aliases to `mpris1` - Requires [dbus] and [text] packages. To activate, pass `--flags="with_mpris"` during compilation. - PlayerName: player supporting MPRIS v1 protocol, in lowercase. - Args: default monitor arguments. - Variables that can be used with the `-t`/`--template` argument: `album`, `artist`, `arturl`, `length`, `title`, `tracknumber` - Default template: `<artist> - <title>` - Example: Run Mpris1 "clementine" ["-t", "<artist> - [<tracknumber>] <title>"] 10 ### `Mpris2 PlayerName Args RefreshRate` - Aliases to `mpris2` - Requires [dbus] and [text] packages. To activate, pass `--flags="with_mpris"` during compilation. - PlayerName: player supporting MPRIS v2 protocol, in lowercase. - Args: default monitor arguments. - Variables that can be used with the `-t`/`--template` argument: `album`, `artist`, `arturl`, `length`, `title`, `tracknumber`, `composer`, `genre` - Default template: `<artist> - <title>` - Example: Run Mpris2 "spotify" ["-t", "<artist> - [<composer>] <title>"] 10 ### `Mail Args Alias` - Args: list of maildirs in form `[("name1","path1"),...]`. Paths may start with a '~' to expand to the user's home directory. - This plugin requires inotify support in your Linux kernel and the [hinotify] package. To activate, pass `--flags="with_inotify"` during compilation. - Example: Run Mail [("inbox", "~/var/mail/inbox"), ("lists", "~/var/mail/lists")] "mail" ### `MBox Mboxes Opts Alias` - Mboxes a list of mbox files of the form `[("name", "path", "color")]`, where name is the displayed name, path the absolute or relative (to BaseDir) path of the mbox file, and color the color to use to display the mail count (use an empty string for the default). - Opts is a possibly empty list of options, as flags. Possible values: -a --all (no arg) Show all mailboxes, even if empty. -d dir --dir dir a string giving the base directory where mbox files with a relative path live. -p prefix --prefix prefix a string giving a prefix for the list of displayed mail counts -s suffix --suffix suffix a string giving a suffix for the list of displayed mail counts - Paths may start with a '~' to expand to the user's home directory. - This plugin requires inotify support in your Linux kernel and the [hinotify] package. To activate, pass `--flags="with_inotify"` during compilation. - Example. The following command look for mails in `/var/mail/inbox` and `~/foo/mbox`, and will put a space in front of the printed string (when it's not empty); it can be used in the template with the alias `mbox`: Run MBox [("I ", "inbox", "red"), ("O ", "~/foo/mbox", "")] ["-d", "/var/mail/", "-p", " "] "mbox" ### `XPropertyLog PropName` - Aliases to `PropName` - Reads the X property named by `PropName` (a string) and displays its value. The [samples/xmonadpropwrite.hs script] in xmobar's distribution can be used to set the given property from the output of any other program or script. [samples/xmonadpropwrite.hs script]: https://github.com/jaor/xmobar/raw/master/samples/xmonadpropwrite.hs ### `UnsafeXPropertyLog PropName` - Aliases to `PropName` - Same as `XPropertyLog`, but the input is not filtered to avoid injection of actions (cf. `UnsafeXMonadLog`). The program writing the value of the read property is responsible of performing any needed cleanups. ### `NamedXPropertyLog PropName Alias` - Aliases to `Alias` - Same as `XPropertyLog`, but a custom alias can be specified. ### `NamedXPropertyLog PropName Alias` - Aliases to `Alias` - Same as `UnsafeXPropertyLog`, but a custom alias can be specified. ### `Brightness Args RefreshRate` - Aliases to `bright` - Args: default monitor arguments, plus the following specif ones: - `-D`: directory in `/sys/class/backlight/` with files in it (default: "acpi_video0") - `-C`: file with the current brightness (default: actual_brightness) - `-M`: file with the maximum brightness (default: max_brightness) - `--brightness-icon-pattern`: dynamic string for current brightness in `ipat`. - Variables that can be used with the `-t`/`--template` argument: `vbar`, `percent`, `bar`, `ipat` - Default template: `<percent>` - Example: Run Brightness ["-t", "<bar>"] 60 ### `Kbd Opts` - Registers to XKB/X11-Events and output the currently active keyboard layout. Supports replacement of layout names. - Aliases to `kbd` - Opts is a list of tuples: - first element of the tuple is the search string - second element of the tuple is the corresponding replacement - Example: Run Kbd [("us(dvorak)", "DV"), ("us", "US")] ### `Locks` - Displays the status of Caps Lock, Num Lock and Scroll Lock. - Aliases to `locks` - Example: Run Locks ### `CatInt n filename` - Reads and displays an integer from the file whose path is `filename` (especially useful with files in `/sys`). - Aliases as `catn` (e.g. `Cat 0` as `cat0`, etc.) so you can have several. - Example: Run CatInt 0 "/sys/devices/platform/thinkpad_hwmon/fan1_input" [] 50 ## Executing External Commands In order to execute an external command you can either write the command name in the template, in this case it will be executed without arguments, or you can configure it in the "commands" configuration option list with the Com template command: `Com ProgramName Args Alias RefreshRate` - ProgramName: the name of the program - Args: the arguments to be passed to the program at execution time - RefreshRate: number of tenths of second between re-runs of the command. A zero or negative rate means that the command will be executed only once. - Alias: a name to be used in the template. If the alias is en empty string the program name can be used in the template. E.g.: Run Com "uname" ["-s","-r"] "" 0 can be used in the output template as `%uname%` (and xmobar will call _uname_ only once), while Run Com "date" ["+\"%a %b %_d %H:%M\""] "mydate" 600 can be used in the output template as `%mydate%` ## Other Plugins <font size="+1">**`StdinReader`**</font> - Aliases to StdinReader - Displays any text received by xmobar on its standard input. - Strips actions from the text received. This means you can't pass dynamic actions via stdin. This is safer than `UnsafeStdinReader` because there is no need to escape the content before passing it to xmobar's standard input. <font size="+1">**`UnsafeStdinReader`**</font> - Aliases to UnsafeStdinReader - Displays any text received by xmobar on its standard input. - Will not do anything to the text received. This means you can pass dynamic actions via stdin. Be careful to remove tags from dynamic text that you pipe-thru to xmobar's standard input, e.g. window's title. There is no way to escape the tags, i.e. you can't print a literal `<action>` tag as a text on xmobar. - Sample usage: send to xmobar's stdin the list of your workspaces enclosed by actions tags that switches the workspaces to be able to switch workspaces by clicking on xmobar: ```<action=`xdotool key alt+1`>ws1</action> <action=`xdotool key alt+1`>ws2</action>``` <font size="+1">**`Date Format Alias RefreshRate`**</font> - Format is a time format string, as accepted by the standard ISO C `strftime` function (or Haskell's `formatCalendarTime`). - Sample usage: `Run Date "%a %b %_d %Y <fc=#ee9a00>%H:%M:%S</fc>" "date" 10` <font size="+1">**`DateZone Format Locale Zone Alias RefreshRate`**</font> - Format is a time format string, as accepted by the standard ISO C `strftime` function (or Haskell's `formatCalendarTime`). - If Locale is "" the default locale of the system is used, otherwise the given locale. If there are more instances of DateZone, using "" as input for Locale is not recommended. - Zone is the name of the TimeZone. It is assumed that the tz database is stored in /usr/share/zoneinfo/. If "" is given as Zone, the default system time is used. - Sample usage: `Run DateZone "%a %H:%M:%S" "de_DE.UTF-8" "Europe/Vienna" "viennaTime" 10` <font size="+1">**`CommandReader "/path/to/program" Alias`**</font> - Runs the given program, and displays its standard output. <font size="+1">**`PipeReader "default text:/path/to/pipe" Alias`**</font> - Reads its displayed output from the given pipe. - Prefix an optional default text separated by a colon <font size="+1">**`MarqueePipeReader "default text:/path/to/pipe" (length, rate, sep) Alias`**</font> - Generally equivalent to PipeReader - Text is displayed as marquee with the specified length, rate in 10th seconds and separator when it wraps around Run MarqueePipeReader "/tmp/testpipe" (10, 7, "+") "mpipe" <font size="+1"> **`BufferedPipeReader Alias [(Timeout, Bool, "/path/to/pipe1"), ..]`** </font> - Display data from multiple pipes. - Timeout (in tenth of seconds) is the value after which the previous content is restored i.e. if there was already something from a previous pipe it will be put on display again, overwriting the current status. - A pipe with Timeout of 0 will be displayed permanently, just like `PipeReader` - The boolean option indicates whether new data for this pipe should make xmobar appear (unhide, reveal). In this case, the Timeout additionally specifies when the window should be hidden again. The output is restored in any case. - Use it for OSD-like status bars e.g. for setting the volume or brightness: Run BufferedPipeReader "bpr" [ ( 0, False, "/tmp/xmobar_window" ) , ( 15, True, "/tmp/xmobar_status" ) ] Have your window manager send window titles to `"/tmp/xmobar_window"`. They will always be shown and not reveal your xmobar. Sending some status information to `"/tmp/xmobar_status"` will reveal xmonad for 1.5 seconds and temporarily overwrite the window titles. - Take a look at [samples/status.sh] [samples/status.sh]: http://github.com/jaor/xmobar/raw/master/samples/status.sh <font size="+1">**`XMonadLog`**</font> - Aliases to XMonadLog - Displays information from xmonad's `_XMONAD_LOG`. You can set this property by using `xmonadPropLog` as your log hook in xmonad's configuration, as in the following example (more info [here]): main = do spawn "xmobar" xmonad $ defaultConfig { logHook = dynamicLogString defaultPP >>= xmonadPropLog } This plugin can be used as a sometimes more convenient alternative to `StdinReader`. For instance, it allows you to (re)start xmobar outside xmonad. [here]: http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-DynamicLog.html <font size="+1">**`UnsafeXMonadLog`**</font> - Aliases to UnsafeXMonadLog - Similar to StdinReader versus UnsafeStdinReader, this does not strip `<action ...>` tags from XMonad's `_XMONAD_LOG`. - It is advised that you still use `xmobarStrip` for the ppTitle in your logHook: myPP = defaultPP { ppTitle = xmobarStrip } main = xmonad $ defaultConfig { logHook = dynamicLogString myPP >>= xmonadPropLog } # Plugins ## Writing a Plugin Writing a plugin for xmobar should be very simple. You need to create a data type with at least one constructor. Next you must declare this data type an instance of the `Exec` class, by defining the 1 needed method (alternatively `start` or `run`) and 2 optional ones (alias and rate): start :: e -> (String -> IO ()) -> IO () run :: e -> IO String rate :: e -> Int alias :: e -> String `start` must receive a callback to be used to display the `String` produced by the plugin. This method can be used for plugins that need to perform asynchronous actions. See `Plugins/PipeReader.hs` for an example. `run` can be used for simpler plugins. If you define only `run` the plugin will be run every second. To overwrite this default you just need to implement `rate`, which must return the number of tenth of seconds between every successive runs. See `Plugins/HelloWorld.hs` for an example of a plugin that runs just once, and `Plugins/Date.hs` for one that implements `rate`. Notice that Date could be implemented as: instance Exec Date where alias (Date _ a _) = a start (Date f _ r) = date f r date :: String -> Int -> (String -> IO ()) -> IO () date format r callback = do go where go = do t <- toCalendarTime =<< getClockTime callback $ formatCalendarTime defaultTimeLocale format t tenthSeconds r >> go This implementation is equivalent to the one you can read in `Plugins/Date.hs`. `alias` is the name to be used in the output template. Default alias will be the data type constructor. Implementing a plugin requires importing the plugin API (the `Exec` class definition), that is exported by `Plugins.hs`. So you just need to import it in your module with: import Plugins After that your type constructor can be used as an argument for the Runnable type constructor `Run` in the `commands` list of the configuration options. This requires importing your plugin into `Config.hs` and adding your type to the type list in the type signature of `Config.runnableTypes`. For a very basic example see `samples/Plugins/HelloWorld.hs` or the other plugins that are distributed with xmobar. ## Installing/Removing a Plugin Installing a plugin should require 3 steps. Here we are going to install the HelloWorld plugin that comes with xmobar, assuming that you copied it to `src/Plugins`: 1. import the plugin module in `Config.hs`, by adding: import Plugins.HelloWorld 2. add the plugin data type to the list of data types in the type signature of `runnableTypes` in `Config.hs`. For instance, for the HelloWorld plugin, change `runnableTypes` into: runnableTypes :: Command :*: Monitors :*: HelloWorld :*: () runnableTypes = undefined 3. Rebuild and reinstall xmobar. Now test it with: xmobar Plugins/helloworld.config As you may see in the example configuration file, the plugin can be used by adding, in the `commands` list: Run HelloWorld and, in the output template, the alias of the plugin: %helloWorld% That's it. To remove a plugin, just remove its type from the type signature of runnableTypes and remove the imported modules. To remove the system monitor plugin: 1. remove, from `Config.hs`, the line import Plugins.Monitors 2. in `Config.hs` change runnableTypes :: Command :*: Monitors :*: () runnableTypes = undefined to runnableTypes :: Command :*: () runnableTypes = undefined 3. rebuild xmobar. # Authors and credits Andrea Rossato originally designed and implemented xmobar up to version 0.11.1. Since then, it is maintained and developed by [jao], with the help of the greater xmobar and Haskell communities. In particular, xmobar [incorporates patches] by Axel Angel, Ben Boeckel, Duncan Burke, Roman Cheplyaka, Patrick Chilton, Nathaniel Wesley Filardo, John Goerzen, Reto Hablützel, Juraj Hercek, Tomas Janousek, Spencer Janssen, Jochen Keil, Lennart Kolmodin, Krzysztof Kosciuszkiewicz, Dmitry Kurochkin, Todd Lunter, Robert J. Macomber, Dmitry Malikov, David McLean, Marcin Mikołajczyk, Dino Morelli, Tony Morris, Eric Mrak, Thiago Negri, Edward O'Callaghan, Svein Ove, Martin Perner, Jens Petersen, Alexander Polakov, Petr Rockai, Andrew Sackville-West, Markus Scherer, Alexander Shabalin, Peter Simons, Alexander Solovyov, John Soros, Travis Staton, Artem Tarasov, Samuli Thomasson, Edward Tjörnhammar, Sergei Trofimovich, Thomas Tuegel, Jan Vornberger, Anton Vorontsov, Daniel Wagner, Phil Xiaojun Hu, Edward Z. Yang and Norbert Zeh. [jao]: http://jao.io [incorporates patches]: http://www.ohloh.net/p/xmobar/contributors ## Thanks __Andrea Rossato__: Thanks to Robert Manea and Spencer Janssen for their help in understanding how X works. They gave me suggestions on how to solve many problems with xmobar. Thanks to Claus Reinke for make me understand existential types (or at least for letting me think I grasp existential types...;-). __jao__: Thanks to Andrea for creating xmobar in the first place, and for giving me the chance to contribute. # Useful links - [Github page]. - [Mailing list]. - [xmobar's Ohloh page]. - To understand the internal mysteries of xmobar you may try reading [this tutorial] on X Window Programming in Haskell. - My [sawflibs] project includes a module to automate running xmobar in [sawfish]. [xmobar's Ohloh page]: https://www.ohloh.net/p/xmobar [this tutorial]: http://www.haskell.org/haskellwiki/X_window_programming_in_Haskell [sawflibs]: http://github.com/jaor/sawflibs # License This software is released under a BSD-style license. See [LICENSE] for more details. Copyright © 2010-2014 Jose Antonio Ortega Ruiz Copyright © 2007-2010 Andrea Rossato [Github]: http://github.com/jaor/xmobar/ [Github page]: http://github.com/jaor/xmobar [Hackage]: http://hackage.haskell.org/package/xmobar/ [LICENSE]: https://github.com/jaor/xmobar/raw/master/LICENSE [Mailing list]: http://projects.haskell.org/cgi-bin/mailman/listinfo/xmobar [MPD]: http://mpd.wikia.com/ [X11-xft]: http://hackage.haskell.org/package/X11-xft/ [i3status]: http://i3wm.org/i3status/ [i3status manual]: http://i3wm.org/i3status/manpage.html#_using_i3status_with_xmobar [iwlib]: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html [libasound]: http://packages.debian.org/stable/libasound2-dev [hinotify]: http://hackage.haskell.org/package/hinotify/ [libmpd]: http://hackage.haskell.org/package/libmpd/ [dbus]: http://hackage.haskell.org/package/dbus [text]: http://hackage.haskell.org/package/text [sawfish]: http://sawfish.wikia.com/ [utf8-string]: http://hackage.haskell.org/package/utf8-string/ [alsa-core]: http://hackage.haskell.org/package/alsa-core [alsa-mixer]: http://hackage.haskell.org/package/alsa-mixer [timezone-olson]: http://hackage.haskell.org/package/timezone-olson [timezone-series]: http://hackage.haskell.org/package/timezone-series [libXpm]: http://cgit.freedesktop.org/xorg/lib/libXpm ��������������������������������������������xmobar-0.23.1/samples/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0014525�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/samples/Plugins/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0016146�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/samples/Plugins/HelloWorld.hs���������������������������������������������������������0000664�0000000�0000000�00000001252�12513250503�0020555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.HelloWorld -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin example for Xmobar, a text based status bar -- ----------------------------------------------------------------------------- module Plugins.HelloWorld where import Plugins data HelloWorld = HelloWorld deriving (Read, Show) instance Exec HelloWorld where alias HelloWorld = "helloWorld" run HelloWorld = return "<fc=red>Hello World!!</fc>" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/samples/Plugins/helloworld.config�����������������������������������������������������0000664�0000000�0000000�00000000646�12513250503�0021516�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*" , bgColor = "#000000" , fgColor = "#BFBFBF" , position = TopW C 90 , commands = [ Run Cpu [] 10 , Run Weather "LIPB" [] 36000 , Run HelloWorld ] , sepChar = "%" , alignSep = "}{" , template = "%cpu% } %helloWorld% { %LIPB% | <fc=yellow>%date%</fc>" } ������������������������������������������������������������������������������������������xmobar-0.23.1/samples/status.sh���������������������������������������������������������������������0000775�0000000�0000000�00000002226�12513250503�0016411�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash STATUSPIPE="/tmp/xmobar_status_jrk" function isMuted () { # retrieve mute status # return an arbitrary string for true or nothing at all echo } function getPercent () { # somehow retrieve the percent value as plain int (e.g. "66") echo "66" } function percentBar () { local i=1 res= normal=47 high=80 fgColor='#657b83' mutedColor='#cb4b16' lowColor='#859900' midColor='#b58900' highColor='#cb4b16' bar="$(echo -ne "\u2588")" percent="$( getPercent )" muted="$( isMuted )" if [ -n "$muted" ]; then res="<fc=$mutedColor>" else res="<fc=$lowColor>" fi while [ $i -lt $percent ]; do if [ $i -eq $normal -a -z "$muted" ]; then res+="</fc><fc=$midColor>" elif [ $i -eq $high -a -z "$muted" ]; then res+="</fc><fc=$highColor>" fi res+=$bar i=$((i+1)) done res+="</fc><fc=$fgColor>" while [ $i -lt 100 ]; do res+='-' i=$((i+1)) done echo "$res</fc>" } echo "$( percentBar )" > "$STATUSPIPE" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/samples/xmobar.config�����������������������������������������������������������������0000664�0000000�0000000�00000003150�12513250503�0017203�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*" , addtionalFonts = [] , borderColor = "black" , border = TopB , bgColor = "black" , fgColor = "grey" , alpha = 255 , position = Top , textOffset = -1 , iconOffset = -1 , lowerOnStart = True , pickBroadest = False , persistent = False , hideOnStart = False , iconRoot = "." , allDesktops = True , overrideRedirect = True , commands = [ Run Weather "EGPF" ["-t","<station>: <tempC>C", "-L","18","-H","25", "--normal","green", "--high","red", "--low","lightblue"] 36000 , Run Network "eth0" ["-L","0","-H","32", "--normal","green","--high","red"] 10 , Run Network "eth1" ["-L","0","-H","32", "--normal","green","--high","red"] 10 , Run Cpu ["-L","3","-H","50", "--normal","green","--high","red"] 10 , Run Memory ["-t","Mem: <usedratio>%"] 10 , Run Swap [] 10 , Run Com "uname" ["-s","-r"] "" 36000 , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10 ] , sepChar = "%" , alignSep = "}{" , template = "%cpu% | %memory% * %swap% | %eth0% - %eth1% }\ \{ <fc=#ee9a00>%date%</fc>| %EGPF% | %uname%" } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/samples/xmonadpropwrite.hs������������������������������������������������������������0000664�0000000�0000000�00000002146�12513250503�0020326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Copyright Spencer Janssen <spencerjanssen@gmail.com> -- Tomas Janousek <tomi@nomi.cz> -- BSD3 (see LICENSE) -- -- Reads from standard input and writes to an X propery on root window. -- To be used with XPropertyLog: -- Add it to commands: -- Run XPropertyLog "_XMONAD_LOG_CUSTOM" -- Add it to the template: -- template = "... %_XMONAD_LOG_CUSTOM% ..." -- Run: -- $ blah blah | xmonadpropwrite _XMONAD_LOG_CUSTOM import Control.Monad import Graphics.X11 import Graphics.X11.Xlib.Extras import qualified Data.ByteString as B import Foreign.C (CChar) import System.IO import System.Environment main = do atom <- flip fmap getArgs $ \args -> case args of [a] -> a _ -> "_XMONAD_LOG" d <- openDisplay "" xlog <- internAtom d atom False ustring <- internAtom d "UTF8_STRING" False root <- rootWindow d (defaultScreen d) forever $ do msg <- B.getLine changeProperty8 d root xlog ustring propModeReplace (encodeCChar msg) sync d True return () encodeCChar :: B.ByteString -> [CChar] encodeCChar = map fromIntegral . B.unpack ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0013650�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Actions.hs������������������������������������������������������������������������0000664�0000000�0000000�00000002065�12513250503�0015607�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Xmobar.Actions -- Copyright : (c) Alexander Polakov -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- ----------------------------------------------------------------------------- module Actions (Action(..), runAction, stripActions) where import System.Process (system) import Control.Monad (void) import Text.Regex (Regex, subRegex, mkRegex, matchRegex) import Graphics.X11.Types (Button) data Action = Spawn [Button] String deriving (Eq) runAction :: Action -> IO () runAction (Spawn _ s) = void $ system (s ++ "&") stripActions :: String -> String stripActions s = case matchRegex actionRegex s of Nothing -> s Just _ -> stripActions strippedOneLevel where strippedOneLevel = subRegex actionRegex s "[action=\\1\\2]\\3[/action]" actionRegex :: Regex actionRegex = mkRegex "<action=`?([^>`]*)`?( +button=[12345]+)?>(.+)</action>" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Bitmap.hs�������������������������������������������������������������������������0000664�0000000�0000000�00000007712�12513250503�0015427�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP, FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Bitmap -- Copyright : (C) 2013, 2015 Alexander Polakov -- License : BSD3 -- -- Maintainer : jao@gnu.org -- Stability : unstable -- Portability : unportable -- ----------------------------------------------------------------------------- module Bitmap ( updateCache , drawBitmap , Bitmap(..)) where import Control.Monad import Control.Monad.Trans(MonadIO(..)) import Data.Map hiding (foldr, map, filter) import Graphics.X11.Xlib import System.Directory (doesFileExist) import System.FilePath ((</>)) import System.Mem.Weak ( addFinalizer ) import ColorCache import Parsers (Widget(..)) import Actions (Action) #ifdef XPM import XPMFile(readXPMFile) import Control.Applicative((<|>)) #endif #if MIN_VERSION_mtl(2, 2, 1) import Control.Monad.Except(MonadError(..), runExceptT) #else import Control.Monad.Error(MonadError(..)) import Control.Monad.Trans.Error(ErrorT, runErrorT) runExceptT :: ErrorT e m a -> m (Either e a) runExceptT = runErrorT #endif data BitmapType = Mono Pixel | Poly data Bitmap = Bitmap { width :: Dimension , height :: Dimension , pixmap :: Pixmap , shapePixmap :: Maybe Pixmap , bitmapType :: BitmapType } updateCache :: Display -> Window -> Map FilePath Bitmap -> FilePath -> [[(Widget, String, Int, Maybe [Action])]] -> IO (Map FilePath Bitmap) updateCache dpy win cache iconRoot ps = do let paths = map (\(Icon p, _, _, _) -> p) . concatMap (filter icons) $ ps icons (Icon _, _, _, _) = True icons _ = False expandPath path@('/':_) = path expandPath path@('.':'/':_) = path expandPath path@('.':'.':'/':_) = path expandPath path = iconRoot </> path go m path = if member path m then return m else do bitmap <- loadBitmap dpy win $ expandPath path return $ maybe m (\b -> insert path b m) bitmap foldM go cache paths readBitmapFile' :: (MonadError String m, MonadIO m) => Display -> Drawable -> String -> m (Dimension, Dimension, Pixmap) readBitmapFile' d w p = do res <- liftIO $ readBitmapFile d w p case res of Left err -> throwError err Right (bw, bh, bp, _, _) -> return (bw, bh, bp) loadBitmap :: Display -> Drawable -> FilePath -> IO (Maybe Bitmap) loadBitmap d w p = do exist <- doesFileExist p if exist then do res <- runExceptT $ tryXBM #ifdef XPM <|> tryXPM #endif case res of Right b -> return $ Just b Left err -> do putStrLn err return Nothing else return Nothing where tryXBM = do (bw, bh, bp) <- readBitmapFile' d w p liftIO $ addFinalizer bp (freePixmap d bp) return $ Bitmap bw bh bp Nothing (Mono 1) #ifdef XPM tryXPM = do (bw, bh, bp, mbpm) <- readXPMFile d w p liftIO $ addFinalizer bp (freePixmap d bp) case mbpm of Nothing -> return () Just bpm -> liftIO $ addFinalizer bpm (freePixmap d bpm) return $ Bitmap bw bh bp mbpm Poly #endif drawBitmap :: Display -> Drawable -> GC -> String -> String -> Position -> Position -> Bitmap -> IO () drawBitmap d p gc fc bc x y i = withColors d [fc, bc] $ \[fc', bc'] -> do let w = width i h = height i y' = 1 + y - fromIntegral h `div` 2 setForeground d gc fc' setBackground d gc bc' case (shapePixmap i) of Nothing -> return () Just mask -> setClipOrigin d gc x y' >> setClipMask d gc mask case bitmapType i of Poly -> copyArea d (pixmap i) p gc 0 0 w h x y' Mono pl -> copyPlane d (pixmap i) p gc 0 0 w h x y' pl setClipMask d gc 0 ������������������������������������������������������xmobar-0.23.1/src/ColorCache.hs���������������������������������������������������������������������0000664�0000000�0000000�00000006674�12513250503�0016223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ------------------------------------------------------------------------------ -- | -- Module: ColorCache -- Copyright: (c) 2012 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: jao@gnu.org -- Stability: unstable -- Portability: unportable -- Created: Mon Sep 10, 2012 00:27 -- -- -- Caching X colors -- ------------------------------------------------------------------------------ #if defined XFT module ColorCache(withColors, withDrawingColors) where import MinXft #else module ColorCache(withColors) where #endif import Data.IORef import System.IO.Unsafe (unsafePerformIO) import Control.Monad.Trans (MonadIO, liftIO) import Control.Exception (SomeException, handle) import Graphics.X11.Xlib data DynPixel = DynPixel Bool Pixel initColor :: Display -> String -> IO DynPixel initColor dpy c = handle black $ initColor' dpy c where black :: SomeException -> IO DynPixel black = const . return $ DynPixel False (blackPixel dpy $ defaultScreen dpy) type ColorCache = [(String, Color)] {-# NOINLINE colorCache #-} colorCache :: IORef ColorCache colorCache = unsafePerformIO $ newIORef [] getCachedColor :: String -> IO (Maybe Color) getCachedColor color_name = lookup color_name `fmap` readIORef colorCache putCachedColor :: String -> Color -> IO () putCachedColor name c_id = modifyIORef colorCache $ \c -> (name, c_id) : c initColor' :: Display -> String -> IO DynPixel initColor' dpy c = do let colormap = defaultColormap dpy (defaultScreen dpy) cached_color <- getCachedColor c c' <- case cached_color of Just col -> return col _ -> do (c'', _) <- allocNamedColor dpy colormap c putCachedColor c c'' return c'' return $ DynPixel True (color_pixel c') withColors :: MonadIO m => Display -> [String] -> ([Pixel] -> m a) -> m a withColors d cs f = do ps <- mapM (liftIO . initColor d) cs f $ map (\(DynPixel _ pixel) -> pixel) ps #ifdef XFT type AXftColorCache = [(String, AXftColor)] {-# NOINLINE xftColorCache #-} xftColorCache :: IORef AXftColorCache xftColorCache = unsafePerformIO $ newIORef [] getXftCachedColor :: String -> IO (Maybe AXftColor) getXftCachedColor name = lookup name `fmap` readIORef xftColorCache putXftCachedColor :: String -> AXftColor -> IO () putXftCachedColor name cptr = modifyIORef xftColorCache $ \c -> (name, cptr) : c initAXftColor' :: Display -> Visual -> Colormap -> String -> IO AXftColor initAXftColor' d v cm c = do cc <- getXftCachedColor c c' <- case cc of Just col -> return col _ -> do c'' <- mallocAXftColor d v cm c putXftCachedColor c c'' return c'' return c' initAXftColor :: Display -> Visual -> Colormap -> String -> IO AXftColor initAXftColor d v cm c = handle black $ (initAXftColor' d v cm c) where black :: SomeException -> IO AXftColor black = (const $ initAXftColor' d v cm "black") withDrawingColors :: -- MonadIO m => Display -> Drawable -> String -> String -> (AXftDraw -> AXftColor -> AXftColor -> IO ()) -> IO () withDrawingColors dpy drw fc bc f = do let screen = defaultScreenOfDisplay dpy colormap = defaultColormapOfScreen screen visual = defaultVisualOfScreen screen fc' <- initAXftColor dpy visual colormap fc bc' <- initAXftColor dpy visual colormap bc withAXftDraw dpy drw visual colormap $ \draw -> f draw fc' bc' #endif ��������������������������������������������������������������������xmobar-0.23.1/src/Commands.hs�����������������������������������������������������������������������0000664�0000000�0000000�00000005465�12513250503�0015757�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Xmobar.Commands -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- The 'Exec' class and the 'Command' data type. -- -- The 'Exec' class rappresents the executable types, whose constructors may -- appear in the 'Config.commands' field of the 'Config.Config' data type. -- -- The 'Command' data type is for OS commands to be run by xmobar -- ----------------------------------------------------------------------------- module Commands ( Command (..) , Exec (..) , tenthSeconds ) where import Prelude import Control.Concurrent import Control.Exception (handle, SomeException(..)) import Data.Char import System.Process import System.Exit import System.IO (hClose) import Signal import XUtil class Show e => Exec e where alias :: e -> String alias e = takeWhile (not . isSpace) $ show e rate :: e -> Int rate _ = 10 run :: e -> IO String run _ = return "" start :: e -> (String -> IO ()) -> IO () start e cb = go where go = run e >>= cb >> tenthSeconds (rate e) >> go trigger :: e -> (Maybe SignalType -> IO ()) -> IO () trigger _ sh = sh Nothing data Command = Com Program Args Alias Rate deriving (Show,Read,Eq) type Args = [String] type Program = String type Alias = String type Rate = Int instance Exec Command where alias (Com p _ a _) | p /= "" = if a == "" then p else a | otherwise = "" start (Com prog args _ r) cb = if r > 0 then go else exec where go = exec >> tenthSeconds r >> go exec = do (i,o,e,p) <- runInteractiveProcess prog args Nothing Nothing exit <- waitForProcess p let closeHandles = hClose o >> hClose i >> hClose e getL = handle (\(SomeException _) -> return "") (hGetLineSafe o) case exit of ExitSuccess -> do str <- getL closeHandles cb str _ -> do closeHandles cb $ "Could not execute command " ++ prog -- | Work around to the Int max bound: since threadDelay takes an Int, it -- is not possible to set a thread delay grater than about 45 minutes. -- With a little recursion we solve the problem. tenthSeconds :: Int -> IO () tenthSeconds s | s >= x = do threadDelay (x * 100000) tenthSeconds (s - x) | otherwise = threadDelay (s * 100000) where x = (maxBound :: Int) `div` 100000 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Config.hs�������������������������������������������������������������������������0000664�0000000�0000000�00000013333�12513250503�0015414�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE TypeOperators #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar.Config -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- The configuration module of Xmobar, a text based status bar -- ----------------------------------------------------------------------------- module Config ( -- * Configuration -- $config Config (..) , XPosition (..), Align (..), Border(..) , defaultConfig , runnableTypes ) where import Commands import {-# SOURCE #-} Runnable import Plugins.Monitors import Plugins.Date import Plugins.PipeReader import Plugins.BufferedPipeReader import Plugins.MarqueePipeReader import Plugins.CommandReader import Plugins.StdinReader import Plugins.XMonadLog import Plugins.EWMH import Plugins.Kbd import Plugins.Locks import Plugins.Mail import Plugins.MBox import Plugins.DateZone -- $config -- Configuration data type and default configuration -- | The configuration data type data Config = Config { font :: String -- ^ Font , additionalFonts :: [String] -- ^ List of alternative fonts , bgColor :: String -- ^ Backgroud color , fgColor :: String -- ^ Default font color , position :: XPosition -- ^ Top Bottom or Static , textOffset :: Int -- ^ Offset from top of window for text , iconOffset :: Int -- ^ Offset from top of window for icons , border :: Border -- ^ NoBorder TopB BottomB or FullB , borderColor :: String -- ^ Border color , borderWidth :: Int -- ^ Border width , alpha :: Int -- ^ Transparency from 0 (transparent) to 255 (opaque) , hideOnStart :: Bool -- ^ Hide (Unmap) the window on -- initialization , allDesktops :: Bool -- ^ Tell the WM to map to all desktops , overrideRedirect :: Bool -- ^ Needed for dock behaviour in some -- non-tiling WMs , pickBroadest :: Bool -- ^ Use the broadest display -- instead of the first one by -- default , lowerOnStart :: Bool -- ^ lower to the bottom of the -- window stack on initialization , persistent :: Bool -- ^ Whether automatic hiding should -- be enabled or disabled , iconRoot :: FilePath -- ^ Root folder for icons , commands :: [Runnable] -- ^ For setting the command, -- the command arguments -- and refresh rate for the programs -- to run (optional) , sepChar :: String -- ^ The character to be used for indicating -- commands in the output template -- (default '%') , alignSep :: String -- ^ Separators for left, center and -- right text alignment , template :: String -- ^ The output template } deriving (Read) data XPosition = Top | TopW Align Int | TopSize Align Int Int | TopP Int Int | Bottom | BottomP Int Int | BottomW Align Int | BottomSize Align Int Int | Static {xpos, ypos, width, height :: Int} | OnScreen Int XPosition deriving ( Read, Eq ) data Align = L | R | C deriving ( Read, Eq ) data Border = NoBorder | TopB | BottomB | FullB | TopBM Int | BottomBM Int | FullBM Int deriving ( Read, Eq ) -- | The default configuration values defaultConfig :: Config defaultConfig = Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*" , additionalFonts = [] , bgColor = "#000000" , fgColor = "#BFBFBF" , alpha = 255 , position = Top , border = NoBorder , borderColor = "#BFBFBF" , borderWidth = 1 , textOffset = -1 , iconOffset = -1 , hideOnStart = False , lowerOnStart = True , persistent = False , allDesktops = True , overrideRedirect = True , pickBroadest = False , iconRoot = "." , commands = [ Run $ Date "%a %b %_d %Y * %H:%M:%S" "theDate" 10 , Run StdinReader] , sepChar = "%" , alignSep = "}{" , template = "%StdinReader% }{ " ++ "<fc=#00FF00>%uname%</fc> * <fc=#FF0000>%theDate%</fc>" } -- | An alias for tuple types that is more convenient for long lists. type a :*: b = (a, b) infixr :*: -- | This is the list of types that can be hidden inside -- 'Runnable.Runnable', the existential type that stores all commands -- to be executed by Xmobar. It is used by 'Runnable.readRunnable' in -- the 'Runnable.Runnable' Read instance. To install a plugin just add -- the plugin's type to the list of types (separated by ':*:') appearing in -- this function's type signature. runnableTypes :: Command :*: Monitors :*: Date :*: PipeReader :*: BufferedPipeReader :*: CommandReader :*: StdinReader :*: XMonadLog :*: EWMH :*: Kbd :*: Locks :*: Mail :*: MBox :*: DateZone :*: MarqueePipeReader :*: () runnableTypes = undefined �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/IPC/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0014263�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/IPC/DBus.hs�����������������������������������������������������������������������0000664�0000000�0000000�00000003531�12513250503�0015456�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : DBus -- Copyright : (c) Jochen Keil -- License : BSD-style (see LICENSE) -- -- Maintainer : Jochen Keil <jochen dot keil at gmail dot com> -- Stability : unstable -- Portability : unportable -- -- DBus IPC module for Xmobar -- ----------------------------------------------------------------------------- module IPC.DBus (runIPC) where import DBus import DBus.Client import Control.Monad (when) import Control.Concurrent.STM import Control.Exception (handle) import System.IO (stderr, hPutStrLn) import Signal busName :: BusName busName = busName_ "org.Xmobar.Control" objectPath :: ObjectPath objectPath = objectPath_ "/org/Xmobar/Control" interfaceName :: InterfaceName interfaceName = interfaceName_ "org.Xmobar.Control" runIPC :: TMVar SignalType -> IO () runIPC mvst = handle printException exportConnection where printException :: ClientError -> IO () printException = hPutStrLn stderr . clientErrorMessage exportConnection = do client <- connectSession requestName client busName [ nameDoNotQueue ] export client objectPath [ sendSignalMethod mvst ] sendSignalMethod :: TMVar SignalType -> Method sendSignalMethod mvst = method interfaceName sendSignalName (signature_ [variantType $ toVariant (undefined :: SignalType)]) (signature_ []) sendSignalMethodCall where sendSignalName :: MemberName sendSignalName = memberName_ "SendSignal" sendSignalMethodCall :: MethodCall -> IO Reply sendSignalMethodCall mc = do when ( methodCallMember mc == sendSignalName ) $ mapM_ (sendSignal . fromVariant) (methodCallBody mc) return ( replyReturn [] ) sendSignal :: Maybe SignalType -> IO () sendSignal = maybe (return ()) (atomically . putTMVar mvst) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/IWlib.hsc�������������������������������������������������������������������������0000664�0000000�0000000�00000005131�12513250503�0015355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : IWlib -- Copyright : (c) Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A partial binding to iwlib -- ----------------------------------------------------------------------------- {-# LANGUAGE CPP, ForeignFunctionInterface, EmptyDataDecls #-} module IWlib (WirelessInfo(..), getWirelessInfo) where import Foreign import Foreign.C.Types import Foreign.C.String data WirelessInfo = WirelessInfo { wiEssid :: String, wiQuality :: Int } deriving Show #include <iwlib.h> data WCfg data WStats data WRange foreign import ccall "iwlib.h iw_sockets_open" c_iw_open :: IO CInt foreign import ccall "unistd.h close" c_iw_close :: CInt -> IO () foreign import ccall "iwlib.h iw_get_basic_config" c_iw_basic_config :: CInt -> CString -> Ptr WCfg -> IO CInt foreign import ccall "iwlib.h iw_get_stats" c_iw_stats :: CInt -> CString -> Ptr WStats -> Ptr WRange -> CInt -> IO CInt foreign import ccall "iwlib.h iw_get_range_info" c_iw_range :: CInt -> CString -> Ptr WRange -> IO CInt getWirelessInfo :: String -> IO WirelessInfo getWirelessInfo iface = allocaBytes (#size struct wireless_config) $ \wc -> allocaBytes (#size struct iw_statistics) $ \stats -> allocaBytes (#size struct iw_range) $ \rng -> withCString iface $ \istr -> do i <- c_iw_open bcr <- c_iw_basic_config i istr wc str <- c_iw_stats i istr stats rng 1 rgr <- c_iw_range i istr rng c_iw_close i if (bcr < 0) then return WirelessInfo { wiEssid = "", wiQuality = 0 } else do hase <- (#peek struct wireless_config, has_essid) wc :: IO CInt eon <- (#peek struct wireless_config, essid_on) wc :: IO CInt essid <- if hase /= 0 && eon /= 0 then do let e = (#ptr struct wireless_config, essid) wc peekCString e else return "" q <- if str >= 0 && rgr >=0 then do qualv <- xqual $ (#ptr struct iw_statistics, qual) stats mv <- xqual $ (#ptr struct iw_range, max_qual) rng let mxv = if mv /= 0 then fromIntegral mv else 1 return $ fromIntegral qualv / mxv else return 0 let qv = round (100 * (q :: Double)) return $ WirelessInfo { wiEssid = essid, wiQuality = min 100 qv } where xqual p = let qp = (#ptr struct iw_param, value) p in (#peek struct iw_quality, qual) qp :: IO CChar ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Localize.hsc����������������������������������������������������������������������0000664�0000000�0000000�00000004672�12513250503�0016122�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE ForeignFunctionInterface #-} ----------------------------------------------------------------------------- -- | -- Module : Localize -- Copyright : (C) 2011 Martin Perner -- License : BSD-style (see LICENSE) -- -- Maintainer : Martin Perner <martin@perner.cc> -- Stability : unstable -- Portability : unportable -- -- This module provides an interface to locale information e.g. for DateL -- ----------------------------------------------------------------------------- module Localize ( setupTimeLocale, getTimeLocale ) where import Foreign.C #if ! MIN_VERSION_time(1,5,0) import qualified System.Locale as L #else import qualified Data.Time.Format as L #endif #ifdef UTF8 import Codec.Binary.UTF8.String #endif -- get localized strings type NlItem = CInt #include <langinfo.h> foreign import ccall unsafe "langinfo.h nl_langinfo" nl_langinfo :: NlItem -> IO CString #{enum NlItem, , AM_STR , PM_STR \ , D_T_FMT , D_FMT , T_FMT , T_FMT_AMPM \ , ABDAY_1, ABDAY_7 \ , DAY_1, DAY_7 \ , ABMON_1, ABMON_12 \ , MON_1, MON_12\ } getLangInfo :: NlItem -> IO String getLangInfo item = do itemStr <- nl_langinfo item #ifdef UTF8 str <- peekCString itemStr return $ if (isUTF8Encoded str) then decodeString str else str #else peekCString itemStr #endif #include <locale.h> foreign import ccall unsafe "locale.h setlocale" setlocale :: CInt -> CString -> IO CString setupTimeLocale :: String -> IO () setupTimeLocale l = withCString l (setlocale #const LC_TIME) >> return () getTimeLocale :: IO L.TimeLocale getTimeLocale = do -- assumes that the defined values are increasing by exactly one. -- as they are defined consecutive in an enum this is reasonable days <- mapM getLangInfo [day1 .. day7] abdays <- mapM getLangInfo [abday1 .. abday7] mons <- mapM getLangInfo [mon1 .. mon12] abmons <- mapM getLangInfo [abmon1 .. abmon12] amstr <- getLangInfo amStr pmstr <- getLangInfo pmStr dtfmt <- getLangInfo dTFmt dfmt <- getLangInfo dFmt tfmt <- getLangInfo tFmt tfmta <- getLangInfo tFmtAmpm let t = L.defaultTimeLocale {L.wDays = zip days abdays ,L.months = zip mons abmons ,L.amPm = (amstr, pmstr) ,L.dateTimeFmt = dtfmt ,L.dateFmt = dfmt ,L.timeFmt = tfmt ,L.time12Fmt = tfmta} return t ����������������������������������������������������������������������xmobar-0.23.1/src/Main.hs���������������������������������������������������������������������������0000664�0000000�0000000�00000017657�12513250503�0015110�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar.Main -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- The main module of Xmobar, a text based status bar -- ----------------------------------------------------------------------------- module Main ( -- * Main Stuff -- $main main , readConfig , readDefaultConfig ) where import Xmobar import Parsers import Config import XUtil import Data.List (intercalate) import qualified Data.Map as Map import Paths_xmobar (version) import Data.Version (showVersion) import Graphics.X11.Xlib import System.Console.GetOpt import System.Directory (getHomeDirectory) import System.Exit import System.Environment import System.FilePath ((</>)) import System.Posix.Files import Control.Monad (unless, liftM) import Signal (setupSignalHandler) -- $main -- | The main entry point main :: IO () main = do initThreads d <- openDisplay "" args <- getArgs (o,file) <- getOpts args (c,defaultings) <- case file of [cfgfile] -> readConfig cfgfile _ -> readDefaultConfig unless (null defaultings) $ putStrLn $ "Fields missing from config defaulted: " ++ intercalate "," defaultings conf <- doOpts c o fs <- initFont d (font conf) fl <- mapM (initFont d) (additionalFonts conf) cls <- mapM (parseTemplate conf) (splitTemplate conf) sig <- setupSignalHandler vars <- mapM (mapM $ startCommand sig) cls (r,w) <- createWin d fs conf let ic = Map.empty startLoop (XConf d r w (fs:fl) ic conf) sig vars -- | Splits the template in its parts splitTemplate :: Config -> [String] splitTemplate conf = case break (==l) t of (le,_:re) -> case break (==r) re of (ce,_:ri) -> [le, ce, ri] _ -> def _ -> def where [l, r] = alignSep (if length (alignSep conf) == 2 then conf else defaultConfig) t = template conf def = [t, "", ""] -- | Reads the configuration files or quits with an error readConfig :: FilePath -> IO (Config,[String]) readConfig f = do file <- io $ fileExist f s <- io $ if file then readFileSafe f else error $ f ++ ": file not found!\n" ++ usage either (\err -> error $ f ++ ": configuration file contains errors at:\n" ++ show err) return $ parseConfig s xdgConfigDir :: IO String xdgConfigDir = do env <- getEnvironment case lookup "XDG_CONFIG_HOME" env of Just val -> return val Nothing -> liftM (</> ".config") getHomeDirectory xmobarConfigDir :: IO FilePath xmobarConfigDir = liftM (</> "xmobar") xdgConfigDir getXdgConfigFile :: IO FilePath getXdgConfigFile = liftM (</> "xmobarrc") xmobarConfigDir -- | Read default configuration file or load the default config readDefaultConfig :: IO (Config,[String]) readDefaultConfig = do xdgConfigFile <- getXdgConfigFile xdgConfigFileExists <- io $ fileExist xdgConfigFile home <- io $ getEnv "HOME" let defaultConfigFile = home ++ "/.xmobarrc" defaultConfigFileExists <- io $ fileExist defaultConfigFile if xdgConfigFileExists then readConfig xdgConfigFile else if defaultConfigFileExists then readConfig defaultConfigFile else return (defaultConfig,[]) data Opts = Help | Version | Font String | BgColor String | FgColor String | Alpha String | T | B | D | AlignSep String | Commands String | AddCommand String | SepChar String | Template String | OnScr String | IconRoot String deriving Show options :: [OptDescr Opts] options = [ Option "h?" ["help"] (NoArg Help) "This help" , Option "V" ["version"] (NoArg Version) "Show version information" , Option "f" ["font"] (ReqArg Font "font name") "The font name" , Option "B" ["bgcolor"] (ReqArg BgColor "bg color" ) "The background color. Default black" , Option "F" ["fgcolor"] (ReqArg FgColor "fg color") "The foreground color. Default grey" , Option "i" ["iconroot"] (ReqArg IconRoot "path") "Root directory for icon pattern paths. Default '.'" , Option "A" ["alpha"] (ReqArg Alpha "alpha") "The transparency: 0 is transparent, 255 is opaque. Default: 255" , Option "o" ["top"] (NoArg T) "Place xmobar at the top of the screen" , Option "b" ["bottom"] (NoArg B) "Place xmobar at the bottom of the screen" , Option "d" ["dock"] (NoArg D) "Don't override redirect from WM and function as a dock" , Option "a" ["alignsep"] (ReqArg AlignSep "alignsep") "Separators for left, center and right text\nalignment. Default: '}{'" , Option "s" ["sepchar"] (ReqArg SepChar "char") ("The character used to separate commands in" ++ "\nthe output template. Default '%'") , Option "t" ["template"] (ReqArg Template "template") "The output template" , Option "c" ["commands"] (ReqArg Commands "commands") "The list of commands to be executed" , Option "C" ["add-command"] (ReqArg AddCommand "command") "Add to the list of commands to be executed" , Option "x" ["screen"] (ReqArg OnScr "screen") "On which X screen number to start" ] getOpts :: [String] -> IO ([Opts], [String]) getOpts argv = case getOpt Permute options argv of (o,n,[]) -> return (o,n) (_,_,errs) -> error (concat errs ++ usage) usage :: String usage = usageInfo header options ++ footer where header = "Usage: xmobar [OPTION...] [FILE]\nOptions:" footer = "\nMail bug reports and suggestions to " ++ mail ++ "\n" info :: String info = "xmobar " ++ showVersion version ++ "\n (C) 2007 - 2010 Andrea Rossato " ++ "\n (C) 2010 - 2014 Jose A Ortega Ruiz\n " ++ mail ++ "\n" ++ license mail :: String mail = "<xmobar@projects.haskell.org>" license :: String license = "\nThis program is distributed in the hope that it will be useful," ++ "\nbut WITHOUT ANY WARRANTY; without even the implied warranty of" ++ "\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++ "\nSee the License for more details." doOpts :: Config -> [Opts] -> IO Config doOpts conf [] = return (conf {lowerOnStart = lowerOnStart conf && overrideRedirect conf}) doOpts conf (o:oo) = case o of Help -> putStr usage >> exitSuccess Version -> putStrLn info >> exitSuccess Font s -> doOpts' (conf {font = s}) BgColor s -> doOpts' (conf {bgColor = s}) FgColor s -> doOpts' (conf {fgColor = s}) Alpha n -> doOpts' (conf {alpha = read n}) T -> doOpts' (conf {position = Top}) B -> doOpts' (conf {position = Bottom}) D -> doOpts' (conf {overrideRedirect = False}) AlignSep s -> doOpts' (conf {alignSep = s}) SepChar s -> doOpts' (conf {sepChar = s}) Template s -> doOpts' (conf {template = s}) IconRoot s -> doOpts' (conf {iconRoot = s}) OnScr n -> doOpts' (conf {position = OnScreen (read n) $ position conf}) Commands s -> case readCom 'c' s of Right x -> doOpts' (conf {commands = x}) Left e -> putStr (e ++ usage) >> exitWith (ExitFailure 1) AddCommand s -> case readCom 'C' s of Right x -> doOpts' (conf {commands = commands conf ++ x}) Left e -> putStr (e ++ usage) >> exitWith (ExitFailure 1) where readCom c str = case readStr str of [x] -> Right x _ -> Left ("xmobar: cannot read list of commands " ++ "specified with the -" ++ c:" option\n") readStr str = [x | (x,t) <- reads str, ("","") <- lex t] doOpts' opts = doOpts opts oo ���������������������������������������������������������������������������������xmobar-0.23.1/src/MinXft.hsc������������������������������������������������������������������������0000664�0000000�0000000�00000027331�12513250503�0015562�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������------------------------------------------------------------------------------ -- | -- Module: MinXft -- Copyright: (c) 2012, 2014, 2015 Jose Antonio Ortega Ruiz -- (c) Clemens Fruhwirth <clemens@endorphin.org> 2007 -- License: BSD3-style (see LICENSE) -- -- Maintainer: jao@gnu.org -- Stability: unstable -- Portability: unportable -- Created: Mon Sep 10, 2012 18:12 -- -- -- Pared down Xft library, based on Graphics.X11.Xft and providing -- explicit management of XftColors, so that they can be cached. -- -- Most of the code is lifted from Clemens's. -- ------------------------------------------------------------------------------ {-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-} module MinXft ( AXftColor , AXftDraw (..) , AXftFont , mallocAXftColor , freeAXftColor , withAXftDraw , drawXftString , drawXftString' , drawBackground , drawXftRect , openAXftFont , closeAXftFont , xftTxtExtents , xftTxtExtents' , xft_ascent , xft_ascent' , xft_descent , xft_descent' , xft_height , xft_height' ) where import Graphics.X11 import Graphics.X11.Xlib.Types import Graphics.X11.Xrender import Graphics.X11.Xlib.Extras (xGetWindowProperty, xFree) import Foreign import Foreign.C.Types import Foreign.C.String import Codec.Binary.UTF8.String as UTF8 import Data.Char (ord) import Control.Monad (when) #include <X11/Xft/Xft.h> -- Color Handling newtype AXftColor = AXftColor (Ptr AXftColor) foreign import ccall "XftColorAllocName" cXftColorAllocName :: Display -> Visual -> Colormap -> CString -> AXftColor -> IO (#type Bool) -- this is the missing bit in X11.Xft, not implementable from the -- outside because XftColor does not export a constructor. mallocAXftColor :: Display -> Visual -> Colormap -> String -> IO AXftColor mallocAXftColor d v cm n = do color <- mallocBytes (#size XftColor) withCAString n $ \str -> cXftColorAllocName d v cm str (AXftColor color) return (AXftColor color) foreign import ccall "XftColorFree" freeAXftColor :: Display -> Visual -> Colormap -> AXftColor -> IO () -- Font handling newtype AXftFont = AXftFont (Ptr AXftFont) xft_ascent :: AXftFont -> IO Int xft_ascent (AXftFont p) = peekCUShort p #{offset XftFont, ascent} xft_ascent' :: [AXftFont] -> IO Int xft_ascent' = (fmap maximum) . (mapM xft_ascent) xft_descent :: AXftFont -> IO Int xft_descent (AXftFont p) = peekCUShort p #{offset XftFont, descent} xft_descent' :: [AXftFont] -> IO Int xft_descent' = (fmap maximum) . (mapM xft_descent) xft_height :: AXftFont -> IO Int xft_height (AXftFont p) = peekCUShort p #{offset XftFont, height} xft_height' :: [AXftFont] -> IO Int xft_height' = (fmap maximum) . (mapM xft_height) foreign import ccall "XftTextExtentsUtf8" cXftTextExtentsUtf8 :: Display -> AXftFont -> CString -> CInt -> Ptr XGlyphInfo -> IO () xftTxtExtents :: Display -> AXftFont -> String -> IO XGlyphInfo xftTxtExtents d f string = withArrayLen (map fi (UTF8.encode string)) $ \len str_ptr -> alloca $ \cglyph -> do cXftTextExtentsUtf8 d f str_ptr (fi len) cglyph peek cglyph xftTxtExtents' :: Display -> [AXftFont] -> String -> IO XGlyphInfo xftTxtExtents' d fs string = do chunks <- getChunks d fs string let (_, _, gi, _, _) = last chunks return gi foreign import ccall "XftFontOpenName" c_xftFontOpen :: Display -> CInt -> CString -> IO AXftFont openAXftFont :: Display -> Screen -> String -> IO AXftFont openAXftFont dpy screen name = withCAString name $ \cname -> c_xftFontOpen dpy (fi (screenNumberOfScreen screen)) cname foreign import ccall "XftFontClose" closeAXftFont :: Display -> AXftFont -> IO () foreign import ccall "XftCharExists" cXftCharExists :: Display -> AXftFont -> (#type FcChar32) -> IO (#type FcBool) xftCharExists :: Display -> AXftFont -> Char -> IO Bool xftCharExists d f c = bool `fmap` cXftCharExists d f (fi $ ord c) where bool 0 = False bool _ = True -- Drawing fi :: (Integral a, Num b) => a -> b fi = fromIntegral newtype AXftDraw = AXftDraw (Ptr AXftDraw) foreign import ccall "XftDrawCreate" c_xftDrawCreate :: Display -> Drawable -> Visual -> Colormap -> IO AXftDraw foreign import ccall "XftDrawDisplay" c_xftDrawDisplay :: AXftDraw -> IO Display foreign import ccall "XftDrawDestroy" c_xftDrawDestroy :: AXftDraw -> IO () withAXftDraw :: Display -> Drawable -> Visual -> Colormap -> (AXftDraw -> IO a) -> IO a withAXftDraw d p v c act = do draw <- c_xftDrawCreate d p v c a <- act draw c_xftDrawDestroy draw return a foreign import ccall "XftDrawStringUtf8" cXftDrawStringUtf8 :: AXftDraw -> AXftColor -> AXftFont -> CInt -> CInt -> Ptr (#type FcChar8) -> CInt -> IO () drawXftString :: (Integral a1, Integral a) => AXftDraw -> AXftColor -> AXftFont -> a -> a1 -> String -> IO () drawXftString d c f x y string = withArrayLen (map fi (UTF8.encode string)) (\len ptr -> cXftDrawStringUtf8 d c f (fi x) (fi y) ptr (fi len)) drawXftString' :: AXftDraw -> AXftColor -> [AXftFont] -> Integer -> Integer -> String -> IO () drawXftString' d c fs x y string = do display <- c_xftDrawDisplay d chunks <- getChunks display fs string mapM_ (\(f, s, _, xo, yo) -> drawXftString d c f (x+xo) (y+yo) s) chunks -- Split string and determine fonts/offsets for individual parts getChunks :: Display -> [AXftFont] -> [Char] -> IO [(AXftFont, String, XGlyphInfo, Integer, Integer)] getChunks disp fts str = do chunks <- getFonts disp fts str getOffsets (XGlyphInfo 0 0 0 0 0 0) chunks where -- Split string and determine fonts for individual parts getFonts _ [] _ = return [] getFonts _ _ [] = return [] getFonts _ [ft] s = return [(ft, s)] getFonts d fonts@(ft:_) s = do -- Determine which glyph can be rendered by current font glyphs <- mapM (xftCharExists d ft) s -- Split string into parts that can/cannot be rendered let splits = split (runs glyphs) s -- Determine which font to render each chunk with concat `fmap` mapM (getFont d fonts) splits -- Determine fonts for substrings getFont _ [] _ = return [] getFont _ [ft] (_, s) = return [(ft, s)] -- Last font, use it getFont _ (ft:_) (True, s) = return [(ft, s)] -- Current font can render this substring getFont d (_:fs) (False, s) = getFonts d fs s -- Fallback to next font -- Helpers runs [] = [] runs (x:xs) = let (h, t) = span (==x) xs in (x, length h + 1) : runs t split [] _ = [] split ((x, c):xs) s = let (h, t) = splitAt c s in (x, h) : split xs t -- Determine coordinates for chunks using extents getOffsets _ [] = return [] getOffsets (XGlyphInfo _ _ x y xo yo) ((f, s):chunks) = do (XGlyphInfo w' h' _ _ xo' yo') <- xftTxtExtents disp f s let gi = XGlyphInfo (xo+w') (yo+h') x y (xo+xo') (yo+yo') rest <- getOffsets gi chunks return $ (f, s, gi, fromIntegral xo, fromIntegral yo) : rest foreign import ccall "XftDrawRect" cXftDrawRect :: AXftDraw -> AXftColor -> CInt -> CInt -> CUInt -> CUInt -> IO () drawXftRect :: (Integral a3, Integral a2, Integral a1, Integral a) => AXftDraw -> AXftColor -> a -> a1 -> a2 -> a3 -> IO () drawXftRect draw color x y width height = cXftDrawRect draw color (fi x) (fi y) (fi width) (fi height) #include <X11/extensions/Xrender.h> type Picture = XID type PictOp = CInt data XRenderPictFormat data XRenderPictureAttributes = XRenderPictureAttributes -- foreign import ccall unsafe "X11/extensions/Xrender.h XRenderFillRectangle" -- xRenderFillRectangle :: Display -> PictOp -> Picture -> Ptr XRenderColor -> CInt -> CInt -> CUInt -> CUInt -> IO () foreign import ccall unsafe "X11/extensions/Xrender.h XRenderComposite" xRenderComposite :: Display -> PictOp -> Picture -> Picture -> Picture -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CUInt -> CUInt -> IO () foreign import ccall unsafe "X11/extensions/Xrender.h XRenderCreateSolidFill" xRenderCreateSolidFill :: Display -> Ptr XRenderColor -> IO Picture foreign import ccall unsafe "X11/extensions/Xrender.h XRenderFreePicture" xRenderFreePicture :: Display -> Picture -> IO () foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO () foreign import ccall unsafe "X11/extensions/Xrender.h XRenderFindStandardFormat" xRenderFindStandardFormat :: Display -> CInt -> IO (Ptr XRenderPictFormat) foreign import ccall unsafe "X11/extensions/Xrender.h XRenderCreatePicture" xRenderCreatePicture :: Display -> Drawable -> Ptr XRenderPictFormat -> CULong -> Ptr XRenderPictureAttributes -> IO Picture -- Attributes not supported instance Storable XRenderPictureAttributes where sizeOf _ = #{size XRenderPictureAttributes} alignment _ = alignment (undefined :: CInt) peek _ = return XRenderPictureAttributes poke p XRenderPictureAttributes = do memset p 0 #{size XRenderPictureAttributes} -- | Convenience function, gives us an XRender handle to a traditional -- Pixmap. Don't let it escape. withRenderPicture :: Display -> Drawable -> (Picture -> IO a) -> IO () withRenderPicture d p f = do format <- xRenderFindStandardFormat d 1 -- PictStandardRGB24 alloca $ \attr -> do pic <- xRenderCreatePicture d p format 0 attr f pic xRenderFreePicture d pic -- | Convenience function, gives us an XRender picture that is a solid -- fill of color 'c'. Don't let it escape. withRenderFill :: Display -> XRenderColor -> (Picture -> IO a) -> IO () withRenderFill d c f = do pic <- with c (xRenderCreateSolidFill d) f pic xRenderFreePicture d pic -- | Drawing the background to a pixmap and taking into account -- transparency drawBackground :: Display -> Drawable -> String -> Int -> Rectangle -> IO () drawBackground d p bgc alpha (Rectangle x y wid ht) = do let render opt bg pic m = xRenderComposite d opt bg m pic (fromIntegral x) (fromIntegral y) 0 0 0 0 (fromIntegral wid) (fromIntegral ht) withRenderPicture d p $ \pic -> do -- Handle background color bgcolor <- parseRenderColor d bgc withRenderFill d bgcolor $ \bgfill -> withRenderFill d (XRenderColor 0 0 0 (257 * alpha)) (render pictOpSrc bgfill pic) -- Handle transparency internAtom d "_XROOTPMAP_ID" False >>= \xid -> let xroot = defaultRootWindow d in alloca $ \x1 -> alloca $ \x2 -> alloca $ \x3 -> alloca $ \x4 -> alloca $ \pprop -> do xGetWindowProperty d xroot xid 0 1 False 20 x1 x2 x3 x4 pprop prop <- peek pprop when (prop /= nullPtr) $ do rootbg <- peek (castPtr prop) :: IO Pixmap xFree prop withRenderPicture d rootbg $ \bgpic -> withRenderFill d (XRenderColor 0 0 0 (0xFFFF - 257 * alpha)) (render pictOpAdd bgpic pic) -- | Parses color into XRender color (allocation not necessary!) parseRenderColor :: Display -> String -> IO XRenderColor parseRenderColor d c = do let colormap = defaultColormap d (defaultScreen d) Color _ red green blue _ <- parseColor d colormap c return $ XRenderColor (fromIntegral red) (fromIntegral green) (fromIntegral blue) 0xFFFF pictOpSrc, pictOpAdd :: PictOp pictOpSrc = 1 pictOpAdd = 12 -- pictOpMinimum = 0 -- pictOpClear = 0 -- pictOpDst = 2 -- pictOpOver = 3 -- pictOpOverReverse = 4 -- pictOpIn = 5 -- pictOpInReverse = 6 -- pictOpOut = 7 -- pictOpOutReverse = 8 -- pictOpAtop = 9 -- pictOpAtopReverse = 10 -- pictOpXor = 11 -- pictOpSaturate = 13 -- pictOpMaximum = 13 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Parsers.hs������������������������������������������������������������������������0000664�0000000�0000000�00000027064�12513250503�0015634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar.Parsers -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Parsers needed for Xmobar, a text based status bar -- ----------------------------------------------------------------------------- module Parsers ( parseString , parseTemplate , parseConfig , Widget(..) ) where import Config import Runnable import Commands import Actions import Control.Monad (guard, mzero, liftM) import qualified Data.Map as Map import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Perm import Graphics.X11.Types (Button) data Widget = Icon String | Text String type ColorString = String type FontIndex = Int -- | Runs the string parser parseString :: Config -> String -> IO [(Widget, ColorString, FontIndex, Maybe [Action])] parseString c s = case parse (stringParser (fgColor c) 0 Nothing) "" s of Left _ -> return [(Text $ "Could not parse string: " ++ s , fgColor c , 0 , Nothing)] Right x -> return (concat x) allParsers :: ColorString -> FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] allParsers c f a = textParser c f a <|> try (iconParser c f a) <|> try (rawParser c f a) <|> try (actionParser c f a) <|> try (fontParser c a) <|> colorParser f a -- | Gets the string and combines the needed parsers stringParser :: String -> FontIndex -> Maybe [Action] -> Parser [[(Widget, ColorString, FontIndex, Maybe [Action])]] stringParser c f a = manyTill (allParsers c f a) eof -- | Parses a maximal string without color markup. textParser :: String -> FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] textParser c f a = do s <- many1 $ noneOf "<" <|> try (notFollowedBy' (char '<') (try (string "fc=") <|> try (string "fn=") <|> try (string "action=") <|> try (string "/action>") <|> try (string "icon=") <|> try (string "raw=") <|> try (string "/fn>") <|> string "/fc>")) return [(Text s, c, f, a)] -- | Parse a "raw" tag, which we use to prevent other tags from creeping in. -- The format here is net-string-esque: a literal "<raw=" followed by a -- string of digits (base 10) denoting the length of the raw string, -- a literal ":" as digit-string-terminator, the raw string itself, and -- then a literal "/>". rawParser :: ColorString -> FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] rawParser c f a = do string "<raw=" lenstr <- many1 digit char ':' case reads lenstr of [(len,[])] -> do guard ((len :: Integer) <= fromIntegral (maxBound :: Int)) s <- count (fromIntegral len) anyChar string "/>" return [(Text s, c, f, a)] _ -> mzero -- | Wrapper for notFollowedBy that returns the result of the first parser. -- Also works around the issue that, at least in Parsec 3.0.0, notFollowedBy -- accepts only parsers with return type Char. notFollowedBy' :: Parser a -> Parser b -> Parser a notFollowedBy' p e = do x <- p notFollowedBy $ try (e >> return '*') return x iconParser :: String -> FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] iconParser c f a = do string "<icon=" i <- manyTill (noneOf ">") (try (string "/>")) return [(Icon i, c, f, a)] actionParser :: String -> FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] actionParser c f act = do string "<action=" command <- choice [between (char '`') (char '`') (many1 (noneOf "`")), many1 (noneOf ">")] buttons <- (char '>' >> return "1") <|> (space >> spaces >> between (string "button=") (string ">") (many1 (oneOf "12345"))) let a = Spawn (toButtons buttons) command a' = case act of Nothing -> Just [a] Just act' -> Just $ a : act' s <- manyTill (allParsers c f a') (try $ string "</action>") return (concat s) toButtons :: String -> [Button] toButtons = map (\x -> read [x]) -- | Parsers a string wrapped in a color specification. colorParser :: FontIndex -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] colorParser f a = do c <- between (string "<fc=") (string ">") colors s <- manyTill (allParsers c f a) (try $ string "</fc>") return (concat s) -- | Parsers a string wrapped in a font specification. fontParser :: ColorString -> Maybe [Action] -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] fontParser c a = do f <- between (string "<fn=") (string ">") colors s <- manyTill (allParsers c (read f) a) (try $ string "</fn>") return (concat s) -- | Parses a color specification (hex or named) colors :: Parser String colors = many1 (alphaNum <|> char ',' <|> char '#') -- | Parses the output template string templateStringParser :: Config -> Parser (String,String,String) templateStringParser c = do s <- allTillSep c com <- templateCommandParser c ss <- allTillSep c return (com, s, ss) -- | Parses the command part of the template string templateCommandParser :: Config -> Parser String templateCommandParser c = let chr = char . head . sepChar in between (chr c) (chr c) (allTillSep c) -- | Combines the template parsers templateParser :: Config -> Parser [(String,String,String)] templateParser = many . templateStringParser -- | Actually runs the template parsers parseTemplate :: Config -> String -> IO [(Runnable,String,String)] parseTemplate c s = do str <- case parse (templateParser c) "" s of Left _ -> return [("", s, "")] Right x -> return x let cl = map alias (commands c) m = Map.fromList $ zip cl (commands c) return $ combine c m str -- | Given a finite "Map" and a parsed template produce the resulting -- output string. combine :: Config -> Map.Map String Runnable -> [(String, String, String)] -> [(Runnable,String,String)] combine _ _ [] = [] combine c m ((ts,s,ss):xs) = (com, s, ss) : combine c m xs where com = Map.findWithDefault dflt ts m dflt = Run $ Com ts [] [] 10 allTillSep :: Config -> Parser String allTillSep = many . noneOf . sepChar stripComments :: String -> String stripComments = unlines . map (drop 5 . strip False . (replicate 5 ' '++)) . lines where strip m ('-':'-':xs) = if m then "--" ++ strip m xs else "" strip m ('"':xs) = '"': strip (not m) xs strip m (x:xs) = x : strip m xs strip _ [] = [] -- | Parse the config, logging a list of fields that were missing and replaced -- by the default definition. parseConfig :: String -> Either ParseError (Config,[String]) parseConfig = runParser parseConf fields "Config" . stripComments where parseConf = do many space sepEndSpc ["Config","{"] x <- perms eof s <- getState return (x,s) perms = permute $ Config <$?> pFont <|?> pFontList <|?> pBgColor <|?> pFgColor <|?> pPosition <|?> pTextOffset <|?> pIconOffset <|?> pBorder <|?> pBdColor <|?> pBdWidth <|?> pAlpha <|?> pHideOnStart <|?> pAllDesktops <|?> pOverrideRedirect <|?> pPickBroadest <|?> pLowerOnStart <|?> pPersistent <|?> pIconRoot <|?> pCommands <|?> pSepChar <|?> pAlignSep <|?> pTemplate fields = [ "font", "additionalFonts","bgColor", "fgColor", "sepChar" , "alignSep" , "border", "borderColor" ,"template" , "position" , "textOffset", "iconOffset" , "allDesktops", "overrideRedirect", "pickBroadest" , "hideOnStart", "lowerOnStart", "persistent", "iconRoot" , "alpha", "commands" ] pFont = strField font "font" pFontList = strListField additionalFonts "additionalFonts" pBgColor = strField bgColor "bgColor" pFgColor = strField fgColor "fgColor" pBdColor = strField borderColor "borderColor" pSepChar = strField sepChar "sepChar" pAlignSep = strField alignSep "alignSep" pTemplate = strField template "template" pTextOffset = readField textOffset "textOffset" pIconOffset = readField iconOffset "iconOffset" pPosition = readField position "position" pHideOnStart = readField hideOnStart "hideOnStart" pLowerOnStart = readField lowerOnStart "lowerOnStart" pPersistent = readField persistent "persistent" pBorder = readField border "border" pBdWidth = readField borderWidth "borderWidth" pAllDesktops = readField allDesktops "allDesktops" pOverrideRedirect = readField overrideRedirect "overrideRedirect" pPickBroadest = readField pickBroadest "pickBroadest" pIconRoot = readField iconRoot "iconRoot" pAlpha = readField alpha "alpha" pCommands = field commands "commands" readCommands staticPos = do string "Static" wrapSkip (string "{") p <- many (noneOf "}") wrapSkip (string "}") string "," return ("Static {" ++ p ++ "}") tillFieldEnd = staticPos <|> many (noneOf ",}\n\r") commandsEnd = wrapSkip (string "]") >> (string "}" <|> notNextRun) notNextRun = do {string "," ; notFollowedBy $ wrapSkip $ string "Run" ; return "," } readCommands = manyTill anyChar (try commandsEnd) >>= read' commandsErr . flip (++) "]" strField e n = field e n strMulti strMulti = scan '"' where scan lead = do spaces char lead s <- manyTill anyChar (rowCont <|> unescQuote) (char '"' >> return s) <|> liftM (s ++) (scan '\\') rowCont = try $ char '\\' >> string "\n" unescQuote = lookAhead (noneOf "\\") >> lookAhead (string "\"") strListField e n = field e n strList strList = do spaces char '[' list <- sepBy (strMulti >>= \x -> spaces >> return x) (char ',') spaces char ']' return list wrapSkip x = many space >> x >>= \r -> many space >> return r sepEndSpc = mapM_ (wrapSkip . try . string) fieldEnd = many $ space <|> oneOf ",}" field e n c = (,) (e defaultConfig) $ updateState (filter (/= n)) >> sepEndSpc [n,"="] >> wrapSkip c >>= \r -> fieldEnd >> return r readField a n = field a n $ tillFieldEnd >>= read' n read' d s = case reads s of [(x, _)] -> return x _ -> fail $ "error reading the " ++ d ++ " field: " ++ s commandsErr :: String commandsErr = "commands: this usually means that a command could not" ++ "\nbe parsed." ++ "\nThe error could be located at the begining of the command" ++ "\nwhich follows the offending one." ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins.hs������������������������������������������������������������������������0000664�0000000�0000000�00000001141�12513250503�0015622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Xmobar.Plugins -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- This module exports the API for plugins. -- -- Have a look at Plugins\/HelloWorld.hs -- ----------------------------------------------------------------------------- module Plugins ( Exec (..) , tenthSeconds , readFileSafe , hGetLineSafe ) where import Commands import XUtil �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0015271�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/BufferedPipeReader.hs�����������������������������������������������������0000664�0000000�0000000�00000005337�12513250503�0021320�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.BufferedPipeReader -- Copyright : (c) Jochen Keil -- License : BSD-style (see LICENSE) -- -- Maintainer : Jochen Keil <jochen dot keil at gmail dot com> -- Stability : unstable -- Portability : unportable -- -- A plugin for reading (temporarily) from named pipes with reset -- ----------------------------------------------------------------------------- module Plugins.BufferedPipeReader where import Control.Monad(forM_, when, void) import Control.Concurrent import Control.Concurrent.STM import System.IO import System.IO.Unsafe(unsafePerformIO) import Plugins import Signal data BufferedPipeReader = BufferedPipeReader String [(Int, Bool, String)] deriving (Read, Show) signal :: MVar SignalType signal = unsafePerformIO newEmptyMVar instance Exec BufferedPipeReader where alias ( BufferedPipeReader a _ ) = a trigger br@( BufferedPipeReader _ _ ) sh = takeMVar signal >>= sh . Just >> trigger br sh start ( BufferedPipeReader _ ps ) cb = do (chan, str, rst) <- initV forM_ ps $ \p -> forkIO $ reader p chan writer chan str rst where initV :: IO ( TChan (Int, Bool, String), TVar (Maybe String), TVar Bool ) initV = atomically $ do tc <- newTChan ts <- newTVar Nothing tb <- newTVar False return (tc, ts, tb) reader :: (Int, Bool, FilePath) -> TChan (Int, Bool, String) -> IO () reader p@(to, tg, fp) tc = do openFile fp ReadWriteMode >>= hGetLineSafe >>= \dt -> atomically $ writeTChan tc (to, tg, dt) reader p tc writer :: TChan (Int, Bool, String) -> TVar (Maybe String) -> TVar Bool -> IO () writer tc ts otb = do (to, tg, dt, ntb) <- update cb dt when tg $ putMVar signal $ Reveal 0 when (to /= 0) $ sfork $ reset to tg ts ntb writer tc ts ntb where sfork :: IO () -> IO () sfork f = void (forkIO f) update :: IO (Int, Bool, String, TVar Bool) update = atomically $ do (to, tg, dt) <- readTChan tc when (to == 0) $ writeTVar ts $ Just dt writeTVar otb False tb <- newTVar True return (to, tg, dt, tb) reset :: Int -> Bool -> TVar (Maybe String) -> TVar Bool -> IO () reset to tg ts tb = do threadDelay ( to * 100 * 1000 ) readTVarIO tb >>= \b -> when b $ do when tg $ putMVar signal $ Hide 0 atomically (readTVar ts) >>= maybe (return ()) cb �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/CommandReader.hs����������������������������������������������������������0000664�0000000�0000000�00000002351�12513250503�0020327�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.CommandReader -- Copyright : (c) John Goerzen -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin for reading from external commands -- note: stderr is lost here -- ----------------------------------------------------------------------------- module Plugins.CommandReader where import System.IO import Plugins import System.Process(runInteractiveCommand, getProcessExitCode) data CommandReader = CommandReader String String deriving (Read, Show) instance Exec CommandReader where alias (CommandReader _ a) = a start (CommandReader p _) cb = do (hstdin, hstdout, hstderr, ph) <- runInteractiveCommand p hClose hstdin hClose hstderr hSetBinaryMode hstdout False hSetBuffering hstdout LineBuffering forever ph (hGetLineSafe hstdout >>= cb) where forever ph a = do a ec <- getProcessExitCode ph case ec of Nothing -> forever ph a Just _ -> cb "EXITED" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Date.hs�������������������������������������������������������������������0000664�0000000�0000000�00000001722�12513250503�0016504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Date -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A date plugin for Xmobar -- -- Usage example: in template put -- -- > Run Date "%a %b %_d %Y <fc=#ee9a00> %H:%M:%S</fc>" "Mydate" 10 -- ----------------------------------------------------------------------------- module Plugins.Date (Date(..)) where import Plugins #if ! MIN_VERSION_time(1,5,0) import System.Locale #endif import Control.Monad (liftM) import Data.Time data Date = Date String String Int deriving (Read, Show) instance Exec Date where alias (Date _ a _) = a run (Date f _ _) = date f rate (Date _ _ r) = r date :: String -> IO String date format = liftM (formatTime defaultTimeLocale format) getZonedTime ����������������������������������������������xmobar-0.23.1/src/Plugins/DateZone.hs���������������������������������������������������������������0000664�0000000�0000000�00000004606�12513250503�0017344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} {-# LANGUAGE DoAndIfThenElse #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.DateZone -- Copyright : (c) Martin Perner -- License : BSD-style (see LICENSE) -- -- Maintainer : Martin Perner <martin@perner.cc> -- Stability : unstable -- Portability : unportable -- -- A date plugin with localization and location support for Xmobar -- -- Based on Plugins.Date -- -- Usage example: in template put -- -- > Run DateZone "%a %H:%M:%S" "de_DE.UTF-8" "UTC" "utcDate" 10 -- ----------------------------------------------------------------------------- module Plugins.DateZone (DateZone(..)) where import Plugins #ifdef DATEZONE import Control.Concurrent.STM import System.IO.Unsafe import Localize import Data.Time.Format import Data.Time.LocalTime import Data.Time.LocalTime.TimeZone.Olson import Data.Time.LocalTime.TimeZone.Series #if ! MIN_VERSION_time(1,5,0) import System.Locale (TimeLocale) #endif #else import System.IO import Plugins.Date #endif data DateZone = DateZone String String String String Int deriving (Read, Show) instance Exec DateZone where alias (DateZone _ _ _ a _) = a #ifndef DATEZONE start (DateZone f _ _ a r) cb = do hPutStrLn stderr $ "Warning: DateZone plugin needs -fwith_datezone."++ " Using Date plugin instead." start (Date f a r) cb #else start (DateZone f l z _ r) cb = do lock <- atomically $ takeTMVar localeLock setupTimeLocale l locale <- getTimeLocale atomically $ putTMVar localeLock lock if z /= "" then do timeZone <- getTimeZoneSeriesFromOlsonFile ("/usr/share/zoneinfo/" ++ z) go (dateZone f locale timeZone) else go (date f locale) where go func = func >>= cb >> tenthSeconds r >> go func {-# NOINLINE localeLock #-} -- ensures that only one plugin instance sets the locale localeLock :: TMVar Bool localeLock = unsafePerformIO (newTMVarIO False) date :: String -> TimeLocale -> IO String date format loc = getZonedTime >>= return . formatTime loc format dateZone :: String -> TimeLocale -> TimeZoneSeries -> IO String dateZone format loc timeZone = getZonedTime >>= return . formatTime loc format . utcToLocalTime' timeZone . zonedTimeToUTC -- zonedTime <- getZonedTime -- return $ formatTime loc format $ utcToLocalTime' timeZone $ zonedTimeToUTC zonedTime #endif ��������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/EWMH.hs�������������������������������������������������������������������0000664�0000000�0000000�00000020236�12513250503�0016370�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# OPTIONS_GHC -w #-} {-# LANGUAGE CPP, NamedFieldPuns, GeneralizedNewtypeDeriving, FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.EWMH -- Copyright : (c) Spencer Janssen -- License : BSD-style (see LICENSE) -- -- Maintainer : Spencer Janssen <spencerjanssen@gmail.com> -- Stability : unstable -- Portability : unportable -- -- An experimental plugin to display EWMH pager information -- ----------------------------------------------------------------------------- module Plugins.EWMH (EWMH(..)) where import Control.Applicative (Applicative(..)) import Control.Monad.State import Control.Monad.Reader import Graphics.X11 hiding (Modifier, Color) import Graphics.X11.Xlib.Extras import Plugins #ifdef UTF8 #undef UTF8 import Codec.Binary.UTF8.String as UTF8 #define UTF8 #endif import Foreign.C (CChar, CLong) import XUtil (nextEvent') import Data.List (intersperse, intercalate) import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set) import qualified Data.Set as Set data EWMH = EWMH | EWMHFMT Component deriving (Read, Show) instance Exec EWMH where alias EWMH = "EWMH" start ew cb = allocaXEvent $ \ep -> execM $ do d <- asks display r <- asks root liftIO xSetErrorHandler liftIO $ selectInput d r propertyChangeMask handlers' <- mapM (\(a, h) -> liftM2 (,) (getAtom a) (return h)) handlers mapM_ ((=<< asks root) . snd) handlers' forever $ do liftIO . cb . fmtOf ew =<< get liftIO $ nextEvent' d ep e <- liftIO $ getEvent ep case e of PropertyEvent { ev_atom = a, ev_window = w } -> case lookup a handlers' of Just f -> f w _ -> return () _ -> return () return () defaultPP = Sep (Text " : ") [ Workspaces [Color "white" "black" :% Current, Hide :% Empty] , Layout , Color "#00ee00" "" :$ Short 120 :$ WindowName] fmtOf EWMH = flip fmt defaultPP fmtOf (EWMHFMT f) = flip fmt f sep :: [a] -> [[a]] -> [a] sep x xs = intercalate x $ filter (not . null) xs fmt :: EwmhState -> Component -> String fmt e (Text s) = s fmt e (l :+ r) = fmt e l ++ fmt e r fmt e (m :$ r) = modifier m $ fmt e r fmt e (Sep c xs) = sep (fmt e c) $ map (fmt e) xs fmt e WindowName = windowName $ Map.findWithDefault initialClient (activeWindow e) (clients e) fmt e Layout = layout e fmt e (Workspaces opts) = sep " " [foldr ($) n [modifier m | (m :% a) <- opts, a `elem` as] | (n, as) <- attrs] where stats i = [ (Current, i == currentDesktop e) , (Empty, Set.notMember i nonEmptys && i /= currentDesktop e) -- TODO for visible , (Visibl ] attrs :: [(String, [WsType])] attrs = [(n, [s | (s, b) <- stats i, b]) | (i, n) <- zip [0 ..] (desktopNames e)] nonEmptys = Set.unions . map desktops . Map.elems $ clients e modifier :: Modifier -> String -> String modifier Hide = const "" modifier (Color fg bg) = \x -> concat ["<fc=", fg, if null bg then "" else "," ++ bg , ">", x, "</fc>"] modifier (Short n) = take n modifier (Wrap l r) = \x -> l ++ x ++ r data Component = Text String | Component :+ Component | Modifier :$ Component | Sep Component [Component] | WindowName | Layout | Workspaces [WsOpt] deriving (Read, Show) infixr 0 :$ infixr 5 :+ data Modifier = Hide | Color String String | Short Int | Wrap String String deriving (Read, Show) data WsOpt = Modifier :% WsType | WSep Component deriving (Read, Show) infixr 0 :% data WsType = Current | Empty | Visible deriving (Read, Show, Eq) data EwmhConf = C { root :: Window , display :: Display } data EwmhState = S { currentDesktop :: CLong , activeWindow :: Window , desktopNames :: [String] , layout :: String , clients :: Map Window Client } deriving Show data Client = Cl { windowName :: String , desktops :: Set CLong } deriving Show getAtom :: String -> M Atom getAtom s = do d <- asks display liftIO $ internAtom d s False windowProperty32 :: String -> Window -> M (Maybe [CLong]) windowProperty32 s w = do (C {display}) <- ask a <- getAtom s liftIO $ getWindowProperty32 display a w windowProperty8 :: String -> Window -> M (Maybe [CChar]) windowProperty8 s w = do (C {display}) <- ask a <- getAtom s liftIO $ getWindowProperty8 display a w initialState :: EwmhState initialState = S 0 0 [] [] Map.empty initialClient :: Client initialClient = Cl "" Set.empty handlers, clientHandlers :: [(String, Updater)] handlers = [ ("_NET_CURRENT_DESKTOP", updateCurrentDesktop) , ("_NET_DESKTOP_NAMES", updateDesktopNames ) , ("_NET_ACTIVE_WINDOW", updateActiveWindow) , ("_NET_CLIENT_LIST", updateClientList) ] ++ clientHandlers clientHandlers = [ ("_NET_WM_NAME", updateName) , ("_NET_WM_DESKTOP", updateDesktop) ] newtype M a = M (ReaderT EwmhConf (StateT EwmhState IO) a) deriving (Monad, Functor, Applicative, MonadIO, MonadReader EwmhConf, MonadState EwmhState) execM :: M a -> IO a execM (M m) = do d <- openDisplay "" r <- rootWindow d (defaultScreen d) let conf = C r d evalStateT (runReaderT m (C r d)) initialState type Updater = Window -> M () updateCurrentDesktop, updateDesktopNames, updateActiveWindow :: Updater updateCurrentDesktop _ = do (C {root}) <- ask mwp <- windowProperty32 "_NET_CURRENT_DESKTOP" root case mwp of Just [x] -> modify (\s -> s { currentDesktop = x }) _ -> return () updateActiveWindow _ = do (C {root}) <- ask mwp <- windowProperty32 "_NET_ACTIVE_WINDOW" root case mwp of Just [x] -> modify (\s -> s { activeWindow = fromIntegral x }) _ -> return () updateDesktopNames _ = do (C {root}) <- ask mwp <- windowProperty8 "_NET_DESKTOP_NAMES" root case mwp of Just xs -> modify (\s -> s { desktopNames = parse xs }) _ -> return () where dropNull ('\0':xs) = xs dropNull xs = xs split [] = [] split xs = case span (/= '\0') xs of (x, ys) -> x : split (dropNull ys) parse = split . decodeCChar updateClientList _ = do (C {root}) <- ask mwp <- windowProperty32 "_NET_CLIENT_LIST" root case mwp of Just xs -> do cl <- gets clients let cl' = Map.fromList $ map (flip (,) initialClient . fromIntegral) xs dels = Map.difference cl cl' new = Map.difference cl' cl modify (\s -> s { clients = Map.union (Map.intersection cl cl') cl'}) mapM_ (unmanage . fst) (Map.toList dels) mapM_ (listen . fst) (Map.toList cl') mapM_ (update . fst) (Map.toList new) _ -> return () where unmanage w = asks display >>= \d -> liftIO $ selectInput d w 0 listen w = asks display >>= \d -> liftIO $ selectInput d w propertyChangeMask update w = mapM_ (($ w) . snd) clientHandlers modifyClient :: Window -> (Client -> Client) -> M () modifyClient w f = modify (\s -> s { clients = Map.alter f' w $ clients s }) where f' Nothing = Just $ f initialClient f' (Just x) = Just $ f x updateName w = do mwp <- windowProperty8 "_NET_WM_NAME" w case mwp of Just xs -> modifyClient w (\c -> c { windowName = decodeCChar xs }) _ -> return () updateDesktop w = do mwp <- windowProperty32 "_NET_WM_DESKTOP" w case mwp of Just x -> modifyClient w (\c -> c { desktops = Set.fromList x }) _ -> return () decodeCChar :: [CChar] -> String #ifdef UTF8 #undef UTF8 decodeCChar = UTF8.decode . map fromIntegral #define UTF8 #else decodeCChar = map (toEnum . fromIntegral) #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Kbd.hsc�������������������������������������������������������������������0000664�0000000�0000000�00000031205�12513250503�0016471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE ScopedTypeVariables, ForeignFunctionInterface, MultiParamTypeClasses, DeriveDataTypeable, FlexibleInstances, PatternGuards #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Kbd -- Copyright : (c) Martin Perner -- License : BSD-style (see LICENSE) -- -- Maintainer : Martin Perner <martin@perner.cc> -- Stability : unstable -- Portability : unportable -- -- A keyboard layout indicator for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Kbd where import Graphics.X11.Xlib import Graphics.X11.Xlib.Extras import Foreign import Foreign.C.Types import Foreign.C.String import Plugins import Control.Monad (forever) import XUtil (nextEvent') import Data.List (isPrefixOf, findIndex) import Data.Maybe (fromJust) #include <X11/XKBlib.h> #include <X11/extensions/XKB.h> #include <X11/extensions/XKBstr.h> -- -- Definition for XkbStaceRec and getKbdLayout taken from -- XMonad.Layout.XKBLayout -- data XkbStateRec = XkbStateRec { group :: CUChar, locked_group :: CUChar, base_group :: CUShort, latched_group :: CUShort, mods :: CUChar, base_mods :: CUChar, latched_mods :: CUChar, locked_mods :: CUChar, compat_state :: CUChar, grab_mods :: CUChar, compat_grab_mods :: CUChar, lookup_mods :: CUChar, compat_lookup_mods :: CUChar, ptr_buttons :: CUShort } instance Storable XkbStateRec where sizeOf _ = (#size XkbStateRec) alignment _ = alignment (undefined :: CUShort) peek ptr = do r_group <- (#peek XkbStateRec, group) ptr r_locked_group <- (#peek XkbStateRec, locked_group) ptr r_base_group <- (#peek XkbStateRec, base_group) ptr r_latched_group <- (#peek XkbStateRec, latched_group) ptr r_mods <- (#peek XkbStateRec, mods) ptr r_base_mods <- (#peek XkbStateRec, base_mods) ptr r_latched_mods <- (#peek XkbStateRec, latched_mods) ptr r_locked_mods <- (#peek XkbStateRec, locked_mods) ptr r_compat_state <- (#peek XkbStateRec, compat_state) ptr r_grab_mods <- (#peek XkbStateRec, grab_mods) ptr r_compat_grab_mods <- (#peek XkbStateRec, compat_grab_mods) ptr r_lookup_mods <- (#peek XkbStateRec, lookup_mods) ptr r_compat_lookup_mods <- (#peek XkbStateRec, compat_lookup_mods) ptr r_ptr_buttons <- (#peek XkbStateRec, ptr_buttons) ptr return XkbStateRec { group = r_group, locked_group = r_locked_group, base_group = r_base_group, latched_group = r_latched_group, mods = r_mods, base_mods = r_base_mods, latched_mods = r_latched_mods, locked_mods = r_locked_mods, compat_state = r_compat_state, grab_mods = r_grab_mods, compat_grab_mods = r_compat_grab_mods, lookup_mods = r_lookup_mods, compat_lookup_mods = r_compat_lookup_mods, ptr_buttons = r_ptr_buttons } foreign import ccall unsafe "X11/XKBlib.h XkbGetState" xkbGetState :: Display -> CUInt -> Ptr XkbStateRec -> IO CInt getKbdLayout :: Display -> IO Int getKbdLayout d = alloca $ \stRecPtr -> do xkbGetState d 0x100 stRecPtr st <- peek stRecPtr return $ fromIntegral (group st) -- -- -- data XkbKeyNameRec = XkbKeyNameRec { name :: Ptr CChar -- array } -- -- the t_ before alias is just because of name collisions -- data XkbKeyAliasRec = XkbKeyAliasRec { real :: Ptr CChar, -- array t_alias :: Ptr CChar -- array } -- -- the t_ before geometry is just because of name collisions -- data XkbNamesRec = XkbNamesRec { keycodes :: Atom, t_geometry :: Atom, symbols :: Atom, types :: Atom, compat :: Atom, vmods :: Ptr Atom, indicators :: Ptr Atom, -- array groups :: Ptr Atom, -- array keys :: Ptr XkbKeyNameRec, key_aliases :: Ptr CChar, -- dont care XkbKeyAliasRec, radio_groups :: Ptr Atom, phys_symbols :: Atom, num_keys :: CUChar, num_key_aliases :: CUChar, num_rg :: CUShort } -- -- the t_ before map, indicators and compat are just because of name collisions -- data XkbDescRec = XkbDescRec { t_dpy :: Ptr CChar, -- struct _XDisplay* ; don't care flags :: CUShort, device_spec :: CUShort, min_key_code :: KeyCode, max_key_code :: KeyCode, ctrls :: Ptr CChar, -- XkbControlsPtr ; dont' care server :: Ptr CChar, -- XkbServerMapPtr ; dont' care t_map :: Ptr CChar, --XkbClientMapPtr ; dont' care t_indicators :: Ptr CChar, -- XkbIndicatorPtr ; dont' care names :: Ptr XkbNamesRec, -- array t_compat :: Ptr CChar, -- XkbCompatMap ; dont' care geom :: Ptr CChar -- XkbGeometryPtr ; dont' care } instance Storable XkbKeyNameRec where sizeOf _ = (#size XkbKeyNameRec) alignment _ = alignment (undefined :: CUShort) peek ptr = do r_name <- (#peek XkbKeyNameRec, name) ptr return XkbKeyNameRec { name = r_name } instance Storable XkbKeyAliasRec where sizeOf _ = (#size XkbKeyAliasRec) alignment _ = alignment (undefined :: CUShort) peek ptr = do r_real <- (#peek XkbKeyAliasRec, real) ptr r_alias <- (#peek XkbKeyAliasRec, alias) ptr return XkbKeyAliasRec { real = r_real, t_alias = r_alias } instance Storable XkbNamesRec where sizeOf _ = (#size XkbNamesRec) alignment _ = alignment (undefined :: CUShort) peek ptr = do r_keycodes <- (#peek XkbNamesRec, keycodes) ptr r_geometry <- (#peek XkbNamesRec, geometry) ptr r_symbols <- (#peek XkbNamesRec, symbols ) ptr r_types <- (#peek XkbNamesRec, types ) ptr r_compat <- (#peek XkbNamesRec, compat ) ptr r_vmods <- (#peek XkbNamesRec, vmods ) ptr r_indicators <- (#peek XkbNamesRec, indicators ) ptr r_groups <- (#peek XkbNamesRec, groups ) ptr r_keys <- (#peek XkbNamesRec, keys ) ptr r_key_aliases <- (#peek XkbNamesRec, key_aliases ) ptr r_radio_groups <- (#peek XkbNamesRec, radio_groups ) ptr r_phys_symbols <- (#peek XkbNamesRec, phys_symbols ) ptr r_num_keys <- (#peek XkbNamesRec,num_keys ) ptr r_num_key_aliases <- (#peek XkbNamesRec, num_key_aliases ) ptr r_num_rg <- (#peek XkbNamesRec, num_rg ) ptr return XkbNamesRec { keycodes = r_keycodes, t_geometry = r_geometry, symbols = r_symbols, types = r_types, compat = r_compat, vmods = r_vmods, indicators = r_indicators, groups = r_groups, keys = r_keys, key_aliases = r_key_aliases, radio_groups = r_radio_groups, phys_symbols = r_phys_symbols, num_keys = r_num_keys, num_key_aliases = r_num_key_aliases, num_rg = r_num_rg } instance Storable XkbDescRec where sizeOf _ = (#size XkbDescRec) alignment _ = alignment (undefined :: CUShort) peek ptr = do r_dpy <- (#peek XkbDescRec, dpy) ptr r_flags <- (#peek XkbDescRec, flags) ptr r_device_spec <- (#peek XkbDescRec, device_spec) ptr r_min_key_code <- (#peek XkbDescRec, min_key_code) ptr r_max_key_code <- (#peek XkbDescRec, max_key_code) ptr r_ctrls <- (#peek XkbDescRec, ctrls) ptr r_server <- (#peek XkbDescRec, server) ptr r_map <- (#peek XkbDescRec, map) ptr r_indicators <- (#peek XkbDescRec, indicators) ptr r_names <- (#peek XkbDescRec, names) ptr r_compat <- (#peek XkbDescRec, compat) ptr r_geom <- (#peek XkbDescRec, geom) ptr return XkbDescRec { t_dpy = r_dpy, flags = r_flags, device_spec = r_device_spec, min_key_code = r_min_key_code, max_key_code = r_max_key_code, ctrls = r_ctrls, server = r_server, t_map = r_map, t_indicators = r_indicators, names = r_names, t_compat = r_compat, geom = r_geom } -- -- C bindings -- foreign import ccall unsafe "X11/XKBlib.h XkbAllocKeyboard" xkbAllocKeyboard :: IO (Ptr XkbDescRec) foreign import ccall unsafe "X11/XKBlib.h XkbGetNames" xkbGetNames :: Display -> CUInt -> (Ptr XkbDescRec) -> IO Status foreign import ccall unsafe "X11/XKBlib.h XGetAtomName" xGetAtomName :: Display -> Atom -> IO CString foreign import ccall unsafe "X11/XKBlib.h XkbFreeNames" xkbFreeNames :: (Ptr XkbDescRec) -> CUInt -> CInt -> IO () foreign import ccall unsafe "X11/XKBlib.h XkbFreeKeyboard" xkbFreeKeyboard :: (Ptr XkbDescRec) -> CUInt -> CInt -> IO () foreign import ccall unsafe "X11/XKBlib.h XkbSelectEventDetails" xkbSelectEventDetails :: Display -> CUInt -> CUInt -> CULong -> CULong -> IO CUInt foreign import ccall unsafe "X11/XKBlib.h XkbSelectEvents" xkbSelectEvents :: Display -> CUInt -> CUInt -> CUInt -> IO CUInt xkbUseCoreKbd :: CUInt xkbUseCoreKbd = #const XkbUseCoreKbd xkbStateNotify :: CUInt xkbStateNotify = #const XkbStateNotify xkbIndicatorStateNotify :: CUInt xkbIndicatorStateNotify = #const XkbIndicatorStateNotify xkbMapNotify :: CUInt xkbMapNotify = #const XkbMapNotify xkbMapNotifyMask :: CUInt xkbMapNotifyMask = #const XkbMapNotifyMask xkbNewKeyboardNotifyMask :: CUInt xkbNewKeyboardNotifyMask = #const XkbNewKeyboardNotifyMask xkbAllStateComponentsMask :: CULong xkbAllStateComponentsMask = #const XkbAllStateComponentsMask xkbGroupStateMask :: CULong xkbGroupStateMask = #const XkbGroupStateMask xkbSymbolsNameMask :: CUInt xkbSymbolsNameMask = #const XkbSymbolsNameMask xkbGroupNamesMask :: CUInt xkbGroupNamesMask = #const XkbGroupNamesMask type KbdOpts = [(String, String)] -- gets the layout string getLayoutStr :: Display -> IO String getLayoutStr dpy = do kbdDescPtr <- xkbAllocKeyboard status <- xkbGetNames dpy xkbSymbolsNameMask kbdDescPtr str <- getLayoutStr' status dpy kbdDescPtr xkbFreeNames kbdDescPtr xkbGroupNamesMask 1 xkbFreeKeyboard kbdDescPtr 0 1 return str getLayoutStr' :: Status -> Display -> (Ptr XkbDescRec) -> IO String getLayoutStr' st dpy kbdDescPtr = if st == 0 then -- Success do kbdDesc <- peek kbdDescPtr nameArray <- peek (names kbdDesc) atom <- xGetAtomName dpy (symbols nameArray) str <- peekCString atom return str else -- Behaviour on error do return "Error while requesting layout!" -- 'Bad' prefixes of layouts noLaySymbols :: [String] noLaySymbols = ["group", "inet", "ctr", "pc", "ctrl"] -- splits the layout string into the actual layouts splitLayout :: String -> [String] splitLayout s = splitLayout' noLaySymbols $ split s '+' splitLayout' :: [String] -> [String] -> [String] -- end of recursion, remove empty strings splitLayout' [] s = map (takeWhile (\x -> x /= ':')) $ filter (\x -> length x > 0) s -- remove current string if it has a 'bad' prefix splitLayout' bad s = splitLayout' (tail bad) [x | x <- s, not $ isPrefixOf (head bad) x] -- split String at each Char split :: String -> Char -> [String] split [] _ = [""] split (c:cs) delim | c == delim = "" : rest | otherwise = (c : head rest) : tail rest where rest = split cs delim -- replaces input string if on search list (exact match) with corresponding -- element on replacement list. -- -- if not found, return string unchanged searchReplaceLayout :: KbdOpts -> String -> String searchReplaceLayout opts s = let c = findIndex (\x -> fst x == s) opts in case c of Nothing -> s x -> let i = (fromJust x) in snd $ opts!!i -- returns the active layout getKbdLay :: Display -> KbdOpts -> IO String getKbdLay dpy opts = do lay <- getLayoutStr dpy curLay <- getKbdLayout dpy return $ searchReplaceLayout opts $ (splitLayout lay)!!(curLay) data Kbd = Kbd [(String, String)] deriving (Read, Show) instance Exec Kbd where alias (Kbd _) = "kbd" start (Kbd opts) cb = do dpy <- openDisplay "" -- initial set of layout cb =<< (getKbdLay dpy opts) -- enable listing for -- group changes _ <- xkbSelectEventDetails dpy xkbUseCoreKbd xkbStateNotify xkbAllStateComponentsMask xkbGroupStateMask -- layout/geometry changes _ <- xkbSelectEvents dpy xkbUseCoreKbd xkbNewKeyboardNotifyMask xkbNewKeyboardNotifyMask allocaXEvent $ \e -> forever $ do nextEvent' dpy e _ <- getEvent e cb =<< (getKbdLay dpy opts) closeDisplay dpy return () -- vim:ft=haskell:ts=4:shiftwidth=4:softtabstop=4:expandtab:foldlevel=20: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Locks.hs������������������������������������������������������������������0000664�0000000�0000000�00000003262�12513250503�0016703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Locks -- Copyright : (c) Patrick Chilton -- License : BSD-style (see LICENSE) -- -- Maintainer : Patrick Chilton <chpatrick@gmail.com> -- Stability : unstable -- Portability : unportable -- -- A plugin that displays the status of the lock keys. -- ----------------------------------------------------------------------------- module Plugins.Locks where import Graphics.X11 import Data.List import Data.Bits import Control.Monad import Graphics.X11.Xlib.Extras import Plugins import Plugins.Kbd import XUtil (nextEvent') data Locks = Locks deriving (Read, Show) locks :: [ ( KeySym, String )] locks = [ ( xK_Caps_Lock, "CAPS" ) , ( xK_Num_Lock, "NUM" ) , ( xK_Scroll_Lock, "SCROLL" ) ] run' :: Display -> Window -> IO String run' d root = do modMap <- getModifierMapping d ( _, _, _, _, _, _, _, m ) <- queryPointer d root ls <- filterM ( \( ks, _ ) -> do kc <- keysymToKeycode d ks return $ case find (elem kc . snd) modMap of Nothing -> False Just ( i, _ ) -> testBit m (fromIntegral i) ) locks return $ unwords $ map snd ls instance Exec Locks where alias Locks = "locks" start Locks cb = do d <- openDisplay "" root <- rootWindow d (defaultScreen d) _ <- xkbSelectEventDetails d xkbUseCoreKbd xkbIndicatorStateNotify m m allocaXEvent $ \ep -> forever $ do cb =<< run' d root nextEvent' d ep getEvent ep closeDisplay d return () where m = xkbAllStateComponentsMask ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/MBox.hs�������������������������������������������������������������������0000664�0000000�0000000�00000007477�12513250503�0016511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.MBox -- Copyright : (c) Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin for checking mail in mbox files. -- ----------------------------------------------------------------------------- module Plugins.MBox (MBox(..)) where import Prelude import Plugins #ifdef INOTIFY import Plugins.Utils (changeLoop, expandHome) import Control.Monad (when) import Control.Concurrent.STM import Control.Exception (SomeException (..), handle, evaluate) import System.Console.GetOpt import System.Directory (doesFileExist) import System.FilePath ((</>)) import System.INotify (Event(..), EventVariety(..), initINotify, addWatch) import qualified Data.ByteString.Lazy.Char8 as B data Options = Options { oAll :: Bool , oUniq :: Bool , oDir :: FilePath , oPrefix :: String , oSuffix :: String } defaults :: Options defaults = Options { oAll = False, oUniq = False, oDir = "", oPrefix = "", oSuffix = "" } options :: [OptDescr (Options -> Options)] options = [ Option "a" ["all"] (NoArg (\o -> o { oAll = True })) "" , Option "u" [] (NoArg (\o -> o { oUniq = True })) "" , Option "d" ["dir"] (ReqArg (\x o -> o { oDir = x }) "") "" , Option "p" ["prefix"] (ReqArg (\x o -> o { oPrefix = x }) "") "" , Option "s" ["suffix"] (ReqArg (\x o -> o { oSuffix = x }) "") "" ] parseOptions :: [String] -> IO Options parseOptions args = case getOpt Permute options args of (o, _, []) -> return $ foldr id defaults o (_, _, errs) -> ioError . userError $ concat errs #else import System.IO #endif -- | A list of display names, paths to mbox files and display colours, -- followed by a list of options. data MBox = MBox [(String, FilePath, String)] [String] String deriving (Read, Show) instance Exec MBox where alias (MBox _ _ a) = a #ifndef INOTIFY start _ _ = hPutStrLn stderr $ "Warning: xmobar is not compiled with -fwith_inotify" ++ " but the MBox plugin requires it" #else start (MBox boxes args _) cb = do opts <- parseOptions args let showAll = oAll opts prefix = oPrefix opts suffix = oSuffix opts uniq = oUniq opts names = map (\(t, _, _) -> t) boxes colors = map (\(_, _, c) -> c) boxes extractPath (_, f, _) = expandHome $ oDir opts </> f events = [CloseWrite] i <- initINotify vs <- mapM (\b -> do f <- extractPath b exists <- doesFileExist f n <- if exists then countMails f else return (-1) v <- newTVarIO (f, n) when exists $ addWatch i events f (handleNotification v) >> return () return v) boxes changeLoop (mapM (fmap snd . readTVar) vs) $ \ns -> let s = unwords [ showC uniq m n c | (m, n, c) <- zip3 names ns colors , showAll || n > 0 ] in cb (if null s then "" else prefix ++ s ++ suffix) showC :: Bool -> String -> Int -> String -> String showC u m n c = if c == "" then msg else "<fc=" ++ c ++ ">" ++ msg ++ "</fc>" where msg = m ++ if not u || n > 1 then show n else "" countMails :: FilePath -> IO Int countMails f = handle (\(SomeException _) -> evaluate 0) (do txt <- B.readFile f evaluate $! length . filter (B.isPrefixOf from) . B.lines $ txt) where from = B.pack "From " handleNotification :: TVar (FilePath, Int) -> Event -> IO () handleNotification v _ = do (p, _) <- atomically $ readTVar v n <- countMails p atomically $ writeTVar v (p, n) #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Mail.hs�������������������������������������������������������������������0000664�0000000�0000000�00000004206�12513250503�0016511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Mail -- Copyright : (c) Spencer Janssen -- License : BSD-style (see LICENSE) -- -- Maintainer : Spencer Janssen <sjanssen@cse.unl.edu> -- Stability : unstable -- Portability : unportable -- -- A plugin for checking mail. -- ----------------------------------------------------------------------------- module Plugins.Mail where import Plugins #ifdef INOTIFY import Plugins.Utils (expandHome, changeLoop) import Control.Monad import Control.Concurrent.STM import System.Directory import System.FilePath import System.INotify import Data.List (isPrefixOf) import Data.Set (Set) import qualified Data.Set as S #else import System.IO #endif -- | A list of mail box names and paths to maildirs. data Mail = Mail [(String, FilePath)] String deriving (Read, Show) instance Exec Mail where alias (Mail _ a) = a #ifndef INOTIFY start _ _ = hPutStrLn stderr $ "Warning: xmobar is not compiled with -fwith_inotify," ++ " but the Mail plugin requires it." #else start (Mail ms _) cb = do vs <- mapM (const $ newTVarIO S.empty) ms let ts = map fst ms rs = map ((</> "new") . snd) ms ev = [Move, MoveIn, MoveOut, Create, Delete] ds <- mapM expandHome rs i <- initINotify zipWithM_ (\d v -> addWatch i ev d (handle v)) ds vs forM_ (zip ds vs) $ \(d, v) -> do s <- fmap (S.fromList . filter (not . isPrefixOf ".")) $ getDirectoryContents d atomically $ modifyTVar v (S.union s) changeLoop (mapM (fmap S.size . readTVar) vs) $ \ns -> cb . unwords $ [m ++ show n | (m, n) <- zip ts ns , n /= 0 ] handle :: TVar (Set String) -> Event -> IO () handle v e = atomically $ modifyTVar v $ case e of Created {} -> create MovedIn {} -> create Deleted {} -> delete MovedOut {} -> delete _ -> id where delete = S.delete (filePath e) create = S.insert (filePath e) #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/MarqueePipeReader.hs������������������������������������������������������0000664�0000000�0000000�00000005166�12513250503�0021175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.MarqueePipeReader -- Copyright : (c) Reto Habluetzel -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin for reading from named pipes for long texts with marquee -- ----------------------------------------------------------------------------- module Plugins.MarqueePipeReader where import System.IO (openFile, IOMode(ReadWriteMode), Handle) import Plugins (tenthSeconds, Exec(alias, start), hGetLineSafe) import System.Posix.Files (getFileStatus, isNamedPipe) import Control.Concurrent(forkIO, threadDelay) import Control.Concurrent.STM (TChan, atomically, writeTChan, tryReadTChan, newTChan) import Control.Exception import Control.Monad(forever, unless) type Length = Int -- length of the text to display type Rate = Int -- delay in tenth seconds type Separator = String -- if text wraps around, use separator data MarqueePipeReader = MarqueePipeReader String (Length, Rate, Separator) String deriving (Read, Show) instance Exec MarqueePipeReader where alias (MarqueePipeReader _ _ a) = a start (MarqueePipeReader p (len, rate, sep) _) cb = do let (def, pipe) = split ':' p unless (null def) (cb def) checkPipe pipe h <- openFile pipe ReadWriteMode line <- hGetLineSafe h chan <- atomically newTChan forkIO $ writer (toInfTxt line sep) sep len rate chan cb forever $ pipeToChan h chan where split c xs | c `elem` xs = let (pre, post) = span (c /=) xs in (pre, dropWhile (c ==) post) | otherwise = ([], xs) pipeToChan :: Handle -> TChan String -> IO () pipeToChan h chan = do line <- hGetLineSafe h atomically $ writeTChan chan line writer :: String -> Separator -> Length -> Rate -> TChan String -> (String -> IO ()) -> IO () writer txt sep len rate chan cb = do cb (take len txt) mbnext <- atomically $ tryReadTChan chan case mbnext of Just new -> writer (toInfTxt new sep) sep len rate chan cb Nothing -> tenthSeconds rate >> writer (drop 1 txt) sep len rate chan cb toInfTxt :: String -> String -> String toInfTxt line sep = concat (repeat $ line ++ " " ++ sep ++ " ") checkPipe :: FilePath -> IO () checkPipe file = handle (\(SomeException _) -> waitForPipe) $ do status <- getFileStatus file unless (isNamedPipe status) waitForPipe where waitForPipe = threadDelay 1000 >> checkPipe file ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors.hs���������������������������������������������������������������0000664�0000000�0000000�00000013145�12513250503�0017443�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar.Plugins.Monitors -- Copyright : (c) 2010, 2011, 2012, 2013 Jose Antonio Ortega Ruiz -- (c) 2007-10 Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- The system monitor plugin for Xmobar. -- ----------------------------------------------------------------------------- module Plugins.Monitors where import Plugins import Plugins.Monitors.Common (runM, runMD) import Plugins.Monitors.Weather import Plugins.Monitors.Net import Plugins.Monitors.Mem import Plugins.Monitors.Swap import Plugins.Monitors.Cpu import Plugins.Monitors.MultiCpu import Plugins.Monitors.Batt import Plugins.Monitors.Bright import Plugins.Monitors.Thermal import Plugins.Monitors.ThermalZone import Plugins.Monitors.CpuFreq import Plugins.Monitors.CoreTemp import Plugins.Monitors.Disk import Plugins.Monitors.Top import Plugins.Monitors.Uptime import Plugins.Monitors.CatInt #ifdef IWLIB import Plugins.Monitors.Wireless #endif #ifdef LIBMPD import Plugins.Monitors.MPD import Plugins.Monitors.Common (runMBD) #endif #ifdef ALSA import Plugins.Monitors.Volume #endif #ifdef MPRIS import Plugins.Monitors.Mpris #endif data Monitors = Weather Station Args Rate | Network Interface Args Rate | DynNetwork Args Rate | BatteryP Args Args Rate | BatteryN Args Args Rate Alias | Battery Args Rate | DiskU DiskSpec Args Rate | DiskIO DiskSpec Args Rate | Thermal Zone Args Rate | ThermalZone ZoneNo Args Rate | Memory Args Rate | Swap Args Rate | Cpu Args Rate | MultiCpu Args Rate | Brightness Args Rate | CpuFreq Args Rate | CoreTemp Args Rate | TopProc Args Rate | TopMem Args Rate | Uptime Args Rate | CatInt Int FilePath Args Rate #ifdef IWLIB | Wireless Interface Args Rate #endif #ifdef LIBMPD | MPD Args Rate | AutoMPD Args #endif #ifdef ALSA | Volume String String Args Rate #endif #ifdef MPRIS | Mpris1 String Args Rate | Mpris2 String Args Rate #endif deriving (Show,Read,Eq) type Args = [String] type Program = String type Alias = String type Station = String type Zone = String type ZoneNo = Int type Interface = String type Rate = Int type DiskSpec = [(String, String)] instance Exec Monitors where alias (Weather s _ _) = s alias (Network i _ _) = i alias (DynNetwork _ _) = "dynnetwork" alias (Thermal z _ _) = z alias (ThermalZone z _ _) = "thermal" ++ show z alias (Memory _ _) = "memory" alias (Swap _ _) = "swap" alias (Cpu _ _) = "cpu" alias (MultiCpu _ _) = "multicpu" alias (Battery _ _) = "battery" alias (BatteryP {})= "battery" alias (BatteryN _ _ _ a)= a alias (Brightness _ _) = "bright" alias (CpuFreq _ _) = "cpufreq" alias (TopProc _ _) = "top" alias (TopMem _ _) = "topmem" alias (CoreTemp _ _) = "coretemp" alias (DiskU {}) = "disku" alias (DiskIO {}) = "diskio" alias (Uptime _ _) = "uptime" alias (CatInt n _ _ _) = "cat" ++ show n #ifdef IWLIB alias (Wireless i _ _) = i ++ "wi" #endif #ifdef LIBMPD alias (MPD _ _) = "mpd" alias (AutoMPD _) = "autompd" #endif #ifdef ALSA alias (Volume m c _ _) = m ++ ":" ++ c #endif #ifdef MPRIS alias (Mpris1 _ _ _) = "mpris1" alias (Mpris2 _ _ _) = "mpris2" #endif start (Network i a r) = startNet i a r start (DynNetwork a r) = startDynNet a r start (Cpu a r) = startCpu a r start (MultiCpu a r) = startMultiCpu a r start (TopProc a r) = startTop a r start (TopMem a r) = runM a topMemConfig runTopMem r start (Weather s a r) = runMD (a ++ [s]) weatherConfig runWeather r weatherReady start (Thermal z a r) = runM (a ++ [z]) thermalConfig runThermal r start (ThermalZone z a r) = runM (a ++ [show z]) thermalZoneConfig runThermalZone r start (Memory a r) = runM a memConfig runMem r start (Swap a r) = runM a swapConfig runSwap r start (Battery a r) = runM a battConfig runBatt r start (BatteryP s a r) = runM a battConfig (runBatt' s) r start (BatteryN s a r _) = runM a battConfig (runBatt' s) r start (Brightness a r) = runM a brightConfig runBright r start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r start (CoreTemp a r) = runM a coreTempConfig runCoreTemp r start (DiskU s a r) = runM a diskUConfig (runDiskU s) r start (DiskIO s a r) = startDiskIO s a r start (Uptime a r) = runM a uptimeConfig runUptime r start (CatInt _ s a r) = runM a catIntConfig (runCatInt s) r #ifdef IWLIB start (Wireless i a r) = runM a wirelessConfig (runWireless i) r #endif #ifdef LIBMPD start (MPD a r) = runMD a mpdConfig runMPD r mpdReady start (AutoMPD a) = runMBD a mpdConfig runMPD mpdWait mpdReady #endif #ifdef ALSA start (Volume m c a r) = runM a volumeConfig (runVolume m c) r #endif #ifdef MPRIS start (Mpris1 s a r) = runM a mprisConfig (runMPRIS1 s) r start (Mpris2 s a r) = runM a mprisConfig (runMPRIS2 s) r #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/�����������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0017103�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Batt.hs����������������������������������������������������������0000664�0000000�0000000�00000020173�12513250503�0020334�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Batt -- Copyright : (c) 2010, 2011, 2012, 2013 Jose A Ortega -- (c) 2010 Andrea Rossato, Petr Rockai -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A battery monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Batt ( battConfig, runBatt, runBatt' ) where import Control.Exception (SomeException, handle) import Plugins.Monitors.Common import System.FilePath ((</>)) import System.IO (IOMode(ReadMode), hGetLine, withFile) import System.Posix.Files (fileExist) import System.Console.GetOpt data BattOpts = BattOpts { onString :: String , offString :: String , idleString :: String , posColor :: Maybe String , lowWColor :: Maybe String , mediumWColor :: Maybe String , highWColor :: Maybe String , lowThreshold :: Float , highThreshold :: Float , onlineFile :: FilePath , scale :: Float , onIconPattern :: Maybe IconPattern , offIconPattern :: Maybe IconPattern , idleIconPattern :: Maybe IconPattern } defaultOpts :: BattOpts defaultOpts = BattOpts { onString = "On" , offString = "Off" , idleString = "On" , posColor = Nothing , lowWColor = Nothing , mediumWColor = Nothing , highWColor = Nothing , lowThreshold = -12 , highThreshold = -10 , onlineFile = "AC/online" , scale = 1e6 , onIconPattern = Nothing , offIconPattern = Nothing , idleIconPattern = Nothing } options :: [OptDescr (BattOpts -> BattOpts)] options = [ Option "O" ["on"] (ReqArg (\x o -> o { onString = x }) "") "" , Option "o" ["off"] (ReqArg (\x o -> o { offString = x }) "") "" , Option "i" ["idle"] (ReqArg (\x o -> o { idleString = x }) "") "" , Option "p" ["positive"] (ReqArg (\x o -> o { posColor = Just x }) "") "" , Option "l" ["low"] (ReqArg (\x o -> o { lowWColor = Just x }) "") "" , Option "m" ["medium"] (ReqArg (\x o -> o { mediumWColor = Just x }) "") "" , Option "h" ["high"] (ReqArg (\x o -> o { highWColor = Just x }) "") "" , Option "L" ["lowt"] (ReqArg (\x o -> o { lowThreshold = read x }) "") "" , Option "H" ["hight"] (ReqArg (\x o -> o { highThreshold = read x }) "") "" , Option "f" ["online"] (ReqArg (\x o -> o { onlineFile = x }) "") "" , Option "s" ["scale"] (ReqArg (\x o -> o {scale = read x}) "") "" , Option "" ["on-icon-pattern"] (ReqArg (\x o -> o { onIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["off-icon-pattern"] (ReqArg (\x o -> o { offIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["idle-icon-pattern"] (ReqArg (\x o -> o { idleIconPattern = Just $ parseIconPattern x }) "") "" ] parseOpts :: [String] -> IO BattOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs data Status = Charging | Discharging | Idle data Result = Result Float Float Float Status | NA sysDir :: FilePath sysDir = "/sys/class/power_supply" battConfig :: IO MConfig battConfig = mkMConfig "Batt: <watts>, <left>% / <timeleft>" -- template ["leftbar", "leftvbar", "left", "acstatus", "timeleft", "watts", "leftipat"] -- replacements data Files = Files { fFull :: String , fNow :: String , fVoltage :: String , fCurrent :: String , isCurrent :: Bool } | NoFiles data Battery = Battery { full :: !Float , now :: !Float , power :: !Float } safeFileExist :: String -> String -> IO Bool safeFileExist d f = handle noErrors $ fileExist (d </> f) where noErrors = const (return False) :: SomeException -> IO Bool batteryFiles :: String -> IO Files batteryFiles bat = do is_charge <- exists "charge_now" is_energy <- if is_charge then return False else exists "energy_now" is_power <- exists "power_now" plain <- exists (if is_charge then "charge_full" else "energy_full") let cf = if is_power then "power_now" else "current_now" sf = if plain then "" else "_design" return $ case (is_charge, is_energy) of (True, _) -> files "charge" cf sf is_power (_, True) -> files "energy" cf sf is_power _ -> NoFiles where prefix = sysDir </> bat exists = safeFileExist prefix files ch cf sf ip = Files { fFull = prefix </> ch ++ "_full" ++ sf , fNow = prefix </> ch ++ "_now" , fCurrent = prefix </> cf , fVoltage = prefix </> "voltage_now" , isCurrent = not ip} haveAc :: FilePath -> IO Bool haveAc f = handle onError $ withFile (sysDir </> f) ReadMode (fmap (== "1") . hGetLine) where onError = const (return False) :: SomeException -> IO Bool readBattery :: Float -> Files -> IO Battery readBattery _ NoFiles = return $ Battery 0 0 0 readBattery sc files = do a <- grab $ fFull files b <- grab $ fNow files d <- grab $ fCurrent files let sc' = if isCurrent files then sc / 10 else sc return $ Battery (3600 * a / sc') -- wattseconds (3600 * b / sc') -- wattseconds (d / sc') -- watts where grab f = handle onError $ withFile f ReadMode (fmap read . hGetLine) onError = const (return (-1)) :: SomeException -> IO Float readBatteries :: BattOpts -> [Files] -> IO Result readBatteries opts bfs = do bats <- mapM (readBattery (scale opts)) (take 3 bfs) ac <- haveAc (onlineFile opts) let sign = if ac then 1 else -1 ft = sum (map full bats) left = if ft > 0 then sum (map now bats) / ft else 0 watts = sign * sum (map power bats) idle = watts == 0 time = if idle then 0 else sum $ map time' bats mwatts = if idle then 1 else sign * watts time' b = (if ac then full b - now b else now b) / mwatts acst | idle = Idle | ac = Charging | otherwise = Discharging return $ if isNaN left then NA else Result left watts time acst runBatt :: [String] -> Monitor String runBatt = runBatt' ["BAT0","BAT1","BAT2"] runBatt' :: [String] -> [String] -> Monitor String runBatt' bfs args = do opts <- io $ parseOpts args c <- io $ readBatteries opts =<< mapM batteryFiles bfs suffix <- getConfigValue useSuffix d <- getConfigValue decDigits case c of Result x w t s -> do l <- fmtPercent x ws <- fmtWatts w opts suffix d si <- getIconPattern opts s x parseTemplate (l ++ [fmtStatus opts s, fmtTime $ floor t, ws, si]) NA -> getConfigValue naString where fmtPercent :: Float -> Monitor [String] fmtPercent x = do let x' = minimum [1, x] p <- showPercentWithColors x' b <- showPercentBar (100 * x') x' vb <- showVerticalBar (100 * x') x' return [b, vb, p] fmtWatts x o s d = do ws <- showWithPadding $ showDigits d x ++ (if s then "W" else "") return $ color x o ws fmtTime :: Integer -> String fmtTime x = hours ++ ":" ++ if length minutes == 2 then minutes else '0' : minutes where hours = show (x `div` 3600) minutes = show ((x `mod` 3600) `div` 60) fmtStatus opts Idle = idleString opts fmtStatus opts Charging = onString opts fmtStatus opts Discharging = offString opts maybeColor Nothing str = str maybeColor (Just c) str = "<fc=" ++ c ++ ">" ++ str ++ "</fc>" color x o | x >= 0 = maybeColor (posColor o) | -x >= highThreshold o = maybeColor (highWColor o) | -x >= lowThreshold o = maybeColor (mediumWColor o) | otherwise = maybeColor (lowWColor o) getIconPattern opts status x = do let x' = minimum [1, x] case status of Idle -> showIconPattern (idleIconPattern opts) x' Charging -> showIconPattern (onIconPattern opts) x' Discharging -> showIconPattern (offIconPattern opts) x' �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Bright.hs��������������������������������������������������������0000664�0000000�0000000�00000007002�12513250503�0020655�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- ---- | ---- Module : Plugins.Monitors.Birght ---- Copyright : (c) Martin Perner ---- License : BSD-style (see LICENSE) ---- ---- Maintainer : Martin Perner <martin@perner.cc> ---- Stability : unstable ---- Portability : unportable ---- ---- A screen brightness monitor for Xmobar ---- ------------------------------------------------------------------------------- module Plugins.Monitors.Bright (brightConfig, runBright) where import Control.Applicative ((<$>)) import Control.Exception (SomeException, handle) import qualified Data.ByteString.Lazy.Char8 as B import System.FilePath ((</>)) import System.Posix.Files (fileExist) import System.Console.GetOpt import Plugins.Monitors.Common data BrightOpts = BrightOpts { subDir :: String , currBright :: String , maxBright :: String , curBrightIconPattern :: Maybe IconPattern } defaultOpts :: BrightOpts defaultOpts = BrightOpts { subDir = "acpi_video0" , currBright = "actual_brightness" , maxBright = "max_brightness" , curBrightIconPattern = Nothing } options :: [OptDescr (BrightOpts -> BrightOpts)] options = [ Option "D" ["device"] (ReqArg (\x o -> o { subDir = x }) "") "" , Option "C" ["curr"] (ReqArg (\x o -> o { currBright = x }) "") "" , Option "M" ["max"] (ReqArg (\x o -> o { maxBright = x }) "") "" , Option "" ["brightness-icon-pattern"] (ReqArg (\x o -> o { curBrightIconPattern = Just $ parseIconPattern x }) "") "" ] -- from Batt.hs parseOpts :: [String] -> IO BrightOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs sysDir :: FilePath sysDir = "/sys/class/backlight/" brightConfig :: IO MConfig brightConfig = mkMConfig "<percent>" -- template ["vbar", "percent", "bar", "ipat"] -- replacements data Files = Files { fCurr :: String , fMax :: String } | NoFiles brightFiles :: BrightOpts -> IO Files brightFiles opts = do is_curr <- fileExist $ fCurr files is_max <- fileExist $ fCurr files return (if is_curr && is_max then files else NoFiles) where prefix = sysDir </> subDir opts files = Files { fCurr = prefix </> currBright opts , fMax = prefix </> maxBright opts } runBright :: [String] -> Monitor String runBright args = do opts <- io $ parseOpts args f <- io $ brightFiles opts c <- io $ readBright f case f of NoFiles -> return "hurz" _ -> fmtPercent opts c >>= parseTemplate where fmtPercent :: BrightOpts -> Float -> Monitor [String] fmtPercent opts c = do r <- showVerticalBar (100 * c) c s <- showPercentWithColors c t <- showPercentBar (100 * c) c d <- showIconPattern (curBrightIconPattern opts) c return [r,s,t,d] readBright :: Files -> IO Float readBright NoFiles = return 0 readBright files = do currVal<- grab $ fCurr files maxVal <- grab $ fMax files return (currVal / maxVal) where grab f = handle handler (read . B.unpack <$> B.readFile f) handler = const (return 0) :: SomeException -> IO Float ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/CatInt.hs��������������������������������������������������������0000664�0000000�0000000�00000001423�12513250503�0020621�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.CatInt -- Copyright : (c) Nathaniel Wesley Filardo -- License : BSD-style (see LICENSE) -- -- Maintainer : Nathaniel Wesley Filardo -- Stability : unstable -- Portability : unportable -- ----------------------------------------------------------------------------- module Plugins.Monitors.CatInt where import Plugins.Monitors.Common import Plugins.Monitors.CoreCommon catIntConfig :: IO MConfig catIntConfig = mkMConfig "<v>" ["v"] runCatInt :: FilePath -> [String] -> Monitor String runCatInt p _ = let failureMessage = "Cannot read: " ++ show p fmt x = show (truncate x :: Int) in checkedDataRetrieval failureMessage [[p]] Nothing id fmt ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Common.hs��������������������������������������������������������0000664�0000000�0000000�00000044032�12513250503�0020672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Common -- Copyright : (c) 2010, 2011, 2013 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Utilities used by xmobar's monitors -- ----------------------------------------------------------------------------- module Plugins.Monitors.Common ( -- * Monitors -- $monitor Monitor , MConfig (..) , Opts (..) , setConfigValue , getConfigValue , mkMConfig , runM , runMD , runMB , runMBD , io -- * Parsers -- $parsers , runP , skipRestOfLine , getNumbers , getNumbersAsString , getAllBut , getAfterString , skipTillString , parseTemplate , parseTemplate' -- ** String Manipulation -- $strings , IconPattern , parseIconPattern , padString , showWithPadding , showWithColors , showWithColors' , showPercentWithColors , showPercentsWithColors , showPercentBar , showVerticalBar , showIconPattern , showLogBar , showLogVBar , showLogIconPattern , showWithUnits , takeDigits , showDigits , floatToPercent , parseFloat , parseInt , stringParser ) where import Control.Applicative ((<$>)) import Control.Monad.Reader import qualified Data.ByteString.Lazy.Char8 as B import Data.IORef import qualified Data.Map as Map import Data.List import Data.Char import Numeric import Text.ParserCombinators.Parsec import System.Console.GetOpt import Control.Exception (SomeException,handle) import Plugins -- $monitor type Monitor a = ReaderT MConfig IO a data MConfig = MC { normalColor :: IORef (Maybe String) , low :: IORef Int , lowColor :: IORef (Maybe String) , high :: IORef Int , highColor :: IORef (Maybe String) , template :: IORef String , export :: IORef [String] , ppad :: IORef Int , decDigits :: IORef Int , minWidth :: IORef Int , maxWidth :: IORef Int , padChars :: IORef String , padRight :: IORef Bool , barBack :: IORef String , barFore :: IORef String , barWidth :: IORef Int , useSuffix :: IORef Bool , naString :: IORef String } -- | from 'http:\/\/www.haskell.org\/hawiki\/MonadState' type Selector a = MConfig -> IORef a sel :: Selector a -> Monitor a sel s = do hs <- ask liftIO $ readIORef (s hs) mods :: Selector a -> (a -> a) -> Monitor () mods s m = do v <- ask io $ modifyIORef (s v) m setConfigValue :: a -> Selector a -> Monitor () setConfigValue v s = mods s (const v) getConfigValue :: Selector a -> Monitor a getConfigValue = sel mkMConfig :: String -> [String] -> IO MConfig mkMConfig tmpl exprts = do lc <- newIORef Nothing l <- newIORef 33 nc <- newIORef Nothing h <- newIORef 66 hc <- newIORef Nothing t <- newIORef tmpl e <- newIORef exprts p <- newIORef 0 d <- newIORef 0 mn <- newIORef 0 mx <- newIORef 0 pc <- newIORef " " pr <- newIORef False bb <- newIORef ":" bf <- newIORef "#" bw <- newIORef 10 up <- newIORef False na <- newIORef "N/A" return $ MC nc l lc h hc t e p d mn mx pc pr bb bf bw up na data Opts = HighColor String | NormalColor String | LowColor String | Low String | High String | Template String | PercentPad String | DecDigits String | MinWidth String | MaxWidth String | Width String | PadChars String | PadAlign String | BarBack String | BarFore String | BarWidth String | UseSuffix String | NAString String options :: [OptDescr Opts] options = [ Option "H" ["High"] (ReqArg High "number") "The high threshold" , Option "L" ["Low"] (ReqArg Low "number") "The low threshold" , Option "h" ["high"] (ReqArg HighColor "color number") "Color for the high threshold: ex \"#FF0000\"" , Option "n" ["normal"] (ReqArg NormalColor "color number") "Color for the normal threshold: ex \"#00FF00\"" , Option "l" ["low"] (ReqArg LowColor "color number") "Color for the low threshold: ex \"#0000FF\"" , Option "t" ["template"] (ReqArg Template "output template") "Output template." , Option "S" ["suffix"] (ReqArg UseSuffix "True/False") "Use % to display percents or other suffixes." , Option "d" ["ddigits"] (ReqArg DecDigits "decimal digits") "Number of decimal digits to display." , Option "p" ["ppad"] (ReqArg PercentPad "percent padding") "Minimum percentage width." , Option "m" ["minwidth"] (ReqArg MinWidth "minimum width") "Minimum field width" , Option "M" ["maxwidth"] (ReqArg MaxWidth "maximum width") "Maximum field width" , Option "w" ["width"] (ReqArg Width "fixed width") "Fixed field width" , Option "c" ["padchars"] (ReqArg PadChars "padding chars") "Characters to use for padding" , Option "a" ["align"] (ReqArg PadAlign "padding alignment") "'l' for left padding, 'r' for right" , Option "b" ["bback"] (ReqArg BarBack "bar background") "Characters used to draw bar backgrounds" , Option "f" ["bfore"] (ReqArg BarFore "bar foreground") "Characters used to draw bar foregrounds" , Option "W" ["bwidth"] (ReqArg BarWidth "bar width") "Bar width" , Option "x" ["nastring"] (ReqArg NAString "N/A string") "String used when the monitor is not available" ] doArgs :: [String] -> ([String] -> Monitor String) -> ([String] -> Monitor Bool) -> Monitor String doArgs args action detect = case getOpt Permute options args of (o, n, []) -> do doConfigOptions o ready <- detect n if ready then action n else return "<Waiting...>" (_, _, errs) -> return (concat errs) doConfigOptions :: [Opts] -> Monitor () doConfigOptions [] = io $ return () doConfigOptions (o:oo) = do let next = doConfigOptions oo nz s = let x = read s in max 0 x bool = (`elem` ["True", "true", "Yes", "yes", "On", "on"]) (case o of High h -> setConfigValue (read h) high Low l -> setConfigValue (read l) low HighColor c -> setConfigValue (Just c) highColor NormalColor c -> setConfigValue (Just c) normalColor LowColor c -> setConfigValue (Just c) lowColor Template t -> setConfigValue t template PercentPad p -> setConfigValue (nz p) ppad DecDigits d -> setConfigValue (nz d) decDigits MinWidth w -> setConfigValue (nz w) minWidth MaxWidth w -> setConfigValue (nz w) maxWidth Width w -> setConfigValue (nz w) minWidth >> setConfigValue (nz w) maxWidth PadChars s -> setConfigValue s padChars PadAlign a -> setConfigValue ("r" `isPrefixOf` a) padRight BarBack s -> setConfigValue s barBack BarFore s -> setConfigValue s barFore BarWidth w -> setConfigValue (nz w) barWidth UseSuffix u -> setConfigValue (bool u) useSuffix NAString s -> setConfigValue s naString) >> next runM :: [String] -> IO MConfig -> ([String] -> Monitor String) -> Int -> (String -> IO ()) -> IO () runM args conf action r = runMB args conf action (tenthSeconds r) runMD :: [String] -> IO MConfig -> ([String] -> Monitor String) -> Int -> ([String] -> Monitor Bool) -> (String -> IO ()) -> IO () runMD args conf action r = runMBD args conf action (tenthSeconds r) runMB :: [String] -> IO MConfig -> ([String] -> Monitor String) -> IO () -> (String -> IO ()) -> IO () runMB args conf action wait = runMBD args conf action wait (\_ -> return True) runMBD :: [String] -> IO MConfig -> ([String] -> Monitor String) -> IO () -> ([String] -> Monitor Bool) -> (String -> IO ()) -> IO () runMBD args conf action wait detect cb = handle (cb . showException) loop where ac = doArgs args action detect loop = conf >>= runReaderT ac >>= cb >> wait >> loop showException :: SomeException -> String showException = ("error: "++) . show . flip asTypeOf undefined io :: IO a -> Monitor a io = liftIO -- $parsers runP :: Parser [a] -> String -> IO [a] runP p i = case parse p "" i of Left _ -> return [] Right x -> return x getAllBut :: String -> Parser String getAllBut s = manyTill (noneOf s) (char $ head s) getNumbers :: Parser Float getNumbers = skipMany space >> many1 digit >>= \n -> return $ read n getNumbersAsString :: Parser String getNumbersAsString = skipMany space >> many1 digit >>= \n -> return n skipRestOfLine :: Parser Char skipRestOfLine = do many $ noneOf "\n\r" newline getAfterString :: String -> Parser String getAfterString s = do { try $ manyTill skipRestOfLine $ string s ; manyTill anyChar newline } <|> return "" skipTillString :: String -> Parser String skipTillString s = manyTill skipRestOfLine $ string s -- | Parses the output template string templateStringParser :: Parser (String,String,String) templateStringParser = do { s <- nonPlaceHolder ; com <- templateCommandParser ; ss <- nonPlaceHolder ; return (s, com, ss) } where nonPlaceHolder = liftM concat . many $ many1 (noneOf "<") <|> colorSpec <|> iconSpec -- | Recognizes color specification and returns it unchanged colorSpec :: Parser String colorSpec = try (string "</fc>") <|> try ( do string "<fc=" s <- many1 (alphaNum <|> char ',' <|> char '#') char '>' return $ "<fc=" ++ s ++ ">") -- | Recognizes icon specification and returns it unchanged iconSpec :: Parser String iconSpec = try (do string "<icon=" i <- manyTill (noneOf ">") (try (string "/>")) return $ "<icon=" ++ i ++ "/>") -- | Parses the command part of the template string templateCommandParser :: Parser String templateCommandParser = do { char '<' ; com <- many $ noneOf ">" ; char '>' ; return com } -- | Combines the template parsers templateParser :: Parser [(String,String,String)] templateParser = many templateStringParser --"%") -- | Takes a list of strings that represent the values of the exported -- keys. The strings are joined with the exported keys to form a map -- to be combined with 'combine' to the parsed template. Returns the -- final output of the monitor. parseTemplate :: [String] -> Monitor String parseTemplate l = do t <- getConfigValue template e <- getConfigValue export let m = Map.fromList . zip e $ l parseTemplate' t m -- | Parses the template given to it with a map of export values and combines -- them parseTemplate' :: String -> Map.Map String String -> Monitor String parseTemplate' t m = do s <- io $ runP templateParser t combine m s -- | Given a finite "Map" and a parsed template t produces the -- | resulting output string as the output of the monitor. combine :: Map.Map String String -> [(String, String, String)] -> Monitor String combine _ [] = return [] combine m ((s,ts,ss):xs) = do next <- combine m xs str <- case Map.lookup ts m of Nothing -> return $ "<" ++ ts ++ ">" Just r -> let f "" = r; f n = n; in f <$> parseTemplate' r m return $ s ++ str ++ ss ++ next -- $strings type IconPattern = Int -> String parseIconPattern :: String -> IconPattern parseIconPattern path = let spl = splitOnPercent path in \i -> concat $ intersperse (show i) spl where splitOnPercent [] = [[]] splitOnPercent ('%':'%':xs) = [] : splitOnPercent xs splitOnPercent (x:xs) = let rest = splitOnPercent xs in (x : head rest) : tail rest type Pos = (Int, Int) takeDigits :: Int -> Float -> Float takeDigits d n = fromIntegral (round (n * fact) :: Int) / fact where fact = 10 ^ d showDigits :: (RealFloat a) => Int -> a -> String showDigits d n = showFFloat (Just d) n "" showWithUnits :: Int -> Int -> Float -> String showWithUnits d n x | x < 0 = '-' : showWithUnits d n (-x) | n > 3 || x < 10^(d + 1) = show (round x :: Int) ++ units n | x <= 1024 = showDigits d (x/1024) ++ units (n+1) | otherwise = showWithUnits d (n+1) (x/1024) where units = (!!) ["B", "K", "M", "G", "T"] padString :: Int -> Int -> String -> Bool -> String -> String padString mnw mxw pad pr s = let len = length s rmin = if mnw <= 0 then 1 else mnw rmax = if mxw <= 0 then max len rmin else mxw (rmn, rmx) = if rmin <= rmax then (rmin, rmax) else (rmax, rmin) rlen = min (max rmn len) rmx in if rlen < len then take rlen s else let ps = take (rlen - len) (cycle pad) in if pr then s ++ ps else ps ++ s parseFloat :: String -> Float parseFloat s = case readFloat s of (v, _):_ -> v _ -> 0 parseInt :: String -> Int parseInt s = case readDec s of (v, _):_ -> v _ -> 0 floatToPercent :: Float -> Monitor String floatToPercent n = do pad <- getConfigValue ppad pc <- getConfigValue padChars pr <- getConfigValue padRight up <- getConfigValue useSuffix let p = showDigits 0 (n * 100) ps = if up then "%" else "" return $ padString pad pad pc pr p ++ ps stringParser :: Pos -> B.ByteString -> String stringParser (x,y) = B.unpack . li x . B.words . li y . B.lines where li i l | length l > i = l !! i | otherwise = B.empty setColor :: String -> Selector (Maybe String) -> Monitor String setColor str s = do a <- getConfigValue s case a of Nothing -> return str Just c -> return $ "<fc=" ++ c ++ ">" ++ str ++ "</fc>" showWithPadding :: String -> Monitor String showWithPadding s = do mn <- getConfigValue minWidth mx <- getConfigValue maxWidth p <- getConfigValue padChars pr <- getConfigValue padRight return $ padString mn mx p pr s colorizeString :: (Num a, Ord a) => a -> String -> Monitor String colorizeString x s = do h <- getConfigValue high l <- getConfigValue low let col = setColor s [ll,hh] = map fromIntegral $ sort [l, h] -- consider high < low head $ [col highColor | x > hh ] ++ [col normalColor | x > ll ] ++ [col lowColor | True] showWithColors :: (Num a, Ord a) => (a -> String) -> a -> Monitor String showWithColors f x = showWithPadding (f x) >>= colorizeString x showWithColors' :: (Num a, Ord a) => String -> a -> Monitor String showWithColors' str = showWithColors (const str) showPercentsWithColors :: [Float] -> Monitor [String] showPercentsWithColors fs = do fstrs <- mapM floatToPercent fs zipWithM (showWithColors . const) fstrs (map (*100) fs) showPercentWithColors :: Float -> Monitor String showPercentWithColors f = liftM head $ showPercentsWithColors [f] showPercentBar :: Float -> Float -> Monitor String showPercentBar v x = do bb <- getConfigValue barBack bf <- getConfigValue barFore bw <- getConfigValue barWidth let len = min bw $ round (fromIntegral bw * x) s <- colorizeString v (take len $ cycle bf) return $ s ++ take (bw - len) (cycle bb) showIconPattern :: Maybe IconPattern -> Float -> Monitor String showIconPattern Nothing _ = return "" showIconPattern (Just str) x = return $ str $ convert $ 100 * x where convert val | t <= 0 = 0 | t > 8 = 8 | otherwise = t where t = round val `div` 12 showVerticalBar :: Float -> Float -> Monitor String showVerticalBar v x = colorizeString v [convert $ 100 * x] where convert :: Float -> Char convert val | t <= 9600 = ' ' | t > 9608 = chr 9608 | otherwise = chr t where t = 9600 + (round val `div` 12) showLogBar :: Float -> Float -> Monitor String showLogBar f v = let intConfig c = fromIntegral `fmap` getConfigValue c in do h <- intConfig high l <- intConfig low bw <- intConfig barWidth let [ll, hh] = sort [l, h] choose x | x == 0.0 = 0 | x <= ll = 1 / bw | otherwise = f + logBase 2 (x / hh) / bw showPercentBar v $ choose v showLogVBar :: Float -> Float -> Monitor String showLogVBar f v = do h <- fromIntegral `fmap` getConfigValue high l <- fromIntegral `fmap` getConfigValue low bw <- fromIntegral `fmap` getConfigValue barWidth let [ll, hh] = sort [l, h] choose x | x == 0.0 = 0 | x <= ll = 1 / bw | otherwise = f + logBase 2 (x / hh) / bw showVerticalBar v $ choose v showLogIconPattern :: Maybe IconPattern -> Float -> Float -> Monitor String showLogIconPattern str f v = do h <- fromIntegral `fmap` getConfigValue high l <- fromIntegral `fmap` getConfigValue low bw <- fromIntegral `fmap` getConfigValue barWidth let [ll, hh] = sort [l, h] choose x | x == 0.0 = 0 | x <= ll = 1 / bw | otherwise = f + logBase 2 (x / hh) / bw showIconPattern str $ choose v ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/CoreCommon.hs����������������������������������������������������0000664�0000000�0000000�00000013311�12513250503�0021477�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE PatternGuards #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.CoreCommon -- Copyright : (c) Juraj Hercek -- License : BSD-style (see LICENSE) -- -- Maintainer : Juraj Hercek <juhe_haskell@hck.sk> -- Stability : unstable -- Portability : unportable -- -- The common part for cpu core monitors (e.g. cpufreq, coretemp) -- ----------------------------------------------------------------------------- module Plugins.Monitors.CoreCommon where import Control.Applicative import Control.Monad import Data.Char hiding (Space) import Data.Function import Data.List import Data.Maybe import Plugins.Monitors.Common import System.Directory checkedDataRetrieval :: (Ord a, Num a) => String -> [[String]] -> Maybe (String, String -> Int) -> (Double -> a) -> (a -> String) -> Monitor String checkedDataRetrieval msg paths lbl trans fmt = liftM (fromMaybe msg . listToMaybe . catMaybes) $ mapM (\p -> retrieveData p lbl trans fmt) paths retrieveData :: (Ord a, Num a) => [String] -> Maybe (String, String -> Int) -> (Double -> a) -> (a -> String) -> Monitor (Maybe String) retrieveData path lbl trans fmt = do pairs <- map snd . sortBy (compare `on` fst) <$> (mapM readFiles =<< findFilesAndLabel path lbl) if null pairs then return Nothing else Just <$> ( parseTemplate =<< mapM (showWithColors fmt . trans . read) pairs ) -- | Represents the different types of path components data Comp = Fix String | Var [String] deriving Show -- | Used to represent parts of file names separated by slashes and spaces data CompOrSep = Slash | Space | Comp String deriving (Eq, Show) -- | Function to turn a list of of strings into a list of path components pathComponents :: [String] -> [Comp] pathComponents = joinComps . drop 2 . intercalate [Space] . map splitParts where splitParts p | (l, _:r) <- break (== '/') p = Comp l : Slash : splitParts r | otherwise = [Comp p] joinComps = uncurry joinComps' . partition isComp isComp (Comp _) = True isComp _ = False fromComp (Comp s) = s fromComp _ = error "fromComp applied to value other than (Comp _)" joinComps' cs [] = [Fix $ fromComp $ head cs] -- cs should have only one element here, -- but this keeps the pattern matching -- exhaustive joinComps' cs (p:ps) = let (ss, ps') = span (== p) ps ct = if null ps' || (p == Space) then length ss + 1 else length ss (ls, rs) = splitAt (ct+1) cs c = case p of Space -> Var $ map fromComp ls Slash -> Fix $ intercalate "/" $ map fromComp ls _ -> error "Should not happen" in if null ps' then [c] else c:joinComps' rs (drop ct ps) -- | Function to find all files matching the given path and possible label file. -- The path must be absolute (start with a leading slash). findFilesAndLabel :: [String] -> Maybe (String, String -> Int) -> Monitor [(String, Either Int (String, String -> Int))] findFilesAndLabel path lbl = catMaybes <$> ( mapM addLabel . zip [0..] . sort =<< recFindFiles (pathComponents path) "/" ) where addLabel (i, f) = maybe (return $ Just (f, Left i)) (uncurry (justIfExists f)) lbl justIfExists f s t = let f' = take (length f - length s) f ++ s in ifthen (Just (f, Right (f', t))) Nothing <$> io (doesFileExist f') recFindFiles [] d = ifthen [d] [] <$> io (if null d then return False else doesFileExist d) recFindFiles ps d = ifthen (recFindFiles' ps d) (return []) =<< io (if null d then return True else doesDirectoryExist d) recFindFiles' [] _ = error "Should not happen" recFindFiles' (Fix p:ps) d = recFindFiles ps (d ++ "/" ++ p) recFindFiles' (Var p:ps) d = concat <$> ((mapM (recFindFiles ps . (\f -> d ++ "/" ++ f)) . filter (matchesVar p)) =<< io (getDirectoryContents d) ) matchesVar [] _ = False matchesVar [v] f = v == f matchesVar (v:vs) f = let f' = drop (length v) f f'' = dropWhile isDigit f' in and [ v `isPrefixOf` f , not (null f') , isDigit (head f') , matchesVar vs f'' ] -- | Function to read the contents of the given file(s) readFiles :: (String, Either Int (String, String -> Int)) -> Monitor (Int, String) readFiles (fval, flbl) = (,) <$> either return (\(f, ex) -> liftM ex $ io $ readFile f) flbl <*> io (readFile fval) -- | Function that captures if-then-else ifthen :: a -> a -> Bool -> a ifthen thn els cnd = if cnd then thn else els �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/CoreTemp.hs������������������������������������������������������0000664�0000000�0000000�00000003053�12513250503�0021156�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.CoreTemp -- Copyright : (c) Juraj Hercek -- License : BSD-style (see LICENSE) -- -- Maintainer : Juraj Hercek <juhe_haskell@hck.sk> -- Stability : unstable -- Portability : unportable -- -- A core temperature monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.CoreTemp where import Plugins.Monitors.Common import Plugins.Monitors.CoreCommon import Data.Char (isDigit) -- | -- Core temperature default configuration. Default template contains only one -- core temperature, user should specify custom template in order to get more -- core frequencies. coreTempConfig :: IO MConfig coreTempConfig = mkMConfig "Temp: <core0>C" -- template (map ((++) "core" . show) [0 :: Int ..]) -- available -- replacements -- | -- Function retrieves monitor string holding the core temperature -- (or temperatures) runCoreTemp :: [String] -> Monitor String runCoreTemp _ = do dn <- getConfigValue decDigits failureMessage <- getConfigValue naString let path = ["/sys/bus/platform/devices/coretemp.", "/temp", "_input"] path' = ["/sys/bus/platform/devices/coretemp.", "/hwmon/hwmon", "/temp", "_input"] lbl = Just ("_label", read . dropWhile (not . isDigit)) divisor = 1e3 :: Double show' = showDigits (max 0 dn) checkedDataRetrieval failureMessage [path, path'] lbl (/divisor) show' �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Cpu.hs�����������������������������������������������������������0000664�0000000�0000000�00000004724�12513250503�0020175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Cpu -- Copyright : (c) 2011 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A cpu monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Cpu (startCpu) where import Plugins.Monitors.Common import qualified Data.ByteString.Lazy.Char8 as B import Data.IORef (IORef, newIORef, readIORef, writeIORef) import System.Console.GetOpt data CpuOpts = CpuOpts { loadIconPattern :: Maybe IconPattern } defaultOpts :: CpuOpts defaultOpts = CpuOpts { loadIconPattern = Nothing } options :: [OptDescr (CpuOpts -> CpuOpts)] options = [ Option "" ["load-icon-pattern"] (ReqArg (\x o -> o { loadIconPattern = Just $ parseIconPattern x }) "") "" ] parseOpts :: [String] -> IO CpuOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs cpuConfig :: IO MConfig cpuConfig = mkMConfig "Cpu: <total>%" ["bar","vbar","ipat","total","user","nice","system","idle","iowait"] type CpuDataRef = IORef [Int] cpuData :: IO [Int] cpuData = cpuParser `fmap` B.readFile "/proc/stat" cpuParser :: B.ByteString -> [Int] cpuParser = map (read . B.unpack) . tail . B.words . head . B.lines parseCpu :: CpuDataRef -> IO [Float] parseCpu cref = do a <- readIORef cref b <- cpuData writeIORef cref b let dif = zipWith (-) b a tot = fromIntegral $ sum dif percent = map ((/ tot) . fromIntegral) dif return percent formatCpu :: CpuOpts -> [Float] -> Monitor [String] formatCpu _ [] = return $ replicate 8 "" formatCpu opts xs = do let t = sum $ take 3 xs b <- showPercentBar (100 * t) t v <- showVerticalBar (100 * t) t d <- showIconPattern (loadIconPattern opts) t ps <- showPercentsWithColors (t:xs) return (b:v:d:ps) runCpu :: CpuDataRef -> [String] -> Monitor String runCpu cref argv = do c <- io (parseCpu cref) opts <- io $ parseOpts argv l <- formatCpu opts c parseTemplate l startCpu :: [String] -> Int -> (String -> IO ()) -> IO () startCpu a r cb = do cref <- newIORef [] _ <- parseCpu cref runM a cpuConfig (runCpu cref) r cb ��������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/CpuFreq.hs�������������������������������������������������������0000664�0000000�0000000�00000002601�12513250503�0021003�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.CpuFreq -- Copyright : (c) Juraj Hercek -- License : BSD-style (see LICENSE) -- -- Maintainer : Juraj Hercek <juhe_haskell@hck.sk> -- Stability : unstable -- Portability : unportable -- -- A cpu frequency monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.CpuFreq where import Plugins.Monitors.Common import Plugins.Monitors.CoreCommon -- | -- Cpu frequency default configuration. Default template contains only -- one core frequency, user should specify custom template in order to -- get more cpu frequencies. cpuFreqConfig :: IO MConfig cpuFreqConfig = mkMConfig "Freq: <cpu0>" (map ((++) "cpu" . show) [0 :: Int ..]) -- | -- Function retrieves monitor string holding the cpu frequency (or -- frequencies) runCpuFreq :: [String] -> Monitor String runCpuFreq _ = do suffix <- getConfigValue useSuffix let path = ["/sys/devices/system/cpu/cpu", "/cpufreq/scaling_cur_freq"] divisor = 1e6 :: Double fmt x | x < 1 = show (round (x * 1000) :: Integer) ++ if suffix then "MHz" else "" | otherwise = show x ++ if suffix then "GHz" else "" failureMessage <- getConfigValue naString checkedDataRetrieval failureMessage [path] Nothing (/divisor) fmt �������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Disk.hs����������������������������������������������������������0000664�0000000�0000000�00000021160�12513250503�0020331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Disk -- Copyright : (c) 2010, 2011, 2012, 2014 Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Disk usage and throughput monitors for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Disk (diskUConfig, runDiskU, startDiskIO) where import Plugins.Monitors.Common import StatFS import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Control.Exception (SomeException, handle) import Control.Monad (zipWithM) import qualified Data.ByteString.Lazy.Char8 as B import Data.List (isPrefixOf, find) import Data.Maybe (catMaybes) import System.Directory (canonicalizePath, doesFileExist) import System.Console.GetOpt data DiskIOOpts = DiskIOOpts { totalIconPattern :: Maybe IconPattern , writeIconPattern :: Maybe IconPattern , readIconPattern :: Maybe IconPattern } parseDiskIOOpts :: [String] -> IO DiskIOOpts parseDiskIOOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs where defaultOpts = DiskIOOpts { totalIconPattern = Nothing , writeIconPattern = Nothing , readIconPattern = Nothing } options = [ Option "" ["total-icon-pattern"] (ReqArg (\x o -> o { totalIconPattern = Just $ parseIconPattern x}) "") "" , Option "" ["write-icon-pattern"] (ReqArg (\x o -> o { writeIconPattern = Just $ parseIconPattern x}) "") "" , Option "" ["read-icon-pattern"] (ReqArg (\x o -> o { readIconPattern = Just $ parseIconPattern x}) "") "" ] diskIOConfig :: IO MConfig diskIOConfig = mkMConfig "" ["total", "read", "write" ,"totalbar", "readbar", "writebar" ,"totalvbar", "readvbar", "writevbar" ,"totalipat", "readipat", "writeipat" ] data DiskUOpts = DiskUOpts { freeIconPattern :: Maybe IconPattern , usedIconPattern :: Maybe IconPattern } parseDiskUOpts :: [String] -> IO DiskUOpts parseDiskUOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs where defaultOpts = DiskUOpts { freeIconPattern = Nothing , usedIconPattern = Nothing } options = [ Option "" ["free-icon-pattern"] (ReqArg (\x o -> o { freeIconPattern = Just $ parseIconPattern x}) "") "" , Option "" ["used-icon-pattern"] (ReqArg (\x o -> o { usedIconPattern = Just $ parseIconPattern x}) "") "" ] diskUConfig :: IO MConfig diskUConfig = mkMConfig "" [ "size", "free", "used", "freep", "usedp" , "freebar", "freevbar", "freeipat" , "usedbar", "usedvbar", "usedipat" ] type DevName = String type Path = String type DevDataRef = IORef [(DevName, [Float])] mountedDevices :: [String] -> IO [(DevName, Path)] mountedDevices req = do s <- B.readFile "/etc/mtab" parse `fmap` mapM mbcanon (devs s) where mbcanon (d, p) = doesFileExist d >>= \e -> if e then Just `fmap` canon (d,p) else return Nothing canon (d, p) = do {d' <- canonicalizePath d; return (d', p)} devs = filter isDev . map (firstTwo . B.words) . B.lines parse = map undev . filter isReq . catMaybes firstTwo (a:b:_) = (B.unpack a, B.unpack b) firstTwo _ = ("", "") isDev (d, _) = "/dev/" `isPrefixOf` d isReq (d, p) = p `elem` req || drop 5 d `elem` req undev (d, f) = (drop 5 d, f) diskDevices :: [String] -> IO [(DevName, Path)] diskDevices req = do s <- B.readFile "/proc/diskstats" parse `fmap` mapM canon (devs s) where canon (d, p) = do {d' <- canonicalizePath d; return (d', p)} devs = map (third . B.words) . B.lines parse = map undev . filter isReq third (_:_:c:_) = ("/dev/" ++ B.unpack c, B.unpack c) third _ = ("", "") isReq (d, p) = p `elem` req || drop 5 d `elem` req undev (d, f) = (drop 5 d, f) mountedOrDiskDevices :: [String] -> IO [(DevName, Path)] mountedOrDiskDevices req = do mnt <- mountedDevices req case mnt of [] -> diskDevices req other -> return other diskData :: IO [(DevName, [Float])] diskData = do s <- B.readFile "/proc/diskstats" let extract ws = (head ws, map read (tail ws)) return $ map (extract . map B.unpack . drop 2 . B.words) (B.lines s) mountedData :: DevDataRef -> [DevName] -> IO [(DevName, [Float])] mountedData dref devs = do dt <- readIORef dref dt' <- diskData writeIORef dref dt' return $ map (parseDev (zipWith diff dt' dt)) devs where diff (dev, xs) (_, ys) = (dev, zipWith (-) xs ys) parseDev :: [(DevName, [Float])] -> DevName -> (DevName, [Float]) parseDev dat dev = case find ((==dev) . fst) dat of Nothing -> (dev, [0, 0, 0]) Just (_, xs) -> let rSp = speed (xs !! 2) (xs !! 3) wSp = speed (xs !! 6) (xs !! 7) sp = speed (xs !! 2 + xs !! 6) (xs !! 3 + xs !! 7) speed x t = if t == 0 then 0 else 500 * x / t dat' = if length xs > 6 then [sp, rSp, wSp] else [0, 0, 0] in (dev, dat') speedToStr :: Float -> String speedToStr = showWithUnits 2 1 sizeToStr :: Integer -> String sizeToStr = showWithUnits 3 0 . fromIntegral findTempl :: DevName -> Path -> [(String, String)] -> String findTempl dev path disks = case find devOrPath disks of Just (_, t) -> t Nothing -> "" where devOrPath (d, _) = d == dev || d == path devTemplates :: [(String, String)] -> [(DevName, Path)] -> [(DevName, [Float])] -> [(String, [Float])] devTemplates disks mounted dat = map (\(d, p) -> (findTempl d p disks, findData d)) mounted where findData dev = case find ((==dev) . fst) dat of Nothing -> [0, 0, 0] Just (_, xs) -> xs runDiskIO' :: DiskIOOpts -> (String, [Float]) -> Monitor String runDiskIO' opts (tmp, xs) = do s <- mapM (showWithColors speedToStr) xs b <- mapM (showLogBar 0.8) xs vb <- mapM (showLogVBar 0.8) xs ipat <- mapM (\(f,v) -> showLogIconPattern (f opts) 0.8 v) $ zip [totalIconPattern, readIconPattern, writeIconPattern] xs setConfigValue tmp template parseTemplate $ s ++ b ++ vb ++ ipat runDiskIO :: DevDataRef -> [(String, String)] -> [String] -> Monitor String runDiskIO dref disks argv = do opts <- io $ parseDiskIOOpts argv dev <- io $ mountedOrDiskDevices (map fst disks) dat <- io $ mountedData dref (map fst dev) strs <- mapM (runDiskIO' opts) $ devTemplates disks dev dat return $ unwords strs startDiskIO :: [(String, String)] -> [String] -> Int -> (String -> IO ()) -> IO () startDiskIO disks args rate cb = do dev <- mountedOrDiskDevices (map fst disks) dref <- newIORef (map (\d -> (fst d, repeat 0)) dev) _ <- mountedData dref (map fst dev) runM args diskIOConfig (runDiskIO dref disks) rate cb fsStats :: String -> IO [Integer] fsStats path = do stats <- getFileSystemStats path case stats of Nothing -> return [0, 0, 0] Just f -> let tot = fsStatByteCount f free = fsStatBytesAvailable f used = fsStatBytesUsed f in return [tot, free, used] runDiskU' :: DiskUOpts -> String -> String -> Monitor String runDiskU' opts tmp path = do setConfigValue tmp template [total, free, diff] <- io (handle ign $ fsStats path) let strs = map sizeToStr [free, diff] freep = if total > 0 then free * 100 `div` total else 0 fr = fromIntegral freep / 100 s <- zipWithM showWithColors' strs [freep, 100 - freep] sp <- showPercentsWithColors [fr, 1 - fr] fb <- showPercentBar (fromIntegral freep) fr fvb <- showVerticalBar (fromIntegral freep) fr fipat <- showIconPattern (freeIconPattern opts) fr ub <- showPercentBar (fromIntegral $ 100 - freep) (1 - fr) uvb <- showVerticalBar (fromIntegral $ 100 - freep) (1 - fr) uipat <- showIconPattern (usedIconPattern opts) (1 - fr) parseTemplate $ [sizeToStr total] ++ s ++ sp ++ [fb,fvb,fipat,ub,uvb,uipat] where ign = const (return [0, 0, 0]) :: SomeException -> IO [Integer] runDiskU :: [(String, String)] -> [String] -> Monitor String runDiskU disks argv = do devs <- io $ mountedDevices (map fst disks) opts <- io $ parseDiskUOpts argv strs <- mapM (\(d, p) -> runDiskU' opts (findTempl d p disks) p) devs return $ unwords strs ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/MPD.hs�����������������������������������������������������������0000664�0000000�0000000�00000010774�12513250503�0020070�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.MPD -- Copyright : (c) Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- MPD status and song -- ----------------------------------------------------------------------------- module Plugins.Monitors.MPD ( mpdConfig, runMPD, mpdWait, mpdReady ) where import Data.List import Data.Maybe (fromMaybe) import Plugins.Monitors.Common import System.Console.GetOpt import qualified Network.MPD as M import Control.Concurrent (threadDelay) mpdConfig :: IO MConfig mpdConfig = mkMConfig "MPD: <state>" [ "bar", "vbar", "ipat", "state", "statei", "volume", "length" , "lapsed", "remaining", "plength", "ppos", "flags", "file" , "name", "artist", "composer", "performer" , "album", "title", "track", "genre" ] data MOpts = MOpts { mPlaying :: String , mStopped :: String , mPaused :: String , mLapsedIconPattern :: Maybe IconPattern } defaultOpts :: MOpts defaultOpts = MOpts { mPlaying = ">>" , mStopped = "><" , mPaused = "||" , mLapsedIconPattern = Nothing } options :: [OptDescr (MOpts -> MOpts)] options = [ Option "P" ["playing"] (ReqArg (\x o -> o { mPlaying = x }) "") "" , Option "S" ["stopped"] (ReqArg (\x o -> o { mStopped = x }) "") "" , Option "Z" ["paused"] (ReqArg (\x o -> o { mPaused = x }) "") "" , Option "" ["lapsed-icon-pattern"] (ReqArg (\x o -> o { mLapsedIconPattern = Just $ parseIconPattern x }) "") "" ] runMPD :: [String] -> Monitor String runMPD args = do opts <- io $ mopts args status <- io $ M.withMPD M.status song <- io $ M.withMPD M.currentSong s <- parseMPD status song opts parseTemplate s mpdWait :: IO () mpdWait = do status <- M.withMPD $ M.idle [M.PlayerS, M.MixerS] case status of Left _ -> threadDelay 10000000 _ -> return () mpdReady :: [String] -> Monitor Bool mpdReady _ = do response <- io $ M.withMPD M.ping case response of Right _ -> return True -- Only cases where MPD isn't responding is an issue; bogus information at -- least won't hold xmobar up. Left M.NoMPD -> return False Left (M.ConnectionError _) -> return False Left _ -> return True mopts :: [String] -> IO MOpts mopts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs parseMPD :: M.Response M.Status -> M.Response (Maybe M.Song) -> MOpts -> Monitor [String] parseMPD (Left e) _ _ = return $ show e:replicate 19 "" parseMPD (Right st) song opts = do songData <- parseSong song bar <- showPercentBar (100 * b) b vbar <- showVerticalBar (100 * b) b ipat <- showIconPattern (mLapsedIconPattern opts) b return $ [bar, vbar, ipat, ss, si, vol, len, lap, remain, plen, ppos, flags] ++ songData where s = M.stState st ss = show s si = stateGlyph s opts vol = int2str $ fromMaybe 0 (M.stVolume st) (p, t) = fromMaybe (0, 0) (M.stTime st) [lap, len, remain] = map showTime [floor p, t, max 0 (t - floor p)] b = if t > 0 then realToFrac $ p / fromIntegral t else 0 plen = int2str $ M.stPlaylistLength st ppos = maybe "" (int2str . (+1)) $ M.stSongPos st flags = playbackMode st stateGlyph :: M.State -> MOpts -> String stateGlyph s o = case s of M.Playing -> mPlaying o M.Paused -> mPaused o M.Stopped -> mStopped o playbackMode :: M.Status -> String playbackMode s = concat [if p s then f else "-" | (p,f) <- [(M.stRepeat,"r"), (M.stRandom,"z"), (M.stSingle,"s"), (M.stConsume,"c")]] parseSong :: M.Response (Maybe M.Song) -> Monitor [String] parseSong (Left _) = return $ repeat "" parseSong (Right Nothing) = return $ repeat "" parseSong (Right (Just s)) = let str sel = maybe "" (intercalate ", " . map M.toString) (M.sgGetTag sel s) sels = [ M.Name, M.Artist, M.Composer, M.Performer , M.Album, M.Title, M.Track, M.Genre ] fields = M.toString (M.sgFilePath s) : map str sels in mapM showWithPadding fields showTime :: Integer -> String showTime t = int2str minutes ++ ":" ++ int2str seconds where minutes = t `div` 60 seconds = t `mod` 60 int2str :: (Show a, Num a, Ord a) => a -> String int2str x = if x < 10 then '0':sx else sx where sx = show x ����xmobar-0.23.1/src/Plugins/Monitors/Mem.hs�����������������������������������������������������������0000664�0000000�0000000�00000006476�12513250503�0020172�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Mem -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A memory monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Mem (memConfig, runMem, totalMem, usedMem) where import Plugins.Monitors.Common import qualified Data.Map as M import System.Console.GetOpt data MemOpts = MemOpts { usedIconPattern :: Maybe IconPattern , freeIconPattern :: Maybe IconPattern , availableIconPattern :: Maybe IconPattern } defaultOpts :: MemOpts defaultOpts = MemOpts { usedIconPattern = Nothing , freeIconPattern = Nothing , availableIconPattern = Nothing } options :: [OptDescr (MemOpts -> MemOpts)] options = [ Option "" ["used-icon-pattern"] (ReqArg (\x o -> o { usedIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["free-icon-pattern"] (ReqArg (\x o -> o { freeIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["available-icon-pattern"] (ReqArg (\x o -> o { availableIconPattern = Just $ parseIconPattern x }) "") "" ] parseOpts :: [String] -> IO MemOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs memConfig :: IO MConfig memConfig = mkMConfig "Mem: <usedratio>% (<cache>M)" -- template ["usedbar", "usedvbar", "usedipat", "freebar", "freevbar", "freeipat", "availablebar", "availablevbar", "availableipat", "usedratio", "freeratio", "availableratio", "total", "free", "buffer", "cache", "available", "used"] -- available replacements fileMEM :: IO String fileMEM = readFile "/proc/meminfo" parseMEM :: IO [Float] parseMEM = do file <- fileMEM let content = map words $ take 8 $ lines file info = M.fromList $ map (\line -> (head line, (read $ line !! 1 :: Float) / 1024)) content [total, free, buffer, cache] = map (info M.!) ["MemTotal:", "MemFree:", "Buffers:", "Cached:"] available = M.findWithDefault (free + buffer + cache) "MemAvailable:" info used = total - available usedratio = used / total freeratio = free / total availableratio = available / total return [usedratio, freeratio, availableratio, total, free, buffer, cache, available, used] totalMem :: IO Float totalMem = fmap ((*1024) . (!!1)) parseMEM usedMem :: IO Float usedMem = fmap ((*1024) . (!!6)) parseMEM formatMem :: MemOpts -> [Float] -> Monitor [String] formatMem opts (r:fr:ar:xs) = do let f = showDigits 0 mon i x = [showPercentBar (100 * x) x, showVerticalBar (100 * x) x, showIconPattern i x] sequence $ mon (usedIconPattern opts) r ++ mon (freeIconPattern opts) fr ++ mon (availableIconPattern opts) ar ++ map showPercentWithColors [r, fr, ar] ++ map (showWithColors f) xs formatMem _ _ = replicate 10 `fmap` getConfigValue naString runMem :: [String] -> Monitor String runMem argv = do m <- io parseMEM opts <- io $ parseOpts argv l <- formatMem opts m parseTemplate l ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Mpris.hs���������������������������������������������������������0000664�0000000�0000000�00000013344�12513250503�0020536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE OverloadedStrings #-} ---------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Mpris -- Copyright : (c) Artem Tarasov -- License : BSD-style (see LICENSE) -- -- Maintainer : Artem Tarasov <lomereiter@gmail.com> -- Stability : unstable -- Portability : unportable -- -- MPRIS song info -- ---------------------------------------------------------------------------- module Plugins.Monitors.Mpris ( mprisConfig, runMPRIS1, runMPRIS2 ) where -- TODO: listen to signals import Plugins.Monitors.Common import Text.Printf (printf) import DBus import qualified DBus.Client as DC import Control.Arrow ((***)) import Data.Maybe ( fromJust ) import Data.Int ( Int32, Int64 ) import System.IO.Unsafe (unsafePerformIO) import Control.Exception (try) class MprisVersion a where getMethodCall :: a -> String -> MethodCall getMetadataReply :: a -> DC.Client -> String -> IO [Variant] getMetadataReply mv c p = fmap methodReturnBody (DC.call_ c $ getMethodCall mv p) fieldsList :: a -> [String] data MprisVersion1 = MprisVersion1 instance MprisVersion MprisVersion1 where getMethodCall MprisVersion1 p = (methodCall objectPath interfaceName memberName) { methodCallDestination = Just busName } where busName = busName_ $ "org.mpris." ++ p objectPath = objectPath_ "/Player" interfaceName = interfaceName_ "org.freedesktop.MediaPlayer" memberName = memberName_ "GetMetadata" fieldsList MprisVersion1 = [ "album", "artist", "arturl", "mtime", "title" , "tracknumber" ] data MprisVersion2 = MprisVersion2 instance MprisVersion MprisVersion2 where getMethodCall MprisVersion2 p = (methodCall objectPath interfaceName memberName) { methodCallDestination = Just busName , methodCallBody = arguments } where busName = busName_ $ "org.mpris.MediaPlayer2." ++ p objectPath = objectPath_ "/org/mpris/MediaPlayer2" interfaceName = interfaceName_ "org.freedesktop.DBus.Properties" memberName = memberName_ "Get" arguments = map (toVariant::String -> Variant) ["org.mpris.MediaPlayer2.Player", "Metadata"] fieldsList MprisVersion2 = [ "xesam:album", "xesam:artist", "mpris:artUrl" , "mpris:length", "xesam:title", "xesam:trackNumber", "xesam:composer", "xesam:genre" ] mprisConfig :: IO MConfig mprisConfig = mkMConfig "<artist> - <title>" [ "album", "artist", "arturl", "length" , "title", "tracknumber" , "composer", "genre" ] dbusClient :: DC.Client dbusClient = unsafePerformIO DC.connectSession runMPRIS :: (MprisVersion a) => a -> String -> [String] -> Monitor String runMPRIS version playerName _ = do metadata <- io $ getMetadata version dbusClient playerName parseTemplate $ makeList version metadata runMPRIS1 :: String -> [String] -> Monitor String runMPRIS1 = runMPRIS MprisVersion1 runMPRIS2 :: String -> [String] -> Monitor String runMPRIS2 = runMPRIS MprisVersion2 --------------------------------------------------------------------------- fromVar :: (IsVariant a) => Variant -> a fromVar = fromJust . fromVariant unpackMetadata :: [Variant] -> [(String, Variant)] unpackMetadata [] = [] unpackMetadata xs = (map (fromVar *** fromVar) . unpack . head) xs where unpack v = case variantType v of TypeDictionary _ _ -> dictionaryItems $ fromVar v TypeVariant -> unpack $ fromVar v TypeStructure _ -> unpack $ head $ structureItems $ fromVar v _ -> [] getMetadata :: (MprisVersion a) => a -> DC.Client -> String -> IO [(String, Variant)] getMetadata version client player = do reply <- try (getMetadataReply version client player) :: IO (Either DC.ClientError [Variant]) return $ case reply of Right metadata -> unpackMetadata metadata; Left _ -> [] makeList :: (MprisVersion a) => a -> [(String, Variant)] -> [String] makeList version md = map getStr (fieldsList version) where formatTime n = (if hh == 0 then printf "%02d:%02d" else printf "%d:%02d:%02d" hh) mm ss where hh = (n `div` 60) `div` 60 mm = (n `div` 60) `mod` 60 ss = n `mod` 60 getStr str = case lookup str md of Nothing -> "" Just v -> case variantType v of TypeString -> fromVar v TypeInt32 -> let num = fromVar v in case str of "mtime" -> formatTime (num `div` 1000) "tracknumber" -> printf "%02d" num "mpris:length" -> formatTime (num `div` 1000000) "xesam:trackNumber" -> printf "%02d" num _ -> (show::Int32 -> String) num TypeInt64 -> let num = fromVar v in case str of "mpris:length" -> formatTime (num `div` 1000000) _ -> (show::Int64 -> String) num TypeArray TypeString -> fromVar $ head $ arrayItems $ fromVar v _ -> "" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/MultiCpu.hs������������������������������������������������������0000664�0000000�0000000�00000010057�12513250503�0021204�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.MultiCpu -- Copyright : (c) Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A multi-cpu monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.MultiCpu (startMultiCpu) where import Plugins.Monitors.Common import Control.Applicative ((<$>)) import qualified Data.ByteString.Lazy.Char8 as B import Data.List (isPrefixOf, transpose, unfoldr) import Data.IORef (IORef, newIORef, readIORef, writeIORef) import System.Console.GetOpt data MultiCpuOpts = MultiCpuOpts { loadIconPatterns :: [IconPattern] , loadIconPattern :: Maybe IconPattern } defaultOpts :: MultiCpuOpts defaultOpts = MultiCpuOpts { loadIconPatterns = [] , loadIconPattern = Nothing } options :: [OptDescr (MultiCpuOpts -> MultiCpuOpts)] options = [ Option "" ["load-icon-pattern"] (ReqArg (\x o -> o { loadIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["load-icon-patterns"] (ReqArg (\x o -> o { loadIconPatterns = parseIconPattern x : loadIconPatterns o }) "") "" ] parseOpts :: [String] -> IO MultiCpuOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs variables :: [String] variables = ["bar", "vbar","ipat","total","user","nice","system","idle"] vNum :: Int vNum = length variables multiCpuConfig :: IO MConfig multiCpuConfig = mkMConfig "Cpu: <total>%" $ ["auto" ++ k | k <- variables] ++ [ k ++ n | n <- "" : map show [0 :: Int ..] , k <- variables] type CpuDataRef = IORef [[Float]] cpuData :: IO [[Float]] cpuData = parse `fmap` B.readFile "/proc/stat" where parse = map parseList . cpuLists cpuLists = takeWhile isCpu . map B.words . B.lines isCpu (w:_) = "cpu" `isPrefixOf` B.unpack w isCpu _ = False parseList = map (parseFloat . B.unpack) . tail parseCpuData :: CpuDataRef -> IO [[Float]] parseCpuData cref = do as <- readIORef cref bs <- cpuData writeIORef cref bs let p0 = zipWith percent bs as return p0 percent :: [Float] -> [Float] -> [Float] percent b a = if tot > 0 then map (/ tot) $ take 4 dif else [0, 0, 0, 0] where dif = zipWith (-) b a tot = sum dif formatMultiCpus :: MultiCpuOpts -> [[Float]] -> Monitor [String] formatMultiCpus _ [] = return [] formatMultiCpus opts xs = concat <$> mapM (\(i, x) -> formatCpu opts i x) (zip [0..] xs) formatCpu :: MultiCpuOpts -> Int -> [Float] -> Monitor [String] formatCpu opts i xs | length xs < 4 = showPercentsWithColors $ replicate vNum 0.0 | otherwise = let t = sum $ take 3 xs in do b <- showPercentBar (100 * t) t h <- showVerticalBar (100 * t) t d <- showIconPattern tryString t ps <- showPercentsWithColors (t:xs) return (b:h:d:ps) where tryString | i == 0 = loadIconPattern opts | i <= length (loadIconPatterns opts) = Just $ (loadIconPatterns opts) !! (i - 1) | otherwise = Nothing splitEvery :: (Eq a) => Int -> [a] -> [[a]] splitEvery n = unfoldr (\x -> if null x then Nothing else Just $ splitAt n x) groupData :: [String] -> [[String]] groupData = transpose . tail . splitEvery vNum formatAutoCpus :: [String] -> Monitor [String] formatAutoCpus [] = return $ replicate vNum "" formatAutoCpus xs = return $ map unwords (groupData xs) runMultiCpu :: CpuDataRef -> [String] -> Monitor String runMultiCpu cref argv = do c <- io $ parseCpuData cref opts <- io $ parseOpts argv l <- formatMultiCpus opts c a <- formatAutoCpus l parseTemplate $ a ++ l startMultiCpu :: [String] -> Int -> (String -> IO ()) -> IO () startMultiCpu a r cb = do cref <- newIORef [[]] _ <- parseCpuData cref runM a multiCpuConfig (runMultiCpu cref) r cb ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Net.hs�����������������������������������������������������������0000664�0000000�0000000�00000015214�12513250503�0020170�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Net -- Copyright : (c) 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A net device monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Net ( startNet , startDynNet ) where import Plugins.Monitors.Common import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Data.Time.Clock (UTCTime, getCurrentTime, diffUTCTime) import Control.Monad (forM, filterM, liftM) import System.Directory (getDirectoryContents, doesFileExist) import System.FilePath ((</>)) import System.Console.GetOpt import qualified Data.ByteString.Lazy.Char8 as B data NetOpts = NetOpts { rxIconPattern :: Maybe IconPattern , txIconPattern :: Maybe IconPattern } defaultOpts :: NetOpts defaultOpts = NetOpts { rxIconPattern = Nothing , txIconPattern = Nothing } options :: [OptDescr (NetOpts -> NetOpts)] options = [ Option "" ["rx-icon-pattern"] (ReqArg (\x o -> o { rxIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["tx-icon-pattern"] (ReqArg (\x o -> o { txIconPattern = Just $ parseIconPattern x }) "") "" ] parseOpts :: [String] -> IO NetOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs data UnitPerSec = Bs | KBs | MBs | GBs deriving (Eq,Enum,Ord) data NetValue = NetValue Float UnitPerSec deriving (Eq,Show) instance Show UnitPerSec where show Bs = "B/s" show KBs = "KB/s" show MBs = "MB/s" show GBs = "GB/s" data NetDev = NA | NI String | ND String Float Float deriving (Eq,Show,Read) type NetDevRef = IORef (NetDev, UTCTime) -- The more information available, the better. -- Note that names don't matter. Therefore, if only the names differ, -- a compare evaluates to EQ while (==) evaluates to False. instance Ord NetDev where compare NA NA = EQ compare NA _ = LT compare _ NA = GT compare (NI _) (NI _) = EQ compare (NI _) (ND {}) = LT compare (ND {}) (NI _) = GT compare (ND _ x1 y1) (ND _ x2 y2) = if downcmp /= EQ then downcmp else y1 `compare` y2 where downcmp = x1 `compare` x2 netConfig :: IO MConfig netConfig = mkMConfig "<dev>: <rx>KB|<tx>KB" -- template ["dev", "rx", "tx", "rxbar", "rxvbar", "rxipat", "txbar", "txvbar", "txipat"] -- available replacements operstateDir :: String -> FilePath operstateDir d = "/sys/class/net" </> d </> "operstate" existingDevs :: IO [String] existingDevs = getDirectoryContents "/sys/class/net" >>= filterM isDev where isDev d | d `elem` excludes = return False | otherwise = doesFileExist (operstateDir d) excludes = [".", "..", "lo"] isUp :: String -> IO Bool isUp d = do operstate <- B.readFile (operstateDir d) return $ (B.unpack . head . B.lines) operstate `elem` ["up", "unknown"] readNetDev :: [String] -> IO NetDev readNetDev (d:x:y:_) = do up <- isUp d return (if up then ND d (r x) (r y) else NI d) where r s | s == "" = 0 | otherwise = read s readNetDev _ = return NA netParser :: B.ByteString -> IO [NetDev] netParser = mapM (readNetDev . splitDevLine) . readDevLines where readDevLines = drop 2 . B.lines splitDevLine = selectCols . wordsBy (`elem` " :") . B.unpack selectCols cols = map (cols!!) [0,1,9] wordsBy f s = case dropWhile f s of [] -> [] s' -> w : wordsBy f s'' where (w, s'') = break f s' findNetDev :: String -> IO NetDev findNetDev dev = do nds <- B.readFile "/proc/net/dev" >>= netParser case filter isDev nds of x:_ -> return x _ -> return NA where isDev (ND d _ _) = d == dev isDev (NI d) = d == dev isDev NA = False formatNet :: Maybe IconPattern -> Float -> Monitor (String, String, String, String) formatNet mipat d = do s <- getConfigValue useSuffix dd <- getConfigValue decDigits let str True v = showDigits dd d' ++ show u where (NetValue d' u) = byteNetVal v str False v = showDigits dd $ v / 1024 b <- showLogBar 0.9 d vb <- showLogVBar 0.9 d ipat <- showLogIconPattern mipat 0.9 d x <- showWithColors (str s) d return (x, b, vb, ipat) printNet :: NetOpts -> NetDev -> Monitor String printNet opts nd = case nd of ND d r t -> do (rx, rb, rvb, ripat) <- formatNet (rxIconPattern opts) r (tx, tb, tvb, tipat) <- formatNet (txIconPattern opts) t parseTemplate [d,rx,tx,rb,rvb,ripat,tb,tvb,tipat] NI _ -> return "" NA -> getConfigValue naString parseNet :: NetDevRef -> String -> IO NetDev parseNet nref nd = do (n0, t0) <- readIORef nref n1 <- findNetDev nd t1 <- getCurrentTime writeIORef nref (n1, t1) let scx = realToFrac (diffUTCTime t1 t0) scx' = if scx > 0 then scx else 1 rate da db = takeDigits 2 $ (db - da) / scx' diffRate (ND d ra ta) (ND _ rb tb) = ND d (rate ra rb) (rate ta tb) diffRate (NI d) _ = NI d diffRate _ (NI d) = NI d diffRate _ _ = NA return $ diffRate n0 n1 runNet :: NetDevRef -> String -> [String] -> Monitor String runNet nref i argv = do dev <- io $ parseNet nref i opts <- io $ parseOpts argv printNet opts dev parseNets :: [(NetDevRef, String)] -> IO [NetDev] parseNets = mapM $ uncurry parseNet runNets :: [(NetDevRef, String)] -> [String] -> Monitor String runNets refs argv = do dev <- io $ parseActive refs opts <- io $ parseOpts argv printNet opts dev where parseActive refs' = liftM selectActive (parseNets refs') selectActive = maximum startNet :: String -> [String] -> Int -> (String -> IO ()) -> IO () startNet i a r cb = do t0 <- getCurrentTime nref <- newIORef (NA, t0) _ <- parseNet nref i runM a netConfig (runNet nref i) r cb startDynNet :: [String] -> Int -> (String -> IO ()) -> IO () startDynNet a r cb = do devs <- existingDevs refs <- forM devs $ \d -> do t <- getCurrentTime nref <- newIORef (NA, t) _ <- parseNet nref d return (nref, d) runM a netConfig (runNets refs) r cb byteNetVal :: Float -> NetValue byteNetVal v | v < 1024**1 = NetValue v Bs | v < 1024**2 = NetValue (v/1024**1) KBs | v < 1024**3 = NetValue (v/1024**2) MBs | otherwise = NetValue (v/1024**3) GBs ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Swap.hs����������������������������������������������������������0000664�0000000�0000000�00000003234�12513250503�0020353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Swap -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A swap usage monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Swap where import Plugins.Monitors.Common import qualified Data.ByteString.Lazy.Char8 as B swapConfig :: IO MConfig swapConfig = mkMConfig "Swap: <usedratio>%" -- template ["usedratio", "total", "used", "free"] -- available replacements fileMEM :: IO B.ByteString fileMEM = B.readFile "/proc/meminfo" parseMEM :: IO [Float] parseMEM = do file <- fileMEM let li i l | l /= [] = head l !! i | otherwise = B.empty fs s l | null l = False | otherwise = head l == B.pack s get_data s = flip (/) 1024 . read . B.unpack . li 1 . filter (fs s) st = map B.words . B.lines $ file tot = get_data "SwapTotal:" st free = get_data "SwapFree:" st return [(tot - free) / tot, tot, tot - free, free] formatSwap :: [Float] -> Monitor [String] formatSwap (r:xs) = do d <- getConfigValue decDigits other <- mapM (showWithColors (showDigits d)) xs ratio <- showPercentWithColors r return $ ratio:other formatSwap _ = return $ replicate 4 "N/A" runSwap :: [String] -> Monitor String runSwap _ = do m <- io parseMEM l <- formatSwap m parseTemplate l ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Thermal.hs�������������������������������������������������������0000664�0000000�0000000�00000002655�12513250503�0021043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Thermal -- Copyright : (c) Juraj Hercek -- License : BSD-style (see LICENSE) -- -- Maintainer : Juraj Hercek <juhe_haskell@hck.sk> -- Stability : unstable -- Portability : unportable -- -- A thermal monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Thermal where import Control.Monad (liftM) import qualified Data.ByteString.Lazy.Char8 as B import Plugins.Monitors.Common import System.Posix.Files (fileExist) -- | Default thermal configuration. thermalConfig :: IO MConfig thermalConfig = mkMConfig "Thm: <temp>C" -- template ["temp"] -- available replacements -- | Retrieves thermal information. Argument is name of thermal directory in -- \/proc\/acpi\/thermal_zone. Returns the monitor string parsed according to -- template (either default or user specified). runThermal :: [String] -> Monitor String runThermal args = do let zone = head args file = "/proc/acpi/thermal_zone/" ++ zone ++ "/temperature" exists <- io $ fileExist file if exists then do number <- io $ liftM ((read :: String -> Int) . stringParser (1, 0)) (B.readFile file) thermal <- showWithColors show number parseTemplate [ thermal ] else return $ "Thermal (" ++ zone ++ "): N/A" �����������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/ThermalZone.hs���������������������������������������������������0000664�0000000�0000000�00000003024�12513250503�0021666�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������------------------------------------------------------------------------------ -- | -- Module : Plugins.Monitors.ThermalZone -- Copyright : (c) 2011, 2013 Jose Antonio Ortega Ruiz -- License : BSD3-style (see LICENSE) -- -- Maintainer : jao@gnu.org -- Stability : unstable -- Portability : portable -- Created : Fri Feb 25, 2011 03:18 -- -- -- A thermal zone plugin based on the sysfs linux interface. -- See http://kernel.org/doc/Documentation/thermal/sysfs-api.txt -- ------------------------------------------------------------------------------ module Plugins.Monitors.ThermalZone (thermalZoneConfig, runThermalZone) where import Plugins.Monitors.Common import System.Posix.Files (fileExist) import qualified Data.ByteString.Char8 as B -- | Default thermal configuration. thermalZoneConfig :: IO MConfig thermalZoneConfig = mkMConfig "<temp>C" ["temp"] -- | Retrieves thermal information. Argument is name of thermal -- directory in \/sys\/clas\/thermal. Returns the monitor string -- parsed according to template (either default or user specified). runThermalZone :: [String] -> Monitor String runThermalZone args = do let zone = head args file = "/sys/class/thermal/thermal_zone" ++ zone ++ "/temp" parse = return . (read :: String -> Int) . B.unpack exists <- io $ fileExist file if exists then do mdegrees <- io $ B.readFile file >>= parse temp <- showWithColors show (mdegrees `quot` 1000) parseTemplate [ temp ] else getConfigValue naString ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Top.hs�����������������������������������������������������������0000664�0000000�0000000�00000013532�12513250503�0020205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Top -- Copyright : (c) 2010, 2011, 2012, 2013, 2014 Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Process activity and memory consumption monitors -- ----------------------------------------------------------------------------- {-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE BangPatterns #-} module Plugins.Monitors.Top (startTop, topMemConfig, runTopMem) where import Plugins.Monitors.Common import Control.Exception (SomeException, handle) import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Data.List (sortBy, foldl') import Data.Ord (comparing) import Data.Time.Clock (UTCTime, getCurrentTime, diffUTCTime) import System.Directory (getDirectoryContents) import System.FilePath ((</>)) import System.IO (IOMode(ReadMode), hGetLine, withFile) import System.Posix.Unistd (SysVar(ClockTick), getSysVar) import Foreign.C.Types maxEntries :: Int maxEntries = 10 intStrs :: [String] intStrs = map show [1..maxEntries] topMemConfig :: IO MConfig topMemConfig = mkMConfig "<both1>" [ k ++ n | n <- intStrs , k <- ["name", "mem", "both"]] topConfig :: IO MConfig topConfig = mkMConfig "<both1>" ("no" : [ k ++ n | n <- intStrs , k <- [ "name", "cpu", "both" , "mname", "mem", "mboth"]]) foreign import ccall "unistd.h getpagesize" c_getpagesize :: CInt pageSize :: Float pageSize = fromIntegral c_getpagesize / 1024 processes :: IO [FilePath] processes = fmap (filter isPid) (getDirectoryContents "/proc") where isPid = (`elem` ['0'..'9']) . head statWords :: [String] -> [String] statWords line@(x:pn:ppn:xs) = if last pn == ')' then line else statWords (x:(pn ++ " " ++ ppn):xs) statWords _ = replicate 52 "0" getProcessData :: FilePath -> IO [String] getProcessData pidf = handle ign $ withFile ("/proc" </> pidf </> "stat") ReadMode readWords where readWords = fmap (statWords . words) . hGetLine ign = const (return []) :: SomeException -> IO [String] handleProcesses :: ([String] -> a) -> IO [a] handleProcesses f = fmap (foldl' (\a p -> if length p < 15 then a else f p : a) []) (processes >>= mapM getProcessData) showInfo :: String -> String -> Float -> Monitor [String] showInfo nm sms mms = do mnw <- getConfigValue maxWidth mxw <- getConfigValue minWidth let lsms = length sms nmw = mnw - lsms - 1 nmx = mxw - lsms - 1 rnm = if nmw > 0 then padString nmw nmx " " True nm else nm mstr <- showWithColors' sms mms both <- showWithColors' (rnm ++ " " ++ sms) mms return [nm, mstr, both] processName :: [String] -> String processName = drop 1 . init . (!!1) sortTop :: [(String, Float)] -> [(String, Float)] sortTop = sortBy (flip (comparing snd)) type MemInfo = (String, Float) meminfo :: [String] -> MemInfo meminfo fs = (processName fs, pageSize * parseFloat (fs!!23)) meminfos :: IO [MemInfo] meminfos = handleProcesses meminfo showMemInfo :: Float -> MemInfo -> Monitor [String] showMemInfo scale (nm, rss) = showInfo nm (showWithUnits 3 1 rss) (100 * rss / sc) where sc = if scale > 0 then scale else 100 showMemInfos :: [MemInfo] -> Monitor [[String]] showMemInfos ms = mapM (showMemInfo tm) ms where tm = sum (map snd ms) runTopMem :: [String] -> Monitor String runTopMem _ = do mis <- io meminfos pstr <- showMemInfos (sortTop mis) parseTemplate $ concat pstr type Pid = Int type TimeInfo = (String, Float) type TimeEntry = (Pid, TimeInfo) type Times = [TimeEntry] type TimesRef = IORef (Times, UTCTime) timeMemEntry :: [String] -> (TimeEntry, MemInfo) timeMemEntry fs = ((p, (n, t)), (n, r)) where p = parseInt (head fs) n = processName fs t = parseFloat (fs!!13) + parseFloat (fs!!14) (_, r) = meminfo fs timeMemEntries :: IO [(TimeEntry, MemInfo)] timeMemEntries = handleProcesses timeMemEntry timeMemInfos :: IO (Times, [MemInfo], Int) timeMemInfos = fmap res timeMemEntries where res x = (sortBy (comparing fst) $ map fst x, map snd x, length x) combine :: Times -> Times -> Times combine _ [] = [] combine [] ts = ts combine l@((p0, (n0, t0)):ls) r@((p1, (n1, t1)):rs) | p0 == p1 && n0 == n1 = (p0, (n0, t1 - t0)) : combine ls rs | p0 <= p1 = combine ls r | otherwise = (p1, (n1, t1)) : combine l rs take' :: Int -> [a] -> [a] take' m l = let !r = tk m l in length l `seq` r where tk 0 _ = [] tk _ [] = [] tk n (x:xs) = let !r = tk (n - 1) xs in x : r topProcesses :: TimesRef -> Float -> IO (Int, [TimeInfo], [MemInfo]) topProcesses tref scale = do (t0, c0) <- readIORef tref (t1, mis, len) <- timeMemInfos c1 <- getCurrentTime let scx = realToFrac (diffUTCTime c1 c0) * scale !scx' = if scx > 0 then scx else scale nts = map (\(_, (nm, t)) -> (nm, min 100 (t / scx'))) (combine t0 t1) !t1' = take' (length t1) t1 !nts' = take' maxEntries (sortTop nts) !mis' = take' maxEntries (sortTop mis) writeIORef tref (t1', c1) return (len, nts', mis') showTimeInfo :: TimeInfo -> Monitor [String] showTimeInfo (n, t) = getConfigValue decDigits >>= \d -> showInfo n (showDigits d t) t showTimeInfos :: [TimeInfo] -> Monitor [[String]] showTimeInfos = mapM showTimeInfo runTop :: TimesRef -> Float -> [String] -> Monitor String runTop tref scale _ = do (no, ps, ms) <- io $ topProcesses tref scale pstr <- showTimeInfos ps mstr <- showMemInfos ms parseTemplate $ show no : concat (zipWith (++) pstr mstr) ++ repeat "N/A" startTop :: [String] -> Int -> (String -> IO ()) -> IO () startTop a r cb = do cr <- getSysVar ClockTick c <- getCurrentTime tref <- newIORef ([], c) let scale = fromIntegral cr / 100 _ <- topProcesses tref scale runM a topConfig (runTop tref scale) r cb ����������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Uptime.hs��������������������������������������������������������0000664�0000000�0000000�00000002565�12513250503�0020712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������------------------------------------------------------------------------------ -- | -- Module : Plugins.Monitors.Uptime -- Copyright : (c) 2010 Jose Antonio Ortega Ruiz -- License : BSD3-style (see LICENSE) -- -- Maintainer : jao@gnu.org -- Stability : unstable -- Portability : unportable -- Created: Sun Dec 12, 2010 20:26 -- -- -- Uptime -- ------------------------------------------------------------------------------ module Plugins.Monitors.Uptime (uptimeConfig, runUptime) where import Plugins.Monitors.Common import qualified Data.ByteString.Lazy.Char8 as B uptimeConfig :: IO MConfig uptimeConfig = mkMConfig "Up <days>d <hours>h <minutes>m" ["days", "hours", "minutes", "seconds"] readUptime :: IO Float readUptime = fmap (read . B.unpack . head . B.words) (B.readFile "/proc/uptime") secsPerDay :: Integer secsPerDay = 24 * 3600 uptime :: Monitor [String] uptime = do t <- io readUptime u <- getConfigValue useSuffix let tsecs = floor t secs = tsecs `mod` secsPerDay days = tsecs `quot` secsPerDay hours = secs `quot` 3600 mins = (secs `mod` 3600) `div` 60 ss = secs `mod` 60 str x s = if u then show x ++ s else show x mapM (`showWithColors'` days) [str days "d", str hours "h", str mins "m", str ss "s"] runUptime :: [String] -> Monitor String runUptime _ = uptime >>= parseTemplate �������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Volume.hs��������������������������������������������������������0000664�0000000�0000000�00000014646�12513250503�0020721�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Volume -- Copyright : (c) 2011, 2013, 2015 Thomas Tuegel -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A monitor for ALSA soundcards -- ----------------------------------------------------------------------------- module Plugins.Monitors.Volume (runVolume, volumeConfig) where import Control.Applicative ((<$>)) import Control.Monad ( join, liftM2, liftM3, mplus ) import Data.Traversable (sequenceA) import Plugins.Monitors.Common import Sound.ALSA.Mixer import qualified Sound.ALSA.Exception as AE import System.Console.GetOpt volumeConfig :: IO MConfig volumeConfig = mkMConfig "Vol: <volume>% <status>" ["volume", "volumebar", "volumevbar", "dB","status", "volumeipat"] data VolumeOpts = VolumeOpts { onString :: String , offString :: String , onColor :: Maybe String , offColor :: Maybe String , highDbThresh :: Float , lowDbThresh :: Float , volumeIconPattern :: Maybe IconPattern } defaultOpts :: VolumeOpts defaultOpts = VolumeOpts { onString = "[on] " , offString = "[off]" , onColor = Just "green" , offColor = Just "red" , highDbThresh = -5.0 , lowDbThresh = -30.0 , volumeIconPattern = Nothing } options :: [OptDescr (VolumeOpts -> VolumeOpts)] options = [ Option "O" ["on"] (ReqArg (\x o -> o { onString = x }) "") "" , Option "o" ["off"] (ReqArg (\x o -> o { offString = x }) "") "" , Option "" ["lowd"] (ReqArg (\x o -> o { lowDbThresh = read x }) "") "" , Option "" ["highd"] (ReqArg (\x o -> o { highDbThresh = read x }) "") "" , Option "C" ["onc"] (ReqArg (\x o -> o { onColor = Just x }) "") "" , Option "c" ["offc"] (ReqArg (\x o -> o { offColor = Just x }) "") "" , Option "" ["volume-icon-pattern"] (ReqArg (\x o -> o { volumeIconPattern = Just $ parseIconPattern x }) "") "" ] parseOpts :: [String] -> IO VolumeOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs percent :: Integer -> Integer -> Integer -> Float percent v' lo' hi' = (v - lo) / (hi - lo) where v = fromIntegral v' lo = fromIntegral lo' hi = fromIntegral hi' formatVol :: Integer -> Integer -> Integer -> Monitor String formatVol lo hi v = showPercentWithColors $ percent v lo hi formatVolBar :: Integer -> Integer -> Integer -> Monitor String formatVolBar lo hi v = showPercentBar (100 * x) x where x = percent v lo hi formatVolVBar :: Integer -> Integer -> Integer -> Monitor String formatVolVBar lo hi v = showVerticalBar (100 * x) x where x = percent v lo hi formatVolDStr :: Maybe IconPattern -> Integer -> Integer -> Integer -> Monitor String formatVolDStr ipat lo hi v = showIconPattern ipat $ percent v lo hi switchHelper :: VolumeOpts -> (VolumeOpts -> Maybe String) -> (VolumeOpts -> String) -> Monitor String switchHelper opts cHelp strHelp = return $ colorHelper (cHelp opts) ++ strHelp opts ++ maybe "" (const "</fc>") (cHelp opts) formatSwitch :: VolumeOpts -> Bool -> Monitor String formatSwitch opts True = switchHelper opts onColor onString formatSwitch opts False = switchHelper opts offColor offString colorHelper :: Maybe String -> String colorHelper = maybe "" (\c -> "<fc=" ++ c ++ ">") formatDb :: VolumeOpts -> Integer -> Monitor String formatDb opts dbi = do h <- getConfigValue highColor m <- getConfigValue normalColor l <- getConfigValue lowColor d <- getConfigValue decDigits let db = fromIntegral dbi / 100.0 digits = showDigits d db startColor | db >= highDbThresh opts = colorHelper h | db < lowDbThresh opts = colorHelper l | otherwise = colorHelper m stopColor | null startColor = "" | otherwise = "</fc>" return $ startColor ++ digits ++ stopColor runVolume :: String -> String -> [String] -> Monitor String runVolume mixerName controlName argv = do opts <- io $ parseOpts argv (lo, hi, val, db, sw) <- io readMixer p <- liftMonitor $ liftM3 formatVol lo hi val b <- liftMonitor $ liftM3 formatVolBar lo hi val v <- liftMonitor $ liftM3 formatVolVBar lo hi val d <- getFormatDB opts db s <- getFormatSwitch opts sw ipat <- liftMonitor $ liftM3 (formatVolDStr $ volumeIconPattern opts) lo hi val parseTemplate [p, b, v, d, s, ipat] where readMixer = AE.catch (withMixer mixerName $ \mixer -> do control <- getControlByName mixer controlName (lo, hi) <- liftMaybe $ getRange <$> volumeControl control val <- getVal $ volumeControl control db <- getDB $ volumeControl control sw <- getSw $ switchControl control return (lo, hi, val, db, sw)) (const $ return (Nothing, Nothing, Nothing, Nothing, Nothing)) volumeControl :: Maybe Control -> Maybe Volume volumeControl c = join $ (playback . volume <$> c) `mplus` (common . volume <$> c) switchControl :: Maybe Control -> Maybe Switch switchControl c = join $ (playback . switch <$> c) `mplus` (common . switch <$> c) liftMaybe :: Maybe (IO (a,b)) -> IO (Maybe a, Maybe b) liftMaybe = fmap (liftM2 (,) (fmap fst) (fmap snd)) . sequenceA liftMonitor :: Maybe (Monitor String) -> Monitor String liftMonitor Nothing = unavailable liftMonitor (Just m) = m channel v r = AE.catch (getChannel FrontLeft v) (const $ return $ Just r) getDB :: Maybe Volume -> IO (Maybe Integer) getDB Nothing = return Nothing getDB (Just v) = channel (dB v) 0 getVal :: Maybe Volume -> IO (Maybe Integer) getVal Nothing = return Nothing getVal (Just v) = channel (value v) 0 getSw :: Maybe Switch -> IO (Maybe Bool) getSw Nothing = return Nothing getSw (Just s) = channel s False getFormatDB :: VolumeOpts -> Maybe Integer -> Monitor String getFormatDB _ Nothing = unavailable getFormatDB opts (Just d) = formatDb opts d getFormatSwitch :: VolumeOpts -> Maybe Bool -> Monitor String getFormatSwitch _ Nothing = unavailable getFormatSwitch opts (Just sw) = formatSwitch opts sw unavailable = getConfigValue naString ������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Weather.hs�������������������������������������������������������0000664�0000000�0000000�00000015523�12513250503�0021044�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Weather -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A weather monitor for Xmobar -- ----------------------------------------------------------------------------- module Plugins.Monitors.Weather where import Plugins.Monitors.Common import qualified Control.Exception as CE import Network.HTTP import Text.ParserCombinators.Parsec weatherConfig :: IO MConfig weatherConfig = mkMConfig "<station>: <tempC>C, rh <rh>% (<hour>)" -- template ["station" -- available replacements , "stationState" , "year" , "month" , "day" , "hour" , "windCardinal" , "windAzimuth" , "windMph" , "windKnots" , "visibility" , "skyCondition" , "tempC" , "tempF" , "dewPointC" , "dewPointF" , "rh" , "pressure" ] data WeatherInfo = WI { stationPlace :: String , stationState :: String , year :: String , month :: String , day :: String , hour :: String , windCardinal :: String , windAzimuth :: String , windMph :: String , windKnots :: String , visibility :: String , skyCondition :: String , tempC :: Int , tempF :: Int , dewPointC :: Int , dewPointF :: Int , humidity :: Int , pressure :: Int } deriving (Show) pTime :: Parser (String, String, String, String) pTime = do y <- getNumbersAsString char '.' m <- getNumbersAsString char '.' d <- getNumbersAsString char ' ' (h:hh:mi:mimi) <- getNumbersAsString char ' ' return (y, m, d ,h:hh:":"++mi:mimi) -- Occasionally there is no wind and a METAR report gives simply, "Wind: Calm:0" pWind0 :: ( String -- cardinal direction , String -- azimuth direction , String -- speed (MPH) , String -- speed (knot) ) pWind0 = ("μ", "μ", "0", "0") pWind :: Parser ( String -- cardinal direction , String -- azimuth direction , String -- speed (MPH) , String -- speed (knot) ) pWind = let tospace = manyTill anyChar (char ' ') wind0 = do manyTill skipRestOfLine (string "Wind: Calm:0") return pWind0 windVar = do manyTill skipRestOfLine (string "Wind: Variable at ") mph <- tospace string "MPH (" knot <- tospace manyTill anyChar newline return ("μ", "μ", mph, knot) wind = do manyTill skipRestOfLine (string "Wind: from the ") cardinal <- tospace char '(' azimuth <- tospace string "degrees) at " mph <- tospace string "MPH (" knot <- tospace manyTill anyChar newline return (cardinal, azimuth, mph, knot) in try wind0 <|> try windVar <|> wind pTemp :: Parser (Int, Int) pTemp = do let num = digit <|> char '-' <|> char '.' f <- manyTill num $ char ' ' manyTill anyChar $ char '(' c <- manyTill num $ char ' ' skipRestOfLine return (floor (read c :: Double), floor (read f :: Double)) pRh :: Parser Int pRh = do s <- manyTill digit (char '%' <|> char '.') return $ read s pPressure :: Parser Int pPressure = do manyTill anyChar $ char '(' s <- manyTill digit $ char ' ' skipRestOfLine return $ read s {- example of 'http://weather.noaa.gov/pub/data/observations/metar/decoded/VTUD.TXT': Station name not available Aug 11, 2013 - 10:00 AM EDT / 2013.08.11 1400 UTC Wind: from the N (350 degrees) at 1 MPH (1 KT):0 Visibility: 4 mile(s):0 Sky conditions: mostly clear Temperature: 77 F (25 C) Dew Point: 73 F (23 C) Relative Humidity: 88% Pressure (altimeter): 29.77 in. Hg (1008 hPa) ob: VTUD 111400Z 35001KT 8000 FEW030 25/23 Q1008 A2977 INFO R RWY30 cycle: 14 -} parseData :: Parser [WeatherInfo] parseData = do (st, ss) <- try (string "Station name not available" >> return ("??", "??")) <|> (do st <- getAllBut "," space ss <- getAllBut "(" return (st, ss) ) skipRestOfLine >> getAllBut "/" (y,m,d,h) <- pTime (wc, wa, wm, wk) <- pWind v <- getAfterString "Visibility: " sk <- getAfterString "Sky conditions: " skipTillString "Temperature: " (tC,tF) <- pTemp skipTillString "Dew Point: " (dC, dF) <- pTemp skipTillString "Relative Humidity: " rh <- pRh skipTillString "Pressure (altimeter): " p <- pPressure manyTill skipRestOfLine eof return [WI st ss y m d h wc wa wm wk v sk tC tF dC dF rh p] defUrl :: String defUrl = "http://weather.noaa.gov/pub/data/observations/metar/decoded/" stationUrl :: String -> String stationUrl station = defUrl ++ station ++ ".TXT" getData :: String -> IO String getData station = do let request = getRequest (stationUrl station) CE.catch (simpleHTTP request >>= getResponseBody) errHandler where errHandler :: CE.IOException -> IO String errHandler _ = return "<Could not retrieve data>" formatWeather :: [WeatherInfo] -> Monitor String formatWeather [WI st ss y m d h wc wa wm wk v sk tC tF dC dF r p] = do cel <- showWithColors show tC far <- showWithColors show tF parseTemplate [st, ss, y, m, d, h, wc, wa, wm, wk, v, sk, cel, far, show dC, show dF, show r , show p ] formatWeather _ = getConfigValue naString runWeather :: [String] -> Monitor String runWeather str = do d <- io $ getData $ head str i <- io $ runP parseData d formatWeather i weatherReady :: [String] -> Monitor Bool weatherReady str = do let station = head str request = headRequest (stationUrl station) io $ CE.catch (simpleHTTP request >>= checkResult) errHandler where errHandler :: CE.IOException -> IO Bool errHandler _ = return False checkResult result = case result of Left _ -> return False Right response -> case rspCode response of -- Permission or network errors are failures; anything -- else is recoverable. (4, _, _) -> return False (5, _, _) -> return False (_, _, _) -> return True �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Monitors/Wireless.hs������������������������������������������������������0000664�0000000�0000000�00000003626�12513250503�0021243�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Wireless -- Copyright : (c) Jose Antonio Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose Antonio Ortega Ruiz -- Stability : unstable -- Portability : unportable -- -- A monitor reporting ESSID and link quality for wireless interfaces -- ----------------------------------------------------------------------------- module Plugins.Monitors.Wireless (wirelessConfig, runWireless) where import System.Console.GetOpt import Plugins.Monitors.Common import IWlib data WirelessOpts = WirelessOpts { qualityIconPattern :: Maybe IconPattern } defaultOpts :: WirelessOpts defaultOpts = WirelessOpts { qualityIconPattern = Nothing } options :: [OptDescr (WirelessOpts -> WirelessOpts)] options = [ Option "" ["quality-icon-pattern"] (ReqArg (\d opts -> opts { qualityIconPattern = Just $ parseIconPattern d }) "") "" ] parseOpts :: [String] -> IO WirelessOpts parseOpts argv = case getOpt Permute options argv of (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs wirelessConfig :: IO MConfig wirelessConfig = mkMConfig "<essid> <quality>" ["essid", "quality", "qualitybar", "qualityvbar", "qualityipat"] runWireless :: String -> [String] -> Monitor String runWireless iface args = do opts <- io $ parseOpts args wi <- io $ getWirelessInfo iface na <- getConfigValue naString let essid = wiEssid wi qlty = fromIntegral $ wiQuality wi e = if essid == "" then na else essid ep <- showWithPadding e q <- if qlty >= 0 then showPercentWithColors (qlty / 100) else showWithPadding "" qb <- showPercentBar qlty (qlty / 100) qvb <- showVerticalBar qlty (qlty / 100) qipat <- showIconPattern (qualityIconPattern opts) (qlty / 100) parseTemplate [ep, q, qb, qvb, qipat] ����������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/PipeReader.hs�������������������������������������������������������������0000664�0000000�0000000�00000002605�12513250503�0017650�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.PipeReader -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin for reading from named pipes -- ----------------------------------------------------------------------------- module Plugins.PipeReader where import System.IO import Plugins import System.Posix.Files import Control.Concurrent(threadDelay) import Control.Exception import Control.Monad(forever, unless) data PipeReader = PipeReader String String deriving (Read, Show) instance Exec PipeReader where alias (PipeReader _ a) = a start (PipeReader p _) cb = do let (def, pipe) = split ':' p unless (null def) (cb def) checkPipe pipe h <- openFile pipe ReadWriteMode forever (hGetLineSafe h >>= cb) where split c xs | c `elem` xs = let (pre, post) = span (c /=) xs in (pre, dropWhile (c ==) post) | otherwise = ([], xs) checkPipe :: FilePath -> IO () checkPipe file = handle (\(SomeException _) -> waitForPipe) $ do status <- getFileStatus file unless (isNamedPipe status) waitForPipe where waitForPipe = threadDelay 1000 >> checkPipe file ���������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/StdinReader.hs������������������������������������������������������������0000664�0000000�0000000�00000002406�12513250503�0020033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Plugins.StdinReader -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A plugin for reading from `stdin`. -- -- Exports: -- - `StdinReader` to safely display stdin content (striping actions). -- - `UnsafeStdinReader` to display stdin content as-is. -- ----------------------------------------------------------------------------- module Plugins.StdinReader (StdinReader(..)) where import Prelude import System.Posix.Process import System.Exit import System.IO import Control.Exception (SomeException(..), handle) import Plugins import Actions (stripActions) data StdinReader = StdinReader | UnsafeStdinReader deriving (Read, Show) instance Exec StdinReader where start stdinReader cb = do s <- handle (\(SomeException e) -> do hPrint stderr e; return "") (hGetLineSafe stdin) cb $ escape stdinReader s eof <- isEOF if eof then exitImmediately ExitSuccess else start stdinReader cb escape :: StdinReader -> String -> String escape StdinReader = stripActions escape UnsafeStdinReader = id ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/Utils.hs������������������������������������������������������������������0000664�0000000�0000000�00000002053�12513250503�0016725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������------------------------------------------------------------------------------ -- | -- Module: Plugins.Utils -- Copyright: (c) 2010 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: Jose A Ortega Ruiz <jao@gnu.org> -- Stability: unstable -- Portability: unportable -- Created: Sat Dec 11, 2010 20:55 -- -- -- Miscellaneous utility functions -- ------------------------------------------------------------------------------ module Plugins.Utils (expandHome, changeLoop, safeHead) where import Control.Monad import Control.Concurrent.STM import System.Environment import System.FilePath expandHome :: FilePath -> IO FilePath expandHome ('~':'/':path) = fmap (</> path) (getEnv "HOME") expandHome p = return p changeLoop :: Eq a => STM a -> (a -> IO ()) -> IO () changeLoop s f = atomically s >>= go where go old = do f old go =<< atomically (do new <- s guard (new /= old) return new) safeHead :: [a] -> Maybe a safeHead [] = Nothing safeHead (x:_) = Just x �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Plugins/XMonadLog.hs��������������������������������������������������������������0000664�0000000�0000000�00000005175�12513250503�0017465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.StdinReader -- Copyright : (c) Spencer Janssen -- License : BSD-style (see LICENSE) -- -- Maintainer : Spencer Janssen <spencerjanssen@gmail.com> -- Stability : unstable -- Portability : unportable -- -- A plugin to display information from _XMONAD_LOG, specified at -- http://code.haskell.org/XMonadContrib/XMonad/Hooks/DynamicLog.hs -- ----------------------------------------------------------------------------- module Plugins.XMonadLog (XMonadLog(..)) where import Control.Monad import Graphics.X11 import Graphics.X11.Xlib.Extras import Plugins #ifdef UTF8 #undef UTF8 import Codec.Binary.UTF8.String as UTF8 #define UTF8 #endif import Foreign.C (CChar) import XUtil (nextEvent') import Actions (stripActions) data XMonadLog = XMonadLog | UnsafeXMonadLog | XPropertyLog String | UnsafeXPropertyLog String | NamedXPropertyLog String String | UnsafeNamedXPropertyLog String String deriving (Read, Show) instance Exec XMonadLog where alias XMonadLog = "XMonadLog" alias UnsafeXMonadLog = "UnsafeXMonadLog" alias (XPropertyLog atom) = atom alias (NamedXPropertyLog _ name) = name alias (UnsafeXPropertyLog atom) = atom alias (UnsafeNamedXPropertyLog _ name) = name start x cb = do let atom = case x of XMonadLog -> "_XMONAD_LOG" UnsafeXMonadLog -> "_XMONAD_LOG" XPropertyLog a -> a UnsafeXPropertyLog a -> a NamedXPropertyLog a _ -> a UnsafeNamedXPropertyLog a _ -> a sanitize = case x of UnsafeXMonadLog -> id UnsafeXPropertyLog _ -> id UnsafeNamedXPropertyLog _ _ -> id _ -> stripActions d <- openDisplay "" xlog <- internAtom d atom False root <- rootWindow d (defaultScreen d) selectInput d root propertyChangeMask let update = do mwp <- getWindowProperty8 d xlog root maybe (return ()) (cb . sanitize . decodeCChar) mwp update allocaXEvent $ \ep -> forever $ do nextEvent' d ep e <- getEvent ep case e of PropertyEvent { ev_atom = a } | a == xlog -> update _ -> return () return () decodeCChar :: [CChar] -> String #ifdef UTF8 #undef UTF8 decodeCChar = UTF8.decode . map fromIntegral #define UTF8 #else decodeCChar = map (toEnum . fromIntegral) #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Runnable.hs�����������������������������������������������������������������������0000664�0000000�0000000�00000004050�12513250503�0015751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE ExistentialQuantification, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar.Runnable -- Copyright : (c) Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- The existential type to store the list of commands to be executed. -- I must thank Claus Reinke for the help in understanding the mysteries of -- reading existential types. The Read instance of Runnable must be credited to -- him. -- -- See here: -- http:\/\/www.haskell.org\/pipermail\/haskell-cafe\/2007-July\/028227.html -- ----------------------------------------------------------------------------- module Runnable where import Control.Monad import Text.Read import Config (runnableTypes) import Commands data Runnable = forall r . (Exec r, Read r, Show r) => Run r instance Exec Runnable where start (Run a) = start a alias (Run a) = alias a trigger (Run a) = trigger a instance Show Runnable where show (Run x) = show x instance Read Runnable where readPrec = readRunnable class ReadAsAnyOf ts ex where -- | Reads an existential type as any of hidden types ts readAsAnyOf :: ts -> ReadPrec ex instance ReadAsAnyOf () ex where readAsAnyOf ~() = mzero instance (Show t, Read t, Exec t, ReadAsAnyOf ts Runnable) => ReadAsAnyOf (t,ts) Runnable where readAsAnyOf ~(t,ts) = r t `mplus` readAsAnyOf ts where r ty = do { m <- readPrec; return (Run (m `asTypeOf` ty)) } -- | The 'Prelude.Read' parser for the 'Runnable' existential type. It -- needs an 'Prelude.undefined' with a type signature containing the -- list of all possible types hidden within 'Runnable'. See 'Config.runnableTypes'. -- Each hidden type must have a 'Prelude.Read' instance. readRunnable :: ReadPrec Runnable readRunnable = prec 10 $ do Ident "Run" <- lexP parens $ readAsAnyOf runnableTypes ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Runnable.hs-boot������������������������������������������������������������������0000664�0000000�0000000�00000000275�12513250503�0016717�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE ExistentialQuantification #-} module Runnable where import Commands data Runnable = forall r . (Exec r,Read r,Show r) => Run r instance Read Runnable instance Exec Runnable �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Signal.hs�������������������������������������������������������������������������0000664�0000000�0000000�00000003715�12513250503�0015427�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE DeriveDataTypeable, CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Signal -- Copyright : (c) Andrea Rosatto -- : (c) Jose A. Ortega Ruiz -- : (c) Jochen Keil -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Signal handling, including DBUS when available -- ----------------------------------------------------------------------------- module Signal where import Data.Typeable (Typeable) import Control.Concurrent.STM import Control.Exception hiding (handle) import System.Posix.Signals import Graphics.X11.Types (Button) import Graphics.X11.Xlib.Types (Position) #ifdef DBUS import DBus (IsVariant(..)) import Control.Monad ((>=>)) #endif import Plugins.Utils (safeHead) data WakeUp = WakeUp deriving (Show,Typeable) instance Exception WakeUp data SignalType = Wakeup | Reposition | ChangeScreen | Hide Int | Reveal Int | Toggle Int | TogglePersistent | Action Button Position deriving (Read, Show) #ifdef DBUS instance IsVariant SignalType where toVariant = toVariant . show fromVariant = fromVariant >=> parseSignalType #endif parseSignalType :: String -> Maybe SignalType parseSignalType = fmap fst . safeHead . reads -- | Signal handling setupSignalHandler :: IO (TMVar SignalType) setupSignalHandler = do tid <- newEmptyTMVarIO installHandler sigUSR2 (Catch $ updatePosHandler tid) Nothing installHandler sigUSR1 (Catch $ changeScreenHandler tid) Nothing return tid updatePosHandler :: TMVar SignalType -> IO () updatePosHandler sig = do atomically $ putTMVar sig Reposition return () changeScreenHandler :: TMVar SignalType -> IO () changeScreenHandler sig = do atomically $ putTMVar sig ChangeScreen return () ���������������������������������������������������xmobar-0.23.1/src/StatFS.hsc������������������������������������������������������������������������0000664�0000000�0000000�00000004753�12513250503�0015524�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : StatFS -- Copyright : (c) Jose A Ortega Ruiz -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A binding to C's statvfs(2) -- ----------------------------------------------------------------------------- {-# LANGUAGE CPP, ForeignFunctionInterface, EmptyDataDecls #-} module StatFS ( FileSystemStats(..), getFileSystemStats ) where import Foreign import Foreign.C.Types import Foreign.C.String import Data.ByteString (useAsCString) import Data.ByteString.Char8 (pack) #if defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__APPLE__) || defined (__DragonFly__) #define IS_BSD_SYSTEM #endif #ifdef IS_BSD_SYSTEM # include <sys/param.h> # include <sys/mount.h> #else # include <sys/vfs.h> #endif data FileSystemStats = FileSystemStats { fsStatBlockSize :: Integer -- ^ Optimal transfer block size. , fsStatBlockCount :: Integer -- ^ Total data blocks in file system. , fsStatByteCount :: Integer -- ^ Total bytes in file system. , fsStatBytesFree :: Integer -- ^ Free bytes in file system. , fsStatBytesAvailable :: Integer -- ^ Free bytes available to non-superusers. , fsStatBytesUsed :: Integer -- ^ Bytes used. } deriving (Show, Eq) data CStatfs #ifdef IS_BSD_SYSTEM foreign import ccall unsafe "sys/mount.h statfs" #else foreign import ccall unsafe "sys/vfs.h statvfs" #endif c_statfs :: CString -> Ptr CStatfs -> IO CInt toI :: CULong -> Integer toI = toInteger getFileSystemStats :: String -> IO (Maybe FileSystemStats) getFileSystemStats path = allocaBytes (#size struct statfs) $ \vfs -> useAsCString (pack path) $ \cpath -> do res <- c_statfs cpath vfs if res /= 0 then return Nothing else do bsize <- (#peek struct statfs, f_bsize) vfs bcount <- (#peek struct statfs, f_blocks) vfs bfree <- (#peek struct statfs, f_bfree) vfs bavail <- (#peek struct statfs, f_bavail) vfs let bpb = toI bsize return $ Just FileSystemStats { fsStatBlockSize = bpb , fsStatBlockCount = toI bcount , fsStatByteCount = toI bcount * bpb , fsStatBytesFree = toI bfree * bpb , fsStatBytesAvailable = toI bavail * bpb , fsStatBytesUsed = toI (bcount - bfree) * bpb } ���������������������xmobar-0.23.1/src/Window.hs�������������������������������������������������������������������������0000664�0000000�0000000�00000017107�12513250503�0015461�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : Window -- Copyright : (c) 2011-15 Jose A. Ortega Ruiz -- : (c) 2012 Jochen Keil -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- Window manipulation functions -- ----------------------------------------------------------------------------- module Window where import Prelude import Control.Applicative ((<$>)) import Control.Monad (when, unless) import Graphics.X11.Xlib hiding (textExtents, textWidth) import Graphics.X11.Xlib.Extras import Graphics.X11.Xinerama import Foreign.C.Types (CLong) import Data.Function (on) import Data.List (maximumBy) import Data.Maybe (fromMaybe) import System.Posix.Process (getProcessID) import Config import XUtil -- $window -- | The function to create the initial window createWin :: Display -> XFont -> Config -> IO (Rectangle,Window) createWin d fs c = do let dflt = defaultScreen d srs <- getScreenInfo d rootw <- rootWindow d dflt (as,ds) <- textExtents fs "0" let ht = as + ds + 4 r = setPosition c (position c) srs (fi ht) win <- newWindow d (defaultScreenOfDisplay d) rootw r (overrideRedirect c) setProperties c d win setStruts r c d win srs when (lowerOnStart c) $ lowerWindow d win unless (hideOnStart c) $ showWindow r c d win return (r,win) -- | Updates the size and position of the window repositionWin :: Display -> Window -> XFont -> Config -> IO Rectangle repositionWin d win fs c = do srs <- getScreenInfo d (as,ds) <- textExtents fs "0" let ht = as + ds + 4 r = setPosition c (position c) srs (fi ht) moveResizeWindow d win (rect_x r) (rect_y r) (rect_width r) (rect_height r) setStruts r c d win srs return r setPosition :: Config -> XPosition -> [Rectangle] -> Dimension -> Rectangle setPosition c p rs ht = case p' of Top -> Rectangle rx ry rw h TopP l r -> Rectangle (rx + fi l) ry (rw - fi l - fi r) h TopW a i -> Rectangle (ax a i) ry (nw i) h TopSize a i ch -> Rectangle (ax a i) ry (nw i) (mh ch) Bottom -> Rectangle rx ny rw h BottomW a i -> Rectangle (ax a i) ny (nw i) h BottomP l r -> Rectangle (rx + fi l) ny (rw - fi l - fi r) h BottomSize a i ch -> Rectangle (ax a i) (ny' ch) (nw i) (mh ch) Static cx cy cw ch -> Rectangle (fi cx) (fi cy) (fi cw) (fi ch) OnScreen _ p'' -> setPosition c p'' [scr] ht where (scr@(Rectangle rx ry rw rh), p') = case p of OnScreen i x -> (fromMaybe (picker rs) $ safeIndex i rs, x) _ -> (picker rs, p) ny = ry + fi (rh - ht) center i = rx + fi (div (remwid i) 2) right i = rx + fi (remwid i) remwid i = rw - pw (fi i) ax L = const rx ax R = right ax C = center pw i = rw * min 100 i `div` 100 nw = fi . pw . fi h = fi ht mh h' = max (fi h') h ny' h' = ry + fi (rh - mh h') safeIndex i = lookup i . zip [0..] picker = if pickBroadest c then maximumBy (compare `on` rect_width) else head setProperties :: Config -> Display -> Window -> IO () setProperties c d w = do let mkatom n = internAtom d n False card <- mkatom "CARDINAL" atom <- mkatom "ATOM" setTextProperty d w "xmobar" wM_CLASS setTextProperty d w "xmobar" wM_NAME wtype <- mkatom "_NET_WM_WINDOW_TYPE" dock <- mkatom "_NET_WM_WINDOW_TYPE_DOCK" changeProperty32 d w wtype atom propModeReplace [fi dock] when (allDesktops c) $ do desktop <- mkatom "_NET_WM_DESKTOP" changeProperty32 d w desktop card propModeReplace [0xffffffff] pid <- mkatom "_NET_WM_PID" getProcessID >>= changeProperty32 d w pid card propModeReplace . return . fi setStruts' :: Display -> Window -> [Foreign.C.Types.CLong] -> IO () setStruts' d w svs = do let mkatom n = internAtom d n False card <- mkatom "CARDINAL" pstrut <- mkatom "_NET_WM_STRUT_PARTIAL" strut <- mkatom "_NET_WM_STRUT" changeProperty32 d w pstrut card propModeReplace svs changeProperty32 d w strut card propModeReplace (take 4 svs) setStruts :: Rectangle -> Config -> Display -> Window -> [Rectangle] -> IO () setStruts r c d w rs = do let svs = map fi $ getStrutValues r (position c) (getRootWindowHeight rs) setStruts' d w svs getRootWindowHeight :: [Rectangle] -> Int getRootWindowHeight srs = maximum (map getMaxScreenYCoord srs) where getMaxScreenYCoord sr = fi (rect_y sr) + fi (rect_height sr) getStrutValues :: Rectangle -> XPosition -> Int -> [Int] getStrutValues r@(Rectangle x y w h) p rwh = case p of OnScreen _ p' -> getStrutValues r p' rwh Top -> [0, 0, st, 0, 0, 0, 0, 0, nx, nw, 0, 0] TopP _ _ -> [0, 0, st, 0, 0, 0, 0, 0, nx, nw, 0, 0] TopW _ _ -> [0, 0, st, 0, 0, 0, 0, 0, nx, nw, 0, 0] TopSize {} -> [0, 0, st, 0, 0, 0, 0, 0, nx, nw, 0, 0] Bottom -> [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, nx, nw] BottomP _ _ -> [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, nx, nw] BottomW _ _ -> [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, nx, nw] BottomSize {} -> [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, nx, nw] Static {} -> getStaticStrutValues p rwh where st = fi y + fi h sb = rwh - fi y nx = fi x nw = fi (x + fi w - 1) -- get some reaonable strut values for static placement. getStaticStrutValues :: XPosition -> Int -> [Int] getStaticStrutValues (Static cx cy cw ch) rwh -- if the yPos is in the top half of the screen, then assume a Top -- placement, otherwise, it's a Bottom placement | cy < (rwh `div` 2) = [0, 0, st, 0, 0, 0, 0, 0, xs, xe, 0, 0] | otherwise = [0, 0, 0, sb, 0, 0, 0, 0, 0, 0, xs, xe] where st = cy + ch sb = rwh - cy xs = cx -- a simple calculation for horizontal (x) placement xe = xs + cw getStaticStrutValues _ _ = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] drawBorder :: Border -> Int -> Display -> Drawable -> GC -> Pixel -> Dimension -> Dimension -> IO () drawBorder b lw d p gc c wi ht = case b of NoBorder -> return () TopB -> drawBorder (TopBM 0) lw d p gc c wi ht BottomB -> drawBorder (BottomBM 0) lw d p gc c wi ht FullB -> drawBorder (FullBM 0) lw d p gc c wi ht TopBM m -> sf >> sla >> drawLine d p gc 0 (fi m + boff) (fi wi) (fi m + boff) BottomBM m -> let rw = fi ht - fi m + boff in sf >> sla >> drawLine d p gc 0 rw (fi wi) rw FullBM m -> let mp = fi m pad = 2 * fi mp + fi lw in sf >> sla >> drawRectangle d p gc mp mp (wi - pad + 1) (ht - pad) where sf = setForeground d gc c sla = setLineAttributes d gc (fi lw) lineSolid capNotLast joinMiter boff = borderOffset b lw -- boff' = calcBorderOffset lw :: Int hideWindow :: Display -> Window -> IO () hideWindow d w = do setStruts' d w (replicate 12 0) unmapWindow d w >> sync d False showWindow :: Rectangle -> Config -> Display -> Window -> IO () showWindow r c d w = do mapWindow d w getScreenInfo d >>= setStruts r c d w sync d False isMapped :: Display -> Window -> IO Bool isMapped d w = ism <$> getWindowAttributes d w where ism (WindowAttributes { wa_map_state = wms }) = wms /= waIsUnmapped borderOffset :: (Integral a) => Border -> Int -> a borderOffset b lw = case b of BottomB -> negate boffs BottomBM _ -> negate boffs TopB -> boffs TopBM _ -> boffs _ -> 0 where boffs = calcBorderOffset lw calcBorderOffset :: (Integral a) => Int -> a calcBorderOffset = ceiling . (/2) . toDouble where toDouble = fi :: (Integral a) => a -> Double ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/XPMFile.hsc�����������������������������������������������������������������������0000664�0000000�0000000�00000004577�12513250503�0015630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE FlexibleContexts, ForeignFunctionInterface #-} ----------------------------------------------------------------------------- -- | -- Module : XPMFile -- Copyright : (C) 2014 Alexander Shabalin -- License : BSD3 -- -- Maintainer : jao@gnu.org -- Stability : unstable -- Portability : unportable -- ----------------------------------------------------------------------------- module XPMFile(readXPMFile) where #if MIN_VERSION_mtl(2, 2, 1) import Control.Monad.Except(MonadError(..)) #else import Control.Monad.Error(MonadError(..)) #endif import Control.Monad.Trans(MonadIO(..)) import Graphics.X11.Xlib(Dimension, Display(..), Drawable, Pixmap) import Foreign.C.String(CString, withCString) import Foreign.C.Types(CInt(..), CLong) import Foreign.Ptr(Ptr) import Foreign.Marshal.Alloc(alloca, allocaBytes) import Foreign.Storable(peek, peekByteOff, pokeByteOff) #include <X11/xpm.h> foreign import ccall "XpmReadFileToPixmap" xpmReadFileToPixmap :: Display -> Drawable -> CString -> Ptr Pixmap -> Ptr Pixmap -> Ptr () -> IO CInt readXPMFile :: (MonadError String m, MonadIO m) => Display -> Drawable -> String -> m (Dimension, Dimension, Pixmap, Maybe Pixmap) readXPMFile display d filename = toError $ withCString filename $ \c_filename -> alloca $ \pixmap_return -> alloca $ \shapemask_return -> allocaBytes (#size XpmAttributes) $ \attributes -> do (#poke XpmAttributes, valuemask) attributes ((#const XpmReturnAllocPixels) :: CLong) res <- xpmReadFileToPixmap display d c_filename pixmap_return shapemask_return attributes case res of 0 -> do width <- (#peek XpmAttributes, width) attributes height <- (#peek XpmAttributes, height) attributes pixmap <- peek pixmap_return shapemask <- peek shapemask_return return $ Right (width, height, pixmap, if shapemask == 0 then Nothing else Just shapemask) 1 -> return $ Left "readXPMFile: XpmColorError" -1 -> return $ Left "readXPMFile: XpmOpenFailed" -2 -> return $ Left "readXPMFile: XpmFileInvalid" -3 -> return $ Left "readXPMFile: XpmNoMemory" -4 -> return $ Left "readXPMFile: XpmColorFailed" _ -> return $ Left "readXPMFile: Unknown error" where toError m = either throwError return =<< liftIO m ���������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/XUtil.hsc�������������������������������������������������������������������������0000664�0000000�0000000�00000015455�12513250503�0015426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������----------------------------------------------------------------------------- -- | -- Module : XUtil -- Copyright : (C) 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz -- (C) 2007 Andrea Rossato -- License : BSD3 -- -- Maintainer : jao@gnu.org -- Stability : unstable -- Portability : unportable -- ----------------------------------------------------------------------------- {-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-} module XUtil ( XFont , initFont , initCoreFont , initUtf8Font , textExtents , textWidth , printString , newWindow , nextEvent' , readFileSafe , hGetLineSafe , io , fi ) where import Control.Concurrent import Control.Monad (when) import Control.Monad.Trans import Control.Exception (SomeException, handle) import Foreign import Graphics.X11.Xlib hiding (textExtents, textWidth) import qualified Graphics.X11.Xlib as Xlib (textExtents, textWidth) import Graphics.X11.Xlib.Extras import System.Mem.Weak ( addFinalizer ) import System.Posix.Types (Fd(..)) import System.IO #if defined XFT || defined UTF8 # if __GLASGOW_HASKELL__ < 612 import qualified System.IO.UTF8 as UTF8 (readFile,hGetLine) # else import qualified System.IO as UTF8 (readFile,hGetLine) # endif #endif #if defined XFT import Data.List import MinXft import Graphics.X11.Xrender #endif import ColorCache readFileSafe :: FilePath -> IO String #if defined XFT || defined UTF8 readFileSafe = UTF8.readFile #else readFileSafe = readFile #endif hGetLineSafe :: Handle -> IO String #if defined XFT || defined UTF8 hGetLineSafe = UTF8.hGetLine #else hGetLineSafe = hGetLine #endif -- Hide the Core Font/Xft switching here data XFont = Core FontStruct | Utf8 FontSet #ifdef XFT | Xft [AXftFont] #endif -- | When initFont gets a font name that starts with 'xft:' it switchs -- to the Xft backend Example: 'xft:Sans-10' initFont :: Display ->String -> IO XFont initFont d s = #ifdef XFT let xftPrefix = "xft:" in if xftPrefix `isPrefixOf` s then fmap Xft $ initXftFont d s else #endif #if defined UTF8 || __GLASGOW_HASKELL__ >= 612 fmap Utf8 $ initUtf8Font d s #else fmap Core $ initCoreFont d s #endif miscFixedFont :: String miscFixedFont = "-misc-fixed-*-*-*-*-*-*-*-*-*-*-*-*" -- | Given a fontname returns the font structure. If the font name is -- not valid the default font will be loaded and returned. initCoreFont :: Display -> String -> IO FontStruct initCoreFont d s = do f <- handle fallBack getIt addFinalizer f (freeFont d f) return f where getIt = loadQueryFont d s fallBack :: SomeException -> IO FontStruct fallBack = const $ loadQueryFont d miscFixedFont -- | Given a fontname returns the font structure. If the font name is -- not valid the default font will be loaded and returned. initUtf8Font :: Display -> String -> IO FontSet initUtf8Font d s = do setupLocale (_,_,f) <- handle fallBack getIt addFinalizer f (freeFontSet d f) return f where getIt = createFontSet d s fallBack :: SomeException -> IO ([String], String, FontSet) fallBack = const $ createFontSet d miscFixedFont #ifdef XFT initXftFont :: Display -> String -> IO [AXftFont] initXftFont d s = do setupLocale let fontNames = wordsBy (== ',') (drop 4 s) fonts <- mapM openFont fontNames return fonts where openFont fontName = do f <- openAXftFont d (defaultScreenOfDisplay d) fontName addFinalizer f (closeAXftFont d f) return f wordsBy p str = case dropWhile p str of "" -> [] str' -> w : wordsBy p str'' where (w, str'') = break p str' #endif textWidth :: Display -> XFont -> String -> IO Int textWidth _ (Utf8 fs) s = return $ fi $ wcTextEscapement fs s textWidth _ (Core fs) s = return $ fi $ Xlib.textWidth fs s #ifdef XFT textWidth dpy (Xft xftdraw) s = do gi <- xftTxtExtents' dpy xftdraw s return $ xglyphinfo_xOff gi #endif textExtents :: XFont -> String -> IO (Int32,Int32) textExtents (Core fs) s = do let (_,a,d,_) = Xlib.textExtents fs s return (a,d) textExtents (Utf8 fs) s = do let (_,rl) = wcTextExtents fs s ascent = fi $ - (rect_y rl) descent = fi $ rect_height rl + (fi $ rect_y rl) return (ascent, descent) #ifdef XFT textExtents (Xft xftfonts) _ = do ascent <- fi `fmap` xft_ascent' xftfonts descent <- fi `fmap` xft_descent' xftfonts return (ascent, descent) #endif printString :: Display -> Drawable -> XFont -> GC -> String -> String -> Position -> Position -> String -> Int -> IO () printString d p (Core fs) gc fc bc x y s a = do setFont d gc $ fontFromFontStruct fs withColors d [fc, bc] $ \[fc', bc'] -> do setForeground d gc fc' when (a == 255) (setBackground d gc bc') drawImageString d p gc x y s printString d p (Utf8 fs) gc fc bc x y s a = withColors d [fc, bc] $ \[fc', bc'] -> do setForeground d gc fc' when (a == 255) (setBackground d gc bc') io $ wcDrawImageString d p fs gc x y s #ifdef XFT printString dpy drw fs@(Xft fonts) _ fc bc x y s al = do withDrawingColors dpy drw fc bc $ \draw -> \fc' -> \bc' -> do when (al == 255) $ do (a,d) <- textExtents fs s gi <- xftTxtExtents' dpy fonts s drawXftRect draw bc' x (y - a + 1) (xglyphinfo_xOff gi) (a + d + 1) drawXftString' draw fc' fonts (toInteger x) (toInteger y) s #endif -- | Creates a window with the attribute override_redirect set to True. -- Windows Managers should not touch this kind of windows. newWindow :: Display -> Screen -> Window -> Rectangle -> Bool -> IO Window newWindow dpy scr rw (Rectangle x y w h) o = do let visual = defaultVisualOfScreen scr attrmask = if o then cWOverrideRedirect else 0 allocaSetWindowAttributes $ \attributes -> do set_override_redirect attributes o createWindow dpy rw x y w h 0 (defaultDepthOfScreen scr) inputOutput visual attrmask attributes -- | A version of nextEvent that does not block in foreign calls. nextEvent' :: Display -> XEventPtr -> IO () nextEvent' d p = do pend <- pending d if pend /= 0 then nextEvent d p else do threadWaitRead (Fd fd) nextEvent' d p where fd = connectionNumber d io :: MonadIO m => IO a -> m a io = liftIO -- | Short-hand for 'fromIntegral' fi :: (Integral a, Num b) => a -> b fi = fromIntegral #if __GLASGOW_HASKELL__ < 612 && (defined XFT || defined UTF8) #include <locale.h> foreign import ccall unsafe "locale.h setlocale" setlocale :: CInt -> CString -> IO CString setupLocale :: IO () setupLocale = withCString "" (setlocale $ #const LC_ALL) >> return () # else setupLocale :: IO () setupLocale = return () #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/src/Xmobar.hs�������������������������������������������������������������������������0000664�0000000�0000000�00000027544�12513250503�0015450�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Xmobar -- Copyright : (c) 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz -- (c) 2007 Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org> -- Stability : unstable -- Portability : unportable -- -- A status bar for the Xmonad Window Manager -- ----------------------------------------------------------------------------- module Xmobar ( -- * Main Stuff -- $main X , XConf (..), runX , startLoop -- * Program Execution -- $command , startCommand -- * Window Management -- $window , createWin -- * Printing -- $print , drawInWin, printStrings ) where import Prelude hiding (lookup) import Graphics.X11.Xlib hiding (textExtents, textWidth) import Graphics.X11.Xlib.Extras import Graphics.X11.Xinerama import Graphics.X11.Xrandr import Control.Arrow ((&&&)) import Control.Applicative ((<$>)) import Control.Monad.Reader import Control.Concurrent import Control.Concurrent.STM import Control.Exception (handle, SomeException(..)) import Data.Bits import Data.Map hiding (foldr, map, filter) import Data.Maybe (fromJust, isJust) import Bitmap import Config import Parsers import Commands import Actions import Runnable import Signal import Window import XUtil import ColorCache #ifdef XFT import Graphics.X11.Xft import MinXft (drawBackground) #endif #ifdef DBUS import IPC.DBus #endif -- $main -- -- The Xmobar data type and basic loops and functions. -- | The X type is a ReaderT type X = ReaderT XConf IO -- | The ReaderT inner component data XConf = XConf { display :: Display , rect :: Rectangle , window :: Window , fontListS :: [XFont] , iconS :: Map FilePath Bitmap , config :: Config } -- | Runs the ReaderT runX :: XConf -> X () -> IO () runX xc f = runReaderT f xc -- | Starts the main event loop and threads startLoop :: XConf -> TMVar SignalType -> [[(Maybe ThreadId, TVar String)]] -> IO () startLoop xcfg@(XConf _ _ w _ _ _) sig vs = do #ifdef XFT xftInitFtLibrary #endif tv <- atomically $ newTVar [] _ <- forkIO (handle (handler "checker") (checker tv [] vs sig)) #ifdef THREADED_RUNTIME _ <- forkOS (handle (handler "eventer") (eventer sig)) #else _ <- forkIO (handle (handler "eventer") (eventer sig)) #endif #ifdef DBUS runIPC sig #endif eventLoop tv xcfg [] sig where handler thing (SomeException _) = void $ putStrLn ("Thread " ++ thing ++ " failed") -- Reacts on events from X eventer signal = allocaXEvent $ \e -> do dpy <- openDisplay "" xrrSelectInput dpy (defaultRootWindow dpy) rrScreenChangeNotifyMask selectInput dpy w (exposureMask .|. structureNotifyMask .|. buttonPressMask) forever $ do #ifdef THREADED_RUNTIME nextEvent dpy e #else nextEvent' dpy e #endif ev <- getEvent e case ev of ConfigureEvent {} -> atomically $ putTMVar signal Reposition ExposeEvent {} -> atomically $ putTMVar signal Wakeup RRScreenChangeNotifyEvent {} -> atomically $ putTMVar signal Reposition ButtonEvent {} -> atomically $ putTMVar signal (Action (ev_button ev) (fi $ ev_x ev)) _ -> return () -- | Send signal to eventLoop every time a var is updated checker :: TVar [String] -> [String] -> [[(Maybe ThreadId, TVar String)]] -> TMVar SignalType -> IO () checker tvar ov vs signal = do nval <- atomically $ do nv <- mapM concatV vs guard (nv /= ov) writeTVar tvar nv return nv atomically $ putTMVar signal Wakeup checker tvar nval vs signal where concatV = fmap concat . mapM (readTVar . snd) -- | Continuously wait for a signal from a thread or a interrupt handler eventLoop :: TVar [String] -> XConf -> [([Action], Position, Position)] -> TMVar SignalType -> IO () eventLoop tv xc@(XConf d r w fs is cfg) as signal = do typ <- atomically $ takeTMVar signal case typ of Wakeup -> do str <- updateString cfg tv xc' <- updateCache d w is (iconRoot cfg) str >>= \c -> return xc { iconS = c } as' <- updateActions xc r str runX xc' $ drawInWin r str eventLoop tv xc' as' signal Reposition -> reposWindow cfg ChangeScreen -> do ncfg <- updateConfigPosition cfg reposWindow ncfg Hide t -> hide (t*100*1000) Reveal t -> reveal (t*100*1000) Toggle t -> toggle t TogglePersistent -> eventLoop tv xc { config = cfg { persistent = not $ persistent cfg } } as signal Action but x -> action but x where isPersistent = not $ persistent cfg hide t | t == 0 = when isPersistent (hideWindow d w) >> eventLoop tv xc as signal | otherwise = do void $ forkIO $ threadDelay t >> atomically (putTMVar signal $ Hide 0) eventLoop tv xc as signal reveal t | t == 0 = do when isPersistent (showWindow r cfg d w) eventLoop tv xc as signal | otherwise = do void $ forkIO $ threadDelay t >> atomically (putTMVar signal $ Reveal 0) eventLoop tv xc as signal toggle t = do ismapped <- isMapped d w atomically (putTMVar signal $ if ismapped then Hide t else Reveal t) eventLoop tv xc as signal reposWindow rcfg = do r' <- repositionWin d w (head fs) rcfg eventLoop tv (XConf d r' w fs is rcfg) as signal updateConfigPosition ocfg = case position ocfg of OnScreen n o -> do srs <- getScreenInfo d return (if n == length srs then (ocfg {position = OnScreen 1 o}) else (ocfg {position = OnScreen (n+1) o})) o -> return (ocfg {position = OnScreen 1 o}) action button x = do mapM_ runAction $ filter (\(Spawn b _) -> button `elem` b) $ concatMap (\(a,_,_) -> a) $ filter (\(_, from, to) -> x >= from && x <= to) as eventLoop tv xc as signal -- $command -- | Runs a command as an independent thread and returns its thread id -- and the TVar the command will be writing to. startCommand :: TMVar SignalType -> (Runnable,String,String) -> IO (Maybe ThreadId, TVar String) startCommand sig (com,s,ss) | alias com == "" = do var <- atomically $ newTVar is atomically $ writeTVar var (s ++ ss) return (Nothing,var) | otherwise = do var <- atomically $ newTVar is let cb str = atomically $ writeTVar var (s ++ str ++ ss) h <- forkIO $ start com cb _ <- forkIO $ trigger com $ maybe (return ()) (atomically . putTMVar sig) return (Just h,var) where is = s ++ "Updating..." ++ ss updateString :: Config -> TVar [String] -> IO [[(Widget, String, Int, Maybe [Action])]] updateString conf v = do s <- atomically $ readTVar v let l:c:r:_ = s ++ repeat "" io $ mapM (parseString conf) [l, c, r] updateActions :: XConf -> Rectangle -> [[(Widget, String, Int, Maybe [Action])]] -> IO [([Action], Position, Position)] updateActions conf (Rectangle _ _ wid _) ~[left,center,right] = do let (d,fs) = (display &&& fontListS) conf strLn :: [(Widget, String, Int, Maybe [Action])] -> IO [(Maybe [Action], Position, Position)] strLn = io . mapM getCoords iconW i = maybe 0 Bitmap.width (lookup i $ iconS conf) getCoords (Text s,_,i,a) = textWidth d (fs!!i) s >>= \tw -> return (a, 0, fi tw) getCoords (Icon s,_,_,a) = return (a, 0, fi $ iconW s) partCoord off xs = map (\(a, x, x') -> (fromJust a, x, x')) $ filter (\(a, _,_) -> isJust a) $ scanl (\(_,_,x') (a,_,w') -> (a, x', x' + w')) (Nothing, 0, off) xs totSLen = foldr (\(_,_,len) -> (+) len) 0 remWidth xs = fi wid - totSLen xs offs = 1 offset a xs = case a of C -> (remWidth xs + offs) `div` 2 R -> remWidth xs L -> offs fmap concat $ mapM (\(a,xs) -> (\xs' -> partCoord (offset a xs') xs') <$> strLn xs) $ zip [L,C,R] [left,center,right] -- $print -- | Draws in and updates the window drawInWin :: Rectangle -> [[(Widget, String, Int, Maybe [Action])]] -> X () drawInWin wr@(Rectangle _ _ wid ht) ~[left,center,right] = do r <- ask let (c,d) = (config &&& display) r (w,fs) = (window &&& fontListS ) r strLn = io . mapM getWidth iconW i = maybe 0 Bitmap.width (lookup i $ iconS r) getWidth (Text s,cl,i,_) = textWidth d (fs!!i) s >>= \tw -> return (Text s,cl,i,fi tw) getWidth (Icon s,cl,i,_) = return (Icon s,cl,i,fi $ iconW s) p <- io $ createPixmap d w wid ht (defaultDepthOfScreen (defaultScreenOfDisplay d)) #if XFT when (alpha c /= 255) (io $ drawBackground d p (bgColor c) (alpha c) wr) #endif withColors d [bgColor c, borderColor c] $ \[bgcolor, bdcolor] -> do gc <- io $ createGC d w #if XFT when (alpha c == 255) $ do #else do #endif io $ setForeground d gc bgcolor io $ fillRectangle d p gc 0 0 wid ht -- write to the pixmap the new string printStrings p gc fs 1 L =<< strLn left printStrings p gc fs 1 R =<< strLn right printStrings p gc fs 1 C =<< strLn center -- draw border if requested io $ drawBorder (border c) (borderWidth c) d p gc bdcolor wid ht -- copy the pixmap with the new string to the window io $ copyArea d p w gc 0 0 wid ht 0 0 -- free up everything (we do not want to leak memory!) io $ freeGC d gc io $ freePixmap d p -- resync io $ sync d True verticalOffset :: (Integral b, Integral a, MonadIO m) => a -> Widget -> XFont -> Config -> m b verticalOffset ht (Text t) fontst conf | textOffset conf > -1 = return $ fi (textOffset conf) | otherwise = do (as,ds) <- io $ textExtents fontst t let margin = (fi ht - fi ds - fi as) `div` 2 return $ fi as + margin - 1 verticalOffset ht (Icon _) _ conf | iconOffset conf > -1 = return $ fi (iconOffset conf) | otherwise = return $ fi (ht `div` 2) - 1 -- | An easy way to print the stuff we need to print printStrings :: Drawable -> GC -> [XFont] -> Position -> Align -> [(Widget, String, Int, Position)] -> X () printStrings _ _ _ _ _ [] = return () printStrings dr gc fontlist offs a sl@((s,c,i,l):xs) = do r <- ask let (conf,d) = (config &&& display) r alph = alpha conf Rectangle _ _ wid ht = rect r totSLen = foldr (\(_,_,_,len) -> (+) len) 0 sl remWidth = fi wid - fi totSLen fontst = fontlist !! i offset = case a of C -> (remWidth + offs) `div` 2 R -> remWidth L -> offs (fc,bc) = case break (==',') c of (f,',':b) -> (f, b ) (f, _) -> (f, bgColor conf) valign <- verticalOffset ht s fontst conf case s of (Text t) -> io $ printString d dr fontst gc fc bc offset valign t alph (Icon p) -> io $ maybe (return ()) (drawBitmap d dr gc fc bc offset valign) (lookup p (iconS r)) printStrings dr gc fontlist (offs + l) a xs ������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/web/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12513250503�0013636�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/web/Makefile��������������������������������������������������������������������������0000664�0000000�0000000�00000001147�12513250503�0015301�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������index = ../readme.md releases = ../news.md css = xmobar.css images = xmobar-sawfish.png xmobar-xmonad.png remote = community.haskell.org:/srv/projects/xmobar/ htmls = index.html releases.html index.html: releases.html $(index) $(css) pandoc -f markdown -t html -c $(css) --toc -N -s \ $(index) > index.html releases.html: $(releases) $(css) pandoc -f markdown -t html -c $(css) -s \ $(releases) > releases.html upload-images: rsync -zav $(images) $(remote) upload-pages: $(htmls) rsync -zav $(htmls) $(css) $(remote) upload: upload-images upload-pages clean: rm -f $(htmls) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/web/xmobar-sawfish.png����������������������������������������������������������������0000664�0000000�0000000�00000023304�12513250503�0017300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������3��&IDATxwXG�wҋTDl!1vcF#ĘcXb/Xb ) *ҋt8ǡ!{Gb3s3;s[鷺!B!B!ĜDx/n&B!B!B!cYj槶|8B!B!B'�‚@!B!B!dtgJ-NyB)ieX!ЛRI d$Ed7DWRZjhZ?A-O_)DOBm]U>Mذs%,f� -NWeE-|D� )n1IJ&v]A"�e9~}l~XGNعݖ�jy;vs8pZ )o͎ ++Pq�P{ԭS|ɊMn$j7GmݶMMN%ͽw*{=VPKӶo?s#.SbiU.l<ndmHm1čz|%�eg]m`a\pq 'M<tk!+}D,Y}MSML"e&ȃ�`?#U>]ʋ>}Y$!Y;9g%<f94 LMmƹKee_2ө`Z|{M]=dv,c籈e\ԞMZQjqC)-]d;|B\Ϳ ZzzkA5!d J]sݧ$^֮]꥘K15A0:~u>aڐ /ouF 6 I!E,ZIޥؼ͛[ I!}ҷҨxrjuc"(RzrΝQo7iԜM+!y:Eqv q33mN\~+G QƯYkb&^HTf\֭VlxڹHZrӄ�U:�dWIt`y2yT7jR=yGҧ 'm|6[hc\b\iQKsC�@W|棎� νꨫ^OeۂIL;O7EʗvmͿB7�KZf[739>82D+�عr&?[6$!dĂ*݇_˂CcGOߴ2^+6Iٹ]clE?^ iOS8{96%u�=u#ҕ8}'' o>-?l�/uʔ_9%A凨S? ,j �3+qH&#|>{|MjH �άc/_ukW^zBSigdWV`yJTUl.c`̘4gƤ9q_u7_=Ϟ37bi Oiʻ!}:{$NI5ե^|;BpcF`>&U@IѕjqI1|F/(@لz4IȒ)}̪aS.ƗPWXՈvjL5Y*NmOS2j]Q,1)杹rQB)k* hjD#7jqi->8W 7@~.e1 ۲&,BWCgM0.-͚>!b|jOļ +OM !]w<uO>_e-[< ;-Y}/\[$Cr·>T9c=/^%qʧB_ rтE_Mtajiҷ�RYfgRQl|Iv8'񾎁Fʮ×0jw?eHzc̅u25�܏ѡeֺ1쒸jZds�H$Yffj~VɊ\vX�,XWL\.&!Ւ뜂'N; /jqʒ?]|-ziǡ\35o<<dNH7/Oمy_*6:1oݪ9mifFkd�7=szS�e̜9S=58&(RqAnC7mhKz&~;3ey3e-Xm CZ!ӼsƌܯҾ CꆾF�� =lRJ" o%�Jic~gk.=Y,oN-ܻtKT3rAo֘jʈ�ʩ'.&@%͏>tQAЭ߰/(gxk� pራO~q7WT痫W �0Sϲ3] ns7\r|b5`9�(!}� nNqck ːAvZ%6}b,f,c%:XYͻ8޾R^?zQ)׫yTµǤyע}CFnA�CML{*EI)y"w!3Ej*Ԏc]Je>{ݓҠ R-=;˝mA�K^TF2FMςKߣ��j=.kK=Uj)I׌C�Th)RʪĩTkOcOr�4RaEqHw[|A:qIeFW%ĉh^R-tܯQy0w)\Zإk4csǦ[4n;{\@u흇%j] ۼl ޜsrޞc;xAtD빟8o@v=Fuk�eمGw˿7@3.9x#=tp69gjI_CxS+͌R6�kA\� '2�Ǧ&lMrQ$Eĝ-yH�-Ws<V-F[֟z)%ObJ)!dNc+O^,|P@NvYʚ2UYޅZC9ޖ·>�Ľ JMii)$>�T=?{ᤋ6kq+�۱g.@%^uɝV-mk~\fck(qIZ?rʅuF�@zRIJr+̵U!{Ba͑|it=;z#F?�=?ܿ? WZv^_U%O Y(%9܊QyZKƺb_?|n鼗%kjM"ypm� pjʌy�P}ģ3�Vc8D`֐8&Ȃ蒖CzXSPAF+sΆf3&@Iҟ̺lbN1bhC?^{l'm ��;>Q,h{mx(RK_0zՎBs\�++$�oRƶ?w2ww[/'FNjf"UQ<hܘ};l7#:ڝ/<Y|܁6eo [9Qd#&U�k1Hw65k7/Sڊ�@-/Xrذqgd>;� =޿3؉_% K<(;,]>1>O.J enw}z%� HO#&Ήyf_>sMص>1#&uʑBumX6y 8^ʫx|P_^uCVvIa 3M=^9CkB]uǍ{f&T=pf@-j�|8QOFe5gVT=j*HىC>/i8&&Xv QȀ"NcJ 3 !ČR=QY1/+xm#Gل,~S $dъS?j4LJKjEMoצt%[2;r==r@-fMYv-Ț=\~ɚuӠmJqZ*!ż:#Yi/lڴ)O1M@yD|Y{~>E_}qtgþt[ڑ}[O|' KRVq!/AIU4;/_.~U+V|ԫSǺ]즨+ß#vȏ/c;C{�xzM;X}qsn2/SkuSȸUœCÄN_Z.2x1 L*Yf9a+v/i3$r=ɻu*]_} -0h律%^T~ТGɭCm=$=WTt:3|Z;1똼~kwgʐ7])RuP~aOKtm]yZTݸp; wQ?MߺZK#m'$޳P:C)aCk ߭/[PXa VvYIQymi0N,4jYo/-$%e5H/:3?슙zW S[/Rv閤!u[g2�x9+1TE6g,ٲvB)A�"*{ǫ[6R0ذϞk0(؅ 8A- NCӺ4s3uvq-|(J$čl?hcŵV~Xٵ=cDVie ,Eϱ!QբA\2ǂ~j#_>ky)<Sm딞s=QK/�&Sssg?K�8ʸ"KkBF6& hn̋GN8w/gL I[TM�h2`յn{:k|+`.^<ײטi's%F?ƭ ZS:x98޹]"ߏ@*v)ף5!SǖA"QQ*5ET{2ʪk__ s\M_Ҡq^_>jqaNun>^D9A*5e.2BHE*SML{~o�eOB\ &X.΋<=)V$uľCrZnjy6r*ބr!�ŵ?}'Țu~u,zWC^ yAۺemA1{3kkDO3cdr:wi8W<KOXsbdEg>xx$C?`E_07įWNHŁ+[W GGUըhC{�0ڹ߻4=ҩx g2P릐,߰x`/XTUJ%ca)u5(4g%bvd \ue¡ůV3v᳸>oz$H!߲eŃem;/l|f[ڻ+¶ްG' I!R,a_61UU%}N?+\6RX!: XOMml\(_M( K]zLݬc[r ;a1Ӿ+ `&םXPKI�һV۾awJN)!mX~^W=vȆǩ_Rjɱ,{ f)JicR|om 3lvȋ�0pOlf^[NY05XB;Fc JaΕ?YBr:E��bq9ugSerGޥ}mRV{>ŭ>y=Y^ۈ].�E_,Z^;{g_bX5Kou[4_h#ڊMn#��'RjE7%gR,τM !FBygF̸O`#e|VM�  T٫Uu`6~5TK^[R<ykjNmQ%ɠ{P|)l/ٖTwrLk˛CÚvWV5w,N<l1\))6u6/i8OT{d4iq�V81q[5blԩ,ugF^)ab&)3nޭ242Q;:"X�� _dkg' 9Ja}] *;"z5"/Sp-jlP%#kxu')(Uņ:0zULkרfݗǹ,ϔMQ}}pGֺ{r+H[ |jjw^)4nwԱnŷ96Ks`;&J?R*KZ1kUeƉRnɲq}87j (Rv\w^Pέ*g86&&�jC"c YQ=#ݽ,qMmIH![aV~4߶Y'<?wvݦX[W9&^T89QL^Ի[{٨$f%}^K?_.ת-1j*鳕7d?"ק}x6N+4KouM٢ǻYsD}: M- ar݉ o*� 1*yM}yQcА~ #eHQc[sڎBh&fBE�(f6LY)ٙˏˆ<%ؖ.z&Eő=ݼ-t|%gҫyaܘ"'E^ qn5eCy@ܡg _ū[ tu'<N|%)lTt� ?>ѮGm7,˻fy?ۋ4fέ~9z:0<B{ؽ߀АRcMH'^MƏI2V)R{B? cы[X3;+0 yM;;СǸ5AQeS U4D`ɒSϚ2@3>z0坹qe0*E�-;H:@ʅ,K.!,\çxA#ص�O 88-!wT2bY?#0Iu~/%ּS-x^׳1wmW$?пEP@ Ϣ;F[CK.8^'g25�U$Eb4Ĝa˲LR]ig[ѐ4:H琡=:oҤXa ,q n6 VR.!p(Rvtvu,pґ}|�ڞ;iHN|�|'}uV̟9z8+c {J!}+&cV8g™ "Z j2åK0cFC>2v@m,nsd i5*�M(s67$r0ݐO�|!k?啉<|)IaI"yJ2]YG?grq՟|}tdk?rj �mjG_b6mk[%sC-G0"_̀>]QurkDžR˶s:g7KV]n&fѾf&kM,4]~x$XlXO> . } �_ :N l;F ltZ=VdSK[|7N3XIe39n^�yLD֓B#^iW{�_^Q?&ҙznKH[]RJ8h\wXy۬Zʮ}Uaiˑ\k09WLkI߁\�mْ"9xe+ yzws�EzȰ~tPUU!%֧?weͣꦣ<N.j"߇;w~w!H$cMpl\~|uOU*[hs߬uTg+}incө$V,ȖӼCS=CiQVֿgUgɜnd. �#&C~��<'qPx^>@MСnkK=pM}4}vgT8%'CCvnZ+Hs.�З4PQT?l=ݚWak5–.1OB(Rv\��sW`72xGYnQS>p޴NʞcLlEwrǝ/\3lf]E~Wz^+0ƿr~Q۾ �o9RQOzLDڑK>MFpguAdiH}ջ\D�hn�BGK3XbʯT/mU{Z;knoh'_Y6$wkNgN:d*΁'ob߿j6B)"- {e,_?T-Vx6uZ:ryϼ`ۥ6XUϥn+u|oRV��}]}L8 %/B+./E+<_c=k|ʼn a 2|x G3�}?FVvsl.g=}ݴ¹H:|iWU{SIo�$=V7Mr8,Ϲ8'~u+ݷ[գ&3M,,%m?X;6ؗ˶{$|'>O; i;F#:3cWIUkNng$�B yL m[eMekgKsw,IXHXL^߼_4|fS+�_Y�FBKJ"[_oVV9u^F*ť5\;jPI$FBspX]냩wIJickET$IEQʒ*sIWU"k3]!Ppٚ=oIb�PjYIB$$j%%fd1ܢW*IU+~yw&0Y;ﯩ-�cm1TI+l:ї4\3Ub[?zDFX̕5%JZsx8$ _ȪBPTHX"} J̲ܫHcj:tpxmzD~uDfȔ:SFyp ~9{C�/*,D&l}ǩT\.hd3(AUݪ?Gh7Euy ĵnUDY]"6Crû5IEca[g5mz g)Կ[ZZRIC\ LJbj?GRyF{BJ"EܴHXC<c{>c{_a/ӛqmsL XD+d\[3%dQ]\j*꺙JZY![78Jqekgcj|҇TVTJ--gZVEhv֣g{ k`걍fk!⒞,n>3jrcWlC�̌cup4yRC!zf|{- @dSLX&!(sC/A'Bwz�(JUVRHߗK !B?A-/;:5B!zifgGhg&K !B6!Baa B!B!2k㒞`Y B!B!2�}F!B!B!O@!B!B!dL]N9 gB!B!B>#B!B!2>}F!B!B!d|8B!B!Bp!B!B!3B!B!B!�@S B!B!B�Y ����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/web/xmobar-xmonad.png�����������������������������������������������������������������0000664�0000000�0000000�00001675445�12513250503�0017146�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������R���IDATxeXKn\ w)uwn݅zK]i)-Z!~RZ!;Ï09sY,K@ @ @ @xd*2@ @ @ J�{z'd@ @ @ }82@ @ @ ʂR@Zi؇)uG ZUjG@ ~Q"IB) @ &O%XDO\�-75ړڼwWC~ qK_|L#yzߊ�Zeƽ~Y*~9(n{�H}|5ymZأ}ǂo?�n,�}֣/+Ve P.[�SL;X0QZuzd}ܳGOc,+,;ewfid{u'.׸.EL>uߙi~B_D?߶2q�wAG EQ'<th'JQh@83^tT(ɵ+Y|TDКÒ \M%Nb t#π$_<\YJ}>shI<k淚\*/dAJ>f%̉=d9�hբk?xMs*rcB]I��Or')*dVq/ҽ+:qCj^ݻq궼NM0c&A;?۸Yix |ުmсu]~)ϼ@TCܘuT ;�"κXE]3mzƽU)CYX7yռ.0ɗ߁ԛR!]>qڒjrxf1z:V{֟VڬgN/JV]w| WЋ TqxIHT+֪$puIUX0ȓ|yGeknkkds)G8K Rپ97Jq]$�S>Y*p=w/SAh;g6?ǫC߱CF@;]n>tĬ BwHWe gΘ2rƔ3&gq�}]YR?qa!OI{(D;ߩ V; ]852Մ_]:I7(k"忦+E{zQn}v;ꈡs(5ڸD?uը[B3*݉s$ ,TY$q:: ӹ" R1G^89{}J��B+9}><%C �%| יG�d_ՠ_<%R/ r)>ܵK7Nyt=xԉ^6^sM2R$[lN|*QiI�XM}IP 'cu57wP��e]ZvŘ1MTWo !Cm9ٱƈ:A%EKǠ1z^>9\Vt|�|~Ǵ? w|ѯ][KLϞ06B r-{oք^`dcᬅs'/;y &ܢykOF#{#) _)gBVgTЮ*LڲzZ:kʄ.u>oCm޻}yr{==x۸Ӌ3dߤG:6?Hƌo^]Բ'_W _;!gP9ѡX#\w�h?m*E :�ȒÏ{!Zzz@Z?zy"hY,mndtW�MJ$K3`ӵ3(A֡u&=z\ 7[y m=yƭh{inFp\;neƐĆ&Lk^Kof�@w!ӣWE܂V*Ir&ȧ%xޣPkeZØf fX"#5aF^vE=5Cob*7ܡ*P[Z쏪;�H^;"Obh[;ǯ!~kwة\‹[nS�8Th0KM @t88<I̳>9#gCTfҊQ^x`4<Vj5^~:0S&4){>̮g#dY}��u}֖}aܐ��`XKV@~wgݱO3M(>fΠ K~;VmS[cgW^^ENM4uN {4J `[jVv½4 ҹu|,!jRôtԡ/h1O_V hcW"q=kcyΕvE*Sd;FgSeF4$[FȨƧX4B_g¦Gȁ6Cx$x%ؿ׽;��%ha 4PgG-Պ.z:fҷ%+^:[��l'OT%y8&|ê s`:;>zQH9EQdl ]_1#ο΅%<,oĸWԟԜp՜s98�Nm[s]09Z~Ż)_Gw|[3u^B6|})?W|CM0 �9S}5emiuaZ];;wbJ܈iZ Aҿ~)3n�ίlUl�{qeE|=+nTR^WhLCڧr@s&�`p3&pz49r7j;9z};~Y3{%=GD#ߊ�DDb\2sk 9ͮuV\M 6c_z}T_;�plu55�h)+i{hNSaGֿʬLc:<{zbԺ}8δQ�@I:k <aݧ3Sy)_9x<{Ani/Ro~fO+�rݰǏl鞛(=/ �VI"nk{+}7y ]Ƕ=|C;"3BNg4zv8jPoe3FQOk av}wz{w;\qq̜似nCNM0Օ�iF͘pΤrK6w3NKfibwi�\}fLj_z@.zb]ۅ^z Mj.ޗvq@^I\?# lիU1^ٲl25ٛiկl>_'ju|΀~=?�o~ Ϥʁ$n8«tj[{1bX@WiЛ(n]Ṇ҇J߾ż bPXvCpa5lP8?!ĕ eN)]Ld}șAi+ -/=_{J -|94UAkP\:Y)e*(1o ;~wiyi{1p�0sm'WOi0F^^=Vʯɿ d_c:{KqŔ^ˆX]ab`U`/:ks vx'\\l}}u=8o]>R0FC IHϜ jݱQFhJ_ɒBozpq41ƭwf(FG޳?9o3 G{=0!pR՛o۴e*2Aw)u„mUOj9U#?>bR^(Khf|.ڽ=h�8T͉2$L.'%0%mL#?wa,R3(>9g76'$ZV~͝x|4A�8rDSu->\w]Wg4V"V \/EkUgGHǀ҈M+trvINE8b|ڼv0du^X:~zJ{gY�\ޜ|qMR<loؗ?�Ԯdmɛ>ZXɸQxY.l�@ {tpeaBmx{47y ^5jioUاw-xiCR~` xZ0qyہ>'RF?Ҥ9?qґa&�X0|^TOg,IrE7+;`�3[9@jk7MUJ*5N{X _RC}^dA@ ˁ63,z5޶;c~7b6^<JTH-_yʖ.$�hlY �]e܄7o?()i em0�[�@u?}/{eY7OQpN da�?l�Ơs5aGjҶr"nSZ}0,dB+=E<cJ&96<ڡZe'kOZh0|FТ_M)S9?TsX? ->WH[y41Ű*jM=k?+`saXot"UM?{٭K.$=նyEǯ5kiqK`RpխU&[j)EtdNc0 :e(yq�Z9~Uno.7e(&j~F̜8tҔ- 9c]A@+'p�Ym޳;# �ZeL.v<4f#v y5ƌ@J[x,ǙZ]U(h\ �ȯ}3[hJt ӅM�6qR]kSU6IʜqkK7I�U)*Ek2t5k [`}Y�vk׵߰\ du,+Kj[!`aTEjrq֠S:T͋}d٥|lƫ ֍Zb ܓn}(O$qSvk[<ԲB=uQeqU3)ØNB`'?/CXj U.l?YͿ۰¡cV|134$ ިysה}y9kY X W޶շP`w3I*/_h6ap=;@ HKS<+>,F_7,Lx毝^q\ +ɫEjP@2v9(&q$Z NqPѭ.RқX'HpovLtli۱�@ʷEU^wdbesǎ=r<K)%\tըB:{|e2^\{mްY9:/)Rvr"޺eRn=K߬M_+٪SZ >R~ L\ ;2;ve_Ϊg$SryHBq}v?^Y:sZɪkTXow޽nJ, \]/vjy)EuhҸnZ<NJMmP2}FGNgf̟tުqGo�˚'c-|+Tr xWʿC&]~�p̋'z �ڏCd1VՑm<W@g{6id%i թU;0ĉX뻽@g:d$��ЙSdS}/4�̑ibm ^9&TN{HI�M] #f̙ҫV ��ħ5�\ʊRթu9Ք~NP^EۋeрyD �VԒ~TgNoĺ1tbRl2Q�iЗuJO��UvbDU=V[${ftf<FoPѕ}CGލuԓD%UZٿ$lZZ7_'C�laSvƹ^ WhIBq+BS砡3n䔑p,K#[5ȿ+Eq2zԴoA|mxʻJ/dԹiƐWť{zV(en'd,MҲmj*�2ʾ-��%+ P="uiӹ밺Qy}t012AI�9F&Ff Ïfl�xw_)m^\7+`2si6nh!ͱ߯C$Ju[4`UKZq5̋<-9jW:�ua)"2Unm{J)ET9)R?+`*k`WPu=+;G?hQ'eエQTXЈ*{,~sGEfj>�ad 6ES~KcZwHlgkXڽiѺ ͬco�xuku~t>|đbϕIBVs,+_3(4Vh}bpzޥ ][;΃̝YFT'$ {.x�w0k+#Qb;s]d+O[ЮEa:קo1,;&s;\mzvf6`?)$BuK{pIYg?֠npdފ=^V8zN0܊HؼyJR!˛C@[7&ܳʒ|. �gK$Fk+dY?_,=Inp-fn:ԬjF:x>]<icTeYkgUW"j+/8cem93 z�<ߺ,dž�4:FȬ ԩYj MޗAUWibwö*blYlظKN 4ֻYݙ5f67[R̚P6KG]U&R^.p%^9əMr~8Ύn3MUcL~ܵ6 7"?d͖cTyW\=O�}h4φd? }�1| R_x ) ?^䪍<x--7Ğ>vT'}+WIzvn]>_?aeT',6t<;ҪRs2%;v+YόDГ$iz}v-EZrڼ~3pkۧ ΝcYhDYn-:[qe[lٱ˭<p2ǡER+Y2 O wੳCzo+ 587g�@є2c $s@};n^ dƀ?{^fuX:0bOw*8Td@7o]E+wz96wm/;eeU/ŴK^oWsdgm,'P%k4.D1t*ks8 e@0kneHJzMSu93 ѓ.9_x/q@Ծ_ [&uؒx (i&{w̺MgU;4&`ѲhvFexdjOI<I:40p#IufF.ڒT\sY`& M%٘+HBKX / =zXXJݺSp[+^qw3��f4ǿLGyXI[zZnv6L'NDj/A8HB)5,47WCf6 @?D V*T E냙*kkswb] ,3Gmeeam9½@!5*R"Qm-?PK2 [U73=)k3X0)F(K³`7CPD2` H54K@t֧0J 8\:@PJssi<3Ni4+c)4a$SadB&U-̾h<GN1 c爕 E))t.^Z Nahde;Z1{@j E0Hqý,=ン+-?쩖刕 Kn1=+T/D`XRIFg_%^4h@jq̢TŅtag�4a4ǫv pg2sZC8pY' O@ @ 3$Az0\Ј4l50l-hh@<@ @ ⿍.LG@ FAv@ O@ @ @# @ @ ,@h@ @ @ GpG"[ @ @ �z!@ @ @ J:�< B@ Q7�&K)@ /ݑGM9\ys @ Wg@@Nv2 @ e@脌@ @ 82@ @ @ ʂ_eI)T&(A)gegk.Fj$2@ o4A~qU+#rMMRuOXq$˴^e!gus7!<;).%]19^ޝAXQZ婟>~P[ZdM^8 ,]9`e$onY6l]bIB>⻷MҘ@>Fl\0Ibk޼7#N9ۯ|y%^DRI_yکE9 F!2�05qs+ݛWpkBSd|Jx MǨ$ :k1 l?o}A}B]n,]d_IGX_@9<_:2rv|d 14:2y2G? wQ1f4Sƭ)Ʋw:/=덱aPg:q3 jnRJ> ,+Mx~'ŒE2IZbx:R>�F3L! hYRWo?c<k ~F[!ˢI\<|9;+"ɗ.%IyQ_XLvA+EI"p 1 S˳^? )u_/3D: lZv݄tZ_H~73sj�ޅ>JUkK7 i}pYt,-ե)Y9R��mB�9QR뿤VSP*bJ?%o⠱<.?.꽂q~wM4κ{r\k%@ *=Vg" ЪEI)v(Ә�Pblk~xfO+'wpk1Uy;y%#LWi*=hb<w3^�ըZ*J7 RTEô*9yVIŤbx��"rFI\pOj= -ߨ�.٥*RlK& %.?V1U+B%'o'!];mJ-jg1iFŻL ^=9 $1֡CWoTVZ_KZ)2�Hy>>�U!G>MwmBTiY?#\G<)yQ_<,҂ύԿvQf\[ yR 8FW?\1s=<�>{aRΕE7RI~xRVX4�_{O"qTpD @�{vO.E;ymA̗|qZ)ݢUPh!o%Zoj#;1a7TT 3\lF*�=�Z9|9mp�HxzH *ڮ*�@|wd-e@,nZK%oh.Cw`˞Yx�`Ş)Va^ckeTåa2go=8�z롱 p<c%sFYCW:k'ںֳ̅h;dž>9tmpr/ףc  t/u#?;�dqf~=%(@ ~#E 4,3Y >�ӭ_ UgOrGWAۨFE]*$~f1"YE8/[Ъ)(I;%KȀޠvuNI#*IGn״Ic3fGͫ9U}8B֋4JiYcC^A֌}AS36n];Ujҕ�ت -oMj#ts?JEDX7Ъ^e� Y!ϟH\-7s _߰/I^:׺C@R*PP^=Ia > mʻ65Z,QdVboN۪Bxqi6ȕN>LSrix5` ՟>HX\,_QGs*L +{ML\^ZװcK.\Ӽ]oM4K?wnת?ٴߺSSkZ^Сg9umbΏyPi:cw_/m*Ü & Cw/+QRU={T0k2ҼrN<tB%$ Q(ƫfoPg ŸtSvuUתotjJ>Ǩ5UD @|muFB]8nh '7;ݲߎyL||\{7?رC77D9^5{x+F\9" ^3"1�,�D׍1_՛K!,l(so>Pr҈[.| ђ'0^iXΣ]C0^ �|q+; zUZǼ9s3ݓgQr=yt\�@z~^㳷G{Fe�\_(4/W0*=#�⾹sp ?7=>}GΉ =}#Ƣk@3喦}�wܺj[Nwi[t�{@I@hfM:QݦKZ'&hc�{٫EQ`G>sElN3O SWIe?۲~{3(Z(nܤ׾yE9�4oM){]V~FP|xJt} :,(X.~bUcw _to CR eG}moc@<U} f0 >c}(JOJh#͍ +F3u]/RϨT}ZkJ,CCj?|\J\ O31xZ=j­U&lScF$XkRkªʖ* 1Q_agI6r5�Y|DZ-I*ohߠsu{9퓃꣓n;x\�T+r][ym]hؽZyJ{=:\ڣw U/MT"<F- 'e֤\c|Eemhs253n�ycU4Lu?"@ Cc6b*mVޝolMv�AIl}sh~sK7agxiq-lrm( 5? '>=l>*#"q`R{B5rٿ;0ͻ*/3# -L$ѧ-^?ًŸ?g\:.s,_pJ>:H!TQx񫞴b}mٯBnnut䕿o=cќommWOvn8Bc;r➌ܟ[C�L*t@ ~c{lˆ3UZ� yLos2'Wkn&J5^X�|W!�0pLK�@VT(v\ytYO�O(-\ȷoCކ2լ̥a]xLEAFh<*RTK$|7Ui81�:/<^iV�0_;'M0zb4g'W[3&^hL4c]7泐oMbM_#̧ͭa&"BZq��&9$sHRc bM58�l ul"S, 3>p �nUݲއ>)_S)4Zu_ǾA~!>kAe@] Gw �4L%glT�p]?R N },>V*9&'4L4$ �~~VI1^+,L-_o@ e#H5i�Fk�H�E(Fn}gX~?�$ʭ*TGR4�JɋW~S}R+J-VkV/ͣ&_LU;80p�Y�Ja8,�$F(T�`zC՛2�z[e^}Hk�h�q*m+�߮=i �WөjG�Y�NuΖCoi[IJ7>E ~<ܽ{U N*i�c,l&�P �~4ë_ɠj K~< ,tC+cBC<PhXѤ0cέ_L߼I[Lsޖg DۑP' ⡏K8/ /_?0ڰ(-^VJuChs0ڷ}4is2BӅXsOjDj+ttosfӼs-@."c_@�P{"*F9<> sŦ7̰*V}Vdg~0%�jKuޅrG GHeof ΔXSK_h}bմ=<˫!yV5W+=$aP%+ ;TKi8�]jo3Ծ YT@ aR+�:1?,�` -mu\#ϼIx-QWïgvu�� }lw{R�`_�R6}+ **�`W~p(Xٔ9�\K'U;c{~zF[0_5$TrĿB6$AH0˘7�p9ڵJ/-M歗lˡ,Ҕo s_b&oԿ~ÿX+BZq#ԙ83̏ kGLOC <b$Yuug1s3B]ͨ_U'PQWLcR-dIXBhB:+4nl2xh1!|`YSl'-|j k\~^ɜ_k ']BM�PI\_W+D_yʱmm,s읔õ.FG+1�f^͊-\Mgk@ 0 _iXn �_`0תt9%g3:�0ݿf&Sw>zԷg�`[KX2mI- �5 �*I2y5�� I~�Tzhǘ[:/ZPں毇o78psQ$K @=I=T?"S"Y�@cy82dO??%aJ/-MXl�waY[sS1+[^Gתo_(Ij|JYVsF�|%/t`>J>T_2= cؖ믖I6VV媸0dIz �Zs<їGs*Uw2` gWw}F!@$1,iLWK:-~aY[mYy wurKHdLd3uqc�Ps̽Rl_�" R � {& pc%H>ycS`i_37ihYU+Ng*T?"@ 2ωgM?fp=RCLw5ӍWuB �-RܵE<])=ryerPKm� ;Γw%*�t�x7?qc u+QZH3>x؅c=i)rR#NΈksGRg4gRh˺àSGfЀ B<v%<* q_[MFO<53cRm`ҨKI3WCԕ[7̙΁9[w*KW>s<­B_wADF־q9 kޢ3 /)ۺ-389x7v1idx_YvM~1z 3csAXɮoZn=r;JW YlݫRUXA,j5'cݩ6b}|5N2,ő\ݵ3H`mɗLe/^|e)1J i\sY9k#nYU00&U]\Y8t\<-}o-oA43:)$+Ăܾ@ZX843Dr_P+DVI{{Z򱪁M^<yx>Nh,]4*4U?(}%˧QG@ D1L\>6a1 wEKeY*pߌ\x$i =g�-"͑k<ªjE 1vtʝAW.=�X͛1ޗM�Q'T6U;ŹׯޕxjPd_]iz y}tltᝋ$m=f<C{}#w\u#A�45ut(a=u(NDyXlE ׀|z4$M&9I��F&#i,>7J)djy\̸t:woifn=IG"r͌3>T`�UjF(PM18<z)QjR&43% L3{)YU T)9<ۯv+ŀ5 LE̋?M'Ԫ1Ø*|{ZZ}u!goMDK`4A$|by:Vȟe$]t<n|+J)u(Ra3hE4U4FQ1u|/FIͻu{@lJ@y@ Q<?mCF~+%I{BkR%us` �0/~ޕ*˹2~z&)|s7޲&T Z GLgǸK\ Š�@)R'kO'5 i s*@s pw,:ct_(3gZ5|P (�LD0I�19| @8\^i+u 5 3|}1ۜM@OӬBF_3|F5th><eڑ%h.A WǀD wYςrLSлY|Z@ ? f1LX0׵?ntTV`c/(%]̈́FاG' Ch�N议N&ه\OW⁌@ ~a+K0̛4G@ {a�e0~^ر5.",[U@ HkZ!+ siߥN3:jY.8@ @ @ G&@ @ @ DY��Y_~iIr|ISjKhR++qz|ll5&/+22*:8uzOiALI/ݺV)q�"NM N#__4AJiFfBJzBJzf4R5a0#כTSweg7V ?J_V):>E)3ya]MMQd=:\$f$K)ICo}8{Oewe+VvFC~_C7tU*,RM<{F³Jkywd[kpe^}iR2V<v_bRԧ-+ݺ_8@��y8h_V4Ǚ{ɠK?#3167ޱzYg9n4P*u%J R2=~n%Jb[](w5MEۏhQ4G;7o@ %ґJ>eaV\b_k6~2r^oOqOSce,<,c>9lF,I*߄ӌ& _RйʒUH /~a;񼔸zloYfh7x}z_G|O//Zݘj";b>6BM+Flu3SC'[b|gneEFSĿ6l*Wju]]qLCw7=pN y(av*]y$~rӱ_a%*}|z1yG0ء+JH_ KE)q�Сʋy+ٯxI^lں`qF`ց]zr֤S3jͧVG vR?~§ߖ*ɲCpҍ0B叟S]:] }/vzvߵ*F RZu'GG+3 /zx ?Mǖ i[khբ zoī5\a9 _4о[,Iy=(M;-sNtiv1#~*@#vrgye]y٥X[w?r6ϰaz]dzSטg7<0"-Qf) Ώ?!Ҍlk\Q%}wU`UY@uNkJ@j2Ӳ-m~{to>Td4iO"-?NjRE4#Udg";MknˣaOCaSdڑZ^YyPϴF-RxO%_gHE+Eg `?SC%ڔdS/(h Qls<K�,#j<7Z6�u֊8SZ{u2ĿO̵uҫ +3ƛxۿu V2-8`gg�bڧ?|+͑x%B%!9Bh\jUlҼp M\b]U<3g)a*WSϽU[xZρ �m,x ΤF.V3mYM%X(%bh lێcO,0yz{<}WZvM-'WF@q �#G^ظr+V|z|x MͯWaB-͔`<#65>P* n\w xb^r{l[{]blCw&I 'r=:6`�y!^|.'y Ў/Ibra.U;-!I2Tsh kY.,3oY яO7oҦ|Й.]ޫgǑ}?#IT+jg>~7Fc35*{dENך ѫ&_wJjķmzdR Z]ޮ_gHYVN?\z,s3О�Iȯ_ :V2gn&ɧ/�$� '"eC,[*%o'^nX=8= Է|ai 3h[_!b8ٚy_ۮSĿ R:e褛qSn cAYc6ygiHO^wzr� ,YL�VMV~�^l:�dX\e3-G=='U, }s2P;ӥqItui2aLZuP'ո## 9sʷ9>6wڰOLzvvI3Dfnޫ^}oEWI Mye 鯯\uǀ�@UTc]:US^:ѽ拘/L�|ө"'zNM5b^wnie�uuuP=$Y2_~sѸ:wٍō ٟZ-xŢG$;oSڛ-s#6Å.fA>TvGT7;<E rQ)�@᮪ l ʂ^ �|q+;GwZU}RM�rSnʨfVzC�`pN|O\6R@>O>vЍ0m kQ}=`*D_u ,9I a%;_hB[;wM`X}}D*e2mg.)]=‰bá˙9"ksB*_ˍ]4)ialKu&m5u&8aSǜxBv([37ϒ�08n^_SKfCg+ݘ8�D]X3Ew q ݽu����nСjn8|qu7*;"Lz9%d*Dc-z1v��n|:Ǿrdmg_UMy *צ׫?|sI©C(E4~[T+&֣nGesmʍaP � 5D͝U/^xE8t4�tf<ky<({:�PF|} n?<u}mW>~RH+ �n>hh/H 4,Ѯ!,se v:2O!Y�EBߑ8^O,6jIe*3%oO߈fX*9y+}Q|.& Ŀ6ЂE�Yo4MFwOEnaӽOr�E1{aފn7Sgn6ɷ=6XZ>"ӛFIU_~']�:'.5�xi#w \}a˽:l/Nk+_Q!}|Ê]MiwB'޼|KnҹNOq硃W?ޛ7O52sCاaWG>Y|weJjOߺފG(K?4tI?%5jTemרQZoPC9> u}}1F3s&}ߊ[o=x>rL~)F*E3gָN�ɓbaVеIޅchwv/JU`xdԄf;n=z]UtZujě#ßzaVQa}}Snwu.*JmCxz}:{jdNv17R�Ƅ1@Dh2z3U?IOZ~"J>Tv6\2_ҁuT�˗>:ʚ�3)ݱwFZ&\W ;YD$ϡ^6@?wN[F7[<zA[YmƞZ>M&N�*d6Mc+?!jg\y�}سrgU;,{uէy�h}=,l NJ f򙛤5ݹ17G5t2۲Q# ٿXS^sa>] K)~|ת ޷QWd|9آ᝽.^7z]Iv�R;qUIAKKt9lRώZ貝GW~^\^J;mAVu#Lb:.XJ@ y<}ܽBwj`>Oj}mj~SχIJ7'?頸}d1Gx( ˶y][ܭ-]K5z378Bc.qe� *q@1O�v}G,!7QXe uPg!z[.ma}e(BZlمj3vLʈiDqq$^ 3.4ۙ�WMΣ+DqUEN�8y8_^ I1=mYwڙ6q+Va' Mnv+e}v/4{Vl-1r^cbv,ޅ,a?4՞T � 84z)_I,Ir*z�3f2� 4ѧl{�98RcZ4#=ݯ}i$9lfTk ]2|[={p#ԡ}COss:o¿dT]^cLj5m}X>fތ#v^zp逳twMnnVU1�>íOE�qA֟R}mwh|Q<}'YlEQuab�0߫E'G;wmo_鵿aV�;ZĞRl2j&{@~|�̙A>Yo}l?-�ٮsv@Ї(_ Kz ]3e"K��" lk:��| �kҧ%�D^MW<Rjy\wƊ3NpK9K!?JD'G'Ulaq>BdӜ�)ݧvt`jSR^ �1ZԭVˑw,ߢn&Oe\c�t 5 mP^ukk"Er?$ ]'wt.KZu(2U8S+`w �lS|E@h*v �~jOСOjWP̵\۞C"qwubS ȫ)#wPߙgڒZa`J407T ̷)�T�pԝ,1\IF^_Ԫ3O>O�pszK:eWzitm]M\yk�⿞{7^r/ 8�֬ok�xv%Da�P � Ud>}.$]͛ɿ̫]];e%LvЫy9�*� s5p~*.ԛ2�z e^}Hk�h�q*mVEۑɷ_I.Rl+ N9h=cM'/'ImH]kFi^!MSdhƅd*/vLZCY Jq imuU41QGݾ>ン0{X~U�k&Xl`Q>i>9k_{8M#5�{p  7Vr c mQǎ6ڻpl:&пS~uRӦiB鵿�[z~VSmMbv9 &NPK e4e` 1z1zZ)x8N]Ov6@b`\^D١U�\=Νyq4Svط�+YT�4r-�VV.Pcl-~y�䮓&|ݪ}FoOpz,H꼌LoӢlZ~U.<zGwݖ_0wa}4$W iٱs:^9v7ϟizF{=/j. vel}WW|ZZƝm /o.>T,x,4,C:XVLDz1DZV# g׃z00q;__S7u2Pڔ% v¤@cjl<{Dm[&8~~מq'm }4r[_l]-ynfzu[D*� "Kc�RUŰ9 �@7"I+IT=|{yXO90TJ*]+1YodKIa � < on&7Ўޝef6 �NtrxJрJ׳>")Z_ ��6ߣ [PE> ?pqtw 4m_hk=ZV%I^QY=qn{?o7_.U֧| g@K*wor%+>YN_[ p =;eW~ KwK4CC0i�ʉdۿ]>NU+SVCQ}L3 2St~0ƏKD١#Qn$3a<7hۑk^ֳ*t#%�(sS�*$�2vk`w%J4f_./eጕGmiEIwU^ bӭ\]zъ7c=HWg`�a][-v ?�UzXiQwd{ykg</e_+*;ym= D}VUǂAu%c7}=AuFAg{>($pKAmZ5ڲn8|Ħ1NKu^Z=u_nN/pyBtkk'UV"+(j^Wc%ף �?�ZB瓖p|D~*i"#^b;՟jeOWV+t+a�䕓w+w~^\z;}}R.f[۱ae?&7Ў Y2ZusG˩cSϾv/5 -В}/}paFi44%Y8WWo=AiK]fg~�|פ=�a4� Mx�>q�[6�e_}[ i3ՄVvAz 5 mXvj/ Ǻk;{͍\48zI5u~ejz̀&K+ Z kZHn2�`_�;�[ͽv4Dk�@27;w\$;s7LoFmuZX.vg?v�`w1`gS%x7?qc ]} \,V;#(f} ,zxSZ1!{|ƍYQ5UVn+ iʻ_o۱:#u(� I]v1e8d(_|\8ЈG9.K �@_p ,k~% uҭcU֪A-7LwF&Y| ~5D`Fyo\_X)b!^Knk͟B5\ylꯋ8?�$!?cs%o)>cƬ awF:NΈksGRg4߀\t38| ]PБ' ;ˎ|d] �]>p5�8ü2Ms9(إh y6Tj?y#6zucFT6#w,C+~%gb8g]]y{^zͲ'\KUJ?q_H݌@;\}`l/cy s4а=HRNzC1ОumAz%*qt(!{>ݸ8{kU/(p_J;tsgFc.U_Ka#jIl7�p :9q+;M]ݕ}axq{[7cC JdS;VG 7PWnQ۹w%6^}�`qFgb`J,Zk ogP~ݽ-Qikֶd=Mkj^Lŗ[(LiԦ}Z4;XU)ºH+b5YZ,/6o_J}͸c/Y4gk|CǺKӐԩ_^We{fokȤ3hGj43z1 =m6<EnRǰMKTPbwp_ý+kiY-&_0��.s5̜\G>~o$aޡGl`KVlW[6<ml6sl*5w{蠄<\cM-M uOYM^^pRψey\No[8ߡ*1eL-)IWYl\и M>̖4XNW2/E;3;gJC_18`[izJd"r_mXVմ3G`B'KΫ];4T7%zk9mKS{z( COM_7ڎlZVĹM4=>`gpTo/Cd8b{$�fufyWaWړ= 3=>w^'|d+ pq�..Y3ʥ�Ky3Rn-sMzD|ջ#K|"^z|K@xQ`"?xQwuCDnݑS\Y̓j{z;uaiUz[H%ӓ-zSbNJ'U@amIu @0b>|զE�h44ڷ6.bYZl\6+'|IS9;Rf7^rHzz1ݔϹ$/FԖ.򘒩?k7Vh8*D*%�7SF{Q} KȈa"yqIZM9B"Zm_Q-)K2q._O�VK s}~@TέJR(1Woޭ[�bUJ-R2̭t� ^FVCN2z%/q.wpu*%I{k3$ >jn& �/~A$%2Ȧ]X>zťЫuHBM0\xE ![ stbwgmݿ*z#^_TިzޚPFGssnFZы zChy:qۆڗ6B!��^`MR;A0m}MXuaB506%+a8a?QS}qfH ΎE(<Oӡcvvh~dr.?yR.bZ9pi?o ;$�#)竄6/)Ufake0ש\6w;ѥ+|BK�FjMWٙbF.VغzTCRưq0gu+73mGo@ pwF E#\e%asZeW;.@ @�0!)dJskZҵʔ}[z"2f ۚ8K@NMվ@-=y өA4m{v܅ISV&v}+ W!?@#��4HƱ):zAɯ>f-kbϱMYywtK;2SM"V5>b}?.�M<adbYa 8úƍ;"uw0G#IDuq�DeokMʻ vn}YQ)WB 5|͐1KVeqX.e |?=JyUoR^Jk|-?\'# r?=yrIt *XڕC�+w5ZUճdW3bR3ORAR3-̘h4@ #w@#@ FE @ @ D@ @ (.QL<k۲r?%Y)yiuD95˸CL_G-<)� cl\嗊unFTC".-+Imnr �0 lsk!LK;27#7޿.)R%='@ @ X.=p^Zo(~gݖCY �peS~Yrr+8{uġ�lWammƿ[?*scYn|T4ُn.p"riL G+&�ꜤL%S`eǥivF2?,]b?~~+OIB1e>ZUl\i֮aŌ 0/�1G*/<:M7 S4g~|BqlɤaޥƟ!Q:̮%f@K46CLjOtbg_H 0kuSU@ @^/9r�:Ur}�`kf[u^sFzoKchtdeeqFGE']Ϛ^nه$ỽW-5&rLQ/їv2$;&%ЛOW;[SƲw:|ZܱwSuF?8,\F_[0nCWW�rvVsuKھ?WaZe}KKna'u>x!R;KϯhY3#8HBUf]Ҩet|EJ[sF4ÁRoւkVvb|,Pŷ2mi[CGјL=ncFΊ6wf6� Kb =oV~=KV/S/@ {!TJOv5[tNEިegCtui8V-0HJ pʸKKRR|O5U2p[+mf<.�n?gқYJW<ڣ{޵?'St$\&;zPj1eP)yh4No6jpY%3}ʚ[KYח^`qlwgv(v]m#g^]A|;�@'^gu\+)4BP7;CƢǸQU-Y�SdOF}:c3y{\;ߚοFݻxIx\}چ@fȩ#kvkyDo۔לI*-"JF{ΌaLuj^=$O}k"ML!;nײ=,SDV}F1cP<KmOJ�HyT־\:{ �wl�`G?.WUi`o_rQgN_{tnܶ[ VTXVn޳2�ǠIm] ˏsřQ[K'ء�T.DV6`Oѫ'��on]z&[vϿ1x'n�xϩg?zll˖{(ig4PR/@  N=sJۍ;1儂oDi2F HKL;Ӎ6:R4+Kɶ<rA `dޭݓKdv_E8"оU˖-|-HB|Y^�Ǚ 4c^,~.=K9{hop@UnICj2Ӳ-m1Z.IKY;[[hvQ֍ZAs�G�Y A1g/ �⸳*-lMsu@A��]ZB'\[v6`En!0~k](PIUkXBKP}JދĮx#>ZEv6in͡)Ӵ涅0>TSc`Tv[7f]nԮWoV=*vʪr&>< i)Ǿyw P$8iݝV_7^=N,\k^^HGNS|ڸZ>]pO._9ف:4gRggt@xwۋk;MXqvvAg�@%~[T*'&}Uv!! aTd9te3 /xrg<�pd?9ZTrR6U vv7o]~?w؆v?]8zUgnube/*�*= ɱRqE3�QG�f'?\7. /.w^ݫ߼sSs]:UԟP_j @> IkH=s&UJn"@ j;kuٯ G,`S8�9#P'Lq9'#u{1_\4�SSߜj �i/5D)WLk炲>lء{6IeG=;>@ ѓa={dqZ;2/>hƯ3|N^/I9[xO<}GΉ =}#Ƣk@38͙<3޿{bjTPG=='U, }s7?V}*ׯ숳:oOfݸWNegS%ӵii �o_պ"1�,p/DaӖ%VJdy� ӖTQC t3`ӼM<a`@T*J?/Mx稇# njoSڛ-s#6Å.fTr2^8aCמ%K=;<؞R٧T.X.QZ&웿0i^k6v|oEWI MyeLeSc`\/_7 0ڐ=;Rd3ʥ֍Y9geMJ,[&vk㘕׎ml7�8||5xĖg6Eky|vNi1vڅ7G�$x|tY 曣x] 0_4w][(}H}])#6/ ;QlDZydE҃ta}&I~`+wulsm栵aw_I'3 /jO*Q$9znf؛wuQȃAEK<94wk*cWw3u1Cx|bIu|r0&ONppvB6QiO- ֚jI�ʞzCgnSЃC -mOOxvPf톍i0P/*=MUL@ ğ̃۷Z_c&>!Y?nuL7M]k=|OR+vbOf5vԪRj7� AR,(HBSp2]mh A߯7H:5lګ#û0Aun_rɨ <S�>=a5h,um \r,Ykn<$~<�A1=* /v;:\*T6t}gj~b 2 ޛ7ak)d_[ܭlc9׀MWNNuv�l?tuD-O#ʈx.�dMDCASO =,ffܝM )죝֢WQyvXQDj*9TW>yX[ٯ37ְ;3^|;HxZ?h<Мe@vjT)~a5D^|k]Jq ֧uErnlSC?>&r |.>٢kr :,`8�t H $IG2 2q�h8kC.&8�h>gg>L_ :˱黎r%"�H.G1kF &�T7˰Ҟ.hʎ-kkrgiQ̅PУ<ٍ)Ͷl٭ �xUE �c<ց׌w| W,mLT9V2tL1�0=w07jw�UxY{!ۀc剓zj݃L*{WYwc�vN6>/tǡ7x_l>чCv7ڽTfj?E @ dN>^}? ACѻfn1�⻻,~�5oZ{J\j�4ԩm. nB�erwԆE;'ulЯ2UN i�mK B6zSV0�V)¦лwt$ @$5׃Kwt/FYzrU\ ~| �HZP`8V:uͣөL Ѳq!B.I1dWþ5�|۳}$[Ne'�8n-ڥ* ȟ9J6 �[}x}تf w0oGoc{9Ӏc�ZT#kar5 Ɩ/]?4>&#թC날AUXU �l >@@Y2Ű>&r_ >u I:8F�φX�)X�a�J<`V.fXBu3vwM]�pբ�� `'rNF:&ư1�U11/+<Wo} 94 �r-�0x,�ȰDP�.-v.u[7_Fu�A5maǎ]JhԿ=ڇA'I�"Ӹ0FNU;E\3~v\@L@ ğ̖LOg޽u$}۴ ͔U�kj�o Yƭ}~x/U�P~Ա#ͻ.?>f/xx�1mb3My8ϥܾ>0R[MչjQc[hl! ۹ nm_>pC%4Ы%?)xp �nlz��܀& ˷;G9�Ȍ3%`+pBMSdhr0 ߣ&sTh6zs$M ā+(h@B-˵VxRCۧaЫO93`;M c>3U_I7NJ+򮯚f1GSm�rc�M=k��(s"j �c̾eSygcFwCB#,?l �aA���IDATϮ_hmpXC9`\M_qXO=FghA/mN|� ��2�x9kC.,ZJ M-:�o❫QY X^\9ðhJ�H4>T 5m� I&�#d_gp�V}U^۽h~ƣcFȤcڽTV@ G Z4nΫ�=0(Z$Ic_\-@$1E9T7?Yɒt,t#S`.i*q� Kv8 (St‹NOhDJKFLbΦqq҈Z���ג�tjqI3H|o �gv/{|vBo[PESw%5_l`Dlt:swD~%k_:\}ww7V𿇧8 QIC vŋF\�֣Ca0^ҲOTה;˼?NVfUR^ٖm6oϙwƴAm^ۏ8k:qR kacXtt˴#_~M 3CwiZT(_BMv" *P9q뇎{"QO^J4,ĤtС#^I�CG:rLNT UʌmƂ#�Z}p.]N'FۯFyOھzvL?[ate}ۻWO:dF\cikǷܵeISc8OO7*{RهJOy.}5KD~'SNy̙SO=a.]\e_ȓgtc[=O7\Ҳ@ vKܣ^f��Ǻk;{ʍ\�X@pG].h%d�jYԂcKU@v�3gż ZcڶgٸkĀ1s-?0ԑY_!޻pu'25v'~|W4p*Ӯ=H/MJn:fɈCq�0eNC8iaA2-`hJ>|< o�.̬<x3� I{tW~kbL~U#vLceMo?w?Oit{V >q�[6�e_}{(-(->퀖=miI{w澢ÙAgj0kVK,t3�-d5r��ƕ_|B,ǸKX4`UY3/rQ_P{{> pvjbqywxb D*q']c::Ƥ >} }>t�݇뗏3Nw�yU?-%۫fɗOUkct|Spf}zK]\יG$)lgNoU�o,r'̊ ߞWO�n~0,12W�W3=e Ϝ>�|>紳P@S١ʩ玲w+v.xYJ 3?o7@ ^Ua˖mA}FvPGqYےCVvڵvW3jQ5޴oj>-a{xҥGum,U"ڱ<m/XMֻV%K/o2:z%e.W:Ψ٤`?� [<0щ(O v qM%h} aWwe#a3*fr֍lM.C3۰eׂ=Mؿ{z|:O? TU'ϦYk[.eݵ}0͝z ?nWu4]| IWXX׿kL=xF3;rvp[|Ӹ|~XZѫ,˧!QmZ417A�`QO9]#%d]YNEiR {'U# -A4ZY?h[<Eje6P}JDNFX9:}FC*P1-,N櫧MHt8HX9~$=bTГHNaTwp-zsznw=v IqIt]=gVOqݺս 6YZ%<2@ }m}Y$-s.ts(" ;7iڣƾK*2b%>D~zNQn^|\eS'E)fֶ6BARưq(>" - g<Nj\s |v9sƻǠZw?om\'%2okPJ4\΄%Z"_Vhxqr _lrxYaSJ)lҳ)iPh^ŗ[USG;KF QbP�@ _OY ҿp�@ �4@ @ n|zw`yvmG@@ &(�@ @ 9V5~_|&F@  $@ @ ([P�@ @ @ e:@ IϜ`ځ:lI܋/g[>hh7oT嫐9D%-mByU 85)^ ^82@KS8qur!Qܤkb`Ƥ@ h@ Ulp]'2dVޏƛL/׬7wO]BV[qVBUȈ~Mǯ>IR_g 3J[eC{N}k,#MyzqfZ 3MޱzYg9nj?KGNCHVw !^SBpñFsn߻v% LIo@ @ 猸Ig5&sʽjmkGy)2ooMcph=jh_|kJCWd%U@_z U۵�@AP4l͟b֛mjϷc�qwzPZdod~PGC 8RMkh0²^|#QE<wǣe #K<Ctc@ P�@ ߉7Sh,!C]ovԇLEqZ� '*ߣ 3_tiϙxX-4CfZe(ʳψ>f q_>u^ZlmS{jA/?La>UT5Ҧϻ�4*Y|VK0wF.V3mYnWMonΖ , <.IlhoNrEY,,[5Zci <:CJt3�ii<KwS;B%!9Bh慏06R+*]'Qx,PO`ޭݓKdvo.H' CcA<xPJ �زx,�Xf'.FվyP{0NCz5s)4Z нm�) <R;Sa'NbsGvx/zWٹ9MW Qr zQفJ~z]ϲw҃d ]ǵ,J7,]ϿE{=$I~jmWҟ:Rsϣ5lQ>[[n;gWo;Pg ܛMhmo_ @#;&> i)Ǿyw P$8iʃqt?4^<zJ9|X]ׯ^j nh*phhs˰cd�4g�tw՗m`&}[L|P;ӥ?aT)X37ϒ�08n^_SKfCg+ݘ8�D]X3Ew q ݽu�OTdSmmo>uiL8N �2C9QhqKgsӽ;ǯ?sWu(fӺE[?\ooWI,@4Xrr#)m9K|w'фw>?$o0@ .g< =|-7v隃HTV͆-yh3׃6i:wCE1{aފxJV�@[qA M'7�+t+_ʶ�EBߑ8^O}7ت"ɶB4Ή~sjNW6ȿsDr掄':ϵw;t#L|cq�tf<ky<({cޜɳ(9͞<{^.TpDKpG{ARǧa9v �>ƶp+zs)qjҩc)*iޭ ;jPGo|dz7 cl �ywNxp^@ zv@ ~?mW.eU1Y$ZױsОn<+3pp*?�X>t|bcʽG^*/+ ̛35�:}9�@ӧJwNnض :sFĘg١+a)ӏZuzAyuV޷Z}�d|9آ᝽.^7z]{]E�fnQ[bc.k7* b^VBPX؅͙. r}3&ٙ3fd>-'ް=%1�Py3BWh{wFFoFE]|+~Za2Ǔuk>rÙZk[sįrŌdw[=uoΌJ�^`Vk|kYyہ 赪;09V;z8Xo4g>]fF :۬C3w淿}UwY(+MgWr~CEdU�ֈ8̞Mk; ӟ.yS%BY//xpLLQf4Qnє ?HJ3$[ǃvZvw^%_=s#ܻ,h}]-soKԗt;I�(D54XJ}c ]k{3HIiք7VٻiuSS~UJQd)u[>-ht�0=pǢAexLŝxY w'4 BhBgљ4�2P@>d3�$ �n'몈>}QuLJiݪŻ7Q[ oK ʐkfƢ@Q]sMwTu릮}5"_;k~f[H(SBc)Ș?��Fef1`v/K ݵэ\^i� 7i ?,00]"/hƾe Qժkׇo#'郺2jESmHCҴȸd�w� ]�#ݦ-�1I`vlVsFf1 �4;#B_b5S�\jcg �, �?+ '�@/<;ҡ1�_8+c2$mt=#,ԇ׬ @!M�GRiҨ(AX9f~ �%Y�p5`6k~lAn&�ޞ^AXUEƃƗZ-{@ 7]xOYRL�eѿO麪ʯ^J4t))�1`@n|{OtߵA} W0vtBp�!HI:�L33[ق!+A̓L����Ӡpζ�1O\fu[.OxYFٻg,tc[it%'3幷ȚUx McI�?ݍw B];pw\Ҭ୫W?eowvu}Ғӭzq4?w<(@vZWqg.g|`iW/nd!_�#\D@w eDgƎq={0KFѡp-ɧ_2Ii3^]Е͛W�142S*@ �z'<S;#.|znR"Bnig�0Ef �bTuKYl߶波ζuò�jS7OGvtܙ/Vx|w}ABBې BL,[B+c&|M�"_AK�ȍ �M~cSR$� u^z4@�\J)'%hk.rͶm<4CJ%s ?S#㬫n}Hg[4溹a^DNJ!bI'GB;<)�dp�Ĺ)�� /1�51,NJO㱌^“rSZT-p]unQO3\ǃ .j8p41Of|³k3)|F]�xfGa*<S`*cUu¥Xha �9 OiU7/CԲԚihկW[g]M�@д1{9fVG$m@{xBUE 횓?gWF_?k̼E. :v7O �!GG$V _Q7OW ?`Qe>H)oUQk'.82K �@7\4o[V~l9EJsnȭUpu<wn^7S 1E'n賒߸v󱊏r+JjL �% e۪/!}g3�5x#d9|oYỮWRbě6S|wU*7c:6],\h9/qoM^V$1 iſ_;Ez*}Ji뢛tsޫә&ښ*z)|8OYum2_"C{�@l07Bw@#BUVߕ2׭=y&6EY='h1T翻|$c@7\tc\meΜ2NDVkb3W5M5GGΚ:kaFK=.mSiMƺFUImjIsߤ/ ]Ў^mFfnn H*3I~=*k5,ܪ2.JL绯ӿ\y|6ksٕs77kWLiC+qE8]SLJ>ӪiRt-.0~g6*x8iJ{v RU8]G32WL 1��6 (:S@:5 o2ؽkhj1eK)p뫚ܼu{BG2_4ojuTUWx)ehHQnCN;Z�pl~3d!Tub݋ڱB! \rYj�,Qt$ _y��܌I_YiVgRz:HUJ̞9UQ[sS89-ds_"2:Ɔ_$mv_زp-48x9�ٽ_�'ޭWl7*%tכ237TtI@UodRbeh]!T[2]^:>lgP.'7\i8Jvzߎ<v-EF*Uo^koU�@Aє<re&% ͍@UR>EIPGI[D*z}on�o5h>a �X/hW!'3<{JF! Yzz_Ytltť\JٵKD֖ʗ!hfF߅h<Ac o[J_*ݼrֱEoWFNB)�@9Mz͢TJ>IyZmqE!t t/<3 KGf}3AkЪST�ҝ[ЩT)Z.字RJ'ht׷,i|Z1F,Y܌i|�� u PU!* _EJoކ=+stܛ8ޢp$f^5H)BiuTKN-QglZ>sT]8uĖCǖArhB!%j֟\>BWzGW_aQI#!BGа B!B!B 8�B!B!B@S/B•BtbJӎ2+yrς:+goGR>P)qp(zM$/OdiB!/nSSK~xT !caB2 4,0u姙.vYOøh&ڳuEZ"y_Y;Gmz$Q�ܻk7Hre[׏K}ve+m$q>^~QNJ3j5i9F^wْ+akWx>GhÖ/uOp~܃UK=B!мzZ`L͗:kC@:ATJ').B?㇌1T[)eH}7o\^G;3H9}^^>v C0Y}j>ۣmtCIpe~̋ޱ/71l^ӱkZ&F{g+ĕ]Y+#yYbMaCWfڭv =+9XuLonmiYЈ/6Qyp~)KqB!~Ư̌eh9a>i."ξzM xL"%yLc}wa˦k\ B+)tR%CZ^72S&3b@k!wsI͇lK'$ELP$+ (vs݌RoDҌ=we%M.�8Mf(<1x}+8VpڳwsNY^h;Q7Z+AVj>MPg)I<xO5+ 303^J*s,J%bh1J-613"&곾liޫ;5e*؆FolJD.NqD]KU+)͍K5sv1`)sMeV.>9IN�@4I5ݬ<,W@hז|NjcyJ7U*m�yʗd]t-Nsᶍ>q-0fJ{_�=f`WRui>,�q^w⚠y~:Y8U!B@+"'O՝9睟l?B7]f&w[b1�� v$+gbЊi%ЩL�|gz�0y @" z-m4F!* oXzOzfxm+k#JNvYVȺjKo~. Hj>҅ 9u[F?~;{dsM7g&�^sK�HgH[<zpáG Uug4%,])vZ&\K9]_xw޳vH1q!4~࡭[өiWL+1&m[[ ~Ԫ= $x}5-�so/GmWL l׌+I?ͥ[ �;K#SfPo?p�q)#-[c̙=i w_QΫWR%Kۂ-L9>‚E:^CW'~yXOiUK5^�z˯פ@Z$7sg~. ˀ^fs101�t,:єvcnbS\f2r'UW1Ch`@}|n)Tno*U>ٯBX.2w~P w–Ms2(=:$ܢk2(y~LnzAc?ġdV,z!B?Gf 0|ϙł ̛ѪpJ~Pԫ^��uba';é1R\"Ң9⿦.lhXpPXp>#][5N�|2Yq%YUP7>%Yl�`s*4x(9i݁sk_{,tE 62.]`!�/0 9~Б.6OzlذcVaki_E:~NT9F&O_o҄e[Wu6K${ݽ*iOѕ" KS_Lb6C7��88[/r{sM guݘF? "|EZc>zΓC}T__50tߦ'+Pж6 [�(R"q ?yrm'.{ݍՔ秮/Tz%2jkQ'C>3BǵkAz dvytG=I!ۻ ZrQeFݴ%Om^PWz ={F|CiE׻QrÊp� %~9ËRCwݍ%#cyw G!BE?:�tّKw"W^Wz3ξ7f͢5]J~5ku�Lnr# �CK�a4raOB!p;@!{L�xp ( kE2IgzOj*�N>}QuL�HH X[g�[jQǔ�yIARaf,�j��OR4ݻgVzz-{ѽ{7V^<[_o75%dhUo٢yɿnWxvNݥK�Q �4gXՕ1ۇ/"�V߱�#,!`Bs�}G �RƟq,:�w�l0wo}h8[뫦8F37=dV]8łt)Q3mK�0=k>&")5K5^ZD �tJwې[NlagV&=it D_gǢO_)-w9iM )3ۛ|0KVi�[Jw+ݑb�ZY\2O'Ho ey9|cܻnhBJT#Bä؞yfm;{;C H7m@ޛI6E7)1u -[x.DaY %gɅ2B!%�6217Wjne .lHHjQM��!,Y^�0 -@̫5& nw`ْIzؾs GGA~)3]g곐QM2ɶ\9G'�ݓ, ć,ŁZIv�R<9զSI�rEƝZvhZ#Eӡ�Nj~3 ͡sOn"D@WZ/|i3̭ Լ}pLj ԋla í9#eYs+neEWv;rL]z{S0\ײd�Z~QnŦ;j)yFPi\2SN"/o5sV+9{ESmlcۇ�ԇ#Bf7<SFJ^>ݒE�oNR%_F3>aj�V"|.@q/9N�E�@H۽\B˥$P$ BU K!AjtY"$%WjLr�D'E6��LT(1Z3j8?;ZeTmUf-t7Ƙ|s�2ҖE�Y;QjI~,IrnI(`)r04�68Q0b0\7v7k; Dnܮ[[i@Ł]<?q}ԫs&3"&9vʰ6eK.!,�4NSZ n� wxY{iW: ztsCYFT嫪}✋$R ( > 4)}Wte0+ 5Tl }e÷Пdx*!BЪl_tzUۭf5k> �(?x N�k>3qřW�@Q3X �Tt?�d_^!b- n"_F޽gٸA "5'1Jǯ\ڿ~טy25]:tn�BH@nY/-~:x(:|Fr'DIy)�]f5AܵlcF,7z232;߆�;�ȂCvtZ&=-XFﻯo^�4f՟e� rKG�2]/i}⹟-BU}5hQZ2˄o hFf� ?X\} ,O/Ru" Rjm͕mۏ3uMtX}HIj߮'�P;vQ_/L83[ ;O�vϞ-s\KUp-FצO y �ܷKjr焲b=s…[Hix챱gF)Ya9M(�QEג16U,pB!_Ĩ%{}t){l{ 4?D,+]qm{٢U-SM޵^9eɌ)\֧z77mȠ\֤fu q@!TE]!sړgnSesCdwHP !ǎ9iS|GoX/X:"<>�Ǹ˜+2UpHF.ըy&m5&r32K �ųYqy6]ϝ&=reϰ܃tsk o9'ń ]j9&e'��ڮK<ǻ:T3Ʀi8ܨ[u}n~г�6s`0!Mgsx T2ח(m-7Z=Ѫ_M53{:T$Si1;/U1%֬#IlhhE:qJ'ݫ"FԃL0,].Xf/*ntE͢YLXWtU!hGCw}#Cシm [ێk2ߤ%Qh 䮣⣮W�_̘ҬMZlR3tK&xm^/#wRB!O1EvI$4(;&R~fJT`25᳄mbg-)'[YJH3y\m:!Ovʵf @|GH @InFJB.~eKOLϧ[1~ aJ9I6u6ImH ۷wزs>ĘڵOIfd\)]yw/>Fej}9iIjoLKKi;[4& tzab/ӤjNVjUD*SVS} _YxoV6>j⣘öe0s 1q*s"eon&NCloUIiNK~Q!Nɥp-!бv4~SVB^AOv_U8B?ޒQo@!~g9X;;th/Í!oD}33+GʢkfÉtm{j?82wvJ5�\KGߧU]ݔ~5wp3Wnnlq}5i``dPVFiy*k} b7?9U4Tz4N=a& $9ɗ׺YA;s\4ܟ u;HloUiL=g/*:+\yK ]Yv?_.QfU!B @.B!~ڨ naۤ\�S'K.ęǝ>`*^a=\ר~M7{7 ңj^n0:dBc BXSp B!B�xB!B!BB!B!BUtVKƗ�ebnĢB!B?'hAd ӅZ&&&L�PtSB];^waw 233dGC׽3ˋǢ&8ڿW)mAQ HNtS1R܏B;M~y҃wlף.S}/aDM%E=v}eW,d7B!B?׃UO<\7oŽOb\nnQo%-甓nÖo&qR/J4^4¡K]z?NE*Asd1L6}`A~͐#۬ƅW^Sal);? ̇8olW>u*JG!_ztxfM=K;z3Qg]9qkdnn#IO -4拏7e0bѣk B!Bg#%biVʥB7ߥ=;_KW$W ɪPj.n՗z7ĶE*INJI57ë�_3@O?_ R+:4ޭ, 2n_{=OZ5ۧ,j?Bbh t4g�:;f~*o-vW J=4D<}cƥsxb7҂Bpe*f˙zZ?JQo#:lE!B!T{ߍxw= TE^>xא⧼~pӄ<y54գ�?8K��l|iI>]싐r@ڻ.E' v#�ҟ]w?E&o"nHTs?ŷ~~̱vv*e٤q?!l~Zo,g6ʼ3kt/7򫩯r2 Kj;�g%h^GquLFߺ06r6_+JzZtԩcu5|*A" 9\EdϜz'm p眦�ϓ^jжKI�`pN˞iDy)RUYAU9)ҹŃQj1ՖSz)f?Bbt�أs\ _Rt|ݧx,n]},X4�]-kUJZO{NK.�L92C$`Ka6�o.,1f2֫7fTdtWU:R"s]g]ӯH[|<H%Yy<V쯘rDU}B!BUA[uA'mL5wx}Փ& ر#_/ �o?IE�FYNkϸ緌׉3>ν. '@­~[okO#{_փ䕄w0-8^~ͨ2O=pװz#l*P׳Wnɩfe9!T_M}X3W*2ڸh �4@ S�9y8>"Ηۇ�i8$%,-s_~c󚙨W3Vd/6Sjϫ~k|Rjr~YS=!}гqeF9fw �@߈H@U*vPSNQCanWSNU를ۃ!�L7gOYM5dY#XR4$XҽcGJ�^۔pQ�'E/^;rr{X@ GճP,;yg GU:597(\E|>:m}kQ2ߌs<v{PS_B!B?6s]N%`&wEEIg͵peG6/Nt숀M1;;,xrMSodƊ2$[ǃfMy_qL"rE']�(eF-}:n̲^} *:=%A0X9R oTZ~5UZN0o—OGN0HʹБ<_9sA X{VKkݼ=W{W}J r-8ϒ&E7l.'E,b^gܱ qo4=pxG�xw,9s{rs>ߝp(GcHel2SaA5=R>˩Ԕ ӗS⚅>rG)/RA~B~t�:#�ܹثF%e;ϔw[ߒ[|0g22�I#SZ5fc 1Pˤi=�RR+,plduV|O[F�h®!B!P37gQ΃Xr�K�jbb�N%�(׬ @!M�GRiҨUnrx=%�vY`zH_Y^�xW3BD"*>)aF�PM^*]~UVNzf_=Ok7A Y3ݘd r3� %咴|C1]�ҵ ޵,VoiL٩!%kIQ4t))�)uP\kkxNe')|Jfi;o0̈́AUQZ=Ulc�K-=x,Gy9U o!ޏ@s1ϬmgG7LdQ $_ˢC!Iy}}W:~: ]cSM.4w$?90J@㲥dJIGiJeqk1l ?AB!Bgo?m*>,�Y)|mmAᵞ\D�Ȱ~s/O.eJM �0 ,S�VtaHRddʹ?*{(8%��W뫪P|3s0)r�:cKI x� ��.CIl߶波ζuò ?Ż7=:]lnl䱉NNOgTJ˩&5$fQ5 �(~t9U o!ޏ@3؎8:`vFG59!vҰːko W y9z&�Hh橊d>6(P%: 7B!BAoy}UGA\6nq^}EHbFS�'�@ҵ"Yo\q=4S,!jN -L '>�56 \sgvs_=[-]~UUD{;L Q�ބQ�,-'G6=Kd9�_$.;M]lr'>}&{`CreZ}Z3 j)ӿ'לܰK-g?9y1ny˯=դS)T^*= z]v_.m(}*N^J;/�m3ZPbe- n"_F޽g� +$& � +H:[lէS:_U0Wy�%>uѸ"B!oa6ˮp<C?5 nۺ~׿;ݭ5X�::qS?6c|5I2l3E7Ց"Wݧ3M5U_fqǤ,\ SQ=eH#ߕYW__ј4/CCRT%ƚARQ9N^ܰus67ߴB9ҫqmWڮ]ǵjK\ݧ{n,ߺ6쁌R>aS78u4Fw8ax]MU:UN'o[=Ose/?m2>xo5fO9Y%͘rFL۱Sutʹh=[*/)_ʵ37mȠ\֤fu 9F]^1a~}{$aF0rY1i5-nj*\M:JKXGu he^hEKma"ewm@B!BwoG~=Kۼ?(2<L=k<k8ttOOLV ��fd4~+m#֙v=c:�޾s =q@~Ѽ9tM ca!OFljvg��dvwսF)++jŭox]sFcUsԎPxm;tޣ Q˛hL΅3hsMw?`2Iif2qp`e(7xd ̶MOA�ҵ8{RS&c s~Վ4vSTZ9U= ob݋ڱ],EdiK 9TwtDD2yI<)'P|U#S>K&v溸u"•kTdA] !/poɨSvyYwA$ъ.yI2S Rwy<1SDx4)N)) @NFjj֌YFrKIlnXͤV%.*(~|zH >%W̔[Vri^V��/_V6A 4,*J)R!zꝃίCߋB!B觢};05tRqѷPJ.ZD(ӿYVO]kTUWE9`h(/-K^ɯjY*+]K3ۈ% q@9ұ`SĠ26 _f{JRʩfc{@! h0E!B![jiv?֯Oߧ%ũ{&8BdRB!B8cF cd?d=BJ4lB!B!B?@#B!B!)p $!1ښKe4�-s#VBU9+Gʕtw̉^=لfpᳯj TًGo^V8&%J[myHuSSvB!P @'u;ZAYF-G _M9kr2ޑۣ*3dw223"GhC{OdgƼ]KU^}) 4;QUΊ!o9-0LR SWg3,Z4q牑'W/\<-.8fHS<:y?2ܥ!̤:wյK'}ϱ;ڈ&EQYҮ9w8GbSR ԯoL>,:ʳ耽G �@xs̅#~!PG @ [5{CGޣ.m RS[]y/os]@ЯC#ҋ @Ѣ4 4N<YTJ}'ü=~IT+?B]0{0SmM"\?!ܾq(VUSofҢӋ FۄȌ}seE09T2@p+],1a�.lmܥmuM_s"g�2^jDqw7��|=\B|HXJa3 B5�mV_L@g̱O% wReh9a>i{~OL6|^g- Pr>/Oؠ+%~I2ey,c3vY# ;Ob`ݐ07[+p1).`_NU˫\Un҂BpU:\YD*T:)!YzvL) 嵐;Sץj "O&(CFvs݌RoDҌ=we%M.�8Mf(<fy+EHkٻ9/W.?H͓[8ٿO5 n:qM;Ҩun9^nO=&@ak /9t �m-)s;DCiibA\[t431ٹdtq~cR!B?j땛=W—cWK ]-kUJZO{NK.�n}).س;|ݧx,n]},X4�zvj?]>drd$ /kQ\\r탞!#;da-M9c(nzxcF~WℙI֯W\[_U6y @" z-mJ,'BU)οa9?c!J|{FԲj(9uxۍgY!/῾yT ( qSEw^pA 4s+gxgyIS onc �I] cK݂G\~8蚡4{Eլi O^ $ŧ]w*\cYVMXQc3e]L58H<})c!+EZ"lm@i&c۽iD-^::ycxӺY]oAdX(t|w7A6u+B~㭙4m9*6<ar [o oQ,߾i-ޝ4B!BU5U(ng%ح)uߵnm{W 0OpsC`–Sߔ^*~ٱ; (ڨdE<{ǺUw{oC9z$`UoE=V GڵeegzwH{~/ˌG?xXC^E꫺_Sk64,8(,8ȦhDnVM�߭uLqVEImm';v|x.[*>� bdvK`NZw @ $tтL�`K-f�4} G<t$ħMƓc�@[EMZdGwOwp\QGfϟApe[-Y|Ybj9mM=~3o[;l#ſ93*�(R._>{YA d�`RƬNZ$2ݿ$ft� z.LUN<Y~!`EOW;B!B迫@g>]vҝK}H=Rc y-&l8#_fbG23œM'_/s�~h6`e}Y{)Pf 2b�Х_i4g%%lFYxKMZ�h,S+3RQ.DD~"Un 1-'BL�xp ( kE2IgzOj*�N>}QuL�HH X[g�[jQǔ�yIARaf,�j��O�M`äacg- {XZvx8W 5'iNդG' Yؔ?6Ӹh uHP;2.!9KZfμS|eF�q6m@Fw^,A63��̎7ұѱYv 5f\<c+�涊t wB!WUä؞yfm;Z!�� eOi2uӨ}W:~: ]S|Ӯ*EhL)� Fc=[BFv|vnSשSP%iqRA2ذdL\f|.]R&*]_&󊖷!FJmdbnx-!"DQ7J��/��Ӡ-@Ei|kF x`>]DV)[N=A�*QJڰ*:ccHKN!8�j [yh%55$(XՋ.-DV[B!BH>�`;n<xTdMfoըKBcӰѰː]Xg}à%u+EӶnQown=j潳s2Z!*_yY;5'<Pτ�,q_F3 � 0\ˌl7Լ^!a6$P-.PJ-1?7_uW�ris�H/l=z~Î$;bHζ-c#y1&�ϺE]CJ~-s܉u# ݒO ->#B!+/VGR6>SwQe*8۠4Ez74Hgw_�fNt?jXa9eA`jawY@H�io%s6d _lɥ~�JpæӀ2DjM˂[ȗQwY,'B& 횓?gWF_?k̼us]:tn�BH@nY/-~:x(:|FKR2oWܱxaL.Ac/$R۲rUTju뮟:#1;g<~vsv7r`jL �% e۪/!B~t+{٧iGm{;(;x┻yF=*fB]z)͜y_Df׭TA9-gcK%_bKXGuۨx~1^.)Fm}֍W7H7ƭY1jpKsZ߉>�1 $% 55w 4?D,+]6Z8?+_b0&MԔUn�`]OoڐA#IV-?BU5}Wn\䙠EgvHRCӷsӦް^ruDx}�q鋗9s�uT}�ҳ`q/�QU; iUMp,\%7ҏF_B@hվ#BYb{{Wj+0w_MlLz9oR|^A߆hGw6i޴~ܬ;_1W}!B!E|yt/:kv|Uyz6JFD)<4Kebmm 9Tbtk=x֯ x)ykғxRiZgdJ, JSk7J㚘hӉ^ND\k֠�' z($I�VtTfȌ--tT]ʒO.ۜT6gjaZ\ 4\iK>\DSL9DGԍlf,|BQ[s"I֓I:ԙii`ٙTh~LJL ;Q"�(?nU̅7!-v./ l ByꝃΟst.=Z*U{6Bn0gjWEFoIť\孠ٳk[Z �%C%GW #'W�ڜ&=qOA!B'9b;Lҵiޣ;BUAw _[ B\L4`; B5{Q-B!Br72V@!~6B!B!BB!B!B8B!GIs;DlBW }~W Fv5jjJ϶3gVrqʧd�~IȔkegΦRdſȧj-_~F?[`TY"4?0ѵ8 ӅZ&&&L�PtSB緍M^waw{?Ty5G;^tS1Jf}2\,$>ӖOдNof^`1GmH_,>XiON~y҃wlף.r<A$+1j!BU-GFiY*|=alE&\]<1uةy˿c]iftA�p{)'\D6(Q.IZ1�h5l߻eüϚFIڱ=̚Yo>m_dVMx?aU}R@Q@?!nQ/*כ'{Z,ϻsJESN [r"r% /Pe|yr-Ox=:<(aZ26+ePG<* )-oP4[|ͪ��VY9p� tU.OFY_ I󎉩Us.y}4GM6lTzvgޣf͗Un;Ok1`!.?dԌa]\?!ݼqy='3Oˁ nȹjva,'oڲ`]:[N7}}w<BU>R"R?%eK?k} ҩ~\VYrP.X* Y7iώ'd܀$W *R/]֭�&e/W3^M9СuW柟F{Q|ЩV[}&oi;KAЉBdf5hΤtvTpJ�VV#aD#f~()&\C-ZU~OL6X髧 ;Ob`Ѓ('`׋B?+)tR%CZ^72S&3b@k!wsI͇lK'$ELP$+ (\vs݌RoDҌ=we%M.�8Mf(<1x}+8VpڳwsNߗ+a-jߧ![L,;ry2Y:~fZ<K2ZlyiBg\=ƬPE,1Qno))ddM̌e Jͧjk^t)=-(;MgVc髉kv3Jgve̛Lդ=BwQx*z _ʮ>uU~\UnJ5Qo~\Mj}WI|_W\ۉCw#]3EQW5)4!O^ͽ>M/&��[7>$=_Z}R+ADz/"Ĺ\b�KIBpȫ{=-�gjѻɛ/6jkn/1sl<? e. �f(a;Ν,mFU[ �[h4 ֋e=0O8hj,֗r$3Nv"r__8g=:oaϕ%_O'-ׯU4>éU�@*A*ٴbfmhi][wc{ݎzE?,pGo;ܗeq RSIIiiU>%Щ#{) ۹>=CFVwԅZX4݆O8X3SB(As߰ Dӱ%>W=FjYUs5:Ƴuė_߼\*Ը)?M^pA 4s+gxgyIS onc �I] cK݂G\~8蚡4{Eլi O^ *@I;&.xR2F<U}kd;ս4AO.�d<:2rږ,m 0x  �;. ^;='o6>{6�_\d$1K8ُlxo 1g.akW\|@]=_rv5Ʉpx?x�fy͸d\O?e��JN42efs`n'5xw޳ԇЁd=yt\sSzLF(M_MGSڍ+uʔ/J.XrSL8d9^%sBHUCU<�W/9?[CV�"<Q=ުJT򵛪~_eT䫴WZ_UQU/.̃>w7+/[yL}'W=<k`❐ޛoh[ػJ;r�pcT�q;iZqOO~p=;p$ 1y4"e=h�OOO^Ixy~lނ׌j!m |w >:BTri^Z\ѹyEOƗMaia)Ijhص{:AZH OvUoeRR];/ yѠɨ3A+k"V~hǢ@!f? kSmy/{Pէf 0|<O�PVz'Goݾk]\8)ˊаˉcG6VRKnXdɀ=ǎqpjn@ �PT,ܸn43ᙬ.ns(O&65k݊`&%դ�Rx_HTms:?H#ފzsɾMw;܂aɥ!~nVM�߭uLqVEImm';v|x.[*>� bdvK`NZw @ $tтL�`K-f�4} G<t$ħMƓc�@[EMZdGwOwp\S/N'/7i2;+/Ɂf>!7^p+u1{!C?�%zk[=18Xc÷υ^{Fc[-˗/_޿~{m׿\b_�|NFz+k/Kݻ1O=~<-"_ޝ8K{SG/ j !Շ7(R"q ?yrm'.{ݍU&y]o^<]iő}JA06lfhذA7lO,7.]Rw_}|U*y�靰ֺsc޼yhԸ[�Ul7Wi??Rۿ^J-o L?5{52m֡;B-9 J:kmew]0.|1�Dl:&�\vЖ�}GSR.|S x#%+=:V$ϐlR5aM~gnZ<r>Q9c;! **u#t;u;\5B gye+AЧ/Yu~ךu yQR0(:/4�!_UNRJ_vpG<wM,WDB}Tm/{P3.;rNdb !e;ϐw[_\oV~խ NÍc0�٦�䧇F-�h®" կր�0fXvr�:!Q;ÎI#>ȗ9QW}j.'%'*i #& � ]^�3:jt {c /fϢ3i�e0}$gN=m֫�p;A*9F1�Z�"!`nբ �ܚ6oݪES�%eHCh�DQ� :< �6 , cͪjrdhUo٢yɿ-tf�w]tE תK=X"%*8}m9 =m,�x1�08v ]ߡ _`R ۷޾pË_QtԘqƌz٩x)v}Y�;�we:Lh�4�@>n;ÜE�>_b/sjrԭ qݶ޳�3h"R(ݳG+g==疽{]SU{"P% <ptG*}:盻;+v-B~\M+@I?<-ݏT 字5�p-];u<x&t~44D3#<Q"y+_f5odĂo$�`PY㚵@z)M�GR$Unrx6%@�6UK �w&(̈W>zܪW`5S�\jg( �x1Wl8pkw{� eUbFTmPvY�l~I彾(qDUä؞yfm;5 27LdQ F|MZ+sa -[8c@BcA4:9]B3Zv3g &oPeSVOBS(~ �PANJ1B#%�621/|-!"DQ7J��'��Ӡ_-@Ei|kF x`̓}S҅3ԗӦJΡSEg/'45?Q_Ko_t 6MPr �1 -ZZO%y�7wjiP/)], j%EHTSʷcA,[25Qw.Q̥4H%4Gi|J/UTl# \G>4WJse]mtJRՏ.|K]_[/UIykBu[ְJJOh4$ �8FVfhlk5 W."Ubi7N>$OZORDnP*��S=,S�>qfd]9?f=p3mi T/\+�( Xj�vM˰d�0vr31 /uYJ8Pel/EyUm$U ƃG5h2{F?'JDml+>Q/c\H42a!,Y0hI]US �da_ /'!*_ζ&֢E 8"B,݆ee\31˵n X@nU�0mn� GoؑdGl:Jӡ1lۊkU<Atq>lm � v٣.>S]sY3VGZ.ПYVwԲ&ɹ% .$O\w�SCF(bqg>3/՚q&v Sk=Bw)oTt~q^.S7OMUx[:U~M?R<i|j}U[e`-©MY:qQ۸y!y2+`eTF2K׊kwgݿqlL|#W :R,0�`k c3ds7ٹ~�nySJζk>-ˌAxNvUn�Z_YI iˢ$=[9Ac@T'U_I3/VGR6&E8(Ka5^+�(gۍHBgw_�fNteJs걂eLL0g0ۻ, U$WmЮ7ce+E4aW@!0kNc{_\1b djΏt$<1� >X|9F<]^l[;$tEQt$eޮc8yØ\n$A1G=b`#)yq�@*baAq-FצO y �ܷKǂ+d-~FW|Գ߂a�@fu�hLml_9_�/T/%]E�tmܛW˝N9UVTV{"R㼎 -0SJioCEQ#SYZ_>_R۲rUTj~خ~Fl6ˮp<C?5 nۺ~׿;ݭ5X�::qS?6c|5I2l3E7Ց"Wݧ3M5U_fqǤ,\ +o]*P~U&Mk �>rtFhW;GUmuTXt-�-Sθ R`w6l��Rac*v-Ey';?͕⣶<qݼCqlh-L$l](^#ll|+RES̘*%n}yGvo[bԀ9}5m%k\Օ/7BrC溵'ݦ(:˰d-. *A:1};=m* +WGWx3`jΈ]O�,= 7aF6s`0!Mgsx.>A>۠2}嵞o+uE' R]j מ>(n iZ+7j_KgQAqbˆ.t2}|ZC6rFe3i{49�/o:U;6W<^1<0e*=BP_U+ֵ6l^.A4@f;ޖNGu_я(+Oj{9J˷,ʾj_!'c \ȻyiEGQsg] )Ci4u�`ьom:®gL'�wn޺=#nh/7:Ia :;Tm;ty˯rc}p~m)m6_R��r32sd$�dOAJo*i+zi<iG#/._kyvlG w[R㭚ru~D|yt/:kv|Uyz6?eB $)|Bg25᳄mbgre$U-\"QZJe`mIoeg4C <JD!ű48BR\rYj�,Qt$%)92cK }w+K^zbz>ls2RbW1Mʩd@&)9ɞgZ‡\J޲%Hѕ_<?kY|0-s6i_͑J lS'oQ^t4! :q|lO*{KFBG)oTt~q%'YZ}{^QtT*G?[1*ʣ$_ux{i_:4e$KƊre&VP^6O3a|-"4ᜌUmu|6I+MC)txIޏm~'ӓ;�Ҭ_geVPWq�)%&?r<2b\.(8z` @wd^^<B?hBUJF'Z֍� AtSMiv8BsQB!BJjiv@ަI@& \iGB!Bf[!h!B!B!~F!B!p���IDATB!S�H“Z0'%O$mB!B߉80veg /R3*̥.?[qnV\J*-'B!is@'u;ZAYVt*ᵻhYT֩(37#6k[ՈY( I4}%;kTz#<?Df~f[kjVFa92jȟ͛wC =VEW^_B!]~:?ʛ'{Z1 5@m~js矯=lj!BdAE#_ 1SΉsCc7e[!oGFoLgiG~=j|)7~md$dԬnipv~̬1Soe,TdР2e)ѣk^yú^xsͧ۾bR[UӪ/jB!B )K:ոr)oIJPAcÏ{W|EuQ,m}lէ#BXx6C]}<~5E.'B!Qw@lק91sS ~Ýķl5Pk �zL4 7A[8aGghd8oⳭ .@ 7)H >~Z=<k)H"3tt¢|^w sL]=Z'(~0rP+Q.OD5vr XI9<1MP!B! 8i~7>S8�@�@�nwcPpm/?MȓWs?OS=:�; �֍ ϗVQ" .;{Y<یի�2h4!:{a&lQor"B5�mѹ {/)crHQ4UtR�ʫ~L Γ ғ}9p.d%]j˦#3D9�avK uuM>c%n dlZ Z16�}y-xy)0K[v  �o.,1f2֫7f{ ,w9y mVXwoSvn<cAWi})Yv^N`�s=O'-ׯU4>éU+}h[Z 56\܇B!BA[uA'mL Gu{ >yN׬Ɗ|CPzؑ/Wt˷"� I#, EO|Oλ?f]ԡuߊd�2$2*-'B!Uh(n8,&k>JɲG$va[v.?qAg==0c_ζs`S/-XT*=h%`ݠ�~ѾaK&eTsnQ83*<uba'֢d<Sx�R4$XҽcGJ�f|Yrc}y[ 5kHJkְ͋򟳜5tþ@Ɏx-jCuT*R\Z4CEʲ6?tzXHo>65\w+�|B!l;Eҩ7؈'YDIg͵peG6/Nt숀M1;;,xrLMKVkrqBQ[c(2mO|?R҇||U!ЙOt'2plgȻ-oY<_/"?Z."K��ӻ��?.24F~~zhriZ�@0F.)0g W+3wk4g%%lFYxibպUz6\M֭Zh\8iT}&U9sRVqaW*08 7i �fN5idx26;B!X:-j b1>�b8k[F&�\M,P,"ʒ�Ayz 5�Zz�Y"�^̕qo,�H*_B w@s1Ϭmg#&IYrL4&:u<=OqCw~4Y_ULm{mTbEgɥDž$ť� Keqk�E&4& Fʓ%iqRA2] �PANJ-3߲m; Mur{7f:g3e#B!Яuk,9 ڄY�k֞nY�142S\@ k%�Vg| Y�,n5� eXv2^�;h7ptu\!>�`;n<xTdMfoը|h BT6A�@Al6C.�(s&�2g:R1 �r)x-Eƶsl0qR3鈬gf̖ hтf>Q,�v{q7wUQ"z.Cv!`R }!B!OaqW;vrbkhmrhy2 pJN@�I^2KJUtu_Cl^f ZtsV/^k!PUSէ(/VGR6>S%Ԡd="�g{ټĵw02Y~GA�(Q{-�(J|nI&cҲ.e){&}:g^)9uj > =gC6� Vnc ڵf (L~*WRfKйMXAS@Ve夊 gw_�fNt�!B!~CH1 "?ˇ\)iv롟?s7mOߊE�퇎{,C&IӚz!ŲѰ: U@!TU;e\>O+>jA8;4̈́yRq# l̲d4pi[W]w},z뇺��A��~p<ZNbYm]OoڐA#I@%߿~, E:xA4βm/[󢥶0pɻpx58b:IIzMSW&_gKVƤ^i>A۶`咵C.XʿcWU}g/dƔHWi.WwSer!Z5BƖKׯrm-܁B!B-rMefox#s"ã(9гp Aǡ xgZ:M]j}ۇnS"BU )ѽخU%&Y|7%KNkZii:0?#26)K.NLd=;5%hg%HqML՞U!S>K&va//='eY?R҄0_e%|+;o9H"h4B|)R!gXBU\k֠�' zA!~{KFBRɧ[1CyI2S R׃y<1SDGy$RO|B٫wV:7ߋB!BUַ!l]C'7i~[ [I"BUǟ3�")ߡy)^NB!Bq2ҀBzп08~,B!BUYB߁MB!B!BghB!B!B?NQQtckk. F/KfDb^OleiYK30aW,;'OcN>?쫄l#Fy5שj,̖�ebbˍ �'+m<W1Go^VU<QO{<A$Sԩ+@.NLwq4$rVۏ|ʭVM."/ 29�ptlCL_qDb䬧ZYۧL e0q]#TY~y-_,uLGD.N:r��ha=l~%I^ûF\C23"GƊBob޼׵Dx\sѱ.�@J' ,d}%}hDgQfeF _O:aѢWW<O<w ^9S4p�چM<qzlu;]~8_bbAʽhaRspkg{8QJ6s:S1 FtvzRO\ڥ*ψ{(N� f#)U&:`�>y!s= `Մ60ыsmztjˎ4{ʈG֎dJ~!oF~1Ջw<r9ڠ/k+TT=)w fԥǣm~]҂&;&&W=_n9s:B^\{a擐Q)u咔ఋt:Nx ON3JնGm,zcBQ1k$IjCFfI27.?x/Z&?CŸΚr`AB"xa)U_/(GvΔf.lmHTs}[j>_\?m35UiUv[y!_Gm1v4m^^֏\Wnw+J跺P1R"w|*XA(c>ԻNnȹƚ+9p/~CϮꔧJvHpIGobQ}Ј/6*/ڲռCY4�3}Ѐ>.htÇ*<w+# ,;JYKt(Kb.Lg+42Lrkx$POja[QR]4ńr4e99vEBU5_]~'pٳj,E8E ǏWVp!Zgyh߳#|96Kzn߻V}4b|N{y-$Nb.Tu+)tR%CZ^72S&3b "O&(Cv^~;w9nF7ciΞㇻ2N&�Ly&0T״skkq~c?r.͕ok(!p`@m:c֛=.Y8F%)s%c@nxo rs \#7 DCiibA\[=tW~o<Efg J6DT:!&5;knTGYTl)Tl;`u,k  7kI|c+ =b ĩ]:,S[ +Ḵ0~ݏqqf.,?%cn)Y4=3&|IZZ"&J^h;Qu7Z\^mhY—9D=͏rQv6gEeJN "1 J_R̴l# ͼf7+OyTl=ʵ=}_Uʵ>dp]c QUNWb~Yz75;Lu' 7鷭ӹuSp,A"E9rҴ<,ya�dz:u҂I \S�|ݧx,n]},X45ἷ}_Jy k U񳞝Es1rј,=oѵ <=iFIQfֵɉy1ج_WpB*A*ٴbf g 3tݻ_1A��ͅ囂s8,QazO'-ׯU4>éUp[G*+ev5kS/o=�9wV%̭LR=~~o ڞ#cl[]3nK4 g=v'F\�475G4{i0J)��HgH-jSxn oXzOzfxmK}s@P@RxTz:K̭RE?=2&MQD3�j/ؿ%(P׾CܿvUW ~Ն÷(oߴN1ݜ32mhV w=ДA�焿$Rk>�ܳΞUWs{_?jPs/ZϲkB'S/%^}4xqڀ80MǶ{gu"["tt^u&I'j4-Ȍ98t{P>{F_/,{NppL!?WLE|Ãk0UnGi�@U;Zҏ=aÎ-<N-Ȕ &L�Z.eGUZ�ʄ-,?f׷&LiAjˎ Ia9I&L� _Il=In 3]KĻ;vT=g0e=\&*O*tЈ"s'^Y�7jO1hc왥M#(`Mi2eXz骈i[-$s+,X4Rn᧏v,:�riӰ6jӶ^lI[m�|ą!t`YO'-W󔧱ӦbY^3|&Y4ӏn sRmg єvcnbSfyTj=ʻ=򕶳Q~մvPԴ+};*UT<Mhdԙv.o:J 7^9nNmW-Ʃ6u_Zf �4KN~l!? L7cd= +8{b+G*ſ{{퓚 瘓JE}+P\ZT* cw@PPGQÍj 9zx [N}Sz)ǼwXw.wvom`_=D'ݷP�(R*Zn\vLVMk9|' N[,l2dc8~857 8w^R63whזwM(jYV懆]N?<q3B*=|I ^nkݗAZĬ ֭\ )Mà bخ9],(Y^L,ڗ۟D2d6��,h<[~/'M)�(ɲo^q.ev[j�ne�ThK%O\sҺA6OX !ܥmd�g]h(7C�PU~M$L?5{rX{|PV\rmF,ڧ+~R|1՟xM>O>u>EKkpMzD\up}7.]Rw5Ym̸Fyݚ\+GiSqmkb_um wzyd7gF�EEBg/0+_е] �L{]_7ۘ]n`p _SzbˬUŀ1UɸvM<J륦T_S,cVW4A݊&/wj/R4(|˵~O͋w/Dc3pyTTmcUoʥ/_1ݡ��%2jkQ'C>3Bǵ�i_E:~NT Y%zk[=1*]c÷υ^{Fc 6p3pj4lؠ~Uh[xx­F�@X"^wʜӧwZZύy" 5�@Qcɓls8q#n_ qpn統ѷ^ʯ%b{CD'ozJ+zQv+U}T5ۡ*Q[_5Z@U*p5pG<wM,Wt?]N&O?� ږxxHvϳ̧ˎ\rF`Q|AHN,/k̚f]|łVi5yM/23œM'_/s <JQ]ۀ �ږeLD׾o<>yk|=LWk@�h3,;9T~zhriZ�@0F.)P"SV�)7Z&MYrII?;۱q#^q|1m�l 7tʜ6 , cͪ_[i`�u � Q,K ʐ 3c�V�@tx{�x'�aID^r`GCl|XdKI�}$gN=m֫�p;AoϢ3i�e0kQuL�HH X[g�[jQǔ�ʯ>}Ÿks0\MlRfc 3.1�h Is[]R8uXhRSA~RL a^[ժkv,oݼGGM9c1ڐ^i#㾤h;W.nn�ti,l^,A63��̎7ұѱYv llˣ^j^g=o$�F;>7=Ӄ{t׺+>˕7@%,�бp|5#?&Hz1`M۰Qwe�Xw� "&Z�V*xR٪C'ufP0KVi�[Z̿o߽};o�ؽ{h嬧ܲw;ԪK=X"%*MZT@hٸn[TiY u\S_[ݡvww+ 6v'"`[PQA1CD}{ww У8M&>pjk� ̖ *e‘6 F&an9Q-t9@4GirQQq-TCW9T2k �dwCr,| �hqU�xgq䀦Ɵ `kR?OijmlGnFNuKy*7#CFhLV'&oITp+ WFp 6 ^]:Rlu[2wJ\%Vb +ƪ_GAibE (E&ax$..ZН6C ?6s\'c/?#c�aߺW�Rn>�P� b$o .,"Iy<)pvj{= Ƒ��nhlVtH 2CVy]O �@?SeШ]{Mc׸a7.LӪ_s�$g7֝z%Yt1/(3PF";. ٳqC=ЃQք zȶ޵C$�đ۹hyۊV<.jv-vPRVٷf~_9cުkwU]4MH lcjS1FhzqQg\&zY8ɤnw$VX{V{ŗL;yߚUS$f<bʟ'�m;]1V_/YzZ"N=Toų@B"}0X束ۺؘLbv1#x/j˱|vӨ>(B._eQX.*bQ+V(G娟�`U irQV,9BƷ&FvXvt#+A &QA*ꀦvk|Fnj j*a M:9>`:� �xQ!ʮ[v3V3pU疧G1 .xk'SUOt#1�y($3j{)aF�@K2�@*0sӹ~ �x1#ǐo?ain8/beZ)>[e :[`�_oIkcUFn:?{ᵇltt H�H:j&N��M)2{l#^ Х|Uu+AB!D\@aؐ�$wjnDg'D|K&!c=۬[k꨻uA#K$1uiU<"PfeJGIU$u#U]*%mk]PpaMQ'K[_BꈔAld�pxtQx$EmA-Bf_k%wO&u3˘ܔ& U@{Mաj9#qX osx_qP0ߗ^K Ew|0Z�9��F@  @a@i2 i(ο'&@~ª\v>5M5-_q=lC̛hUezOl)nC#8ըr;Q [G,wi{^4Q1HU]/� "7^Tw=�02. � _O2O{ִq>}zy2s>}Z;_Z٘Ԕu�A.`iBU �@H9!Xw �RAӭi@� ;fK/tțO?`$z=ݜr<t*| (2l^W �h_K7]FzuFqRW"9y%}͓�@Ѫ;aӭkq3 *T|vɇ\� 9R_$7De^qM7f,�!9en�H)BI�Ra>Ēwi1 \MA9MognUw[|hxK)uïC~*Ke[|)gڊ1"��{!R߮c%7ieHtrxh_vMҦyM5m2ngU߲wӍ.8}],ηSdorD�cܪعX~e>zw� .]}4�ƃN},Vˌ)�$/VcI� ǭ>q ڶz̠ .eF-Ϣ*]mh'y �.82rZi}*K2iZ4嫴\TCect˃Qg8 �8g F*>^wƏK8`3-LqIOi-P@T*=K+!o<N479鈕#̵Խ͛bƀi H� =f7벓�*쵴|\ZE .M>璘g#2N5|˔"+‰'.~;Y$1]c[?sKt>s@Fk�02rԥSS- ·@  $ņEc 8�4]q+<hMؾ~cD� #ǹkKzYOꏴg93 (X6��pߧp|rsl>w} ͨŤxp ҧNԳuϺYV yW7na=:w1-m܋5hk3#D߹mz0afb|�A9MVbZa]I]:^/cn t5UƴWᖕ1k[u#3gɾ/HWUJ\#hDZev]v(>*P|++Jv?W|,sS%6rٳCꛦ۪?RIbvb#en8dOjpNfeS+b%BlБs:G6o`Xˑ5|u-kI+8tm὜:Pz3W>Gtx)%quǚPahAmts~f[tinݺsjz/[sn:O8g:=f7\F>˯g{SM팑Yo6NA<<6bsշğ8x[~Jԓ'&T2}!_SiXY rQU4ūp嬞}/V&G49zulI&"=ܝGlgI#K)'v1+zK2P@T,Gqu)7-44d+"q2 -m-iU }E1$F]q8cݠD1Lh99~@nV*[B2 %D":qƭVMkK 2Ss-!7+%dggY)!$2wH 'rd2 qAvz\[[X*[Q*2 j*+ $Ԕt1MU2 ;3GJ0P39F9T/dwr23y@53P q HUbgGq*xzSFa&ItlXeS@Nnh[J޷<d-�<8G�6|Ok.Vu\|2l^CO �~圚F8wlJ[O&%&5QK jؕ%?3sUB%SpaSd0;+ީC~dZXjk L&þ[X飈id_тW"ʱ<vӼ>cY*z#0McTg%zj?/=!Mdg ܿ6rRԞ'^h4~Ԯ:tמ}#E^BF@ 24 =sE~n~rxe1o'޸9�{%<_#èM t@kJއmu{X}qkAoj*>ǖ X8NZry^opaT}TP迀w=㓙1F  4žSZvvqҦ =vLzr9ʃ ˰q>@><;W}Fk=_\^vxN7@ �r@#@ _@F`@ @ K@h@ @ @-t~O @@ ϪUA!2;-=dHaVfFS."LOwp<s}yўI_$$dd%p?^IyB ?\).@:$})zYr8*C"_͝'>aQ.KNLQޗ 'SB|lÜiN=A;̠@ ?}YI췻M/KfL:ۻr ܷ;8̑Su"KxeC-ܗ7-\Xo;ͭwix~G:V#'eN{|Rɐ{v=ޒ.ݖGM"kѺYѥJהskm[Pa@^nWDzʱr>4ٸ$'(tcWM<3r>D"ɹ_^~UT%բ hBZysie%ݘ2iCMvoϬf~צ'XuԳ#|Ǿ}{u0b#Hx/ U- &|)y1dSB2r&ZDN- ڵcGts^9~b$3J`1ӃO*èV1{Z!F#q/E { +6 bg Uă'lfd2~M!":NKr.ڳa|^rT9Mn*Ǯ \\|\#92QIٗ;]M:.apƯӧPݨn? |vt%ؿpsOɍEF\TԶ"KBasK)FCKF׭~鴥\k ɢhR|1H_'20DNTE2i~g}'\y t4 B菠0bغE\ǜ\ۻ hG^ sg-{=4`Mqȇ|1|wg:uAJ^A1ú1NlXt2OΖu>G?l4WC:/5\/t@Q}QaƝ8QM)ct@Ⱦ&|y_��ƅ_&-(ӿLr3 I??f^v%jA!;O60ѣgm#|dt˄yy1,˔隲%\܈}JSkn9{׺/o}[: 3f@ݍ-jhU; V [)JHͣ$D5eB$|U0!`[wE S Y|YzrªUa*G9VV}ȞC=p;0gl2<}CrI�@z*GR{u|uԧ/rI\s[1neqid:chwe+MzR`j_{.6tՕw+i\XovfT{ >>ôf-}0f̙z(GT5bw|^;SFL]Q+?1qnO2pmfCH� 8}\NH.8ẃK>깏*jٱ;fzňy\>[Z'*lHZs;PRdk4azr;gN%@bRnA\ GY~GPj 0�8ﯮ0 1WO1`�0cܸl!OÆ݁Ǭdh_T#:ukˤ�(ØqƳW/rƒa�|&m # '?iÈќc.\{;Q Gsi{o nd0��H3ae8;rOmKy|{nM=яm\)],漻{Y3_^z'#.b$3KÌWѯ/Y+`JWс ' _[(gZ�@ /\ 5;5� qsvjNS?;X3ٱ > He Q^7Gsm;^!+egp :F8bG'~穫'׾:eѧ'L4quޛ!KTGY8�(έo9!msKGN^i+^ !-HM,[^�mz>%ev;٬N8FGi]+O.Hbׯ50OO]�\~ȁ!ClNQ~peMwThO$Ҿӄ/42�|0—g:2yoC]+4Of]j^Mww6, æ֡Q̉{klt+M˱C9WYEv?gK�9� ӵ0(vC fxQr>)N uGܮpM{}z<MP++GaZLlӵg�~rp 2p#BBD<Ho IC}aM۽{Է"3dUPPGGHYYRjpPA#T-/<״Ke. d.{*S0à"9'lyr�TPLiÓoJuIMֱ$͊]|*"'E z?9/ۊ/B�!DRLm z<ܹ,v`\q`�x?Ή_?LSEu@ 8#bUt_o,nȓlb~k',h,u2Sߞ["OgHOsۏi̼-i:M�!;X.^;6�BfWӾhĞ^0' RހF��{ˆ;g+hxΆB!rێTOY0-G44\:~Ǜ[ysX=V^?,guT:�K?IO}N W�xh!a>3?x܌Fz6lN�-+tF4;uT]19!;.Ȣm{O"xϖcMj:-4!rl- £+czְjC$ohA4SmermL4\:׿DgLkCY*:) @ wm#˲Y[}zw�u_1+wf-+ˏ5}2Qzz =k~2͸f[~%Mwׁ!:#)UBB4PhOb@ZË2;+Ony:T4QG@�lx} q#G׌ :U+M˱C9W�@vmm4-ݷ-"pg]Wmq2I47~(sr>!Yp>ˢC <ų��`y-ݷu b؉��@c kNŮz]q}-YfQy81x~8kP}jFvc]Ly }~�b#geJY;򳎻/\݄uPXTrk�\tmHW9J8O%M R#+X^Tű<>�`q+{ �[W,kF';3}oQа};2%d_Z �eXZMwL@�ڡ_ y Ӹ+�.͌ra0[D8Ө1%l}u\۴iד4#CC}x"q'%#GH�n-{S'Oh)W^�gRH!�H-u38{dys__�D[_Rzsc�@&IF��`G#SI�¢P0 gTa! M�V}}x.A!YN}<XXm1nZy{7Ы��R3_c�``cEY=;�D<v>^7-:,6�4kw=([سYc,aP�(CD>̅�QG DjV�($ayw֣ju D�6h /f@SWA¬ݶ "3AAY%E`_kA/V£Qn+C�nݭ_+_( U@f(xqd2hm,R[䔦|WYBY|~_ odsS�0lWtj`٣YXP;˾0z>c.˱RT=k;x|!h0W �t$KLSt5G$N$L\�d\�";u*�Z*�hun}i+=Ip� )SV=\~'ic�2+?Wee>VXmN*6n5'۴cϢ{.{gfK6i4c)== +ƪ_aDZx}(-HTtQ '`wե#5zVrKס{%vEHL]]K##K՜@@ ߎy9^uB.˓yȗaط�A�Tbd�"A7:mbƛ rHfD-OJ/^qd8�,�^dfi U,|�P_U u<woͪ٩w`U-E͕JlV<=okh>e%$:G1 �mێoFꗙ_)A(\lm:eLe8^p>*‹$\9yګWC[?0P0Ww5{lPQn+Co7ZH w_+_(@B"+xҷfdS29 R,WUAi{o<i*2G 󻻜iTb</e鸥I)ѯe1ʱRTԞ%XLy�'+i֯H郋sa`hi*5ѧAI*!�@*Pq~8qlk[{C&on=lu+=+ֽe2G Ϫ땲v@y5jUEE`ubiMFi&v*kq+ÒZJ*$3jTf-;֋zypez~4�8� �D?<*cRέs5f�@ca%& ZGVA~{I巟i7\{[2 FfY�N:X�@כ�`#kwէGG^x![$]C�8RNɿ�@iaLk<H,t)mf&R1󻌙Myi]^jhق̒QżN=}R �"Q%¬TM:6:ɼfZP1Gex /gMDYx吸!~V-'[� De5R!GeVFPXFܪZTVt<�P Tj;+OrG@d}N¨цy;ôQۿo|)r'#W"wyt,U3wR Ejݱ<N WjCISZ�@TP�iBΣ/ضk�l_}4i9ڽZ>;|1ա;?zUYQA: ӱGO[g=^ZO.mg~}99˽E�lLCjʺ o Dv]4rU=}YMj手dVK]ډ� $ZT tk@*HaHGTȩ"7ӗ _<iˑ7~,HzJg 1 {9yTQdټ�оnփFZ(ȍ㤮啘Ւ'UwzCì[>}fm'.HUp"�8r:"Ub!�@ڹU]= � Q^=fcb�xɏw�)db�� ˺U4G7ucς-[TBKrlr7[X~J4{>quP-qq%?C[Ϣg?$Jxη5;P-l,�ݳ.5KZYBmxA9\&ʌUn՗SYjJS�Fa�~ꓟ.(2, ׳O�qAqeTmjǥz Gy\˱o|)�</x^'U8{4C)}Z5eD.zΣ={-V(S-}~'/X{Df-a�/^9}!_ 9}B Q HcBCOL>+nte1eqDe*^){¿wTg/u葓)y+��FbٻlH -~ VΙ '?ײ/6_whoA?} �M\ߎ*d;1ְ-SBYͺ$): {)aӽeةKi][BF.3]u>Z Y٪2}*1h=x,,$�tǭl, ۷o?a8sMM�zYOꏴg93 (|Ga#哫ߞe 'fmF-&EU·OM>u򤞭È~9{@J 7l#k1LkA>omZNjyQ�2#ȵ퀎u? b\ـNnk�kݦ wԗe2k֢Ŝxtճi nܻur/�Tfv|ޒ @ `u/LoQQFɉwgp 7D=ybB%49zulI&"=.jد/(ĬՖ]k7Hgl�vP_h޿k{j<뿰[.\Ell脚sהY|^{(Rk+Vۼ,idq 9D.f*U9_)|+Mw5qB$dž-kUM i_:#[>nK2w=q9< T~0I �D1I(�pbo~[ӗ�`>ƬGƴwMI$riNXP*#2?>7tܺGY[a [X:*�KQt\nYxFRnlkS$:{h#Rq2 -m-fq+ަ$ܬTfke!b4*b޸ժ#�|M5r~8^~vGYZ92fd,KLdL5F"a@2ʑdF*R# sm%˄qPUE+&%&59:J/c Kze&}. jYyKޑO޿߆٨]&adrq*roNݲeJl( O=[+Q@ -Vu\rp1WFV(o'u_Sџ*dZXja5׿+C=5Ȅq_N5?VagqIABbU ;:~<rD97-k^Iٿ_B}DܼYx7q[o0z/Y [ u 8_ff*P){c_rNOQRܱi*+JI͌7YvżzR]{EF@ ehğ~lɀ5dY͠m<>DY5\9w[/\U�"w,4@"d&n fYoWއmu{X}qkAoj*\{'3uk7lݷ3z@ GHG;W*hJey>.Q72zsN<G ?-ѾCQXw24ePgW* yw@ T\[p 7f@#@ _@> @ @ @ _r@#@ @ ◀ՈԴ@ k ~}=:eSE~ݪ>:R֟_!zV $$|IH*R*ROI? lH>SMęcmQԫ<__% HQ+*!{{'܃,5%>r\>zΡ>PQNs?= 9{<y$�Gнu+laڴSǡ 7On=~2Ԩ8wix sxﵼw.imy[g#*xegw{36o?b[o\klX G/@ܯU qf<3¬{6~OoTc~=~_Ws/ھ'?'e4}쫛i_ K!"\1/%|өzUevB FB4!-ؼȴ2c___9ssԑ9bԭWkIMs/WՎ}`T S?7LtnnokD:e{ŗ$ÇOVx]YrQ5PJ49}` Y iw~9I4ԦvSd==zne@dz  %Op;Du<L{:iF<? N{~-ci:6d4BFEbQ\d'/,dfza k#v#.aOЉ/նsŰIfZ'? \,Րv$kByJ^ϐi�@2q'7?4_UV-___~vt%:1iS76N2Qң/6lٷP}z;'v^~EZD?[}7.ܣc>C7̨DNTEyRA~n^ur{fd*@H3ӳJErj3xܘFTƌfdde܎7Cn5k1ۚF.G*˄y9�2gm#W,XECÒ�u8B+㚛t1P_Vtڧ6:߾~t1˶iWا !OiUr3rjY:]s[ZUԟS&|gAmiS&ͫܚc=\9ømW>Wۉw2*ގ^fVn_b5+/V> C1s?)ʇxz oLdB t'wL[pǹG%sc{>+xP)rz|+=iko!ϼ|]*貗Opx %6�u 9��QrG~֟}/}/jN^O)FLi/⯄5bw|^;Svdm�I΋ l'|U|yҡ== 9�K=mr�v쎙^1biϖŢS>PrWncU2- /kz{-XPɐFy�h-|ƸqB s�Y�yuΐ|MY߸zK< g~yC1ohr{N0C&5QVkt>x(i}=ʯ�"Ϋn$4Nf>sw&cz5 qٰӃ NLJXF1'Q 38n o3s՚K4W|)9tXN/\qF^"6'9n 5ĵ:ٺ4�|6Ӥ"ё{zZ50OO]�\~B2}4[9Ua]ݮ0az[Q?oՙ{os(,Q ImVٷ6%SfH LH={X@%X4/﮺bt羲 &K[Q6L�˻f`$d{.Єםoq�9sTRיTͤ=5vfc1|7ꃦ'Hk" 8鉝SMq)N uGܮpmcvAf�0yR!$<w#)8ΜͻwSÛ>xdp@= M,Ƭ}Ζ rka0}飙}D��̛ ߼Nk4 vM g[8!o"$7Le/oπ :f:@2U=~]lF6 G5˄7�H$| \&aŧM5~eўE糜|C0^WE˧I�{MzX'eRp}75b:rLȉb1`w݇\L47~SgO;2y+r{y8mNr侮kBf$O{wzN~6#HmlQ=6EߋWwM�P{Yt�>gܰD� :U+lx;^njޟ��FmڴI=SôNӦM7(Aq'p0!ܹ6G3D})c^IԞJ1 Rk&&9޹.ES›|zK/ic7߿)eVfv+G*\[ $c>}e]{S6c&r=_MS(#%̵ʭBR^LKӅs o.G\7-,uœ 3y &FұɄ>k"9ǗϞFq?ySw޼zɫ +c|˘qc/xOvШ_ԩL7ʹxQL9g#ǁQV>}�pB}E,?*pmVų]e;l@ �>Hy.WrH n=ӑMV4k4 uGqCiT>;/ �m7nb-�7SXN6^8kE3{�PϨqs^sb#, R_∕ʯvB >:\Z=% GWRy~ɴn_Q0 eCȸ[R.nH%AV(Oy8oLlg](n j{ǁ E$O-]-XXshf]|hcb Q;Z@ ~/]㎭9{3+7kf=K#tТ�>hm,�?c85�hf}zefc�D>n'Yjà`$mr�mWSWf,,]5hS$,kglaUi7v#SQtLN9m$myI\f~2CA_ZrMtUG2qҁݥ|gBeC9`AUYN O�B1jG%Y[&Nc酠68[u9Z3X ]sg{Y-G^!v={fy91\ʙ~˾hd�0m0汩,˞ue"^vVVnQ*8&O#sӱoS>_O¼;8Qkh32{0�@$N$L\iԒM�� LW2pýl#Uh�RA�mD㟹MGbH2eb�qjoGShv1�#qo �on��nJ'k!^�@RSJ˯vS@TwqcI:GY(ުK99_ aJDVWP2$Y(3/:,T_CcUaXN%Lt:>^r8\Ɨb͚5cѪ[wH#J<:tW*Z@^L;y³-5 k&^}bo#`2LH �<.>ԎiY̍Xy)ABv$ƜC)Weװc%1B[XeC>&_8EJ߈i)[̮}iEw2HHd#(_HW}!%U]~EU7pv+}2=ԟnDp>Xat}Jd=m+RBf:OZtzb]}(¬G[zǩܴUHwk1yk$\Ax%һ_N2cڐ\}o۶c˶[8aԽAz@2�=m&\�`ZYX;umX�& g* ٸ*g`M~-'*e4+�@ê>#u;d �2�w{O!$ʐ_ h a)eQ"ϛXF͚5lde%jbҢ)g@QLU}0�gjQv3) n*Y;<eצ]3Zrc~*Nq0ZCߗR$8?<Kfn:7fwl߲q%b.rQ u3{_7L :㡊LsGq=K\r&P5ڐ]uݜy;ôQ**KjhC̫butоž!âČ.fe)Y@&N~kE()IWl+Ǿ3+x|L2OxgBԟJ֧4{f]|p^s':@H֝U#ak皆.]-U'I=8҇;{PgvLP\HlOQżN. |K΅^Z4Y #1|}}|v T>_Ov}�HU��4m ôX2M?}dk-�HL&bi{2tNR]醛^2v-]WB�>‚r�̛ 9`v~cʣk-)~(4/⏦;ՇtѭY׸gW iA_\ak"1@H9A8KȬ3�@*H>|=U5B�f V|ՒEѱo^ۣK*CHs.+?(==з*Ӝ%`Gr.f?z�RAӭi@� ;N\@  !Y9d�X;6K>O8�\pda!KuWmQyA(6kT*ҭzAͺQ9�ðwSZ+Vzj2r$LyWVLA5'??~e嶏t5�ĝt paE"K䍵2=doę٢) '~o fC=gf}aNv!NHxYrr!ma48zdMםz ,x�0:ݿxEZF{{[1P �ǻÿ�^@2t1e�eתa:gAO"uF76m4OE>Qj.vˈ]ҝG{l<c[P&2/�dH&%{6n-Yxj}bR"ϳ"ѫi � 8lGS/ 8:i; ՐD5 aX7= =1trE]vB �@G)>?lֵY_fYskGy6FW[~a۬Uf]v`X.ZbrkY/ܻt7>NvoZ7~ 3|Ҡi?gmWHd׭ f-sK&1i~Ӎ\f9|, #U#aOc.mlwmi e繴A  Q1d/\gZYo6NA<<6bs%yYȸrʉfH/S i3~N}cRn4ūp嬞}LUf75n({A#ӖE{\ğ8x[~Jԓ'&N0kAڍt0RY~=ۛ*G|a#iy )c >�[Сf :?.Z+?Oigv~Ic4\󮏣k!7Б9r$~k'LZfئ搧y�-ў=\XG= Hкn <Ḟ 䦛 ;mJ {G}I\&sݱf-Jl觬>hTOg&q H5Y<~YnK2w=q9< T~|QtipPs]+cu]ݸw1+W۳.$uӊY|;SO59T;8!DcÖG} bsO" smi$=2żozH">~;s @��٣^:YeZYS0#a_gQhikISAN6ogd2V̄PL0e<03=Y딺&bJJeKhV&O 0IIR \qUG�kR|BYaRbnRJ_;d>N6%G&ad=dxٚd t+FIUUw)q/ E@g0� dze)MKԵV̄8g\۲^E(]9L$2 S+&}dNW{艗:}Sy(,3\WzY_T?kbn*aNL ñK83>Z5,HjԇrğţUcgt7Fpfz&mds{"HM̍u~lpPFR=sV@G\F&UʺJ<kM>B\) E*|2H@˼zRq@wj_%dF~lɀ5dwsC^0F yԇğr@AHqx|bC##}>(_Br߳GU:FɹլNM4BE zB=ޙֿB!Do#T+> $FζGrL>W}H/QA-8@ πF @ @ ◀@ @ % 4BCqRr 'l'@ {&I_$$dd9PψI?F~Ve[|([$.ONK~ >d&grp/9=+9=+9#;SXסa#.w;+%ߌxϺ̘i1=�,N}{PUĔR ��$ˠ~.ֿ�Gjjj+T>e^ĕߥr`XsL{<!򉸧Kf;J'g}*;>@ P'~kY9$7[^�2i]و>iqI}RM[Y>ePo<K{օ&W玲j}��ǾeI%)O^E@%Xh|(CцY)Գ-:k]@3 $>6y2g͂z83׻Ng3SGO\wԍ\h1־JTD iE3̦wu-lyf_[(UY&N9I&$r A8B}`^͍L}R^ >tg V n:Z ũ 3qA>@ @h.I*0ޖ}heiiC3~ej =s~ hM-Gҽ}_6L%vbi�&7Icׄ.%wMlԟi�P !al(׳Ѝh�ąC[>wU' y}SMܶ~'[~99b=(w; g@?;PhM6͌J3i_X*ȺƌUs7 +;Bas1uBON5ѡ`ܜ,)\a\-�>$q]/h~y/y2.SAՒ ҷhBHDۍ[ol@*|vKH�0_qg0-"i0G}T"@ _8q8�:m G]j!;O60ѣ%vyiG)K^*`gI,jETc1WUWLG3¼L)bP\b,5V_M}!F|3pN(m8|fd<~ :/2GS%c׽d7=�`0=.S[wU'ܩF ?OcWDTgJ3UǹmxqMy:?Z�R]xi0`p2yrfڨTn>#WfSÚ@S1nsŃ7$�t?q$qg>=U;]mh׈mw{5Lّ\z7c9b2t1�vΜJ𥞏݂6N~(4>o9"cWuZ᳥%K [5Ҭiǜ5MT''L{B} gLO7ajǂ:6?dOo{?.Sޙu v{~Ӹl61*tx~NsmQ0�༿vgH>È&Ƭo\=Epvǣ,O?#q(5m̰wL;gߪ7fζt>l>3ƍ<l�xxgsy{XUR&0yM|nm co.ˊ)/[֚BeQ_ER.@  0}|a.�=5vfc1|h0B[~g_MEwg?;>n\-s:?Tsu4.ɲo4- �}*V''ծ��.xQA)G|~穫'׾:eѧ'6C<<<? S!U_M): \rvϊ/;|B&y| bT\IٳTW>鉝SMqS뎖]=ɓǯ\_K2y:�@aͳEuZnۧN=sfۀ]�RaR._֎$<w#)8ΜͻwSÛ>xdp@= M,Ƥa'z䴛t;9}Im)y,9$n{mZ9~9["H!,*SQ#Kuw@K&/5sF/ w>4JHߦh4#3�y'w;l<\"%pR,Dr*(qC4I7Ge"ܰS9-asə~ ܯV|PEoƱSricsF�@bǁקylsy=JR<7>!e{ϛ8{^uqqz��㽼]-X�D5{b�.͍yٓ( s)Yv ӟB ';]eo >ǏsOr>8'i_f� o]¬nQf̦+w;_|[+LeQ_YR.@ PQQ4˲Y[}5յ"d�a.?GpaLM 6m$SCӴIDt;uof @$2w eq&=SW?QGBە1n=kEqD=H,>L\_ǡS/"]P%~q7C3tӮ.JoCTigOL9g#ǁ׷$g2 ɂY]oBMq'.t2RPALʇ0u޷c|W>|[�d|T‘,@W_4vKHNkӔl}mKsj�@�:'GG}ndr_ =#w|<u۶7q) *=*w۩{@\sڃAʌ}t%u K3:.ٿt!eL#%6]bʂ 36-Sxcd ctngʉ/3\}9X>�,K >UǮ@p7YעXt �dLYQ�F1W[f �$wf3[Zp(8>t �vj22tB!~Y ӄ"MAmxK0Zy宇W(R2nfr7BCiCT%2Hy@ BM/{$)!�"έbc?~t��H[~}ts.e���IDATeٳLʪ<=*Y W?Q6έ>�QHB��`&�@-vsDUW#}�e>VN嶘}CgLs;N¼;8Qkh32{0�@$N$L\iԒM�� LW2pýl#,2aΣ1Y"Esˢ=麍Xo=T>=i�RA�mD㟹MGbæ 1tjEsAnOY7e-eI@DžȿEO۩3{M6ð-DV]ʡOd_;2m`wҜs䷘s|2!CFho-5$* J•Q:>F1}jB{W5[{Lvݠf}@KDςX~qMg5jaRO* O}+(Gb^=_r4UK\k<v,QO&eN~I o#�D�U[C;yԁ/�A1O=#^^M,C>*LJE@ BM^)-Bs�۶vŨ{[}~542q㩥@B"Wt|=brS2BWj\FWk:b=awD?ػQdB&��DL6)�T5ѧI=7zt3ɖ"ٴݾriWޠm>ɨzGg.'*v_B֖߫"}r>�843glp̤C.i^|amn͍�s#YYftaS=eB�h@vBwNL2|Iyh2ֲ [,1*amfӼN�F�>˧EUfE<̲=\չu& 6ɔ"&F-%@?5;0b� %SN� |Z?Wc�d<Vhj@[5$%<pNϫ(y2Ip ~NN'.ԓnsdӞ# >nZ|[)G}诪^)M@ @T\g�Y #1|}<Q\̋4`ӧ-� )rXO��D@T:dbsP/-mhd� >P*[yh =m| tM;i}GI׾BC���M"XR_NJu(�L&]8mt�3<]o`mr24#K-J{1 <e$t]zmM-S-]62ˆ� I˧|WB�Fӱz"Ku߂C}(Lݺ?mhz{v$!~r%oI2{73d[/ǻ�Rvq�HɇVYO{ִq>}zyetv]wkk|eiHMYw-�® V&_��u� $0ݚt� RʝZjYeH�9KH \~*r>l,!�>xij(Rs�eZ9>S:z2]@ I}vfĆ �xp {V5'I/ 2�@nky8Fa�~ꓟDV#eȻY刯rs�KZw_]O\޽~CTFa ad_Ϣ6m4O⧹hT]2}_tў=[+ɯ �ɤrp~zϹsfi/הu'y}Oz4xa6 ĤEgEDkޢ ɤ[-,r&wyf+H$AS)�</x^']O3+ 0g~_@3pyO-)!%͛bƀi H� =f7벓�*u9_\ZE .M>璘rp#2N5|+‰'.~;Y$1]c[?sKt>s@Fk�02rԥSS- !ռ\# Mʊ̨Lt՝3rXFj1deRoD+b}8}k#V0u"jzյ!zo_,>P%JU@ !d_j.Z&Jtb!. ;mJ {G}I\&sݱf-o e6ڳGkߡ]뿰[.\Ell脚\ـNn}ZmioŹv#}_e+(folj}c<rn<׺ץ]U"Gwu#;VJ6hٳh>�83yKFJs`r\QAVtݦLZC]g )3 `GO'ݞu!QϮ˞Vdߙzɡ*��~}I.CR�HdCc6OO}Q'xHrlز&z"KQt\nSRt)f!.$eZZҰ*NANzJx/>yѻx7h<#)QL75œ Bd 7+-ZxF/%DI?*.YvelE2 ܴ4ҐIQSafzoe><z*]QzV&�5ȥ?o@ G:n]^T�F(|L\@hմPg1'KX2avWS k iZJϺJ◩L&d\Ķ4Jׯ\Z='+->5kn"3=62סtAK-XHX(#kkQL@bӌ,*ppȤJ]N4 Rًg3O{/Qu)U'>zRݵg܏�"/!# @  gf[LmY65&uhFx2'�|elQCZ~e)cf /u j(C34zA7$rBj::8A\ƻdL [m"@ DiFζg ;T`0)f4<n@ 4_ܹx6@ #fF D5ٰn ?e?QЋK@ @ @@ @ @ _.I![[ S Ŀ ;')L107lKYZ|? 0+on\|y<sCGfud}$,*Vúz"@ KɭuYKf;J\~/WKk4lӻS9 МMmvQ'XPnNJO3 c^~Neީoo'C5]Vz"ğ琵'gqH+@Zz�KfL*Զ0=zճ{c}lNYώ F㦭9xE/y23hC<%��q7]v8qqO^1_*fԈjUOɆkL@ DnAH 6/>x.2̘w7yehGeDyI7LڐeӬ3gY2aeErZ<W(9b4S &ξ#, D@ 4-M>uLYȿjW>iO!RŲm|<@)>' 6tb׺5ryﻎ_!!4HGώVت;5بBx!fk?ru9l>u"PhrS}[9"?\,E@ 3]oeǴh$=�e 7H:eb=}&76-m:pYLR1?_D֡E`I".gGV�<UG<eBasde3L+n}+ηtAXtDIK>t o3%+=/]T) tDNTL=_lI@ɉ>sAV!>µd̘d 8�w3OZ}QaƝ8QM)ct o�:d\ǜ\ۻ h0\;e#)9ȡሱd�0$ґ#&;pםbH:3֩R  ZEqboq~rk9Ra-;<yh -�վN"_|I"Lb4%fnf{Q<xz%_2Ab*\sFJ)'2lEmkLR걁�~**,]:I|) {*H9"@  5bw|^;Fl& pa 7.ܹ+qqRVb1k e[n-༎vٓޏw&h]MO 㼿vgH>È&Ƭo\=ňN~(4>o9�Q+ mFj>;vL1gKleJL_}-P6/6toGt88-+M7lׄޑ4zN^f�0cܸl!OÆ݁Ǭdz* 1^{sYVLAFn5}٢, H燗ލ"Z[hx=ҕ6.rtG|1.ի<q#YfD~žx| X-I.BGɃOGoK .] �I?-�si{o nd0��H3ae8;rOmKy|{nM=яm\)]*ϸ|pӠ?T Ti0�PvM])..Kg�qymlb5̳�|w^Pg͙rD>@^)VT�dܘE qyȉZiWXe9O{oZx]-Tߢ_oYߌ>wkv<\aDZkk,"_̞+?U@ ?Hu߂C*7f蘅R5}eCP*xvWѥ){0H0g'Ōs>'O8|[�\"[زy)Bnϝ(yƕ( �x/$O@" J\Pį7G� =l=;RO&D9Іu >6՘.QtwZZUGvnXUT6g6h}8nkO'b %�D"9O{PH豶+6?>~wS#3!'΄6YB7[vf6]zp˺{oj)QC@ ~;A$A}AǶ[830:} n=牕%Yw]>~?=_<)_}.Ma)c!+{Yf<8 �\|n¬ÓLʓ�@5",ڶ r^]+U slkWCUZ~qK}V3\#fxq:~Mz#[Ϯ2-]kh piny9I#yqm[~R\<,��B6wŻ<y ]vIyZލvF[ηRu9/HKz`鰹=mbkR\#6.kvgu 7'ʗr;(R#@ S9/ry2#G]I! 8@ZJ=|1FV0O0+4cz`}�(VJ\4Hϱ E^�ɘ'T3[Zp(8>ǚΔ�܈6Ý �L70Wؿt^ ׯ_S?Z_8\L� ��EoԲ~q"M}ET_�`&oمRӆ8蠆�@T.[RW�);0a! M�V}}�H+}M=-9mJ#`Ty;e>Jڌ �/Z f�y�D[_RqsϜ3 �ėǷ֣$�paQ(Pƻ=[aC&;zvCֻn>U0GL)Jw9:({ٔЅ-h$ je~�\$f4գy= <^9 Ul׫WVeعIgw}i9?;JɎ>N�@M_.Z|=Uz9"@ 9}BqcI<٦{(ުK9}^9kRM.vC70w_S"XpAV,Umj4àܕ]<#0sZYx]AQ<SEqoIT�ttzPAt%�DЉߢlʁeŻ_"HtG)�]U&9 *]_hh~u#|Ȯ׶עEd Nm;mEvFþuX? �UhG 2�Dl��Hz"2 �dک(G�.�|3Ke@ekԮ&A8߀W혷ڝ}Q(# ~[5׊Vܿ`N��76m_ u6 Tv ٸ(k"ad[F!ٟiZz5۔RMi{rD @ rBwNL2|Iyh2Rd0rS{O\P2 W8YэlRT1#QHfn:՘�=懩/A{BHyZTAՔna42iҼ)'hB0�Dm\(2!��GJQ1�4 7?L?ִȦ=Gf}ܴz'V5BmvadäRO,˪@t� ��R�$4�^=�0nU4#4;;�44Ƴ]lzBY$*�F:�EKPWȕp\.(0Ϧ]Vr̎x{d4OAB_qaaSqZFv;@ [pأ[WMqn-҂g’2K�/rZO.mg~}9<˽E�lLCjʺ o Dv]4K "L�T?8F}7�d5=ߩ +{}[O~ڳbFtO^{GD0a�rO[_viIsg#9RS!_cR9b�2Q^цYg ?I9g3 {9yTQdټv7˖_#Qt)Z[Wb<)�f=ݺ7n[>qI@Z>p { Qjk YʙxL�^ԷX|UˌYw/OF;o *Nƴn2Gv:9<I Oogn4ڦP3\�i7J۳@ @+gφ9um\ yq֦MGa^ik<k��#1]c[?sАaӽeةKi][]1~Ӥ+$˴LZ}Bem):�@5e_lp~7cKXjȫ6:d6}.oYs!Ghba.c!i\Rhj׶ft՝3rXFj1deFD:BO67PQC@ ',Y-�l2yb0T΄x7Fx 0r빦&"�(" |Fl��HHq oٲ܅ L36Z n8zdwGuՇD/enJpF.{Vw(jR׭WX0C]&H6`۪?RIbvʪ w ^D߹mz0afb|V} ;g9S@ @` =խ_UvJOUBMK0M, ,.(-~g$%ƶfJ7Dq#0ܬTfke&!epj ~({H홑'jdgL#CI[2QR3/\ eRlKeegYZj--?ƅ2 :@T5Woj�� pNȊ;BJ10ӣ)q� ~^J*$Y/y;_s53v: d% qAvz\[J2xh 14^89# &pQZfNӱ1*u0gfs XY$p*'�'f7w-})CC{nq� ?aǫ]ʔLŵOMILYOg{*U9"?G:nL@ D{Kgtמ}Qq ӯh_%Tⷁ^bT+{{v=1V΍m\SX2tMtˣOժQB|-n\L  !Uxj1Fѩo'޸f} '�qQ~UV~T 3�*+LvV@ @ F? B9pndwbHdaC1\ 6hg*ObϼέǞnSIۻ?:OAE9"?-@T=@Tl@ @ _[p/0gK 2@ @ @ 4L@ @ @ _߳o$#=fbnHA{WL�! #A dg?)榚w)3"K ¬1O4 ?+|X3E@ ?xoSq'+tkJ 9bSsS:�81=s�(^ ,œl ^Dѳ2ν ͞Q/ScG ioU5 Rv5U\I|w njG~}%X)zV@ YN4/f+'~֕?YĥGEN6xh?J8"=dZv2Ts4@P)%G*^>S1f[:?@|Y;|Oz玴Hq/O�$k䩢:kNmk'�YL\yaꧩƚi>U4w/Kjl'ae:[}|hۡd �6x̓l=ä$L&gŧH{zynO}6R} .;rF.4k_ŅRL:6{dqLK%o3_:Po6f9,}~6=5_/liEUn|2bX,gTbk~spVgyb RI/G*VھW@ +-M>uLYȿjW>iOԏ!RŲ?,d)�@ X$)T&a]Ëh'|Pre{Y�% D.>jdO?`߆ UlVcN%XWdM ?W0{am w;ԭj<.2/Zj5LwҀv}os%>i}(B , gGWAj%7luxC�`^ZCع?uMU-_&JZrنh�},YywIDU%N!fְFM0[�,}:Ie,f Fz� OFeR_M#o$'̉Y͆ttJl עv1c{2 O�Wgl>aJk]C2FzwHF5ݦqҡlSqCL"ݽk{KyRt?%941 �Fd\:ad3_ ){̘[.?H)k4h=fX2Ɖ NْH͚j ތ }Gѻ!p@g~xw-:4sD+gF~H?n m��ĕ)V'SL]W�^4oIPԉd<8̀#I[;:OќJwOLORmSy}aէWE*[ ڶ8|ǑݦadC iS�`oH.? �:_OHjOBOv@|rF�'3(ã % j87ٷy"NbЅ{ ݻw>$%e /ȎUFykžKFՌ{Mjz`QKM �LQ�F4.7+֟٧J.vW_Az t*T\./9_#vǷռ3$R9w.=[W5 �kw}zWFmG&,/6toGt88-n�ރ{𥞏݂6q㲅<16�v/-;2Fkl:i$FP(ul?~Ȟ~\d3A(zyuΐ|MY߸zSFG H燗ލ"Z[hx=ҕ6.rtG|1.ի<q#YfD~žx|.Ϥmad#x7¥\� B[$�`97hh2^}��2@vlW<t=MG6.”gq.guRO[dG-OOoegxm+Owj;CJ[ˈWE+B#ݳËб e@HЬPj�D7} qbޔQo.n$<|'ڙ3yxjMʃSv2g 9y7zEYS6ѵQ_ pm&EY6x.WFHzbɿd"psD�0] Q pr �Mmkc�2p#BBD<Ho |<T fanTuΨ떴2Ԟ�45nigD}ȫiyTzd1;_Ek[p5OhY;�gHUf7\SfM =/`i/bfBOei}PB ,-/<״KensAȸW]9=pM <˶ޖtY[#S�EkihrUmtilJt"P^ $I-I4}8'~/3CJfK"t=:.bkh*Gc%"Ŏ˯Ou;zƕ)StS^ޮ,�"s⚋= SFG  AIPk_W]}୬v�\1:}ˑ! M"sޜf41qI]W)-3a홱%O}fb�@nx,d wƦ>Κ�4;d1ūx�AԲxw ]��zox՟xP9haӚwME|8sFoIe> KrKs ;<ق]>K[;@ː][}! p-[>OEL�q)wً֤BDaww^}=У- B}E1xy܉g9+^!"A,Z< +?ԀWQYx90ʢuǸ^X|'ychS#w|<u۶7q)SOv K&G"olLcѱ5GϛǙsܿ_dyv,17mz,M �CE :(na{ <n5|ruIa|1;L ?š|vN2)K1qiT G]1GzBO #]nb#M+?*ОXORP@ Y:�<޻żGWRy(jni|t[>ޒA wlߋ<`+E_ǿ~M:,OP_1~C& ee$h?�]�0ިe=NhP_=&Ţ{M�&cb(L㖮�XP843}Ć!vilI]}�^�TUda! M�V}}x.V7DDVwhS �ڍ%rOtx*f�* �ڌ W}C�úUh/�"έ/B)1� g$~#��֣$�paQ(WY(mh0N!Nڌ�G3P! gA%@Q==;J&Eh@|D5ǤF!5'Jjyc�|�pʼn˜K?L �7S'; o[ﯙ$ЩnVxtߢ,0 ڌq1:t-'URԏ s�_b =ܭU㷱E^]uo^AГ<^A�$L^h`7 �h:6!t} �grx2~AΑNʋ H$ DY smrJ i4;1`2+Jt&@(Cʥ@ TwqcI<٦{}[u)O+>?5C}_ʴI++jLEcD�A'N~ײG\-;-D,%ŏi_Zj"�zߦu]e|Xfo*SŁvEHL]]K#kjԶV -b/�oQd�"�&�d�E I SQ0 �\�tCc,m~Y9y!d+)O��}x�@գ| 7�G*@ ~-󁍆DqD7ݲȅsa`hi*ﲍlR9*[saU ȇw^}|wʋ1e2}Sq3 g!,ް`/׆{r EDAw?`E齄@ҳߏ Ky~39;3;;;+R��@ fs;G61A.+�* "?�խ�e4 w 3WV϶mqL=CvkW$zb�8Du< >Mc:m8NN*j DϨ Z6U_SL[ c/7�0o=pT`b� b ui g�@��8_Yrp̸2ܒLJeX)k#%ғ(LaS+#73c@CN¨liʟ˶m ,[l �%)7� �$%i�-q�ښ*Zh�;1\P 9Djm@H^Ph{F$?S+)�q�гi .'ho�i@J5@ ȅ-_wZ=#G\LeX:3+d8C!vش2%'''ɟ|$݀)%'vm\wՎ<rk]*trqOз.5oDs:O=?)�?vd��:NLjF\Y#K�R_gjl?҂<S![}kS=[4t1HO^Sk@[͠~l򭵟'-|x{^TS*ѓ^P 4^=\gՓ{hU~=x΀-MYyF]ڳwԿ!�$5iH\Fg8у* 8Twh�TvFÜv2azLpz[ȉ(65VPa7Stqŝ,ZO�Lc9k/DȄb̠1�dLA j>ub 'GZ4fz8݅K 9ݭ2�@&\H{ ?��d_T�@ӭ?ɞ ,ӏd;7TFiߠ([#?.TwPfu1t3shp/PKeȸA+Y+x �"_24rۊH]†/ۥQ< _REu@ s"�K.p#[Ydw C!SNbד Je2Lcꑻ°bv4b/][Fڥ)tc 'Izxzv눨 BFtr᧿iu kVn9ݷUcW�=[S̬KҫR ?ټUECZSd#>ַ?yK;]8TOwzx@ =ʃ)1An[z2Eۗ~^_aNZ^|BvֶU!ad#fΙqUZu=붠 735|mSc~?F9ͣgZݲr^=gMY,.-,7N?}}@ oXɋ4kc@G ,pa. X $`ʦq7\8e2;`EmM.�4k�+Z WPn20hcuFq*øLjiuth* D:֣eUm+\p(٩|AӃ9 �_4.;B D]jјF �iQٺ%{{݄8qގd�F,ݲ/8 QEbp^HUN@KQ3smq�`[M? <@� KIftiɑϟH4iSإ v[9` I7sJg̳0 eq 5-e0ͻy~/F0} iATcdc1wv2aGԂVU7"?`PezK<xw.F~Tஏ=Ldd P,;k35O(tLMBM)qaT8l33]*�rqZ^@-.99cZګ<QA'L`*3@ nm�)Y � PU435flmi\ �P(?,+Ԫe QGvNXr/Ger9Qʛ|II~vJOU(�]3Eo9Nh*u3Z1!ނ:x86~F^YqW 7cB&Ș,-8p\2WY"32W>(?#;n+P(o>a8b=I'44a]ofaΦiOш*=]A �r.NuoUUIR/@��˷m~=Q3/S%c/@ 5B%Z)m5F!ӷS1VYm=3ef2F%F'!J7rZZ^fhneB@ $`4/wNْ�L}cgMN4HE76WGOR?cTj) =gUgVӟdƪС=Bǖ,rz~Cv[UqU%zԋ@ L@E%q}3Dz"B%uL~q:Lq>ڈP Ӱ%goÕ�٫gk{@T㤿hʤ HO@a@QD@$Lj R @ п^@ @  P @ @ Q * ';#oLqvJd79@ ~1)O^Q@ @ U4?ƅ#ڑgd^?~=E^uۚKfOsx_%gm&v._^pnҾO;W?;K/oL<7?lc{Ω>69/ )V>ot\תwWf@Q,eַOiFcζ~n@ @qK= @ ~1 h\VnaȩجJsr^_(fAF6/Je(?s=NWOr -|G i `~ڵIVڷl\퉠nhC-gR܏X<x_@GOP<{w>6NלgX&?Nf@ c1;Fq>jA]\=?QD oB"W\7 W@?ٷL2+)*h9N&Mk�C~,ú9%Ff?LJ8"ڷLXē G"(+ļ`1)bG62#N�"9]@VQ.ghj\ /_Ԣ1EXb%aLln�[7]P."}83L Pzmȷyh™Bc;{}+cZ0xT KߙoRgUTVD.N[C �-- 8q_36`z"_B/a&9 c]%=>z6_]FhO[mUJ EtC#rQQn`C ,ԯM)'W@567dHeE&V9<(<3_s?#@ ğ6K5æ/眨<si٘˒ЌLt~*,-*a7ڹߎI�)ƕ[RY9{ofpĮ Go~60 g.�O[>Q0xVK2ѷ+N?O OD*2aWn)f2Dm5'0�:`)Ww CvY1(�lUV[~@قIɛ`l[aNvDF;'F3_]D G88\wd'~7>umΕ<X: hr#ߕ+Z}8}ʊNZ �O.0cO )\G�ߦ/K`kAe飑D,l|q09#f K;tA𸮡,f.g3w?tY$ClP"ܟ0l~Am %U^g͞u ȥ^fS]ew70N'3L/rsǺbys*:^oG%?'ը^|Gt) N5v<] FHc+{][IAs@D V z믅@ ⏥DsF=?TrKAC0g E-Z9t1SVGG&-z0p?J߱ed ܻyνs/^dUm 乆?yh;qO�@mVS{�Rzu,g =7\ OJ�L BR_q.MYT*=swdttɫuqY�+DC:.mӁ#i8^7/YjC,s DEXUUj0jz Zի[Dz\IGlƔ . :2}n{S])\: Kl Yaƞ'Ӫlomʶy"&DLݗª^"8/*Ie:827R�\*u ߷;KD  .Hܿ6E_ѵ!/)ܟ2+[h܋i&!kK/On=e˱[coZ?qqW^+Keː_ٰdߵ'=*ӳ;o4xw32QS6ڗ}Նq\1�3݋ǯ{5Hy~}@,l[vWoN9 �FwwoŲޢycJ@ S' ^8tޥEJ3?۷>&![eݶoؽա^]z2Ek={aQctjy^�R9z)))z$xE"˜7̄N�:Ҽq\�F3wS ]Z`�F4략@I8IYflD-*rjiZS^%a-o@Xx307c�2- YK4Ty`'}d FU>.�Ա}3;6ۮI۷r&\^$ml�]ҏ#i|g;-+o|1ad%@.c.[}*E$0�ݧ�`4ÑK<D  �ƶ�� tQY7l|:rY<iHdVޣg?n"**"Pߩ{yZhy1rr;�0,}#O1mkh�4H7M'᳻]wH1nb{ g_p�׻cmV@ @ pjf̓' Xx2a XݟA#̿?cʄA$8��Egtm~ 9ilN r��xT/Y 4!&*9VJ¼xQ+,ғDOoSt L)? zneU,N9�rq*e9| ǁAt)A c~al&hC:]>L&4n=:ˋ{{T{N=+N7@QSUvϖ(lT$/_d4K C^OQݘLDPzSDwݿ"pffKo;zkϼ77_:hlWC;##^CAcAwB˺- o2Ix�6l`ڳI~rj}ʙpvD@ @ 85~tqXT9Ql/WWia 4Y{74^pPʑ,g-&~ʈX�iRYN#+f 9{w^9rr сMs+KHh =ޝ'6m �(@߭*Rjy]Ur8*[01 �ET4�+-�ĩT5_'N0�ȗ)T� ?XNe(F6z./ډ#L@'A,ӆb{<xV:V.;9ŋW4:N@ @ d~ot\zf0l٣MQ\VBѷ^3"�弘}ZV>L.A* -h[4m̝,�`[nBXu-�얳]iL, j3@&< i$� RΥ`P݉\ �Z87r'2w4 p�(N`*c7wѐ/s>Fe1`D?�0=jMNJ-reByDNU٫kWwE8J:l @;OY/@  �O}��\!<(Įr��\l1�۹oUVǽ2]ܻ/n<nC{9 B /q?K?∡!_[?#@ ğɟƨ i7-=<:,xܢ"?ݰơUZ&hҠu/[9I74 ˒MkW2R72p�`֊KVk+=7Oo6,O6>7)hIXAk']61\oD2��kRAi攍Otbf1&.]Qv@ƕ%hQԐF4 �Z44:s+6E.qNjI�0Č93.JK^_ɴi f (/kԘHmպueHDulYcĘ<JqFE-Zz"By<Zȳ}\w��5 oؤ ^38|Bi6*#mz+ kO{ȜNC:-Q$s󹰮VSB1ASΪ-[n̥RLO@ @ <'}ݣoo*'#-p8+=ӳ1QSB(ܡsr28LSFB9i}Hj*Y9<3[+~fFjARS *K;J#|7۞KSwsei966 ;%.t8(tLM6 z~jQNv)ɡ"l�RMt0#%;c4p%fʙζF5\yrJ-9M\֮eMQ/_@ Jx86~Fr@ o?8>+{zJETT K{)pf[;YW8FխRrmpkPRժ3@ @P~ h4wS$mλo1=\{Ըʏ" x#@ \ϴ6b!? SFX1M4U:'@^@ 0uki@ ĿF @ MƩL箏DA @A@ ĿLŹfYi@ BA͑(73(J\?y^ ǫV/E@ �P+~@&t{Ń(?CipfViMSE='7b.dS!?e{k/iO ?>9~ŸVMyoK9w9uԬ~ iQF8}:ySnN*B w*I:r6[7mT{5ms(OgE=US~߽ͭ{jڨ%e pV*4 K&u}?\[h\~uH&`C:uVMf?ʩ~'VvUU߇UU?USP%&<gliZr󟨗=~&l")8X\Bޞ#~p[r*6K)n16ru|!y&Ĵrt0Z?}\6NV 99÷q۷3*gzx{lWH RT*_am7-Ye~Ujv!{ksI۸f"^Us~y'&EoQļ!FO=|w^iؿ' rP3s?w}scwoGעܻGz4huĕW#/}MjƕL8q`nni2 fSYzB, oB"Vc>{]<wzʣMUЪ!oUeW*_U J$亦fl(:1C9j!?Q/}[=a+B@獇J ~w+JsN@?ٷLP$8L^?sx.=l!ϿM55d}ESyTY�tUíNB� q-5WMQomG%bW p9[Qt#}܌ןP>LX\X\3 =rSfZ~ Rx2�xybH_D!q9yE?')ƚ1 R~aN@۷m9Z+/� *NG U^㘽Jy+'SKuI_m_M��.ΫرJ B:Y/Ǵ2WgAN^rn%ZyR-[ϴcPПes?j?ycRԑsyw.mxə"b9^H߲_fL5cZ}@':E  )"m"9D4lOH rM"5Dr+$&$7UiQ$Z?]DN6 <QISjU,W;9UU/U"oIm/ Y�¡i�:~ w!/sOvLX\$fUքAys/5��c%vЈ'N1� *2lJ(�7 ٶ:œ% :ر`ژ1" 1�FT+}ظrK 3KR0g ~Y?^q‡ ~*nx"j #|ePgT֑ C.Sp˗୏r ǮUs+orݧ9B~~V �p7M~#\YƢ\>O.0cO )\Gzil{W<IV\Vgӧ�H=8ረ�ZֱHM(hDː\G'D@  w.}b.~Zxј .:4�qO6?Ǡ6[*fN:�ѬYViRAc�y �އt_72ͨ4)c..zMyvET ?'ը^|Gt)XCcfm-Եb 2)\eŠkxQʖiobkgUZzYYuWjD~s]ۯrk 7[gQ[t-֮ͤ:ӝ3XOq>?'k8y?Oftp_6{甧]uk9D,ݝW5˃6-.+W$N3൪CцSmeMj]J?Mb� c*^'g'B|8@|TS$m"9힪B=Դ_ iWUk7]/HM%;L~ꍉ9=[`0 .和4*hܲ^?* 4Ʊ$�2ʼnDN*vop?Z�.]ԹnU^ ^yaL>~tRN ]wSc-FBOqnv֑k L6_Uz7 vh|X%qh\Qpd9n1LubwpQn{upΎyʟcMۍQ͹C֯ڴ=lC _۔m1DLh-�/Xw{^ �B*XoZnlu۝K<=r.늭:1d ;=fZO;ȱ=NO/,ہQ*J۹;2:պlM/<zd3]'+d[{<~0:fL #m}sKR KL߽s<9G'D@ X" {pۄ}E׆L<pʬnqr/f}ڗmnxqD'}ۅ _']>Ҝ׳YWtCRjI ޭ{9vkC뾝}'.kwrɴWHDNOh_/gWq�kkw<z9N57kB㻸mo[!o�ݮ<}֗dZg��/WIuyоk@WiO@"Oa$sh ^<~sGc2A6,X"ٶ>!' ݝr<�0ޢeQݽEo#_kG7|Qn;,-z!ԟ(�"qXU)ha?EQM$}P_hў $~PM#ч\qIX_қOx1.Dv,dQ$"kZV.pK$yrGz'Mw=rRːQW>�Ӱm�w}E%CϩFBUs;x62*c-\ ?\10/-wDê+4ӄ>]bš+.E]~q<۷>&![eR={tCG|:n%{:;;w`[z[RPި=v*u_OKeN vŷ¥ggs9*RRRSR3I<QBK Hfݳ6�Q1Iep4(7fiZ;<*;ǵ^>�`41z'_:PǒI0V׎7Vԟ\>i|g;u&㲠uA6kak-"$It1@׺:gI="Ŀ�ƶ�� tQY7l|:rY<i#RYveu�0 n$ 2^+˳k'""GniS \^kD#�0QD �6 b~~^^Vq@7NɐqD]\@ⷿ.sҥ9pC<�e<Q9�P~>�`ӫe7�xhqŽ�pOjg S̽/hj=y|}_C]lϢa! �Pzwm`PC^=*Hٕfh5գ}#w=U DL!OUu"_A?1DrT$IP~]o*;}U_DqH6ǒA�ƃn*"M%|uAT@Qq& ^4x+ľEvBXMyXDW5WIV8Bͳ.:,MY*aӵ*\UWh\>5} p,<z0s^, _ ۟1e St(L 2dhI^ isȄ}-Y鰑�`2U2ToݻX'?<9vBxئz/X0|\ (5"R{�<*T6M&:tcjrZӋٿצ$/nT*˸$e /QP'oԓɾwn2bL&4n=:ˋ{{Tl~ G0=Bfx$K7H4{+gfٱ+|DJIF]kϼ77_:hlׯcٝ)_֝a}<)6tNjlC]17IU]2ZwR{5xg$~c5T� x0hW4^m=1K1zo~sBpKz%TS{ذaӗӞCB/{APNڏ3K )OPukwա}.OE=FB?Q<ſ!:E M/~JlH -ړvQZ$_ W<9T5.8Q9Nд\q{UŸj]=6 d;[<YWG˞]z!kڱ_\CkϔvIǭSnskTޫ0иN}j_hLMIeX͝3Aa^V\q =:�`T *UHq � ct>dH��mP[qksҼϑkmpl< *�ne>ia UQaS4^J TEUԟ\>V}M� P_Wʷh{wj3e#@`�/S3� ~̂Qm\^۵G 偲A\"qoQ4iY 97~y p1*$g]&D=~F�bz!fר_J{}??~ؚoѱrߑPw%l7 �ܞ}g9ГS#D ϋ̦W! Mv`�`Xcy]*;CEODd]]&COUiq{R=Ԯ_P]5]E}UCT_t݆dpNuثiiZ.qO?* B4SXqx}n㾧<d#"HY'6MXNs&MlgYy@Tޫ*~5}  .T^=+:2 {hS~?P)8^DqIn9em/�O8yFɳи'NJ�@¹>|[ȉpe�0g zRG݄[�q-gmZZEV`TvF� îf:v{sw/^ 9|mIZo@�+\�K {] �}; m QR\Ooj^{T](RLZ�@*HZU%jh}D귊/n<nC>{9 Wh&aۼNqm9c6 s\Cϒ8b~H4G֕å:=/*yu`kW?k\&COUЪ=VwkTUDEnc|R�n= ʭB?k4nѴ!.0a/c֦4� >-?g]XvaK^s eZkQ/D(ArJ^I.)֬'_3~cct2eBHUiğ2\{qeÂ3͊qٓjأbѺV68/Kj2h׏5tLwK9~ݜ]Oc`g2K kTߴfacփmj -ھ4(pts G֊KVk+=7OoL~Jƕ%hQԐF_U_ >kbqiadռQtJX�|3̸*-zٞ~%So̭D.9&~'ۥ!G(ej2yh0g��7j.ުI(gqa[]ɸ[ݦ,~N Z1~Tj&]QuQν,!^mp\yĥ<Ot*е=uv/I|.+X/6 e5#ڽ Jȕ#&5rt1~Yuek  '߯?-#s+ H׎} 3aUV0=l9?\<r^'W?k]&CON y|L3쀠&C>ڴ'nWMJմz{F)WrDWx:16s!jrJ%clq# Cvv⣭E!*zWhk|]^I..پU7ǵ_#lѩvM���Ԣ1S+A{Ndi�O{tMddUi,-)Ck3u Qnvihc93d^] #[ _yorr28ڌ^P`[~\;.˩iqENZi`_S*TrbnZN K!%mO*{]EwsZJR!l�RMt0#%;c4pyirяgⲬ\kP!*w"1*U9B'JY.6Jrwd2'϶mrNo6'֩:6Fz\FUgn\v-kBП\yZܶvǣ_P:mI@zQ?y<W2(ow}BT&"y86~FOUHeyEj/DT,(WI rSR\TU'~4(W帥_B.stuf�"%&׮P4"K nڻG!E�@.QYMѐ^UWڴ/~p}&{zJE2^DN@ :dgҰ;^EW3;p2. Hyݯ>{vd#c?M@#*F vȄyBA9loMrD_z,ճ7rHȟ9]&H@1ۤw'?b@Ph3Oe>qRnv)?^?&7#Ɵ`q]3X .Hxf?}c@ &+8h4@ ?@ /&@ 1@@ @ @T h4y\�t,M虄6($YT;+LQ}�qdQg0(�Y}k�O>+ȭ �r߾Jɔ v& Ht=zt+Ԛe8;9ZwpY~S\M }(tmbL� 3',ؼP�0 @TI\R.ձ6T3ëџhGwaaX@='7.t׎<۽1N=w$,ȼ~9V_s5Jk%wNqwqSUH��2hޱYWN$o\SgPEI/I/V87iߧkzd잵nZKȻآCU-@ j>YG<!q%zUwxwMl~'u>;B[i.ܴ5*F<=yz[|,~F=ܤՁ7,;k*=~Ajdo7=F�@>z{T<x}�xv8O�[.۳; vzo#~jݮGFNV͌D E彏17؆^Vđ% efnCf0S/z-_Q &P(T*5Sbg;wjFj /5l7͜UE 9~ë[r*V'Ps;|kGVnΨۻ2ÆUp1*JRv3[yݒ[6gZ5ViWO6i]k=4cۍxS ~qU_|"ghhhhhx9,)ROy>{]<wz6\$N{8zB/G D,!Phƕ;E矮8_kB[}��0Cg�i2%tM l<yM5 )}'˥I:HԷ]Muv '1o<@3<voDqB_sC}GhRG"}Mz3r`,la;Krq)��ط6A1O,Wq.r+6Gq3!Q*,�W^P>LX\X,^ =rSfZ~i)i<�<1^]$~(-DꔹsIXtmӾ;l!SM? 1+V�63Q:�JJY_\v�nKHU~I{E%._$񩑽JPHyANG Uy_S)œR5'71͚1m֌iuXt1~3C~%rQQP�[K"PiTkT.G%' }>f("6MMVE%\ '_M4NT;|@  <QIS?y/M_W/NOhǩS}v]n:EAuluX/iү3R'GqQ:%2'Q*1rRíq�+0*�#1{}|mo}}ڽٝL xv̺M{c>x/u=l힎QY ˤ݊H(He s8azIA*@"E 9~-8x)&vaAγiudC~x(ܢL?m (Gq[5w|A+\}#(7gŠ��'~7>um5m̘|_dž �[#1$O.0cO )\ɷj U.9O{)+:�R/x8"jm3�(|yz߱u,R 92F+Wщ"MB0'Ga;uɂvl"}ܬ\g;oW!B? ?ZUx#@e: ø/S2e1NkO2#sܲU[anqz.%)N7ChlaHT*߂WY_D~`aa-)`,I7 WnEd/Q|ja/]]8'I1{8?94fB]+ RU}H߿.Ou ~#ӌZ@s0f�8' cP-HIYgw�=3pⱆKYeLJ 3v5*|4sĺ_ed=DѬYViRAc�yM ?Mb� cʪ�\2m7&lܿ/v�1<9R nnهPORS@tpy9\ck{k1$r4W8!w"D@ R+;iǏ3ֵS&kn&%طvաM[* \V�$\t0 zLO"} #wyjOiF?pweG_d%{6:H)G~_!ͳql89ɁAïq3h>.*z{|J =eAD~ * r; oH ;eY -:ne �:/NM򿭓화r:&N8eD!s{v�O(6V/.wBsH:/3$^{A*(-Us&dQ'@+e9[1傭7_yJq][ucȦ v6+@zک=Gq|zadT*=swdttɫuqe_xfL9Umʶy"&DL]YK(W <6<y$`t̘Vm+�MKzwp˶>乥Riy+Reಀ#w\:xiλ7I"s_i{!OVU"*2bUWHMͲ-ܼns'<)Q:�0-?KqŹ4q(`qH%öm:y$ bFv)y3cfiSy_SU/U V2ݼfރdA|ja/IpDF / |Iy@7.yr? 漞}bǷ1"���IDATz{e)һƝ>|ʽiwh ^<~sGRWHDNOh_/gWq$Ad׭/o0gc5T[c='9T@<^<yy̬ '�|AJzΛ; ކ]['Dm}BO^.;x24NH>Q ğӰm�wŔ/Wo|5�Κ6t*�$L9DBĽ*3C<{jaIM}=ɩiF?wN;12Q~Do̢Ѹ F_/֝؋)+ QPۺЫ{|~3b*zj0Wمy>RS!^#'lEƕ{{[dܽ-[a/[HP>_*$8nTO]_ �2?kVo탛X}5 D"5}ŊCW] ZT- hlYw=z{$E1K/hGWZ/�0ɘe/(cɤbkG okEb S˧7L�0zq\.(xݦ#Cw-lE$nc#&�Z7~T,~0ki7ʜ:OD6f $UźZ�ti=k(pt6ͬ [TҴ Da܌ʴ7ء<Fv@ilԮӚyU+?;7QYMWm^`�il �Mu#Hym@.5a[~] �c L='od Oo`�b}FS?zmH6�F4�CEI'.aʲSS",Z|(=aF=]!Z!N=#l% �88�x;O8FNn�_O|dpY.g0~ Ihjq嫌@�Mg�ࡩ ;.=v^E!-ĨzrIF52WHk*Kc�i#NЪ'JMEo޳ZY��lk+@/kCϲ}cuғ$i�p/+C٥iI94E[ #f �i_�5Lp�8 &Fvͫ�(d@6-8̚Oe$).x? 3G%lƔ *-guFoP_,5>F_yeĿvae(N5> 0wrN=<ܽs5Ewf2!6wq^^{:gU:\۔ߠC r06 !?�P ,̇D):l$ũT[t9G�c1f[?+Lqg/+֯+W*xGEhnئ>y}O-E U2C&^" XRl蜿S&bn25vQqzSDwݿ"pffKoh#�ņ 2DeE- KZ"PjCu}n:"o鯶 ^xgïd<f+wyW /DQ/{P.Ihjq嫌@��z,?ccX ᨗ4IUU28{i4c_c۶nm|SF"0S\[J'@/kʝ}r'M�p߼C>XS/tioKmI<fs;G6g/�(p`]�Ӊ:ƍ."\��SG]CMUԸ@ ~ j4):9 s&(/=2k9TzL?U*ODJe,gRr}5cw;1�@(w]ƣA{;OlNիϔ9sxiȵ6G6%ʪk_Νt.:/~ʈX�ixc9Ip,K).e{M_9ۚA�mfMRO\_gbFT1>5@T� *�Ȅh,'*&?21$N6�;ss(vJsxv!Ӻ<ЉS#|QD&K.߷K4ہ �aft!LmKN [|c")#JnhjV~VQ)h@ S]ArÀ;'tz'o+2* z9 �rZ[\])#41 �J ywqnXS$>y~ 5B}Z=&]ϩbq o_.Ý@,&`sC4'֎L"0i;ИyH<o+ sŨ4%ƭF {PӷPKݕ ={)?JbxR( a:Oij-G7g:�p\|vY.㴖crb2\!<xYT0�Lv5бOܛ{yjhka\;+�] F@g鰸iPP W@qҝOVdd1fPۘ �2aOԔ i$� RΥjh?+&]o ׫W^=9>D&/ZIK%L.A* -*+Ƨ"�S��W, �dBIC �HID .]6u�7T^:f 2Dž?T*ICLKDAn!?7@scF\۫cIҜ[ v$;nkRKe�O|�/n<nC]{9 Bjgz\>@ h&aۼNqPָD \8oٛ@'hׯix�PH 8[g мhYb�@*Vf}�>bB?qlQ|x7cVDJ@gvç;hUʹWP �p=.H{]sbЍ)V7ǏGO<^iSg3y9ۺ&4r>sM�"_C?=+ 1An[z~cfdZ} #bu 2/9$D D7ȴfacփmj|M 5fTj(:m,�`sf\r`]lO)hhtVl\"xR^(e6Z׈\N 7l 5|31q oXɋ4kc0V sq̆*<9L U{Ԫ.lJ])˘pSr"/ \7<Ü~CҽTƧ@ ~:_5-&z_<�t-Gj֡G=ϟ;xrIxqxfO��Jȕ#&5rt1~Yuek4O?�Tl̤;ˎ.˶;wsT߳c[wl?Lpٷ{;n 'i蠟Y@�0*е=uv/I|.kD|@CQHGUᲈREf O~ /ÿz[A~M#tv}.4'IŘX�G:Glȸڡw q4aWmMf8}eW_VnJNdj{1c�`]:fT �n=-s"� eƮwt9G,\{Ba8&|mtĎl7l! Q+>p⢑ݸV$#,9Ƀgzۛ0R\17r*|c+ENZi`_`yw#_A*G!80R䮲ʤ}G=SEr~(ll-P(T:t^^&Gp5WӧL3bbZڅ+@TR?pr28L0RZ#'sͶ-\� %ߴa=MO <Rh))<FWo_nzRl+N PUmsKR3Lsg[}.ukײm)\Q_"É RPmW \k;JQqǯ'@Zαԏ bW{ IO?A!VzU/e$Q/d<y)$FvFnܲX.cge{�@ LkNΒ2!]~_.stufQ~IE iIrjs-z_ aQjhm@8FP� @s2!7%OhbiiR<N&lmY#6/~p}&{zJE jc/"' DGs)Ymy#?#jpĩyw4a@οH,ZA Du}@^wS$mλEG  xG#?#3X \1~~Q| :@ &+@ O\ @ @ Z@@ @ ~=,\L�:f&3 jgc@ @\EdN”$.ޠQ}6Uɔ�qdR@R.Ѝ~ŽBssmcSƗ訮߸uD_Jsr>;}ㅐfҩ&V:$9GbMa5/4 :cӫxџWǫa' J 7Dԭ(; &s9+=km3V@ vqKqwϚf]Q_ω^IUO!Z7;*Ӣǜmw/xhaƻkvg?sElw5DG!ޡ׎t^u+-~jݮGFNVŧjVѥA p \Vnaȩ[(^)ߕmj`! :+^(#ɬĜn-_f|ذq2\!oޝD%ѳhd;r]4au}ƵޞF ` C@ *F!K>%h\q 4*_^]\=?hϞCϝ`[{ks /?h O 8r̜ħFpͶ#7A p}M !&h zMLIShFTQ GD7е2aObdlC��\ZF#<s9<CS#Bv4W0`bUi/D~��X45dU?�Jt}C߹$U�ukw]*p/O5%b1MOWub^ 1`g&J'S]|SgK9b> @ Ŀ0bq|ȇM* ,+SvyBZcQ`Yڱ sJ)?9M&Nb[V<PP [Es+cVDzopdLcO9 )ƚ1՞-p3(Wn` BH 趾j|UH4M~CP! <r$ԟbn>^R4CR?@׫M~փ8 jw\ؚaSߗsNT٨QҮixa[%^:1ಝ1�WnIsfI o8 ��WNpgcZ=|QmqYQNS�  #6ic>6th�yЎI�No$|=|:`)Ww CvY1(�P¿c-X&4reȍ|Wp7Dz!"ڜ?4ߐ¥9ܿzWn)f2Dm5'4~F͔̽?1\R[(<]a֥`q'|ȟ'VP0"=}[*\bb+-n?\MB0'Ga;uɂvl@ @ !;nt 鲳nއt_72ͨ4)c@Ν~Sx֍YfՈ!ܟ0l~Am %U^g͞u d)gw8M۴LJY: 9 #EOg�v:x{R0\_9nnD0h2Ccfm-Եb 2)\eŠ(y6-''90�/Nt&ǣY"I1n�p:, LJ 3v5*|4sĺ_ed] &澜;Zͭ5zT �r Y;8kwmo-&�r2ᾘm)OJ!OTD3T/@$UwլgINݝ}Udz 5nq~ӵ7r[Nwn& {}�Ќ6 tl3.kSzS)jL`_E*l弍žTG 9c�J*d'O+2�psWv,ՈMMydܸp1?+7zm p:_aB%Zz� J�Wȥ_v=t4.Do1a0"Tz4*u i؄Ⲷ\td-#&]_I\!+Lm#i }1L�fl�Bz\KӈcwWJmN l8sf.l۷֛v]<Hu 'u"Hh S]B8canrq1q|~s�|;T,@ '.N(:f۴Ј |mLޗv-[_Ԡ3\z>�əO��tMfS~o!o3P?eVz6gnI ;;y ~*.迸_Y,dM=pUޣu^;pAFvtm Hx>swwVkkwvgG�ŁZu}z=A,_Oe`rŋcZolzQ1ldOZq\q_L<iJ;$߳kߵmnX"ٶ>v I`fS'�˖!_6_LHz$F4DRY$!8$"nۖ[wH$HOt}?!gek.Guo|5LΚ>Lډ<4=MV*hvj/VrRTբʷzo}L@C^Jv1_$@Q>+]LHIIMIͬ&+�弿2 3S�os!Sw^~>L*v)V$ml�]ҏK^"=r43 :�:fmY!ȩi%H0uĥy4�f2fYK ]Z`�F4략@I8I:^Lo?�LqZg/2S; @ *NDEED*;u/<??s+ELڐ'}{|@1Np�NL�<m|:rY<ib[MyXDJ�h,e]+ܛR֓;��fkпWxvv4yy zXejRaʲS3iS \^kD#�0QD Dcv�@aXG2nb{ g_pP }WGHQ<h%z!C"qD] ԑC'D=9�P6=RBQj~ �j2�|GwQ@$5}Y }8L9w/xyogdϘ2a){歳kv s|NtI~ t8\"?ks]/{K#_i�2abE�O27AS@�F3NN//u=R!K'8bj�OoSt L)? [� c3=@҅y vreX-d'�t=+%R_Lsfy; Zs̅M :^`@ @T ;##5j!Uo7 (gр_0v mԿgczSDwݿ"pffKo٪kڱ:H 4:?ulu#�ņ 1\TRl蜿S&bnrߡ޽DJ2gm7Ă v1*(5u/r\ }WGQ<Y?*4U#*E|XmkY-;z,?ccX ᨗ?|ԊiʐD ~>Mc:m8NN*j DϨ Z6$qY&f�ac.$<޷bPiܚ#X��ia ?t<43 \q;��EY'nŷ\�gw`h =ޝ'6mgDUHO"?v.~ʈX�im45/}W:MgKd8(5,gLsIe9Ip,K)==}\o{t`Sf!@ tuQ[T�pzx)kz l}qsN6ݓ)F6z./ډ#L@'Mա뺉c0O93O+i:u0 +<"͌ĐǏ;@ZP=�� �%r��JO!D.?wߪc")#/+yNgivE}SԾ?%񠩟5_z83I珷ԭT/S3� )Hg7BQSXqV a:~87ytS"?IM߂C}h:.ztWup3d6Ѧ(.+I<4c\K�\!r,͢vEs?\}9-Z,iԥ=;?[eA֓%�h[4m̝,�69� ]+˕ "<v{sw/^ 9|֮Vi/D~0Y6fL?vS;pe8�'Y$�-G7g:�p\|vY.~:^.ג�@&H ;^6Bv'r%�kQp@ ĿAqOoҽEKc6{=]J~׺yt;~ty/ p~ �oֶ|5hu\Ni5_<�$%}RG 2P$#n2{!Ť �UKhYb�@*gu`ύ**>�\!;'iֵVQO7MAS?kZBDxv|wIrN�lqZ!Qk~wB i)]Q@$5}tU!=8yͲ{Ko/i 3X:nwØ:B$CΉ 騐-;<$(šA?o݈Eۗ~^_aNZ^�,ٔv!-u))1#pΌKWLNof0k06Fi=xYۦ�q%x$!G ھxT(5$b ܊MKro~{K'4e&g23ژ@r١YnK K%换SO_ІlN 7l 5|31q �(ۗ_="ZW9{nXH#S% Z;a#Pz':'W;^(e6Z5X@ Ŀg.,W̚r[9B.mDKE29rS jlR/Jy>ѮQջB[ BF=||eaݶ;dW6z]Їr%|I ]ruVlٚxCK]QuQν,!]Gv W;nBU=:*1Tug"zm*hv}'nnuc3{vm}ڞQCǺE;$bn>ֵ'?%A rx=2SB~0LfK\/dqH#.yz}} Hc6Mvq9I-7'$wB:0 EԌhnߖt~&,"? O{tMdd8CsAҸNN�gYPSX|BM)qaTIy.U!$9w]eH/{. &Sp( er [sՔ(ll- ENZi`I?BRo5 rxfVO|9}}|f.�oڰr@ cgZiwB.*Bt PyfVq?Qirrkaw#$:bU,7s [:o=sӓr,g2ERx,ߝeY6z4nr9ԏ bW{x񠎟fK8$ტMi@OMg'gI]kOQU\(7=L@T6z ިRN4c/"' @  1*Y+Q\,z[Yg:u4ЊnPj9-Ֆcdl*2W\3Oa4{[-<L΋Z TJ>Yk7A?$qHD9G2w2ɐ.63gZrT;յ:Swp}F gMUJλ{W)Pu 6i CNA @ �gZ-~|nG,MO֨X~xxRo^?&7#m&@ &@ @ ğr  r@ @ @ 4@ @ @ jM@W#9ffegfes$ T Ң@ ʒ\Wj+i& g'& a\.rw[qܲVS ? 12əvXhH+굘o vGANl)JdB`ԁQF>vCm޺}ԩSG]*Q(E{J%rv9ȹo<Jq6yE>DgƌYjUJTI'PysЛH@$!gҾM9mcTk:5lR:RU&`C:u:=c?۳]qD?/_ğ5D#o⸪zV*ǿt629uSP(*Z2>"?H¿o8J- 9Ui΂/:eܜ4sx|a5 ϼS𵑕6rgV]f*cQT*/H0oC,߲q}?ӪijwVRA jERqϙOn'LR 0u߲;f1)*}cX^<wP”F*>v(Q g }kʄ3oKZq>LTt}xKs{ksOP~tqUXU'˥B ?ˑ&GuS%x̛aƬӧPӨi 3ɾe&YyÛ.z?0I<㓆HQf8mѾ'57d�x4^,\=)JJWrNaoGxLX\,aVҲ`et ?KvNeBc;{}+cZ0{D#ȹFs]cF ?14�`=+;u?ζi&�pX?,]Fcugu2E\}Ɠ5<$.Qt[Ɠm\I"]uV�NDm٩mCƏqEQT*Ja{@ ~v' Ct� 5&mV}ϖpdLc;)P̲2ew~[Uɑ|BH( S~aN)XikM1֌>W1?R~~”�XȎȟD~"?ȗggm>PUƕXU?íȂ3-*RP9~VG·vCrЧpm<BR kĩ0s\g_-$|kٝ. hIh~ШSHKs,j1bP,K;erQQn`C ,ߴqТAT4/sJ$AV:;{ٮE񑘍o/2`/r6G6̄M3&_ė#Fȃv̲Vz{SE%F;w+ӥWnIsfI o8 � "ڜ?4ߐ¥9ܿz_/ \r$+.+3SVt �_pDf�P¿c-X&4reȍ|Wpףs7M~#\YƢ\|WN4GPoϊA�Iɛ`l[aNv؀@ ʸz)G*KwQ0k㩃tMň F@IW4M!矼z�ƶz/^ɆT,[nZj`,=rܫzѳsKn(/HX prw˯\wRll!w [H9eoS(Tè۴Of.BD l�1yITǺ.=k1-Q-`]l5+k_޽Cy(ɡ1Z1ERNodQ hnS,'3L/rsӮ"9�pweG_d%{6:Ȋ=3pⱆK�@Ĺ?alAJΚ=;h,HRL۠1�\zlisvW+Ӊ'\^sɴޘӳs޿ۙD~ZN1Kwp=Ŭd6U?4Ʊ$�2ʼn$~&_0"KgA:{!l7]p3)x/Ǿtoאּ'+M뱪A#_f+-<y峟*ϕ%37^j9/ɫ }{Q棗/m]DYo \M8eD!s{vh~д˹oj}#ϳں?<\C>|b݋_|2.#+vQ>:p*O@D &Zt<:p9oc%=/ބ͸'t�EB~َ`Mj2RigFCĠqn'"pȤ ;Cm�/Xq=c~W:n�\!+Lm#i }12 \� .;bvynTZޗ Tc. :2}L^K.W1a0"rRѨ ;w[0aƮ�^ߜ,l+�${{@ Uυ /}amND lG l|s u2�Vtrʥ^>loe0o]uk;31x}zݘs']1KƲ @\Zt&uTWiqxNk3K L}2X&=Mi]a-IdWXѥ[f. �bI %nOOEД,lww)$9R ^3VZ�@q௖G]^�p4k7||;3-[ ?}�y`\5snlO*: /tV#?;6�ܟ2+[?K*d/_i9M³?XX`fӢ>_TD9*~!K5顛/L"_,l[pm;$M)Ǔc}ҟD~S bz-+*r<B&J7&2j6\5-|̙QyB&I\iZU TEߦ8Kg6XeP9~&$ E#t.W#}p\r|��f窹ɼ : 'Tw&1̢9^nT M݋a4ӧ~oѬånZm7 {y~�($#\!;ӡOOt5aQ;@C෼>5}ŊCWܻDŽIپe1 ٴ,>a*1$)O..$w\ Ǿ=@J}x(_LaJ{aQZ]^ggsB))�PѨW$i|g*�}qYP:�1ص Z $nc#&�Z7ƪs% @bm�f-3ֱMSS@ j#*� vZM b"|4ΆEd" �,*h2'\x9OT7X,}3~q�%�p#CH2㲅�Щ3zx K97#��a6d7H4Wg͠�0{5=@BaA ʓ|H\|ڨ"'aNIuZ./m@.s zXe_΅/tn0�` F4�*& Ga;xZ̽/V=y|�pqܾ �6]>m]eN^ nB*ˮb_{9�h8O$" wꉤ9 *�X4t`w=@>~!T6]џ$~~&/�h,e]ƐlzL5M5NqFͼ'`3`Ta=V*g]G?eB-Q9~&/=¶)W#}DŏTϕЎtf4:� @<McZOذQv �i_۫By'oo�NRJ6�F4�CE㊨ [ěڶqEᯡO@57cѫgq^9+a3LDrew<MҫΆ*^$n-]ol˕,T.YA8�H#_iaSO&޹MK~i01ɄܭGurzyqsmp _f9vBxئz/X0ގYc?/@ 5 H�?ekySJ.Q^~F*�dBBR�,c eijo*!9qYTeO3+‚SB?|Q/l]YB ?h@ _HN=V'RvuyrRl蜿S&bn22vHX+ٶe[HHx�6l`ڳzSDwݿ"pffKoɷ\��iBUq'n*뗩,*e2D"9*JlJU?t 01\^*ojM*L$_*L|.ױ!_3f8\oNzIJ,4*KΫ?hLC8>'+8$,cnhƔ >QGaX.oyݶl@ }6VzaJ'`QjHkڱ ~5tqXT9Ql*=˪QDZ:y[mh`ʝ{o0�Q~\�\'L[ c/U9hն/:��B@�qHq<i;}Wf?Spwy#.]cAOg1˺qOt% @2B\ �xYO1C!vشہ<~u4J^A KDB3u6TRӍ@ Le?$gݩ_ĐǏ;@ZP=_SԾ#/S3� )Hg7%CөQX&%)F6z./ډ#L@%/rW>\uR:ה$ 0 �J yiDnXS�˹=՛: $7 sBǡWڪ?hLĶ+!~",P5'->y9M#Z裩Z{>8ҹL_Y⪪>]͐aܳG$f'- e�P;R0'kWwE8J:<uBN,W+$/H0g)zD Qm s�@&LY~'ݽz5s4UNJ�@¹>hF�@ Ű�~uXV>vt +n9Ϗ|i+Ry,麵64y m{д "yUikҹ�̭ryqc3kSZtH+ŷ_@B Db84N<PK,RLZ�@*HZv�`댳uF c6 s\Cϒ8b��\l1�۹o!?7@scZP-&T�['UI70a/c֦4� >-?�䳭5_<�$%}te(G5 ] ue?ȹ 뱪hO-GJ#ym7>ڍ+ֹ{]/RNS08ox,:zW׺yt;~ty\q%QQ*ArJ?֪ i7-Jvs3FnדJ�mպueHDulMӆӛ>̇QZ^ֶ1Eۗ~^_aNZ^ 5fTj(:m,�`sf\r`]lO)hhtVl\"x JIB@}PjH~#xz�_;{Yj<h]#t!9<9&m|P42ز0 �B3q|,XfmɦE[E_:TAߡ#건 )5.tRP~kL1-2>^ͩrcO˪  MKB)߆*J?%l:ڹ%@T#}US~}GrT@f{3s/KDF65=zdN1&8Ҝ$cb˖.Tl̤;r%|I ]ruVlڄ 7j.ުI(gqDJ͵lq7M1J=;4L�=^OqA?:%xv~&D~#d{#zt;LzWϪcWmMf8}eW+YCQHGUᲈ͒$ăJO bVyQC<ο}.̗y=.^f{Gsµ)nghjcag"Mxj9pU]+]^+n.s` O<ԻGTNF32aQVJf15ѣx�qff,;kqʷbnZNM6@%mO*{mGws|9\]]nm�)Y 2#�@!:9L]Ae-gd4J]R~G+,[SCQȅ9K3f5tV Xz="yK@ 8I9 ON+e8|I!&ݓj9��NΒ2SSTn\v-oEҴL9H]pYVFۉ译�䦤)j8}ۿ"rQ3$~V)_!-IN-uRT\.Wŕ\.ǨTJFԎo$zعt?.ԧB�pi68_%2!7%Ohbii*GJUyfVqJ޶ouݵ}kWqh\CT3/~p}&{zJ\@ B2-[`TC,kiL[Xe4f @ RUQM{^[qa+Qn- rقMtjMλ{W)Pu 6i =A A̧:Iy:FcC @ :| @X~qqŏ툛%4IU@\@ @  h r@ @ @ Y5սw6lh 0 ;1EEb(kvHCD?ƹsOT�@ @ @  4@ӒSS2e!@ ԤWIYQr_?ed&'g+$ a;8f "a#7$N_:|urW M׍~ދ6z/8jV][zP҆_?a?#JPt=zJѿ潻U7䙐g ��n޲A5˃{OegF'8cݥ~)e}ǯeA*'ƴg7OFp5'/v팹\&wqW.fKRqLc7SQhٶym8J˅{_3So[CKF'"0psoɤ$`e+\(eqb�O8"ng OSRA=#X8@F<Z5-- *tGZ*jښ\IX[#J9SqBNSʘ^ǁy=Xr@ *v ^GK_aQMKyfб BEfvx1ٖzƞݻwim@ ~!{x*շefݾ~7v٧D_22R`L{9lôu󧟜^I4?1,`b"snmy-+?_wG.j+7/0LU\e3_5k Qj0)ۚ $KB#L*G풎뮔 /Uض2b^B�YThjӫ8+RW@$wٶ1 1lwgY_ԤBŵ3bytS>4صwBAIr~@F@ Dyp,K� 9Rl;ⵞ5�y֚aLn}MLcpos5G jg(сyJ'gr4}\t�x}C#%5~xsH&KE9Jź 7汿 -4 pFu5 $E<N/RWTܻ4?OJas휐aAو|V,�Ҫ̤\95hWQ-sSe$% \S^kzlMz*l> ͰںS7EMnxqF=Tġ_> =PAx#7^&zmB➗|s{hʃѠ;! AD5Ե3@kεr(n=l_Mާ sr3Lnك� =2[ iD ݹSzYթΈ--Ք^ƁUGz`rL��Iλm{HYWw850^0y&.*Yl<n% /G}"-T:?Q.HOQLMhv5P-^IEv>9jA[Ț�̜a_2]J+7M}-Xg]S~QPzbB3qm׎t�d}ob0 RS ge2@ $S\�їBwNJ;#˴vD116k�Mv*N T�6һ/\syxc xx-YUp_ WvC̨C6~γVnThuCüQi]o|K27a2Qc&ޙ]Zh5mAeFu6$!zRIcW6ʿLj㡻i$]$Ҵ!J0 N1>rp$Ǟ\s߭P6&C�@cVk4Y\=�YW=0Fsϣ:?&}j�d6~?eU|!8LifXc6Mz|wK .]"0bZ��8dM'?W2v@3b֑ix59U]yp54{WeR5Ks= qC>q>>yh*k5JQY ˗?&IEMTc*kΗcM4E2&(mfhL yu^­ôX^5Wq W=@v#.׆Uջg׶ cIa_VѫoNٕ>f~v2D .p$jiks).| vݼ۰XjZ�ęWllryѷQP$��X<yP#.#/˜fj9ac"?^.?en>]wȵۻuY�bo+Q\ܜ7-VXx;N3[Νӂ~x1:@ �ٵBcIîXxҧ93we[׏3kG=Jض CWyjSg_*=R"6ߦq ]=l}mNR|ь-/S(K޷q%Meŷ;XbŵcBHvɧҋ yE]'^Plj\S7u4aq mom+8iKym<gu܏[/kSĞ"#&^77"<,E>5H?/ٹ =KD x]eR�ή>ox~5xM,�Uf^nq=06bˬ#ğ o[KNrMH=grO;vΗeR@Yq'Wfl;|]g (̙'PBJR25=j=hhCmFn |p`OǁH5.‰uK>& '#-$KV90՘8=]B?k|{�—+ekӻb6l(7eS~]C ߵ�@YIC  �XVnmp Ҷ%b �fزi}*!@Hd�`nh1ѱάE}zLBE[Վ6^ڑW%5*G͋�, �n$az g@mg�F8&%H41{":>�\;�Z �VO+:Ҍw:�`޼xjuhPSv9a�S'in>GSTfuN5sՒW_AϦQ)jt1\7�j.vݘ�uLYժĄ�TvZ2KbSCB:aӤ\IdF I#Mg QM;~䮖_ՙR:uسGT 򊳮@�xn^ ~3 dr3�� TntId]]i�x8Tg/371=xo:v��� g\0+nmzJ¨1.،ǽ[9jeykpPg% {7eieQ @ RB�@tYf=8STu{#�( , � <kG6Z&RuؐGN\`҅UjH6~#ΪYcY^p|rA blt(HRm:g~=z|hWoo^?_S <(p?u0]'7yz%Fa?cUu(Zp !ŲWT0L<97eadعUݿ~#/hB4 T��|`.y�`xK *de;#<6\q ҃ /0�LY<uX@ ~?k27E ,�DT!-zԳN;;OM٩y{,[ !!$�I�%Ӎ WzO(4@uA47�� naa,u52%͙@R& '�cvZĩv-=([`1MnNBI�,,@Z)'1J9hU>޼mx+jҳ kSݾM�dooi҃lɦv#߄FS"ޫxܓ;7rGz2+&w3 ]_<�y$:6xr44l � U8I0X7yოCw' .@ozƩQ�IT z aꩼ~ʼc>wUcvS垶I|OXHL T/a&t\(>vl+r; 17��Kᶴ׉Bq1(Cʺ&'N4ughS$O6:ƍ۰\�R^GkU{6͙{ӶN$);3® Q:yuT"B!? 2$=fRų)˂}'[YϘȽk]S*=cԸVF@b"92 y֎ s?Uy_I Ig0Bc(v=UZڍ@ 4V5㍚={cKh;r<];�d{C �\26qb a? wkU,=qVYqrЋj37 `a_6=qǰWןR1/$uK@E�1 ԦW@K3zF3ot<\QkTg%Ɔql^8NI7sY3ړ-iY,>R y.ֶ͙ .&go)eJ%)`8w�H;?(@ l7ԟ~m˷j$KFڑyIn>k]QB D`8-60/Sտq|WiA#\T_T0M7 �^KmK$Iqz 𪥗KĐ|AA.ݫy<s}unVeg,2@^s,K)Unc 6,on7鳻5sv~2`\rq.wgiGbylK>.3uٶu^|;e :1 {R ]T$WVoauH+}\XP ] ;vF䶘~MMX_󛸛@<EO֙ۓnG  ۧ\!�@70kbS64='bUa<yVeg{/\0ܾKH%[ʥO/_a֌$}JO 0 ) I(kdz9k8ɑpagUp]ƁEGaWn$c;o?tA ,6ɃgthS949!36eVDTomo]tlPnћmNW.zc辰/IKPMl̍PA \vYC'�KwUQ^@JRwW<ٔ^><)W}lc 8[3yI sK3A8{BJ&/i[8mDRbngWP<>Qݻ~v.x irZ6A73!^HrEz& p6w gqcS տ2;q!O(pk*hzHTjɏz�1:< #O5\4ff `kmV$_M RHCSK*13-M07-mY�@*h&VS+ q< *-8顄¸,-ߠ%! %/.xڰV@}g zETQ.qyE7 aRbFۅ?ilnMG0UuH;/񢙅Y966[ U~>Z{Ԯ6օSb8R npdA o6r6^;ؼWSE-Olը053܂Yz_nx Y/Fxtp�fUG9f�^B4^ʉ2qbM TtBgԷ-095ytoG oˠQShwbE{}|3aTX<3Bl/خ繥?b`1DEO1c'Y;&g,$RcT+t.ILn=/4Dz@ (}@ q@ @ _t @ @ @ *dF @ @ D %%$%d@ r!Q>dI˔#LMzOڽ)DrTO^+I^MM*dr^ /:a#7$L~݇qHpcދ6ZUt@ *ߔq)EVݨwH/EQkِ};}_c6m_8cݥ~<$t_Ca�� 8u[6U=zyp̨vWdDIzBȳwӞ<Ur3jpO6^51#cM`;] Q{_3So[âta`6po)Yr_-� Jl5nģ(ѲmphhbV`6h xj[[\j�@1mk7̓^ƌHǂmw/t|Kv#T?,V]͊gK�xEѾ4\so \88 ןbm(Ҝt';8S(OщrJUql)-C~!?V ^GK_aQK/M.v�DIA%�wttٽ{֖%ȁdYW><3 B 3GmYhlu=M $ksSq,0 ,#6$MaSg>-L_)>pcXg. u] $>?1,`b]o[CUN]R(l";AoL2+:�YM/edb7*0s؆iO?9׽ l^ok2dw_߁I ocmmj3͵E%wm_<q`z4=gX~|$ުUíK_"�뮔 /ݦCOo_4٤rzŬk~LK{ɪr#)W5({>՞R @U+ ;l[FtUa }Jl,n&49}m}|Joa\ZQ#cvr!4yg1Ԡک�@*<cS/ qBbΈeMҦl%͈,=1 1lwgY_hS"__,q<�0⎇~kN(J\<z@[� Yk1Mf5]2eQĿM;5hGŸ)nlD4si6� ڎ䗜fu[LC2 \*Q8-96P8CӘl8?%y5el9ݜè!dmu6rPo] '=SKZNҮ7�"=#-I%U}N8ިUWTzU.f;.ϓR74jNy4黽PG (�0~ 32lj41k}z+sE  .M9XVʯdg3&E\y2F6ʣ+&zXܿV`fw Alh4k(M㨸x$"lپ M{^Ʌ f4(JFXȽ"I�0lӥV/^4nnF2eZ_޹t]ӭdNwm>{�d^f=h�ij;7CJ/ :ѷuǚҥ8vjmՒ_O2@'02*ג,տ!@t8 P'av" 9MSs?: c\Hg� xik(=~ۂ4iĈ H&x l-;zńg,ۮ ,8�d83g}EuLWGjd? ]YX)]ٴZli)Ŀ=ePBx%]>x% /<:9uM/@}*K� RNXq'sd֎8&5f �)Nߩ? �4Pzśc.oL6˲J<8p+a.zȓu`ƏRy֊ݍ 񷷎``6J0wI11L&Y60x$p;+SVv^Ӧ.t!ZXkT'h8�^"y�p`Ϻ*t�>8q7 xա%=d=G;]@xwj0DI~Fw)GnӮ3ӒkVo3uPnh�>/(E=$HB79%0Ʈ6m@}(nCwHHXi;SM6^;ySk:M5+�n�i)�L{eԹ=3Y8F*E|6M˄K_s/])g<9<b,%CWu"p%')�kYO"gٲf�p)2Uj2^n ȧIּ2'ӏσiwvN]-ӜfǏmpҺImzu0,Bz6(Fe\K+-lѺy :)e^u#V 4J}vϚ۪<zҽ+2ܥ| r!_G7?mbSłxʑq]rǻ sv^Fwfh5QY ˗?&IEMTc*tΗcM4E2&(mfhL yu^­ôL5Kq,S][z; I 7O7EvdծzRm,ø$wRZ!$pK4]:"+zc穧[SA~b^9ǃ lW'>,u>د&r/vcFHHqyq\<6$#}X KF-?ig*ZR�@&μ`f/ˋ$iS"˅͙Q;/|bm4=-׏xè3[��]+?4מ/}*ޘ3s]Uk~:vm^ج�8?ub3I(%bmwa�Aæ)Ѷ/8d K ͈p�C篩^xC6T)%۸ܒ&2u[,ؾ]68EX\Pdޫ5F4P��Uc{[ ]~ZfM&4,/V,�g hxVI/ ndZ,sx0*S^ aך O#ڵ&J/2mut{ ByqANëfh7loŒY@ ~)FD(nŤrI#�Øs.|{C{V h c?އZTwY6ov�50Z@T&#ͧrW#jlrYd_$!8F;֢ΖaOOu\JPـd{iDȳ|zx^ZU^Q==kYCQzo[_o)4 lKrMH=grO;vΗeR@Yq'Ufl;|]g (̙'Ιwiη=穛#PM+)SCsv ؃l+j݆`dOLiw/ 48:R.y[JzKk Йϗz^]yLmzXÆM^xociē!nw4oXQ)�ZZjh )NסU`@iےut%12V]�a4k� f=V4I*||�ή:`&zM9զUw#ɒ 5tG~;}1 �mU;NxukG>^I|I`5/ �,�XZu0�Ŷ�ᘔ eXd�p?x $!ޥпۙVO+:Ҍw:|C 9Șp߰F �ةMj{h=�CSjԨ̚-kI%o!IŜ{Jg֪`mI nFkq�B7j܍J:PҌhy2̡ȧ8#rn5��OӲ30|Nz-�@ ~5'I)n]h'b@./&j)߿��oêգGCE ˶@) rDu:X\I}d/H*&L{b�憴*^�`L%idC�i @ZKzu�ؖcoiӴޙnPϙmvgo׭вp$瑦qT`3֨ݦY㝋 ?krWK~|tP:uسGT|@d>|,]S9mZ*8XI:a�fY73ڰQJ(7S�r=/#)8V"�m;߳C��k\� ^^mZjdz3cG[+Ŋ,*kSpP�Qyc\[{r|qq_.SK $-G"D8fE$ nmzjkzȩ6w�PcY끦gO?U;AFt^B��EegWvP˄^Rzy~4�ą-] oPM6$zQ;Q+qǏ,Z:A"o` 2Oo]j(MמbI]UqQu&S̻L3zQ^M#鬚Ee`,/J|5Ô.ϓZ@ ~9~z]p�Y#�bÆM_vlaݘ0Cr(l1K*%ޏW&1r×kÿ#?fB'B=WIjvBKzuG%T~&M:|mgn{kYCP ;#z{r]M(&w�ooHRz-A7D^tƴ ��-Ode;#<6oEqNE  pt HI'xn֬f9tYnYk*!YJ9$4Nxfwvjݳ5W��R.q\@L1RD &<9 �d{l͐/o|Bͯm �G�W�K~ �&\ L[l[x]b֨;z iLǩWJ9־a}lfr1^g!TS{;,FD,Xzj`+$j"(NڒV#<KyX]IplddST͗sLL�*:]ǭY�6�� g�@��@~RAYBSʔ.*j �P|8j>kJoɣ38Ű.ZXS^5b?jG^?%轪!=s;/w,birW)A8hGB� ĩ:4EbPwA]k'�Ͽ\ qWL))~HvF [O ^�ޝ\3$FJ>#௺-h+TѾkG"O~j031�`p<jhM͙zŴd„ /w֩@$YQ+8ո �P$T(ч�(Hĸ�o;c}3 ;,K4\([52.6e]pJI+N4V9.ƩfrmDYђ7nʞs[~V3?N$9_j9σ6.li's~axk7�@Rj<kufTU|G =R^�$);3®w yƪ mf[UV��L8IUrc?H+y.|�cV.zrǨƝ@.,sY$17ɔJiZؿzU~z�@L'!lYhs;QQ<}n̍ލ8#�?s<�x%�6g^x`,9_8:YcK{Wa88+vkah#,Ya 9ytSqq ˉyu됐cO$|='.{N\sb>AjJcN/W@넧g%Ɔql^8==8pꌳEFz��ypJלxw~PL@,>o?eׁ&_Ln6xp67鷨Y}vjibrVXRT/y ֍sـytӰU1LJ7hʃX=0mi~Vl̡4uK`b)KOTCfsB@ bLxF>=w״W[3N1j2-R0hd釪p*FhhIR &͛шM�%sӶ8=x2!̗! ]AW3?w_le\6}Ƃj94�PHy};zDضQ ���IDATڣ6ȷlZغ.G<'lOuF|S17ץLamY9E6E++|:D _˒dJ؂ ˛<Pp cgt͜9 WGKC#?bϔyr̠ ׺⻮W爃SsFM4 ɲӑ-zy29u' x_hYm:;@*{W[vgeV RD2(kTxnEuk7SwnU&j6%+:϶ȩ%z#ɾjF;Kسѓgb0€}jǮ?�t# &6eSA;>sp}E;[.� _a}5h8Kf\ù:6?_t,IV1+#?y$pkĂ$ίoX欹t'GVзχ�ucc2z٧.! irB fhamZr(HLتpn$I h �B3XB 8,2#]63cQN= ;$noc^A^B*Oͷ.:I?9/ʵ:@\we 4!�yHx7?z˃ U)Mnsr6&ުľWi^vR̨l AzJ&g$!44岋;7~NF_϶{ww 1Ulam!&x>~j/"e8"8]#y9'D 2`Sv47�B ��PvisIV*Vei 1ir%<+%jT@G*8Vֆe\ͣ+JB! =Rqqy:5lHEGsUW%M(af@ f%Ii)iQEz&c~6Q)9>!fbn*:E0.ga+pYƱ?ȋ7 ;wb~~^aQE =F\^yް-%,Pl^tÈ[Uc^L5/YX0܂+)4ʼnkbg'{UoU(3�4ثeOjca8iof Ӗ'jwjc)ti?wp>#?JNZW(sX&vUMԹS k2M.jmgKB��u¶rt!E͚Q&ffj]Sj-,+T~3 �L/d{{5J2MW1)6E Q@S&f=fO@ ~+\B+ݛӠ=;xfa��>5ёQ >r:'?jfƌ=_u_l nK1x :gܩ'2 7Ln=4E Y#8r@ @  #8ЇK@ @ @T�@ @ @  9/F&T�4R+`8:1 @  ajRWfv@$>.acoAMnB|B �lk{ Fi$ҏ,VP~gEM91Pio^Ktvz.!7fŽu\k*Wly@7 jH !S7ݭW_߹t`TJaJp@R~nFόzo!pu-n*&Xw9]YGle&>~��p6׵i+[MCa�� 8u[6-KE  !wZ4^<ܡrbL{vdTn Q{vmkg}2XViqW.fK _Qʃ1NÛ]H8h`?H联o\6͔x%Zm^R#Ge$fݖ�0 ˈѹw!V./<][װ5Tr~ѣGY~>hIGC?e*\Ztѵ^%SDɑO{Ґ]?OM<:$&VSמ]:wTv1H-/=< ^��W-QWڕ1)fէ2/=DdGͬ>l{@x˱Wh^*}׬+G3rZ7Lh)+,j)5SXS_L9}B‚)‚3_Xȁd<{_e㺞etWٽ{֖XBJW;+�PR P(?_4[aer9t" :vBP((3zQn%_"FqODHaYFl IwUΞ}ZJcx|ӋfXM/Dڏ\(/o߹;k,=롇W_6L[7ɹ:B&(ݶ(Jd[mxQr=}%+G*UPҒGӑ)N=j=n)9|1 jC~3F :|PWSnڭu .aVYSyӕ'UZ+^k/}Sפ5)ۚ ?_ 9߼ζeϯпw 1s̎3êjܳ+۶og(T yƦ&%ڮgq3G >M]3'VҌ8̟^jTvFT,/3ng{\}mq gİ!]͙<KrۄK,6sTC2o(t0H[Ff~ENҋ@ Peaw<P^sb?GQmYֳ�!Z?m2i,"mb.ߡA_S>:<>O6wS-Q\t�x}C#%?u[LC2 \*Q8-96] %8ԐQzjҸ/j՘^1Idgy<́V ozP"Qn61(OJIv>fjTJ*Az!Ey*ڝ{I)l!@ %~۽۔L+z/HS%a"-1iiš]m6zV3 䢬,)xAs2{9Xs%R*05>K �:tl5nAd뻞K~RaVB9Z+HW0<6 -[z(;,uР F_9!ea|^uҧInfl<=VUɴh2Jךе(AmhqׄN_G} ;uSѤgUF] =YFZ7u6㲬– e;w+&>#gvX`I@w, 58v [6�L1"C"^�`k![�ﮬ|,.lZ^6T/q&j,ܳ)T9^>̢:KT#5Qi2zrdo 6.9qRTX{>l\%qX 63D} '40V߭R z3p,?INg`�DOMy6hnGtlJY"kϜ�%tޒ^G4"E .w �8V܉Y#"IY�@nʵSwOhG(E��ŵ1}˻S{{mͲR+>JdFT,vbw‰G/:潍Lj}]aľiL b 37 =0�~p˂%L",Fc,J0 N1>rp6uѠ 2\:Ap�??M/aF{U�`R{⩀n˰AOAU8y)KTL!I~Цe36[<A/smyY'=dKorpsK`$]mڀ*2QܪtJ.['wd=&J?4|�[=2ܞ9C.ɂ.3N?[;4zcO�@T@Wg=?�ҞLi3T(b˪1юo$Q2%^R9/uђ e9x:uRdduBCA3zNe<#5ūsɞVq ӹ&�]cd乣>&e<9<b,%CWu"px݊V=?h͖!qQr\p~jפzuG,3*/=Ai5WN+f}翵szlEG0?~llkE*|1sk_0zN1`RgsݴL8tE:٥ z+kc;P^| ]Q_vUc4l8ԡwt}Pg~wB={,~͓J5ƊS$o]nk/O@Vya>]Hgr/vcFH�^ۜh�{{opcho_瓁sG7bZ~~UW{ AI*OԈȋ;0YJ%zhbJ"5- �$I"kبr>d>O; '^zζ$!6\>+8󡵍$OޒC6m}\I9.Gb{xwE̪e�OtTz3/آ٤R |$rvor^'s!psf ߴXjc|-wxiA~<F �ZaWW,|SƜ;ﲭ_ՙ#?%lDf5G/k~HB)oӸ gZp6HΈ}Ny'[X \hF�`ۄ^�މG m:NݹlbBqX-i-S.�[/kSĞӘ9gqJ? hb OZ4r=@&WSF(v,%Bw=,/= tLH| ֮5TzܒX=o뤛kW r ^UOoDD[ĶnDT'$�-So6Z�eea9qRo! F*úz)[Jm�HdydF޽CJy5M:%^�?aZB6�wܒr׭3^h4iԳ%X &|m\M-%?"?\h�g`R<uދ<\X6ov�50Z38: M8;�NYu]F)?k Og^I#Ά Wa bۛF[JL6M<˧g^饫>7u(gw; ,mq=4h c?އZTOr%˫^kBv]#ʣ޿]vFV,yuQ/|{]G6{,ްo*ni Oŕ% B7o~VR`am[sTf/4#_zB?o0%R^2͚6bavc#Ӭ'rr �XVn2J{ns.!]bq3W1NZ�gR :qq_$b}ʿSC EX � ) C"Vz�FX%RӽTO<«jK$>k}|n,9`&zrj*oF%�#j<#�D /{cRU/ -Zp�WG�x%]T!=jޚ!s׬ �7 QHn:�πb�pLJ2i!Dt|rtBksT -㮞 MZҩaUTf=5o殷gҌ'x+LNWsۈ1)4ո,zM,\"854Ɉ=Zر*�3[8]AW=֡[cku4,.c[ �紌zULwsȑNK_)K9jwimؚ� xpW;�(�@[ΚSXBc�g-u{OV9u#9O^:&_T@1PeоE,*>nkW-\ FTtV�q �֝[;pRQFzz)iw<w[wjp5� �xp]&Z"0�4!�4Y{&OZۏ%t�8bA��8W-q8Zѽ[粄Vq\|ԩ^Ev\M1NGy*{}Gq h371=x/r8A4k\r<ϴ&S7t9 p*}|V2OwSF]fe՛RqaW3[Dp&͐IVm7w+UI{^t b6-0M\.~@9՗qzoƊav-Znm?E`�m*wN})^=VYe8HtEۦgN| [957G�PlbY끦gO?U;AFt¿�( , � <k4Z&Rՠc-Ϗ Kqlպʱ+kr~U4o-<;*F1\h~ЋI$|%NQ3 naеfqDŽ'V3L (,L�۲:JAi:Y=H~g:~Y^pˮF  ?aUY˼+= 6l՗i&� }Oc5(ze.XUbCxք/_:5Q;v.~�s8E͌ ǫskYcGlm(h�ĄO_CaYRa,iDjo^e}Iu_oŋxEm5R8M"0zs9&` Z[VzI�} ߀穐mU >'>s<a{|Rq\|ԩ^Ev\MG~*O]1]e?Ô.ϓBw~w4@/ d8pVFYF61΃;Ofق GW=P Y(0y703�ԇgT£u" yblN ?:_Ϲӆgl47x�aaŋjLRA^8+GQ ^0lq1?V3UD~@L ~r"RI@\5MYܽ Yr'�2JsS�\ /)�p.2minvy [ ) K 3A]yѾ8#a\W[S880 ܥUIMv:}W^)|nƦ �H~ջ@AZ0�PH)tsÊ?+YLANj$ˏ!3@lڡOWc�Tfu 78P0+^S eK+:�r��ʴW {a3 fXڽ8J{J$H5^5ZWdt|2%CA)� Hcע7Y<~ʚ�a:Ѧg��~ZihJN5ڜ6ZN 4^r$ӾSAW1M(njNJ(@5pP0}KycZ:rUHYIŕsQzځrh4^<j׮?62l) t篚YzC6�ʼc>wfV&|%)?Kd׍_d$% vG e�Wuu0*ngZ aBI^d Vqq�(Hvw7n:5p0Ęr)-=fy'�I 7G'or]ȶV� I-lx=m4}ܙc{R(ч�(HoŸ�o;c}3 ;,K4\([52.v(CWχNZqgvq1N}0l۶ %ʊqV˅ͦ(\9��ظ؇9�mTai_0=.-˂}'[IۯrTH%8 �N�ޫV*hs9aِ:'U팰kULP}WFAd��Ӭo7NwCգR�0쎽w(�do}Q;q 6\iYgd/EʔseXƢ#rB)M 7]x5@ez͙r�ޞ1jgSenr)Z|* p ��☕^%6n_t2ec*.PQ󜌝gXӮoJЃv:sxn�,=�H]ϲ7ݼ7}czyy壮S)_t/]_vtBpB[+@Z'<=[.Y66_Ȉc84Sg-7mu՞繊׽U2wlo{-ៜ5\fAD?}!添dZ%slȼ|c7EL]&7L<p8Û[Ԭ>׀ytӰU1LJ7hʃB&̑gVJkO^)_{UA1d]h].쭰8L$_<�WןwY۫}&V4l>KbegL0-# 7X}ū¬XDj͓=5ڐz&wЖߝ+]jѢ]є/{MY:}ʥ\m73/5q[l`Ӄ_pzM5&"F^:ro$lҼT�Z27m^ I cW-}?1$!_PP࿱~<hjK}1x܁˦XP>�5$Lolmtζ5Wi˒dJ؂ ˛21ȷlZغS)tKr~w3=.Ty'yY= gl0vNiCˀq5QD [vv ໮W爃SsFMx g>g߾vӤ +\jաݡR߻5(nz#NYw15#sc ]ăUw"c<Nz fZq9׬o܊{)u4moa|¬tVA^H2s]}li֧ev 1#i e1tI# ZesNN kHfoB$ ]-i.%{;JЃvju)s7~v4 7lJVtmϲ7>|m#:Fc/mw*krךʃ@EK~i_Wy4ף]UWJGK3@ݠ`QO<ԥC#=$!MNH -MK$&rllƂGQk N`"IKPMl̍~xHXłKO6fh̍=0zͩC= ;@F<ܴۊbLkA`EgE0(eAҀE=]ڨhRa|juQ@\vYC'�KwJl13�!OIGxCqy8Ar( |xSƤX[qyI sK3#J3 �U̴4-Ń" irZ6A33c&" )Id~ @$(Dfe*V|-K]g=!đ_@ KGka9dUb]?fX8VdB˸TJIƧ<U 1J%q!/IJyU&T$'q 6gV$xҡbZdQ*feћ0!&MnT/wwpsYYmg(iA6Z{UR$ U*X(poB �d*JlGyw1TgnD{ƥ$S3uj`?O˛()Ӻ $WuGvM[~*&Z˃Z}GlrMOkÿ�ݾs?= \@)h1@V 2l)1`E DRJSz9N)QI2Ph=V�SH\n/f}~u~[򗚫_}-.<y϶e{84{fOjcR|4olv"\/ן;7ĕ+*s2M{WNS<r;?%]O2hڝX޼mߎǨ=;xfaJTOV&l4ۢa(8ƍΞdR=ޔ/8]{=| uNn�SS'Od l Bo#8) h@ @ hT+,@ @ @T�@ @ @  @S^E'G~B.$PW )@&ƦIeq/ JiJtl:-B{y@C|\\:CYT%\~»*un@2Ӡ�0 g޼EUny&>~��p6׵i+J$C!�yײcڳ'rK8ܓvMkg}2r1I)K?�0 7`r6jT߆Uknģ(Ѳmph%RܕRJH|hi֩s:\z%˟rkF^}mkKWd\J8eaV4v„3מ5]4q*|hbV`h8@'xj[[on+ku>xw)'= i/ս,dG/8[̃?ʞw"M\ )^?*{KE롼U2-?8ʂUϴc)'ФB;aҭtFw_(Y(3333Qn샩#Β0JYʱa &zy+4UEz+%\(gdT\y( #6ˈͺ}!5IS.nٳO rW!8p.B`dV)3[[i8mnsk1)(dz^<5ĚoZ4r 3+VAܨɫ )]&5+rq+qE.^SәV͝=tI l^ok2d L*/{?TxV 2?]x̘ CQ+-::Wy;kW:ގRTM塄E?=W4C~A;PeRW@:~|v�ֳ`U{t��=ǵVK+Bŵ3bytS>Cs)Æ~w6g֦k(z*Hp#CQ1.ǠL#1L)992WPNgq PD ~Dz�0;Q(9(ζs,^Ymg6t4 G61PsԠvv.5Nn{7h4�mGK;n!L.r,Nq`AnNcZsij(r쉃~~̎vwNTzU4ݩ|oդq_7jլqv+4y|[߄ClnqύۺT,uР Fo\,?vىsWLO^aun<z!B eY> i<K\QVj>s3ůsj窹tcF|A57.X̶$7KB36a`xV]k/zVJI"NSrlǶ�8da1Rʕ򠱜-Zh(WZѵi\-5R~N:ūk9C?@*RfV|J׵~rQf' ѩjM0%�}+DgZTQ-ef`̓a�g3-i8�| ב5 � ř9,De:R&W,w7,Ss1'N kcއ+ā9#7}Â0׻{QV2zUS�>m( l\9j{j}{Xxa U_5�&!D�a�5-�׾gm[ز@ ;w �8V܉Y#"IY�@nʵSwOhG(E��ŵ1}˻S{{mͲR+>JdFT,vbwBh/:潍Lj}]aľiL b 37 =0�~p˂%L",֦ɼ)q6_[m8$!zRIcW6EI~Fw)GnU Ya|=(vay3*X~g%\9_$uz̢ܫr �8dM'?S�@ dJ1Ba}wNw-rYqQc w UaP�@"?fTN58=~ݫs�AlY^N]�Y݀ �O5e'z\iIZ"~:e?)x:gj~&dA�dW0Jc~њ-CB)�Rዙ_BЅiջu!#)�kYOwz 2ycIfLj_ȣk~]rkdE>MZ6ŗ)?~|\=-JSy䮩<hҏ&j]tiBc~iWW\~393ӽz%Ow p �$ˆڭNǾڭ%^ʡgޝ&yGמZo휺[<`ѧ91ٌ̺Hs;W͜iKikB+ďZ!=vA]IZ{6a;"b ߮=@*3~"fWXv򢾒$rIbOAs^ c.]T$;)xSdUWЇliĂKg7T̙p+Zۦ-\r+O:'eZ�@- nM Fx: W\W6/;�)G! 3v_U -8l;wƣO 1^0Vf�)�@g =% bK 7ym_?άq)a&:/e59:<�O}̔$60}ve WaShd w%fDmo�[M8��x(HR@ s=G6 tLH| ֮5Tz)6Y^I; C"ٺ_ ê|hW*"i7ɯ E"dxd_)06bˬ@ Zh+jZ;t+ɶ:w-]i !aë �;䖬]yƫF5z6x8,� z}r-=\}s΅}oxHpsêJWy==֘ďIrMZf &�q'.��(gw; ,mq=4HdR)O}ϵ&>C˯V9뙐IrC#kQgK갧:tZ%B(+-:_STMA~4אﺧKNzu؂NIufsUcW/n�IWwYX=^ʡ�8:(}=L:ڸZ]S}�)>g?#hjH>|ӎ~ϥw;~ #?{t凯޻t'=Ȑ ܏õ>񹛦?fVk]W.uk+ �XVnCȳ||׮XpU̶�ٹTþD\ܗ/IXG| ���ӵ�`T!;g<�!Be]�F,{`QTMZS1�ֺG"wI5Kpӌ|c PE ,�|A�xIH66]IUGm-i8�ƫ#�|.yI5o͐kV($z g@mg�F8&%H4{":>9:!͵ù*qWO&-_|а*zpƽmp7]]@c8C3LCZih]H*f7s# ,+ Ȋ_5MUo_\,|Y"z}Z!3xgg@pVvT>Zԍ<y޾/H*ؖmݹG)e`$R}1XK>wx�Sw֘�TEkZjbWnW޾� /dCx� -5^]>t �ݳ&GҤg�0Ҫx1lIj˕_9Q[բ=uJNQP'ٱw�}o�`U}`sNPo# 8O[/ `�idC�i MGr[Qs3&�9zEs{(Ϯ6scىW+&�(cM= --m[l��lHKzbTlޭ_\WR-vm#IMT/w�䑣_}7gTTafp(')IOgm06T"U8P?.r㳒y셀22{([ @  �w,MϞ~)v:!B��EegWȦvP˄^R.3[ @;q᫃aKcugcWNm!׬iq�M7."I䑳Lщ0beAQ12QNq *V~ ,{)~Rf "3[o2yr !׽8#M_ G;_tjRw\Z]+)%g1aׇP<cTKc= 6lc �DQ1m?cV^M_Y_R?כq"{/�tGіhy[Y.5K(E-QV]K�ÿGЗՖ+MAr<ES㺧K'yǫ/dbG-S�8ߨ^(WPL Jmt*z䗭Aaj(RAW`F-ԷS!۞$9e<,8bY3mz׾{`s{( M蹱PА�]NA2r#> 00:�¶BmuS:<n6yge 3f6<D °0 vlBiA�@!B[q4_* Ce(AբW1 ݣRN�cq;v<8?se 6]ZQ/ I�%Ӎ [3dPhfk47�� naa,F~aus&0]=wg$޴c6Kj{іNv$X)�N5n1FgECRҙa�u7 ϢE+FDBrɯ2럭T|eTc-٦9k^ǪZ|6l Qh7lF^5cOj`+LI~?ǭY�6}2cA7XҜ0f,@QV{6{,گrcZ:r¯H q�* e/?黽\nGҤ MJSyЯMhGytW\X8v*`03z��AMM ׶eiʫ$V��2�TG-gLs;ЩO'9vYmh\~dv_2 IRz0yCY4;ti �(ч�(HTġ'nݺuj`,.:=�0iӜFHM�$)wd �-գ%<F~n96ehv0$d/�HB�U]D_O⿂q5>�vl=gHTmiP(je\l&8ЕV)왝,hjs\S>p۶;i{%70n܆=rQE�Tl\qC� ~\`dT=Mr# Q#yG8l~nƩ=O{ΥpWyu~"YVkg��@^=jQ*9/e+I�=je[2V}NhkZ!QΐEʔswƢ#rB)M 7�w8υo��rqE/iַ';R�`[z%_N=�dwPq7/:o n^sg}$ Mo1�`TN\Ma� Z"<&=k zh\i* M^:$jN3vٰ_� Jx54F=h~ :zvʡrZԁT?8wme|knγQZ6MJjeFVuo dI0n B~W1 p[WvPZ5e)jslμT){uv#F>ɸ'}ҵX)qjpu?q&I7۲�`/^f'bU;o\M]&7L<p8Û[Ԭ>VKdpoP`8-60/Sտښq|WiA# QG8{#44$fhĦגi[wRhIRhjsӗ! ]AW|֏뻯us2.>cA�t3eE:ۖU)uo:;;`$9"cYLr|[aysC*�`ūBJ={P17ץ!$WVoauH+`8sϲS6mnG5ؽE+yQKi_fMx}ܞw7wqjxVϺӴ"]ăUw"c<Nz=hsFqέ,K:iТg-ϟsZwWvhu: /E$ѹ.N]WFzsD)P&<BVty#Ua<yrM6h>%( 0Qn4<Z^j `ߕ6(Ied_YӿvJMήm ;YK6^N4+MAK9RG-]oehGx>{.?ܽQR&emz3qILJˡZ9ul՗Q_qϦdEvxMS;Ц޳G% %ԢϾ+,6ɃgthSiQg怱O]8CHEeN= ;wD1i`keA)kK(٩)TG{:Djޢ́$AR.`͚HBؘʵ:@\we 4!�yHx7?z˃ _^><)W}lc J_e'*-͌vAz J&xP$!MN&hFvfeNm8 AmzL*S*Sg=ʻ{ !~U~ݚA*H&ތU&N#lMK!GlrMO΃#O5Ұ2#%_ 6&?<S$'q +!LI8UN0-s.ɪVŪxP<7KM*�`G{ 7}1Jʴa~Oqy5~''T8YZV]KKRQ(EOӢժːB,>@P?KST)'I+j] C4ʣ[Z8-K6Qɑ]@P,z[.toJ$ 3.%GSæLv@Χj# o]^!k3@)]]DJ@  -<ʱa\-%,XO宔4Zsrc3(wCk=vfZQ6_1}63q q҆@%hD%rۘ~97k󫃿@Ƀ( 8?[ǥ$e)6|m9 e9Wan}Q+J0wl1ɩYϣ{+rT<=v4o@ _ˠQShwbE{}1*{D,R>r:'_.43f٬C{YV&輝ʆn8O&M9<WCST?]㸵=>tT6ϭ{5Aß/8@ 2e\@ @ j42#@ @ B@h@ @ @T94!LLF@ @ .\Mx~ki>7!�nl^{QKVrBhCrJ5GnHHT3m⠮"=|z+R6| ])MMG&U"m T^ȱ7W1t#Y2&,ġvP$@ @ <V?&$޿,'~2Y~9{.Vjќ�)JVL1=_;"ȼyeԑCeye !gCfJ;=GBV+w:_ 6|h[pHBSl#ogG/8dV.<sۙ忻z?3fojڛot wΜR:\QqcVeխϔm7%j Tݻ,G.8[,@ CȤf~'ުUM7[uW×5ΙT9fƙ 9eY.#cc  ,5`c;VqOϋ6|h[Ѣw zmg~ϟc*O 2#k>Ы:>8qlVf�M_RA2qȇ 'G05m $!Ј )h\{(/,4LX9)n@ @  $;1)4%Ϧ`"J9|w'uր5!ea|{ ]شī]-&zXܿV`f|$�Y9Lzk7D })TgDߖ4�T\ =wQԳeOO p@܋oL6Ul_ۄ&/JX"\SlybES�ph c^E_?u1[4_^Ʌ�Ѡ0eaw<P^sb?ǯ.zq`l=g]MKjՆEQ!ym"p�P}]̶ѩhEYYRKtѳ/H̴l9]ȍNWnBDž)$䢌lߔ$7KB36aRX5Gk@m>h _@$YKJVf{j}{Xxa U_5�y68j `�}X2@Ƴ)Hi>4LWcuMFȐd"l0�xȖA�Yk۳6̂Tf-l٨ !@ ]rkdE>MZ6ŗ)?~|l̰vh86ƞN^z~5�H ʩ}QV_ǯ{u�x6h-k֩ �"#h9u=xOsRcu?I'GLۚŲdjNZ _maȌz."3|T7-^� g\+Q fY9B^]pk0)](♡M�MS6Ƕ+t` ̰_ٮ -\[ݪõ �O-+q{{p> ͍\O 1j T �@Н8Ʊ% bV_ bSyt G(F] wϒmJ@7!XT'4V[yznWAW&v ~#ɌIu\�H{2͘R;;_㒣NIr=# �@ع}LnL0_zH[&9IeIORĜ^�3GO Ӫw'hC $4GMkBS>h _Z@*~�D .p$jپߒJ֛)kj&ɾgm6HPdEoy<Tpk*o_LP^Aq F/rcg[,\4mɤQW{ : }}O~uպi�F @ @ I$9%uS:W!v3LV4$ EI'LKh�ܒ[3^h4iԳeY* |p!Gz�ˆ�F^\KKܵCa7n'yScm7czws 'wDf:ڕI9bmFn |p`rzc5G7_w8G�$s&c|?`n]&UӶD c[�00df}�(|T9e픬Ora�f>^,.څ͙Q;/|bmaU,l͢OEzwмZmZ)tvfpbݒOHҩ{i I$� 5 R)O}ϵ&>CTv{AMk|odE~ۖ.[ڴذՁi7w\IzCa3My?̀taP؃&xŝXRwMI~Mh ᫗__.|{gKJ=YJ0TMZS1�ֺGU�K5@}Tuɗ�Pu3@g.�Pt\$CKf/4#_zB?G#T@ ⿀i}O ܐV�D >Zԍ<y޾=*H*ؖ-Z �6l�8t֞7 ;v(:,S"ҴǫEPF< uhؚ �uthЌ=|*(}F�r0@.'!?3� L M53]w%e�QX\N?.[ PuH~5M�SevQ%Y2�0aa)pT}3�/2΅M/y4aoǧFU)ĩ_ӻOk�5�J7XBc�R{gg@pVv� J1S.N<ct :�u84�Nf:��n `@_]c}MWAj@B~vK|N<F_YaJF)�}qX-�yhW�@)Ba| sFYDX%n8Y<qBMuZt={-€@ @ 0uD`Zqk֚|cK&5>|ΥEGms8QͨQ<JCbɡy,0hxȣ+O]GȀvF mxlLϚ czŽ8| {X^n2Ҫߎ|?ˑvM}(2= 2" X7W3dJO�@a6Ѿ�G\t a�J ⚐DQ2m-߻q^8#$�teͰ3-].7"elmȣ29E0vwQWi:5 pt _ ,'ˬR8m(g!+ /,b(="aʹ ,r*?H;v<8?se 6]Z!@ o �U*VwMݰK|fWI^lz)I':b� �P|8r(L]G?neFy~$;#'N�NSxD^Ƭһ kݷg^?%轪!=s;/w,Z<N 4)QX݌o_. D<ϔ*9rʨ''@L7./='F@v+�ldR^rXҜ0f,QTԧIK6uirpTF`>;IsGF~EFθQW_G ~]2-`n049&T�sgSZ3L4ggQ+N~&W�LnN䧍b�@!{>PAPA2��h �XF|D @ F55�re Eʔs珆Ƣ#rB)M 7]{ �� swv\� 7��8f増īU_­Wx_,P9qqωӸ8ļuHѱ'LWJS}}֞| ߍqS7qû"wutjUK]c-tNy_}"fLwx3O�B.^I-zŸ�o;c}3$zASQ7r3.=x"d̖T:q^ye"һ.r� }TؾZ;v#G kU4]Xʑ8t{WeVW�(�kN~훾ױb=꣮h:�@[}VEQP+9+>W1[wwqQ4o�Al N,nvw'* v؝ qp\8Dz~|ffgݛٛcgΎ`YTyG0wkݰё.QSEkFX8kiKT q7WxT.W}н݇!ΨzS E]ش�蚷g WZ!B!óh=!7qo��Z6tr2=iVZs^Wu|s+g��߮7m�i6tqz-<]}l @z_qRN_~}k8x's<X_ �ňI c;{sPBe%>y$agKSz?yP`�tϚD4:Zj:ٱ.& �~}t,ϑ3WmGvɿ[~_NsI'l+fWTqӤ){ςo#)ӪLDy<hY]ܷ3$zz]sPQ}6}$e f SY=45! L'R_^>pny[%{~0ZvtW�uGdEîm >J꿼Csىkk/d[˸rփ8c* œW]:Ue&eVfҠH"h4;7)N@q- /$lc+sFPfQ"S,}+|!BҸqn�[BU'#&1.R)AfȤy1v.3f4'{m`_$!.YR[$_Ly$&0RcbYn.Vs~D%9&WY}I./&%g@S>SUV�7aYǝa4-Y%RF I@C1\!SX[٬ k|/c^9t)(_CgX9.He&S M}P13H[g{"~EabN*<KWAi*}!9~ Ԯ3wW૸3!B! tys ɟ"Ҳw(LA_{WY}mUka )ߓy,jY ~YWK̊hj#c`Xi6Mi\YQۋutҕzS8Y1nh*L֥Uިeff&.n|IGu)?Zb̜~?27!B!.XsjS&M`+֫wy.y5'F:6k3Oa1pbh1~[p BB!B-8B!B!B'B!B!BU1 ٔҧ Ry�4 Y%ѫ_D3s]:>!/Ν g.S˥Bn2Whi9)9)Y4}sczQbi&f̿/__߽FU<@J.6O"?K˩N ʯ)S_RxI|prTz|+L B!|7 V={1PS,pR!]d/) ة=KbJttòg\(#Ϧ} ՠIJ9aھ;'|>c7PW  )N A>wl=/~ii^u7w�8eqBץ6WI>s%6s|^UtڳK玲_cv٧F~"M[:}E 1sIcK]W({/7Ur2n͈/GZk'{KV 9Zb3 ptjJim2'><qO]8G T/nxϾlFWanqppŞuܖaf BUtv9e/MN;aj(>H,t%`Z*8yF'Slq�Y3oI3Qp=ww7WL XXj][h΂2h˫OO�|9&^$5.m9z lfRHZcG|IM$[3|?w|:vΞRǮt�O#)e!'eTD7< hI�ꩋݻ5f@2W*8|a RXURFwטA�@ZeZ%?4b CݯW'x'"0 BJ<|~쪮--N鿙dr4MN,nMG5qFzɮ5tW}p- ()gO!tG�KD�+~beyО�NgD|N<!�?=uQ\Pwv:t�%Nz |g {~E��:ۥX#8&A3r<E]i>Jiط -7voF]�Rcokl?uC-4K+~"q^l6ahO!fIsN|=C yF "60bӌ!AgjK gpT&(i .X7͸f5�>\bס'rK&gJ5u K2uhJ,oyq+v);(q훞[{A$mI gd Z_ٙڎ7kg{ǫ3`NjB!*MN@֏xG֛AKmbUrDYV-ڞeDZMZ� ߸lK bE8t˃>bj i �$ko#ϙ3i�OWmꃈ`ߺ&{Y6֞\A:_͋9Z̏\5}ϺQ-!�xFX&jEOB߉\3y�{zg^nWOmjŽHyfGFab :t � Sݴ9޸lNڟ�?�BAfVlmm6 �n޸Raҫr/M(nWַnD=eZ[h~ }πzoSJ)p<ȥ b7Uc&�L [/Y#|}lY4�qвv/�i_U(Zᯟ :e+~,Z1i�-EdԷ'uΟT|ٴ,_}uޕi7xz%\}~jBStހsEN;Ԯw>kA"~ҵ`gvPzA]D9_=G<]'~ƓsKq{k}qg-!>0m8Pdc>frL-ǩ\oʍGC)gۤI Bco8kdd¤,:!Br)2g함p5]%8 q&z-e\ʓy߯ۜ1o囶_,YLf/c=yGnތ�pu3` lkVw2+(G,jST,)+ k9u8c*RX,>}=Dֆ$^*供?~5g%E!w8tM=�hsw?trUv]rj5m�XmU-0=DKkZ ۲aӮ#\�m4kNʍԞ0/�@I~\;`oΙsºC6I/R.�(*v8wd㰖Xf߸�aG_c|a%H93ko*e ^u'?U˸{ !7"%Q[9ԕWn؁H"9|2aƥn!^ ��%-,8nAH[ B?~n-/^NhH۵3K: *Wn{)R'09lSܖ~~}̗�]&Y=؎umyf"ft[wvaiLy&w7ԴWk[s.larۥ$j'AUIѷUݾC5zv~w-9хKӶe]:v!BҔl7K|b%\(ʎId6]lY_TOA1nhẁMڷ/{Jb^;2&;�v<:[jղy!PUK*n󇙱�-M|Ȅ.ֲtA w]k@}E!7 @9z,:�5 ( Qyv>�T ��� H�Pesnۥ1ط �8҇"vyon }�?YJ}?vWi#4J8P2s|u&.*E϶Y!k߽U34%t`&At�ؔ~zZh�.M C " �ĹJ]3)"iKֶ-j$h-ty$Ah69A{yt˸8�u;�СB?J<YM�ZLf��Kgi([)K G�đ[mKݴG'X'h7[m(i8�дǰCS&O��7aNvsð" 0#bNjB!*GY'c1Գa77s]P{6j;f6ծ/\ۿ)խEٳGYbg�* \zMQh>‚5Ƥ׺7-lF"�&ۋ.BMR(ۣhIQ � dwT0'6�dH(Y^OJ*˟l-53K?�4%n[n =\{+*nHnRkMmJtY={M}o].ɑrنV")�1#w_ ޥN{8ի<a:qJ:WBQGSPxwDPN_ݲf-A zRlC~nSeCx/띃ZpVW]r~HN7frŹ7ɢ<Xl1!BҔut*9)I$APc� VW}4.)TR*N1 δ"<:<('%7x֥hG �d10UX؝<6y9C})i/!7�� �Xn5uK`xDq祋RT��tm8lrC)%TR&չU,)ΰWbƔ=őپO%�'bJ< A/gjt-< FC(]Mkfݦ\yQG{d7a?e 6'hus3)mV3}iېe\[A.q Ep1L�@ u$#@!B*mMð6kH�ܛcM;(om)y"���${�@ԡP�4J]q킄DCj |�oWaбcz濕_A{BMt-=~z!%�x7x-SOf u S_;!757"W"[Q趲=sRK F,X iI:*Lb+CrTLW)_pC�"\ ַ,Xi0CJwg8rC:5vjV'_g3lo> 8Ug�m|ݣ9zhf̹!{O6MVw8t-M?V{WEڥ:mӞ IsE��EN iٻhRW~okqB!PbT⺈%&/X`ysVv[ ÝimX=vOM?L[��kba6Tv|^kk1wkݰё.QSd ;}5qѶwߺN)I-9I1i&n(U;m7t/}CSÌy,ȡFtEE!s4aOG귱� u,0S'NUZI!WlL[P : =d'�[V_я.zY۞C;mCwJE/Rƺ+wml=*骣ѵ{#gNenJejn[ &57Yqh5umeGwBЏnnލ]юYmtnΉoRb[;fyi6lY.cWl|-s7S3^bqsW4&5c^Ꮶڗ,on|jm�`ps&vz;iwk!7rQخO䯕޼a{:6I&Z^8>B= 9B!Pe!x*K6BJfR񔆱I;ERd^rboeRFܤ8ű0V嘝br,Y*IR)%QlڋBrݦ  &_kE|noT@$Ϲ]QVjb\['EJI J 0IBvV%� E/0wȄpՠ*/92q\Q\ֳfLyԁVZ?k*LH Y:6FZCɩ<m#vP$I)P�~N;Zofc^\�lgW~Ѯ2W 4 iSA$IVKꊽ1-9jfe:OrtqK|_lUCLQ.tFخRPytE,}{"mlȶf>Aoz'#&1P Bp;K;}rOU Be MJbW,]}4z'ҋ.ˡ]U �>\p52GGX:VI\3''ڷ{{-4jʶ0ffjX,V߳ p}ZzbKͽd \b��ٍ{W`q^-ی9rvwKͲhlff\.Um$=}[டbSgInĖGvb}V]? �@*tm {mz gB!P% h0E!"fdä>*=}/= ;6vo6t]{7Fۙb-FUTB_DkmzZ5!oR5_mrgg;\M BJB!ߦ!B!_Cv !B!B!PE hB!B!B?1ȕPBq貐*@&r $' .'$ɪo? XOy:ފ Jv! WpTZ8EU& +o8(_bzco֏+o=u~cf,<zّgBrUt҇;}3M寬)\IƎ%B"ũ~(E;|ҕu"3(eq36|RI>cm]vS֎jr}ۖ׭72Zc69W1[NGhwwEU]�RBUija>Pij|wFp8}ԥ#EVv{h~PlN$1y5tߕ9`ξ+yNY?(z}AbT]oB!*u:UW쫳SځUY=`OwfBU]bcA /`Ӈh˫O/'ċ.ǰVu1(uEƒi?p!ӡGh3+m<oБڪWz˅wեqԐ+g>lk<dU]rUNBU)\!s- ןIl(RMA O}WKܴ;.ڑ56{rO~iU.y)PuBYBFegSc2b3c|o4YUs )wrӳ u"AæInfm!P9gO? �X_/%=|Pu�_;N3��^yۉtR#U\^i3d@򇻧="j7NN��AIWcL!H{~E��:ۥX#8&A3r<E]i>Jiط -7voF]�Rcow%Ki9^65Rx?=)kjY% aօ�MjXW���IDATUz�(IZrIYҋ2zQLmug5uJLo?=]17Ҫv!>}=_ ki>`Rmu`8Bfgo͖:׫.~n ̍IԮc-E3l,�HyxnӭA�@Oӛ{5|鏶]4l=k5�55 褤cERE̶oΤ%yggKLj4]�@Vv{_N' t�:.}>ӳ�EFHiNzdlq%)�%ܛW/|z#GTZOûGRn4c�`tA,�ubN]W^vW ]N@?0?Uu7e sΘO2r,fJѵϑd#?�L><5/{V?ߟ5\zNFV;>K"Y\I#� EO|ep}hPWBUfs� Rci,>=}'sIjI1,]Gܘׯh̋{Z̎\{M@toO�@Чi]sqOٜ#?��r�H̬,Ylmm6 �n޸Raҫr/M(nWַnD=eZ[h~ }πzoS؜}^e6E(xYIZRvvwUT?~ zG)d&T_>9l\a̤(NQ0nk8p{R2x!YD%d2ijׯ817k22aKK֯Wv}cI>~㟞[9Bڲm ZNmmk \57mܲѷL$o� )-5m 'NwkywgoEtl ⟽}c圗!,%dC؇lOp^i�7n~x4"iky'>5BBN Y�@VNyy`[I^T(Sm]3?$F-7߾Ҷrg $թkZ;2/_ڪ U\�3d*)ByӢ5�`CMSn9�yY!, ^=} _m}<R^:ʣvx�n� ]4B@6>B+$/r7O,6uX).:�ˏ*-=={,U, \(R*yǍǎ"W\~ƿo.Gmعג-=2q^�mS z.>׻%>e=>�@-ݧ=њWB : [6`Fp+H7t>G_V]׭yo 1 ,=Z,ihagN=p5ë1�E6wzs|G�E毫|� �qݷ:8yo(?A0';зI}ɟP]�@QT,88>Z}li,F&K߸61' `ok(hhcpgp,z<~v~)cqEJJd!>6ܺStJ(gxx)N_ó߸kJ]P$ڶ[DMTy~xQMRmQK?T.J*Nz?v _?fJkB@goZNy-&tX>Di�eξlޟ_;<Y^ۆ��g&;ψޱ~ 3?pbq0?ƂI\۳l?WG^�EESGc>:ӒƤ/09n߾'>cf+c%5'ó,0ƶ/"sI43ĒȆޛLk9�O(jI=m2?w$'Gibg]E駧q!gv>ŧׯrꩨ}z}Qu,UHV4�nC3wsoŘWyz곮oN-Vf hA!N@Yz#Gt5d+35ż>ĕ^j2ԊEo;/ol[b}R4޿:�u[^gWŵ^�`_إ#>?.MZ �`; B %L.Gs-Xt& �jj1P@ yw$윗3}��(�Bc�@bѿٻ9&[�(]֫ܶK=C 1ط �8҇?|sk�RM >vJӵ 0գgWzXwغlZZ4 -ns:;誖N� �4o+�J9h#̳0�z?NRM@n|.chۄ.fˋ{3�`^iB$f]zߺk�e>J9F�RQ:�܉˕M@2L�i2�Y d~=,4�h7> g6FOm4#<;$L o3t"L!eHlWV?J;WU|f)IK�W CΘRMFu,1>D#tܴq1ɏO?}M 3j{k[{zuk �Nt%H �۴Η {%fx�)y"�/t^0BHe6jt\SN%f'>2J۵ZK\Lm7oF"V_zY^RDKi,%� 7%U罛c@s}MеH",\)�0ҏ=(�؆ffYڀR�2$,/Vz '%OQN?�'(iWuϚ0ȵǻ&&.](\ǟqR) ۱˷VM;aoxе,|^pPD=KJ8CQ?g(hlBvS:,1m{|.J.ԫv!\jʔ: 7L�4W}l�^~?Fg�Wq)M.{~<K"h|���oAoE{̐KGmlecv˧S__=A_8et':Prԓ ?I��E)'�zɮ\jvZD>KH�`*!:`o:|\Z�j3J(Ɂ)M`�2Д,`$h� L~TL#kF6"; G$B8 4BUJ � � ΊeVSAiw^8,.35�'!]PJI/.Iu.x:o:lJ3Dk=츏k 7#feU)B5J\AsQf*�*!mXt�38[zˋT$GE0dzziMq]ŵ !Jɚ՗�vM4jin}Yl{-k|M� 3)�65Fݸ/LSRCR9:ȥVG�z32`+*?;U԰Ċi`٧듢9okef8̮kۑĢ>ygXYuŧBSI9R<ޓ]ZO<.�|>fH l1�eۅB0Ze,/el�>]3?{Vյk�D4 �$?ߊ/. s\n0OB"J2Ì[~#�P▋VmFB_l �/7ۿm )� y,l!�:~8%%04kLc|o 9aϨ ɯG3$dI{n}73hfY"ƓtJ7KK>M�:Mk:J稑 ֿĕt{j� �=2wu%Hq8EUDĤT hQ+ƷmrҫZFBM�㜚zIfqm!,O ֣tR?w-I+ҙƋ<Mc5-S:&H>jv2�Qw?r¤gO_mg HqʸwNٴsFi4VG]շfcX('i@#̨8t>9m'w9s̪y.bBvcVrYʦ?8tyK=籖9nfdhd铯ݬοm٨zS E]ش“g-]rp pyRm!B+' l~tmh�o ?!ԉzVRH֭=w10,':i0��'uZ+OBj+я.EzٶNluۥНRpыTn%U`PچNTFT3}{]yL5>{3]^j_?/;5Ԫ,UD͚keνz]qέ~]rmnOCNMjRBv!;Mݶy[^BQtn]9XŅLZ5'{ݾW�h.;zI{ѵWKks:ԛGi-v.`RIqZ07g %d^VGv4>�K| MT(=3`;XHn|J|Pn<x's<X_:Z~_NsĉN(~FBH-DO^EtЦr'HHZX3K:"I)J yI9,Y砤)\-ccMΜ"bt"h4 Bwݦ  &_kE|noT@$~ [Lvm I)IETJ4K**�)J |IC&<-,0LIsbK&V_m'04tMTK~1HfXk׽V<e\"$!.Y²OPE(jJnoBwD>%H) VpTJįqP%117VtNq335))`c+o��Rr5}\}#AeS>SUV�7aYǝa'KK ҘU%Gy=K,\)Ťr<;+dk3J.Bng]yg@?WqA!T MJ.Z/n,][B K*[�W.sydcݎk:8Wj0Ċ8m9hYػv;InĖGv}r| 6Vm6aϻ WU^%gw+eB r" [AGYM=sV�oN bB%FgyUka )ߓy,jJX<Wb|׳rʥ }'[ꔥ]!~Sy8B!E\ iգɟPeڈWlH:a0eYaZԘ d',z˫t6TLۅ b_uSṡ|G{lz7_x"`tЭccBJQٷ@!܂!B!knA@ B!B!8B!B!BBDh SXy#UH)'żcؘd1/'=&)</ B!U4%xGſb 3<z(҃\*#GJ*߼u 6Ge.BO1XA;bGmr,/{ٱYܼ>dQ[[o:^SZ= =‘B<[9. q@!*_N@sZ8iĒ<M+.z;y8Ϣ%~O:~"L5ߒ-4HF!PJ)w7p<tvA"w`m?:qt:L%\9ka[!D8B�H(!7TyR,q+HJ.~wV45m@_Nq/Zy4_(G\NKa~udeH:xB?yc Rޟ:{5X8/�Pdͫn=#z ?=;|Mlٽ^Mt� >4WWOX;iΤ)ʯ)eZv1?=]17*nn`*9"aj&HвRq(i .Xר2J50M$݋4/[Y)ӓrh)Lmug5uB!WTꬫvZ�E))_8TS�-}JQ8;|-1`Ί!o?C�fN߿ղgI}-f>Xd&LjJXZdQEфB7g?񊹾ue}cc=p�@^G saOqC�r_@|ı[yw�^sc?<~˴5<{@E|qzrQ/34j;uru;/x]8F 8MI?1${wi OO�aæ79⾙4�R_>uk9[Os:ܜEA-3svPp&T_>zIru 9aTt}()ɊɡipwUn#%xYIZRvvw͏-C9_&#&dB!|eE3?ݴ扥e?j7eDN~l:^fo2֐<m{@I81옋D]=9Kmj0bzZ�ԕţ^괫-!2&sIS"|R$[l)AЧ.U8x/_dl3wjY/t׶>�(lM|tP%E䗇D<DW7ڻ�/Ev8ARdJ*Nz?v _?fYsvJO!'.z;S[G6$WJ*5SJbG J֝^?9U&|=zEׇ  ^~  NEOz�{Em=pw!B!T:f鱛�ZՐ]HI&5Iqʪm*E9bI{Ș�T;lMID�iQ_\ &�HQn ׾Q.4BͨFm|<�8C ,eKٺ F5�Z]$|!s>�t�[0lO-=&�40�ryO �F4��h־�P8Шޢڭfj7��V� =]4,,�<m@˲sk�u0O \I>72�I.=J~uv=} �F~Ղ^۫GW6A  /lu>=;tzyϿ8B!7uڸ=sM=;j�qٳ+ YN'7-ζ,E9bg�* &ut�`Izjd+W8tuiZl1?gR 4qhH}-x3UG$5kb [J̟!��T6RXl4 _b~5zJD۳F禝۰7p A^p J ܰa-e ;}}P&]POSȋt(�~ah8 *P5[sogA) Uiu@-߰|e)6bA!B+:`o:|,%W�.E9tA-Z@x|=z²]OOZsnC9�tь? f7=iZ5ו7:MP:^X5 "XӨŦe)qk_��JH�$ FllHV~Nw؏Ylb͘ϟ�05݅$̔M(D(3sVN}v3>3vo*8u$# B!PY}E<^EIrc=ک4J]q ,ѭ[zvz\~~$7ZH:@ho !4ݾZF9ܻ|MOLM95^>|'۶3qCX&}υ�Eۺ%g{9aK >tG=̊W�\aMS�Qe2Yz7'�e-9YZ:{=_GJiB�бvoZC"gRԕ_yZ!B!`TJ ]%jvausx G`)-}F m1Ȗ� VtFGFM]�4^pT$Ra׍vi<lܼzM !:@f ssDgejLZ 6!PUQ)[b"]ك/`!Eg?$ʞ ��]Qo==2ۺK+% 7F `/HX~acCŝt-u'3� hǃu}=C7iYwE%e쪜̓tfQ#U`PچNTFT3 /~G6!B!B@DyUDm*oIA#UH!ֱ0.yN\*-rAh_qX}g]dK7=W2;%+fU2!p_@!T)nܾ۴3�$t-UTJt $I�80;#>KbbnS0[MRd娔_Ij1 ԘlUTJ -t( ޏd1XHqV +[׀>OahN6]];DNx)Jpzlȶf>AozY!x;"lnsm B!Ti~ Ԯ3w/}e?WqA!T543lbtu+- { ̓jY5GmutUk Xղ͘#gw,f];skMnk8B!U82t uuo;#B02i*<Tš8b3ZUeӥj½!�e }B!/7nB-8B!BNv %B!B!B"F!B!B!T!p!BogP Pe,G|_!T!Be%zvϹ_Qu[OWɼڷr߶uku-B<[9. _%^<m~ZMҹjv*E**? &VSB;F!*+q N#eTL['=UG[!!EBq\"u߱Ώ6ӔHa}U y\]c<bA|J_v!z B!%IK047I1?-05}.Y`^NjԈ^4=,豊'tM 4KLg]:iuK&L91HZEy=/#YkE'J\I"=Zdx*G!T:rs%jN9mu)ĂD=6!gqS.}=_ k)�_n﹛B'sc$اG~K ; �?=;|Mlٽ^Mt/|/� } �Hy|izsƟ<x vv;S;Ѷg �RPA!п'B!T&m:`OJf3[6]Qf~ ^NlS_ƹELҨ  �|߉71?=9�3}NxNݦ:YN��%}04a& tg?4�3^N6-5aDQԤ�}<z$]G-Aw};;*Iu[|qw̭W / 5]Ӝ-9z_n΢} u~KT.M7'4iEIKVlNMNþKt"[!JGn$mF?xu<<ٺrSx֫!ʤUw �^v0@ A[mAשMguޝұ1̋s^‡4 r_@|ı[ywQ?>}+mᣗo~}iw�/͹۱?eښs|OB=bր!�x쭇uǷSTOB F!PEm\5KۤaN2s ;Nߠp AS~/%3<yoܵw^�@IIn,]8��f91)J^Թm5Mz�@n{>řEOyt�˻{k̹(>�Oz�{;H*J!6/3儗5 5@tt#z g+E2/8mK˳:;؆= 9#A0=<D\=<_Wy+'B!�x+7jY6lQS_I~f w~Ǜ*zeE(M G5jRdrti,d;O?aw?sWE; x~Kgym*Ozԫw~ &qmϲE\]z�PM^K<vOK`Ƴ}?@!P% hBl8 �F6A4CzjM� �4o+�d˘./ �{;�d<f?�XfU |/ބ3Qæ�`Zϝ��B݃Jc �,;Gl]yzN-zrY!E�1lstiWeٹ5Tf:'HI�`Tד�0f�z ZI)|4Wm^=y!�L@@HZҲ hE#.8Dn|.c]8EѸY2L�i2�y"v·Q�T�wr*ȟp9ILÂIvC:/0MGf3}j1рF;³G"t6CZ:8сBU !*+۟hl*{Onڹ { t% +/ߘ3S"ڞ%t�fJX۬ Qä({7 ˖R :SvQ3�rÆM?:Зu@-߰|e*+Ji؄)Q{ʤki yєN~|ٍ5 ]>R^OB;ʯ?WrۥgitvEfy=с�T^#kpgA�oe�B M]k`t_j]G{�B* BFll t � UBڰ� gpuޛ(~J sgQC,�@N`jԤgSsYCÉq1{F;q׌obGZ)M�5u @f[Yj@lpVi}z"RyʑojRH*RT;u(7 K&Ak4,%.[b!?emO7# �d>�F#TZntjBU CBJ5rxῑ+}�"smqܺ6󚳾<T}�is$�t(�0M7~S۳y�P}O{z B\Fj)?K"K3i� jw㣰>R!Tnv9 m)ĤT 兩8^+هo\d۶}&n˓*ʯazNc]6iS:x{ fx<EztBU1x4B!.��hvEl.W/WuGdEîͿt}WޏTˮN|}��@}onvdG66dP 5mLeDe{? �ÎÃ�M;k[fNfŊ꣮BHuJZKN \MX{p'k�<1Ϧl1B=3aVwRƬVܫ!h'TɸY^/`!Eg?ؕCUҪ9]�@v)9t嫠ѵWKk"PDDyUDm0!P%qn�[?HrTIL`d\~DJ.D'_.6cgZEߘ-t(|u%͉/e8X)GQzHI:=0ޏd1RɥgR(xKz"awkU󲔣VkR$%ZXjqH h3$&: P.?35))`c#)% GxMW,H<BUۏvx4B!/ZEOۺ]eff&'ݬ]TN/R_ɠo_R;E[#>jNz"R*yYQo5N)C0,m~KU8nD1u tȯgb^^΄iAl2CHgBj hBU]4I Be2h>9pdh>ͣy 1 !T54B!.dBedaV3r(!8<!B!B!P hB!B!B&)Q8IapB!T5I)'<o? *dFKIW/cBqjj,1BJ\1k~Rg_-woД %yOiublBS1sc69Dվ帕-[5nHqj-FOT1(ɳ^+ )= =Gg?_fmGqwVl\O1_VS?[mUWU>UOAθ\aĹ**_E&n-4bW^ġEQ._0RyB Q5A(绛yM8:Z 1~u#^u , Mzg!sWP8=h:& xt]Rpt4YلːbFG? 9]1o?<al*\]zh3}F SԧJ)8+ZKJOP*22^_q._|L9?*_ !&�&QBBbĂD=vb~zRXb795S{,n W?$^6J0…u '݋4$;Ǭk֯SsI)9ʡm4]GmU9&v+N>0zv=>?}1kjP0ם2ʯwn&><񗹳v )?Bz|ppK'Iqװ< �ĸBJ} USAuyiR�H.vKt^D{(IZR n3kx#룰|"Jn|r$j퇊e%(+ 'w[^ "jW cΝ;cv^?B۠-{oG uܻnX>ΈA�ugI$+k|}5i%sL�|<okS">7�l?jͦ1G!*%d2ijׯ8 Ou]/6%cI>~㟞 �ŒM k nQs}35i�86|tMs u9� [g >SZOM|j_d48*K.EyǣJu|:޷6l>5I׫LﵡQҜ4Ԋ+4svMF&LziR` Ū]U/vhWF?輣Q??T=-|pxłӤI`S&uBSw7o@@[}^8{ &+WJO6)Nk<:�_ݜLk%Qx[P \__2wo"9I#3}NxNݦ:YN�@u[ŁN.ؓ3 }Mی~,xxuQTNS'7`UEqP:nETDi OJo<b Y-GvإMf}}dEqu�+FNNlC߳,_ Rmy{Z6uskQS �b;EJ?){/rUgB!{oޤpT/&cqSK[(8ۍ7|؛ #d˻{k̹(>�VOom @o?\)`׼'Omd*ɋQד2(y4ddž[w-hcpgp~]x,�/.'*r%n/{tĂ'BC/3s!"mQK?TI ¬G@XJN"0%"%S9.qKU?BJy+WhY6lQS_;5'7~m•a+ SxЈMk~lg@~?x󙵤?]W^I*VHD.)&jP(/rȁ-ܶ$y<ۡmOÐ91G"7#Eɋ:]_�D}}kȷIAÜ�xAEr>RE+75R$?ΊQ4*|ܔqYI9(]CZÞ?!&jݦע.O76W۽YDp75u C#s=ubPy)sR/}5jŢXMR�h,5J�rRBxKz�a8|akGJ\E^9B!T9֪dhToѼYM=J|SŽY�=�Opf~CYf-έtB~jJ[Đd�$>)�08NrQ ܼ6Ezto騫«Gn Xw8l; b^&~%nV0VudgsHߟaFyo޽{]dͻwo}KmDUR?VwQ:xYRx$)~in�:bWZc?}rKWԯ*rQx��z�&L�@A#츝g5�l߰0Uoy` A4I{^(/?%㯒.M QTOWd�@g[.!Rh[vj�jw/;n�#ns#p|G\ `my7q?y I' 7%UAIY9<&IOB!пK%٪M;ao[gt% +`Fѫ*E� 6L0B_eҵ 4hJ�qS54T�Pջ?SvcoK-t{ 9o*Jr̖0c&>R5l#8wjzo\�~ TY/?/# #F]d']rDuRv݆cuڌ4/oy34ْDzط氍WDݖT~UI~8՞æ��&@qY aVyꜭF~hlRߎZ8ˍ(>rqS.rճ'�2WeX(Z#qSz<uٶCp|G\ax2i4  �,>o MB'̘>`j��F$x'@ 9�E�@@"I?2!T$Ti j66S *uD8~}I_;V�ܿ>��03o0(*m~?Jyh=#;1MlȯIyO?=PQ2Pt:u$ؾ:v楲0¬\]婸#JJڀ-t�|w4yӖz7zzR}{JEUE"m,) @\UJSx@ sgQC,ټAk{/>˧<(nYt*唣a@U(4Cs[wGjwEoO8CGn5\]kv,{D�%xߺc?�2Ì[~#�P▋VmF�Aj |�o&r< EOfC! jz41)&?Pv 3[sF_5j?eV?ϸB�> kr�@,Z0Z#kS列�%#TuT%^w4!�X7DIV/\x>&؛bq�K}nBfEJ]7>vpU'v1Ԫ;d@_Cu.KB̨z6oУAC7w{rl_sg[0J<Ѫuʐ루_U?+&z 8c@,Xr*QRx@]yYFx �{`~J~Oy(nYp(3.+(GQ=KWEg�m|iRd]eV!vq(F*/?ӡ{Csk3fv`n,Iz۵qnE+[h Λ'Ֆw֢}O""v:NRPQIt0L5i]?5!ˬVܫ!h'ܪ@}onvdG66dk ])^ /OWo2[w20��y<hY]ܷ3$zz]T:\Ʈ<ZJn%Mժ/Ԩ3myLeۏpgBQ.OȘܴurD|~ӫ^rmnOC6NS7?j9QҸrl)ˆ*1MSy)Y疷U_eXkocA|Gq*VT~�vpvG D{CZKN \MX{p!]}CpɊ$܇]Y\["O )[0gEgL4E)EMAaPo*.CEˊQTOaܻ%uvqIQ /<rO%}`--Yty.=.У]q|G_^<yѥC_iIA#J"IєdIKLkT/L&~D yI9,YHISSZƚt!*ɍw6p~ݚO(IB\6kR*htɱ߲(MG[Wu~D%9."Y3l9*_j>;m%ߨ~M-Jqt Rыj"^tLVsbC5 |sӐ _?B<6yvNJ@-~^dאB}ھ)d/Wɑ%kVܯQoKR#b\TK}< J_~Eab_ />W:ީ7U\4>m_EqP*"w\V?+'F't\lLTJobArc '*n<BvE񑳻XjV]<mžw/^R민P *eVWFo/8(3f; Bwt U}\./8#T^dпN]BFlvfXQ5K~]#p4B7pbh1nhry%!0x4B!B4 B!B!B!B!B!*N@#BܐbYYw0c^,RUBR5"2K^#6*::*::Y($ɪgU &FFY۱+GZ PRAEBټs#nxk⏈s4B!Gc69ǯhϘW۪fTMվ帕-[5n^)Z^ Пqɥn[8¶-ϳKS87qtyBW/6cvV~LQڎZ\/̀BU[I<+K ڎ-Gao'<M3Q':U>FaQUrCT%8F!P9Hy߄#+gCM?ሲHa}9~u#^u[iyBR$aX`uKIn-AnRָ@';vf4!KYQ>[Ƴ FY.w(p!s- vz( w^ Hʑ coW[r9s򡕳p*>?Y B!ʈ% aօUZt!HK]~}w:NEQAk2Z__rKM}f5JahnR{eg5R8{^VzSO_CC8%ӓrh8mBs\Τ7� ,.gqS$lC-9?d ʑ y|fB;NX!ǖ;HIt꯬H1?5ChljDW->rS%SQԥ( ʗ&Hв**w*v,AxaJ=^SLKiw2] �lS'Wpt>t-E}?=;|Mlٽ^Mt=wSdnLvo)Rac69ti+ejW}v6l;5#Rr)g}Z1i֧qP#YIN,/1cfQ2uPE hBU ՗Oϻ{ 1oxcz}ӓseh |회LҒ?~ zG)-._/S7F_ߜФŒM k nQs}35i/&X=\gUT_=)I<ϐltJ_bsrhr]zwvY~!L鷿,^SiǷN.<QrG%.uZogw']܇BH9 k5o![[5قxi,( Нzxr@߳^ Q&[m�'!#|^{\fB_I9rQҬCf@wCs;()_x|kʍES,>Ƣ?A7g9ZI1heyf3�yK˛nv7(ɦ|.Q_kP+e~ڤ[/<�vyе0(`UR%͚']K^uזn'zϻKv»"Y:6y޾ձrKrs[i`- })>rnZzɠWÛf}Ju{{Ne:;7 S'sq~@YC /r=8B ֝T8%'v{@tpD6ޣ -~~B8'oP8);"EyCl%lCxݽ5\ x{FCNx]vT߬xAE>'r,ozモ9ãAˏÞ)V:1G"7#Eɋ:]_EW\<?G; 狋;!PJZ [Wcq`~R;WYS[G6$WP<~)�=C*LպME]nlr)PM G5jRE|{tgnJʑ+xf=9fƢ??sSRT*SQ@(l@EQ?H<|j#SI^숺 ^fѷԉ~/ue+ٯݎ?ϟlM 3/A\1vǺ9ˮ >XrN|:-nsRWPxP-weၗ6�>˧7ٹ|FtO�XZO3g7.[pK Op6d8;cz7w:/Vz7zVߩQA#6}F5}�HϑJ% Ϭ% b% hBmn^g < �XG[a<F"(fhTo\$�LkGRB݃Jc QQ~y` &q: s۫GW6A  rf<f?�XfU |/*,ZA9�`9b}{vjk3)_ImO@;͵u<*jF%hYvn |7ı%^�l{;O@+J9ֿ<^ݯZн[]y;R›p&pt3�LksO=J.qVT VF�T[8ɥIefn H*X.c<;KĐ@^�*?T,{meYZ|!s>�t�+e2�d0( �6kkΤ@v)x6meÞg4�|)VZ)~in�:bW8\I?h2s|u&.8VF!PYI(Bkl>XmF,qXy i6 /Bе,-BQBme? 7l3c }%y+gʾp ➳tAä({7YI?SvcKnBo_7UE?feArT2ZzB^4?W>~SF~eXEI!JƩR,1.gfʚ?EЩqJꯨ9k˖R ڕB|TOSITRhr㬨|qƯr + вywt\з̶̒1cSx O�R#lCǫejՇ�T7#kpgAU~ޫ2�ITɞzɮ\jvZԯh,%M3-U#oaK{Pu[TYB!ʪ(zMƓJ*MQ04rda,|(E^3K;Ok=츏k 7#xB*oD-+5!j3fw,5 6}T~V^Na@UWI9J)HJQdz9L͚4lj S WTw|'hl�Ȓ\qVT>S]LL٘Ώ+_/М݃--~xFZkz˫9^M2feS ,KMgʬK&Ak4,O\Z=B�¬DZ��L(ʝ{5Z g >궴^ލ^oeU~U^?*#�!BeG'V{WUԕ_yZ(5rxῑbu}Ə{*{3"k39O"sLowQi &�k5�!jHD9fXӔ�bAJWr �RuE!p*U]M&&)ИFۻZ/^=G�O^*8+;d �bAĒ(G֦M9 �DYaKF@I3eCt}W>UȢ]6}q;W9sh �qX1N(=EnnYՇ8^+هo\d۶}&n˓*/za'.],Fך �]1tN_!)ӀFQy!((pQu?rm_sg[0J K~h%ܭ+V$�πF!PY]y~ď[xɶo�y7Voaه{rmnOCNe߈cˏ6lll(HY{#3g�tc ?=N'+pvemR՟U_0QmC'g*#*f#'4.H4S@^߾eda%!w\PRqﶯ'Ei6(ZKN \MX{p'kTiZs^Wu|s+[P7é]54UKgES}YmwhwK7T�,|y<hY]ܷ3$zz]eniɢsq̔Wg)Y?#iu8ѕ{|_W+lxn򖃁.Pۣ`W=VQC��w._(x �pRN_~}k8x's<X_ JQu[Zc&/$R*K-osT6/]{[j㌃[% x*K6 Bܸ}ig�I׭<sA} CCwڰ�ߋ1po{o(hR*hty_*bC5 |s׳N*tzqr,JւZ_.6e)~M!\吢l)S4GT`YW<~)"��'F't\lU,J8U$%ZXjp;%W�$| m PYjR¤y1v.Yn8+{-GRR)_qf˫Y:\!SX[ԙ:MK{ɭ0;#>Kbbn$I8oJɵfJ%\C33Cy;PSJ^Tǯ!CλoS7%QϚ*ɑNʽۏv8BUu<:k##gwMR8:Ӹ>�Hr#4_IKi[Z_!R&BH /7|gs]jtl̄kh/ loBrAۙb-�hS\@aZԘ 2 �TWKnB5.Xs0*`h A/kݏ_nC˰^qsvo<!L!B!/π̈Ǡ BD B!B迆!@!B!B!TШ<yz4XxJxT]MKIsfe}I0աT~$ ;D fh1;q(E{?qqlKKB+/R+y<� h#fVD}!oⲍ ʦ<]V\䑾ZE)joġWX9fxh٨]S)'ls5q7"g ('J,Heڶ|KRuI%"n[~΢gD|3}wH�@y[w}M[=`Q;WYӸJ{׶n} N5ߎ�}pN~,u}޳_w==| Y7Z}fcQ %y:W$|J+~ ߍ:k KwC.3iJzvΫUS 9?_dKwn!^cמ!)bAAVVts+CX B!DV Hc簷wddR/ hu@ŨFaQ*֧%ʉ0gߕ<',MVJ<^E>DDPd E-8T*ÿ}e}RCk釈Lz%JeO/ew oTh;$]{̸ԺO&:�ߘ{ PđoE UW^ fh ϶}9~iF-[6@\9#)/My,)&J𼿒�/.,Ցi3 �_ 㪽:qpfkOd%oY„g&zYWATӟ7,_|/STbLe޲d0{ս-)ۍo{CeX F8;RS+'Y[bBs >}`bCW)P^[iګakB?)V?Z1R1w ~D9_]RZ=gN>r�)v?<$&qؓ;}Lx[(joyšoݎ~Bg�UUTJ簍 93nJ<p} wI�K5mN{oգv9)\o�E֫b6qA$]!XRL߻Y%T:+�$6n:ii4/31ԠeI Aq6n;$ѣeeۑ=ǪCqN?0ߞϾ8="p14\BU_f#RaVafX|V.;#]3Дѓ2҅Rviׯd EzvSF@~FC6ڤIqM��8p8⿂(^$c}OSG79Z*N76 2mZ֨2�R=<=*D[nʫ+RҔ*!Bo׷+zM1͟w2] �lS'-JyxnӭA(Ozx\mxfLZ)S>I|�0I0�Rxܫ+'4g� ӳ÷fKDGEX��m$S [2iy @ڇ:S.㠨]JS\|610Աc+"so^tm Yѳ._܎b>>v]<s߳} }i_TTO zgwZ M@WQQiZש.rY!)zSZ}ݑr=#6a<!4קVU9h3:š�(J/GF #]yM`I9KQE澊zhs,9�TLxn,?U?dzN+=:wVZ@c&G(iWBZ�}q‣z&xcʇ(vh@ekpamf<Y@v|pRbLck)!-novqtoQLO))7۔cJ2Ƶ̬F@覱&I#DL]v7dgw9jxKW'y 7[6>7a_ ;'fYC>> vj$Czu7_kjU[%2J:}=&~>SJYkc,=A~uk8Ь+gw9|`Q.~uIqEg]|nY%Y+ў�˫h2u7~\~l)zNsG_`7z=տi҈rl//2xAO…F!*lۂ֯S[+kw] VS}'8VG/\y42xu2G?_ri)BM�@+57�^sc?<~˴5<{@G4u38q{ޭ]�@Qz_|xfC^%2Azg"h>}[im8(jTt{/N?/&,̍>ܻ?dMW@^G saOqCT5uj˗/]{tYm ]֟Ry0SQnw>R֌jMDb~QIZu- MYΥQQ6^6b{[f-R=noҴfu}CY~=Jꯤ]۶,b��[ҹ]e.v?o#60+ywyoѫۥA ~|q'9u6~7\oagFeGO [Q�@lN^Xwk])Wك,Qk.\5BUjRؼWGwž'k;kj/KEo^C=;E! -gU�?n.6i 4C Q!c55QE}'e{o~=)N[Р̩-+-PE=yjs{�p,gi^M<>Ǹޗ|�K5XQ'&)Q[Χz _3VS^>K}׭~-n  hz+>3^YHۋD R UW,͜;6hSg%]O !5hutü�zߺcƮzFzLCyo-_/eK723_bA! ٦ //bm?/%v=`;g٢lIGn~�p6d8;cz7w:/Vz7>KKhts9u)>4ο(lM|tP%Eg ղh{g_6ϯx,m_=~?{+2,-g2k_<\s+jtE핵T}+N$H5nYVKc=nմW�AЧ.U8x/_dlvT}?񊢨s&xܑ EJ.ȭv͸ȹ׭u 76ʫ"x\Zu7*/Zsۉ24 j|ՀHd ]s…(JWT%ߠ�_]0#{:}w^eK?a.?4TH=v> �,։G<eOMI ?KKDPd'lJ�i1�t"OJ)*_<3ϳU1pG)i^=u8޹`)A4kE/Rr (eFXJ^=G:b5&/#mF4��x>}wœ%/P�l[69=�@˼us�0%$TN �X݇o'?Xc{.n%ѼU G mm˂E�AwXMC z(vbWŊ+TDTT+ł7@ł*;BG}ocmvvIFt|Aox\mUcde0}= \l^W3NcLЕP_[;S&<d'9PtM@ 0Jr�NYaZHo1f}LX*>�P:Tv{Hp� ?U }lDhk" e/\ ��>Y@L/~7mE�H�p7?,/K\6(*:u$�<W1r\f)/)xخ ih$3*�M8f*_)�tVi�9 " %%y~Nv=v[ƶgk)S^'iG�ܿKzuETk%d՛r̘JvG.]ojkKuga_W`y*m Mt%N3f%dk⺧�Η>_l�JciՂΫZ<^ҹlUܹaά]ŎD�0F`$Jz==Μ[zCS-6gHSYi{qqţ~3l◻jVCr|/r0?/-MMىcjً:֏/zҬt34TdBOC0 P~{"ư\.fGVҿ%(L G0'gF: FGdPI D5 %y3fNxaG(˸mOza!ySd FfTCӠ?P[kc"IǫZ@ I �ru".�j2M�� yF&fleLz)g4.�@G464yGITz=LkDXvM\Y/ViW4x��sdJ~}�� �A{�>7>pZt9dL ԓ*.B�qH/l@JĨjQtٟbA \:Gd�Ŝn1ow1 7 ?2|%y\}I�0q٭V X/tеϮ2)I经;=Ty8Ӹ{%璻ٰ/&5�tvom{dž5.],   ~[v;5s ]1tυ׿s1#k찡zSLXRD��(5"Hsb+U �x.>}V�RW`7ݎn0�4ͺi#<i_W2ø7:ОOҮzUt hOȟl9J̟D�~~_ uk ^z@{@ !$��T T Z�|H 9�אW#:ϤE�c_yh*0솒f[KKRFQߣdIa"@s�ȏ�v$2abABIg<4449)nK!4ro�-v0cώGoe7+5 L=WɶKPYDh/8G?B j}$=LA��{u\ .x9 _V!|4! v{qW %q2HMH3O~<Bղg6]�8AFe3ec�-xcm.d56? h_'i�PqV_{ɗbкUw7D\�%>XM �i_{wԿ4\d Zլ+nj<T t}{*�oY ʾ�(syh'�It�'80քaZڵjnתÖ^oV*kWp?_�l Mpڰ*kYv)JMƌ*7-itAhnjFܼbe`Z?bY+~@ 5K�xx[f05ϰR~zwxPX-T='Q5HV5v仠 ˄߿z|S@u>|X1^E o0ydL-#{a5wwlD^џ;|Ќ(4vlSŹ7]~22~zlg#*Iы7i~%~pP>(Y t$ߏ6+ogzRF 0//sSBuMV?ejbާOtQP.$3m vss׭VB} }[LF[Ih*|B_4{NǓ$UNSlWVh!ǧ>[&^nխ4ɮjg}:{#/wsHǎ9kqCKIzjIggZvutѷK[Hsy<ԄNa m}%;fM_)X(k<܆+ś#JfuiY3�Pngvf}K,K>'Dd?Mr{\^2w+2GY3;o%ܾI!)]עPp�{DA]f5ey炈궻nI}u?}sa󏎋ڶ-un^GGk/W͜iZƷ?^@ b'Nm/:;ɺeG+2� 6]|AKVOS=ag۟H4ks/3\qS:u|�=XI᜺{k.osúO!25tCcYAoпiF/n\tъU Mh$�ijZ3F20dS9Baԗ^p;gc0]S(koC`sp]|�7{霎ӆ_f#Sna$K \^]'�2طWϢYZE]�F $\Y\UroffJ=\X5id,#-26VÐW^WIdP5bBC#KߑT4qQ\}m%CXCjHHJ Lu괒yL~0u~}ϣ�sn/{Y=}j}_'"dZVt1|aAjRniKpFPj[uN)bBBﺦ s~Z̥6ԫFow VŰ2I<^:r힫*$}IC.al)7?5O5 Cujc �iV@ zG W44Ey*Kh 32$ cʷ�,>[WͨZgomsŶ$p Ebm= 7ZQ1'1W`lʵK3u|^] BnbzN~%~mhj899y02ТUwE~LBESOߏj'3$|Zgn}:k,?ZahMr,ͪ�<mGvcֶoaH,ےΜoP_hOF ?%Gu^{y1G"?i\2rިOF+$鎵;d'Ja)gT' �Żk)seo4 ̈́ +9_g^{N^2 h@ ~h4Y���IDAT@ @ 8@ @ @ CB.@ @ @ DCPtjZzzF>r"@  G꓋|BQ%%Y9 "i?޿WQepp_'#5&!"ߖȟo$4oƱϿ!^V䕻v~*wI#[RM"̜r]@Nar]Flrȟ:mB4}Ssph\G@ .?s9hu ՆqQ}0J �pQܙ΂nv1 ;ylP]򨣽7fML*4㫋pVݛhTfA'ze&MrzvST2U.?6wfym{`g% 3VGA�oWɝZ?6~Z =.稵_q7ɢʫ0}D'6MQ"(cY|�F]@bguU+ꁏo>Mj@mؗ fZpQsrf+`?W~#poZ6.G8aW.EG[2/O~@ k:}/CX 7dr"@ uD{:(-OR+ճ&8-]llȶs>qSZa71w5KboBg t4îUU7$.].]K_8mޖy՘fQNJU>g<b='T#� JJB#TzYk$WiT)W@r?qZ-չ/zxK\x]o1~g7eE6f*JL `νĽ_3h } Dol+Mv S2M�j݆廑<ɍKN8ewCK"a=Kf>dßme� DSM�VSZ!7IcЦ�ਇaل *i0F �@_ AԵۋ|Rm:cq7N?l?u=&OL9w΅?I)-Z;f19Vpċ"#1Y @ 3�hW.+2�pSC/&IH0�^Ny"[Fsc϶cAN0(#3͋6eS~^W/O~s��˪6ٕ$螟/_M)oq6$^yzJ8ߡ(u4HE :�=:홿nkf{JsZ:95�xw9Ԭo/'7̭ n-C`jInDU>c/,?/d֤!gx~>W*+(*I*hr.|ME_KRO0.meAٛ&CeimE2:Ur{\ [ t_BlPݧX��o;~yx3�ywINIzR wߦrqC3ت>ɈIE릭GtdwAO>q)Ԭ77?<Ї1i<#릳У�GB^g &SFuե�w`./ �誉B>sD6{CҤ HƧHQ<hҢvoT/�|tz)k`|:veM@ �STjaE>r Oϫs1?~4~FYi<C.\4]|ْUS_έZQID/�n^ΕW1;#Mԛa�.v3ɺekɷW^Q7O�.uq3i0Yص8Y4yeˁ^gXh/:M tpU[[M͐^L?t~|Q1�$^%aZD".3ϣ�)î},QTn|HnD>18|��2˓S�$^AaBd < < W>H_)MTL{ r@ MU*6`;Xvcm9Z<v%&V՚wrҍJIzp`zJч<Awp>90!`3 SDZ% `P[9<Njݳ $�pp^),qW�I4�_X~4HE> 1p:|>={CR.xg ހ}�yrv)LɳKy_ES-]ƶn=g4.ǴBᄌެԴyZ?@ "i_A  mԂo.D|S5*5#XFp3$j_-'gDCtNĦ�uCS]emrx+|Ės.oFń>Iȑ82OT� !$!M@ n=$ĢY?GF?*'C\sBc_7�f xaNTڭh<?7p w{n6˶tVpA^7ilœ�� wَX%m3wytĂې1x{t޲7o;נ�Q<>N{cEr]*vF$i^鹭aZfnߘH~?5l9m %g0=LX!Sf}?Sբ[^}F TP`^qK"=즫.{S*2hnR}q Ef�@ Gs_ٹZ�c+9 Jur<h)\9Sɳ �HC[miv)2goq^K7ᶻ=quʫONLfS?t}KXܗUfeF#e^%pI OYyu |ェ\qoU5q+!s[Nc}t@")<up =iPgX|207=hkgW_N..> �4%Fru{uڏ{TnWutyriZ] o0rF)`мVƷ84\\oYg'[IS1v޸mv:hC dNN>"baߟ:`RB㱲~[G1c ^#8|Ѵs�$^+A:A|#LOy/jF}tBe�X8hpS2ޛg^{7L/'Σ]mq7ΕVYNxe(!UұT,saRh6a'Pu;^=ڞ0l<sDfY|'Ptӛ3)l럙h5??TMFP�ؼRB7hz~/3(;�D?2F�.AL@X*&�t zmc8ő�0�'h0,&v-7̙t]=o:@ 9�`1;GHF�2x��cj\W7c+9Yhǖ~jQ^]mW.Uݤ<Sq\YoK ;Ty&ve[y%,XP74`�l٨1�0Ne* Ii�мOG�9\d/{Y:LF~ }KKr$iTz�P 4su�~!SڴSf;R e؋Qvj>64ɬ&/Ƶm�DQڵK0ٵmV]OF ،k -^gc۳S{�E@L/~7mE�H�p7_A1N4# "uGm%ӛQY ]jn�$JCJr�N0-$C3TJ}LXMEtxs/UMq[S}}g20,awe טZ]6M83$6844fb7O|#�`ceCg n!Mf(Jy [<90 �l-]]vF`A�.[~llԕ'g|֪?!D—��} �URQ0WT?KQ+̜͆.#K[9WiW#S:U8ڭ&EŘQ[HFZ#&zuGv ʻ_T�@?Zxf=)&)$*Fފ%$YjfrLwk64atxBƠFձK#g)5*3TĿ7]&*Q@P:fӠ>7>pZt9Ta.�04:pili�c-#r}Wئ޶#:OČ\! )V_�U]m�pD0Ri\"ӵ@"(,?Ty_^8]HYץ7(`@kz+,ȿ*˰S+:糋%)>YBaZlF08z�YabAfD1Uʗ)ÂZuVK/鳨�tÛmꊶ}qa~=-5TsO@ Q ��O02y.;�#<3~Jo ]q6 t ǹ$VJ\ګ*a2wnzu6>KD,&1�FY9pO\3M&ήcMFNh8'}@��( Ek!T  ҥ&v~;{\Tgǣ՚a %.{R$6R <Km�~V~(<3>'dQ+�}ן k�D�hW1h!f<t�^[Ia"@s�ȏ�vվNmTЇ"b/E])]bs*l¢HerN&aXᗗ^9 /|RI\Q@-: Г(K >c.?tFI|rld{ܵؤZ/kI^~${=tq]t2.;H e~}Vr@ ݞ-w>7Rt3$27H��U5j$Ox��nb\A}B=s\<|͘i.%.ye[8.:ݙu d~Wt,f;j{*u>�brE%]fq|IK5Q,ֽEˆX T䱏&0YW}ņ~>*:P]ǻ&aS5-{gζ^hC 8udƍm{#Ÿ(ݢ c'pI$Z?dLmoC{Z'~x6Rr{-$CQ+|Y`Y/s7Kj0kHr׷AU=Psڵϧx쟨kΧ"!� WSo;uS 0zwу T=^{_MT- BYk&ԃj\?)-~@  ubFiߵt 5.9^}{.mٟ]cjnor*_̀ƅBmc$%IWOoĝK-a$]c$^z+[9#7ٹAiukŤ`e#.�humTJoTJo8hB嵭i9@ Arvοzt٢uO3�OK'$;{V\A�dƻ��.f**Գۓ~k$ hvC8~zܒdGIتnU(�ت n9erM hcگql3kk>uUV~蜠<>螁>�mlE`w9/zmm3eIb>m*KiV,H3rc_Mk:Wi2`]ϩ2Ma GZI!j\orZ%ힹdg[řYWYW<8]d0o!G F >a$CFj ?#$\0lW- �^:2�-?<Ac3�pۼd70 #X*Or`,Qq>sDY+}9U|#}[v"c�ҫ0uc�`Vע^AB0٦k/hToZ��M4zq}VZhB#MjJrIP�-ճ}{`DRD.rR2zU 9o&�z}̼#ci �@RR4uTY~r�bM}=__,0C]7 Vi9@ ~^6�mլqyB:[f6qH?rKp,@D"0UɯRuiG8VhHZ*Z|ctgk'?ﮣN~['8$R-VW80'3 4].6MM I8!ÜZ<yz{:ݟmm* \"FTiWػ)B/;Ӄ_y�!>mzGBIUg*|VP+(O-kir]@dg*z.\F1,>[W͐1 j >XՍ_��@TI0m o~E̛ TꔀNwAKπ%)e]~{[ Ѡ(H@# XYSˇ=p_WxMճ^m +=]?#i[8+W&6e k!xZ14;륇~%?D"M@Ss=]x5-WԞCӀI @ƍ-KӞ&E M*o*~+)|yke76U8v0Nf}u>'h@_f@#@  h @ @ @ F @ @ DP4!LMKK_'EV,ZbN~Ū@Ԏ:) /-=|IqVfFƂy"OIJL̬o%oYυI_}[@9@&ƾz'eh[ghߌc˗H%윴<?xY!W%'=~nI%/|sHN*ޡī;=>\aߌu}:w'z6b$5:.sQ\>N:<D&H9qqQDE3 >~,V5@?6PSJTS־va�(kLgAcs[HN/g %5}?OӭO5V9q�x:tnZ++QAmt({�0 c(޽Ǐ �m!,[;Nhgb:aZ֊޽3]TNy)lNZۅ@ [?;RE]�4m7~=:adnj!gRu:Hs:]5OjQ\ ��|}9mVjܻSC7ػB�pQ[M~s$fwߌTkEʅk'UjgsHc\mE=YP)fm̬8a,XI#bҚӣU2I|Ю} -s-(XC/<vcy*oO>{z`e"�2zstY~jMQ9q)qÎ>\zE.~{v?jY{:(-B `8tI\TaGivsg*7PYkpqPJ:vҌ%%}R(2\3o@%߅sMkYVN<ʤ֒_޴)nKjD~伦&[QDÁ :DO 4UI\^Y Z\Å>zqc-UhZAxҠOo�l+Mv =פp,I^ <ͩsW@-i:�Pk ?{]ɓڸtSfjU2onK__&rK ~lcrCS:4¸JٷArSnZ^1y*owmvey؄o_f@ `z>M4uT� �y)h�M}5e¼F9QOڍؔ"FmhSI�Q`tfca=C߿􃄩kߣɷn/r\>4j=v�m*{V:%gl?<3\fM $5D}(?l=)aX6ag<'iZ:rQ*гnMݶA?Gk�{sSgٳh+?ݽsOR qc{K]u+8EFDv4Vxzs�ʥwS&4xgMeʑ׮~"?(D4{9�ࢬCGs7[7~ʌSrU 2Ž?ӼhSW6o��`Yu=Ҧ<wyq)NBSaNKa^VV!$=9MY߰ej?-0m:07CE\COS|aIan UMY7\hhjW 77PfyMD{We]vSBII~>bK3%,e2@174ly:˔OjϝT wğ�i=m�p=ǭ{^N74Q<ndO1[:vXP+q&(OjT\)td[S}j衺OC?@4gaTa-2-U(Ë$M[;"cyq<eq~bEK܄/YɳwqA" PB%T #p㗘7w7t4*�<=}m*74;:UR]^޽PKzs;| }3n:k\=* �zt/e|n2eTW]* �{�x.3Ghhs�(Jw0$c@'jO>7RyФEs`㠋N?nҋ7��i`i*'(zj$,~ʣ7Iy m.2_37f4iX \˳WAHLkݟlژ";?FeQ>< ptagK0�M�__O}x+j&*2׌Wz$ĀI�.v3ɺekɷW^Q7O�%OΗs}T61Q'.ܔa>Xjg*JR^g7;0Tvy^B·ߊ\>N̜?\ q#3Dɻzz&_Ϛ:]ۅ]2n&M@&> 6~=&O<zM4^:us;@Kn&pҙ!lrmyxQ�0UɶcVƫ7Q9!+1�y'28GB5=i>�pS/]e8m#y8%/;Fvirt{@NmT>^�9<;@"'HI ?~ɳK^|%NqS^]DV;4xg&7;O>⎏�ٯNOq9G祒,ۤG#@#Su[W{fdp4zܹuܔNA&o,ѵ% YV$A~ ?3/k63ޞ[I> }tswS9.�͒n}iL WI {;65ZuvK4eK.uxKAyMȣ]ZqԨI �?3 8V]`$%hc6ёf6 {:^J$L>-'|{Im+XN^g((|f~BNqAq!/!,c7,/o $ e>́h -3,v/}5 {K_w8Y5%? +Řsڕ7kO,\p9 f䄦՜K6ݽzF^XiミЛS���)O @Iϴ1M^HKR_yjh].6� .I;i,귘W+i[,X0ԩ-\\x!⑚4]ͅoFPfDȢ9n\ 뷱"SO�xR.nv9^_x>T"qHP7W#bB$?Hx'*א& }qbѬ(ѹQ0IШ!܆YMn繐3~'Ou>OSacLC]{eK{*OcBڇT?9~TY.]7-%^y0z/mcY$9D ��&-s>>e] SoqͿx���.m М>K !6DaZz@DX jN{Ky).rnJv}g|3"IJm]ļFj5s�c3!ceWowwsK}s7|)Ӹ[ދtե 1aoj51:g-ops/VI@!SKk$XB3hĞ_{&, FGAYjQ-W/ SAy-lfK_I؄6zܦo{Qᒮ A*2@QzxΌZS02m#y㧂8U9Dj�_8zu="�7#@�}T+ǃ^ϕW; 3˴o_ HUO:=rkV#�P2YuAw3�;@(tw#p}GAnL"$<+ti#.IrjՃШ"i#5Hk DGxv1,)9�J θ3EQF[v~?'e}m 35t{{%e{wZFΊ4vm! }:%v�ʺ?W^S9uv̔v:E+_hTn$9إ }Xyí\/O~*HDهKΝYz)?(Ky:VY|y9�$e;|ϱH٠]f<e6$ `qèm۶9)4n֜j8B@(,\\!Ɠ֯Ѹ7AcqϞE @f~:=}6vVNL闕|q˜νuX80`;�hce>csi8�M:޴[ѡ]Y.;@�yb1?#!'><5{΂i}2QA,s7XSgL<=G*q_i="b�2H\Wz}F^\20�<q =d "7ϼ83n:-o_NGlnsifƳ \y:{<]:6S{n\{;lWBV�`Ҭέ>;pQ ntbóْХ%kGVg;/(t 岱 lc¢dyML+>�`yMZiؾfUdԝ©}TAǨe?Nv+d>__io,Pr+[o}Ɉ#2s �סAKJJ02ծྣ'ٕ{vr[u�MZ �"I:4�tu{TH*, a ,HN�|��nІ^f^aQv�$L%@3e J'˃76�X5Wt!dzvedp}-Ӌ#/|�a&�<N `XL[n3|c]{l2J9�`1*ԺLh�-EV@"<nW59UM^;z?~&GrXS0k&@'?Q9;��Xl_ WuAJ|ijֽڱj##~UeW\g)NQty|2rI,� ty&}үg¼W3(�1Ìo<ͅV w!7��af@B'o,�m'-ENf�j~eGQzI�6rFS�(J9cl�$*ɍnWp1gNדtid�i1*5c`a6ms嵐�~*0lV:4�5 '�<M:+ ˔�@H򤇓ۨU<ö;q�p-р@gd[נi$!�"y>|萨vUGjJIk>a�ש �K&@QZ5�f޻ȰMOXwP|m]"�E@L/~7mE�H�p7/M@*�vJ*.Z_߻$alF"fֲFQ۷jWVq-acll{vjﱶ=k?(ƉcIW_ˋ[~jT�h?nBEz>0�I?/.:´ bP}* �zO2aaiZR,]TDa�4-%k7c;b}(PX5)fI/06T�hƁG6XTy*�tVi�9 " %%2/M@˴Wf+O*D*/X<Uy?_tv^cju4@.>[n=s읾��?-"@'0>n7 BͲQ �}_eiXU13^~$y1��*6y?8l,�tK750+ :�uv80gc<9VMs] _�JsE� +.O`jkl4臍@ :䍟Gx �/&/Mq$YZh6dtw}WvUkfW ?~љa"ŭHdfS_o]+VSp?BL<%1BB�GaZU`2_^�wQٯzٷnߔ}^:TX}Ʋ/+djDE{%5UxYC}/Hm7d!WeBD"1 `JGYS_|� ֯Rخ�[mjUbu4yTzXi1?bNట_Sgd zw5'e֯Ÿ�e2=ƒ%>Q5GT~sĂTک\�`h thAcu:J6hQݪۙ㭯]t`VԳ.R^1xeύc}>~dUPz �dZĸB m621c+WKHJp�UT�U]m�pD�@M-[5mH֏ȕPP9sÖHA+d%S".��2g~G6Y�`LJ<~"ތ7[yp�߅{]z_t8>ֿ *v�J 0.�hk�7´ٌa2pP_F*}ek�E~YMjv12Ă͚Rc /SM-1+J/鳨�tÛmꊶ}qa~=-5T/ $��<!�$*K-ɓOd) |ևdr3o<䍫��1޸ S~]X)E'Y ܨ3y�$;KQ}RSA HԹ_SV}қZ+0R%SZXHH= MI�TfJ$B6z;.(c~M^yE"^X?nk<H27¨\l'}n-?WNj̓F@>,Ne<~{�dqc�OYԆ< ެ �4ðJ]./`R$6R|BT '3iTurDV4'.<}̅ {jP1L,HI~39-v0cώGoeWSPYDh/8S <L Y �>o҇E"�Ei4UyF�t3:k@As�ixhK`dzYm,tʇ٦}gݾu¼y龫n- \׃͸C79)nK!41eח~^<>k܈_ev]~xjzJ$]G`rQˍ9\ki$D1.m>{O,y/M°//xpxZt٧E�8x>4Eq �O/?Y$?{,'jv1Xe~v!go}Udʡ(izk9u|1.L_~$u !7+HjU<]W6�ݞܝ].gɽl׮~� i|Nyd@}?k䍫oE|1^e}y侹xWٿZ%W6uJS'ř>If: �nZVq}e- }��aa0S5:o_ j'xEgڗǟ�/:f>z-�mpX �B*j*&G��FM;٪trQ7L2o<̪jh+eFKO U-[Ÿ!/`7�@ċpKC'|�`O�@|GmؼNFq`n<�T%KfjQN^{}רcK$y4ltQu0W 8fqHD`)z.? _,wg-{݋?NH~,<=֓ 2Wyt}X Ua_cnG y>j:�=a3.Ϗ·+ɠp�>J5Aa<'S.Hz@m[Uƞ}jTg%)U!k7 ěfUßlD%Ic9z#7mÑk4oep|rl?wD Q~}ƂQw-fӥg7w� M,\,ę6& HRRt z9RUZsMn0RK|-g@s>E/uY5C実US=Š%ϧ ꯠ݉;[;HJI|!UW|rFnޓs+ L0׊I@˲GN] =�4єTװ>7Ef P'(-k_e/DY8r��^rĸ ,귟6 j[q(NZ]=Rн.*67AsXmo _mb.([2e@ :'vr䌙(>To;O4֩jatr)#Bc'jnfC�ohޚ7} 5HG@=�/EvMwFT1R>�@iekr m#k_TԲO ] *iG,Xgv@ SJ:uD,%wG+bPG\ˡoSv<lTˣNjڌ'LZln}4Pd40jz*5է$&n]SW(OBH+vX<s ;Auh ')I)j&-{F >a$CFj ?#$\0lW- �^:2E�pۼd70 #X*Or`,Sq>sDY+}9Z|#}[v"c�ҫ@0uc�`Vע^AB0٦k/h L^nbȨ9߯Ty ~ȩυ})ݥƩh#QڨRv|]|Hv=OmF˳Wf}{7� p>]F,YT=S*KpD=(+%djj }0ۄUQZ\�8_w|́3R2zkq�#UוWEz֜_v QTs*˯RaavzXS_O? 38P@q4uv�ڭO+\Ivl 'Dj=7D 8o�ӸP2*ĵjS"`Inׂv)NG=ƩI)bX[W~oha Ṳ/~G\wJ0 l+|LZ+zv IqT ]9k*G8-%o C"`d2I>D4XLP kLeG8ԧBC(QkwdJmb1�"Zq[~d'XT?^xSΏ6鑘FNL,51`o-LHа:L" ǰ9B7k+\ 8Yy4M}%2BIUg*.''O�FZL'IhV2 1geu<Rg|N9~56>`}Uc6x0 酪Z:営P` TvtrXvtl 8o23PitMp:Mޙ+-=dR-vmgm�_Y_-~)1G- PcH Jn'vFm @ IJaOW~eKS4�@m=1=Mf ~+O+hd@#q=?#q hb<kKJ xh*JL%QރmeE+=ݿ5Eq#Do3rR臍@ |&h�H3"Óp}[ d.(SГ:=S0FV4͚jg b_~-o0kQoKtf<Y9ꪴ~4@ W@ @:=E @ @ D@ @ h(%QavW\La_Gٿc):@ @ _7.Bڋ;}XjN@ @ [?;\@ oAg!Sh8Y�nJufL�t):@ hPp@D 7 P� DSM��Sݲϸ��Aθ1KW܏u&۲hw΅?I)-Z;J.Q`tfca=� '*IV=?_Rߨ_fO2�\uh0ccSt@ @ }Z̏;ͽߨQl%Ð MvdBɶcVƫ7Q9!+1^Sw3 m4N|&�zkp`h_xrb$/Oï'>O5W~Gm9QP fO�Ka׮7u=@ @ @4(Z`_<y`OL8vَ8%8a[O}PHB7 Fy߽T7gKpQuO>jQv# rHCg|}Lt)6?zxN �ĞzaٽйG @ @  hU=Oo*bg<04Z m�:�$ν%baq⅋,v�xE"I:4�i �Djr: �&aR�nh�8=a:5aR#@ @ ? . _yuiwo;cj- ?4� �f�k`ܢk5�St}� D521S{0-fSӄ@ @ @  M&<qbKovQcM-1,-I/鳨%y�RCw}�(L �ZeT`ܼ!L]Tx@ @ hh4VS"tr>2?(JsZ^xwNv>my<_`rQˍ9\ki+~>\/0OSM\w`;״@ @ @ S0Jҏj6]4Un=c:Y>k 3{gŤ�=1yX@],4e-h᳚//ɿk״@ @ @ Žz?o$�@"U7[-,N/kP~`]UL255YL tHc[X>q'R۰5ig&$hXZ*Mޮi9@ {X@bU!@wd r@ 7?P~O=KMY2UuT+a$2b' aH Jn*ud[r@ @ @[xҩ\rnCF@ @ ߰@_@ O@XV3@ @ h6m@  �@ @ @  J@#@ @ AKpH }=OӇ1;8׍f[T9w�è{ծ! e =zQ^G9oSx'e J2 IzZdg? =,ĩ&8MhppsWQe՛fkq2R`eaDR|6D,LSjiߪ-(*ގ@Մ]̶ʕk+[ ԒbAR2 )4[&Ǹ:H|݌K>ՋQ~}YLsEڡQ\>N:J!@)Nȁ$L"Ŧȵo~c7v>EUr�eO\4úWuwyLY#`�ࢬ3n]SQ7.]O5wR|y|^__6%?--xFXi)Ht||uy?{ Z5?9=yȩF*Q +T(Ď?6wf OCLT.YG|PqCkD%DG캜Zྡྷ'KnJ7X@�1q{{P+<# >(2/8v?Yc$|NՀ3:}1qMWG} l{(4ۥAG'sʥhhk]sSѩ=qQsrjSV@ DݩQ5:I !^d^}zE3�i�@(cr=;i2}w@ pDB$x4FnOJj'b⬥]tdJ˥]N"{ׯZus9:mvffٌcܥk+r;OPiY/;z x<H�t҃ЈwU|B#1baԀӾLTg#SsuiFfn+/oۘR͏nkAB>NE^M `νĽs}@  D~]g&qٿ/Uʨv.< >}O{$po~Сay!3w<~HqG2D{ <<}廑<e@ԝ:M@ 7"|h괩�@�nGGy]7 B|_}&^D瓺m_Ӌ}1IzPʵ)ȏxƇl:ۨm1Cn>}FǎM%QO ò ;AT<Iat :"(a 1#>+]N%[d-k1G>vL��AAC u8Xy<}dۥ�9~9;`h �yo.~~,{yd'G xQ$ѳ:zu'!ğg>+�X\zW(l1eB#� ;6�2;$ha8*� 2Ž?ӼhSW6`^:{ =vn<h@2!&!Ic!�hg&&1;,Sz!;G~�Ok׭ %4gwO謶g}* 3Ə߽rVW Z:95�xw9Ԭo/J0 9A' %V5OVf+WrJHLMzG"L_zj�~p G2� |UR#Mv>- deV.?(STT~Xpka~a[3Q7=Ti~9#qʍ֍�:~Lfcc]+8 y',LUJE}Q Y):fm\ը~)I(CIe¬77?<Ї1i<#릳У rE٣e|<R[e wߦrqC3تW"U9-�`|~noc zt/NFN*X7m<#'$gNqnBRSņEzʔ@O zM"Mu/r�8K�j⹐Q9K߿@ S?v{Q,4Jч!A..>lɪ{^3vCS_œO$<>h$떭%^yE=V6nL?".3ϣ Sh yv5uՕs}T61Q'.$ׯs%UkΈz&ekߕT3֒|q֮.7yص4?1:ꙊqWw�/=brqԛ/?G]z3-uq3iB0Yص8%ʫk[&ܿtfHy/?cyJ ?@U_j%M@ˌwE^gXh/:M�0K:tPh��Ȭ@<eMΜ3_Z�bA~ܯ8 .ٌдbʫM+?xm8ݖ#EQ%F\ZUkoNɉ{> xK7z+=$*f*E\r Äܯn;,Lǖ bb� ?r:[IW$'u]<!Ő 7`"-&@\> i/�vpYf|PIYT8 *[m-{N=$h\iǁS-k\�Wf E\�pk)rDQ}qYǩi" hh1#mt_=:lcCEgl2 �0^_ \5sxBTxJ|jgF@$!G\½�J*o|gK}Kh7N,Z닷=}ϧ1^|@>76o"nߛ(C ;$QFn2hΆ!!WßmlQ&n�T�HyrnJzM4DgϞDlKcoV޻v;�Yŧ=e�zF4Ңc{=K2Ox'*א&#? >y`_<y���rU6}ǁ&qQuVаsw8{VIZWzn"}0zV7�vU EE^㑁+9z[ltd:bXFm=:o՛k�èsvR 1".Yc5;;0 D@lWؠ[ZKVg&��UٙZY8qW> 쒉<Փa}uSf}?Sբ[^}F b7[~͖?wN@V .no(8=A%.gw� p~9 \sO-�ʬJ|^ L7)+oX:5ϫK]mT ?بbetCnsWi6$oI#^e︿owp5j4=.X^r%%<{g.Z5dc rŽUxǭm;mgw0'_qWL"]$^鰃L}/^�'ӎqӣ/X~__= #7od Phe k|ۊAs Vn`}v4<2WG;Nco\6d;4!&dNNBGtݑ\eF*Ӿx|Iƃܬ" �,OB_4)H3=��)79P]?q#uTiieov({E7jԗA'T8tݖ3nh#*NhWó( f\oaW3R.>4[m"}nM Ҏ)W/pzQcY|'Ptӛ3)l�zʓNW'4֍kVEF)ڍ$[OyN ۗg.۶P>@ Nw&#{x~qc(�X [l^Z?)JIl'Lҡ�Ә7ܣBRa aA�~v�5U*\H㩙/i �Tѓǩ,ERmXo=ee@tYL�`\brӅ8'ON�cC[CfL%@3e J!uGJ3coeG?jzC-m1#lgΤ:w}hF  �՝#Y9^8ő�0�':��Xl_ Wu@^Vr+֧rF?}< rt#"ˍjf޻ȰM5˫'!a1~U+B+`a`3F@ pBp.S)OHJ}u|>�F/…�}Zwo�N;yԆ}dXi$�N�}l5hܷYYM^k��6ǵk`��Jr$܌ZJ@#4v| {wxsgm Ϗ/%�p:$m �BEz>0�I"�Aӡ:zO@~m%1vۓ=K7W@q� H$ Y"sc q-acll{vjﱶ_&bX[Mr- 缈玲�0�ǨKgo֮OsɑCW'fZ+-�j΂ȼB 0d)��P+�u뫒yv.@ u@*n5V׹M 3BE�@,t}� 03ƅ�bl9�d=g ξ4M,٪G#`��8^ �؏ȴZ9]y` }�pL|՗R~ԫf^F}.[~llԕ'g|֪_@—�� �Օź`Al�|11}pnj#ϪM<}8ڭ&EŘQ[HFUE1AÚnA *N� -SkҘk9dk٩hSZ=LaЅ1Qub ,OAbK/4FeTĿ˶uS\,!^T5iB }~˭33H_'gG(of %5�m<LH5]��D��ӱ&ƿlGa=tܹ.43ү :8^YosXE0vrvŞKRU(� s6БxMc#h^ T GFa&z*k.@ԅ:%_8]HYץ7(`@kzl *5=tĻ�m� z@g3C*56ӓ)$�Hyddg" ,^kO�.P@>M԰N�?ZZvK* �8/@<}j*_KFV`XPVjLbKO6uE۾0?d1 $��<!�$*ˤhm1,5m]giIzHE�&o'L(װ*8ۦY~5єa�P8J ΪiJ;]gZ3Ⱦ ^vCܛwPm}[O$"�Q$yoZ4kD uLgʌ&J�hiR/Jh")7[93dr GtI9!Z�@HVP�"@FqQξoE6cLOl}J?<e L շ#`=;=ߠ_ul=`u7K[Ta %.{R$6R:PAOrEO� $��T jm@ Bٮo^O @i.W} ¢H?Sf9\^?}L]G�>&q%nGb#4`CO O7C"s�p. PUFQLj>yFjK|è涒=)D&aXᗗ^9 /|U9y嗻oJJ=bO/%?�$؉+8+p'фUE,jEԧvL+rd$XsiuEG_dU%&>.L_~${=tq] '@ T �>FnI~o:LN%9-^/wm<6VbK/ć�@gv,_+`7cE"\̏8{l;nx˚Zʐk7㢼;p^[O:GYg`;N:ԞڿJ.U&:8|F{atZ`k�িKPn܊EBgS%cQLC'Z;/Vߛ)էQֆ<<}5A=wZQ )JGjxX{ V|l륏F9oATz q҄0P=�k|yaE&}H%$ +s;{Pryi˫NIZ?&וnfLOB޾ �,g*/ qĂFy\,$$חoZ|L8ݢ c'pI$Z?VfS*Fy/;9zg#%W2j*UIFzѳ-U,u�<u<Ԝv)'j׏]u{ЇQw-]CͦKurߞ z[g>ӧݼ-49�Cz:7Kf$ q>C(&]=/COK'h;{V\zCn=njGg0U>a3zۛna$ʗ*f"ܷ>mŶbZ5s!?LTv1z~4:d@-? |-t<}&5/oT [v1Ir?qwvx`IX)#/]%yrd'oY6ȩK2z]E ߃>7Ef$ �;yܼ'g王Wa��rqĸ忾U � =5 h�j3Η_qфӭS.k6${Wn>JVvBV\v.hAýƚV)f}Y09Ay|=}H؊ޏ6r^xfʒ|U҄o#뒅W7jfS{k.N HzWN$3lK[83=QGr"mګnRO@G.h|A!*YY<lę�3} �0髃GmĶ2]Ii1P=ag۟H4ks/<q7$APZsW,n,w<8DU[jYzw{OydE9"efG´iz\0lW- �^:ruog8ږïnny!wLe иVYZr07=e_ĩEG~'YhEz>@4(طWϢH*xE"(J*&Hy6aUT=7�c1s*$qAar:GE@S%dr իrTPfi괋8�Vj701l}jnl՗ DS)՜,~AvGR{X@bUe i>]/bM}=eq NHr˗O8NI]^H-˨8aiEê[.rfU99JuoN~1\э$R-p`Nf&h&E -3k)W8l|nTkQ \*VDK$8qԋኽ.=N �C.|ww?ȅ39*Iw׃B {wd^5Wv"rsD$C}6!D|$fٺlF'q6s,>KS +0햑p?öD�Z`=|U'''O�FZ7 S zZU>5grE/OQ~ʪk`@ T~kF8O&JR2r)@^7 'O-D‘J*b~k<4UArPŲtҦBJchvK~-vו+k_'Pt]8lbϿyC|"[ : |P]F-g@ ?i NtuS~G<+jϡ iD@ ğ iOh?  :OƎ{n;hm=^`76UA ��6p0a}Z $frt啻?gp@0bph) @3'A3@ t4 9@ @ @  J@#@ @ A?XR&di*+名 ~.1L�.F4ϟ;;Tu8)1nhK[O$YXoԍMٔ" J O.^D=}(S"뗕gej ;3GIhTf'N]}6i<izGS@ @   hSg>u".I>kNvxl=v=sZ'i~?<LrTM'{x:X~]Ա-?}zٻM{2~COZ܉@'ա!ek'9)f$h(kLŻ?BK*7G"^[侾ifl@|&@ N@S\Yc _a4S1dzu/F7U_L^wx96,p2V?d֜z{{(@C{:(-OR+ճ&8-T!IsqS 8kb*rbS,<$oH2rV=\@ p@?/ u %TUpAQ!(I<\YYnY\XϧjUH9YLMjW�! 5H #(.4Tu3��!icgM U:nqh.a˶WL=Bzj\1~ǷE޻̎vhfFN2yd m5Z5ϋDR4+P+y啡Xpka~a[ |<=_|һBa)�75bRP��N%[d-k1G>vl;6�2;$ha8*� 2Ž?ӼhSkT@N�B-пLQO ò ;AT<Ia*I @8311aQ"ãG<Ʈp{ƏUQ#^dI,laAO?@ @4Lw0eiRxL�x}&$3m,M zg˪*qg 3y9Y-&oIUm:h&gM �E_-d3 :OP Wh/c{_X\k&u6/98龗.QI�=dźg"ֵs pe]kg�;b#</rZG#)gM&zEN+3<nJڜ߼ؽrlV{3'.OyΝ2%+bc)#:Y�F 59FP,FlT K.i6}agV/, 5j�£?OfG #O^ yXiW(U^ ל{[UR8oL_t;NdZ ^p` SP^ fF'.,IᄌެԴy7ScyxQ�0U-iZ[ljIuqS]HcY7+Iy,P^Sw3 m4N|&��٥:}(bqRx ��dW _7_JI׀&M@R8s|i@'w{^3vCS_œO$djbk /~VΓ-n٫YDV;뎺@ @QtINnmG`bĭdk{:N[+릹]1ڔE^Ugs~ѨD��́޶0}G; u+t3Di<BP _>ܗ]Ʀ>)M֗HT%p Տٹ/cN6�h^ ?K;}aO w4Rڋ [wqdsBwtWf�\�ܘpՒeޣOs6O4ot91�&t) z\;Px)uW᫓?\М!n/f5MCGZ!:8ijï8Z*nGyg${X;�e}m 35t{{//x\9_->KQ1v޸mv5/@ ̋8nId'6[7f8M-pȠ[ZKVg&D7 FA 3a;�8W`v빧�Aeo%G>@/&`u[jX7^$ץ򆵫S#NՖIUk�(uuS+uhm;o=yZGAYjQ-W/*~sgE.@ @ o%Fاo{5bߥg>�S2.siʓY�ԕ(,@ lt6`#� Ѵl �_5��2]wh*˄t86�V=<7 _9V;kޗFfͻmZ;?Uud cyW؟58+GÈ�QS [+$[@'U'�PmNN�0j?�+i\OF_cD}Y� ;]}NcIlO_N6xTe�2`ѾW@Q3?g{� tWyO۪\Jg;nZQ"��Qwhd* �)S( 8ő.n�<NI`�hUw|.ԯ,_> v-:� qhݺv3R&uR�E"I:4�i �DĎ�gΤK܂)۷V"٨Kg:wj:@ @i5 <nnuĕ]:gpIL2]M#JeaVCX�w2g M/[2B| 8Vҳr~aM}͛/zۛݤe˦ɵ3�8D%Pϊ)7/[F\|ULe++Leޏ\i�! E$2rяA&�^�wQE_*c}Xe�KyIcٗ-!%,:/ۘ(I0 ]&*Q(g�a P\�ttB]cҠC6�@tJj75 Ƒgզu 1(a�� .*��zO O��z]|6 ,ب+!OU# ?~сa"ԗ@ &U4%vEI- Y3%jMm񤏝�2]|8bBLe��a. `ʯ| Â].zʓ �xxiNO-TE&08 v_ߪ,ϟ5i, i yqdV[J"'&{_JgUdP9}ci'5Ijeqc�ʭ�g-,x$$&0ܔ$\ʦ]mkf/֬ʷ|yhF ���QaeRS 4նථ$PϢfg�pxv緓~&OkXK ;�D�Px�� 7m+{[j"Sibl\#3QGB @ ? lRl�`h||j-� `,K :�>Gsѻ�s<07�=xj4XSEmIgcn~%�(|(`d, �EV!G^}B|tgG�J:T YS{u[RS6]y�!aϩ8ۯz1 ɯ5~���IDATf/w>\b<#%MVdjJ\g/UB,�œXM�,i_�? ʥh'F6b_E[>sfG0!E��"w{zswrt�Χ>-�) $Pldgܵ[w:}xX;(.ن% n0|l, LT1e]؜yXDawYP~?wΜ瞹sgNNr+ՙGϖ/ǎ8ZrLzxf u"lbh:rf'k\:g G^SFc5da7vtcG F@ @ U4eU2 lU{lznn1<jԤ%' ݛr6o<Yv V5�8kZ2+܆.896B�opc욀1FZ[fO^Dm'w\qAv$`&:dv�`״3]razڞy-CRp%e`gO'6 \[R@a4VzEY 0n|kо�tecq<(h`f5n;l(.Fk6pI \'*u)[ORYXƸ[͆˴P|ǏJuBkIn̄MqP/k'Mm<:ʯ�`tkG vQ?/sua'R5Iᝦ?}NJUtY>&.>C| z7ݹQ{G�W-z NC{Q!k#:˸:,��~p=9_;y,��@OfmAenX/\}!#�i]8 �sG<|&^�`؍^X5@ @ _wn:'Kh?HIY 8~\%q6*Y Slإ b yiNe llX"+OL9\_;OKfi_u/!qtI8Q5A5wo/ Ftk=JZ'|#t]Yփ [Dߵ/ObW{rd2:sT "tu8f;ʩpk7[4�)ukzL DYW~I^fjڪ(?'hK.<Z>x7JрZj6673/ll- -.3m@ *ջ6z?ֿNzFBu@n?੝mJ,1lmU?:Y;)[K^͵(^0ޏg/m1e/gBI31`/ԭ%y5h7kyrF^e-ދ342D@ @  r'hc6\s2Hs{Zot3bE @Tæ[ G6MԥA@ U[S@ �@ @ @ F @ @ D0MH8A] d%TGŒTT6)yrB}j qOVCRoi{B.Ժ͸ox25j[ܷob*eO` ȎyP^S92uF oUs,re.(l?!#qQA 胇C?*hD&J8z%]jM[O).OSٌ'ҰUmBrxϜ?rĬyޛzHdž͏$ �@Z~?AŗY7]\2�~^WZN{um낮HSz=\qբqӖ Ԉ{g̚;Mw٪l?ֻ鈥 O ࢵ:rր\~W {(E* a?~Ϋ֬{)$ÚߦnEձG Nիo¥}?̡ 'vQᷪXdemk<ti_mtX q~/E^\sK%d %ɫ֬+o<^9)4]PqꫭR·W7Hau\@T?zXXTKRt + ѫ^-.ۼa]Sb `E%Ƿ-[Ͽu 53l92dʱ{c�@Vi +ro;cWC/E&#S J \s/.%TjEv_-'L:0k#q5N}3-uU>)۷[ (ASЈ)wf;طw�l(W+pİ+2+ IЎ]Y~ΛQ\A=j[\M]ժLtBn?ЯeLZêhDv^"d`l"ne~6`D?Y>ؑS 755)gbȩHȨ`}5'wW[<Rި}w@ 7L@Gto5vZr<b�_b%ٹe2ҕ>WmQU07_+fdJa$m^$7SD &Mc�@V,Tj\6t9gmhV^]>[~S z/XCZyL8`ǒw2x^cߊCAX){OS> =sYwf븐AIkծev{urQNV�D9fQK<UPߞ(R^HtW5^Q\:b+ ;-WDy2]h=gtSەOm.Ơ츢й<~{Ok/<{ށ*맕PO YVZf<511O=9Hz~W?./$UBQ5+(T)⧬nϣ([1!\ڧ3ͧNToWrۅ?*͓d,7V6d ;N֊>Eޖ:o*,K' <r9/kG#ք/Y͉SkVtwo=uUۊespiΪ9r+;\K@ 8U(<I5f`�qs݌40pyŦ\)KٶYl)K}V^/}}hx24@QW zd� kmaz0=�>eՄ'w?q1#;lڲCrz>x�#? ]Nj$*lNaZn;eVv\ %|ٲj4ϳ0k. ^Tjfq6� ax0gcν/څ½^pqϾLn-~N?|;562 i|s+Gw|-u6&ɶts`oNu J]*|7kYɓvl:�r }.b=Mvog|Sj64-d>[9/k17vJZh�sW-۟-Y.]r,8?�kPy7YG~zdl]+07P�"ރCpWޫAŹowS{i� y6mԌ`Ë;{/q:4KMyfê7C7KςK_d4]:;�|cQg&Լ:/0QZ޾F0K>Mө?Dr QCf|xgF\=ó;KZX�!߶mԭ/fG}oRs?JO#^IBz.{< x5�>=SHЍd3zm� 濚=wOsƱ-E:{fW,swO)ȑj֩�^�Bgm7ckZ}SW[q[L՜ [+#7o.jl:�伋2jY5ېz|-( ;v7ϔPz_pc~/ `Ģgzە.鷼"NK6~Pk\AN?d֟yj믆T_ SYՋ,O7z;nbƷsu҇غ̶?O{~vLJdKZ{ɢ }21R/zU_2 ><X,ɐxs~m#qջ�5{ʃwN2T hQ֥}{ l 4r" L-Ǭ v-?uj. 7Xtun69|i &�Cj̭S/n߷>l\0ڇ'(Spܳ!M[?SLjˎT*-F pTVΓSd߬۔dW�v{ϋV"/=B 9}ޡko/B{w})(f d {! _J (E)F]Vr7Pv-:/COܦ:ޖ)[Ilp6xi낺% ōLvgr뎱v/c}Gk�Her<MvlF\޳W0h;?[ZC<Hp�5acʘ:Ɗ2V3ӦL|8#qp+]Ţ:�62O-�x07cȝ�ҟ,L7Ӕfk+f Hy4h@q"ҳ9dM, �aL>G>ZN Ï$&:EF kUgsg:ws6GB,ay`#.nФKCj�n>q+9fahL]v#8yS՝BϜiҪ��j7lf!9GKRU'SiUg[^~kҨ �\fƵf?_��@>м LnKu车ͥBvh&;?ckG^,z2&zx츢Y[jPftq nn%>~ێ%Y}rķQ Ы>aO|ZD c#*ЁRqw-tr>;]mÁ5^đj>5뵉55/AqJ;Es=ܘ/m_`m:4s`ž }(⊢^$y4ՋzXqH;$oꎓI{)?mѩEx9As~0`^}Fbgs۩y_DޙRW�\zΙӍ ޻҃�֊<0Ê]^˥xۚ@ >UܨMgj6 �:fݭ4)OݰFc Ha�*Ӻ�{a'0W7c�-t(׾Ry?s 1a�z]j׎0kboș2 dNm'th~��c^ۥ̜ܭZ K\MզkנMkOϦExlז`̶l^'v,�q: !�qif!EoDN:O޹ PXPNj<)]3hr�^wf3iwrqu}`= W6B7#=.�pmu4u:[F+tݧnK[SǨxy)f1FSjcb>|1͎}=>_NECcݫK{VivW=�0dD8A1�81�ИsvHiAVɻK-cTkl$Nn7\'CC:Rb4ݻoa}ν|Fǧ|\S.Cc1ҿ? Xǻ@~Y&�rQȨCE](gar!cWIWqEktǡ yրV7nnݻhg=�a^M-�qXJuP ^i�NR_#{82?!VFK6~P}\V*jZ,ߕi৞ՙ4/rsKT]U6Ojq;e!ߪZdS(_:�,5G^wu�@z%]�GR $I�`-Zgu`ƪm; A+e+& �k�>_�@T<rK@m,;|a[ H~tfshceK)n�fXZ<'1#\yed"+-rh?脟gcfVgǦOaF [,qcY)|be$6M�PT=Z"adPiԅ: 26K|j>_!XednTcdɽams4h!Ac̛3Kwg�/7M;q�zSkƬ\﫨ˏWS[ˇ,<;ޝ[dz^j{\� OD.kb++~G_tzr^XZJt{B&!1yIc�|?fڥQ۔%jNt �`(*1i' <4(uO9Ӯx6=Ṁa:D.ۺzG.ѕS t2?ZqzԬn^<-Lz2hYQǼ$'N.B?yRUeWǺv`qwe>ZqtЧil� -ЩS[UWZA)XZ`fm]үKPY<qTtUdjŭ֍vbH݉'O:jR?.mz͓EkR(V(v)^d/ NY6F[?1??K;NL|/ue/[67 BV/gnhP㊞β�YaErG J';tLgQ- a]]&/+8�o֙KbD+�9Nc)lɅgp9;+'X� ċ�>@U6̣۰,[҆6_ˈKg|W5/3j.4�:X~~CPꉩt:۶ ^*mռv;.~]%O}D8>(oӥc"0X&F3}&eֆnv`8\Y4�h>O;hzvQEy ;C<ic � Q.q䬎#g'[3kԎQp=k}2)�0tc4NȁE) 7G �2e=H_ SGrˊG t,x}(S#|:^O {;-{N}F~?ʜ/tjHrJ`);y/\7mhF?9ATWZ_a�f/w-mUFOYn(f+bR'PA{"d^:k#ږI[O]_㊊Yn3VWPg Mq5j{Zէl{i)A~+[Ҽ;6z[F2kݞGѸu~%Otw99!�|8fx8R@~3�hf UjOqd�w� +& \� +LEo|�Bpۮ �1YZ�Ȅ{'k`cسPH�hF67`}�=W˱CV/˗�s=G}  ZlL 8�B|n9c)+2u6վ^I�mޓNQ@]]ԅu 5|e[r۽ZiywGghgYzuUqR~}Ίpf@nܦ/z6mѸGћz>[ �$R EmnRg?6P~ -U4� @<!]2pћ,1�۹mXN,Zïn_<1� i<6䑢@޷륖Q\3rk?G�`�@벬gTJ~tW;Fp.Xras=gf4IGM;È *>:yGrm \V <Y_}s=NِSP%;UP_U%֗zwm72.STáNP"nqid~nk5>z� ɋYKJA{Кku3ndڦRՍu S]ݴ>z yՒjW.͘qڣ{ŀ�Yйi�4dј4 ˍ{sۈK}GyvGN]qFj ',E+y[Uv[|\zm9&ݼGQ5d{sVQ&<'Na4&�`'pYKxz'8F�@n]0fHkK\ZɋN+..Y܂�tK<CO3evH.Dޣ FkiP/YpJ(k]amO}%q<k|7ܿȔZtD{u Xd..NN74gMLˍNuWldE6n�p`ץn=-t+K[ulժ/e/>;�<YyOAsMuhQϠMlXXEcSCo4#ۮׯmZBLQ}5kZߤz "'.߬ݱ-ݰO: 4=V,+!c& ua$pI36�tns:0?U ݭ>쁮v< י}5YT[*Qp=;6߮*\gs m\<fІiǟ:0h/>G]-nzi{I��Q; ]C31:ȵ#q;ꨟֳܽ5m\W �b0-_8O}?FLulqG 1Zij7bCo :dX}zR:nE9WmzmD߭[R2tE1[Cf賢 I@r^&=Ѿ1RLNzfſZ ~w2Mmmڳ˖w7hP/2HKzqΧqꏓO$ژAvm�`[M39�-FmtM;ΥMpkl<X5t?}CFddA08fSje�@ fo>|{sry0VT~F2Or5"q\ +5K`mT !ZKR/Rq+{+Pk.'8ذT3DVE驙r~EKfQ].?^"%dBs$$8vf >TDɐ) 6v<}(k.σ 8jrv{ Fr9Su�J.Z[rɮo0{*1s)8}]WE\ĸt) R ߓlsg۟:d2:&B*:.լ+FB֖G_lgRY+"pk�@|aZw \eCFf||>:ds]4`Xs߮~Ir9^2TW<D[R?ul\mP [Bi,%)FOըoUʭqk{TS&\UwunT(\i޷98~Rc~m}]>GPW̿m_iFA-+4d(ѭO&1 už}LznSp阘i;* V[v(5}a/UYS !FqXVȏ(44^&NӮeZ;Xk@ ^hN@w 5Q+w}vФ\4cʮ;7ZB񛩲 hjdƧ=_'+jeGaou<vk+6kb!M{zVh\7 hDe#6 0qvcS=@PL@o0@5?=zT϶A.w1.9$EQ;Fπ#x&Op-ɿ+YqY׿KӁ Z y ImV5&?q߈Fh?ݧ@ KKp y@ @ JE@ @ @n4@ @ @ *?wUD9?Y(cZ[}GH1/3que(>䥤+~tu-RR~.@/89?R��ht5GijBajk˥qaF:_ WKRv6`F@ ğ\-^B1q|N\&>KLȒk`ɦ]B!.Ө*]q築V.*ǪS&2+A;;<|_6r<{xGaluXrÈ!#V7IZxᛈ!}~p]S~�we9"-*Gcn2Cv9Bs._;7ҵj_N{D({ ^ +}ʈn{Ned}_hu-r˫O%wِ$ֹ@ @ �I'meWA;I.'vQ =).Z;WhE '.4QÌVJxZeu6u_<|m]?ğ?zIk\y6N~iֲsRZSUnzլ}ui(|-N@뵞Ԝ�q{�aX�e"Kw!{nv ��pj i-/̈?zew�� 'ok[l\ߜ[.|(El>Bɬb}~=7wF09R W |fo3zTjpd'޻fu#fgvz8YrᲖ� }Zy 0LJ-P묕vG @ %b); |zɈUʿO3cχ_/?!�Qv[ ~%ʯSWB:d<rdVs1tuf)S-_8~f3gn#w;b:>,&ƴU],it6ҿך~4~g^^k2}} �{Vt v~uN*Wͨ6(vUX&>{5=`Begw&er{oЯCs 6lBF"8�y% �!+(\B r ee\%fz;*-Oᏺ/3tij2҅rBVl�Q/"+_@ SyL8`GJi’[pi| �$Q AvZFNA=&&^@/=35-nZx`Dzt;gwx<Hos1wg9墜B9�r~e_ʲ2VMUԾvB7A]}/>:$msΞLE;d~O&QԵCsYwf븐AQC *N=MOeͪ2F:�D\guf<<9�c<6_͠ɿؖ,&M�YD3!yiCD-S#Z`%+Ou~wXO?b;b_a7kT/[VmyyvCf ԥa~~9ý/ٟ O0zjlAv zU+۳,GgN[1i�=r#5�0uL@"{-۱�pyŦ\)KٶYl)T*bsXaV[y1}V]^׼WT+G*|7kYɓ D9WL> ^13<a@mX4�$ Dbb[9L2.<c_ مaӗVR)ax0gcν/0v'+OV/򒼷:ii픅s[q)#@ 'zgKK+~C/x;H6g1&? �iwL gEJ 7WF,!s \woUݠ.>{,µ07My1d 0kau8ٴQ3>/;ٺ4 nJ.2htnwȨGFnֵb i.}Xh4Ʊɓoq,:�| ;ʜ'R= GKY>�\z:tk{]_<K^6ש/~~y\f{ϼgӫql4=:�59]xWFn߸]t�H:b>޻ٕ}v$CnC;._T(k_ }tCMдF2;d~mKNK3j6@Q7x퀛Ii\ug6|{r{}�1֟^|l3ZU({NXB#خ5#&: 0F?ŗ 0uh [)??h7ſKNJ Go3Zz6.|+Vra �Doxʹ1,[}ͦ>xng�. 7[k!<m 炷O�T*=oWXV'>PJs.ʊ|HȚ\'Î ;jc6ma<fU[?X~>ا ::vcA[FN;<Ɍ-'TzRܺcuPIer4uؑ/JO~_}סG;K^N�/z=[7<*xQ^-Wj�n{65$ȡ|7vۗ+XݴzÞK$S;YyznSǂ6Y92]SoG @ FDG_z߽w քok1?ߠ%Ҵ73Yѳv�@Hٸf΍ X�`ob3"n 9f`fr'B u7'nT|k.F\gfq�aLu,8ZZŢܸ|G|� @,?Ce`r'ͧo(f%\ӧ7Kyպb�Cۘu^\X"ٺӞ뷟~;Ltor7v&;?yhÑ#Ծv$Gn(o_ }څ"Ɉnl$C'v sG=yxN{^巫�pw3 6vG3&QAnZbWvLk~anԿĦ3\!�`ϊRTKt(BYSkp\=\~YTn)uKG'I/*!J0@ 2"�a2zIo*~20eXwq�=:& � �f�pn+(SLc̲Yswk..)851~s|Z�@c{/lz[Y?f;t1 r{.eɦcCk \�(̾9�l˱*Y<90i�`\ݮe}}8'n{5֋YCxY sj;y>v@ odhCGA]^|g6cКv'G1ҿ? Xǻ�.{�S;EqaN5^ԍ|i~|ĵpLxr�%>'M%(7;�}{jb`Ҫo^=;<Mr 3#Ngt%-L.sT,lڰ`ǬU� 4N'm?xhRK�,9x{sMwPCml;R@Z>KvC2D TC'd3�6mYtmx-�Ӷ�p_ii*o_ϗSQD *H~#vbpz�YXhEcwoǣ!5ߧ~d.NqM|1.�ĭS zl<:�6$el&~�e{aF [ccXVpJ1k^>V  � 6pKÅ80"ɏlt l :2q[X?F5&JΘ܋yfq9YӾ4& �쟧R9%8((k_V[C#7hZm_.[BR�" 7ЧЙ|zQw~BȞuZu;w!k@ C*zSkƬ\﫨ˏIݼ4XY[}Һ6Tkm{/_:=IQv,-0ְuU~b|GVGq$ __|akڥDҹ&b7B_jX<).0J<'Lz2hY,yINUX5"hlP @e_5Mx Y>KvC3JA|\f!kwAgoI#^1;!۔%ͯJ';tLgQ- a]]>'m)�wk-7H,.pոwc1$Bsۊ3=�:cK|0Z.H1+z_0MlS{P< ':ǹs_FX21�Y\F,�EDqdyԛ2>kN8݌�ifQb_*Hd긂)��Ƙ6qyg].@Y'1&jp9;+}IŶ0b:SW>mGa_Yhѥ )#@ u IkC7;�sC?Ҕo$d\QrdZǑ:nAS;:F]wn(f+fqvNu 9%' }򤍍.�$D �� O@,DNZOǪ$�:+eOSyL7uA]m_vQ;=w,u˵Cfgp{�$܆!kwٓ}}C q˾^@TZUgM�i{k0 �tN8`-ϯDө٦wyczy7&M<`Ӓygˤr~�-6v3�^~YTQ؛-f7ɨvX400/#� 7ܕ�k93);� lۏ�{n+_~ڢx��@Vjr}t(%r�@VM@V?K7�!mme֛? |gptvWrDӞ5/L|"\cسPH�h}`fFSW]Bgj'dv%�k\Q mG @ ȍp@ϦM<7h<zSg+w ZsccƍlS4A"Bd7Yb�зskQ۰N+('$/fپ/ = dž<Rv1OLaG&PH3k�0.`IѺ|ð1gcT�H_Jz,).G@gc>�/;s@?[?ڲO/iP!F:>Yw&;d~jߩ�%Y[>|v(}՟0t&oRK4sg("JjX6vj,X5յ<`۷j.Ĉ͐6 V;f˽՗,�q?u@1ƴjVFroы�@OԹƘPfަ F hNaMX�0gy~+uIsM>)(m3ܤ7Q4kҙ.J=mϼDӺ>Æbfhh1<jԤ%' ݛ@ѷmԶɧ}#OɲSص؞tecq<(h`�N+..Y܂RL+_2ֱE('эf%smrc#dԇ_)n]0fHkK\Zɋ۾$:c.];첵<ǞvkQ)әRH.Dޣ FkېmG @ <YyAs-tvi|H&'?=t@�^#ᰦM r;ٲxQ; ]{,bE!݂2C^)@2kbPF/:43!]CrPV}25mWK))^;vAc]=йThtlڳ-hb]n5c.wkc{ǸuϋF]XIKq6 Lj~Ƿ}uuS3Hu&A%o8$u⪂M^2jcֿe viqGG5Ai|RPmXt|zQ_}-3 @`>=}KX \�׉Ky~0ӷ47aπ� c45lK2p[ғxZw m8c4.Nܥ yI3V``*!qt?HIYedfIu*�#]SR2aJZjRq+{RQ$$8vfj:W>S3,#[s}Pa;Pnh\�S B Q<\:&fNo+=vrid4/}]>GPW̿m_iF yAd9c鱱.Yqi޷98e<KOGTVg~b\SrQ|GWgNtk=zfrObW{6rW֎~<si}k_2(␌A5wo}g˨Ou~KV3 Q\/"'Domqv&l@ GG`S^H-ף."uA@T=Vkwbü.ܔ+ko-'jOCw}v7٥M3zϹs�F *b ښ#dOư\R?=zT϶A._m_@ utk{޸ւ'n}fkҨ;}V?1.9$ǯ Q7P"Z=@ DF @ 'iH@ @ @Th@ @ @ Z\EO.O8Vwԡ?;,Hp�14a{-Z/R>0~4;>&OԩWKxKKMe[0*X2Ǭ<dr�8X-!5ŀRs8[ Ev=;AUꩦcInذOȜ[y/ c+ V83=K+5NA'cPkժR@T5^Jg:X2+,Ͽgj:'hke!Bq+�Fc\52W{'}嘴mWIKlHG(>eKTjo\^kվWWv %WͽiRL"&Ξ ߭sUSYYbZ][ 4(��X:]ʻU f̕gc~ࢵ{&[yzBOJˌG]i:ֻV֭7VJxZ1_윔B],'vQ =Jh2P]τKc}Zj#pqO& lr@bػ M>Y5lhwzo +UjO:a)IN.ӟ<)-kgP't^z!�xrIGYjx2jYaiݺvoS} YߦkL]bWU_㺴lq[Pq<*51b?xQm:=q-rTCqGh4:%6IJ,?0gV0n,2dPS^J}^4au$^qf|lm~Vo]C{u-\lu}LUĥYt:NdŮ=nԿKWvf<rdȔc~>ܙCW?~`z̪,2O /}R}31Pp&Ű*ݨziQʠ\=ewwц~-O ܞx13GkE&xOġY֊G-�<|YL:KYSG;KꭃRy.Zo~gȆsu/\}K0յ[Lİ+2Qz! %biuՋWWV3msD]͇Xzba*/j6*;VwNfwAg*8nWWݎں.k=C.Z!UIgo<jّ&M5QVh7{ss*m[~[]^tjsd.*K\1CO_W9ohjT:7Y:Jn rL}S¯Bpe*KzySO@A.OL5/' =]z! WKϷ=T+E{?E۠謦@ s%FƆMi{F{PkUg/Y@V+ar X~VԂcG8?Fl8sR!NRݨ, .I:t/6,uv+֪dͦT-X 0Q^ihTrQNa`C ,TZʃ̌rD4}#eSJ/[MAf\ՠd/C662UG.g OMLZ۪h饂)rh AvZX":+FVz9M5=ryv_zRƚ7:MC8SQ3&vm{ l[evnsuoշ%1g]KLim9_>dɌO\O�@b߶[)y5ӌI�A EՀN ( :&ixMdۛ'.OÝ9>3iiH�cɸŐA~*>&l³] {=u-OB=)C�8 b؞ɫVε{WØU٬n1u�ޞعØ24ֳ|+%t4 WkPr0/5zE4S='A:c6^dn+CT?^1ȮdV`3�Hڤ 1qp 9J_!C2#.zSk$ܕ_#4*C*;$=T>~#LO2ԅLgj3QWA-=|pCYla�OD~KkN褊!ӠvF,͎?2!_^íѤ~ ӵ]73xa|~دrQ6/S@>)±渡A?{3ɗB¹FZ+CQuP+Ҽ4 F,?5ciǡ/i\)DePu^$Q֬)Chd@Ľuv3Te˪-pV>sH4}i+& �G.�b]gxl~Yh�5zI@Ķ0=s@ +6rLYL̶eM�L=:S$^#`ˡvl:�b6z+.޽Hޮ SmeG:ȉ9x7j?4'bLLJ{grxoI{' OXWcFv!w%#<m@7R{q]HN{8MdLC~f:3(?esb$ɍW,cQrz>fpKDÓ7n`dI!з3)5|K>rMҳYMC/x;H6g1&? �b3}Y=g2M}cQg&Լ:/S/ roSĕ49Zhb≴I�aRcS|ٰhY̧GFnֵb i.}Xhd(ZKNK3j6@E漋2jY5۰8)O yN :Ĝ*4yef86y-΁EO!}]d[2#EI3p ˫޽Wuuu՜ [+#7o.jl:d~3` �Vڽ IӤ`ic/2/ZW ?f ? \ _<g_WKfݰ05t5@k@P2r@Nh6&i_=;d.zgصtljK*ĺ+OmԵOM2MQ x,�x�T7@/;Ԯm ΄^5|wm;~Id!Ӂ>B9+v5)J x_sWd轾:&-_{(Ltݞ=t0 �y<k+J-VG]g6/>{+<x吖zcOwEc@ M`HE�ʚwmSD6 ?~1p~.~H1R:#ClڨNwnlŠZR;wI.f�pŋꜢf3=Jd[^ޯN?;$QTO2ݔ̾ZsGnv$4f:3m=zw>Y\ێڊ,f+.n"yW=IE�{)r 36.`Co|a?IO|[תZcG_ 螟X(W5D)oc\ڜz�ƶz{]yIf}:yX![FG{iwL gEJ 7Wv\~D1?@Wdy*hc<Pe]wv:qL!wN.ő}[u�֞6"F _gNw.Z� Js5˥?V|J'B߾˂%3~蔠v._u!nrqzhB<x̪`wk.�q]w �GcǮr;yh`I'Mj;q {E%OT~�ެ۔dW�v{ )Ջ ~Lg;8Ҷڵj%'}jײ-Uie:'�<:,uHr&-'ЕY{�a}-[LQwYv'nOo�틉T~2>51fǟZw1lT,޸cI^dz^tON$[H$эO ke{)0Go#@-'ǡĩ]fƵf?_��@>м LnKu车ͥ.:EF kUgsg:wsS/y(n`1D%o��!sWoY"WZofG?Yyz#Ǚ}I9݉.\&iNnh�ddȈ>�68eN?Iȅ^} {B&JӰaLPا'jv=}|:bɢg93xy&ibgdK^dĎ!ws$:X"ٺӹX'G|UBO2F-]8Wv?dG$xo{G}iש+]piƼ͗F-^h®o.=�@u+mkB Ɏ�LakE}9ۢ35kcrcNYw`c6L団tmga>`Ŝ_Oh}~6r-NoӬsa2�2|] KĔ%KTϏ6o7vy3xYXZlW WCJEB}'^97:rE#?:3`YpC˗̊�^l9hr#�|Xk0Va3t=Zt=P{^ڭ<y%ikqx,5QzN1*;ޣ3Hy4h@ꏗn|ftq?=kޟ~lj#_}jkkROaG)?ߨTO2ݔT}uǙ5Z~ n&W}>5%6"mGmŃzzζԢԕׄ)Ry- iȺphS֧kzV'r(~qFVW-B:{=uk1xsfO;4�3o-?3L�XZfX1+_{o[3\zΙӍ ޻H=u+zyqw-tr>;]m�K#"q<BunZbWܫq:Ѥ-od�:h" #"o}_=�&t< xCmQl:�Ckos]aL 7c�-t{fpIaЩiCei,z#e�&I'BiݼS_ X4�ݦǣA֪~INb¤qv,_QZ,pZ�`.g?xlז�mog ? y^D�t J2v(70eXwq�=:& jd\㉺9~JۻǛ"Ugv��'m?<%�XBF �ӆ0�s=f5z�`ȠʫWEcl8t�zV_@_4`G<>;�ns"5P.?uy}=]N&OfH~DlVlkӭ-\, tJ>gt#�m;6x ejj� a}2qbfZ�`Qà];¦S/[V1Ou�0v{1}ԃlUBOҤtǭ7OoxV@#8TiN{G}�`4`ɔka@1Em}ܿ�!Τ@].E6\e7:MnkiP*9&]60MvKoljdgf�$�%{kHHY?/'q;xUy?|Tn0yxsXyeÔ=[[r`]j35m]+Wpv@qB"x"]7MHz-N�`*ԩc:yԮ9FyFiݽ!wS {@ *uoF;*lRɲ7(eP);#3"V-yLG�.tK�P\H(@нKt�"neĚ)fϲ7꣔ՓB7uQ3}uǙ6]$y 7vFL/6`ibGz֬hVsR&Q�XU7 [+r\>" ގ[ �l�Tv4`2�2c�gA&z{.p- f-ZZqj /� ?eTݟ hQ+R{�; k_/u\<BIV<rK@m,;| @y4kSzmŒ^ƲSJ2tM?I9�rw:g$?:94Z@1ಥB-PTZO�p~BȞuZu;wy&խ+W:"U۰5*z c phTb韒㕪E{ˮ[n7p+/~2Lfm91ӫ{OC1o*mn~!#ef¤',u;Hw%1,~,Ec9�R�"hSO](9r~Vd\T"r\C]1[X06qm 6C[VWT:_N-<?յCgT8G_tzr^XJ !~<KccEqE': {/K|$.�A  �d�4*ʫt5�ybbxs@..& 1��ppi�M,>jdicՍR-.~Y?I3nVW x᳗cϰ汆ۨ]`?{ פ� ?6赮[3.fl\|j6^Fj6E¥a[Wh1;rh^^P{Vu[K뚕ś)eP);#C�_~ ]Z)Rw�<)m)9tBV8̎#j4,;~DyR23cI"!ݺF7'x,/jGة%Xy�],z^jUjKclbcjɴWer Yl SB}GGcY.kuuI,;jCH/u\SyDtaGwҠqU{DZF}hU"D8c��!+f>ř\9Nc)EarbϚ+w7�@#YgJ$)^?)< 6 58!YQ'Dc6@aVTݾTM=g7&*O7Қe~6oW'ݧ6-|vtuS5+O2<wT6L}ujHrJ$n:X~~O]^9f>U(v>yF�w]^2ܞE�Ig&!�0uĹQ8Vh+hf[W,fS?`46�qŕE<L:qwk&x 6ҙLO B��-֞~-{6=5!,SԜA v\f�ϓ/��[QZ �c�Esa:fݖ=]'6hmBa <:㒜 [lhp Vnde k٩GN=6nZ҂j݋ls3Qz!D%t(ܭ]3=2:1'@II5K 9uzRuǥdg28ΞWok2@nCrU]mQWOPL2KS),}[NUҫaQ6/qRN id8/�<�fdE;^N�>\3<N?T׵'';uڈ*#ŕQAړv96�8?3�p-G6`&{�!>m�ѹ XG0qdj;:=k_6\�0~D 3p1f0ypĠc-Ee.=|JhW,_�k9Qbd{<S]]=1lO=�P.nJF^ᇟz4ٳ!O WOF:>Yw"5_:v#� ½38 bF=<}'Hy\3riC!ͤ�¸%UT �-U> �Vcx�e75ӘA=얍\@�G["hcv5lJ��˲_3%[چS]$RﮭFe >l9Щ-QOVuO'w_4nɴW<I/W7AND [MgYTN4d-uѽs=glfz�#G?ca(,0tkOi`{¯݈޷~_ eh3'=-e_?q^. d;#_?<Rԍ'0a9OcRޖi*n<8M4!H}*O �@6+�{5]E룦wa*EҸ^wa84Zhh4N:fz$ yo޷O9^R`(H͒rqzԝ WݎƟԔՓT7W{ 0`O jn~Q[vSb�m;xτU3EA[lhn FY.={ng1"9AE/?9u=;%�:ywB)|w p4aXnܛFDXߕZvnj٦i_\N?j\mՏϩ',?7o`YpJ(k]amO}Os-9풫4ke ?kp\o�pLy75iAjzB&^u} | h.i�Zx,'-Ly`¥{=\`(pm=j%|_w^DTëk�/&`̠֖Un;f @0{Vgs mCgFgoE%r9cnѺ.J( \'*u)[#{ǸuϋF]Xհ-\vek{}y"=qYTkSY>&6ۜ.OFwϦ{={eknۮS/k'Mm<:ʯ�`4c+z Đ:H�›I<stO΢O^ڎzs:xux]u 'CRH8i}5|vN:IЭۂ58;|m:rq'zX ;y k �c7y�Ǵ .Fm�'؆NӖeꑣN?n47:7d[{{AgwZc}ڲc��O|50o R�W𙰃{e`7zy-ʹrGp3ak]-GOH,o辟vlj@&_usG<>5kKC&�Ԭ!1m%2u.d%;^EhN6W @60f@sS~~-FUq6 Lj~؜It%+!c& ua$pI3%-ֵ1V>F2m6S:n dT}Ǚ�nCrvaIG=:ZRĕk%4SmЋgj4h^r]cSCoXOd+~}G/EFi{W-=,`��4(`p̦.Մ�~� iƭwd[FcpU?Tؾ1RLNzfHqEZ#T_wny%|,K-؊ i66*.DȄ)ifV3yR3<353ӥcI.JO͔lU똚UC= �Դ|F+S78M˿&S;^ ^7|0Uq\d۩A5wo} r9A+onϟ:6Fd{rN ^ZYa*� [[zG}yJtĸt) EG-EZ 4[jv_phPmّ2;:*+YyB^=Y6w5ҖΪIA[u*-�AúJܼTtH(UfCvS q- mlX$/35WfjmW8�vϲ K<a4[fŘW 鱱.˞ɶSU_옕.�qIS.NIf\ZPz!<\:&fNoKL_N"TaPO(HOGT./�tk=_c7$LOT}ƙ\ŕMj-;j9<1LJu]}+sq~NrL86 4qv%..ZeBKKe?+ey!EG߶4#u?*JqEGG?wS^*z]~੝mtG]iƔ]9wnx=cB6@ 4@Trqjc�i76/+ݮ0$7JzmZ4O0O$+ަ:5ϼ1.9$Q|F_F @inmA: ?ݧ^Ƶ< w;7\F}7 5]xKp WF @ 'iH@ @ @Th@ @ @ _9ʓMMIBbcᒬ0#=9%59%';թ8ATb;JeLv|W*Օ}^ ~CI&+|bBCy$Y_ZH[@NfO6yOwꒈ?taA8#J±C|ش} cl翥z 3"G-gǼ*?/M?[N'NbK-"ƽ!t �'�`:)#|w}U$00'$WN^{̉#G̺'({pBY(%zORn%]B㣈s?=U=-2eS\nE-;oZi? ՈO$d~vPȑǟRJ#6?Tbש4OTnhPcXz�S\w!Ym[E{"P3_V˿i/e�^Cf 髯rFJSD/ ذ:l !{|n_$;-H}z?#.6u;/z^A}~oW SRt%TIsXl KVj+^RUk֭Zn토Ћ$j&_[B[_I>|yuPJf4gwhxͨUFobTG[:~O%C_:ywjjBkv]8q0KGs',.r=`*aE20]^ZUqCz/78-o٪}k0(  jiMo� 0 M2K׾IjNNz|˅6oXǴ֖ʎ7-DxRovzφE{BƓ-GL9vo^Ɣ;3|@Y5hPNپlF<1oacf0lw'M4ۉCTM[y9|-t^9|v.w[37.](x^S;ormKxw:xN5qn:t{k4|WR܂'A;veHaYO=qI5"F(Q^e4�rn8Q��1vcuUK*|#䁭>nz=>)O꧈<D,E7#Ԥ7jymxIgo<ڷ*n+ 1u, � gҤךfO kvEB+ >z珪/'èCFtouyѩ͡44�@L1}X%<#3_R('<QW2qq~p4q>~^(B~flkșe YaNذ¯Bpes!zRuIMU]O.)dcj}ei{B#3�h֬ q*ۡ_4]c}Uƛ"|CS Ρ)B&LL6g`Y,S 6V?F.E'ƃjBO)07W.5~e`$aO^}'.I:t/6,|ڭXvMbl +SnfFG.! t袜tBPʖg깬;uSвـ.g5d"rTL].R5ݰKwS{-9Ə9sZ*&fJk!Kf4xz:��݊MɳdȞfL�/N(:1H:&ixM_T7O\;o9rpG}:V򼜌[ 4yt7a+�z�\϶ѭk}~Iq� =>1o6gL7N^}/r{`Ƭrm..}gϬ-ryw{\]L;sc'TJ.I{1p?;�<hCj=%J12W#/]H767T< N+Xh 2sft!S6=S.@O.{Z6աO4*խE,']Ƹ`)6{L:<u~~@ b8 o7ݢh=$,[��lҚS:)~JlBSwOw ,?{3ɗB¹FZ[2izxgt=uWvj5bH;}&�Ŀzpdn<OFE\}/hRExr#*GèkPbMLQ��ٱ :fc�@ƫ=6pΛ] CY1in'Aym~͠Ȣ[rhE&'f LB#{�"}fߞtvAN~vl:�H?nX9ysq(lYV"w]{]󢹰hgr?}ޗω'Co]5CpT ;]t�bSX.ǔ%l۬^6є� OXWcFv!w%#<m`љ"D  �[cS]}H_8 g<Kp<>\ܳ>[{x T?��*bsXaV[$ Dbb[9L<KRw6*B&~Fi`LBӣ3g yq'5B^^v_P6V0- pn+;� ^13<a@mX̖+�~uf?Q-ʪHyX$,nՊzʼn񠴾_%dy۩~ iH3_9j&,aH�`p,O"L2O�v7fogB.X)^zX"ˠҹ?}{eof,Ga@5{8^c[ѱ{1v5~,yل_bq]Y{Q@c?Աg6, IӤ`ic/2/ZW ?f ? \ _<g_WKfݰ05t5|���IDAT@k@Ps\,1IW_=v%ƒ3n>n(Jyr[u+yLS; �/޷5�(ՍdKk­3W"n ]f;wI.f�pŋ!{N�bOͿeX J�a͖�oT AɋKYDJsS!i=a=sԇH:b>޻oY誰Ż2rƦSKlڨNwnlE%"ރCpWޫB}ԠoM̙BY˙z)?d5i0s[Gd޹Sjr(�9+]oy5zvGq)'?;zxd<E~~@ Vl]Ef[fW=IE�{)r 36VL%=1`mcd']ދF^rͬ 7'6?ZKO]kh몘�oFg=?m;z&p%2HۺVK?r j@w�xrtӤ3F,|q`Ь@�@+{�>xY͊'ړOoןL8$[q^쵇‚9q8Ǹ,7SuТK.7N#i>EY<~{ [~pu�+X7mg,|+7 (Iy'AxT,޸cI^dz^tO-XT*=ϗYma<fU5?n;V[Xn¤Z|b'~lUn' TV_a2^] kJNծeCg[j4J'Ձ �pAڸ$s [O";[f,! qsc SOz/J< \.-oomJXg+�|Ey+:)7oe?fmtJPw;Qy�!<Xcv~9qPCZCV/8Q3WK־d,,;v駎eDjy~S߶4`@Gwr'k/2̾�ke{-hs!q@rb,(yhބ_&%~:^Rr"9mS9W{pu^ k/jG3Y:@UW#KvKwԗ}If|a,֩뢎ܳ?��XѦ˾ں*t̐Xj�ԫƌAQTj-:Q6&rh cNYw`c6L団tmga>`ŜI_Oh}~6r-NoӬsa2�2|] KĔ%KTϏ6o764^|3ɸ柞K2:4Lxs{vԅceƥ46SiUg[^~kҨr&-5Q:ψ%>~ێ%Y}rķQ)kμ �B4}ύt!`obǐ;9[?>Lf'jv=}|:bɢg93xy&QCR/:& yB+k%_3;)uhkޟ~lj#_}jkkj?JK?,@o f2dy"Wjb?E dZ\8)ӎNߵZrb#.̞͞ LҮ~/vqu}윙=< k!}Xzs c`: qkl ޜY;Su}5ntp7(B%Ol?)19{a0( oD!32DcC@C탌@dqkVkp~)][ZbWvLk~anԿĦ35}΋p耱v�4x|ɵĞ|q1�#]u�Уc��`FZ�1 /|Q̚[sqI!?'ǩiS�,b¤qv->(SLc} 2"�a2zIo�`6=\mZ{z6uּiO�52^4I�(̾9�l˱ʵPѹjjYCxY sj;y`s\4ʒM0N|,Ny^D�t QKzQĉZ@/y8-m{%;93[xx'@jOf_y'jlPۻWkV}{٭LݎY�? �򓶟r<4%�XBFZ(lڰ`ǬU� 4Qy+{^(^T&8T~b{G}�`Ɏ|4S*w6‚EZ�#{L�2P4gǵoƤF45�\K>:Ǥ�P�Jp1fH&)x6k,Y[of+fY|:[i�9o�?{5+˿ \\H町K1\4߂sqIvԅSg˒<[xWSOmk>)Bݻhg=Ȧsw)11c>~f]<��6j|9b):V1SNm3ӒE�nGi}z ->T÷\ںQ,нKt@c~+C4R,β Ky_yB@([�F%^KL5f�û�mB?c3Vm� W\4�Xk.� }E,`kVI9 p&t �wj XX 0f�@}-56clzL�h:dbс:ƭR@@UM[lf}@ +)- v9E#�H�У1l@ αRo&b�`c\. . K~tfshceK).�q.!Zr_.Œ^}ƲSEiZB:��Ёc^G&�;s6gy2JaɄ�<US)Iuc矎t^ٳ1Ns玳ckViLhv8arblW:w/gAFUuS]֋"NԊu)l?3N]L:ۼˠ޷pSg WWjOf_)#ayj0 ˠeFOu5PPTсmʒKA2>�Y?i�Y~.�0,rGg[Wη1Zt5�\aD/�\�l3ˢ/XCuc+~Y?I#\7+O߃j]1EgHoyRotWIc"s6&0tʿ\֎y>4-[2z/nV5+j~<*NccDTzIoK+#<��&?ݶwӓmuh[r ct&?4b}L9kV<aUV3`Su-ݏu:·nՊ]~v;&n=R~~@ TG.U"K�`O:�|)Yy�"d/xv&\Lڊ< Jal乥~s S �c E1ZF,B^�J~{Ա/u郓O?/:PǡUu# w;YfKƽz~xXW-t-3*3e%�;eͥa>kN8݌�if�`p9;+Kq T6_ˈKg-Vu :�@8I 0P3f}Y ƹ2*' �x58Ga݆d|=f٢G6]="NS>;(C'ƃfl%x(O N�Z!n#YgI+XheXՐޕE:I &M궗*:|{ccԭeϦ&eʚ3h�2݁k yw�o�yr>% �1O�޲=0,BǬr{?yRk+>n Q!6cxt%9,~4[= kr(8Fm]ecp_s{Q-UY;Bc:ۗa*;? *bTh!JJS޻hG8rV~һ5M`2;Lݺ4Tf0 Ai&„#n3.m&,5G[: uSw**O)P͹|)�M} W9�&<�dE;^N�>\3<NkD01L&.z-Už]?%ho{K\wrdžw_o(\lXâtM[mHQ,)_fxp%�@c> e`c)_Z|F_tòqK?u#%8�gM�i{kq�F=<UҮ=0�s3�B|qif@VM@V?hACa8bCi"9� RlKNJ[ȋ\{*\ˑ I){n9cX+2 �?lm.�@Ǵg ˆkq� 9S>i``_F�@nݹ+Oi`Lmn:( �d{&c<! ^+/�] z@qE~ȣgϮ<D3ݴ?dqn</_x(OgY[cD��QI^诮?d5WOݯH/d}�xޙ{Bqi܁1ƒd_'>qrEL ~r5~Dٰ~tN #lٮ'9e3 �9zA�N Da[{J'~FR(E[_9yl).+r,E.I3r#/Ex)sGP%;[}ꉲ2 pB*<{y2;sqcG7v`N+`𖭗ـcC) }}Bd7Yb�зskQPq>%Cc[6r�m@g ]ӆ�Ǥ>- ][vTi'rgg**SM)PC �x5l#}&:)1n;~#3B.E\iΜ<iLðܸ7ן8:!Tn;@;-ņK^w'Sy0h+gF<InLq=+X] XL]yu Ӟ=p[3`mhn/>t`ޓlUՄU)Pi@{/̗�K.�u#',?^0o`mŁKlm/O'.]׀U++ EA FwoD؛>OM*hy}�tn5j҂FM[.n]0fHkK\Z?׼6n;l(.Fk6pIw0gy~+uIsM>WQzm)'mԶɧ}#OɲSص � \3~֒9^6t cÚh�>NB W 6+{CA;^ PAl+ k?$ocۛݛۋ("ۚvf<+ >F(Hjh*Le3^p`X~)Q.GA}V>VDaj^*Kn;*'܌IRAE&*GI=/JT8#_^fL3 0Ml|ㆂR[5iV Y=hF`dAy9)ǜ=ϯwB%֟ߠ^8|b'9#њtu@�7o^{>�㌥+j1()JEYt=O]ƒN�+~U8q옞~]zsΆ#2MJ?WU=U� z#h5\k5ffڕ< 7m~:Mt0R!=ۛ�˼o8Dfw]1Ҭ�]Z;.>Qȟӿ%Cc*I}H{.{OΑ-PJDæ-v$u ;�tDO ltRsȓSgviLj\G!MLZ}DߪUK ,DnT*(:>ĜqJ)P( = Frlܪ6�_y". e`7Z+UOcr#h̏_Jf:s[,(<�T.ݹe56j*g~!'a’"HH&&;xj�M3�Kgn腨X Su s +0M-ַx?WV_]鯨~s> / =Ͷe#�>>snXqH$u>27ªT\c yE{ R9bqŃ 8OF,ȈҪxF7T/I[bԯJWE99b-sv9$B#K3zyA QAvFnaiZ6IDžܤ"  RT3ӳ4RX$jO1ycj7E.ABWYPpʉ3j*YzF: "ysqq֕.K,?I}(Բpf+qC뇤m|">WW,tFf�kҠnX60Ԧ?RHZ8 #c4 %f?x8�$ 8y||SE~ 1 KS1+-%S'?d%~*Υ@R)Ȥ^AB'JQf|~U42Z$�!-J*;X��~f<ў@E~V]*?e �B2CWSU~?q�L!uJ꼨Os{|̴+<kT%?;#C@r68V/p_}usR!צ%)$)9660eOC0/@blfS.附Fo.#˿tSP[^`g& @ ~#b+?`]=,~/D_:cޗϞհ rSF Q}?DyߞǭiS?%)~*$>jBz{/N(C jw/{'kiܦo{j|;Ŭ9xKԋyŹ�@ q9͜@~'|&~"?_@ h4@ @ ̀&!G @ @ :@ h@ @ @T (Α/%DI)|⢜шì[ǭ E~(%7RBr%boX}vF{@ TDq,I_&$d I&77>%KFKgEy.ܸCAKNzpeݑń>|){fddVڎo!�$?yS\O&IT~U_%2 :ه���FcwmRK_3}fLy8AMaC:6I:8g+Vw:3]4;0Kwqn8)o"sr>tpm]}M*97M~叏7x 4*ڸ"�ZVӆ /^?Tۏ8; Oʕ~.?Ү)_J }F5UiYXWo.~Yςϋ `__]@u<\3mFJ#h4Dڥ{yi>4YŁ^_LϚ�|-?m[=N BQ BХn V:~-?q5Zyixbm+Y4Gkŏ#^ a93-ςF/9<DGQ;"?\UļgÇ{W4*̩wdw:T�9ad2Lo=vǍt;v<\\E-EV4eyIW'[ônSw\W^6oo�J@�BͺNME`o6KgiaaC4a=n+BDžhMU^G{xOlffܱa崲GZr:g_̹mre`[__]@"}T:Eq"G;=ΔYqW.֯*=>�nT\+l춭aSaz%D%'.{OYLj5L3�-*tV3jxJ^ 3 ^&^Q_}]*wˆXJ@]^ZҚ&n{ؤs.lϛ )Sg.z )zb/hUN*Z]z4gTa1di�!IBONշ֡`9Y4C:VqՂ_'薟 ŦUfj.*P2 �24QQ\[k4h|S#�hٲɺ8Qzh唺NW(bUß|Aikш%:]-8�\p9gտnɍnۇ<O*::78.1 hWi|+G ;QI+Aj3uBiq^kE.˔ꚰ/dzX1�0qV_f'Ɇ4Ӗ*-W.1bӜ3F41y!303x0[}8lrTZ"oڴ{ƪRqz̆VƩ֢ޛ\4_]@ߢ|<8~q%WrW2^b^N!fbRrUWua gzsN3)E:KeY:�twkkɢ(Ÿ޹spp?fp;S*  HeZJަ;5 Cb)PÙ掾\vi-}#� 堻9mGC_-Zzxt=&ݣwcV|(^�>O�N≨O\qC0ΨGRhM6g~xri*7jE t:qQG ?OS2�� N=ϢMn;"K@xѣdIK[]C m@|}@԰}VN4ig"3 �]a�!+:�""*IKqf4�yo 9VnW]EEՕ{(�nYp*(0 O?ރ|BOe"E-X:�}qz&>4H>+WjSW].z<aH+,ۯ]>>cC6qs?%<Jփ_Dl IqiDC �_b X 2Fj>+_2BBMJZb7S9�@7EW+`d?ൿ\ #pn[+ oEH}BvlЄĻ^2�٢PL?/9qH�)wO vif[__|+WV�nSW^{Y@5c<|-kE%(OOS�\x6�vwO6Tϒ D O߉Iu_?l1& =9Xiqc ƞ xQ Ӷ)OHyWo͌́VDt[,KIrNOOjzlf[G/ޛ{u.pukt{Ik ;4c_Y �x%o/2ViO,hdOHwX46鮮ԀIw$t^_JƝLJLߞ4SI\eF#, �1xsD E㯺hv}oؒO3j5z&Gqګ>âLXӠ*%H+w,,Cu!zX2}~?ȭyݬY#;h뫏 g#^|s.E^�T0ś^3Q8yMZ/)~«~c;LϫS=* =K'Y:ۋ+ C:P3CCuЃ+iQ]=:ux)*k/ J�/D&a b~QN̜0}Isb[m-}/Ku_jG{OD9ɳvu]Si&LڮiaE%s.BuHG-z`#o\(X|ȷM{Mh}Ǧe�sW{;<8l}o{<-X oE'��cR~5$$lק*�xvZT�M{1 �"~Υ\"{ Mti1l4X,.}9b+fdc!a酉g>>GqՅnb /\Cl \,oٽDc=o1sDžT�ZBS-l2/]Ra1D~wSYO%v1 ]p *)/cOFY*/ [3]r[ѧ nOҌ[Y}8]l+g,[5Q̺%<-wDZ̻^ Bcvʦ�A "oAb%rWcmor{޽V"|EQ-Id\a?ƪZ rBspQӱts�)aTWf A]WW{ Fyrbwi=BHcdznYDZLHn;{55zۋ/yL=\2@s_̽"a"as>4oЀ�՟a}ʤrzc$fXͲh޶w?G'ʎGr/%dщ[t=G_ E"uC֗'DۂsW8t⅗G(9|{GugfצUtEA&[֙wεaw:%WCϛǙ/Esf��Xu0bW.|ή� e'%A WJ(O@0h[2hic93TX[ñA̝ߚЂFZEoYg:'A%@:۟M;pk]iv{R}NuM"_Zs'Ms9o9wߵ�-6}A#oM˖~>?>ovD 52vŐ?&15g) @|U28[HɉJ떱�P;s�X �Yk،P٨k&Ǥ~l:�i!Y�(4Vv{˂A wlvY|OiW�L󦒢U^W1j|}sb �z0�6b޽�h1sj:�@,l1jIH{ m>�Cl^D\$|FfnM]>܀J�.S̨uʉ۵jba= o?aF�x/�p8$ Yȶumb�78g^z삏� AiBlzT�h1|�ח U@f5&1�cm{C�УqBȽ7ͺ?�MwBD3!|\W,H>}5RyRr{:  �eh{~B�u'8dwjR:XT W\k~j?EN[7U3'N9%iVy«Z@XHhR<,zv� y|^nf2f&5ʭd;^^ �HT9APVbZ��lu,[9JӴvn(K7n\C!K__Q&u>n0=W$1 �M;Lt) Z�]-SvJV~ҳkm^ͧoZ4̬NƸtשu~8Ʒpd �=z>:P��P+� /EeFCSI�eTOk\̄%kiqgf IέmHkkq_]0}sg5 <j =ja3%y$* ?⧔/;AF׾OYi fH*(_39V-ۛIk ءk})D~v%cq YOxߡ4UNo;#ib^,S0‰/%� ~#\Ѝ6(/Mu="д̒gRu}VݠիϜ޷%~^sl 񇣥׆A:<9Y؅Iys9[G$5m/ۊa?0� E�70e .Qߺǂ*/qDVrI�+ EM|/0ޖ]q_ ՠF$!X5&1;�h5w$:Zj\ iB_UTԟ$*ܽ+57|l=6?=堁S?6dKf9~F |,t<Rq*ט#,=Pf9TUjr+_x-ÈRR0(,J>^)դ]*h{Ң]~c#Ka]_k~13`aߙ&I?g;�v#8 OwoΨNVX|?Qe/g9ܻ}Ƿ'.>g2U!��f:Pb�h*,8*�}آ+�޼-zoԶ}Kװ\)'-�p#uPB j4fȠ19޸Y>7`RR1.[' Ed[Dd|TPF�>^2L-,ݥUw<hKZ$|]wj#�d<u”Lr�2^{HHTfFYo:3)':WMb?+hB%1מ#]{,rpE\.kb}hn]%,<G(`pwv a2$Pb#aj֗T$%_ZU#1S0tM~;7֔YM-dv\sz*,ԟ$>Xb3�dŘY$uןg1㑊W)"Ny�b �Ht�(�d�(~uߊ_v-id�>PJϊ:}f>13)�(O{3MQ3�F}AX� Ӟ�IKңs394C f)Y{W;y1gO00]V'Maik6׸'wo^,b=o‚�.'B3� nf� �t,mmf �I�>?5ǟ0w=2~vm ׮g}oz袘EߠF_h7qI�0w\g@ˌ%p%.&ԣ15e7�@³Zv@frj^uYtiGd�DJj.6uӧ'Z$![K�AjHgU ��{|-C@˰#yկ� ';,ԫ+LYp\ �_]7dߊR�(|sNr?˗>! \7+�CC; @ (X4jӭE'Qx*ּzO}OXZUeh2q03vFi @gAµɥ>>9b5{՘{z=pW8w Ubw#ۺ33Wv5:w6,. 1%-otvDZc7ׯS~F Qv<Re*N@2h`��1%/eE>cKL�&ꎿ뫫,c� pA=Vݗk`fbkb34n;qQ/Nݴ5330{?3Pp}E0,kO^GD\V/̢C2DfQׄUaKVq5,uVQn3w"N]Y>aږO]}#huiMG[23/:x`ޣ\j(W �q|We@ާ"�8q �0N3/DD_]L5hte޸ӯn-}M'pα(+KLGgdY7ƍ-+rԳ9bi̩H+֭a_#{0R!KZ7Q0c΅+ָǘ3)Cϭ*U|T۫O]6s'qֹYy37c"|{oqц ǻtNm=}ZxN\V;5�*Bgwh?Innu��׍d{Y=dC|�4~G3/^\N)7EEUGSI|7,me�n_k)3;4h"~V$GA}V>VDaj^�@t3r`ԶM*;z!* T~2UX�L[ohŹN}jH&�l-o9Qb>4*yMs9}B#vlLU4@1'uRAXqv!%[Ք N_DKyeJ^Rnz Cw-={~+=ē>04ӟ~TeǦU˼o8Dfw]1Ҍ@{"[G /0MG/qĥ퀎u_wa K6<0{.\lw>?+(LوNv]@县JW_=e"X40_h+\W%z*W}.jdGʬ}dV5G ? �4m3@~3ݟDsg~/=** ( ) f5gQJD *bӨMЮ揟`*g~!'a’"HH&&;xj�M3fM^t|4lj"M2&|$ɱqd �8 f[[y2�_y". e`7Zolp}Klo(h=q ˫GH~>jv,O?Tq,NR&Y:F"H&٘ꨬVɩ27GC.&eYX.Tpge?żF9RitF*խ0+#X+1 爵l,2 ,"'DiUL4#gfZe>ggKilKBe.]Ѻ#�$4CTJ`d �q�E¼NQLJ+QJknMQnK*bdrI_ f-[%D�Fkl2<9rQ�kֿ9kqH-O7:%tf#~c:N`ת?+mgŦu{�e^1xJƣ 2_3 G*K?'990T~k\ئcbz%;1V{5'3>^Vmگ["';PL47+YSS #5s_m`?jYs!r84Cs}$%gR?'W(~#23 mC320#i41?;#C@r6QkMA^g[/#śvnkϾ_ZL4rQ hDM?`]=,*Y\X"<oσ㲕1 [gLrٳk 7CVFjT]Ԕ_N@#��$O6(f ^ߊ^<E eД?V?8cx{y|nmw@ ?k'wY_5 s?RML]^-lگehbw@}8fF*$4t0 kLnL#%B%8@3@ lK@ @ @T(@ @ @ jL@gs$?87g8e2SS9rKx@ @ @(a?`&yg7A{)۠96";jDЕ.j|u!Qy]~m&hYoj_"sr>tpmJY$0"@ 4L4q6r@ 5̟&ӴX,1�\=z=н6 �J}<|ۙD!^$�HOB(Wc p֣=m<7aK|eoV}+f6�cG</_>|[-Ge==>R@  .h KpDj;VF w>t𡃭h~32y>BɫCq+om?P({, ?7X9+@Xii|N^aN<K1ti)P*Ic=ՕI4-ƲR^\1bĦ9gΌhbҰ{ogOT(!�0'KHTR_܊Dڵ6Dh5xΗ( @ @ ^(YVאg[k_; @[s-+`5 𳢓@\am`L/HnZ4R>o0r܆5DfBB|YD?#q)B֌V$'5ok)YU ۙ˲ddmkRc.D.UgTk&uTWZ*)��̔FԦ^ Y5aBuZ+tZIm1mcNC{Jr6UQatei?tϮEf4�p]Zx>ÐVY_|ae3ISZy>Q@A @ @ Rs wQ #rH'i&-Mti1l� xJڨ;Z! _r=�ӗ/=5!!Μ6`>u%9O<ց[2rX7߲{ѕr{ZbA ti6lt] �n{&V= #׫[75+WׂL7Em=ՔJeQtUS;4PLm{ ;1c2 |Cš Ϻ/}|�bđoyM �&^.,�ұ+=ĶRӴ=\2@sP@ @ Z&x{jc.[O8 �yY0Ȁ:t6<�1 vxbou{Yğ| �EY\�F1W…R9떱(�FA�sl�@p�[\ >}Ivľä!:Th۹XXV۷ssk +VWOuk?0T{SAlIUKH t�`7}RE><Md ctng}_EZpg01GE} @ @ 5Bھ&_ZAOÙKR$�  =^:� zOc5$_JLRI� t˯H�?c7h*3mɮ߶ܹcjƠJ X Hc/F1�w{zMSe/ D@Z2?:mGby$-]]K#~nH@ @ @Fo *~Cq퍛~&F[ӲtCk�YpqE~Q skϑEY_[heM_]=5Cu{+gH z7dXSfu۪cwܻw[E3H|םZy ň�fVu߄gyF( @ @ ?AɃ՛t$�`v;w �@gwrcez#M�X)ξ�vֲrBH�iNBճt3Hţ{n5~kS>}zqx"̈́H BL>�$Ԑ*|Nl @ @ 5:L3G+mزcw.^lK:d}z tib~kc̡̙VFQ\Ux5QZth7~񞟸tՀmT9z1ޔ þ 8 FaS0�hր}fLT$o :.0UI}0 z񜸠vj*ߥ$l >F(Hjh*~|oNa ( @ @ ?%|||^:*8HH +sIDt#2 8N(@|83=[Jc[٫maROw| ..ٿjoA{?\f*Ji6*O7:Q4A *r 1פA]@ j˼Oc\@ D; m_מ}Q#E\V^cS4>4rO' fնoמ5yD_:cޗ/3@ @ !?7]iBA|ɝbj7^gZu{tz1O8ii@ ?h<@ ~nO|*iV󶴛75(@ W`y@  �@ @ @ J@#@ @ Z@KpN vZ$W吭,Q! !JMϕ$)F?~pAh7#5,y9y�hN��.}lƎZ9ˤb7Uq=? OLѦsP·<k2ɩ&iqA| W\Z: !n[^C1 )@RjDZ)FVfVJo-$[%zVU#:sG% GO>.n97"=V<SeuUI)K ٷMWBq$Xҥ;CcmϺ׹ \}@ 83yD5 |_'nkެ oɏ?ٟ=~w |JE��H -f͛7Tᖞnx&G!#ot=t^�o� ?f}]a//D 6zʻǧZF=zv׆5q'VWz߫gw@?^uӃ²� *xJ.U^3_=݌J5 1ƇPϟUᇰ~-ߪ1LQ1L4qvw_J( t,tݙ'RD=|ضU}bIO1_o?lSI;XTWQyA㎮V<:U2 _ۤJyO\ͅ~*S~#sۉ|1Ωie+t۷W3yφuϷIt=krS>"xX漤ƭaZ7od;WFV^A>G D)bQ/_44c0yH#*Lg谘:,W^T =;j[dMy?u} *+cߜc6M߰pu|lvq+[OO_䢥!k g7Dw]Ղv ,L ]a[>^ :Ȝ)HGG{xOeȯV?Q͵ѩ~j[, \ۤ|sޜ 9N?qW?GZrV .V<ڍw9+"xm,|lݶ);ߊ>:db*CM]%ZnG7 7 9!-<{�CIOAg?*ʗ>~äԈ^m/- U9w}N*IL}rCb>8Q] B]ΥD/ҝ\g).eP X4�ld t5~A[1MHB=Cvl-C@ !{�Mӯ Dƌ#۔ wK{mwFP:/ o}aw�#zv.eo'j>ӧ3ߧiטJ+_>dlUC:+ɤdqݔܡQa]t'^=yaF̡^!OUTèAk��ϜAi>M+셋>$Ke3y|eypIZ5yD_7ioOrr^d7*~0C{12%`\m -[2m-U1ӱHS-$,*Y^-Hh,6u8%vl1۷WӤ´_ocK]*@G7SW_ﺣrQ(cĈMs<Px^O@T~\{gEFhrrG%jUֆ6-=83w̓90�=QۤљH�6hCyB.R)&vuƎbM'`ZnsG@AwsڎQG*oDR}ݕğk˒f m@woJ[9:OьJBr9av>?y! �_;|e*sֿk=v%ŰkM��#t_nF�+ϓ M'lKƀ3>IQn|RQ)+@.}DгzO܈z9K@883)�sI�@I<+3yHVj.ME%-mu )|�m3[Q[|_xN6ۙ˲ddmk)cdD<l�l?xȊN�1v3pZ!mYCd g$[ĥ8 Y3Z3}yɓ}.{6bA \?% KeZ'n .6-yUT ݥ[3 i٘e'R0�6pIWsy:MZdF#@%E|�D@ o@⹣$LHN4n`?{ѨupIAK�@ak?|f܇E%Rqn.�i�PޅKo~P̙^<Hu%W> (Τ[2`jaZk.4v ZNӇvz{b�~₎MzpQWvӢ(*WW23aNF:rux`OB>yʽKI׶.|3/wڱkau`U a� ,pl)8'77klg˟ 3ErxrsƶϨZӇ5(ŰnFki.̪"^͇2 k۪v8n}!O+,\3`�>qaHú,�AlieWŐ3 z[#iDQN8==ΪMT}%#_s tm`I%U~c?W^%YQn}S"3,ކ=q P%gDao:̮w *VXYv,dzoޑ@Ry�P¸o.zqDBy厞,E!ЏB_RxFrރ᫷o)'FX_\(6^oxmb*AnZ944QQ. =j+�g@'l4/>vW+zRYefsׄ+S�PgqE~ڳ^r'(mYFzW&A#. QI,H@ j9fX:F\=0lO.R .-<u\qD [3]r[K^ <|!eA 'py �.ɍyZߊN�*֮M] ZaqJo 0ruSzu-tS wUq9 8ts=v�X|ȷM{Mh}ǦeEKi:dTj/CT>q(8᳟7qqּm(6-4avLslϧ>Sl0�i7>t|1sʺKw7>Z�2g6 Ǔ(YɤwcӞmd U$%3pt_q&ъm1Lh==Htހχ1yɲ:WqeYcQ?ϜxͯMJZ ͽPf�$pi1-ϜiǴ{<I%lk%b]u5gCӛN wwJ"M Y!'++ '<y Ph:o ?^FfY4oۀ �:aka{nckBj_= Nkƪkr.ߺp̈́0c�0֛teK3-�%/=�g&ؠKUWC+h"I7kmx|{I$߼Œ*6mͬ4CUQU\-{gj2l׫'z*9G?kc V.}{ TL7NJem4Vݨ3̨إ>_O:qi歽"e' C3QE߂~M?(F&cO ;Ϸ5+۽f?Q;x8y׫C:~sC6ϟ{r׳1|jQ ,/GOErt%zbyƲUcŬ[$z@>fq&c$xqٴ|ukB};@ K@k bHK} D _ʗ4jnr"vwTBR50!�`1Kz  >Kp2�j~%W{]g;"S#k+QF|־ۇwbqvuWadzM`� 憹90V"OS:ܹJ{ m>�Cl^b}Q0G�e%(L=-9ڄFv^C7x Ӵ�i6@ۘpiח4p8,*..TN} Rf4�p�˗N/Ld�TZSuiyKEOfx �RQ&�%3F57O^ŭ]ukJ-ro+G ,7Nױlby_>` [u�& Lq<>) �v3 �]MYbddeϮF~esmއKy 9ƿ�(Qn}Eۭ*z<r$KɢmI��0V^ݏ WOe%:d�B5R~P~v|}�Dћ<]s�0 \~c3v#./IH4ṶB*"KIr9k]2&lЫj|q4�Wk[oy 4Cun?W^YIejKm(W? p5Zt)PW ��r�@۴lNOG|<#J)k˵wswdmf4ԣ@� H$ Ybr} ac܊Y:Ժn_H.!Ƭet# &>,Ћ^]�\�"f'<kҵsp+CW']&F�P.<|I!_O�MZ|ܴaz �I۩8W�2^+qjv hھ&_ZX2$Q#e9>\xQxAWi9oKvk}%jt4V0I" e}Na;w ;5/5.kHWwuhF;�7wI}pzۑXIKE揫d"QI %�@*F[Vӕ/>(E*�̛|�~$@h�de�vwGjS|\�2T]�,�6ZXCm}:�M{<'Ϗz6?=2&ÚkNyU k& .< . ^ݮAkqm8[[1}lfxlz1t/3Tu 8xP&\{|ڵ ]Vzmڸjk@e1s .�$WW_HYt/(cHJ"Sjޮh[3 )bܪ0$֡,i]Q&k5j� *`d[F:*+?4qekC(x ri� >+iSv~�+wf9z:yno,.;Ύ=u<݊~M-=.swoO\|vadqӲc6Os<+U[�(�&̬eW T"GFn&�Ϋ'�vgc+;&{{}i1�e.@T5zfȠ19޸Y>7`Rkϑ=Ge}9nMG5mq =ŦZ/%F.#P:`ar_(S٭|Y䌓(0HufԈuVq1b�@Y'3E,HT>( !�p�$QumX-^x :�1� 9�R�QkCbi R$4ӓgKZSH�<ņaZF=W,-y֘^ 6ץ@RL0n(7dXj-t3D0o+Mmg'ݲwG ؆Q6)zJH9U$qVvZ:U{% 3�ٗEE 5 @,Hpre^t�H{b?.f . g:@Qn\.ɼIe6n:ɼvwj?5FA#kC³<#?e_ Ӱ b}�q1FMA:@C�(L{�&-Id-*Iݓ*s&: S �>qټaKfVnBVT};TµH^k\ₓ7rW` +O!lAoiBna1Lö[<N)XT~OJTql:L�ޝ\7+&!%�PL�0c]jM}:l�0 ;ŝ;WgBho<W�Lv:P᳖KJ\Ĺ"�X)ξ�vֲw0͕L6 ^}+!� 띹k"ԗn-}:�H!2H||+�H%E}QG �xio^d ݝr_\Dԙb4ә]ew|̃k#D]23GT(,P"2wա'nZ4v Y6~zY ED $<BG 0]Qr[9W(R`̛wdx奿~Q � $W/�- E-6@*"԰/~#6O3�hoF͘3�Xv�@RRLb9i� )^LS;yRzUb1c!mg rݣ w{swp;GOeqSV��gĝwY{=/$,K#VǤt3]:v.j85)`1fZE1k܉8ytr"ROFN{�2H*x!E+w?PB�.Κ Ӷ~ꃸxD뮫 _�Osfʽ{<1Yk^s\uǎlz_,UoT$> 򿾺uDek2{; =⪲ @ UB>�$}h,'°xс=B Ux5QZt6uѝ>r' #u}Xs 51L~ soU y+YRP3X]:B|B�~G3/^DàOω j]Z@R1uf-nAj!Q}@ Rjh!CNv$ �7o^{>�㌥+j1(R!��btԑA2Z6U~U|�pf`w|hMh�Voٰ٣qAwsR[{>�hVc/mMQFqޥ5[ZJZ| \7 !]kflƉwflǒ&f-D �ugL]ga ,n+*LQ6`/b9UI/,d6+c D|@a}/*h܍ 1}Wq՘Uٵ P�NwwVoiE-]ِCq=:ݽ�k7`rF5`%[$a6pӦ�`6L[gM(t8 hm&muճVeye눪_XʑT?jj*��Ovo?ǾSvEqk[(�HQQ1AaMY09�Vy? 9y$ HA*W&ʡ/$ޜZ%cww|_ws8'Qkٛх -xhC@;o<~5h�t&͙܊y7n^#s/ x~iq 3wBT,Ae5\9T=Z<v޺{$ўˏlQM>{ظUm2HԽⷀ%|||^:8N`Kn)U--u*lfgqXFFrWxF7TGcEL:m:l'_Mri1TV7QAvFnaiʻY1X aBO(44|\Q#h�xM-峮Y)YE$[[ Y\ z eZ~b÷LN�KqDI~) 9mdaX>$*Nϗi!?;+,,M(*WW"2kզa+q 4x5s23y@1'kaZfNձ6Rr=)"ޤٙ9<<3m"EeWj%]Hl#SOw| ..򕜭rpsR!צSE՜Ydd@?^ݽ;np@aK]?.RL&~>j*CR6>Gh&˼OcN(561ԡ�@*Lk~V_6eSBIeW6q�7.#KYxl�$<'q^v ܜ,h>yc3#*?Y*S"&f LM -_Ru j؅@ jśvH]{s7AƵh m㊅:&VraRji$#Q$D׵3kl+o~QE֮V"4[%VwtMuRSUQif3NЮ=,(y~>o{lढ=;KkQjWiUN1sp�\ ,}V|䳚~u/7E_@l�2ڲ:%үc_ب􎯲"oֳikB}~ْG& ~Ҵm Ȉ]uT4B*ѓŮmPί؅@ jM@i J;G/<k[5G Ŀ ;l -C3 :56rUWœτXT}s|!_Gtz1O8ii5il'(11 j ]%*p?epE@ӡOh) @U=Kp Od @ @ dKp "@ @ %@ @ Q-$?=N WU)j_B*LO{iBœS:_$<1:AɂgjZzzf .ꓛwI_&$d d~V>G @ ğ1=Iqѓ<>6\̹y1ԥBџ- U}L� Y+_߾pi֩ooߤ&D^6hh$}pξnʾ"zҝ|ܡ[6N؟jF3/CE||oں=tm_.bmdG^:жl?o~ ^9tuCu "��L6=ĴGM\uz-Zzf6vuexON�,3WU,χ$U㒗τ-4aQU֯ŕ[5IW5GfsLDG4 {y͛5_WJxGRMZ[Ho?;ǀQzǭ]7qO#߁+1+pOyj#W Q3ND(,9u\c߾:(M{6|fg}9u(5n~L])/qkrپ9z\,\mJ rۙU32 |bm5پ}<ȀaN a L"2?ھGhOaqg� ٦&җ&L5+.|qG####}Ӽ&-IT Qq2|-Gm~7#^u&,ӴQG E_|"zD5ܛuzݞ]W XZ:}8Sot f�h<� (!; 3#z(2s| ˝U:җb>8Qe3D|!E[.gD/i2J*L5G7գm?sJf8r *D,biF�вeu/pB,?~A[>N1I]֚Sru(XaNЄiEBHy"O=__~ff,%Hy3tp$t}yFż\!̔t-3s]fZ^9/7kjE$'3̸B4*IE ~{6gL>YXOiŠe/.1bӜ3F4)e oޞ~bڪWZqC>��_cބc׭y^x%qI8PQv 7xmZ=zVcٻ7�hΞ~] j4fd٦w_ǜ\ڻh0\+0´Ց|ghxgQey �e;ڹur<z7N\|Rh^G_c*I|aS1oVzPfqݔܡQa]t%^=yaF̡^!OWT:s+xZ!/?3nƛu$sii8yyB#CYSD{n eЙ\~ʇqW @ ğC% Q!϶ wpfk ~kiqІV?^Yۙ˲ddmk)cdD<l�l?xȊN�1v3pZ!mYCdn'D?ETl=0(dh1`'O-λ<|RوMvyb>M7:^xpG2\T?% KeZBBMdbYwVn=0gc.`H[am`L/HnZ4Rh}qz&>4H>+WjSv!pݛNOFN[2RU"٫0cɉi_-]mF# ת~3>6�EYG봋H]hFMIxn^]~|xL3:?Tk@Uf4�o%_S9IOQs i^Ã~7gY5ՆFF^d�|<Ӹ{B.;zZS̹7n Z,~7iA}k*q"=/=|ެ ~ثmd�{1se?wZL[ZI%Rޓ3>=`٠Lrk`/�$Vg&:Rr モ80~ Q[T4v2Sshʭ(*BQ\4y3WlfD� Q؛N-kĂ'p<q�$;Jt,d A6]�ûW [7 D_�vçOn} YUfn.�i�PޅKo~P̙^<Hu%W> (Τ[2`jaZk.4v ZNӇvz{b�~₎MzpQWvӢ(*WW"utqI+o�=ˊޚX6RiA);O60ugm AIS8+?rLZl w$tnx:mik_<Ή;na /Z@ Ej.]saC:jaC6~"%SgΕ잛QZnPoމ0KKEڰ5u>/'�HdÇORVKԐpgNw^�@mE@d�xYk�ү䮌<[qB@щE:zu&yZ馕-.CN9 8ts=vUl/]IyGk $|]n5ק&u_5 ]{.8bs'"+Wm5 .0mNNz=FmQ{~T�f{U%hY-B~@4dщ[t=G_ �TjՖ>���IDATDљ=zroa (cjvBJg��"Q\Ri=^AXzso.�KoVHEz E>vˊ&ZeRDBgmBwG[Ht$+I@$)9g}6FiQU}=杏x 8QK^�j "=A@H~ƛc<>ȏ�%OܓU٣0*P!L(>+_XK_h{՘C9WŖV*YgvnsBvmǔ 1|3�vCS;twレ.��O!sk0}<b0{SwcӞmd U$%3pt_q&ъm1Lh==Htހχ1yɲ:WqeYcQϳ_i>ǧ(Fuum)uu0*_eHQg_f{YNzm^߉J"0 OTn]~lҴT9CǁW6$4h  Źwߦ깜7ޜ]ػZk]g@ Өy-Z&x{jc.[OW}��X U,Qs딋?.w4-SqD+(ʊ/�0%.n0\@�0j~®3۽ .фJU[2RsT,%�obbY5nͭr$|F?P˨9  yy ss+===OL-n//|1�4o*)7pclE $�Яq(_4�2bi`ij%?ZS{O3Wz@{'}WY=;J쬬c3K7Q]a�m8g�<Z�49s4EWχVE^O+[=/fP0sh{�yM; �P6K|*-y9ĭ�{ouxያݫw_I}uNZTƍ6jܨA#ZڧEJ/Eq~[/ٵ،J8*b\R)fN\rDZ p5t)B9B�exUz4[,9ڄFy Q��0SI�ۘ�%:{N}Rfׅi�2zE|0%2k=�PukՊ%Z,=5cY;g�@\�F͓G3ʺ5%k G TaUbSx^mWKWVY%'7ӔF�FXiܓPukS[kWecޭ"=9=z�P!3�.zل@ @ (jv hھ&_ZX2$Q#e9>\xQxAWi9oKvk}ML)_ӄ A{5'LRInt+:f;w ;5/5.kH_ٲL[&/."܂[4}# [MNo;#ib^h8rVu��k~»iHE84-%I+W5R,˖7Yդv`7=:4pI S'z0'_cgn' Bnß?n",xOe Bԝt(k˦6k2+P$:FH � >R~<ѲԪT' Ƶ^<N]e 6m^˰{[+� !{GYo' ;2nɑ.'+:Ł=a==1|Mg%V8ey)!+ceąb PӋ|�Kn�B@ �Hd -Kw�佛=D[r=S|\�2GX��e�ȴyP[�fnCvc{$O-/Gb^bSr^8 ,<$*S?-˗TT ��J䇘�{1�ل@ @ (j4fȠ19޸Y>7`VW1מ#]{,rpE\.k" @{Cnh-⿔P$3JU1cVgr{rU[rCOft �ANLٺSm3Hu.DwݩB\�o[+K[boqEZu{c־{h=:WMګ-id�|&uz\-\(eڲxO;sѣL�H3VR5rJa,?KB@eNR*B1Ǭ”7ƻEh{EUY*YlYj, 1o{'k1�Vm>, x:pӡN5IɌYXǾ0$dE痒8@onV80!UmϩO RGO$<3嶫B �� .Hڰ,[<M:@Au�0nc �QA@s��ֆ�ŕY?ɧ2ْͭ�<OrbXQKK~u�o.;}A!9rg-GYI B 0Z]*Ef FhJSWOں\Cԧk7t9�ׇ\� �-M܌ ?�&@ GQ7qI�0w\g Iࢽ\�0M@jXN WB"y�2hLMYu �춳+=퀩Oh&tDWv[B$E3ld͂vWJ�zgH�n-}:�H!U^:+{uY~7"C]N+)?(zL8Q,7UD \c*j�pQgkZZ^g&KNo*;ɠ �T^_{33�|Z}=[b�@ؗ;!^@ʹu== *ԓe݈x9[�_g p}b;yAl�2G7;lSAµ+2zz=p'R^ԛ<gWxH\U 0/j)}J/%qlh[ETKc}̶-X@\dOI/D�lo3YAow'W;=ubX2tfWsY&ypmpęȣ ]&Qt&R c%J_&:tM.Ca֛ ƕ¯^o<? $(}yG]cFwУ+*WWN%Fy$GK1@q@ pgokI�`{W ➺zz)sMG[23/:x`ޣܒwW['"/y@u4@ 5jt4fVƍ-5raW_s@!l @Ԫ[Sʚ(L-kz}] N9ܓZYҺ>Fbعps&?sշQҪ넅*_Lc OiTmm?okf#ۙSh��AOV14NM廴2Pb/�6֏dn#M',@�܌IRAE&jn_k)3;4h"Or#_X[$Z5{4TwV|Olw\7m :(_/8ڝ^yѾv2ƻ9⌯fcb~#Oe5BZ-\s[J`^K벿|+$6<^Pk7ly`Ngn]9PZq% ccoy(ȏ1@4l٢AmG"kQǰmTOfX{9ﴧH|W6|SSHm{N2\rP#[9Skա- zp_BV>E\>j(N7Ԯ:"O;vm׺R\0 #1vܾK~|5ujВFSaVYUDŸ<ɰ6ki˧o YdHQd<#?Bjh!CNv$ �7o^{>�㌥+j1(R!��btԑA2Z6URA�k 6>y֤�0h O=Gd~7)(k5ffTPXe^s&:Ԑ핌:(οZNjyުnO ycz6]ן9êTȌ+0M-ַx?WV,_y". e`7Z*z?@ @?%|||^:8N`K^*U--+|fgqXFFrIIDt#S1}t=UTkhtoQAvFnaiZ¬Tfci,GW'#O0̍d |ZF!*=7z̹@'=7*2UF*-J #g+W=6 BM4O建6Ltc{SN'˴D"PJҦ䯙bEWp(KalS{[ ϖ%>TωvN ޑ EIRtcK z*$|˳te;I_ f-[sj[_]{ΑXyvH)ʝ\iJ Pr~dyH$R1.S*资HDh,HPA�m|">ѱJSu7Z7s4^>dh쟆¬"KHI=k-?[&FҾBR\A ǩ',HNjYj{6&*Nϗi!?;+,,MZ;BQr['IK5!GqSBIg&~mYeP7UJ,L$ t~>Mb=>f@/|s]{Ec �n~{i7-d/BcNS jV5 ɂ[ΘƳgG5 UVtPF %)~ߟ㝣-Zd{<>YKN6};s^agB4>�ME3ٵcN]g�`aO7o?k'wY?.Q/g6XYwؐAZfP:]@=Kp O3@ +̀&!G @ @ :@ h@ @ @T e:#=#!V&.II˫ZԴԴt'{O~zO 'C^ ~_ m)=Y5!kBBPJ9)cL5/u 7Rt=@ O?;vpܾO|@0~p͘0pD?DAwB/CE||oںk _ !:?RAC#smvU/aK$zqjLO <Seʪn:6I/s6R2ҪtD7F[4SIm.|i)nCs]X_R̽e#�H]:W.ݛK{٧L*-G "Qy]~m]X^$$υ>ת߾6nhV咫| JY$~o_Ïj5umQl?o>gKp62G=jBzgG>_ᚉ&n4ծrǩ5*޽)߂Z=sڪ[>@ j?7iZ,b;~0RU+6oo݉yφϷIt=krsT<%]0nMӺy#7'WOqԀ}`Vv<\LA+;+�alcc-;lccYy8;}"((RKN@WT@N֣=m<'ŕ> 7:5*qdžul:jӪO>mCrU/GZrQ8KۙU32sh4eficcgO5Y؛v{ƾw__9r0<.t@c_zȇ@  .B8U}(ԢxW"W=V|@0!ѫ[V3huÇQ/(" WwlL/)G"~~W g-\!�BOK^(<.!r2L,':<zr&ʞK Xyέ:/ؼR˚/+H@e=KHII� sD~� ?7gW7ۙ-]8y\+W]E*fQӢ=j49jh'!Lϒ{ddTX1>ƭ| 7mweq2E@T?(cĈMsΜĨl:s cX׏+-H8ѳϜ1-++>W(<*v 7} Z~tnM6\hvQ7%~hDiVW?r[<c!k7tZ?o3nƛu!{ordz|E@T7,_>E"9⤢Nd<Rx.ݐ~Zn-r<:myW?r�m<|3iw>|5Y� ¶'vy}?(fX|@^(YVאg[k_;˔B[s-+`5 𳢓@\am`L/HnZ4tf%E|�%7`re>©@:dĤgkp\1v3pZ!mYC$LR߰ޝcr;fM'>cC6qs?%<a;l`=tٵȌF)cdD<l�l?xH7$pc.D.UgTk%B[G0,OoK+gҊ1kO0`JTdo6Ƙ61=%EYU*W�Hwp?'z$.aPȚ�yW8hC+2]r7SrӖvTUHEXreAWvKGWH‚ߌ͠�@Q:"?Fi6b̫p7vaۧt{3y6WbCdǪck{3cWK 'kSޓ3>=`٠ٿ Y5aŽ..iEy|R�³gEN=Wv/zwb>{||?~z~I2O4mΩ?(7|Nn-?ڠu ;%Dao:̮w ZAm5kdYZrN驨]Mkh~)o`wmҧ+OB[zkf\fX"b^yun3}{.ӌO%~p>KGErIE_ݸh<Rrrϲ;Ydb̰؛F[5Ey�P¸o.zqDBy厞v�E!u#9fX:F\=0lO.LZ-)^cR�@ܕQwBgv{*\.nupg}0s_B$-WӤ_=e@HvJ+1})SNi6Sg(]NH.^v.ͷ^teܞַ9xBq;]Gm kB>6mg/+�<|!*XFWnjҝW`[nZIew{B7t1g痎]q!Jo/!YoHXs}zaY_Qg pInG"uVtLAy' f{,QnspG0o.>DU@<%i_躭;jϏJ>3�{/( ,mDϓLkuclہuo\mϐwtr u�@([V4ѲV."b<k@(ߞh Ҵ^]{;WКw>n#❃[:6G-4 ooyEϟg|lO}.*ηmmO"t 0Ly ZՋ(M%b�xwvͪ4Ny|жkr͕-']imոFcc,mV"JQ?+4!Ww[?t%Q"_raTWf A]WW{ æx^@ Exδ4YtV;]�<tDsה~yEH8(WGʮÕ@tm]n$ Z},M~Ꞷ,Qa6,��Xu0bW.|ΎfTu#2vśS[szg�˂A֡Y�yOfh%~K"lP݆;�n=IOoǻn~~q"b6�b0fI ��u�Z3il=f�I1^ �ɘ'"OS:ۙp_痖g I4Fqzb\X,۹pP.Gad.aŜܼ<憹9JTd/!-*b6biTR2?�P[v`�C?e&s 7�@vǽTHEjl�tϖdohN{?\XɅ)'sNl�$`KؿĞI}P̛YX3(9uν 4˶nmڴlӪ- @Ƚ7?;hAT+W9ŝr Ȍ̠a6ֽ!�QHJWfʠi}볫P0ӥt)/qvѳs?yȁKUj\?+[|^VmG$ۮnYVSI<@ n<gY`+򲳲w3K츊ȍJqx:\u#EzV{ڲ�c}|>Z\mfT�ɽ;�|RG#j084zID#R�w�đǾWkXGceKp(cit aGข4VW$El`]E*Oce^U~\w$(v/H4U<HOuI�*nJ}pzۑXIKE2=ًQ 5fm?E~^T_׾;Y5K$"~<'Pj&doeKIQGjR\;0ߛMDSt۔.aeYT?d̷)mDi }Uk@��0xPm|!�iӖ e@BrOgqDWAK! 0BIIǎvYlZj󾞻v/[%(?!M\X=w_kV{uv*pڪ.r^*B7UێNUϫ? ϿOf1܄7hEqRI< V_T�dڏiheAɒi� ~ۥv@D gdPooܬow0kd% /a/=$` UP2jFvo_GC EdEdC\ aJ�@"FHX^+C*Ɓ]Oa rg-,$N<b�~N+S:֏}ǽ{Ek=\TSk\a7}:JkkF@jݛԍs rY4 OJadEwDd<7RՄ] +�`-E6Fbe5v2oϏ|")A9+x10ͺCtyھDy,ȷ ̂EC\￴fzTjˌU_Ai<@ Ս=G=joa=\84W+GUuNrS/dJRH�Um#  aA:@C�(L{�&-Id-*I%/$%)D} @ aj4Soa�a)ܹ*>�ɍ:O~7"% 87_ �~sɲr9ͧvM<sWi5;.u\On  [Q[nA@,TBEPnx3<3;쳳i�ww�c>z4=^iXߊZDpB.[p�(N~l9�1uk-%�I$ד!'if--4 8i,wt,�ʲ?ȨQCʫ0mZjz.�$l`ƞ۫֞T.ظ�=iף5uӕ\|��.)Ytro$‚[*,Qyj/4P=PI݈ͧ_K?g]ipO %b~vow\vy|�P3H*-n{ _waքY= kYqၷ^l[˳mOK9i@ }9D �Bn浯Y8I8+4VG6h;F yy9[.^\}jХ9)T%}O2`Gm l@ Ŀo]Me4nsp_eαW M_ flhDp cn1mڥBbӭBE5Q3Кvd́Jϟ .s__&ؼdhu0 s[E*s0~6ol4KtRVX_)MT_0vD~ڎ-�]wۄ- l�&Qglemف )zַu͋w>b1^%z׌6 vm۪.}#T/?M�WKڱyHgC}bYE}M//Wxu!WoBk^#nCsaVrIQ4Ւ!E,{ygö= F==ad� $~bN>ma9vy؞Smk30 tX��x]<nFlm۳�`sK39I)Qׄ$%v3w9@=VtjoB ׯk \�IASfriJ.7mۮ/L.q <X uGNT~C'sG)&.v#Bm}8">wR7d[S? ߏu}O<ԱOC|!yqX8I4+2VG8o4|r(4\�дnG83g*4�幫ӁF12f @w@*J$"_AVg\*16Pj+G\^&f*3: J"P1ӯظYO;tnjaVfLA,�(jz*$7Dbd_yҜ!XVe Rߒyr^ uDէ�� 2J%FJ'_kbO$F[Uk|Yۚ\Шr2S2jv:UjV:TؙjV7Ɨ|CuE$lg*RNJҲaEO%߿rƝmsE ˉs0(#-[HvC(j@ R{;..K.Vҵ2֬rrݥrs#WMl vU닋JM$h|X,zJaP=<^?9~Tպ)-dZqG$d9+2G683KttUh� gm9rC3Cw(k6]SPyoj$q3*�DN\KwvV;Jk [8]ZP_h�C7>9~Ϋb">{yه_ T CQ/hmf[λ)@ޏKdpQ.ӧ*a+fGo Tz_Kŋ6Q3ۡLPEqo^q\uQT>{M @ ؍ow`4ICz+u)@K h@ @ ^+ђE@ @ @P�@ @ @ ? ?%|y_z!@ !g&2sg/sŸbe|MMNIINI拑HET?!1DZ_SY!BqaM3RI?&Xw_4oL=?_f:@ ~i 2ušwy9N'扚t4i@˿㣲?q?&JūV~ЬZΈ@ OLy`jE^7o]a>&?]C> oA:EG dagr2? mW  FzCSg|-DW+-,Ol;-+gm z6OR@yh,AC7g8v{=,(!WܿɎj2> m6k%y9KqBCə>sɹ?nzRWzLoL\Nt2C@ 6$9[VνY +a5//˸o>>*]xtarC2AUԣrb}gFwDI\8gƭ} BV@pa="$C2�p�s7V1bM]VR'y}7ڣ`֠ը1t�;| � oJ&m ΙJ$VGT.;Ewϟ蝘8BJk{�@dr1] u`b�ŝ xvDWJ vvwO,&XDsY&q=H%ܻa}M13&6RgD ĿD-iS0u-?:MKOR%߭;cSX,=kM(3o K`T/)Z*4iFGC�ݧUǹb\Z-gh&]>��(/mK!S�b4mZ1.XMC1WaQybuʕ"@ .>rm^huC9Yeu=:ę_3T _&8Βϯ| GVEYT{b+54YB5_}+dBb7|;rC k̘=K/>Brw#rE^9$^sw8D.nF?('Ɋ͠zb2_NT1bԥ;]~:zʺffxX?Y@A �>_ 8NԌt.;/lN{f�v_ZmVgq* &H=me`j?{z)�%]Vr9P˸tã[>~X&�N+W %1�/~(oeUZO@UsϿa3w-d� 4�^#ݭ_WcmzpdӦMM?<hO$]tM0vąU5Dc˖ebJ�6LZy^Xx}T&wp5�H9FmcRT�;t쵥/v^\;v5f?I t"}[ pNqV>JT"=Il^iEE-|WʧQji?M0A /)>k:Gڍµaoc6!򏼂GF/RV~"1M10nXZM.|:z&k%� 5e\ٰevtvPo~Yig&-8lMX 9ـA!D7c%S"ae \xpt+"-C$i7yJL;+0w>C H ?G'c3J25O "rd{Xn۳Kfc.tk&FS5�4_o%cn@.(.}g.?��WֵSh~Q"�4P~|QC[S1xudKn쫥t24 ~%b!͌ろNc`dӑCjw]Oi"~#V鴘}^C0g4MM9.��SPFU) ڲv]7m33 a@b zJ0mGǶ6q,2ZD ĿAԒG<xJAy}a͔WHI%7}Tz0[?vR1j۹& \8vOci2mC#9GD\n|0gk�EImt7He2o/?7q0$�EDt"}ۮa70;5цHOz ?%^e-΍d9ǞV0I@ ~;��|Gp׃.{_VELCZ5-}غv朚tCkNۛs+ㆮ:#U}d i:%!4lƒ[3YHi;܆$&/=dYAkwt kX1|&gdY~H-mVݱH T&<>$g,}k'{;/Gv7r=t1juRiTM7{Veh5al,i5dӞ oz�di4%[U�d+6S@YN2O$(]png@t*0*AqT�PR\r=�2y$�ąfՊF �h9a�-�coqIW\5Q]O) c[�esM�H㋉=z"hCG3�ə ᦽzVܻoͪ><{S?!GXI�jBsi:α/?fk*O/2LQ]g �c fONJS& (b(DOn5� 'A o@.�cWX)Fp<VC�^'7yQ*l<lƚLs!$x]s0-h�4ڹv[nBBQ:xPkuuCT1B]4my+[a7e4y'f:��wbmO!׵ׇ\>ѼB&$v?ezϐC"n[FvOj�T%uGzP@Qm�C.A =IL)^/|nN9I#vwߌMYIY|00m3kSF\qL\.�z-%�PbWl*od 6ZJ\xCFj�D�@׬xd�_h`^u|!:/?Lo!ۭFSTS }{tF�� =Tw՝b/:~7hkc_ [L^ĉˡ07t-v[;Q&JO${QOg(RJ0u1�j(WZh޶N'% $z*�&}!R[}=0fÅHļOa߶w#�4romM<乾VX.]k#e'˘% #vSU\MJ}M.)?rbߍ!(|[:Gk|yv?Y\~(W_(ShŪP@QN-h9jugZZNI!,#u @"ܷ'r̬| ,!ƌ3CO:mPb�Qncʎ�hnRp1��W �aI*]݌BY:6$͓Y"4T�'GcdA2?b&�/n�P6�:|/B£6dT|{MQ]OD ~D-Ǫ(v ޗ\\z~;sP@NCcr/_JƄ4 Fae90@?j4S't};v(J�P"H#e問RnCDu= A nHy�,, 6RzP?{:/鼸4FxWyա+$D$s't11] 5jT?o/u,[A �@Pb!Ouny\a'5_9SkCb$ *�*-CU'wuY$X,ˬosSUC)HQؾƭ2cr_9$>FQ45e{GFzm[3gD*KO1Dz, H|�9{m94Fsbvo:rc{O"\�S9b?>}GLqv>~1x-*CQ/C[hȠ U<Uד('DXpp[YeU˛@  ]}_D�`xr]xŶ+HpqcS6)xw4P=gIͧ^Q5dJ9�@cb4y<�]<�0F_-澨T�r7}RQ]B1}(Nޟ1mDvm۴nۦc!?E\vy|�P3H*\\2fg$~ñD% qߗSM� &o^JT7]ى �rEG-G*j/Dv?kzϐC"9[zS"=\<�Hyٌv`~ǕKr4u|D5hVC4"un[cv]Lju1[xnOibK*{v_70+5i!كU �oٛkh2zcâIY_!S JR/ڟep{wC{8[G<`j.\ѺWK0lgCg4%dIL^y؞Sm뒎@ gNlcL-=:k۱Jh='~4ڙju^</xX>7�x]<nFlm۳+^︫VO-0Jy~P\5ȌsZiq{l/FX(TI2}'IASfriJ.R ObA4lUji2)oڊ;]3-^\x)/(ʁonIi?_'{e硎 5?}*W+ͽ//&kDmߊEU9u{¨j%IĈO!Q@v?;ϩ Y?$nƶ.=<"9Dzʭ?Kgx = Yʭ'E"Ic 1Դ6=+>x6DR>>{ؿwV$.fdh2~ܕ Ҳ9ƚL[Yr r MO Jr3Eچ4 �^n:ޓ+j@QՑs,G<6sQ͍~ KBiDKun+@i72$ߩ/=mմ7@ w:M*,KRʛ:(To o:O~=fsRϐW67EiFU #@lamZ%yK-쬘kZ=CbRxʉr@ x~r<.hؗw#..K.Vҵ2֬"L2$K9frBQ̲/9~F~/ ,#;Sͺ6l}d'?a7Cm\,;C":=LCs2S2jv:P'9%Uȩ㈖ uF �=<qWt KʧX>Yy5wYdS\̓ 述Y=Q @%~ӨߍM{g\;CQC#⯢hyAC7>9~Ϋ?d/}M׶:x|! -݈%#grͻ䯭?ԧ<L-[u8yh{@ Z`~[?"쬻 ?^aOf/=h@ ~�4@ @ Ց#X@ @ @P�@ @ @ gdVʯ_z 3Rrj9sb/QOHE/8BtA! ?!1D֘_559%%9%%/~-kk^c=ӎ&9U<U/~{]/*_~_�SSgT)]"=X9 7(-rSkޫjVr־¤}߭\ o^]fnvܢid<S&ͮk6~].Mٶ{ӤZ->.ze葏QoZrIrd><ճESiycca(:/S~v֟,1yul§g\Z9ہR} ;t:}Fvm\qC+#oկjGE}'2jΖ On?Y^9 v,Ar֧>P(T*5?9e|ҧWW?q!�<4D>aSgNjɤR'4=rߞ O6k%ԉNf5f+rqߦ1W" XnGxs=DHU$Yff!^^9l33S*VoT_jm{g<3FQ)xv½][ɭQgv\/d0sn],Nt8'wv`*yx{t]̶:nz!?>Μ:LӯlST?@hce3JbXާ"/]FhXSȴ_ByQ_ݎz2gm‚C9{,(Kx;+K:3 u( ˕Wzq<KGk1>emRM !B).�<F7� L$MfF;=`K�s9d;wH(M\M)ke1+U<~si%fΣzQ<Ç 9�PODlC{7ݸi9fF r_~Zv7ԁa�w6aN.^O+5lyrul@ NIAHISR}STy%<&'/:,*0[Rɟvr%BNn!_GO!Qy$kěԦ\�q Ceu7qD-c2i5]FaozSw1dž_�{l 8g K++Rt5 C.� *^i}f[R{lL|OJtPזƌٳ1-kׅi `[;/\QWoDֻ8wrbaTǴZvYgk 4 h5XmRfw6\Y2ogwؤZoRdD~H_ˡWBL?�2Vd egQk?I;㢼Bn-ٓnBdg"yٯhrSb`G6_Hop>7�> O(6=²6r>΃{5>_Z*o5sXu*V;9TI<QIrjgiwl.J}Vg`ʘJZNxLbN9nexS}:E^}\DXgmɠe1M5#O!Wį@�<q>NNVls{̴VKK0k<�_r~P$U�ލZevyedk%p3ƐqBa�|p|@n?d={</<p@$?=mV1w�|ztjR[tC/>]/QGr`7b=4f�[(+S4n�?a�_rE7HE6J>pTN3yl "_eHNxL>σLK<Vq?K/|�h7[w+6[@7_ -�X \\ٰevtvPo~Y�<n<nRe9 ~Nt]1n>k^قUBMEΛ &S¼(S0"}H j^\;v5f?Iz,7CtC(ԯhL+<өʡ 2l^sYfpQk}_�H: Cc=(e7r-:d̍5b(򂵊Ѩ'C:Auk4K ߤQ/>$=D䗉y"?K$�==$#Y䰀-e"ӏ��ѴKԭUm{{ !y'_�Pa9joI坟A4 r]5so1Wȴ'd"YII6cPбז8ۍDE2 :| {vI,v,څn-<hFԯmremMtk~^-� r'S7`%K{�˕Wgl`XKtf:w=f?}Rؖ&>s��]YXGWfjx$CK <8uïw9SG;;e=82diӦgt?}QHuDrBԯG¿j7|}M2",۟/k @Snxtr޴:06`�Pm~2x.>gՇlux JhX4!K?Y8t'C 7^n߱-?/f0mGǶ6q,2P-Y~*M*=vmή 4��T9&En's &^@ ecguPw͹ 'cJz)~<qDگoKb[>r=׻"`6SءQϻE-x4{ȣԜF|L�6 G;, +W7tD-qRda6mZ$?mXҘo*w\c"і�9$p麝~Ic5d9~(W�|`åy6rf-n ݩaD@.Yh'p.'o,<_q{*uq-VM{&o۶=jS/^uf|45!C�(jj<iݫ|zߺU.RQM4�0EFϼbQ[jвp ͺ!I=aQ kW D~h'Dr�OebCb~n݇2�<kOkZuwkEwo޷d9sӍ @ !D "|mǰLZ MhC^L{M68 KDwx!L$"4r=t1juRiI?goPzuɃ2Cf+8?g5o;ofV)_"Yopr%*nxP.+��6/yqJ݋^ �0T/4cWlZs؂C,f=p$En~%:hMDn7±|Oo�@uDrBԯ~95u֜74D7x�Zl؁òu�VC^y9#cojnҘE0�P6K�@INpЧ ~<RYo�@,T ҭpy|�PgV3eht��,kӜ4//S~\ z �t<rW[\x:,hY&�ZNXER/QGTu9Ŝƽ 2f÷r*Ӥr4y3�_;Am> �[8b�tqM@F&>HA�fNO8q᯶J'U8rY~o�iv`-(JC{?:ܲpvn�~8a=]%B bZ4JL L^y�/s݆�flM E ]g4 �çozzwoz>?Ͼf(wtLƢv Qg^zIUU,HueXtS'S:9QmtV_̈́gO4f^9QX]y|~tdB C>TGfeټ[Ym7|/WI {R+�*;һh @�^7y.ҷKaDDkZKe�mHл909?!dA"g)@94Q>nOɋL;ɗw^dԷo`I#_] rK؎"BGMԊ/_��JѸuŽnu)W.}xO"7SV~� �nKt4:�馶= �>8p54%j~Y)+o_>еGqO",xS�5KG!Teާ+qߪLsq; u _ue}]7c+ ;`ˏ<[d=v~ 1�A�(u+>od 6Z5\-r1�Ы}j�þH��ǁH�o�cx2W}P#vSU\$XX"Pܴ,R/:Y Zl(**mVyOW?YyF~Y䯚bs ͑\"#)ÎmnV_)A“X2i ٝp od}: JH-vΚ 7Yve?-e|`N <xW5λUI3SjW/*NP59TeYȔFTJWfK5q!0?mv'#Wmˬv#q@6c[IG=/WI GTۋs?pVP!秷4z-|[EeRo8'%7H[EQpqTL;ɗw^b8WQ丫՝ii^{kcrcȩ̦U < �0j}e?]@u\`ͺ+>A>�0FzRi@CM~G�r1Iݾy[7ȏ\#oa7H} y"E])�s狀r߂1z"soyr}*C֏U �8i�@6C tm\WqY"4Ta\ �H�@XJW'|qH>=@\�J>�]@ !uu:&2�FX ިe ٧9]^x]2;[>V%3C˅kS.]ٞ_%%R8mw/h45w˵~yƓ`R0�fl۫߄QMv Ʋ(L__z}lP]P%\n*WL��Ú Z›׽6g)\gi֥/#,'vRS3E_z15ى\[^N(= (Oj#?y\mC=]78?nk5' VkG$=E|Ш/Sj~&+2� (N CG(=t^\vq#|y W!Ku{1�%yYz9;/1:Q]s_'ƺgYf}kԶ/9;"Bd,JC 5#n.9y0T`Xv}+ZI󤕊Lh_ {�K2@iF,�' %{>/06;|Q �xvd[Sƽۇ^n jq[#uZe5n ) zQxloАA-.赟V*�}C/ X6s M윘ݛܸ}؞SH,W5=}Mv^p1[gk\oQz_/��ʪ7@ 5Dv=&�ɛ׾|TL}:O(�NO.>O��,:j9Ur)tm&)�듃$U1pi�J7K:Sp{ڳ{s.0dE)h@i�%r4P=PIͧ^{BD '<9WvԉG?X^PiJ?g]kW/ܦ2 .$,YffKnwա�0wkBѬT͉?{w>#hX,j$%j_=r\Dwp^y$r.\;b<>�wlx+^k䝟A4ח)h}R@M�+0/`~ǕKr4uv/9;"�[㧆LD:(Jr?Qqo_8>TӇlFV2v''&ɽՠKs6ES*KKWC"q�bH2 NkQ087C }eFOǞ8wmSį:~EoQ7S-1Z.=ۮs$ov};tFVT2(4Oq`-T�0|޼];χD8{Vְ;퇐gBRV[~}H=-#�0mh]+K%Wxu&c{NK:@ k(OXtCj~Tܭ>8qWW Za>uè*nxO5>B$ yIASfriJ{ ý#^ϜƦZzuֶc$B(ʁonIi\*vlkTi&9O'\ڧN*ƽ �ʞYcg۬gFڞ恃}mڝ kh|VS|m{bV]S]C_xoZixGY:U|<nƶ.z4j󻁶-٥ֆ^ ^9 GF"�bݧV+z 7BD `Lf@e"ߑa g0+Y(׊{w=_^MLfE&~oڊ;]3-^\x֡;?!)T iq{l/FXg,[>ɼ1f^]T jZ@$JKzGi9ޥUʉǿPlw99F2nEco8>xԸLj*�SӺ4Μ۪�ޥ!�0r@F>=^°T>T{GݣO y"11V=WD~3XgۊH$�@T Af@,չ ?MdZ :WzÙV_zfj?/f TkZ Wdj= Ҝ2яd\"OQemS}"yw:Mrl!HFee_>YFvD2b1Fn7Bb'(h4yaIʗBc+{WӔ=w)D,TZEd/bCZvW67E"W>ُM9D^sA{JX�vtiOo9QiaYuuwö&~74&USC^q[\xy^S T(G"(ժdeq^&$!P3ש(~~I+ZkV'q^^?|9!\WM\jagUe>CbgUzrKNͣ)-,uTWg=vZC*2t tH$�.l=n r޵-&9fQXT^9ϖՁGJָW~K &T^tϴO]]~EoQ #?k"4bdFnuy/Q^Ј;Jk [8LܯGrrЍunQyS'W'ҝ7>jwXBF _zfK*Q.om'(θvzm5чKuD @ '.uG}Pwܿ͏(->jp}@ 04}x1Q&<}-P&h|]쑟<߯>:(*nB_rG 7d"; 2iHoe?V/+cBSBSasF ?Z@ @ h@ @ @ ~ (�@ @ @ _@y>p)Ce,X]!Yi /[VZl劍s#B.k;eAdS559%%9%%/DX$.g&RHg/sx-r!?sQ@ N"OL; %ԗ>Wힵ_e?b?;N)vO\{ׇPΈ:?B(}r1Q: if_*04 K>{Y޽W5:7@ P(*&$B37Dݢ;x&,.41㦟LnWR%\r?+SUiֿ"OcX* V>0)+6ypƮ?wiNu4ߏ)pfLE{~ا&V'f rrޝ O5<hҀX-,[_ .zzsZ9L"7B|ԡ*j8΋mL'2:x=V>a3L{#<:3a恉r>eRBmF֮;O+?ټ@ $ vcrq8 Ga.Q/y ~bF;X?G^uHj̙qG=#DZ[EeAT�A8.uh-9c*53T +'RWzL^zz?m6w"'wv`t 鸓ԉNfUd_x}7׃ND\N.,D0ir';tjˡ=eKɎj2"WpGl+#~8gƭ}{( b~̀ţ,?=e$ݏIm‚C9l'<A$"}^n:~trQ_P_v2[K?:@ zDHe݂b*C<WL�8iʢ&݃2]ˮ:01 p=O0}f;@sgsȋ;0 ħ6h<HNq7^U*6j4x0[{7w\~V"j<ڷED ~r0kjԘ~Bx3%RpS q=4k.8"�/~~ݤm'9}ӿn@u/@ q2="TlkjT �<|�LxB5gQ$BNn!_GOk'* T-] GV<fAg�C{m'M[`V%$Gd4j:y\z#=%1c,|L ퟏ3fW?ԥߢʺd8KZ~$&Y1|]/荎�лOsxvWX밨l^EDNhjvfZl ~( t*G'.´EMoo 0᭝.{Z��]z׹;N}"7>wA-{P�wtY)D''Q: ME|{"o|<!Cߵt.4nv,|^!{p'<&1m<ɩ~MeS_�^{7Y#tӫG9/|w}\[ _'.)si �{sa^ �S_s$VjY1z˜`OXɴ;/TT!Ui�Pq=:+ŖE_N=xZ2ۧO$ 9YRݖ6�0_K16DBrUWP%D͚['}M1Wח]Q?ph}4ZĻ~u{!r@GMqdf L=w|LkWUt;\Znj1"\U7m" @|~yƘ)ꌒO._M+nbeGunԍ5҆N_ ݈E˼2NKpgv�DUtfu47:ﳀpUQYq/^\: xq|Պ:Onƪ%:*eq/G?rd>m mGnh4xE ĿM3CS60o% :uuztl�I=)y�WhY*_6۽=٨�..X5.=xAVasNMpEۮoJ>{Zr q>:wtj~֓�/7q0acMy/uԤ !'60yE_rE7HE6J?Dȴ'J)d4ؼs7_ -~l^iEE-|W.lز?;:;od[?I煅g8V4.CjSd)tԀZvc7Lo*Ev‹ e FDYZWM\TG}�έx|>էi9ޢKX##\RU\]4e5:Uຐ߭4뵏ԘSIng!eۚnsUzh=i""nЕ(??0-0IER}Cz�'v`roe80Y7$ O_{G=3K?0<w=Ei=+MZxԌE#ҍb F12Huq _t!L/1 rc,Ob%ooݽ7~ui&ڍn k`KG?h1'Qf,u!^]ObyO_T3eϳ/Qy!I\_fێeB(|,}g.?/V<xe] 7E@%A X$œ4Oc`7 J8 T9&En's�H<�k1W+|cwQ# D) >dɂ# bORӇbe(WK �0>{ψQ+'{}'=gxEѩN}wҧ69C_<I{R+L̳L_`!8pӏی:yɒE ? xF1B vN tHM>zZnj5z4kמ״a~ە+jC}<Ϡ漾0jfRڇCV7?aػ+ ̖Jx3gObVJba7Ix;s̓Y#.twj7>hh5�(>s:ξnm(Ez)~<qDگo#=vw%t�PRokHr=iOrnm{gp ]9$8fA;=/ur G\bvk(|mڴNI ۴1,'RYo\~z2Opcge~?$jw"s4( aWzG`Ty {ӺWmɶW]^2tV, ?"tgWuu!|\fbzٳF;#CUI<A"̟ytM7#w'u[cF48~RᢁT b}LY4zHMCTק� Hz4ٵn;lU#cC~2sy4xI3d0ڲ[6#s'UNN¥6feZ-Ab[J{ y~2 VzhK}ի-��8m^cCM2E,^Iv] ^;HmQ<f6aYO:o��!mO�@Tms\ z �t<rW[\x:,6$Wͪ4�r*iBq�/).^Fz�@t*wSf~2c)VuNvAIin�d+>d\�ljLJo8�@SJj|%AEtۍ^x<9#t)%n5�tF'!o}+~)#��p;\: �@SVfM<vѐ]��$g3�Ɋ ]Bf6b8[gr4VΝ]g4 �ç�α/w?�@{5� s 9{d^Хig,g:��wb`}I[G=�Д$҇Ğ$(ie�7 cPT;=�1εL:=( <(P<tp˚҅v���IDATDXèҥ[8b�tqM@FIpvbv0iS nD"xZܡmtV_�4Koԣ#R^\4$Hǣ.<`+u*u!+E+͈pSщY;#P}P%49ؐN<J6,TyMI=frJ� U7lW)vc6;]}'ltX2�ڍgvGo\]y{JV'&l�hX X}:L|J?s�`{maˋ �'':-P̩9F_uA^�:F�2^ I#R1�!P�_bݮ+,.sF 7(`Z*Qi1�пmNDU2�~o}ÔUcim #o>}+]�JlQ~ ·e 3?66ea4v*%e�}F˼"i�b>v%:/yN_ӄ>D"�HO´MMeGb�s g۸~~zAya҄Wb[`+tvXvTVw5Sw~ϑS0ꆵҲGYyAS�ɞ=%h)/9ȢݡT2(WS'ܴBY=^o{w=I=x#e'˘\p4`PK¤>`Qj2QεCe J=&, HJcU}OI!,´f:뺐R}:.&( =kcgQ�5*: �"!Q~�w&fl*J� kԳдB@F[E=<3W_M')1'=MT �TƏtiKigM*m1}HLkC_uAXܿk��`{!9E@[oAOvYg=#w,!ƌ3CO:mPb�Q5ĥ_~ m�u*4 +3U(_nWmzKWzy]BY:6X@Y"4T_j,›ǟp=#�$-TJbZ[ V�<8-��^mKM>rW,d&o}oPmaQڝh%MI+UL p1�B� 5#Ra΋{:/.M{csz<ޕD-Ǫ~ . za3'S2ODiVNkG֥l0 ߗ^%0͉>tLLW#e�H[{ lx]9]Ş"DۓNjJr+$D'SB |)0V)]N�v'B1;^Sş{�ȎsXYܔ:sk,XIíx]6o=hMu{]kg)n.9yݯY;#P}j ]D �ũO�@Q~^cff/j�|h �_A[(TDLϯo%Rn8 A",9wWrh~`YY*QӾ^5էQ� fF_L;o0T� BwF_DwjSǩ>Ck6�$?-Ge5n ) z!0ʦϦ.{>2kۂ>#R4_;|&b[T^1Fu?i2A V_(uP)7ݜ{ѐo۳|"R0S̃1k ;9z4Ա[Ƥe9 Y+0ZF>vZʤ6ܳg*/\#$DXpp[YeU*g:@ B^+{DzDIp&YqF{iΞx^Rz�-SCo JDžkG~�54_<еlpL�OWμ.Hz/(_D|VIqˤ.G)`@tߊhIͧ|�qߗSM� &o^J1#�pIϢ#\C=Ilafg$~ñDMp+7 $6N2ewx�wizGvCu۔[&%k,ЬaքY= k,L �=ҥr^^�OvAn-Ld@ HyK4ܷ^<w*]Q(?E7c߄L]y >a]I+{yoiz-$z*@='_|z6`Ul793ݞ1Džo<NP(> П„h;�|j��F1NKno޺ubDv5h3фN)*'}ל</l/jrV'_[/)u{uXa׹oy u>sŠ#,eΖO�ڶ mf�`o0rV*7P�0 .uBq�`LZ*�oٛkh2zcâa@_&t{v_70RN߿>c{0blPRǫItk<2WҰq>DѰ>.8yt I}yWzio2TMG _ȽKQ*A!�0r@e ["pJW<j\o_ִ*_(;ؐׄ7mۮ/L.q < =0;̉mlZQgm;�bA{=PC."! kh|VS|m{u}O<ԱOC| {w=_^MLfE&D1ʩFMP+I'F준$ȴ'9v3w9o[1r`ۻ[Ds75}.J -7tH3WڭOurTC#ĞQPf2|pOSzF~ҬqFf̤\FSvWri󻁶-٥ֆ{SW ax*àѷWWuה]TBn;7^wD$3#2 s-/z%>�mb~yCsEAxD0l-?~XYL4o!Wxu!WoB֥^<zW+\ЌA P/zN@ 3Ӌ==Cv �;�{D" zH?~6Rĥ�4pGqGaz]k(VO�(TUM5</3ٺ6e^G2ڋ]nuH Y|Ip`}?"q7#DCO_mKsr(F? ӿӴ +M%b Nʾ.*cFU߱-,i+Q~ Ҳ9ƚT܌tPU6"n׼r#3#% >b1Q(߶)-t*\DNJҲu ;[ N& >Z5ZZX~I+ZkV9Pbnk۾:  W67< )-dZ>*1*Z~񗄏|f]$G^{ƹu `GG{VčDXʜI_.HI$Q56֨݀WZ 62 /olw,BԶ3(д0iC-7/87yN.jmgǮsW;,_=IM?kځސ9O(*XU_T^9ϮC;a[ Qs>DY~\D,J~=qQla8CQ^^LtS?Hϙ%j:z*[bg09uf+9u[j'fakzI$�Rӄjz#5y o #?F FHNs^ݍ"п>jwXZį�aDN\25/z"%QyZJBdk۲Q{!ߑў@ 0{#uY_:(*n="<˰;POK~&c̣?HPt1_} V@#[A+@ _@ @ @ @ _ @#@ @ PyS ԌT?>k`o_޹l^9�`m Ceu/@ _G<�Tm$O_ {\7nH}x@^8PψaYvy%IiEFn8�B;mIEvMm�g=:' EЙf)q^*>NPJL]" i ԗ/M@ {v||1vb'磊F=XQd<fZ7[-˂54= ;N ʰk'oj~1UZmXG�͕) oA:EG dd^sonS:$:EO/N?g hyufU;]} �P,Fm t`沮&?%UZQ+_&%dLfDjcK82`)I|oD�$B37Dڜ+W~ BRs*OrAYnI"e ^D\yلF@ jFƨ<4D@Rɉw3re=_XP*._3cEtDcVm8wOSF�+T_ܷB_qI56}{mhJ91DE}8eD >y4}exO'{9 s3ۊ;Lddգ^8S?7�20633 a&dq=\;}|h~iOfiv1ۊH1%Ɏj2P@/rz>262V^tbQe!S_zez`PG=֜{fy뜙"[".weΪ5ӥ cZ +y~[)~R}s˺r? Iē2,ݖvb(fJbO ?-@ zDHe ��Dz\Z` �6mvYYT8w/?bv-İ 'ndR%ܯF-&i7Zɡ#4es5ѧږLbD�NzT@1Awo0DbyTO5*�yqg=R)�5OJVf /y}7ڣ`֠ը1Bx3%RpSq=4k.8&/|Ç 9�PODlAOb7E@ !M1RIgQ?+d.L?9@q-*+Rt5u/:,*0[Wyqk{uڨw#n^3xD-iWY+54YZ)r*UŵqQ^v!@Bjct�=vҴjOgu tnMcFjg$YR鷟_2i `[;/\Q@SbKCaӴT4 *v$�9knxOcܖ/HƟ[NHw!'cԲhWyѴ1XQć'c�..[v棪^E)�ؚ$~Wwi%z iD%}.:-c�yoy?<ac-?P tZ}]_s�op>7�> O(6=R9Cߵt.4nv, #/{p'<&1m<ɩ>:e5?s*"ژCfl%I%�K0*�>{TzvnO%?fۢQS89YwCϝ7_1Z]U iuNWw LmCgO^c<'I uk6=Km<U�ލZ ݏ~%p%yskE*,#[;-^5�J>=|5)rqֹ1S7^V3kH^8}-[w#.ά^z⽲&O}P�]0;+e˂Ka�/Z^VGmD}P(,ϗS05#iW.;x�"ٍH~@ زeFYҠq3� �GF/RV~"1FH'c֚S(THմv7k]`X(8N'0vąU5DɛSG4Ǧo UDAL@҇P a { θcoغL~Y�咩n|0m. <8OJv9c3J25O b�@yݧ=ypߏ[ pNqV>JT)S>=/SO\ٰevtvPo~Ye7y-QEŮq}M� ܊* -\uA5h s8_�C'٩I +(q)CCNl6`P$#1)f *�|:g)0nț_.G7:jm@lqV23{lIodW^}*dIC톏ZrmMt+e3V1(6��eʏ~ڣ+^3p4//]Ot! @x_ܓβ|xfM䤼~xVb'woD��Gy�t9ܓjIʩ8Øƪ/"]8BTt -5=LVR߶y̷1τ>ql˸Sz[iqh0a^I@ 䇟(}g.?��WֵSh~Q"�4E"Y~*M*=vmή �`x۶ӓG'f� 'ұsv\}IζNlB!jڸ}5D) >dɂ# b�`s(p[#MƋ*N�x׮cVr"(Ӈbe(WK �0>{ψQ+'{}'=gxEѩN}t 4I}o8\ivmPX*e'_?.}"S:|[9Ѭ_{_�އKgά(5,z,u]YfN!�y3kyDp[N s7?.-own| 9\~V淊L �,<_q{*uqmd!>gPs^_A3z)~<qDگoCg?%��?1KuN�k( _ p1=`}BS&(`OI)|zbM) Ꮰa64?dM~KyEEY`ׄˇG@:ߺU.qD[L8�!zf 9>s|�KD5"A_.׏я v9CIʕ]_9朚tCkNۛsֲJz:ؐW�md/f4 _h@ǮٴƋn"bAgHTV$_nz ?Jי5{J{aE؟ѳךouH3=5Z^8:ݐ]>fnkld�').hO w+ёEhͦ̚۵W >yΤ;Bmx>Wdp =멙 ;pxX֓Λ"�jsۓ8�ڜ4= W(n4v�]&>9�J�@ $M> J^4  N2OTx�  :;VGmVh�VISwΞҰe.;XJF_v]PR[��Š͎>#MSMx)^) vb�@sh|P$U_Q<>�3 AīU ȯ> @ 8TfϣM<vѐ]Fՠs'm5iZ]ܞک_tͻ �D =8I_#J7�4h�n]q:kFi,hdE *�5s}�4lEL�0WNl{#�vOj�T%uGz7{k0JS& 6riԣ|h#=Ib = n='mG_"ǨbAڔ+âj>*v!_ӧs?^cͼh Cs%�B`�~�|NA1qo̫0bUwܨ_~ɭB^=��4I}�T ߹⭎�e<[�@U�@kcaJ꭮[4`Q> Z ƽm̦O+y�ЬwIFxPl`C:�zz+ٰPMf~�)uTBNI^� k$Z{M\BS� dd/gok9@ Owkv]atct0bWpgDg*i<xf?-�]9!U�|r=(ީ*\I9�ѯ聾)h)}MAǷ5 8EP|\X~- 3?66eaME1[A�\R�7iTFFH ET;ۿJ~r@ ?DH*UIl8+(@吏xs=ɫyP9nX\clg5j((} ٳg߷>5ˏI&EJa6?nS{B s_n”trb߷dzIH�=ZEq{QفgU$qIL=_]O"FQ*NP59TeYȔFTJ@:<NP\-] E*9ȢݡT2(W5^n풼F ;�GlGD߯W.}Jҵ.Դ�x5Le,q_�я j/5k[iע\M}Z] =vތǎ/-1O�J&r8�@נ}G�EB� tM,*U2q+o%:Y=ePoaGwf3Cvi�Q~O"ܷ'r̬|cƙϡ'K6Q1�V@/n�P6�:AI*@[�=��քBY:6XœY"4TLFrl["(8,Rcً7?1zreG�HZ47T�7#.�|y�gp1��W �aI*]L;\@ @ս΋K>n䜞/4RhfS0*6E7>6h,/�pS*f*��l޼$M)عz?e`+(~ +B%*5>ILT�'UZ( /Oj7Qfgjv3b�Qz+ȗ0sAJ>tLLW#e�H��(@X"}X^^i?bPɏ?И$g֟>Ìq%bXT �r0G}�_ �J3b@ʢc)=۪A�^QvCHM#)T&Xp`7Npa=�>4-Jf0ԌTKt8 �ӒWyYZ�;'sIf=]586il1iWUs{ϸyes3 �G u;.+<qmLaؽkɘQT6Mm/}6u^ dg}3׸ޢ22$�}C/ X6s �}v* Q)�DIOxt.T@Pl@|* T@P)7ݜ{ѐo۳|"R%^˧ u;c FQABץ`XɧOc"=$[VIjN̞GNۻqNAT_l� vaߣn\)$ C.a-[oeU=Kt@/fyBu?��u�L;6 I\&RX?KizϒOI_ϒ7\8ou>ɹ$;>d/e"�|}r0<�MWvb|ry�gQ5\<�Hyٌ_&n#Qܦ2 .$,Yff A #Ύٚի7?^)&zL�r7}%Mh}R@M6;nT/x��_egULa~g{>獓_`={ !=ɽՠKs6ES*KFd*ˏ~AـU <dڶLam0ٖ+V 4vY&ӰGn2}[P.mZS }/F^ KBע`Xq뛱oBC|^KWC"q�bH2 ^Uƴ n[9 �!{HShXYO%B*] ]RHîs'[[q0F +V�{8[G<`j.\њI# Jwkt?}i,붷P@ч>J 03�Zȓ AcDZ(0|޼];χD8{Q[M:y!�0M&Yך[t{v_70>8}] 0ZZBIyʎ%!/ sǴAH ժUw  HOC.«[=7smMG DqWW Za>um׌mc&8um)^|'01dl%�ܻLoRfJ6;/5!O'r?ާt<x{sWjw40SKϣv �0ʩFMP+I'FaCgq{[Orm%MO -7tH3WڭO߇ @^ԛ|}8">wR7dCHڶ gZ:@Y19WٱKTn$Cu-x?a]-;ulSq_qiq{l/FXH "ㆬ/rK#RzIR_;As[CMu BӺ4Μ۪�`f~gObȘV^$�=U*)kZwiry/l�ݶtw蕈�, mQ=?CsEAxD0l-?~~RŢ wH$�1PüwoccfUG\%g.1SR:49LiIG uKq\bY%z?os\SF177 �Å_in/\=s35Z^f T%b N~/87QyAZ6GXIyr3AUOW NA9j\K;' O풝emèvzNֶ�9ӢIb(#-[Ш_e_JVƚ]Dcj�XBO%a-?Pc~X}+Xf?V4e~BKRg%#edgJXne=!P3שc;٧JqʉKbIUTZ]&H s@D^G9 B 8O5@$"�0*M \krikeTu&~.b~�%7_K')k93s)1V*O}IeY\M=m5:�㶰-]bSnhfӾ"(k6]Sװ}=(mL:SZXZ87+beW=^Q=sN9[_ͬQ5*o@  #z@בs^P #??F /h�<A׬ ?HLl=n3rMQ+#D=" @YI@ W`7v&١PhZVkh*VfkC ?@ h4@ @ HW@s.@ @ w@ @ %C�Z+)#DD B",|ss.Ԧ&o:@ :%O1bҬ&51L@ 2:;|xg8jNk\Ny1n7a2k?d٬ڤ:X4ؑȴ*ɼn;6=yL8X0Q7?; ꑧ[g+F@ k@? ?%yEbnٺ~bO=%FB  Z PNhU��Oڲz18gƭ}uikosn'"!;:hc+_˨+ߣbՑvcKjJWn]_b~̀ţ,~qQH|!'@ hpa="$C2�p�L\Z` �6mvYYХGs= ٵ:n�a1Ӻ1;^\"Ez g;}Ubt0[#m\u<dl �/ϝe:#/lÜ#'\Vjؠ ]:(�9saZĪjTfF;=`K�s9d;vG@ Eyمl7XK%Y N~VE]OKW":,*0[BAIAHIBrD+*/dgcZhOl<0ߦOb7Bֻ8wrb1*cZMF_F-Sv qҎ2aZl ~( tSi `[;/\!IWn$ |A=d&N%BNn!_GOZ&o73@ Z#�-*O5ŭA+0yw?<y3eY)K n:qPż.*7=mV1w�\z#/a}#vV˸N-�ʲ̚/KF/_<yZ9W6K>?QcuFɧG&߿\N71T~2#ٚ(=,#[;-^5gvh �~!UCQB 9SUx놏�[(+S4n�?a�WhY*_6۽=٨ {Zr qQOղazW/^)Sg&-8lMX 9ـA3:jm@lqV23{lY4*\X`󂟣4hE[cT2FBd�4_o%cn@|2nȑT;M^f~KÚc|$r>σLjDh4p�xs".*vk�IV<PahlybtFҾ$^}<ƜD)..X5.=xAVasNMpEۮoj@M5 @ ~)?Vu羳d?u,~N7Ej7EDgZt0g4MS!OY$yWB(g ;vYΝX��N̒(=s.\Eβ2qOC;D8.x JhX=<<YȓW CY;x�f0@}@ qۮGo{X^i/f߿{4kמGn] 0xi*_Lv9fT=ә$?.-ϟkZr,9&n@Xo{1>xE|WoG?~ty7Fμ\com_Ok_H"KQ5u.]*F9oݺvE0EQbg0iWWn$rzbSDY.xEEY`ׄK+`7%K4 j~Z@tF-xkG_<{ M�е><~2K ̖~>7ykg@ h5al,i5dӞ o�Jrb˱��.=d\�lj@@"槝છn�tu#>Lj~ͪ4�r*J+$D ]v�DrЧ�r-.)S7ܘE[@ ߋJS& (bG̨<4٨mMng 6&dAN:ulCv G @Wn>)�h(< �*FYܜƽ 2oet}[�{B-5FՔJ;Sgye~v#_d;C$\ͬQӧOwaNե ܏.H/rs1X6ʰM5M%\tF޾2E+vM^שDT4l򡣋T�ktLi~͆.!3Fq17yki@ /)ź]WX:]'o|36љJZv�2OE�@׬d�+T� �c!]t*40JJD�Jl}}iF`>,Ct_~"C 9@@�'% p!T%sYA*|6vCIosx.FUݰv2t M:hwh1U/J~Cd;%b\tam m Тa5i7"@ kq!0?mv'#WmˬI?bCe J=&, HJcY+f7NӵT6ЬMfש?2.- �`NVn݁(`  鎅es0awYw??̝sĝ;syjZ29$x*nѐ):]<(tA!B[wօCV7if| 8_r]N] J5-@Wų}�n2_ҨjȋOr7u³x� LK"e}/a:[AFW,]ToŒl)Œk0ئ\qB!hb*{W,}֩+aÃj'?>M $ں? %"p#ڌ7ҝ/?phw�29:쮙ڝ\i_2'9/iQcC%DwOlSB}۫Ǖ qZr{vԻWMLW.o۷S/7S٥,$q:'uh3)?`Yi^B!TJ}Wh1oϺE;;ilzL 5W2fΖ3/[;}ǶxA!./v-2%lәe\<n”UO߼p"` g4jԨ6AM+ qcFϋ��L0g3r&hT"ڱz St:B!7Ѳzg%b~;i��pq/2�mڴ.Ptw=jF D$7<Ҡ �W-~�y �wl>-d}:EO"ܹn"519ۚ+I¿ç[rA,9Uy;,H/PBn?_]^v2yپeo\8NIᮮV}*�AȈ;*sftYz>Y+<B!*UUf47ds+}eGu=xava6Q[6o0g!D 9><p͢!-!驷sb2>� 8X-=ޡ�-P}VoyMwڮ@'ue�3�_E{`Rt:B!71m~k:Uw ��Tzjޱ{K"0n^#G oyYn8��h^ˎjIm}_[`ޥ4h9_QuvO/k "1i-2hO - UZ.4gz Ӆ*~I]ݹ붬WÂ_'kyپeNle3|iC,4pٰI#6X8~w/뼋oN3!BH*C]:QJTkb.aVHZ0ҕ>'hYj};L ?%2Muٍ%(|�� KOiH> 0o褷d(%5.Nщ]lE#] ٴ3�|L֩Q0%JJH1ąjz~XL0(9ߧ 9_/YDhc?泫X2G=jfD&r/g�pkG^"mLϳ eyQHb 䏻OXK Mir) l;gQS1T B?M䫷vZ*xoʜ)qnNJ3JB{bmZ}LNe*^+;F%/5ؾ͖{of(]KfL|CkY.yӨ oMUv@#B?_q4 Z^Uź˨ݲGB H)Ԕ!%z.&r旂~ܹ#uա]U)M/!kSt:B2xB|x4B!S!B!&1!B!B!*v@#B!B!E$&gI2Fj$' ޙ3oYP#B!y? evoQE{'�K{@2X-}@T5<1:.*xA7uvd)b~NR[ 3r:2&mω"� H汵ȹjY(/.!G¼rfj'd2 bg FVÇkiZ-48rJB7i"޻c}/CͰȹR{oWۣH?!B~wvl\W0%;1tGYi1L7%ztSfݭ*(ëFh'{wܤOG7cR+#G0Ǭ /&y-kDX9e*?^3apR-IւU!uꨱ[Lw�0sE.SCVWU2I #-6.A㯏aLhdIk%W?/Hݢ]SI=_5=S(g¸sf2[7 4eCy2]JپҕBBYiQD5Lیp:lP*܋N&q)h3c3B 1Ψi{NC[U] R%кyk^K*hi˗;C<C׃'.^8;(-]]]]]+SZ& k#Ϝ /$b\0k�g\.Ӈb[3Ț˜nHr]]:g'ͻ\2yBk}~Tm( O?wl6iPZ2p+_H?bd[gLC2N+ !zQ$ 3$TpQ�@_*k^�u19ؿOs/a61.G%WݘE@0KaKݖCz<mDntXԭuf-/n+ɋ[AMzu6f9QgBjudǾ :>u Ըg+"/u=wX vD,i8d6&N܍Bn *CS֗nXͺAFȳO 1zV/i_ eРͳ=TP‚D]c}ƫv!7=odb(|7nxqV TF}if0u<M2R ̌+՚RH]YSeL>Pf{649�@-#N֖|Oh[iy7qQv6c(Nh~wd1W_YDž ~gzvz~{+4`` n:Ӷ`#& �㬺~9� 嵃2Z[`5{<3 @MɠaIAFL 県2i3 к^ʹ gDe(uB]уYJ�9 x;`mɩ&-f "uf,(ѵgʼn8[8Ɔ"�>F?qy"Wbi0gjzأl �T/>/r[73׏<;֛л�J9%-�L 3sՍj-ͤSj9�4qR޵E~]Q#{a)86G98Wѷ)پ4HBU;`Ύ}:YV>c;kG|K(�>�ݿt%.<ȈhAwěnCsmޓGB]?kkε?<9qWӺj 8ywrl766zyGwޝMxx.ӈZ5ĦCm9}.ryj)_Gkv WL] HS ȈȬ '!୰PB?󥽻z'_L$H 3Ȩ/rzIUVM/*uzu d�ӧN&�VqxQzQ= &:\3kӑ'z,k2*iJ[aeAzçԳxL*K}/ڟzR#Ge;pvfObutw�~N?cf~sR1x7z 2eF ćhzI+_Xڹ}sSޫ:]9 +Y_]]2'.Wg14H"6csrxlUn}i U/rEn|*`,u[PFr\h$!a."O|ۏ7nx�.% sJra֍$ސ�ϧC�oſMЦ�{TЗ\=bڒr><;X֌L瓃oXzrş^nвtk$%duj ZYK]=i<�5`@½0/;"'dU♷.Y�9̘&N��MEyO#F=|us<Mg42ץ^|k;){ʊGB ^k{ޙ;�� sΆ( c;ӗ9@sd<-J#{\RN}Vc?ݤV"L S&lߝ7^mscHQ5oQqVU�6>W}LsZhW��qMm]sȁQq sz[ׅg![A&mW[_ No!!mU8\6gEҏ#esΪ5 /_գ\fU{~ٳ#n12unR{ޏ>af8;`ۿsO(w)-k+><PaeAU pWFCzww�@sco[˚ԝp'%?qvw7*EM<àqb'IK:e � S^m9U6Uj{* X*fѺKϽ{$+QW((>躇SOw`{=ÀcpߛۤZ�Eɟ7YDžJ~s 5MKIQIV|h<cRzJږW׭iIrQ'�t�[jf,ʁB- Y_ׄJ[79{NOƶn>P=ge=8ӂH6=oy}aa\C&o�o"(3wJOkO'+9uelKnE {WӼ}~j8aυ9mo7OGLSSiGBJS 3] #jIJ� =+p.߽3[GBsԶ}Q=s3z3x% ̺m-۽wZ,WM �u-pQg' I��$@(�jj߯r�fQ_'iέK-?< �%rY,�jh2P . Ǡc�TS�rD!8k�@�(,} *j#t^" JD9>4Ӕ��Z}o 粽\Ieշ,~ß&UGEzp{þ~:c5I{ZgT.αW<}#)_X)� ?aO`7� ٦ =GyK]>l`]>�[G�e8త-MV#üiM�kl�]&YD;hyu\TxAO$2CO ئg(S��z<B�Hk �2mk"6C:@̕4%ɊI53ݬ%u215uY�h$I�?/MHAaF2�p_26�5='3.X%"!,&Twضu(} _~ng�M5PZ vhZM2ˡSM:F�TS�>}l�T3iykw}�_SKBlF-&Z9Oڿԏؖz7(?�X_-9�Yr5rך�wcO m f(* A|i�� ƉBqː_;z"".JVX<_LnHeP3d {ry(K@y/ ;6[H5+y5Sun#+MKl}˜8̂l7Uԍ Iz:ITh{*Xx�1h-S: ]dAj<R?QNCRs\TxAO)MkPAd.9GQ\'mq�rgsxXK S�D<z �!;��+h֥F'M~Pek٭a^Ec\iԑ'/?oy޲[OKeD �} 󧡵Tc[)&N`}&�_W6N�sOl 4(}BJ]w>>Iuz;K'1UuecK9�}�nF�M-b;wnfҷү]g{Ie%7SND!zʹ|6ՐsX (IeDҨAyM]l)N<"Ґgsj!'<RY&J 4]vTLȿd/�Ek6�DL=}3 H/Ms\TxAO%Ԩk~)� ,KJ/? )�'-dͩaֆ}9ܞSt�uڽ[�d��&G"!Х1�s'wg޲gt>KݶwKEߞDÿnun|woym|\YqU:lqUðy%7%䋬C4$΢{fٴ4� \?}U^!w+uDy{-Ld4sd^r q|kA-`lo�obo][h49,c ={8wJ |�8*8~~8%¬\O)aE#B*sੋ7�p4וnx=krS31?3wx'9IᮮV}*�Ar]Hkbr&5Wn-Kݨo7QGY|(~ _d@ʵi5t7c�( c!~K-L%|�y[<ؼ}V+IGF}1o՗_/oY-fꅙWם Yu[<u~@|Ń.~yH�}Dqkҋ@FL]ܗ}zk󖵋OT\7W.M^ydhɔ&R_crbe\;�Hυb~ʣ<p DHi?m랳7΄>%IvGճ5\#\!Kqn ݔ9G\`M}'o*+d8I>I_2 gܩYv^!)ClԢdX ]*_٨-<:X‘ÔR> $.6P\ĶHei22W%H5GwJ6Ot'tm9~}EW=jp1/tBHb<cFu1S(k ֹ[eM7m~;*u #[֝+v6{2{Z ~1axv6ډkS]c4(^Y]աL^~2hDZjd@9rvzTU66PS] 7eLe7j�CDaFiÃ74+^o/Y�@d32\^]WZ<y*ot߭ R fy#cI7YtzYo5d̍]5#޾AZXrx90ܾp\NɏO]i��zCG4'ҹv'ew}<N2d JQLj2iZHlǒwi{{SVH_"(ٛESǒ05&#>�68{RMy;k<ѐRt,T0XR!@eqz7`$v׈~hWUB !Ƀ.ڨTJ"P$Csi iES+/�J)8<Ι/+!gf'T.H MG'��;:K!nWBo6 �ujT5ݻ{KRItDI :Z? _ dioMt[[ȿӫOAO[g{MF_6&e]ʐ.p5shąjz?[Xʌ4K, F,_ċ6i19c>eEt#߼X\u\/,5u3N I~;$#%36Q`T,>KHKO01@PETjV[OۘGx2�qk7�Yu0p] 9Y|0WZ~~vbHqYn9*S3055rn_BWo,*Z#oR2bVSD!;$Zq}m,4䘮�/o%Z͘WzUP_J%۴$~1o*;.hPv@fCVO\/?Y E`jjkp!P5=^ۮ)VUwic۵jJ!P%#Gn KWPYx?ܑJ=ԡ]*MJW%yܝ?m$5׬xA2xޟ7 ѳO^nݠ x#�f:6ơ$B)Bw@#B!B+D B!B! B!B!BRZ\.]W(;c|rs{gv S_B!B!RN_#q|;\1EjMzMX9㧼["L>M9ֹ2 ?~ه)br>orڽ7+~X!B!xfB̄M0!O&iS3v9GX̥NqwN8ga.?!naA6][VFa}m&Oynhѿ~_a3gB!H|!>B :E0 >$5z�P�nh|^h;o ֠AFF^a’ -rDNYdsZ*ٱo2DzN@�SV[.s}A{Z1(I^ܝ +;Fwaٿ?�:1Ͼ1JzS_<y^Bġv �2"}5&娄|*ݻdvҬ9kp7�hݪܯ3f`ժkV y&x1g~3ػ_qnr;"4t2E|Y B!B![;`Ύ}:YV>c;kGK2/5w/%7,)3/\ѽC}&<x [Qi-E Obkox �05̵EߺB-Jpy\;hέla!�|s$-;ᒺ]#3On�y_u{\idD4|6rّKuݶ$)a'lMi~䳰/^1 υ\.OB:EQRx]S %"2"2‰9eB!B!Bow_ݱE0j9E/sd-ω�*?Lns;q'vJ/&ӮL;d3 �Ucw*LaMF[_8sgO�(W5,zxn߼uQN(*vz<exliviS;F xw%W<xoDc#wjk³SK&FA&m<skn-´\A!B!Bַ;mzo;!�s١)z��D'' 3a�bdWwF% �`fH�d@x ^cb4~w1 Ѭ�۔Djf� �t`jzl�;l}RXZU8AAB=ӑL9Tk?6�t`eFHǠc�TS^d& $b~򋲯 !B!B!~Oƀg?[Qɮq;77?2%]�$=R7AsW21C�Y|8H2%�y/|yO #g`z%4�P3025-~ 58}";&Xu[ۺ-ӶyW�`cxK`DI$[/B!B!=~|㓀9vO ?cՍzZO~ 8w6�g "+he�yo�}x�M�CI"~_~??%�(H�@ұak7 �u+6+'9Oh{Ѹy.L�[ [ҨjHO52f�,ުBʍWB!B!Mn1oϺɍ4�4o+w%H͕c?x̜-WOzǺ[wb̩K'3ئ3ۛC̒� k5='w c<*5*=kݸts>&&68xCÚ9} rhVguB^}>[%F>@09h)zQqOcZPxf\>�NkÊ`<2˧+G"ڵa_ sڙi|_B!B!BHJwF-ui^.ڳwHnaQ[6sW y1tt# Q4Hѽ37)n6r:Z,�q9%Z#% 9[��8eP÷pƎ$�-79slC&;) �L =8v1�`iY :�8\eo`WA2>� 9]I??]A=GV4e_Y@c8_B!B!BHODvF"(QARJ~z~ZBZ!ikkqD" (N9.?Sj POL}sS])sl=RQғsEfZ_ˡ$b E2"JK Is G� ?sr\R%|Y;:˔tB?ǕЛM;$nU1!!O`ȨƘia*B&[; -f "VekXi.H$�|} SQPNV Ze'umu~(d070j:v:$%(_V9NNRQt:B!B!BG@2tnh!B!Pep<\y@!~_M0&[!B!P%1tmhY@!~SB!B!B2`4B!B!BJ!8yIjNvj x̙cz?=>|«lGibE?uwÊ �kuOOJ73Qb⡏S ,a}"KO~}SUBvPVII炓My< kmg_?]YlMtq!!i}sݎLtH!79Y�<9˜ކS sUR/BeG,x-x˦GwFp=ڏ4:QXz´uLf?y¥3IӐ~d0H2#:*Y(ó_]%g<*㡏S DySmQBvo*^(Ҵ?Yj&SKYԘ=^U|rb6_j2Q[6Эg(y]s~/ νwkd.Ce瓢~3Եgv^=^-*OCi<�=}}̇PeyfB̄MU{uK's>q:PO絬v<tc&8߾Iւ|M$HK(}V"8 r&W+%UQ/BeI~+>Œ]9Hʔ:dӵeُ.!9̸Է[҅N.ʸI;? w[ AR0t|Ͼ9j5krH䏇>NEBdҤ<�9/1; �~ M18ښ"�xAnnZ,�SU**5 _SA5 9R_x}r uM鸟TXSڥ2#&�o7QhptzFv%@,~PI}wUM I׭�@ !ՓBRJzDW} ܖiQcjְMϹU?ϣU|b\W\X;HKtZ35~>+(9x}eZ9{@@s2z!*T&!F� X@ 'ٗNs/a61.G%WݘEٿ?�:1Ͼ1 �p=/+uR⏟޿�ԏ8ƍggʜ��ٱgN_}1]U~/yq+W<RoJiҬuWCլvu)#bIC!]Y� +�K$f(ɬ/%ubuS?<zM\ʊ_VU?B} y/6s֣_og}vtJRphг4~x5/%.u[!;<"y3 ZfgH.9sژ�|%&:"'Wh2CR9]Xn7"S'5PyAzUvj4Y�`mG<^n,%Rj$+~ ^^.i˼q�GO6lٴ.Dz(Iv6W@K틧U|>CSGM{3-QAĂ9Oe#^),'WuԔKŮco8\�Г'YZ/Yyys -tD^V^1!Jh`J1*R731¬qvDR ^us2Xz Rgׯ෷2zO3�@Vti cVm̸wib58l ;�xyཌ֖=�dPLʤ~�tsWPR<bh ,Y;TѓҰſN32zP;k5h)[/B*ubٱo_63glgC|C&FWpsI[K{wҕ;XVO##Y  >HB¨UB.'MR<j%7ijqZooe.k~�(L 8akL-L#{b)-Le^o4mlB;1]w`]r+.AJDdDdօs�YyHspԆK.wݎ<qU߻f\Ów50h+k◕gUŏB7YqIۦZ5CuZPS3{o!(Idӌ @̓c7_6ɣ{!s?%=x|a!y3\7lG]ǧk%<Mynߥ֫vY?gKȈ>:tK u K~jcLV]-nyuc:AWlDo}蟮LxPghFANvu-Y$%)qRƫ,)Kq:%ۋq͖wS)67ǶIS:j*~sŀ{:u`@7f#.V׼> = =S-'^; cH| RB.n|�8zp-)?–; 0,Kgڵ?T;X䳇I �XN#k%+/C'3w0|]ϖI3}ԦZ?91bL 3Dұ)U >f}~NN3-(؁St5 >~;;�çԳOYҺnݤlA.Yz-� � $a:ucV7ʝZ=MoeCE"#-^Fev:$Lҥ7Sz}t@ @ܥ$c_ϋ }VXPX(f= 5|̣B0e[]O]0�`i[jFv})!]<eBH%3Gwly),ev)Q٦M&̨ku(/EŃn_cǶ o1-�Z_�m=|)=mg6p]x6yѸ%64._hdu})||xibE3mi&:wb=Ώ*AI[˰0f8W +%XE�훷=)#bv+Z_JR1$ިނW;�[zz/5*!obQ5iu7aWS/c>G-il His_a깝8u؉ ;[?kٌGD7?gP$It#Nj5m�`ε5Y8eYzї_vb39]!FUƄxnm}6%^9{ dV ϕ]x1"�صxZ)fؽmΝYDGmYq%Ҋx*Nz,E*5vhJm8WV9;ׯ_ /[z̫O'5$uux_t7~jfrZ/Y�MW4~G7ۖ,{kqڠ&կt`ٝC֞"YxdWVtq XVڙЯ"<)“߸(rg ylGDQs\?t4xA ~WuwW{ŀ{O{{O?,=Rrno^>tiClD˨X!Oj&훺JT]5s&�4&(%kۅ�5w}v\ҸxQo[`W%7l|yG;hT,Y5غm`ZlYxrB!TA߮wmzo;!�s١)Ϻog$"]wRt Uc@a Ng@#PefoMZgN'nc �,G=XK1,<߿fjV^~z�$ Ū/Ǡc�TS^d&&(~E"Y3^X �w WA MQK�5}r[6~Yy.ʾV#ahXsmˤam֢5~m>�փGi |q~OP\m06 �-FxugDPQ^=|J./kd\HVlL&HkZ{~z\a"4<[ŲUBߩ:`aX�mK(T I\|�`r[hoJ_T=$Z_s�дޫjv_,Hz9a7� h7, *8;MƢmz_K-ty睻I@wmVo MmehxԋVQd@|Z �0;vVn;ںzM}[6Z1k`/oz,r-#4eYu!�ϓeiZtn sr;%_I)UXr,;XyyfN-^[��97һUU� ۵9 eOcp'0.q�lӅëtX +R;E�@] & re �@O~ ;Pvtg[M�`k[[a�2mk"͐s% [➏B?_.ϖnnbk܎͏ e@H�ie;;<1�*aHG(�o?鳦|O8n���IDAT$@(~JA_$��$<Hi�f`djZ\S kpWS]$-W\90yl-9}]oe干GYVg~QyY 0I��E(?�Xz%=e 5s�g9ȣ>d73VUʝeeɪWyquZTd*7|9#,<NբFqZKZ,]ckTH4GUȻ&Y2xyܚLy<`EN cr nZExW/ յsSk&l3]x@ԝQfW\: _<)fn ehjs>PJ~{UNՉ~>=X6-a.s0�$7oaz4ӯZ'$l7旓q[A>E)%u(&.�<ors8[䗱lS�ŃBJO{|0o ㉁{xLuΗRկ:vj�]٠/uAJ �P �0/4Z1E$�$<+|~ǞY]r|~S�9%.l "@ݨ͊ITRnjSݹs3;M~=8L�PtGUUς7 d#)-άi "+he�yo�jq,CY⋆9h*>˪ןjf8w"r )(~(XPɱVw ػdnӂnrԖw V3R��|B!Eais�eţltm֍'@nDq?ni�Wt>rvڹOx~ܐEkTw"HQOiBH~bJݕn, P%,MW> uA%}~%חnJL@�A~[B֜lu{5FKL�>HeQ!K �I�`X_xBUPż=`AMoo2UvFGj4MUUvJ/�8U0X�y硝#ݧK@k'|यBO0)⽛0e7/x,Y,c ={8w_˿:_x@|ȳ'|2/dl&6H{iS7<wy<M<x{-Z麗J'#HY;VRCaNGD<o_ܱ t<Tk+bA!./v-2%lәNڽ;uz[vi .PV9+*T/6GQ칗cM~'TaZ&=R]�nݢ$;|%l.sSLT0;,[LI_䩼|){(g/3��ziQc~/jשy#[ BQiPÄ�‚?Wq9pq/2�mڴ.P�8a\y}TxirS31?4�бߌnC�$<-Qe3̫΅,n[<u~@|Ń.~ޭh�w>v縵~E�sੋ7�p4ו��~(~}\ݲs{Uk).~n+~&K24dJBS ٨Exv.闼dLr.QäWa:@A ߞzvá^;�!'|g8kc?M!wfo0odi?dP }Ylf׿Vֻؒ? J'|�!~v>7�@}DQ߁jgOjޒqÙ>w)0d:&YӥW"H,ؘsBqQ^R̫kc.k3M9EW=jp1tl5s;~�uF,ZZ_gpԖ낃|p g,]aes㴚 ]^7}qmehJmG>]?0)saw`K#ut77M֣vY >xfQ_u$pft նmB5 S (Q)F",*~ӸڐFk;\ D^ZQU}ew u%LifB k\eQ~MkݽN,IFUτ4L-]yU޽mJ>ZաL^~2hDZjd�q~n}U_0g%HP5 nTə~o7Э!{9 cSWo@MtLnlεJm8H&CDaFiÃ74SmƮtɑ@o_ -,9 pn_z.d.@~4H��=}z~\�{OXE=kQ]�ZyG68 Y tU]��Կtg5dă;9BUC]:QtID@|SJ"P$C77+]3Ъ$9ZFr|RzfzQJ"|k3A"_yɹ"Cs3->ěbˆN[ϫi�9Ͼ㜕[<*'5.Nѩ0^NG?ݕЛM;$n^^',,M|z~ZBZ!ikk%/%PiD�$c?eJr׋DLv,> ߔF2*$&$ z&?i$Ԏ$K RP-C}R׏/R LfϚV,5OJ͖ 5ˏGL=7!q�y3�xA߮ϖփe#cUT!T*J;XHj<J֜o~(QRBEkO1|u k=PR(s*Kؼ5gDmdb�1?Sz31}Q*BJ|BpF \-ʫck#Lu;; Iz恭clhu2b= ?R2YZ)^YyUrB+]c3]E6*33�'SsUʂeJr׋UHE%K]O/I>4451wܷ=EjfS2Xܤ۾kZ ^o֫#;!�=\SBzzYаu쎩"D0-˞.URQ7dk9~B)_^l!Ҙ 5=^ۮ)VUwic;�B!rM"ѵy~ՅGQ<Gmf%THPr<\Y #zv0cfB7Q3t=TF!e,՛\е!fdB B!B! B!B!BR`A^tڷݰ"0�ڹu]%x̙czf fF!QI%KO~`ꛙ){* ?=5C(Z8O*>jczq$`E\!S,mLY̏Qs5i2jy/W!?$1M䙹"1�hZؘ1D!y]~̻f:r﫪?}DHTl# <ƺ|B IfDG% +5ڽ7+~׉aḻ;~P76B?Jگw+D]%g<-=Uȳ˕Z,‚f5klэU.٬ט{'NX?Z(+-P=R}=4ux vtkYhS {dϩԂ`V_$EvN4ij!8kn?E^rn_GXbӮ�`[Uk8tn浬v<tc}9 =RхcO]&w*GzfB̄M+R$\ w]vŽ㺽0Tq>ndn'N#&= TJ*Eȋm!!%Iu~B+)yJHY|CD}`-{V79sq‚W'q"B�`Ҥτqc&ca0ouB=k ֪={#]$ֱt.<px^!}N{sϹUե*5qhi˗;o@f66֧K30玢;3i2שz7)}+a--, ɛ WTj35fx_ :JQw7tޚZY%#I|* +H^y׃'.^8;V~Pyۿ P]09? +jD0 >$5z�P�zc1z~̟d](ѭ3^lm u¥n!8�>ksrTByݍY$71L|qbhs<AYRphг4~x5vNYdsZ*ٱo2DzNk�#BCY B#)~O/n9S1e2=Crə �(1ؿc˛'/Kȓ8rsNA�I]Wڹ/8V7HK:JS7y�`TcǸLYϛD2hcg(#5̸"χ ^uJGrx&׭q]/Ϊ]I731([Ԕ,#s2+,b꩗`խK?h<yKgzbMOSnJl[ya;5�&LUAG^VM.{{Db&s8Vn~U9*clз?ď_~l.?jK/Bnf&cf)A㝖8se R ƺҜDjQ(;1RgeuLDy[F;](iMAHݾvje)3~YsYe7=svԉxFطeNP3LpԡY>!c+NWvwukxr0⮦uq�mop ͵yO y<wP KW\cYk<ftw伾sIqS|έla!�|s$-v@s;DZ<x什7lG]ǧk%<MmcV\ҶVnj?yC#}Ѵ;e/@js?%=x|a!y3\}LspԆK.wݎ<qM]S %"2"2‰9 7ij Zooe2EM*T~ZErSr[_Uju&f r*kO8%$SoevMF%M `M3q類 ]c;i)ʺ?vG͂NTr1lSYn!׏ωgOvNS;j1]m =js/ź:l:/}VX˼]@j(1wmwS3:R<K"uVj~}&5}oW!0m;�>f}~NN3 yv$oo&5ue/nǖ5^RVqxsgr?ڷŎ=Wg}9cЕ)c=wH4bd0]'>Gs~;%s.}qorW:|.@ɍg+( y#0S+H${Ze&%4 ?a3� ڳkR]]2'.Wg14HBV"Q|+|YQySth#5t}ivle)k:{f,></^}VYr^R}Dހw-/2Qs6x.zC0%:۴Ʉu%$C-ؿqվëθu'His_a깝8u؉ ;[?S2$EQ-[g � O5^@/9峧׏1va#ǖ46e wݸf�ݹ&�(xٺ}ϰ {BUvl%ݴlFyS~(e$lmje }(W5,zxn߼uQNFI[˰0f8W@04/Y4� =wE#�,wj΍чEw'|Pnz^`Km˹o^Dy÷h-kKg18yMN?;poе{Ӭ{j dw�� aP^ a/ª:c}�Te!$�BOq�ZѬWjՠA&I ׫fU|%̏]6ųݳpȭn^?sïD׸|[+zJrArk!_}SzmϷYmXbF{̫,hߕ@s3{̒3m(!<t+'mmVuwW{ŀ{O{{tsа4YxWE_v�/|=QQ#(t~$\3gXNq>R#>M"Q|+|Q6yStg}ivGvYV89ۯc5R(y= ZۦG}V(CeM7]Y"Sc%.u'nU$@(�jj�.f&#@DP,WM �u-p)#�ΏMuo��k_."&I��p�L6O!Piwʶ_M}�8_p+� bʅT}|_$Ϛ1kY;o�r86�z�,�n٢Y]+M�ĭef9 TYEmܭ3c5I{ZgW;/|[F1WK`Wi͚6_ĢsOHVvJu XlRO[i�'0k�lӅãEϽ|ҏ}�pty@UJH^=pqlޫGn\电^W|lJ\@\"z]H�[ Oޯh*ߟ)?HQ_F??7syj[.G,vAK �g+x4w)q._r%F&�,R|4?OzF}`݋a�2�iѹMOK,zj%g~`X5`ŲR�tdo_mGC_~H&o  G͏eYq/˦�f@(QNEoB4J-xYݨd׸Zˀf�p{��0]Yr5r�D�+yˆf�ooubb�Xe$/?a�Pݚ5~lmU>q>% !Piwʶ_M~5O)/54Yo/%k͌UD�jF%/u1'}5O��Hd^H_akRʿ;F'$2f Ke|m0/IHՉ~>=X6-a.z՗%� 1[ԍ I�4GreXްHV[Vy2MzIO}+5??lNQ+f JlMγv.]e5oQzT| {Y/%⢴Kvr=4㝨Ӣ\G"/ЂG�͛~İcs=_=0sS@.C@WҖv~-U@@�y}Q)}eryShg߾vGvYVJ�`,YecQv%ʩ#BF[3ȿxb^!Se~%Cr]=�;ykWw6Z7ܹKߦKvf "+he�yo�ץ�� �Y:6J$%gAQtwsᑔٖ?!WjwdCZ zf;v?/栭 "@ݨ͊$ uX*i]")JfM1/dX[?`Zv^7vdvF9 r ��AS+ @r1^<bg_Ұ@uN*̌QúSԧqKl ֪U< ע˃6xoQc�s>h_r�K붔}~Pp^?^{ntAr<z"-F�u@���yb �� y?l<rw?ʛyVtnCeYq*Hbf� 7YGr*r= QLbޞuvv0 ٦77XΈ(S&VjUN�b�>~B� >~< �obo][h" 8]fصtɠs\gMg7 :>~�pTp׏-� |~C;GO?S4#A}As?r*Rnɯa֎kBbNY4fK'{w Қ\ !݅DӞԨ6AM+ qcFϋ� l LDċ;pyPz��:=xOl 3wx'HltBzNZLl[NjzGQ-@ ["�VM?c=(�@Ix3[R0;e;}TҬWlߟ'Įׁ>]C۵n7r{ji9|%+륜喃_,Xݱ5jؠ~Gl2]fjQϧ| �c�Qn:<ϖG H&�_'9[ v;yTjۗ|YyStP4ϊn_EvGvYVſt�H;w:UrP}D(lԢ&]K|C &9WäWa:L/o%:�Q|Hԍ]l9(/‰m)U׵1e3w �CKW8>6Ot'tm(HqʠoO= ;P$|͜?�l+khl5Rt:B!TݑJVi\8`;uCWkW*MFT>dlp]b; g} �DNDkثPz��\Ư-6RZn&(ʺ]͞ ^3ӦRG ;N=ҹ׏wWS_ʢj+ܨ3>ߨoCDaFiÃ7ܢ:&{_ 6C<Ӡi]xpSy%l`[Boc+%zUHe]l"B8{y}^q~n}U_0g%H�h9(aHLF8-2+U4 {\~_kT{C_ʡ&2‘q~;H+˞)ҝ]�� ]9d|uo;g=al AZtNuj]UݻVL!]Ggҡ,(wˇUZ'sFthNV:?(Ѿ(tUUE7yA+{((.ˊSՍX^{o0FWԣσSbv!Ƀ.(D" H{x3"W ^iy5  Sqx\I˚VHZ|LId(<27+]3bUF)9|g:RebRt:B+7wI:5~.ݑEJ X,)n7)*LK$� Ic}' ʹH$5C$I*I]ܽZ!&q %%[h}Pnc|lmP)#ROb5cK=[X끔b1`o{Xb0H^}+3?H�)h֛M;\V_~mZ(_)^/�X $C#NUr=X62j1fJ(ˉTgeҟhw?Jy>e[:rD.p5>UqvafqQz|;ʞoTپHGZҶ2yS|'ϥ%EeYq*?7C@*TKP{ODzkg|9Gߘ)#3 %d256ym҅Bh,yV3:vz_rb6[HʹmƤ7??>fھ?_:2 7ZgQ o.Jq4OM׶+!'e զG]X3!BG\=pP ~qT�tjW#*>lWGo15 vW?+?~s o.ϻ!Bw@#B!(D B!B! B!B!BRZM~#Pyp/hO}$kB!B'7s̈?~LJ|ivT5PO(Tz+Սm{F-2jKwT*<?W:)3uC.$Pi<͛2߽7(d:"B!B!LN*xRsO9s|kYˆrgbܻΘ5˖_eVf~竣[YE/痠 ;naǡ*RH&*WaAu-n(^Q$ FQ++᷄zR:yJEcgP>.?xaB!Bѐ @p?[Ek0.193 Nz gǚV7b~έ.g$TSί"5 `VdqUeoGb\0k�D}EPs܍B|g SzƣzdʋGUynR6L2CO% G�3DBE�ڶݭ #"^Z~mb]J7Rݽ1tLT7`Pgc)>԰mh_{j%?IR[oEDëyg1g~#?;髯?XگU5#BCY!B!<,*t 0R; b|*&R7d]Vs 5tV$1?'Y }cr3S I}/sjR;(QjJ CʑA"gL (QFjOyʧ)JVe/NinYU~vTP>0WFi&,�5'brU&Szl֫D<ɯ y/vv7wfC!U>3]X{A ҰſN32zP;k5Zv3qlrp>o Sh<JADb&s8Vښ)#uFQvXDJy@ :Ewv̲z}'(Y{&8H] $WLMX1nż]KW\cYk<ftw|wrl766zyGwޝ.]|�FZE"o}{d6��~uS 'O3|�w>r< 5n/P6q!ZG> SZ?>8f%mj YkA!;O[7*B!B!"Hm,V{ XX�eҟ1}GZA"*36 �ote{]7L׉@ꓩm;*d�wX|y^{#:]*~v3ނzVQch�e;pvfObutwҡ)uݺIق\JZ�pS'NɗgޟMv ~xiʑY0yיƬY@S~[>kOMo}=VT7$4 ?a3� ڳkɳ_ ԡsVtn<ߥ~Уy1R3϶'lJA|~=V\iz+{?Cg � R^1JS%Λ]^$;km 3B?!/rBVuOz~:$mmP(2Rҹ(eT˵C�oſMeL]c}4u)>N*yPv$oo&5ue/n#8z0!}̧U<Ya3? _:Н$s.}j _x xgg9gC9�9�P.�cjm�ijzg4mi8zg9fOhN��[q5,Ʈ0mm3S� ص7b̺Gaaya.<�Wٚ}H'Mh,>N[n5.Z�{<Iu:`>#B!ٝyokZ4l^CfK{ I)><_<]dۭt�$5t�@)/f6opߛۤZ@QIe�G4?~[OݪM%]niFsqJo~λ;?󼳨.�9Vynz,ňDGLᣣ_=GuBWPj'Lٌglwn 4{ۊ-X֤ĀW;ѯBj>eM:  HID_GxgS!<(~d֔>]t^B ddsQٯݎ 5MM2d$al߽.;k[F^5_fvtqFݼfJWx(J޻CS# #|.i��dϪYwoyh?/>X��[jf,ʁB- PV =+p.߽3bS[Y([7<|D=G�@qDIEA=Wߞ~Cg9Y�~[vb \ğ[?M{<<2�z.;41S�E�ZOnW</WM �u-(YE}wLO$ �0e"وpeI�غ7�z(-A}Ii�KQ�65׶Lvjf-Z_7<B!Bz{ }heK4Ϟk~z_д @frw0K _:Y킖a�3֕>r6� 5:dw@snw8*-�4nks;E{+:٩Ekˑ"^"*;}b{ &�O[i0 })K"ʙhLS6�Ljqoa0z?.O)Jje_r%F&�,ßڢS#_?| v[Q%0UDrb(y(S��zjrT-w{|ΊWxrEj/GϏ� �n$;tXL�u5,� $Ńj5c�fHG;j&M7/o?S'f.nf�oX5`ŲR�td߯ddfnb[ßԍgK7^V7j15nGFG2٘P�N]X(ܱu{VcwcO m ag1j� \ėÀ$Q�0~b}9 5~lmU>q>%40 B!Rl 8֯:3724 t59(oZ]~6rL%=\Ei ?l޼Î:GsǑ˦%6>|eC.�0OH2LYqJ3&~YHYc|1껡]r#ΤQ|ɛ\[<*_ȋf.WTC|$7azQnNnM de)URNE d8/.��[C,0!U*^2o`aR7Ck+džtUc'<-4@~6QB=m)yŽ=-GDq Ho4N~R[3ȿxb^!SeZt7O1k `R  =$Ͳ@)q4�nB�55T&,jxtQ#c& � �@Uς7 d#)-p#B!Sb;m_-U+Ch3n--4� OL_NHbf� 7YAr<zJ$۹j>+?qCOny@LQ/9,$q:7D]U6y � O,)!/LYV, W~U S}ϥ_/Ќ:=ut*7Zrͧr;]Ilm wNwߝ[A\0lu^P "+mX{�j@~R8�4֗5wQ΃OlZM Y�@xN}<Nt!Ѿ˦a8T_jGT-Yhg3 m~\}i)6_ٿjAQw xl߆ JI{8`=s|z 8wgk$S{B7sr^;w?�'}O'��jx&LYud G/z 2K"H/hGN]zqtA-C"ڱzVtB!B7]ՄEiyVTG0�ϕ+%�@"1Щ48a>(�@ ["�VM=_.7;C(SIS:~!YZ-w_P�wWaeSfd 9[ v߻dYVfjQϧ| �cav:Ewu%{:p;Eh�w>v縵~E43oi%p[C7%s+o?عsSɛp-<~BwI?Lօ+O]_ <uੋdſ/|Ɲ\(zKk}hFvoY0-_qJ~{?h%{Kr5r"bӷAO9KΖ1myjE(A98j��� Fxߤ(ȥо2m Oa�,mA: O25s;~�uF,ZZKEW=jp1߯B!B!rkUWa:li'{]nNUNq~n}U_0g%HrԍX^{o0FWܺC3dnшε 6; wsս꫎7ll@լW0Q-'g*}Qk@rktcKvUhdǩG:v2<_�9bN5l3V.ϲȧɴC:;^Ex��dYz.")+k>%uMly#A;SJdP"Jг:>ε8ю;ٳ͖zGx,ϥ`0*/S?#(*E19Fjo{E�߯f53]$ Gњ*q<ij|wH$RMxYVqJ~{?!Ƀ.(]%.HM42f%ɐrxY \=3K/ߩ='79|J-0fV }N20*ս',,M8;:6H!<lZ�>&qw.#B?Ãe#cVё%|1K/9ߧ 91ҿ$��&HhYTj<J(qaD1QTs -9įP9�PS^ҕ Y7YE\8ɳ%¼-l9%%X,& `UUBTN~vcE?gc) u*e`Rg'扌͌e H�J\jV[Oۘ1g`jj mR.W{YoV7s}Xsn[Z8*uޯdؿsDzkg }z_#*!zB|FJ"'~m5ze\s-s;ryon';<3_uC3$!B!*izBE05Ga`Kǧ\}/>z3iP׶;So%B!BUC׆odﯬMn-SB!B!B2`4B!B!BJhqQwi\!f71sy+m >g:fe^!J¼Ĥaf*.'%E\bap3>'}NNJz_,O{ GqGC1?y7x˨[F/QI-G,H`M~QDQhqJSv)H `ƷygTAZrwb ՚rB'3}eSmfu^~F˼鯭 :t;X7?!WzrڹO?LԵYrƣogj&S,0kޛS٫vbA HN Xj%<eӹ zG;aUvB^.։dLS�9O]qNCQ@^�Щk.;]o96ǽ zNM[8U$Ί^|x� {=Jns72%TA{(]<Tv#Gk&L>T S7Qq1IcZJݻ&f{ ̈́FKSB$`0b 9x(e#n_VΟBn9b Q8._~fsn9lݧ~GR߄bmփWY6̓s{_-N=/y/m�f!˙43aܘ s y#nq28ښښC^Ro:unݧ_%=w`0*3!jE敻T /OW7O߸`fUګtn[O_WL=f@}Nų!i?r%֫{X񿯽ϟozcbio@l_AfEquM}k QIU3n8y"owvD!=AA-5 ~ HPs܍y\Qh~vAV<Wew7cgCW//vaMK?uj?G?YEE0 >$5zT$'}J\煦YϽ�n ddlt+-(u¥n!8u+4!).VJv ހkk>԰mh_{j JRkǠ$wg�Ȋ<}NjQtG�N/F Rԗ7O^'q>6�@{i 9w9*!߼J}w,�>G<J9Tѯ>[$ػ_qnr;"4t2EEϘ2kQޞ!ic擾^_}ȱWVе2y`SހA ]_YH@L=y[Ѡg?hj:lʮSoGR#OV;(<lP��Q~D.h:�svڎ4^n,%Rj$+ǚchhKA^Nnu Ԝ4{߽6}dDn_ܲUD} sؖk XxNsG]9Һ`SuV/34u~'bkqJmYaQ|>aǮ@k*׮co8\�Г3N/?[6Q+��$\]$>%Z0L5}C5]( y㽭�$>sJ<Sf2?َOϮ_ooyeY�jOLWr_#" zcU'%a7Ǧ(#0-G^�PfoSN5' jeR8"z<l֫;/ ]lm"+5NJ[qV]ٜAv�{͇ lOxȕX9 پ^IDGGC狝]MDA`XͺAFȳO 1zVb@~]AI)뻾(~'aY}N;vGS37%lx VZDUus9.4QzeEƐ>fjնό{&>~Pc}veWv߸p-שkm}%c߾lf;A3Q )qK1{Ò?op ͵yO y<wPnË߰uuyF<вQ$6&ۋ��S\QDo},Ԣ/_ѱQ;ニuva߹-,|Qqt򝃣6\Rpv=vdɍ� KW\cYk<ftwL|p̊K6ժ­ׂBv:XM]]S %"2"2‰9xƯs?%=x|a!y3I')^_{{Pj]�E^o4mlB;1]g;FHnW򤎟{o!(Idӌ ʪSemGR dòHmG$<o9I|\ vb5]Gn^aMw ֲ5ōw9o{LW' ^q`ӵ.?/fEӹFӸ\aRˡ$E;N\x7{=ei:NPGJiZ ׭S tj6riu5@܏kJ9Mұx<w코."-Y0I� RB.n|�8zp-z^F,$�,u[/e{azO3ڟ]Cq�LxPghFANvu-Y$� #]lv=['Sjft2%=gJkpu~ʪ<ʧeR�AܹV=wr7<KX�q~qY|ɾ;o=K-g/Nʞ?qF{ov'GU�n ߻/\H >MȌ3ó3/?l8^~t>9ȺR$!a.й"O|ۯ6+%duj ZYKpd5l N Y~Q�p!N:IfQ^M�BJ~ 5|̣B0e[]5zUvR\ð|]b�z:$v毥Δu\HW~!qlmkGږEI/2\on\]lp6NTrr YEٽnTPnE݊&` v"tqH.b336obxY9 ǥ˄,m&H8�kR%]"\7pr&vmPC�~73sn8ɉ �MOof`wxMmI' ύY?jad6~|Au{C ¹'\<@ �A$͍ԙ/}w( 3SaAoM/S[K<}.^0ƌÛj.s}/;#S>z˷<Qֽyy_JE" S%?ڨ%5gydD%y52g$;k4 ^ʍ[y5X2m\쾑43'q� M|tLK{&oyV*2%']S+/dEíedL d;R[yz-olXtj0\ZაK<WnM\sEUsgZQu-h]�xDZƚ@sDoNf�%7D.Sњ40 4С3kj;<( Zwl�12 N;q*/p �JV&,Ve~nHD{ok7�j3Vo�@no> �sGCwZUzAvhLf5ywm& ^<LOB"|qw[3@t34��Ht?s:=pgxގKwuPg$.u? ͝#\N yX 'W]~ '|2?#X:=TL >';ֽʷlr3/ H9j/^]VZ�MdoG k돮ΔW �J6W/Сù=?h A|!LOyoƈ8<)~QA,^2kRAbB{:A?RqpMr>uo7ltj̹v¹NZ =8W,^Z\1FT¶* uDڮL?hk ÇsXo`}ag-#2Z� ܰKсX&7϶Wf .Ҵrs{=,gB|? {xHӣNbКRk��jd ōƌa�yPM�Ԙ4�t HP,]arThkFQ8?�\*bD.Fz=�@aK3q`Ӎ]3ƟkؼC'ǭُlNM:D $| }amD 1�S1X)?a]�P {DQ䵗2h۽¢\�H]Ic0�;7<}O0jǴ�,3/.4S^y7@UBDz?Lt�2_�{ezaep4�c| !;o"OJ&=uN�=t@^}zjdatna]G%bnlb173��R9goc^=ۛF3g2.e;��pN}F<QdPvЦ:� -BBh?o�8]mƒNݗ^ K�@Qi[�4ԺzVD>|{,.D.:x7v ۬[0ٷ,dsj-׸"F,X}sBOVjL�PֳG8%y{qm-qCQ2?翽Di��+U.؏>nzz=�tN{؝q  I(v)t.rmoFkj=Nn�6^mF5-XzҦQmW҂gq|ͤe� �d^y诠1�ڪz 2ΤhNc�LcC ^#j~͔^䉸a vS3TN_uAV_�*�"x$Ah2B:zRjlJ`y/Woi]sdi�<O}&&A �m!K�|j=o9X� ~kÕ_H30*l:-d�+P4U;0Wo?|u9UjuZþ)+RS]FO~mbztõ4eXvn�;1)^w癚&L: ��Mv~c�TV\2+v@ lA>(�K֬SgypAa%�o ʝ-`9`>vrnp4߮B8yf+[A!G^<IvH"w۲b{k$M[4YK>1l5;!�ֆOpK$*%*4:" 2|AOힿƃT3s>ԐYȊ30BB��NWg>adHMO:_v:~ jS2?翺T�@r�Pp/$@xmY"WČT췀e= �bF=me>:6htywh1ޱ^q �魣40a>V,*��/*�$5gue q $/ + (1,�stq3Q@_{nwNѵc=g#A̳ Ua�` D\{ ]0.�h;0EP�a�^)1LOfH.��&1TM*0,@AϺy WnHRWqgezJy;xa??/PAG]혨?FSΊsjΠE7s*Jx YAJ:=73aEE6,Tj 'gv[ujY{�7V|n\ 1<.j,]d_~ @ *8X{HewXzؾdO1z+zxYn-kX3ɨWg > DWm8N*<9zB� my_6,�H}%Yb!A>Ȯ I\a׆^@'VwhuC<6|z4Cڳ1ߺQݟg="? �(� (Je(K )� _EIA>vJ ��@^l4�VQ_9(NS``_׷f>uDXk[j1,TQe{&TKya*Xh_eq�HN57`*`C+;^zNch-oVc]qV�<I�-9�Y>P?sTߝ>"KD+rGŻMzQBsv]#޿pN};4F* �3Nn۪ BntF1F(M c.;,9*�#wjʺ{HCuhرZ !&YX"H[z({!: ˆB guQ+P&7a}1͈U4]JY+tR yP&þy~,6ğ`46CΝ?xř= VghV)"-?: Ì/Ett)$n-˕OT>(vuqwJMG `Lq9dH2)s7Z~Kǹ�nڛxT@vmpDC5QsSޟ-mJ*H=a֮Ozr~ud,Yz-m5Awr�Qir)d�QiDBI^X0,b_$+[9& ˡꦎ''8LS_,+QwY__q,u�>h¼tq]X]~{zW^G=8ZMaoGr?v Z.B�ǹ�0qdE*R*y?Yqֵ^DSҀLU9TϺ*?'Ƙp<=t%(qwd7əŏF-zqf/U&CrIcQ^j_FuiW_~IG^(�kj\F:f왘l?,nܺmKb׏OgQVoFcߚSuɶKC}ɬj~Q^N2"rj~O}!(*g1zNe딩td!k6wC}eeN-A>OؚVdӓO ��k=pAWoi�qY3p]c<*ѭ?{v ͢EW3weov#15ziEߴx¡SOx�Sh-a4�Qɗɺu|G}%MƘ)h3Of4?k38O]HioUvM na8RS\uqSI]%? U?KR#Xl/KB6ik4d늧ț@ 2B8"-Α_Kry#z㾇p&bw.붶8!`4ptjں25X5~Kqr9N= ezC Ź<m};Zkb8kΩ 7}K[$35�(ht*lSKڶRmr%: Q<deJz:DQ@.uS۪=zI,IZqigzD ~uq.-|y"nΊK{\~1]tNoѥJ<{dk83c?,~p%R~ٚ�ֈ)( ٲk7? ]BCKѲL80I ./Vy0K:: '��*zhDf=s-AGmX2WՍ\@w\:wU]?? 3�4MlY2#v%"y[f}]q3*&J)]ؗOZg85PMGWEə%7�#_{nČbS'”,SSiYPV S.CHɾ+Jcʇ5{ЇTB,H$$0k^$K,c^~nQIAe#W&"^nrW]PC:ڪ?rQf_>i=fkXZU_Htr^�mָ!�eC9D"��W#b~KN}oD򟘝FEQ'ak)RL94S\Y",IFVO8:F̑v;PR;dk*լ'!@~au.G"w�v_ �6ņtfX,p[A]|G#Gx9fzEQ^.\ivTAVz:0֩Y=r?:ޟ?d$?!olîl= XMѓ%}`kW{僑V[2~Q^JH[OK~G"&hh+k_a k p-ӱ uT]xZO/"#-Pԫ\Wo?(Ò+]H]WcnGte-KjKEc C332 LUm*0F>USԖ<~0,[R17Ew$2Ibr"F{ɠ+p60F%\zY.?OZVV2˛@ i(qP&dA]qYKN}ou >8QKWWKGYzr)742Jtu8Ȯz>jѠTJ5aq[W; Y �h\Sͨ g[A]|G#G~kAY=?]AT5>7:qE1խ}l&[Oǟ'F71kit(KEB_~peK' `I+FbFjs# ӕ~wOTGx;OuiGi@ D}gȨMԌ]^ctYL+l0\7C BӇ(#،y%oc& -7=i6# oա ~T_?zX@ D푱@ @ wH;9D @ @  @#@ @ P肴Ę$>A!&<p;SV"SE �Y)iU3Kdsbz_¯I|K_'oѳ"řA]D)G?B9.vMZQ~aN|ZOҳ cw</~?ͮ7[q[@]?b ? vxӦ+I�Ұz@;_DsRu* pQBn|g lֲG |_?RbD5U<wQ2$ۦ 8@0"QpOіՇӸ/[] hVߢg67q_T.1&׏{'*#WWS'o6`T&ymVM08N2ⓅU/9'![8r: %$7q_l׋;?Юr}fj y?Xmv!*#Û/LHj<9p򠨔.'Ξ2\8}<ѯ[Xt@b36yxmz/4lۊO;Xl^o[<kKG :ul/=qiϿЦ,>w}77O{tbpSe/pQ?W\61u��}@ d$Srij+0wº�%=.ݍ,R\޴hFxS~fˑ/{녿]ˮFN7q.:@]?h f@cs3\e"ɦ8zEٰfZK�h7vP>p$h"ky^AdwB*4 �}g1E Z:9 f�A7Ah3p�>|8�/_|S(8�pS.$I C7ݏ-m9pM˱ӜlT��߉tm<{w_72g]~Pj`L�pAAseFqZO 7�0@6q�|xYzXϢC5O~œhYFŽ=9E&@ 2A-oI6 'k�}uÌ6.T25N�HtFVwaҊ1v`cDE1^!,~S5g99|RĒ܌bZ*~tiamKܜ\UGjXV"ft4^)bipjږ'Ҽ<BUKV!VQa?"nh\z~MB�:Cbo=s1@ ߂2G,s?8 �X* g> n.=$'/ #,m'K9z[0QΕKqg/{ཛGćtU)[WOs: n>atjݴQz OHx[</*htX< �xq(G�$ ?}u Wbhf1rPFew#i2HlmuH;U�=,c{N͗4dAt�(J?(UG bZ3^%5zճ:Unz$ENE�@"vh+zNۛ{L-oj)S2az$$w/ "^In 0F`ࠫ3_.cIj9KA2�+i+>胯 e5k S9}4�~ gH_ūX姳+|mbN\}v sq%�phIwr< 1u!!\1qu 8Q^^9xIM[<zdܰ~<�i�X͇WkPYuH7U�Plv@ �ܔW �Y]S1iH_<s#9F t2eLUK5^‹'ƍKe5<ЍL>jw!s<2szqci�0j'9252RyLy ؚ*ߌuDTH6^ql<$OP7k/^X�!&{E˦M�y'�F 1XI=*!ݸ'QF6_*S͚}S>eԢtUKDT\>s7mFZKX�@QcϝܠǤz'YO#հQyvj^i~|駈cM98}勊)8M 7S"|^W74Օټ5<=)0[P8epԀ/׻"Ko>@ wSאNW7W#l 6û01"�WJs2=^�f}a{NTꭽ_^^&ia~w(OHoH>l #=ЭT,pFPЕkO\o@O~|vzB?7on ]�p"1q R^<.x9 zAX\R"!O*Έ=x,|sqK6,m%dKcFwհE@aڭ7ÚMN^Nvɴ(LcNiʳWT KSdl@VddET{Μûp\\wm1fo$�]�)ҿ5% 6Ki` �&mvw̭!w<䠱nos^SĜ[8ęyh $:໹:a�`:dHv-i>2k\{kNƬ0c-Uح�SN)ڞ1ƌÛj.s}/;p$o(*~grfSnH~WG.$Ӌ[w?eXK]F{mxȵ)1c}z7=�;FČ2U)J#_?AdZ왹SfgGt#@ Y`EZkeSb%%{CO-abfn;L dכ;zˬ艭'UIy0=zޭ;?e8), ~4am daVZ~ [2MjtN_{=\�_^}*a {ZIˌ8r%\@Pg]T$'Fv{.SOҚJ ̃xwݛyg ;9fNSM 2\i=>4{,Y$H9j/^]VZ@ Fh,+mH|rOv{o;nf^ֽS2eqYy08}űA7Te^HTV׳� tpnmöZoB?A_S^1")2?_AdTz^N…{:8Am}6Bڅa6:5\^bg\ +sK-c_Xaލ}LE_:lkDfoⷵ7Ƃg/a{a􅝵˾Nm ��6owpÂ/Ev?:cDAqz$$/"*&C`�謶j0:�<Iŋ�0zet8 B|ʷ}T*\0�ߖhi|i#u&�4L9AKׇee@ld~6�Tٵ]\56�X5Q4h8,>,j! 军~堠7^EsQ79;rCQ٪. t�65c;trܺixO3��0Rc8�4V1 @B-@ UArW E)>YBq1u8�tr=-*((�KF݃Vc�:�%o(��&NlO�t<ym<c:nzzw��$e�@~Se t\۞zi!@%Փf2tl�PS. :v#Iރ dDk�޽u=<@ajPPb?b>} Ci��+EW�tN{؝q  IHX-A�@n쭩_] HDhVee7On{`BM�f4�Neb3)xnғ6o㾪�<X%o&-� �&?.N9�V槐 LZ>J�T1??iofz6Sz3'-*OdXS:E~YJf :t�{U"7L _W4.~_v9dg5R٥jL� $_x"fكP�<D �,n٦:`U!~ĄZ35M,9*xw.b�^Rþ�H0n4*LeÌk!qpsn횳[ã :q-sLT.Ҽz'/b.=>Jԟ?PG _GqPʷ�`|[ԏ�~.@dJ 8MZ ㏠d4{uTgNQ:n͜&p_cŦ _.B.zdGMPi`\/<򡒙4'Oy��YC�C-]�B@ R �0+ �ז/rL8JUT{ MN-* �M_a/ 46�5Vs/׌ h /bcߝڡ A�58:=Mc#hXaZe}Sa��h+*0U� !7%^iVQ.D6*Ҋ:^;?~e*#y& v)1=l{b�iH �� (Lh �0�jTia Z}֭.`V(WNyO<4Բ�o �X �aaCդs3J }:14LhƮa۴.QiF�yeYM6>]!;NCUeYA^e=N/^d,S2$ǒC!@ UAD0lsݔ肺U2l r-t„� Y54@L2f t+ g{bËQӂN n:vNtf(6VıY1:  Q]:@�BGO)Kuq@ѭ���IDATIҍh�P6xt#:h@AS�i.p�P$$�@PT1/"פˌ�}q)J j.nCǣ_cJ ��@^l4�VQ)00LOʗC65w wm {} R1*jvܽ4[rH%/L s- Q]:�ѩLe2{]2e"�Lm4Fj5~ݑٛ'^w!$?~e*\;-=}Z=E�ŭ;(q*uu}R+]Qtɒކ@|⌓[ĶP8]ŵ]1)#b;Xk%D\|&:ۚdbcXᧈgg+U6�xWSkFzFPdN|�ht=ЈI\1=1/"ڷ3slW:͢wCi? aCtg>Ow%ݾI"H[z({!: ˆB guQcHKw]]%$o:@ ~s:¸#2&7?z9mkИ{$Z7L$3OgW]wZ;�(r;FS[Kn#֌9^bd׾ZH�8Cs?N[_^oH~}zA<X �{ /9=I`;Nr'j~Q^N2"r2:y4*GmtA#j:�4a^}:}8mz8|I-kWB>_ đqlv6>8~Rq3$M5!s<uAL8/JiwtΪ\H?G1QOxzKkQo3]-?[(^LjR=CH)ȗ?"νP$�[u31#ٚXܸuۖؓ["QVoFc߾SuʶWOk$HvIo(Eq*T/Foө,fӱƓ{ܗg߽_BŰ銵+MX41��k=pAWoi�weov#15ziEiCٮ]לa- gYX*+0ùa,Zt51�pOل~~j&h @mcťIWNIolO)\6a߉ }N��C`쒕fsrV=<M#LM':u'�0U&\RALO-4/dFcOx۾+' @W;];<`kZ[ΒM)mFwT0lo�4�~膗ig̬Յq NShҢxL{5H7Az`GpVVMLTRi7�E{iqcCO օ2Azv+JNcϢvxoW=)$TId [Weu7bnb-ҬK{\~1]tNZoځ@ uq.-|y"nΊ�E_=?SS~Ol qb짲^KKI#WAcMwZҮF=KB?M@׮cg!%Khيy&L*3Sy)\GgA;oy��SEo�0vҌ|!Cuȱ )X/2WՍ\@w\:wU؅3H�p&s_vM~שL{%GO~7/UIT\ߞ],B䂁G:uXO=xڳ;,3uLMT*O*f4 XB4x\u=CuY]77KT,WƬ&�9dĬC#J]Dnf:WHWp|"iN`VWbEAVz>30ԭͬLe2�+_L~F|U%qMG Dr^�mָ!�80%1VېD"�ǫe&gদBo}$@FҧBBT⒤1KPʡ⌄<R~- j_haz~mԙ**#ŽLdeʚz*Uo yZ ?'kcfV,7r U-J(ELGWîH/M-Ukt͍om KrF: ;9֟%pџ%}`k2僑VP�(/PB\G"&hh+kU^$L4:y[Z''cGw=rR^`f\*?О?O<a{ PCWqrC_MWc J%}d@ *dx2Ui -{+uo "^ܰ=7f#ꋨcfk$y|[kA.>TASp䞐Ss:a] vH \_m;[kDP4n܀@ ߱3G_O<-GvGO[u6}F g@#@ @ OE:G@ @ @ �@ @ S¬LJ"#Z �1voI%F;umRǤL}bͲ4Y|Vϱ@@ $|`E\!]έ''!s>aۤWlR^5)[$�%]Zv+~o@=}O^:xO~H\ZgvR�p k/*͉cZ@JztT@ Խ~Υ*j&.xWh8&Y-ytm??u ;)%,3X'ƾ_bP/Ȕ# >v""iOs|#H4w`0Q~}K;7~p?('ܤWf6X  R>�9Xh/?2$ۦ 8@0"QpOіՇӸ/[] hTSx u1;_�CQSߨ.zj}��Ǽ:yӿ$KEbǙ;#J;~ƪ� ymVM0͹rqFe'W >d2F`%㦹DZvf%^NW!'@Ԍ^E :톺N:u9FcKOaZ%ݻk ͟xvDP<t5+V9ؙ造⟤O˧1 �@-@ 2#98y}oF`\y7nma#H\&Of#D k]Cμĭ~6-?0ދ{4 -zVV /$7ԇ榟sN nK&8})e@#_W ~cn D5~P^=>�ij+0wº�{1<ܸc?U3]\K"!|peR FKj)@ g{oZ4JR(՛³|:TrtwsvoT:0ƟQ*M@ fT$� �^r� &7E3jİGޅ_ K+lw;؁&Y:_n|^$ֳh4pk &u~ qBb�UnhLaÇ7c%܏u&4R-'ͽ'J,FvW|J&?;*qf]?^\ߠ�m t#mL9vF̀tvP!�->G޹ҋ4#Dy=*ZK sJj ?D.t8JUҹ9%ĥyy4/CSSʖ:MkoAMv'/W2eWoqzФԧ`YV/ XD{@VI ?QnNTKYy|-*sJr3ijZty72{e~?^qRݶsjS4d~+48J Q@ h ֓\&4:Ƕ׻L7ԟb\& C#/f2{6�gcu8himBz_g(%541 '$-4:,m�onx<8~J!!^*xqoֳA/$�`$ /l0c4sƇHQ)`kzr F_v/(".GXXNI|^׾ .=tcA[H� F0\~Կ{u"D-!ōk0 kaP Z+4ǔ׀{͈q[ddExL^wMŤQ#M̍n<?ɔ Θ-pd�_ylo} �@8bU<r5J*Evr ˶k 6?xsv:/~-$><WQ ;'OgW,:^QDO<�/O,_z@ _.MmansS>W,HpsӔE�~J037[Y’wW' ;�P>eԢtUKDy0Q )k6:eǗ~8F!PƬKHf yiLaY7g<uJ8??g؅>F9CT}(�=gTc%y=�\{ŠM'+*.Pn&{K?4ptȬ^hѲvӟ/\>s7mFZKX��?/ryH!7k<B)dH.yFjr 1w=2uWm,K]_dz-s(걊SpNncR}G+sy9{oȼ%L_>0i�5x̍E/ԡ7LeF{E6d\ɒ/ cW˹meY]ˢ%wSco֮�үo�CQP៯rU!oH>l4�-*:ugյkʝ<Em9s:wm��n>@ wSאs{ #_G n�N?)JZj@t8 $,U68|6c]r3\f*?NR鸩&?|'xY9 �@m1foA�Ddo]:L~>mΗ>FLTܩ0 fJQ­%grZ+]21#-iPkX6}sc֏Zf0ڔGǴԻngaa ;CyMabsng | F̗;9#YSaȬWns60F}#i :=gO@@yA _U]A/m|S]_B'X]8Dt cUne|(cԓaƁ#\>3�§�I,"$;m;EN> M-_ig9[S-7YpXNmW;wx2 ZwlN!JۮQ�QS<܎#[E_̊zRبY(�Ò~3VVbaz[mw~|; K ]hƠӺLZfő{n/ �8), ~4am dIN#].1ZjcP84lʜήy2=h.f�[;y=!|2 #o_U᥹�{oȾ  !ոbY&o~} d\HghmKn3ֲh,!$LA1#Wz&2׭%U[,J(xb:�xh 3LiW[{c{|q&7siDѩ n_e�`DVv4 "6NjATSMپ'8~[}>Kd᪡8?|窘 {xHӣNbКaEQOPhx&�Glu J)*3-ƵM7van^ramN>ٶ:~6�TUR1:i�MYf2_?\*bD.�Ă �xTL%�/m㗗Uˠn2r r U(^Ic0�;7<}�߫>[Bbel:�} `U|00,�p zn5/-�gh.F�`:nzzwٶFi6s�c�/?֊4 @'+O7{*Ϝ|ߕi:m~iikrno&5,KF+yT�`U{{yri A1�`bG!_"ʟx|]& �t=�Ͽw,Q~CqL�h5l0pGu#%-g 8 ٞ�8x`4 z � t\۞zi!@=?LB\,ou׭}~d\&_ȠW.}�@Io꽋 Խ ��w�(vc�ul/ucH&4Rm{a2،Yæ|jfM4eߏzު^� S҅8�tgSOg<i<nav>�$ k .~MT&vk�Le{j7ktݾ-О4r Zf {=G^�`''Ka ~/&r3ޫH+A>b�Ֆ0V/�� �X-ݲt JU7�'LMKc &]\�BR�7oо xu@ "$`S!b�#K*hw܆hcsEbB5t{ݚ9)L8྆`20`Q>K),R w\2jUln'FgoszkK]PX)ϻnߐ)_nlU, _.> Hv-YWGuz^9r^rEd~ϡG()q_'/#-C1^V{x#jBqH`\Hj֩T:[ |01 ˟u@WZ16YKݪW.]|0-cu56#M\*�f \�`ѿ �|!Y~�kZF&f^߻|}^+& h-vXчquw�Kc z1D}9E"-$h%ö�Q)B}�(L �ZdB;,kS" ޷ཧŋ *n~!�� � Z2UZaXVu;HS :˯p~3 :=�|?+�*n\ 1<�$u@ TXr'by=kAA({J`()@Hb̤6wwZiAQۭSǎՉjn ӚU[Z+S".-[1hmW;Z՗usqR��XX:kbԦ\1I} ]m%2 Ɗ8v>7FGb~{1ף:ɑodR[onTשDDt6PБ}<D׫.$^>|VGY�P(HLj#}~9?}CQ zf0�{M8�4&�P �:m5pD4_UX4P;NS:ֹo^=S�IEB�ELe{wI7⠃6�$=�6eV_EIA>S(Sl&ȴRu3-FkYfv1^fX.U@ ~JOFܲҭ"ݺcסuٜ~cmr>|6UwhL= |i"!i?Җ Z2ekw#b 1E%ou󋊵�D<uiL៮hFSNfĎGݺ{%'-K>1SDس`߃}>KY+gFt]dF0wMwK"o:@ ~/}"?MNUe\<�!y?j>|UQ0mY rN,=dk-��!ol>�ٵo&#J� fm?[mG|6C}_sY j?˴krN=>g75l8-3)%z ghgiKb�_ � Zx=^3hdH.9Fin&*~9u� ,MOQ'RP:\d;FW�⸵~jI7'/)+qs [z *=ͺTߕ4ucLS( r), gydnEi}m4es Z?fIͲ*Sp7'N/TA+y] zm֦4*Gm8Cǰѷ#L=WB<] /=]8wDB$.P2c=*FγIvt$B!zT~Mt2TXg.vr7n y ִz%NB@H^٣i?�0fS N]? �LU+WL~P5s}YjFЍopAИ=δRח|r]9y{ú[βTWu5˶<aJB^v)PSH[1'[W,Et@^lm.3ZfQV)1~Ja<f7!x[y![{&9U:H-'Ȩ+=��hҢxL{5H7Сɡ�'mȳF>qE('N& 8x U;Ϟi3pj?ҁq'v>B`VmFwT0l>u%/kGpVVMLTRi7�� /lϘY 26jݖ"Gty7d[7E{iqcCO օ2Azv+JNcϢvxo@Aiļ"B߻oP\/6gS#Y~_dIaoS3>UiR��k %:[k�0eˋUށg|1 70d$RÖʽ"&Z?*n>Υŗ/"O$MY0�yIv8imɎJ<{dk83c? p%R~YU�1i^k'Pu uyO5nDt#IT\ߞ],B"��W23KpSS*_7Q uk )f Z_!(J+i)׺ XB4/x\u=CY)]msE2}25,ʐ7@ u#ֽ- !۬q:ˉ?fѣ,Z-? lի?ascsQ/j8&ҳ6GB\"fi[Q bF)'qsz#3'mW-QjrAj%X,6ʮ⌄<R3>x- EK|~WvBL!d[[ԾzGx9fzu $�2{G]\PdfcU-{\;KeIMN}T".II/VTa� 槶c>Fϙ<}J umj\" ~\>CUKltnaS=R=r3,ijhIO#z@@ jO}$^XC] &Bċaաҕ)s~6钐& ˯̛q˗5A_O}!1?F�/b~Z˱8ij@ i�@  +6pP9?K޵t9f%Bv۩3QSB clWg#? FW8"G U1@ h@ ~)7@ @ ? h41@ @ @ ?F @ @ OhB\U$0%5-3_P)/>@ NRBBPl`NBW @ @m/d˱:[4y|ϭa9|=uQ  ov/|LtCL˭ڽ{꒥uˡ'mImYU,_L+s΍_9e>x.XpR$ۦ 8@0"Qpڀ @<u]e @ ~12f@:~2]P@ r?,Y9m(@ /M A=N%F/mv%#b{,Áy[YMMMMM-H-W;ea&?RC29z&&ƴZp>yщMZ@ ,_>A wPi�:97ϥ ]&��P'#lK[N8\r4'�pS.$I0�(IV٤!6�9]z*A  ]pܜ\UGҋ^a9dPrsrl=Z+^ Fw[Gťyy4/CT!Z)bip5+}scxs,Z��QFzrriaN)CM]t;� .ST~$7,O1?l"+;=RKy=튓 9NZvN[{C @ r?xq#>pGa|Sa |c>'ݼdfA z=|EEݎq.J oj@@XN% plըEqJsh7xcz6|5lwl޼E= lǗh`!n@צww|tk—nxF6:dԦ ;<rڄ-ƕH�z~o=F8ֲ˸5ҏ(մ_wf@zoc-5M�p{w\~Yú4:Ccܹb�.m9].�~|']mZDQnٶ-Ṁ&ȩzM;o^{405?ۯS>=t�!Y#,#;u6 )/Ӯzlo@ Qh^;s}s%1yW)}_7Ƙ{͒{\�pV\ _y-6i*]Wn˖Y@ z Gr`פ§ȝA71N</vV1\>:}l+!GϻGQja|Ȕm{/m=l5=s[Si/]˸XS@PgwCžr_wHm/CsnT�Ƿs0ɴ3|��➣ {o {fQ�`i�psy ʢ(W/7Ev`ÆN SN=pYg}/m=zoƔ>�0ѪUK[6[aV-[ؗ!ۮzlo@ Qh!{Y?PŠ5WθR ٜ^ÛjUu�H|&a(^֓_20Nh{@ �`sK�<Ƨ(=`:zwSC6ϲU/?£b(vZ=`̡S(J-N~VܳwnzU9s 3 lh+3L6�5:^*!�@ɠO3U1iS/N�~{?عRdPgtYCGd䃁f']��gsr3�n�HF�x\vPe֡"eX☘1>`V(el:+d�RUղ,\2귽!@ D9\VvwgϩA<�\ưoS0�>U&t솈 TQ A2(/4t?Ii=`5哝B&cZeԀVzyݴѹM'Oʥ<&ݛ^ȟCP@S)*vg;)NPr)c.[Ʀ"�#Q&(:$Pw&-UwޔdWnurKE�$;w٫zL-匳0rI 2zmo@ QNǍcs,l&)`h,C�ȍJz�uقܖKh7vH*@ 0�}Z$}U6û;-892i3 !k$.G蔭xǕF< *7CK}=}򅀣Kja/�@y[v'=RTGAZP&v'$(|Plw74jLzף V:uDٟ!(̮mo@ QN'NKnYSOgnݱLRZGGMvZֽ>WB^XFStrԣ(,Í>~E|�8.l+'k=}1aoEaT%o:@ /`�� $KZ �@":�*FvAMԸg1?#aofk.Z@ԛU<X �{]B/TZWI7S]%vwVU_5/Q>]@ 30zNҟj6k:[N~ucXfS֬nBb}bhTpf70af[G- tM�4/dFcO(Jt@ ?vGh9EF}^��DcsEZgY]f*kw:?ᣜ4XQwgwPӧ.u!^y iJoylcRMVЇhC 4RZOMmqzQAw=fP9r;0.Caém9,�p3u uAwuמ@ @}}$*oϮuQ[J76֣c?EŌx K+&@ ܺ׾5�$r5n("^cBZ*=+!ikcXq#%I)bz3 Qjrr- FCX,h4iD6 !�^B,TR^$5A? l+J)/ͩ� #S!hi_"%f?r%ˮmodsC+ez@Q1RZYK:@ �)Z| +4`굴UѾs !ƶi\HSkbYef5^vo{C @ �@ ?1g E #،F~@ SKp =?@ @ %8Є@ @ @P�@ @ @ ?Z:/=DBTLQS-@ ~>a>0ԩ'%$ MtmFJ?&kRH �J&pqtej^=y=ݦ<E"d��`/2U?9@dpj9~v2H|¸ᝍ )9'Ջ?خ /2yJȭ@y`7o ?;nrvdimM{|zV.Fz9t\$]ߥLvnԭ-k[Rmʀ3): #rqp=ڲp7sQ-uj;͎ mIBmrwn}̫7|{X:pzeJ-\"<{+ڬ`V_# rqgRur>A gďZCvlelɛ>K+dçbezSz֮GFo"t6Әsf(D>E OM Q =ѢK;g|]ɈXtڜqk#賔z1ea&̜p>yщMȉ<N_rqJqk;nw}g NS[p+k{*ױ FvSIܹqOGPbI-6e^�*5,;=`N/RO .ݺli'1#@T-"AsBI.�@�P?ytΐA*'ٜ^3 3ڸLsPeq?,f[rDᚖc9٨/(qi^@+T\Z^hT `Y$gi&IMv s3E, R;]p+)}scxsR]>zE^nYL�\-}*kC2jZϒ܌bvWi?yQ{<vGzӥ붝S7ޤѬ7%ʖ:MAl@OfmFVNWS �$Qa"2ya4)N�J٠3S@ڻgoL*[۵pN@Pϧ9}0:n(Gn9]2�0gwFţ(O$ŦeCLz эŋؚ,"WNJ ,FH[ݪÌ�0Eau} ;hɶM�-CTzBOB»qʍW f<^A|KYB O"^In 0F`ࠫ%F$CTKЅ O^U=Ay#$+&`'=Uԫ+'=F;a"2eW_OJsçZjT(qp*�86oZ'(/t�xhYͽMѢe?aiww|6mٝia=l5W'ݗ*N-;A K[_5?Ȃ #V҄3S\a=isk,Ź 6̭}&�} nV;R_-<Va4rߖAo~|nF~K7>aSEΞ0)`']Xcx>p~~~3ϰ }o`jgÙwnyhv㞌Gp|ͺL6k-+Wq3_xf.d�Ȭ_ʒ!v." ^Ŀw[EVJQ\^aG8]2�b/oFD?zpQd�㘪4@ILm5~~oF�򿼼p+M8T,;߰FwհE@aڭ7ÚMNmVĉt$=Xe/.e?;+5jb+N|UEs$vQgn}jdф7\{|zڽf�@ W"XQy�r&zB+N`z/b}5BOyLv@ ,^;s}��x[| @J.X"xQacvMC9ɝZځ@ Dm!$;m;EN> >}^W6W/'.6jV%Qbaz[mw~|; K(-Y`}rUB6իx;<R Zwl^ uV}L@rbtk'g5 Qƨ'%œG^{}f0�0{{V5︽m!d~[]М-|O5�/9pꉸAƪ>nmwoMuL;͹3&^ o_sTeQa’GCfNm}}4k@T/m|S]_B'XaU_>CVU;d_-tacO2iGd+�/)2S~Tig9[@ 5h,$N~K-:�MdoG k돮 >';ֽʷlr3W)"3 )up8 &\9m: �BDpLyΠk ÇsXo`}ag- $] ;/*9չDA[o/'$UwtN[RXiȃ_AdTzss) aTJkUR{v-uz's&7QsGdI7 =16o͆IʹB"2NKg\/u=+g>~ {xHӣNbК8=2oo5gB97�&f2tl�P� zX[a=PNC6V8£b(vZ=�s;B_Yק^Cgd t1@SdЧ -K ɀY vn �8CsC6 jW~EOw.rKXT}Nў+CGτi f:��]5AͰA_B#9 U$zKTP�ZM0ۿ3 ,)C2c6>bqhxL5xg{s__M"ʟx|]& �t=U&~eCrZuzA c[*d^>[Mz2,*;?Kf@y4G��ꬪdTO/-xJLZ �bA�M.Nn�6ʦ붙 <7lWyj&ÚRscE^t$ٞ]wUc/P�oW،j ;[M۸U$"!DK*SrZtOfz-\yPG=yOF'KfZ�`D"sb`�@ 4n^~]AL};zPT:w ȷ'ʏL;ƪD Q3t! 4t{ݚ9)L8Fd� 8MZeԀVzyݴѹM'O֋CP@S)*eYG`͠vg;)NPˢEQ} 5il!"�89P4nC�%}gn\|-MIg�;wKQ?~D,)Lڛu+5[ d k6n @p4F�5w};$h#-k_jq0iO'J�YmH.��[c#5nָZ]Fi^@oJ+j��7�>7| cmv]xJPe*/=d /bcߝڡ4[욽?3EY^{ɨ' =1L �ʿ '�!W.7tq3Q@_{nwNѵc=g˻F3FSc$7%�y@ _iAwEoN;bfW':KbNcgk6^qeJĥe+{mjGkR]:Й�:�Y"1�":\};-/ W$]Z: zւ0Q*(|PpEڻu5L:,PwIWpq/Ư Ljo Ɗ8v>7FGv+ˋ<Y? 9@�rEO_t4�:sqy6˿"!�TY:S1*jvܽ4OrHnej]w=17|%=_4mFl �/弑C4Xd ! 9Z~{yÐM$@]^կyiK.Y6xQ%rEOyv!ĿI'NKnYSOgnݱ̺<ȃJA~7?ˬIa`:@ (+�bd׾TX)XDq&[(3BfH9my沾%=4a^; �N,=dkmKdqVUe\<J|*fk.V[*warWMqz*g_L(343Z%D�ܯO}:G"1z7q Dkl8 58|& g깯Y�@MUJP\X-=k6sgLZVx~PX59b666}v Z"?ɓG+ֻm |&"@"t=vwڜ/޽px.3{j \aS/ :ަM: }ћ;1 5VLO*N.ҼMG>GW!(ƞceM}.r t(?~{gv `x}:خ8ᣜ;~u3;vlSA޺�a��^mlq$_du.f=ce}~.dNS:}cHg;3xnB𶲅5FdIҒ}Zuץ?ty43f¸ ZP-7iEŋٯyL!e 뫽 vʪJJ6mc �zv+JNcϢvxo2v g\/ ӘF V89�y:dpgZ+~>CV|K/'_DHĭ#>vҌ|!Cuȱ 4j}p&s_vy'Ȳl<%}Ԯ~_<kavPef$OY줳Π}�7}ьvJ;e7|M앉L9ԛo}م@ ؗOZς aJb ]C_WkgkXZU_6Kt@ dBnk�R7qbѤHB\"fi[WGR3T ˗ݐN桴_?gU/V1!-PĴ1,S%DtzQ <ztиVBT~#:c,_ƸB *}7&=3>x-S^⌄<R۫oO7>/9rX?IǓ51MS!"^~B&aɊr U-ezmEy)"m=-~%%L4:y[Z''S�e"%?^ ڼ}:�&u[k=xE4C~vv. ~[dҳF9gWf?-�@ BFm%!-U^_uSK{usM7/k@ jO=Q6L `I+ךS/ %#GTB#Ѡ@ k̙5Uq]DhN\@ f}u_vѓf3¾pV mΩw,AG_cz�}X-%@ z̀F ◂f@#@ _@:G@ @ @ �@ @ Sb~nF.@_<$3Wblm[� cR"W7.شϑ_+ҷ)=@  _Eb�P20e)O&}Q21mX& #CϬi'?b++3P@~@ y<yH3gNu]ݯPp</.ݻzGdK"ZѾWMW"!PD Em[WszeGt<m<D5Gb$JYMv G$rx=5FzO{|{vɼs+jy)O~=SU:쪎6ל7omɳMg2@zd_y?.-gi[S_{wmY?[Gy/n@ϝ:Vk3{Y&==5M@Qjjjjjj!GElo^qꕋStk ?~C JLwɃ8 y;{x EFG7+üCN^3|)&0ԘŹ#ϳ�Ӯә%�skZ rC;׮ >oƭ݂zg H|!_@ ~@ fT$� �(1)LaT 9p$~Ѝ9<0ib> �-m9pM˱ӜlTxI6 'k�}uÌ6.Tdr(u+"EÇXk0 Q8=ksϟ.ZXZ1fӼl$~^܅X.wiIRJN>gi@ 2$BnvQ^)bipd|K.zN椗:Uþ%4 mT�"첞8e u~)Ҽ<BUKV!VQa5OLo ,YCL}d2eWoqzФC4 W#GO DZ:UV(-)e+}Ury=m''oYy|-E'y]ѣw.bt3Z~ B/Nu\@Mj9Ty7ݙǭkLg([n?v^W4Gf/L(/n~@ @Ԇ7"^ȱܑptA:THu6Fkqmۊ-Ghm:bvTn~e#IgS |c>'ݼd�$Cn>H[XBYWxPȀqQ甐 760)<&,y/|=MZ/է$=lo'G ޼hᰌ:/P{։@ K;C(`tv{pܭeqk?fzh`!n@צ憏nSlj|٠ϋ:Ĺ康oe0Aw!6m&&4h1DBPO]͛GPp}[RQPe�59[��0cnάMՐ�>\ߡs;83լa]tҡyL.m9].�~|']mZDQnS3a:uӳM)|1 7o}6B\x`xkzu}3udzɑ)rqnj s+Gi404([%l[&Ck8͚e=}�>72ob%U&jey"Ztš\Rk%kdK2!O@ !мwޅvEKbo|R&dBk3_IfȊ3\0L9cåӇ5ȸ(ƭoacvoK5K2Er)$TA3[eNl{7iOXxe2XGFOIKN;~}^X��sO(w󼿛rBWl8@8-0[C Du@p1I/ZRPgwCžr_wXvX=ǷO#__ޣ4=|ܯݏܹto zt5ΌLDPZ`t.cNo6. ϧП 2|8ѱ?}V~T?jk5}̟�p|;#_L{>'��/971ao � ~�7Μw1�xT;<Go?x͘GPȧ$/lߍ2jcoG6 }<"I&GzTI|16%SJG;zN>>Fۭg�/7XpC{vAkFw*e>?~&k%?sW(Q6v)ZI_Of/Y$T˭@ r=�b2d>JyCjXN?F+ n,v^\�H#`sz o �VM ri 92�v?ehlذ6ӟR|b1u8�y�DSUu5S�=96vj!.@ j`�۹%� ESnP2LUfefK=Pz(CI zXǝZqnjvY�Ͽw,Q}FCqL̇ZM0vІ"f3G @[a: �R A?vRx4Q-!C͜ث2bkFR- 4sV2)etYCGd䃁f']��gsr3�n�HF�x\̖Ψs1#gPȧFok)||]& �t=Zc$#oSs+Cr즧 V뎡L&j܎-CjԇLD^ĥ_^~"aw/_~=EzER~/E'WfDIR@ 9@{zuN3o=ΞC}~hrJg5:/F ߵ'gjXsT0v*f~`ط)<�@O�D%G&z'/b.=>JF^VƁS�`-AHc�?/�}9FSP�,a@ H(/4s; hJ5E~Ba7f (^fNJbE�$;wKWGu M(c= 1ZOV]B!NcR ht]:>zo!\6LM#D�'G0U+EA@Iߙ<4W-q{{Sy_11j%016�̶I+,~]$&TXb[j!u$#oS#"\FY6Q?ZE.do]>-@oa~}5{DD^uvm�!ջhPW Of~i'^n@ %<ev]?s6maHҰ٭ �><Ӱ۪SG.hJt D}*�H *첬UO /x߲z/28BĐYa[ko>�&�m-1%jM eQs:_N|B(@ @Hb̤6WanTשDDt6PБ}<ݝtwZPvԱ#fvu3] ^ǽ ɛLvb>PTd�aZ貧oiLZ$'YV=kAA�&� (|PpEڻu5L:,PwZ XgT^Lr[tPa=ʝ[i:B]9`cu ~:+{EpΓҧMmBFY/]uˋ<YuE'lz.v~@ @A'NKnYSOgnݱ *I��ghV)"YD>5,s/+p`hʾ7~>ഏ_d@|ﴏOBHiK-\ел:�.6mSw@qwwg wÆ n`CCCK*uO{h)mr&iZ }s{\.EScpVoWp#cBNۦ4S'͙ww 﫪ec&,kf;q4c"d]Ti.c#�x0�ДlmZVFWqJd"Us{~��k l±gga4}?``lgDl%RTFxf)U#7۩dyN Sz~2EJb" <xԘ>۔_}{}{+B~ <ٕy[z%z׃HvNZ?YA6u\8hET�$170l[up~|qɟg'w �}:Lml:\F´0ͶR%/{17uƶ;kp9 B!#~!+OM y*'vD{//Yt ~".jӻe-OW\Xӹwȹty?�]->x۟�m<̙_]Ml9կK_6V'a5+N@EB.�]6Gv[>!H~6Uq? �@Sҝ1P-ۺg#!׎ ��?_ZkG:'5,۳�٤{]誵U#[8��mv 0>@*4bɟu@׸�K6;*ˎȇt&=KUZWPÚ Mݡ'x{޼iϚq́?ܘ9EEM0 E [ycץZyuVQyT_mM*p&'v. {z(o=yS\ܹ/ Pէu\ gM;.c:׻>G/e٤?g-M={h-|/@=׽&dKu6{''nWP=ԧpn`l阖+g~fxE셦?\kl3B!2 !ѽ'۶44hK H$�@-KM]=BþJvn.Y6: bwo^8 ׾ƊM;=NM!ݵG)b3D"iW\2:CVXEİ0;�I!Зuҵ Fƾ]- q*"2#7922_G>#&"Q% s/'J)4bFkr4'?KY4 >Tm7RzφA16]Tx`.2?lc;i%:)ORzp/%.ʫ/6Sz%غ�Ȩt;תP}\tLw6O6-^)Vz8ADŽvGSr$�y6GhmXW66qdk-ſKEva^+uowpaQ B`wQ1!wMY_]yƪ+xHT<!̩ 5h*?cZԟ3/ضF?4 m �ø/V<9s5W Bҗ�ł��6gW໶-kݡK)Beɵ4a#d\ ]{M*+Sfe8nu^�`C~**B}x4B!Ty4B!B!UȽo@B!B!B!T"p!B!B!Pg@#B!B߾4=|J#K� YlYFNbs$8<GG,P(o8ivw:"~X+oЊ6E"CSYiR>$Ii)7Ͷ50J!@c] WiZJ\x:EūH}E?,^+?%"6!3o._lo1ǀb^n<xYlyl~fg11UhB!B߸Ƽ~8$<t,B԰]v\Rxy#rRwx9uIV*baRvR*ԛ7ǐŧEw6(oXA�$)߾dOӺECyПYv>zl3'w}S �s(ڷV=sz?-״(ӯ_r؜El!Wne0e|KӴȵ҅Z G��u·ۯԴ!v5ˠc'7w/]9a}gL:W 4גp,4WB!B}(BE+3[=1O-UMGL2xёէ}-f/m,{2W}1pX9I=z؞uw+N;.gim& uu �\Y4X,=ՠx�kS$�p�@h�ɯN<0Enk_#k_W K2W9N@_N̙?例-ƍh��[N{iHuS:cg^9?W5OqIPQC4JtMgL~Ce.@#B!BEX:s@MBw@g%vVY4tт#OO8[XIKrl1}�&6v}^ӫ|7skS�Ȃx=[S,�ܺvah 4gS �[vJF: z�oqYt&r15�oSw͗Gm!Jd}i}=R}®] �ׯ�H6ϙG[{Ru@EdDԀ2bst�8Vi8 �4COd;'w#ԩxrc6I=-S绝m>[uʈS:@̷N=&+agW ©<S Z4}6uz�|~/$_nmļ"o@q�_v^٢#s` �8礆EgZ8V[W_>Yک|Ҕ™/<[aCUͧqchB!BBν3!C=�U!7Z q.qGtծ8㸅*y,$H<qi2ΩzocL�iwG`o%عK@Q%4ܩЪ4!mDkLGrtyyN̓H�vVq]0b{p7,]+٩ˌK:@Ƈg/E{?Tv>x 7`Ϡ+W)li}@Vco@ �ħe�;FUv&UtsW^ؾQd,�xWnG% %L8(߫5ZNPsܲ�qܲ S:��>i1c+AU+i^ïk4@'{aW.:;{.fa$I�<Ei$\y+e;'[;ՓOy{7WOv{h=4?aˏ~ q�B!B+Wd*VuTΡeiqq4aKهo4;h'T)<ԕ5>acm;y_Pt.2b=VmYo'9.c�pwֻnΩ �oOο 9kMC{?1n9r �<p }JZ:g2vO%%dk9X:?4[K[z xC{,Uo��h@{kJU[#<΢:v?>y<W/{;#R�H ;6rQ&S:nmSk��tnuעˁd rk8tZξR>@) iZ\QMi腸sܲӎ[6k[r͘=эgͻR}U9ausgh_�>3&tʌ;fOVTWy>smXۗڙcb4}ȤU-?b'{;ՓO`WΝɕaH|۟71T4B!B;GKRj[]^7=kΩؼsy}{�XwhQH2%ںƟK F IP�l~_y.� ٴ]fK߽M`;tkߴw+(z /L:yg{.eUmk Z >]�Ѫ5ny�V:BjAΫ?�F �Wce Ijz}n7<8wOhϩkۖY݂�*\NzMw޵4!-hjWGU{QO^[K/KugcgGRP*̐/ʌ~N"-ښ74M(T4mVշ8so m׮CSj,GG,}6x^N66ڷ{kSqɧ�PE)5 d'�՟o.@#B!e^cz YG7[ )drm-hƼE@_S�Zfݧ 횈-cE &2xB/+Ti[�Z4xf<wXig9{+K��|ZG)�<8Dw;L�sʑ'T~u%/W[:6p!A1J?Mf⬴P^7 [/� V�z]?jN; �>P*/\O ӄc׌diU/ъg,o2ʿ^/Y-%N.}v9ӳƉG!8PRȖkHbO='A>&y06?1PY !B!P4J' ~4q Jɓ{%�DaD).aAOcA?fǾ^9j@iVsT(@%Q3m}VSSj�ۣ+FHw54�dh�Pf[m狪yK&f'6[iy!pd1kqxl@]*Jˇl7_>1߉xHWL]1™K>9 8�H:/ec�q6r{EG7< x{vkI}f#Jutڟo؜$[Vtsv>=F틍V>c|۟|^,C!B! =:pu-V߲žp�PKH*B�PI#}cسͬa��>\~g4QXӧUs{/jk lϥg׾7`dw'' "3ǜ C;,gT]d?=y] {l4CZ-CR fDjm�T収=ݤ lzBZ\[Ջ W)yaVsM{@o2s~ Whk9x�h\~ͳyQ<Vr 5ٻ>Naw*T$Aw}vc7Ҿt,өI5K>OL9/JmLoZJ9@FhB!BHпUm} 6 �KWIۻ"Rva+ B-YW4{tZَ-md%<{�=}+4� A7c]ZcQ;pX{>EVoiq3+4t3bQc$G4xӴ~CYqEFL|��Ax:[.'y~ʩu/9$Ȋd^w1`sOGnmzA{UkkFC!@{*C9Yhz4!);?:�ގU^zS2�d&+?Yø?JTQ>g}О~[:omK�iL3Z߲-ͩgBbĘf˧ %O?l[1 "><$cۖX!P)8wZځ�QRJE,B[0m#\EIH)D0]͟pwHϢ- _-}Z8yKԲ$=ӣ<Gא,u4TI=匩cF,~ͩro⬒9.o=;( HZ�$G'xK~E;̙kX35`Mݚ$XKzݢ7ݖZZI �iZM;}ѡ>yM;%%M}оX{1}5˖YiBbyaav2>"!B!* .^{.] >.[ۯZYk;?ѹO9"T}bG#LY,remGI|zrֳNw8g)k1|\O_[c*1rMyN/Y ޞоg%&'F���*p!B!7|Inb!CW[$dƭzԴ/fj*![|PvɭY lk1g2s^iD BT#8B!B?}B!B!B$4B!B!BπF!$jsY|>OWhQ'0_DU@ [ 36*xbl婑*<525%*s!BB!TvQN- 4o:O:mykXˡ}n;vrثS$ Ua@q74ǙoL7L>$�(T9׺t '3͊4伍+31+^x<ST WGQ;4d707\ꕽ�7tyX3vkM~}K8_t=X6]DX!P)[OBK%}בS/ܠǘQ#ƌ+pn]F kO17U)��zDIDAT\w]kO_dѽݕmQF}=8'm5LNDsd"wwv8TkǀU8ʧ̕p[A\KWȹ=^8Y"OXv9MaHj{|u%�mTXqF>jc"R*0NB/F!'^|q @;>�޾=]�|'y6��^^?uTPON<�R'nO.6ۭBA8Ht쫷[�ݑqs= 'ͭCgoK5 HH*y#\Kokutwp`mϫw*FTl‡ϲeN6ku\qoJOОȢ2]mDVZA`/ wfY0wzV^O۬a'[!_>%O� viF=4c6<mN\zƎE:cS#%:#E ?Oݽ>:vMҨ~MXg)/B!*;p!’u Ͼ .n{g[�wvw]?<{޷Nʉ\~$@Vݳݼ!yY>}$Wy t]9rY:Y=s+R3�H뷃m[Jq=Wz,vc8g?B��Yx|>`̬DeJB�s7N~ضսlOw?}J+O[&OK)Ҍ,J֌�Ҙ Ckys(ɳ'6gNeޱo#QLfiZRlg+R&dr oU_O5.HQwpk_$zZ`56ɱWI;t~\+^s|Oa'<vu!BhB M.hmyiΌ .�yPڻ}>n6nRa91a.io'��!`AbzzIJW?g9ǯ:p�U2'quԤI nqzT-VEl&v)ur;.nw0.wT8񷵋\y̻+КVumc1?3J%1fZo^"Prۤ�?y1l٩{[N}2s˧ye|X2͡{?97>,GF'4wV0%+&}`Spkp_Q|B!PY !7,vWٸiz忤HQ�н\{m7^KLNNw3kf�5?FqU;I�h:I�`=qs| VSAyֻёwU{[cV)J `r�U!zO'x#@i$:|�VRn%)?W{s>�� H;>we8[0~U/4y?KR Y6BF;Yfnl`a:,v8\<�͜/B!p!\O޳3=~vݓ=ϖC�F�Qp>p̞GI쭉 T)fL�V�97�P)�,�$O=ՋѴ1ۍwWsݔnlw90ɱi1NMO) yM�@rmD ߄)və߲w/K*+~{֢w[ M}nOISMW[%Z_"/a=If<z4 @O1*p૲U?B!8|JB!E%ūn9 w'Hs_5��R%�h�P_(ɣռ۴n ocd\MG}�;:YWc?+� `QU^ %$8ffM4ukqGh7$Oo,elSll-#LRJz :dsRon5,%aP}Q;w9_B!4B!%QNO=aHA r_tkuAO$HIYo=xx# 9n:l{ ; (orO84geJܕmi8 $zLg"Na+ 9n7c*U�@S7O{"'VT7^f|ըz^N̛x;v<(/aUwz4W}Y9wl0G 9I뗟cp歝^ an -5t^c[/B!* !ЗDݖM �6C̯-[ٱЯnߏnWID5֎h`%._]Qtѳk$KW>>!\�:9Ms-\_QCT <ܲ;{o="АFGԵ&5uOVtvҡƅ_u Pzyh}\j ueǸ#19i2َw{mJo(daU~y~ݨ{P<EY7kfQcQ<\2lRF=٫&[[G Ew.2)d6_˨RzJnmt~J3 t|"BޓЎm[bY Bܥk k@GI*g&'d(w$-YXUb%bWq) EU7t�(� IbrHooܧLkO/</*Q]Κk2TbX�0t;#{gi?N;p~VX11[{9Xi3DvVASMdސuS)yhLJe@|XsK'( <vS*ls[y)Ce+=%E#; G?]4܍ |_6~+8ٵR/xi`軉FZBuF!['W[DNZ[>>$�s.kgOk\r 0j;6f-p7Wkɓ|quUw[4}w}ǯT�8~ʥ9l5XhO=M[sl[Kw2X_JJ%;׵G4p�{5{lس0n5gΖ<_B!Tv4B!FrlaE޷O2R^N.er7[I-lе+ݤP=!zӗ!DǞebC+EHWB,B#8BRB!B[ !B!B!PIhB!B!B%B?Re%'IZ9\;W}x (IN]gWB{OJ[> %��@h,,YU1 XZiJ�@6vb -q(wڠBDPEևXiElBf\yAVˍ<v<W3/ &w/n|3B4B!TvQN- 4o:O:mykUJZQ؄s84B?xZs0VB{l1 m}y#FsRwx9uIV*SFJKPo`CJurGʺ(zuܿ [^S{y?/~Deסx(юݛG5w9QJCNܚOeб񮜰3vrZ }`ƫgkupTl|W:qB {BRI_u 871fԈ1F 9[Cz{!R:�hT*(B_7UGJ舄*O O+Ԩ5KI+s<q2pX9ׯ˨+[۳~O|Zt;f\6dZ<ψCF93M)<KpDUCqM柯gw5`Ok>eD2Oc-B!Зы5~A]{}h۷K"�o?Ն���.}*rjG@ʓ$fU=hP'ɘ}6}�;r rۻg$ux)Qf R%oqkm[nJKR xJ:X3$+Qd$Kx&b$GKCǻ/<BjuGtiQZ!L#{ST!T5��ud|)�POn];04IFVҳ -J@`y Uq|l7,:[X֘>6*6^/?J=+BzghKz�J]]� r?_%�m<3gsUmZURϟs ǸZdT74Аyc~\y$�D>qǯO6A"FPFlN*"}Z}->~F: 4�j-;2?M$K�9'5,:±ˁ䓦d{y$zڭ Oo>7=as*5�B}awXtֺ\P\g߅S73Ȃ{tU�DIX;.@=m[Kr. ?d +san^<,>«s?[:l,ܬeܹp)u֙�M$v϶fTa򣿆Lސj*Ƒ޻ĕFۺ;7aMW9)cgZeM_;6?=_K0CO_縒-c<-۳Qqe?aboۣo!{w?;wBL#4ܼs' o$?n\f">�_?@-}wboD\8M%] ;a]Nu__f\\�2><;~)27o{]rHaKL;�/x�R� >=Y�6{ZYa99=e@OtsW“=VްjN={Wзp ݎJ8OꎕUz'"� L8n>I �lylOi$\y+e;'[=ɧ<=ǧHk|ol!Tjp!BE y[gG^3#Ȃ �9nqߩ}mM#Lս6;&L¥1�@t4l><Hv`UOo=0TI3֟,g>qyUn{y|9�Z#nܝ7vaKy}l�= ֨^p{AyPY=?$/gtnm(>Nkym̖о n!Hj? w1khTcQn<.Y|N5F8BesO}wO%�!)+sxknM?mnbF>vVMzʭͥ-!=Ѫ8o@{kJU[#<΢:v?>y<W/{;#R�H ;6rQ&S:x�fK�¿/(M7?�| MgLeuw̞,&{mp[árMw~uӧ)ټ.G\X[Vw:j}5�X J%}g3'Іm-sC&jSzQO> Â%k8_9w'W5#il+8GR !7,vWٸiz忤HQ�%6/o�U\g 1�j~?K:'4Aw�thU7>9,�ҵ{> 6 VhLIA4�,[߃K��zFn �z^󫫇�}UnhE&9]w]�]v�YO%jH�h=ü/~h0_tع\ʪֆ87YA|$+%�Uyᕧ*@d* B�@LFSGT@yڻ'Ԁ5mnU��jL.'H^ͻvZ |�nяOaE?[>ez[ӟBZ5ծXq'巖l4IJRѐ�Ou{\�*Y퇏|Kuk';r Y[6x^N66< ˸Vz)=#�TiQJ  �F[qB_.@#B_k{W<t{rԝ}r�4�+(a1{%9λt,2E`J:;�x.87�P)�,�U_#?Y6wLY}$ceok@[7vp {lJ"[C7|r~gnޭUV9#K9fGp-Gpi � y$�r?mw�E !F��jhN<\B~V,4ɳS�tST�ٻ; :xyBEᬒV":8@hHP4NKv.d *_SM"͏{A'>wCm亹7�.nz��^-O-\^Ы E>v\�h8XJr )AO:zIOI��M6*L>/*�B}awI N[J~zO[ߝ !�Z� UR�ʊٔS_(ɣռ?j�N]050t2cQI �"S#G�5�($�86t`KG)yrԶ}6s}:,(HdzbIǒe-t_MVS^|�(3j=C9/Bȱг@T^Hm�2�Wx}!;@f}�pgB_5B �*ZqoӴrǝR�]90+h �*�l*qҡɺrV{Z0gpd1kqxl}Zn1ScF-وReݺ[/6'Y2R!ۡ| #ߗ?}2wv< x{vk[F3~nק( ,=%ƛB#BK3w--TCR6:5wU\={Ϯ],H x'#o" 9n:=Y?pSgLi �Ľ+vi*^ c:{Q-}+#8 @%X23g<M< ZboK$Ϝvy5 L0d=z[ fq6<dO{:Ink>2++;ts B}/]ZVJxL=I$̈s"^l<Sp[gm![tlQvݓ]_ǚ?w ,:=yb3Tr+ݽ׏<Om1 �YFp�8rV\g)UҘ߯f K=Wv$lXM|yDیW �jѽ"{/br4JD<|V3{' on7}wF"S_ϒ9 Tx3y!P hBK"n˦?�|!s}CB?_>$X;傽,D?QxhvGMG֮,]q�B/r5 ��xk4͵p:E -KWIۻ;3]_\'O9np[T W˼ańE;/>Cd904U V^oX{ϛ9^!)�$[aA�A ?+$?2$b߁j}(2zOkČ̟gO]iϦk/HhVUi\xDv.]{ ?^ƴwv!=Gψ<,@<M>ti#�v;m\gO_3NE+l|t")UJpu(Ԕ<߇|tԸj9ž-ܜz&?#t0[>7sBCȣ{OB;meBs5�%5|Q Y%+bjYZlD!.xiAS&9wF�E�IZ;g'&O(w _xx_TٻȈHT IChe412**FIJގ%Stb|"-rp^LNH~^<B }7qWQqQ2"d..B-;=Mqq ٮNR;:Z_4)UoO9cj_s;hh� H$ K)?2RRכEQ�7SI[UK+ -Vi>:ǨM*t̒O͈BRuF!['Wg:쵟ޏ 9ztMsY;{Z3mEꊽĆAgfSɅd|˗`u.n#BB-f{k;?L;~=rD@+>cM0#^ ؀4ئlۖk{wz܇.BPD%fEf4Eb(ʁ-ӄx3B4B!FrlaEBkT$7v~'n}uQ&mS;f}B:unW %B_9\F!PxX!R:|ؔ5{B�!B!B!PIhB!B!B%B!@NL|R.|t!B!T>!B_MAޔҡsQv2?^uBnbr[Nl\1rr=kȈғ,BZ=KS$y/]ɉw[Z%>v4$KkYyE3Voi#71Ǭ"¢@!JB!�ZyЖR;"z򵔅oÍ8:=A]9;4t:Ƅ^1+Zn#ؚ̺{In+?;r:qi}?_g G q+7Y`}=8>B}(B_@!!*Q*IrفJ:Xw-yrLLVXXOf ]<>IKrl y2?/|glWAw@KRrHg;USh�\a`HYiIj ц¿\<�449]h1"'[hOii*{4Z�Չ>m[ u^աs-ƪ1,}B!*!�B}ehM֖Y7eċz.~�v[~&ݵj#'[yC3'e+%yvǭ6LO­cʼpӂ}Z i*OJۢf͏9LBj�p�!�{gBz�U��E=JB#!8�#NKFFiV% -Vt_+�pa峎73_C&oHtHH]'-7yJrIrmWM访|ekH% :n.4%]܊92cƎnRY >SBB*<m+\#B!Pq4B!9?$/gt�FK׼݃I$+pcB߼rE3zVuT&D]׭-V븷y K qv@UzxA�pٳCodBZ֩[zN7O6 f9�">iaMwNi朚�ʼ<י-V+L9EżbKهo4;h'T4O-čZ&I׺ԙZ6@~�pc鵏#S#N<<=d]5F(ruرˆIjG!BhBkB3>�WyO%�cde=Hc_}鿨CjO8o_ROz)UucG �m]q(w`Mkn Weq2S+)Jonzt׮S; y�軾AF�ش2&0t❁SoZ>#+?"k̢oXwhQH2%ںƟK -7T%M>_ڎѴ` J##q<�] [r㌅C?jmtp!B!d \F!&*l ݼ# >ڮ�.aP:n-f?{eͼyvZlV_ڲw!. ~8,2xmve�j͚uvthD,T$GW1`Ңf][oM�Kjv,&8sW=W{pv/Z0)n.}L< ܽ~#H&R񁶦M(7NPI[VжJvPˣ4<+xWWhUpN!B! ?HB}MxU,IXUeT��:TYߛ]\ޫaC3MR5|W_Z<w#" 瞼v.-)t4An?Nʊ<[=9hۯ79S;փ~ܭǧ{joX'-GmygN?ʦCku9jC U) V}ZV| H�ӂ2q~p{٦UJIB!BhBkB6u\8hET�$17(Nzlyg:UҦi-Z>YCR"wc6qvgևo$KQQEI�@)ztc��>e}W&ꬹGD2E�֞9>STWԵXX-}+#8 @%X2i-k$lǣ\гȹ[m^̳�@C[x5�$zA} +O)�&./KWڰGY*S⤄G!B!#8BL_\'O97Ez})nީj إoǗ ]5tJ|ŪD%}3�4\̮u 5 9<47jKPx9pdX!xVV$*YO]誵U#[8ڨt<9~KWIۻ;K78|3/*ôI7\|>K)M)VܑGT5}u]fԥ_rI$|]!wS ek!3=cre?NhG]1HLNLcm+9G!B ><$cۖX!P)8wZځ�QRJEӑ&FFSށV4pJu%1_>^$E!1:<vh.*IkQ]6U?c449Qq2[ó.D0ϽPfL*7EVl݁gx%_lBNzrpP$?hT n~)4+lƦBߪ{ m!*5_hBdSɥ&)l0+|Σ/ws R߅\w/m+o[>^2C uk8oȘ<ɷ]T{v56v6Nzxz0`iX�9`)YFcMI!B! B!d:?=nq-ke_/77c|z'Nߙ(tB|Inb!B!Tp!BR~9;P⎵ !P19T뀥B} 38BbkB/B!T_.+B!B!B@wT9M�W(r"@ /z^"RP8\ۣ q7C�Tͱ I풑gJ5t$Άt*9e_e[ &G"',Jd|+4o)ZϲW8^#3Q2s]k�׿'O UȳGNJlH:/7*mhç wvtdۮ?"?~T"~"Ҳ-~ ^}4ފ)Q 1gmSpK;b>Mu ,g+r{d)oܼAxq UvDh'?�@)p%CS7iokOpܝJnID.cLó*xgWvsĐӍiJdHĴLY'O4%}m~'udgJ&8$)9!95EmEf=*cMO(Ԥ$�Vשa )II W1c-R rw�l_rU߸3"@؂")9Ռ}#[QI߅Egg'n5&\$AS߅%99MWuE.<wIYJ;;qOOJQħ;^3S2Υv\ɯ> MΧyf)C߆;99֕Z!ڄd={5~\7M܊,O3x?>X6ZŖEydZ/њ72@`mp.A8WIÓO<,kQ)-2~tS6x)\Oo~ek_&$k[׿z䏿 I)bkAs&yrح</qH'Mɂ߇ٮGN‹C]=C<*F&  >2!"GOK՝+gS|m(g]^=^emS|E76g3$~hJ绲gm9҈M_>+8;:dE=Qni2Յ{/Ji]%#Ţ/? /o?OQ/q`-WzXڌ_1)uZHxK$9{お6s lqbl{4% qY}Nqs$wz5ydRy<ǰ지7�yJXd&y<>Ӽq$fQz^$�||v;M`oZ.�@roCe=e~&q?<'ʒ^nOwfK_HFJ+'d~ȿ(B?d80b-\ORFη4~XoyqP6kJ0p- &%JF$A<;֕ަA|8 [^Sw IG%=2Əxʆm/\ɒ0/4V= ɟ#ְ;u龴%$Y6�j4jmn_:" Ү7!UzXx@ԇN8ABZMDkH}8FCh2g% &|R1J FMJ-WhBP+djgq΋-}RI$9 $2)Gheޯj1*M %ҖhJvMzz חU|Nݓ= ǟ|izͺz?̎f]su?�(Wd$צF.K'ox`5>جg��y{^uG!AX_Ѥyc|1&{8�\n l]Ō  $ɵ-�A/Ve]헭3_'F1wr\`aQf6zCeLHes7+R:Wp�H{ڧbKsY=cRKV7J0nW$g[zډױj98Ůk`gE{�2~^�ܛt�_!¢kGwfKǬ-ˑr-r#Х=8,['>"C=C$˸ɚOcƦod/?5:d ꡳ_9I +nDyk8X&\/hK!T-o_מWjW·d hh@|nc%m<*Gw<e6unQ$& ־L+gcQ:[RLz1ʷtk,gb avXʬ6B&CTQH4=T(U'iUL&2)ZVpL@@4՛��J}n&U2k*kV |-\`͓I2rҳ]۷"5'ΞkRyTJ6iCД':t`E�qv|N�9%"Nw �ZJL*3B:Us2C/܎o$r&}�Q&޿sOγ%Rڦz"}wg0eoo<eKllʢj.fgu8rK{Gf]B= yQ_4[yz2z2!٤K7d=, %]'mwIҢf*\~Q*vkZ`�[s P䕂kQKAӤ~ScOsſYA"ȋj;gTe!I|v?U߽`lcb+ΕّoJKͭ䓲|iYy40CR3&ďN%Uq9l )*pv뀀{_f4ݯ~CqenEѥ�c$sȌ7)5x�E4eH8^I,23ֽ'Z-Sx<y`Y/~US+ml4v>`l&`67 t,i_ܮ*iOҰn䋷rU޺Eebgq _xiogǚr/$tCEfBq.WB<H _FG%=9xRKkek_Fs~A8~'FUvنC\=Ѡ[UKxj,Uh*)1NO챽کu8V3D:ҭ5aoj c�. �S*~mZz&ߍl2<ě>>;*n߹$?�O]VBS7\ܦ FeݢeG;6v`JFE~4)gn=�(MQЦC/EƵs\T0?/o^Tl }NwOGiJq7ޡ~>$hb"NK 3QF-Ş>um{ ʬwgo&JVw\Yj6PFiţ! ZwĄ;8q9*;�ȥ*eRA㔚rFshJ˺U Υ/2 }ev"גc}. ґŸ1!c?|¢rnV<�:z\ox'IN#ֆ5瘫]Д<$m$* |5� _~L~-NLoҚ&P02؄DLwJ\ZOa|+Ю >NƏWO%U<pWdm`xvu  {!8H^9Q7^f6k^歏�y:CTBr\ЯGQ6^Osg*8X gxAҏwr7ydϧc7cд"4,8c,`cy'Ouc_3(a ~ѼeWKR?c[<?O(; 㦹Y&\/0K4P �Ymgy=X ΁:+y/4""n7-2/q<*Wx?zScq(\Kmek_Ɩ3˚B'}۵V]x$x^8ZZ & �X8̾�Vls.XV3>=3-?�...�ϏeS,OJOT<?i~�(i��y�iQnϠr;��@%E�G}B-_'� HaP݀�1eS3J1,ֆ��{w !\}��_,\l? jYVc4ȠxN.�)u(Z.ݲCvE\~f?DRsw[$LVj#~T[׹A~؈",*8G8|~8*i/|1:0S 1_D)�PJmc㐭`Zx9Ru P?>fJM?W䓠i J̻I5AZдP_~L?~uk�K$S1a1*s7<+4#,)SY1jXWhP]Zɛ.qq\yOU64%'GS{7UjUOOU*H2h?cL8ZAk`(^{mdGmI?ЬeԓO}gglZƏZ6aʎzAz]*8[?i~u[r�n9)◧Y edfoAMc^�r=Iӊ,_F>0χ ̏\=n\ ϷK xT/8?S;?a@Kqel_Fs.-lK7iP.4G yޕ܊r;?_BK-Jsr+O_,TK YOfˏγZ^ܸ)ѥTzuĭPV^i*.ۖ%<#tToN8Iħ? |kZk\U�}籓o{1fЪuXOrԮ}"X'Hĵg*{%G<oHK 4SK4f^QchQw>*IZuf*�ҽn;~Tdb:߾BSnZW\U�/_Jp:^&ܿɵidy3X<[nz_*ti7K<yʏH4RYAZV\Ӵ StkG_~L?~疟̍�&;fߴt+Gqoeg?F�犯i $�Ҹ)f|mTnP 7M+֨߼έFIHZ+TgĬL8$8/o8;^q=>L4|6nɧz4x\6-} AxzJDr嬧 MFJyO C^<2O(#5 *kn�$)jӲКg܈χfr=y5 >5%q<*W8?S;?ap-}Uιt__\a*FW:׳K H'oO_0l<i珤h* :Uz*6mӦYd\\f]h*'<G5W%`4D\]3dЖR%P~R\"/O4mI�@i25���>" &MrlԯߌdY~ pSU[;wc$ŘSt<..N^kz'Ѱa3EYO$YN<2)G_{a,CpDkGHdY|ΌweGo�qϺ|rs$t?+B)ϦZPNI ٓFע:򣷍~l�ikaEǧ `xZCZea �D(D"ceAIWqMY?WY}-s; qF4x<A7/[]׸'yYꛯl8<7z8N'_;� uO_g(}Zx?K$Nj RgdG}6k|?ݭp~M|˦_1mQe7U.~KYziy75^[l Rv-K^VnWW9r=z}\+Wcx!xI'8'}G}[ι__6NDz|bs`3/"9cY[70>q"*UBMt.Az}&?G3_}굗 t (r}™y�@"C2,LJGXgR5 �Ꜥl�YVw"%�Ч"/�"&#wo,]k�|7>]�(u˨BZPEd�p<9J=. �xv=^67F(Wi[*l^rN~5޼5{XK4$~HBݧW[Բ,5�O <$E zFEК7iŅF:[bi3ܫ;Pן~WU078d(Tk@ r�RgzjH|#<*ނo>hh/>/ߐro2~/ke/>EfcҲ8kd_&{xC �hZ"CS{.%|%/8tUvD�{BRg>yV} awr�Q$Hp(ؙhzk=_ ѩRe̽bdYJfOuڥca7Y<.~ǴGmZ~yRR5(~\c8Ʉy,cT[cU4 ,__=nO:u/߲:;_:یJ| /XyLmŸ5k\3-IeƲ\ӆ�F*GxvwVJiMŶu=E_LMߺwL5Gų,޴xt٣"K~�6jΝkgy, lQE_n��2Keբi'3uU|+4J(ky:s9s8 ;Y�u[4wHkk>-T~۫n_<ηeJָz4�QEi(g' =5nZLyi*qHym!յJZ?w$kf�l 'FvbU}EKƟ ϸx|%):Ti^瀹7lBl,;(W NWUgϾ$ڴNY␵`UB|ņ-QY@fi7c<l['<&)Wf.(uSɷnعx(/\I5*g[ar?~1ʼniwe5��ަL1ǹq֨JM}K[Zsjhg;N;:�Aq+o)sĭD|UVf?}!Vn "]>.Yɳ.U(Iqt/ƍk_sL5IgϽb녹fG.5:<n yG)װn;thԂdokƙPJ_? jW ߢc^` VMϋVXl׃lqΎmG%=m/2:pB/K/r"eIՉ0{W%^2!= ضefz\4 5lZ,m$/N(UNL)r·I6,-Z-UV6BEGK3(@y&ة3}7gKդu))gKUV֌e99< 4K\%QD澤J4G(VLŔ26Z|l~NHA֍- ՁqCeRJ$ Gm޺m�I (t+M|uAD]\Jc(e2eieep+eC~9Yrc-" OĿ2 ͵D"�rƬK?eGOJk*z1C_%4�QDEgܜwvҵ FY}%YÝ!Ե;_/}h$[|+gOd,A] [Vri&ŷ1RHrPl,鲤cTCJAs`adϧ3t\61}#s!~.C ZCs8x^f 0dcLysPvނ&nᚷԋyc?h,,煛q_=㩱_qsq-FƏeT98~}NԖL \>.2fu>8"k1";I-ONXs>Whmΐ?=ka{ذ=dBh=-ZlGbL$Cc"!ʉ|nYÜWZ}Vr.^va&.qCr-nz5iV k3TBge> K٬KI~,[Z9KU>koi72>fXB(lY%~ 0!iEQ):;9/d-p׍s}!ҷlFlo*[VB+'HȚ#=,2c y"_g6S|+_C_a0d˧3t\61}#㇩o.~)Jg3%Oވy72^k\q<Kn,lho/QZI5Ww/\}Uz_3_S*ˍ[5h%Д7U*a"ijtd|T$;r~_)Ƽ\xf9 ?V_Po%vQ87hTq[RY68ZEQMO_ p\Tʷq{4.@#BBҗ?j!*9`B!TrpE!J!P~n!B!B!Pف !B!B!J.@#B!B!*�B!B!BD4B!B!B !B!B!J.@#B!B!*�B!B!BD4B!B!B !B!B!J.@#B!B!*�B!B!BD4B!B!B !B!B!J.@#B!B!*�B!B!BD4B!B!BsaY B`,B!B0C#,B!B!Bf}>K!B!B!yU)?, B!B!B{3!B!B!BahJyq8闥~!r(S=x|ޣ& )*itB)Y\2oJzIY]kM6^?x~DbEhQ$|NX8@N|(uj|i|3H+(G؏9_{RO |YWc`?VrF*کrbd]G$?u(+GwO]t@޼z?,dm]9z~wF- [ Pˣ7,Z8~ٹ[$O3%'^'b`~Ixxpy+ɨb|VA[>1̞6gϼ`{>ehkKIJHvQR˺5hZl|2g}e\ittZk{v͝GbJUa-&N$1r� }-!u9q˼Z1ӐhN^ gޜ7mưt'^}%)'uK%>++vo,c'ϝIӖsÏeѓ4cKb,Dn92osF]XjM (C]rz\tUur i�/)iw]y+=)eI잱N2wMWB2K%ĘIOs(ݾN].a'ֻJmʟ.`Bc`aBjR!j|QlZmdKcKh��9N~H% LbՄC�dQ~L8s+VwQ,t[ni0TI hF-^^p]$Rٶ[@ކ~mƻcQ:h߷]ZO}+\g,~ߟ(QEYoY5ҹJ0sR%-Zv}4Zt) 3mcs7wbՍ,%)%!nH3~\l>e[1;umS't=;c[!5hZl|2[~ W32͚ǧ%WJwļ9Nz+/z0[:V?vsgy}DeɽmBAϒݹSyip?ZaOt_6<K"O3Ы].HS. f$1p̎Zۺqņec'x,r n"O>Q&%BmW_>-0CF,iM (C [4wݪeNgy"Q-Yl#`, `ҝRpAMS;k :{F=P\;U+ԍlݴrfM},ҥQ&ey ݱeUs;Q}n0&m|31F;^>f_kV.X=mCАRW 7 )UFFC"JMp/6lE^V`�qВpSiPx�o߾߼u}@'!CnD�Q[DUꖆ. _Uf?[]$ZK[ _cOTu7,Xhj*guȿedZ�H c0Ty[EdU/VŽt �pY=,ke%"Κ��XW/+[m׼NX=��{q+$zr, EB;>,x_8ow~ȶ<72�w*Ey5;},vfsy,Z �drkn&Yh-Z�XTgd)G<-C3c-/qt=3=ץj{?�Vuot鏳qP1eGۙYPM U׭/Nui+7tzaK_Q:aբ0"[e5hO+̯G%;55}+FV۫#,=,&U^Bw7mFYV6yhU;׍3}*'ڽԂJӮjg.6쀚lۋjcyzF:>Ӽ@R!qOny˚=9v,WpORݸͽ&rA~7%{N;OɆFsVx ._γmě1?E Hl 0xt*~{@"ߥ;FoI>LUE :xY97 W6t8Q)|>ߡݐM}<MENt#jҎ[~smV+~BiE n\S[c;m[gI`ꖆ֤֔ry(.iMvh w_ާւi~Yr"P7?#Rd^׶ ȎoZ]QZ}Z.tCI*'X]+^~wzώm%�Pѐ AqE ua\0K=LtETu/Ea,gmK6n۱@?r@gq#wDUwj%KVd?9 s UNnэLCbCX ߂}Z*r'=#95$>dtxh=Nm9?0-wV[`4EߚZ.{T-1JJz,qָ '>e}zllټj?룲)E£ys${jNe澔&{=cns-#T��Ypye鋞3c9[ ɒC3}F/ekh15C閆F{_UOܲyǻC?|ȔU7EZd㊱F �@hyɦu+!¹ymj�b;�go<ꟗ;w iy{ܖEpUZ^_ZN)&;8t5y=߱+Z�Om^qoſnji2e޶ ӹ6y[_uK]-$<mgyi]z!Xvɺ]\Z41Z6U zqO;^͎zjf,s1ƈҊp%, yTƔ{ ݉ыm[ u☢E+Ln_Q7n; >(D,n.^4dxئ[!TZ[뷎X.wK/~+)M֯%V݂mP.(VJܿ- ߨel_I2ǐ8),}Gp0]ӵLٱuͽ]K&r^7oKJ3!%Ȑ:M)C-j7o^b>!݈Ti/}b֟9FLl552m^:<S=?iѝRvAMV6|3sbj/4NyaHgOS_ߖZ }>񄭏ۅ>pvW|M li{tU62SZJUyTeSG"h*UKQu[ nC.hɎ=}lgb ُ^6m;lYdj,Z 2?q+ {<s>xu4u|;K3/-ga"[%ci<j#KOOLKlhEܐWsk3² >m1-HרcG!oJK[3y†N*9~% '%´tmӟ~RV0,H_>{ݘe5 b:ֳw+tRwحIҹWU'!ɳ3ջ)2\ztOܯy7{nD -g㯹 �NJr<-tc# u? ѽSt1JֹgEKw}~ӗe^[&l oߵ\Nzh5ɳ8_czG>|L�z~vV:jE<X9Y9q4�`KGMk\+U Z<گ&IZ @Q:)jR37v^B,y�^:ܳ>Ѣc/Juhڄv A۵iAh~ְqq]q>!]wMڮ! ]R䵓'6ir;_` UT $0<@wxiTmӪiF^1NcdzLO_6ܽqTsӿfԫ?a˴K\avi_%CJQuYʕU ~4m|ԗ.]r[ZvEO#J(n</A 7tL9s?\ +[zV:S'-SJ/kڡG,%k_4+&aNiɋ sZ#�ٚ{څ>pvg{YAU'!۫"6.>wSH+ZJURqd-gm,-!pWt@ykhwCnS~L乄VcUY ~tk~Y-yb`**5U[iÐ-EJ( !78K{Dw)mqP:Z%�j~~e&Mp(=Y >[wu2B#ĕj@!s씐K?0`!fLvbCIğ("jͬ4%>}Mߥ{,eU\8 U9ԥu) 2S h*i(*:eO+/5h13mԵP=lš_>- *�V?m|#>v}C|jY}ɲQ.Z%@ PkIB WWg��\ Q$ynsjDtTc-7wFzh H6tӱoۛ6z#$�bIGMkџ9Z"?JЎ:U*&/ItnƯEҥ-ۯ軕{Q~L- [q2]s.[fg۽ P?oh*2>'jؾ~ .�X0|cאɆ.CnZf4#>}?gH)Ն\<x |ˁ߯zpd%ƨȉF?_ 9k)jp' E�Z_ldפeMIHuVZ)eq.-]7}V98UU/dOm+PI]N }~%4G�KjmZU2.&bv G7zp9 )CƗ/ <lp_SzK=G(K~ 3[6cxwn# ƂHነm}eE�Ǹg- Ǵ.9j;z"SDBAyTrw*2qtÙRmNm?0-wVX_@3pR<wٓ.xIwqU;ZZTW^z>l$\"1�@?<8v J߯2�\g;�P-]]FZr,tGO4q6y߯n\v~cy[S KXFQ~SC; sssj j@vD{>�2~0rT7LϺ[tT-O<2իrfqIg\~$D|F(WG7Kꞻo5lPV>Y ΡK1g~-eA[kY?(~ ��CK7KuOwWU'Z6U.%t#u H*DSXK0EW}_֣ԙ2 n0*cƯۜ0~+Y1dnKo}nƤ.hPi!bWz{?gC*uP.ȳSЭ34�<ܷb2eMK\/@i7s;gcEJ',= )1]lCy;To1(=~' D3<y^NL [OSX,5iѝRvAQ(YRU/ A#Ác )C:Ӱͣ0G*N]N$z2R3ѪwCWH�Ή>0E a\( "Z!Z α={~`\�)(3ONV,bɬ6x,16E%ڎe1M;2wg]kTbQk;bE, ߢUi h}QIO1ȞDw)qqU;Zؒs|ꆻ+ؚtyS~ |˂R2+HL3:a�/饥"6%S:Yդ71"J__�Nb8V-2ZUiHWJ iJ Nm[<q)[:PmV .5l(5e5?oIɁ_0qYWY�Lz痳w"$m4vYzX>:;4섗(9N[4%݇\q{n[R#@!yE l?564%>{Z:'Qٳt[yqKB}QiחnRA/7*@ܤM�E:kbR juñdNGkbkjU|:E)['h<zVڑi/%Nma#'KIh>u_u tKT:t{Q~lz-úUt@/ϫN%GEN+;͸ ;P.kCy9M`0͏Ԣ2-xb_qƌedF^<n9}t˧W VE~kW9EXW1hml<QA)i}?ekY$LPdDAv>4-c'sB);bjũ҄ jJ-Cn*,E^ hwyYU.b`@Ob]*ɛ[S6ę״󥑛WҠ!I}xzOӊb{څ>p3*`׿oӪwuag!@떡N,eC.3 FKQ{QO_0vvOΪL -?1oXm <LV~ZЏk.v#XŸxXҘz`3Z7v60lZV†4�![yKôH 4%_gʢyW$ӧw dghRꜤtȣ)&I0�vζ<};Q̄,cW'%qmxQ磛y)ҳHgtNOU\E4~ NZ%>AT IYL8Z!M)?ٺX~Ak$=8;C><3-]us|{N܏lhTHR|[[b 蔡iG׭eCP)$1][fE:C:'IH[bSfxj#(EV:gorK�IB;c`kҭewSbk<V1QkEc,3D_&d%O)vsdotZѢ˴mP3͕bhP)ػiB e䕒4V%w <i)HDwGsnn>:<xRbr-y7;.Q7I08tvK%y;bЯvjjuP GיtA-HPr]mːrՐ&rP4Ap )CL "ۅ$\FqŸ>36"6iJ,wveXi%o-lS-4vt7 u]ObL?ƜAs "X5dPX"{XIaX4`!tKô4CFL3\nӀw Uʻ\FM߂g~[ zYn}f^oʖ/R&_F/+E7+YNw*͒!*#ޟܱ\py|e嫞$[nsIsߵ,Fi^~hJ9aЌFnT (iT"d\. m^͵%RĦ8zYI ȡS[Y4KM%B!̎H 4(oW1!lP&/EO"ӨXEp�B!B!BD.@ss@!B!B!d^\!B!B!PIaCg ����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/web/xmobar.css������������������������������������������������������������������������0000664�0000000�0000000�00000002355�12513250503�0015645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������body { margin: auto; padding-right: 1em; padding-left: 1em; max-width: 75%; border-left: 1px solid black; border-right: 1px solid black; color: black; font-family: Verdana, sans-serif; font-size: 100%; line-height: 140%; color: #333; } pre { border: 1px dotted gray; background-color: #efebe7; color: #111111; padding: 0.5em; } code { font-family: monospace; font-size: 110%; } h1 a, h2 a, h3 a, h4 a, h5 a { text-decoration: none; color: #009900; } h1, h2, h3, h4, h5 { font-family: verdana; font-weight: bold; color: #000000; } h1 { font-size: 130%; } h2 { font-size: 110%; border-bottom: 1px dotted black; } h3 { font-size: 95%; } h4 { font-size: 90%; font-style: italic; } h5 { font-size: 90%; font-style: italic; } h1.title { font-size: 150%; font-weight: bold; text-align: left; border: none; } dt code { font-weight: bold; } dd p { margin-top: 0; } a:link { color: #000036 } a:visited { color: #000000 } a:hover { color: #000046 } a:active { color: #000046 } #footer { padding-top: 1em; font-size: 70%; color: gray; text-align: center; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmobar-0.23.1/xmobar.cabal��������������������������������������������������������������������������0000664�0000000�0000000�00000012722�12513250503�0015341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������name: xmobar version: 0.23.1 homepage: http://xmobar.org synopsis: A Minimalistic Text Based Status Bar description: Xmobar is a minimalistic text based status bar. . Inspired by the Ion3 status bar, it supports similar features, like dynamic color management, output templates, and extensibility through plugins. category: System license: BSD3 license-file: license author: Andrea Rossato and Jose A. Ortega Ruiz maintainer: Jose A. Ortega Ruiz <jao@gnu.org> bug-reports: https://github.com/jaor/xmobar/issues cabal-version: >= 1.6 build-type: Simple extra-source-files: readme.md, news.md, samples/xmobar.config, samples/xmonadpropwrite.hs samples/Plugins/helloworld.config, samples/Plugins/HelloWorld.hs source-repository head type: git location: git://github.com/jaor/xmobar.git branch: master flag with_xft description: Use Xft to render text. UTF-8 support included. default: False flag with_utf8 description: With UTF-8 support. default: True flag with_inotify description: inotify support (modern Linux only). Required for the Mail and MBox plugins. default: False flag with_iwlib description: Wireless info support. Required for the Wireless plugin, needs iwlib installed. default: False flag with_mpd description: MPD support. Needs libmpd installed. default: False flag all_extensions description: Includes all optional extensions. default: False flag with_alsa description: Use alsa-mixer to get the volume from soundcards. default: False flag with_datezone description: Enables localized date support. default: False flag with_mpris description: MPRIS v1, v2 support. default: False flag with_dbus description: Publish a service on the session bus for controlling xmobar. default: False flag with_xpm description: Enable usage of xpm for icons default: False flag with_threaded description: Use threaded runtime. default: False executable xmobar hs-source-dirs: src main-is: Main.hs other-modules: Xmobar, Actions, Bitmap, Config, Parsers, Commands, Localize, XUtil, XPMFile, StatFS, Runnable, ColorCache, Window, Signal, Plugins, Plugins.BufferedPipeReader, Plugins.CommandReader, Plugins.Date, Plugins.EWMH, Plugins.PipeReader, Plugins.MarqueePipeReader, Plugins.StdinReader, Plugins.XMonadLog, Plugins.Utils, Plugins.Kbd, Plugins.Locks, Plugins.Monitors, Plugins.Monitors.Batt, Plugins.Monitors.Common, Plugins.Monitors.CoreCommon, Plugins.Monitors.CoreTemp, Plugins.Monitors.CpuFreq, Plugins.Monitors.Cpu, Plugins.Monitors.Disk, Plugins.Monitors.Mem, Plugins.Monitors.MultiCpu, Plugins.Monitors.Net, Plugins.Monitors.Swap, Plugins.Monitors.Thermal, Plugins.Monitors.ThermalZone, Plugins.Monitors.Top, Plugins.Monitors.Uptime, Plugins.Monitors.Weather, Plugins.Monitors.Bright, Plugins.Monitors.CatInt ghc-prof-options: -prof -auto-all ghc-options: -funbox-strict-fields -Wall -fno-warn-unused-do-bind extra-libraries: Xrandr Xrender build-depends: base == 4.*, containers, regex-compat, process, old-locale, bytestring, directory, unix, time, filepath, transformers, X11 >= 1.6.1, mtl >= 2.1 && < 2.3, parsec == 3.1.*, HTTP >= 4000.2.4, stm >= 2.3 && < 2.5 if flag(with_threaded) -- -threaded is a workaround for 100% CPU busy loop -- (http://hackage.haskell.org/trac/ghc/ticket/4934). -- See also comments in https://github.com/jaor/xmobar/pull/36 ghc-options: -threaded cpp-options: -DTHREADED_RUNTIME if impl (ghc < 7) cpp-options: -DGHC6 if flag(with_xft) || flag(all_extensions) build-depends: utf8-string >= 0.3 && < 1.1, X11-xft >= 0.2 && < 0.4 other-modules: MinXft cpp-options: -DXFT if flag(with_utf8) || flag(all_extensions) build-depends: utf8-string >= 0.3 && < 1.1 cpp-options: -DUTF8 if flag(with_inotify) || flag(all_extensions) build-depends: hinotify == 0.3.* other-modules: Plugins.Mail, Plugins.MBox cpp-options: -DINOTIFY if flag(with_iwlib) || flag(all_extensions) extra-libraries: iw other-modules: IWlib, Plugins.Monitors.Wireless cpp-options: -DIWLIB if flag(with_mpd) || flag(all_extensions) build-depends: libmpd == 0.9.* other-modules: Plugins.Monitors.MPD cpp-options: -DLIBMPD if flag(with_alsa) || flag(all_extensions) build-depends: alsa-mixer == 0.2.* build-depends: alsa-core == 0.5.* other-modules: Plugins.Monitors.Volume cpp-options: -DALSA if flag(with_datezone) || flag(all_extensions) build-depends: timezone-olson == 0.1.*, timezone-series == 0.1.* other-modules: Plugins.DateZone cpp-options: -DDATEZONE if flag(with_mpris) || flag(all_extensions) build-depends: dbus >= 0.10 other-modules: Plugins.Monitors.Mpris cpp-options: -DMPRIS if flag(with_dbus) || flag(all_extensions) build-depends: dbus >= 0.10 other-modules: IPC.DBus cpp-options: -DDBUS if flag(with_xpm) || flag(all_extensions) extra-libraries: Xpm other-modules: XPMFile cpp-options: -DXPM ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������