pax_global_header00006660000000000000000000000064124347234600014517gustar00rootroot0000000000000052 comment=2540951682584f0c6f738002e9154c4378181c94 munin-2.0.25/000077500000000000000000000000001243472346000127335ustar00rootroot00000000000000munin-2.0.25/.gitignore000066400000000000000000000001351243472346000147220ustar00rootroot00000000000000*/Build */_build/ */blib/ build-*-stamp build/ .*.swp /sandbox/ MYMETA.* SPOOL-META /RELEASE munin-2.0.25/.perlcriticrc000066400000000000000000000014021243472346000154160ustar00rootroot00000000000000# note the policy causing each warning, so they can be turned off more easily verbose = [%p] %m at %f line %l, near '%r'\n # no warnings if non-existant policies are mentioned in the config. profile-strictness = quiet ### Turn off policies ########################################################## [-Modules::RequireVersionVar] [-ErrorHandling::RequireUseOfExceptions] [-BuiltinFunctions::RequireBlockGrep] [-BuiltinFunctions::RequireBlockMap] ### Configure policies ######################################################### [Variables::ProhibitPunctuationVars] severity = 5 allow = $_ $! [Miscellanea::RequireRcsKeywords] severity = 5 keywords = Id [CodeLayout::RequireTidyCode] perltidyrc = perltidyrc [CodeLayout::ProhibitTrailingWhitespace] severity = 5 munin-2.0.25/.travis.yml000066400000000000000000000021471243472346000150500ustar00rootroot00000000000000language: perl perl: - "5.18" - "5.16" - "5.14" - "5.12" - "5.10" - "5.8" branches: only: - stable-2.0 - devel - master install: "/bin/true" before_install: - "cpanm --notest File::Copy::Recursive" - "cpanm --notest File::Slurp" - "cpanm --notest HTML::Template" - "cpanm --notest IO::Scalar" - "cpanm --notest IO::Socket::INET6" - "cpanm --notest Log::Log4perl" - "cpanm --notest Module::Build" - "cpanm --notest Net::SNMP" - "cpanm --notest Net::Server" - "cpanm --notest Net::SSLeay" - "cpanm --notest Test::Deep" - "cpanm --notest Test::Differences" - "cpanm --notest Test::LongString" - "cpanm --notest Test::MockModule" - "cpanm --notest Test::MockObject::Extends" - "cpanm --notest Time::HiRes" - sh contrib/install_rrd.sh notifications: email: false irc: on_success: change # no need for spam on_failure: always channels: - "irc.oftc.net#munin" template: - "%{repository} (%{branch} - %{commit} : %{author}): %{message}" - "Build details: %{build_url}" matrix: # we don't need to continue any build when 1 test is failing. fast_finish: true munin-2.0.25/Announce-2.0000066400000000000000000000030471243472346000147250ustar00rootroot00000000000000Introducing Munin 2.0! The most important features: * Even better scalability through: - Full CGI integration. It is for graphing as well for html, if needed. It is also completely compatible with FastCGI, that only compiles once per run. - Binary state data files. This has enabled a really fast startup and storing of state files. Quite useful in munin limits that does need to access to the rrd files. - Complete integration with rrdcached. Starting with RRD 1.4, there is an update daemon. It enables batched updates, and therefore reduce the IO down. Even with 1000+ files to update every 5 min. - Large performance improvements on almost all munin's components * Complete IPv6 integration. - The master only require a new perl module (IO::Socket::INET6) - The node needs a IPv6-patched Net::Server * Native SSH transport - No need to have a hairy setup anymore. * Graph Zooming - The UI is still raw, but right to the point. * New look on HTML pages, new graph colours with better contrast * IRC ( #munin @ OFTC ) has become a real support channel, mostly aimed at trunk. Availability: * You can find Munin 2.0 as source tar ball at sourceforge (https://sourceforge.net/projects/munin/files/) * Debian Experimental. Hopefuly in the next stable release * Expected in EPEL (Extra Packages for (Red Hat) Enterprise Linux) within not too long If you are a packager please contact us and we'll list your support/repository/whatever on our Wiki. Full details in http://munin-monitoring.org/browser/tags/2.0/ChangeLog munin-2.0.25/COPYING000066400000000000000000000062021243472346000137660ustar00rootroot00000000000000Munin - a network-wide graphing framework Copyright (C) 2002-2009 Jimmy Olsen, et al. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Includes the font Bitstream Vera Mono, which is under the following license: Copyright (C) 2003 Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: . munin-2.0.25/ChangeLog000066400000000000000000004420771243472346000145230ustar00rootroot00000000000000-*- text -*- munin-2.0.25, 2014-11-24 ------- Summary ------- Bugfix release. Closes: GH:304, D:769415, D:770745, D:770746, D:770826 ------------------ Detailed Changelog ------------------ Christoph Biedl (1): p/irqstats: Improve generated labels Daniel Black (1): ip/iostat_ios: also support /dev/xvdX devices Holger Levsen (1): p/iostat_ios: also support /dev/vdX devices Picnic Pete (1): Issue warning if no data Steve Schnepp (5): m/Node: add [INFO] in a log m/limits: remove warning about uninitialized plugins/df_abs: fix the naming for regular devices p/pgsql: Detect "rc" postgresql versions. p/ping_: honor ping env variable munin-2.0.24, 2014-10-26 ------- Summary ------- Bugfix release. It reopens D:675318, as it wasn't really fixed anyway. Closes: D:696981 Reopens: D:675318 ------------------ Detailed Changelog ------------------ Steve Schnepp (3): m/update: fix "not a reference at /../Utils.pm" Revert "p/postfix_mail: fix incorrect delivered message count" p/postfix_mailstats: proper fix, but partial munin-2.0.23, 2014-10-17 ------- Summary ------- Bugfix release. It enable the use of Perl 5.20, which broke CGI. ( commit 9fabbe7 was forgotten in the previous release ) Closes: D:762796 ------------------ Detailed Changelog ------------------ Steve Schnepp (1): cgi/html: fix CGI for perl 5.20 munin-2.0.22, 2014-10-15 ------- Summary ------- Bugfix release. It enable the use of Perl 5.20, which broke CGI. Closes: #1224, D:675318, D:711465, D:750954, D:751190, D:753506, D:761841, D:762904 ------------------ Detailed Changelog ------------------ Chen-Yu Tsai (1): cgi/graph: Set RRDCACHED_ADDRESS during each request Daniel Black (1): Corrects the truncating of negative values in the diskstats plugin Gerald Turner (2): dhcpd3 plugin should support multiple ranges in a single subnet lower-case the dictionary keys in ipmi_sensor_ Joerg Jaspert (1): make proc plugin more careful in /proc/ Klaus S. Madsen (1): prevent diskstats plugin from reporting negative latency Rob Shortt (1): node: munin plugin config ignores leading * Steve Schnepp (15): master: add "use_default_node" travis: adding preliminary test for rrd travis: be root for rrd install travis: fix rrd tar extract travis: customized rrd build travis: be root to install rrdtools. travis: install the Perl deps in the Perl dir travis: add some whitespace travis: optimize for compile times node: Only spoolfetch send 5 samples per service asyncd: Use SyncDictFile for plugin_rates asyncd: just use the SpoolWriter META-DATA p/postfix_mail: fix incorrect delivered message count p/http_loadtime: fix escaping of user agent Stig Sandbeck Mathisen (3): Remove linux-specific plugin files_ (ticket:1661) Detect more postgresql versions. Fix POD errors tbear2500 (1): Generate correct rrd filename munin-2.0.21, 2014-04-22 ------- Summary ------- Bugfix release. It fixes the regression on nested groups. The offending commit is only reverted, so the bug is here again. Reopens: #1224 ------------------ Detailed Changelog ------------------ Steve Schnepp (1): Revert "Generate correct RRD filenames for nested graphs. Fixes #1224" munin-2.0.20, 2014-03-28 ------- Summary ------- Bugfix release. It fixes the "start should be less than end" bug. Closes: #1358, #1350, #1434, #1224 ------------------ Detailed Changelog ------------------ Alexander Shorin (2): Generate correct RRD filenames for nested graphs. Fix unreasonable die in iostat_io Axel Huebl (1): p/http_loadtime: renable autoconf Lars Thegler (1): plugins/Plugin.pm: log filename in tail_open() Matthias Schmitz (2): Use perl instead of GNU sed; fix spelling error Fix small typo (misspelled name) Steve Schnepp (11): p/Pgsql.pm: fix version check on windows master/Update: atomic write datafile with tmp+ren master: fix kill invocation master/graph: fix gfx error when plugin is too old travis: We want to support down to perl 5.8 travis: test perl 5.18 travis: test perl 5.12 travis: build the master branch travis: remove notify on successive successful travis: change the IRC template travis: failing fast cernst1980 (1): p/lpstat: fix jobsize munin-2.0.19, 2013-12-07 ------- Summary ------- Bugfix release, aimed at fixing 2 bugs for Debian 7.3. Thanks again to Christoph Biedl for both (reports & patchs) Closes: #1394, #1395 ------------------ Detailed Changelog ------------------ Steve Schnepp: master: fix failures on partial graph_order master: lazy create PNG in cron munin-2.0.18, 2013-11-12 ------- Summary ------- Bugfix + secfix release. Note that this release has 2 security fixes : * Avoid a node DoS on bad plugin (CVE-2013-6359) * Avoid an OOM in HTML generation on bad multigraph data (CVE-2013-6048) Closes: #910, #1397, D:728840, C:CVE-2013-6359, C:CVE-2013-6048 ------------------ Detailed Changelog ------------------ Kjetil Torgrim Homme: common: add missing keywords common: refactor the keywords to ease changes Matthias Schmitz: Substitute some @@ vars in generate files. Steve Schnepp: plugins/open_files: fix overrided used.warn/crit node/asyncd: fix a crash case node/asynd: avoid wake up each second master: fix unexpected "warning limit" lines master: avoid an endless loop in HTML generation master: validate multigraph argument master: don't abort node collection on bad plugin p/ipmi_sensor_: fix the environ() usage munin-2.0.17, 2013-07-19 ------- Summary ------- Bugfix release. Closes: #1305, D:710899, D:712793, D:717265 ------------------ Detailed Changelog ------------------ Steve Schnepp: p/df: also ignore devtmpfs plugins/df_abs: fix the multiple block device gitignore: ignoring output dir sandbox/ master: fix "graph_period hour" plugins: fix uninitialized $MUNIN::VERSION Stig Sandbeck Mathisen: Remove typo in the example rrdcached socket documentation munin-2.0.16, 2013-06-03 ------- Summary ------- Bugfix release. - Fixed a spurious WARNING in GFX cgi ------------------ Detailed Changelog ------------------ Kenyon Ralph: plugins/ntp_: fix parsing older ntpq output Steve Schnepp: master: fix warning in GraphOld.pm munin-2.0.15, 2013-06-01 ------- Summary ------- Bugfix release. - Fixes for ip_ handling Closes: D:710527, D:710529 ------------------ Detailed Changelog ------------------ Steve Schnepp: plugins/Plugin.pm: fix bad state file handling (fixed) master: adding ":" to the allowed chars in CGI dev_scripts: automate async install master: re-enable debugging output in GraphOld.pm asyncd: use the same rules as munin-update Stig Sandbeck Mathisen: Fix for munin-cgi-graph crash in trend and predict. munin-2.0.14, 2013-05-10 ------- Summary ------- Bugfix release. - Fixes for plugin.pm state handling - Fix the limits for ABSOLUTE ------------------ Detailed Changelog ------------------ Kenyon Ralph: plugins/node.d/apc_nis: improve maximum limits Steve Schnepp: master: fix limits computation for ABSOLUTE Revert "plugins/Plugin.pm: fix bad state file handling" munin-2.0.13, 2013-04-26 ------- Summary ------- Bugfix & perf release. - Fixes for munin-async - Enhanced perf for munin-html - Relaxed the timeout for munin-node 2.0.12 fixed the timeout code. But it had a nasty side-effect as the timeout setting is shared for global timeout and plugin timout. This version decouples both by introducing a new global_timeout munin-node.conf variable that defaults to 15 min. Closes: #775, #947, #1267, D:558800 ------------------ Detailed Changelog ------------------ Jens Holzkämper: different state files for cron job & as plugin Kenyon Ralph: ntp_: rewrite plugin to support IPv6 ntp_states: decrease timeouts so DNS queries don't cause node timeout ntp_states: don't use this silly plugin loading method node.d/ntp_states: improve compatibility with older perls Kim B. Heino: plugin/diskstats: fix negative stats, relax limits plugins/http_loadtime: more wget/time fixes plugins/lpstat: fix autodetection plugins/snmp__if_multi: prefer ifAlias for alias name plugins/postfix_mailstats: support proxy-rejected (amavis) log lines asyncd: add more signal handlers. Steve Schnepp: master: whitespace fix in Utils.pm master: avoid having 2 concurrent $htmlconfig master: undef the config pre-reload (frees mem) master: RAM usage for $cache master: remove weaken on storable::read master: remove auto_weaken() contrib: add a test for memory leaks contrib: complete test with Storable dump/load plugins: add doc about conntrack plugins: use $PATH for external commands in shell plugins/postfix_mailstats: using a per-minute graph plugins/snmp_if: replace 32b counters by 64b ones node: set the global timeout to 15 min node: add timeout documentation in sample conf master: add --debug to munin-graph master: fix end date when predicting plugins/Plugin.pm: fix a security issue on state plugins/Plugin.pm: fix bad state file handling p/http_loadtime: fix failure on FreeBSD p/http_loadtime: do not reuse $TMPDIR dev_scripts: run should only run executable files node: add a lock to spoolreader node: update doc to show negative args Stig Sandbeck Mathisen: Use a more efficient sort on the list of nodes munin-2.0.12, 2013-03-21 ------- Summary ------- Bugfix-only release. - Fixed TLS/SSL transport - Fixed extra logging Closes: #1251, #1258, D:699803, D:689291, D:687912 ------------------ Detailed Changelog ------------------ Bjřrn Ruberg: plugins/bonding_err_: adjust for newer kernels Steve Schnepp: node: don't ignore timeout config option plugins/apt: fix plugin statedir for cron html: fix bug introduced by 1aec747c10 graph: remove all extra INFO messages plugins/proc: fix bug in selecting via uid dev_scripts: remove warnings graph: remote superfluous -T in cmdline master: fix TLS enabled updates munin-2.0.11.1, 2013-02-09 Ironically, asyncd is broken in .11, as a typo makes it uncompilable. This is a patched release, and I'll remove any .11 tgz as it's not-working. Sorry. munin-2.0.11, 2013-02-01 ------- Summary ------- Bugfix-only release. - Important async fixes - Many fixes Closes: D:698079, D:697907 ------------------ Detailed Changelog ------------------ Diego Elio Petteno: hddtemp*: avoid using the degrees symbol in vlabel. Update .gitignore. master: always initialize the default cgiurl_graph value. master: simplify logic for mapping images to their path. master: provide a default to graph_strategy. master: avoid repeated tests on graph_strategy. master: remove unused variable. pod: declare all POD-processed files as utf8 encoded. Marc Schutz: fail2ban: Handle the case where no jails are configured. Stefan Rubner: plugins/mysql_: fix check if InnoDB is disabled Steve Schnepp: plugins/slapd_: fix Net::LDAP call asyncd: fix races in writing to spool asyncd: typo in pod asyncd: try to reuse socket when asking node asyncd: add the hostname in $0 asyncd: fix timeout bug & adding some debug asyncd: ignore current plugin if failing cnx to node asyncd: close the datafile before rename asyncd: quickfix a sleeping dataloss bug Stig Sandbeck Mathisen: Fix spelling mistakes in POD sections munin-2.0.10, 2013-01-09 ------- Summary ------- Bugfix-only release. - The --force flag of munin-limits is back, sorry for the disruptive API change in the 2.0.x series. - Many fixes Closes: D#615957, D#671448 ------------------ Detailed Changelog ------------------ D. Johnson: templates: fix overview missing tag Diego Elio Petteno: mailman: allow user to configure paths instead of hardcoding them. asterisk_*: remove dependency on Net::Telnet. asterisk_channels: fix name of plugin in configuration examples. Gerald Turner: plugins/bind9_rndc: fix if named.stats is on tmpfs Holger Levsen: plugins/df: update exclude list doc to match code Magnus Hagander: Disable server-side prepared statements for pg plugins Michal Cihar: plugins/snmp__df: find all mount points Nicolai Langfeldt: getversion: Handle checked out tags better Steve Schnepp: fix plugins.history plugins/cpuspeed: fix if cpus are at maximum speed getversion: update doc getversion: use the commit SHA instead of tree SHA getversion: prefix the commit with "-g" magic getversion: apply the changes described in doc getversion: also fix the stable-* rules Stig Sandbeck Mathisen: munin-limits: Add --always-send, --force options munin-2.0.9, 2012-12-05 ------- Summary ------- Small bugfix-only release. - Many minor fixes ------------------ Detailed Changelog ------------------ Daniel Black: node: allow ipv6 localhost in sample conf Diego Elio Petteno: common: fix TLS options settings. master: fix config test, add missing configuration options and update defaults. master: fix and rename htmlold test to test HTMLConfig instead. master: remove test for function that has been deleted. master: check for timeout before checking for failure to connect. master: remove one more test that requires a big rewrite to make sense. master: fix tests so that they actually pass for master. node: fix export_service_environment test. node: add a temporary default spooldir to the proxyspooler test. master: make sure to always consider limits, for when always_send is configured. master: fix test when executing from a release tarball. Magnus Hagander: Fix PostgreSQL plugins to work with development versions Marc Schutz: New regexes for virus/spam count in amavis plugin. Sebastian Noack: Fixed broken exit codes in ejabberd plugin. Fixed order of arguments for 'ejabberdctl status-num-host' in ejabberd plugin. Steve Schnepp: master: remove date manip warning in cgi graph contrib: rename the net::server patch master: connect to AAAA and A address Stig Sandbeck Mathisen: Remove documentation disclaimer intrigeri: plugins: do not use the "read w/o variable" bashism. munin-2.0.8, 2012-11-08 ------- Summary ------- Small bugfix-only release. - Many minor fixes ------------------ Detailed Changelog ------------------ Andrea Piccinelli: http_loadtime: fixed stderr redirection with 'time' Anton Tolchanov: Fixed parsing of first element in custom graph_data_size Diego Elio Petteno: master: on limit checks, if one of the two values is 'U', make the final value 'U' as well. master: on limits, be more careful on checking what always_send is set to. master: munin-limits: remove --force parameter master: munin-limits: open the data file based on hostname, not alias. plugins: Remove all '%' characters from plugins' graph_titles. master: factor out the SSH command, and set parameters to disable interactions master: if there is no path present, don't send a remote command. master: ignore all the lines before the greeting. Juho Juopperi: Fix multiping to show packetloss correctly Kjetil Torgrim Homme: fix problem with SIGHUP causing exec of unqualified script name Marc Schutz: Update licenses to current address of FSF. Steve Schnepp: master: fixed graph_data_size custom parsing getversion: update to use the debian-auto one. master: add an ip6 example in the sample munin.conf gitignore: ignoring output dir sandbox/ Stig Sandbeck Mathisen: Update apache httpd configuration example for 2.0.7 munin-2.0.7, 2012-10-03 ------- Summary ------- - Fixed datafiles handling from munin-update to others (cgi & cron). We only use storable datafiles now as it is less error prone. - Many other minor fixes Closes: #1259, D#688528, D#497400, D#687495, D#686982, #1251, #1251, #1102, D#628533, #1102, D#628533, D#681938 ------------------ Detailed Changelog ------------------ Adrien "ze" Urban: master: fix new config reading for m-u 1st run master: fixed datafiles handling Diego Elio Petteno: docs: fix link names apc_nis: create only one socket before going for config. apc_nis: improve configuration. plugins: replace deprecated graph_vtitle with graph_vlabel. ejabberd_: allow overriding the ejabberd.cfg path and add /etc/jabber to search paths. fw_conntrack: count both ipv4 and ipv6 connections together Jon Whiteman: plugins: fix plugin vserver_cpu_ for 9+ cpu cores Kazunori Kojima: Makefile.config: fix bad interpreter Kenyon Ralph: node.d.linux/interrupts: encode as UTF-8 Steve Schnepp: resources: remove osoblete apache-cgi.conf sample node: remove File::Path as it's not needed redhat: move the redhat stuff outside main repo master: fix too many warnings in munin-graph.log master: remove useless log lines, send to debug plugins: fix import in ipmi_sensor_ master: fix typo in Utils.pm plugins: fix apt_all plugin statedir for cron asyncd: fix --spooldir help master: split rrd updates when using rrdcached plugins: use Storable::nstore() instead of store() plugins: ignore wrong state files. Thorsten Gunkel: plugins: auto detect SATA in hddtemp_smartctl Vincent Danjean: plugins: add by-id to smart_ munin-2.0.6, 2012-08-31 ------- Summary ------- graph cron is the default again. This enables simple install either to work out of the box or be upgraded from 1.4.x in a far easier way than with the CGI default. Only fixes, but many of them. * fixes for munin-graph (cron + cgi) * fixes for munin-update * fixes for links in templates * fixes for the various security bugs ------------------ Detailed Changelog ------------------ Adrien "ze" Urban: templates: fix multiple bad links (mostly with subgroups) graph: cosmetics for no-data to graph db/graphs: remove duplicate entries munin-cgi-graph: fixed memory leak doc: nginx - Authentication and group access doc: multimaster contrib: munin-mergedb.pl (tool for multimaster) doc: fix missing link to tips/multimaster munin-cgi-*: use MUNIN_CONFIG if available munin-cgi-html: update timestamp when running for a while Chen-Yu Tsai: update: write node/services with update=no to datafile as well Diego Elio Petteno: snmp__print_pages: fix snmpconf. http_loadtime: use bash instead of any sh; `time` is not a standard command proc: fix Perl syntax to not use deprecated defined(@array) proc: drop autoconf capability and handling code. varnish_: remove another deprecated defined(@array) Holger Levsen: munin-cgi-graph: ignore @ARGV to fix CVE-2012-3513 and Debian #684076 munin-cron: call munin-graph with --cron argument (Closes: D#685343) Rename cgi-bin to munin-cgi: the default for the Apache webserver is to setup a ScriptAlias for /cgi-bin. The ScriptAlias directive does not permit changing sublocations, thus making it impossible to impose further restrictions like access controls etc. This change was done in munin-cgi-graph, munin-graph, HTMLConfig.pm, static/dynazoom.html and static/zoom.js _and_ also needs to be done in the distribution specific webserver configuration file. Niall Donegan: Quick fix to http_loadtime Added back in the capacities magic marker Peter Palfrader: update: bugfix _node_read_fast() (Closes: D#686089, D#686090) update: remove the last line to fix parsing errors update: fix use of undefined variable async: fix retrieve of ip_ We probably also want to allow : in spool filenames Robin H. Johnson: mysql_: Multiple instance support. Steve Schnepp: adding a new sum+cdef tester plugin munin.conf.in: show the defaut value in the sample adding some comments for HTML cron vs cgi Only kill & log if the subprocess is still alive update/spoolfetch: disable _node_read_fast node: more secure state file handling (Closes: #1234, CVE-2012-3512, D#684075, D#679897) plugins: use runtime $ENV{MUNIN_PLUGSTATE} master: revert to cron GFX per default plugins: fix for uninitialized $MUNIN_VERSION master: fix the D::M:B warning in munin-graph async: allow any good-looking-enough file in spool (Closes: D#686093) plugin: revert removal of munin_graph field munin-2.0.5, 2012-08-14 Diego Elio Petteno: ipmi_: improve autoconf handling sensors_: add support for power monitoring. munin-cgi-html: apply patch from ticket #1200 master: fix images for plugins w/ sub-categories. snmp__print_pages: fix snmpconf: Malte S. Stretz: Don't exclude simfs per default. Steve Schnepp: fix: dbdir shall not revert to default on m-u runs munin-cgi-graph: refine the fix for not cached cgi munin-cgi-graph: don't ever die() in CGI munin-2.0.4, 2012-07-30 Summary: * fixes for munin-graph * fixes for df_inode plugin Detailed Changelog Diego Elio Petteno: master: fix relative paths when using cron-based page generation. munin-graph: do not output text meant for CGI. munin-graph: use INFO for further details during execution. munin-graph: use the same default (non-cgi) as the rest of the Master. Steve Schnepp: Makefile: add a comment about JCVALID Stig Sandbeck Mathisen: Ignore reiserfs in the df_inode plugin Make df_inode plugin more robust. Add missing regular expression anchors munin-2.0.3, 2012-07-24 A quite raw output of 'git shortlog' : Christian Ruppert: nginx_{request,status}: include Munin::Plugin to fix version identifier. Christoph Biedl: fix bug that disabled gfx CGI caching Dan McGee: Force usage of the DM5 Date::Manip backend Don't remove Defaults.pm when invoking build-common target Expand list of filesystems excluded in Linux df_inode plugin Daniel Kahn Gillmor: slony_lag_: allow >1 subscribers Diego Elio Petteno: ifx_concurrent_sessions_: allow ps and pgrep to be in /bin as well as /usr/bin build: only move adv files if building on HP-UX. build: install TTF files as non-executables config: respect LIBDIR override. build: only install Java plugin files if JCVALID=yes df: exclude cgroup_root filesystem type as well. Add build-doc-stamp to .gitignore. master: bring back checks for graph_strategy set to cron. Jeremy Olexa: config: make sure to translate correctly for C-locale only Steve Schnepp: fix munin-graph typo in opening $graph_fh port multigraph_complex to pure POSIX shell doc: add "supersampling" plugins doc: adding supersampling section doc: changing markup use cgiurl_graph config in dynazoom.html use environment var for rrdcached revert to the same naming than 1.4.x makefile: added a comment on LANG node: only use basename for $0 Makefile: move default rule to be the 1st one directly compile to output dir git: ignore more build assets Stig Sandbeck Mathisen: Add documentation for writing a munin plugin. Correct reStructuredText syntax warnings Remove references we do not have targets for yet Document the munin node Add information about authorized_key hardening restructure documentation, work in progress Whitespace cleanup in the doc tree Add munin-cgi-graph manpage Add munin-cgi-html man page Order the man pages alphabetically Use correct reference Set a max depth for the table of contents Rename the graph aggregation directory appropriately Write proper man pages, and ensure "make man" creates them Add better description on the main index pages Add a directory reference page Remove plugin/aggregate, we have a replacement in examples/graph/aggregate Clean up table of contents in reference/ Add "how to use plugins" page Add munin-check man page Add markup and links for the supersampling doc munin-2.0.2, 2012-06-29 Summary : * munin-graph can be called again from cron * workaround "root" field name bug * initial doc/ subdir. will be munin book * emits percent in log about errors * various bugfix munin-2.0.1, 2012-06-10 Well, first bugfix release. SCM has moved from svn to git. Commits by luke, mwest, steve.schnepp, ssm Summary : * remove .storable files if they are unreadable. * change version strings to match git workflow * fix perms on state dir (D: closes #675593) * swallow stderr in cmd and ssh transport * remove the graph field in munin timings plugin Major enhancements to munin-async : * rename of the process names, it is now munin-async(d). * implement automatic cleanup * implement metadata, for the spool to be self-descriptive munin-2.0.0, r4900, 2012-05-30 It is 2.0-rc7, code wise. Only edited the mandatory doc files (Changelog, UPGRADING, ...) Here is a very short summary : * CGI graphing is the way to go as munin-graph is no more * Native SSH transport * Native IPv6 transport * Full rrdcached support * Graph zooming * Arbitrary precision down to 1 sec (needs 2.0 plugins) * Asynchronous polling support (still experimental) Full summary is in Announce-2.0 and the detailed changelog is below, scattered in the various pre-2.0 versions. munin 2.0-rc7, r4882, 2012-05-23 Commits by kenyon, steve.schnepp, ssm Summary : * Fix regex when $serv has some "-" in it (like dm-2). Closes #1218 * munin-node: sets $PATH to a secure value. (Closes #863 and #1128) * munin-cgi-graph: Add & to the list of "good" chars, since it is used in $ENV{QUERY_STRING} (D: Closes #674148) * munin-limits: fix for UNKNOWN on DERIVE (Closes #1203, #1221) * munin-limits: fix --host option * munin-limits: fix on hosts with multiple levels of domains munin 2.0-rc6, r4839, 2012-05-07 Commits by kenyon, knan, matthias, runesk, steve.schnepp, ssm Summary : * hddtemp_smartctl: just use the device name as the labels * Update our website address in various files * Add explicit license for all plugins. (D: Closes #670428) Many bugfixes in munin-cgi-graph : * If url parameters are not valid, send HTTP 404 instead of 500 * Remove the use of tempfiles. (D: Closes #668778) * Move the generation of png via cgi under /var/lib/munin/cgi-tmp/ (D: Closes #668536) * Don't cache URL with parameters anymore, and don't keep uncached URLs (D: Closes #668667) * Validate the url chars. (D: Closes #668666) * Add a max setting for cgi image size. (D: Closes #670811) munin 2.0-rc5, r4795, 2012-04-11 Commits by kenyon, steve.schnepp Summary : * Adding the current action to the command line. Useful for debugging. * Adding a new URL param full_size_mode to enable predictible IMG sizes * Enable sparklines with the url param "only_graph" * Start RRD just before first update. To avoid a very costly 1st update. * Emit the hosts in a sorted order, instead of somewhat random. * Do not emit png list if file handle is not defined. (D: Closes #666759) * Add old option of --force-root, but with a new name. more explicit (D: Closes #601371) * We dont generate the png list when using cgi html. * Remove warning when asking "list" w/o a hostname (U: Closes #907952) * Many bug fixes (Closes #967, #1210) (D: Closes #583189, #568511, #475078, #666759) munin 2.0-rc4, r4770, 2012-03-24 Commits by holger Summary : * Fix important typo munin 2.0-rc3, r4760, 2012-03-23 Commits by kenyon, steve.schnepp Summary : * Fix issue that CGI HTML doesn't refresh itself * Fixed plugins to use the default draw style * Also remove \r when reading config/fetch output. (works around bad behavior from munin-node-win32) * Various plugins fixes (closes #798, #663965, #595697, #648891) munin 2.0-rc2, r4709, 2012-03-09 Commits by kenyon, steve.schnepp Summary : * Import rrdmove into contrib/ as rrdcopy * Revert the Munin::Common fix as it disturbs the deb build * Various plugins fixes by kenyon munin 2.0-rc1, r4638, 2012-02-07 Commits by kenyon, steve.schnepp Summary : * Fix Munin::Common (closes #1036) * Document the fact that Munin needs at least Log4Perl 1.18 (closes #969) * Colors can now also be specified by an index of the palette (closes #1186) * Some plugins don't follow LC_ALL spec, so setting LANG=C also. (closes #1014) * Rewrite of fw_conntrack and fw_forwarded_local (closes #843, #725) * Various fixes & typos munin 2.0-beta7, r4600, 2012-01-21 Commits by kenyon, mha, tv, holger, steve.schnepp Summary : * Spoolfetch uses _node_read_fast() now : 3MiB is now read in 2 s instead of 7 min. * Fix for the images when browsing in 'categories' view to be clickable. * Fixing the png generation, in order to have 1px per RRA sample. (closes #1184) * Fix for nested nodes * single_value is wrong for some multigraph, disabling it for now * new plugin : (haproxy_ng multigraph plugin for haproxy) munin 2.0-beta6, r4544, 2012-01-14 Commits by kenyon, mha, holger, steve.schnepp Summary : * Rewrote the timeout handling code. The default node timeout is now 1 min. * Various bugfixes since 2.0b5 munin 2.0-beta5, r4508, 2011-12-7 Commits by knuthaug, ssm, bldewolf, tv, kenyon, janl, ligne, kristian, holger, steve.schnepp Summary : * Resurrecting munin-graph in a quite raw form * Set max_process default to 16 * Small performance improvements * Memory leak fixes (use weak reference for upper nodes) * Spoolfetch enabled nodes may send nothing. * Various code cleanups * Various bugfixes since 2.0b3 munin 2.0-beta4, r4306, 2011-8-2 Commit by steve.schnepp Summary : * fix issue with cgi html munin 2.0-beta3, r4256:4298, 2011-8-1 Commits by janl, ligne, steve.schnepp Summary : * HTML/CSS enhancements * munin-async-* enhancements * IPv6 enabled munin-node * Small munin-html performance improvements * Small plugins improvements * Various bugfixes since 2.0b2 munin 2.0-beta2, r4199:4252, 2011-7-3 Commits by bldewolf, steve.schnepp Summary : * Full integration of Munin with rrdcached * Fixed multigraph to be able to have multiple levels * Using Storable instead of a binary DB * Create a node.d.debug subdir * Various other bugfixes since 2.0b1 munin 2.0-beta1, r4124:4199, 2011-5-29 Commits by bldewolf, feiner.tom, jo, jorne, kristian, ligne, mha, runesk, ssm, steve.schnepp Summary : * Avoid memory leaks in munin-cgi * Enabling the generation of RRD with a different step size (eg: 10s instead of 5 min) * Various other bugfixes since 2.0a2 munin 2.0-alpha2, r3856:4124, 2011-1-19 Commits by bldewolf, feiner.tom, janl, knan, ligne, mha, ssm, steve.schnepp, lupe, jorne Summary : * Huge performance boost * munin-graph is over, cgi graphing only from now on * Enabling CGI HTML with an reworked UI * use a binary DB to store spoolfetch timestamps (fixes growing file bug in 2.0a1) * documentation cleanup Enhancements : * Better node side timeout error message allowing things to be found out if needed * Properly label the bgbouncer queries-per-second graph. * Properly return undef when the SNMP client returns noSuchObject instead of setting an error. * munin-node: Insert a reset_timeout() call to enable the master to get in a word in edgeways after a slow plugin has executed * munin-html: Start using fork to save some wall-clock time. Option --fork us now active and max_html_jobs is recognized by munin-html as the maximum number of paralell processes. * Actually recognize max_html_jobs as a config parameter * Add the publication part * Clean up Perl warnings due to use of undefined variables in two functions in LimitsOld.pm. * looking at the Net::SNMP doco, -username cannot be '' (it must be between 1 and 32 characters). * The time of munin-graph is over, cgi from now on * since pollers are now being respawned if they fall over, the shutdown-spooler signal handlers need to be removed before starting any poller up. * Cleanup of munin-cgi-graph: - Make it log right - Make it fast (now <0.1s pr graph on reasonable hardware) - Remove $config deep copy, it is too expensive, we need to fix expand_specials instead. - BUG: Broke --pinpoint processing * Munin::Master::Utils: - Replace some often used REs with string matches for speed. Helped speed up munin-cgi-graph quite a bit. Introduced munin_dumpconfig to help debug the expand_specials issue - Introduce munin_find_node_by_fqn to do faster lookups of things to graph. * Munin::Master::GraphOld: - Restructure a bit to avoid double loading of $config (in cooperation with munin-cgi-graph) and make it possible to pass some graphing options (--only-fqn for example) in some new places. - Propper logging the right way - NOTE: All code relating to host and service filtering and looping should be removed soonish - we're only using the FQN to find our work now. * Replacing 'echo -n', which is implementation-defined - with printf, which is posix * munin-update: Add local URI scheme to enable running async collector directly on the master as this may somehow enable push-to master. Closes #981, thanks to jorne * ALWAYS dumps the RRD cmd used when an error occurs when RRD::graphing * Add some extra HTTP Response Headers * JMX refactoring by Joachim Sauer * add some external tools to ease a Storable datafile * Enabled multigraph capabilities for the munin-async-server * Re-work filtering in linux df plugin to be much more flexible. * Force lpstat to C locale instead of EN_us. Various bugfix (not exhaustive) : * ${graph_period} substitution should happens in graph_title & fieldname (closes #881, thx stavros) * bugfix for mkpath on 5.8.8 (closes #992) -- thx Matthew Kent * fixes #991 (munin-update constantly thinks config has changed), thx mkent * Better checks for undefs in munin-limits (#973) * IPMI plugin now graphs power usage as well (#954) * Fix swap usage numbers in the sunos memory plugin (#696) * Make exim_mailstats plugin behave properly after initialisation (#985) * Fixed a bug where all services in a category were colored when a service had a warning or critical state * Clean up field names in the bonding_err_ plugin on linux (#962) * Cosmetic cleanups in snmp__if_multi plugin (#1008) * The snmp__if_multi plugin now makes proper use of 64bit counters if available (#1006) * The linux plugin selinux_avcstat now uses integers instead of floating points (#1005) * freebsd/coretemp - rrd doesn't do celsius/fahrenheit * Fix autoconf in the nfs_client plugin for linux nodes (#1015). * Fix issues with plugin names with - in them. * Make linux df plugin not die when it encounters a mountpoint it can't access (#940) * snmp__df - avoid division by zero * gets it working for net-snmp snmpd on a ubuntu 10.04 lts desktop with fuse mounts * Fix up Solaris's if_ plugin. * Low max_processes leads to hosts being skipped (closes #990) -- thx Matthew Kent * Make the mysql_ plugin better at parsing innodb output (#956) * Change call to mkpath to call to Utils module, resolving an issue with old perl (ticket #992) * snort_* : merge fix from branch 1.4 to trunk New plugins : * add plugin : snmp__df_ram plugin * add plugin : PostgreSQL 9.0+ streaming replication lag * add plugin : linux/proc - for graphing information about groups of processes. Removed plugins : No one was disappointed :-) munin 2.0-alpha1, r3400:3856, 2010-7-14 Commits by bldewolf, feiner.tom, janl, knan, ligne, mha, ssm, steve.schnepp * Enhanced CGI (CGI::Fast, direct call to GraphOld.pm, cgitmpdir) * Ability to zoom in or out graphs * fixed comparison pages in CGI mode as (closes #831) * hostname checks are case in-sensitive now : every hostname is converted to lowercase before use (closes #450) * Implementation of dirtyconfig (fixes #836), upgraded df plugin as an example. * custom format, per field/plugin, for graph_data_size * Add update_rate with optional "aligned" suboption to align RRD updates to granularity (avoids fractional for integer gauges) * SSH native transport (closes #842) * handle the last line of multiline options (fixes #855) * modify how varnish_ autoconf checks for the varnishstat executable. (closes #873) * use STDERR if cgi cannot open logfile (closes #874) * Add comments to the extremely long regexes in the sensors plugin. Many thanks to Noga Gazit for the patch adding the comments! (attached in debian bug http://bugs.debian.org/573613 * Fix sensors plugin parsing of Voltage, which needs to allow for whitespace at the begnining of the line. Debian bug: http://bugs.debian.org/573613. Thanks to Arthur Liu for the patch! * load $config once when using FastCGI, use Storable::dclone to deepclone the $config, in order to make .sum work again (see #894) (thx Jani M.) * Remove iso-8859-1 degree character from the example output from sensors, as it is ran with LC_ALL=C * prevent a spike in the graph after Amavis is restarted. Thanks to claudius for the patch. (closes #889) * set Net::Server's syslog_ident parameter, so log lines have 'munin-node' as the process name, rather than the significantly less useful 'net_server'. closes #789 * fix warnings when running under certain versions of perl, caused by exporting an undefined variable to the environment. thanks to Aleksandar Lazic (al4711) for the patch. (closes #896) * fix bug where snmp__netstat plugin can massively undercount the number of connections. * add a $Munin::Plugin::SNMP::DEBUG variable, which is an alias for $Munin::Plugin::DEBUG, so that SNMP plugins can automatically have debugging turned on when MUNIN_DEBUG environment variable is enabled. * update snmp__rdp_users plugin to use M::P::SNMP, and document it. * node.d/df* minor spring cleaning * processes plugin - implement autoconf * Add --pidebug to munin-node-configure. If PIDEBUG isn't defined, Node/Service.pm complains about uninitialized values. * Fix TLS, resolving several bugs. * Uptime should not scale, as it makes it hard to read after 1000 days of uptime. Thanks to Wakko Warner for noticing this (http://bugs.debian.org/575180) * strip the carriage return on the end of the capabilities list, if it exists. needed when debugging using telnet. closes #902. * Add plugins to monitor prepared transactions in PostgreSQL * Add a authors file for the buggers that use svn-git * add an experimental test script, that checks the POD sections embedded in plugins (as used by munindoc). * remove dependency on perl-5.10. (munin tries to be 5.8 only) * fixes on mysql_isam_space_ * extend M::N::SNMPConfig to support SNMPv3 scanning. * munin-async-[client|server]. A proxy for async polling of the localhost's munin-node * defer JCVALID evaluation to runtime, since $(JC) can be redefined later in a specific Makefile.config. The core Makefile.config serving as a Makefile.default in this case. * delete some obsolete tests. * Remove Bashism - Thanks to Raphael Geissert for pointing this out (bugs.debian.org/581126) * Adding a pure debugging munin-node * enable vectorized multiple-time updates * upgraded README to new website * get rid of unused variables, and needless initialisations. * first draft of a perlcritic policy. * Always start RRD 10 years ago to be able to spoolfetch in them. Otherwise we can only rewrite 10s of history. * more tests for m-n-c internals. * start to turn Munin::Node::Service into a "proper" class, rather than a bunch of static methods. * Include the name of the database in the graph title for PostgreSQL wildcard graphs. * start to migrate munin-run to instance-based M::N::Service * update munin-node to use a M::N::Service instance. * add $Id$ keywords where missing. * allow # characters to be included in config files, as long as they're preceded by a backslash * avoid spamming the logfile with debug messages. * create a directory for storing spool files. * spoolfetch support for M::N::Server. * postfix_mailstats.in: $logfile was being redefined, causing problems during autoconf. thanks to Lupe Christoph for the patch. fixes #930. * Addition of munin-sched munin 1.4.4, r3276,3379, 2010-2-26 * Localization problem in 1.4.1 (closes #781) * Sort plugin configuration file order. This ensures some predictability regarding where a configuration setting comes from when multiple files specify the same configuration variables. For details, see debian bug http://bugs.debian.org/564098 * munin-cgi-graph*: cgi semaphore fix, hopefully cures #834 * Munin/Master/GraphOld.pm sum+colour fix (closes #731) plugin to connect to a separate munin-node (or other daemon speaking the munin-node protocol) and fetch values from there. * munin-update: Fix config line continuation hadling * Add patch from munin ticket #828, to suppress "occasional" unknown states to avoid alerts. Thanks to Steve Wilson for the patch! * proxy_plugin: New proxy plugin, that makes it possible for a single Munin * jmx/Uptime: decimal days, not integer - closes #815 * nvidia_: fix suggest * linux/vserver*: fix autoconf exit codes * linux/ip_: RE fix to be able to match IPv6 addresses * linux/selinux_avcstat: New plugin from Lars Strand showing selinux stats Taken from Muninexchange. Thanks to Lars! * linux/lpar_cpu: A plugin to measure IBM PPC hardware virtualization logical partition CPU usage (made for the platform once called OpenPower) * varnish_: backend_unhealthy is a DERIVE value, note that canonical upstream is the varnish project * Add simfs" to linux df* plugins ignore list * linux/buddyinfo multigraph plugin by Gábor Gombás * Remediate patches from Gentoo that never came upstream. Prevents possible output on stderr in plugin linux/iostat_ios and corrects linux/fw_forwarded_local to handle a missing /proc/net/ip_conntrack linux/fw_forwarded_local: need to dereference the _conntrack_file variable * linux/diskstats: Upstream update, closes #838 #835 #837 * linux/ip_: Better matching of IPv6 addresses. Use a single awk command instead of a mix of awk and grep. * mysql_: fix graph_base error (Closes #840) Patch from Gábor Gombás * mysql_: plugin suggests wrong values (closes #857) * linux/selinux_avcstat - exit 0 on autoconf * linux/tcp: Add contributed plugin from Tim Small * linux/df_abs: multiple filesystem excludes do not work in df_abs Thanks to Daniel Reichelt for the patch! * snort*: Add documentation and minor updates * multips_memory: correct printing out raw fieldname, instead of clean_fieldname, documentation updates * linux/df_abs: Added configuration option to df_abs to Enable/Disable the graph total (The default is on). Thanks to Daniel Reichelt for the patch, submitted at http://bugs.debian.org/567895 - adapted, tested and documented by Tom Feiner * snmp__if_multi: Add env.ifTypeOnly filtering, fix multiple buglets * mailman: Corrected incorrect use of $MUNIN_PLUGSTATE in mailman plugin * amavis: Change amavis mktempfile function to run with backticks instead of $(command) as it doesnt work correctly piping to sed * exim_mailstats: exim_mailstats doesnt count Completed properly. Thanks to Wakko Warner for noticing this in http://bugs.debian.org/569621 * Deprecated tomcat plugins: Fix in to work properly when only one connector is availabe http://bugs.debian.org/543523 * postfix_mailstats: Fix shell->perl syntax in perl plugin * apt: update description with a pointer to apt_all * jmx/GCCount - fix negative counts on jvm restart (closes #852) * ping_: fix obvious typo (closes #854) munin 1.4.3, r3232:3274, 2009-12-30 * linux/diskstats: New multigraph plugin to replace diskstat_ - more tidy and more efficient. Thanks to Michael Renner for the deveopment of this and porting to multigraph * linux/cpuspeed: Specify "average" for the speed, switch to printf to get numbers printed in full, E notation looses significant digits and there are whispers of a bug in the E notation handling in munin-update * Make munin-update --nofork not die when nodes are unavailable. Closes #800. * hddtemp_smartctl: Multiple enhancements: - document how to set type_ for sata drives - document need to run as a user with device access - Support some debugging - detect if smartctl fails - detect if no recognized temperature output is present * lpstat: Warn if the predefined $lpstat executable is not executable, Make lpstat path configurable and search for it in likely places if it's not set. Patch from Lupe - thanks! Closes #826. * dhcpd3: Only emit .max if the .max is valid. Document a bug from the trac - adresses but doe not close #829. Patches for a complete fix welcome. * More specific test for watermark feature (1.2.13 required) * Make 0755 default permissions for $DBDIR and make consistent in Makefile and munin-check * Fix issue where far too many mails would be sent by munin-limits (fixes #795) * munin_stats: Fix a typo in the "no"-message that made munin-node-configure reject it. * linux/yum: Enhance statefile error message. Update to use M::C::Defaults * linux/vserver_*: Add autoconfiguration (patch from #811 submitted by proppy, closes ticket). * munin-update: Make true check into defined check to avoid dereferencing undefs * Munin::Plugin: - Better documentation of new default state file name. - In need_multigraph, if run from a tty with "config" or no arguments advice to use munin-run and exit. * mailman: User contributed patch to make plugin work better the first time. Also replaced "exit $n" with "die" with good error messages. Untested but perl says syntax ok. * hddtemp_smartctl: Added chomp, as it won't work with a newline at the end. Thanks to Ingvar Hagelund for pointing this out * munin-update: Suppress warning "Error reading includedir directory" in case the includedir is empty (which is the case in new installations. This caused cron to send these messages all the time * Munin::Master::GraphOld: warn_min/warn_max typo fix munin 1.4.2, r3167:3231, 2009-12-16 * Munin::Plugin::Pgslq: Clean the fieldnames before returning them, so we don't generate invalid data with for example a dash in the database name. * jmx_: Add authentication support, fix exceptions in various memory related parts, refactor connection negotiation to one central connection class, add default connection info for jmx_, so we actually are a bit autoconfy * munin_update: Update to work correctly with 1.4, document and enhance a bit * munin_stats: Provide better graph_info and set some warning and critical levels at 4 minutes and 4m45s * Improove colors contrast in jmx plugins which have Max area, to make them more readable + fix some indentation * ntp_offset: make info into graph_info * Munin-(node|run): Make group name resolution lazy, enhance error messages and reinstate the group foo,(bar) syntax * munin-(node|run): Set umask to 0002 so that state files are group writable INSTALLERS: chmod g+w on the files in your state directory (/var/opt/munin/plugin-state in a default install) * multips_memory: New plugin graphing the sum of the memory usage of different processes matched by regular expression. * Perl modules should not have x bit set: Remove on *Old.pm * munin-update: Make I/O timeout fatal to terminate munin-update<->munin-node communication otherwise the two parties falls out of phase (or we need to introduce a RESET command or close and reopen node connection, but I don't want to do that, esp. not now). Handle the fallout of making it fatal. * linux/load and linux/cpu: Correct warning/critical documentation * postgres_querylength_: Fix query that can never have worked... * Switch fonts to DejaVuSans og DejaVuSansMono. Vera is now obsoleted by DejaVu in most contexts. INSTALLERS: On platforms with RRD 1.3 the fonts need not be removed and no paths need to be installed as long as the DejaVuSans font family is installed. * Reorder somewhat to get lines on top of areas * Patch from blueyed to make munin-*cgi-graph work * snmp__if_multi: Only set .max if the interface speed has been obtained * mysql_: always exit 0 on autoconf * dhcpd3: re-fix deprecated non-0 exit on autoconf * add freeradius plugins from Alan DeKok and adapt better for munin-trunk * linux/df_inode: Small pod correction and add debugfs to df_inode exclude list * linux/df: Added debugfs to df.in exclude list * Apache plugins: Exit with proper error of LWP::UserAgent not found. This can happen if someone configured the plugin manually, or if the plugin is installed when LWP::Useragent is installed and passes autoconf, but sometime later LWP::Useragent is removed. Without this patch the error message is confusing: Cant locate object method "new" via package "LWP::UserAgent" This also keeps autoconf output sane even if LWP::Useragent is not available * linux/ip_: Actually support ipv6. Munin does actually handle : in plugin names right * make rpm does not work and won't work. Remove makefile target and spec file. Might be added back later. * There are no new autoconfiguring plugins in this release. munin (1.4.1, r3116:3166, 2009-12-04) * munin-node: Introduce a select loop to read from plugin output/errors and avoid locking up * munin-node: Plugins that time out must not be added to service list * Looked into making sunos/memory use kstat but that's a hack of more than 30 minutes, so document dependence on top instead * hddtemp_smartctl: make it quiet on systems that lack smartctl * sunos/iostat plugin now works * linux/load: Correct documentation on how to set warning levels * sunos/load: Set more graph_ things, including graph_scale no to avoid "milliload" * Update exim_mailqueue plugin to use exiqgrep instead of exim, closing #780 * sunos/df*: Add handling of /cdrom and /media mount points (ignore them) * M::M::Utils: Remove the "*BUG*", it is wrong and worrisome * linux/df*: Reinstate the warning and critical levels. Document how to set them. * munin-graph: Correct ordering problem in command-line. AREA|LINE/STACK sequences must not be interrupted by HRULEs and such (broke graphing of old cpu plugins) * munin-graph: warning lines without range endpoint gets better detection. * linux/df: Reinstate the default filesystem filling limits. Document how to set them. * linux/if: * Munin::Plugin: Support default values for warning and critical levels. * munin-*cgi-graph: Untaint the whole hostname, not only the first occurance of something unholy * Munin-*cgi-graph: Let "." be legal in hostnames. * munin-graph: Recognize "max_graph_jobs" in the configuration instead of logging errors * Also add munin_cgi_graph_jobs to the legal keywords * make tar now produces munin-$VERSION instead of using underline between * linux/if_: This change prevents the linux if_ plugin, when run as non-root, from leaking stderr output from ethtool to the log. * postfix_mailstats: MUNIN_PLUGSTATE is an environment variable. Thanks to pkhamre for reporting this. * linux/fw_forwarded_local: check for readability with test rather than cat. * Fixes to Announce-1.4.0 munin (1.4.0, r3033:3115, 2009-11-27) * Give the docs a once-over and update ChangeLog * Update plugins.history * Mention Aleksey Studnev in jmx_ doc * Merge patch from debian bug http://bugs.debian.org/507069 where netstat plugin counts \"active connections rejected because of time stamp\" as active connections, because of a lax regex * amavis plugin: Minor pod fix * Add snmp__print_(pages|supplies) printer plugins * jmx_: nitpicks * Fix #739: Perl error message only appears when there are no plugins on any nodes, so check that and LOGCROAK in a helpful way * munin-update: Change LOGCROAK to WARN for munin includedir missing or empty * Munin-node-configure --snmp: modify host enumeration code so hostnames that are passed in aren't indiscriminately converted to IPs. only works with plain hostnames, not CIDR. * Remove Log::Log4perl TRACE level use since that requires a too new Log::Log4perl * Munin::Plugin::SNMP: Added support for env.timeout for SNMP sessions * Add and extend the UPGRADING doc * Remove reliance on the very newest Getopt::Long version, update docs accordingly. * linux/files_: fix slightly odd usage of awk. the warning and critical thresholds are static, so they can just be echoed along with the rest of the config. * Postgres plugins: Correct pod from Munin::Plugins::Pgsql => Munin::Plugin::Pgsql (singular plugin, instead of plural) * Munin::Plugin::Pgsql: Correct Pgsql.pm plugin configuration documentation section * Correct the generic crontab install command * Typo fixes in docs * Munin-node: Provide a different statefile for each master. Helps prevent plugins that rely on their state-file from reporting incorrect data when used on a plugin that is polled by multiple masters. It uses the master's IP address, so it won't work if they are both behind the same NAT gateway, for example. set_state_name() in Munin::Plugin is also modified to behave in a similar manner. Additionally exports $MUNIN_STATEFILE into each plugin' environment, so that all plugins can partake thereof. Should be useful to plugins written in languages other than Perl. * Update 1.4 documentation * Munin::Plugin: fix $Munin::Plugin::DEBUG. it wasn't being set (lexical variable $DEBUG was being set in its place). change from "use vars" to "our" for all the externally-accessible variables, to make it clearer what is going on. + fix indentation * munin-limits: Check if $children is undef before using it as a array reference. Fixes #762 * snmp__if_multi: Call "need_multigraph" function to avoid working under the wrong circumstances * dhcpd3 plugin: Critical and warning limits added. Some cleanup and minor fixes. * Munin::Plugin: straight port of the multigraph assertion sub from Plugin.sh. * netbsd/sensors_: according to , graph_vtitle has been superseded by graph_vlabel. * a few more tests for Munin::Common::Config. * linux/fw_(packets|conntrack): check for readability not existence bail properly if /proc/net/snmp cannot be opened. * Fix #758: Enhance and fix error propagation, fix exception handling, fix sub-process waiting/reaping, and finaly print old config data for failed nodes in a working way (probably worked before, but I broke it when I retooled how old_service_configs is read) * Munin::Master::ProcessManager: Correct the join command, which resulted in not printing the firewalled host - now it does :) * Returning iostst* to family auto, and moving diskstat_ to manual, until we have multigraph support added to diskstat leaving diskstat in auto without multigraph creates 3 graphs per disk, and on multi disk machines this makes the main html quite heavy * Uncomment includedir /etc/munin/munin-conf.d in munin.conf.in, and make sure Makefile creates the directory at install time * add some tests for Munin::Common::Config. * Munin::Common::Config: populate the valid keyword hash directly, rather than through an intermediate array. * linux/diskstat_: Remove fake_munin_plugin, as we know we include Munin::Plugin , no need to fake it :) * munin-node.conf: only specify setsid once in the config file * squid_traffic: hit_kbytes_out needs to be converted to bits, as with the other data series. fixes Munin ticket #761 and Debian bug 557385 . thanks to Samuel Leon for the patch. * Prepare announcement of 1.4.0 munin (1.4.0-beta, r2982:3032, 2009-11-21) * ejabberd_: Fix some documentation and other problems, move to generic plugin directory (not Linux specific software) * No .t files in the TAGS file! * munin-update: Make rrd files even if the DS label evaluates to false in perl (e.g., foo.label 0) * bind9: Parse query logs with view information. Closes #661 * linux/ip_: Avoid matching x.x.x.2 with x.x.x.24. Fix is "obviously" correct and has only been syntax checked * linux/ip_: Document that we won't support rule matching on the "any" firewall framework * linux/cps_ (LVS) plugin fixed by incurporating patch in #636. Not tested beyond a syntax/autoconf test * bind9_rndc: Parse BIND 9.6 stats output. * exim_mailqueue: Add documentation about user required to run plugin and modidy AWK script as the default action is to print the whole line, which was done... * Various fixees to various plugins * sunos/iostat: New plugin showhing I/O thruput on Solaris * exim_mailstats: count the number of received, rejected and completed emails using regexes rather than substr(). fix for ticket #698. also suppress stderr when fetching the log_file_path, remove some unnecessary code, improve error when the logfile is unreadable, and tidy up here and there. * dev_scripts/install: add install-plugins-prime to the targets run during a standard install. makes working on plugins rather easier, since a full, slow, salted-earth reinstall isn't required. * postfix_mailstats: remove processing of rotated logfiles, as decided in ticket #631. also includes a bit of tidying, and descriptive error messages when bailing rather than relying exclusively on exit status. i don't have a postfix server to hand, so this is not exactly well tested... * Plugin execution: remove undefined elements from the plugin command passed to exec. this fixes the underlying problem the yum plugin was encountering earlier. * linux/yum: change yum plugin so it ignores defined-but-empty arguments. makes fetch work again. * munin-graph: Re-introduce line continuation in the rrdtool graph command debug output * Make munin_graph immune to redundance in graph_order field * M::M::Config: Enhance a error message to include input line number * linux/fw_conntrack: Let there be a total.value even if the input is empty * linux/diskstat_: Document problem with multiple masters * overview template: Remove COMPARE links as we will not be able to make them correct in any reasonable timeframe. The datastructure we have now does not support that O:-) * munin.conf.pod: Removed the list of example required parameters configurations from munin.conf man page, as they are not required anymore, instead moved them to the explanation section for each parameter, showing the default * linux/iostat: Changed to manual, as they are replaced by the new diskstat_ plugin by Michael Renner * linux/threads: make a little less racy (and a tiny bit more efficient to boot). it's still not perfect, because even now there's a gap between the shell expanding the glob and grep getting round to reading the files, but at least it complains less. * log anything that plugins print to stderr. also sends a brief message back to the server explaining what went wrong. fix for ticket #582. * munin-graph: Stop trying to copy cdef when aliasing fields in graph_order -- 1.2 doesn't do that. * Changing munin.conf.pod, munin-cron.pod to munin.conf.pod.in munin-cron.pod.in. Adjusting Makefile accordingly. Closes #753 * munin-node: Do "next" on weird filenames not "return" so that we read all plugin config files * favicon for all templates. Refactored the finding of the root path and css name in the process. Added tests for get_root_path * modify how nested timeouts are handled, as discussed with janl. this fixes the bug whereby a connection to munin-node would be unexpectedly terminated if a plugin took more than 10 seconds to run, regardless of whether this was allowed by the plugin configuration. * Catch problems if someone forgot a "address " or "update no" - and make it plain in the error message. * Use_node_name should default to "no". Closes #757 * Clearify munin_set_var_loc error message so we know what value is set illegaly * munin-node: Improve error reporting during startup by sort of merging it with _run_service(). move the eval to the very top of the event loop so as to avoid interfering with the session timeout. * linux/fw_conntrack: Now works in 2.6, closes #532, thanks :-) * Added ejabberd contrib plugin, moved from debian patches munin (1.4.0-alpha2, r2899:2981, 2009-11-13) * set obsoleted tomcat_* plugins to family=manual * smart_ - fix autoconf yes and suggest empty * openvpn and misc ntp_* plugins: fix some nonzero autoconfs * mysql_: fix autoconf for missing Cache::Cache * zimbra_: fix autoconf when missing perl modules * Fix brokem munin-cgi-graph, which was : missing : --list-images param for munin-graph, a missing chomp($file), and a wrong path to the generated png. Also fix HTMLOld passing an array ref instead of an array * a bit more debug output for the node server -- note which node each plugin is associated with, and whether it requires multigraph. * report when plugins are being ignored due to errors when they were being configured. not very detailed, but better than nothing. also delete them from the list of plugins, so they're not included in the list. * Munin-node: fix logic in _suggested_links(): + never return any suggested links when the plugin shouldn't be installed. + correctly handle SNMP plugins whose only wildcard parameter is the host. (thanks to janl for spotting this was broken.) * Add proof of concept snort plugins * snmp__if_multi: Update to acutuall implementation of multigraph and some further testing and corrections * INSTALL: Update w.r.t. support for SNMP v3 * munin.conf: Correct "includedir" example * postfix_mailqueue: Fix autoconf for the negative case, pretty sure it still works for the positive case O:-) * Fix various autoconf problems with slapd and ifx plugins * mysql_* plugins: Now obsoleted by new mysql_ plugin. Set family=manual * Asterisk_* plugins: None of these support autoconf so remove magicmarker * HTML: Border on graphs in critical and warning state for nodeview. Comparison views (hopefully) to follow * M::M::Utils: End the pod section with =cut, so that the last line, # vim: syntax=perl ts=8 wont slip into the man page * M::M::ProcessManager: documentation typo fix * bind9_rndc: reinstate @@PERL@@ substitution marker, which broke in r2958 * Get the BIND logfile's size before rndc is run, rather than taking a guess at where it might have been. Fix for #746, thanks to guillomovitch for the patch. * Clean up a typo, add use strict, use warnings to all 3 apache_* plugins, add an info explanation for apache_accesses * HTML: munin-serviceview: add column header on 6th column in legend table * M::M::HTMLOld: removes underscore from top navigation element describing the plugin name for the service page emission. you know for the visual touch * HTML: added variable to set the text for the dropdown for each of the template emitting functions. * Refactoring templates into partials (with include) to avod a lot of duplication. There is some left. Better look on the legend table for service-biew and dropdown with 'other' links with config value. Default is 1 at the moment. Makefile adds install steps for new partial folder * M::M::UpdateWorker: Typo--; * linux/df_inode: vfat doesn't have any inodes either. * More documentation of plugins * Graphs: Fix cur: values for .stack and .sum. * Graphs: ADDNAN in expand_specials cdefs * Remove .label requirement on .stack fields. * Changed munin_stats to check for $Munin::Common::Defaults::MUNIN_LIBDIR/munin-update existance + executable in order to autoconf it as previously it checked for the existance of the munin master logs, which did not exist in a clean installation. Also added a check + extinfo message in case any of the log files are not readable * Fix copying of subhashes (#%#parent was broken in old version). Fixed various issues in a couple of programs. * M::M::ProcessManager: clarify what the numbers at the end of the log message mean. * M::P::SNMP: for some reason, Net::SNMP doesn't consider 'No Such Object' to be a real error. Handle better in get_single. * linux/ip_: Use env.hostname to replace ip-number in graph_title. * pm3users_ : we can do colour now * ipmi_sensor_ - fix autoconf for missing ipmitool * M::M::Config: Handle continued lines (ending in \) * M::M::GraphOld: Comment out utime call that interferes with rrd's --lazy option * M::M::Node: A missing .label isn't as fatal as all that. Insert a value and supply .extinfo to explain more * Make the linux/diskstat_ plugin work better w/o root access, document a bit better * Remove obsolete nagios specific munin-limits commands from crontabs all over. * M::M::Update: Load datafile relative to the configured dbdir, not the default dbdir * squeezebox_: Various enhancements * M::M::Node: More specific location of the missing label from the config output * M::M::LimitsOld: Forgot to actually make this into a exporter module. Thanks to Kevin Fenzi for pointing this out * mysql_ plugin: Update vlabels for concistency * Give the BIND plugins a graph_category as pointed out in email by Rado Rovny * Update mysql_ plugin from upstream * Get rid of munindoc.in from the installation (closes #742) * INSTALL: More modules, and a section on using CPAN-shell * Implement dropdown boxes for peers when there are more than "dropdownlimit" number of peers. Implemented for all views except overview, which is a special kind of, ehm, view. Also removes underscores from names for graph peers to clean them up a bit munin (1.4.0-alpha, r1560:2898, 2009-11-06) * squeezebox_: Changes to support several players * smart_: Exit 0 on autoconf as the doctor ordered * Make munin-graph recognize --help * Quite a bit of work on error messages and log messages * munin_stats plugin: Accept logdir setting from plugin-conf.d * processes and linux/proc_pri plugins: Add vlabel * Handle domain_order as group_order. * Sort peers properly (fixes #577) * Fix handling of group_order and node_order (partial fix for #579) * Munin-update: soften up the protocol error handling a bit * Make munin-html tolerate --nofork - even if it has no effect. Document. * mysql_ plugin: Fix "suggest" bug * Add multigraph_tester plugin to test (and show off) multigraph features * Add extinfo_tester plugin for developer aid * Make use_node_name work again (fixes #739) * One single instance of "includedir" in munin.conf is now obeyed to implement a "drop directory" for munin-master configuration. Example in munin.conf * Add python-plugin OO framework as python-plugin * Make M::M::Logger a bit more subtle about warnings when the logs are not open (so that they appear somewhere instead of nowhere) * Update plugin configuration for varnish_ * Make notifications work again * munin.conf: Set HTML and CGI dir consistently * Added new mysql_ by Kjell-Magne Řierud plugin, document origin, and sentence the others to exile (family=contrib) * Fix "make/make install" problems, document the other * Change framing a bit to allow coloured frames (once the templates are updated) * Add multigraph support to all programs in the munin-suite * mysql_innodb plugin: The "new way" of detecting InnoDB free space was changed in 5.1.24, add a case to compare correctly. * linux/bonding_err_: it's a counter not a gauge * Perltidy quite a bit * Retire fieldname.warn and fieldname.crit. The documentation has been saying .warning and .critical for a number of years. Mass fix plugins accordingly. * Service view: Add hopefuly helpful explanatory text about warn/crit/unknown states in the graph-info field. * Get the HTML templates and CSS validating. * Updated templates and CSS with stylish new elements, fonts and such. Thanks to Knut Haugen. * Switch to Log4perl on the master side. Node still has to use old logging to avoid node-installation-dependency-hell. * Ever more corrections to INSTALL * Basic modularisation of munin-limits * Move favicon.ico to templates, some of us need the HTMLDIR to be fully re-generatable from the templates directory (in order to be FHS complaint) * Commented some templates to make them easier to read and understand * munin.conf: include cgiurl_graph example * memcached_: New wildcard plugin * Refactoring of munin-update, munin-node and munin-node-configure by Kjell-Mangne Řierud and Matthew Boyle. Actuall tests for testing the programs were added too! * templates: * html templates: The timestamp can't really be ISO8601 with the support of portable strftime % formats so remove the T, and cover the eventuallity that strftime does not support %z * Make templates @@ free - less processing - change Makefile and M::M::HTMLOld accordingly * Put INFO and DEBUG statements into the locking code to make it debugable * Fix bashisms in nutups_.in : function is useless * Introduced some actuall debugging output to munin-html * Cleaned up logging in munin-html and M::M::Utils * munin-master: make getopt::long dependency explicit at build-time * linux/df*: Ubuntu Karmic uses "none" as device a lot, so handle that * HACKING.pod: Revert "Note to do 'make build' before trying the install script." * testplugin: Testplugin for various failure modes - developer support * Node.pm: Sanitise plugin names * Node.pm: Fix the fieldname sanitiser a bit * Node.pm: Better error message for empty plugin list (links to wiki) * If ntp_offset can read no values from ntpq, replace values with 'U' to avoid master confusion. * New plugin for Squeezebox Duo: squeezebox_ * Add plugin for connected PostgreSQL users. * Cosmetic changes in munin-cron script to make it more failure obvious and and clearify the ordering * Minimal modularization of munin-html, munin-graph and munin-limits - now half suited to include in munin-fastcgi-graph if we want to * Turns out that the // (and //=) operator is new to perl so remove all use * Add plugin for PostgreSQL tuple access count * Add plugin for Slony (PostgreSQL replication) node lag time * Add plugins for PostgreSQL scans (squential vs index) * Support connecting to non-default database in pg plugins * Support multiple parameters to pg plugins, using colon to separate them. * Document max_graph_jobs and max_cgi_graph_jobs (see also the wiki). * Made munin-graph paralell (defaulting to 6 forked processes). Adapted from 1.2 patch by Kjetil Homme. Many many thanks! * check whether javac works before using it, skip java plugins if not * pgsql: Properly apply filters to config query as well for wildcard plugins, so we don't generate lots of nan fields in the graphs. * munin-html: Do not try to calculate png size, use geometry of the file in the filesystem instead. This will cause a propagation delay - image sizes _may_ be wrong, until munin-html runs again. * munin-graph: set m/a time of png to last modification time of the corresponding rrd file (since reverted) * Adapt patch in #3 to current munin-cgi-graph for non-fastcgi. Closes #3. Thanks to blueyed * Adapt patch in #3 to current munin-cgi-graph to obtain munin-fastcgi-graph * Install munin-fastcgi-graph * munin-update and family: Do not accpet hostnames outside [^-A-Za-z0-9]. Issue helpful error message if someone bumps into this. * Munin-node-configure: always do "exit 0" even when saying "no" because it _is_ a normal exit and we do read the stdout. Mass fix of plugins in trunk. * linux/cpuspeed: Documentation fixes and slight error-message enhancements * Changed the Max memory for the jmx_ plugins to default to a light color (just like apache_processes free slots graph) as currently Max got a dark blue color, making it hard to read graphs * Compile the java files with -target 1.5 and -source 1.5 so they will work correctly on sun-java-1.5 and on (without this, when compiled using openjdk/sun-1.6-jdk, they refuse to run on 1.5 jre * New vserver plugins adapted from Debian * New asterisk plugins adapted from Debian * ipmi_sensor_: Applied patch from http://bugs.debian.org/490093 so that the graph scale always starts from zero * Add ipmi_sensor_ wildcard plugin from Debian branch, and POD it * Massive PODing of plugins for use with munindoc by Stig Sandbeck Mathisen Many thanks! * New plugin: openvpn.in from debian, and POD it gently * Added the ability to customize the install location for the jmx java library. As most distributions wont want it in the default munin libdir * munin-node-configure needs pass the list of plugin names through to apply_wildcards() too. part of #718. thanks to knan for the report. * Munin-node: Clean up man-pages, and try and standardise common information across all three applications. * Report errors against plugins with inconsistent/unexpected magic markers. * Java plugins written by FIX. Adapted for inclusion in munin by Erik Bolsř, Tom Feiner and Ilya Kikoin. THANKS! * Applied patch by Katriel Traum for snmp__memory that converts the plugin to use Munin::Plugin::SNMP, and does some clean-ups * New plugin: nomadix_users_. Monitors a kind of enterprise wifi infrastructure. * snmp__if_multi: Updated with some known bugs/enhancement needs as well as better author/copyright info * linux/ip_: Better support for IPv6. Patch by Rune Skillingstad, thanks! Closes #563. * linux/if_* plugins: Even more virtual lan support. Patch by Rune Skillingstad. Thanks. Closes #562. * amavis: Fix use of $MUNIN_MKTEMP as pr. #502. Should probably provide a working function in plugin.sh or a better MUNIN_MKTEMP * apache_* plugins: Better error messages for diffetent kinds of LWP errors (for example missing Crypt::SSLeay). Patch by Tom Feiner, thanks! Closes Debian #542477 and Munin #710 * ntp_ plugin: Provide error-message in english if plugin invoked without recognized hostname in symlink * hddtemp_smartctl: Use --nocheck=standby if supported by smartctl. Thanks for patch from marxarelli. Closes #715 * note bug in amavis plugin in doc * linux/port_: Fix to allow more than 9999 connections. Patch from Olav Kolbu, thanks! Closes #583 * sendmail_mqilqueue: Correct queue count on sendmail with HOST_STATUS/hoststat enabled. Thanks to andy for this. Closes #630 * exim_mailqueue plugin now supports showing frozen messages and uses prettier colours. Thanks to micha for the patch that was adapted! Closes #107. * munin-node-configure: Some re-wording of the manual page, and remove some obsolete dependencies on the --shell option. * Port munin_stats plugin to use the logtail functionality from Munin::Plugin. Fixes #527. Thanks to janl for indirectly reminding me that I'd never got round to committing this :-) * postfix_mailqueue: use postconf to find default spool path. Update documentation and correct author (to "unknown"). * Munin-node-configure: document M::N::SNMPConfig properly. * zimbra_: fix lucene_cachehit race condition with zmstat writer * Add new fail2ban plugin * munin-check: Updated copyright to Matthias Schmitz * Linux: ip_conntrack_max at new location in newer kernels. * Add zimbra_ (groupware) plugin * Added linux/diskstat_ plugin, from Michael Renner http://blogs.amd.co.at/robe/2008/12/graphing-linux-disk-io-statistics-with-munin.html * Added logging for denied connection in munin-node. Closes #714 * linux/sensros_: Fix error when no sensors execuatble is installed. Merge from http://bugs.debian.org/491473 * Merge fix for apc_nis.in from http://bugs.debian.org/511781 - The config output by the apc_nis plugin includes: line_volt.max 200 Where the normal mains voltage is higher (most of the world), this has the effect of excluding the quantity from the generated graphs. The value should be increased to at least 300. * tomcat_: all new plugin from laxis@magex.hu, deprecate tomcat_* * linux/iostat: Added stdout/stderr redirection, merge from debian bug http://bugs.debian.org/512407 * allow for : in plugin names to support IPv6, Merge from debian bug http://bugs.debian.org/499391 * Fixed typo in Munin::Plugin documentation, merged from debian bug: http://bugs.debian.org/495003 * linux/if_*: Added support for msh interfaces * linux: Changed df.in and df_inode.in to have nagios compatible graph title, nagios doesnt like special chars in graph titles. (The same patch from debian bug http://bugs.debian.org/472239) * add minimal ruby infrastructure * Added NetApp plugins from Guillaume Blairon * Add mysql_innodb plugin * Fix (now old) tomcat plugins * freebsd/df*, include nullfs in filesystem list. Patch from Cezary Morga. * linux/if_*: Fix vlan support * Make boolean parsing a bit more robust (case insensitive) * Fix cap protocol on server and node * - is also allowed in host names * Remove datafield length limit of 19 characters (the understanding of this limit was based on obsolete documentation) * Document Munin::Master::Logger better * Make Munin::Master::Utils capable of logging * Make the pg plugins work properly when DBD::Pg is not present (by saying they can't work). * Add slapd_* (OpenLDAP) plugins by Bjřrn Ruberg * Add PGSQL plugin framework by Magnus Hagander, and some plugins * linux/iostat_ios: check if $ARGV[0] is defined to avoid "use of uninitialized value" warnings. Thanks for the report to nicklock! (Ticket #640) * postfix_mailstats: Don't fall back to a logfile we have already determined not to exist. Thanks to Ulrik Haugen (Deb:#532876)! * freebsd/netstat: Match reset$ instead of reset. Closes #708 with regards to trunk. * Add "make tags" target to make navigation easier. * linux/port_: Fix #500 better as suggested by Kolbu. Thanks! * linux/if_*: Recognize venet|veth interfaces in suggest code. Thanks to "blueyed" for patch! Closes #591 * Patch to allow master side overrides to work much better. Thanks for patch from "mg"! Closes #588 * plugins/hddtemp_smartctl: Apply autoconf patch from "qha" that only autoconfigures the plugin if the first drive is autodetectable - or configured. Thanks! * linux/cpuspeed: reversed Hz and % in one case, exclude "cpuidle", only graph cpu[0-9]* * Documentation: mod_expiry => mod_expires * linux/cpu: As per a mailing list thread, change Linux cpu plugin to not set max for any fields because recent kernels are inaccurate to the point where a single field can edge just slightly over the calculated max if it is using all of the processor time (for example, the idle state can trigger this). Without removing the max, the affected fields have gaps, creating confusing graphs. * Fix some brainos in apc_envunit_ plugin, make it more like autoconf'igurable * Fix sunos/df* plugins quite a bit * plugin.sh: Document print_warning better * Add a generic crontab for the munin user * Fixed longstanding bug in munin-node-configure which reversed list of installed and new wildcard names for wildcard plugins - this has made auto-reconfiguration of whildcard plugins impossible, and downright dangerous if you used the --remove-also option * Fix sunos if_ and if_err_ to suggest correct interface names * Rename sunos if_errcoll_ to if_err_ to get in line with the other architectures * The "setseid" keyword in munin-node.conf should be spelled "setsid" in order to be understood by Net::Server. Since log_file is also set, setsid is redundant, but it is now correctly redundant instead of just ignored as garbage :) * Update allow/deny examples in munin-node.conf.in. Net::Server can use CIDR if Net::CIDR is installed. Keep "allow" as default, so as not to need additional dependencies on the default install. * linux/df: make tmpfs'es indexed by mountpoint rather than device. * Do "list $node" rather than "list $fetchdomain" when collecting node data. (closes #699). * Make ./getversion work on Solaris 10 and other systems with old-style /bin/sh (closes #700) * Remove special_(sum|stack) from allowed keywords list * Make graph_args --title "Foo bar" work as expected (closes #683) * Remove depreciated options special_stack and special_sum (replaced by stack and sum ages ago) * Make "make install" behave slightly better and document problem with NFS * Add varnish_ plugin. Canonical version is to be found in varnish_ repo at all times. * Detect rejects from postfix/cleanup, and not just rejects from postfix/smtpd Thanks to Cedric Knight for patch. * sendmail_*: Suppress error output from which(1) when the mailstats binary is missing. * Add missing documentation and config file option (see #567). * munindoc has been left out after r2126, which is wrong. * Fix bashisms in several plugins thanks to Raphael Geissert for the bug and the patch. (Closes Debian bug #530147) * Various if_ plugins: fix typo found by Peter Schwindt, Debian #523765 * synced redhat specfile to upstream so make rpm works again * Updated redhat's Makefile.config to be in sync with dist * ISO8859-1 specific (C) symbol removed * Corrected typo that left out man page for munin-update. * Fixed regression where MUNIN_* variables would not be exported * smart_: Fix brainfart wrt PLUGSTATE vs. STATEDIR and nico's email address * New version of smart_ plugin * Moved perl build functionality to Module::Build. * Sanitise fieldnames * Added the no-fixes test. Fixed failing test * Fixed Perl::Critic issues * More robust and consistent use of boolean configuration options * Removed deprecated configuration option: use_default_name * Removed unused cli option from docs * Unshift DEFs instead of pushing to fix a CDEF argument-ordering issue * Fix scope-issue+typo with $STATS * Use /opt as default target and move Makefile.config-dist to Makefile.config * Make [plugin] user-name evaluation lazy so that configuration for unused plugins will not cause error messages. * Added capability negotiation to munin-update * Added tls README * Add a general man page hub for munin as requested in bugs.debian.org/517952 * Add -w to munin-limits and fix warnings * Moved plugins to a separate folder * Moved docs into doc/ * Add env.upsname and env.upsc settings to the nut_* node plugins * Added python oo plugin class by Morten Siebuhr as a contribution * nvidia_ plugin: Adapt some more to mainline plugin niceties * Applied patch from #669. Make munin-run use Munin::Node::Defaults. Thanks to Matthew Boyle for the patch * Fixed getversion to handle git-svn usage * linux/quota_usage: Use clean_fieldname as needed. Bug discovered by ert256 Closes #645. * linux/sensors: Recognize negative temperatures. Fix by cnu. Thanks! Closes #647 * http_loadtime uses pipes and mktemp. Patch by ekohl. Thanks! * hddtemp_smartctl: Only check if device is standby for sd? and hd? devices (it fails on raid devices). Patch by anonymous trac user. Thanks! * munin-graph: warn -> warning in two places - that will make graphs more usefull - we hope - as noted by stevew@purdue.edu * Fix warn lines where warn is given as range (foo:bar). Patch by stevew@purdue.edu. Thanks! * Fix get_[gu]id to correctly recognize numbers and strings. Patch by ligne. Thanks! * Ignore Emacs and Joe temporary files * Protect graph rendering by semaphore too - as suggested by Snide in a patch. Closes #657. * More typo fixes from linge. Closes #659, #658. Thanks! * Apply patch from #660, fix typos in error messages in munin-node. Many thanks to ligne * postfix_mailstats: More explicit error messages. Patch by kuriyama. Thanks! * munin-cgi-graph: Check returnvalue of sem* functions in the correct manner * apache_processes: Graph free process slots, and provide explicit colours to make it prettier. Patch by TTimo - thanks a lot! * linux/df_abs: need bash to compute correctly * Fix #619 - error in comment * Move munin-node-configure-snmp to @@LIBDIR@@ - it should not be called directly * Align snmp__if_ and snmp__if_err_ and remove filter on what kinds of interfaces they catch. * snmp__if_multi: Structure the multigraph namespace somewhat and add some helpfull comments for the future programmer. * snmp__if_multi: A first multigraph plugin - now we just have to make munin understand it... * Port snmp__if_err_ to Munin::Plugin::SNMP - it still needs aligning with snmp__if_ so that interface names will match and so on. * Port snmp__swap to Munin::Plugin::SNMP - also change base to 1024 as this is memory which is accounted for in powers of 2 * Port snmp__winload to Munin::Plugin::SNMP * Transplant get_by_regex to Munin::Plugin::SNMP and change snmp__netstat to match * Port snmp__netstat to Munin::Plugin::SNMP * node.d/smart_ documentation contributed by Gabriele Pohl. Thanks! * Extend SNMP plugin documentation with a "MIB INFORMATION" header. * Start a separate program to test Munin::Plugin functions * snmp__if_ plugin can now use 64 bit byte counters if they are available. Added extensive texts in documentation and graph_info about the problems with 32 bit counters and made it explicit if 64 bit counters are available. * Add option --pidebug for plugin debugging to munin-run and munin-node. Exports setting through the environment variable MUNIN_DEBUG. Also introduce these in the usage texts. Far from all plugins support this setting. * Make Munin::Plugin::scaleNumber and use it in snmp__if_ plugin * Port snmp__if_ to Munin::Plugin::SNMP, document, and refine * Fix a typo in Munin::Plugin::SNMP - now verified with authenticated SNMPv3 * Extend Munin::Plugin::SNMP to support SNMP v3 * Install Munin::Plugin::SNMP, a general generic interface for taking away the boring bits in SNMP plugins. Many thanks for Ilmari for his work on this module. * Port snmp__uptime to use Munin::Plugin::SNMP and document it nicely. * Do not kluge lines with rrd 1.3 - the lines in 1.3 are nice and precise * Apply RRD 1.3 patch from 1.2 series - Many thanks to matthias! * Start using Log::Log4perl * Add test-case plugins in conjunction with munin-gather work (note: munin-gather is not completed and is semi abandoned at the time of 1.4.0 release) * dhcp3 plugin: Document and credit to Rune N. Skillingstad * Remove --force-root. It's silly and causes naught but problems. Added text in the root error message about how to su to munin. * Add a script to compute n'th percentile. Needs some munin-update extentions to work. * munin_get_loc: Fix premature exit - patch by Joe Damato * This may fix the double legend headers bug * Clearify the autoconf "no" from linux/swap * Remove max field from samba config - patch by Kozik * linux/iostat: Introduce environment variable SHOW_NUMBERED to show sda in environments where this is wanted * Update postfix_mailqueue plugin to pull warning/critical values from the environment. * linux/iostat_ios reformed to use seconds (avoiding milli-milli-seconds), added graph_info and munin-doc documentation * Introduce SSPOOLDIR for munin-gather's use * Slightly update docs of apache plugins * Add haproxy_ plugin contributed by Jimmy Olsen * Add found nginx plugins - after some cosmetic work * Fixup debug output in munin-limits (Brian De Wolf) * Add pipe and pipe_command in keyword list in Munin.pm (Brian De Wolf) * Fill message structure in munin-limits correctly (Brian De Wolf) * Enhanced DEBUG consistency in munin-graph (Patch by Brian De Wolf, thanks) * freebsd/netstat: Correct absolute path to netstat program * freebsd/memory and vmstat: hardcode absolute paths for awk, bc, netstat, ps and vmstat * Lets munin-run print out its usage if its called without a plugin parameter. This avoids a lot of "Use of uninitialized value $ARGV[0] in regexp compilation at /usr/sbin/munin-run line .." messages and closes Debian #416478 * linux/df: let make insert the right configuration directory in the documentation * Make fix for OS X 10.5 by George Barnett - thanks * Received hpux df plugins with munindoc - thanks again * hp-ux: Added df plugins based on the bdf command - contributed by Chris Gardner * linux/iostat_ios: Bugfix by Philipp Niemann to get it working. Thanks! * Node/plugin.sh: Patch by Philipp Niemann to limit field names to 19 characters (removed as of release of 1.4 as munin actually handles this) * Munin-html: Patch to relative path calculation for graph borrowing by Phillip Niemann. * Makefile: Correctly locate magic markers - patch by Philipp Niemann * Munin-html: Added borrowing of whole groups, through group_order. * Plugin.pm/Plugin.sh: Fix up the thresholds functions * munin-check: ignore lost+found directories * Added new option "group_order" to order groups/graphs at any level. * sh-mode, not shell-mode for plugin.sh.in * Update FSF address in copyright notices * Added plugin to graph haproxy backend usage. * Munin::Plugin support for max value settings, patch by Brian De Wolf. Thanks a lot! * munin-check: Replace "munin" by "@@USER@@", patch from Pedro Melo, thanks * freebsd/systat, new plugin showing interrupts and context switches * freebsd/iostat: New plugin * node.d/dhcpd3: Parse "include" statements, patch by Walter Huf * smart_: Update Nico Stranskys email address * SuSE cron.d/munin mentioned munin-nagios, a obsoleted part of munin. * Clearify the purpose of DESTDIR * plugin qmail-qstat now uses a single pipe to generate all output * new plugin: qmailqstat contributed by Nils Breunese * Add an eval to $DF to expand the string to arguments. * And a changelog for 1.3.4 too * Update RELEASE and plugins.history for 1.3.4 munin (1.3.4, r1277:1560, 8/3/2008) * New acpi thermal_zone plugin * Bugfix linux/if_ plugin (--path=>-p, quoting, ethtool output tolerance) * linux/cpuspeed: $(< ) isn't in POSIX it seems * linux/cpu: "steal" is yet another value in /proc/stat on newer kernels. * We must have a cron job for munin-limits * Added detection of setr* at build time. The OSes without these functions will work anyway (AIX, Darwin) * Added some darwin(osx) plugins. * Better handling of # in plugins and munin.conf (it can now be escaped). Solves #38. * Fix bug in node.d/ntp_ where jitter is plotted with the wrong values. Fixes #520. * Munin.pm: Bugfix in an error message, as well as added low-level reason for dieing. Solves #468. Detaint pid before kill(). Fixes #508. * munin-limits: Added support for "unknown" Resloves #29, #43. * munin-update: Fixed timeout bug (timeout not working where intended). Closes #168. * freebsd/if_: Disable DNS lookups which are not used (fixes #509) * Documentation clearification as requested in #462 * List requirements at start of install document * full SSL support (#490, #489, #8). Many thanks to Brian De. Wolf for this patch! * As pr #510 make df plugins sensitive to warning and critical environment variables. Also Solaris plugins issued ".warn" which is just wrong. Two plugins used awk in the inner loop, these were not fixed. * munin-node.conf: Add documentation of host directive * linux/ip_: Fix #439, support ipv6 in linux (not tested, I have no IPv6) * postfix_mailvolume: Fix #473 - config did too much work * linux/netstat: Address #493 - SuSE feature regarding special class of rejections based on timestamps. We do not count them, but will no longer be confused by them. * snmp__cpuload: Fix #506, what to do when no load value is returned? * ping_: If invoked as ping6_ uses ping6 for pinging * surfboard: Fixes and typos. * linux/port_: Fix #500, report zero open ports as 0 not blank * Integrate a load of snmp_ plugins from Lars Strand * snmp__if_: Fix #453, snmp__if_ now supports SNMPv3 and heavy authentication. Also always use $name to name the interface. * hddtemp_smartctl: now works with recent kernels and 3ware controllers * apt_all: apt_all lacked some graph metadata, fixes #478 * ircu: more robust and more useful (fixes #517, thanks to Zhenech) * Clearify apache-cgi foo * linux/irqstats: Fix unitialized message (#497) * munin-cgi-graph: Path error in unlocking (#507), - SysV semaphore locking, thanks to Fox for patch (closes #499) * loggrep: Support foreign hostnames * INSTALL: Fix filename typo in INSTALL (closes #513) * Add postgresql plugins from #63, muninexchange and openproject.hu - make the support for servernames, port and so on uniform * ntp plugins: Make ntp_ plugin manual, it is no longer recommended, the new ntp_offset is - Interprete magical ip-numbers used by ntpd for local clocks - stops spurious DNS lookups of these (closes #150) * It appears that some versions of Net::SSLeay needs a "" in print_errs("") calls (closes #154) * Add munin_stats plugin written by Rodolphe Quiedeville - and patch to munin-limits to provide timing information by same. Closes #485. Problem: plugin can take more than 10 seconds to run with long log files, needs to use log-tail and a state file * Make netstat plugins --logarithmic, and autoconfigure * Make iostat* plugins autoconfigure * Make netstat from darwin generic and elliminate identical plugins from other BSD OSes * Add postgres_commits_ and postgres_queries_ contributed by Moses Moore based on work done by Vajtsz and others * exim_mailstats did not have human readable error messages, it tried signaling by coded exit statuses * ntp_*: Implement option to supress showing delay graph (suggested by Hĺvard Eidnes, fixes #350) * Generic processes plugin submitted by Lars Stand. Thanks!! (#441) * Fix typo in munin-limits (oks -> ok) closes debian #387283 * Enhanced doc of cgi mode in munin.conf - closes debian #307963 * linux/interrupts: Replace sed|egrep|awk pipeline with a single awk script * linux/cpuspeed: Report the average frequency, Use the default line style. * hddtemp_smartctl: Fixes to avoid disk-spin-up (fixes 137) * linux/interrupts: Remove & to fix a new pango problem ("&" is illegal entity). Fixes #537 * linux/nfsd4: Add nfs4 server plugin * Postgres plugins: Make graph_category consistent (fixes #534) * linux/ip_: ip_ plugin: add support for alternate chain names * munin_graph: Set category to manual, munin_stats superseeds them * Postgres plugins enhanced by Tim Retout - thanks (closes #541) (Use standard pgsql env variables for DB connection - fixes #544) * colour_tester: Plugin to experiment with the colour palette * hddtemp_smartctl: Insert comment about SCSI vs. SATA on hddtemp plugin * Multiple documentation updates from Brian de. Wolf * Debian packaging: Set correct log file for the postfix_mailvolume plugin (Debian bug #461302) * linux/df: Update list of file systems we don't want to graph. (Debian bug #385291) * munin-cron: Filter "attempt to put segment in horiz list twice" better, closes #538 * munin-update: Negative magnitude broken in scientific format interpretation (thanks Matthias) * New functions in Munin::Plugin (state retention, tail functions) * Some preparations for same in plugin.sh * munin-limits: Remove unused code for opening the wrong log file. closes #553 and debian #385358 * munin-limits: Fix redirect handling. Fixes #552 and debian #385358 * Quoting fixes in postgres plugins - fixes #546 - thanks to diocles * snmp__if*: Probe switches for interface alias and use it if one is assigned - fixes #551 - thanks to bart for patch * hp-ux: Start of HP-UX plugins from Raph Grothe * Fix perl warning relating to strangely empty environment value * HP-UX munin-node init.d script and rc.config.d file by Ralph Grothe * munin-node: Added a newline on TLS logging * Added tls_ca_certificate to @legal * squid_objectsize: New plugin to show mean object size in Squid. Useful for tuning the caching size. Thanks to Bjřrn * Munin-master programs: Remove locks as we're done with them. Removes ambiguity around left over lock files. * Introducing the munindoc command and example documentation * Munin::Plugin - fix doc and testcase, test better * irqstats: Now work with 2.6.24 kernels (fixes debian #463721), also make "MIS" and "ERR" interrupts be reported on SMP systems * Sensors plugin for nvidia graphics cards * munin_stats: Slight change to remove this error: "Useless use of a constant in void context at /etc/munin/plugins/munin_stats line 35." * munin-graph: Add "Munin $VERSION" watermark to graphs - everyone uses munin but not everyone knows * Munin.pm: Fixed locking bug, lock was not created, and previously there was no error message * Introduced "palette" keyword for configuration along with the named palettes "old" and "default". The names should be self descriptive * Munin-master programs Stronger warnings about about running as root. Standardized across all server components * Copyright on main programs now extended to 2008. * Add Informix plugin for concurrent session counting contributed by Ralph Grothe * Introduce apache configuration to control html and graph expiry. Document in INSTALL, and remove old example now obsoleted by doc * Fix graph expiery in munin-cgi-graph as well * Munin-graph: Hum, that expiery thing has been fixed quite often. Go with the one I liked the best * freebsd/if_*: FreeBSD if_ and if_errcoll_ from downstream maintainer. Removes more interfaces * hddtemp_smartctl: Recognize ATA disks on FreeBSD (patch from downstream) * New FreeBSD plugin: coretemp, graphs Intel Core (and newer) temperature measured by MSR * Munin-update: Disable tls by default - fixes #452 * munindoc'ify apache plugins, document how to do basic authentication * freebsd/dev_cpu_: Add freebsd plugin for cpu-temp and speed (requires Core Duo or newer CPUs) * Document users plugin a bit * linux/sensors: Fix regexp, there may be _no_ space after : * Plugin.pm: Remove comma from quoted word list * munin-check: add the script munin-check for checking permissions of the munin-dirs - Thanks Matthias! * Implement multilevel-groups. * Enabled plugins to send values on the form : (enabeling backdating of data) * Rename munin_set_var -> munin_set for consistency purposes. * Fetch services directly after config, to make use of OS caches. * Bugfix: .graph was ignored in some cases in munin-html, ending in trying to show nonexistent graphs. * postfix_mailvolume: multiple fixes for problems found in sibling exim_mailstats plugin: - Use english to communicate errors (not exit statuses) - Discontinue use of rotated log files to elliminate associated bugs - Give reasons for not autoconfiguring plugin * munin-limits: Open log on demand. * Munin.pm Fix false red/yellow markers in html output. * Munin::Plugin: Security fix, do not open symlinks for writing * postfix_mailvolume: Fix bug introduced in previous cleanup to stop startup spike. * munin_graph: Changed munin_graph plugin to graph total time used by munin-graph, since we don't draw graphs grouped by domain anymore. * Correct graph_category on some plugins * style.css: Fixes too wide link issue. * Add getversion command to add SVN revision to unversioned svn checkouts * Remove redundant munin_graph plugin - see munin_stats * linux/if_ plugin: Clearify the 32 bit issue with fast interfaces * linux/irqstats plugin: Incorporate magic markers in pod * node.d/multips plugin: Document, use clean_fieldname to remove bugs, add usefull .info information about processes watched. * Various fixes to amavis plugin * Fix wrong chmod for plugin-state directory munin (1.3.3, r910-r1236) It's very likely that the entries for 1.3.3 contain some duplicates. In part because it's been going on for more than a year, in part because a large part has been constructed from the svn commit log. * linux/cpuspeed: Report the average frequency. * linux/interrupts: replace sed|egrep|awk pipeline with a single awk script. * Linux plugins: Use @@GOODSH@@ (posix-shell) there too * linux/vlan: Better autoconf messages * Solaris plugins: bring them @@GOODSH@@ and some elementary civilization * sunos memory: Make autoconf'able * Bring the goodness og @@GOODSH@@ to the generic plugins * node.d/df and df_inode plugins: Rewrite like the last 20 years of shell enhancments happened * munin monitoring plugins: Make them auto-installing * ntp_ and ntp_states plugins: Insert graph_category, make them "auto" and invent category "time" as well * ntp_kernel_* plugins: Not ntpdc's were created equal, autodetect better * munin-cgi-graph: Patch to limit number of concurrent rrdgraph processes * munin-html: Do not generate height/width attributes when in cgi mode * munin-html: Log runtime - like with munin-graph etc. * users plugin: Make vehicle for *STACK draw types * munin-graph: Support draw types AREASTACK and LINESTACK which is not sensitive to order like LINE/STACK and AREA/STACK * INSTALL: Document what to do first when working with a svn checkout * munin-graph: Simplify colour processing * Makefile: Remove build before rebuilding it * users plugin: Further fixing. Make testbed for field.colour and graph_printf * munin-graph/Munin.pm: Support graph_printf * users plugin: Move to platform independent directory * users plugin: change familiy to auto, make generic * linux/memory: Further adjustments w.r.t. correct handling of vmalloc_used * Fix typo "contigious" * munin-node-simple: Fix @@ variable typos * SunOS df plugins: use @@GOODSH@@ * Define GOODSH and BASH in Makefile.config to be used by shell plugins * exim_* plugins: Problems with "which exim" on Solaris corrected * Put "host" thing in munin-node.conf template config * munin-node docs: Mention two most importand Net::Server config options. * Linux df* plugins: Configurable filesystem-type exclution. cds by defaut * plugin.sh: Utility functions for shell plugins * Munin::Plugin: Utility functions for perl plugins * Sample plugins: Convert to use plugin.sh and Munin::Plugin * Makefile: Install utility files * Munin-run/node: Put most @@ config params from install time into plugin environment. This means that plugins can access @@PLUGSTATE@@ as $MUNIN_PLUGSTATE, and so on. * df* plugins on all architectures: Make fieldnames comply to charset restrictions * Makefile: Install platform-specific plugins after generic plugins so that the former override the latter ones * Munin-graph: Installed kluge for rrd 1.2 to make lines narrower to compensate for crayon-effect. * Munin-update: Add code to interpret Scientific notation (3E-20) for RRD so plugins don't have to * Bring SunOS df plugin names into line with other platforms * Make SunOS df plugins auto/autoconf * Linux/memory plugin: Remove warning on overcommit * Partial audit of correct magicmarkers in generic and linux plugins * Multiple plugins: Correct autoconf/suggest action slightly * lpstat: New plugin for print queue depths * Munin-node-configure: Make more robust, make it present plugin errors and exit with error if there are any. Write testcases and node-monkeywrench target in Makefile to test the error handling. * munin-run: Make --debug messages consistent wrt STDERR/STDOUT and prefix with # to make them obvious to users and munin-node-configure * Makefile: Create plugin state directory with correct ownership and permissions * port_ plugin did not use @@PLUGSTATE@@ for plugin state * ipmi plugin: Incorrect handeling of 'autoconf' method * YUM plugin did not autoconf correctly * install-node-plugins now installs all plugins in the distribution - no matter if they existed already - how else do we get bugfixed plugins installed? * Inform about ruthless installation practices in INSTALL document * Add maintainer version of Makefile.config - and stop it from being distributed as the actual Makefile.config by accident * Add favicon.ico file and install * Add other convinience features for the maintainer to Makefile * linux/fw_forwarded_local: Removed arbitrary max settings (trac #149) * Contributed plugins for netbsd * New ntpdc based ntp plugins to show kernel params * New plugin: Multiping shows multiple ping results in one graph (trac #109) * munin-node: Fix depreciated environment setting messages (trac #377) * Document what graph_strategy cgi does (wiki docs, trac #98) * Add a possibly helpful readme file to dists/sunos * Contrib: (updated) hack to generate pages of each-service-on-every-host * Munin.pm: Fix uninitialized value problem in lock reading code. * linux/irqstats plugin: Fix bug related to different /proc/interupts format on Sparc hardware (trac #436) * Added init script for Solaris in resources directory * Add uptime plugin for solaris (trac #419) * Squid plugins: Add timeout to http connection call * Correct years of (C) in snmp__winmem * nutups_: new plugin for ups checking through "nut". * munin-html: Split on /\s+/ instead of / / to ensure more robust handling of user input * Fix rrd 1.2 font size problem causing line wrap (#104) * Fold in contributed hack to generate single service comparative pages * Node: Clear up some operator presidence causing problems in perl 5.8.7 * Update copyright years and put copyright info into the new README file * Install a .htaccess file by default and document it * Move surfboard plugin, not Linux specific. I suspect this plugin is redundant and snmp__if_ can do the same job * Bugfix to support notify_alias at service level * Put configuration-file snippets into resource directory and use install @@ substitutions in them * Makefile: Better dependencies * Add digitemp and yum plugins * Make munin-node-configure-snmp die gracefully with a potentially useful error message if Net::SNMP->session() fails. Patch helpfully provided by Cyril Bouthors , thanks! * New AIX load plugin * Plugins from Lars Strand: linux/threads linux/proc_pri * New version of linux/if_ plugin that also handles mii-tool dependent interfaces and handles absence of tools better. * linux/memory: warn -> warning * postfix/mailstats: sort keys instead of keys, prettyer that way * Windows SNMP plugins: Memory and cpuload plugins seems pretty broken reinstate other versions. * New SNMP lugins: snmp__rdp_users and snmp__winload * Change global headers limit to 16 or longer labels - 20 was too much even with rrd 1.0 * linux/memory: Saner values on 64 bit machines - ticket #119 * SNMP based uptime grapher - ticket #141 * Linux/load: Make warn/crit levels configurable by environment (ticket #44) * Aix plugins: Better graph_categories * New plugin: qmailscan by David Obando, lists viruses found by name * New plugins: freebsd/uptime, linux/quota_usage, snmp: cmc_tc_sensor r1054 | janl | 2006-08-25 01:31:44 +0200 (fre, 25 aug 2006) | 2 lines * Linux/apt: Better counting: Debian #314610, Munin #92 * New plugins for Tomcat from runesk * Applied patch to allow _aggregated graph * spamstats plugin: Check if logfile exists before reading * Delete obsolete plugins: i2c* * ACPI plugin is linux specific * linux/cpu: Various fixes relating to 1000Hz machines, closing #228. * Applied field.colour patch by munin@iambitter.org, ticket #54 * New plugin: IPMI plugin added * apc_envunit_ plugin: Remove hard coded defaults that overrode configuration. * freebsd/vmstat: Avoid calling sysctl through $PATH. That variable is changed on process restart. * Get rid of undefined variable warnings in mailscanner - patch by dz@426.ch (trac #227) * cups plugin: No @ in field names (#66, #70) * sendmail_mailqueue plugins: Follow symlinks (#102) * hddtemp_smartctl: different attribute ID for temperature (#81) * ps_ plugin: Counted grep as well as the process * New plugin: cpuspeed for linux. * Linux/multips: wrong category of multips (#103) * Munin-node/run: Set LC_ALL to C to avoid locale changes to program output * Linux/cpu plugin: Scale to >10 CPUs (trac #37) * Linux/df: Rewritten df plugins in perl. The old plugins were extremely slow on busy system due to massive forking * sendmail_mqueue: (#65) wrong seek call * munin-update: (#39) incorrect error handling when opening STATS handle * New plugin: Linux/nfs4_client: should be folded with nfs_client when we get multigraph * node/munin-run: Inserted missing \n * linux/nfs_client: Fixed input processing inefficiency * linux/nfsd: Ditto * linux/fw_forwarded_local: Ditto * ps_ plugin: pgrep? /usr/bin/pgrep! * sendmail_mailqueue plugin: Replaced a $mspqueue too many * Synced most rpm specfile changes from Fedora package into unstable tree * A RedHat specific sendmail plugin config file * Add testing framework and some tests for munin-run. * Updated to final 1.2.4 version [merged change r98r984 from /branches/1.2-stable * Change copyright notice in programs to mention the GNU *General* Public License, Expand on "no warranty". Mention COPYING and http://www.fsf.org/licensing/licenses/gpl.txt. Extend copyright to 2005. * Fix generic/mysql_isam_space_ to pass user-specified mysqlshow options first. * Fix generic/ntp_ to report seconds instead of milliseconds. * Fix handling of 'update no' on services in munin-update. * Log warning about nodes without addresses in munin-update. * SNMP plugins no longer report host_name when checking localhost. * Remade the horizontal logo * Added two svg versions of the logo: original and horizontal * Merged debian packaging changes from 1.2 [changes r615:920 from /branches/1.2-stable/dists/debian and r855:891 from /branches/debian/sarge/dists/debian] * Added support for summing values from log lines. * Correct munin-limits pod. * Tuned logging. * Added support for huge rrd files. * Changed paths in Makefile wrt move from cvs to svn. * Make it possible to run plugins with group root. * Plugins: "exists $ARGV[0]" does not work with perl < 5.6.0. use "defined $ARGV[0]". * Dists: Brought dists.freebsd in line with the FreeBSD ports. * Dists: Merged changes from Debian Etch package. See dists/debian/changelog. * Server: filter a trivial error message from RRDtool (Deb#326061) * Server: A patch from trunk that makes munin-limits eat stdout/err from the contact.foo.command option in munin.conf. (Deb#301196) * Server: Fix thinko in category_order in munin-html.in. * Node: Prevent list command from polluting the node list. * Plugins: Fix tempfile creation by using the best method available on a given platform. (amavis, courier_, perdition) * Plugins: Fix to support the Linux cciss driver in the iostat plugin. * Plugins: squid_requests: Put the CDEF back that computes misses. * Plugins: postfix_mailvolume: Fix bad exit code test for `which postconf`. * Plugins: hddtemp_smartctl: Fix bugs on Solaris. Revert back to using -A (attributes) rather than -a (all). That can be specified through the args_$dev mechanism. THIS CAN BREAK EXISTING SETUPS! * Plugins: samba: Make location of smbstatus program configurable. Streamline computation of foo.value. Correct typos and a thinko. Add configurable "ignoreipcshare". Make awk program a lot more complicated to deal with variations of smbstatus output. Quote error message with parentheseis. * Plugins: smart_: Allow to query several drives on the same 3ware card. Correct a bug when '-i' was not listed in smartargs. Don't fail if no value was obtained for hard drive model. Minor enhancements and minor bug fixes from Nicolas STRANSKY . smartctl exit code is a value composed of bits. Allow more than one to be turned on simultaneously by using the exit code itself rather than the log2 of it. * Plugins: perdition: Add missing backquote on mktempfile line. Support IMAPS and POP3S protocols. * Plugins (FreeBSD): if_, if_errcoll_: Shift field numbers in awk for interfaces that have no MAC address. * Plugins (Solaris): fs_df, fs_inodes: Allow '-' in mountpoints. * Plugins (Solaris): processes: Replaced numerous calls to various programs with a single awk program. * Plugins (Solaris): netstat: "exists $ARGV[0]" does not work with perl < 5.6.0. use "defined $ARGV[0]". * Plugins (Solaris): memory: Rewrite the value computation as a single nawk program. Support scale factor "K" (gives values < 1). * Plugins (Linux): port_: Correct offset error in TCP6 code. * Plugins (Linux): if_: Simplify awk program greatly, suggested by Nicolai Langfeldt * Plugins: Added plugin generic/digitemp_. * Plugins: Added plugin linux/yum. * Node: use Sys::Hostname::hostname()+gethostbyname() instead of Net::Domain::hostfqdn() in order to determine the fully-qualified host name of the host. The latter appears to be brain-damaged, see for background (Deb#307462, Trac#89). munin (1.3.2) * Main/node: Implemented TLS support. * Main: fix the file vs. pipe check in munin-limits. * Main: place the munin-limits lock file in rundir, not dbdir. * Main: Yet another rewrite of munin-limits open call (SF#1115434). * Main: Make sure all rrd-tunes are correct after an upgrade (Deb#296454, Deb#296645). * Main: Better handling of broken connections (Deb#298108). * Main: HTML cleanup (Deb#296676). * Main: Re-enable width/height attributes to img tags. * Main: Escape regexps more properly (Deb#296575). * Main: Correct expires-headers in CGI output (SF#1159742). * Main: Redirect stdout/stderr from munin-limits contact commands, to the munin-limits log file (Deb#301196). * Node: munin-node didn't treat default_plugin_user properly (Deb#295366). * Node: munin-node-configure now properly respect user plugins. * Plugins: sort drives in generic/hddtemp_smartcl (SF#1174847). * Plugins: linux/if* now treats ra* interfaces as wireless. * Plugins: minor bugfix in generic/bind9. * Plugins: generic/sendmail_mailqueue handles bigger queues (fix by Mickey Everts). * Plugins: Made contrib-plugins generic/amavis and generic/mailstats more secure. * Plugins: Minor bugfix in linux/if_, with info fields. * Plugins: Added warning note in linux/if_ output. * Plugins: generic/smart_ exit value no longer triggers criticals. * Plugins: linux/df* now ignores bind mounts. * Plugins: Added plugin generic/snmp__cpuload. * Plugins: generic/amavis now has configurable logfile location (Deb#296533). * Plugins: linux/irqstats should no longer fail on some systems (Deb#296452). * Plugins: modified graph_args of generic/apache_processes, to work around an rrdtool bug (Deb#296528). * Plugins: All plugins using logtail now properly detect its format (Deb#297628). * Plugins: sunos/memory repaired (SF#1143610). * Plugins: Made linux/if_ work with more versions of iwlist (SF#1150954). * Plugins: generic/mailman now handles regular mailman (Deb#297904). * Plugins: New contrib plugin generic/mbmon_ from Arne Schwabe. * Plugins: Made linux/df work properly with tmpfs and devmapper (Deb#298442). * Plugins: Thanks to Stephen Gran, generic/exim_mailstats now graphs rejects (Deb#295799). * Plugins: Only run 'exim -bpr' once in generic/exim_mailqueue_alt, and use only awk to process the data. * Plugins: Make linux/sensors_ handle multiline output better (Deb#300690). * Plugins: generic/postfix_mailstats now treats reject-lines better (Deb#302220). * Docs: Added man page for munin-node-configure-snmp. * Docs: Brushed up the comments in the default munin.conf a bit (Deb#294060). * Docs: Fixed erronous cgiurl docs (SF#1159722). * Installation: Create CIGdir if nonexistent. munin (1.3.1) * Main: Fix bug with calculation of "Avg:" field when using graph_sums. * Main: Make munin-limits work properly with perl <5.8 (SF#1109039). * Main: Bugfix in munin-cgi-graph with hostnames including - (SF#1111510). * Main: Added category_order, to complete the *_order options. * Main/Node: Added support for TLS. * Plugin: linux/users now has proper hashbang. * Plugin: Bugfix in generic/sendmail_mail* autoconf. * Plugin: Changed default log for generic/postfix_mailstats from syslog to mail.log. Downgraded it from auto to manual. (Deb#291720). * Plugin: Made generic/amavis autodetect logtail format (Deb#284638, Deb#288395). * Plugins: generic/named probes for more log files before giving up (Deb#291849). * Plugins: New wildcard plugin generic/courier_ by Micah Anderson (Deb#291854). * Plugins: New plugin generic/perdition by Micah Anderson (Deb#291855). * Plugins: Plugin generic/squid_cache now handles multiple caches (Deb#288579). * Plugins: Improved graph_title of generic/postfix_* (Deb#292083). * Plugins: Turn on graph_scale for generic/postfix_mailvolume. * Plugins: Make generic/postfix_mailstats catch more formats (Deb#292110). * Plugins: Added plugin generic/hddtemp_smartctl, made by Lupe Christoph. Made it the default hddtemp plugin. * Plugin: Added madwifi support to linux/if_* plugins. * Installation: Make the single python plugin use @@PYTHON@@ again. * Docs: Documented minimum requirements for use of graph_sums (SF#1109040). munin (1.3.0) * Main: Allow dots in PNG paths (patch by Jacques Caruso). * Main: Properly size table below graphs in service-view. * Main: Fix bug which lead to some graphs failing with STACK error. * Main: Added limit message option "strtrunc". * Main: "contacts" can now be set to "none". * Main: Bugfix with graphs using both "graph_sums" and data aliases. * Main: Tables in service-view now sorted according to graph_order. * Main: Tables in service-view now containt the correct "Type" when using data aliases. * Plugins: generic/sendmail_mail{stats,traffic} updated. * Plugins: Made generic/samba more portable (fixes by Nicolas Stransky). * Plugins: Fixed typo in generic/loggrep breaking implicit labeling. * Plugins: Bugfix in generic/amavis. munin (1.1.9) * Main: Optimised munin-cgi-graph a bit. * Main: Internal name (for use in munin.conf) added to the table in service view. * Main: Added option cgiurl_graph. * Main: Bugfix when using long labels and CGI graphing. * Node: Fix bug when encountering strange environment (Deb#285173). * Node: Remove hardcoding of default user/group to run the plugin as (SF#1083251). * Packaging: Expand man-page macros properly on man-page generation (Deb#286399). * Plugin: Added plugin generic/dhcpd3, created by Rune N. Skillingstad. * Plugin: Patch generic/bind9 to report "unnamed" as "other" (Nicolas Stransky). * Plugin: linux/apt* has been forced to LANG=C, to get predictable output. * Plugin: Removed hardcoded host_name in linux/cps_. * Plugin: Added plugin linux/users, created by Michael Kaiser. * Plugin: Cleaned up generic/samba a bit (SF#1087961). munin (1.1.8) * Munin-limits: Log less noise. * Munin-limits: Notify correctly in all situations. * Munin-graph: Treat CDEFs in fields with long names properly. * Munin-graph: Log an illegal STACK in the first field better (SF#1081903). * Munin-run: Now behaves properly when running invalid plugins (SF#1074242). * Munin-node: host_name in plugin-conf.d now overrides plugin output. * Munin-graph: Added "graph_period" option, to make "graph_sums" usable. * Munin-update: Fix bug when setting min to 0. * Munin-node-configure: Fix bug with underscore in wildcard plugins. * Plugin: New version of generic/smart_ by plugin creator (Nicolas Stransky) (SF#1072459). * Plugin: generic/uptime was re-classified as linux/uptime (SF#1074576). * Plugin: Renamed generic/folding@home to generic/foldingathome (SF#1074241). * Plugin: Modify generic/ping_ so it's compatible with Solaris ping (SF#1074545). * Plugin: Fixed broken autoconf in generic/sendmail_mailtraffic (SF#1074528). * Plugin: Patched sunos/cpu to work on Solaris 9 (SF#1077899). * Plugin: Major improvements to sunos/io_ops,bytes,busy, by Lupe Christoph (SF#1077898). * Plugin: Portability enhancementes to sunos/fs_df (SF#1077903). * Plugin: linux/fw_forwarded_local now initialises properly (Deb#284673). * Plugin: Added more sensible autoconf to generic/sybase_space. * Plugin: Added more sensible autoconf to generic/munin_graph,munin_update. * Plugin: Added two new plugins contributed by Jacques Caruso, generic/exim_mailqueue_alt and generic/mailscanner. * Plugin: New version of generic/pm3users_ by plugin creator Jacques Caruso. * Plugin: generic/bind9 now handles syslog format as well (by xavier). * Plugin: Two new contrib plugins generic/foldingathome_*, by xavier. * Plugin: generic/named a bit more portable (by Will Froning). * Plugin: Sort fields in df*-plugins alphabetically. * Plugin: Added plugin generic/bind9_rndc, by Facq Laurent. * Plugin: Two network ups tool plugins (generic/nut_*) contributed by xavier. * Plugin: Added plugin generic/mhttping by Greg Connor. * Plugin: linux/cps_ plugin now groks high numbers. munin (1.1.7) * Allow floating point values in warning/critical limits. * Bugfix in munin-html, when using groups/host names with more than one dot. * Updated RPM package creation with regards to the 1.2 series. * Created RPM package creation for SuSE with regards to the 1.2 series. * Added --stdout-option to all programs (SF#1073148). * Log updates of nonexisting fields better (SF#1073172). * Force plugin linux/apt to use C locale (SF#1072470). munin (1.1.6) * Failsafe entry for @@PYTHON@@. * Bugfix in munin-limits (it didn't work properly). * Added separate makefile target to take care of SNMP-only items. munin (1.1.5) - Munin main package: * Treat long field names properly. Sadly, this will lead to data loss for fields that earlier had their field names truncated. :-( * Small interface improvements in the HTML output. * Changes of min and max values now causes corresponding changes in the RRD files. * Added new option "graph_sums" which creates summarised graphs. * Munin-update adapts to field type changes (loss-free conversion from COUNTER->DERIVE et al.) * Added new config option "local_address", to specify which local address outgoing connections (from munin-update) should be used. * Added "comparison" views, to view a whole hostgroup at once. * Bugfix in munin-limits. * Draw min/max ranges in all graphs with only one visible field. * Replaced notification system. Munin can now send warning/critical messages to whatever process/file that is needed. * Removed the munin-nagios program, as it is no longer needed. * Use column headers for min/max/cur/avg if label is too long. * Minor template modifications, so the output HTML validates correctly (SF#1039850). * Added new field option "line", which draws HRULEs. - Munin-node: * The node now changes dir to /, to make sure it's in a directory readable by all users. * Added per-plugin timeouts, contributed by Chan Wilson (SF#881044). - Plugins * SNMP plugin "df" properly strips the label and serial number from Windows drive labels. * SNMP plugins now honour the "host" environment variable if they can't deduce the hostname from $0. * Use @@PERL@@ in all perl shebang lines. * Added new SNMP plugins for sensors, reading info from System-Informant on Windows boxes. * New wildcard plugin generic/ping_ to graph ping times. * Replace "rpc" field with "total" in NFS and NFSD plugins. * Added new plugin linux/apt_all, contributed by xavier. * Added new plugins generic/courier_mta*, contributed by Rune N. Skillingstad. * Plugin generic/acpi now autodetects even if the acpi version does not contain the acpi_available program. * Added plugin linux/irqstast, showing individual interrupt rates. * Fixed typo in linux/fw_forwarded_local (Deb#275535). * Fixed typo in linux/fw_packets (Deb#275537). * Added SNMP plugins for temperature and fan info provided by the Fujitsu Siemens ServerView agents. * Adapt linux/apt plugin to work properly with Debian testing/unstable (patch from Rune N. Skillingstad). * Added new plugin generic/apc_nis to monitor APC UPS, contributed by xavier. * Made graph_title a parameter for generic/exim_mailqueue (patch by Torstein T. Svendsen, SF#1060834). * Fixed typo in generic/sendmail_mailstats (patch by Lupe Christoph, SF#1058128). * Applied patch from Torstein T. Svendsen to generic/exim_mailstats, to handle logfiles with timestamps in the name (SF#1055214). * Applied patch from Nicolas Stransky to generic/hddtemp, to fetch temp more elegantly (SF#1052845). * Added new plugin linux/hddtemp_smartctl, made by Peter Gervai (SF#1032727). * Fixed linux/if_(err_) braindamage affecting hosts with vlans or multi-digit interface numbers. * Added wildcard plugin generic/smart_, contributed by Nicolas Stransky. * Added plugin generic/loggrep for generic log grepping. * Fixed bug in generic/sendmail_mailqueue, when queue is empty. * Fixed bug in generic/hddtemp2, patch by arturaz (SF#1037002). * Added new plugin linux/forks, to graph forks per second. * The linux/iostat plugin now ignores devices without traffic (Deb#267195). * Changed a lot of plugins so they use DERIVE instead of COUNTER. * Upped generic/ntp_ to auto family. * Upped generic/sendmail_mailstats and generic/sendmail_mailtraffic to auto family. * Fixed linux/sensors_ plugin to report warning and critical values for temperatures and voltages if 'sensors' reports them. - Installation * Changed variable name of ARCH to OSTYPE, to avoid name crash on newer FreeBSDs (SF#1068238). * Added variable PYTHON, as we now have our first Python plugin. munin (1.1.4) * Better error handling when fetching data from RRD files. * Fixed bug in munin-graph when choosing colours (Deb#267185). * Added plugin linux/df_abs * Sanitise incoming fieldnames a bit better. * Small layout improvements. * Added new options "graph_height" and "graph_width", to beter control size. * Added support for SNMP probing. * SNMP plugin "if" now accepts PPP interfaces as well as ethernet interfaces. * SNMP plugin "df" now understands Windows SNMP daemon. munin (1.1.3) * Applied patch from Jacques Caruso to make HTML output standards compliant. * Munin-graph: fixed bug when combining graph_order aliases with "normal" fields, as reported by Jacques Caruso. * Plugin bugfixes from Jacques Caruso, in linux/iostat_ios and generic/ipacng. * Munin-nagios: Only state number of OKs when something is in warning or critical state. * Munin-graph: Added 'graph_sources' option. This is (in effect) the same as graph_order, but with a default of 'graph no'. * Applied patch from Matthieu Lochegnies to munin-graph, and fixed the same problem elsewhere in the code (Deb#250982, SF#924561). * Force LANG/LC_ALL=C in generic/hddtemp2, to remove problems in parsing of hddtemp output (Deb#253497). * Force LANG/LC_ALL=C in linux/sensors_, to remove problems in parsing of sensors output (SF#972749, SF#972748, Deb#255312). * linux/sensors_temp now understand temp lines without hyst or max settings (Deb#256380). * Made linux/sensors_volt work with negative voltages (Deb#256734). * Made generic/hddtemp2 understand environment variables with quotes (Deb#265022). * Added plugin generic/uptime contributed by Nicolas Salles (SF#998665). * Added plugin generic/hddtempd contributed by Stein Magnus Jodal (SF#958762). munin (1.1.2) * The server programs now open the log file at an earlier point. * Munin-limits added to distro. * Warnings and criticals now show up in nodeview and overview. * Makefile no longer stopping when complaining about htmldoc errors * Added contributed plugin generic/cupsys_pages, contributed by Rune N. Skillingstad. * Minor documentation bugfix. * Added automatic "graph no" to negative field when using negatives. * Added options to munin-graph to skip locking and stats generation. * Added --cron option to munin-graph. This is used internally for special case checking when run from cron. * Added dist-directory for Solaris packages. * Created munin-cgi-graph, which creates dynamic graphs. * Added munin.conf option "graph_strategy (cgi|cron)" which defaults to cron. * Bugfix in cdef calculations. munin (1.1.1) * Added a table in the service view page, with information about each field. * Added plugin options "graph_info" and ".info", which can be used to describe the graph/fields in the above mentioned table. * Bugfix in the linux/df_inode plugin, regarding filesystems withouth inodes. * Added warning and critical statuses to the info table in the service view. * Added "info"-fields to linux/cpu and linux/load plugins, to demonstrate how it works. * Linux/ip_ wildcard plugin contributed by Mathy Vanvoorden (SF#954851). * Added a definition file (definitions.html) to the server distribution. * Use "sed 1d" instead of "tail +2" in df plugins (patch by Olivier Delhomme). * Tuned cdef-code to make it work properly after clean-up. * Added "graph_category" option, to categorise plugins. * Set categories to most of the plugins. munin (1.1.0) * Bug regarding logo namechange from logo.gif to logo.png, when installing. * Allow/deny in munin-node can now be configured per plugin, in addition to "globally" for the whole node. * "Upped" som plugins from contrib/manual to manual or auto. * Code cleanups. munin (1.0.0pre4) * Munin-update now properly ignores node with "update no". * The generic/apache_* plugins now have defined max values. * New plugins generic/{sendmail*,amavis,apc_envunit} contributed by Xavier Redon. * Turned off scaling of values for cpu-graphs (no more nano-percentages). * New plugin linux/iostat_ios to graph the number of I/O operations. Contributed by Per A. Buer. * Added user configuration for generic/postfix* (SF#895680). * Fixed links in HTML templates (Deb#236792). * Fixed broken autoconf in apache-* plugins (Deb#236144). * Fixed bug in mysql-plugins (Deb#233762). * Fixed a problem in the node when running as a non-root user and using sudo to run the plugins (Deb#236694). * Clarified the vlabels in the apache-plugins (Deb#238594). * Patched temp and voltage parts of linux-pugin sensors_* with better regexp (Deb#245289, SF#906868). * Changed default ARCH variable in Makefile.config, to support older tr-s (SF#898814). * Make "graph_scale no" affect y-axis as well as numbers below the graph (Deb#236834). * New SNMP plugins: df, if_err, processes, fc_if (fibre-channel), fc_if_err, users, load. * Cleaned up Solaris plugins (SF#944389, ++) * New logo by Bianca Pfingsten, sponsored by Mediahaus Biering Grafischer Betrieb GmbH. (Thanks :-) * Made solaris plugin fs_df work without GNU df (SF#944389). * New solaris plugin temperature, by Richard van den Berg. * Two new linux firewall plugins; fw_packets (by S. Banerian), fw_conntrack (by Nicolai Langfeldt), and fw_forwarded_local (by Xavier). * Modified sunos/cpu, linux/cpu and freebsd/cpu to take "scaleto100"- parameter. * Added patch to contrib-plugin linux/nfsd, to graph rpc count (Alexandre Dupouy). * Added plugin linux/nfs_client, contributed by Alexandre Dupouy. * Added plugin ipac-ng, contributed by Arturas Slajus. * Added plugin hddtemp2, contributred by Andrew Radke, modified by Lupe Christoph. * Added Folding@home plugin, contributed by Xavier. * Fixed problem with sunos/memory, when memory was reported in gigabytes (SF#930964) * New plugin (pm3users) and a bunch of patches from Jacques Caruso. munin (1.0.0pre3) * Munin-graph had a perl 5.005_03 compatabilty problem, which slipped through to version pre2. * Added mkdir to install-man target. (SF#888545) * Added better logging of plugin failures in the node. (SF#881045) * Make install: Fix problems with systems that do not have getent. (SF#881046) * Remove dependency on pgrep (use process groups instead). (SF#881049) * Documentation updates. * Make the iostat plugin work properly. * Munin-graph now escapes ':' in labels properly. * Fixed bug in munin-graph where it caused a flood of cron-mail. * Linux/iostat now shows only disks also on machines without devfs. * Generic/apache-plugins have been modified to properly to report the correct autoconf value. Also, bugfixes in _processes and _volume. * Added new wildcard plugin linux/sensors_ that replaces the i2c plugins (SF#890952). * Made client timeouts configurable (not per plugin). * Improved timeout-handling in node (Deb#224480). munin (1.0.0pre2) * Plugin mysql_queries bugfix from Dagfinn I. Mannsĺker (SF#876443, SF#865125). * FreeBSD-plugin load bugfix from Robert Lindgren (SF#865928). * Fixed Node/run bug when changing groups. * Added support for multiple groups to run the plugin as. * Added support for optional groups. * Munin-html: Added support for domain_order. * Fixed pod typos patched by Lupe Christoph (SF#884092) * Made Munin compatible with perl 5.005_03 (patch by Lupe Christoph) (SF#884622) * Removed sunos/io_-plugin (SF#882357) * Bugfix, apache_processes now takes port numbers into account. (SF#882263) * Changed wildcard plugin ps_ so it can use "env.regex" in plugin-conf.d/ (SF#882131) * Made plugins apache_* compatible with older versions of LWP::UserAgent (SF#881411). * Bugfix in plugin mysql_queries - insertions were no longer graphed. (SF#881483). * Disabled plugins df and df_inode on Solaris (SF#882274). * Make vmstat plugin more portable (SF#882352). * Moved generic netstat to linux-dir, as it is too spesific. Added Solaris version of the plugin as well. (SF#882354) * Fixed bad debug output (forgotten linebreaks) in munin-node-configure (SF#882385). * Generic plugins now use printf instead of echo -n, as this is more portable (SF#885564) * Added a new plugin generic/multips to count several procs in one graph. (SF#885579) * More timeouts in munin-update (Deb#222674). * Added max value to generic/vmstat plugin (Deb#225489). * Bugfix in install-doc Makefile target (SF#884074). * Code tidying in munin-graph (SF#884625). * Added generic plugins ntp_ and ntp_states to manual family (SF#887000). * Bugfix; munin-html wrote bad html, as reported by Adam Heath. (Deb#230322) * Rewrite of linux/iostat by Mike Fedyk (Deb##223373,224113). * Linux/cpu now graphs all values on a 2.6 kernel (Deb#227946). * Added new plugins linux/nfsd and acpi, contributed by Alexandre Dupouy. munin (1.0.0pre1) * Renamed from LRRD to Munin. lrrd (0.9.9r6) * Added BSDish install-sh to make the installation work on both BSD and SysV variants (SF#840744). * Plugin linux/iostat modified. Now runs on 2.6, and now "mirrors" i/o like eth* et al. (Deb#224113, Deb#223373) * Lrrd-client: Don't try to change uid/gid if not running as root. (Deb#224300) * Lrrd-graph: Only log graphing errors (== less cron-mail). * Plugin linux/memory has been improved greatly by Mike Fedyk (Deb#223346) * Some plugins fail more gracefully when using uninstalled perl modules. * Lrrd-client-configure now prints the reason for suggesting to not use a plugin, as long as the plugins gives one. * Lrrd-client: Do a fake clean of the environment because of the taint checking. * Lrrd-client: added configuration option "ignore_file", which takes regex for files to ignore (e.g. rpmnew/save) (Deb#224265). * New plugin: Alexandre Dupouy contributed "hddtemp". * New plugin: Nicolai Langfeldt contributed "bind9". * Lrrd-server: dots supported in plugin names. * New plugin: snmp wildcard plugin for interface graphing. lrrd (0.9.9r5) * lrrd-nagios: enable/disable notifications. * Plugin: mysq_isam_space_ bugfix when printing "value". * lrrd-client/lrrd-run: Two bugfixes. * LRRD.pm: Change \1 to $1 to make lrrd-update shut up. * lrrd-update: Fix bug with timeout handling of children. lrrd (0.9.9r4) * Plugin: changes from Mike Fedyk (Deb#222838, Deb#222841). * lrrd-cron: Check if files are executable before runinng (Deb#221691). * lrrd-update: Added max_processes variable. * lrrd-update: No more zombies. * lrrd-update: Better handling of dying children and timeouts. (Deb#222674) lrrd (0.9.9r3) * New plugins (contrib): postfix_mailqueue and named contributed by Nicolai Langfeldt. * New plugins (contrib): postfix_mailstats and postfix_mailvolume. * LRRD.pm: make sure only legal configuration lines are written to datafile. * lrrd-html: Minor bugfixes (fixes by Chan Wilson). * lrrd-graph: Bugfix when aliasing fields (reported by Chan Wilson). lrrd (0.9.9r2) * LRRD.pm: minor bugfix - no noise about "extinfo". * lrrd-graph: A couple of minor bugfixes. lrrd (0.9.9) * New plugin: sybase_space. Keeps track of sybase database space usage. * New plugin: psu_ wildcard plugin, by Andras Korn (Deb#214210) * Lrrd-client: addressed uid/gid-issues from Deb#214277 * Lrrd-update: client port number now configurable (Deb#214114) * Squid-plugins: now rewritten to use new config format (Deb#214186) * Lrrd-update: each node now has its own lockfile. * Squid-plugins: Modified them to autoconf. Prettier graphs. Now auto. * Lrrd-client: Don't mess with environment. Not my problem. * Lrrd-client: host_name can now be set in the plugin configuration. * Lrrd-client: plugin configuration format changed slightly. * Lrrd-client: added parameter (conffile and cli) to turn paranoia on/off. Default is now off. (Deb#214186, Deb#216401) * New plugin for linux: entropy, graphs available entropy. * Lrrd-client-configure: Remove "use" of Config::General (Deb#216176) * SunOS-plugins: Enhancement submitted by Lupe Christoph. (SF#825937) * SunOS-portability: Various bugfixes reported by Lupe Cristoph. (SF#825909, SF#825911, SF#825926, SF#825936, SF#826670, SF#826356) * FreeBSD-plugins: Bugfixing patches by Lupe Cristoph applied. (SF#826352, SF#837014) * Lrrd-server: New format for server.conf. * Mysql-plugins: Make mysqladmin/mysqlshow locations configurable. (SF#825974) * Plugins: New plugins by Lupe Cristoph (SF#834529, SF#826002, SF#835208) * Lrrd-server: Only require installed Config::General if using old config format. * Mysql-queries-plugin: rewritten by Per A. Buer. * Lrrd-nagios: Be nice to Nagios, don't DOS it with thousands of services. * Lrrd-client-configure: Check what to do with new plugins when upgrading. * Plugins: contributions by Finn-Arne Johansen (SF#839210, SF#839212, SF#839209, SF#842703, SF#845692) * Lrrd-update: More graceful handling of dead hosts. (SF#841345) * Plugins: graph_noscale redefined to graph_scale. * New plugin surfboard contributed by Andrew Ryder. lrrd (0.9.8) jo: * Plugin bugfix: Applied suggestion from Antti Salmela considering plugins df and df_inode (SF#800984) * Lrrd-update now forks off one process for each host, doing the data downloading in parallel. * Network timeout made configurable via both configuration file, and command-line parameter. default increased to 180 seconds. * Command-line option and configuration file option for not forking added. * Added command-line option to show log lines on stdout as well. * Lrrd-update bugfix: Move socket and pidfile to proper place. (Deb#203173) * Lrrd-update bugfix: Now handles corrupt datafile properly. (Deb#202191) * Plugin bugfix: mysql_isam_space now behaves properly when MySQL is down. (Applied patch from Nicolas Francois resolving Deb#202637) * Lrrd-client now runs with perl -T (taint checking). * Lrrd-html bugfix. (Deb#205999) * Lrrd-update bugfix, patch from Torstein Svendsen, alarm/sigalrm was forgotten on a network read. (Deb#209329) * Lrrd-update bugfix. Move all possible sigalrm-calls into eval-blocks, to avoid hangs and segfaults. _Really_ fixes bug Deb#209329. * Lrrd-client now drops privileges when running a plugin. The plugin is run as user nobody, group nogroup/nobody as default. This can be overridden in .../client.d/.auth. * Mysql-plugins can now use a config file. (Deb#202643) * Bugfix in mysq_isam_space_ plugin. (Deb#202639) * Plugins for FreeBSD 4.8 contributed by Patrick Domack (SF#802895) * Plugin "swap" on Linux modified so it works on 2.6 as well as 2.4. * Lrrd-client now uses conf/auth-file in .../lrrd/client-conf.d/. Passes config options to clients via environment. * Lrrd-graph bugfix: Cur/Min shown as 0 when using special_*. * Lrrd-update now has "use_default_name"-option, for use when fetching data from a client which may change name. * Lrrd-plugin "memory" ported to perl. (Deb#205019) * Added "--version" option. * Added "graph_total" option, for summarising stacks * Lrrd-graph now understands "graph_noscale true/yes/1", which drops scaling of Cur/Min/Avg/Max numbers. * New client program "lrrd-run" to run a plugin as the correct user. * Lrrd-client minor bugfix; should now get ARGV after HUP. * Lrrd-client-configure completely rewritten. lrrd (0.9.7) tore: * Applied a patch from Don Armstrong which makes the server ignore invalid pidfiles. * Massive changes in the Makefile to allow for more flexible installs. * Hardcode as little as possible. Use @@foo@@ in the scripts, which will be replaced with whatever 'foo' is set to in Makefile.config. * Added some AIX plugins contributed by Mike Discenza. * Merged the client and server changelogs into this one. * Improved vlabel and title in the port_ wildcard plugin. lrrd (0.9.6) tore: * First upload to the Debian archive, had to create an .orig.tar.gz. lrrd (0.9.5-2) * Bugfix: Resolved running-as-root-issue. (#695163) * Bugfix: Resolved lrrd-nagios --force issue (#701671) * Bugfix: Resolved lrrd-nagios --removeok --host issue (#701671) * Bugfix: Resolved lrrd-html logo.gif and style.css-issue (#693939) lrrd (0.9.5-1) * Small bugfixes * Bugfix: plugins lrrd_* now treats hostnames with dashes correctly (#727074) lrrd (0.9.3-2) * lrrd-nagios now has a longer timeout. * lrrd-html now creates much prettier html-pages. * Pod-documentation for /usr/lib/server/lrrd-*, /usr/sbin/lrrd-cron, and /etc/lrrd/server.conf * lrrd-graph now understands _special_sum and _stack. * lrrd-graph now has extended syntax on graph_order-lines. * Field type represented in filename of rrd-file. * All fields in the .rrd-files now have the same name. * lrrd-graph now reuses colours when there are a lot of fields. * lrrd-nagios now reuses send_nsca handles. * lrrd-update can now handle .extinfo-fields. * lrrd-nagios can now handle .extinfo-fields. * Bugfixes, continuing Tore's movment of files * Parameterization of lrrd-* * Installation script for tarball. lrrd (0.9.3-1) * New configtype * Timeouts on server lrrd (0.9.2-4) * Added new node- and service-level option "update", which will replace "fetch_data". * Added new field-level option "graph", which will replace "skipdraw". * Some plugins now have config-files: exim_mail* * ps-plugin made faster (use pgrep instead of ps). * Bugfix in 'iostat'-plugin. * Added 'suggest' and 'autoconf'-parameters to the plugins. * Removed startup check for lrrd-client on ' config'-output. * "apt"-plugin rewritten for perl. It now uses .extinfo-fields. * Install script for tarball. * lrrd-client now understands --config --help --debug (then latter for later use). * Created pod-documentation for lrrd-client and client.conf. lrrd (0.9.2-3) * Bugfix; lrrd-nagios didn't treat 0-limits properly. lrrd (0.9.2-2) * Added graph_vlabel-option. * lrrd-nagios: bugfix when specifying only a minimum warning or critical value. * Proper timeouting also done when 'config'-command issued. * Some clients now use 'graph_vlabel'-option. * Comment changes in some plugins * Bugfix in plugin: 'iostat config' lrrd (0.9.2-1) * Lazy-option to lrrd-graph. Graphs will only be drawn when needed. * Cleaned up the timeout code a bit. lrrd (0.9.1-5) * Attempt to set exim-variables in the exim_mail*-plugins at install-time, in an attempt to avoid timeouts on high-load systems. * Properly reap plugins that timeout (and their children). lrrd (0.9.1-4) * Bugfix. Numbers with decimals (e.g. load) and "U" are now allowed. * Fixed bug in cronjob for apt lrrd (0.9.1-3) * Fixed small bug in lrrd-graph that caused some glitches in some graphs * Cronjob for apt lrrd (0.9.1-2) * Fixed a bug in lrrd-update that caused rrds not to be updated * Small bug in apt-client lrrd (0.9.1-1) * All networkservices converted from bytes (B) to bits (b) * More bugfixes * Added cronjob to go with apt-service lrrd (0.9-12) * Bugfixes in templates * More logging * More intelligence in lrrd-nagios * Cronjob to remove .ok files once a day lrrd (0.9-11) * Last small fixes with warning and critical-nagiosLast small fixes with warning and critical-nagios * Skipped a version to sync with server * Included warning and critical on som of the services lrrd (0.9-10) * Fixed logging and logrotate lrrd (0.9-9) * More Nagios Support, now extracted into lrrd-nagios * Fixed logging + logrotate lrrd (0.9-8) * Nagios-support * Do not depend on libnet-io on woody (included in perl5.6) lrrd (0.9-7) * Fixing string under 19 characters lrrd (0.9-6) * We have to substr the other way * Upping version number lrrd (0.9-5) * Bugfixes. New configfile * Bugfixes in df-services added -P for posix standard lrrd (0.9-4) * Total rewrite of client * Bugfixes. Memory service gargled * Bugfixes. mailstat service gargled lrrd (0.9-3) * Adapt to new version of client * Bugfixes to clients and a new configfile lrrd (0.9-2) * Fixed host_name lrrd (0.9-1) * The new version lrrd (0.7-1) * Total rewrite. Much prettier. Perl er brukt. * Bugfix in postinst (make_html when upgrading). * Lots of new lrrd-d-modules. Tuning and fixing. * Debconf is out. Added searching for old-name config-files. lrrd (0.6-8) * Renamed mrtgd til lrrd. * Daemon now runs lrrd.d-scripts properly. * Added modules: load memory lrrd (0.6-7) * make_graph has proper colours. * make_html creates a nicer index.html. * Debconf in use. * Minor bugfixes: init.d-restart lrrd (0.6-5) * make_html makes sure there's an index.html. * Bugfix. Config-file now read earlier. lrrd (0.6-4) * Several bugfixes. * Cron-entry now uses logfiles. * Added config-file. lrrd (0.6-3) * Added debian-dependencies. lrrd (0.6-2) * Added monitoring for apache httpd daemons. * The daemon now backgrounds itself. * The init.d-script now "stop"s. lrrd (0.6-1) * Slightly tested. Going out. lrrd (0.5-4) * Now ready for production environments. lrrd (0.5-3) * Quite a few changes. Beginning to get ready for release. lrrd (0.5-2) * New test. lrrd (0.5-1) * Initial Release. munin-2.0.25/Checklist000066400000000000000000000035051243472346000145720ustar00rootroot00000000000000This is a pre-release checklist for the maintainer. * is there any "FIX" in: ChangeLog, INSTALL, Announce? * Is .htaccess installed? * rm -f /etc/munin/plugins/* Does munin-node-configure -d show any autoconf errors? Does munin-node-configure --debug run nicely or do we get perl errors? * Update plugins/plugins.history.in: 1. cd plugins 2. Figure out which r the previous tag was at and do this (r910 was 1.3.2 and r1234 is head) svn --verbose log -r910:1234 | fgrep node.d | grep -w A | cut -d/ -f 4- | sed 's/^node\.d\.//' 3. Check if the listed plugins are still present (or moved): svn --verbose log -r910:1234 | fgrep node.d | grep -w A | cut -d/ -f 4- | sed s'/(.*//' | xargs ls -ld >/dev/null # Git release We follow the workflow documented at http://nvie.com/posts/a-successful-git-branching-model/ The tag used here is "2.0.1", exchange this with a current version. * Create release branch from "devel" git checkout -b release-2.0.1 devel * Update ChangeLog $EDITOR Changelog git commit -m 'Update changelog for release' -- ChangeLog * Merge release branch to master git checkout master git merge --no-ff release-2.0.1 (handle any conflicts, and "git commit" the result) * Tag on master git tag -a -s -m 'Release 2.0.1' 2.0.1 master * Merge the release branch back to devel git checkout devel git merge --no-ff release-2.0.1 # Make tarball from tag git checkout 2.0.1 make tar # Propaganda * Broadcast the good news: 1. make a sha256sum : sha256sum munin-version.tar.gz > munin-version.tar.gz.sha256sum and sign it using gpg. 2. Upload the tar.gz on sourceforge.net 3. Create a news on sf annoucing it 4. Update our front page 5. Create a new release on freshmeat.net 6. Send an email to the ML munin-2.0.25/HACKING.pod000066400000000000000000000050621243472346000145060ustar00rootroot00000000000000# this is in pod format (try `perldoc HACKING.pod`) =pod =head1 NAME HACKING.pod - contributing to Munin =head1 SYNOPSIS This is the guide for Munin internals contributors (developers, testers, documenters.) If you are looking for more information on how to I Munin you probably want L instead. The munin code is marked by years on the battle front. You will therefore find code that deviates from the guidelines defined here. However, all new code should be made to comply. These guidelines are an RFC for the time being and are of course negotiable. =head1 GETTING STARTED In the dev_script directory you will find scripts that are meant to be useful for developing. Most of them are tools for creating and using munin in a sandbox. =head2 THE SANDBOX =over =item B To make a clean rebuild of the sandbox ./dev_scripts/install 1 To just install the latest changes ./dev_scripts/install =item B To test TLS, you can enable a paranoid TLS configuration by running: ./dev_scripts/enable_tls And disable it with: ./dev_scripts/disable_tls =item B ./dev_scripts/start_munin-node [munin-node params ...] And ./dev_scripts/stop_munin-node To do both: ./dev_scripts/restart_munin-node [munin-node params ...] =item B Use this command to query the munin-node directly: ./dev_scripts/query_munin_node list =item B To run Munin master programs (munin-update, munin-html, munin-cron, etc) use the run command. ./dev_scripts/run CMD [CMD args ...] =back =head1 PUNCTUATION VARIABLES Don't use punctuation variables (see Perl Best Practices page 79.) use English qw(-no_match_vars); We'll add an exception for $_, and $! as they should be fairly widely recognized. =head1 FORMATTING =head2 perltidy FIX =head1 TESTS AND COVERAGE Use test-driven devolopment. In node, server, or common: perl Build.PL ./Build test =head1 EXCEPTION HANDLING Currently there is no unified approach to handling exceptions. Use L? use Carp; croak("Foo happened!"); confess("Foo happened!"); # With stack trace Exceptions are caught with an eval: eval { # Exceptionally scary code }; if ($EVAL_ERROR) { # Handle exception } =head1 DOCUMENTATION The API documentation is embedded as POD in the code. See L for more on POD. More is on L =head2 WRITING The POD should be defined all in one place. For plugins you place it at the top, else at the bottom. =cut munin-2.0.25/INSTALL000066400000000000000000000241611243472346000137700ustar00rootroot00000000000000Munin installation requirements =============================== 2.0 now requires IPv6 *libraries*, but IPv6 doesn't need to be configured. If you plan to really *use* IPv6, please read the note at the end. On all hosts: - A reasonable Perl 5 (ie: at least 5.8) - GNU Make - do not attempt to use any other make (build time only) - Module::Build - this is part of perl 5.10, for earlier Perls it must be installed (build time only) - The perl module Time::HiRes - For TLS(SSL) to work you'll need Net::SSLeay everywhere Server: - A web server. Any web server supporting simple file service and CGI or Fast CGI should work. Apache HTTPD should be suitable. Also reported to be working is nginx and lighttpd, please contribute your configs. - RRD with Perl support - this means that RRDs.pm must be available and "perl -MRRDs -e ':;'" must run without errors. - Perl modules for server: - Time::HiRes - Storable - Digest::MD5, - HTML::Template - Text::Balanced - Params::Validate - TimeDate - Net::SSLeay if you want to use SSL/TLS - Getopt::Long - File::Copy::Recursive - CGI::Fast - IO::Socket::INET6 - Log::Log4perl 1.18 or later (which depends on - IPC::Shareable - Log::Dispatch - Log::Dispatch::FileRotate - MIME::Lite - Mail::Sender - Mail::Sendmail - MailTools) - Developers/packagers: For testing - Test::MockModule - Test::MockObject - Test::Pod::Coverage - Test::Perl::Critic 1.096 or later - Test::Exception - Directory::Scratch (err, wherefrom?) - As well as all the modules needed on a node - most servers are also nodes. Node: - Perl modules: Net::Server, Net::Server::Fork, Time::HiRes - Perl module Net::SNMP for SNMP autoconfiguration and plugins - For SNMPv3: Perl modules Crypt::DES, Digest::SHA1, Digest::HMAC - Net::SSLeay if you want to use SSL/TLS - Perl modules for plugins: Depends on the plugins you want to use, but not many. - If you want to use Java JMX plugins to monitor a Java app: Sun Java 5+ compiler (a basic JDK Standard Edition from java.sun.com or your package system). If you're missing some Perl modules and they are not in your package system it's recommended to use the cpan shell (as root) to install the needed ones. There is a short cpan shell section at the bottom of this file if you do not know how to use it. Please note that BSD and Linux OSes such as Red Hat Enterprise Linux (and CentOS), Fedora, Debian, Ubuntu, SuSE and others will have quite a few of these packages available to install with their standard install tools so there is no need to install from the source distribution unless you want a Munin release that is not packaged. Installing ========== NOTE!!!! If you're using NFS please note that the "make install" process is slightly problematic in that it (Module::Build actually) writes files under $CWD. Since "make install" is usually run by root and root usually cannot write files on a NFS volume, this will fail. If you use NFS please install munin from /var/tmp, /tmp or some such to work around this. There are make targets for node, master, documentation and man files. Generally you want to install everything on the master, and just the node and plugiuns on the nodes. To install both master and node: - Review/edit Makefile.config to suit your needs. - Create the user "munin" and the group "munin" if these are not made automatically. The user needs no shell and no privileges. On most Linux systems the munin user's shell is the nologin shell (it has different paths on different systems - but the user still needs to be able to run cron jobs. - make (do _NOT_ do "make install" directly, there is a bug somewhere that will result in a very defective Munin::Common::Defaults to be installed). - make install - For graphing you have to use CGI now. You usually want to use FastCGI graphing unless you have a quite small munin and a quite fast server. More information is available at http://munin-monitoring.org/wiki/CgiHowto2 In your HTMLDIR you will now find a .htaccess file with two main features: * Password protection. Users/passwords are kept in CONFDIR/munin-httpasswd. Use htpasswd to create/modify users in normal Apache fashion. * Munin page expiry to refresh contents. This requires mod_expires to be enabled. NOTE: Both these features require the relevant AllowOverride statement in Apache. AuthConfig and Indexes, respectively. If you already have a .htaccess file in HTMLDIR it will not be overwritten. If you prefer that munin be openly available make the .htaccess file empty to avoid overwriting it later. - Review CONFDIR/munin.conf to set up some nodes. At least one node needs to have at least one functional plugin for HTML generation. - Create a cron-entry to run "munin-cron" as the user "munin" every 5 minutes. See build/resources for generic or build/dists for some OS/distribution-specific scripts. To install a node: - Edit Makefile.config to suit your needs. - Create the user and group "munin". The use can have a nologin shell. - make - make install-common-prime install-node-prime \ install-plugins-prime NOTE: This overwrites any existing plugins. - Decide which plugins to use. The quick auto-plug-and-play solution: munin-node-configure --shell --families=contrib,auto | sh -x - Review CONFDIR/munin-node.conf. Ensure that your munin-master can access it. - Start the node agent (as root) SBINDIR/munin-node. Restart it it it was already started. The node only discovers new plugins when it is restarted. You probably want to use an init-script instead and you might find a good one under build/dists or in the build/resources directory (maybe you need to edit the init script, check the given paths in the script you might use). If you want to use SSH to contact the node from the master (rather than over tcp port 4949) please refer to http://munin-monitoring.org/wiki/Native_ssh For further build alternatives, see Makefile. Notes about node plugins ======================== "make install-node-plugins" installs the plugins in LIBDIR (defined in Makefile.config). Put the ones you want to use (or better yet, create softlinks) in CONFDIR/plugins/ . An easy way to do this, is the program "munin-node-configure", using the parameter "--shell". It will then suggest commands to do this. Example to show plugins it would enable: munin-node-configure --suggest To enable those: munin-node-configure --shell | sh -x You can also just run munin-node-configure --shell and paste the commands you want into a shell. Some of the plugins (mysql, postgresql, snmp, ...) require some configuration to get running. Some example configuration files (plugins.conf) is found under the build/dists directory. Whenever the installed plugins changes, the node needs to be restarted. Also restart the node when you change it's configuration. Many OSes and releases thereof have different ways of gathering data. A lot of OSes still have none. If you create plugins for an OS/system which is not already in the package, please send us a copy of them, so we can add them for others to use. We'd also be happy if you sent us any new plugins on systems already in the package. Using CPAN shell ================ If your OS does not provide all the needed perl packages they can be intalled by a perl installation tool called CPAN-Shell. There is ample documentation about it on the web, but here is a brief tour. As root execute: # perl -MCPAN -e shell The first time you run this you are interviewed about various things. Answer the questions, you can probably answer blank on any you do not understand. You will then be presented with a CPAN prompt (cpan>) . From this prompt you type: cpan> install Time::HiRes You could also do it one at a time like this: # perl -MCPAN -e 'install Time::HiRes' Do the same for all modules needed. E.g., install Time:HiRes install Storable install Digest::MD5 install Text::Balanced and so on. If you need to install Munin on a host with no Internet access you can use CPAN shell on a host _with_ Internet access and use the "get" command to retrive the needed modules. One problem: The dependencies of modules will change over time so the list above may not be correct 6 months after it was last updated. SO: If you want to make sure you get all the needed modules you can do a full install of munin on a Internet connected system and then transfer all the modules to the non-connected system after. All the modules that the CPAN shell retrived can be found like this: # cd ~/.cpan/sources # find . -name '*.tar.gz ./authors/id/G/GA/GAAS/Digest-MD5-2.39.tar.gz ... Now just make sure the sources directory is empty before you begin. IPv6 ==== The basic problem with munin and ipv6 is that we use Net::Server and there has been no releases of Net::Server supporting IPv6 (pr. 2011-07-22). So we've found out that Debian has patches for IPv6 support and they're even claiming to be complete - and our testing agrees. We (janl) have submitted a new version of Net::Server to CPAN based on this. If you use Debian (or derivates) with Net::Server 0.99-2 or later or if you find Net::Server 0.99.6.1 or more recent in your CPAN or Distribution repository is probably supports IPv6 out of the box. In the mean time look in the contrib directory for our Net::Server.patch. You can apply this directly to your installed Net::Server perl modules - this is a bit dirty, and you may have to jigger the directory paths a bit, but it will work. If you use CPAN anyway then get Net::Server and apply the patch provided. If your Net::Server understands IPv6 and you have "host *" in your munin-node.conf file your munin will be listening on a dual ipv4/ipv6 socket and you can connect to it with "telnet ::1 4949" to test. You probably need to correct your allow list like so: allow \:\:1$ to actually allow this. If you keep an eye on munin-node.log then the cause of any problems should be obvious. munin-2.0.25/Makefile000066400000000000000000000446121243472346000144020ustar00rootroot00000000000000# -*- makefile -*- # # Gnu make only. Seriously. # # $Id$ # Defaults/paths. Allows $(CONFIG) to be overrided by # make command line DEFAULTS = Makefile.config CONFIG = Makefile.config include $(DEFAULTS) include $(CONFIG) ifeq ($(JCVALID),yes) JAVA_BUILD=build-plugins-java JAVA_INSTALL=install-plugins-java JAVA_PLUGINS=plugins/node.d.java/* endif RELEASE := $(shell $(CURDIR)/getversion) INSTALL_PLUGINS ?= "auto manual contrib snmpauto" INSTALL := ./install-sh DIR := $(shell /bin/pwd | sed 's/^.*\///') INFILES := $(shell find . -name '*.in' | sed 's/\.\/\(.*\)\.in$$/build\/\1/') INFILES_MASTER := $(shell find master -name '*.in' | sed 's/\(.*\)\.in$$/build\/\1/') CLASSFILES := $(shell find plugins/javalib -name '*.java' | sed 's/\(.*\)\.java$$/build\/\1.class/') PLUGINS := $(wildcard plugins/node.d.$(OSTYPE)/* plugins/node.d/* $(JAVA_PLUGINS)) MANCENTER := "Munin Documentation" MAN8 := master/_bin/munin-update master/_bin/munin-limits master/_bin/munin-html master/_bin/munin-graph PODMAN8 := build/master/doc/munin-cron master/doc/munin master/doc/munin-check PODMAN5 := build/master/doc/munin.conf node/doc/munin-node.conf .PHONY: install install-pre install-master-prime install-node-prime install-node-pre install-common-prime install-doc install-man \ build build-common-prime build-common-pre build-doc \ source_dist \ test clean \ clean-% test-% build-% install-% \ tags \ infiles .SECONDARY: node/Build master/Build plugins/Build .SUFFIXES: .java .class # This HAS to be the 1st rule default: build .java.class: $(JC) -sourcepath plugins/javalib -d build/plugins/javalib $(JFLAGS) plugins/javalib/$(subst plugins/javalib/,,$*.java) uninstall: echo "Uninstall is not implemented yet" # This removes the installed config so that the next install-pass installs # a new config. Target _only_ suitable for maintainers. unconfig: rm -f $(HTMLDIR)/.htaccess rm -f $(CONFDIR)/munin.conf tags: -rm -f TAGS find master common -type f | egrep -v '/(build/|_build/|blib/|\.svn/)' | grep -v '\.t$$' | fgrep -v '~' | xargs etags -l perl -a ###################################################################### install: install-master-prime install-common-prime install-node-prime install-plugins-prime $(JAVA_INSTALL) install-man install-async-prime install-pre: Makefile Makefile.config @$(CHECKUSER) mkdir -p $(LOGDIR) mkdir -p $(STATEDIR) mkdir -p $(SPOOLDIR) mkdir -p $(CONFDIR) $(CHOWN) $(USER) $(LOGDIR) $(STATEDIR) $(SPOOLDIR) install-master-prime: $(INFILES_MASTER) install-pre install-master mkdir -p $(CONFDIR)/templates mkdir -p $(CONFDIR)/static mkdir -p $(CONFDIR)/templates/partial mkdir -p $(CONFDIR)/munin-conf.d mkdir -p $(LIBDIR) mkdir -p $(BINDIR) mkdir -p $(PERLLIB) mkdir -p $(PERLLIB)/Munin/Master mkdir -p $(HTMLDIR) mkdir -p $(DBDIR) mkdir -p $(DBDIR)/cgi-tmp mkdir -p $(CGIDIR) $(CHOWN) $(USER) $(HTMLDIR) $(DBDIR) $(CHMOD) 0755 $(DBDIR) $(CHOWN) $(CGIUSER) $(DBDIR)/cgi-tmp $(CHMOD) 0755 $(DBDIR)/cgi-tmp for p in master/www/*.tmpl ; do \ $(INSTALL) -m 0644 "$$p" $(CONFDIR)/templates/ ; \ done for p in master/static/* ; do \ $(INSTALL) -m 0644 "$$p" $(CONFDIR)/static/ ; \ done for p in master/www/partial/*.tmpl; do \ $(INSTALL) -m 0644 "$$p" $(CONFDIR)/templates/partial/ ; \ done $(INSTALL) -m 0644 master/DejaVuSansMono.ttf $(LIBDIR)/ $(INSTALL) -m 0644 master/DejaVuSans.ttf $(LIBDIR)/ test -f $(HTMLDIR)/.htaccess || $(INSTALL) -m 0644 build/master/www/munin-htaccess $(HTMLDIR)/.htaccess test -f "$(CONFDIR)/munin.conf" || $(INSTALL) -m 0644 build/master/munin.conf $(CONFDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-cron $(BINDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-check $(BINDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-update $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-html $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-graph $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-limits $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-datafile2storable $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-storable2datafile $(LIBDIR)/ $(INSTALL) -m 0755 build/master/_bin/munin-cgi-graph $(CGIDIR)/munin-cgi-graph $(INSTALL) -m 0755 build/master/_bin/munin-cgi-html $(CGIDIR)/munin-cgi-html # Not ready to be installed yet # $(INSTALL) -m 0755 build/master/_bin/munin-gather $(LIBDIR)/ # ALWAYS DO THE OS SPECIFIC PLUGINS LAST! THAT WAY THEY OVERWRITE THE # GENERIC ONES install-node-plugins: install-plugins-prime # Some HP-UX plugins needs *.adv support files in LIBDIR ifneq ($(OSTYPE),hp-ux) HPUXONLY=true || endif install-plugins-prime: install-plugins build $(PLUGINS) Makefile Makefile.config @$(CHECKGROUP) mkdir -p $(CONFDIR)/plugins mkdir -p $(CONFDIR)/plugin-conf.d mkdir -p $(LIBDIR)/plugins mkdir -p $(PLUGSTATE) $(CHOWN) root:root $(PLUGSTATE) $(CHMOD) 0755 $(PLUGSTATE) $(CHMOD) 0755 $(CONFDIR)/plugin-conf.d for p in build/plugins/node.d/* build/plugins/node.d.$(OSTYPE)/* ; do \ if test -f "$$p" ; then \ echo Installing $$p; \ $(INSTALL) -m 0755 $$p $(LIBDIR)/plugins/; \ fi \ done $(HPUXONLY) mv $(LIBDIR)/plugins/*.adv $(LIBDIR) $(INSTALL) -m 0644 build/plugins/plugins.history $(LIBDIR)/plugins/ $(INSTALL) -m 0644 build/plugins/plugin.sh $(LIBDIR)/plugins/ install-plugins-java: build-plugins-java mkdir -p $(JAVALIBDIR) $(INSTALL) -m 0644 build/plugins/javalib/munin-jmx-plugins.jar $(JAVALIBDIR)/ mkdir -p $(LIBDIR)/plugins for p in build/plugins/node.d.java/*; do \ if test -f "$$p" ; then \ echo Installing $$p; \ $(INSTALL) -m 0755 $$p $(LIBDIR)/plugins/; \ fi \ done #TODO: # configure plugins. Or not. Better done under the direction of the installer # or the packager. install-async-prime: install-async install-async: mkdir -p $(LIBDIR) $(INSTALL) -m 0755 build/node/_bin/munin-async $(LIBDIR)/ $(INSTALL) -m 0755 build/node/_bin/munin-asyncd $(LIBDIR)/ install-node-prime: install-node-pre install-node install-node-pre: build/node/munin-node.conf install-pre test -f "$(CONFDIR)/munin-node.conf" || $(INSTALL) -m 0644 build/node/munin-node.conf $(CONFDIR)/ install-common-prime: build-common install-common install-man: build-man Makefile Makefile.config mkdir -p $(MANDIR)/man1 $(MANDIR)/man5 $(MANDIR)/man8 $(INSTALL) -m 0644 build/doc/munin-node.conf.5 $(MANDIR)/man5/ $(INSTALL) -m 0644 build/doc/munin.conf.5 $(MANDIR)/man5/ $(INSTALL) -m 0644 build/doc/munin-update.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin-limits.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin-graph.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin-html.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin-cron.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin-check.8 $(MANDIR)/man8/ $(INSTALL) -m 0644 build/doc/munin.8 $(MANDIR)/man8/ install-doc: build-doc mkdir -p $(DOCDIR)/resources $(INSTALL) -m 0644 README $(DOCDIR)/ $(INSTALL) -m 0644 COPYING $(DOCDIR)/ $(INSTALL) -m 0644 build/resources/* $(DOCDIR)/resources ###################################################################### # Dummy rule to enable parallel building infiles: $(INFILES) build: infiles build-master build-common-prime build-node build-plugins $(JAVA_BUILD) build-man substitute-confvar-inline build/%: %.in @echo "$< -> $@" @mkdir -p build/`dirname $<` @sed -e 's|@@PREFIX@@|$(PREFIX)|g' \ -e 's|@@CONFDIR@@|$(CONFDIR)|g' \ -e 's|@@BINDIR@@|$(BINDIR)|g' \ -e 's|@@SBINDIR@@|$(SBINDIR)|g' \ -e 's|@@DOCDIR@@|$(DOCDIR)|g' \ -e 's|@@LIBDIR@@|$(LIBDIR)|g' \ -e 's|@@MANDIR@@|$(MANDIR)|g' \ -e 's|@@LOGDIR@@|$(LOGDIR)|g' \ -e 's|@@HTMLDIR@@|$(HTMLDIR)|g' \ -e 's|@@DBDIR@@|$(DBDIR)|g' \ -e 's|@@STATEDIR@@|$(STATEDIR)|g' \ -e 's|@@SPOOLDIR@@|$(SPOOLDIR)|g' \ -e 's|@@PERL@@|$(PERL)|g' \ -e 's|@@PERLLIB@@|$(PERLLIB)|g' \ -e 's|@@PYTHON@@|$(PYTHON)|g' \ -e 's|@@RUBY@@|$(RUBY)|g' \ -e 's|@@JAVARUN@@|$(JAVARUN)|g' \ -e 's|@@JAVALIBDIR@@|$(JAVALIBDIR)|g' \ -e 's|@@OSTYPE@@|$(OSTYPE)|g' \ -e 's|@@HOSTNAME@@|$(HOSTNAME)|g' \ -e 's|@@MKTEMP@@|$(MKTEMP)|g' \ -e 's|@@VERSION@@|$(VERSION)|g' \ -e 's|@@PLUGSTATE@@|$(PLUGSTATE)|g' \ -e 's|@@CGIDIR@@|$(CGIDIR)|g' \ -e 's|@@USER@@|$(USER)|g' \ -e 's|@@GROUP@@|$(GROUP)|g' \ -e 's|@@PLUGINUSER@@|$(PLUGINUSER)|g' \ -e 's|@@GOODSH@@|$(GOODSH)|g' \ -e 's|@@BASH@@|$(BASH)|g' \ -e 's|@@HASSETR@@|$(HASSETR)|g' \ $< > $@; build-common-prime: build-common-pre common/blib/lib/Munin/Common/Defaults.pm build-common substitute-confvar-inline: @perl -p -i -e 's|\@\@PREFIX\@\@|$(PREFIX)|g;' \ -e 's|\@\@CONFDIR\@\@|$(CONFDIR)|g;' \ -e 's|\@\@BINDIR\@\@|$(BINDIR)|g;' \ -e 's|\@\@SBINDIR\@\@|$(SBINDIR)|g;' \ -e 's|\@\@DOCDIR\@\@|$(DOCDIR)|g;' \ -e 's|\@\@LIBDIR\@\@|$(LIBDIR)|g;' \ -e 's|\@\@MANDIR\@\@|$(MANDIR)|g;' \ -e 's|\@\@LOGDIR\@\@|$(LOGDIR)|g;' \ -e 's|\@\@HTMLDIR\@\@|$(HTMLDIR)|g;' \ -e 's|\@\@DBDIR\@\@|$(DBDIR)|g;' \ -e 's|\@\@STATEDIR\@\@|$(STATEDIR)|g;' \ -e 's|\@\@SPOOLDIR\@\@|$(SPOOLDIR)|g;' \ -e 's|\@\@PERL\@\@|$(PERL)|g;' \ -e 's|\@\@PERLLIB\@\@|$(PERLLIB)|g;' \ -e 's|\@\@PYTHON\@\@|$(PYTHON)|g;' \ -e 's|\@\@RUBY\@\@|$(RUBY)|g;' \ -e 's|\@\@JAVARUN\@\@|$(JAVARUN)|g;' \ -e 's|\@\@JAVALIBDIR\@\@|$(JAVALIBDIR)|g;' \ -e 's|\@\@OSTYPE\@\@|$(OSTYPE)|g;' \ -e 's|\@\@HOSTNAME\@\@|$(HOSTNAME)|g;' \ -e 's|\@\@MKTEMP\@\@|$(MKTEMP)|g;' \ -e 's|\@\@VERSION\@\@|$(VERSION)|g;' \ -e 's|\@\@PLUGSTATE\@\@|$(PLUGSTATE)|g;' \ -e 's|\@\@CGIDIR\@\@|$(CGIDIR)|g;' \ -e 's|\@\@USER\@\@|$(USER)|g;' \ -e 's|\@\@GROUP\@\@|$(GROUP)|g;' \ -e 's|\@\@PLUGINUSER\@\@|$(PLUGINUSER)|g;' \ -e 's|\@\@GOODSH\@\@|$(GOODSH)|g;' \ -e 's|\@\@BASH\@\@|$(BASH)|g;' \ -e 's|\@\@HASSETR\@\@|$(HASSETR)|g;' \ ./master/blib/libdoc/Munin::Master::HTMLOld.3pm \ ./master/blib/lib/Munin/Master/HTMLOld.pm \ ./node/blib/sbin/munin-node-configure \ ./node/blib/sbin/munin-node \ ./node/blib/sbin/munin-run \ ./node/blib/sbin/munin-sched \ ./build/doc/munin-node.conf.5 build-common-pre: common/Build cd common && $(PERL) Build code common/blib/lib/Munin/Common/Defaults.pm: common/lib/Munin/Common/Defaults.pm build-common-pre rm -f common/blib/lib/Munin/Common/Defaults.pm $(PERL) -pe 's{(PREFIX \s+=\s).*}{\1q{$(PREFIX)};}x; \ s{(CONFDIR \s+=\s).*}{\1q{$(CONFDIR)};}x; \ s{(BINDIR \s+=\s).*}{\1q{$(BINDIR)};}x; \ s{(SBINDIR \s+=\s).*}{\1q{$(SBINDIR)};}x; \ s{(DOCDIR \s+=\s).*}{\1q{$(DOCDIR)};}x; \ s{(LIBDIR \s+=\s).*}{\1q{$(LIBDIR)};}x; \ s{(MANDIR \s+=\s).*}{\1q{$(MANDIR)};}x; \ s{(LOGDIR \s+=\s).*}{\1q{$(LOGDIR)};}x; \ s{(HTMLDIR \s+=\s).*}{\1q{$(HTMLDIR)};}x; \ s{(DBDIR \s+=\s).*}{\1q{$(DBDIR)};}x; \ s{(STATEDIR \s+=\s).*}{\1q{$(STATEDIR)};}x; \ s{(SPOOLDIR \s+=\s).*}{\1q{$(SPOOLDIR)};}x; \ s{(PERL \s+=\s).*}{\1q{$(PERL)};}x; \ s{(PERLLIB \s+=\s).*}{\1q{$(PERLLIB)};}x; \ s{(PYTHON \s+=\s).*}{\1q{$(PYTHON)};}x; \ s{(RUBY \s+=\s).*}{\1q{$(RUBY)};}x; \ s{(OSTYPE \s+=\s).*}{\1q{$(OSTYPE)};}x; \ s{(HOSTNAME \s+=\s).*}{\1q{$(HOSTNAME)};}x; \ s{(MKTEMP \s+=\s).*}{\1q{$(MKTEMP)};}x; \ s{(VERSION \s+=\s).*}{\1q{$(VERSION)};}x; \ s{(PLUGSTATE \s+=\s).*}{\1q{$(PLUGSTATE)};}x; \ s{(CGIDIR \s+=\s).*}{\1q{$(CGIDIR)};}x; \ s{(USER \s+=\s).*}{\1q{$(USER)};}x; \ s{(GROUP \s+=\s).*}{\1q{$(GROUP)};}x; \ s{(PLUGINUSER \s+=\s).*}{\1q{$(PLUGINUSER)};}x; \ s{(GOODSH \s+=\s).*}{\1q{$(GOODSH)};}x; \ s{(BASH \s+=\s).*}{\1q{$(BASH)};}x; \ s{(HASSETR \s+=\s).*}{\1q{$(HASSETR)};}x;' \ $< > $@ build-doc: build-doc-stamp Makefile Makefile.config build-doc-stamp: touch build-doc-stamp mkdir -p build/doc build-man: build-man-stamp Makefile Makefile.config build-man-stamp: touch build-man-stamp mkdir -p build/doc for f in $(MAN8); do \ pod2man --section=8 --release=$(RELEASE) --center=$(MANCENTER) build/"$$f" > build/doc/`basename $$f`.8; \ done for f in $(PODMAN8); do \ pod2man --section=8 --release=$(RELEASE) --center=$(MANCENTER) "$$f".pod > build/doc/`basename $$f .pod`.8; \ done for f in $(PODMAN5); do \ pod2man --section=5 --release=$(RELEASE) --center=$(MANCENTER) "$$f".pod > build/doc/`basename $$f .pod`.5; \ done build-plugins-java: build/plugins/javalib/munin-jmx-plugins.jar build/plugins/javalib/munin-jmx-plugins.jar: $(CLASSFILES) cd build/plugins/javalib && $(JAR) cf munin-jmx-plugins.jar org/munin/plugin/jmx build-java-stamp: mkdir -p build/plugins/javalib touch build-java-stamp build/%.class: %.class build-java-stamp @echo "Compiling $*" ###################################################################### # DIST RULES tar: git archive --prefix=munin-$(RELEASE)/ --format=tar --output ../munin-$(RELEASE).tar HEAD mkdir -p munin-$(RELEASE)/ echo $(RELEASE) > munin-$(RELEASE)/RELEASE tar rf ../munin-$(RELEASE).tar --owner=root --group=root munin-$(RELEASE)/RELEASE rm -rf munin-$(RELEASE) gzip -f -9 ../munin-$(RELEASE).tar suse-pre: (! grep MAINTAINER Makefile.config) @for file in `find dists/suse/ -type f -name '*.in'`; do \ destname=`echo $$file | sed 's/.in$$//'`; \ echo Generating $$destname..; \ sed -e 's|@@VERSION@@|$(VERSION)|g' \ $$file > $$destname; \ done -cp dists/tarball/plugins.conf . # (cd ..; ln -s munin munin-$(VERSION)) suse: suse-pre tar -C .. --dereference --exclude .svn -cvzf ../munin_$(RELEASE).tar.gz munin-$(VERSION)/ (cd ..; rpmbuild -tb munin-$(RELEASE).tar.gz) suse-src: suse-pre tar -C .. --dereference --exclude .svn -cvzf ../munin_$(RELEASE).tar.gz munin-$(VERSION)/ (cd ..; rpmbuild -ts munin-$(RELEASE).tar.gz) source_dist: clean (! grep MAINTAINER Makefile.config) (cd .. && ln -s $(DIR) munin-$(VERSION)) tar -C .. --dereference --exclude .svn -cvzf ../munin_$(RELEASE).tar.gz munin-$(VERSION)/ (cd .. && rm munin-$(VERSION)) ###################################################################### ifeq ($(MAKELEVEL),0) clean: clean-node clean-master clean-plugins clean-common else clean: endif -rm -rf build -rm -f build-stamp -rm -f build-doc-stamp -rm -f build-man-stamp -rm -f build-java-stamp -rm -rf t/install -rm -f dists/redhat/munin.spec -rm -f dists/suse/munin.spec ###################################################################### test: test-common test-master test-node test-plugins ifeq ($(MAKELEVEL),0) # Re-exec make with the test config old-test: t/*.t $(MAKE) $@ CONFIG=t/Makefile.config else test_plugins = id_default id_root env old-test: t/*.t t/install $(addprefix $(CONFDIR)/plugins/,$(test_plugins)) @for test in t/*.t; do \ echo -n "$$test: "; \ PERL5LIB=$(PERLLIB) $(PERL) $$test;\ done endif node-monkeywrench: install-node rm -rf $(CONFDIR)/plugins rm -rf $(LIBDIR)/plugins mkdir -p $(LIBDIR)/plugins mkdir -p $(CONFDIR)/plugins cp monkeywrench/plugin-break*_ $(LIBDIR)/plugins/ $(SBINDIR)/munin-node-configure --suggest echo 'Done?' t/install: $(MAKE) clean install-node-prime install-node-plugins CONFIG=t/Makefile.config INSTALL_PLUGINS=test ###################################################################### # This builds */Build from Build.PL %/Build: %/Build.PL cd $* && $(PERL) Build.PL build-%: %/Build cd $* && $(PERL) Build build-common: common/Build # BUG: the Build script writes files under PWD when it does "install" # can't seem to find a way to persuade it to write otherwhere. install-%: %/Build cd $* && $(PERL) Build install \ --install_path lib=$(PERLLIB) \ --install_path bin=$(BINDIR) \ --install_path script=$(BINDIR) \ --install_path sbin=$(SBINDIR) \ --install_path bindoc=$(MANDIR)/man1 \ --install_path libdoc=$(MANDIR)/man3 \ test-%: %/Build cd $* && $(PERL) Build test --verbose=0 || true clean-%: %/Build common/blib/lib/Munin/Common/Defaults.pm cd $* && $(PERL) Build realclean munin-2.0.25/Makefile.config000066400000000000000000000152051243472346000156420ustar00rootroot00000000000000# -*- makefile -*- # # This is the Makefile.config file to use for a "clean" distribution. # # This file specifies where Munin will look for things after you've # run 'make' in the source directory. Modify it to suit your needs. # DESTDIR is meant only for use when making Munin packages. Unless # you're doing packaging do NOT set it. # DESTDIR is empty during building, and optionally set to point to # a shadow tree during make install. # Note: There is a need for a VARDIR, with DBDIR, PLUGSTATE, HTMLDIR # and LOGDIR as subdirectories. Today, DBDIR contains configured # domains, as well as PLUGSTATE, and we risk collisions. # # the base of the Munin installation. # PREFIX = $(DESTDIR)/opt/munin # Where Munin keeps its configurations (server.conf, client.conf, ++) CONFDIR = $(DESTDIR)/etc/opt/munin # Server only - where to put munin-cron BINDIR = $(PREFIX)/bin # Client only - where to put munin-node, munin-node-configure, and munin-run SBINDIR = $(PREFIX)/sbin # Where to put text and html documentation DOCDIR = $(PREFIX)/doc # Where to put man pages MANDIR = $(PREFIX)/man # Where to put internal binaries and plugin repository LIBDIR = $(PREFIX)/lib # Server only - Output directory HTMLDIR = $(PREFIX)/www/docs CGIDIR = $(PREFIX)/www/cgi # Where to put internal data for master (RRD, internal files, ...) DBDIR = $(DESTDIR)/var/opt/munin # Where to put internal data for node (plugin state, ...) DBDIRNODE = $(DESTDIR)/var/opt/munin-node # Client only - Where the spool files are written. Must be writable by # group "munin", and should be preserved between reboots SPOOLDIR = $(DBDIR)/spool # Client only - Where plugins should put their states. Must be writable by # group "munin", and should be preserved between reboots PLUGSTATE = $(DBDIRNODE)/plugin-state # Where Munin should place its logs. LOGDIR = $(PREFIX)/log/munin # Location of PID files and other statefiles. On the server, must be # writable by the user "munin". STATEDIR = $(DESTDIR)/var/run/munin # The perl interpreter to use PERL := $(shell which perl) # The python interpreter to use (used by some plugins) PYTHON := /usr/bin/env python # The ruby interpreter to use (used by some plugins) RUBY := /usr/bin/env ruby # The java runtime to use (used by some plugins) JAVARUN := /usr/bin/java # The java library dir to use (used by some plugins) # this is needed in order to be able to install # java libraries in a custom location. Many distrubutions # enforce a spesific location for java libraries. JAVALIBDIR = $(LIBDIR) # A modern (posix) shell. We're not looking for arrays, but $() and # other modern stuff is expected. On a posix-system the expression # below will find the right shell. Most Unixes released the last 10 # years are POSIX compliant enough for this to work (he said bravely). # # On Linux /bin/sh, SunOS/Solaris /usr/xpg4/bin/sh or /bin/ksh # In general: bash or ksh will work # GOODSH := $(shell PATH=`getconf PATH 2>/dev/null || echo $(PATH)` LANG=C sh -c 'type sh | sed "s/.* //"') # Path of bash for bash specific plugins BASH := /bin/bash # Server only - Where to install the perl libraries PERLSITELIB := $(shell $(PERL) -V:sitelib | cut -d"'" -f2) PERLLIB = $(DESTDIR)$(PERLSITELIB) # Client only - Install plugins for this architecture # the LANG=C makes tr work as expected, not regarding any locale it # isn't done globally to enable users to have as much localized # errors as possible OSTYPE := $(shell uname | LANG=C tr '[A-Z]' '[a-z]' | cut -f 1 -d _) # How to figure out the hostname. (Only used in default configuration # files) HOSTNAME := $(shell hostname) # What is the safest way to create a tempfile. # Default is to figure it out by testing various methods. # Replace this with a known platform-specific method MKTEMP := $(shell ./test-mktemp) # Munin version number. VERSION := $(shell ./getversion) # User to run munin as USER := munin GROUP := munin # Default user to run the plugins as PLUGINUSER := nobody # Default user to run the cgi as CGIUSER := nobody # Which command to use to check if the USER and GROUP to run Munin as, exists. # These will work on most modern OSes: # GETENT := $(shell which getent || which true 2>/dev/null) CHECKUSER := $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) CHECKGROUP := $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) # For OSX, comment out the previous two lines and comment in these # #CHECKUSER := $(shell nicl . -read /users/$(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) #CHECKGROUP := $(shell nicl . -read /groups/$(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) # For OSX 10.5 (Leopard), use the following two lines instead of what's above # #CHECKUSER := $(shell dscl . -read /Users/$(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) #CHECKGROUP := $(shell dscl . -read /Groups/$(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) # For HP-UX, use these instead: # #CHECKUSER := $(shell pwget -n $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) #CHECKGROUP := $(shell grget -n $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) # For Cygwin, use these instead: #CHECKUSER := $(shell id $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) #CHECKGROUP := $(shell grep ^$(GROUP): /etc/group >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) CHOWN := chown CHMOD := chmod CHGRP := chgrp # Java compiler stuff - only needed on the buildhost JC := javac JFLAGS := -g -source 1.5 -target 1.5 -Xlint JAR := jar # Check if the java compiler works # Note that we defer JCVALID evaluation to runtime, # since $(JC) can be redefined later in a specific Makefile.config # The core Makefile.config is then used as a Makefile.default JCVALID = $(shell $(JC) -version >/dev/null 2>/dev/null && echo "yes") # Check whether setruid functionality can be used HASSETR := $(shell perl -e 'use Config; my @vars=("d_setruid", "d_setreuid", "d_setresuid"); foreach my $$var (@vars) { if ($$Config{$$var} eq "define") { print "1\n"; exit 0; } } print "0\n"; exit 0;' ) munin-2.0.25/Makefile.config-maint000066400000000000000000000071051243472346000167500ustar00rootroot00000000000000# -*- makefile -*- # # MAINTAINER VERSION OF Makefile.config # # This file is used by the maintainer for testing and only necessarily # works on the maintainers machines. Please see Makefile.config-dist # for the user directed Makefile.config as directed in the INSTALL doc. # # $Id: Makefile.config 1551 2008-03-06 20:16:51Z janl $ # This file specifies where Munin will look for things after you've # run 'make' in the source directory. Modify it to suit your needs. # DESTDIR is meant only for use when making Munin packages. Unless # you're doing packaging do NOT set it. # DESTDIR is empty during building, and optionally set to point to # a shadow tree during make install. # Include the default config include Makefile.config-dist # Then override PREFIX = $(DESTDIR)/usr CONFDIR = $(DESTDIR)/etc/munin DOCDIR = $(PREFIX)/share/doc/munin MANDIR = $(PREFIX)/share/man # Where to put internal binaries and plugin repository LIBDIR = $(PREFIX)/share/munin # Server only - Output directory HTMLDIR = $(DESTDIR)/var/www/munin CGIDIR = $(HTMLDIR)/../cgi # Client only - Where to put RRD files and other intenal data DBDIR = $(DESTDIR)/var/lib/munin # Client only - Where plugins should put their states. Must be writable by # group "munin", and should be preserved between reboots PLUGSTATE = $(DBDIR)/plugin-state # Where Munin should place its logs. LOGDIR = $(DESTDIR)/var/log/munin # Location of PID files and other statefiles. On the server, must be # writable by the user "munin". STATEDIR = $(DESTDIR)/var/run/munin # The perl interpreter to use PERL := $(shell which perl) # The python interpreter to use (used by some plugins) PYTHON := /usr/bin/env python # The ruby interpreter to use (used by some plugins) RUBY := /usr/bin/env ruby # The java runtime to use (used by some plugins) JAVARUN := /usr/bin/java # A modern shell. We're not looking for arrays, but $() and other modern # stuff is expected. # Linux: /bin/bash # SunOS/Solaris: /usr/xpg4/bin/sh or /bin/ksh # In general: bash or ksh will work GOODSH := /bin/bash # Path of bash for bash specific plugins BASH := /bin/bash # Server only - Where to install the perl libraries PERLSITELIB := $(shell $(PERL) -V:sitelib | cut -d"'" -f2) PERLLIB = $(DESTDIR)$(PERLSITELIB) # Client only - Install plugins for this architecture OSTYPE := $(shell uname | tr '[A-Z]' '[a-z]') # How to figure out the hostname. (Only used in default configuration # files) HOSTNAME := $(shell hostname) # What is the safest way to create a tempfile. # Default is to figure it out by testing various methods. # Replace this with a known platform-specific method MKTEMP := $(shell ./test-mktemp) # Munin version number. VERSION := $(shell ./getversion) # User to run munin as USER := munin GROUP := munin # Default user to run the plugins as PLUGINUSER := nobody # Which command to use to check if the USER and GROUP to run Munin as, exists. GETENT := $(shell which getent || which true 2>/dev/null) CHECKUSER := $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) CHECKGROUP := $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) CHOWN := chown CHMOD := chmod CHGRP := chgrp # Java compiler stuff - only needed on the buildhost JC := javac JFLAGS := -g JAR := jar # Check if the java compiler works JCVALID := $(shell $(JC) -version >/dev/null 2>/dev/null && echo "yes") munin-2.0.25/README000066400000000000000000000004361243472346000136160ustar00rootroot00000000000000This is Munin. Munin is distributed under the GNU GPL version 2. Munin is copyrighted 2002-2012 by its various authors as identified in the source files. Munin is homed at http://munin-monitoring.org/. After you have completed the INSTALL all the documentation can be found there. munin-2.0.25/README.HP-UX000066400000000000000000000010301243472346000144450ustar00rootroot00000000000000There is a somewhat ragged set of contributed HP-UX specific plugins requiering various licenses. We hope for further contributions to make the HP-UX support more complete. Please note that Makefile.config needs editing almost at the very end to work, the sections are commented. You will also need GNU Make which you can find here: Europe: http://hpux.asknet.de/hppd/hpux/Gnu/make-3.81/ US and other places: http://hpux.cs.utah.edu/hppd/hpux/Gnu/make-3.81/ Many thanks to Ralph Grothe for the contributions towards HP-UX support. munin-2.0.25/README.OSX000066400000000000000000000017641243472346000142730ustar00rootroot00000000000000Here's a howto on adding the users in the first place: bash-3.2# dscl . create /Groups/munin PrimaryGroupId 4949 bash-3.2# dscl . create /Users/munin UniqueId 4949 bash-3.2# dscl . create /Users/munin PrimaryGroupId 4949 bash-3.2# dscl . create /Users/munin UserShell /bin/false bash-3.2# dscl . create /Users/munin NFSHomeDirectory /nohome bash-3.2# dscl . create /Users/munin RealName Munin bash-3.2# dscl . create /Groups/munin GroupMembership munin bash-3.2# dscl . -read /Users/munin dsAttrTypeNative:PrimaryGroupId: 4949 dsAttrTypeNative:UniqueId: 4949 AppleMetaNodeLocation: /Local/Default GeneratedUID: 2A56D7FE-00D0-4B81-BAE7-F842E675031D NFSHomeDirectory: /nohome RealName: Munin RecordName: munin RecordType: dsRecTypeStandard:Users UserShell: /bin/false bash-3.2# dscl . -read /Groups/munin dsAttrTypeNative:PrimaryGroupId: 4949 AppleMetaNodeLocation: /Local/Default GeneratedUID: F53ACCA3-2CB9-440F-84A6-E2FADC44CB9E GroupMembership: munin RecordName: munin RecordType: dsRecTypeStandard:Groups munin-2.0.25/UPGRADING000066400000000000000000000052761243472346000142100ustar00rootroot00000000000000Upgrading to 2.0 ================ Upgrading from the Munin 1.4 series to 2.0 should be quite easy. But there are some things to take note of if you want a very smooth transition. The most important change is the CGI requirement. * Munin graphs can now generated on-demand by the web server. It is mandatory for the new zooming feature. The cron "munin-graph" is still the default, as it really ease new install and upgrading for small setups. Going the CGI road is recommended way if you experience performance issues with the cron setup. * Munin html pages may be generated on-demand by the web server. The default is still to run "munin-html" from cron after every update. If you install from SVN or tar ball please make sure you read the INSTALL file VERY carefuly. If you install from a packaged (DEB, RPM, ...) version, please make sure you read the specific INSTALL file VERY carefuly, as there might be some particularities. From Munin 1.4 ------------------------- Based on comparisons of test Munin installations on Linux we see identical rrd file names, and rrd files are created and structured the same way as before. This ensures that your data history is preserved. Upgrading to 2.0 should therefore prove to be straightforward and cause no data loss. BUT, as hard as we tried, there might be a few exceptions, so YMMV. In terms of ordering I would upgrade the master first. If you do not use a packaging system you may have to look around for old .pm files and purge them to get 2.0 work propperly. Do NOT purge the RRD files or the configuration. After the master is upgraded upgrade the nodes one by one. Please see notes about changes in plugin and data-field names in the sections below before you start upgrading the nodes. And as one said in IRC, an old munin proverb is : "Wait two munin fetch rounds before you can expect to see results." It is specially true when upgrading as the config files should auto-update themselves, but it might take up to 2 iteration of munin-cron to be really sorted out. From Munin 1.2 ---------------- If you still have munin-nodes running 1.2, there is no need to rush as polling 1.2 nodes from a 2.0 master is well supported. Upgrade master straight from 1.2 isn't supported, but should work mostly well as 2.0 is highly 1.4-compatible. But be sure to read UPGRADING-1.4 to look at specific issues from 1.2. Rollback ---------- Thanks to the highly 1.4-compatible status of 2.0, and our PnP-way of doing things, rollbacking the install is very easy : just reinstall 1.4 and remove all the *.storable files from /var/lib/munin. But don't touch the .rrd as they ARE your history. Then wait again for 2 munin-cron runs, and the rollback should be complete. munin-2.0.25/UPGRADING-1.4000066400000000000000000000104321243472346000144760ustar00rootroot00000000000000Upgrading to 1.4 ================ Upgrading from the Munin 1.2 series to 1.4 should be quite easy. But there are some things to take note of if you want a very smooth transition. If you install from SVN or tar ball please make sure you read the INSTALL file VERY carefuly. There are new package dependencies and some bugs in the install process are noted there. From Munin 1.2 in general ------------------------- Based on comparisons of a few (very few) Munin installations on Linux we see identical rrd file names, and rrd files are created and structured the same way as before. This ensures that your data history is preserved. Upgrading to 1.4 should therefore prove to be straightforward and cause no data loss. BUT! There are a few exceptions noted below. In terms of ordering I would upgrade the master first. If you do not use a packaging system you may have to look around for old .pm files and purge them to get 1.4 to work propperly. Do NOT purge the RRD files or the configuration. After the master is upgraded upgrade the nodes one by one. Please see notes about changes in plugin and data-field names in the sections below before you start upgrading the nodes. Changes in default paths ------------------------ If you do not use a packaging system please review Makefile.config and after doing "make" the example munin.conf and note changes in default paths, which you may or may not like, and if you do not keep the new default htmldir you may want to edit Makefile.config, or alternatively take a look at the .htaccess file installed in the default htmldir to restrict public access to your munin (as described in the INSTALL file) From Munin 1.2.6 ---------------- If you have munin-nodes running 1.2.6 then some of the plugins use short (truncated) field names. Especially the Linux df plugin will be using truncated fieldnames for some disk devices. This is due to a basing a bug fix on obsolete documentation. The device names were limited to 19 characters, only the 19 last characters of the device name was used. This truncation is done by the plugin on the node. When the plugin/node is upgraded the truncation stops. There is no really reliable way to fix this or migrate automatically. What you can do is install 1.4.0 on one node at a time, and for each upgrade examine your rrd file names. You should be able to identify rrd files for the upgraded node that have nearly identical names. Personally I would use a graphical file browser for this. If you find two files that should be one then the one with the longest filename should be newest, and the one with the short file name should not have been updated since the node upgrade. Rename the file with the short name so that it has the long name. On Solaris ---------- Some plugin renamings to get the name aligned with the other platforms: - if_errcoll_ is now called if_err_ - fs_df is now called df - fs_inodes is now called df_inodes You can simply rename the rrd files according to this (or you can rename the plugins, but that will be a uphill battle, they'll be renamed back when you upgrade the next time). Note that the plugins will change names as you upgrade and auto-configure your nodes, not when you upgrade the munin-master. Users of Munin 1.2 in combination with NMSes -------------------------------------------- There are two issues that have been reported. Users of Munin in combination with Nagios have reported that because some graphs have changed their "graph_title" setting this dis-associates the tests from the right nagios checks. Also some plugins do not have default warning and critical levels set any more (e.g. "load") because the opinions on what is "normal" load differs widely. This means that the plugins will not send warning and critical events to contacts any more. The warning and critical levels should be settable for all of these plugins, please use the command "munindoc " on the host where the plugin is installed to see how to set these levels. Too audit the differences in warning and critical levels you can make a copy of the munin file called "datafile" before upgrading (or get one from backup), and use egrep to get a listing of the settings prior to update: egrep '(warning|critical)' datafile.old and again on the post-upgrade datafile to compare the lists so you can specify the ones you need. munin-2.0.25/authors000066400000000000000000000037161243472346000143520ustar00rootroot00000000000000agx = Guido Guenther arhont = Andrei Mikhailovsky auduny = Audun Ytterdal ay = Audun Ytterdal bjorn = Bjørn Ruberg bldewolf = Brian De Wolf feiner.tom = Tom Feiner haraldk = Harald Korneliussen holger = Holger Levsen ilmari = Dagfin Ilmari MansĂĽker ingvar = Ingvar Hagelund janl = Nicolai Langfeldt jimmyo = Jimmy Olsen jo = Jimmy Olsen joar = Joar Jegleim jorne = Jorne Kandziora kenyon = Kenyon Ralph kjellm = Kjell-Magne Øierud kjetilho = Kjetil Torgrim Homme knan = Erik I. Bolsø knuthaug = Knut Haugen kristian = Kristian Lyngstøl ligne = Matthew Boyle lkoberstein = Luke Koberstein loic = Loic Dachary (OuoU) lupe = Lupe Christoph matthias = Matthias Schmitz mha = Magnus Hagander niemann = Philipp Niemann qha = Ulrik Haugen runesk = Rune Nordbøe Skillingstad ssm = Stig Sandbeck Mathisen stabidlo = Rado Rovny steve.schnepp = Steve Schnepp tatjana = Tatjana Anderson tfheen = Tollef Fog Heen tore = Tore Anderson toreanderson = Tore Anderson tv = Trygve Vea zugschlus = Marc Haber (no author) = Automatic Commit munin-2.0.25/common/000077500000000000000000000000001243472346000142235ustar00rootroot00000000000000munin-2.0.25/common/Build.PL000066400000000000000000000006531243472346000155230ustar00rootroot00000000000000use Module::Build; my $build = Module::Build->new( dist_name => 'Munin::Common', dist_version => '0.0.0', dist_author => 'The Munin Team ', dist_abstract => 'Shared libraries for Munin Node and Munin Master', license => 'gpl', requires => {}, build_requires => {}, recommends => { 'Net::SSLeay' => 0, }, ); $build->create_build_script; munin-2.0.25/common/lib/000077500000000000000000000000001243472346000147715ustar00rootroot00000000000000munin-2.0.25/common/lib/Munin/000077500000000000000000000000001243472346000160575ustar00rootroot00000000000000munin-2.0.25/common/lib/Munin/Common/000077500000000000000000000000001243472346000173075ustar00rootroot00000000000000munin-2.0.25/common/lib/Munin/Common/Config.pm000066400000000000000000000067571243472346000210710ustar00rootroot00000000000000package Munin::Common::Config; # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); # Functions here are unable to log as they don't know if they're used # by the node or the master which use divergent logging facilities. # In fact, the list in %legal is only used by the master. my %legal = map { $_ => 1 } qw( address always_send category_order cdef cdef_name cgitmpdir cgiurl cgiurl_graph colour command compare contact contacts create_args critical dbdir domain_order draw dropdownlimit extinfo fetch_data filename fork graph graph graphable graph_args graph_args_after graph_category graph_data_size graph_future graph_height graph_info graph_noscale graph_order graph_period graph_printf graph_scale graph_sources graph_strategy graph_sums graph_title graph_total graph_vlabel graph_vtitle graph_width group_order host_name htaccess htmldir html_rename html_strategy includedir info label line local_address logdir max max_cgi_graph_jobs max_graph_jobs max_html_jobs max_messages max_processes max_size_x max_size_y min munin_cgi_graph_jobs nagios ncsa ncsa_config ncsa_server negative node_order notify_alias nsca nsca_config nsca_server num_messages num_unknowns ok onlynullcdef palette pipe pipe_command port predict process realname realservname rrdcached_socket rundir service_order skipdraw stack state staticdir sum text timeout tls tls_ca_certificate tls_certificate tls_match tls_pem tls_private_key tls_verify_certificate tls_verify_depth tmpldir trend type unknown unknown_limit update update_rate use_default_name use_node_name use_default_node version warn warning worker_start_delay ); my %bools = map { $_ => 1} qw(yes no true false on off 1 0); sub cl_is_keyword { # Class-less version of is_keyword for legacy code. my ($word) = @_; return defined $legal{$word}; } sub is_keyword { my ($self, $word) = @_; return defined $legal{$word}; } sub parse_config_from_file { my ($self, $config_file) = @_; $config_file ||= $self->{config_file}; open my $file, '<', $config_file or croak "ERROR: Cannot open '$config_file': $OS_ERROR"; # Note, parse_config is provided by node or master specific config class eval { $self->parse_config($file); }; if ($EVAL_ERROR) { croak "ERROR: Failed to parse config file '$config_file': $EVAL_ERROR"; } close $file or croak "Cannot close '$config_file': $OS_ERROR"; } sub _trim { # Trim leading and trailing whitespace. my $class = shift; chomp $_[0]; $_[0] =~ s/^\s+//; $_[0] =~ s/\s+$//; return; } # allows # characters to get through as long as they're escaped # with a backslash sub _strip_comment { my $class = shift; $_[0] =~ s/(?_looks_like_a_bool($str); return $str =~ m{\A no|false|off|0 \z}xi ? 0 : 1; } 1; __END__ =head1 NAME Munin::Common::Config - Abstract base class for common config code. =head1 SYNOPSIS Don't use it directly. See L and L. =head1 METHODS =over =item B $config->parse_config_from_file($file_name); Parses the configuration in $file_name. =back munin-2.0.25/common/lib/Munin/Common/Defaults.pm000066400000000000000000000044701243472346000214210ustar00rootroot00000000000000use warnings; use strict; # If you change the class path take a look in get_defaults too, please! package Munin::Common::Defaults; # $Id$ use English qw(-no_match_vars); use File::Basename qw(dirname); # This file's package variables are changed during the build process. # This variable makes only sense in development environment my $COMPONENT_ROOT = dirname(__FILE__) . '/../../..'; our $DROPDOWNLIMIT = 1; our $MUNIN_PREFIX = ''; our $MUNIN_CONFDIR = "$COMPONENT_ROOT/t/config/"; our $MUNIN_BINDIR = ''; our $MUNIN_SBINDIR = ''; our $MUNIN_DOCDIR = ''; our $MUNIN_LIBDIR = ''; our $MUNIN_HTMLDIR = ''; our $MUNIN_CGIDIR = ''; our $MUNIN_CGITMPDIR = ''; our $MUNIN_DBDIR = ''; our $MUNIN_PLUGSTATE = ''; our $MUNIN_SPOOLDIR = ''; our $MUNIN_MANDIR = ''; our $MUNIN_LOGDIR = "$COMPONENT_ROOT/log/"; our $MUNIN_STATEDIR = ''; our $MUNIN_USER = getpwuid $UID; our $MUNIN_GROUP = getgrgid $GID; our $MUNIN_PLUGINUSER = getpwuid $UID; our $MUNIN_VERSION = 'svn'; our $MUNIN_PERL = '/usr/bin/perl'; our $MUNIN_PERLLIB = ''; our $MUNIN_GOODSH = ''; our $MUNIN_BASH = ''; our $MUNIN_PYTHON = ''; our $MUNIN_RUBY = ''; our $MUNIN_OSTYPE = ''; our $MUNIN_HOSTNAME = ''; our $MUNIN_MKTEMP = ''; our $MUNIN_HASSETR = ''; sub get_defaults { my ($class) = @_; ## no critic no strict 'refs'; my $defaults = {}; for my $g (keys %{"Munin::Common::Defaults::"}) { next unless $g =~ /MUNIN_/; $defaults->{$g} = ${*$g{'SCALAR'}}; } ## use critic return $defaults; } sub export_to_environment { my ($class) = @_; my %defaults = %{$class->get_defaults()}; while (my ($k, $v) = each %defaults) { $ENV{$k} = $v; } return } 1; __END__ =head1 NAME Munin::Common::Defaults - Default values defined by installation scripts. =head1 PACKAGE VARIABLES See L for more information on the variables provided by this package. =head1 METHODS =over =item B \%defaults = $class->get_defaults() Returns all the package variables as key value pairs in a hash. =item B $class = $class->export_to_environment() Export all the package variables to the environment. =back munin-2.0.25/common/lib/Munin/Common/DictFile.pm000066400000000000000000000026301243472346000213310ustar00rootroot00000000000000package Munin::Common::DictFile; require Tie::Hash; our @ISA = qw(Tie::StdHash); our $DEBUG_ENABLED; # The method invoked by the command tie %hash, classname. # Associates a new hash instance with the specified class. # LIST would represent additional arguments (along the lines # of AnyDBM_File and compatriots) needed to complete the association. sub TIEHASH { my $classname = shift; my ($filename) = @_; my $self = { __filename__ => $filename, }; # Read the whole file if it exists if (-e $filename) { open(FILE, $filename) or die "Cannot open tied file '$filename' - $!"; while(my $line = ) { chomp($line); next unless $line =~ m/^'(.*)':\t'(.*)'$/; # Found a valid line, store it $self->{ _unescape($1) } = _unescape($2); } close(FILE); } return bless($self, $classname); } # Write everything down sub DESTROY { my $self = shift; my $tmp_filename = $self->{__filename__} . ".tmp.$$"; open(FILE, "> $tmp_filename") or die "Cannot open temp file '$tmp_filename' - $!"; foreach my $key (keys %$self) { print FILE "'" . _escape($key) . "':\t'" . _escape($self->{$key}) . "'\n"; } close (FILE); rename $tmp_filename, $self->{__filename__}; } sub DEBUG { print STDOUT "[DEBUG] @_" . "\n" if $DEBUG_ENABLED; } sub _escape { my $string = shift; $string =~ s/'/''/g; return $string; } sub _unescape { my $string = shift; $string =~ s/''/'/g; return $string; } 1; munin-2.0.25/common/lib/Munin/Common/SyncDictFile.pm000066400000000000000000000077221243472346000221750ustar00rootroot00000000000000package Munin::Common::SyncDictFile; require Tie::Hash; our @ISA = qw(Tie::Hash); our $DEBUG_ENABLED; use IO::File; # The method invoked by the command tie %hash, classname. # Associates a new hash instance with the specified class. # LIST would represent additional arguments (along the lines # of AnyDBM_File and compatriots) needed to complete the association. sub TIEHASH { my $classname = shift; my ($filename) = @_; my $self = { filename => $filename, }; new IO::File($filename, O_CREAT) unless (-f $filename); return bless($self, $classname); } # Store datum value into key for the tied hash this. sub STORE { my ($self, $key, $value) = @_; DEBUG("STORE($key, $value)"); $key = escape_key($key); use IO::File; my $fh = _lock_write($self->{filename}, "r"); my $fh_tmp = _lock_write($self->{filename} . ".tmp"); # Read the whole file, writing it to $fh_tmp while(my $line = <$fh>) { chomp($line); DEBUG("read line $line"); # Print the read line, but ignore the key we are currently storing print $fh_tmp "$line\n" unless $line =~ m/^$key:/; } # Print the stored key at the end DEBUG("Print the stored $key:$value"); print $fh_tmp "$key:$value\n"; # close (therefore flush data) before rename $fh_tmp = undef; # overwrite atomically # XXX - any locked process will have an old version rename $self->{filename} . ".tmp", $self->{filename}; } # Retrieve the datum in key for the tied hash this. sub FETCH { my ($self, $key) = @_; DEBUG("FETCH($key)"); $key = escape_key($key); my $fh = _lock_read($self->{filename}); # Read the whole file while(my $line = <$fh>) { chomp($line); next unless $line =~ m/^$key:(.*)/; # Found return $1; } } # Return the first key in the hash. sub FIRSTKEY { my ($self) = @_; DEBUG("FIRSTKEY()"); my $fh = _lock_read($self->{filename}); # Read the file to find a key while(my $line = <$fh>) { chomp($line); next unless $line =~ m/^(\w+):/; # Found return $1; } } # Return the next key in the hash. sub NEXTKEY { my ($self, $lastkey) = @_; DEBUG("NEXTKEY($lastkey)"); $key = escape_key($key); my $fh = _lock_read($self->{filename}); # Read the file to find a key while(my $line = <$fh>) { chomp($line); next unless $line =~ m/^$key:(.*)/; # Found, read another line my $new_line = <$fh>; chomp($new_line); if ($new_line =~ m/^(\w+):/) { return $1; } else { # EOF return undef; } } } # Verify that key exists with the tied hash this. sub EXISTS { my ($self, $key) = @_; DEBUG("EXISTS($key)"); $key = escape_key($key); my $fh = _lock_read($self->{filename}); # Read the whole file while(my $line = <$fh>) { chomp($line); next unless $line =~ m/^$key:(.*)/; # Found return 1; } # Not found return 0; } # Delete the key key from the tied hash this. sub DELETE { my ($self, $key) = @_; DEBUG("DELETE($key)"); $key = escape_key($key); $self->_lock_write(); } # Clear all values from the tied hash this. sub CLEAR { my ($self) = @_; DEBUG("CLEAR()"); my $fh = $self->_lock_write(); } sub SCALAR { my ($self) = @_; DEBUG("SCALAR()"); my $fh = _lock_read($self->{filename}); # Read the file to read the number of lines my $nb_lines = 0; while(my $line = <$fh>) { $nb_lines ++; } return $nb_lines; } sub _lock_read { my ($filename) = @_; use Fcntl qw(:flock); use IO::File; my $fh = IO::File->new($filename, "r") or die "Cannot open tied file '$filename' - $!"; flock($fh, LOCK_SH) or die "Cannot lock tied file '$filename' - $!"; return $fh; } sub _lock_write { my ($filename, $mode) = @_; $mode ||= "a+"; use Fcntl qw(:flock); use IO::File; my $fh = IO::File->new($filename, $mode) or die "Cannot open tied file '$filename' - $!"; flock($fh, LOCK_EX) or die "Cannot lock tied file '$filename' - $!"; return $fh; } sub DEBUG { print STDOUT "[DEBUG] @_" . "\n" if $DEBUG_ENABLED; } # XXX - collision if there is a ____ # But should not happen often anyway sub escape_key { my $key = shift; $key =~ s/:/____/g; return $key; } 1; munin-2.0.25/common/lib/Munin/Common/TLS.pm000066400000000000000000000314021243472346000203070ustar00rootroot00000000000000package Munin::Common::TLS; # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); sub new { my ($class, $args) = @_; my $self = { logger => $args->{logger}, read_fd => $args->{read_fd}, read_func => $args->{read_func}, write_fd => $args->{write_fd}, write_func => $args->{write_func}, }; for my $key (keys %$self) { croak "Required argument missing: $key" unless defined $self->{$key}; } $self = { %$self, DEBUG => $args->{DEBUG} || 0, tls_ca_cert => $args->{tls_ca_cert} || '', tls_cert => $args->{tls_cert} || '', tls_paranoia => $args->{tls_paranoia}|| 0, tls_priv => $args->{tls_priv} || '', tls_vdepth => $args->{tls_vdepth} || 0, tls_verify => $args->{tls_verify} || 0, tls_match => $args->{tls_match} || '', }; for my $args_key (keys %$args) { croak "Unrecognized argument: $args_key" unless exists $self->{$args_key}; } $self = { %$self, tls_context => undef, tls_session => undef, private_key_loaded => 0, }; return bless $self, $class; } sub _start_tls { my $self = shift; my %tls_verified = ( level => 0, cert => "", verified => 0, required_depth => $self->{tls_vdepth}, verify => $self->{tls_verify}, ); $self->{logger}("[TLS] Enabling TLS.") if $self->{DEBUG}; $self->_load_net_ssleay() or return 0; $self->_initialize_net_ssleay(); $self->{tls_context} = $self->_creat_tls_context(); $self->_load_private_key() or return 0; $self->_load_certificate(); $self->_load_ca_certificate(); $self->_initial_communication() or return 0; $self->_set_peer_requirements(\%tls_verified); if (! ($self->{tls_session} = Net::SSLeay::new($self->{tls_context}))) { $self->{logger}("[ERROR] Could not create TLS: $!"); return 0; } $self->_log_cipher_list() if $self->{DEBUG}; $self->_set_ssleay_file_descriptors(); $self->_accept_or_connect(\%tls_verified); return $self->{tls_session}; } sub _load_net_ssleay { my ($self) = @_; eval { require Net::SSLeay; }; if ($@) { $self->{logger}("[ERROR] TLS enabled but Net::SSLeay unavailable."); return 0; } return 1; } sub _initialize_net_ssleay { my ($self) = @_; Net::SSLeay::load_error_strings(); Net::SSLeay::SSLeay_add_ssl_algorithms(); Net::SSLeay::randomize(); } sub _creat_tls_context { my ($self) = @_; my $ctx = Net::SSLeay::CTX_new(); if (!$ctx) { $self->{logger}("[ERROR] Could not create SSL_CTX"); return 0; } # Tune a few things... Net::SSLeay::CTX_set_options($ctx, Net::SSLeay::OP_ALL()); if (my $errno = Net::SSLeay::ERR_get_error()) { $self->{logger}("[ERROR] Could not set SSL_CTX options: " + Net::SSLeay::ERR_error_string($errno)); return 0; } return $ctx; } sub _load_private_key { my ($self) = @_; if (defined $self->{tls_priv} and length $self->{tls_priv}) { if (-e $self->{tls_priv} or $self->{tls_paranoia} eq "paranoid") { if (Net::SSLeay::CTX_use_PrivateKey_file($self->{tls_context}, $self->{tls_priv}, &Net::SSLeay::FILETYPE_PEM)) { $self->{private_key_loaded} = 1; } else { if ($self->{tls_paranoia} eq "paranoid") { $self->{logger}("[ERROR] Problem occurred when trying to read file with private key \"$self->{tls_priv}\": $!"); return 0; } else { $self->{logger}("[ERROR] Problem occurred when trying to read file with private key \"$self->{tls_priv}\": $!. Continuing without private key."); } } } else { $self->{logger}("[WARNING] No key file \"$self->{tls_priv}\". Continuing without private key."); } } return 1; } sub _load_certificate { my ($self) = @_; if ($self->{tls_cert} && -e $self->{tls_cert}) { if (defined $self->{tls_cert} and length $self->{tls_cert}) { if (!Net::SSLeay::CTX_use_certificate_file($self->{tls_context}, $self->{tls_cert}, &Net::SSLeay::FILETYPE_PEM)) { $self->{logger}("[WARNING] Problem occurred when trying to read file with certificate \"$self->{tls_cert}\": $!. Continuing without certificate."); } } } else { $self->{logger}("[WARNING] No certificate file \"$self->{tls_cert}\". Continuing without certificate."); } return 1; } sub _load_ca_certificate { my ($self) = @_; if ($self->{tls_ca_cert} && -e $self->{tls_ca_cert}) { if(!Net::SSLeay::CTX_load_verify_locations($self->{tls_context}, $self->{tls_ca_cert}, '')) { $self->{logger}("[WARNING] Problem occurred when trying to read file with the CA's certificate \"$self->{tls_ca_cert}\": ".&Net::SSLeay::print_errs("").". Continuing without CA's certificate."); } } return 1; } sub _set_peer_requirements { my ($self, $tls_verified) = @_; $self->{tls_vdepth} = 5 if !defined $self->{tls_vdepth}; Net::SSLeay::CTX_set_verify_depth ($self->{tls_context}, $self->{tls_vdepth}); my $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[WARNING] in set_verify_depth: $err"); } Net::SSLeay::CTX_set_verify ($self->{tls_context}, $self->{tls_verify} ? &Net::SSLeay::VERIFY_PEER : &Net::SSLeay::VERIFY_NONE, $self->_tls_verify_callback($tls_verified)); $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[WARNING] in set_verify: $err"); } return 1; } sub _tls_verify_callback { my ($self, $tls_verified) = @_; return sub { my ($ok, $subj_cert, $issuer_cert, $depth, $errorcode, $arg, $chain) = @_; $tls_verified->{"level"}++; if ($ok) { $tls_verified->{"verified"} = 1; $self->{logger}("[TLS] Verified certificate.") if $self->{DEBUG}; return 1; # accept } if (!($tls_verified->{"verify"})) { $self->{logger}("[TLS] Certificate failed verification, but we aren't verifying.") if $self->{DEBUG}; $tls_verified->{"verified"} = 1; return 1; } if ($tls_verified->{"level"} > $tls_verified->{"required_depth"}) { $self->{logger}("[TLS] Certificate verification failed at depth ".$tls_verified->{"level"}."."); $tls_verified->{"verified"} = 0; return 0; } return 0; # Verification failed } } sub _log_cipher_list { my ($self) = @_; my $i = 0; my $p = ''; my $cipher_list = 'Cipher list: '; $p=Net::SSLeay::get_cipher_list($self->{tls_session},$i); $cipher_list .= $p if $p; do { $i++; $cipher_list .= ', ' . $p if $p; $p=Net::SSLeay::get_cipher_list($self->{tls_session},$i); } while $p; $cipher_list .= '\n'; $self->{logger}("[TLS] Available cipher list: $cipher_list.") if $self->{DEBUG}; } sub _set_ssleay_file_descriptors { my ($self) = @_; Net::SSLeay::set_rfd($self->{tls_session}, $self->{read_fd}); my $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[TLS] Warning in set_rfd: $err"); } Net::SSLeay::set_wfd($self->{tls_session}, $self->{write_fd}); $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[TLS] Warning in set_wfd: $err"); } } sub _accept_or_connect { my ($self, $tls_verified) = @_; $self->{logger}("[TLS] Accept/Connect: $self->{private_key_loaded}, " . $self->_use_key_if_present()) if $self->{DEBUG}; my $res; if ($self->_use_key_if_present()) { $res = Net::SSLeay::accept($self->{tls_session}); } else { $res = Net::SSLeay::connect($self->{tls_session}); } $self->{logger}("[TLS] Done Accept/Connect") if $self->{DEBUG}; my $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[ERROR] Could not enable TLS: " . $err); Net::SSLeay::free ($self->{tls_session}); Net::SSLeay::CTX_free ($self->{tls_context}); $self->{tls_session} = undef; } elsif (!$tls_verified->{"verified"} and $self->{tls_paranoia} eq "paranoid") { $self->{logger}("[ERROR] Could not verify CA: " . Net::SSLeay::dump_peer_certificate($self->{tls_session})); $self->_on_unverified_cert(); Net::SSLeay::free ($self->{tls_session}); Net::SSLeay::CTX_free ($self->{tls_context}); $self->{tls_session} = undef; } elsif ($self->{"tls_match"} and Net::SSLeay::dump_peer_certificate($self->{tls_session}) !~ /$self->{tls_match}/) { $self->{logger}("[ERROR] Could not match pattern \"" . $self->{tls_match} . "\" in dump of certificate."); $self->_on_unmatched_cert(); Net::SSLeay::free ($self->{tls_session}); Net::SSLeay::CTX_free ($self->{tls_context}); $self->{tls_session} = undef; } else { $self->{logger}("[TLS] TLS enabled.") if $self->{DEBUG}; $self->{logger}("[TLS] Cipher `" . Net::SSLeay::get_cipher($self->{tls_session}) . "'.") if $self->{DEBUG}; $self->{logger}("[TLS] client cert: " . Net::SSLeay::dump_peer_certificate($self->{tls_session})) if $self->{DEBUG}; } } # Abstract method sub _initial_communication { my ($self) = @_; croak "Abstract method called '_initial_communication', " . "needs to be defined in child" if ref $self eq __PACKAGE__; } # Abstract method sub _use_key_if_present { my ($self) = @_; croak "Abstract method called '_use_key_if_present', " . "needs to be defined in child" if ref $self eq __PACKAGE__; } # Redefine in sub class if needed sub _on_unverified_cert {} # Redefine in sub class if needed sub _on_unmatched_cert {} sub read { my ($self) = @_; croak "Tried to do an encrypted read, but a TLS session is not started" unless $self->session_started(); my $read = Net::SSLeay::read($self->{tls_session}); my $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[TLS] Warning in read: $err"); return; } undef $read if($read eq ''); # returning '' signals EOF $self->{logger}("DEBUG: < $read") if $self->{DEBUG} && defined $read; return $read; } sub write { my ($self, $text) = @_; croak "Tried to do an encrypted write, but a TLS session is not started" unless $self->session_started(); $self->{logger}("DEBUG: > $text") if $self->{DEBUG}; Net::SSLeay::write($self->{tls_session}, $text); my $err = &Net::SSLeay::print_errs(""); if (defined $err and length $err) { $self->{logger}("[TLS] Warning in write: $err"); return 0; } return 1; } sub session_started { my ($self) = @_; return defined $self->{tls_session}; } 1; __END__ =head1 NAME Munin::Node::TLS - Abstract base class implementing the STARTTLS protocol =head1 SYNOPSIS Should not be called directly. See synopsis for L and L. =head1 METHODS =over =item B my $tls = Munin::Common::TLSFoo->new({ # Substitute Foo with Client or Server # Mandatory attributes: logger => \&a_logger_func, read_fd => fileno($socket), read_func => \&a_socket_read_func, write_fd => fileno($socket), write_func => \&a_socket_read_func, # Optional attributes DEFAULTS DEBUG => 0, # 0 tls_ca_cert => "path/to/ca/cert.pem", # '' tls_cert => "path/to/cert.pem", # '' tls_paranoia => 1, # 0 tls_priv => "path/to/priv_key.pem", # '' tls_vdepth => 5, # 0 tls_verify => 1, # 0 }); Constructor. Should not be called directly. This documents the attributes that are in common for L and L. =item B my $msg = $tls->read(); Encrypted read. =item B $tls->write($msg); Encrypted write. =item B my $bool = $tls->session_started(); Returns true if the TLS object is ready to read/write encrypted data. =back munin-2.0.25/common/lib/Munin/Common/TLSClient.pm000066400000000000000000000026121243472346000214470ustar00rootroot00000000000000package Munin::Common::TLSClient; use base qw(Munin::Common::TLS); # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); sub new { my ($class, $args) = @_; my $self = $class->SUPER::new($args); $self->{remote_key} = 0; return $self; } sub start_tls { my ($self) = @_; $self->SUPER::_start_tls(); } sub _initial_communication { my ($self) = @_; $self->{write_func}("STARTTLS\n"); my $tlsresponse = $self->{read_func}(); if (!defined $tlsresponse) { $self->{logger}("[ERROR] Bad TLS response \"\"."); return 0 } if ($tlsresponse =~ /^TLS OK/) { $self->{remote_key} = 1; } elsif ($tlsresponse !~ /^TLS MAYBE/i) { $self->{logger}("[ERROR] Bad TLS response \"$tlsresponse\"."); return 0; } return 1; } sub _use_key_if_present { my ($self) = @_; return !$self->{remote_key}; } sub _on_unverified_cert { my ($self) = @_; $self->write("quit\n"); } 1; __END__ =head1 NAME Munin::Node::TLSClient - Implements the client side of the STARTTLS protocol =head1 SYNOPSIS $tls = Munin::Node::TLSClient->new(...); $tls->start_tls(); =head1 METHODS =over =item B $tls = Munin::Node::TLSClient->new(...); See L for documentation for constructor arguments. =item B $tls->start_tls(); Begin a STARTTLS request =back munin-2.0.25/common/lib/Munin/Common/TLSServer.pm000066400000000000000000000020621243472346000214760ustar00rootroot00000000000000package Munin::Common::TLSServer; use base qw(Munin::Common::TLS); # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); sub new { my ($class, $args) = @_; return $class->SUPER::new($args); } sub start_tls { my ($self) = @_; $self->SUPER::_start_tls(); } sub _initial_communication { my ($self) = @_; if ($self->{private_key_loaded}) { $self->{write_func}("TLS OK\n"); } else { $self->{write_func}("TLS MAYBE\n"); } return 1; } sub _use_key_if_present { my ($self) = @_; return $self->{private_key_loaded}; } 1; __END__ =head1 NAME Munin::Node::TLSServer - Implements the server side of the STARTTLS protocol =head1 SYNOPSIS # After receiving a STARTTLS request: $tls = Munin::Node::TLSServer->new(...); $tls->start_tls(); =head1 METHODS =over =item B $tls = Munin::Node::TLSServer->new(...); See L for documentation for constructor arguments. =item B $tls->start_tls(); Process a STARTTLS request =back munin-2.0.25/common/lib/Munin/Common/Timeout.pm000066400000000000000000000057451243472346000213060ustar00rootroot00000000000000use warnings; use strict; # $Id$ package Munin::Common::Timeout; use base qw(Exporter); use Carp; use English qw(-no_match_vars); BEGIN { our @EXPORT = qw( &do_with_timeout ); } # This represents the current ALRM signal setting my $current_timeout_epoch; # This sub always uses absolute epoch time reference. # This is in order to cope with eventual stealed time... # ... and to avoid complex timing computations # # $timeout is relative seconds, $timeout_epoch is absolute. sub do_with_timeout { my ($timeout, $block) = @_; croak 'Argument exception: $timeout' unless $timeout && $timeout =~ /^\d+$/; croak 'Argument exception: $block' unless ref $block eq 'CODE'; my $new_timeout_epoch = time + $timeout; # Nested timeouts cannot extend the global timeout, # and we always leave 5s for outer loop to finish itself if ($current_timeout_epoch && $new_timeout_epoch > $current_timeout_epoch - 5) { $new_timeout_epoch = $current_timeout_epoch - 5; } if ($new_timeout_epoch <= time) { # Yey ! Time's up already, don't do anything, just : "farewell !" return undef; } # Ok, going under new timeout setting my $old_current_timeout_epoch = $current_timeout_epoch; $current_timeout_epoch = $new_timeout_epoch; my $ret_value; eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm ($new_timeout_epoch - time); $ret_value = $block->(); }; my $err = $EVAL_ERROR; # Restore the old $current_timeout_epoch... $current_timeout_epoch = $old_current_timeout_epoch; # ... and restart the old alarm if needed if ($current_timeout_epoch) { my $timeleft = $current_timeout_epoch - time; if ($timeleft <= 0) { # no timeleft : directly raise alarm die "alarm\n"; } alarm ($timeleft); } else { # Remove the alarm alarm (0); } # And handle the return code if ($err) { return undef if $err eq "alarm\n"; die $err; # Propagate any other exceptions } return $ret_value; } 1; __END__ =head1 NAME Munin::Common::Timeout - Run code with a timeout. May nest. =head1 SYNOPSIS use Munin::Common::Timeout; do_with_timeout(50, sub { # ... do_with_timeout(5, sub { # ... # ... }); # ... }); =head1 DESCRIPTION See also L, L =head1 SUBROUTINES =over =item B my $finished_with_no_timeout = do_with_timeout($seconds, $code_ref) or die "Timed out!"; Executes $block with a timeout of $seconds. Returns the return value of the $block if it completed within the timeout. If the timeout is reached and the code is still running, it halts it and returns undef. NB: every $code_ref should return something defined, otherwise the caller doesn't know if a timeout occurred. Calls to do_with_timeout() can be nested. Any exceptions raised by $block are propagated. =back =cut # vim: ts=4 : sw=4 : et munin-2.0.25/common/t/000077500000000000000000000000001243472346000144665ustar00rootroot00000000000000munin-2.0.25/common/t/critic.t000066400000000000000000000004601243472346000161300ustar00rootroot00000000000000use strict; use warnings; use Test::More; use FindBin; use lib "$FindBin::Bin/../lib"; plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Perl::Critic'; plan ( skip_all => "Test::Perl::Critic required for testing coding standard" ) if $@; all_critic_ok(); munin-2.0.25/common/t/munin_common_config.t000066400000000000000000000065261243472346000207070ustar00rootroot00000000000000use warnings; use strict; use Test::More 'no_plan'; use_ok('Munin::Common::Config'); # cl_is_keyword { ok( Munin::Common::Config::cl_is_keyword('logdir'), 'valid keyword'); ok(! Munin::Common::Config::cl_is_keyword('fnord'), 'invalid keyword'); } # is_keyword { ok( Munin::Common::Config->is_keyword('logdir'), 'valid keyword'); ok(! Munin::Common::Config->is_keyword('fnord'), 'invalid keyword'); } # parse_config_from_file # _trim { # input parameter has to be a variable, as it gets modified directly by _trim my $s; Munin::Common::Config->_trim($s = ''); is($s, '', 'empty line'); Munin::Common::Config->_trim($s = ' '); is($s, '', 'only whitespace'); Munin::Common::Config->_trim($s = ' leading whitespace'); is($s, 'leading whitespace'); Munin::Common::Config->_trim($s = 'trailing whitespace '); is($s, 'trailing whitespace'); Munin::Common::Config->_trim($s = ' both leading and trailing whitespace '); is($s, 'both leading and trailing whitespace'); } # _strip_comment { # input parameter has to be a variable, as it gets modified directly by _strip_comment my $s; Munin::Common::Config->_strip_comment($s = ''); is($s, '', 'empty line'); Munin::Common::Config->_strip_comment($s = 'line without comment'); is($s, 'line without comment'); Munin::Common::Config->_strip_comment($s = 'line with a simple comment ## here is the comment!'); is($s, 'line with a simple comment '); Munin::Common::Config->_strip_comment($s = 'line with an escaped \# '); is($s, 'line with an escaped # '); Munin::Common::Config->_strip_comment($s = 'line with a comment including an escaped hash # escaped \# '); is($s, 'line with a comment including an escaped hash '); Munin::Common::Config->_strip_comment($s = 'line with a comment including two \# \## escaped \# '); is($s, 'line with a comment including two # #'); } # _looks_like_a_bool { ok( Munin::Common::Config->_looks_like_a_bool('yes'), 'yes'); ok( Munin::Common::Config->_looks_like_a_bool('Yes'), 'Yes'); ok( Munin::Common::Config->_looks_like_a_bool('no'), 'no'); ok( Munin::Common::Config->_looks_like_a_bool('NO'), 'NO'); ok( Munin::Common::Config->_looks_like_a_bool('1'), 'the number 1'); ok( Munin::Common::Config->_looks_like_a_bool('0'), 'the number 0'); ok( Munin::Common::Config->_looks_like_a_bool('true'), 'true'); ok( Munin::Common::Config->_looks_like_a_bool('false'), 'false'); ok( Munin::Common::Config->_looks_like_a_bool('on'), 'on'); ok( Munin::Common::Config->_looks_like_a_bool('off'), 'off'); ok(! Munin::Common::Config->_looks_like_a_bool('falsch'), 'not a boolean'); ok(! Munin::Common::Config->_looks_like_a_bool('yes!'), 'not a boolean either'); } # _parse_bool { ok( Munin::Common::Config->_parse_bool('yes'), 'yes'); ok( Munin::Common::Config->_parse_bool('Yes'), 'Yes'); ok( Munin::Common::Config->_parse_bool('1'), 'the number 1'); ok( Munin::Common::Config->_parse_bool('true'), 'true'); ok( Munin::Common::Config->_parse_bool('on'), 'on'); ok(! Munin::Common::Config->_parse_bool('no'), 'no'); ok(! Munin::Common::Config->_parse_bool('NO'), 'NO'); ok(! Munin::Common::Config->_parse_bool('false'), 'false'); ok(! Munin::Common::Config->_parse_bool('off'), 'off'); eval { Munin::Common::Config->_parse_bool('falsch') }; like($@, qr/falsch/, 'exception on bad boolean'); } munin-2.0.25/common/t/munin_common_defaults.t000066400000000000000000000002101243472346000212310ustar00rootroot00000000000000use warnings; use strict; use FindBin; use lib "$FindBin::Bin/../lib"; use Test::More tests => 1; use_ok('Munin::Common::Defaults'); munin-2.0.25/common/t/munin_common_timeout.t000066400000000000000000000022551243472346000211230ustar00rootroot00000000000000use warnings; use strict; use English qw(-no_match_vars); use Test::More tests => 6; use_ok('Munin::Common::Timeout'); BEGIN { if (Time::HiRes->can('alarm')){ Time::HiRes->import('alarm') ; } } # These test could have been made to run faster by using # Time::HiRes::alarm. Adding this to the module: # # BEGIN { # if (Time::HiRes->can('alarm')){ # Time::HiRes->import('alarm') ; # } # } # # However Time::HiRes::alarm is not compatible with nested alarms # (alarm(0) does not return time remaining) # # :( ok(do_with_timeout(1, sub {1}), "No timeout"); ok(!do_with_timeout(1, sub { for (;;) {}; return 1; }), "Timeout"); eval { do_with_timeout(1, sub {die "Test"}); }; like($EVAL_ERROR, qr/^Test/, "Exception gets propagated"); ###################################################################### { my ($stat1, $stat2); $stat1 = do_with_timeout(20, sub { $stat2 = do_with_timeout(1, sub { for (;;) {} }); return 1; }); ok(!$stat2, "Inner timed out"); ok($stat1, "Outer didn't time out during evaluation of inner"); } ###################################################################### munin-2.0.25/common/t/munin_common_tls.t000066400000000000000000000057211243472346000202400ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 4; use_ok('Munin::Common::TLS'); use_ok('Munin::Common::TLSClient'); use_ok('Munin::Common::TLSServer'); use Data::Dumper; use English qw(-no_match_vars); use FindBin; use IO::Handle; use Socket; sub do_server { my ($socket) = @_; #print $socket "Parent Pid $$ is sending this\n"; #chomp(my $line = <$socket>); #print "Parent Pid $$ just read this: `$line'\n"; chomp(my $line = <$socket>); die "Expected STARTTLS '$line'" unless $line eq 'STARTTLS'; my $tls = Munin::Common::TLSServer->new({ DEBUG => 1, logger => sub { print "LOG SERVER: ", @_, "\n" }, read_fd => fileno($socket), read_func => sub { print "Server reading ...\n"; my $line = <$socket>; print "Server done. ($line)\n"; return $line; }, tls_ca_cert => "$FindBin::Bin/tls/CA/ca_cert.pem", tls_cert => "$FindBin::Bin/tls/node_cert.pem", tls_paranoia => 1, tls_priv => "$FindBin::Bin/tls/node_key.pem", tls_vdepth => 5, tls_verify => 1, write_fd => fileno($socket), write_func => sub { print $socket @_ }, }); my $tls_session = $tls->start_tls(); die "STARTTLS failed, missing Net::SSLeay?" unless $tls_session; $line = $tls->read(); $tls->write($line); } sub do_client { my ($socket) = @_; #chomp(my $line = <$socket>); #print "Child Pid $$ just read this: `$line'\n"; #print $socket "Child Pid $$ is sending this\n"; my $tls = Munin::Common::TLSClient->new({ DEBUG => 1, logger => sub { print "LOG CLIENT: ", @_, "\n" }, read_fd => fileno($socket), read_func => sub { print "Client reading ...\n"; my $line = <$socket>; print "Client done. ($line)\n"; return $line; }, tls_ca_cert => "$FindBin::Bin/tls/CA/ca_cert.pem", tls_cert => "$FindBin::Bin/tls/master_cert.pem", tls_paranoia => 1, tls_priv => "$FindBin::Bin/tls/master_key.pem", tls_vdepth => 5, tls_verify => 1, write_fd => fileno($socket), write_func => sub { print $socket @_ }, }); my $tls_session = $tls->start_tls(); die "STARTTLS failed, missing Net::SSLeay?" unless $tls_session; my $req_msg = "ping\n"; $tls->write($req_msg); my $res_msg = $tls->read(); return $req_msg eq $res_msg; } socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or die "socketpair: $!"; CHILD->autoflush(1); PARENT->autoflush(1); my $pid; if ($pid = fork) { close PARENT; do_server(\*CHILD); close CHILD; waitpid($pid,0); my $child_exit_status = $CHILD_ERROR >> 8; # FIX becomes 1 for some reason ... is($CHILD_ERROR, 256, "Status OK"); # FIX Want to test $child_exit_status == 0 } else { die "cannot fork: $!" unless defined $pid; close CHILD; my $stat = do_client(\*PARENT); close PARENT; exit $stat ? 0 : 1; } munin-2.0.25/common/t/no-fixes.t000066400000000000000000000025211243472346000164030ustar00rootroot00000000000000# vim: ts=4 : sw=4 : et use warnings; use strict; # Check for comments and POD flagged with FIX. # Are there any modules that already does this? # Perl::Critic::Policy::Bangs::ProhibitFlagComments doesn't consider # POD. Make a Perl::Critic::Policy out of this? use English qw(-no_match_vars); use File::Find; use FindBin; use Test::More; use Pod::Simple::TextContent; if ($ENV{TEST_POD}) { plan tests => 1; } else { plan skip_all => 'set TEST_POD to enable this test' } my $count = 0; find(\&fixes, "$FindBin::Bin/../lib"); is($count, 0, "Should not find any FIX comments"); sub fixes { my $file = $File::Find::name; # skip SVN stuff if ( -d and m{\.svn}) { $File::Find::prune = 1; return; } return unless -f $file; # # Check comments # open my $F, '<', $file or warn "Couldn't open $file: $!" && return; while (<$F>) { if (m{#\s*FIX}) { printf "Found a FIX comment at %s: %d\n", $file, $.; $count++; } } close $F; # # Check POD # my $pod_parser = Pod::Simple::TextContent->new; my $pod = ""; $pod_parser->output_string(\$pod); $pod_parser->parse_file($file); my $pod_count = scalar(grep {/FIX/} split /\n/, $pod); printf "Found %d FIX(es) in POD in %s\n", $pod_count,$file if $pod_count; $count += $pod_count; } munin-2.0.25/common/t/pod-coverage.t000066400000000000000000000004651243472346000172330ustar00rootroot00000000000000use strict; use warnings; use Test::More; use FindBin; use lib "$FindBin::Bin/../lib"; plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Pod::Coverage'; plan ( skip_all => "Test::Pod::Coverage required for testing POD coverage" ) if $@; all_pod_coverage_ok(); munin-2.0.25/common/t/pod.t000066400000000000000000000004401243472346000154330ustar00rootroot00000000000000use strict; use warnings; use Test::More; use FindBin; use lib "$FindBin::Bin/../lib"; plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Pod'; plan ( skip_all => "Test::Pod required for testing for POD errors" ) if $@; all_pod_files_ok(); munin-2.0.25/common/t/tls/000077500000000000000000000000001243472346000152705ustar00rootroot00000000000000munin-2.0.25/common/t/tls/CA/000077500000000000000000000000001243472346000155535ustar00rootroot00000000000000munin-2.0.25/common/t/tls/CA/ca_cert.pem000066400000000000000000000024621243472346000176620ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDqDCCAxGgAwIBAgIJAKxAPCweEB0oMA0GCSqGSIb3DQEBBAUAMIGVMQswCQYD VQQGEwJNVTEaMBgGA1UECBMRUHJvdmluY2Ugb2YgTXVuaW4xEzARBgNVBAcTCk11 bmluIFRvd24xEzARBgNVBAoTCk11bmluIEluYy4xCjAIBgNVBAsTAS4xEjAQBgNV BAMTCTEyNy4wLjAuMTEgMB4GCSqGSIb3DQEJARYRbXVuaW5AZXhhbXBsZS5vcmcw HhcNMDkwNDA3MDkxNzIwWhcNMTkwNDA1MDkxNzIwWjCBlTELMAkGA1UEBhMCTVUx GjAYBgNVBAgTEVByb3ZpbmNlIG9mIE11bmluMRMwEQYDVQQHEwpNdW5pbiBUb3du MRMwEQYDVQQKEwpNdW5pbiBJbmMuMQowCAYDVQQLEwEuMRIwEAYDVQQDEwkxMjcu MC4wLjExIDAeBgkqhkiG9w0BCQEWEW11bmluQGV4YW1wbGUub3JnMIGfMA0GCSqG SIb3DQEBAQUAA4GNADCBiQKBgQDp/gJd5Mjr9Ua8JTnV1luXWtUvkReaBmputQvN znGIEMjj7wLkbEXPIUhQk8Rq/5yRWFrsLMrO4Uo3SIOEPxYhdININAjkOklV4DMn CKBL6HfqUg4pmugFg31ZDI+3YD/3Ysa+e9qKODcYbgofDpbXT5ib+Wjf+06ZYiFo +xfC5wIDAQABo4H9MIH6MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFB7J3QHgITfo TUWxvXolLl5/pWeBMIHKBgNVHSMEgcIwgb+AFB7J3QHgITfoTUWxvXolLl5/pWeB oYGbpIGYMIGVMQswCQYDVQQGEwJNVTEaMBgGA1UECBMRUHJvdmluY2Ugb2YgTXVu aW4xEzARBgNVBAcTCk11bmluIFRvd24xEzARBgNVBAoTCk11bmluIEluYy4xCjAI BgNVBAsTAS4xEjAQBgNVBAMTCTEyNy4wLjAuMTEgMB4GCSqGSIb3DQEJARYRbXVu aW5AZXhhbXBsZS5vcmeCCQCsQDwsHhAdKDANBgkqhkiG9w0BAQQFAAOBgQBxigr1 n/AgUK4BSml19Q4QDt3J+qOkOSg/d9rKRUUIpy12KmwjJNR9emNGV6AuJP843Cq7 rXrG3+K5MBysud6/3qzSEPV9dbxbdI8Lz2BSTkMAjB8vgvzfADiY8SIbzmHrTmVR 6RemleiYAdAywToya5824mdyVANbz1Y2e5anwQ== -----END CERTIFICATE----- munin-2.0.25/common/t/tls/Makefile000066400000000000000000000011571243472346000167340ustar00rootroot00000000000000 .PHONY: all clean all: mkdir CA mkdir CA/newcerts CA/private touch CA/index.txt echo '01' > CA/serial openssl req -new -nodes -x509 -extensions v3_ca -keyout CA/private/ca_key.pem -out CA/ca_cert.pem -days 3650 -config ./openssl.cnf openssl req -new -nodes -keyout node_key.pem -out node_req.pem -config ./openssl.cnf openssl req -new -nodes -keyout master_key.pem -out master_req.pem -config ./openssl.cnf yes | openssl ca -out node_cert.pem -in node_req.pem -config ./openssl.cnf -days 3650 yes | openssl ca -out master_cert.pem -in master_req.pem -config ./openssl.cnf -days 3650 clean: rm -r CA rm *.pem munin-2.0.25/common/t/tls/README000066400000000000000000000017401243472346000161520ustar00rootroot00000000000000 SETTING UP A TESTBED FOR IMPLEMENTING TLS USING OPENSSL http://www.debian-administration.org/articles/284 * Configuration See openssl.cnf * Establish a CA (Self signe root certificate) ** Create database mkdir CA cd CA mkdir newcerts private echo '01' > serial touch index.txt ** Create key and certificate. Don't need to encrypt the key since this is just for testing. openssl req -new -nodes -x509 -extensions v3_ca -keyout CA/private/ca_key.pem -out CA/ca_cert.pem -days 3650 -config ./openssl.cnf * Create and signe sertificates for each peer ** Create keys and certificate requests openssl req -new -nodes -keyout node_key.pem -out node_req.pem -config ./openssl.cnf openssl req -new -nodes -keyout master_key.pem -out master_req.pem -config ./openssl.cnf ** Sign openssl ca -out node_cert.pem -in node_req.pem -config ./openssl.cnf -days 3650 openssl ca -out master_cert.pem -in master_req.pem -config ./openssl.cnf -days 3650 munin-2.0.25/common/t/tls/master_cert.pem000066400000000000000000000050551243472346000203100ustar00rootroot00000000000000Certificate: Data: Version: 1 (0x0) Serial Number: 2 (0x2) Signature Algorithm: md5WithRSAEncryption Issuer: C=MU, ST=Province of Munin, L=Munin Town, O=Munin Inc., OU=., CN=127.0.0.1/emailAddress=munin@example.org Validity Not Before: Apr 7 09:17:20 2009 GMT Not After : Apr 5 09:17:20 2019 GMT Subject: C=MU, ST=Province of Munin, O=Munin Inc., OU=., CN=127.0.0.1 Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:ce:82:56:87:ad:d4:21:27:ea:3c:f8:f4:58:ca: e6:a1:54:16:9a:80:bc:4c:d3:6b:a7:f1:86:0d:a1: 52:81:2a:5d:f1:c6:9d:cc:bf:72:c3:c7:26:58:ea: ca:62:5b:cf:03:4b:41:56:68:3d:51:e4:b0:b2:67: f2:44:db:dc:1c:cc:40:60:ce:dc:ad:41:fe:1e:0b: a5:47:c0:35:97:ad:45:e8:b8:6f:0b:b7:16:d4:cf: 4d:8e:b5:df:1c:50:27:63:58:3a:7c:9a:ee:fb:74: b8:cf:fb:84:f6:c3:c0:f8:88:cd:7a:26:3a:72:0c: 15:f6:d7:99:98:c6:2d:52:97 Exponent: 65537 (0x10001) Signature Algorithm: md5WithRSAEncryption c5:ee:69:b5:7c:c3:87:23:32:88:b4:b5:08:3b:39:80:99:9d: 03:f1:d1:ac:76:45:b5:46:8a:0f:9f:10:67:b3:c4:c3:3a:aa: 34:37:32:96:4f:29:2e:ee:05:e3:18:27:7f:61:6d:6c:09:5f: b5:b6:b1:80:c0:d5:80:7c:8d:32:33:16:8e:ff:25:59:58:48: ad:a7:b9:ab:53:06:91:f7:88:0e:10:a0:ef:af:d1:47:b5:38: 03:c4:0e:9a:23:79:94:6e:c0:8d:c8:91:9f:f4:63:44:dd:ca: 06:02:b0:5b:68:65:c3:c9:1a:0d:b1:a6:dd:d1:e0:30:af:52: fb:84 -----BEGIN CERTIFICATE----- MIICYzCCAcwCAQIwDQYJKoZIhvcNAQEEBQAwgZUxCzAJBgNVBAYTAk1VMRowGAYD VQQIExFQcm92aW5jZSBvZiBNdW5pbjETMBEGA1UEBxMKTXVuaW4gVG93bjETMBEG A1UEChMKTXVuaW4gSW5jLjEKMAgGA1UECxMBLjESMBAGA1UEAxMJMTI3LjAuMC4x MSAwHgYJKoZIhvcNAQkBFhFtdW5pbkBleGFtcGxlLm9yZzAeFw0wOTA0MDcwOTE3 MjBaFw0xOTA0MDUwOTE3MjBaMF4xCzAJBgNVBAYTAk1VMRowGAYDVQQIExFQcm92 aW5jZSBvZiBNdW5pbjETMBEGA1UEChMKTXVuaW4gSW5jLjEKMAgGA1UECxMBLjES MBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO glaHrdQhJ+o8+PRYyuahVBaagLxM02un8YYNoVKBKl3xxp3Mv3LDxyZY6spiW88D S0FWaD1R5LCyZ/JE29wczEBgztytQf4eC6VHwDWXrUXouG8LtxbUz02Otd8cUCdj WDp8mu77dLjP+4T2w8D4iM16JjpyDBX215mYxi1SlwIDAQABMA0GCSqGSIb3DQEB BAUAA4GBAMXuabV8w4cjMoi0tQg7OYCZnQPx0ax2RbVGig+fEGezxMM6qjQ3MpZP KS7uBeMYJ39hbWwJX7W2sYDA1YB8jTIzFo7/JVlYSK2nuatTBpH3iA4QoO+v0Ue1 OAPEDpojeZRuwI3IkZ/0Y0TdygYCsFtoZcPJGg2xpt3R4DCvUvuE -----END CERTIFICATE----- munin-2.0.25/common/t/tls/master_key.pem000066400000000000000000000015671243472346000201470ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDOglaHrdQhJ+o8+PRYyuahVBaagLxM02un8YYNoVKBKl3xxp3M v3LDxyZY6spiW88DS0FWaD1R5LCyZ/JE29wczEBgztytQf4eC6VHwDWXrUXouG8L txbUz02Otd8cUCdjWDp8mu77dLjP+4T2w8D4iM16JjpyDBX215mYxi1SlwIDAQAB AoGAXlUZk9bq7M5f6MRMUfc1jQJtZNxjp7B4H/prIvTLTGd/DH+O+8WEdjwVn055 bp7DnJyW1xK82BjgQk7LU3sfO1IDXZMVzj2Aw7x482K2JV03IAGLIT05yL4uk4WP sI1LKh+4TljajStG/wO8MwytUkD2gNR5uns7rIynQSpwNwECQQDzr2yDVOxuZsQT j1i/tyDDN4u3/rwXNW6jPBTCscebwrssO9a9RhYMXL/6pXypf4OnrTYMTLd8Kv3B rscez+qBAkEA2PH2sbB2kIGcrPlL6iLp6uGjXVSJzfIxsXLV2XYnF5uR2p3w15s2 v75s7r4NQ0XnYPYcJCsVqv+b7wCD37TBFwJBAOP30q4yPlUx8nDSA5amvRGj3yOs PU4BAJXY2Rsisbf3vp6tBEFhVbMO+dKEClGPJx0wH4X2JxkUJvyQg1tB6wECQQCj O5QR6KOdYVigsccT+Ycl6va/f59cbTJEwRH02LjbQ3vAEXyozampJj/Sdv+FsbBB vYw5Do30JvWOJEYVaWyrAkAYNUP95eP9OJ3oKCuvl6ErOBfnpwne5795F1PgzWIu vK3H5/qqFMCB9zWEZ2x9sHvDb8I7qOrNGkUS+ouGGcrt -----END RSA PRIVATE KEY----- munin-2.0.25/common/t/tls/node_cert.pem000066400000000000000000000050551243472346000177420ustar00rootroot00000000000000Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=MU, ST=Province of Munin, L=Munin Town, O=Munin Inc., OU=., CN=127.0.0.1/emailAddress=munin@example.org Validity Not Before: Apr 7 09:17:20 2009 GMT Not After : Apr 5 09:17:20 2019 GMT Subject: C=MU, ST=Province of Munin, O=Munin Inc., OU=., CN=127.0.0.1 Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:d6:43:f2:48:72:ef:58:d6:66:89:c9:8a:d2:ce: 24:b6:50:85:a5:83:55:97:cb:fd:d5:f7:38:16:73: 07:8a:eb:7b:3b:af:35:ef:8c:2e:ed:60:f3:78:81: 49:94:75:04:1f:71:5f:09:d1:cf:ec:14:6a:5b:3e: e8:26:6a:e9:e5:9f:dd:fa:96:de:9d:53:7c:18:fb: 11:64:aa:34:3d:e1:86:38:b7:69:54:4e:b6:67:b3: b6:c9:3e:5e:7e:9c:4d:49:21:73:d8:71:3b:c9:1c: 61:fb:71:c1:ff:ad:7a:9c:07:cb:dd:e3:34:29:a3: 34:4b:c1:10:2a:67:31:a2:1d Exponent: 65537 (0x10001) Signature Algorithm: md5WithRSAEncryption 04:0e:00:80:33:73:2f:29:37:73:89:1f:fb:00:df:af:1b:94: a7:e4:da:4d:5f:29:a5:d6:dd:77:71:5a:a2:dc:c0:53:7a:58: 25:fe:4b:64:5d:8f:71:e3:aa:82:3d:14:8c:89:66:cd:9b:ee: b1:bd:fe:d8:65:f7:27:15:a7:56:e1:c9:cc:64:90:1c:e4:62: 2d:ee:c0:53:cb:dd:8a:c6:c0:cb:60:66:1e:ae:7f:17:8f:0e: f5:8e:ab:24:50:8a:a3:36:01:76:23:d1:1e:45:01:1c:6c:6f: f9:a1:b5:89:55:ba:06:3c:2e:ff:09:0f:e5:4b:55:b8:a8:4a: 4e:2f -----BEGIN CERTIFICATE----- MIICYzCCAcwCAQEwDQYJKoZIhvcNAQEEBQAwgZUxCzAJBgNVBAYTAk1VMRowGAYD VQQIExFQcm92aW5jZSBvZiBNdW5pbjETMBEGA1UEBxMKTXVuaW4gVG93bjETMBEG A1UEChMKTXVuaW4gSW5jLjEKMAgGA1UECxMBLjESMBAGA1UEAxMJMTI3LjAuMC4x MSAwHgYJKoZIhvcNAQkBFhFtdW5pbkBleGFtcGxlLm9yZzAeFw0wOTA0MDcwOTE3 MjBaFw0xOTA0MDUwOTE3MjBaMF4xCzAJBgNVBAYTAk1VMRowGAYDVQQIExFQcm92 aW5jZSBvZiBNdW5pbjETMBEGA1UEChMKTXVuaW4gSW5jLjEKMAgGA1UECxMBLjES MBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDW Q/JIcu9Y1maJyYrSziS2UIWlg1WXy/3V9zgWcweK63s7rzXvjC7tYPN4gUmUdQQf cV8J0c/sFGpbPugmaunln936lt6dU3wY+xFkqjQ94YY4t2lUTrZns7bJPl5+nE1J IXPYcTvJHGH7ccH/rXqcB8vd4zQpozRLwRAqZzGiHQIDAQABMA0GCSqGSIb3DQEB BAUAA4GBAAQOAIAzcy8pN3OJH/sA368blKfk2k1fKaXW3XdxWqLcwFN6WCX+S2Rd j3HjqoI9FIyJZs2b7rG9/thl9ycVp1bhycxkkBzkYi3uwFPL3YrGwMtgZh6ufxeP DvWOqyRQiqM2AXYj0R5FARxsb/mhtYlVugY8Lv8JD+VLVbioSk4v -----END CERTIFICATE----- munin-2.0.25/common/t/tls/node_key.pem000066400000000000000000000015671243472346000176010ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDWQ/JIcu9Y1maJyYrSziS2UIWlg1WXy/3V9zgWcweK63s7rzXv jC7tYPN4gUmUdQQfcV8J0c/sFGpbPugmaunln936lt6dU3wY+xFkqjQ94YY4t2lU TrZns7bJPl5+nE1JIXPYcTvJHGH7ccH/rXqcB8vd4zQpozRLwRAqZzGiHQIDAQAB AoGBAIFekSExVFadTVgQemOB2CTERY2D2OBIaMER/amAVqOIPuXwim5Sg9sL2LV/ yn96j7y0ZR+2sQXn5bemKeFYWFQTkKfOr6AxtkkBNOtuaNght5zNnfpjuoQi5KW3 wNPXNWQrQP1mDNZnWPi6S6E/Ocbg9fSwxI8ePsTx7CGUbQFBAkEA9zVAVicl4lCU egmofI67bM4RGL4JeAk+N7u26ezedTxfKrrH9SHAjqa4tD7MB4zKYHPyDgkSsIIL ZNqF+bL4dQJBAN3iw3Gd/yoeSgkZJZ+SzyEfG5dnvL5LFacJeAdPdMEwSEXMldQP ZQCVO3KHM/CyiAaEnXgGTfW5ipZZ0r7+jgkCQCWo9yQo0pynqfbtgb14ARWSTwh1 6vtebRwQfM0mSL2TdOwNiGjPu4X/4COVbX+48xu+jiGVQEOjjBjRMZfYrAECQQCA Zcx7XtZdZRGqmiavZKD/paStxJXv+DsbYdtXP59se6gW3ACHqjDkWXcBG0PvMSCN xQfqgJt0al3MC0Zsx5khAkBV8LsKqrfMuFtQ+XXNNR/PTm2TJyiOKSVgKeJ2aSe1 9W/UYBLPpAFtso6eqj3pIj0Jw8YasSPZ+vi3z5eRFJBs -----END RSA PRIVATE KEY----- munin-2.0.25/common/t/tls/openssl.cnf000066400000000000000000000025221243472346000174440ustar00rootroot00000000000000# # OpenSSL configuration file. # # Establish working directory. dir = . [ ca ] default_ca = CA_default [ CA_default ] serial = $dir/CA/serial database = $dir/CA/index.txt new_certs_dir = $dir/CA/newcerts certificate = $dir/CA/ca_cert.pem private_key = $dir/CA/private/ca_key.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 1024 # Size of keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name prompt = no req_extensions = v3_req [ req_distinguished_name ] C = MU ST = Province of Munin L = Munin Town O = Munin Inc. OU = . CN = 127.0.0.1 emailAddress = munin@example.org [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash munin-2.0.25/contrib/000077500000000000000000000000001243472346000143735ustar00rootroot00000000000000munin-2.0.25/contrib/Net-Server.patch000066400000000000000000000172431243472346000174150ustar00rootroot00000000000000This patch file has been copied off the Debian. Their Net::Server package can be found at http://packages.qa.debian.org/libn/libnet-server-perl.html diff -ur lib.orig/Net/Server/Proto/SSLEAY.pm lib/Net/Server/Proto/SSLEAY.pm --- lib.orig/Net/Server/Proto/SSLEAY.pm 2010-07-09 18:44:48.000000000 +0200 +++ lib/Net/Server/Proto/SSLEAY.pm 2011-04-06 16:32:19.835579843 +0200 @@ -23,7 +23,7 @@ use strict; use vars qw($VERSION $AUTOLOAD @ISA); -use IO::Socket::INET; +use IO::Socket::INET6; use Fcntl (); use Errno (); use Socket (); @@ -38,7 +38,7 @@ } $VERSION = $Net::Server::VERSION; # done until separated -@ISA = qw(IO::Socket::INET); +@ISA = qw(IO::Socket::INET6); sub object { my $type = shift; @@ -48,9 +48,12 @@ my $prop = $server->{'server'}; my $host; - if ($port =~ m/^([\w\.\-\*\/]+):(\w+)$/) { # allow for things like "domain.com:80" + if ($port =~ m/^([\w\.\-\*\/]+):(\w+)$/) { # allow for things like "domain.com:80" (IPv4) ($host, $port) = ($1, $2); } + elsif( $port =~ m/^\[([\:\w\.\-\*\/]+)\]:(\w+)$/ ){ # allow for things like "[::1]:80" (IPv6) + ($host,$port) = ($1,$2); + } elsif ($port =~ /^(\w+)$/) { # allow for things like "80" ($host, $port) = ($default_host, $1); } diff -ur lib.orig/Net/Server/Proto/SSL.pm lib/Net/Server/Proto/SSL.pm --- lib.orig/Net/Server/Proto/SSL.pm 2010-05-05 05:13:03.000000000 +0200 +++ lib/Net/Server/Proto/SSL.pm 2011-04-05 14:39:39.788076698 +0200 @@ -39,10 +39,14 @@ my $prop = $server->{server}; my $host; - ### allow for things like "domain.com:80" + ### allow for things like "domain.com:80" (IPv4) if( $port =~ m/^([\w\.\-\*\/]+):(\w+)$/ ){ ($host,$port) = ($1,$2); + ### allow for things like "[::1]:80" (IPv6) + }elsif( $port =~ m/^\[([\:\w\.\-\*\/]+)\]:(\w+)$/ ){ + ($host,$port) = ($1,$2); + ### allow for things like "80" }elsif( $port =~ /^(\w+)$/ ){ ($host,$port) = ($default_host,$1); diff -ur lib.orig/Net/Server/Proto/TCP.pm lib/Net/Server/Proto/TCP.pm --- lib.orig/Net/Server/Proto/TCP.pm 2010-05-05 06:41:08.000000000 +0200 +++ lib/Net/Server/Proto/TCP.pm 2011-04-05 14:29:26.123577536 +0200 @@ -23,10 +23,10 @@ use strict; use vars qw($VERSION $AUTOLOAD @ISA); -use IO::Socket (); +use IO::Socket::INET6 (); $VERSION = $Net::Server::VERSION; # done until separated -@ISA = qw(IO::Socket::INET); +@ISA = qw(IO::Socket::INET6); sub object { my $type = shift; @@ -35,10 +35,14 @@ my ($default_host,$port,$server) = @_; my $host; - ### allow for things like "domain.com:80" + ### allow for things like "domain.com:80" (IPv4) if( $port =~ m/^([\w\.\-\*\/]+):(\w+)$/ ){ ($host,$port) = ($1,$2); + ### allow for things like "[::1]:80" (IPv6) + }elsif( $port =~ m/^\[([\:\w\.\-\*\/]+)\]:(\w+)$/ ){ + ($host,$port) = ($1,$2); + ### allow for things like "80" }elsif( $port =~ /^(\w+)$/ ){ ($host,$port) = ($default_host,$1); diff -ur lib.orig/Net/Server.pm lib/Net/Server.pm --- lib.orig/Net/Server.pm 2010-07-09 16:55:31.000000000 +0200 +++ lib/Net/Server.pm 2011-04-06 16:33:57.739576765 +0200 @@ -25,7 +25,8 @@ use strict; use vars qw($VERSION); -use Socket qw(inet_aton inet_ntoa AF_INET AF_UNIX SOCK_DGRAM SOCK_STREAM); +use Socket qw(unpack_sockaddr_in sockaddr_family AF_INET AF_INET6 AF_UNIX SOCK_DGRAM SOCK_STREAM); +use Socket6 qw(inet_ntop inet_pton unpack_sockaddr_in6); use IO::Socket (); use IO::Select (); use POSIX (); @@ -356,7 +357,7 @@ push @{ $prop->{host} }, (($prop->{host}->[-1]) x (@{ $prop->{port} } - @{ $prop->{host}})); # augment hosts with as many as port foreach my $host (@{ $prop->{host} }) { $host = '*' if ! defined $host || ! length $host;; - $host = ($host =~ /^([\w\.\-\*\/]+)$/) ? $1 : $self->fatal("Unsecure host \"$host\""); + $host = ($host =~ /^([\[\]\:\w\.\-\*\/]+)$/) ? $1 : $self->fatal("Unsecure host \"$host\""); } $prop->{proto} = [] if ! defined $prop->{proto}; @@ -757,12 +758,14 @@ ### read information about this connection my $sockname = getsockname( $sock ); if( $sockname ){ + $prop->{sockfamily} = sockaddr_family( $sockname ); ($prop->{sockport}, $prop->{sockaddr}) - = Socket::unpack_sockaddr_in( $sockname ); - $prop->{sockaddr} = inet_ntoa( $prop->{sockaddr} ); + = ($prop->{sockfamily} == AF_INET6) ? unpack_sockaddr_in6( $sockname ) : unpack_sockaddr_in( $sockname ); + $prop->{sockaddr} = inet_ntop( $prop->{sockfamily}, $prop->{sockaddr} ); }else{ ### does this only happen from command line? + $prop->{sockfamily} = AF_INET; $prop->{sockaddr} = $ENV{'REMOTE_HOST'} || '0.0.0.0'; $prop->{sockhost} = 'inet.test'; $prop->{sockport} = 0; @@ -773,17 +776,17 @@ if( $prop->{udp_true} ){ $proto_type = 'UDP'; ($prop->{peerport} ,$prop->{peeraddr}) - = Socket::sockaddr_in( $prop->{udp_peer} ); + = ($prop->{sockfamily} == AF_INET6) ? unpack_sockaddr_in6( $prop->{udp_peer} ) : unpack_sockaddr_in( $prop->{udp_peer} ); }elsif( $prop->{peername} = getpeername( $sock ) ){ ($prop->{peerport}, $prop->{peeraddr}) - = Socket::unpack_sockaddr_in( $prop->{peername} ); + = ($prop->{sockfamily} == AF_INET6) ? unpack_sockaddr_in6( $prop->{peername} ) : unpack_sockaddr_in( $prop->{peername} ); } if( $prop->{peername} || $prop->{udp_true} ){ - $prop->{peeraddr} = inet_ntoa( $prop->{peeraddr} ); + $prop->{peeraddr} = inet_ntop( $prop->{sockfamily}, $prop->{peeraddr} ); if( defined $prop->{reverse_lookups} ){ - $prop->{peerhost} = gethostbyaddr( inet_aton($prop->{peeraddr}), AF_INET ); + $prop->{peerhost} = gethostbyaddr( inet_pton($prop->{sockfamily}, $prop->{peeraddr}), $prop->{sockfamily} ); } $prop->{peerhost} = '' unless defined $prop->{peerhost}; @@ -803,7 +806,6 @@ ### user customizable hook sub post_accept_hook {} - ### perform basic allow/deny service sub allow_deny { my $self = shift; @@ -1145,7 +1147,7 @@ or $self->fatal("Can't dup socket [$!]"); ### hold on to the socket copy until exec - $prop->{_HUP}->[$i] = IO::Socket::INET->new; + $prop->{_HUP}->[$i] = IO::Socket::INET6->new(); $prop->{_HUP}->[$i]->fdopen($fd, 'w') or $self->fatal("Can't open to file descriptor [$!]"); diff -ur lib.orig/Net/Server.pm lib/Net/Server.pm --- lib.orig/Net/Server.pm 2011-04-07 11:44:54.973953140 +0200 +++ lib/Net/Server.pm 2011-04-07 14:11:28.637453856 +0200 @@ -824,25 +824,29 @@ && $#{ $prop->{cidr_allow} } == -1 && $#{ $prop->{cidr_deny} } == -1; + ### work around Net::CIDR::cidrlookup() croaking, + ### if first parameter is an IPv4 address in IPv6 notation. + my $peeraddr = ($prop->{peeraddr} =~ /^\s*::ffff:([0-9.]+\s*)$/) ? $1 : $prop->{peeraddr}; + ### if the addr or host matches a deny, reject it immediately foreach ( @{ $prop->{deny} } ){ return 0 if $prop->{peerhost} =~ /^$_$/ && defined($prop->{reverse_lookups}); - return 0 if $prop->{peeraddr} =~ /^$_$/; + return 0 if $peeraddr =~ /^$_$/; } if ($#{ $prop->{cidr_deny} } != -1) { require Net::CIDR; - return 0 if Net::CIDR::cidrlookup($prop->{peeraddr}, @{ $prop->{cidr_deny} }); + return 0 if Net::CIDR::cidrlookup($peeraddr, @{ $prop->{cidr_deny} }); } ### if the addr or host isn't blocked yet, allow it if it is allowed foreach ( @{ $prop->{allow} } ){ return 1 if $prop->{peerhost} =~ /^$_$/ && defined($prop->{reverse_lookups}); - return 1 if $prop->{peeraddr} =~ /^$_$/; + return 1 if $peeraddr =~ /^$_$/; } if ($#{ $prop->{cidr_allow} } != -1) { require Net::CIDR; - return 1 if Net::CIDR::cidrlookup($prop->{peeraddr}, @{ $prop->{cidr_allow} }); + return 1 if Net::CIDR::cidrlookup($peeraddr, @{ $prop->{cidr_allow} }); } return 0; munin-2.0.25/contrib/dump_db000077500000000000000000000006211243472346000157320ustar00rootroot00000000000000#! /usr/bin/perl # Dump a binary dictionary to clear text hash # (c) GPL - Steve Schnepp use strict; use warnings; use Fcntl; # For O_RDWR, O_CREAT, etc. use DB_File; while (my $db_file = shift) { my %hash; tie(%hash, 'DB_File', $db_file, O_RDONLY) or die "$!"; for my $key (sort keys %hash) { my $value = $hash{$key}; print "$key\t$value\n"; } untie(%hash); } munin-2.0.25/contrib/dump_storable000077500000000000000000000004371243472346000171650ustar00rootroot00000000000000#! /usr/bin/perl # Dump a Perl storable file to clear text # (c) GPL - Steve Schnepp use strict; use warnings; use Storable; use Data::Dumper; $Data::Dumper::Indent = 1; while (my $file = shift) { my $ref = Storable::retrieve($file); print Dumper($ref); } munin-2.0.25/contrib/epoch2localtime000077500000000000000000000002041243472346000173670ustar00rootroot00000000000000#! /usr/bin/perl # Convert epoch to human readable time while (my $epoch = shift) { print "" . localtime($epoch) . "\n"; } munin-2.0.25/contrib/import_db000077500000000000000000000007601243472346000163030ustar00rootroot00000000000000#! /usr/bin/perl # Import clear text hash to a binary dictionary # (c) GPL - Steve Schnepp use strict; use warnings; use Fcntl; # For O_RDWR, O_CREAT, etc. use DB_File; my $db_file = shift; unless ($db_file) { print STDERR "usage: $0 db_file [ textfile1 ... textfileN ]\n"; exit 1; }; my %hash; tie(%hash, 'DB_File', $db_file, O_RDWR | O_CREAT) or die "$!"; while(<>) { chomp; my ($key, $value) = split(/\s+/, $_, 2); $hash{$key} = $value; } untie(%hash); munin-2.0.25/contrib/install_rrd.sh000066400000000000000000000012221243472346000172410ustar00rootroot00000000000000#! /bin/sh # Be pedantic set -x set -e # We want to optimize for *compile time* export CFLAGS="-O0 -pipe" # install deps sudo apt-get install libpango1.0-dev libxml2-dev # Download a fixed version wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz tar -xzvf rrdtool-1.4.8.tar.gz cd rrdtool-1.4.8 ./configure \ --disable-dependency-tracking \ --disable-rrdcgi \ --disable-mmap \ --disable-pthread \ --enable-perl \ --enable-perl-site-install \ --disable-ruby \ --disable-lua \ --disable-tcl \ --disable-python \ --disable-libdbi \ --disable-libwrap \ # Leave at the end make sudo make install # Test the install perl -MRRDs -e '' munin-2.0.25/contrib/munin-every-services-all-boxes-build-html.in000066400000000000000000000055721243472346000247560ustar00rootroot00000000000000#!/usr/bin/perl -w =head1 munin-every-services-all-boxes-build-html This is a contributed program and is not installed by default or tested in the release process. Install it in @@LIBDIR@@. This script will generate a page, by services, with all hosts included. handy if you want to watch memory usage on all of your infrastructure. =head1 installation add in munin-cron: find @@HTMLDIR@@ -name "*.png" | @@LIBDIR@@/munin-every-services-all-boxes-build-html [ -x @@LIBDIR@@/munin-html ] && nice find @@HTMLDIR@@ -mtime -30 -name "*.png" | @@LIBDIR@@/munin-every-services-all-boxes-build-html $@; optional for find : -mtime -30 ; will ignore old files mkdir @@LIBDIR@@/every-services-all-boxes chown @@USER@@.@@GROUP@@ @@HTMLDIR@@/every-services-all-boxes in @@CONFDIR@@/templates/munin-overview.tmpl:
every services on all boxes =head1 TODO use the proprer template system in munin, and munin-html to generate the page, not just guessing it from the files =head1 License LGPL-2.1 =head1 Authors / credits 8D Technologies =cut use strict; my $munin_www='@@HTMLDIR@@'; my %host; my %plugin; my %domain; my $htmlpluginfileindex="$munin_www/every-services-all-boxes/index.html"; open (IPF,">$htmlpluginfileindex") || die "cant open $htmlpluginfileindex : $!"; print IPF "every services for all boxes\n"; while (<>) { if (m|$munin_www/([\.\w]+)/([\.-\w]+)-([\.\w]+)-(\w+).png|) { $domain{$1}=1; $host{$2}=$1; $plugin{$3}=1; } } my @prefered_plugins=("memory","swap","hddtemp_smartctl","sensors_temp"); foreach (@prefered_plugins,sort keys %plugin) { my $plugin=$_; my $htmlpluginfile="$munin_www/every-services-all-boxes/munin-$plugin-all-boxes.html"; open (PF,">$htmlpluginfile") || die "cant open $htmlpluginfile : $!"; print PF "$plugin all boxes
\n"; #print "plugin : $_\n"; print IPF qq|$plugin
|; foreach (keys %domain) { #print "domain : $_\n"; my $domain=$_; foreach (sort keys %host) { my $host=$_; if ($host{$_} eq $domain) { #print "host in domain : $host\n"; # test existence here if ( -f "$munin_www/$domain/$host-$plugin-week.png" ) { print PF qq|\n|; print PF "\n"; print PF qq|\n|; print PF qq|\n|; print PF "\n"; } } } } print PF "
$host $plugin
$plugin$plugin
\n"; close PF; } munin-2.0.25/contrib/munin-mergedb.pl000066400000000000000000000101171243472346000174610ustar00rootroot00000000000000#!/usr/bin/perl # -*- cperl -*- # # Merge munin db (datafile{,.storable} / limits) for multi-update masters # environment # # (c) GPL - Adrien "ze" Urban use warnings; use strict; use Storable; use Munin::Master::Utils; # Exemple of config (munin-merge.conf): # # what to merge ? # merge_datafile yes # merge_limits yes # # destination is the directory having this file # # # source directories to merge from (option should be used multiple times) # merge_source_dbdir /nfs/munin/db/updatehost1 # merge_source_dbdir /nfs/munin/db/updatehost2 # merge_source_dbdir /nfs/munin/db/updatehost3 # merge_source_dbdir /nfs/munin/db/updatehost4 my $configfile_name = 'munin-merge.conf'; my $config_type = { 'merge_source_dbdir' => 'ARRAY', 'merge_datafile' => 'BOOL', 'merge_limits' => 'BOOL', }; my $config = { 'merge_dbdir' => undef, 'merge_source_dbdir' => [], 'merge_datafile' => 0, 'merge_limits' => 0, }; sub usage() { print STDERR <{'merge_dbdir'}; my $file = $dbdir . "/" . $configfile_name; open FILE, "<", $file or die "open: $!\n"; while () { chomp; next if (/^[[:space:]]*#/); # comment next if (/^[[:space:]]*$/); # empty line unless (/^[[:space:]]*([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]*$/) { die "$.: Unrecogized line format\n"; } my ($key, $value) = ($1, $2); if (not defined $config_type->{$key}) { die "$.: $key: unrecognized option\n"; } if ('ARRAY' eq $config_type->{$key}) { push @{$config->{$key}}, $value; } elsif ('BOOL' eq $config_type->{$key}) { if ($value =~ /(yes|y|1|true)/i) { $config->{$key} = 1; } elsif ($value =~ /(no?|0|false)/i) { $config->{$key} = 0; } else { die "$.: unrecognized boolean: $value\n"; } } else { die "INTERNAL ERROR: $config_type->{$key}: " . "type not implemented\n"; } } close FILE; } sub check_sources() { if (0 == scalar(@{$config->{'merge_source_dbdir'}})) { die "No source dbdir. " . "Should I produce a result from thin air?\n"; } # no datafile, means it's not really a munin dbdir for my $srcdir (@{$config->{'merge_source_dbdir'}}) { unless (-f "$srcdir/datafile") { die "$srcdir: datafile not found"; } } } sub merge_plaintext($) { my $name = shift; my $data = []; my $version = undef; for my $srcdir (@{$config->{'merge_source_dbdir'}}) { my $srcfile = "$srcdir/$name"; unless (-f $srcfile) { die "$srcdir: $name not found"; } open FILE, "<", $srcfile or die "open: $srcfile: $!\n"; my $ver = ; if (defined $version) { die "$srcfile: versions differs: $version vs $ver\n" if ($ver ne $version); } else { $version = $ver; } push @$data, ; close FILE; #print $name, " ", scalar(@$data), " ", $srcdir, "\n"; } my $dstfile = $config->{'merge_dbdir'} . "/" . $name; my $dsttmp = $dstfile . ".tmp.$$"; open FILE, ">", $dsttmp or die "open: $dsttmp: $!\n"; print FILE $version, @$data; close FILE; rename $dsttmp, $dstfile or die "mv $dsttmp $dstfile: $!\n"; } sub merge_datafile_storable() { my $name = 'datafile.storable'; my $data = undef; for my $srcdir (@{$config->{'merge_source_dbdir'}}) { my $srcfile = "$srcdir/$name"; unless (-f $srcfile) { die "$srcdir: $name not found"; } my $info = retrieve($srcfile); if (defined $data) { $data = munin_overwrite($data, $info); } else { $data = $info; } } my $dstfile = $config->{'merge_dbdir'} . "/" . $name; my $dsttmp = $dstfile . ".tmp.$$"; Storable::nstore($data, $dsttmp); rename $dsttmp, $dstfile or die "mv $dsttmp $dstfile: $!\n"; } sub merge_datafile() { merge_plaintext('datafile'); merge_datafile_storable(); } sub merge_limits() { merge_plaintext('limits'); } usage unless (1 == scalar(@ARGV)); $config->{'merge_dbdir'} = shift @ARGV; load_config; check_sources; merge_datafile if ($config->{'merge_datafile'}); merge_limits if ($config->{'merge_limits'}); exit 0; # vim: syntax=perl ts=8 munin-2.0.25/contrib/munin-node-debug000077500000000000000000000140071243472346000174600ustar00rootroot00000000000000#! /usr/bin/perl # Munin node that presents as many virtual hosts, plugins & fields # as needed to be able to : # - emulate a HUGE network to stress the munin-master server # - serve as a basis for protocol debugging # # Copyright (C) 2010 Steve Schnepp under the GPLv2 use strict; use warnings; use IO::Socket; use IO::Select; use Getopt::Long; # No buffering $| = 1; my $nb_servers = 3; my $nb_plugins = 30; my $fields_per_plugin = 5; my $starting_port = 24949; my $spoolfetch; my $starting_epoch = -3600; # 1 hour from now my $dump_config; my $is_debug; my $help; my $update_rate = 10; my $spoolfetch_rate = 5; my $listen = "localhost"; my $arg_ret = GetOptions( "nb-plugins|n=i" => \$nb_plugins, "nb-fields|f=i" => \$fields_per_plugin, "nb-servers|s=i" => \$nb_servers, "update-rate=i" => \$update_rate, "startint-port|p=i" => \$starting_port, "listen=s" => \$listen, "update-rate=i" => \$update_rate, "spoolfetch" => \$spoolfetch, "spoolfetch-rate=i" => \$spoolfetch_rate, "starting-epoch=i" => \$starting_epoch, "dump|d" => \$dump_config, "help|h" => \$help, "debug" => \$is_debug, ); if ($help) { print qq{Usage: $0 [options] Options: --help View this message. -s --nb-servers Number of servers [3] -p --start-port Starting TCP listening port [24949] -n --nb-plugins Number of plugins per server [30] -f --nb-fields Number of fields per plugins [5] --update-rate Update rate of plugins (in seconds) [10] --listen Which IP to bind [localhost]. Use '' or '*' to bind to every interface. --spoolfetch Be spoolfetch capable --starting-epoch Starting epoch: no data will available before. Can be relative to now if negative [-3600] -d --dump Only dump a generated munin.conf part [no] --debug Print debug informations [no] }; exit 0; } # Convert relatives starting_epoch to absolute $starting_epoch = time + $starting_epoch if ($starting_epoch < 0); if ($dump_config) { for (my $i = 0; $i < $nb_servers; $i++) { my $port = $starting_port + $i; print "[host$port.debug.lan]\n"; print " address 127.0.0.1\n"; print " port $port\n"; print "\n"; } # Only dump config exit; } # start the servers my @servers; for (my $i = 0; $i < $nb_servers; $i ++) { my $port = $starting_port + $i; # LocalAddr == * doesn't work, it has to be empty my $localaddr = ($listen eq '*') ? '' : $listen; debug("starting server on port $listen:$port"); my $server = IO::Socket::INET->new( "LocalPort" => $port, "LocalAddr" => $localaddr, "Listen" => 5, "ReuseAddr" => 1, "Proto" => "tcp", ) or die($!); push @servers, $server; } # Ignoring SIG_CHILD debug("Ignoring SIG_CHILD"); $SIG{CHLD} = 'IGNORE'; my $select = IO::Select->new(@servers); while (my @ready = $select->can_read()) { foreach my $ready_fh (@ready) { my $client = $ready_fh->accept(); if (! fork()) { debug("[$$] Serving new client"); service($client); # Exit the child debug("[$$] Finished"); exit; } } } sub service { my $client = shift; my $hostname = "host".$client->sockport().".debug.lan"; print $client "# munin node at $hostname\n"; while (my $line = <$client>) { chomp($line); debug("[$$] client of $hostname asked : $line"); if ($line =~ m/^list /) { for (my $i = 0; $i < $nb_plugins; $i ++) { print $client "debug_plugin_$i "; } print $client "\n"; } elsif ($line =~ m/^cap (\w+)/) { my @caps = "multigraph"; push @caps, "spool" if $spoolfetch; print $client "cap @caps\n"; } elsif ($line =~ m/^config (\w+)/) { my $plugin_number = get_plugin_number($1); my $plugin_name = "debug_plugin_$plugin_number"; print $client "graph_title Debug plugin $plugin_number\n"; print $client "update_rate $update_rate\n"; for (my $i = 0; $i < $fields_per_plugin; $i ++) { print $client "field_". $plugin_number . "_$i.label field $i of plugin $plugin_name on $hostname\n"; print $client "field_". $plugin_number . "_$i.type GAUGE\n"; } print $client ".\n"; } elsif ($line =~ m/^fetch (\w+)/) { my $plugin_number = get_plugin_number($1); for (my $i = 0; $i < $fields_per_plugin; $i ++) { my $value = sin( (time / 3600) * $plugin_number + $i); print $client "field_". $plugin_number . "_$i.value $value\n"; } print $client ".\n"; } elsif ($line =~ m/^spoolfetch (\d+)/) { my $timestamp = $1; # Cannot start before $starting_epoch print "asked $timestamp, " if $is_debug; $timestamp = ($timestamp < $starting_epoch) ? $starting_epoch : $timestamp; print "starting at $starting_epoch, using $timestamp, \n" if $is_debug; # Only send something every $spoolfetch_rate * $update_rate if ( $timestamp > time - $spoolfetch_rate * $update_rate) { print $client ".\n"; return; } # Sends spools strictly > LastSpooled for (my $epoch = ($timestamp - $timestamp % $update_rate + $update_rate); $epoch < time; $epoch += $update_rate) { for (my $plugin_number = 0; $plugin_number < $nb_plugins; $plugin_number ++) { my $plugin_name = "debug_plugin_$plugin_number"; print $client "multigraph $plugin_name\n"; print $client "graph_title Debug plugin $plugin_number\n"; print $client "update_rate $update_rate\n"; for (my $i = 0; $i < $fields_per_plugin; $i ++) { print $client "field_". $plugin_number . "_$i.label field $i of plugin $plugin_name on $hostname\n"; print $client "field_".$plugin_number."_$i.type GAUGE\n"; my $value = sin( ($epoch / 3600) * $plugin_number + $i); print $client "field_".$plugin_number."_$i.value $epoch:$value\n"; } } } print $client ".\n"; } elsif ($line =~ m/^quit/) { return; } else { print $client "# Command not found\n"; } } } sub get_plugin_number { my $plugin_name = shift; my $plugin_number = $1 if ($plugin_name =~ m/(\d+)/); return $plugin_number; } sub debug { print join(" ", @_) . "\n" if $is_debug; } __END__ munin-2.0.25/contrib/perf/000077500000000000000000000000001243472346000153275ustar00rootroot00000000000000munin-2.0.25/contrib/perf/db_files.pl000066400000000000000000000054341243472346000174410ustar00rootroot00000000000000#! /usr/bin/perl # Compare timings with BDB vs files use strict; use warnings; use DB_File; use Munin::Common::DictFile; my $nb_files = (shift || 1000); my $nb_cmp = (shift || -10); print "using db_$$\n"; mkdir "db_$$"; chdir "db_$$"; sub db_update { my ($filename, $epoch, $value, $db_type) = @_; my %hash; tie %hash, 'DB_File', "update.db", O_CREAT|O_RDWR, 0666, $db_type; db_update_conn($filename, $epoch, $value, \%hash); untie %hash; } sub db_update_conn { my ($filename, $epoch, $value, $h) = @_; $h->{$filename} = "$epoch:$value"; } sub fl_update { my ($filename, $epoch, $value) = @_; my $last_filename = "$filename.last"; my $tmp_filename = "$last_filename.tmp"; open (FILE, "> $tmp_filename"); print FILE "$epoch:$value\n"; close (FILE); rename ($tmp_filename, $last_filename); } sub fh_update { my ($filename, $hash) = @_; my $last_filename = "$filename.last"; my $tmp_filename = "$last_filename.tmp"; open (FILE, "> $tmp_filename"); foreach my $key (keys %$hash) { print FILE $key . "\t" . $hash->{$key} . "\n"; } close (FILE); rename ($tmp_filename, $last_filename); } use Benchmark qw(:all); use Storable; use SDBM_File; STDOUT->autoflush(1); cmpthese($nb_cmp, { 'fl_update' => sub { print "Starting fl_update: "; for (my $i = 0; $i < $nb_files; $i ++) { fl_update("test$i.rrd", $i, rand($i)); } print "done.\n"; }, 'fh_update' => sub { print "Starting fh_update: "; my %hash; for (my $i = 0; $i < $nb_files; $i ++) { db_update_conn("test$i.rrd", $i, rand(), \%hash); } fh_update("update.txt", \%hash); print "done.\n"; }, 'db_upda_c' => sub { print "Starting db_upda_c: "; my %hash; tie %hash, 'DB_File', "update_c.db", O_CREAT|O_RDWR, 0666, $DB_HASH; for (my $i = 0; $i < $nb_files; $i ++) { db_update_conn("test$i.rrd", $i, rand(), \%hash); } untie %hash; print "done.\n"; }, 'sdbm' => sub { print "Starting sdbm: "; my %hash; tie %hash, 'SDBM_File', "update_sdbm.db", O_CREAT|O_RDWR, 0666; for (my $i = 0; $i < $nb_files; $i ++) { db_update_conn("test$i.rrd", $i, rand(), \%hash); } untie %hash; print "done.\n"; }, 'dictfile' => sub { print "Starting dictfile: "; my %hash; tie %hash, 'Munin::Common::DictFile', "update_munin_dict.txt", O_CREAT|O_RDWR, 0666; for (my $i = 0; $i < $nb_files; $i ++) { db_update_conn("test$i.rrd", $i, rand(), \%hash); } untie %hash; %hash = (); print "done.\n"; }, 'storable' => sub { print "Starting storable: "; my $hash = ( -e "update.storable" ) ? Storable::retrieve("update.storable") : {}; for (my $i = 0; $i < $nb_files; $i ++) { db_update_conn("test$i.rrd", $i, rand(), $hash); } Storable::nstore($hash, "update.storable.$$"); rename("update.storable.$$", "update.storable"); print "done.\n"; }, }); munin-2.0.25/contrib/perf/rrd_perf.pl000077500000000000000000000043671243472346000175040ustar00rootroot00000000000000#! /usr/bin/perl # RRD update perf testing # (c) GPL - Steve Schnepp use strict; use warnings; use RRDs; use Time::HiRes; use Getopt::Long; my $graph_interval; my $graph_ratio = 100; my $verbose; GetOptions( "g=i" => \$graph_interval, "r=i" => \$graph_ratio, "verbose" => \$verbose, ) or die "invalid options"; my $nb_rrd = (shift || 100); my $nb_rrd_per_dir = (shift || 100); my $step = (shift || 300); my $heartbeat = $step * 2; my $rrd_dir = "rrds-$$"; mkdir $rrd_dir; my @rrds; # create all the rrds print "creating rrds in $rrd_dir\n"; for (my $rrd_number=0; $rrd_number < $nb_rrd; $rrd_number ++) { my $rrd_dir_num = int ($rrd_number / $nb_rrd_per_dir); my $rrdfilename = "$rrd_dir/$rrd_dir_num/$rrd_number.rrd"; mkdir "$rrd_dir/$rrd_dir_num"; print STDERR "creating RRD $rrdfilename\n"; RRDs::create( $rrdfilename, #"--start", "-10y", "-s", "$step", "DS:42:GAUGE:$heartbeat:U:U", "RRA:AVERAGE:0.5:1:576", # resolution 5 minutes "RRA:MIN:0.5:1:576", "RRA:MAX:0.5:1:576", "RRA:AVERAGE:0.5:6:432", # 9 days, resolution 30 minutes "RRA:MIN:0.5:6:432", "RRA:MAX:0.5:6:432", "RRA:AVERAGE:0.5:24:540", # 45 days, resolution 2 hours "RRA:MIN:0.5:24:540", "RRA:MAX:0.5:24:540", "RRA:AVERAGE:0.5:288:450", # 450 days, resolution 1 day "RRA:MIN:0.5:288:450", "RRA:MAX:0.5:288:450", ); push @rrds, $rrdfilename; } # Simulating munin's graphing in a sub process if ($graph_interval && ! fork()) { while(1) { my $offset = int rand($nb_rrd); for (my $i = 0; $i < $nb_rrd * $graph_ratio / 100; $i++) { my $rrdfilename = $rrds[($offset + $i) % $nb_rrd]; print STDERR "graphing RRD $rrdfilename\n"; RRDs::graph( '/dev/null', "DEF:a=$rrdfilename:42:AVERAGE", "LINE1:a", ); } } continue { sleep 1 / $graph_interval; } exit; } # Simulate a munin's update workload while (1) { my $epoch = time; for my $rrdfilename (@rrds) { my $value = 100 * sin($epoch) + rand(); print STDERR "updating RRD $rrdfilename\n"; RRDs::update( $rrdfilename, "$epoch:$value", ); } sleep($step); } sub get_rrd_filename { my $rrd_number = shift; } munin-2.0.25/contrib/perf/test_weak.pl000066400000000000000000000011351243472346000176520ustar00rootroot00000000000000#! /usr/bin/perl use warnings; use strict; use File::Temp; use Data::Dumper; use Storable qw(nstore_fd fd_retrieve); use Scalar::Util qw(weaken isweak); my $number = shift || 10; my $a = {}; for my $i (0 .. $number) { $a->{$i} = { "$i$i" => "$i$i", "$i$i" => "$i$i", }; } for my $i (0 .. $number) { $a->{$i}{next} = $a->{ ($i + 1) % $number }; weaken($a->{$i}{next}) if $ENV{WEAKEN}; } my $temp_storable = File::Temp->new(); nstore_fd($a, $temp_storable); for my $j (0 .. ($number * $number)) { $temp_storable->seek( 0, SEEK_SET ); $a = fd_retrieve($temp_storable); } print Dumper($a); munin-2.0.25/contrib/python-plugin/000077500000000000000000000000001243472346000172105ustar00rootroot00000000000000munin-2.0.25/contrib/python-plugin/README000066400000000000000000000010341243472346000200660ustar00rootroot00000000000000This is a nice OO plugin framework for python plugins. There is an example plugin for watching the number of arp entries on a host. If the project is provided with install Makefile targets, and a patches to give the python module a less generic name than "munin" (in Perl I would have called it Munin::Plugin::OO) then we can make it an official part of the project. Needed is also a python version of Munin::Plugin. Please see https://code.launchpad.net/~msiebuhr/+junk/python-munin for the latest and greatest. Nicolai 26-march-2009 munin-2.0.25/contrib/python-plugin/arp000077500000000000000000000012721243472346000177220ustar00rootroot00000000000000#!/usr/bin/env python """ Linux ARP plugin test Morten Siebuhr sbhr@sbhr.dk 12/12 2008 """ from munin import Plugin from os.path import exists p = Plugin("ARP Cache", "MAC addresses", "Network") # Information p.info = "Shows how many interfaces are listed in the system's ARP cache" p.args = "--base 1000 -l 0" # Autoconfigure p.autoconf = lambda: exists("/proc/net/arp") # Populate with data for line in open("/proc/net/arp").readlines(): if "IP address" in line: continue (ip, hw, flags, address, mogl, dev) = line.split() if not dev in p: p[dev].value = 0 p[dev].label = dev p[dev].draw = "AREA" p[dev].value += 1 # Run it! p.run() munin-2.0.25/contrib/python-plugin/munin.py000077500000000000000000000112561243472346000207200ustar00rootroot00000000000000#!/usr/bin/env python """ Makes it easy to create munin plugins... http://munin-monitoring.org/wiki/protocol-config Morten Siebuhr sbhr@sbhr.dk 12/12 2008 """ def getOptionOrDefault(option, default=None): from os import environ return environ.setdefault(option, default) class DataSource(object): """Represents a single data source. This class should not be directly created by the user - this is done transparently by the Plugin-class.""" __slots__ = ['label', 'cdef', 'draw', 'graph', 'info', 'extinfo', 'max', 'min', 'negative', 'type', 'warning', 'critical', 'colour', 'skipdraw', 'sum', 'stack', 'line', 'value'] # Allowed draw modes _draw_modes = ['AREA', 'STACK', \ 'LINE1', 'LINE2', 'LINE3', \ 'LINESTACK1', 'LINESTACK2', 'LINESTACK3', \ 'AREASTACK'] def get_config(self): if hasattr(self, "draw"): assert self.draw in self._draw_modes data = dict() for attr in self.__slots__: if attr == 'value': continue if hasattr(self, attr): data[attr] = self.__getattribute__(attr) return data def get_value(self, data_source_name): assert hasattr(self, "value") if callable(self.value): return self.value(data_source_name) return self.value class Plugin(object): """Facilitates OO creation of Munin plugins. #!/usr/bin/env python from munin import Plugin p = Plugin("Test measurement", "test/second", category="junk") p.autoconf = False for name, value in {'a': 1, 'b': 2}: p[ name ].label = name p[ name ].value = value p.run() (It will itself detect how the script is called and create the proper output.) * If 'autoconf' is a callable, it will be called when running autoconf. """ def __init__(self, title, vlabel, category="misc", info="", args="", scale=True): """Sets up the plugin; title, vertical label, category -- all things that are global for the plugin. """ self.title = title self.vlabel = vlabel self.category = category self.info = info self.args = args self.scale = scale self._values = dict() assert type(title) is str assert type(vlabel) is str assert type(category) is str def __getitem__(self, key): if not key in self._values: self._values[ key ] = DataSource() return self._values[ key ] def __setitem__(self, key, value): self._values[key] = value def __delitem__(self, key): if key in self._values: del self._values[key] def __contains__(self, key): return key in self._values def _print_values(self): """Print the values for all registered data sources. Similar to running with "values"-argument.""" for prefix, line in self._values.items(): value = line.get_value(prefix) assert type(value) is int print "%s.value %s" % (prefix, value) def _print_config(self): """Print the output needed for setting up the graph - i.e. when the plugin is run with "config"-argument.""" # Print graph_-variables for prop in ['title', 'category', 'vlabel', 'info', 'args', 'draw']: if not prop in self.__dict__: continue if not self.__dict__[ prop ]: continue print "graph_%s %s" % (prop, self.__dict__[ prop ]) # Print setup for individual lines for prefix, line in self._values.items(): # The "label" attribute MUST be defined assert "label" in line.get_config().keys(), "No 'label' defined." for attr, value in line.get_config().items(): print "%s.%s %s" % (prefix, attr, value) def _print_autoconf(self): """Running autoconf-mode.""" aconf = False if hasattr(self, "autoconf"): if callable(self.autoconf): aconf = self.autoconf() else: aconf = self.autoconf if bool(aconf): print "YES" else: print "NO" def run(self, force_mode=None): """Run the plugin and "do the right thing"^(TM).""" mode = force_mode if mode == None: import sys if len(sys.argv) == 2: mode = sys.argv[1] if mode == "autoconf": self._print_autoconf() return if mode == "config": self._print_config() return self._print_values() munin-2.0.25/contrib/python-plugin/setup.py000077500000000000000000000010551243472346000207260ustar00rootroot00000000000000#!/usr/bin/env python from distutils.core import setup from subprocess import Popen, PIPE from glob import glob # Get the current revision from SVN try: p = Popen(['svnversion'], stdout=PIPE) version = p.stdout.read().strip() except: version = "unknown" setup( name = "python-munin", version = version, url = "http://dev.sbhr.dk/svn/python-munin", author = "Morten Siebuhr", author_email = "sbhr@sbhr.dk", description = "", #packages = ['munin'], py_modules = ['munin'], ) munin-2.0.25/contrib/python-plugin/test.py000077500000000000000000000012621243472346000205450ustar00rootroot00000000000000#!/usr/bin/env python """ Makes it easy to create munin plugins... http://munin-monitoring.org/wiki/protocol-config Morten Siebuhr sbhr@sbhr.dk 12/12 2008 """ from munin import Plugin p = Plugin("Approx cache", "files", "Approx") p.info = "Shows how many files the Approx cache stores, split by file-type." def test(data_source): if data_source == 'deb': return 42 return 24 # Set up graph p['deb'].label = "deb files" p['deb'].value = test p['deb'].info = "Number of .deb-files." p['tar.gz'].label = "tar.gz files" p['tar.gz'].value = test #p['gzip'].value = 123 # Run print "AUTOCONFIG" p.run("autoconf") print "CONFIG" p.run("config") print "PLAIN" p.run() munin-2.0.25/contrib/rrdcopy000077500000000000000000000062251243472346000160100ustar00rootroot00000000000000#! /usr/bin/perl # Copy data from one RRD to another # (c) LGPL - 2009-2011 - Steve Schnepp # # Usage : rrdcopy # # Both RRD have to exist and have the same DS (DataSource). # The tool copies all the datasources from the sources into the destination # like you mean it: # - start is the oldest value from src # (but cannot be younger as the youngest from dst) # - stop is the youngest value from src # - asks src for the AVERAGED value on each step time. # # It doesn't do any MIN/MAX replication since this information # is usually not accurate at all when resampling. # # The environmment variable DEBUG is used like : # 0/absent - no debug # 1 - emit to stdout all the updates to dst # 2 - emit also the data that try # # XXX - It depends on RRDs.pm ... # ... as I'm waiting for a patch to use the plain rrdtool cli :-) # # It was known as the rrdmove tool from the pmptools project. # - I changed its name (as data is copied, not moved) # - I changed its hosting (way more useful for munin than for pmptools) use strict; use warnings; use Carp; use Data::Dumper; use RRDs; my ($src_rrd, $dst_rrd) = @ARGV; my $infos_src = RRDs::info($src_rrd); my $infos_dst = RRDs::info($dst_rrd); #get ds_names my @ds_names; foreach my $key (keys %$infos_src) { if ($key =~ /^ds\[(\w+)\]\.type$/) { push @ds_names, $1; } } my ($start, $stop, $step); $step = $infos_dst->{'step'}; $stop = $infos_src->{'last_update'}; my @rra_names; foreach my $key (keys %$infos_dst) { if ($key =~ /^rra\[(\w+)\]\.cf$/) { push @rra_names, $1; } } foreach my $rra_name (sort {$a <=> $b} @rra_names) { my $rows = $infos_dst->{"rra[$rra_name].rows"}; my $pdp_per_row = $infos_dst->{"rra[$rra_name].pdp_per_row"}; my $rra_start = $stop - $rows * $pdp_per_row * $step; if ( (! defined $start) || $start > $rra_start) { $start = $rra_start; } print "rra[$rra_name]:$rra_start(" . (scalar localtime($rra_start)) . "):$start(" . (scalar localtime($start)) .")\n" if $ENV{DEBUG} && $ENV{DEBUG} >= 2; } #$start = 1240020352; # Converting my ($step_sample) = $step * 128; for (my $epoch = $start; $epoch <= $stop; $epoch += $step_sample) { my @rrd_updates; # Resampling by taking the average value for the period my ($fetched_epoch, $fetched_step, $names, $data) = RRDs::fetch( $src_rrd, "AVERAGE", "--start", $epoch, "--end", $epoch + $step_sample, ); for my $line ( @$data ) { my %current_data; for ( my $ds_idx = 0; $ds_idx < scalar @$line; $ds_idx ++) { my $name = $names->[$ds_idx]; my $value = $line->[$ds_idx]; $current_data{$name} = $value; } # Create the template my @values = map { defined $current_data{$_} ? $current_data{$_} : "U" } @ds_names; # Ignore lines with all values set to "U" next unless grep { $_ ne "U" } @values; push @rrd_updates, "$fetched_epoch:" . join(':', @values); $fetched_epoch += $step; } next unless @rrd_updates; print "RRDs::update($dst_rrd, --template, " . join(':', @ds_names) . ", " . join(", ", @rrd_updates) . "\n" if $ENV{DEBUG}; RRDs::update( $dst_rrd, "--template", join(':', @ds_names), @rrd_updates, ) or die "RRDs::update: $!"; } munin-2.0.25/contrib/rtbtrace.pl000077500000000000000000000046541243472346000165520ustar00rootroot00000000000000#! /usr/bin/perl # Real-time visualization of block accesses # with a layout as old DOS defraggers # # Idea borrowed from seekwatcher [http://oss.oracle.com/~mason/seekwatcher/] # Copyright (C) 2010 - Steve Schnepp - GPL use strict; use warnings; use Curses; use Time::HiRes qw(sleep); # Should not buffer anything since we are "real-time" $| = 1; # Give the blocksize as first arg my $nb_blocks_1k = shift; if (! $nb_blocks_1k) { die "Should give the number of 1k blocks as first arg"; } my $win = Curses::new(); # Hide cursor Curses::curs_set(0); my $last_tstp = 0; my $tstp_step = 1 / 25; # 25 Hz # use non-blocking IO on stdin. # Otherwise when there is no activity, the drawing is stalled use IO::Handle; STDIN->blocking(0); my $io_ops = {}; while(1) { my $line = <>; if (! $line) { sleep $tstp_step; $io_ops = {}; draw($io_ops); $last_tstp += $tstp_step; next; } chomp($line); # 8,0 3 1 0.000000000 697 G W 223490 + 8 [kjournald] my ($device, $cpu_id, $seqno, $tstp, $pid, $action, $mode, $offset, $dummy, $length, $detail) = split(/ +/, trim($line), 11); # Only take complete lines next unless $detail; # Only take the C (completed) requests to take care of an eventual buffering/queuing next unless $action eq 'C'; # Flush if needed. Assumes the data is timestamp ordered if ($tstp > $last_tstp + $tstp_step) { $last_tstp += $tstp_step; # flush to img draw($io_ops); # flush the in-flight IO ops $io_ops = {}; } # Fill the in-flight IO ops $io_ops->{$offset} = [ $mode, $length ]; } continue { } sub draw { my $io_ops = shift; use Term::Size; my ($columns, $rows) = Term::Size::chars *STDOUT{IO}; $rows --; # last row is status row my $nb_chars = $columns * $rows; my $blocks_per_char = int ($nb_blocks_1k * 2 / $nb_chars) + 1; # Each frame we redraw everything $win->clear(); # Update the status line $win->addstr($rows, 0, sprintf("%.2f", $last_tstp)); # Iterate & fill the window while (my ($offset, $value) = each %$io_ops) { my $offset_in_chars = $offset / $blocks_per_char; my $x = $offset_in_chars / $columns; my $y = $offset_in_chars % $columns; my $op = ($value->[0] =~ m/R/ ? "R" : "W"); my $len = int($value->[1] / $blocks_per_char) + 1; $win->addstr($x, $y, $op x $len); } sleep($tstp_step); $win->refresh(); } # haaa.. this should really be part of Perl :-) sub trim { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; } munin-2.0.25/dev_scripts/000077500000000000000000000000001243472346000152605ustar00rootroot00000000000000munin-2.0.25/dev_scripts/common.sh000066400000000000000000000002161243472346000171030ustar00rootroot00000000000000#!/bin/bash BASEDIR=$(readlink -f -- "$FINDBIN/..") DESTDIR="$BASEDIR/sandbox" PERLSITELIB=$(perl -V:sitelib | cut -d"'" -f2) cd $BASEDIR munin-2.0.25/dev_scripts/disable_tls000077500000000000000000000003571243472346000175000ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR perl -pi -e "s/^tls .*/tls disabled/" $DESTDIR/etc/opt/munin/munin-node.conf perl -pi -e "s/^tls .*/tls disabled/" $DESTDIR/etc/opt/munin/munin.conf munin-2.0.25/dev_scripts/enable_tls000077500000000000000000000003571243472346000173230ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR perl -pi -e "s/^tls .*/tls paranoid/" $DESTDIR/etc/opt/munin/munin-node.conf perl -pi -e "s/^tls .*/tls paranoid/" $DESTDIR/etc/opt/munin/munin.conf munin-2.0.25/dev_scripts/install000077500000000000000000000034301243472346000166540ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR if [ $1 ]; then ./dev_scripts/stop_munin-node ./dev_scripts/stop_munin-sched rm -rf sandbox mkdir sandbox make clean || exit echo "**********************************************************************" fi make DESTDIR=$DESTDIR HTMLDIR=$DESTDIR/www/munin || exit fakeroot make install-common-prime install-master-prime install-node-prime install-plugins-prime install-man install-async DESTDIR=$DESTDIR HTMLDIR=$DESTDIR/www/munin || exit if [ $1 ]; then echo "**********************************************************************" fakeroot make install-plugins-prime install-plugins-java DESTDIR=$DESTDIR HTMLDIR=$DESTDIR/www/munin || exit echo "**********************************************************************" perl -pi -e "s/port 4949/port 4948/; s/user root/user $USER/; s/group root/group $GROUPS/; s|^(port .*)|\$1 tls disabled tls_private_key $BASEDIR/common/t/tls/node_key.pem tls_certificate $BASEDIR/common/t/tls/node_cert.pem tls_ca_certificate $BASEDIR/common/t/tls/CA/ca_cert.pem tls_verify_certificate yes tls_verify_depth 5 |; " $DESTDIR/etc/opt/munin/munin-node.conf perl -pi -e "s/(address 127\.0\.0\.1)/\$1\n port 4948/; s|(# a simple host tree)|tls disabled tls_private_key $BASEDIR/common/t/tls/master_key.pem tls_certificate $BASEDIR/common/t/tls/master_cert.pem tls_ca_certificate $BASEDIR/common/t/tls/CA/ca_cert.pem tls_verify_certificate yes tls_verify_depth 5 \$1|" $DESTDIR/etc/opt/munin/munin.conf echo "**********************************************************************" ./dev_scripts/run munin-node-configure --shell --families=contrib,auto | sh -x fi munin-2.0.25/dev_scripts/query_munin_node000077500000000000000000000000641243472346000205660ustar00rootroot00000000000000#!/bin/bash echo -e "$*\nquit" | nc localhost 4948 munin-2.0.25/dev_scripts/restart_munin-node000077500000000000000000000001171243472346000210220ustar00rootroot00000000000000#!/bin/bash ./dev_scripts/stop_munin-node ./dev_scripts/start_munin-node "$@" munin-2.0.25/dev_scripts/restart_munin-sched000077500000000000000000000001211243472346000211560ustar00rootroot00000000000000#!/bin/bash ./dev_scripts/stop_munin-sched ./dev_scripts/start_munin-sched "$@" munin-2.0.25/dev_scripts/run000077500000000000000000000004761243472346000160210ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR usage() { echo "Usage: $0 " exit 1 } if [ -z "$1" ]; then usage fi RUN=$(find $DESTDIR -name $1 -type f -executable) shift if [ -z "$RUN" ]; then usage fi env PERL5LIB=$DESTDIR$PERLSITELIB $RUN "$@" munin-2.0.25/dev_scripts/start_munin-node000077500000000000000000000005061243472346000204750ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR if [ -f $DESTDIR/var/run/munin/munin-node.pid ]; then echo "Pid file found. Not starting" else env PERL5LIB=$DESTDIR/$PERLSITELIB $DESTDIR/opt/munin/sbin/munin-node "$@" fi tail -f $DESTDIR/opt/munin/log/munin/munin-node.log munin-2.0.25/dev_scripts/start_munin-sched000077500000000000000000000005101243472346000206310ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR if [ -f $DESTDIR/var/run/munin/munin-sched.pid ]; then echo "Pid file found. Not starting" else env PERL5LIB=$DESTDIR/$PERLSITELIB $DESTDIR/opt/munin/sbin/munin-sched "$@" fi tail -f $DESTDIR/opt/munin/log/munin/munin-sched.log munin-2.0.25/dev_scripts/stop_munin-node000077500000000000000000000004021243472346000203200ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR if [ -f $DESTDIR/var/run/munin/munin-node.pid ]; then cat $DESTDIR/var/run/munin/munin-node.pid | xargs kill else echo "Pid file not found. Not stopping" fi munin-2.0.25/dev_scripts/stop_munin-sched000077500000000000000000000004031243472346000204620ustar00rootroot00000000000000#!/bin/bash FINDBIN=$(cd -- "$(dirname "$0")" && pwd) . $FINDBIN/common.sh cd $BASEDIR if [ -f $DESTDIR/var/run/munin/munin-sched.pid ]; then cat $DESTDIR/var/run/munin/munin-sched.pid | xargs kill else echo "Pid file not found. Not stopping" fi munin-2.0.25/dists/000077500000000000000000000000001243472346000140615ustar00rootroot00000000000000munin-2.0.25/dists/debian/000077500000000000000000000000001243472346000153035ustar00rootroot00000000000000munin-2.0.25/dists/debian/README000066400000000000000000000014451243472346000161670ustar00rootroot00000000000000For Debian packaging trunk/dists/debian is _deprecated_. A branch for svn-buildpackage has been created at branches/debian, with subdirectories for each release codename: svn ls svn://munin-monitoring.org/munin/branches/debian This works with using released tarballs which are available in munin/branches/debian/$codename/tarballs/ ############################################################################ For working with munin SVN trunk, the easiest way is to checkout squeeze/trunk/debian in the munin trunk directory as debian: $ svn co http://munin-monitoring.org/svn/munin/trunk/ munin-trunk $ cd munin-trunk $ svn co http://munin-monitoring.org/svn/munin/branches/debian/squeeze/trunk/debian/ debian Now dpkg-buildpackage should work flawlessly, but as this is trunk, it might not :-) munin-2.0.25/dists/freebsd/000077500000000000000000000000001243472346000154735ustar00rootroot00000000000000munin-2.0.25/dists/freebsd/munin-main/000077500000000000000000000000001243472346000175435ustar00rootroot00000000000000munin-2.0.25/dists/freebsd/munin-main/Makefile000066400000000000000000000041651243472346000212110ustar00rootroot00000000000000# New ports collection makefile for: munin-main # Date created: 25 Januar 2004 # Whom: Lupe Christoph # # $FreeBSD: ports/sysutils/munin-main/Makefile,v 1.7 2004/12/14 01:43:10 sem Exp $ # PORTNAME= munin PORTVERSION= 1.2.2 CATEGORIES= sysutils perl5 MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= munin PKGNAMESUFFIX= -main DISTNAME= ${PORTNAME}_${PORTVERSION:S/.r/rc/} MAINTAINER= lupe@lupe-christoph.de COMMENT= Collector part of Munin RUN_DEPENDS= ${SITE_PERL}/${PERL_ARCH}/RRDs.pm:${PORTSDIR}/net/rrdtool \ ${SITE_PERL}/Net/Domain.pm:${PORTSDIR}/net/p5-Net \ ${SITE_PERL}/HTML/Template.pm:${PORTSDIR}/www/p5-HTML-Template \ ${SITE_PERL}/Date/Manip.pm:${PORTSDIR}/devel/p5-Date-Manip BUILD_DEPENDS= ${RUN_DEPENDS} .include .if ${PERL_LEVEL} <= 500800 RUN_DEPENDS+= ${SITE_PERL}/${PERL_ARCH}/Storable.pm:${PORTSDIR}/devel/p5-Storable \ ${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5 \ ${SITE_PERL}/${PERL_ARCH}/Time/HiRes.pm:${PORTSDIR}/devel/p5-Time-HiRes \ ${SITE_PERL}/Text/Balanced.pm:${PORTSDIR}/textproc/p5-Text-Balanced .endif USE_GMAKE= yes PATCH_STRIP= -p1 WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:S/.r/rc/} PKGMESSAGE= ${WRKDIR}/pkg-message ALL_TARGET= DATADIR=${DATADIR} PERL=${PERL} build build-man INSTALL_TARGET= DATADIR=${DATADIR} PERL=${PERL} install-main MAN5= munin.conf.5 MAN8= munin-cron.8 munin-graph.8 munin-html.8 munin-limits.8 munin-update.8 SUB_FILES=pkg-message pre-install: @PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} PRE-INSTALL post-install: @${INSTALL_DATA} ${WRKSRC}/build/server/munin.conf ${PREFIX}/etc/munin/munin.conf.sample @for man in ${MAN5}; do \ ${INSTALL_MAN} -C ${WRKSRC}/build/doc/$$man ${PREFIX}/man/man5; \ done @for man in ${MAN8}; do \ ${INSTALL_MAN} -C ${WRKSRC}/build/doc/$$man ${PREFIX}/man/man8; \ done @DATADIR=${DATADIR} PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} POST-INSTALL @${CHOWN} munin /var/log/munin-main @${CHGRP} munin /var/run/munin /var/log/munin-main ${PREFIX}/www/data/munin ${PREFIX}/var/munin @${CAT} ${PKGMESSAGE} .include munin-2.0.25/dists/freebsd/munin-main/distinfo000066400000000000000000000001371243472346000213060ustar00rootroot00000000000000MD5 (munin_1.2.2.tar.gz) = e55ff3cc8d506558f32598f639952cca SIZE (munin_1.2.2.tar.gz) = 325356 munin-2.0.25/dists/freebsd/munin-main/files/000077500000000000000000000000001243472346000206455ustar00rootroot00000000000000munin-2.0.25/dists/freebsd/munin-main/files/patch-Makefile000066400000000000000000000005751243472346000234110ustar00rootroot00000000000000--- Makefile.orig Tue May 11 22:23:06 2004 +++ Makefile Fri Jun 4 00:25:54 2004 @@ -26,7 +26,7 @@ mkdir -p $(HTMLDIR) mkdir -p $(DBDIR) - $(CHOWN) $(USER) $(LOGDIR) $(STATEDIR) $(RUNDIR) $(HTMLDIR) $(DBDIR) + $(CHOWN) $(USER) $(STATEDIR) $(RUNDIR) $(HTMLDIR) $(DBDIR) for p in server/*.tmpl; do \ $(INSTALL) -m 0644 "$$p" $(CONFDIR)/templates/ ; \ munin-2.0.25/dists/freebsd/munin-main/files/patch-Makefile.config000066400000000000000000000061571243472346000246570ustar00rootroot00000000000000--- munin-1.1.7.orig/Makefile.config 2004-11-23 19:52:38.000000000 +0100 +++ munin-1.1.7/Makefile.config 2004-11-27 12:46:19.000000000 +0100 @@ -7,52 +7,56 @@ # # the base of the Munin installation. # -PREFIX = $(DESTDIR)/opt/munin +ifdef PREFIX +UPREFIX=$(PREFIX) +else +UPREFIX=/usr +endif # Where Munin keeps its configurations (server.conf, client.conf, ++) -CONFDIR = $(DESTDIR)/etc/opt/munin +CONFDIR = $(PREFIX)/etc/munin # Server only - where to put munin-cron -BINDIR = $(PREFIX)/bin +BINDIR = $(UPREFIX)/bin # Client only - where to put munin-node, munin-node-configure, and munin-run -SBINDIR = $(PREFIX)/sbin +SBINDIR = $(UPREFIX)/sbin # Where to put text and html documentation -DOCDIR = $(PREFIX)/doc +DOCDIR = $(UPREFIX)/doc # Where to put man pages -MANDIR = $(PREFIX)/man +MANDIR = $(UPREFIX)/man # Where to put internal binaries and plugin repository -LIBDIR = $(PREFIX)/lib +LIBDIR = $(DATADIR) # Server only - Output directory -HTMLDIR = $(PREFIX)/var/www -CGIDIR = $(HTMLDIR)/cgi +HTMLDIR = $(PREFIX)/www/data/munin +CGIDIR = $(PREFIX)/www/cgi-bin # Client only - Where to put RRD files and other intenal data -DBDIR = $(DESTDIR)/var/opt/munin +DBDIR = $(PREFIX)/var/munin # Client only - Where plugins should put their states. Must be writable by # group "munin", and should be preserved between reboots PLUGSTATE = $(DBDIR)/plugin-state # Where Munin should place its logs. -LOGDIR = $(DESTDIR)/var/log/munin +LOGDIR = /var/log/munin-main # Location of PID files and other statefiles. On the server, must be # writable by the user "munin". -STATEDIR = $(DESTDIR)/var/run/munin +STATEDIR = /var/run/munin # The perl interpreter to use -PERL = $(shell which perl) +# Passed in from FreeBSD port Makefile. # The python interpreter to use (used by some plugins) -PYTHON = $(shell which python || echo /usr/bin/python) +PYTHON = $(shell which python || echo /usr/local/bin/python) # Server only - Where to install the perl libraries -PERLLIB = $(DESTDIR)$(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g") +PERLLIB = $(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g") # Client only - Install plugins for this architecture OSTYPE = $(shell uname | tr '[A-Z]' '[a-z]') @@ -69,9 +73,8 @@ GROUP = munin # Which command to use to check if the USER and GROUP to run Munin as, exists. -GETENT = $(shell which getent || which true 2>/dev/null) -CHECKUSER = $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) -CHECKGROUP = $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) +CHECKUSER:= $(shell grep $(USER) /etc/passwd >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) +CHECKGROUP:= $(shell grep $(GROUP) /etc/group >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) CHOWN = chown CHMOD = chmod munin-2.0.25/dists/freebsd/munin-main/files/patch-munin-limits.in000066400000000000000000000022231243472346000247160ustar00rootroot00000000000000--- munin-1.2.0.orig/server/munin-limits.in Wed Feb 16 21:03:31 2005 +++ munin-1.2.0/server/munin-limits.in Wed Feb 23 09:06:26 2005 @@ -18,6 +18,12 @@ # # # $Log: munin-limits.in,v $ +# Revision 1.24.2.4 2005/02/19 16:06:14 ilmari +# Place the munin-limits lock file in rundir, not dbdir. +# +# Revision 1.24.2.3 2005/02/19 16:04:03 ilmari +# Fix the file vs. pipe check in munin-limits +# # Revision 1.24.2.2 2005/02/16 20:03:31 jimmyo # yet another rewrite of munin-limits open call (SF#1115434). # @@ -179,8 +185,8 @@ my $modified=0; logger("Starting munin-limits, checking lock"); -munin_runlock("$config->{dbdir}/munin-limits.lock"); -logger("Created lock: $config->{dbdir}/munin-limits.lock"); +munin_runlock("$config->{rundir}/munin-limits.lock"); +logger("Created lock: $config->{rundir}/munin-limits.lock"); if (!defined $config->{'contact'}->{'nagios'}->{'command'} and defined $config->{'nsca'}) @@ -458,7 +464,7 @@ unshift (@cmd, "|-"); } logger ("Debug: opening for writing: \"" . join('" "',@cmd) . "\".") if $DEBUG; - if ($cmd[0] == ">") + if ($cmd[0] eq ">") { if (! open ($pipe, join (' ', @cmd))) { munin-2.0.25/dists/freebsd/munin-main/files/pkg-message.in000066400000000000000000000005471243472346000234060ustar00rootroot00000000000000 ******************************************************************** Unless this file already existed, a sample configuration file has been placed in %%PREFIX%%/etc/munin/munin.conf. Please edit it according to your needs. The Munin server will be run from cron under the user 'munin'. ******************************************************************** munin-2.0.25/dists/freebsd/munin-main/pkg-deinstall000077500000000000000000000051271243472346000222340ustar00rootroot00000000000000#! /bin/sh ask() { local question default answer question=$1 default=$2 if [ -z "${PACKAGE_BUILDING}" ]; then read -p "${question} [${default}]? " answer fi if [ x${answer} = x ]; then answer=${default} fi echo ${answer} } yesno() { local dflt question answer question=$1 dflt=$2 while :; do answer=$(ask "${question}" "${dflt}") case "${answer}" in [Yy]*) return 0;; [Nn]*) return 1;; esac echo "Please answer yes or no." done } delete_account() { local u g home u=$1 g=$2 if pw group show ${g} > /dev/null 2>&1; then if yesno "Do you want me to remove group \"${g}\"" y; then pw group del -n ${g} echo "Done." else GID=`pw group show ${g} | awk -F: '{ print $3 }'` fi fi if pw user show ${u} > /dev/null 2>&1; then if yesno "Do you want me to remove user \"${u}\"" y; then eval home=~${u} pw user del -n ${u} -r echo "Done." if [ -d "${home}" ]; then echo "Please remember to remove the home directory \"${home}\"" fi # pw user del may have removed the group, too. # Put it back if the admin asked us to retain it. if [ -n "$GID" ]; then pw group show ${g} > /dev/null 2>&1 if [ $? -ne 0 ]; then pw group add ${g} fi fi fi fi } delete_crontab_entries() { local b e b=$1 e=$2 TMPFILE=`mktemp -t munin` || exit 1 crontab -u munin -l | sed -e "/^$b\$/,/^$e\$/d" -e '/^[ ]*#/d' -e '/^$/d' > $TMPFILE if [ -s $TMPFILE ]; then crontab -u munin -l | sed -e "/^$b\$/,/^$e\$/d" | crontab -u munin - echo "The crontab for user munin had manually created entries." echo "Only the automatically created entries have been removed." echo "These are the remaining lines:" crontab -u munin -l else crontab -u munin -r echo "crontab for user munin removed" fi rm $TMPFILE } delnewsyslog() { tmp="/etc/#munin-node$$" sed -e '/^\/var\/log\/munin-main\/\*[ ]/d' /etc/newsyslog.conf >${tmp} cat ${tmp} > /etc/newsyslog.conf rm ${tmp} } newsyslog() { ENTRY=`fgrep '/var/log/munin-main/*' /etc/newsyslog.conf` DEFAULT='/var/log/munin-main/* munin:munin 644 7 * @T00 GNWZ' if [ -z "$ENTRY" ]; then exit 0 elif [ "$ENTRY" = "$DEFAULT" ]; then delnewsyslog elif yesno "You have changed the default munin-main entry in \"/etc/newsyslog.conf\". Do you want me to delete it?" y; then delnewsyslog echo "Done." fi } case $2 in DEINSTALL) delete_crontab_entries '#BEGIN_MUNIN' '#END_MUNIN' newsyslog ;; POST-DEINSTALL) delete_account munin munin ;; esac munin-2.0.25/dists/freebsd/munin-main/pkg-descr000066400000000000000000000012121243472346000213410ustar00rootroot00000000000000Munin network-wide graphing framework (node) Munin is a tool for graphing all sorts of information about one or more servers and displaying it in a web interface. It uses the excellent RRDTool (written by Tobi Oetiker) and is written in Perl. Munin has a master/node architecture. The master connects to all the nodes at regular intervals, and asks them for data. It then stores the data in RRD-files, and (if needed) updates the graphs. One of the main goals have been ease of creating own "plugins" (graphs). This is the collector. It is installed on the machine that shall collect and display performance data. WWW: http://munin-monitoring.org munin-2.0.25/dists/freebsd/munin-main/pkg-install000077500000000000000000000046531243472346000217260ustar00rootroot00000000000000#! /bin/sh ask() { local question default answer question=$1 default=$2 if [ -z "${PACKAGE_BUILDING}" ]; then read -p "${question} [${default}]? " answer fi if [ x${answer} = x ]; then answer=${default} fi echo ${answer} } yesno() { local dflt question answer question=$1 dflt=$2 while :; do answer=$(ask "${question}" "${dflt}") case "${answer}" in [Yy]*) return 0;; [Nn]*) return 1;; esac echo "Please answer yes or no." done } make_account() { local u g gcos u=$1 g=$2 gcos=$3 if pw group show "${g}" >/dev/null 2>&1; then echo "You already have a group \"${g}\", so I will use it." else echo "You need a group \"${g}\"." if which -s pw && yesno "Would you like me to create it" y; then pw groupadd ${g} || exit echo "Done." else echo "Please create it, and try again." if ! grep -q "^${u}:" /etc/passwd; then echo "While you're at it, please create a user \"${u}\" too," echo "with a default group of \"${g}\"." fi exit 1 fi fi if pw user show "${u}" >/dev/null 2>&1; then echo "You already have a user \"${u}\", so I will use it." else echo "You need a user \"${u}\"." if which -s pw && yesno "Would you like me to create it" y; then pw useradd ${u} -g ${g} -h - \ -s /bin/sh -c "${gcos}" || exit echo "Done." else echo "Please create it, and try again." exit 1 fi fi } create_crontab_entries() { local b e b=$1 e=$2 if [ crontab -u munin -l > /dev/null 2>&1 ]; then TMPFILE=`mktemp -t munin` || exit 1 sed -n -e "/^$b\$/,/^$e\$/p" > $TMPFILE crontab -u munin -l | sed -e '/^#BEGIN_MUNIN$/,/^#END_MUNIN$/d' | \ cat - $TMPFILE | crontab -u munin - rm $TMPFILE else crontab -u munin - fi } mklogdir() { } newsyslog() { if fgrep -q '/var/log/munin-main/*' /etc/newsyslog.conf; then : else cat >> /etc/newsyslog.conf </dev/null || true @unexec rmdir /var/log/munin-main 2>/dev/null || true @unexec rmdir %D/www/data/munin 2>/dev/null || true @unexec rmdir %D/www/data 2>/dev/null || true @unexec rmdir %D/www/cgi-bin 2>/dev/null || true @unexec rmdir %D/var/munin 2>/dev/null || true @unexec rmdir %D/share/munin 2>/dev/null || true @unexec rmdir %D/etc/munin/templates 2>/dev/null || true @unexec rmdir %D/etc/munin 2>/dev/null || true @unexec echo @unexec echo '********************************************************************' @unexec echo "If you want to *completely* remove munin-main, you have to" @unexec echo @unexec if [ -d %D/www/data/munin ]; then echo " rm -rf %D/www/data/munin \\"; fi @unexec if [ -d %D/var/munin ]; then ls -d %D/var/munin/* | grep -v plugin-state | fmt -40 | sed -e 's/^/ /' -e 's/$/ \\/'; fi @unexec if [ -f %D/etc/munin/munin.conf ]; then echo " %D/etc/munin/munin.conf \\"; fi @unexec if [ -d %D/etc/munin/templates ]; then echo " %D/etc/munin/templates \\"; fi @unexec echo " /var/log/munin-main" @unexec echo @unexec echo "If you have already deinstalled munin-node, you can also" @unexec echo @unexec echo " rmdir %D/etc/munin %D/var/munin" @unexec echo @unexec echo "These files and directories have to be left on the system because" @unexec echo "you may be performing an update. This process can't tell." @unexec echo '********************************************************************' @unexec echo munin-2.0.25/dists/freebsd/munin-node/000077500000000000000000000000001243472346000175445ustar00rootroot00000000000000munin-2.0.25/dists/freebsd/munin-node/Makefile000066400000000000000000000047041243472346000212110ustar00rootroot00000000000000# New ports collection makefile for: munin-node # Date created: 25 Januar 2004 # Whom: Lupe Christoph # # $FreeBSD: ports/sysutils/munin-node/Makefile,v 1.12 2004/12/14 01:43:10 sem Exp $ # PORTNAME= munin PORTVERSION= 1.2.2 CATEGORIES= sysutils perl5 MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= munin PKGNAMESUFFIX= -node DISTNAME= ${PORTNAME}_${PORTVERSION:S/.r/rc/} MAINTAINER= lupe@lupe-christoph.de COMMENT= Node-specific part of Munin RUN_DEPENDS= ${SITE_PERL}/Net/Server/Fork.pm:${PORTSDIR}/net/p5-Net-Server BUILD_DEPENDS= ${RUN_DEPENDS} .include .if ${OSVERSION} < 500000 RUN_DEPENDS= ${LOCALBASE}/etc/rc.subr:${PORTSDIR}/sysutils/rc_subr .endif .if ${PERL_LEVEL} < 500800 RUN_DEPENDS+= ${SITE_PERL}/Net/Domain.pm:${PORTSDIR}/net/p5-Net .endif USE_GMAKE= yes PATCH_STRIP= -p1 WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:S/.r/rc/} PKGMESSAGE= ${WRKDIR}/pkg-message ALL_TARGET= DATADIR=${DATADIR} PERL=${PERL} build build-man INSTALL_TARGET= DATADIR=${DATADIR} PERL=${PERL} INSTALL_PLUGINS="auto manual snmpauto" install-node install-node-plugins MAKE_ENV= LANG=C MAN5= munin-node.conf.5 MAN8= munin-node-configure.8 munin-node.8 munin-run.8 SUB_FILES= pkg-message munin-node.sh munin-node-revive.sh SUB_LIST= RC_SUBR=${RC_SUBR} USE_RC_SUBR= YES pre-install: @PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} PRE-INSTALL post-install: ${INSTALL_SCRIPT} ${WRKDIR}/munin-node.sh ${PREFIX}/etc/rc.d/munin-node.sh .if ${PERL_LEVEL} < 500800 ${INSTALL_SCRIPT} ${WRKDIR}/munin-node-revive.sh ${PREFIX}/bin/munin-node-revive .endif ${INSTALL_DATA} ${WRKSRC}/build/node/munin-node.conf ${PREFIX}/etc/munin/munin-node.conf.sample ${INSTALL_DATA} files/plugins.conf ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf.sample @if [ ! -f ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf ]; then \ ${INSTALL_DATA} ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf.sample ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf; \ fi @${CAT} ${PKGMESSAGE} @${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node.conf.5 ${PREFIX}/man/man5 @${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node-configure.8 ${PREFIX}/man/man8 @${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node.8 ${PREFIX}/man/man8 @${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-run.8 ${PREFIX}/man/man8 @PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} POST-INSTALL @${ECHO} ${DISTNAME} | ${SED} -e 's/munin_//' > ${PREFIX}/etc/munin/VERSION.node .include munin-2.0.25/dists/freebsd/munin-node/distinfo000066400000000000000000000001371243472346000213070ustar00rootroot00000000000000MD5 (munin_1.2.2.tar.gz) = e55ff3cc8d506558f32598f639952cca SIZE (munin_1.2.2.tar.gz) = 325356 munin-2.0.25/dists/freebsd/munin-node/files/000077500000000000000000000000001243472346000206465ustar00rootroot00000000000000munin-2.0.25/dists/freebsd/munin-node/files/munin-node-revive.sh.in000066400000000000000000000013471243472346000251630ustar00rootroot00000000000000#!/bin/sh # # Add the following lines to /etc/rc.conf to enable munin-node: # munin_node_enable (bool): Set to "NO" by default. # Set it to "YES" to enable munin-node # munin_node_config (path): Set to "%%PREFIX%%/etc/munin/munin-node.conf" by default. # . %%RC_SUBR%% name="munin_node" rcvar=`set_rcvar` [ -z "$munin_node_enable" ] && munin_node_enable="NO" [ -z "$munin_node_config" ] && munin_node_config="%%PREFIX%%/etc/munin/munin-node.conf" command="%%PREFIX%%/sbin/munin-node" pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config` load_rc_config $name #set -x pid=`check_pidfile $pidfile %%PREFIX%%/sbin/munin-node` if [ -z "$pid" ]; then run_rc_command start > /dev/null fi munin-2.0.25/dists/freebsd/munin-node/files/munin-node.sh.in000066400000000000000000000013131243472346000236560ustar00rootroot00000000000000#!/bin/sh # # PROVIDE: munin-node # REQUIRE: DAEMON # BEFORE: cron # KEYWORD: FreeBSD # # Add the following lines to /etc/rc.conf to enable munin-node: # munin_node_enable (bool): Set to "NO" by default. # Set it to "YES" to enable munin-node # munin_node_config (path): Set to "%%PREFIX%%/etc/munin/munin-node.conf" by default. # . %%RC_SUBR%% name="munin_node" rcvar=`set_rcvar` [ -z "$munin_node_enable" ] && munin_node_enable="NO" [ -z "$munin_node_config" ] && munin_node_config="%%PREFIX%%/etc/munin/munin-node.conf" command="%%PREFIX%%/sbin/munin-node" pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config` load_rc_config $name run_rc_command "$1" munin-2.0.25/dists/freebsd/munin-node/files/munin_node.sh000066400000000000000000000013121243472346000233320ustar00rootroot00000000000000#!/bin/sh # # PROVIDE: munin-node # REQUIRE: DAEMON # BEFORE: cron # KEYWORD: FreeBSD # # Add the following lines to /etc/rc.conf to enable munin-node: # munin_node_enable (bool): Set to "NO" by default. # Set it to "YES" to enable munin-node # munin_node_config (path): Set to "%PREFIX%/etc/munin/munin-node.conf" by default. # . /etc/rc.subr name="munin_node" rcvar=`set_rcvar` [ -z "$munin_node_enable" ] && munin_node_enable="NO" [ -z "$munin_node_config" ] && munin_node_config="/usr/local/etc/munin/munin-node.conf" command="/usr/local/sbin/munin-node" pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config` load_rc_config $name run_rc_command "$1" munin-2.0.25/dists/freebsd/munin-node/files/patch-Makefile000066400000000000000000000006231243472346000234040ustar00rootroot00000000000000--- munin-1.0.0pre2.orig/Makefile Sat Jan 31 19:45:19 2004 +++ munin-1.0.0pre2/Makefile Sun Feb 1 14:22:46 2004 @@ -150,6 +150,7 @@ build-man: build-man-stamp build-man-stamp: + mkdir -p build/doc pod2man --section=8 --release=$(RELEASE) --center="Munin Documentation" \ node/munin-node.in > build/doc/munin-node.8 pod2man --section=8 --release=$(RELEASE) --center="Munin Documentation" \ munin-2.0.25/dists/freebsd/munin-node/files/patch-Makefile.config000066400000000000000000000061161243472346000246530ustar00rootroot00000000000000--- munin-1.1.7.orig/Makefile.config Tue Nov 23 19:52:38 2004 +++ munin-1.1.7/Makefile.config Sun Nov 28 13:28:12 2004 @@ -7,52 +7,56 @@ # # the base of the Munin installation. # -PREFIX = $(DESTDIR)/opt/munin +ifdef PREFIX +UPREFIX=$(PREFIX) +else +UPREFIX=/usr +endif # Where Munin keeps its configurations (server.conf, client.conf, ++) -CONFDIR = $(DESTDIR)/etc/opt/munin +CONFDIR = $(PREFIX)/etc/munin # Server only - where to put munin-cron -BINDIR = $(PREFIX)/bin +BINDIR = $(UPREFIX)/bin # Client only - where to put munin-node, munin-node-configure, and munin-run -SBINDIR = $(PREFIX)/sbin +SBINDIR = $(UPREFIX)/sbin # Where to put text and html documentation -DOCDIR = $(PREFIX)/doc +DOCDIR = $(UPREFIX)/doc # Where to put man pages -MANDIR = $(PREFIX)/man +MANDIR = $(UPREFIX)/man # Where to put internal binaries and plugin repository -LIBDIR = $(PREFIX)/lib +LIBDIR = $(DATADIR) # Server only - Output directory -HTMLDIR = $(PREFIX)/var/www -CGIDIR = $(HTMLDIR)/cgi +HTMLDIR = $(PREFIX)/www/data/munin +CGIDIR = $(PREFIX)/www/cgi-bin # Client only - Where to put RRD files and other intenal data -DBDIR = $(DESTDIR)/var/opt/munin +DBDIR = $(PREFIX)/var/munin # Client only - Where plugins should put their states. Must be writable by # group "munin", and should be preserved between reboots PLUGSTATE = $(DBDIR)/plugin-state # Where Munin should place its logs. -LOGDIR = $(DESTDIR)/var/log/munin +LOGDIR = /var/log # Location of PID files and other statefiles. On the server, must be # writable by the user "munin". -STATEDIR = $(DESTDIR)/var/run/munin +STATEDIR = /var/run/munin # The perl interpreter to use -PERL = $(shell which perl) +# Passed in from FreeBSD port Makefile. # The python interpreter to use (used by some plugins) -PYTHON = $(shell which python || echo /usr/bin/python) +PYTHON = $(shell which python || echo /usr/local/bin/python) # Server only - Where to install the perl libraries -PERLLIB = $(DESTDIR)$(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g") +PERLLIB = $(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g") # Client only - Install plugins for this architecture OSTYPE = $(shell uname | tr '[A-Z]' '[a-z]') @@ -69,9 +73,8 @@ GROUP = munin # Which command to use to check if the USER and GROUP to run Munin as, exists. -GETENT = $(shell which getent || which true 2>/dev/null) -CHECKUSER = $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) -CHECKGROUP = $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) +CHECKUSER:= $(shell grep $(USER) /etc/passwd >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2")) +CHECKGROUP:= $(shell grep $(GROUP) /etc/group >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2")) CHOWN = chown CHMOD = chmod munin-2.0.25/dists/freebsd/munin-node/files/patch-cpu.in000066400000000000000000000012511243472346000230610ustar00rootroot00000000000000--- munin-1.0.4.orig/node/node.d.freebsd/cpu.in Sun May 9 21:18:35 2004 +++ munin-1.0.4/node/node.d.freebsd/cpu.in Sat Nov 20 15:32:50 2004 @@ -59,10 +59,10 @@ OSV=`/sbin/sysctl -n kern.osrelease | cut -f1 -d.` if [ "$OSV" = "4" ]; then STATUNITS=`/sbin/sysctl -n kern.clockrate | cut -f16 -d' '` - elif [ "$OSV" = "5" ]; then + elif [ "$OSV" -ge "5" ]; then STATUNITS=`/sbin/sysctl -n kern.clockrate | cut -f13 -d' '` fi -# PERCENT=`/sbin/sysctl -n hw.ncpu | awk '{print ($1)*100}'` + PERCENT=`/sbin/sysctl -n hw.ncpu | awk '{print ($1)*100}'` SCALE=`echo 'scale=5;' $PERCENT/$STATUNITS | bc -q ` NCPU=`/sbin/sysctl -n hw.ncpu` if [ "$scaleto100" = yes ]; then munin-2.0.25/dists/freebsd/munin-node/files/patch-munin-node.conf.in000066400000000000000000000004241243472346000252700ustar00rootroot00000000000000--- munin-1.0.0pre1.orig/node/munin-node.conf.in Thu Jan 15 15:28:57 2004 +++ munin-1.0.0pre1/node/munin-node.conf.in Sun Jan 25 14:26:15 2004 @@ -12,7 +12,7 @@ # Which port to bind to; host * user root -group root +group wheel setsid yes # Regexps for files to ignore munin-2.0.25/dists/freebsd/munin-node/files/patch-ping_.in000066400000000000000000000020031243472346000233620ustar00rootroot00000000000000--- munin-1.1.7.orig/node/node.d/ping_.in Tue Nov 16 21:10:19 2004 +++ munin-1.1.7/node/node.d/ping_.in Sun Nov 28 11:30:36 2004 @@ -22,9 +22,14 @@ # Parameters: # # ping_args - Arguments to ping (default "-c 2") +# ping_args2 - Arguments after the host name (required for Solaris) # ping - Ping program to use # host - Host to ping # +# Arguments for Solaris: +# ping_args -s +# ping_args2 56 2 +# #%# family=manual file_host=`basename $0 | sed 's/^ping_//g'` @@ -45,4 +50,4 @@ fi -${ping:-ping} ${ping_args:--c 2} ${host:-${file_host:-www.google.com}} | awk '/min\/avg\/max/ { split ($0, arr, "/"); print "ping.value " (arr[4]/1000)} /% packet loss/ {split ($7, arr2, "%"); print "packetloss.value " arr2[1]}' +${ping:-ping} ${ping_args:--c 2} ${host:-${file_host:-www.google.com}} ${ping_args2} | perl -n -e 'print "ping.value ", $1 / 1000, "\n" if m@min/avg/max.*\s\d+(?:\.\d+)?/(\d+(?:\.\d+)?)/\d+(?:\.\d+)?@; print "packetloss.value $1\n" if /(\d+)% packet loss/;' munin-2.0.25/dists/freebsd/munin-node/files/patch-sendmail_mailtraffic.in000066400000000000000000000005371243472346000264350ustar00rootroot00000000000000--- munin-1.1.7.orig/node/node.d/sendmail_mailtraffic.in Sun Nov 21 21:27:53 2004 +++ munin-1.1.7/node/node.d/sendmail_mailtraffic.in Sun Nov 28 10:50:45 2004 @@ -26,7 +26,7 @@ TEMP_FILE=/tmp/munin-sendmail.$$ if [ "$1" = "autoconf" ]; then - if [ -f ${TEMP_FILE} ] ; then + if which mailstats 2>&1 > /dev/null ; then echo yes exit 0 else munin-2.0.25/dists/freebsd/munin-node/files/patch-vmstat.in000066400000000000000000000015371243472346000236170ustar00rootroot00000000000000--- munin-1.1.4.orig/node/node.d.freebsd/vmstat.in 2004-05-20 21:02:36.000000000 +0200 +++ munin-1.1.4/node/node.d.freebsd/vmstat.in 2004-11-21 14:30:18.000000000 +0100 @@ -35,7 +35,7 @@ OSV=`/sbin/sysctl -n kern.osrelease | cut -f1 -d.` if [ "$1" = "autoconf" ]; then - if [ "$OSV" = "5" ]; then + if [ "$OSV" -ge "5" ]; then /sbin/sysctl -n vm.vmtotal 2>/dev/null >/dev/null RESULT=$? NAME=/sbin/sysctl @@ -63,7 +63,7 @@ echo 'graph_args --base 1000 -l 0' echo 'graph_vlabel process states' echo 'graph_category processes' - if [ "$OSV" = "5" ]; then + if [ "$OSV" -ge "5" ]; then echo 'running.label running' echo 'running.type GAUGE' echo 'diskwait.label diskwait' @@ -81,7 +81,7 @@ exit 0 fi -if [ "$OSV" = "5" ]; then +if [ "$OSV" -ge "5" ]; then sysctl -n vm.vmtotal | awk ' /^Processes:/ { print "running.value", $3; munin-2.0.25/dists/freebsd/munin-node/files/pkg-message.4000066400000000000000000000006701243472346000231410ustar00rootroot00000000000000 ******************************************************************** Unless this file already existed, a sample configuration file has been placed in %%PREFIX%%/etc/munin/munin-node.conf. Please edit it according to your needs. The Munin client will be started at system boot automatically. You can start it manually with: %%PREFIX%%/etc/rc.d/munin-node.sh start ******************************************************************** munin-2.0.25/dists/freebsd/munin-node/files/pkg-message.in000066400000000000000000000013111243472346000233750ustar00rootroot00000000000000 ******************************************************************** Unless this file already existed, a sample configuration file has been placed in %%PREFIX%%/etc/munin/munin-node.conf. Please edit it according to your needs. ******************************************************************** The Munin client will *not* be started automatically. To allow it to start, put this line in /etc/rc.conf: munin_node_enable="YES" Then, it will be started on the next boot. If this line is already present, the client will be started now. Otherwise, edit /etc/rc.conf and execute this command: %%PREFIX%%/etc/rc.d/munin-node.sh start ******************************************************************** munin-2.0.25/dists/freebsd/munin-node/files/plugins.conf000066400000000000000000000016001243472346000231730ustar00rootroot00000000000000# This file is used to configure how the plugins are invoked. # Place in /etc/munin/plugin-conf.d/ or corresponding directory. # # PLEASE NOTE: Changes in the plugin-conf.d directory are only # read at munin-node startup, so restart at any changes. # # # user # Set the user to run the plugin as # group # Set the group to run the plugin as # command # Run instead of the plugin. %c # expands to what would normally be run. # env. # Sets in the plugin's environment, see the # individual plugins to find out which variables they # care about. # [mysql*] #env.mysqlopts -u someuser [exim*] group mail [cps*] user root [apt] user root [vlan*] user root [postfix*] user root env.logfile maillog [sendmail*] env.mspqueue /var/spool/clientmqueue munin-2.0.25/dists/freebsd/munin-node/pkg-deinstall000066400000000000000000000030741243472346000222310ustar00rootroot00000000000000#! /bin/sh ask() { local question default answer question=$1 default=$2 if [ -z "${PACKAGE_BUILDING}" ]; then read -p "${question} [${default}]? " answer fi if [ x${answer} = x ]; then answer=${default} fi echo ${answer} } yesno() { local dflt question answer question=$1 dflt=$2 while :; do answer=$(ask "${question}" "${dflt}") case "${answer}" in [Yy]*) return 0;; [Nn]*) return 1;; esac echo "Please answer yes or no." done } stop_process() { if [ -x $STARTSTOP ]; then $STARTSTOP stop fi } delete_group() { local g g=$1 if yesno "Do you want me to remove group \"${g}\"" y; then pw groupdel -n ${g} echo "Done." fi } delnewsyslog() { tmp="/etc/#munin-node$$" sed -e '/^\/var\/log\/munin-node.log[ ]/d' /etc/newsyslog.conf >${tmp} cat ${tmp} > /etc/newsyslog.conf rm ${tmp} } newsyslog() { ENTRY=`grep /var/log/munin-node.log /etc/newsyslog.conf` DEFAULT='/var/log/munin-node.log 644 7 * @T00 Z /var/run/munin/munin-node.pid' if [ -z "$ENTRY" ]; then exit 0 elif [ "$ENTRY" = "$DEFAULT" ]; then delnewsyslog elif yesno "You have changed the default munin-node entry in \"/etc/newsyslog.conf\". Do you want me to delete it?" y; then delnewsyslog echo "Done." fi } OSVERSION=`/sbin/sysctl -n kern.osreldate` if [ $OSVERSION -lt 500000 ]; then STARTSTOP=${PKG_PREFIX}/etc/rc.d/munin-node.sh else STARTSTOP=/etc/rc.d/munin_node fi case $2 in DEINSTALL) stop_process newsyslog ;; POST-DEINSTALL) delete_group munin ;; esac munin-2.0.25/dists/freebsd/munin-node/pkg-descr000066400000000000000000000011501243472346000213430ustar00rootroot00000000000000Munin network-wide graphing framework (node) Munin is a tool for graphing all sorts of information about one or more servers and displaying it in a web interface. It uses the excellent RRDTool (written by Tobi Oetiker) and is written in Perl. Munin has a master/node architecture. The master connects to all the nodes at regular intervals, and asks them for data. It then stores the data in RRD-files, and (if needed) updates the graphs. One of the main goals have been ease of creating own "plugins" (graphs). This is the node part. It is used on all machines Munin shall watch. WWW: http://munin-monitoring.org munin-2.0.25/dists/freebsd/munin-node/pkg-install000066400000000000000000000036111243472346000217150ustar00rootroot00000000000000#! /bin/sh ask() { local question default answer question=$1 default=$2 if [ -z "${PACKAGE_BUILDING}" ]; then read -p "${question} [${default}]? " answer fi if [ x${answer} = x ]; then answer=${default} fi echo ${answer} } yesno() { local dflt question answer question=$1 dflt=$2 while :; do answer=$(ask "${question}" "${dflt}") case "${answer}" in [Yy]*) return 0;; [Nn]*) return 1;; esac echo "Please answer yes or no." done } make_group() { local g g=$1 if pw group show "${g}" >/dev/null 2>&1; then echo "You already have a group \"${g}\", so I will use it." else echo "You need a group \"${g}\"." if which -s pw && yesno "Would you like me to create it" y; then pw groupadd ${g} || exit echo "Done." else echo "Please create it, and try again." if ! grep -q "^${u}:" /etc/passwd; then echo "While you're at it, please create a user \"${u}\" too," echo "with a default group of \"${g}\"." fi exit 1 fi fi } init_plugins() { if [ -f ${PKG_PREFIX}/etc/munin/VERSION.node ]; then prevver=$(cat ${PKG_PREFIX}/etc/munin/VERSION.node) fi if [ -n "$prevver" ]; then echo -n "Initializing new plugins.." ${PKG_PREFIX}/sbin/munin-node-configure --shell --newer "${prevver%-*}" | sh -x else echo -n "Initializing plugins.." ${PKG_PREFIX}/sbin/munin-node-configure --shell | sh -x fi echo "done." } newsyslog() { if grep -q /var/log/munin-node.log /etc/newsyslog.conf; then : else cat >> /etc/newsyslog.conf </dev/null || true @comment etc/munin/VERSION.node must remain for upgrade version check @unexec if cmp -s %D/etc/munin/munin-node.conf %D/etc/munin/munin-node.conf.sample; then rm -f %D/etc/munin/munin-node.conf; fi etc/munin/munin-node.conf.sample @unexec if cmp -s %D/etc/munin/plugin-conf.d/plugins.conf %D/etc/munin/plugin-conf.d/plugins.conf.sample; then rm -f %D/etc/munin/plugin-conf.d/plugins.conf; fi etc/munin/plugin-conf.d/plugins.conf.sample @unexec rm %D/etc/rc.d/munin-node.sh 2>/dev/null || true sbin/munin-node sbin/munin-node-configure sbin/munin-node-configure-snmp sbin/munin-run %%DATADIR%%/plugins/acpi %%DATADIR%%/plugins/amavis %%DATADIR%%/plugins/apache_accesses %%DATADIR%%/plugins/apache_processes %%DATADIR%%/plugins/apache_volume %%DATADIR%%/plugins/apc_envunit_ %%DATADIR%%/plugins/apc_nis %%DATADIR%%/plugins/bind9 %%DATADIR%%/plugins/bind9_rndc %%DATADIR%%/plugins/courier_ %%DATADIR%%/plugins/courier_mta_mailqueue %%DATADIR%%/plugins/courier_mta_mailstats %%DATADIR%%/plugins/courier_mta_mailvolume %%DATADIR%%/plugins/cpu %%DATADIR%%/plugins/cupsys_pages %%DATADIR%%/plugins/df %%DATADIR%%/plugins/df_inode %%DATADIR%%/plugins/dhcpd3 %%DATADIR%%/plugins/exim_mailqueue %%DATADIR%%/plugins/exim_mailqueue_alt %%DATADIR%%/plugins/exim_mailstats %%DATADIR%%/plugins/foldingathome %%DATADIR%%/plugins/foldingathome_rank %%DATADIR%%/plugins/foldingathome_wu %%DATADIR%%/plugins/hddtemp %%DATADIR%%/plugins/hddtemp2 %%DATADIR%%/plugins/hddtemp_smartctl %%DATADIR%%/plugins/hddtempd %%DATADIR%%/plugins/if_ %%DATADIR%%/plugins/if_errcoll_ %%DATADIR%%/plugins/ipac-ng %%DATADIR%%/plugins/ircu %%DATADIR%%/plugins/load %%DATADIR%%/plugins/loggrep %%DATADIR%%/plugins/mailman %%DATADIR%%/plugins/mailscanner %%DATADIR%%/plugins/mbmon_ %%DATADIR%%/plugins/memory %%DATADIR%%/plugins/mhttping %%DATADIR%%/plugins/multips %%DATADIR%%/plugins/munin_graph %%DATADIR%%/plugins/munin_update %%DATADIR%%/plugins/mysql_bytes %%DATADIR%%/plugins/mysql_isam_space_ %%DATADIR%%/plugins/mysql_queries %%DATADIR%%/plugins/mysql_slowqueries %%DATADIR%%/plugins/mysql_threads %%DATADIR%%/plugins/named %%DATADIR%%/plugins/netstat %%DATADIR%%/plugins/ntp_ %%DATADIR%%/plugins/ntp_states %%DATADIR%%/plugins/nut_misc %%DATADIR%%/plugins/nut_volts %%DATADIR%%/plugins/open_files %%DATADIR%%/plugins/perdition %%DATADIR%%/plugins/ping_ %%DATADIR%%/plugins/plugins.history %%DATADIR%%/plugins/pm3users_ %%DATADIR%%/plugins/pop_stats %%DATADIR%%/plugins/postfix_mailqueue %%DATADIR%%/plugins/postfix_mailstats %%DATADIR%%/plugins/postfix_mailvolume %%DATADIR%%/plugins/processes %%DATADIR%%/plugins/ps_ %%DATADIR%%/plugins/psu_ %%DATADIR%%/plugins/samba %%DATADIR%%/plugins/sendmail_mailqueue %%DATADIR%%/plugins/sendmail_mailstats %%DATADIR%%/plugins/sendmail_mailtraffic %%DATADIR%%/plugins/smart_ %%DATADIR%%/plugins/snmp__df %%DATADIR%%/plugins/snmp__fc_if_ %%DATADIR%%/plugins/snmp__fc_if_err_ %%DATADIR%%/plugins/snmp__if_ %%DATADIR%%/plugins/snmp__if_err_ %%DATADIR%%/plugins/snmp__load %%DATADIR%%/plugins/snmp__processes %%DATADIR%%/plugins/snmp__sensors_fsc_bx_fan %%DATADIR%%/plugins/snmp__sensors_fsc_bx_temp %%DATADIR%%/plugins/snmp__sensors_fsc_fan %%DATADIR%%/plugins/snmp__sensors_fsc_temp %%DATADIR%%/plugins/snmp__sensors_mbm_fan %%DATADIR%%/plugins/snmp__sensors_mbm_temp %%DATADIR%%/plugins/snmp__sensors_mbm_volt %%DATADIR%%/plugins/snmp__users %%DATADIR%%/plugins/spamstats %%DATADIR%%/plugins/squid_cache %%DATADIR%%/plugins/squid_icp %%DATADIR%%/plugins/squid_requests %%DATADIR%%/plugins/squid_traffic %%DATADIR%%/plugins/surfboard %%DATADIR%%/plugins/swap %%DATADIR%%/plugins/sybase_space %%DATADIR%%/plugins/vmstat @unexec rm -f /var/run/munin/munin-node.pid @unexec rmdir /var/run/munin 2>/dev/null || true @unexec rmdir %D/var/munin/plugin-state 2>/dev/null || true @unexec rmdir %D/var/munin 2>/dev/null || true @unexec rmdir %D/%%DATADIR%%/plugins 2>/dev/null || true @unexec rmdir %D/%%DATADIR%% 2>/dev/null || true @unexec rmdir %D/etc/munin/plugin-conf.d 2>/dev/null || true @unexec rmdir %D/etc/munin 2>/dev/null || true @unexec rmdir %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin 2>/dev/null || true @unexec rmdir %%LOCALBASE%%/%%SITE_PERL%%/Munin 2>/dev/null || true @unexec echo @unexec echo '********************************************************************' @unexec echo "If you want to *completely* remove munin-node, you have to" @unexec echo @unexec echo " rm -rf %D/etc/munin/VERSION.node %D/etc/munin/plugins \\" @unexec if [ -d %D/var/munin/plugin-state ]; then echo " %D/var/munin/plugin-state \\"; fi @unexec if [ -f %D/etc/munin/munin-node.conf ]; then echo " %D/etc/munin/munin-node.conf \\"; fi @unexec if [ -d %D/var/munin/plugin-state ]; then echo " %D/var/munin/plugin-state \\"; fi @unexec if [ -d %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin ]; then echo " %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin \\"; fi @unexec if [ -d %%LOCALBASE%%/%%SITE_PERL%%/Munin ]; then echo " %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin \\"; fi @unexec echo " /var/log/munin-node.log*" @unexec echo @unexec echo "If you have already deinstalled munin-main, you can also" @unexec echo @unexec echo " rmdir %D/etc/munin %D/var/munin" @unexec echo @unexec echo "These files and directories have to be left on the system because" @unexec echo "you may be performing an update. This process can't tell." @unexec echo '********************************************************************' @unexec echo munin-2.0.25/dists/redhat/000077500000000000000000000000001243472346000153305ustar00rootroot00000000000000munin-2.0.25/dists/redhat/README000066400000000000000000000002371243472346000162120ustar00rootroot00000000000000Redhat specifics are hosted directly on pkgs.fedoraproject.org. www: http://pkgs.fedoraproject.org/cgit/munin.git git: git://pkgs.fedoraproject.org/munin.git munin-2.0.25/dists/sunos/000077500000000000000000000000001243472346000152305ustar00rootroot00000000000000munin-2.0.25/dists/sunos/Makefile000066400000000000000000000115771243472346000167030ustar00rootroot00000000000000 BASE = / VENDOR = munin-monitoring.org PKGNAME = munin PREFIX = $(BASE)/$(PKGNAME) SUBST = $(PREFIX) VERSION = $(shell cat ../../RELEASE) DIST = ../../../$(PKGNAME)_$(VERSION).tar.gz #BUILD = $(PKGNAME)-$(VERSION) BUILD = ../../ OSTYPE = $(shell uname -p) PATH := "/opt/SUNWspro/bin/:/usr/bin:/bin:/usr/local/bin:/usr/ccs/bin/" DESTDIR := dists/sunos/install/dist/ all: $(PKGNAME)-$(VERSION)-$(OSTYPE).pkg $(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg clean: rm -rf pkginfo build-stamp install install-stamp main node configure-stamp cd $(BUILD); make clean #$(BUILD)/configure: $(DIST) # gunzip -c $(DIST) | (tar -xf - && touch $(BUILD)/configure) #configure-stamp: $(BUILD)/configure # touch configure-stamp #build-stamp: $(BUILD)/configure # cd $(BUILD) ;\ # PATH=$(PATH) make build build-doc build-man && touch build-stamp build-stamp: cd $(BUILD) ;\ PATH=$(PATH) make build build-doc build-man && touch dists/sunos/build-stamp install-stamp: build-stamp mkdir -p install/dist/node install/dist/main cd $(BUILD) ;\ make prefix="" DESTDIR=$(DESTDIR)/node/ CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-node install-node-plugins -cd $(BUILD) ;\ make prefix="" DESTDIR=$(DESTDIR)/node CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-doc install-man cd $(BUILD) ;\ make prefix="" DESTDIR=$(DESTDIR)/main CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-main -cd $(BUILD) ;\ make prefix="" DESTDIR=$(DESTDIR)/main CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-doc install-man touch install-stamp pkginfo: $(DIST) main/pkginfo node/pkginfo echo "Generated pkginfo files." node/pkginfo: $(DIST) -mkdir node for f in pkginfo depend compver space request checkinstall \ preinstall postinstall preremove postremove; do \ test -r $(PWD)/$$f.node && cp $(PWD)/$$f.node $(PWD)/node/$$f; \ done ;\ (echo "# Generated file, do not edit"; \ echo "PKG=$(PKGNAME)-node"; \ echo "NAME=$(PKGNAME)-node"; \ echo "OSTYPE=$(OSTYPE)"; \ echo "VERSION=$(VERSION)"; \ echo "CATEGORY=application"; \ echo "VENDOR=$(VENDOR)"; \ echo "EMAIL=jimmyo@users.sf.net"; \ echo "PSTAMP="`getent passwd $(USER) | cut -d: -f5`; \ echo "BASEDIR=$(BASE)"; \ echo "CLASSES=none") > $@ main/pkginfo: $(DIST) -mkdir main for f in pkginfo depend compver space request checkinstall \ preinstall postinstall preremove postremove; do \ test -r $(PWD)/$$f.main && cp $(PWD)/$$f.main $(PWD)/main/$$f; \ done ;\ (echo "# Generated file, do not edit"; \ echo "PKG=$(PKGNAME)"; \ echo "NAME=$(PKGNAME)"; \ echo "OSTYPE=$(OSTYPE)"; \ echo "VERSION=$(VERSION)"; \ echo "CATEGORY=application"; \ echo "VENDOR=$(VENDOR)"; \ echo "EMAIL=jimmyo@users.sf.net"; \ echo "PSTAMP="`getent passwd $(USER) | cut -d: -f5`; \ echo "BASEDIR=$(BASE)"; \ echo "CLASSES=none") > $@ install/prototype: install-stamp install/node-prototype install/main-prototype echo "Prototypes generated." install/node-prototype: install-stamp for f in pkginfo depend compver space request checkinstall \ preinstall postinstall preremove postremove; do \ test -r $(PWD)/node/$$f && echo "i $$f=$(PWD)/node/$$f" || true; done \ > install/node-prototype cd install; pkgproto ../install/dist/node= \ | awk ' { $$5="root"; $$6="sys"; } \ { print; }' |\ sed \ -e 's|var/opt/munin 0755 root sys|var/opt/munin 0775 root munin|' \ -e 's|var/log/munin 0755 root sys|var/log/munin 0775 root munin|' \ -e 's|var/run/munin 0755 root sys|var/run/munin 0775 root munin|' \ >> ../install/node-prototype install/main-prototype: install-stamp for f in pkginfo depend compver space request checkinstall \ preinstall postinstall preremove postremove; do \ test -r $(PWD)/main/$$f && echo "i $$f=$(PWD)/main/$$f" || true; done \ > install/main-prototype cd install; pkgproto ../install/dist/main= \ | awk ' { $$5="root"; $$6="sys"; } \ { print; }' |\ sed \ -e 's|var/opt/munin 0755 root sys$$|var/opt/munin 0775 munin munin|' \ -e 's|var/log/munin 0755 root sys$$|var/log/munin 0775 munin munin|' \ -e 's|var/run/munin 0755 root sys$$|var/run/munin 0775 munin munin|' >> ../install/main-prototype install/$(PKGNAME): pkginfo install/main-prototype cd install; rm prototype || true; ln -s main-prototype prototype; pkgmk -d . install/$(PKGNAME)-node: pkginfo install/node-prototype cd install; rm prototype || true; ln -s node-prototype prototype; pkgmk -d . $(PKGNAME)-$(VERSION)-$(OSTYPE).pkg: install/$(PKGNAME) pkgtrans `pwd`/install $@ $(PKGNAME) mv install/$(PKGNAME)-$(VERSION)-$(OSTYPE).pkg . $(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg: install/$(PKGNAME)-node pkgtrans `pwd`/install $@ $(PKGNAME)-node mv install/$(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg . munin-2.0.25/dists/sunos/README000066400000000000000000000001041243472346000161030ustar00rootroot00000000000000See also resources/solaris-smf/ for SMF manifest and startup script munin-2.0.25/dists/sunos/postinstall.node000066400000000000000000000001021243472346000204440ustar00rootroot00000000000000#!/bin/sh /opt/munin/sbin/munin-node-configure --shell | /bin/sh munin-2.0.25/dists/sunos/preinstall.main000066400000000000000000000001311243472346000202460ustar00rootroot00000000000000#!/bin/sh groupadd munin 2>/dev/null || true useradd -g munin munin 2>/dev/null || true munin-2.0.25/dists/sunos/preinstall.node000066400000000000000000000000561243472346000202550ustar00rootroot00000000000000#!/bin/sh groupadd munin 2>/dev/null || true munin-2.0.25/dists/suse/000077500000000000000000000000001243472346000150405ustar00rootroot00000000000000munin-2.0.25/dists/suse/Makefile.config000066400000000000000000000012031243472346000177400ustar00rootroot00000000000000# Modifications from ../../Makefile.config PREFIX = $(DESTDIR)/usr CONFDIR = $(DESTDIR)/etc/munin LIBDIR = $(PREFIX)/share/munin SBINDIR = $(PREFIX)/sbin BINDIR = $(PREFIX)/bin MANDIR = $(PREFIX)/share/man HTMLDIR = $(DESTDIR)/var/www/html/munin DBDIR = $(DESTDIR)/var/lib/munin LOGDIR = $(DESTDIR)/var/log/munin STATEDIR = $(DESTDIR)/var/run/munin PERLLIB = $(DESTDIR)$(shell ( $(PERL) -V:vendorlib | egrep -v "UNKNOWN|=''" || $(PERL) -V:sitelib) | cut -d\' -f 2) # Handled in the munin.spec CHECKUSER:= true CHECKGROUP:= true CHOWN := echo Not done: chown CHMOD := echo Not done: chmod CHGRP := echo Not done: chgrp munin-2.0.25/dists/suse/munin-node.cron.d000066400000000000000000000000431243472346000202130ustar00rootroot00000000000000# # cron-jobs for # MAILTO=root munin-2.0.25/dists/suse/munin-node.rc000077500000000000000000000046451243472346000174530ustar00rootroot00000000000000#! /bin/sh # # munin-node Control the Munin Node Server (formerly Linpro RRD client) # # Author: Rune Nordbře Skillingstad # ### BEGIN INIT INFO # Provides: munin-node # Required-Start: $network # Required-Stop: # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Description: Munin Node Agents ### END INIT INFO # Source SuSE config . /etc/rc.status MUNIN_BIN=/usr/sbin/munin-node test -x $MUNIN_BIN || exit 5 # Shell functions sourced from /etc/rc.status: # rc_check check and set local and overall rc status # rc_status check and set local and overall rc status # rc_status -v ditto but be verbose in local rc status # rc_status -v -r ditto and clear the local rc status # rc_failed set local and overall rc status to failed # rc_reset clear local rc status (overall remains) # rc_exit exit appropriate to overall rc status # First reset status of this service rc_reset # Return values acc. to LSB for all commands but status: # 0 - success # 1 - misc error # 2 - invalid or excess args # 3 - unimplemented feature (e.g. reload) # 4 - insufficient privilege # 5 - program not installed # 6 - program not configured # # Note that starting an already running service, stopping # or restarting a not-running service as well as the restart # with force-reload (in case signalling is not supported) are # considered a success. # See how we were called. case "$1" in start) echo -n "Starting Munin Node: " if [ ! -d /var/run/munin ]; then mkdir -p /var/run/munin 2>/dev/null chown munin /var/run/munin fi ## Start daemon with startproc(8). If this fails ## the echo return value is set appropriate. startproc $MUNIN_BIN # Remember status and be verbose rc_status -v ;; stop) echo -n "Stopping Munin Node agents: " ## Stop daemon with killproc(8) and if this fails ## set echo the echo return value. killproc -TERM $MUNIN_BIN # Remember status and be verbose rc_status -v ;; restart|reload) ## Stop the service and regardless of whether it was ## running or not, start it again. $0 stop $0 start # Remember status and be quiet rc_status ;; status) echo -n "Checking for Munin Node: " checkproc $MUNIN_BIN rc_status -v ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 esac rc_exit munin-2.0.25/dists/suse/munin.cron.d000066400000000000000000000001611243472346000172710ustar00rootroot00000000000000# # cron-jobs for munin # MAILTO=root */5 * * * * munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron munin-2.0.25/dists/suse/munin.spec.in000066400000000000000000000223541243472346000174550ustar00rootroot00000000000000Name: munin Version: @@VERSION@@ Release: 1 Summary: Network-wide graphing framework (grapher/gatherer) License: GPL Group: System Environment/Daemons URL: http://munin.sourceforge.net Packager: Rune Nordbře Skillingstad Vendor: Linpro AS Distribution: Linpro AS SuSE Linux Software Archives Source0: %{name}_%{version}.tar.gz Source1: Makefile.config Source2: munin-node.rc Source3: munin.cron.d Source4: munin.logrotate Source5: munin-node.logrotate Source6: munin-node.cron.d Source7: plugins.conf Patch0: patch-001 Patch1: patch-002 Requires: perl-HTML-Template Requires: rrdtool Obsoletes: lrrd-server BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-root %define confdir /etc/munin %define libdir /usr/share/munin %define htmldir /srv/www/htdocs/munin %define cgidir /srv/www/cgi-bin %define dbdir /var/lib/munin %define logdir /var/log/munin %define statedir /var/run/munin %description Munin is a highly flexible and powerful solution used to create graphs of virtually everything imaginable throughout your network, while still maintaining a rattling ease of installation and configuration. This package contains the grapher/gatherer. You will only need one instance of it in your network. It will periodically poll all the nodes in your network it's aware of for data, which it in turn will use to create graphs and HTML pages, suitable for viewing with your graphical web browser of choice. Munin is written in Perl, and relies heavily on Tobi Oetiker's excellent RRDtool. To see a real example of Munin in action, take a peek at . %package node Group: System Environment/Daemons Summary: Network-wide graphing framework (node) BuildArch: noarch Requires: perl-Net-Server Requires: ps Requires: sysstat Obsoletes: lrrd-client %description node Munin is a highly flexible and powerful solution used to create graphs of virtually everything imaginable throughout your network, while still maintaining a rattling ease of installation and configuration. This package contains node software. You should install it on all the nodes in your network. It will know how to extract all sorts of data from the node it runs on, and will wait for the gatherer to request this data for further processing. It includes a range of plugins capable of extracting common values such as cpu usage, network usage, load average, and so on. Creating your own plugins which are capable of extracting other system-specific values is very easy, and is often done in a matter of minutes. You can also create plugins which relay information from other devices in your network that can't run Munin, such as a switch or a server running another operating system, by using SNMP or similar technology. Munin is written in Perl, and relies heavily on Tobi Oetiker's excellent RRDtool. To see a real example of Munin in action, take a peek at . %prep %setup -q %patch0 %patch1 -p1 mkdir -p %{buildroot} %build # htmldoc and html2text are not available for Red Hat. Quick hack with perl: # Skip the PDFs. perl -pi -e 's,htmldoc munin,cat munin, or s,html(2text|doc),# $&,' Makefile perl -pi -e 's,\$\(INSTALL.+\.(pdf|txt) \$\(DOCDIR,# $&,' Makefile make clean make CONFIG=%{SOURCE1} \ DOCDIR=%{_docdir}/munin \ MANDIR=%{_mandir} \ HTMLDIR=%{htmldir} \ CGIDIR=%{cgidir} \ LIBDIR=%{libdir} \ CONFDIR=%{confdir} \ DESTDIR=%{buildroot} \ DBDIR=%{dbdir} \ SBINDIR=%{_sbindir} \ LOGDIR=%{logdir} \ STATEDIR=%{statedir} \ build mkdir -p %{buildroot}%{dbdir}/plugin-state mkdir -p %{buildroot}%{logdir} mkdir -p %{buildroot}%{statedir} mkdir -p %{buildroot}/etc/init.d mkdir -p %{buildroot}/etc/cron.d mkdir -p %{buildroot}/etc/logrotate.d mkdir -p %{buildroot}%{htmldir} %install make CONFIG=%{SOURCE1} \ DOCDIR=%{buildroot}%{_docdir}/munin \ MANDIR=%{buildroot}%{_mandir} \ HTMLDIR=%{buildroot}%{htmldir} \ LIBDIR=%{buildroot}%{libdir} \ CGIDIR=%{buildroot}%{cgidir} \ CONFDIR=%{buildroot}%{confdir} \ DESTDIR=%{buildroot} \ DBDIR=%{buildroot}%{dbdir} \ SBINDIR=%{buildroot}%{_sbindir} \ LOGDIR=%{buildroot}%{logdir} \ STATEDIR=%{buildroot}%{statedir} \ install-main install-node install-node-plugins install-doc install-man install -m0755 %{SOURCE2} %{buildroot}/etc/init.d/munin-node install -m0644 %{SOURCE3} %{buildroot}/etc/cron.d/munin install -m0644 %{SOURCE4} %{buildroot}/etc/logrotate.d/munin install -m0644 %{SOURCE5} %{buildroot}/etc/logrotate.d/munin-node install -m0644 %{SOURCE6} %{buildroot}/etc/cron.d/munin-node install -m0644 %{SOURCE7} %{buildroot}%{confdir}/plugin-conf.d/munin-node install -m0644 ChangeLog %{buildroot}%{_docdir}/munin/ChangeLog %clean [ -n "%{buildroot}" -a "%{buildroot}" != / ] && rm -rf %{buildroot} ## Server %pre getent group munin >/dev/null || groupadd -r munin getent passwd munin > /dev/null || useradd -r -d %{dbdir} -g munin munin %post mkdir -p %{htmldir} mkdir -p %{logdir} mkdir -p %{dbdir} chown -R munin:munin %{htmldir} chown -R munin:munin %{logdir} chown -R munin:munin %{statedir} chown -R munin:munin %{dbdir} ## Node %pre node getent group munin >/dev/null || groupadd -r munin getent passwd munin > /dev/null || useradd -r -d %{dbdir} -g munin munin %post node if [ $1 = 1 ] then /sbin/chkconfig --add munin-node /usr/sbin/munin-node-configure --shell | sh fi %{fillup_and_insserv -n -s -y munin munin-node START_MUNIN_NODE} mkdir -p %{logdir} mkdir -p %{dbdir}/plugin-state chown -R munin:munin %{logdir} chown -R munin:munin %{dbdir} chmod g+w %{dbdir}/plugin-state /etc/init.d/munin-node status >/dev/null 2>&1 || /etc/init.d/munin-node start %preun node if [ $1 = 0 ] then /sbin/service munin-node stop > /dev/null 2>&1 /sbin/chkconfig --del munin-node rmdir %{logdir} 2>/dev/null || true fi %stop_on_removal munin-node %postun node %restart_on_update munin-node %{insserv_cleanup} %files %defattr(-, root, root) %doc %{_docdir}/munin/README.api %doc %{_docdir}/munin/README.plugins %doc %{_docdir}/munin/COPYING %doc %{_docdir}/munin/ChangeLog %doc %{_mandir}/man8/munin-graph* %doc %{_mandir}/man8/munin-update* %doc %{_mandir}/man8/munin-html* %doc %{_mandir}/man8/munin-cron* %doc %{_mandir}/man5/munin.conf* %doc %{_mandir}/man8/munin-limits.8.gz %{_bindir}/munin-cron %{_datadir}/munin/munin-graph %{_datadir}/munin/munin-html %{_datadir}/munin/munin-update %{_libdir}/perl5/*perl/5.*/Munin.pm %{_usr}/share/munin/munin-limits %{cgidir}/munin-cgi-graph %config %{confdir}/templates/* %config /etc/cron.d/munin %config(noreplace) %{confdir}/munin.conf %config /etc/logrotate.d/munin %dir %{statedir} %files node %defattr(-, root, root) %doc %{_docdir}/munin/COPYING %doc %{_docdir}/munin/munin-doc.html %doc %{_docdir}/munin/munin-faq.html %doc %{_mandir}/man8/munin-run* %doc %{_mandir}/man8/munin-node* %doc %{_mandir}/man5/munin-node* %{_sbindir}/munin-run %{_sbindir}/munin-node %{_sbindir}/munin-node-configure %{_sbindir}/munin-node-configure-snmp %{_datadir}/munin/plugins/* %config(noreplace) %{confdir}/munin-node.conf %config(noreplace) %{confdir}/plugin-conf.d/munin-node %config /etc/init.d/munin-node %config /etc/cron.d/munin-node %config /etc/logrotate.d/munin-node %dir %{confdir}/plugins %changelog * Mon Apr 3 2005 Rune Nordbře Skillingstad - 1.2.3 release * Fri Apr 1 2005 Rune Nordbře Skillingstad - 1.2.2 release - Fixed SF bug 1164481 (missing /srv/www/htdocs/munin) - Fixed SF bug 1164477 (patch for Net::Domain on PPC64) * Fri Mar 11 2005 Rune Nordbře Skillingstad - 1.2.1 release * Wed Mar 9 2005 Rune Nordbře Skillingstad - Fixed erronumous path to web directory - Added start of node if not running * Thu Mar 8 2005 Rune Nordbře Skillingstad - Fixed some build path problems * Thu Feb 24 2005 Rune Nordbře Skillingstad - New major release * Wed Feb 9 2005 Rune Nordbře Skillingstad - Updated to version 1.2.0rc2. - Removed Nagios stuff - Added noreplace for some central configuration files * Thu Nov 18 2004 Rune Nordbře Skillingstad - Updated to version 1.0.4 * Mon Nov 08 2004 Rune Nordbře Skillingstad - Updated version 1.0.3 / sync with redhat-build * Wed Aug 04 2004 Rune Nordbře Skillingstad - Initial SuSE build * Sun Feb 01 2004 Ingvar Hagelund - Sync with CVS. Version 1.0.0pre2 * Sun Jan 18 2004 Ingvar Hagelund - Sync with CVS. Change names to munin. * Fri Oct 31 2003 Ingvar Hagelund - Lot of small fixes. Now builds on more RPM distros * Wed May 21 2003 Ingvar Hagelund - Sync with CVS - 0.9.5-1 * Tue Apr 1 2003 Ingvar Hagelund - Sync with CVS - Makefile-based install of core files - Build doc (only pod2man) * Thu Jan 9 2003 Ingvar Hagelund - Sync with CVS, auto rpmbuild * Thu Jan 2 2003 Ingvar Hagelund - Fix spec file for RedHat 8.0 and new version of lrrd * Wed Sep 4 2002 Ingvar Hagelund - Small bugfixes in the rpm package * Tue Jun 18 2002 Kjetil Torgrim Homme - new package munin-2.0.25/dists/suse/patch-002000066400000000000000000000026321243472346000163640ustar00rootroot00000000000000diff -ruN munin-1.2.2/node/munin-node.in munin-1.2.2.patch/node/munin-node.in --- munin-1.2.2/node/munin-node.in 2005-02-16 18:12:03.000000000 +0100 +++ munin-1.2.2.patch/node/munin-node.in 2005-04-01 09:50:13.000000000 +0200 @@ -289,13 +289,13 @@ sub get_fq_hostname { my $hostname; - eval { - require Net::Domain; - $hostname = Net::Domain::hostfqdn(); - }; - return $hostname if $hostname; +# eval { +# require Net::Domain; +# $hostname = Net::Domain::hostfqdn(); +# }; +# return $hostname if $hostname; - $hostname = `hostname`; # Fall$ + $hostname = `hostname --fqdn`; # Fall$ chomp($hostname); $hostname =~ s/\s//g; return $hostname; diff -ruN munin-1.2.2/node/munin-run.in munin-1.2.2.patch/node/munin-run.in --- munin-1.2.2/node/munin-run.in 2004-12-22 22:33:48.000000000 +0100 +++ munin-1.2.2.patch/node/munin-run.in 2005-04-01 09:50:43.000000000 +0200 @@ -445,13 +445,13 @@ sub get_fq_hostname { my $hostname; - eval { - require Net::Domain; - $hostname = Net::Domain::hostfqdn(); - }; - return $hostname if $hostname; +# eval { +# require Net::Domain; +# $hostname = Net::Domain::hostfqdn(); +# }; +# return $hostname if $hostname; - $hostname = `hostname`; # Fall$ + $hostname = `hostname --fqdn`; # Fall$ chomp($hostname); $hostname =~ s/\s//g; return $hostname; munin-2.0.25/dists/tarball/000077500000000000000000000000001243472346000155025ustar00rootroot00000000000000munin-2.0.25/dists/tarball/plugins.conf000066400000000000000000000014721243472346000200360ustar00rootroot00000000000000# This file is used to configure how the plugins are invoked. # Place in /etc/munin/plugin-conf.d/ or corresponding directory. # # PLEASE NOTE: Changes in the plugin-conf.d directory are only # read at munin-node startup, so restart at any changes. # # user # Set the user to run the plugin as # group # Set the group to run the plugin as # command # Run instead of the plugin. %c # expands to what would normally be run. # env. # Sets in the plugin's environment, see the # individual plugins to find out which variables they # care about. # # [mysql*] #env.mysqlopts -u someuser [exim*] group mail [cps*] user root [apt] user root [vlan*] user root [postfix*] user root munin-2.0.25/doc/000077500000000000000000000000001243472346000135005ustar00rootroot00000000000000munin-2.0.25/doc/.gitignore000066400000000000000000000000131243472346000154620ustar00rootroot00000000000000_build/ *~ munin-2.0.25/doc/Makefile000066400000000000000000000126671243472346000151540ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/ html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Munin.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Munin.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Munin" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Munin" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." munin-2.0.25/doc/_static/000077500000000000000000000000001243472346000151265ustar00rootroot00000000000000munin-2.0.25/doc/_static/.gitignore000066400000000000000000000000001243472346000171040ustar00rootroot00000000000000munin-2.0.25/doc/_templates/000077500000000000000000000000001243472346000156355ustar00rootroot00000000000000munin-2.0.25/doc/_templates/.gitignore000066400000000000000000000000001243472346000176130ustar00rootroot00000000000000munin-2.0.25/doc/conf.py000066400000000000000000000262251243472346000150060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Munin documentation build configuration file, created by # sphinx-quickstart on Sat Jun 9 11:12:29 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.doctest'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = 'Munin' copyright = '2012, Stig Sandbeck Mathisen ' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '2.0' # The full version, including alpha/beta/rc tags. release = os.popen('../getversion').read() # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = "Munin" # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = '../master/static/logo-h.png' # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Munindoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). 'papersize': 'a4paper', # The font size ('10pt', '11pt' or '12pt'). 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Munin.tex', 'Munin Documentation', 'Stig Sandbeck Mathisen \\textless{}ssm@fnord.no\\textgreater{}', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. latex_logo = '../master/static/logo-h.png' # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. latex_show_pagerefs = False # If true, show URL addresses after external links. latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('reference/munin-async', 'munin-async', 'Munin async client', ['Steve Schnepp'], 1), ('reference/munin-asyncd', 'munin-asyncd', 'Munin async daemon', ['Steve Schnepp'], 1), ('reference/munin-cgi-graph', 'munin-cgi-graph', 'Munin CGI grapher', ['Steve Schnepp'], 1), ('reference/munin-cgi-html', 'munin-cgi-html', 'Munin CGI HTML generator', ['Steve Schnepp'], 1), ('reference/munin-check', 'munin-check', 'A program to fix permissions of munin directories and files', ['Matthias Schmitz'], 1), ('reference/munin-cron', 'munin-cron', 'Munin cron script', ['Audun Ytterdal', 'Jimmy Olsen'], 1), ('reference/munin-graph', 'munin-graph', 'Create graphs from RRD files', ['Audun Ytterdal', 'Jimmy Olsen', 'Nicolai Langfeldt', 'Steve Schnepp'], 1), ('reference/munin-html', 'munin-html', 'Create HTML pages', ['Knut Haugen', 'Steve Schnepp', 'Audun Ytterdal', 'Jimmy Olsen'], 1), ('reference/munin-limits', 'munin-limits', 'A program to check for any off-limit values', ['Audun Ytterdal', 'Jimmy Olsen', 'Knut Haugen', 'Nikolai Langfeldt'], 1), ('reference/munin-node', 'munin-node', 'A daemon which gathers information from the local node', ['Audun Ytterdal', 'Jimmy Olsen', 'Matthew Boyle', 'Tore Anderson'], 1), ('reference/munin-run', 'munin-run', 'A program to run munin plugins from the command line', ['Audun Ytterdal', 'Jimmy Olsen', 'Tore Anderson', 'Nikolai Langfeldt'], 1), ('reference/munin-update', 'munin-update', 'A program to gather data from machines running munin-node or munin-async', ['Audun Ytterdal', 'Jimmy Olsen', u'Kjell Magne Øierud', 'Knut Haugen', 'Nikolai Langfeldt', 'Tore Anderson'], 1), ('reference/munin.conf', 'munin.conf', 'Configuration file for the munin master', [], 5), ('reference/munin-node.conf', 'munin-node.conf', 'Configuration file for the munin node', [], 5), ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'Munin', 'Munin Documentation', 'Stig Sandbeck Mathisen ', 'Munin', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # -- Options for Epub output --------------------------------------------------- # Bibliographic Dublin Core info. epub_title = 'Munin' epub_author = 'Stig Sandbeck Mathisen ' epub_publisher = 'Stig Sandbeck Mathisen ' epub_copyright = '2012, Stig Sandbeck Mathisen ' # The language of the text. It defaults to the language option # or en if the language is not set. #epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. #epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. #epub_identifier = '' # A unique identification for the text. #epub_uid = '' # A tuple containing the cover image and cover page html template filenames. #epub_cover = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] # A list of files that should not be packed into the epub file. #epub_exclude_files = [] # The depth of the table of contents in toc.ncx. #epub_tocdepth = 3 # Allow duplicate toc entries. #epub_tocdup = True munin-2.0.25/doc/documentation/000077500000000000000000000000001243472346000163515ustar00rootroot00000000000000munin-2.0.25/doc/documentation/index.rst000066400000000000000000000003121243472346000202060ustar00rootroot00000000000000.. _documentation-index: =================== Documenting Munin =================== This document is rather meta, it explains how to document Munin. .. toctree:: :maxdepth: 2 nomenclature.rst munin-2.0.25/doc/documentation/nomenclature.rst000066400000000000000000000155351243472346000216100ustar00rootroot00000000000000============== Nomenclature ============== To be able to use Munin, to understand the documentation, and - not to be neglected - to be able to write documentation that is consistent with Munin behaviour, we need a common nomenclature. Common terms ============ +--------------+--------------------------------------------+------------------------------+ | Term | Explanation | Also referred to as as | +==============+============================================+==============================+ | Munin Master | The central host / server where Munin | master, server, munin server | | | gathers all data. | | | | The machine runs munin-cron | | +--------------+--------------------------------------------+------------------------------+ | Munin Node | The daemon / network service running | In SNMP terms | | | on each host to be contacted by the | it may be called an | | | | agent. | +--------------+--------------------------------------------+------------------------------+ | Plugin | Each munin node handles one or more | service | | | plugins to monitor stuff on hosts | | +--------------+--------------------------------------------+------------------------------+ | Host | A machine monitored by Munin, | | | | maybe by proxy on a munin node, | | | | or via a SNMP plugin | | +--------------+--------------------------------------------+------------------------------+ | Field | Each plugin presents data from one | Data source | | | or more data sources. Each found, | | | | read or calculated value corresponds | | | | to a field.attribute tuple. | | +--------------+--------------------------------------------+------------------------------+ | Attribute | Description found in output from plugins, | | | | both general (global) to the plugin, and | | | | also specific ot each Field. | | +--------------+--------------------------------------------+------------------------------+ | Environment | Set up by munin node, used to control | | | variable | plugin behaviour. Found in the plugin | | | | configuration directory. | | | | (/etc/munin/plugin-conf.d/) | | +--------------+--------------------------------------------+------------------------------+ | Global | Used in the global context in the | | | (plugin) | configuration output from a plugin. | | | attribute | (Note: The attribute is considered | | | | "global" only to the plugin (and the | | | | node), and only when executed. | | +--------------+--------------------------------------------+------------------------------+ | Datasource | Used in the datasource-specific context in | | | specific | the output of a plugin | | | plugin | | | | attribute | | | +--------------+--------------------------------------------+------------------------------+ | Global | Used in munin.conf | | | directive | | | +--------------+--------------------------------------------+------------------------------+ | Node level | Used in munin.conf | | | directive | | | +--------------+--------------------------------------------+------------------------------+ | Group level | Used in munin.conf | | | directive | | | +--------------+--------------------------------------------+------------------------------+ | Field level | Used in munin.conf | | | directive | | | +--------------+--------------------------------------------+------------------------------+ Examples ======== To shed some light on the nomenclature, consider the examples below: Global plugin attribute ----------------------- Global plugin attributes are in the plugins output when run with the config argument. The full list of these attributes is found on the protocol config page. This output does not configure the plugin, it configures the plugins graph. :: graph_title Load average ----------- ------------ | `------ value `------------------ attribute Datasource specific plugin attribute ------------------------------------ These are found both in the config outout of a plugin and in the normal readings of a plugin. A plugin may provide data from one or more data sources. Each data source needs its own set of field.attribute tuples to define how the data source should be presented. :: load.warning 100 ---- ------- --- | | `- value | `------- one of several attributes used in config output `------------- field load.value 54 ---- ----- -- | | `- value | `------ only attribute when getting values from a plugin `----------- field Configuration files ------------------- This one is from the global section of munin.conf: :: dbdir /var/lib/munin/ ----- --------------- | `--------- value `-------------------------- global directive And then one from the node level section: :: [foo.example.org] address localhost ------- --------- | `----- value `-------------- node level directive munin-2.0.25/doc/example/000077500000000000000000000000001243472346000151335ustar00rootroot00000000000000munin-2.0.25/doc/example/graph/000077500000000000000000000000001243472346000162345ustar00rootroot00000000000000munin-2.0.25/doc/example/graph/aggregate.rst000066400000000000000000000144231243472346000207200ustar00rootroot00000000000000.. _example-plugin-aggregate: .. index:: single: Aggregating munin plugins pair: plugin; aggregate ============================== Graph aggregation by example ============================== This example covers creating aggregate graphs. The configuration reads the current and power from two UPSes (i.e. two hosts with two plugins each) and then creates one virtual host with two virtual plugins; one for current and one for power. Plugins involved ================ The example uses a plugin for monitoring UPSes through SNMP, where the UPS address and the different aspects are defined through symlinks. The two UPSes, called "ups-5a" and "ups-5b", are monitored with respect to "current" and "power". Thus, the affected plugins are called as: :: snmp_ups_ups-5a_current snmp_ups_ups-5b_current snmp_ups_ups-5a_power snmp_ups_ups-5b_power The original plugin name is actually "snmp_ups\_\_" - note the "two" underscores at the end. The plugin is then symlinked to the given host name(s) (e.g. ups-5a) and what we want to monitor (e.g. power). Let's just take one closer look at one of them: :: snmp_ups_ups-5a_power -------- ------ ----- | | | | | `--- The function we want to monitor | `--------- The node name of the UPS `----------------- The plugin Extract from munin.conf ======================= The following extract from /etc/munin/munin.conf is explained in detail, step by step, below the configuration. :: 1 [UPS;ups-5a] 2 address 127.0.0.1 # localhost fetches data 3 4 [UPS;ups-5b] 5 address 127.0.0.1 # localhost fetches data 6 7 [UPS;Aggregated] 8 update no 9 contacts no 10 11 snmp_ups_current.update no 12 snmp_ups_current.graph_args --base 1000 -l 0 13 snmp_ups_current.graph_category UPS 14 snmp_ups_current.graph_title Aggregated input/output current 15 snmp_ups_current.graph_vlabel Ampere 16 snmp_ups_current.inputtotal.label Input current 17 snmp_ups_current.outputtotal.label Output current 18 snmp_ups_current.graph_order inputtotal outputtotal 19 snmp_ups_current.inputtotal.sum \ 20 ups-5a:snmp_ups_ups-5a_current.inputcurrent \ 21 ups-5b:snmp_ups_ups-5b_current.inputcurrent 22 snmp_ups_current.outputtotal.sum \ 23 ups-5a:snmp_ups_ups-5a_current.outputcurrent \ 24 ups-5b:snmp_ups_ups-5b_current.outputcurrent 25 26 snmp_ups_power.update no 27 snmp_ups_power.graph_args --base 1000 -l 0 28 snmp_ups_power.graph_category UPS 29 snmp_ups_power.graph_title Aggregated output power 30 snmp_ups_power.graph_vlabel Watts 31 snmp_ups_power.output.label Output power 32 snmp_ups_power.graph_order output 33 snmp_ups_power.output.sum \ 34 ups-5a:snmp_ups_ups-5a_power.outputpower \ 35 ups-5b:snmp_ups_ups-5b_power.outputpower Explanations, per line ====================== * 1 - 2: The SNMP-based plugin for the UPS known as "ups-5a" is defined. The group name is "UPS" and the node name is "ups-5a". The plugin is run from localhost. * 4 - 5: The SNMP-based plugin for the UPS known as "ups-5b" is defined. The group name is "UPS" and the node name is "ups-5b". The plugin is run from localhost. * 7: The group and "virtual node name" for the aggregated graphs are defined. The group name is "UPS" and the virtual node name is "Aggregated". * 8: Make sure that Munin (specifically, "munin-update") does not try to actively gather information for this node. * 9: Tell "munin-limits" not to send alerts if any limit is breached. The above lines (1 - 9) have now established the fundament for three different graph pages; one for each of the two UPSes and one for the aggregate graphs. * 11 - 15: Define the basic information for the virtual plugin for aggregated current. Note that "snmp_ups_current" is the virtual plugin's name. * 16 - 17: Simultaneously define and label "two" values to be graphed in the virtual plugin: "inputtotal" and "outputtotal". * 18: Order the values. * 19 - 21: Calculate the value for "inputtotal" by reading the "inputcurrent" values from each of the two UPSes. Let's take a closer look at the components :: snmp_ups_current.inputtotal.sum \ ---------------- ---------- --- | | | | | `-- The sum mechanism | `--------- One of this virtual plugin's values `----------------------- The name of the virtual plugin :: ups-5a:snmp_ups_ups-5a_current.inputcurrent \ ups-5b:snmp_ups_ups-5b_current.inputcurrent ------ ----------------------- ------------ | | | | | `------ The "inputcurrent" value from the real plugin | `------------------------ The real plugin's name (symlink) `---------------------------------------- The host name from which to seek information * 22 - 24: Similarly for "outputtotal". * 26 - 35: Like the above, but for power instead. Note that this virtual plugin graphs only "one" value, and as such, only "one" "sum" mechanism is used. Result graphs ============= The graphs below show one of the UPSes, and the aggregated values. The graphs used are by week, because they had a nice dip in the beginning of the graphing period :-) Source graphs for one of the UPSes: .. image:: aggregate/ups-5a_current.png .. image:: aggregate/ups-5a_power.png Aggregate graphs: .. image:: aggregate/aggregate_current.png .. image:: aggregate/aggregate_power.png Summary ======= We have now, in addition to the two real UPS nodes "ups-5a" and "ups-5b" (lines 1 - 5), created one virtual host named "Aggregated" (line 7) with two virtual plugins: "snmp_ups_current" (lines 11 - 24) and "snmp_ups_power" (lines 26 - 35). The "snmp_ups_current" virtual plugin outputs two field names: "inputtotal" (lines 16 and 19 - 21) and "outputtotal" (lines 17 and 22 - 24), while the "snmp_ups_power" virtual plugin outputs only one field name, namely "output" (lines 31 - 35). Further reading =============== * [wiki:Using_SNMP_plugins Using SNMP plugins] * [wiki:munin.conf munin.conf] directives explained munin-2.0.25/doc/example/graph/aggregate/000077500000000000000000000000001243472346000201625ustar00rootroot00000000000000munin-2.0.25/doc/example/graph/aggregate/aggregate_current.png000066400000000000000000000122351243472346000243630ustar00rootroot00000000000000‰PNG  IHDRíUœP!PLTE˙˙˙őőőČČȖ––ŒŒŒ‚˙"˙""˙AĘŮł7IDATxí]ťră:U੒CŐÎzóť?pŤîĐUr•çć\ďn¸ŃŚ ě*ÝlO żÝsN @‚!‰cR$f Ý@Ł—hyőŰ,ĂďŤYÂţ'pofţśŕž•Őgiďíöq–¸7óÄ˝ýş™§˝7óÄ˝řwż5ěἝÜC`YĄ:o Ë×b~œb˘DƒßȆ‚]ôPŔ'Jýűĺˆäš5~ÜŔ_2Ż1ůß{Âůđúšä}Ć?_wNT~§}ůřŮä×RâR›M=-…\Ą ÷ëËË?ŔIŹĘăÉF}ž ‘„2úa_I)tĘH˘”gőÉóőT–í¨.…Ző…DčC=(ˇQĐWh>7Eëˇt’t´đý¨Łľ&\./űS•qĺL%S˝Ŕ§Ţ(Ë`ő!“uź|<=ßJ9š‚,œÔŚöĺ:Ÿ_ˇeăüőŐᴞu8!ţ5Âí'nŠE}œîLĎ÷¸÷4‘Z|´O,Ž4Áúüô Ľţmöu¸]?`Ln寈ŰËkŕń8 Q¸YN?=AoĘÇ9MëĚkf2S{{ËjĘyýřTaTő4&â4ë ďi>­ź2jQ¨‡Źłˇ+ßsœŸ3ŻQ´éoę( o´ń†Ň —ü4ćSU—xފxżä#eKŚ‹P›5E{A¨Ë3Ő+ĎkőÜ ůn՜Π\yĚ÷\{¨3ç^ϗVĄŒÍőž'mĎă°9š˜!# ’ůŕÚa+Şç։¨Üąd‰SްČâ&•ůcň‰Ą+ăuՉčGۍʵ“…ó9Œ÷˝V¸~Ťăܘ Čü‘pLťcź#"eKÚÉbŮgŘ;+g‚ÄR˙ž ÄśĘsľ÷9ţÝî˝éQćjoXj–ţ]¸OŢ€îĐřqŚöŰëֆđďý¸™ă”óŕíŤĐS7R9ĂŞťžŠ… Ë0Ľ{Ěk8÷źę÷ďO7žňSöĆAD¸7_W •â/Šď;R9ĂŞ›¨DȰŒ;3řIÜD {Ď 7|;Ćm&žrL{oOŻc0ľÍk75ÎOÎk¸ŚÔ0wă|ʖ6Ýĺß_ű߯ݔ˝Os›ýÂźv#ö.Ć] řÖ1ođíöî&ÂÖś†'×o{ńďiű¸í×ć9Ÿ—Ü;Ř8Ÿś­Šýě˝ßŻF{.Içľ3ě˝ŢuTZď:xÑiď’űÔłçs`[ďß$>šîďŰ1~ń9´äţü\˙^ ŢŽi@‘wë}‹Ń,xí|Š˝mߒټ)ĎxťťŰž)ÜEa{W“P‚aĹJúčúŒłö-˝o†ć(ß­~Ě!ŕ ýËœö._Ç*ďľ?_?ŢŢjźŻĐű÷~‡Ž°ĚťˇRĎôXđţyO˙Ží—Ěă耀+ŹŁ4Śţž§™3éMÚ[/íÍĐż¸oĂŢĺăźđtvžŕ|ŢëýTţŞĹmÍçŰŤźŸ:A{ß#ĎÇż9ĆşĎcÓłwÉůť×}K|É1Ň4ď[zě×ĚŘ7foŔ)üœhńo/˛ŞŚçß%߯ř‹Ďc÷?rCkľ:äÉýŠ<}˝Ęű-űZ­ŘňýOĆî^$9S§;ź¨Ô—ՁP*‘,ž;~Ź&*fÜÜŔ˘(Hj¨śľqŠŃóüݘ×Ô@#Â5“Źp˙CܓY˘´Tqhؖ Đ\]ÇUĹđˆGB‹_3ĎĂ]ŠÔz{jóM*ýť0‰;>7TęđSpVßî aB>čŔĂOüLĹ^9|Cł‡Ă݁đÄđe} śN‚‘ßĐ˙\ÝSŠé^Šť{ý~űˆB~Őţř¸űhq˘Z>™”ńD˙tLfďî<ąŕŠú×űý’}í _4fÍŢöďÁzYśˆVř q~üd{)XőpO2ŹGۋýŁ}ŸzŻ6ź\…÷ߤCĹęÖ§k¸ąaž{…ő[¸Ľ+Ű jĚŕŸ–s.č‰VĹ<ŻkúFNëš8ďa ŁKÇy÷ţ<ś7űő KúţU/s܄aŁÂŒĎmłśĄWÂoq?Qß`ŒAě-Ü03Ś´3ŐŠ73ěwÄşTmĐpîJ:™‘Ź—WUboň=Ce+ĹŽ†ő‚‘úÉĘ^ąĆy¸˘ĹţÝ`0{îJHb{ŻŤżhĹ6#ńŔ¸†cLÄŢüP-ţŇ|Ą™@Tjďíö AuŘžqK˛uťŠča¤NFTŇWď,{Mî.^ż÷Ÿ:;—°Ś˝ík9mqËĹÝëˇVĽÉúˇ} iąŃşĎߟš_nď~¸sf]ě]ŢűżžFËżO|1ç­úwˇgßśG_6–í‚[ľ7?Ű?şď[2W)ɞd\™ć}Ë)ܡjď~ă<7˙N{ý~=ńϡjďcžMžáž={/űóźĺoŐŢ]űsĚóšęoŐż;pcřÇß3˜óoÝÓç٤őܟëŰSađ#ď§ţä[ŚĺŻ–˛VOJYˆLÉbćCxRĘâ@dÂH3“R}ż?őôűŠőů( ÜPާ˝áÜöŒÝţ-ܕÄgŽM;#šOľż¤ÓžËS܍ÎSvÚöîĆĎk9ëMŰލżä ßăűS§moěϏţ–[őooŕŽg÷~mÚönţńÂ&~ťw\đU ](|lő Œú–ÁHŒş R'Ęv 9ƒń(dáómF›`Łźa óĚMňŁĽő]ż=tĂŤˇܛCáíbŹt’ëˇG˜vűˇO&jÚűÄt~äýsAŽOĐŢy+×ÔĹŢzˇ ćí~EśŸĆűŰľ›ˇˇşj˜­T÷~MÖ­OĎżOÚűČç%ŘwL'4?/YćóÖáVçó<ښzŁţ]ěH-öžŠőťĂĘ5yą÷boۏN+nžÇęO5î[ęĘVI‹k*RFęd””írŁqߒG[S˙^ü{Zžmږú÷˛_›˘•k{˙VOÚGRË|>ŻůüVď[Ž qą–ůźž§˜Zćóe>?ćăóóďř{D§čŃŠÎýýŰŢ˜Ł˝1ţÝ{šáĽÇÉ&úž§™ţÝóJƒŚäc°Î#y_ń؜Ƒ>ÇýyťÓzĺŒŃŰ;~/WĂ|ŇQ˙ů<ţŃrłvÖ˝˝ÍóçčßD>żő{Ţö^>/™ôt~ć÷RuÎÎĺŒe>˙Ľ¨˙úĎkĺf폹Ř{ąˇz`؁pŢ8˙ĽŚ¤ąópWŇe.çoÎlËç%óú|l9-ödÂXč2Ÿ/ŸŮN</÷-;ŕŔâKý{šoŘ ‹/ľ÷âßd`ń‹˝—ő;żruńďp`ńĽţ˝Źßd`ńĽö^ü{`ƒ ,~ą÷˛~Ďcýţa†ďg:‚Y/jÚźfÎgŸdqŒťÍ?ţ×÷ŠďŰţJqÉ)Ă~ fúdÚî €÷°7ß_{řóű÷?žĽáIY‹Î FIŮré5ž˙×fóßž¸˝<*ńwĹ_h¤r†U7QřËľ ËŘŮŰ úŘ)ëłősŒžţ}ňŤ|jܓHőĎm^›¤ţJö˜×ěű°ű‹œDÉ>¸'¤Pɋpw~çĂĆţLDëE F‹&¨ ÓţŽÎKW×ŘńˇkD”‹p;t‘8—ôMˇaxNłNťd*ލťKŇćáĺčŕšÜKqłővÇ?`.5c[”xɨ Ü`lÚłC^_2m ę´˙.ƒ5žaÄ}}Ü9l›Ř㦔ů…ź&Ŕ˛ýĐ(šýv¸WáF'6ÚfămF\î¸Ű_ŹĚŚéÉ-¨*;¤Ĺ´4Œ‚×ěšÂq“%ÜYYú5pa!Ą.GĂm¤ĺ•Uávôë´ýŰ™6ʁ #¨‡Äĺ¸3NĚŠ:Ć9´@Ĺsö ŘťŐ#ĆČŔ#ס×ÄÍšŤ=çlđç :ç5öG…ěerÚӗ5Ç͙Pňb¨Iú2{'˘&•YpOĘ\+ťŘűâ.œ”€Ĺޓ2×ĹĘ.öž¸ '%`ą÷¤Ěuą˛łˇ7˙>Qî°wqώS@°÷ż÷űýŒqۗ9˜Z‡Egş6=7RpÔE ă„ĎbKFăą3é˙VQháeى´tF˛K$5ńŇZöŽÚôeš#ľEĎśVˇŃ¸ČŢwâ"BwՐ†ŁîˆbDkÜd„PSűUŐJp’ĽI ňaŢřŽŽĺ@0Í˝xEń€Q†[č]xŠŚ$§Š%ßZ˘ˆŠáTńRźJ$ÇćFVćs.ăŠSŽýřzaƒÉ‹ŐÓ´*ŹĹpűőö´!́H Ĺ•žŮŰăN4scQw…ÉčR{”ךBv-Çô×ŕ÷ŞQ=ÉŚLĹĽM6cÉWQ+ÍÉŁ9ÎkMźđ€ŰŐä̅j*¨ëç5¤Ń&ţ×čž)>aWŮťÖÍ-_ ŔŠâĄ(Ě­šŁ™ă“‹uĘj!'›Ľë˛ÖKÔ˙B/Ľš¸âMÜ&$ԉe~fšHŽ&‚ŰOČWÞÇ}5ńŁ´ŕ­iQ,ŘŰŻcƒ´2>Ą÷đBG7×_MÜś†E#$4čénĘʢˆ‘;Vä†DWZŤxÂj4%^$;éłë]\Úďrš¸m{Ú ‰DîâmťdS—Ďž]9•Ov"Ü{1Äxœó˛Óśł˛ŁŇa;“Á čŘ1ńŚŰô›8îăÄJśTT͡N–ŚŹ‹=(w0ƒVŸ W‚ačD;0–´ŇÚ›Š "ÉĆŽ˙B“ś‘4Qžëýšóo`Ĺȇ˛¨k˛‰ŰIü˙Üń\5LwĂż/ď‚Nܗ‹ľ„÷¨Ísuĺ{_˝KG-p öŽ—¨d=9˘¤ëzÄ@‡ăł­ćÜ ¨Ű™ĐÍ( Zś>—|˘uzâN—đˇĺx 0ĆŘ|š‘9 ĚFŸ—XöSbŞ {đ~Â)Ë#-ö˝FĄŠ¤-•'QJjjtÂbĐ EP@ŰW—Ođ|fœKS{i$XƒÂœ7Յ‘‚űę9뤰 v} şŐőŸM7śŰŔp›Á@¤ş#”Ăí˛‡Ă "ëőQ˜Ëáv%F‚[Ú9ç ’H{űŔ|¨¸°$ŤŮpń U7yŁÁÍŰťÇá‰JăœCÝnj˙ÖiWŔbÎ<ŕ,Ď'sŔ#áhFáŤ#ÂÍAÔú!íç5hŠłŚÇ튱ŒŠyÜ6م㊊€ çvďýxŠ&Pś1{S4˜MRÚus îëöçŘĽÓŢĂ÷ڂ{ř>S ‹˝Çdáu˝˙ůÇĂďŤ9˘ţăß˙0&:IENDŽB`‚munin-2.0.25/doc/example/graph/aggregate/aggregate_power.png000066400000000000000000000072721243472346000240420ustar00rootroot00000000000000‰PNG  IHDR흁APLTE˙˙˙őőőČČȖ––ŒŒŒ‚˙"˙"6Ş oWIDATxí]Ënă:Í" dkLÚ˝ż÷čpČ䲸žŮÎjś^¤|öœsŠ”ř´­XNëAv‡"Ťř¨Ăb‘-Jw­Ňýź[%쿁{łB÷݆{UZ_Ľž÷ű§UâŢ<­÷ţqłN}o։ťŮ÷çć°í[=ßścʼnzúf†ťäy –ŹFĎKH(×Ú÷ۉš{ÖôpŁŽ׍˜üŸoTáÜQÜGú& {~éÚ7aĚ­ŃăT…Ř•ö-܇ˇˇ ţś[ŕ$VĹqĽP>ÎŞVzxLëĂdůźh0”Ë \—4ŸĆĘc%ŸpO›ŤćoĘžý{cŘÇ!".núĎŃ]Z& Ă0ĄźđŹ Äcžç3ÖĽą`˜ěňđăţş~~8@ ˙ŻĂ‰únĂ`mś‡…)Źç˜„vˇ¨Aô1%ű”w­}{ԁr2ž98|ŠÄmy",ž]HnŚŃ_”lHäę~NŐ:őZˇ5U{}K—¨“0ňœ.­œE—´0 Ě"H5 8ƸƪńŮL^…a‘fŤ¸Ř$o˛;şěŮ”!ŔŮźŃuĺáůH!aő-ŸhŘu}Ű8Nymüvc::ťĹ1Ţw<†ÝxÍqŸiŕüxn6˘ą^tľr|Ď?ŤđëćoÉŹŽ××O˝yykWľQŔLă+ ž-7L|2|ĺxβ‰3Ćku§8Óx9ßeŠĘyę•óˇJÓÚÄúkOŞIŁ)‚4žŚˇrÇS÷f}eœńšů{đĘ"ŽUßcŘwšE§M]ŤžĄ•UÚ÷•ëÔiwćŇ=­Tß'pk•€{=´š‚Që}bAd>ŒŠ}ť›A q?‰bđ °‘†3,ťkаŰ2œ–*¸íć‡kP[ožżž>/½ž yˇunŢ÷7˝ÍăÝNţ7ů÷ňi8ò[QQ!ˇeÜ vuVłmťéXîPߌâ9űÔ÷ž>AßÜT?×}â˘ôýTëçœÁ°ácăšĐî9kÚd—}?^žżv‰ž~Ťě|Ŕ+1”ęĂräăšËqˇ{8˘Ě]Pî•#á™qÍF˝Ŕ?ĽďÎI>z¤ŕBŠ—d:ÄĹvä›]ŽŞ-ő>‡{§bŹÉ;ľRň‰˙űHţýQX_Ž€Ü=ó`€ Ü/¤˝ăďăHÜKŕ‹ĄW2ŽŽÂ¨‡|ˇO=iVDuJ*ŮôLľ=÷ăčň‘äÎt“ *Wš”ĽwŸĂ˝SŠžŢżŠŚwôc’„úEľ#Ş7}  €m‘Hť;şŃčS,cˆ ďyx?˝n ,ۂ'ě›(œS^á§Z]ě’ĺL ŸĺvW__t5ܗçűý=œ<zˇżGdo„wď:’c îYď–Ă28ßR™?"ŁŤ’˝bű'Ź[<ˇwJß˝ĘԃűčCfߗëűÄüÍN˝Äow ›Fsr2"0ńhf<Ź¨ĎkB—z2fG ĂişIĉ{Č~ę…ú&śÉë{Čţůeö= •žbÍúFWŻíˇ šżO6đĘÔ÷đyl'ÉčŽçäOßž<ž(űđüů’Ćó!ömëÔh é#ď>0‡+׊Ă籒}÷7;w‰áÓŘK9H˙“ëľáăš$N<áNhӍr<_Ťž‡Řw}<ŸŸž‡ăŢŠÇfžN]Ćüý4Ęý÷üćďáăÚ2ô=Äž—ľ>ă÷’ůÍßĂÇľeĚ߸¸Üěť×|Ďçr?śVűnó7fň3Ž­Ďď3žßüäóX?Š÷ĄůçűQžOĄžGůý{†úü×2ÖkíţűĚ$vý÷ďľÚ÷Çąۧ:ó| –¸Ł‚Źë[ę• _PeüÉçŤűkv^Đ^â.ésň(FBëůľęó-vv*8O„ó‚ßŕžéĹîů7ăĎôb÷ʍů§Jú ĆçÎ FMç"óÓ7,¸śNUç6}Ÿ;/8Cűž÷šó‚KÓ7_¤¤AýĚyÁ%éŰÎ ę  ;-Yß?_”žŠčČ-jţŽŰw„™‘ŚďtżeIöŠťéŤ•řůľŚďŇjnj4ŽĎájë5ăží#ďóG­÷ď¤íéĹnݍů§JúƓ@]Œ;ĎĂsËžżípé‹.vhŰÎiăč6ťňNý96|‘ŞŒ?y˙= ŸG‡jăˆđÍĹjßőőÚiľN]ßç^şŰ÷\´›Ë™ęűÜŰĽ—Şo{5q0q%ÁĹę[ŻdNŔŃĽę{­ö¨ś\ŞžÝEĚ$.ÖžíľíUÜőőšÖŢ×ÖĘć=Ë>źOäHÖçz3őbő}°wgց/ŐžíW°s¸óőĎÜ(éz­ŽŘ8KŐwĎ˚_ŞžŰxž6}—ńzęR×k_íşTű>÷ńˇĎ#űĹć,Ž|Ÿ\ˇŒŐT-úRőÝö[Ęj_ŞžÝwÂĘ Amăyú{¨îLvňç÷{Ʌ÷ĄsťűĘĺÍďÇě9ľZG_Ş}Ű7j¨—lߍÔ÷ŠíťŢÇÉYŞ}ŸFÍwPÎbů}VČt}~÷ZőÝÖk‹ZŻëćm}ŽĽßeřNKĹBŽ™<ĎÔěťé;żŰ™>%ż;=´­dţÖ&cř]ĹuŘwxBŇöYץowbΞ?ĆsTîœdtŢq–‘Óç$ÝÉPűޜž&}çßUœţx}NÂÓăšéŰp‡ç$w*ś°úΘäzăZ黊çZsúüÓúŚa—žŤ8\­Ő“Ôwž†YÇü]Ă]ŐŢpFÓ÷ÝWş3ö)|ów{ľű-K}9×pLiăyŰoůĘqxŹşÚxţWlȕXłďfßcŮÜW–ÓěťŮweHš­ĎżŇÇŻk¨}ˇőůř:řʇęťŮ÷WjgüşšžŰüÝćďźÚýXť´˝}‰mšő”ś>ż˝ ޲†fßÍž{kÎCí~ě–Öwű˛›}7űέş§4űž˝ ޲†fߗŮw;/Řîżoi‡ˇ*ťŮ÷eöÝöך}ßĘoYnłďfßýj<-g}ţƒŕş÷ĺHAą#sÁ9*ł<;WS°Â0î7?ţwˇ4Iúđ“úîOĎm˙y}ýî™^ěž5?âœa I;źôjŽ××o6˙˝ˇˇ‚'žË4˘‘†3,ť…rә[Ćfócsšž ˘÷°>Ú_gÁ8oß}?ďĄÍ?t~<ˇSƒ6ŽÍo„ŕä¸f§Ýle›}ä4îŮĂŤ¸ wő]ł[÷ą}y4Ź92šřލóđĆň’p~ľ@c _yœ:‰]…ťú)_uĂs1Ş%y9ĆZIx1čé7čŠękqłöźáˇ A-čéˇř2NÖ €3ČŠcĘĂŰśP‡4ËL‰łĘ Œ0ݸK(X7ą‡U) 2ż•ăśR{đ86fčtNŰ1ŠułňÓßwţJJVMKÎŕB™rő-€ DŃ x?wl§bQ×–0î°< ŤÉ‰0c‘VV‰ó ě˙`•pWŕYĚtÂ]ť`ÄZPkĽŸHfJn:Ľ č;CaŒ<1Jm|-nŽ]ů˜łÁť0ŞăŰŁ€Bú)eĺä×UPĆ͑đ–ú[p^áëô=/ŹĄ´ wŘË7}/_Ç!ÂŚď°5–nú^žŽC„Mßak,?Üé/ú/Ü,ś:Ü˙Á7ÜK7š EžâŢęθťMě5ř–>續üz_X‰[—{gţÍ~H&FŠqÚŽKĽŹa†´lŸŢĽaM>yŠŰ˛zn*†/¨żÖŞ˛Ü5Çßš:¤÷Ńjż‚ťöřk`Ř=Ká;ĺÝ‰Š„YéNÎNny˜+ŕFĺÜĐŇk%më ačtúVˆËN…PX#ş+Ÿ ěĹĆWÎŘ}ráv›)JëS,ZľKGŃÜ_ˆK—œĹälŇ.y7*G~VŠę-lB°ÜŔą,kَŠ2K…_wănqżcĚÁÔm×p[– R§dmŔŚĽŁ0IŸ%W‰IVˇĄ4‘- ™1äG¨ š¸"ĘUF‡;ŕ‚ýsrQßöy rĐHh|Ö§ŚrÉť\ m´MŽ´Ühęłô^Öŕ˜Ăp#SR¨(UÜÚKŽ42 7@Ö¸+‹káva"tm”ˆč•Ŕá“-+×ávó7ł˛˙Ŕ]É\?×'“B-=‰ąpÉľ‰:˜ŐÖĄîú9lƒ>í^˙]R^‡ •ŇÂą- Ch5aTw¸-'Űv‹ęÔŔ`˙Őň nKŸIŚšI¸ ŹW Đş;ÜÜE:řŔÍĆrr؅<"âJGŚx߉!<ł”’[YކwWmˆ/ w ž.@ cť9াÇvUÜcW4ąňî‰)äĆâ4}߸'VüôÝĎŮŃ|%r@áŹÝť€˘ ůȁ9ŽË%ľťÜŽ˘›f„;^Óĸ-†ľ•Ń×ÚĂď(ZÓ¨AŚ‚ŰÖ^Ň…ĹâM?Źó6ƒĘ. ßýÚnwz˝Ç ’€ČľĽ ¨LŁ€d)óuŞă‹=É"I=<Ü!虈`ín ĺnxrîq'ĆŹ‘Čn˜Fé‘Ý5Ădô}ŕšşĂmř¸ýƒôf-,>ęp612ĎB)Ĺł@ł˙Ę2ÜÜ­Ă;Iô”Kr{ýYDŮÚ:>sŠuĺUŻbžÉŕ†9%eäă/ęçěę €ä;‚2FI•… EŕěÂŰhtvxÍ(Ú÷b†iŕFOÖ(ćđşq BGăšKšŃ÷‘Ěŕ2*Ĺb›E.}śž%ŠK9 Ül˙ŘI{1iäŘúyi­¸ó–›2M}2/ŻáÎŰdɔŚď%k7Ç}˙ýkîçÝQ˙úőó˙ĎČáJęN#IENDŽB`‚munin-2.0.25/doc/example/graph/aggregate/ups-5a_current.png000066400000000000000000000064441243472346000235540ustar00rootroot00000000000000‰PNG  IHDRíUœP!PLTE˙˙˙őőőČČȖ––ŒŒŒ‚˙"˙""˙AĘŮłbKGDˆH pHYs  šœtIMEÖ =S=K ‰IDATxÚí]=Žă:vŕäXOmžďxh=@÷ú †ťnôR6ŔɸÝvů+‘"i‘–Üś¤âLŰ2K¤ôńcY%JÚük•éĎÍ*a˙!p“Ś nÄ˝ôôövX'߇uâ~ŰŁ~Ł~Ł~&`Œv?úBő—ĂPĹWfWs/ý†k'ńL¸'Öo¸Ţź=ôďp;]vJžÇéˇ8çdÎKמŁř’2ő'yC7ë~ű2ŇĘl9ő[~÷ůśĺtTS•ÍD~ ăqSńgÎXw> uäˇ*cq{2ŇĘÜrň;ŔíSlĐśœŁFWÓţŒĆ­˙ŹM“„v¸;š>w'ŻżműK[‰ČÝlóű¸á{ôť=~§b›L‡[ŕôô \‹[î§ţň˛Ipwvšzýź›óM˛pˇűŇo˛kŕëˇ: đqS“ם_÷ۑšĺ#¸i_żUi‰[¤n_řž…*{ö\ŰUęŮ8-—yŹł÷öˇ#s˃36č6e=ŕM[éěy.áăÇo!2*ћKŽ´çĹ=˘ôČńűĄ¸ŮítOÁ7úß3Jkĺ{ýFžQż1žö´úMwAú1A!îƒSŃŢÍ*ěÝs:|› ÷ŰRŇĄ ÷~#ÓŤú|QŸŰ“U.Ř:oßű śqçăž’¸ßÖĘ÷a|“ýő{M|Ł=Gž“óľ­HęĂOoŰŰ“Trƒŕ°fž×iĎKâ7ó]ŐIç ć[áŽńÍeZŽ=O‘*@ׯÁwI<őfž%Ťu(ŕG‘˝ŠNŕ{(~nĐ[ůŽęŞV˝šOk%óôĆ3ňMd˝l¤œďw…ř ç'Ż„j ýăôŒúMÍńůăóóĽ0tқ¤Ý|ůŢôů9<Žé~ŽŃóÍ_ťĎÍIuëś#Ôüú=°>Őá;Wż;Mć}ăÝ)wíjú#ô{O qň-yuůś‚ZăFđ^oËwŽ~3ĎŽĺŒÖšOŸHaŮŰqœ':Č÷ń3Ž1oËŕ›Ë‘™ <=š&œs =ýüœWœG‡l5hűŠ>4}ß7Ě×´ŮŽ$şŔĐŤŽĐ Č÷ôóóVŤŁ4V‘n𾧏ŻUőő]ÉgĹ÷[$rIÇmi*/1*Ýçşŕß!w䝪żOż‹ľ5,!|¸I”^Ů~O˙[œé+ŻĽ›}ßźG’śúăůŽĚL˘ćĹţw.ßvČćˇXg­ŞMś¨"Vׄ|+7ť–„ŸĘůŢđI•$Šâăóę]M’śŞNwŇoÝ Ş}Gň-§öUÝ÷Ůʰ•G2ďó]>OóÝ N|ߝ—ăűXĺF`}ŕTúßš| ˆó8<¨Ťľ"2pľ1Œ:óCŢÖWqž2Şătós—ďňë%& §„C’=ęqX‹˛öęÄÝÜ:€B;Aíű|źv¸ÓÍ׎Ł&_G'‚­ůÓŇcX"‘‚CčSUčůÚÄ|żÜŔˇŃ옠ŠuOżßUÇvJԛwŐăS}ޞĐ˙ž_ˆLÚe>EDĆZ>ĺő1žYĺz‡ęW5Ÿ!ŢâřÔŤşţýÝäűÁú=;ž§™ŸĎďĂÔóľçOržöśGýFý^>ßÓřß8~Ł~Ď\żí­ăZĘř=pÝ_ÂŇř^ßBzë¸~† Ł~žœR‚—k‚’}'Ču\Cú͂u\Ëŕť`ÝŢŞěyŢúľIůŢ5ÍŚišóîܲf'%"_~ ÔrË7\ŸZŐâ\_ĹŠ6ÍW)ßť/˘Íúhdş¨Ď/}ęN%;#jš×h)hLUCkÓ|œ=ž›"žĂu\ŃXeă¤bUÚéRťśĹUť˝ŮYćÔÎgőuŢ4šIUěđżťLśž…KŞ?Κ¤8ߒÖV°Y˘UŇL{Jšsşv#НüĂU7ŕŹko.“Í׸C˛iםŚL刟Śq5r§5Tr'úŞĚßĹťĘÎô†Ć/ďěpŇmĂvÓuí„|wuĐíŮ4źÔďŽÉwÝ:˲g5;n„Ó˘ĆW…eŒ=ˇ}ăź˝ ß.?v[š+ٕ؁iS3áý‚Ç‹#¸č¤÷ß§ÄĹHrż o–6_+×ď5ůßóćč:ů֏ďL'žHuő{Ö|çá~wV’MÖďó’ůŢ;n—ëqţűî”ÚoĽ8nľ>3ßMřĄ@ĎfĐŐż ßĎ~¨Ó;2üĐΡżŇĎ5ÜW4ĺY§ŠČëăNřĄ–C(ňC‡ů.qEqÓ|ÜýłNůĄIÜWýPHůĄÔz %ŽhÂľžeÄ ŚýĐH?ůĄĄg9ě‡FíZgđľZäŠ&üPmŒh$žšöCE›Ć˘ŻŒy–~hl{n—ě›üĐçsEŃE܈q#îçÇ ńA¤…?ŽÓk~&ł“šÁşh/řÎwď2idÔe΅j=ęĚvťKς[MźZˇIÝj&§ŞywłP÷ć’vŽNĚL­˛pœˆ§á\nÔ=(Ězgŕân[÷㍃×P-ľł^§äM!ôšřf흉Ç­î+éÔÚť›ĹóI çńB—ăn8EžˇšHî㆞7îÝ͒ŔÝĹč ÜxFÜęNíoŠmŞ[ŮéÜ<ç ľ+ qëA‡ĺÔFťÔAŰľ§Â-;šBc­]ăkZÜÝÝ,Œx7—˜ő jÝPźĐVd´ŕ‰ô{0L˝šůÚZqăüq#nč¸oŔýÇ_kLnţZ'î˙X|"­'›=śIENDŽB`‚munin-2.0.25/doc/example/graph/aggregate/ups-5a_power.png000066400000000000000000000053361243472346000232250ustar00rootroot00000000000000‰PNG  IHDR흁A!PLTE˙˙˙őőőČČȖ––ŒŒŒ‚˙"˙"ŞY$bKGDˆH pHYs  šœtIMEÖ %=ƒ CIDATxÚí]MŽăśÖÂČťńÔŰż\ @.`ÎCĎúL3Č2Ťlľpň΋nŔźíăŸ(R˘,É#y,ą8c™Í?éăÇ*’e’Ęţ›¤ű=Köo7KĐýJ¸ ÷ÚÝńxH“ďCš¸;’o’o’ďtŔ9ś;üˇĘţłĺúî™ĺâm ę,ßÓʡ|X,ý\6ů­âŐEĽŠü:Íƒ*LĽƒ°>\zĆ\SޝČlzÜ(?ö×ĎŤă*ÜXűuœý[^°*#(×+ÓĽ1Ţűtwd“ă6ŸJ§Éoăf ÜŹťĄ]ú&nxůvĎWË­ôłq¸%Vč*ˇÂ­ŇčĎýŮ,¸™k€mçˇůf˝¸mšťŰůäz Bů֏ Ą*`ü|#Ćq+yGSŽŸî×čӎ[8úÜč]ÄĐoőľőűú\ă0ş°ĽĎ%x[Ŕj}~/áÓ÷ßpGšŹád9ą>Ÿ7L÷÷ßłâćÓŃ=ß4˙~b—*ß3Č7ńMňMöľ§‘oF¸G¸ŻË‰űŕ´óƒĆGěüg:<,b,îăZÜaî]ŚÜ^_żčë&ó‚ĆGlźˆ íźF¸‡ă^žS¸Šň}H“oś;|§Ä7ésâ›ř^1ßięó1v‡ăqł gć%Ô§$ßcěŠkâű0şß>{BˆoBšOĄ‚ä×ö˛—!ÄĹĺř&Tô‡ÉĄŻ6ťšĆ#.Űą9f—oQťB&ŹČs…ölăŞä[!rńwÉťćßÇIôšĺůĽ,‹ŹüÔ¸7‰íR|ť”š¸ŞčŤŒ(D•cť[‘§óľĚł÷źE™˝ˆŁ>?‹ňTDůî•oŽfadߗšJ#ŔÚł ˇlquɡâ|K%""ËžóӀ~LŻ%efYŕž?„ RŞM*ÖŇäŘ^mąß*ý7˙-„â;ß~šŚţâp÷é5Í5jÎżžž~érŸŸľ×ţýůŽżĺםöş8óíÂfuúţö†.đőľŸo˝FŘŕžÉwá"„á[wh{qžšTô–o‘*žŻá;?\럪KÉr͡ř ß´;.ßEŤ+WŔT?$űœ˛pÝvՑkÜđs¤S?݅ť—o=|*ĎJ‡í%nYˡĘqśă*ą×âöžËSk wˆťĄ×â|{U,ÇŞ×ŒńŠÚťWlŻË{ŞçÉŐP'—,äƒĆŠj]h؏ĹůNtţ--Žď‰ćßÄwRň˝]ßÓĚżőddYň=Éüű!“éIůŁ×Ě›ŽˆÍ­ˆ1i§Œ8L&ߋă{šßK–'ßăőń˝džS•ďÉ7ńMň˝ZžSŸOł>u|ďh|NňMóo꿊˙&ů^r˙Ś|Ołž…ä{9öâ›ř&žî7řXŢ~â›ä›ř&ž‰oâ›řN“oą>ž Řoŕ-G^ ß|Č~{ą|Çݲßŕ1›Śrjż;vş4ýËćqîőÉw 7ç¸zžŁ‡j°ß`…ú†ě7X6ß}çMŻVž{Žg^­>„{u|sÎ1QžY’ňýó1Ňç+ÔçÝë™>NK^ĎDúœô9ésĆüĂp>˝Srdвçc=/ťq.ÎÂçߡ[ú/ˇŮ[•˝Ľ{ůî>ÜëăŰž',9žűÜJů—o~ď~ƒÍ’Çç}ďnM•o’oŇçŤčż#ž‰oâ›ř&ž‰oâ;ý›5ď7 ů&ů&ž‰oâ›ř&ž‰ďgćŰ?:%žýsŔӒoň~ƒ/KŢoй٭?OŠolâNCžĽÉ7zďmI‰oî˝§‡Ćk4^#ž‰oâ›ř&ž—Ç÷Z×3ß$ßÄ7ńM|ßÄ7ńM|ß4>§ń9É7É7ńM|ßÄ7ńM|ßÄ7ńMű ˆo’oâ›ř&ž‰oâ›ř~~ž˙3wkżÁ—ŽĘ\@„Äýď0Üf].×îúúŚŻßý ńß˝ˆ íźß%ß˙­ÖćÂŰëë›tžľÜŸo÷ELRČřˆ×׿űg(îʙAýWsҤ4>bçEiç`ŁřÝ׎¤‹ˆ*ßŘ{Ćč˛ÜP}ŔÖç÷c âf„ťš’wmD‚jCR+Ü**iÎGĂŽˆî›ĎČ7°‘¸; Ří˘p8<@>?nőŻ]ń:”GqFT&ŒœůšYˆÜĂ7‡Űç˘N€;†Ěžł Ŕhů¤ĽłŽ—éđŞă7ż}î¸ŰRŽn­$†×”a˘Ý‰źAŒ<ě* â“ó͢UÎ&­“cGÄĎĂSĐRľh ź 7ŒŰ&Ç8<ţłpŤ;G:Än˝­+¨4XŹťRč:"⸕^›7×7á&܄›pnÂM¸ 7áž7ď=靸˙B$ŒBłfŻex+€k{ˇśhŘNšżžp´˙ëÉhžUş*ÚÜľžWzëńxuâPPzˇÉ:wëVÖÜWŮxĂH`N{ -*!|0tYo—Žë˝šźĽGpË˙Ę ĽlZhęu ŤÓ÷txƒ•…ť×Ÿ€žň[ű'6ß"2™—ÜZR­ąĽiF0OA鏜˝@ĂĚŞJ×Ďé’ŰjÂVéqÜʎRyXĺˇUl˛p˙V5ĐnçhžŞn KŕxwDVÁmUôťătU7ŞinôpŰŰKZyó­tU– éŞVҁŰýkXžâ|ű/œo%oäĐT ś˙(nliš(ng%T*¨7˛í\qōÜaáłŃ~¸m˙­˛*“ťjşĆSˇó8n•Ě$ň[˘Ő&Ý|űbQ)Ÿ–^3¸ĽWşŞmŠś,,]?včľZń+ZÓkŚćąŐQú¸u'ťÝӄšÇvF&yŤ3Uäé5fšąNnó5JGl—ÎÚĽwŽSńF/ú`7ǂ‹%ŕ·›ćc„›pnÂ}żžŽwÍu-áP#*ŞTy5^rSU^őßśsXîćŘŹýŻźŢŒŐ!őP˙Ypk۸i ůaŒM°š{s1ˇvęŮş8MPŸőüL|׍9̢˝&ĂA°Fýľ;ŕě5ŹW„ }] OĂ7gœyvOŻçŠĹ:XE,ęŠ'ŚŕMÚüŠ*4–< n°g­¸Ą1VuŕFĎźäOUńYqë:hřᦝ›ő<Ŕ˜×ÎyE(ú‹z &•™ŞRaŢT*űÚSáVjýŝ^Ó2ęéľzgÁ˘Ł­ą­˝Ă›ŞV!nĺĐsŽ[ć_ńN¸iœJ¸ 7á&Ü ÇýŰ)şßł?ŇÄýKŤRn’yľäIENDŽB`‚munin-2.0.25/doc/example/index.rst000066400000000000000000000004221243472346000167720ustar00rootroot00000000000000.. _example-index: ======== Examples ======== Examples of munin and related configuration are gathered here. .. toctree:: :maxdepth: 2 webserver/apache-virtualhost.rst webserver/lighttpd.rst webserver/nginx.rst graph/aggregate.rst tips/multimaster.rst munin-2.0.25/doc/example/tips/000077500000000000000000000000001243472346000161125ustar00rootroot00000000000000munin-2.0.25/doc/example/tips/multimaster.rst000066400000000000000000000135461243472346000212230ustar00rootroot00000000000000.. _example-tips-masteraggregation: ================================== multiple master data aggregation ================================== This example describes a way to have multiple master collecting different information, and show all the data in a single presentation. When you reach some size (probably several hundreds of nodes, several tousands plugins), 5 minutes is not enough for your single master to connect and gather data from all hosts, and you end up having holes in your graph. Requirements ============ This example requires a shared nfs space for the munin data between the nodes. Before going that road, you should make sure to check other options first, like changing the number of update threads, and having rrdcached. An other option you might consider, is using munin-async. It requires modifications on all nodes, so it might not be an option, but I felt compeled to mention it. If you can't easily have shared nfs, or if you might have connectivity issues between master and some node, async would probably be a better approach. Because there is some rrd path merge required, it is highly recommended to have **all** nodes in groups. Overview ======== Munin-Master runs differents scripts via the cron script (munin-cron). ``munin-update`` is the only part actualy connecting to the nodes. It gathers information and updates the rrd (you'll probably need rrdcached, especialy via nfs). ``munin-limits`` checks what was collected, compared to the limits and places warning and criticals. ``munin-html`` takes the informations gathered by update and limits, and generate the actual html files (if don't have cgi-html). It currently still generate some data needed by the cgi. ``munin-graph`` generate the graphs. If you are thinking about getting many masters, you probably have alot of graph, and don't want to generate them every 5 minutes, but you would rather use cgi-graph. The trick about having multiple master running to update is : - run ``munin-update`` on different masters (called update-masters there after), having ``dbdir`` on nfs - run ``munin-limits`` on either each of the update-masters, or the html-master (see next line) - run ``munin-html`` on a single master (html-master), after merging some data generated by the update processes - have graph (cgi) and html (from file or cgi) served by either html-master, or specific presentation hosts. Of course, all hosts must have access to the shared nfs directory. Exemples will consider the shared folder /nfs/munin. Running munin-update ==================== Cange the ``munin-cron`` to only run ``munin-update`` (and ``munin-limits``, if you have alerts you want to be managed directly on those masters). The cron should NOT launch munin-html or munin-graph. Change your ``munin.conf`` to use a dbdir within the shared nfs, (ie: ``/nfs/munin/db/``). To make it easier to see the configuration, you can also update the configuration with an ``includedir`` on nfs, and declare all your nodes there (ie: ``/nfs/munin/etc/.d/``). If you configured at least one node, you should have ``/nfs/munin/db/`` that starts getting populated with subdirectories (groups), and a few files, including ``datafile``, and ``datafile.storable`` (and ``limits`` if you also have munin-limits running here). Merging data ============ All our update-masters generate update their dbdir including: - ``datafile`` and ``datafile.storable`` which contain information about the collected plugins, and graphs to generate. - directory tree with the rrd files In order to have munin-html to run correctly, we need to merge those dbdir into one. Merging files ------------- ``datafile`` is just plain text with lines of ``key value``, so concatenating all the files is enough. ``datafile.storable`` is a binary representation of the data as loaded by munin. It requires some munin internal structures knowledge to merge them. If you have ``munin-limits`` also running on update-masters, it generate a ``limits`` files, those are also plain text. In order to make that part easier, a ``munin-mergedb.pl`` is provided in contrib. Merging rrd tree ---------------- The main trick is about rrd. As we are using a shared nfs, we can use symlinks to get them to point to one an other, and not have to duplicate them. (Would be hell to keep in sync, that's why we really need shared nfs storage.) As we deal with groups, we could just link top level groups to a common rrd tree. Exemple, if you have two updaters (update1 and update2), and 4 groups (customer1, customer2, customer3, customer4), you could make something like that:: /nfs/munin/db/shared-rrd/customer1/ /nfs/munin/db/shared-rrd/customer2/ /nfs/munin/db/shared-rrd/customer3/ /nfs/munin/db/shared-rrd/customer4/ /nfs/munin/db/update1/customer1 -> ../shared-rrd/customer1 /nfs/munin/db/update1/customer2 -> ../shared-rrd/customer2 /nfs/munin/db/update1/customer3 -> ../shared-rrd/customer3 /nfs/munin/db/update1/customer4 -> ../shared-rrd/customer4 /nfs/munin/db/update2/customer1 -> ../shared-rrd/customer1 /nfs/munin/db/update2/customer2 -> ../shared-rrd/customer2 /nfs/munin/db/update2/customer3 -> ../shared-rrd/customer3 /nfs/munin/db/update2/customer4 -> ../shared-rrd/customer4 /nfs/munin/db/html/customer1 -> ../shared-rrd/customer1 /nfs/munin/db/html/customer2 -> ../shared-rrd/customer2 /nfs/munin/db/html/customer3 -> ../shared-rrd/customer3 /nfs/munin/db/html/customer4 -> ../shared-rrd/customer4 At some point, an option to get the rrd tree separated from the dbdir, and should avoid the need of such links. Running munin-html ================== Once you have your update-masters running, and a merge ready to go, you should place a cron on a html-master to : - merge data as requested - launch ``munin-limits``, if not launched on update-masters and merged - launch ``munin-html`` (required, even if you use cgi) - launch ``munin-graph`` unless you use cgi-graph munin-2.0.25/doc/example/webserver/000077500000000000000000000000001243472346000171375ustar00rootroot00000000000000munin-2.0.25/doc/example/webserver/apache-virtualhost.rst000066400000000000000000000032751243472346000235030ustar00rootroot00000000000000.. _example-webserver-apache: ================================== Apache virtualhost configuration ================================== This example describes how to set up munin on a separate apache httpd virtual host. It uses FastCGI if this is available, and falls back to CGI if it is not. Munin configuration =================== This example assumes the following configuration in /etc/munin/munin.conf .. index:: pair: example; munin.conf :: graph_strategy cgi html_strategy cgi Virtualhost configuration ========================= Add a new virtualhost, using the following example: .. index:: pair: example; apache httpd configuration :: ServerName munin.example.org ServerAlias munin ServerAdmin info@example.org DocumentRoot /srv/www/munin.example.org ErrorLog /var/log/apache2/munin.example.org-error.log CustomLog /var/log/apache2/munin.example.org-access.log combined # Rewrites RewriteEngine On # Static content in /static RewriteRule ^/favicon.ico /etc/munin/static/favicon.ico [L] RewriteRule ^/static/(.*) /etc/munin/static/$1 [L] # HTML RewriteCond %{REQUEST_URI} .html$ [or] RewriteCond %{REQUEST_URI} =/ RewriteRule ^/(.*) /usr/lib/munin/cgi/munin-cgi-html/$1 [L] # Images RewriteRule ^/(.*) /usr/lib/munin/cgi/munin-cgi-graph/$1 [L] # Ensure we can run (fast)cgi scripts Options +ExecCGI SetHandler fcgid-script SetHandler cgi-script munin-2.0.25/doc/example/webserver/lighttpd.rst000066400000000000000000000032321243472346000215100ustar00rootroot00000000000000.. _example-webserver-lighttpd: ======================== lighttpd configuration ======================== This example describes how to set up munin on lighttpd. It spawns two lighttpd processes, one for the graph rendering, and one for the html generation. You need to enable the "mod_rewrite" module in the main lighttpd configuration. Munin configuration =================== This example assumes the following configuration in /etc/munin/munin.conf .. index:: pair: example; munin.conf :: # graph_strategy should be commented out, if present html_strategy cgi Webserver configuration ======================= .. index:: pair: example; lighttpd configuration :: alias.url += ( "/munin-static" => "/etc/munin/static" ) alias.url += ( "/munin" => "/var/cache/munin/www/" ) fastcgi.server += ("/munin/cgi/munin-cgi-graph" => (( "socket" => "/var/run/lighttpd/munin-cgi-graph.sock", "bin-path" => "/usr/lib/munin/cgi/munin-cgi-graph", "check-local" => "disable", )), "/munin-cgi/munin-cgi-html" => (( "socket" => "/var/run/lighttpd/munin-cgi-html.sock", "bin-path" => "/usr/lib/munin/cgi/munin-cgi-html", "check-local" => "disable", )) ) url.rewrite-repeat += ( "/munin/(.*)" => "/munin-cgi/munin-cgi-html/$1", "/munin-cgi/munin-cgi-html$" => "/munin-cgi/munin-cgi-html/", "/munin-cgi/munin-cgi-html/static/(.*)" => "/munin-static/$1" ) munin-2.0.25/doc/example/webserver/nginx.rst000066400000000000000000000116231243472346000210170ustar00rootroot00000000000000.. _example-webserver-nginx: ===================== nginx configuration ===================== This example describes how to set up munin on nginx. nginx does not spawn FastCGI processes by itself, but comes with an external "spawn-fcgi" program. We need one process for the graph rendering, and one for the html generation. Munin configuration =================== This example assumes the following configuration in /etc/munin/munin.conf .. index:: pair: example; munin.conf :: # graph_strategy should be commented out, if present html_strategy cgi FastCGI configuration ===================== This will spawn two FastCGI processes trees. One for munin cgi graphing and one for HTML generation. It will create a socket owned by www-data, and run the processes as the "munin" user. .. index:: pair: example; munin-cgi-graph invocation .. code-block:: bash spawn-fcgi -s /var/run/munin/fastcgi-graph.sock -U www-data \ -u munin -g munin /usr/lib/munin/cgi/munin-cgi-graph spawn-fcgi -s /var/run/munin/fastcgi-html.sock -U www-data \ -u munin -g munin /usr/lib/munin/cgi/munin-html-graph Note: Depending on your installation method, the "munin-\*-graph" programs may be in another directory. Check Makefile.config if you installed from source, or your package manager if you used that to install. Note: If you installed using the package manager on Debian or Ubuntu, the /var/log/munin/munin-cgi-\*.log files may be owned by the "www-data" user. This example runs the processes as the "munin" user, so you need to chown the log files, and edit /etc/logrotate.d/munin. Webserver configuration ======================= .. index:: pair: example; nginx configuration :: location ^~ /munin-cgi/munin-cgi-graph/ { fastcgi_split_path_info ^(/munin-cgi/munin-cgi-graph)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fastcgi-graph.sock; include fastcgi_params; } location /munin/static/ { alias /etc/munin/static/; } location /munin/ { fastcgi_split_path_info ^(/munin)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fastcgi-html.sock; include fastcgi_params; } Authentication and group access =============================== .. index:: pair: example; nginx authentication group configuration If you have munin statistics, and need to allow some user (ie: customers) to access only graphs for a subset of nodes, the easiest way might be to use groups, and authentication with the exact same name as the node-group name. Here is an example of how to redirect the users to the group that matches their name, and prevent any access to other groups. It also has allow an admin user to see it all. Warning: If you don't want users to get any information about the other group names, you should also change the templates accordingly, and remove any navigation part that might. :: # Here, the whole vhost has auth requirements. # You can duplicate it to the graph and html locations if you have # something else that doesn't need auth. auth_basic "Restricted stats"; auth_basic_user_file /some/path/to/.htpasswd; location ^~ /cgi-bin/munin-cgi-graph/ { # not authenticated => no rewrite (back to auth) if ($remote_user ~ ^$) { break; } # is on the right subtree ? set $ok "no"; # admin can see it all if ($remote_user = 'admin') { set $ok "yes"; } # only allow given path if ($uri ~ /cgi-bin/munin-cgi-graph/([^/]*)) { set $path $1; } if ($path = $remote_user) { set $ok "yes"; } # not allowed here ? redirect them where they should land if ($ok != "yes") { # redirect to where they should be rewrite / /cgi-bin/munin-cgi-graph/$remote_user/ redirect; } fastcgi_split_path_info ^(/cgi-bin/munin-cgi-graph)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fastcgi-graph.sock; include fastcgi_params; } location /munin/static/ { alias /etc/munin/static/; } location /munin/ { # not authenticated => no rewrite (back to auth) if ($remote_user ~ ^$) { break; } # is on the right subtree ? set $ok "no"; # admin can see it all if ($remote_user = 'admin') { set $ok "yes"; } # only allow given path if ($uri ~ /munin/([^/]*)) { set $path $1; } if ($path = $remote_user) { set $ok "yes"; } # not allowed here ? redirect them where they should land if ($ok != "yes") { # redirect to where they should be rewrite / /munin/$remote_user/ redirect; } fastcgi_split_path_info ^(/munin)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fastcgi-html.sock; include fastcgi_params; } munin-2.0.25/doc/index.rst000066400000000000000000000005241243472346000153420ustar00rootroot00000000000000 Welcome to Munin's documentation! ================================= Contents: .. toctree:: :maxdepth: 2 installation/index.rst master/index.rst node/index.rst plugin/index.rst documentation/index.rst reference/index.rst example/index.rst Indices and tables ================== * :ref:`genindex` * :ref:`search` munin-2.0.25/doc/installation/000077500000000000000000000000001243472346000162015ustar00rootroot00000000000000munin-2.0.25/doc/installation/configuration.rst000066400000000000000000000040141243472346000216010ustar00rootroot00000000000000======================= Initial configuration ======================= Node ==== Plugins ------- Decide which plugins to use. The munin node runs all plugins present in CONFDIR/plugins/ The quick auto-plug-and-play solution: .. code-block:: bash munin-node-configure --shell --families=contrib,auto | sh -x Access ------ The munin node listens on all interfaces by default, but has a restrictive access list. You need to add your master's IP address. The "cidr_allow", "cidr_deny", "allow" and "deny" statements are used. cidr_allow uses the following syntax (the /32 is not implicit, so for a single host, you need to add it): | cidr_allow 127.0.0.0/8 | cidr_allow 192.0.2.1/32 allow uses regular expression matching against the client IP address. | allow '^127\.' | allow '^192\.0\.2\.1$' For specific information about the syntax, see `Net::Server `_. Please keep in mind that cidr_allow is a recent addition, and may not be available on all systems. Startup ------- Start the node agent (as root) SBINDIR/munin-node. Restart it it it was already started. The node only discovers new plugins when it is restarted. You probably want to use an init-script instead and you might find a good one under build/dists or in the build/resources directory (maybe you need to edit the init script, check the given paths in the script you might use). Master ====== Add some nodes -------------- Add some nodes to CONFDIR/munin.conf [node.example.com] address 192.0.2.4 [node2.example.com] address node2.example.com [node3.example.com] address 2001:db8::de:caf:bad Configure web server ==================== On the master, you need to configure a web server. If you have installed "munin" through distribution packages, a webserver may have been configured for you already. If you installed from source, there is a minimal configuration example in the "resources" directory in the source tarball. For a more complex example, see :ref:`example-webserver-apache` munin-2.0.25/doc/installation/help.rst000066400000000000000000000015211243472346000176620ustar00rootroot00000000000000============== Getting help ============== IRC Channel =========== The most immediate way to get hold of us is to join our IRC channel: ``#munin on server irc.oftc.net`` The main timezone of the channel is Europe+America. If you can explain your problem in a few clear sentences, without too much copy&paste, IRC is a good way to try to get help. If you do need to paste log files, configuration snippets, scripts and so on, please use a pastebin_. If the channel is all quiet, try again some time later, we do have lives, families and jobs to deal with also. You are more than welcome to just hang out, and while we don't mind the occational intrusion of the real world into the flow, keep it mostly on topic, and dont paste random links unless they are *really* spectacular and intelligent. .. _pastebin: https://gist.github.com/ munin-2.0.25/doc/installation/index.rst000066400000000000000000000004531243472346000200440ustar00rootroot00000000000000.. _install-index: ==================== Munin installation ==================== This document explains how to get Munin onto your system, where to get help, and how to report bugs. .. toctree:: :maxdepth: 2 prerequisites.rst install.rst configuration.rst help.rst upgrade.rst munin-2.0.25/doc/installation/install.rst000066400000000000000000000105241243472346000204030ustar00rootroot00000000000000================== Installing Munin ================== With open source software, you can choose to install binary packages or install from source-code. To install a package or install from source is a matter of personal taste. If you don't know which method too choose read the whole document and choose the method you are most comfortable with. Master and node =============== Munin is split into two distinct roles. Node ---- The "munin node" is a daemon which runs on all servers being monitored. Master ------ The "munin master" connects to all munin nodes, collects data, and stores it in `RRD `_ You will need to install "munin-master" on the server which will collect data from all nodes, and graph the results. When starting with munin, it should be enough to install the munin master on one server. On the munin master, you will need a web server capable of running CGI or FastCGI. Apache HTTD should be suitable. Also reported to be working is nginx and lighttpd. Source or packages? =================== Installing Munin on most relevant operating systems can usually be done with with the systems package manager, typical examples being: FreeBSD ------- From source: .. code-block:: bash cd /usr/ports/sysutils/munin-master && make install clean cd /usr/ports/sysutils/munin-node && make install clean Binary packages: .. code-block:: bash pkg_add -r munin-master pkg_add -r munin-node Debian/Ubuntu ------------- Munin is distributed with both Debian and Ubuntu. In order to get Munin up and running type .. code-block:: bash sudo apt-get install munin-node on all nodes, and .. code-block:: bash sudo apt-get install munin on the master. Please note that this might not be the latest version of Munin. On Debian you have the option of enabling "backports", which may give access to later versions of Munin. RedHat / CentOS / Fedora ------------------------ At time of writing, only the 1.x version of munin is available in `EPEL `_. If you want 2.x, your best option is probably to install from source. Other systems ------------- On other systems, you are probably best off compiling your own code. See `Installing Munin from source`_. Installing Munin from source ============================ If there are no binary packages available for your system, or if you want to install Munin from source for other reasons, follow these steps: We recommend downloading a release tarball, which you can find on `sourceforge.net `_. Alternatively, if you want to hack on Munin, you should clone our git repository by doing. .. code-block:: bash git clone git://github.com/munin-monitoring/munin Please note that a git checkout will need some more build-dependencies than listed below, in particular the Python Docutils and Sphinx. Build dependencies on Debian / Ubuntu ------------------------------------- In order to build Munin from source you need a number of packages installed. On a Debian or Ubuntu system these are: * perl * htmldoc * html2text * default-jdk Configuring and installing -------------------------- Warning for NFS users ~~~~~~~~~~~~~~~~~~~~~ If you're using NFS please note that the "make install" process is slightly problematic in that it (Module::Build actually) writes files under $CWD. Since "make install" is usually run by root and root usually cannot write files on a NFS volume, this will fail. If you use NFS please install munin from /var/tmp, /tmp or some such to work around this. Running make ~~~~~~~~~~~~ There are make targets for node, master, documentation and man files. Generally you want to install everything on the master, and just the node and plugiuns on the nodes. - Edit Makefile.config to suit your needs. - Create the user "munin" with the primary group "munin". The user needs no shell and no privileges. On most Linux systems the munin user's shell is the nologin shell (it has different paths on different systems - but the user still needs to be able to run cron jobs. Node ~~~~ For the node, you need only the common parts, the node and the plugins. .. code-block:: bash make make install-common-prime install-node-prime install-plugins-prime Master ~~~~~~ For the master, this will install everything. .. code-block:: bash make make install munin-2.0.25/doc/installation/prerequisites.rst000066400000000000000000000025261243472346000216440ustar00rootroot00000000000000=============== Prerequisites =============== In order for you to install Munin you must have the following: Building munin ============== In order to build munin, you need: * GNU Make — Please do not attempt to use any other make. * A reasonable Perl 5 (Version 5.8 or newer) * Perl modules: Module::Build Developers / packagers need * Test::MockModule * Test::MockObject * Test::Pod::Coverage * Test::Perl::Critic 1.096 or later * Test::Exception * Directory::Scratch (err, wherefrom?) In order to build the documentation, you need: * sphinx Running munin ============= In order to run munin, you need: * A reasonable perl 5 (Version 5.8 or newer) The munin node needs: * Perl modules * Net::Server * Net::Server::Fork * Time::HiRes * Net::SNMP (Optional, if you want to use SNMP plugins) * Java JRE (Optional, if you want to use java plugins) * Anything the separate plugins may need. These have diverse requirements, not documented here. The munin master needs * Perl modules: * CGI::Fast * Digest::MD5, * File\::Copy::Recursive * Getopt::Long * HTML::Template * IO::Socket::INET6 * Log::Log4perl 1.18 or later * Net::SSLeay (Optional, if you want to use SSL/TLS) * Params::Validate * Storable * Text::Balanced * Time::HiRes * TimeDate * A web server capable of CGI or FastCGI munin-2.0.25/doc/installation/upgrade.rst000066400000000000000000000006441243472346000203660ustar00rootroot00000000000000================================= Upgrading Munin from 1.x to 2.x ================================= This is a compilation of items you need to pay attention to when upgrading from Munin 1.x to munin 2.x FastCGI ======= Munin graphing is now done with FastCGI. Munin HTML generation is optionally done with FastCGI. Logging ======= The web server needs write access to the munin-cgi-html and munin-cgi-graph logs. munin-2.0.25/doc/master/000077500000000000000000000000001243472346000147735ustar00rootroot00000000000000munin-2.0.25/doc/master/index.rst000066400000000000000000000033131243472346000166340ustar00rootroot00000000000000.. _master-index: ================== The Munin master ================== Role ==== The munin master is responsible for gathering data from munin nodes. It stores this data in RRD, and graphs them on request. Components ========== The following components are part of munin-master: .. hlist:: * :ref:`munin-cron` runs :ref:`munin-graph`, :ref:`munin-html`, :ref:`munin-limits` and :ref:`munin-update`. * :ref:`munin-update` is run by :ref:`munin-cron`. It is the munin data collector, and it fetches data from :ref:`munin nodes `, which is then stored in RRD files. * :ref:`munin-graph` is run by :ref:`munin-cron`. It generates graphs in PNG format from the RRD files. See also :ref:`munin-cgi-graph`. * :ref:`munin-limits` is run by :ref:`munin-cron`. It notifies any configured contacts if a value moves between "ok", "warn" or "crit". Munin is commonly used in combination with Nagios, which is then configured as a contact. * :ref:`munin-html` is run by :ref:`munin-cron`. It generates HTML pages. See also :ref:`munin-cgi-html`. * :ref:`munin-cgi-graph` is run by a web server. If graph_strategy is set to "cgi", munin-cron will not run munin-graph, and assumes that the web server runs :ref:`munin-cgi-graph` instead. * :ref:`munin-cgi-html` is run by a web server. If html_strategy is set to "cgi", munin-cron will not run munin-html, and assumes that the web server runs :ref:`munin-cgi-html` instead. Configuration ============= The munin master has its primary configuration file at :ref:`/etc/munin/munin.conf `. Other documentation =================== .. toctree:: :maxdepth: 2 rrdcached.rst munin-2.0.25/doc/master/rrdcached.rst000066400000000000000000000070101243472346000174420ustar00rootroot00000000000000.. _munin-master-rrdcached: ========================================= Scaling the munin master with rrdcached ========================================= When the master grows big, and has a lot of nodes, there is a risk of disk IO becoming a bottleneck. To reduce this disk IO, you can use the RRD Cache Daemon. This will spool RRD changes in a queue, and flush changes on demand, and periodically. This will replace lots of random writes with a much smaller amount of sequential writes. Configuring rrdcached ===================== Parameters ---------- RRDCached writes the spool data every 5 mintes by default. This is the same as the munin master. To have an effect, change the flushing intervals to allow more data to be spooled. Use the following parameters, and tune to your liking: +---------+-----------------------------------------------------+ | -w 1800 | Wait 30 minutes before writing data | +---------+-----------------------------------------------------+ | -z 1800 | Delay writes by a random factor of up to 30 minutes | | | (this should be equal to, or lower than, "-w") | +---------+-----------------------------------------------------+ | -f 3600 | Flush all data every hour | +---------+-----------------------------------------------------+ Example ------- Create a directory for the rrdcached journal, and have the "munin" user own it. (in this example: /var/lib/munin/rrdcached-journal). Set up a separate RRDCached instance, run by the munin user. The following command starts an RRDCached instance, and can be added to /etc/rc.local. .. code-block:: bash sudo -u munin /usr/bin/rrdcached \ -p /run/munin/rrdcached.pid \ -B -b /var/lib/munin/ \ -F -j /var/lib/munin/rrdcached-journal/ \ -m 0660 -l unix:/run/munin/rrdcached.sock \ -w 1800 -z 1800 -f 3600 Note: While testing, add "-g" to the command line to prevent rrdcached from forking into the background. The munin grapher also needs write access to this socket, in order for it to tell the RRDCached to flush data needed for graphing. If you run munin with CGI graphing, you will need to give the web server access. For a common setup, run the following command, as root, after starting rrdcached: .. code-block:: bash chgrp www-data /run/munin/rrdcached.sock Recommended: If you have systemd installed, use a systemd service. If you have upstart installed, write a daemon job configuration file. If you use systemd, you can add "-g" to the rrdcached command line. Configuring munin to use rrdcached =================================== To enable rrdcached on the munin master, you will need to set the "rrdcached_socket" line in /etc/munin/munin.conf :: rrdcached_socket /run/munin/rrdcached.sock Is it working? ============== If all goes well, you should see the following: Munin logging ------------- There should be no messages regarding rrdcached in /var/log/munin/munin-update.log. On failure to connect, there will be log lines like: :: 2012/06/26 18:56:12 [WARN] RRDCached feature ignored: rrdcached socket not writable …and you should then check for permissions problems. RRDCached spool --------------- The rrdcached spool file should be in /var/lib/munin/rrdcached-journal/, and it should grow for each run of munin-update until it hits the flush time. The file looks like: :: /var/lib/munin/rrdcached-journal/rrd.journal.1340869388.141124 For a munin master with 200 nodes, this could well grow to 100MiB, depending on the number of plugins, and the spool file time parameters. munin-2.0.25/doc/node/000077500000000000000000000000001243472346000144255ustar00rootroot00000000000000munin-2.0.25/doc/node/async.rst000066400000000000000000000047551243472346000163070ustar00rootroot00000000000000.. _node-async: ========================= Asynchronous proxy node ========================= The munin asynchronous proxy node (or "munin-async") connects to the local node periodically, and spools the results. When the munin master connects, all the data is available instantly. munin-asyncd ============ The Munin async daemon starts at boot, and connects to the local munin-node periodically, like a :ref:`munin master ` would. The results are stored the results in a spool, tagged with timestamp. You can also use munin-asyncd to connect to several munin nodes. You will need to use one spooldir for each node you connect to. This enables you to set up a "fanout" setup, with one privileged node per site, and site-to-site communication being protected by ssh. munin-async =========== The Munin async client is invoked by the connecting master, and reads from the munin-async spool using the "spoolfetch" command. Example configuration ===================== On the munin master ------------------- We use ssh encapsulated connections with munin async. In the :ref:`the munin master ` configuration you need to configure a host with a "ssh\://" address. :: [random.example.org] address ssh://munin-async@random.example.org You will need to create an SSH key for the "munin" user, and distribute this to all nodes running munin-asyncd. On the munin node ----------------- Configure your munin node to only listen on "127.0.0.1". You will also need to add the public key of the munin user to the authorized_keys file for this user. * You must add a "command=" parameter to the key to run the command specified instead of whatever command the connecting user tries to use. :: command="/usr/share/munin/munin-async --spoolfetch" ssh-rsa AAAA[...] munin@master The following options are recommended for security, but are strictly not necessary for the munin-async connection to work * You should add a "from=" parameter to the key to restrict where it can be used from. * You should add hardening options. At the time of writing, these are "no-X11-forwarding", "no-agent-forwarding", "no-port-forwarding", "no-pty" and "no-user-rc". Some of these may also be set globally in /etc/ssh/sshd_config. :: no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,from="192.0.2.0/24",command="/usr/share/munin/munin-async --spoolfetch" ssh-rsa AAAA[...] munin@master See the sshd_config (5) and authorized_keys(5) man pages for more information. munin-2.0.25/doc/node/index.rst000066400000000000000000000010601243472346000162630ustar00rootroot00000000000000.. _node-index: ================ The Munin node ================ Role ==== The munin node is installed on all monitored servers. It accepts connections from the munin master, and runs plugins on demand. By default, it is started at boot time, listens on port 4949/TCP, accepts connections from the :ref:`munin master `, and runs :ref:`munin plugins ` on demand. Configuration ============= The configuration file is :ref:`munin-node.conf`. Other documentation =================== .. toctree:: :maxdepth: 2 async.rst munin-2.0.25/doc/plugin/000077500000000000000000000000001243472346000147765ustar00rootroot00000000000000munin-2.0.25/doc/plugin/index.rst000066400000000000000000000006431243472346000166420ustar00rootroot00000000000000.. _plugin-index: ================== The Munin plugin ================== Role ==== The munin plugin is a simple executable, which role is to gather one set of facts about the local server. The plugin is called with the argument "config" to get metadata, and with no arguments to get the values. Other documentation =================== .. toctree:: :maxdepth: 2 use.rst writing.rst supersampling.rst munin-2.0.25/doc/plugin/supersampling.rst000066400000000000000000000072761243472346000204350ustar00rootroot00000000000000.. _plugin-supersampling: =============== Supersampling =============== Every monitoring software has a polling rate. It is usually 5 min, because it's the sweet spot that enables frequent updates yet still having a low overhead. Munin is not different in that respect: it's data fetching routines have to be launched every 5 min, otherwise you'll face data loss. And this 5 min period is deeply grained in the code. So changing it is possible, but very tedious and error prone. But sometimes we need a very fine sampling rate. Every 10 seconds enables us to track fast changing metrics that would be averaged out otherwise. Changing the whole polling process to cope with a 10s period is very hard on hardware, since now every update has to finish in these 10 seconds. This triggered an extension in the plugin protocol, commonly known as "supersampling". Overview ======== The basic idea is that fine precision should only be for selected plugins only. It also cannot be triggered from the master, since the overhead would be way too big. So, we just let the plugin sample itself the values at a rate it feels adequate. Then each polling round, the master fetches all the samples since last poll. This enables various constructions, mostly around "streaming" plugins to achieve highly detailed sampling with a very small overhead. Notes ----- This protocol is currently completely transparent to :ref:`munin-node `, and therefore it means that it can be used even on older (1.x) nodes. Only a 2.0 :ref:`master ` is required. Protocol details ================ The protocol itself is derived from the :ref:`spoolfetch` extension. Config ------ A new plugin directive is used, :ref:`update_rate`. It enables the master to create the rrd with an adequate step. Omitting it would lead to rrd averaging the supersampled values onto the default 5 min rate. This means **data loss**. .. note:: Heartbeat The heartbeat has always a 2 step size, so failure to send all the samples will result with unknown values, as expected. .. note:: Data size The RRD file size is always the same in the default config, as all the RRA are configured proportionally to the :ref:`update_rate`. This means that, since you'll keep as much data as with the default, you keep it for a shorter time. Fetch ----- When spoolfetching, the epoch is also sent in front of the value. Supersampling is then just a matter of sending multiple epoch/value lines, with monotonically increasing epoch. .. note:: Note that since the epoch is an integer value for rrdtool_, the smallest granularity is 1 second. For the time being, the protocol itself does also mandates integers. We can easily imagine that with another database as backend, an extension could be hacked together. .. _rrdtool: http://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html Compatibility with 1.4 ====================== On older 1.4 masters, only the last sampled value gets into the RRD. Sample implementation ===================== The canonical sample implementation is multicpu1sec_, a contrib plugin on github. It is also a so-called streaming plugin. .. _multicpu1sec: https://github.com/munin-monitoring/contrib/tree/master/plugins/system/multicpu1sec Streaming plugins ================= These plugins fork a background process when called that streams a system tool into a spool file. In multicpu1sec_, it is the mpstat_ tool with a period of 1 second. .. _mpstat: https://en.wikipedia.org/wiki/Mpstat Undersampling ============= Some plugins are on the opposite side of the spectrum, as they only need a lower precision. It makes sense when : * data should be kept for a *very* long time * data is *very* expensive to generate and it varies only slowly. munin-2.0.25/doc/plugin/use.rst000066400000000000000000000032171243472346000163270ustar00rootroot00000000000000.. _plugin-use: ===================== Using munin plugins ===================== .. index:: pair: plugin; installing Installing ========== The default plugin directory is /etc/munin/plugins/. To install a plugin, place it in the plugin directory, and make it executable. You can also place the plugin elsewhere, and install a symbolic link in the plugin directory. All the plugins provided with munin are installed in this way. .. index:: pair: plugin; configuration Configuring =========== The plugin configuration directory is /etc/munin/plugin-conf.d/. The syntax is: user The user the plugin will run as. Default: munin group The group the plugin will run as Default: munin env.variablename Defines and exports an environment variable called "variablename" with the content set to . There is no need to quote the variable content. .. note:: When configuring a munin plugin, add the least amount of extra privileges needed to run the plugin. For instance, do not run a plugin with "user root" to read syslogs, when it may be sufficient to set "group adm" instead. Example: .. index:: triple: example; plugin; configuration :: [pluginname] user username group groupname env.variablename some content for the variable env.critical 92 env.warning 95 Plugin configuration is optional. .. index:: pair: plugin; testing Testing ======= To test if the plugin works when executed by munin, you can use the :ref:`munin-run` command. .. code-block:: bash # munin-run myplugin config # munin-run myplugin munin-2.0.25/doc/plugin/writing.rst000066400000000000000000000056461243472346000172260ustar00rootroot00000000000000.. _plugin-writing: ======================== Writing a munin plugin ======================== A munin plugin is a small executable. Usually, it is written in some interpreted language. In its simplest form, when the plugin is executed with the argument "config", it outputs metadata needed for generating the graph. If it is called with no arguments, it outputs the data which is to be collected, and graphed later. Plugin output ============= The minimum plugin output when called with "config" it must output the graph title. It should also output a label for at least one datasource. :: graph_title Some title for our plugin something.label Foobar per second When the plugin is executed with no arguments, it should output a value for the datasource labelled in "config". It must not output values for which there are no matching labels in the configuration output. :: something.value 42 For a complete description of the available fields, see the :ref:`plugin-reference`. Example shell plugin ==================== The base of a plugin is a small option parser, ensuring the plugin is called with the correct argument, if any. Two main functions are defined: One for printing the configuration to the standard output, and one for printing the data. In addition, we have defined a function to generate the data itself, just to keep the plugin readable. The "output_usage" function is there just to be polite, it serves no other function. :) .. code-block:: bash #!/bin/sh output_config() { echo "graph_title Example graph" echo "plugins.label Number of plugins" } output_values() { printf "plugins.value %d\n" $(number_of_plugins) } number_of_plugins() { find /etc/munin/plugins -type l | wc -l } output_usage() { printf >&2 "%s - munin plugin to graph an example value\n" ${0##*/} printf >&2 "Usage: %s [config]\n" ${0##*/} } case $# in 0) output_values ;; 1) case $1 in config) output_config ;; *) output_usage exit 1 ;; esac ;; *) output_usage exit 1 ;; esac Activating the plugin ===================== Place the plugin in the /etc/munin/plugins/ directory, and make it executable. Then, restart the munin-node. Debugging the plugin ==================== To see how the plugin works, as the munin node would run it, you can use the command "munin-run". If the plugin is called "example", you can run "munin-run example config" to see the plugin configuration, and "munin-run example" to see the data. If you do not get the output you expect, check if your munin plugin needs more privileges. Normally, it is run as the "munin" user, but gathering some data may need more access. If the munin plugin emits errors, they will be visible in /var/log/munin/munin-node.log munin-2.0.25/doc/reference/000077500000000000000000000000001243472346000154365ustar00rootroot00000000000000munin-2.0.25/doc/reference/directories.rst000066400000000000000000000013151243472346000205040ustar00rootroot00000000000000.. _reference-directories: ============= Directories ============= .. _dbdir: dbdir ===== This directory is used to store the munin master database. It contains one subdirectory with RRD files per group of hosts, as well as other variable state the munin master would need. .. _plugindir: plugindir ========= This directory contains all the plugins the :ref:`munin node ` should run. .. _pluginconfdir: pluginconfdir ============= This directory contains plugin configuration. .. _rundir: rundir ====== This directory contains files needed to track the munin run state. PID files, lock files, and possibly sockets. .. _logdir: logdir ====== Contains the log files for each munin progam. munin-2.0.25/doc/reference/index.rst000066400000000000000000000010601243472346000172740ustar00rootroot00000000000000.. _reference-index: =========== Reference =========== This section contains man pages and other reference material Man pages ========= .. toctree:: :maxdepth: 1 munin-async.rst munin-asyncd.rst munin-cgi-graph.rst munin-cgi-html.rst munin-check.rst munin-cron.rst munin-graph.rst munin-html.rst munin-limits.rst munin-node.rst munin-run.rst munin-update.rst munin.conf.rst munin-node.conf.rst Other reference material ======================== .. toctree:: :maxdepth: 1 directories.rst plugin.rst munin-2.0.25/doc/reference/munin-async.rst000066400000000000000000000027611243472346000204370ustar00rootroot00000000000000.. _munin-async: .. program:: munin-async ============= munin-async ============= DESCRIPTION =========== The munin async clients reads from a spool directory written by :ref:`munin-asyncd`. It can optionally request a cleanup of this directory. OPTIONS ======= .. option:: --spooldir | -s Directory for spooled data [/var/lib/munin/spool] .. option:: --hostname Overrides the hostname [The local hostname] This is used to override the hostname used in the greeting banner. This is used when using munin-async from the munin master, and the data fetched is from another node. .. option:: --cleanup Clean up the spooldir after interactive session completes .. option:: --cleanupandexit Clean up the spooldir and exit (non-interactive) .. option:: --spoolfetch Enables the "spool" capability [no] .. option:: --vectorfetch Enables the "vectorized" fetching capability [no] Note that without this flag, the "fetch" command is disabled. .. option:: --verbose | -v Be verbose .. option:: --help | -h View this message EXAMPLES ======== .. code-block:: bash munin-async --spoolfetch This starts an interactive munin node session, enabling the "spoolfetch" command. This does not connect to the local munin node. Everything happens within munin-async, which reads from the spool directory instead of connecting to the node. SEE ALSO ======== See also :ref:`node-async` for more information and examples of how to configure munin-async. munin-2.0.25/doc/reference/munin-asyncd.rst000066400000000000000000000020341243472346000205740ustar00rootroot00000000000000.. _munin-asyncd: .. program:: munin-asyncd ============== munin-asyncd ============== DESCRIPTION =========== The munin async daemon connects to a :ref:`munin node ` periodically, and requests plugin configuration and data. This is stored in a spool directory, which is read by :ref:`munin-async`. OPTIONS ======= .. option:: --spool | -s Directory for spooled data [/var/lib/munin/spool] .. option:: --host Connect a munin node running on this host name and port [localhost:4949] .. option:: --interval Set default interval size [86400 (one day)] .. option:: --retain Number of interval files to retai [7] .. option:: --nocleanup Disable automated spool dir cleanup .. option:: --fork Fork one thread per plugin available on the node. [no forking] .. option:: --verbose | -v Be verbose .. option:: --help | -h View this message SEE ALSO ======== See also :ref:`node-async` for more information and examples of how to configure munin-asyncd. munin-2.0.25/doc/reference/munin-cgi-graph.rst000066400000000000000000000050631243472346000211610ustar00rootroot00000000000000.. _munin-cgi-graph: .. program:: munin-cgi-graph ================= munin-cgi-graph ================= DESCRIPTION =========== The munin-cgi-graph program is intended to be run from a web server. It can either run as CGI, or as FastCGI. OPTIONS ======= munin-cgi-graph is controlled using environment variables. See environment variables :envvar:`PATH_INFO` and :envvar:`QUERY_STRING`. Note: The munin-cgi-graph script may be called with the command line options of :ref:`munin-graph`. However, the existence of this should not be relied upon. ENVIRONMENT VARIABLES ===================== The following environment variables are used to control the output of munin-cgi-graph: .. envvar:: PATH_INFO This is the remaining part of the URI, after the path to the munin-cgi-graph script has been removed. The group, host, service and timeperiod values are extracted from this variable. The group may be nested. .. envvar:: CGI_DEBUG If this variable is set, debug information is logged to STDERR, and to /var/log/munin/munin-cgi-graph.log .. envvar:: QUERY_STRING A list of key=value parameters to control munin-cgi-graph. If QUERY_STRING is set, even to an empty value, a no_cache header is returned. .. envvar:: HTTP_CACHE_CONTROL If this variable is set, and includes the string "no_cache", a no_cache header is returned. .. envvar:: HTTP_IF_MODIFIED_SINCE Returns 304 if the graph is not changed since the timestamp in the HTTP_IF_MODIFIED_SINCE variable. EXAMPLES ======== When given an URI like the following: http://munin/munin-cgi/munin-cgi-graph/example.org/client.example.org/cpu-week.png munin-cgi-graph will be called with the following environment: PATH_INFO=/example.org/client.example.org/cpu-week.png To verify that munin is indeed graphing as it should, you can use the following command line: .. code-block:: bash sudo -u www-data \ PATH_INFO=/example.org/client.example.org/irqstats-day.png \ /usr/lib/munin/cgi/munin-cgi-graph | less The "less" is strictly not needed, but is recommended since munin-cgi-graph will output binary data to your terminal. You can add the :envvar:`CGI_DEBUG` variable, to get more log information. Content and debug information is logged to STDOUT and STDERR, respectively. If you only want to see the debug information, and not the HTTP headers or the content, you can redirect the file descriptors: .. code-block:: bash sudo -u www-data \ CGI_DEBUG=yes \ PATH_INFO=/example.org/client.example.org/irqstats-day.png \ /usr/lib/munin/cgi/munin-cgi-graph 2>&1 >/dev/null | less munin-2.0.25/doc/reference/munin-cgi-html.rst000066400000000000000000000026501243472346000210230ustar00rootroot00000000000000.. _munin-cgi-html: .. program:: munin-cgi-html ================ munin-cgi-html ================ DESCRIPTION =========== The :program:`munin-cgi-html` program is intended to be run from a web server. It can either run as CGI, or as FastCGI. OPTIONS ======= munin-cgi-html takes no options. It is controlled using environment variables. ENVIRONMENT VARIABLES ===================== The following environment variables are used to control the output of munin-cgi-html: .. envvar:: PATH_INFO This is the remaining part of the URI, after the path to the munin-cgi-html script has been removed. The group, host, service and timeperiod values are extracted from this variable. The group may be nested. EXAMPLES ======== PATH_INFO --------- "/" refers to the top page. "/example.com/" refers to the group page for "example.com" hosts. "/example.com/client.example.com/" refers to the host page for "client.example.com" in the "example.com" group COMMAND-LINE ------------ When given an URI like the following: http://munin.example.org/munin-cgi/munin-cgi-html/example.org munin-cgi-html will be called with the following environment: PATH_INFO=/example.org To verify that munin is able to create HTML pages, you can use the following command line: .. code-block:: bash sudo -u www-data \ PATH_INFO=/example.org \ /usr/lib/munin/cgi/munin-cgi-html SEE ALSO ======== :ref:`munin-cgi-graph`. munin-2.0.25/doc/reference/munin-check.rst000066400000000000000000000010631243472346000203710ustar00rootroot00000000000000.. _munin-check: .. program:: munin-check ============= munin-check ============= DESCRIPTION =========== munin-check is a utility that fixes the permissions of the munin directories and files. .. note:: munin-check needs superuser rights. .. note:: Please don't use this script if you are using 'graph_strategy cgi'. It doesn't care about the right permissions for www-data yet. OPTIONS ======= .. option:: --fix-permissions | -f Fix the permissions of the munin files and directories. .. option:: --help | -h Display usage information munin-2.0.25/doc/reference/munin-cron.rst000066400000000000000000000021521243472346000202550ustar00rootroot00000000000000.. _munin-cron: .. program:: munin-cron ============ munin-cron ============ DESCRIPTION =========== Munin-cron is a part of the package Munin, which is used in combination with :ref:`munin-node`. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. "munin-cron" runs the following programs, in the given order: #. :ref:`munin-update` #. :ref:`munin-limits` #. :ref:`munin-graph` (unless configured to run from CGI) #. :ref:`munin-html` (unless configured to run from CGI) Unless the munin master is configured otherwise, "munin-cron" should run every 5 minutes. OPTIONS ======= .. option:: --service Limit services to . Multiple --service options may be supplied. [unset] .. option:: --host Limit hosts to . Multiple --host options may be supplied. [unset] .. option:: --config Use as configuration file. [/etc/munin/munin.conf] SEE ALSO ======== :ref:`munin-update`, :ref:`munin-graph`, :ref:`munin-limits`, :ref:`munin-html`, :ref:`munin.conf`, munin-2.0.25/doc/reference/munin-graph.rst000066400000000000000000000060471243472346000204240ustar00rootroot00000000000000.. _munin-graph: .. program:: munin-graph ============= munin-graph ============= DESCRIPTION =========== The munin-graph script is run by munin-cron, and creates graphs from all RRD files in the munin database directory. OPTIONS ======= Some options can be negated by prefixing them with "no". Example: --fork and --nofork .. option:: --fork By default munin-graph forks subprocesses for drawing graphs to utilize available cores and I/O bandwidth. Can be negated with --nofork [--fork] .. option:: --n Max number of concurrent processes [6] .. option:: --force Force drawing of graphs that are not usually drawn due to options in the config file. Can be negated with --noforce [--noforce] .. option:: --lazy Only redraw graphs when needed. Can be negated with --nolazy [--lazy] .. option:: --help View this message. .. option:: --version View version information. .. option:: --debug View debug messages. .. option:: --cron Behave as expected when run from cron. (Used internally in Munin.) Can be negated with --nocron .. option:: --host Limit graphed hosts to . Multiple --host options may be supplied. .. option:: --only-fqn For internal use with CGI graphing. Graph only a single fully qualified named graph, For instance: --only-fqn root/Backend/dafnes.example.com/diskstats_iops Always use with the correct --host option. .. option:: --config Use as configuration file. [/etc/munin/munin.conf] .. option:: --list-images List the filenames of the images created. Can be negated with --nolist-images. [--nolist-images] .. option:: --output-file | -o Output graph file. (used for CGI graphing) .. option:: --log-file | -l Output log file. (used for CGI graphing) .. option:: --day Create day-graphs. Can be negated with --noday. [--day] .. option:: --week Create week-graphs. Can be negated with --noweek. [--week] .. option:: --month Create month-graphs. Can be negated with --nomonth. [--month] .. option:: --year Create year-graphs. Can be negated with --noyear. [--year] .. option:: --sumweek Create summarised week-graphs. Can be negated with --nosumweek. [--summweek] .. option:: --sumyear Create summarised year-graphs. Can be negated with --nosumyear. [--sumyear] .. option:: --pinpoint Create custom-graphs. is the time in the standard unix Epoch format. [not active] .. option:: --size_x Sets the X size of the graph in pixels [175] .. option:: --size_y Sets the Y size of the graph in pixels [400] .. option:: --lower_limit Sets the lower limit of the graph .. option:: --upper_limit Sets the upper limit of the graph .. note:: :option:`--pinpoint` and :option:`--only-fqn` must not be combined with any of :option:`--day`, :option:`--week`, :option:`--month` or :option:`--year` (or their negating forms). The result of doing that is undefined. SEE ALSO ======== :ref:`munin-cron`, :ref:`munin-cgi-graph` munin-2.0.25/doc/reference/munin-html.rst000066400000000000000000000021531243472346000202610ustar00rootroot00000000000000.. _munin-html: .. program:: munin-html ============ munin-html ============ DESCRIPTION =========== munin-html is one of the munin master components run from the :ref:`munin-cron` script. This script is responsible for generating static HTML pages. If "html_strategy cgi" is set in munin.conf, munin-html will assume HTML pages are generated by munin-cgi-html, and exit silently. OPTIONS ======= munin-html has one significant option, which configuration file to use. Several other options are recognized and ignored as "compatibility options", since :ref:`munin-cron` passes all options through to the underlying components, of which munin-html is one. .. option:: --config Use as configuration file. [/etc/munin/munin.conf] .. option:: --help View this message. .. option:: --debug View debug messages. .. option:: --version View version information. .. option:: --nofork Compatibility. No effect. .. option:: --service Compatibility. No effect. .. option:: --host Compatibility. No effect. SEE ALSO ======== :ref:`munin-cron`, :ref:`munin-cgi-html` munin-2.0.25/doc/reference/munin-limits.rst000066400000000000000000000042441243472346000206210ustar00rootroot00000000000000.. _munin-limits: .. program:: munin-limits ============== munin-limits ============== DESCRIPTION =========== :ref:`munin-limits` is one of the processes regularly run from the :ref:`munin-cron` script. It reads the current and the previous collected values for each plugin, and compares them to the plugin's warning and critical values, if it has any. If the limits are breached, for instance, if a value moves from "ok" to "warning", or from "critical" to "ok", it sends an event to any configured contacts. A common configured contact is "nagios", which can use events from munin-limits as a source of passive service check results. OPTIONS ======= .. option:: --config Use as configuration file. [/etc/munin/munin.conf] .. option:: --contact Limit contacts to those of . Multiple --contact options may be supplied. [unset] .. option:: --host Limit hosts to those of . Multiple --host options may be supplied. [unset] .. option:: --service Limit services to those of . Multiple --service options may be supplied. [unset] .. option:: --always-send Force sending of messages even if you normally wouldn't. The can be a whitespace or comma separated list of the values "ok", "warning", "critical" or "unknown". This option may be specified several times, to add more values. Use of "--always-send" overrides the "always_send" value in munin.conf for configured contacts. See also --force. .. option:: --force Alias for "--always-send ok,warning,critical,unknown" .. option:: --force-run-as-root munin-limits will normally prevent you from running as root. Use this option to override this. The use of this option is not recommended. You may have to clean up file permissions in order for munin to run normally afterwards. .. option:: --help View help message. .. option:: --debug If set, view debug messages. Can be negated with --nodebug. [--nodebug] FILES ===== :ref:`/etc/munin/munin.conf ` :ref:`/var/lib/munin/* ` :ref:`/var/run/munin/* ` SEE ALSO ======== :ref:`munin.conf` munin-2.0.25/doc/reference/munin-node.conf.rst000066400000000000000000000070661243472346000211760ustar00rootroot00000000000000.. _munin-node.conf: =============== munin-node.conf =============== DESCRIPTION =========== This is the configuration file for :ref:`munin-node` and :ref:`munin-run`. The directives "host_name", "paranoia" and "ignore_file" are munin node specific. All other directives in munin-node.conf are passed through to the Perl module Net::Server. Depending on the version installed, you may have different settings available. DIRECTIVES ========== Native ------ .. option:: host_name The hostname used by munin-node to present itself to the munin master. Use this if the local node name differs from the name configured in the munin master. .. option:: ignore_file Files to ignore when locating installed plugins. May be repeated. .. option:: paranoia If set to a true value, :ref:`munin-node` will only run plugins owned by root. Inherited --------- These are the most common Net::Server options used in :ref:`munin-node`. .. option:: log_level Ranges from 0-4. Specifies what level of error will be logged. "0" means no logigng, while "4" means very verbose. These levels correlate to syslog levels as defined by the following key/value pairs. 0=err, 1=warning, 2=notice, 3=info, 4=debug. Default: 2 .. option:: log_file Where the munin node logs its activity. If the value is Sys::Syslog, logging is sent to syslog Default: undef (STDERR) .. option:: port The TCP port the munin node listens on Default: 4949 .. option:: pid_file The pid file of the process Default: undef (none) .. option:: background To run munin node in background set this to "1". If you want munin-node to run as a foreground process, comment this line out and set "setsid" to "0". .. option:: host The IP address the munin node process listens on Default: * (All interfaces) .. option:: user The user munin-node runs as Default: root .. option:: group The group munin-node runs as Default: root .. option:: setsid If set to "1", the server forks after binding to release itself from the command line, and runs the POSIX::setsid() command to daemonize. Default: undef .. option:: ignore_file Files to ignore when locating installed plugins. May be repeated. .. option:: host_name The hostname used by munin-node to present itself to the munin master. Use this if the local node name differs from the name configured in the munin master. .. option:: allow A regular expression defining which hosts may connect to the munin node. .. note:: Use cidr_allow if available. .. option:: cidr_allow Allowed hosts given in CIDR notation (192.0.2.1/32). Replaces or complements “allow”. Requires the precense of Net::Server, but is not supported by old versions of this module. .. option:: cidr_deny Like cidr_allow, but used for denying host access .. option:: timeout Number of seconds after the last activity by the master until the node will close the connection. If plugins take longer to run, this may disconnect the master. Default: 20 seconds EXAMPLE ======= .. index:: tuple: munin-node.conf; example A pretty normal configuration file: :: host * port 4949 cidr_allow 127.0.0.0/8 cidr_allow 192.0.2.0/24 user root group root background 1 setsid 1 log_level 4 log_file /var/log/munin/munin-node.log pid_file /var/run/munin-node.pid ignore_file \.bak$ ignore_file ^README$ ignore_file \.dpkg-(old|new)$ ignore_file \.rpm(save|new)$ ignore_file \.puppet-new$ SEE ALSO ======== :ref:`munin-node`, :ref:`munin-run` munin-2.0.25/doc/reference/munin-node.rst000066400000000000000000000036141243472346000202450ustar00rootroot00000000000000.. _munin-node: .. program:: munin-node ============ munin-node ============ DESCRIPTION =========== munin-node is a daemon for reporting statistics on system performance. By default, it is started at boot time, listens on port 4949/TCP, accepts connections from the :ref:`munin master `, and runs :ref:`munin plugins ` on demand. OPTIONS ======= .. option:: --config Use as configuration file. [/etc/munin/munin-node.conf] .. option:: --paranoia Only run plugins owned by root. Check permissions as well. Can be negated with --noparanoia [--noparanoia] .. option:: --help View this help message. .. option:: --debug View debug messages. .. note:: This can be very verbose. .. option:: --pidebug Plugin debug. Sets the environment variable :envvar:`MUNIN_DEBUG` to 1 so that plugins may enable debugging. CONFIGURATION ============= The configuration file is :ref:`munin-node.conf`. .. index:: pair: example; munin-node.conf FILES ===== :ref:`/etc/munin/munin-node.conf ` :ref:`/etc/munin/plugins/* ` :ref:`/etc/munin/plugin-conf.d/* ` :ref:`/var/run/munin/munin-node.pid ` :ref:`/var/log/munin/munin-node.log ` SEE ALSO ======== :ref:`munin-node.conf` Example configuration ===================== :: # /etc/munin/munin-node.conf - config-file for munin-node # host_name random.example.org log_level 4 log_file /var/log/munin/munin-node.log pid_file /var/run/munin/munin-node.pid background 1 setsid 1 # Which port to bind to; host [::] port 4949 user root group root # Regexps for files to ignore ignore_file ~$ ignore_file \.bak$ ignore_file %$ ignore_file \.dpkg-(tmp|new|old|dist)$ ignore_file \.rpm(save|new)$ ignore_file \.puppet-bak$ # Hosts to allow cidr_allow 127.0.0.0/8 cidr_allow 192.0.2.129/32 munin-2.0.25/doc/reference/munin-run.rst000066400000000000000000000030261243472346000201210ustar00rootroot00000000000000.. _munin-run: .. program:: munin-run =========== munin-run =========== DESCRIPTION =========== munin-run is a script to run Munin plugins from the command-line. It is primarily used to debug plugins; munin-run runs these plugins in the same conditions as they are under :ref:`munin-node`. OPTIONS ======= .. option:: --config Use as configuration file. [/etc/munin/munin-node.conf] .. option:: --servicedir Use as plugin dir. [/etc/munin/plugins/] .. option:: --sconfdir Use as plugin configuration dir. [/etc/munin/plugin-conf.d/] .. option:: --sconffile Use as plugin configuration. Overrides sconfdir. [undefined] .. option:: --paranoia Only run plugins owned by root and check permissions. [disabled] .. option:: --help View this help message. .. option:: --debug Print debug messages. Debug messages are sent to STDOUT and are prefixed with "#" (this makes it easier for other parts of munin to use munin-run and still have --debug on). Only errors go to STDERR. .. option:: --pidebug Enable debug output from plugins. Sets the environment variable :envvar:`MUNIN_DEBUG` to 1 so that plugins may enable debugging. [disabled] .. option:: --version Show version information. FILES ===== :ref:`/etc/munin/munin-node.conf ` :ref:`/etc/munin/plugins/* ` :ref:`/etc/munin/plugin-conf.d/* ` :ref:`/var/run/munin/munin-node.pid ` :ref:`/var/log/munin/munin-node.log ` munin-2.0.25/doc/reference/munin-update.rst000066400000000000000000000025721243472346000206040ustar00rootroot00000000000000.. _munin-update: .. program:: munin-update ============== munin-update ============== DESCRIPTION =========== munin-update is the primary Munin component. It is run from the :ref:`munin-cron` script. This script is responsible for contacting all the agents (munin-nodes) and collecting their data. Upon fetching the data, munin-update stores everything in RRD files - one RRD files for each field in each plugin. Running munin-update with the --debug flag will often give plenty of hints on what might be wrong. munin-update is a component in the Munin server. OPTIONS ======= .. option:: --config_file Use as the configuration file. [/etc/munin/munin.conf] .. option:: --debug If set, log debug messages. Can be negated with --nodebug [--nodebug] .. option:: --fork If set, will fork off one process for each host. Can be negated with --nofork [--fork] .. option:: --host Limit fetched data to those from . Multiple --host options may be supplied. [unset] .. option:: --service Limit fetched data to those of . Multiple --service options may be supplied. [unset] .. option:: --timeout Set the network timeout to . [180] .. option:: --help Print the help message then exit. .. option:: --version Print version information then exit. SEE ALSO ======== :ref:`munin-cron` munin-2.0.25/doc/reference/munin.conf.rst000066400000000000000000000055501243472346000202470ustar00rootroot00000000000000.. _munin.conf: .. program:: munin.conf ============ munin.conf ============ DESCRIPTION =========== This is the configuration file for the munin master. It is used by :ref:`munin-update`, :ref:`munin-graph`, :ref:`munin-limits`. :ref:`munin-html`, :ref:`munin-cgi-graph` and :ref:`munin-cgi-html`. GLOBAL DIRECTIVES ================= Global directives affect all munin master components unless specified otherwise. .. option:: dbdir The directory where munin stores its database files. Default: /var/lib/munin .. option:: logdir The directory where munin stores its logfiles. Default: /var/log/munin .. option:: htmldir The directory where :ref:`munin-html` stores generated HTML pages, and where :ref:`munin-graph` stores graphs. Default: /var/cache/munin/www .. option:: rundir Directory for files tracking munin's current running state. Default: /var/run/munin .. option:: tmpldir Directories for templates used by :ref:`munin-html` and :ref:`munin-cgi-html` to generate HTML pages. Default /etc/munin/templates .. option:: fork This directive determines whether :ref:`munin-update` fork when gathering information from nodes. Default is "yes". If you set it to "no" munin-update will collect data from the nodes in sequence. This will take more time, but use less resources. Not recommended unless you have only a handful of nodes. Affects: :ref:`munin-update` .. option:: palette The palette used by :ref:`munin-graph` and :ref:`munin-cgi-graph` to colour the graphs. The "default" palete has more colours and better contrast than the "old" palette. Affects: :ref:`munin-graph` .. option:: graph_data_size This directive sets the resolution of the RRD files that are created by :ref:`munin-graph` and :ref:`munin-cgi-graph`. Default is "normal". "huge" saves the complete data with 5 minute resolution for 400 days. Changing this directive has no effect on existing graphs Affects: :ref:`munin-graph` .. option:: graph_strategy If set to "cron", :ref:`munin-graph` will graph all services on all nodes every run interval. If set to "cgi", :ref:`munin-graph` will do nothing. To generate graphs you must then configure a web server to run :ref:`munin-cgi-graph` instead. Affects: :ref:`munin-graph` .. option:: html_strategy Valid strategies are "cgi" and "cron". Default is "cgi". If set to "cron", :ref:`munin-html` will recreate all html pages every run interval. If set to "cgi", :ref:`munin-html` will do nothing. To generate html pages you must configure a web server to run :ref:`munin-cgi-graph` instead. .. index:: pair: example; munin.conf EXAMPLE ======= A minimal configuration file :: [client.example.com] address client.example.com munin-2.0.25/doc/reference/plugin.rst000066400000000000000000000304071243472346000174720ustar00rootroot00000000000000.. _plugin-reference: ================== Plugin reference ================== .. index:: pair: plugin; fields Fields ====== On a configuration run, the plugin is called with the argument "config". The following fields are used. +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | Field | Value | type | Description | See also | Default | +====================+==================+==========+==========================================+==================+=========+ | graph_title | string | required | Sets the title of the graph | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_args | string | optional | Arguments for the rrd grapher. This is | rrdgraph_ | | | | | | used to control how the generated graph | | | | | | | looks, and how values are interpreted or | | | | | | | presented. | | | | | | | | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_vlabel | string | optional | Label for the vertical axis of the graph | | | | | | | | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_category | lower case | optional | Category used to sort the graph on the | | misc | | | string, no | | generated index web page. | | | | | whitespace | | | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_info | html text | optional | Additional text for the generated graph | | | | | | | web page | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_scale | yes|no | optional | If "yes", the generated graph will be | | no | | | | | scaled to the uppper and lower values of | | | | | | | the datapoints within the graph. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | graph_order | space separated | optional | Ensures that the listed datapoints are | | | | | list of | | displayed in order. Any additional | | | | | graph.datapoints | | datapoints are added in the order of | | | | | | | appearance after datapoitns appearing on | | | | | | | this list. | | | | | | | | | | | | | | This field is also used for "borrowing", | | | | | | | which is the practice of taking | | | | | | | datapoints from other graphs. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | update_rate | integer | optional | Sets the update_rate used by the munin | | | | | (seconds) | | master when it creates the RRD file. | | | | | | | | | | | | | | The update rate is the interval at which | | | | | | | the RRD file expects to have data. | | | | | | | | | | | | | | This field requires a munin master | | | | | | | version of at least 2.0.0 | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.label | lower case | required | The label used in the graph for this | | | | | string, no | | field | | | | | whitespace | | | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.info | html text | optional | Additional html text for the generated | | | | | | | graph web page, used in the field | | | | | | | description table | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.warning | integer, or | optional | This field defines a threshold value or | | | | | integer:integer | | range. If the field value above the | | | | | (signed) | | defined warning value, or outside the | | | | | | | range, the service is considered to be in| | | | | | | a "warning" state. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.critical | integer, or | optional | This field defines a threshold value or | | | | | integer:integer | | range. If the field value is above the | | | | | (signed) | | defined critical value, or outside the | | | | | | | range, the service is considered to be in| | | | | | | a "critical" state. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.graph | yes|no | optional | Determines if this datapoint should be | | yes | | | | | visible in the generated graph. | | | | | | | | | | | | | | | | | | | | | | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.cdef | CDEF statement | optional | A CDEF statement is a Reverse Polish | cdeftutorial_ | | | | | | Notation statement used to construct a | | | | | | | datapoint from other datapoints. | | | | | | | | | | | | | | This is commonly used to calculate | | | | | | | percentages. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ | datapoint.draw | AREA, LINE, | | Determines how the graph datapoints are | rrdgraph_ | LINE | | | LINE[n], STACK, | | displayed in the graph. The "LINE" takes | | | | | AREASTACK, | | an optional width suffix, commonly | | | | | LINESTACK, | | "LINE1", "LINE2", etc… | | | | | LINE[n]STACK | | The \*STACK values are specific to munin | | | | | | | and makes the first a LINE, LINE[n] or | | | | | | | AREA datasource, and the rest as STACK. | | | +--------------------+------------------+----------+------------------------------------------+------------------+---------+ On a data fetch run, the plugin is called with no arguments. the following fields are used. +-----------------+-----------------------+----------+------------------+------+------------+ | Field | Value | type | Description | See | Default | | | | | | also | | +=================+=======================+==========+==================+======+============+ | datapoint.value | integer, scientific | required | The value to be | | No default | | | notation, or "U" (may | | graphed. | | | | | be signed) | | | | | | | | | | | | +-----------------+-----------------------+----------+------------------+------+------------+ .. index:: pair: plugin; executing Example ======= This is an example of the plugin fields used with the "df" plugin. The "munin-run" command is used to run the plugin from the command line. Configuration run ----------------- :: # munin-run df config graph_title Filesystem usage (in %) graph_args --upper-limit 100 -l 0 graph_vlabel % graph_category disk graph_info This graph shows disk usage on the machine. _dev_hda1.label / _dev_hda1.info / (ext3) -> /dev/hda1 _dev_hda1.warning 92 _dev_hda1.critical 98 Data fetch run -------------- :: # munin-run df _dev_hda1.value 83 .. _cdeftutorial: http://oss.oetiker.ch/rrdtool/tut/cdeftutorial.en.html .. _rrdgraph: http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html munin-2.0.25/getversion000077500000000000000000000034211243472346000150460ustar00rootroot00000000000000#!/bin/sh # Generate a version string for use when building. # # * If RELEASE exists, and is non-empty, use the contents of that file. # This is in case we're building from a tarball. # # * If we're inside a git tree: # - For the "master" branch, use "git describe". # - For "detached" branches (mostly for tag checkouts), also use "git describe". # - For other branches, use a "$VERSION-$NBCOMMITS-$BRANCH-$DATE-g$COMMIT" # sortof version. # # * Try to make it up from the directory name (munin-2.0.1 -> 2.0.1) # # * If we're still looking for a version, just fallback to "unknown". current_git_branch() { # Handle this too: # git checkout 2.0.9 # git branch # * (no branch) # devel GB="$(git branch | awk '$1 == "*" {print $2}')" case $GB in "(no" ) echo;; * ) echo $GB;; esac } generate_version_string() { branch="$(current_git_branch)" case "${branch}" in ""|master|stable-*) git describe ;; *) # "foo | read VAR" does *not* work # workaround stolen from http://www.etalabs.net/sh_tricks.html read VERSION COMMITS HASH </dev/null)" = "true" ]; then generate_version_string elif [ ! -z "$(generate_version_string_from_dir)" ]; then generate_version_string_from_dir else echo "unknown" fi munin-2.0.25/install-sh000077500000000000000000000127361243472346000147500ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$cpprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 munin-2.0.25/logo-horizontal.svg000066400000000000000000000273161243472346000166140ustar00rootroot00000000000000 image/svg+xml munin-2.0.25/logo.eps000066400000000000000000003746051243472346000144230ustar00rootroot00000000000000%!PS-Adobe-3.1 EPSF-3.0 %%Title: Logo_Munin.eps %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 9.0 %AI9_PrintingDataBegin %%For: Walter Biering %%CreationDate: 04.05.2004 %%CropBox: 0.000000 0.000000 158.792969 233.192383 %%BoundingBox: 0 0 159 234 %%HiResBoundingBox: 0.000000 0.000000 158.792969 233.192383 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Core 2.0 0 %%DocumentFonts: %%DocumentSuppliedFonts: %%PageOrder: Ascend %%DocumentProcessColors: Cyan Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-1999 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 233 dict dup begin put /nd{ null def }bind def /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_src256 256 string def /AGMCORE_dst64 64 string def /AGMCORE_srcLen nd /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_imagestring0 nd /AGMCORE_imagestring1 nd /AGMCORE_imagestring2 nd /AGMCORE_imagestring3 nd /AGMCORE_imagestring4 nd /AGMCORE_imagestring5 nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_mbuf () def /AGMCORE_ybuf () def /AGMCORE_kbuf () def /AGMCORE_gbuf () def /AGMCORE_bbuf () def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_arg1 nd /AGMCORE_arg2 nd /AGMCORE_&setgray nd /AGMCORE_&image nd /AGMCORE_&colorimage nd /AGMCORE_&imagemask nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&&setcolorspace nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_in_rip_sep nd /AGMCORE_host_sep nd /AGMCORE_will_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ccimage_exists nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSA_cache 0 dict def /AGMCORE_CSD_cache 0 dict def /AGMCORE_pattern_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_ndx nd /AGMCORE_err_strings nd /AGMCORE_cur_err nd /AGMCORE_ovp nd /AGMCORE_CRD_cache where{ pop }{ /AGMCORE_CRD_cache 0 dict def }ifelse /bdf { bind def } bind def /xdf { exch def } def /ldf { load def } def /ddf { put } def /xddf { 3 -1 roll put } def /xpt { exch put } def /bdict { mark } def /edict { counttomark 2 idiv dup dict begin {def} repeat pop currentdict end }def /ps_level /languagelevel where{ pop languagelevel }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /ndf { 1 index where{ pop pop pop }{ dup xcheck {bind}if def }ifelse } def /skip_image { has_color ne{ dup 256 idiv {currentfile AGMCORE_str256 readstring pop pop}repeat currentfile AGMCORE_str256 0 4 -1 roll 256 mod getinterval readstring pop pop }{ pop }ifelse } def /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx } def /colorbuf { 0 1 2 index length 1 sub { dup 2 index exch get 255 exch sub 2 index 3 1 roll put } for } def /makereadonlyarray { /packedarray where {pop packedarray} {array astore readonly} ifelse } def /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq { dup /HalftoneType get 1 eq { /SpotFunction get } { dup /HalftoneType get 2 eq { /GraySpotFunction get } { pop {abs exch abs 2 copy add 1 gt {1 sub dup mul exch 1 sub dup mul add 1 sub} {dup mul exch dup mul add 1 exch sub}ifelse}bind } ifelse } ifelse } if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /stkpath_clp_npth { strokepath clip newpath } def /stk_n_clp_npth { gsave stroke grestore clip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust userdict begin /showpage {} def mark } def /graphic_cleanup { cleartomark end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def /AGMCORE_arg2 xdf /AGMCORE_arg1 xdf clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval dup (.) ne AGMCORE_arg1 0 lt and { pop } { stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show } ifelse 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { dup 94 eq { pop AGMCORE_arg1 0 ge { AGMCORE_arg1 AGMCORE_str256 cvs dup /AGMCORE_tmp exch length def AGMCORE_str256 exch 0 exch putinterval AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show } { /AGMCORE_arg1 0 def } ifelse 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def AGMCORE_arg1 0 ne { /AGMCORE_arg1 AGMCORE_arg2 def } if } { AGMCORE_str256 exch AGMCORE_tmp exch put /AGMCORE_tmp AGMCORE_tmp 1 add def }ifelse } ifelse } forall } bdf level2{ /AGMCORE_map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup /Cyan eq{ pop (_Cyan_) }{ dup /Magenta eq{ pop (_Magenta_) }{ dup /Yellow eq{ pop (_Yellow_) }{ dup /Black eq{ pop (_Black_) }{ dup / eq{ pop (Process) }if }ifelse }ifelse }ifelse }ifelse }ifelse }ifelse }ifelse }if }def }if /doc_setup{ Adobe_AGM_Core begin /AGMCORE_will_host_separate xdf /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not { errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and { $error /newerror false put AGMCORE_cur_err /AGMCORE_bad_environ eq { /AGMCORE_bad_environ AGMCORE_ps_level AGMCORE_ps_version } { AGMCORE_cur_err 0 0 } ifelse compose_error_msg } if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def /AGMCORE_&&setcolorspace /setcolorspace ldf }if /AGMCORE_&image systemdict/image get def /AGMCORE_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMCORE_&colorimage /colorimage ldf }if /AGMCORE_in_rip_sep level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse def level2 not{ /xput{ dup load dup length exch maxlength eq{ dup dup load dup length dup 0 eq {pop 1} if 2 mul dict copy def }if load begin def end }def }{ /xput{ load 3 1 roll put }def }ifelse /AGMCORE_gstate_known{ where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /AGMCORE_GSTATE AGMCORE_gstate_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 7 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core exch /AGMCORE_gstackptr exch put AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if Adobe_AGM_Core exch /AGMCORE_gstackptr exch put }def /grestoreall { AGMCORE_&grestoreall Adobe_AGM_Core /AGMCORE_gstackptr AGMCORE_gstacksaveptr put }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core begin /AGMCORE_gstackptr exch def /AGMCORE_gstacksaveptr AGMCORE_gstackptr def end AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput end }def /page_setup { Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /AGMCORE_ccimage_exists /customcolorimage where {pop true}{false} ifelse def /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and AGMCORE_producing_seps or }ifelse def AGMCORE_host_sep AGMCORE_will_host_separate not and { /AGMCORE_cur_err /AGMCORE_color_space_onhost_seps def AGMCORE_color_space_onhost_seps }if /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots }ifelse { /setcmykcolor[ {4 copy add add add 0 eq currentoverprint and{pop 0.0005}if}/exec cvx /setcmykcolor load dup type/operatortype ne{/exec cvx}if ]cvx def }if AGMCORE_host_sep{ /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall }def level2{ /mo /moveto ldf /ln /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def /level2ScreenFreq{ begin 60 HalftoneType 1 eq{ pop Frequency }if HalftoneType 2 eq{ pop GrayFrequency }if HalftoneType 5 eq{ pop Default level2ScreenFreq }if end }def /currentScreenFreq{ currenthalftone level2ScreenFreq }def /invert_image_samples { Adobe_AGM_Core/AGMCORE_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def /get_gstate { AGMCORE_GSTATE begin /AGMCORE_GSTATE_ctm AGMCORE_tmpmatrix currentmatrix def /AGMCORE_GSTATE_clr_spc currentcolorspace def /AGMCORE_GSTATE_clr_indx 0 def /AGMCORE_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMCORE_GSTATE_clr_comps AGMCORE_GSTATE_clr_indx 3 -1 roll put /AGMCORE_GSTATE_clr_indx AGMCORE_GSTATE_clr_indx 1 add def} repeat pop /AGMCORE_GSTATE_fnt rootfont def /AGMCORE_GSTATE_lw currentlinewidth def /AGMCORE_GSTATE_lc currentlinecap def /AGMCORE_GSTATE_lj currentlinejoin def /AGMCORE_GSTATE_ml currentmiterlimit def currentdash /AGMCORE_GSTATE_do xdf /AGMCORE_GSTATE_da xdf /AGMCORE_GSTATE_sa currentstrokeadjust def /AGMCORE_GSTATE_clr_rnd currentcolorrendering def /AGMCORE_GSTATE_op currentoverprint def /AGMCORE_GSTATE_bg currentblackgeneration cvlit def /AGMCORE_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMCORE_GSTATE_gy_xfer xdf cvlit /AGMCORE_GSTATE_b_xfer xdf cvlit /AGMCORE_GSTATE_g_xfer xdf cvlit /AGMCORE_GSTATE_r_xfer xdf /AGMCORE_GSTATE_ht currenthalftone def /AGMCORE_GSTATE_flt currentflat def end }ndf /set_gstate { AGMCORE_GSTATE begin AGMCORE_GSTATE_ctm setmatrix AGMCORE_GSTATE_clr_spc setcolorspace AGMCORE_GSTATE_clr_indx {AGMCORE_GSTATE_clr_comps AGMCORE_GSTATE_clr_indx 1 sub get /AGMCORE_GSTATE_clr_indx AGMCORE_GSTATE_clr_indx 1 sub def} repeat setcolor AGMCORE_GSTATE_fnt setfont AGMCORE_GSTATE_lw setlinewidth AGMCORE_GSTATE_lc setlinecap AGMCORE_GSTATE_lj setlinejoin AGMCORE_GSTATE_ml setmiterlimit AGMCORE_GSTATE_da AGMCORE_GSTATE_do setdash AGMCORE_GSTATE_sa setstrokeadjust AGMCORE_GSTATE_clr_rnd setcolorrendering AGMCORE_GSTATE_op setoverprint AGMCORE_GSTATE_bg cvx setblackgeneration AGMCORE_GSTATE_ucr cvx setundercolorremoval AGMCORE_GSTATE_r_xfer cvx AGMCORE_GSTATE_g_xfer cvx AGMCORE_GSTATE_b_xfer cvx AGMCORE_GSTATE_gy_xfer cvx setcolortransfer AGMCORE_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMCORE_GSTATE_ht /HalftoneType get ne { mark AGMCORE_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMCORE_GSTATE_ht sethalftone } ifelse AGMCORE_GSTATE_flt setflat end }ndf AGMCORE_producing_seps not{ /setcolorspace where{ /Adobe_AGM_Core_Id known not }{ true }ifelse { /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or{ dup 0 get dup /Separation eq{ pop [ exch {} forall ] dup dup 1 get AGMCORE_map_reserved_ink_name 1 exch put }{ /DeviceN eq { [ exch {} forall ] dup dup 1 get [ exch {AGMCORE_map_reserved_ink_name} forall ] 1 exch put }if }ifelse }if AGMCORE_&&setcolorspace }def }if }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /ln{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /currentScreenFreq{ currentscreen pop pop }def /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /n_color_components { dup type /arraytype eq{ 0 get }if dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse } def /setcolor_devicecolor { dup type /arraytype eq{ 0 get }if dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /op /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /spclp /stkpath_clp_npth ldf /f /fill ldf /ef /eofill ldf /s /stroke ldf /sclp /stk_n_clp_npth ldf /nclp /npth_clp ldf /img /imageormask ldf /sepimg /sep_imageormask ldf /idximg /indexed_imageormask ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall }def /page_trailer { end }def /unload{ systemdict/languagelevel known{ systemdict/languagelevel get 2 ge{ userdict/Adobe_AGM_Core 2 copy known{ undef }{ pop pop }ifelse }if }if }def /doc_trailer{ }def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { Adobe_AGM_Core/AGMCORE_name xddf false currentpagedevice/SeparationColorNames get{ AGMCORE_name eq or }forall }def /current_ink { dup length 0 eq{ pop true }{ Adobe_AGM_Core/ink_result false put { dup /ProcessCyan eq{ AGMCORE_cyan_plate ink_result or Adobe_AGM_Core/ink_result xddf }{ dup /ProcessMagenta eq{ AGMCORE_magenta_plate ink_result or Adobe_AGM_Core/ink_result xddf }{ dup /ProcessYellow eq{ AGMCORE_yellow_plate ink_result or Adobe_AGM_Core/ink_result xddf }{ dup /ProcessBlack eq{ AGMCORE_black_plate ink_result or Adobe_AGM_Core/ink_result xddf }{ dup /sep_colorspace_dict AGMCORE_gget dup null eq{ pop false ink_result or Adobe_AGM_Core/ink_result xddf }{ /Name get eq{ 1 setsepcolor currentgray 1 ne ink_result or Adobe_AGM_Core/ink_result xddf }{ false ink_result or Adobe_AGM_Core/ink_result xddf }ifelse }ifelse }ifelse }ifelse }ifelse }ifelse pop } forall ink_result }ifelse }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA map_csa setcolorspace_opt set_crd end } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /sep_colorspace_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { dup /sep_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep }{ Name inRip_spot_has_ink not }ifelse { /pop cvx 1 }if /setcustomcolor cvx ] cvx bdf }{ /TintProc /setcolor ldf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd 1 setsepcolor end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse end }def /setindexedcolor { AGMCORE_host_sep{ /indexed_colorspace_dict AGMCORE_gget/Lookup get 4 3 -1 roll map_index setcmykcolor }{ setcolor }ifelse } def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMCORE_&imagemask }{ AGMCORE_&image }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMCORE_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMCORE_&image }ifelse }ifelse cleartomark restore end }def /overprint_plate { currentoverprint{ 0 get dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false }ifelse }def /rdline { currentfile AGMCORE_str256 readline pop } def /rdcmntline { currentfile AGMCORE_str256 readline pop (%) anchorsearch {pop} if } def /filter_cmyk { dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch { AGMCORE_src256 readstring pop dup length /AGMCORE_srcLen exch def /AGMCORE_ndx 0 def AGMCORE_plate_ndx 4 AGMCORE_srcLen 1 sub{ 1 index exch get AGMCORE_dst64 AGMCORE_ndx 3 -1 roll put /AGMCORE_ndx AGMCORE_ndx 1 add def }for pop AGMCORE_dst64 0 AGMCORE_ndx getinterval } bind /exec cvx ] cvx } def /imageormask { begin SkipImageProc not{ save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq{ imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if image }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMCORE_host_sep{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray knockout_image_samples currentdict imageormask_sys }{ nulldevice currentdict imageormask_sys }ifelse }ifelse }{ imagemask }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ MultipleDataSources{ 4 {pop} repeat /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def AGMCORE_is_cmyk_sep{ currentoverprint InksUsed current_ink not and{ nulldevice }{ invert_image_samples }ifelse }{ currentoverprint not{ knockout_image_samples }{ nulldevice }ifelse }ifelse 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {pop 1} exch addprocs 4 1 roll {pop 1} exch addprocs 4 1 roll {pop 1} exch addprocs 4 1 roll setcolortransfer MultipleDataSources NComponents AGMCORE_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not{ currentoverprint not{ knockout_image_samples }{ nulldevice }ifelse }if }ifelse 1 AGMCORE_&setgray currentdict imageormask_sys }{ image }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentoverprint InksUsed current_ink not and{ }{ currentcolorspace overprint_plate not{ knockout_unitsq }if }ifelse }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }if end }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Core begin /AGMCORE_mbuf 0 string def /AGMCORE_ybuf 0 string def /AGMCORE_kbuf 0 string def { colorbuf dup length AGMCORE_mbuf length ne { dup length dup dup /AGMCORE_mbuf exch string def /AGMCORE_ybuf exch string def /AGMCORE_kbuf exch string def } if dup AGMCORE_mbuf copy AGMCORE_ybuf copy AGMCORE_kbuf copy pop } addprocs {AGMCORE_mbuf}{AGMCORE_ybuf}{AGMCORE_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Core/AGMCORE_k xddf Adobe_AGM_Core/AGMCORE_y xddf Adobe_AGM_Core/AGMCORE_m xddf Adobe_AGM_Core/AGMCORE_c xddf AGMCORE_y 0.0 eq AGMCORE_m 0.0 eq and AGMCORE_c 0.0 eq and{ {AGMCORE_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMCORE_k mul 1 exch sub} exch addprocs 4 1 roll {AGMCORE_y mul 1 exch sub} exch addprocs 4 1 roll {AGMCORE_m mul 1 exch sub} exch addprocs 4 1 roll {AGMCORE_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Core/AGMCORE_k xddf Adobe_AGM_Core/AGMCORE_y xddf Adobe_AGM_Core/AGMCORE_m xddf Adobe_AGM_Core/AGMCORE_c xddf {AGMCORE_c mul 1 exch sub} {AGMCORE_m mul 1 exch sub} {AGMCORE_y mul 1 exch sub} {AGMCORE_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def begin SkipImageProc not{ save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMCORE_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentoverprint InksUsed current_ink not and{ }{ currentdict/ImageMatrix get concat knockout_unitsq }ifelse }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or{ knockout_image_samples }{ nulldevice }ifelse currentdict imageormask_sys }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }if end end }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /read_image_file { AGMCORE_imagefile 0 setfileposition dup /DataSource {AGMCORE_imagefile AGMCORE_imbuf readstring pop} put exch load exec }def /write_image_file { { (AGMCORE_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Core/AGMCORE_imagefile xddf Adobe_AGM_Core/AGMCORE_imbuf Width BitsPerComponent mul 7 add 8 idiv string ddf 1 1 Height { pop DataSource dup type /filetype eq{ AGMCORE_imbuf readstring pop }{ exec } ifelse AGMCORE_imagefile exch writestring }for true }ifelse }def /imageormask_l2_overprint { write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if AGMCORE_imagefile closefile (AGMCORE_imagefile) deletefile }{ currentdict imageormask }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget /CSA get map_csa overprint_plate not{ knockout_unitsq }if }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_image_samples imageormask_sys }{ nulldevice currentdict imageormask_sys }ifelse }ifelse }ifelse }{ level2{ imageormask }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin currentcolorspace dup 1 /DeviceGray put dup 3 [ currentcolorspace 3 get { exch 4 mul 4 getinterval {} forall AGMCORE_get_ink_data 255 div 1 exch sub } /exec cvx ] cvx put setcolorspace currentdict Operator /imagemask eq{ AGMCORE_&imagemask }{ AGMCORE_&image }ifelse end end }def /add_csa { Adobe_AGM_Core begin /AGMCORE_CSA_cache xput end }def /map_csa { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get }if }def /add_csd { Adobe_AGM_Core begin /AGMCORE_CSD_cache xput end }def /get_csd { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get }if }def /add_pattern { Adobe_AGM_Core begin /AGMCORE_pattern_cache xput end }def /get_pattern { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get }if }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ false op [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/Intent known{ currentcolorrendering/Intent get }{ null }ifelse Intent ne{ false Intent AGMCORE_CRD_cache { exch pop begin dup Intent eq{ currentdict setcolorrendering_opt end exch pop true exch exit }if end } forall pop not{ systemdict /findcolorrendering known{ Intent findcolorrendering pop /ColorRendering findresource dup length dict copy setcolorrendering_opt }if }if }if } def /add_crd { AGMCORE_CRD_cache 3 1 roll put }def /set_crd { AGMCORE_host_sep not level2 and{ currentdict/CRD known{ AGMCORE_CRD_cache CRD get dup null ne{ setcolorrendering_opt }{ pop }ifelse }{ currentdict/Intent known{ updatecolorrendering }if }ifelse }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def /NComponents 1 def /ImageType 1 def /Decode [0 1 def] /SkipImageProc {false} def currentdict end }if dup begin /HostSepColorImage false def currentdict/Decode known not{ /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] def }if currentdict/Operator known not{ /Operator /image def }if end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cpaint_gcomp { AGM_preserve_spots{ gsave nulldevice }if }def /cpaint_gsep { AGM_preserve_spots{ grestore currentoverprint Adobe_AGM_Core/AGMCORE_ovp xddf }{ gsave nulldevice }ifelse }def /cpaint_gend { AGM_preserve_spots{ Adobe_AGM_Core/AGMCORE_ovp get setoverprint }{ grestore }ifelse newpath }def /AGMCORE_ctm_stack bdict /push_ctm { stack length size le{ stack dup length 2 mul array dup /stack exch def copy pop }if stack size 3 -1 roll put /size size 1 add def } /pop_ctm { /size size 1 sub def size 0 lt{ /size 0 def }if stack size get } /stack 1 array /size 0 edict def /save_ctm { matrix currentmatrix AGMCORE_ctm_stack begin push_ctm end }def /restore_ctm { AGMCORE_ctm_stack begin pop_ctm end setmatrix }def /path_rez { dup 0 ne{ AGMCORE_deviceDPI exch div dup 1 lt{ pop 1 }if setflat }{ pop }ifelse }def end systemdict /setpacking known { setpacking } if %%EndResource %%EndProlog %%BeginSetup Adobe_AGM_Core/AGMCORE_err_strings 3 dict dup begin /AGMCORE_bad_environ (Die Voraussetzungen sind fŸr den Auftrag nicht erfŸllt, da mindestens PostScript Level ^\tund PostScript-Version ^ erforderlich sind. Stellen Sie sicher, da§ die PPD korrekt ist bzw. da§ das gewŸnschte PostScript-Level vom Drucker unterstŸtzt wird. ) def /AGMCORE_color_space_onhost_seps (Dieser Auftrag verfŸgt Ÿber Inhalt, der nicht mit Host-Methoden separiert werden kann. ) def /AGMCORE_invalid_color_space (Dieser Auftrag besitzt einen ungŸltigen Farbraum. ) def end put 2 2010 true Adobe_AGM_Core/doc_setup get exec %%EndSetup %%Page: name:1 1 %%EndPageComments %%BeginPageSetup Adobe_AGM_Core/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf mark /0 [/DeviceGray] add_csa /CSA /0 /1 [/DeviceCMYK] add_csa /CSA /1 /2 [/DeviceRGB] add_csa /CSA /2 cleartomark 800 path_rez 1 -1 scale 0 -233.192 translate gsave [1 0 0 1 0 0 ] concat gsave 0 0 mo 0 233.192 ln 158.793 233.192 ln 158.793 0 ln clp 1.50117 lw 1 lc 1 lj 4 ml [] 0 dsh true sadj 157.163 167.28 mo 157.163 166.569 ln 155.768 166.569 ln 154.605 167.483 ln 154.605 166.976 ln 153.211 166.976 ln 153.211 163.114 ln 152.049 163.114 ln 152.049 159.556 ln 151.351 159.556 ln 151.351 158.845 ln 150.188 158.845 ln 150.188 163.317 ln 148.563 163.317 ln 148.563 166.772 ln 146.819 166.772 ln 146.819 165.704 ln 145.891 166.112 ln 144.613 166.671 ln 143.683 166.671 ln 143.683 168.296 ln 141.824 168.296 ln 141.824 166.976 ln 141.824 164.942 ln 141.824 162.503 ln 140.43 162.503 ln 140.43 161.487 ln 139.034 161.487 ln 139.034 156.913 ln 137.64 156.913 ln 137.64 161.487 ln 136.943 161.792 ln 136.943 167.128 ln 135.666 167.128 ln 134.388 167.688 ln 132.992 167.688 ln 131.83 167.179 ln 129.739 167.179 ln 129.739 165.96 ln 128.343 165.96 ln 128.343 167.89 ln 127.182 167.89 ln 127.182 169.212 ln 126.249 169.212 ln 126.249 170.075 ln 124.162 170.075 ln 124.166 170.077 ln 124.166 169.517 ln 123.232 169.517 ln 123.232 162.2 ln 122.304 162.2 ln 122.304 157.22 ln 121.722 156.966 ln 121.722 153.663 ln 120.676 153.663 ln 120.676 161.489 ln 119.745 161.489 ln 119.745 169.417 ln 118.818 169.417 ln 118.818 170.077 ln 117.659 170.077 ln 117.659 169.417 ln 116.725 169.417 ln 116.725 165.249 ln 116.028 165.249 ln 116.028 160.37 ln 115.331 160.37 ln 115.331 144.925 ln 114.866 144.925 ln 114.866 137.712 ln 113.704 137.712 ln 113.704 147.565 ln 112.774 147.565 ln 112.774 167.587 ln 112.076 167.892 ln 112.076 169.417 ln 111.149 169.417 ln 111.149 167.993 ln 110.683 167.993 ln 110.683 165.351 ln 109.521 165.351 ln 109.521 163.724 ln 108.59 163.724 ln 108.59 166.774 ln 107.895 166.774 ln 107.895 167.587 ln 106.965 167.587 ln 106.965 166.062 ln 105.803 166.062 ln 105.803 167.79 ln 104.176 167.79 ln 104.176 169.517 ln 102.782 169.517 ln 102.782 164.843 ln 102.199 164.589 ln 102.199 159.558 ln 100.459 159.558 ln 100.459 163.724 ln 99.2949 164.233 ln 99.2949 170.077 ln 98.6006 170.077 ln 98.6006 152.546 ln 98.6006 144.313 ln 97.9014 144.313 ln 97.9014 134.257 ln 97.2041 134.257 ln 97.2041 142.79 ln 96.2734 142.79 ln 96.2734 160.573 ln 95.5771 160.573 ln 95.5771 161.489 ln 94.8799 161.489 ln 94.8799 166.163 ln 94.8799 168.806 ln 93.9492 168.806 ln 93.9492 166.265 ln 92.7881 166.265 ln 92.7881 162.403 ln 92.7881 154.476 ln 91.3936 154.476 ln 91.3936 144.009 ln 90.8125 143.755 ln 90.8125 150.411 ln 89.0693 150.411 ln 89.0693 154.577 ln 89.0693 162.302 ln 88.3711 162.302 ln 88.3711 164.538 ln 87.4424 164.944 ln 87.4424 168.907 ln 87.4424 170.077 ln 86.2842 170.077 ln 86.2842 164.437 ln 85.584 164.437 ln 85.584 154.374 ln 85.584 149.192 ln 84.8857 149.192 ln 84.8857 161.388 ln 83.7256 161.388 ln 83.7256 167.892 ln 83.0293 168.198 ln 83.0293 166.876 ln 81.4014 166.876 ln 81.4014 167.688 ln 80.4717 167.688 ln 80.4717 169.517 ln 79.7749 169.517 ln 79.7749 167.587 ln 78.8438 167.587 ln 78.8438 165.858 ln 77.6831 165.858 ln 77.6831 166.774 ln 77.332 166.62 ln 77.332 168.095 ln 76.3452 168.526 ln 76.3452 169.62 ln 75.2139 170.114 ln 75.2139 168.399 ln 73.731 168.399 ln 73.731 167.181 ln 73.0322 167.181 ln 73.0322 165.554 ln 71.6396 165.554 ln 71.6396 163.927 ln 70.9414 163.927 ln 70.9414 161.286 ln 69.7803 161.286 ln 69.7803 155.392 ln 68.6187 155.392 ln 68.6187 163.114 ln 67.4565 163.114 ln 67.4565 165.554 ln 66.5278 165.96 ln 66.5278 169.009 ln 65.8306 169.009 ln 65.8306 170.077 ln 64.9038 170.077 ln 64.9038 164.03 ln 64.2036 163.724 ln 64.2036 157.526 ln 63.042 157.526 ln 63.042 150.919 ln 62.3428 150.919 ln 62.3428 133.878 ln 61.1821 133.878 ln 61.1821 148.073 ln 60.4834 148.073 ln 60.4834 158.847 ln 59.5542 158.847 ln 59.5542 159.659 ln 58.625 159.659 ln 58.625 164.132 ln 57.231 164.132 ln 57.231 169.517 ln 57.231 170.077 ln 56.0708 170.077 ln 56.0708 169.112 ln 54.9062 169.112 ln 54.9062 168.298 ln 53.7451 168.298 ln 53.7451 166.265 ln 52.1187 166.265 ln 52.1187 156.204 ln 50.9556 156.204 ln 50.9556 143.603 ln 49.5615 143.603 ln 49.5615 154.272 ln 48.6318 154.272 ln 48.6318 152.444 ln 47.4707 152.444 ln 47.4707 143.196 ln 46.8877 142.942 ln 46.8877 137.028 ln 45.8438 137.028 ln 45.8438 145.229 ln 44.6816 145.229 ln 44.6816 154.577 ln 43.752 154.577 ln 43.752 161.185 ln 42.8228 161.185 ln 42.8228 167.079 ln 42.3564 167.079 ln 42.3564 164.741 ln 40.9619 164.741 ln 40.9619 167.79 ln 39.335 167.79 ln 39.335 165.96 ln 38.1738 165.96 ln 38.1738 169.417 ln 36.7793 169.417 ln 36.7793 167.079 ln 35.3853 167.079 ln 35.3853 167.993 ln 34.2231 167.993 ln 34.2231 169.417 ln 33.0615 169.417 ln 33.0615 170.077 ln 31.6699 170.077 ln 31.6699 168.298 ln 30.04 168.298 ln 30.04 170.077 ln 27.9517 170.077 ln 27.9517 169.313 ln 26.7866 169.313 ln 26.7866 170.077 ln 24.6982 170.077 ln 24.6982 169.212 ln 23.7646 169.212 ln 23.7646 167.892 ln 22.604 167.892 ln 22.604 165.96 ln 21.209 165.96 ln 21.209 167.181 ln false op 0.8 0 1 0 cmyk s 20.0093 184.339 mo 26.7466 184.339 ln 35.752 209.991 ln 35.8896 209.991 ln 44.8267 184.339 ln 51.6328 184.339 ln 51.6328 232.784 ln 44.6206 232.784 ln 44.6206 203.323 ln 44.4829 203.323 ln 37.5396 224.144 ln 34.0337 224.144 ln 27.1587 203.323 ln 27.021 203.323 ln 27.021 232.784 ln 20.0093 232.784 ln 20.0093 184.339 ln 0 0 0 1 cmyk f 81.5381 221.897 mo 81.5381 228.226 76.4512 233.192 70.1953 233.192 cv 63.939 233.192 58.8516 228.226 58.8516 221.897 cv 58.8516 184.339 ln 65.8643 184.339 ln 65.8643 221.218 ln 65.8643 224.62 67.7202 226.253 70.1953 226.253 cv 72.6694 226.253 74.5259 224.62 74.5259 221.218 cv 74.5259 184.339 ln 81.5381 184.339 ln 81.5381 221.897 ln f 88.4824 184.339 mo 95.2188 184.339 ln 105.806 213.528 ln 105.943 213.528 ln 105.943 184.339 ln 112.956 184.339 ln 112.956 232.784 ln 106.356 232.784 ln 95.6309 203.663 ln 95.4941 203.663 ln 95.4941 232.784 ln 88.4824 232.784 ln 88.4824 184.339 ln f 120.104 184.339 mo 127.117 184.339 ln 127.117 232.784 ln 120.104 232.784 ln 120.104 184.339 ln f 134.267 184.339 mo 141.005 184.339 ln 151.591 213.528 ln 151.729 213.528 ln 151.729 184.339 ln 158.741 184.339 ln 158.741 232.784 ln 152.141 232.784 ln 141.416 203.663 ln 141.278 203.663 ln 141.278 232.784 ln 134.267 232.784 ln 134.267 184.339 ln f 20.665 186.084 mo 20.665 137.013 ln s 20.665 85.73 mo 20.665 0.750488 ln 158.042 0.750488 ln 158.042 186.419 ln s 158.439 6.28955 mo 156.007 9.93408 149.9 9.95361 149.9 9.95361 cv 151.478 5.99219 ln 143.451 7.99805 135.269 16.4839 135.269 16.4839 cv 135.253 11.5103 ln 124.443 19.7241 ln 126.627 13.624 ln 122.312 16.5127 ln 117.066 19.623 111.115 20.8755 111.115 20.8755 cv 102.108 21.4355 89.2393 32.2954 89.2393 32.2954 cv 90.8037 28.2671 89.6787 19.9644 89.6787 19.9644 cv 81.7539 35.4751 66.6562 42.4546 64.4922 43.3345 cv 62.3242 44.2144 50.9448 49.4219 40.6069 58.8701 cv 30.2759 68.311 26.9932 84.0996 26.9932 84.0996 cv 26.166 87.0615 18.4712 92.0356 14.9258 96.6807 cv 13.3037 98.8003 4.20166 110.166 1.02344 124.069 cv -1.66748 135.872 1.74268 147.259 1.74268 147.259 cv 1.74268 147.259 2.34082 151.571 5.6123 143.87 cv 6.97461 143.597 ln 6.97461 143.597 5.31104 147.194 6.33398 146.843 cv 7.35547 146.495 13.23 140.161 18.041 134.808 cv 22.8545 129.448 39.2515 116.277 54.019 115.323 cv 54.019 115.323 64.042 111.539 71.4673 117.349 cv 71.4673 117.349 76.3628 123.407 83.9307 122.653 cv 83.9307 122.653 84.8184 122.405 87.2373 124.046 cv 87.0957 120.886 ln 87.0957 120.886 95.7861 125.985 104.906 122.38 cv 103.306 120.114 ln 103.306 120.114 104.945 117.7 109.778 120.974 cv 110.065 118.819 ln 110.065 118.819 118.653 123.396 123.064 123.247 cv 121.854 119.364 ln 121.854 119.364 130.949 118.089 139.959 117.532 cv 139.959 117.532 151.181 115.111 158.587 123.294 cv 158.439 6.28955 ln f grestore grestore Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer Adobe_AGM_Core/page_trailer get exec %%Trailer Adobe_AGM_Core/doc_trailer get exec %%EOF gsave userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse grestore showpage %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 9.0 %%For: (Walter Biering) (Walter Biering GmbH) %%Title: (Logo_Munin.eps) %%CreationDate: 04.05.2004 15:01 Uhr %AI9_DataStream %Gb"-6CNCf4E@CSil9CdlMNGJghSL5Y3ZLF,P$Y8i7qeu>47!oDFq6Iq/$aMrVgGfAY@$?(5ZOAm_oKj(/m6UZ.u?TdJ4.+-nY713 %I/NQolh;L8\bPt"rH(!ehH8rb-Bt'hIe9E8kP_T&^KWX9BChX7D3`FFEP)%jA/B%QbE),+gu!SUr2WU8hq`bUh>ZHja%tUkFLV;! %gCLoG]tM&TprD40h:m.'kaHtnjkF_BhVWcfht-B]Vu"n=GMguL^UsHW49,0;J)(%sme6P448[e(T7rgrZb*b3qgZ"#s7#X;rkkYC %?b`d-eN_C'5@Y3`N1\q@rT:Q^&o0;4g$E?qG@/)]r9Q:-NrqbI>hnjcl*jYE748\F< %qn(VKO.YjtIboc7KK0tJDn`8^YLrIRus?U+P!?bQF+]A*2% %:OfnQn@sEM)qPCjGCF]3mFsZU,[s('m=mb>ImObMX5>Co[C@G#; %5CIVM))g"#(KcNdmdeSOqSefuS%!mYrR>0CbAV;`r6r^dM;s%pCcZX_@po2IV,+/8pYMO_Tqru_AmlpdDNNJ`jZO=#rE/+DloD/L\WVX(_%d6X?3CE$/&"h^.h68uo?)IY[f:V0ms$co_T35g.mb/2Y %,Ha4X^&N9bN];BqtLX!9n13ueCT-EQ51D-J,TB4gJ?;10:tGYkJ+.;XH$ldq9t\b?/=Fd5BXa#PI4J<%VH1Hq<]h! %f!e[BJO[ELFu!rZnY,ilOL:_KIf/NdDf.f;a2e%KT1o1mi;E$&lfm<(^RMCLFhUW&nN'qPCNjX!c1QI,IYM>DV10=)/p#X`cjlQL4iq!#Q>is4O))&n(^N>fc\hocFrd'(%^YJ;P(]3fPg#me;a*lV;^"_;Tg!:Jd(KVE>(]0,KMt;jI %OY>-O]Ef>Q_Hke%F"s:oT3n-rT'suYcHiE[Eh:V+GruW#rnO(!F)sO3lZ,uXbJ%5Go2815WPfF,0`:S03/?g='e[Bf>_M\tP`S6>0neJ;$T=AEUosZ] %^[ul&iQlrBfd@kinD66F^%&G@G$"+[mG3IXGK"-[>]dgX\p`r+N194B]sHZahtqk0iV@KfM*2AI8$361VY2NIq]j_SOc+^dX7ag3iTkeRGT"(>q.7)&OincX4BrQuZb"#9.iu>QI@B(YRo_doQ2[eAr-)'c$)*N:<(TKWUuJ,3 %N6=gSY3fK9LooaV=0`GhH-)>qS6'a;Y@QgrId^O`:mK]a9a[.DV+RLTV,\=1-!HY#G[:3W&i*YtR]hArTffLmF'gBZp[[fP35fdFK+?tU6=oe9"qJZ)OkOn:%sp] %a%GB5V=j$I@]G+]ZJtCsR4C(tPpuLN*+EIl\MB*7au&gWH!HX#o=6Ui>FCAPbU$::P:Nt"Y?Y^I\^/h%ou11HOhG^4APJl(W)Qo" %W@[A0ZEDB.e^s]/Z85_&]TYN__bO1hL0r7$W1Z[:Bk %0=jL]f0oYOh"@#b+g1-Pe>FncBmPg9[&#o[cV^=C[&<.KlI2'm1d+?WgSFRLY0X:R/;a6_`.1-*?EnW:dBj7?Z/h%6qeq+-]\FQB*("dE^K(of%2&4E0Zu?PEH[q7q.G^nmLMFAV(f+1MgY9_t6, %i**H>,fHUdo+r-7Sfp'V7VU_lNld1![-WFsFBgDIr6HT&q>OP/@J@jd+2=\.)E`7]g;.+FYkE_&_-Y2(p98T2GkDYmnk3,`7D,'q %auV-6eaubjBb@PGQa0AEGW!1!F]u_al(tK1@[s#\nNADBV7+kQX[;/1Tl28j>Q:\>P"/#?W;i8uB_L!KUYe8bm,C+j42oQ(0dTGU %gi[_G(%j@!GZB0ca&`El/RmV`Yu]A8%09[XHsrRYC#SrEa>5FE#\"hhG*\[nq+iUV;EI;s]7&mh[(+[,1sFCKPe%sojuQla\n*_RlXL\.gkdY[334m]Fq %@bN"?il.plisZVh$&*]6#CIPcJEH-Q?;Q_0r)(O_s7XprDn^\tjdTI>i9mcAk6,KLqU$#n='T$Fj'!Cb%XMo^.%m/@D*2*Q4Bk3oV`;de/)lLFAi>i=WBELe^`d:9aUPH8B[HV^FJfd1NZ/!X_dGTfkelJGpYpR[=?])$3,mU^2bgO4BXo/m>s6O'WWXY=X6"5O,gBFA7Pje6S-.ZIq66-N-#j9n"4D3=>j<;\!K5-9Y9 %1TC+U4N1>'@1uHAC*GkdU5lDId@X*!G!aG.:8g>\<$=PaFJq`^.LF^c$KX,pQ(V00@L9'r"fdo^@"Kg7N)?6ZJt;F!MO"XOl4:f9\I'a8._e^4[\;US-&.j_kC1fMgs5s$CkPVc?lpj%j+$u.7@WhcZ#c#Z %<-u(hhd[uge:"5lq'A[ir%pf[S6?an#mhkQON^!W$&L2Yc@D;"TkkFtB$luT\r@u)VemC+0\p=Yp5,>bS'5\k))oVsgM-Q0d<8"6 %(N!5Y9PfoT9bH&6j)m`5CnGFRiLI#,D(g.Be^V8diC4r:c/j6re6NX^?%CDUmt%5,)n+ZuSInB936gC99YPt0rIFb]CYYNnomoZeYNM`89DbX\.k,r1^@f`goiRV6n'T>b29ZWfWU+gTC>@l4iER^:pmfL:9j %-b/L9BIbr!YlQ=+#.=-58"#o3Ie[mZiQI#&\"CB[qr&JJ4Y7eDHm.XM[WO7U/h5V!gpFrNjonBsfiab%2Jh3T-ss]a)%c:Ig,9$7 %bHGi2^+o8UT`/95GRXcNWsSq0F(HF#ZM'/n`GKFF@dM.VMJ3?j:pG*era@=MTgb:O\L,m),28_&igO+@YB.B0ptG%VWE5XOM.G6k %%URY=2Pg',o^[A5]cp_qijW/qYJSo%?5IqTot&Z=MQc>;U[XbUdjD%'8Uef,8cEi2aeA"PpPm>L.G)8kd^ADEZZl[)M%C)bW*<\S`GE0"aDZ=#_PkK`-Ml7F<&K %c\0Pp^k/pg;)BK5-^#!.+3=EbC)WEeJR'MrT90c=#uTG%*scO&:FNjjj9NI4J0tn0\ABMU)0l=(#N--.+b3'Z>"5)[6p*tG6/:H4 %B!)k&L!fR:b$SWB+0>LuhW;(rC:slFYZacW=J'3igCWEiOpoiG?QjJYou]p"7.5!e>RJgjRo8=(PmpI.#C]ij'_+6n1F(^*q:BnnffX0:<97[s,TK\?8@cYoTn_f %;^k#rRU.b7&l<.ca](m"abeO]F:TqEn?EZ_X6T>nCD'qMnF`Hjr5!oqLE3i7`Y^lRg\?SX%;*hK'@D9;XH4BbZ#Op6X4+p8gL'8[ %frYP777cig+EctV]VE`M^=,cfCNnP7470C`$DkNT%?9V(@p4+N$]pJ^R2.'s_IQd9Md<9?"O"/kR>]?sfc+O^L<[*@))TK0^]Oe1 %N6t0X$)+nSN'V&Z==$*DZu)"c&2k_L6JQmnN5jliOWuV/KT8T/Djfr$1qdn71J^buf%Je+a\(7QPg**_jKPsk&lH;,SmNhQh_^D) %=>#_.,+TE`Nn?&)Ih#FVS1P?7Oo"!h,a:Zqq`UE1_g'USQ-`[S`BN^C1H-gE)$-Y\=AB,K(;XT@-VFObSX@aB8goul2PlkC$O;ALR6E<0c)9'rN(3m+$M^:P@NdJcfVj;V5cIZi0\g)g2&52t.H230lSEj2Mb'[2WUeO4r9JPr?2Xu.N %890P8Uk20.oMf"d3Wa`/f3YX=SGoF.=733ol9/>@S!7ef4qB'25LXp6SY!+!ZCbr::o4[8b)rc:Q@u`L-tl,=%Y*C>1hC]Z+3:3/nf9&UC3Jq4@d"0/i@Unk*J63d%VSVp,eDB.i:,B %*-54'O(:PBH74L*;,R>9Gai?A%'@G-QeBiK8/L"*(7I.7Ss'hB[do-Lnb0ncTtq3s?E5?G7sM"o,nW"S#i,_"!BjpAU,07j$@8KS %\HXOOWGi4gkKk?uha9H*.-*JQ_!uRY"E0'7(/6t=J=BbPIh8t.K?#`:_88EX,uYd;?I!p5DH`C)1o;q/oFbN",.fCRfK":Z`?j,a %n$,oSEbp,Pqtn!$++O<)pTpKC=/3O4rOUT7nA!C*n.sDWe\N'#=420ikp>V[oR).7M0^I2^Rni,?:jTKR9lUo8aeg1SlW#tNOdY. %\Gd?]L0N$\%T^[Thmmc.os6'K(/Q8P$sWJu\1mp>I/*4)rq>[62[l^^B*EU`TCuGQmBqDs$fm5;Si?MI%Y'9q7\l//4WJqBqX;nl %b=-6]>ZZEX%XZCaCZ2qX_Ki>=o3Mgf]b\n?3O.R(ZI@]@[/a97X62Y.3iUcf$XU$eo,`2U72EL^nIAp,kP`q3c[/!lV?a8&4+&0I %q,jZP1Ts#YL]8+SiG1.F?YqLpCJDb!RYWUFCd(3+IZ-GN8A*r'/(sj^ejS:!N-NXo%r!nKhY!5YX.LQ,Cd%XhY>m3)&9#MqGqE@' %>eX7Lr9m_K'$Xm`Q+@s)*isS=21):cjk035j\)U)GuFI]Z0?bq)OS_+Jt6m#+U8#7CL=e(a.Ji^lS"4W5HD[DPiMcYG5)0n?sYqm %ZZPu,3;\J)1L]"CcE*P+9*)@QD6]@CcdkYJ^`g=X_icUE-=Qed"YBn'S"Saa3P93bW._0,`%;Yafms.3DqaMc3$E;aSZ+7dF"3quFkO\3O9JSoY&` %?f6f^"upO/7N7VDYX>2-7$:f^/>g$3S\#BV(b?KXAq`TErUEF8NQ?pr6phqbhg\=!`0'?sBfJd+[d:F1nh@2)[s\ZQ:EXrkDJ-jm %P))\Nfd2\bF4^^A+`S),))73Z[Hqpe6q8[c=8h+aW>JR`qZM%8:S0>"A3hk&B/!fo?r&Jt&A0>-68Sc*oE`tY\oH-]#%Hpi34;Au %5Wko$otX0.$OVJdj[MQT&LdeoWFTOK3jM1G%&^TA/b,>>(R:N_"GKFi`*$u;WcW>o79`7Hi],%5n:do&.@!Jn,Zs[WWD0-I4k7+0 %[f!OF-Or%?dp7.,gi3).Kp6:tT[rj\[I42T^SUAmnp7;lIOqVON_@]&2:N67J=8&!qUGWFl@=>+5ef@QIkYs9?`p[.AaP@BK$.s)oRkaedEXCi]nTCS@*H68("ZWB%qjq(,=dMfnegU@B5_nV@[)#^Z;MkiHB)r`^1bq6q.I$\#W/jd-LMrW,?u?T\bqV*a78 %&TckhK+@fUP>Y3=ktgASkOA*kn8np(YV+WO\&68Q9\h-ZEB%MT%gVCl#O1jck_s0;<5pjW1E;e2*L28nS9,N<_Q)O^.tjPdFeL1H %lo?DjME;K*F7CD"E_qVOZS^_s*j94Bd&A<*m?RJ=&j!d\cS1d^(_\pPA2!&X26u@J%lTinXCid"0cp6I_94]E-$9QJA*)rSp#uS_ %lBi7ZO:nt'7\M"`/R5i%#]EY\C"fA>Ju8fG:7Jh`e@/+6b\R'^K,.gp9;Pg?ECST7@Ql$5Qu6",&1A+FH8eVBInR+*&D3.&H9h(Oh3^o1+< %3mfEREJpRj?8Ue_IlY2Ybhm]5?8gq!>u!$lo2gX?e'0VcT66Ld5/5YSk^K`(o`Pni*_X!(A^dQ6p\hVnAa^^#rCn:7)lLGFX2Eie %pp\MShj11TNG$"+l7d&dLhdG*^YGIpbHp(qC6>C4iG[QBDg6D;^Q!!,UB:[u_#@IC&PDc;]V,KlfTK46MF2>J6"T3J:I+l$NX61X %n?K!&p!57AXqs/'lOaZd>;jN2iRi^X#5qrQB;of%D5hFgg1T%.)*WFSeU`@kC&98AGK9"u4,2)2\N8?K`$_DemIVkPbO,5-G(N_D %W-CC)SB-@)@l5F;kYJK&ca%;`=nT_f+p-'R_Ra2#c:;&4I&9n*EL^^bGck$km!Hqo3QHN9rbSXSkuL2kjErI%4*&2c$DTc'#mdd$`T8u+fF.OeLn2/@1CdZAD3eX;f9S>lIo:kMu]%SmTTEj\l'Q4Do>Mg2e(LCUi*U^X_4W;=qBHo2AiiY0jUeY;Y=Mk2uen[9?a\Q5I9SRk5S %O#,3K.TkhQnNi4.FF&VLla.f6nTqPql1&Y`mV'qqYD5m-3fkBO@",m>n%m;%gcIE/PCOAuF+D0(L;T]+CeTg!Oi=KeZs&;65/1ifPpSY;dd'boEbMF#gm6k*u"cH54-=osu"rj/SJU32L'\P#D, %5AEm=KAP-k,fY@k*Gh]rZSbfg;2`<%g).cmef8VQq$)1UiIPJl*+*PRntQ[NZA5OQVG9p,3Z.:q:*SEg3Baln1SF@35gBJn02<&3 %4<[I@g'Z6gl[7a(fY$qFRe54Tc"hCkg/$0DNJ_D@eV:#L[P48dcs:qIBpV:J*:'!OI*S:_H(g^^'i*U)Z6-_gJ*J"2>gQtiSA%l( %2P'j+eRtC5kKUR6LtRKWrmo3n-M7Ot:-$SYq,NdMV7:g$_/%St)`e4"SlfJc8+V4MmjD"b+3EoFtSm$F9fiF4WN:.gMoL0#TJ;&_*SVDhkB#0a'Q@.'(Z0_8to>So0FHo\;\QlllY30DPq4UPGSjeefXj\0F' %<%aM&XI"la"Cp*VP4=MSG"jV-h[$/9]juL8biD04./?W(AGB:)4^D8hqg&8R3#q`i$ia$ql%>D'%qisIR#Lo=Ec=3D4IcAPq'LK*4JnlL!D_"Lc[gQBR<[Y?^h-m9-`/\+UumGk*iQIc2A;)]A",$'.s*:9_jGVGb8fPT,oi55Eq/t %5Us`omHGG9F"6Kl("SemgCnAg%!JlF>#j=&KKJ@![@P\kO>/kHB6Nn"VV1sah^KnE_CI1I#bXJV^P?o3OiMYHq8_5QONS3Pg#/oP8`<^X2O&O0(BgP4@WgoeW1FD!jlg\W<]iGZ*2^%hmnpDWUSu %G4;ZPAG3'>&T]be5O/8`R[uOWi\+k'`5CSItI%qtYBl<<:I+QV=:"amFSI;Srq->?IME8IB(i\.QW7)T1aM`HF7i^q98d_&OY&.6Y7#!23e)VMff-BfF1jO$HLmgh2n?N: %Vkqjh1[_fTigpsKc^V2cB_[uVRuc3K_@Qh*)0m8D$%7noGD(A'fb+cG4BT+tkP6ee'o-:of.:fMEng-3Q.8U"UUi!SO+!XL#('l; %\f\7;&(^K1)BLS)D]7Sq[JE0_n/JN_Q0%s8RtE>J9p>JEG)nAhs7>XTJ%%W?mI%$!^]3?K:]L6SBaq(0edP>b9UEh6cWFGn,P2gYQd!rXf31V8a5=T[`:(d9AF0@L7BhLFY\=SF4Ub7_TA*@+t^\u-l&&7u5rkmpn+23$lVSh]u&(<2G %KtfVDbHKcOrd=V-6Ugb@s8;HP5ORBW\_[4q[^rTn^4bihh*pt.OSM+`N*gOo#.MI^qj0P+mJgC?rSJ@ba.;,dI.qRZCYjK!n:17V %rMT=006c(-9tf#IgDr2^)4lJm&(ojEC"lQYG=>GkoC\/*VHLoLc;NNq0Eit">\s7>]pCk(ZB<$i:2+0MBRN=T(15J %["=d7CF>B"aqH3rBDi1SnM1-hB]]Yg?Y70^Dg[FGlTJ=#;]8*,SI %(%<#Bg>O!kcQ?a'7j&>M_%":^I%\LN38B7)qP:d:NDCT60pAJ]*_5"fHX;Z@9rC,')U!rk,2CA4X=gZunDOg8o4kji3Xd5N[sII= %!h1T1aK#l&s,i(?j'fl`&pPc3Xq^\IFH^+#W.bO8Go#>Q\I`apTUlEO?&dN5@PXW7_^'Ei:l`5;YO!H4D=Q&Tfa];8,QL)>A>,?c\tk$ %!s#a$!`_KYD'%sm$?QSkl>QH8?Q46NJ$?&cQ*,pWm9Be)UQ1,!]7R@`?-s+ijOXrrLVSr\,O@U+X5`FeO>Ogn,(EA$ZW0T>TanJ* %8!Tin2SjLg8=u)V2X;o[>h)@D1VQj2Pt?g5kpc\u`++l+W!d7l1&d2-q6^KY_=9m0SD?\P.>r\K_81(QdfdCe'ZB,:M]S%$4$+Z. %'H"ci8=tNt;NW@#So3gTk2\,CT[rkm[NT)6=C02eSdj)VR)f%GT\.VCBM-DfP2r'ss%Ib?QBtEi.J8,=582n1>pbIHj %aS=.kS1=YBGE:./bOf).0jDa$!@krjkWIIZ!*8$)%/kojM"Q1QrXdAd#C*#em\TeQF"ItVH3dSH3n1:,0;Cb\5ig=AS35iZ"a'?o$*Ddp)KZ^9uHkm`ohr?:0c7"EW0iLTRcB^WS>,BcZjQjIB=`SLe2G%#AQL3+1NS %0h5E8H:OSo2pciH%FGJ)lVgqI7%T?JhUPB2[6nqp\oOh+nr"L2JqUH)fJ(7(jGa4oGJl7-n"ZB+W+;:dBTm>5JoeqUmq?b+i*SLf-c"]hH"q+?1Ck-p#reRGo]2p %n=3X'9&J`f"`dps0M;5:ZB'@CX"4o2TSdDZiWX%r;\k;`m*%cu]JnR$FR6oK_FsR18N;Ou+S(j1rf^/Z]=Ah'c,KS*0%C %Z4mX#'a(-N@&9%;ik:>U..((o#+,P]o@-'em$UYj\;g+&'pZKcV::*3hDd$Q5Tsf\n%b:kGPXK1CNZ@Kd3%;QS)ETkW*AB %(o[pY7Ct\t#\/Of]K(KZ+6t+^Z.^R(SX1U=M)OC_u&`9p:0K[X;UeMRg;ssLDH[_$s[1%\t^n(0rBA81/4abRD7V"_u %e&G13/A=Wgr`%Y!5CEgR(8jc %b>$l&CqoJ3IYV*s496cPJqH4ART;]NXa:Dn:ce9G'Q?Z3FGPgod\4BFhqW?jqsM8p`.QFgZr[bod1;rrKP8\p\(^@.LC`E0b$2!^ %eLj%l]o1U8nEEgHS)o439gSZq%[1gRo'LJ)rEKaU==nj[f1(%d*FBTX0Ds6Hmu30=)($Q!\D3504c\tN4t633*bEd[ih^LhZ.4DZ %T)!g+n7hjQbl-:.H.tH1R(bo]f7V6s>?&%@*(CLODX_fCrFjp[]'jMIS4\lloqtT(n)&VCqk91Hp,i,H8`26to^+sUp[g-2K*.>J %]0#k3\$eu20a_`2TWO,UY[s`0?L`.oF4^9G]A]<)Xl5g':1Tr]U[.o1USn+X\lYr*o7u;j%Y+Aq1ctt.If6PNZMWqYVq^s\6S)@?5lNZQQeX2U%8l>7Ou@(tL^;Y&r)WiDU[8g,s-5HQbMf)@h=!T1 %+;r>uEaWm[6/4p;,Y?IQP1ufKs2_+l*L#^q^_p\MKD4D)h7E?Dd0-N6@#kBZ[DD&E"KN>tT.KLoB:LX52^DN]ho(&r4E=?1-"/r7!DGI'$mD7(VF^##A*t-9I"KGYk$uFVHn#Tm)]W]JdA$K$"$VFWtdb3Qe0[^/rMqDQsgfn.>=BNSJ&Mp[sC/Z:tAbU\7eR>IT]nIjE"B.A=pqhc'a$!eUKWo\gVE\"8m?B/&ZktUWY(FkBa %<7bLpUYPTNV(hoJ(W]ua8cW+&+)]c!Jc7D*a\Tj8H>^o`Y.34N<$E)WT)^hL %a8)XZQg`g[IfJrUgJ<=QrNq0*lp/.b*9&?Xs%sN%])K;`?X0,9HhZX9C-QX1ktcJP>9!S!p&B!t5sS-Z[JYIl/UkSkO73ll?pnrh %1pT0QW8Q2taCjA*h7l]XBJIr`eoB(g>*u)0[FlWi'ndK1*!$GOngsp3;KeO:nF!,"$jH[PPK*4%>$d`&9iTb5RR7>rHOPUh,Tqsh %#Rn7Y+>i,Do7ULrG&oEtN"qgj*[-W"T&7E((R^`L9P*tYTBuR=T-=.;m.P)iJ".c?f/`=<:a2\k@.X*uKn()[p&M8q#[>*gob0\b %":QVF"BK^4Ak0X/Z[ksb393?52gf1d:tr@598VG^hH4iZ"N&K",s]7D#'H>N_0%fd"O)'SXf7=L/Q %phUZK@PRF:4S6eBn[E^),I,Is]W&34R,I(+UTAn&5SK<5''n:G:C#k3\^]L!faudQIQ#P3@#$_D!;,os#kTO:&[Vn$JY7(a6R#o, %%ig[^=[h*s%V@d7&=#cNTH]Vu%qQW4gK'GaLKJ.+@1,J"(2W5$r6>'A-n8;;PnatAX\7u!3NLZhOtf'FFi#q/ZjC&.;!La-81ParJO93d];26MD6,QS_EZLdU4PN-W3DnIHII/(g`YcXq,lci&!Rb)39$am,pC-c&D]lVA %jg726s#M0&T?WYV)At5d.X'CV$p4Q8ND1r5qrt9Q,i\lQ)cq[aroOJ'TsC>=%s2i)mLiE_2k$fo(`q1h6mSWG)TqR(%j_aUBc4"O==7o6A-DE %b?RU9>YPrA;l0%+NVmHCVLN9"P6XeuVkFU0D?Z:gArEB]Qt8:YnsGRdahrF.c,r1a$V-s?60L`=mEJfQ0tJ-<7&"\N5mgBJ?!k&V %]dO#ER("-d&Xj(`&HcKoX075r^M!)j6[Um$0/4A7O=KH:,mB^Z"e%,$LMX;7#s9=%'u91XCmKFA5h@R"\pD^QXun"3) %nMaf%Zb%It66*4"&/%eD[g$fuqDZ?V\uuJKXVL&I,310eIubTq0OsK],-&jZU-Sglh[P4=X %fPUbsO-L\1_g8a2P]LFs.-4j)i2%,MN>9]d7i@\<6JK/92UI,EZrK-Tq[Hlp_Zh"6"?o3m!EkKh"19PR6!p.:r69/W)3M'gaTTEZ %iB=]F)>AmtR-:i^[#MjR?AKe7(_+8??%VRQ1>Y9C#ePN*3*f4N9b[X`h$Ps0<4ViW<>jP.:'FATMYQ$^36e6X(6[LaMs,F*f-r3I %ZKP,;E+$0ET#Xh[Kqltr31XjuL?47_H>m8Gh<')>PljAlAs9WPFF,Z)7CMs1B5c&@JZ7Flp!)UOUKhRG+fmWGrc+FhG?(J/_qijuY6VDi8_1O%RIa7KA>.Kg&bM6a5mekP?pH0I#]I-or03Z:\-)fjcqHc.HV1AohB3:o %i4d=n9+aV_Z(&!Q"Sfr=8.g(%#+Zb4H#-#=*-uE1qq&$l8dclPNb9o*9oiU)*//GDpCCn`U3;6BYX!(?P#._6T3=V9;]CXK%G=8Y %^7-*=HEZ6fR>(@._:bi021n/IX9`:X8Y_j>5bX*(G:XVq_(Pu0UJ;Jd3"#pSb>K'jeF78DaL*-M %hE-*L,dmE_j0)?^TFQ@gT:*9m>M'[G7NN,j&HNQO;P%!qp/k-o!Y*NQfs8cF2P^[RZN?\U/E5bh]F#T9L.KfI,p$KG5`eCKe/'ekO\1KMb.-8` %@!)WbF<<6)Uf=F.';R(%jCeN*7%c-EHaeupGBH+[IfO'f(q%<2U?Zbd<%fok&[_\f+LT#7$8.b%":\;'XX+:f@4Er=1-,rElE(Cq %%9Z&.\sM('j,DiI'l0$-,K^Mj^L]4"ifWHLp*BRg',4eF9]_%7XToCF#Lp[#[8Z-\?JBRg4;1k`)e$8 %]OX9/8.A+2=J@<*P`mO@^;A_,'H$>iK@t[]97-ms)Ff%#7E7=18rp.j=;B#``)dKXSBE.o!j7rqgVgjNgM".;=%Hf/IYk7iqTjhs %iG7BGp#m;&3'1/o[=YG!j@46n5SM70da0jZZrC5'CV[Ej"hL^sd:"OVE\T(\/S>s#8VaEjFmFf.`RY#-F\5;C%=jIRd1m=C?,;]q %Lopd.[qM)k$BFLEG+K1LF8\iHef),O7Y`)m5I0G_lO5irk"M_5j@D]Qj?$O;nJ`;LH"$eF1!blVImpQb=OAP:(e4-Tp'-)"s=ffC[] %O<)Vu=Z>Ihb#Tq]PTFDPhbRM1Lq++79M:VPfFG/G"3SVdbShME69#+$'J<3?69#YS!uoBP:-9Ro(1c;VgEk!3:[(aZb!pU;B)JA5 %A^Mt[1qoZ"*E\1FN$o)2"-?nYfd_Ecr`l0K#UPK/1Wn;EK(Qq]A\eT_S6;S&JAaBp)5A`j)rqrTU>WY#bZpiXS[4F"(X]!/Gj1U8 %23a*k_B*8=crjf!*Qi!<1)_i)6:H_F7uW-sQ)-EuXUCX-=cF?>f"j,,lnC?'dsZeQ&R8r/HrQ=6XKo0U6rrf%_p2L0CBT3![Ni)0^!=VW,&7A- %SNt$$$LUPJ9."COeC#6V/6Hn9Rib9][Y3`q %,kWk'@Wcut09k_;TLQ;!A0U=&=pBP.(WG#9i%/d08o%[>[t2fDEEc4f1s_#0gbOs-Y#7.I*H$CGGWFI1'Z&I5A;uZ`'8830@9!H= %KJ,*i%3h@ZM$Z6RJA;^*6Snr70b=Fo-@H:6ksKbSb^??6Dj[1?s(!7`PCQ&i+;;/99!;nV5l/XG3rnT*YSTM-;T-#0HkS&eKN]'u %NO(]40#Pcl6TBajJ4RcRFe;[@p4>iQbhP"-UIeuO;ih4>?J^_^S%Bl2$5i8FRF)XZnU1OUShQqqP.2@)='O>)&gNlS``7f?Y$;q/AR"&uCG:k5b(AH>>[If;#p<*O@$Rm%q`Xi;0VfeG %2L>c99V;TPX`bP"VDk9`];cD$!K49d`_inZ[b49o(0JrnkmnZ=CbYrX$)m=G;&A$Z9S)O"2oHZ`q_L/6:KU\LsgOR%aW7)=1"VJXB>(D'PJ.:oD.pHj"NqeL2ihjU*X[KUN_L]c&SdCQLB.r!MG3cRN!= %-WgP!8']je;0U$V0TeK;e??kf87f=n#$Xug9G'2e!'(g>VHbV8JYA+HKFt9mLQR*(bY1_sj@5QeJq9:0[h=l4a\a3q9+hL,Q#*!X %Idd&PfU7JG?o*K#L2LR:;J(rEYiHX1e^S!F)O/7`QEdbu#sP=eP)@2&\/BEQJ-"9!VNCZ[YC_uL,8R?"=qB7>!@OU4TO#B?j/Lh1aYtLacJb*>>*kOO0?1t!^'MP.X`DGhl+@q]Ug;M1fB %Vn8)AU86&e)p55I\=elOpS2\Yc7=e-?V;BrK)l\RS&QX8"5,8A.Sj%R.,b;&/S:?3o+8U>-g"Ga'a*VPr@\"\@LRoH2&mBJ8WeJ>q$#hn"93W,#ma'WGNec;2@H.D/-cjHR&MOU9_\Xkq.q37 %<5W8uUd%a]9Xt(:&'e-b"!IeHcN4!2hKn`*$VrAT"dX$'5[O*OqNh2aUJ.[>cBL"'q7#[k+$u<\`+9W1BYI%2[&`ilMJ-]2H5B-lO[m'hJ$0:^9Kfmf&._ %-@D)'oa=Ar"KOV;rLTrM9%-bXdEA?!RfH!1"06t]2NVb[VV$686(ho2k05=Q6@_Mci4PJ$.7W#^!-LZ42I/Re1\"n7SkH%WId0=ZSTtL.^JB7=lN5BHF'`7,-3>nj8M^sF %2`0enG"bOE/YQNR=@FtO+a>/mq/^3R_8;!H&;CXmFZ4?r#XQPmibU.br+&A'hh6sb9qJ?6>4VIf):kJV8IhmZN-M.mr,5D!M!SdH %B:S29?s"[!(NF3KZWf,4(4mhY*F29W,tprb<&rN^,l`W+W]c2]kT;0N7r3AKH_LsH4D$'/i'0Wni?0;jMPO*?$ZtSS*5J.5&+@M5 %JDidTn_JBGGLM$]8Fh02W0O[RnS8]_SfiCA8!0W8u/trr@``M%I?,,/bH#b5k3X$[( %jYf5PDt-iC18Aj4YHj:$OLl_Z]/BT4^0g<7UnSfoaotOt*g8EN:0_G:$VX3(U5UQ?5V;ctQQJ&3kLR]j]tW:"*8=ttYKsmTRo6R+ %-19Wp)(5`IR.B;[^11ZG2dR]P+N=1pe`39;q`sENRCXBi`KDK%K-;0LW\&Rp#mXLHSH$i/?g_tFe1][Kf)'Gji;a`lF`+Y.GdI=6 %Rr+\-g"oplRtP>"=K(6]/@;bn!CPTe3Ok&+B!@dZIi&aZApXl&r_-OCA")/LE&31lh&Se`%@#Q4oqa@A%tJq3.*Ts>&JcE8/o\Zq %bGP>C=g0#qR^5@Xb,aaT0%_m8eAX_\6Ng(XCXa2]Xc-rl_?dJcPY7+=qAArrq0<`Zu7'RcXUDSSS6>usD<8nFJ:o`RcQ\]T#E7'C= %HJIC7/e6_gO.hn,@nWbS&k:Po%r&1p3&I6hp'[ %p$mo+IjHKg.t+a`!7+8%;\Bt?9d5^>'V&@(I3!tQramFPBh]edX=:?Ho-F+!giZm\T]CM^6@H>O($(-s.]ia>^/D<^7:ocBgp1Lk %*h//O+)neb&pjs4XpcK"%J!_)^@3.Vh@/91A;>dULb9TS$l\E"mH4GslhZ'KCTW!]s#1L"od_^?`pK9k5JaI;tGH %:YlE0`PMkBZWAh-l4&)q*G=IJc7X8OXsa@+,j8)6;U0:0et)V)Of^F9muBX8!>7/>#&XaA@$^LBa#M?jLoi_Y^p/.#9)_`oFsOro %BOg%."8`[9PZhr+PW@[cTY>9?ZsE$`bCbd>>Qj9k67k5P!F;u$$'qk,#9_TCO:KX/NaU/f"(3hrk=Jek_[%+SDH_W@d?ECT9VAZW %/\d."k#Gf>Cbm)^M0@G#;d=a;8#u!>U[V[Pak;"_i %H*gui$WY;^i0tIK9+iGqo$g8M%QKJ\.>?e)c;g1-3:p:h&A4@+O_kKFafJhM9D?(a,A@PX/k^2NBVA'SW5'haM9I::?.igG[`-*( %P4Kp3G/.tq"'!8I7COZOWdPR@osg=C0EHmFTuOX[XO6.*2IK`*GX'.t%dO2:H;_SWDJ:99f]Fq5!Lp8h7#u]1J(f!>B$P'1m3FkfM/K1\=&Aq^rn\VWt?R9=#3I7Usc@d.O5K7 %+"odP)W0Ecc2fIa(+Zms.Gi#((fnhV*_7;:Ua[%$lIpQLPoE*SJ3EM&@#j(.(ld^I!!>mZJ3Eep^l?lqLRfaJ`Y@Bb6ta]+JHEj8 %C!kF$*)O\@0jC7sX68Es5%r`cgTr@F%'Yb;[9^i2RfsXDoZTWEd*I\=LpB1t,4__gN1*1uP-sk3U!a/?X]Uiu$$;[P4+MB>,OH6; %O!DD'nHqC:>#\*\s)&_)eSg3danZp#"XoAZApph5#4q^J-qO1PIqD %<6*,7P'0)srr':8Gt6u6roT-m_.C2G5`\f[P@k7R!E5deRk76'S&8^D0K6e4I^1ZbMdd@RD"YS]\jeC"=6m1e(Vh5KfsL"\JU6lX %k]Gc"0e^r=l@Ic5!>oj&qUo%;BbTKq8/H-T(!#C3hQ$![9V8%%g-u6"lcMg3!2^R*2(,E@f96us:aK>GCC;;gJhKg%H=07uHE\#K %b_qq582=TVSF#!-f++g6(pda4.p>M&Hkl4UOh@GMmW2^AD(FgRiSGWS`!pj:P4W"sTIdVYNGFM=AT3H+hN#71;Ci&5AK3tU@7N"m %@n_2*PjtVu)da=KbYfLC;ilW=[*94XhBW=_F82#bJZ4_\m:tBD+j%Fa1'1J$l+nh_@BV4aX7V&iTFgd&d\=)j4%`]T7SrW7Z6Y,q %[n5pE>pfZ5?muj$)4F!IBGNN-8248\@#E;k\j;/>p8eV5"0?T?1Je6gbQjuOUF'`V,@)VdOa;1mQ-9>(b`b)9&a[WgOc3Lt?ZUJQ`=3=m@t[>=/ud*Pr<%L>3.j %D$9-h&OWu8N?Hk1DD)-6*oYb;1ECSd,#E#_Zji%&b;G3i[]ufP?4/\$5hR.`c>sli"S=H!EN=a#JUDW,8)tFn,)Fl%QS;Ff3K0V. %f`d`k1>^Z*%)Bkm.N!arKpigXAsL:LV/32f2%J5*Kc+?\*-A5tPK$b\_Yf*pRH_M=^+IrDkSQ6Q %'(`EKjG+`u!l;*J=`RW[]")bVXblKK=G.K:QVXFoF,%XIJV^aBY_2.-3(7XVAZQ'^Bi1?0S9sne?:Dq&Qk\=jiZJ\1:BDZdOZnY- %%Ou#_,dS0A[j^KHX+1!N4bFAQROKeU]Q.EGVnol*9/U2)E@h_fbDoH-Rta=i9UqIbM<$o1WI#-Z=@>&9EIp;!lrSpV6:"&K=`atC %^Z*7m8sJXPfI3XtBS7ni9#V#e8n+M'^,M;@W$Wc=Jt9H<(3,5QB-lJm12>]6g.FV*]o6d: %,c77q9:B?gd[R!GgkN1(9#-@(fXhk/$5L16Gec@gI[LkU`#,9O)'m^Ca5E%=lX+H,a%d.".Tl3Q*ddFPPKj50J4-n'&p4W+C,Prd %Mkq.=oaW,uOt=6WVp0&ZX(EuB->&8H#mZSI>RKh**F1,'Q?9!s/4EqO>,&TrO<)QURXnH?Hp/9R4TOU_DC@@F(0$RjpMH.=*fO&sT#q![&J\''8`pM1^Ubc4#<9#*;+u*<]AR*M7ld*JD:&LoJ70L^K>#*ht5:T5+VnZ*6Ng %&KLG*(A8oo5okLo+o[e3-hR2R0_GMOg\ZSGZ(HL*H]=+]hZ";X"Baa0H!6(m.Qq5\`Ma@qnZP=D216/;pk#6=SELiM'X=bC81<)R1_$QG+%7=dd[c:NWbJdoBQdUun-:raY-\='1H6_okgXWZAI_(&8u %GTDRfRruCm%n[M*^Y&eohH'@46F1$j+Jl9;^2EQTu5ciXkn`S8d)"#b3E07lh-rZT>"U6W@HVS>qT:+;f`b3t?g,cBAkNJJ]LA %iL^d(CC%P4?+'4nm7('2Ds34iG4e3)>o.saT]@hAu!9"0IBi6eTNj:G-iU%kj&&LMZV$F:!tJX;Y1`Zf5p %F)2XD_IDNT^`hY&;_OFlAe8oHDik,@)MAsi]WSYS/+\XEHff0*7 %Po2Lj@A79jFrURA:cL7O#cN!1glar?(#:nT@1AcI2_^%K"bA)l^`Xb#fu0";i4OpN=82l.jI;C#quOTdfc>RXY\4XHKKnD"`*!dr %>lq&AcPhF$ZkC2N(^-(X0Odpp$j*On/rpDBN."/4PV/folSj?a-WLc?4DG-4VXScLb%Id4WLB9u'eF!dS2!^-O>EI!YOHopk %S_S&UID]\!D+BNnMNOU6q8I%:<*uth@bHKV(H:)3hjcGN:k&]YM2Pd^#gjM5r92CKO/GbW#R6r>0#q?J[WhQ$K4+%V3>r'2m/Ws= %ZdcU.P02=+Xe+R0AQ&pd,EW-FW1^p@;&Lc#7eC-:e>_35la-\trPTmJ4>gM$usd %B;6\2^%O]or%7Eo!\ARZ]M*La0X.ugL6(QP[a4>e>trSUm29E8Zpm3S4]W&#=XMmFb-mto %G!Q1HnY+eVRH==S:/e%$?@-'ar&+7e!H*_L?IitE2R$W%[#aG*[a4>e>trSUm29,omX;@m;`d3,p(Ssg,?iuf^,ueUOt"6k.L3c[ %r6;7^UTp_F(Dolh=j:''O@1#ghi-LmKikC78sgV#cZK0KEn&k%p<&RC.#7pNg)UBgKX0fu]*_0+<7j.T2o^N-m %<+&l)5-,`G4?6_(;'FK`WNn2jQI<1#;?-c1QHO1U5b(.Y_-D"FZhuR[e:Zj#(0R@'B3N0%J7:b` %!NeE^WT[7SFp?+Y)]1*>dGn[V\)\XiQ-.d%^j!Gp@d!"8[#\@+E9P0u_epF?G6]gP73u+4!'.1n%\hp+Q'B/l1ShM-isGt59T\7g %/S>.N!V8Q:@tB2Gndk$'P.$5oi$@/V2^jZlR3FRg%GBnUBa)cQpOcaDjr1)V,Gn&qU:C,tBb! %YUAJ]//]d^+Nat3&ffOiF2K3d'7Et`:I&KT:81nt1,$pDqHikr94+.'ri/YC[uFo&VG6Nf.HqCs"Z>.q&q;>3n"aVF*m!K?THBML %J`G$%lH%>o'W=K45%0>s&<5_Fc1QI:R;-&+[F>m9fnY2i"A%`YW+L;3(4`JCZsGK!ck_'FqBMtl,`+Z<>43a$OCO^:]8/kj.INGN %L9RU(H8__.P/RqZ_:("O0YPV+H$jk%*"SObW3R_.Wd31$']hqp.W]XYFs)i\10Re]!@->jA6oBI#=EPbU__C>M.1dE<,ArST_Prt %PjOoorZmI`MMm_BUk9a'oJnl&r`UB+QC=T@9*"O$;g\Y>fXTp %CSbi$oZCOu_dWo2(i<[8*6\2P*VQtqF&[!DVS@]Tf^lsKZ%lTkA18*]l@$L8]#6iJR,t)&P;mRP8tH$T(]2]J3RNKG23s:gQKhAoTA@4!_6j&cp %(u1DRGFW!LJcnG2QRtD]&6MEp]9+fLfr\umWu,"#8-3i[REPE*6(9+-jg&-VhIgUlbeRUcW0R2YNA&@a\OE5^MGFrCTopNZg&-er9^L:(nP2W4KV6# %a`[`tD'uRBG(R)<-eJFFF@bY^SR;nEYPd3LI!l`M+#GcUNdX/J^G%I:e#tU9_lt8$7HX&i!KLr/Ad/8`+/FPOM(NV2_Xq*'dM2i$j4HL6_T$ %3X.5'$tEMM1K:$g76-4b?TtpO)+n)>ND_&a,cX'i!bi,\Ad4"\X1\6%o[JNUb_H`0e'&NNa6uB[%P6.d"i"tIDY8G]Whk9_7E$"K %1ha7q[kb.'Bb94>da5C=7Kj&=&Ljj`',;F(Q3JBHo&2ND5%*d8(Rc+n!G.$RXdYr7>pFn2RRBMqPsfE6GZCR!JcM:6Te+rMTcm%n %8^tGAS_0AcQ=suGQq9pk2f)?6YlbIdcu6JIb%NVNd3D92cla]2Aj1.//R`0]TJJDqb.ZFN_0eN2_=2_M,L@%>2,f-X'ocD#*_pj> %c]*%j7c^leR]W9fD([lt"jkh^`; %MR&q=UlIJ!VEV&pmmOX.I)LC7U:m:h$NunQ,(TM@ZP]M'$:]J/P+i-pF%=>iCl:TgD!C&?&d!ri&]eFEN5/RT4+g\GFCNtFU@BZD %//DCUU((qL82])%MXM=#>_-d(7kdP'qumeGJqn4.nXgZ\hgfH6CDc6IPl@pgbRgnR=+bVt0TsE.&%6XM.B$XZR"Nlp$P]Rn-4;1A %oPO8/1rr-VQ4&L7k2$[eSS;*C)V@X`SJC:?V?eh?%R1Ta4'!ahX0$=+,l\=u(>c-C=Ar<_&2;`g3.7oWY3ppk'#AO\+4,PJ&T;2l %g%*SY:EWJbJV!D"/X7Yl_hF"0Z"!HK']?o.i1s<.YlM_`\H^Q/a`CXmob>bBUFJR1+/Q%GU2.a1(=`!PYKnfJ$SGd %DVI?5_#!a@R=[qr:WfR1Uc4)do823[T<,jVRnn([1nST7AQ1<<5AS_<5%&pR?h.l^8Xh&o2:R_WGKU,q$$K9`r2"Aj@4P*?\#hW( %gPW</'OWlGr7`%hR[k]0cn8U84&K=R4ifQ-lhL*e3@iO3-FWN6Y %i'YbK=X$N6C%QY-j/_p63Y>qM5H6."V=ZBAot9t3g#NpaJs?T%n_W;1`$*f=_j6=6.XCM-98!HW[IZAaL6=r97,Kgk2E%5'61)2b %<^m7?[fU%D/cg<+\cR5nHS=<#5'dtJkMD]sAeFK8#t+p1>A\"il^I76$QgkbRc[u8TOF,1]VO6/WI3'(+3WU8jL5p!@->nTdk4,, %9?GdLR_js7hFCmSWtW:WPLd0L7FrWGf>i>r4TLArRLVl]5+7/aKEbh\bg!!=a/B,,X=fmZ`Pq-\.%&NiaVnZ3ObP9o+J\5^4M98V>EDeW:QD/X-\!/"&##m1q60rSUt-?HAUA-nIF2K-dfX+2 %hg!)Q[cXL^$ZIJ.or?%jGYg6N4<4J6g^AV;fF6=;6k+BDV&L*C>X_M0@WEYrI4e^>%!7)X+r+^Npqdp+V[Ti105:Le/C)[drHG>cja %7=n^b()9:/R3l4Rs`*;E>@bXqU\=B0W$d+2DB6(&/e%`X2L.3j):/lg<$S5J`f#8A+4)'X'HeCj:W3p1t&MNj#BUUmt1h!p.*PIo84!E'sR6-s%g;'9C %)RS^!-f[\@oc)uNVNc1>Ta[F<@Z3U>O;Fs]aSThIdX/`;kCBt'IL/(FL'lm"Sf$%%&@Enu]W"=E %:c,*lRX6TK/6#WmYdtp%;gJl_#Ko_rC3ro8E+Vm'l\.KuAa8o*S!J6'd&bfp5o*@;0D'5RXYlor3p=9IBa_KdF;@S0^qHDIa=Q*N %GOj)F]+3"K)dN#a!U`ZV&9^[7irO*PkcdI]L+M^0CS">[X9I=k?\4&KShB3^g,_6&*jYD7F`'Nmg>en"R %8$LS1+"%G/k!I.]g\l-heXbkihte)[7Am^8-p^1JnQ>!;"0BYA!T\L`F7-h&$S\J4h2&(mdQqQcCco:1KTa:HI^[)k$ZR,+i7e9O %pIkDZ$1EN1/aChIl4h*1\VT<]!&?<&i<'gd5a)g,M7=nn?E`h!H!t-Ths;oZo!nn+lFWuDg*`#_qF*& %O63Eg#"rt.679ne:eK5)2+X/`/;Rr,3ahI=Si[KilnqC>4tpS3!hSTi"Zbk8la"]56qSUhYd(jsi/$eFnZ$_0&Y/r9*Cj=3 %o\`3Br&Uc](WZedl5L-^WG#VES>2"9joc)4]eiYn.g#PqJW5UC"O=Z%1C":3/F]\c3d1IN*Z1,Se<;/^4Q3u(PEob`5O],7H+6U" %!!=cCl";SSZ0HM9.$9,VWXX;F#V+riSKYrQJ5Ifn@dRY0Ac\WU=YPF:ITY$KguSOCH;^4teG\_Wb(%/d.)B7=nRHgl4WG&_0An6R %)a@7p1BK"5%"RC@7j,E`Y]A`pTBGfbERB@XSfX\pF.+QQJ:$c486`rmoseNi6\"6[8B%Ml7QGuc%cGUjbfO!(RTC'm?oUeLBW?MT %ag@-r5hZ)1Y,%t9,V)ajMZNJ94pTc_EaCYUFam>3q:Lqt,n(6B%rL:<`/HeW#QQolmW4kZn6njY1R&LYmji^uc$K;7V5Zr^qkuXc %8[XRa$f4]J"VOUc8Wn=P9RG*D#!gG^k6&M-,8_T/%LW+%j`q/pkI>qb;irs, %L61F<]a:gu9ZH=D#$[BOcqQhL2^`5&B_,f.',eZ=mpn)4oBK;,59"<@,mD=0:bp8koe\;n7aeOIG[c2[.[=GZ$A"mqKh,F!:Q2Jb %'BGs\&/;'UFtC5dpW]9R'_)]&A0(kX8XGN[6NG1I8]nJg2-e&@&^dOgUHQj=6>r#p=HiFQS]0phj@OefTeJbB?*`HD`[E30Y^dt: %Z@jYu2.WcM_jReP#j0\(!i>%U3%oRk`P$e2(t#$[:0!^MZ=7TCU_b^dAUmPNBG4'98=HsI"IRk-"X@f*e`F/E8,dF(:$O>G>*e?K %Z-5ma*6CGaIO^Y\bRR*MjMD&_Pf4bF\6"H//K06,:6kaSVH+qlbBDoEQK0$Um%\`SZ?rI3b!B:9m>OK8Lql9Xm#C52,N.:XaN!;>.8TaJcmo\5FJi`-:.(#1 %3_3nb*!A6U8\UK`idt-9B'M2Z*K3C.j`0T3V%(U78Kb(c;ULq[!Hael@"e]DK%B5;7_U;ZeIE945n/fS$c`Dr?or0?A,kV83I'"O %4Zrj90-P.3'%U!U!c':BaI1RIE=L'i"EC6_6tR%J$O)(Z3!NR9?`Po9!W[E5\&E>>b7Y1GU`j %LTo*jchtm!"i5(l5+M^R8`TI58q:'*9750SOUCU28W3tJmK=dQ&lg6NA3m2[dPEH?fkYDI(J1-dbp!e3&;#'t-4c?i\hK^HjenQ? %LYleSF-#C>FN[0dJ7b*YqTUQ+You[F6C"BSbm^ssQ>S]*"]>W$(RK?.)E,RA\`_E?>onsV;"3,.&kAWWMmP(i-tU8`_OTc0b<6I`*bPa%t`@91bB+`p7lJ(t4')EXd[Q;Po] %UrVg:/M7/1D5#IR^_hq9&JcW?#j)./)&,W6R4<0`3WO106BPXKg]7YZTWhn,p.Hbm_J#J[+IJmnCX0K\S$J')/T4BIPn15l$+pXd %!b>k4s_h*i"4NAI8dN#+FjbVq``tZVTd>Dd71EsBZ)H!Atd)`d;cnHTWH^8)n %fbOq%V7)uk!i4*X%D'$;!#p#uGLkOX_>qDc$\@+?"@nWb.c0^UBO6qDB3LP@eH@-=&roYYdEZd^,"*1Q)+DFd"1)*)U1s1(1T2"U %6DJ2h'[@jk(nDl^pm9aqZPVq:$spflUYo:;l;2GIW#)k3m9iAm(J_^lL_NkSkL,B"@a?WuRO6?N[8h3T[RP*CTdpN7FG:T>^+^MK %b*M/`;1jCL=DGiMM\XPPa:H@!2"-)8^eCXE8_Q_$,5I60TIm.4&jDimc@b$lr_0R@&dBL,,S`JjTL>)G@AMRKO`"J;Qmlh3X$VT* %)QMX$3#4C=6Dl1(Q>#MJFF:;]PC:%GY(MI=N>fhLAPZb%!I7u]nDM`?";Fr$9P-NkZ@\)MQs0f:&^KfsC!db;c%`%6B\>0sDZT[T %?HUH:b'/W,3UO,FUf!R"=?P_2:Y9b.>/ %$\1Z\D%`P4PIOAn+_`O\E&L1S);]*i-`S$%cBI"#6HjNn,`]k98OPZ<0(oIp&q0"#NA@`fOB8 %Yl?K)%'#K=JKrA=OrJ$_VdcrVA2)$r%Jo>-JcLD6=C8mmVfW=4o+A3DR][]i,hs@/dr5Opbc*3c6(UDTKu?K\nYjC9O5*5HBB(c` %qOFB-1Y9Q8eC7m,-BD^tl:B0pF>+cK$\Wb]g0rMNj;pr54F9)4)T4J0][1[7M/Y@B8j3(>9F(L")[;5jB;VGT\;SR0Me@\6\[#@>=T4='D*],RPEf(%.m^r6q["GW#Om)UrQeTstUSQ/]' %/,ba.i;d'^n`Y6Xb=1DnV+-IW2&jXi*ScjZlH<4)SrrB]GFt>0gu#]%[+?:$?JEkV((T;=FkWHC`uM?^-I^m %80[?JY_!5(KkJ1inI?^fOltDI&PLjt:4UU'%3mQ9NgBi.1=d?%Ubmr-b-Qst %\NBX8[j-p>(b;hm&\j3$X]^#nJ?L9-%^OXM+g#qeXNE!`C')EAN9nG+04X<'Cuj0JP<'uo]Y;fCT3DVX`10"Wkq":E.s*]b&XJV( %$aXq:WtQm"+Tr,5:":ehF:hKU+PHgg:ukj>d+LQHhK0d8!s"fZrLlU##8kSko!FHE+9Rrl:MT43JJK,#rCu*RWFuNQha`-e6gI#8 %R8,h_`JRt86M("A0D**D=ZVYnQ\lPu5Nk3BpL)BpkKmoT'2msrF9t`j'sE0:@0fn+@-8XB)'LZ>\g#]Ho&_o-;NB@"\7^]YCB?D( %@e2p!D9Z[1CeN'RY+kC-MnS<:lg/u7:6W*?[V!'\l'D:j+Ki!L$;(@H(*Lu//DeU^6).gm<+ff?oY>MGdSp?:;2-Ps@Nc*G7-Sl: %SP$BTJ#@_@Znm!SS)hKN&9Iot50-LEi\6.OQAlRsLi\^h=N:EC,OU],](/u(d-&)54.1,s'C,LqT/+hU;6UXH9@i9=PB@4S&M,== %8P"Nq/HE9dX62;)d26MRDB.(:^l[Y01Ng(,s8VH!l]N:/EAdRqG_c5f-cctS&[nb2OXn %06)I;2,ECHAQ#9ZJeWh_LrlX!Y$5O=AZf8eY9RMNC5Q%M.o'O/YhL[XT@Za4?E-n=Pk\ms:T?aOKE2Ao9\nA32*Di$oR`\7l %)nQ*&b%P^G9#EB<`"?sR\c.C;ADDb3^@>=:R-fE@Vd=[Ne)Qjc9M#e&>?'r"^:S3Y;0nRL^/Kd)UpYM.aCIZi>1Kmn40Q]t&\OrN %pocY4Z0P\e0=Yk_2GkYlHBkai-U"%ufVonG98-$19Lg/5!@G,3IM&s4'oM#&,l@uI%XqFLnlm'W@IeoFbp=!Nf41rWe(q]+&sJ6bu])S(2(r(q^S_VfV?pF5or6dU/qJ.h3: %L1u:d_GYqf>W>$L=RuelC\rYlXKt`m2C/6sFO_EOb#F&!L.Fk14qHBTKnC;lJj'&&]^%fn9d*8/ZC3nm*02();K8IB0DboZO($9G %MCfto2;rXhQ"IWQR>Z[=AWa>9q2>rs;d:/olEO/SM'8=b3Zq=Vi^OAUb#dl9:j2u(kl_bVOim9M$Rud&.'dU?:=]0i-;@Z;M@U)V %ME:G"Jpf3@=/0pJu92Yi'gW\9U2Va/k-+@%7lj$#+M:f79S#Ybn2Um9.p<1dY,a1+DhW+&l2TGb2t5BR>Q>)r.J(Ok!$Y'P_aJ8^C3kf%E4D6nf?fA %ba,/#%94[S5bg`Z6mZ#6"gpfS5c&oG9pSd,EAh[a!K?,n??Vbt3seUI9Z=LO-h6ss>]e5&S5Uj`?VTeTUuhY#OS*--FF=s%YU]qm %b)M=4%Fe(8WH#=+PDs[!I1rh!a`%IRc@SWh0k(q"&2F\QB1g,pQY\k;M/pZ>Th*_78tN7Cjh^(RA-o\$'U(ph,;N0IgP!2@uZ!!oq%1[rQQ\7Wu+09'l-KMmjF9nYPaUB,f-H&_`\@ZA1pfr%i_/*E&@WgrGr;=#fnP'kGJklh_sZN.O=I/m1\ %gB=5,m[<76TRpnqZt+](3PXbj<&Mm#'Wdp]>9P"d15N?N0eh]!iD1'g!3p+gAnR`-"b0^;lO.us\)n3'kop;%5!FD4NRkM-5g*\>kH!)QTV?,^[?,)X %:dP+RfpO2(4tL<&/?gtYaHhk;m^f#B,A/KD2?o'&,+E"R8E.XFn46B.Xa=u`d,KW;=5ND^'MUBF@JCsT[-k`W:*=('ShO8;i'g[b %h%&H&\>BW*&/jh@5XtGRP?9\eLP.A^P%o2dnt>%TTVp"bj_SU_TOf7K^cs/V7TCWS6u#^rD95,Y24-U:_YY4`/Ae>gjU5@Dt0%L8>3T$2Md[NSp5W8n@FbC-FYff:htl+@>#[pDT&5JBK0G!-ag64TfLV %elTIje-7QU]hRmI/.;O,l[b6UmWaH\7fj':/!uD"`p:[=Ye\9\S-VZL*]"9;KRC#jl*)j=?5PsNAV4qoa[t[-n$:3++l:t.3"+7= %aP3#g!8:HE]`;Y"l)-5E5[dsTI$fYS-Xkm?$a?T5BMhNS?:ICj'Po)mJYIg,q4$b+;)B!M_ONHS3@W%"\2fPaX9X_fg(/(\Z<&t^@aVV594]eKC>oH$@QjBVllG,WrcN_,b'8]HigCc0*XWZKW+#Y>P'6^jPg!':Qbdln".i*a2F\tFYNRo*1Z %C=,l"/@9Z>^9\ob[g/6"P=A9!;G+`(X;XaFTZ#lO742_Qc;I,j4fu>FLs@,li*jDa/5D@"-MR#cA>fUeWt6u#Crr\\ %Lm]!I$'u*r<_q.YdW-C`=Z4f=r,^1!l__rhe(sZPos(V%#ncJ'.V2g6kkKMl)*q4Q;i?,_-%t8)hA]1k]!Sc&HnUeSl\uQ?Z^p#.R5;=+eDIf12mQJ]8YG^TVQCZXZ5o<>J %K32+*?mqlX<"sF`=7^MHgu6rF8pZR^2EZ#)jCXP9oB*7="g9K7Kipl2/K,RUn'5`86VQ\pG1j6V\pa0hLB[I5SG/5RNgM&4N(GVp %Hrh),/`$%a#HgdEc:l+DFKJ&aWX-BcaBoNo0E@:J":1o5%Zjlk@3cPS?9H1efGR0qG*Yo0@XKk$o$^]Tob\BoCMD7*5,rqOg%GL5 %+q4=X:"Z!"hQ/n_ML-jm_J>;Sk'@RpUnfjQ\HKJ?bR(K0[#C(a:@;W++M40J\L=K)imWN/gt_]1K"4T,g?_'@L;%ApEL(D)[9iiP %(+pVi&V]#FMWm&c#jV..@<@6Z:cfX%W+a9WPECEPU.*q:na91\5Zl^U.)9d1phoFsfei!dE50]p*_dALXDT('F?3W"SsteJAdD6M %1G=*GO\Y&-"cE=^XV[b(p^e'Ydf;eu6;t1o*uL5pe6#4BcmK2h.BKu2?uV&i0dt,*#2o&X\kP]A4;]Tg3<[gZTa#W+l0LB-`LD+S@X(eNp]XY'kQ/tlCt&\BPa-io\:SiUTI;q;V'"3WD(\7n5Bn6IJ79i= %HC+FO>=YS3B`Nb!X!+GgW`*K%8(n@O<+B!Z/8@(`$2X)-ra]sS0Sn?E3X`U9jgaN$_I6NOI"7gC4>K2WIX[V>8Ca7( %'CEugg6W55k7IkjV9*q%G-DI?![Yh+AF)3<""2Xf_?[+)[q`4UA&:ir+EO)ikr,acO9'g5*Ore]m\Mi")3m-Q`3B@G&LBrE^o7?$ %K(G5Sj?5V>l54;]gH2p'?5A'9b&H!8`),%GH.IS+;kQ\1] %MG[@\PhN7"Ouq5<8f'<#cLP!0\[f-HW<5+aBX^J#aiJ5KT]R.7\4_V.Ns;^41*"ZS6i5V]&h1=pMKnKW(MCUU*d %YSGAD#V'5hUl;cOl5)EQQibD)%)>C3_NK1kWn]=)om%WE %HY#qQY1DUgRC#S?ed7)_+)2RkN>A*L75QM0C`44p`$>if>1rM.a76R_CC#SVMNHcDG/t>[?kl0;OM*l%D?O`i-]KZ+J]LA27>k%i %=plm=g4S<3%3bTWrmMoj&9]aV%)!(L!l;A$$'(IIU9l=8l(Sf\*#fV=1#VT*kS2dhAHM?--]j6@b-=_Lr,%_4Q9%h[iPUPn4>`sA %)&HW0H:fmI!jcN>QiYAS+G!!L`&%q@lu#'%XZVYPsF+4t10"oSLfN4&7&\:>7,3="bO!<+72H+"_tH>&s;.n;,a]DrdqFU$=uT$Jn.%n26N;h`gJ %/EY6>s,&aF*uJtkLf<'@I!O@2,j&c+,dE-0N_Pf`XD#SKZ%41l5X]gFLDk"[S98bgj19#(1P"8:(2$s,;A[Zsg/tSX3(Q%0kDTr\ %WmtO0fT:"\R#EpR`4ThN&SpoPHVhnM0eaC@$r:uR(p!$8%MMWUC8IlQI?.d&2OK(6+:'`UTZdRB,+6^df7Cgjkp2X,bpU=9&sh4q %cE/4$aVLsMVburK(%Y"[ePs)Ol9;A6D:4/i$$?+k5ck&eUXQ!R&%_HsiGQG:m]n:Q:n&eJ9K9p;(N@ %5djLAM%8!7Li%Z7l:)JB(s/)/6"9G+[)rJ?b(/RXVlM`X0kX7DW^t*8AaLZY@_-S@0dXpEj.*&`gZAm?j"2-9`Fnl]-tYj>cTh@6kt8B+Yd&s*gm^*P/p%O',P:`Z%s$*li95ECo7j` %6W03Z\?I\\(=pc!ZPYJ8Ju_>BEaTO*U`?rjZ(gGuO7\_s<):#XOX+sf3[NP^BK>oIT:d`4t9FT,H4c`%,-4uOY$jr/,D;ThX%4_pA %BfnXo(_X#R_ma[SXbOVC6r8*_GEMY)[&dk\2(/M%/;.T2$MhT%VJ4^Y/spcI[ill7*r`T0fEKW_(EC5YCSL+V_?Y#C-`>g2C1RC7 %.H3!`3'k71@@`@m#r29>OX#Y!5oGD#LtRT5>`Zd/2%2'S7[-Rl/F^I_>8c"a"u6kW%@/Btjr95+*[$c%%qh]KR;E%(o&BS6uisZbr'dDD`:^feab48+2LnPLVSF9\#_2>M"4"IQ4YU`ftYa"%U;59jc'5[]TBbbB3RQ %RDe1#=-STF[5QeA=\>1G"O!d5+s00Y:8V4Mm$/j-(_YFb8EkHO,-@8bb)u,ZJ3F<574ZGX[P1)FVoZ"FE4m9kk'8XNu %dE95Wn/V5-r9g2;]lP@Z]R07)Z0M]Q@tPOK9Bu5+,,AB%f;O^\oUc2$`\aPZfD0U,RI/94prrj#$I/RX:C<* %cu5.NX]UD/H %f[2LrXH=ie#pDN=(*X7>TadD>I0$N[P8Xi^aOaGcSYE59?rL%>B:S&Z$Hp"MVkpdH-fCEC9G]Kr5`/FE+&>Vn]^SrsDQO.ad0R3tE1LFBWP %*c;<^k/.UM3,?nIHu%Y9QsrK'IU7H.+fmo](i8m^t\K?gG2`W:m+?^7OuK68>l %?;diqGa^6b:$QTNh4R>6>(S3EFA+I)IF+eC1hl0B[$W0lVFg$L,+:?s;3M45UqUWm@[].=1dRG<%CK>,s"#@NCNpVUNma&t?])LB+>RhlX:"j108/"EbT@md!R3o&2-;C@/XlqIQ?"Ti;)1Mq= %UaDk(.Fk4h25rN/l:mI#e"g^)Ur>0)l'aGs-Cq^p[:N%CTkdO>pBGn]Re2+]R!,=f*088%eZ[Bfpd(U&]4VA`kWtE` %Bi(4'P7HU-25rB+)S7?hVFe\(8HUfKn!Z)$-KWWfYOpQ0q*S'J58_!>)mF_Y7$f7hlT<;^$o*))a?U"YLu2;F+'7"?nlL<^LLu6+$-4G/8+`!3BYP4:CghLgCEX0!aZ"p\M+pHOa8=otq^e,W419sAgC.[*P;[*eC.5^$Z(Ajj!ZKFQ..T&1hVYRg) %M.0&B%s^sO`R8rbhrt_O0PR[/Em"Nu2BfMkS?e%11KlR)oX<'=YDLA!1^\Q+BWBd:JrC#*W3i!="M5>GcDK,+u0onpUPkuHG3MX;U3h6>8)Z+BRu[IQ5(h2C+N3(lCB?/:/;r@&uZAeql"Gk:q));!V^U=qC4MIf6[t3i+/"W %i#Q"g&qQ3N`sETKSqIi#CFST>.lfU%SuHg:Xlg>@6m?h+9F=ne>\$,,V+k5_"LX/Q>Mho^dh(WmdnPEK_[U6IXm;. %8l%/\%B6I](-:W`G\iQW##;4#(o0\2b19El,R`mg,mSit6*q:_chK"m$o%/.>2tPNBo31aVo>C-^gY5-?=,=F1$A5JpI: %,a,B_Un!+k!e$N3Wq!5JPqjOZ/[6?'8ekJt66pp5F:8%!RPPJH1H[Qfe3`.3&Mg(hf[)]0'[4Zc)(icE,d/KE801Y`+e``S"cPm3 %M'<>e2Fdj'NkW8&+MV/q6_tATK%Kt4Y`l=3kP6h5TMlNegUhT6^DUpL"q+QTdjQAl.P$T4HG6D&I4",BJc\BaCqW!E_.fAjiPpGs %&8RXsM$`9^@L9Cb0qaA]RZT=J;f<3%dn%QI"fm!P@_Jc(*b[:NjK-"U\Xj&[;G"hip;.uq0P4naA!m=tQZ$%b$F!kFpL.nu+o3o: %bq\GqNB&,'[`PP#YcSlYL`'H$@X(G3.7J23p?e-L21M8#\@fk+'g4!-UVPQkJ&!k`4qj23r*%&X'G;km[2@7l9M[)6=HUl=MBKsb %"r@GN6b9'l47rpbW,tq,V$\l_!p5ABQWjTb^)/j6#DPlXY9Fo% %*J,hX@P-*I_D!ND;S_7:[Csog2cMc6?tfP>o6j:HLDcMleHX!^d`i!^mYABT-q+bDGWI#3IZtW*h_1Z>,h*6AMt^320HW?KioLLs %a?@.P5.]j,d\]0qN/o)E_ft:&27Ik(r0G4H)SVX]`8p#R[J[g'P&esjkTLnZn59JA1bl20:3tXD1.H3Q%^06I+)6s`Q1W#GP(OAX %]M,,$PJoNdls!_9lJc@iB*O.>UHG*NkR7e-XRPH7ED#=T_@fVZ0$4/7>QaiHHg1e"Q,CQlY0ispqNtj448M8CEBFOW@-WM""sBt5 %:9C3r77WOqU=ub9@o%&\9J0:$ku#Tm[e/J`AX#K&j2da.g8-eD\76-aYnX?q(@0Jd3^IMCfSL0h,fufQK41%,h%UdW'VIen7]Z]/ %#)O:`V*t^diK,u*P8c$&<`9B#lkCopo[(fQijeAAn!^`O;%+53keuX0iZV1#(ub8')U=%$oQnr7Rg+?c#U[!V.s=R4dGW9 %#G&[@Y!".[rTG/`RE5.G8bE5+!4n?E#o'f4!Q(M#U&s+VD1$35BI;6ugW.)=fdM2oPI%=I6HIXk#Or@o-,4U`#eLUEVp);JEC()$P#N.>*_6fp7$:Fs.+^[]u_gqqZA<-TTDbAi-FM %O1sXFHg-?V3SQU!ZjJGZ'[5)7Xs+!E%-f^S*:d5BBd2%p915A(,u?tlcI'GZ'RO5*QKt(IH[n99T8#UJ+p:^E>I&W?6ldBf?DrH, %L@nTk4N>38_('u'eARG!$o75?jpL1Bd@ %;HH;X5R0l^$$'`O6S.S#Zo#EsPC);/Rh;o'Yld?"R1!nfm-9tRMSnRUU[JV+l^'a#ZPCbT"g%4>QcM(LmX,DJ+5 %d9ac9N"]YCjNt_pY]7(qEKhQnfJZBJRkua#)PD:p:-BAsju)uO-*c`fn8!t9b@\XeQC5WmW2Q@82euQp`C5^pGcW`2=':O?G%G3p %@P^/D^ru(L6]>D`cnLP4,;7&9Fo%i"M-/sm;,iGZj7L%VKNhCn2dU%9-U+!K)P<*BTFW3iiooBD^14$gBH7r+G3KA3se"Ep\0\I\kWqL>PNSkuP"(L\\*7BHn,_71I'X6h9-.>qtG%k$2/,h@mlA?<]8.Bb*kT,k(FoD'#=N3Etl %.VCdeLWL/,T!2WY%gp;sO;OuaBQZku1,s.u[=Q[1+`tD!gBfWlohY=o,&:MaI^.khWFq`!pV"hK%,>OUF:sf?)5cM %=ef+h3XO4'W]D8>W*Q-IX79BCLtKeE(`3jbV'B]kANX>=fhCC-HY*K<::7JV'c$ob/'2I)Src,n#H+hVQ(%1qNaraP..^$sqYD3> %+-qKm6@PUZ<\_Ze#Bd'N/I"k?`S]XMQou]F,GEIYO>+Ne8JR').1.elI9[-U$$,)d45>WBCRs$C,ja",34W!VAqIg"mU`jMTf#ql %4K/#([+s_t-EB1*N,l/O&=$45A<7Yc$WDk_BOgB379*UU;HD8i;@1h4ZIrags##JL$bkl)kSQJi5b) %]Y#59+?+?SlD^2)Or4SdJdS7=9JHr\YD]m/dcYg7NECQ34+,O^fep^B+JX\1SfKEm1!GcOcNY^rOI[2[K[ue[@#F4`1u5UoShSb2:r?km]9-7t`[]gRBlm_U8?,>tBG7VrKg)ZOUa#h-L;S2@,`gJ#/Pm?a??=E&"L4igW?1Ig&gC>A`sE0X63Wg"S&DlJ\tc'Xc!H*]6##/: %cXJn('#?tnk\DVa.pNN+((pclAKWDbie[QD4".e:3,!A+_&S[S/&@kk",BQ,-)0N\/R!^_(p^kARod_eNK$p/iBaQ'(9e>s]@=g! %MP6W/Fc`CaC()]E[2nqaFKke9>t=WYU=a.P#,pC1<+iIJC*+6)1>Q$8g$;4!-j_Fb>=_IEJs/keghs&;Ti+`^in9LX*=bUc2E!'8 %%B75]:9f=9=h5:sNN57(Kd>O\UtUB'2NP$GV(X&9kGEg*Ng>6JFs[3'CR"ftNd]FT-8h0Oa2t2&m0YP^8+fGe=h-O_-^g.*<]SKg %E.U0,)B]:Lkff\lMd%%EnZmd1ki>N>#Y/?7<&f %FVdr+"h.ZY7Yk%m#,PiMF"E8aW77DoPacg(=^A;q%Lnl*1j'!=qjb\=i*ZpDcIRj4?o$7e7&;l=9]?Q8^glh=l];do9B4;bZpX)Tq&?Y1%G6rDnJjQ<(W.YD?ZU04 %DM0hk(QUK&A8)#9bH=MR_7DI[^"6FB@0p+D?peI%-..a*9l\&1]'s>0==BO+dkFMUOdC>uJdZ!,EWF#VZI33f\sCXGc)SjbT<#sph$IQ@ZI0M*Zk&f%jS&,6_u!UZ_fN>m'.PX;k'(Mub&r=+YRiC;8,d+!,L&<'.JN)8o@pt+RE[XHSI"8N=)!qkD5>\MZbodZ;%i#pTFWW*9=L"n>IB@.IrS`;G!b!bG#P\2fF:$pR1=&*uHc49UBCd%-]>#Gj\4;a1Z*YtM;j],X#"t@UK %^p^\!qcH@<,EKZAXJOO4Q]/LP"1PF5X@AFj0j^]S0QG2"5sht.:tuhJ'#)Gd#F8!0;9[74u[%>B%i$GkmKm"k7:XAf;r'AKnhgImUp:FA]K6rN\78';%N*QWNt\0c/] %5s0'S5p&cLh_^@Hf3-Sc(!fN!a%UR\K,k&bWO)kb$s@Cn'cN?bE+4,KmLm@Ofe9*GSs6b3\(Ytk8Vd5J'dq(^=>$Bp2G`3a6L1Y0 %ncJpi5dH?C+_6PYWkmmjKYN:EmgTiB&6EKd@C5sBlBr5-N4JQ%Ysi=nUm_ca/Kj%EaIbga!_0RW&08ME)=St`b-SdG!r&NoCo0b( %mp4-%Q`XDf,(!R;9/nZC!nq0AiF!3dG`6eT"_,`EfSfTt_L"(q %I@\4_WlkV4[):4b*pe.GNk1SXY9K\$+!b:5Fe6>6m"X].)I^6a/SQ1L$%6UP(FI'3Tn:)bNO='O<"?`^1f\Vk>IV,8mtFau6qEK(ZI0%c@H'oi@JCRc,"tA'9]D%o1E;dQJhHabX+k>V(mh>4QeQ2$g=\I1(d!p6%<(o[-jdedF#b>uDXk %2+W)DUj?7E#3G7!M@VVS-YZRT`."G@3A-cKEfpj..b%,H'J4I/J69,I22bR2kj8.#rTGdCb9W)V/Lr0jgeGO/D!FC;&IqUaCY'h_`$2Qn@E%[#9]U`eoc-RmMh`u/#_\\$a#1!OHBR47E0A46>;2=%ZsXX^HaBcj %X2Gk(O?*m%W_bs>_jE*1.DWkjj5SGi]/ks.M3-%P%i,n]-MV=s`>_=3o?LTZAnj'V0S$=WmAc=$qip2?b`e"?[>NMD6)L5F]S_pu %b*bOa+fO)b/s8r+%Cs?.E0-2Za(`XDG%i^&WcaiqlJRE"_8rB@WI!$\fWOGmo->(p9&$0+5c1-sP09:[VeGW1b-kk2@X,ZYTs#E^ %bE`R>+t@GE%WDKp;?aCo]ds9a[Vf2#bFO`@1Ou?J)Wku.3iEn\EeMdu9YtN[6(q;s6<#Nn"h?FRb(dj'_1NA8jJ"o2ef`F0GncX0 %&=C@Lh4"TT+L6d/"=![C\Sm9h;aHUEG\0d';Ue![#&uuA&qY0N>C4mmJsf2gq)N&dTsH^SF$V@>h96\3@54GLWNRfj;p9F/2Kgb= %-_OpnL6Wo$TP*[/YWo6AV?mocUA>:?RY`22ZCn3%hb=2:1*7KgInPncbaVpCK82b?DIF7`] %k8N-akb0/+NSi:tZY6(a,rlPF@]_u$+c;23YTBN-(JSY\8(l=V*gMbd:2b_7BqMuUU0DaAWEFObA>L]cL=hH*?D7!:bV4s/WL?X: %2eqY>eI&=Ed+I%u66Le`cS8@[L/DM!+5#T/pgNKVPD"f/i)Gs'B'9[@bPLYk0Y4g2?:R`R-7j'gdl9N@C"s/UL=n?)N"?ViPOlb: %A1qc?&_Sd3bYo1k#(oK81XEqL %K*jFBNLCbRK>rKn3gm*,p#eZ_"HQF]GcbW`6a3;"HFD?;MeQ``/Dt\neE/P'" %[im&sU<3f,Wi:$5\4ogd([#IqJ>@+J?EfL!k-U.XMa7LbB1QKcc&o6gCTG%U/VPl_7q642l#O5-Kf@Co#lkKM.$Lem+U-$90XGSg %75eU7p1X\':Xa:F-/4bS#P7$_l(+QaYb_C/:n^ZP!f/h@m1d,k,&],d`2Ek`hEhtRaX,.IkO:Q=<=gb?O1s:te@ZpQTW^EW=k.$6 %Q=VXOCJc!PL=CY@I;h`nW!.Abh*FPnff%EH1@!4_7N-Q]?=.CJh_E'H,)'eIicQ!@bEa(Pp3hhE7a1jN"\OMm*6u^%&EEse@D;o@ %+oL"gSMXITPR\VQ_Gc.ro3a:A]OZ";k'G?Qgam!h/eO"fEJdOZ%/b((kT$Nu+Aa7]o,c&3&>:&D$G]Ui7pKo4)Vq.XD_@L4ce.9n %7*XVZP6ToB?Q8Fnb2^,U=,!M@#r^50P8isP#:C;O(HpQ7aSuSU(Vl_-1nF_4(3H_Lp>doa#`7t(s.!Z9W-B>U?0[In@I-;iZ60Z` %kU7QrPAlsl/I=2'A7R7pl4J[I,'l#;+&XuGlXniln8C$:)[,TD/Y25kCDd[ %/%CodV:`I^Yp,b^5!s%hD.ZW7O[s7_B&sKHW/HfA6_*H%LmC`s,t';g#ic&]^*n+nkcqDhr2Nc'<0'?O>i*-9R`43qD6qkgKk`Jr %"dRXP7PLG]7F>bq4JIEsK>RN?eikM]`5eS;n_/C%]G*1B-q %HoVZ?M`&dIBG2+\FdKbXt@FTGXXuYtO6+W\R\Q!YPVLe[h-0K5p$$j%1S+XN6C@%&,X5#r0pm %!@3r=#[u6pS:;f"[BPq@6:DTNciTtsohku8Q!qYU*NKYB.YBOBSZK;+a9DdsMo7D$[X&m]Au"#Rf!U\*cZ[62[$9t-gQhomK;T;T %ZfqMrg]@Kd0d@DP-+E>>2^#%V+'i*6ek %3Mk0E&:Tmq0"a_oOW5@2jZ4J2Ao"L9a,(u`'%^?-EWafodjlCS(X"tTWI*r>R`mg^"U9+_'aJlk)9"cGP9T!61FqYIT"V3jZP]nO %#.Yb;;UiR?U`0]7BC+<.*ZoAkfj8FuVLR'KSp"BqbHN0>4Wf&L(=+O'1=%)O_b\[@Oal30f[`8 %b`e%HKJ<:63DOfNWcb<#A3MimfX.X+#-*P;nt?1dOf=s8N80o[,TPQ1Bu!RH%Q*2q,&mU>=jk)T&k[7-Din]L=B!CfG9$@;iU1CO %m:14,&WI7ED$]hfK?](,.]&#[0ob$YXd1Oq3b&NV-l0cWX914b)nUT$`^NR[W)re48:bH9.TPHpW2!3KgL]!=Vr6qe1+h:/P1016 %4t0/Z?K._^#XR"GSiRsp)kC[>jZP&.#@OrYn@9U!Q3R?I_oX,$r\N=("mu6*8AuIM-Ja9R2c;%Zm'f[R`E/[oetJs %18]&s;_XVFeFHt*,)([V.k0Zu6FI`E%P!g7fj`I4?-N5i"r^/q!9ho^>9(:R030*lZ90fn0Wc/%UkfRBHoan/#?McT;.!ZD_JFQ3 %'oD03I\Q0P`3$8$M:eokb!4ST>S]YTfgZhUH4_tb]";2MM2#"e:YAUZO-O'TB58uR/'2l'=%M+!a'mcNacONsZfk)]"6uuZ>C$tX`*!o5aVIH47HR:C4q0J87=fmn0i[!"sE2jWq %;M*msj`\mf>bF0l63uQV_i2ja_&XL5jr&c_.1Z,Hgl:Q(%c2i,1YS\GFY]pl3:Os0(_C6Xcp"C(E)Api(k6-6(`@t#1;Oe3$kZn$ %>SZNi2=uqMj<\>WZ"sLfol.?MNV-d`[C.4$?#;Z_S$g1:D@@qsfB\DU2jdXE583mB7,/UW[dNNLMm19g8]L.$`>U];Ym<4SYrHg: %;364dmA)-:o*$V*'4u7Hfo4k@>KSf$>1(.'MrfO?4\i5ba>2H5B%mFD5,/]\k@q_m8#)0kCA_,+&=MY%/l*aW.lC^rVcpp47dS7\ %aC:4QS<*u/dqQr*$%PV3gB?L>HC;YA(W&uON3oN+g-(g0-CD8))7dna"e^=(`\`[0C-IT?)/+h5TUAVJ>I=L0LYILe#L,-,L?`OhFru`J,Ua\-YgJVMP#,OYL8^1d %E[r8c0j8ILS;\OPJu!rLjV$#Y/\[hs99[966O7t@DCEGF`.0QbTn:^lV)?4XL^#8s/;]VsRtM5W/.c=p0*ZC>=cl0;=>@dt[ %l-WC/TL3AUOQ,iT`^t*7>=n6VV$g]Zs+lunKEa9nq#(hMXL"cf,(?&W-0W3>oE3=RNH@&:2ZY(GgXq %`9Lr?$IrNR[;)dbO`VpNJJ`$TZBR=T@\ac?1]Y7JA3Rj$auu;\3uS;K9rYu@O(MLT,Fb/j:?I7%7\D\6&"US.XUguo<5);`)_VL[&l]`V`ho!?QP`&HhAgkM^D, %NJ.)3\pG"T%'QAH4E=]+<$QoB^*]SM\-p=E(Q2n%!$?Q9Z'_q-r5uhRN"ckt(adLc;#qE1m;uT#j[A9='(TujZ.ZrnD%E*q]*Z`C %eg8Qe8j\%S]\$1\5r)K"Wi*m65dfPO;kh;ApkIPInFg6`DkV]^O+\gH:k)S^sfka/:8=Ob1J%aP< %.'(I_Em=9Z9M,&cZ-h"FSZjeuk6`!C94r%g`i6$,f1)P=&HDp3NcU`A_iD&N"[J0aC48+?iS#!+_sU`RZ[Q78WUPnD]G>FM$^E1[Gnj%@4b`3$8KV %hT2N+@gjTUJlmWdV'BEWj(Ua0.uf&b2=!%q").%#5[lj5RB`-`i/+sgO@mXj5J8HkS;CihfdBaF7\4hnmS`X6#)\';2^f/E&trL&P,-UHo2,9TZLXSQlu8plk^@D8 %\kmL3'!"s=PL2Nq-uO"nE"h,\#FS+JqCk7h]98Kib=i>DY899Fc6FgZ_+d6t%ScX5S0[ikZ?iDh7]Qq`WPR#b0gK&@DN6MSE`(J0 %JgGRb@C($gjX!1F1JFO1iq\IE[g6ofiU/"c.dRR-]M;V:8SD/r?toT_(*T3qV&p$@l71hF@Nec.BCN?,'JlEdUENrf=G(DQmarl` %'Z;B2X;1/B*ekoOAdSOmg,Vcj,6=GmBZ!<6;q9Xs@Qho(2'K4F"1[64q[:#@nsJ?rb391gsN*q]V%T4Xg4]K^5;<2Y&H]s2pG %Y^nJk^hjpIQBkIUMck"%'OPQ.n<+mAV1`5q/oR>o5X#USSJi:=ZMt8g-66dF#X1R\Wu(u/HDXZtR`;)%R?sgFkZ`3";2i@+9K/FP %GthD!"05/2]i[-b`RmUuVBh[MCR]($!-1rQU0U+iPXs-Z$Cgn89&[aZq&p(`]MEKgIUX-sMD]cO_Z*MLc.]Vk)%/hN[c"l;JBd)f^!6 %Y%7^Mrm8b6G7"pSkhl5^PO^B5)o3 %b-52a.><49lV!E,[0,+cb4u'AkWmFZ'Z,7+WIuu3dO7'Uhg?1FiIbqU'VSZl62EE+#6Jja&]+IUh(R>C)hR?aE)m %2/;_@$%o5`3uE,T0:!)'M)L8f$5O#:'O%4t"aQ9ef5?BXN$9Ou(p.2N.O8!59+i]m;cfbpJ>G%97CHQ/Ag.AQE#ZZsJiX]pfs?YT %8\9R6ck[^\DjDYlm$DX2#[&]m&o+"(7D+EfM6/Vb_1bo$NRI`T-M`eTN92%G`/#0b.j2Q)+W6[s/W$/#lE?p9Y]^#W75<$/J^7&JW#6 %9>*)uj.m)c,TPIAJ`NS\W?pGQJl0J+VSZ]HaO##&tp^!bX^UN&!q#:b^oJ%jZ@%>*7Z@Iosl)&\97 %/LAP9&iH-?.VAE$8049`^@W[$d:$8\]]r.M*k*f=;$J1h4N$\D)4u^<,8N_#3dla>)EQTDf*b-q;WBR9+/@i@\:1)O<.J0ZBre$u %4$j*mgcc83b@Wm-53&ZnNs%Wkph&km7[QsNk14)UcT)A]"LkdU13qM5PYP5s8f1@`eBe7c4>0n=a1le5>CfLM2NDt_YDA%P-O[te %#*\!sXr="8/N?[K-Rcj[8/<2HMb&NSUKeaQ`U65DH[+S!)E)0XI3s+[fLG33$.X2n)UkZZ1:cGA %BIk\NP6HG\7\j]$@)42KKJ0t+e7hH>`#np18ut+YLnfZ<%#Q;>XS*QFkp(G)8F:[Ja^%l8e8FP'ep#Wk&Ra%`5"G%JmM0$?b'&D7 %==m)TM4ome!F) %TZN9F=iIDt)MhHTH9q5!!'H[%`:_@TC9p"Q8AdC]0p0tW[Kmm*IFSLE'6>(m&V>o*f.t)k-ejX)B>%sYG-4#0McXVOaQ!$`F/H&Q %"5o0WV=0sKK2U=5XA8,&lgCotg>WQt4"LCo2fR1+e)m/B*gZ/kW3U':?kSmX8]Fs[#utA)WN2mH),E4("0,dAQVK12=YA)8LT7_-F7KA8jFdpePtP%oeT$&u-@q2VNXKka*a\H&]Ikt@e613Am<&T_>LJL;dR$$2]"e;-Aq %nOLNhh^hA&NX41K2[]N)>\Jm6b091f%?a,77mBgO>3pcp=%o%+n[O<$O59AqT7g_^d%eX@i0)pJ(O08=UP=mg5;Om+">k@Bk$`D* %!SXX)OnddLaiTM+@mRPOf]*\S!s.pZs-!W);l@R#6=JGg;l$]6N%*:.`mG;r,VTKnD]F`-ks;dp&gdbL3Wfl2T"?W`kq;8O1HLe% %nt'Oo?kVa-,b!VVKSKN$"_5al#ZNPb4@P_AnCj4Q*k6QOO"T1p/d>DrdFdR?erd3E[,*&^CD@&t37;.c^@.ZYMR%@oBQp6.$:k>m %bV$PQIL,/A9E:H#HqDBmQVMi;oUALJ`=?XRY$I0!9fJI*Ps._@oAR,7[+`#23'GDA`"ia;F+l6bSMt^r$.]#.O4s#S%sS'IYD^0o %m,MI)5Q0m0fdD!ImU(?frp[/,]+O!Lqra;)$h4K%EcZ;N]mmI@+$Q-:+$Y)ELk5dUB].eI1B6i>o3_KD(B&LpGJDu4a+$gqB=%6f %5+N?h;!I"&^6`mT;`ir %[SU*ZRNE$mH?o&'AQS9)NU4VYUV>AMr?[eIYU4'n6t0#U@Sod#*-dm)jHtT(7TuOm-I!ZEK-YW>'$mRlXJ4M&X!AOhZCAj@4aQs\ %T^;9uS*6W)4,V"9o[?21,h]<*E6;0meXf9Tmdhfea;`5g3.L4bSgJNh`aX=h;l41V$8!Is3@6^A7jhjeegi]b/k[f3D^o)8B2m&K %+N8"jA/,'@:dGpNWoRJ^+DPqrk[p1g+2AUFLDE(.H'*UsfJc4T_aTk11@OWpOW@!sdZRT[U<7;S %ZI$:q_5;aYVJQD$Mgag[W=VY(aje2\4RUORnS?O>R%*cVjWTR)dEep,FC&B6N;0:Xgb^2+'%7&ha4X1Ur_QRlJFqVbG@;%Qbme>i %!?!]0n?'L%q8t2aC)sS_\;B3TBWY=OrlF-6>2^,f?9dA>YlPe5+jmJnQN_W4'WW`G1O".VjEMAE5eU/M2O9KA^Uhh9h*V43k=KC&l4RPu,oL+YQqJ %TTs(M9\-b8J_s6>><+Uj,*A;bi?T]+CppYQYpUjoOLpl/DDu85!5D.;pUjkX5kV`K%#;!4pk!':BH)s4D&p1?K*1uq\7]l\H4$4 %,'4l5P/oPVg:%o35C'$Gc7.'ihH&QE$N9)]AJW/Dntdg.4dlQFT;6#jMQk4Y9ZgtX>OXQOb:]^gi6c.;Xa0O!ZA@Q#V4!R7M=AKE %rH.ZDW*8>FU8j\_-Wh%:)#f,>!6bskGCP_![8u!&kB2l1Cj)G#RL^2iDr=6-ibLtS.cLF=n.ZE#G/1BA-PbG*],h20UBNNnUOOGuuK>0(hRmPM,s\6;Df %Bocs%cG>6i\\aD`Y5KmJ)TgiU\K]maT28TZ&0`H7QKs9'ltje7(HPCQpd#/89j %'BJWa;,GXo0HQX.8?=Z5AGK9hE#j7U(][US7U0=<#J,Vd\gaZQ0YTDI"'3ZrMaKje?*"Rs(gr:A=r]Vq:._'ukPY!p[%;@R(k3$S %=DtJMHDOcQ`agOl2@Xo3dlsCeYkX.afMhcD`%jajD^Ss[2dE!!"tBl5AsYhi]?DrN\$AAb?D>@#W">Kpr[-=,8Z"D^A)g`EcEj"Y %]O`.[%`&[`l25`[YXhEL$p[W8F@Wd7^;uk*9Z'/a5d!VFMFcSPr4>LVd+$=@BHolrl@MGm0]s:--!l%VTc^P`9&S*O,/@p+R`GQSORf@8D)Ap'&g9_ %NX_\&Z3H(=Noj:[:c-O)3J(80K1h3+`*(5,%Tg+V`duTG/F,F,``WA=7M]o+.Ss\P[K>K0C%f2"'.4)S(SO^='DY>NjtfklaDsjU %P^sl"Cal)hncKP1!kT'a01?/DS_T(=/-q2f*fGZiai)_cfFid$&Ic^sB%k:X.?(nM#VPe=IQhe$<.sqRhL]3P[e$@/.Pb]AJ:'(7 %*6N#.:`9E)8.jh^YNJJMg\4.3/,@pund %0iWS0#N=Y9-Q=Lq>Z_IWZZ-9m?NGIjcB>XDP7lYc%D#sW>F7E.$]@INBihF68U_n<9B4mUVV%Hjgpt->LbSU':r*:18IXY!FeR-j %$%-0IS1@d]al%?'QMr9AJW0fPa_3r]$=KR_ml7Ts`/8e-)f?:Zl]oBl9F$BJ,[nR+h)IcsAbXW*YZ1\(NeV;eUh97h//jIX$%(?e %",gR=(tYL%Qn]*S&B9Ql6&s0eCBOc.JjL6RXIJJ*h8a]+og8QK<)MOTr4 %K.Q9l-+-c(Mhh^TQE(:[\!'E@pEYlIC%O->JR-!?h;B:joQ1`XUBc\uXRkZQ&%)";YE"VC7Q-m;`LV%0/P:o%+*/8P,*+\9V5b(\ %((BnaC;@e]Z/is_Ipf\pcKf'O]QUuif%(ob*F4F*=6u("9qLfgr$h^l)dU@$3DFo16.usq9gqmG#s$urIfRG;=jAiM_o]o;cRHdV %I+4B.HU=[@d[-50RH"R\UC$6:8-_+%+dcGKZKk'%E]/dqZ_WJ)WG]Y?J>`bFP`_.f?A[c(B+59ka8mj+;b!ZG %3*:=;<`*B;NT/p<&m#i_Y?I:gWJkW[!NN6oiSk4X55eOpU?W\=tKU;1JWka!K'G,dg\i-/j?Eg?KcdbA\)4F`Bn" %:q`IF$cOHgB&5[Fk>T$aBhH9pVR"VjSi,2;MAL%O0>+h99XrEO+#'O3r_L8V&WA#>c4KH-enR$8S?FrR:bTfs5"LQ_!CVmqPNi^c %%3;'d0UC^O;^(\['r=Kn1o"!F/2eY=#Wa^f\BYY$Q6M&g"Wca,k%-U(#ba#m'cYaLd3X$S5f=grXINFk):>h`3QjRL\W[[,N&8(2 %44]og3+jfcA0$=O0eRD%U7+o1EW,C@XEG%X4p_Hu=nS$$pi$MIQF0?YQlDRA9ILes6$Ru`e?B&SG(NLb=JNU-c;%WG%d"Q^*Y,Ro\L*63TA2(#rgl'f_;Gg3#"%),AYlUOq.6JZ<=`O?lQD%I"nSSX-Z++3Q;Y*@lHGas1ghf[>D#3nSrQ %i-9Yf9_CdrP@:\1RWXG>T?N1(Tp!6p+N4t;Z`GQ@&O&i#=q0i^n6"e(B.oL!^9ba2;E&9Vi@1!<%Vj,:.EM@?Y> %,,B=**_1"Odj7i^9JGOqEA`TD:sWkl?l]:3bLq8B5oC2EpX5]ZlDeq%VTH\BaQV?^X'*;(%k7rJ_,3OM5A8`qgggP5B#uX+A6q(E %h(DaPJjqRO2HCsMm&%3H^k_0"4-imCle\((rqP'g0r3_ON*>$h8_P`2*8r9W9ZIq810SWa`GoNIaH2F`0Qu-/c5S!Tmb3nWQG?)2 %LI5=E]C@.uVnFmfA]ZNRYR;7cB6`8W*gicc'n7`Mn884j3/nV-1]mk#Nt<6a^BZ%lG]:9U?Rc&#f(uPuZ!1e(&)-e!]gj](24u=T(I9GS7;G[P4,f/!]'\MI"nTj?;P(N\J%>U?C4GhkT#___rhV02%t8T,aRB0" %E^-Y'M2$CY&%dnk*_hUT,9i"jl1_Fn`gdXZ]Q1[u=%bY7?P>7j8b'mN`1Y@Wr?/ImO;%CcekH7/\^ieK[08<;-K^7hI#o4\V;MtP %I17cY;!,c$gWL**lEqZM"")lkkS69$[pd(n$U94,Q0q8r/+K]qZX!6njWpa6X!HgMph(Kj(bNuP0GYqZFOTSSjXAX1"4*uV:?#;. %>$J/V"B4gn)>[bP#iH9"+mFK,#dgL@TgF#-1?e*uBsYb;;`r"664\aFQh$.g_cAVLj=fKf3$SaU>1d2.l?OdQ5g13t/Ph %M-ER(P(uYnnTYNQJ.OUAbLZqR_;;.tl*gUIJgLu<> %B796fUP5)Ag*dHf.SNk?OGfGm-l#iOa0O9cZ.;XqO)McT^[:EtT6;W=m0ghF!`TL?WKL=Zs,kT.d4*N/mKEJTqMlSkU %>CkJ."JNZ\W!Wj2Kb-TY42Xm<5-dR2^+e.>k+j>+WM0Tce+6$+VhA9?^_RE4E5RfSF(gbI<%]S=puo1M5qSlu$k+>LJ$1U,+c9?? %463:ZIs:6qSOiORJ%iVlFIqZNH)_rN(,6oAa'Ut*kEj(pr6q]Jo:NdEqVV1.LIWG6r9X.A?B=*\4hj",^;&G$mdAd-m_dZVDC<1] %4hnS>I"$;=o#9^EQMg^KmF=_=]_h>0p\EA8`J]d`;tRu`j$t21GrO+Q[pP_6]ro!^odIBjb&UL;+7O2T[nh'BY%i1TlK6dfCEH*r %VP?p>G`oQR=,!sOF_\\go^_/75G(0p?QCVVP5fcNIfIC;4E^O-MQ>GHrI<+2St/)oG5%UmP`%3gYH.?&rR:_ie#W9\+76SHj$c2G %]fNp?Vks*u$D4tWHN%m,&?X@$Nf\83go(q/OBq<4AiKoTirHp5CTG1Hb'`H;DMlZgBC\rnc]HH+)WfQW3QG(#4-Pq!9 %='(HT4C!@70UCe"[`*a2ruWbghrUR*h-KI;X]V466Y6:?J(;/X]ZO#f?eml1@DB@KDXG_%Y:fPkICM?nD6`lYhm0]C/qmFOoHcU! %i-$4,/V!ad3-(s8&+Q1pTTm6;E]L/$_[YY*\%QdAr=@dINk*LlpuoJu(BJIro5CqM5(A37%Ub %5=lsRB']:`-k6(:rL^>EG0]X!nin5h_41+a)d<-+,nSE&aH4.'@I/k_3J'\4Im/&II=hJ@GkrX&%qYT/OEq]UcTaA\`-ulP*oB#l %r=uQdaTogg\knRn6;?1r1jN6Fpre]hY'XM+)O@aD#I>_d6qdp'1"L;QI]F*iCDRof]DDGc*D>N)agkqEP,pmff)P0onFpYlHPlbM %AN3lO?5B/XE(Ug]bauH%A5&l011RNP*?X?C*V+>TfjcCaNlM(MWr&J?R6/>l(o_&W;GR_;aT9*NlT^6XoS!gElcD^cqhIYQgqOBK %Sof*E]G/N?8c2Y/]5Q#Gepcnd[%HVB^gb5H#lM6NFFtqCZ][+?ffD9'6k9&emnta3<=688qr]L%G2q&4=0#o`ur'G]_ %rV%rA4C#;ic1>_W]Q(YN`/)m`>CUQt]lmJVe+:>6s*]OfIcHK^a`$>?j2o2GY4hUN55NOKm@S=lLY^k49n)qd:K+Ki&$N`.^Nl1W %Hh4Lbr`jY3J+V./(Cuj>mSW\Qe(a2T[r^5P\@eP7j8AQ6Mt>,]SJ2Y"LU-McOe3_AkfLa<`>@G(Tf75F-g15j(]=Z.N6eGkhZ%gSOcs6]+EI=0j4WS!J2ekUV=T#,"4@a&HbVOVrgY;hgE[qG:?pRgo'Z$WkT^ac7rb\d2e?IHFrroJV/X"X3+^O,\@8/GX^ %gF!MU[pSK/gL&9V^\ZcWQMnB,OCEVHQutZS5LY!UPcGsea`!II!U?di#O=oSV"4D%:t`g,$u^I0ao-+g]*"PTiVpf?f>#ehRqJoW %+-(I1c'AJo(]K:FJ=l;jnRbG-GIg"fF>Z;ZkZ@ej^N`1Ai*Yu[CSgmLj]CVhG<\,WqOC4[CDH^9X3^7[?bJFn4icH/1W=Whq%_5m %]K<.Sf`TpiB*jgKrUn'dpZge6]Rt%KX3A8@4T@fSJ%n"FGl;eCIZ#k!m.V$?_S_FZ^;F0Imr,7[htbZ0,-u+KTjee]pZqbIA(b\$ %c9eWu*H$OJG^O#g]qn"Mqg:qr_YlEJK_\g#q"Z9.j&+Og< %[=3S %qo\\`YFE&mA"1"&j4Nn!-]@5ePJnK3/:M_es)`b\@fKciAAA!DrjQ--n'H+GhnDsHDmelmeo2j9$ %i?FKm`R(mI1@H8GMJa["pdq9K8U6Ntq8r6=U/*uKlbDJ(qXKkqnaZVGX9Zn;5jNsgfL0.%XG7Mf:[?tTp7^r'C?PDGoCk9$eb1p4 %]1CC3;=_9.*+s^I/C9XZ4.=J;s$"[-SZhaR(GBZ4d?3hnhlP^i?MZka-()FEV\@1jX34ip-I;Ht&jfk4&1[;rioJ8Hiaq(UnU9VD5o76@@/?d')U5qr$_h%c^\HgfDtY/;RI?RjJD;/fPenl`84p%qQ'RpA+0HLR6m71,ham2TZ39qjrp)5CU$;l&5/&LUh&I %UR/`f>Zos49+jAlMU3i"'GTcGNp9(C-DFL[`Nh)&$c<1K`gE(l03:@rbNBX]_8%C4,?V&-fbfehQi>:q7':U>pZ;$NS[VkXegGG=/?[aZ;Z?L]-pm]nZs*R"[34o3+ %8"k&.f"*+nY.r*'ns]iJ)1'U(*tOWg/\gO?m(`Q,IeK)Xa;:1MIJ$o[NOS*"Hua4Nq=NqLd.odk^]3p)r/3-JiX7@/WY[[KM)\K$ %NQrqZn$iL.+rpYWaRVI.\Tk@j>i%#\]RBIWFG8"?/d5VMms[fblTOC#phgMLR(8AG>e]0#]-G=g#I/g'SM!os+HMdVFn"gL-i7Lhj@2K%%4&"VYWZUDXr9])tJ!K %*_J:^WD=qo1\2Wrdb[jf_N03@rKj"crU^!<2/U4Kf_a7e<:DCJc;E %L7.*#0s!6)[RQ)m4U6AWOMpn:cLrJ[Y5_*6B`%[tYb;#,DYgWoEdeS$oC(GMmV=@*/ng?HO3FpjV6YFfl:DCQi`+aGB3P,9OKM[d %OKMD(]+sXh\J1'%Y5I\^#QA46Si?8V4Su\g-db2>-?E"1!K,3pW8jTf&>]moMHo5.9Ns?^kKme+9X=]S5lZGHk#!U*FfEuI`8Y%IpY%a[k-_Y662A>]hYhp_]@4NuMe8N!,5#NJZs]J[Angi/ %Yut6]NpSmt]4p(P/a'%gXq%`:6;k)4^SgVuD6Ja#.hjMQ/^pHchgbOtTq%cm2A3]C=u&f7,%qs/J*eQ\:oC3PSNe!i5mQh%GNUp2 %pR$PP7`0CAXY@/$3NmlpYu[1RCm\G9SQm[ %:AU/_;/4L>^Nt%s<+_dUQK6E:ThM&tjZ#)7-kdD4EG3`r`nOVMf2Z#I43_iZhS)C:Wj(4#%G3k5'AT):2`GNX>$W;TJ?% %U;-X%NlpeR?p_;Rf@G9C&Sp=;YIqBV]7"\.qt7/-Y,4WbX.]cnJ'IRp_1S:_ncI:'"\)Y@CjaY(tQh %IeS33VYt=\n\tK%%/L2MU8kqiK6Ae?%qF/88,.@:IC!O%StV&(m9r3>bdWl9jl^R7Pk?8#br9ccX<+#aIXceoSD.uO[$@1(r:CXa %CZ%bR:"&g.?/@dsN_bs^np&7(8:n50U$F_Wrc_$Y[Uiu/QnGo'2#ko%?9\DYn1B#T;LS`g@\FF8i8cU1ao&4>6iP7DX7$>mgDoU* %^qO(eEOejBj5'+'QbU91r:Xp4'^>&sA1.6J=81kg?X;PQHUYn[QbM[kDa'VL*O#J0X8BHC_3]UkH1gMC]keb*j"D3uqn`"XJ+pt#2g:!o0_b:$O)LUsdF+Odk5JucNlCHNI*Ek`DtKC*(U(")S+SG\+3ku,lq\_^kP6l#57Q5Mq<+8G8:$2a %CY6n`Vl.#q(VRGj]t1nHQ,h^PDjG<s@#Z %dI=J,RGi](^-$m*0;eWilW:E1R"nn'KROl<6GIm?nFG,Im^%!2>%[0DGLb%5%.pl=>Zs8]g\ncI?iS'si.#.bF@1>]rngf?=-jGI %fq%NFgg=BeBulg!W@=1>fS %i>18+?ToH3bP'URfg!,q3NpLC9`$KO0Bop$V=s];/E,cI:$V*C0Ddi;4Q)#]Ci]+pk7\lj'1pNAcCq^m,,h,e:=0jTO'W+E*#ieLJjt?5b %^9tNbk*+4UbJK*[7(@GCk"f0JUde,imWqQo)DPb^(:o]kVL2?F:NCV&S1g&5VIRI_:0\([oN4me%`a;!,h:UNQqs_tiM\H$,X3Rj %VN]`D8[GYsautXR(_LA?+-3f4(5A#XI6K-^-dHuL\s#1UoV4_lj$=IDRqJiRTg&k5?kUaD?f0"'iB4>Ci3nDa1'Mt$O>+p4pPldK %hu0nB%6GsX+3u;dL+'o4!0sCBrYE%9+jErQ=0afhaAQOdVCD(HKR*NXO)HJ;],i;)g8uZ-$GN'qJ@RcbS6(0]g`g*$!puf(K]T"' %=WX3MU$D2GiB1AZEoVR3nZa+$eM]WXZ8d?!h@7=X'kYP(7M^U*2h,S\!HLRdIpVaM$,'$S&`Kf/VP&?Wo8L8TF%cH"949f:74-fr %H)MbtngY2nioVtVaW2,)\]'-?gsu3nX78&6*Xrb-b:PUO)PK;hCGb1K_K7Qp"qqgnYG=Fs#5+= %]5cRj(k)P"_qkN0"*i#,n8t(oD%IgYMl')3X2*B!8H:gYCo?[\p]$!]-.uhU46*XqnM$L/B;jX/,KMXoC`M$DTYuk`,]![c)r3Ol %WQ5@^1DmnsaCtm:G\n_LDWe"2a9:;K@i:g'#?[W:IWhkcB.4\N-;E]p\VJs$0mq:)bYMj7cf[EkQ4!>i10^fA!69A4Odf@#So,qXb^L8"0"`903Y8ujM9!i+Z1>]PR6]b#3R;IP^ %a)GNchieKBEF#+VZi%$87tJCPD#Af,:NAL=F:^@.5$F-hY#C-b`*/54-8+\^kD&*;0/,Y:'1].k0l3UoHlb$;):;:)m:Lb$`/p6L %%aM,7s-]nd431goC.l#ajW=$7FG^EOc>-I[gLJSc\U&JpH-'@s9TqWc\O/UjU%Y>'p`aig>Q2+Cc\EpsbGtld&7%04%U(dRQHZZC %SS[LW"tVFL@GiV'5A$"2q?Yu3EK@N;'@_6(!FlXTVAf4UPT^MRU5W2KF5]SUZsgbs;cD.RjNX(W4CX+t2,[iL,agJsG_SND7#('> %ApM`(F"Y'[,`>enY7$9'lS8G$I(Y1>C:o56kf*b-WDeolW-V^2,7[6lR,9L"NiXBZdPgEiEYZ)'$'Vdq_uF)I&G %)[d3ICloTq;HN^jXeDLd.0J(/iiD=eo_?W%s1V-K6=OhkXuA`]6C0oAlZbk=])O<;#MUVrN))`3"]sMPn(jpI9FI;[& %VA.`B3ejah1T\rgRDB?!*Fiic!?T7(X9;;>Z\m-9b;"QCE75<@0Zs%7g5@j\4k<)F2>oBqIa,EYn-bgChm#L7\T>Gq=X,4,'3mJo %PdXA]$M@h#n/HCW==ob1%3\("@,lR*%@A5\RMspS3E8?Zhe-c+"hbq?WoRiWcEO4N%*]^AShB(\--)Q*gT08U*:qR$V[]&dLNX'[ %oW(\eO0rtF-9Ta&A7rl88i,q\XsW\_"<^#S6kCn!XG+\IgbuX%5FuHlE+9oi.o\1:J`ou'AiH1's8V^!&a4`A15IWq(q`1@(eakH-RITP*ufI5c,TLOk(:&s&GA %M_L$e#>*SB7Xn/ %M@i9>hPe9m9m,`'%lQ/nVE+o5C"aK_&At3Qc>1ge7h]MDZM7e(=J35uad=UFEMj1q8?6m!dr\'IQIKC&oQ]k[=V+jWBRN5sJ_je,CGNh<4N_tTb/:?f %H4#Bm]pUR-,V:20>eY0IX6I-V7FH^/X[us&7F](",c*e&,_:(-/It(u)>'!B.WoWQWgFB''B/t)@)TdWSc0;'K3@rSpR!tcmAO]:&/GkF8qc,+ZQLs3fEpZF8.jDR\pqI[CJKQ %S#)!W=XurPFE(7b=;DY0!T'cmck^7p/X)f`#s8BajmsARRHSd?B12LK5B,fZL-]ZPgn-cYE]SWZrq4ark%,8jGD?EQ\\9Mk-i\SG %kg;%"mk0+%\bL,dGr*.G^%e'=MZ(WYQ_3di^59b"$b/=S^Amg9$(;mpVV3!QT*M<52ld%GF*N/bC;0@ %o9HfR0E+?mEE3"\kkkD]Jb6&o:Ol'?Tsr9^ %AI9_PrivateDataEnd munin-2.0.25/logo.svg000066400000000000000000000232171243472346000144210ustar00rootroot00000000000000 image/svg+xml munin-2.0.25/master/000077500000000000000000000000001243472346000142265ustar00rootroot00000000000000munin-2.0.25/master/Build.PL000066400000000000000000000014271243472346000155260ustar00rootroot00000000000000use MasterBuilder; use warnings; use strict; my $build = MasterBuilder->new( dist_name => 'Munin::Master', dist_version => '0.0.0', dist_author => 'The Munin Team ', dist_abstract => 'The Munin Master', license => 'gpl', requires => { perl => '5', 'Digest::MD5' => 0, 'HTML::Template' => 0, 'Log::Log4perl' => 0, 'Storable' => 0, 'Text::Balanced' => 0, 'Time::HiRes' => 0, 'Getopt::Long' => 0, #'Munin::Common' => 0, }, build_requires => {}, recommends => { #'Net::SSLeay' => 0, In Munin::Common? }, ); $build->create_build_script; munin-2.0.25/master/DejaVuSans.ttf000066400000000000000000022767041243472346000167720ustar00rootroot000000000000000FFTMOńpÉ<GDEFXŔ]äX†GPOSţŽ/ŕ‹ćGSUBN֘LČěOS/2ů" Ľ´VcmapĄčŚ .cvt i9ť<ţfpgmq4vj˝<Ťgasp˝č glyf}oő2˝ôĂ|headđˇ?ˁp6hhea ¸Ť¨$hmtxŐđvNĚUhkernk/6i×4<~locaJTĂô´UlmaxpÇ Ăi namepMĽi@=postL3ÓŚHŇprep;ń x\hÄ>‹îĹŮrmĹŮrm "W°ąĹĆĆÇĘËĚÍŃŇÓÔäĺéęóôôőőöö÷˙           "##$HIIJLMQRpq|}Ţßçč     "#ÁÂÇČ â ă ă ä í î đ ń ; < < = I J P Q Q R U V W X o p q r Š ‹ ‹ Œ~‹ŒŒŽ—˜¸š!"–—žŸqr|}ĐŃŘŮ2334YąĆÇĘÍ×ŘŘŮŮÚäęíîőöö÷÷řúűýţ˙ Ü\DFLTzarab†armn¨brai´cansŔcherĚcyrlŘgeorôgrekhanihebrkana*lao 6latnFmath†nko ’ogam runrŹtfng¸thaiĆ˙˙KUR SND URD ˙˙˙˙˙˙˙˙˙˙MKD SRB ˙˙˙˙˙˙˙˙˙˙˙˙˙˙4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4˙˙˙˙˙˙˙˙˙˙˙˙˙˙ kern8kern>markFmarkTmark\markdmkmkjmkmkrmkmkx    "*2:BLT\dlt|„Œœ¤ŠÜxŞ8 Î 8ü˜ >/˛0Ú2Š4<7j7Ě:I”`Úˆj0&: ţ ţÔýósv{sv{ƞî &,28>DJPV\bhntz€†Œ:¤:Ü::ܤţrü Äü4 Ä4Đ `Iqrtuwxyz|ŃŇÓÔŐÖ×ŘIqrtuwxyz|ŃŇÓÔŐÖ×ŘJPV\bhntz€†Œ’˜ž¤Ş°°°°°°°°°°°°°°°°°°°$ ýlýŕ ý¨ý¨N>X  &,ý„öýlwýlwýlwýfný„ö " &,28ýl`ýl~ýl~ýl`ýl~ýl`Z&” #HNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöüţýŢţýŢţţţţţýÚţţţţţţţţ‰ţţ‰ţţ‰ţýÚţţţţtţţtţţţţţţ;ţţţţţţ8ţţ8ţţ8ţţżţýÚţţţţţţ ţţţţţţţţţţţţţýÚÇĘÍŃÔâ ęířúţ˙!" ÇĘÍŃÔ× Úâ ęířúţ˙ !†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FţţţţţţţţţţţţţţţţţţţţţţţţţţţţţţţţţBŢŽ :v|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚţhţhţhţ=ţţţDţţţĹţţhţhţ¨ţ¨ţhţÚţDţ“ţţhţhţ=ţĐţDţDţţţţÚţnnnnţţţţţhţhţţţţţţţţřţřţřţřţřţřţřţřţřţąÂîîđóőő÷÷űý   !ÂÇ# J P)rr0tt1v|2339 ąÂîîđóőő÷÷űýÂÇ J P%r|,3378âčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,ţ{ţ{ţ{ţ°ţţţţţţ{ţ{ţ{ţ{ţ{ţ{ţ{ţţţţţ{ţ{ţ°ţţţţ{ţ{ţ{ţţ{ţţţţţ{ţ{ţţţţţţţţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{¸ŽÚ $6HZl~ c˙œČ˙j c˙œČ˙j c˙œČ˙j c˙œČ˙j c˙œČýÚ c˙œČýÚ c˙œČ˙j c˙œČ˙j—ž#sv{>DJPV\bhntz€†Œ’Ž* ôęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô ú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ{U:tŒŤÁŁ!N„‹8Š'šQ˝Änâââ˙œ˙œôţ ýÚźţp˙œ„ţpô˙j„˙j„˙j,ýv,ý¨,ývÂ˙jÂ˙jôţ ôţ Xý¨Xý¨Xý¨XýD[˙j[˙j×ý¨×ý¨,˙œ ˙8źýÚ ˙8źţ>đý¨îţ>ô˙jôţ źţpźýÚ„˙jźýÚ„˙j„˙j„ý¨„ţ^„˙j„ý¨„˙j„ý¨,ý¨,ý¨,ý¨,ý¨,ý¨,ý¨,ý¨ôţ ôţ ôţ ôţ  ˙8 ˙8 ˙8 ˙j ˙jźţ>îţ>,ý¨ôţ źţpźţpô˙jIŤ^`’k/ŠŐÝ#€eÝ€YYYŁcPţř`Ţ{U:tižÁiŁ!N‹ŠšQÄnU!Q{„ý¨„ý¨+ýÚ+ýÚ„ý¨„ý¨+ýÚ+ýÚ„ý¨„ý¨+ýÚ+ýÚ„˙j„˙j+˙œ+˙œ„˙j„˙j+˙œ+˙œ„˙j„˙j+˙œ+˙œ ˙8 ˙8ô˙j˙j ˙8 ˙8ô˙j˙j,ý¨,ý¨Xţ Xţ ,ý¨,ý¨X˙X˙,ý¨,ý¨Xţ Xţ ,ý¨,ý¨Xţ Xţ ôţ ôţ ôţ ôţ  ˙j ˙j,˙j,˙j ˙j ˙j,˙j,˙jîţ>îý¨ôţ ôţ +˙œ+˙œźţpźţp+ţ˘+ţ˘,˙œ,˙œ,˙œĹ˙œ,ţ ,˙œ,˙œ,˙œ,˙œ,ţÔ,ţÔ,˙œ,˙œ,˙œ,˙œô2˙œ˙œ˙œ˙œôţ ôţ ý¨ý¨źţpźţp+˙œ+˙œ˙œ˙œ„ţp„ţp+ţ˘+ţ˘ô˙jô˙j„˙j„˙j+˙œ+˙œ„˙j„˙j+˙œ+˙œ,ý¨,ý¨Xţ˘Xţ˘,ý¨,ý¨X˙œX˙œ,ý¨,ý¨X˙œX˙œÂ˙jÂ˙jÂ˙jÂ˙jôţ ôţ ôţ ôţ Xý¨Xý¨Š˙jŠ˙jXý¨Xý¨Š˙jŠ˙jXý¨Xý¨&˙j&˙jXý¨Xý¨&˙j&˙j[˙j[˙jS˙jS˙j[˙j[˙jS˙jS˙jŠý¨×ý¨X˙œî˙œŠý¨×ý¨X˙œî˙œ ˙8 ˙8ô˙j˙jźýÚźý¨ô˙j˙j ˙8 ˙8,˙j,˙jźţ>źţ>S˙œS˙œđý¨đý¨&˙j&˙jîţ>îý¨+˙œ+˙œô˙jô˙jÂ˙jôý¨ôţ ôţ źţpźţpźýÚźýÚ+ţ˘+ţ˘„˙j+˙œ+˙œ ˙8ô˙j˙jźý™ô˙j˙j+˙œ+˙œ„ţ^+ţÂ+ţ„˙j+˙œ+˙œ,ý¨X˙œX˙œ,ý¨X˙œX˙œ,ý¨X˙œX˙œ,ý¨Xţ Xţ ôţ ôţ źţ>S˙œS˙œźţp+ţ˘+ţ˘ôţ ô˙jIIIŤŤŤ^^^```’’’kkk///ŠŠŠŐŐŐÝÝÝ###€€€eeeÝÝÝ€€€YYYYYYYYY$AMp‹ŒBŽŹDÁŢcŽ–˜›ŠžţŽ–ďƒs ~źÄĆĆ™Ů2š#sv{ćBHNTZ`flrx~„А–œ˙˙’F˜ 'PV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4UŒŃ0+0Ź0™08q0ľ080É0i0´0E0 0Ř10ýÍĽ0ä0­0Ë0P=Œi0v0Ľ0v0Ŕ0d0˝0˝0UŒUŒ8Ń0É00UŒ $*,022 45 78:>‹‹“•–˜™œ ´¸"™0¸Žä $6HZl~ cr– cr– cr–ä cr–ä cr–Ü cr–Ü cr–Ü cr–Ü—žIqrtuwxyz|ŒŃŇÓÔŐÖ×ŘRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄ`°°°°°°°°°°`°°°°°°°°& śb ľlrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô ú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤R``S`ž4Âârôr„čÂL„R„LŠčŠčŠâčâźîźčX X X X [r[rÂ~Âx,°źLôLźÜŠŠśŠčÂRôîôîôî„čôL„â„L„č„R„č„č„L„芊܊čŠčŠÜŠčŠčźxź°źîźâźLźLźLôxôxź4ŠîŠâôâôîôâÂRđIđŤđ^đđđ`đđŕđđnđđ§đŠđËđÝđ#đň€ňđđ”đÝđ€ňYđđđđYđYđő`R``S`„č„č+č+č„č„č+č+č„č„č+č+č„L„L++„L„L++„â„â+Ş+ŞźLźLô@ŞźLźLô@ŞŠčŠčXčXčŠčŠčXčXčŠčŠčXčXčŠčŠčXčXčźâźâźxźxôxôxúúôxôxú¤ú¤ŠîŠŠôâôâ+č+čôîXV+č+č,¤,¤,:Ű,°,Ü,Ü,:,:,°,°,,,:,:ÂLĐĐ˜˜ÂâÂârrôX+F+Frr„č„č+č+čÂL&L„R„R++„L„L++ŠčŠčXčXčŠčŠčXčXčŠâŠâX~X~ččââźîźîźčźčX X ЄЄX X RâRâX X & & X X &č&č[r[rSrSr[r[rSrSrÂ~ôčÂ~îčÂxô~Âxî~źLźLôF°ôLôRôF°źÜźÜúúŠŠSrSrŠśŠR&R&RŠčŠî++ÂR&RôLô ôîôîôîXVôîXî+č+č„č+č+čźLôLśôRôLś++„R++„č++ŠXŞXŞŠÜXxXxŠÜXxXxŠâX~X~źîźîź4S4S4źś+°+°ź°&RđđđIđIđIđŤđŤđŤđ^đ^đ^đđđđđđđ`đ`đ`đđđđŕđŕđŕđđđđnđnđnđđđđ§đ§đ§đŠđŠđŠđËđËđËđÝđÝđÝđ#đ#đ#đňňň€ň€ň€ňđđđđđđ”đ”đ”đÝđÝđÝđ€ň€ň€ňYđYđYđđđđđđđđđđYđYđYđYđYđYđ%%//88Mp‹Œ'ŽŹ)ÁŢH’’fŸŸg¨¨hŽŽišţj–°ƒ4 ?źÄQĆĆZŮ2[Iqrtuwxyz|ßŕáâăäĺçŒŃŇÓÔŐÖ×Řrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü`°°°°°°°°°°{{{{{{{{`°°°°°°°°ö <BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢä]xÜţx˙@€[")˙@>Eö"~~€x2 x::î-."> @FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîô]kxyyÜyšxy€z[f"w)h>yEy`Pö["~[~t`€zxy2{` ”ˆuxJJ:ˆ:ˆî++-.   !" 28>DJPV\bhnttbbbbt`~~`~` Z ŚţRŠ ÇĘÍŃÔ× Úä ęířúţ˙!"#Ž”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZţ˙˙ţ˙˙ţţţ˙ţţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙ţţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙Ö Y´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđđ $=D]“”4–—68QT9Zd=grHw{T đđD6L  $J–s}ĂŐí-ą˛ ţ{ţ{8Ć> 7pv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´˙Lž/'˘îŃŚ–s.}////Ń–////s}/////s{y5D;Í/}ţR7$&(,268DFHLRVXŽ‘ŽŻ°ąĂŐęëěíîďňó-‘’ĘËĚÍ*ö÷ Ž [\]^klzŁ?Řţ ä   $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô‹‹‹‹‹‹‹‹‹‹źźLěžž\/.ţRž™ső'ž'}“sîźőÍržJˇ¤f–;ŚţRŚţRŚéŚsŚţRˆţR%ô}^Gb`ţR////ă}}J–Đ////ډţRs}ˇf7ţR/'ţz`ţRŰţR///Śôźîźž”.ţRţR'}r`ţR‡T֍¦TţRTcRRJ@@îţRjţRjţRŚbţRb}ţRŚŚţR€™ţţRîţRééţRéţR‰ţR‰ţR‰}éŚţR555ţRţRaţRƒt;Q'ţRţRţRńţRţRţRôţR}}^G^dţRţRţR°:°:ţR'aHŚŁ˙öţRŤţR_ˆţR°:ţţţRţŁGţRŽ ţR~ţRJ}'/'}žŚ'}^TŚTT@ŚX‚}ą˝˝˝Tg^GţX^//LBRţRfÖŢ,4$ţR'„˜_úzţRf4÷ĆŽLĆó}÷`ţRüeˇ™™žTôŚžŚž'sţRź^őG^Ł5sÔ/ţR‰ţRwţRžţRJţVŃ1×ĹŃüvüv˙öüvţR•’ËŽ;ÍnŰţR ţRŚţRL5s/Ěőî<\’‘ţRô&ŐRäx9Ô´\‹‹w‹‹‹‹‹‹‹ţRŠÇ}ţRO$= D]$Ž‘>¨¨BޞCşşHĂĂIŐŐJéďKňóRúúT  UV--WEEXNNYTTZYY[aa\ll]vv^{{_‘’`ĘÍböřf iJqLmŽFFĐIIŃLLŇˆˆÓššÔęëŐ×""Ů33Ú66Ű|}Ü34Ţ6;ŕ>FćJNďRWôö÷ú Ž ü S Sţ [ ^˙ ` b e e h m t t x x | }   ƒ ƒ … ‰ Œ  ~ ~……‡ˆ Šš"œž3ŔŔ6QT7VW;Yd=grIw{UüZ&&m((n]fo٤yťť{ĹĹ|ĎĎ}??~ ÇĘÍŃÔ× Úä ęířúţ˙!"#Ž”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZţ˙˙ţ˙˙ţţţ˙ţţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙ţţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙ţ˙˙nÜş 6ntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FNT\bjpv|‚ˆŽ”š ¨Ž´şŔĆÎÔÚŕćěňřţ $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz‚ˆŽ”š ŚŽ´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô ú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ "*06<BHNTZ`fntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú  &,28>DJPV\bhntz€†Œ”š ŚŽ´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČ‹đ‹đ‹đ‹đ‹đ‹đ‹đ‹đ‹đ‹đźđźđLđěđžđžđ\đđ/đ.đžđ*đsđőđ'đžđ'đ}đ“đsđîđźđőđÍđrđžđJ{#đ¤{ţđ–{;đj{đ//đđé{‰{s{ Ś{o{{'{đ}{^{G{b{`{{'đă{Ś{}đ}{đŞđQđ{Ś{‰{{}{đđ\đLđţđXđÄđžđ;đ\đżđ/đ/đđđ‚đőđ'đđŔđ'{đđsđđsđ§đrđ`{žđ{{'đđ‰{đ{źđîđźđžđ{.đ/'đ}đ{rđ`{‡{T{Ö{đÂ{Ś{ţđţđc{R{R{J|@{@{î{{jđj{Ś{b{b{}{đđ/{€{™đţđđđé{é{é{‰{‰{‰{}{{é{Śđ3{3đ3{^{a{p{‚{;{Q{'{đđń{đ{đ}{}{^{G{^đd{{{{{°đ:đ°đ:đ'đa{H{ŚđŁ{/Ť{{jđ°đ:đţđţđţđŁ{GđŽ{ đđđJ{~đ^{}đJ|Eđ‰{}đ{Ł{‚đ‡{{Eđ}{p{Ś{t{}{j{{Ş{b{¤{^{~đ~đ đî{}{t{^{ď{Ś{Ś{/'đŚ{ň{đŚ{Hđ“đ/đŐđrđđźđźđźđ™đtđžđOđsđőđîđ}đsđđ'đđžđLđsđođqđÍđđ˛đGđGđYđ‡đźđNđsđŕđT{›đa{E{ö{{›{@{‚{t{ř{{‚{}{{Ś{Ś{T{`{kđb{{K{Š{Š{{{{˛{ö{t{Ś{'{///ú{ó{4đ{źđ^{óđc{sđö{„đ"{Ođ–{,đs{Ođ–{đ%ú'đ}{đ•{žđŚ{Ođ›{îđt{îđt{îđđđe{đsđK{Ł{‰{{'đ}{E{Íđb{ř{ř{‚{^{{{T{Ś{TƒT{{@{Ś{{{‚{}{ą{˝{˝{˝{{{{{T{g{b{^{G{{ţ{{^{ř{LđBđRđfđĆđÖđŢđ,đ4â${đ'đ „đ˜đ_âúâzđfđ4đĘDĆđŽđLđđĆđóçç}1÷{`{üđeđđ*đđ*đžđ}đT{đđđžđđžđ{'đsđźđ^{őđG{^{đŁ{Ş{3đs{Ô{ˆđžđ/đłđ {0đĆ{™đö{Őđ{™đ{'đlđÚ{nđ{T{T{đđwđžđJ{{đŃ{1đ×{ĹđŃ{üđv{üđvqüđv{*đ’đ\đŽđ;đÍ{nđ{Űđ{đđ‰{Lđ5đsđ/ˆĚđőđîđ<đđ\đ’đ‘đđôđđ&đđŐđRđäđx÷9÷Ô÷´{\{‹đ‹đwđ‹đ‹đ‹đ‹đ‹đ‹đ‹đőđ{{ęđđ{{{Çđ}{m$= D]$šš>¨Š?˛˛AşşBŔŔCčéDóóFúúG  HI55JBBKEELHIMNNOPPPRVQXYV[]X__[aa\ff]ij^lp`txe{{jŹŹköůl pJxLmľE]×deđiiňkkómmôooőwwö„Š÷ŒŒţ˙˜šžŁŹŽĚÎă.čďDóL ["#a*+c.6e@@nMMoXXp^^qbbr|}s‹‹u’“v§§xłłyľľz3;{>G„JNŽQW“[[š S S› [ ^œ ` b  e eŁ h m¤ t tŞ x xŤ | }Ź  Ž ƒ ƒą … ‰˛ Œ ˇ ~ ~ť…žźŚŚÖşş×ŔŔŘ$'Ů*0Ý25ä88č::éQTęVWîYdđgrüw{ü && ((!]f"˘¤,ťť/ĹĹ0ÉÉ1ĚÍ2ĎĎ4??5 ąĹîóőő÷÷űý "#ÂÇ( J P.r|533@A$*06>FLRX`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>FNTZ`flrx~„А–ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţŠoţrţrţ{ţŠrţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ýŽ{ţ{ţA{ţ{üę{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{ţ{&Ř!0#5P˙Ó˙ˇKr9K˙D˙ˆ˙­˙š˙ &˙É˙Ü&˙ÓK˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙u˙ˇ˙Ü˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙u˙Ü˙Ü˙a˙a˙u˙­˙ţř˙/˙Ü˙Ü˙Ü˙Ü˙Á˙ˇ˙˙Á˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙ˇ˙˙Ü˙ˇ˙˙˙­˙Ü˙Ü˙Ü˙Ü˙Ü&˙Ü˙Ü˙˙Ü˙Ü˙Ü˙˙˙Ó˙É˙Dţˇ˙a˙D˙Ü˙Ü˙D˙˙k˙ˇ˙k˙˙D˙D˙˙ˇ˙˙D˙D˙˙k˙ˇ˙Ü˙Ü˙˙D˙ˇ˙Ü˙ˇ˙D˙Óţˆ˙ˇ˙š˙Ü˙Ü˙Ó˙Ó˙É˙Ü˙ˇ˙Á˙ˇ˙ˇ˙Ü˙Ü˙Ü˙ˇ˙Á˙˙)˙Ü˙˙˙a˙É˙ˇ˙ˇ˙Ü˙š˙š˙š˙k˙}˙˙Ü˙š˙š˙š˙Á˙Á˙Ü/˙ˇţć˙š˙˙Dţđ˙Ü˙Ü˙Ü˙D˙Ü˙Ü˙Üţaýć9˙­˙Ü˙Ü˙Ü˙}˙˙Ü˙Ó˙Ü˙D˙ÓţÁ˙}˙Ó˙¤˙ˇ˙Ó˙Ü˙ˇ˙Ü˙Ü˙Ü˙Ü˙¤˙ˇ˙ˇ˙Ü&&ţˇ9˙Ó˙Ü˙}˙­˙ˇ˙Á˙­˙š˙k˙˙­˙}˙Ó˙¤˙¤˙¤˙˙˙Ü˙š˙Ó˙¤˙¤˙¤˙k˙}˙Ü&˙D˙ ˙˙a˙ˆ˙Üţ­ţ¤ţ¤˙Áţ¤ţÓţ­ţÉţ­ţÁ˙D˙˙ˆ˙ţŕţôţçţ¤˙Óţř˙Ü˙ˆţř˙Y˙}˙Ü˙a˙a˙Ó˙a˙u˙É˙N˙˙a˙a˙a˙uţć˙­˙˙ˆ˙˙}˙ˆ˙Ó˙ˆ˙¤˙ˇ˙Ü˙˙Ü˙}˙ˆ˙ˆ˙ˇ˙Üţř˙š˙k˙}˙Ü˙¤˙˙k˙¤˙a˙­˙Ó˙ ţaţđ˙a˙˙ţćţđ˙ˇţđ˙˙˙k˙ţćţđţđ˙˙˙Üţř˙Ü˙Ü˙Ü˙Ü˙Ü˙˙k˙ˇ˙Ü˙Ü˙Ü˙ˇ˙ÜA˙˙Ü˙ˇ˙ˇ˙Á˙ˇ˙Ü˙ˇ˙ˇ˙Á˙k˙˙¤&˙Ü˙Á˙k˙ˇ˙}˙}˙D˙Ü˙Ó˙Ü˙Ó˙Ü˙Ü˙Ó˙Ü˙É˙ˇ˙Ó˙Ó˙ÓHVţÉ˙É˙a˙˙Ü˙Ü˙Üţđ˙D˙˙Ü˙Ü˙)˙Ü˙Á˙Á˙Á˙Á˙Ü˙ÜţÜ˙k˙Ü˙ÜţÓ˙Ü˙Ü˙Ü˙Ü˙Ü˙˙˙Ü˙k˙Ü˙Ü˙ܗ˙Ü˙Ü˙ˇ˙ˇ˙Ü˙Ü˙Ü˙Ü˙D˙N˙˙˙˙Ü˙Ü˙Ü˙Ü˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙u˙ˇ˙Ü˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙u˙Üţř˙/˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙u˙ˇ˙Ü˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙u˙Ü˙ţř˙/˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙u˙ˇ˙Ü˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙u˙ţř˙/˙­˙¤˙˙Ü˙Ü˙Ü&˙k˙ˇ˙Ü˙D&˙˙˙­˙¤˙˙ˇ˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙u˙ˇ˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙u˙Ü˙ţř˙/˙Ó˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙a˙}˙˙a˙Ü˙Ü˙Ü˙ˇ˙Ü˙Ü˙ˆ˙­˙ˇ˙Ü˙Ü9˙Ü˙Ü˙Ü˙Ü˙Ü˙Ü˙a˙˙­˙a˙Ü˙ţř˙/˙Ü˙Ü˙˙Ü˙Ü˙Ó˙É˙D˙?˙}˙D˙Ü˙Ó˙Ü˙Ó˙Ü˙Ü˙Ó˙Ü˙É˙ˇ˙Ó˙Ó˙Ó˙ÜVţÉ˙D˙ ˙˙a˙ˆ˙Üţ­ţ¤ţ¤˙Áţ¤ţÓţ­ţÉţ­ţÁ˙D˙˙ˆţ­ţ¤ţ¤ţÉţ¤˙Óţř˙Ó˙ˇKr9K˙D˙ˆ˙­˙š˙ &˙É˙Ü&Kţř˙Á˙ˇ˙Á˙Á˙ˇ˙Á˙ˇ˙ˇ˙ˆ˙Ü˙ˇ˙˙k˙˙ˇ˙ˇ˙ˇţ}˙ˇ˙ˇ˙k˙ˇ&˙ˇ˙˙ˇ˙ˇ˙ˇ/˙˙ţćţˆ˙˙ˇţˆ˙Ü˙ˇ˙ˇ˙ˇ˙˙<˙&˙˙ˇ˙ˇ˙ˇO$$%%&&''))**++-- .. // 22 33 445566778899::;;<<==HHIINNQQRRUUYYZZ[[ \\!mm"}}#‚‚$ƒ„%……&††%ˆˆ'‰‰(’’”˜ ›žŸŸ  )ĄĄ*Ş­˛˛+łł´¸żż!ÁÁ!ÂÂ,ÄÄ,ĆĆ-ČČ(ÎÎ(ĐĐŇŇ.ÝÝŕŕűű ˙˙ /  0  ""&&100::?? š š2 Ĺ Ĺ3 Ç Ç4Ą$$%%&&''))** ++-- ./22 3344 5566 778899::;;<<==DDFFGGHHIIJKLLOOPPQQRRTTUUVV WW!XX"YY#ZZ$[[%\\&mm'}}(‚†ˆˆ)‰‰*”˜ ›žŸŸ Ą˘˘+ŁŁ¤§+ŠŠŞŞ,ŤŤŹ­,˛˛-łł´´.ľľś¸.ťť/źź"˝ž/żż&ÁÁ&ÂÂ0ĂĂ1ÄÄ0ĹĹ1ĆĆ0ÇÇ1ČČÉÉ2ĘĘ3ËË4ĚĚ3ÍÍ5ÎÎĎĎ2ĐĐŃŃ6ÓÓ7ŐŐ8××8ŮŮ8ŰŰ8ÝÝŢŢ3ŕŕ9ááââ3ää:ńń;őő;űű˙˙  3<3<=<;    !! "" ## $$>%%5&&''!((?++@--@//@0011"33@55@66A77B88C99D::??ˆˆ4ŹŹE­­FŽŽEŻŻFÚÚ ÜÜGÝÝ4đđ3ńńHóó4ôôIőőJ H HA I IK J JL K KB L LA M MB ¸ ¸C š šD Ĺ ĹM Ć ĆN Ç ÇO^$%&')*+-./23456789:;<=HINQRUYZ[\m}‚ƒ„…†ˆ‰’”•–—˜›œžŸ ĄŞŤŹ­˛ł´ľśˇ¸żÁÂÄĆČÎĐŇÝŕű˙  "&0:? š Ĺ Ç`$X˙Ř˙ą˙Ł˙œAYAEGKMQ SW .DFLTzarabˆarmnÂbraiĐcansÜcherčcyrlôgeorgrek"hani2hebr>kanaPlao \latnhmathÖnko âogamôrunrtfng thai˙˙KUR SND (URD (˙˙ ˙˙ ˙˙˙˙˙˙˙˙MKD SRB ˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙˙4ISM FKSM FLSM FMOL ZNSM FROM ZSKS FSSM F˙˙ ˙˙ ˙˙ ˙˙˙˙ ˙˙˙˙˙˙˙˙aaltŞaalt°aaltśccmpźccmpÂccmpĘccmpŇdligÜdligâdligčfinaîfinaôhligúhliginitinit ligaligalocl locl&locl,medi2medi8rlig>rligHsaltPsaltVsalt\     'PX`h‚Š’š˘Ş˛şÂĘŇÚâęňú "*2:BJRZbjrz‚Š’J\¨ nĆvÎX č ˛ ś  ş  ţ     ä  ˆ  Ě p ¤  *  H † Đˆ˜Üěü”˜śÔę Rˆ˜ ¨°ÚŰÜÝ !$% B6##66ŒŒŒ>9LMń *_ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹîďđńňóôő÷űüý‡ęěő ‘ J K L M ˜ ™i$=EEGGIIKKLMNOWW‚˜šĄÂÂÄÄĆĆČČĘĘĚĚÎÎĐĐŇŇÔÔÖÖŘŘÚÚÜÜŢŢŕŕââääćęěěîîđđńńňňôôööřřű      ""$$&&((**,,..0022446688:;==??AAHHRRTTVV‘“••¤¤ŹŹŽŽÚÚÜÜđđôô  **__ąĹÇĘÍäęíîőöö÷÷řúűýţ˙‡‡ęęěěőő ‘ ‘ J M ˜ ™&   &$$4F§Ť§§¨Ť!!$$4F§Ť§""$$4F§Ť§##$$4F§Ť§$$$$4F§Ť§ŞŤŤ%%(0§§§AD&.6¨¨¨EEGI&.6ŠŠŠJKMN&.6ŞŞŞOQSS&(0ŤŤŤTW&v6Pblv€’œŚ¸ÂÔŢčňü",6PZdžœ ľŸ Ą˘ ´Ł¤Ľ Ś‹§ ś¨ŠŞŤŹ­ ˇŽŻ°ą˛™ ˜ł › š$%&'()*,-./024578:;<=>A˛šĹ– BŮÜßâĺčëîńô÷úý  !$'*-0ÁŢŽD$&(*,0268<@DHLNPRTX\`dhlptx|€„ˆŒ’”ƒ‰ÎĆş’žĘ•˜ŢÚ›âćěÄźę†ŇÖîňžöžřüÁĆMegp‹Œ#ŽŹ%BÚÝŕăćéěďňőřűţ  "%(+.1ÁŢl3.4:>BFJVZ^bfjnrvz~‚†ŠŽú–…‹ĐČź‘”ŔĚÄ—šŕܝäčˆÔŘđôŔ ţĂ QQSSUY^egmop‹ŒŽœĄ¨)ŞŤ1BŰŢáäçęíđóöůü˙  #&),/2ÁŢl3-39=AEIUY]aeimquy}…‰ů•„ŠĎÇť“żËĂ–™ßŰœăç‡Ó×ďóżŒŸý QQSSUY^egmop‹ŒŽœĄ¨)ŞŤ12  ÓwÖw ÖvÓssvw~&8JlŃwŇw ×zÔw ŘzŐw ŐuÔtŇrŃq Řu×tqrtuwz 0ž0‚> $›*™&—$œ*š&˜$‚J 8 "(ƒIO‚ILO€LI ƒO‚LI˛Rlž¨$*06< xwvutsrqP{NzMy &,!xwvutqOzQzRfnp¸0$B 8  Šńˆď‡é†ú‰úéř…WV„WAˆ(:FPZfr đ" ă ď î" ‹$; <V p0 q(/ QF WX VR")567DF o ogfhdeji#9?FLTZgfhdeji#9?FLTZϝŢ,-DO *"&ĎťĹ?˘,-DO\  X6 usvtyzr3{w|x ą˛ł´ˇ¸šťź˝Ŕ óůÉ!٤ůóůĚÍĘË LMń *_‡ęěő ‘ ˜ ™™§Ťž§ŤŁ§Ť¨§Ť­§ŤYYYYY§Ť3™3™×f ç.˙Ňý˙ `)PfEd@ ˙˙ţšmăŕ˙˙˙,¤$, ¤xÚÚ~éîó÷OSXZbw~ŠŒĄ%V_‡ŠĂÇęô  :UZot‡’•˜Ą¤ŚŠŻľşżĆĚÎŐůçőú?‚„ˆŠ—ŸŁĽ§Ťš˝ÄĆÍŮÝĹü5JR˝ę>Pj…–ŻŢáGvœ#.[jx{…żÉ›ůEMWY[]}´ÄÓŰďôţ ' d q Ž ” ľ Ń × Ü á! !I!K!N!„###!#(#,#u#z#}#‡#”#Ž#Ď#ă#ĺ$#$i&œ&¸'' '''K'M'R'V'^'”'Ż'ž'Ć'ŕ'ë(˙)) )A)„)Ő)ë)ű***/* *ş*ú++$+T,o,w,}-e-o..%..M˙ŚGŚMŚQŚWŚnŚŚ•§§§+§?§K§O§ƒ§Œ§˙đöĹűűű6ű<ű>űAűDűOűű•űŸűÚűéű˙ţţ#ţtţüţ˙˙ý˙˙  ěó÷QWZ\pz„ŒŽŁ 1Ya‰°ĆĐđ  !@Z`ty‘•˜Ą¤ŚŠŻľşżĆĚÎŐđŔëř?„‡Š”™ĄĽ§Ş­ťŔĆČĐÜ Đ 7LTŔě@RtŠ ŢáFn€&0]w{…›Äž HPY[]_€śĆÖÝňö * j t    Đ Ö Ű á!! !K!N!S!###$#+#s#z#}#‡#”#›#Î#ă#ĺ$"$`%& ''' ')'M'O'V'X'a'˜'ą'Ĺ'ŕ'ć'đ)) )@)ƒ)Î)ë)ú** */*}*Ž*ů+++S,`,q,y-0-o.."..MŔŚDŚLŚPŚTŚbŚŠŚ”§§§&§0§F§N§€§‰§űđöĹűűűű8ű>ű@űCűFűRűŠűžűŮűčűüţţ ţpţvţ˙˙ů˙˙˙ă˙Â˙Ŕ˙ź˙š˙ą˙°˙­˙Ź˙Ť˙ž˙œ˙—˙–˙•˙”˙’˙‡˙…˙„˙ƒ˙^˙\˙T˙O˙>˙=˙<˙4˙/˙,˙+˙&˙"˙˙˙˙ ˙ ˙˙ţţţýţűţöţńţíţéţăţŢţÝţ×ţ˝ý÷ýôýň÷Ž÷m÷l÷j÷i÷g÷a÷`÷_÷^÷]÷[÷Z÷Y÷W÷V÷U÷S÷Qőő…ňň€ňň~ň}ň|ňzňyňqňpňoňfňbňYň+ň)ńĹńŸń–ë3ë2ë0ë/ë.ë"ë ëëęţęČęĆęŔęžęźęşę¸ęˇęśęľę´ę˛ęąę°ęŽę­ęŤęŞęŠę§ę˘ę ęŸę”ęzęvęsęoęQęPęOęMęIę>ę8ę6ę4ę2éěéčéćéÝéŃéËéŹé™é˜é\é čŠč‡č?č>č<č;č:č9č6č5č3č0č/č)čč ččç˙çËçŠçAç,çççć˙ć˛ćĽćgćbć^ć0ĺ%ĺ$ĺ#äqähăŔăˇăŻÄkÚkÖkÔkŇkČk­k§k5k1k+k'k!kjďjęj|"|šsnmlkjig_W˙˙ § €ô ~ éběîŹóóŻ÷÷°OąQSWXZZ\bpwz~„ŠŒŒ"ŽĄ#Ł7 %˛1V¸Y_Ţa‡ĺ‰Š °ĂĆÇ"Đę$đô?D  F  HIJK!:L@UfZZ|`o}tty‡Ž‘’••Ÿ˜˜ ĄĄĄ¤¤˘ŚŚŁŠŠ¤ŻŻĽľľŚşş§żż¨ĆĆŠĚĚŞÎÎŤŐŐŹđů­Ŕçˇëőßřúę??큂đ‡ˆńŠŠóô”—ő™ŸůĄŁĽĽ§§ŞŤ­šť˝ŔÄĆĆČÍĐŮ#ÜÝ- Ĺ/ĐüU‚ ‰5œ7JľLRÉT˝ĐŔę:ěe>@P°RjÁt…ÚŠ–ě ŻůŢŢ áá FG nv €œ3#H&.V0[_]j‹wx™{{›……œ›żÄÉ›Ȟů d Ŕ Ö E ÜHM PW YY [[ ]] _} €´ 2śÄ gĆÓ vÖŰ „Ýď Šňô öţ   ' Š * d Ń j q t Ž   ” /   ľ 4 Đ Ń J Ö × L Ű Ü N á á P!! Q! !I [!K!K š!N!N ›!S!„ œ!# Î## P##! R#$#( X#+#, ]#s#u _#z#z b#}#} c#‡#‡ d#”#” e#›#Ž f#Î#Ď z#ă#ă |#ĺ#ĺ }$"$# ~$`$i €%&œ Š& &¸'''@'' D' ''H')'Kd'M'M‡'O'Rˆ'V'VŒ'X'^'a'””'˜'ŻČ'ą'žŕ'Ĺ'Ćî'ŕ'ŕđ'ć'ëń'đ(˙÷))) )  )@)A )ƒ)„ )Î)Ő)ë)ë)ú)ű*** **/*/.*}* /*Ž*şS*ů*ú`++b++$}+S+Tƒ,`,o…,q,w•,y,}œ-0-eĄ-o-o×..Ř.".%Ů....ÝMŔM˙ŢŚDŚGŚLŚM"ŚPŚQ$ŚTŚW&ŚbŚn*ŚŠŚ7ڔڕ;§§=§§L§&§+Q§0§?W§F§Kg§N§Om§€§ƒo§‰§Œs§ű§˙wđđ|öĹöĹ~űűűű†űű6‹ű8ű<Ľű>ű>Şű@űAŤűCűD­űFűOŻűRűšűŠű•éűžűŸőűŮűÚ÷űčűéůűüű˙űţţ˙ţ ţ#ţpţtţvţüţ˙ţ˙Ÿ˙ů˙ý ÓÓVĽŐ8Ő9üŐ;Ő>ţŐ@ŐDŐFŐFŐJŐPŐRŐkŐ ŐÓ)×Ř×ë]   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜žŁ˘¤ŚĽ§ŠŤŞŹ­ŻŽ°ąłľ´ś¸ˇźť˝ž Érdei ËxĄpk rvj žˆš \s ˘ Łgw @ O MT il|=¨şcn XT † Dm} Ďb‚…— ź ˝ Ĺ Ć Á šTÁ: ë @ ŕ ခ Ęy Ă Ç ×„ŒƒŠ‘Ž•–”œ›óˆžqš›œzŸ‰5¸ËËÁŞœڏfqË ˛…u¸Ăˉ-ËŚđÓŞ‡ËŞJ3ËŮôT´œ99N´R¸çÍ7sÍ`s3˘VŚV9Ĺɸßsşé3źDßÍŞĺŞˏ¤{¸o{RÇ͚šoËÍžÓđşƒŐ˜HžŐÁËöƒT3fÓǤ͏šsŐ ţ+¤´œbœ-ŐŐŐđ{T¤¸#ӸˌĂě“ Ó\qŰ…#¨H99`Őš#fy```{œw`Şé`b{Ĺ{´RÍfźfwÍ;…‰{ÍJ/œœ}oo5jo{ޞ-–{öƒT7öœáföÍD)fîs–ˇ, °%Id°@QX ČY!-,°%Id°@QX ČY!-,  °P° y ¸˙˙PXY°°%°%#á °P° y ¸˙˙PXY°°%á-,KPX °ýEDY!-,°%E`D-,KSX°%°%EDY!!-,ED-,°%°%I°%°%I`° ch ŠŠ#:Še:-˙˙fţ–f¤@ űű/ÄÔě1ÔěÔě0!%!!füsüĺţ–řňr)5Ő 5@ƒ üK° TXš˙Ŕ8Y<ě2991/äüĚ0ś P ]%3#3#5ËËˢţţŐýqţ›eĹŞéŐB@„üK°TK°T[Xš˙Ŕ8YüÜě1ô<ě20@0 @ P ` p   ż ]#!#oŞ$ŞŐýŐ+ýŐ+žž`@1 ‡  ‡   üĚ91/<Ô<<ü<<Ô<<Ä2ě220@   ]!! !3!!!!#!#!5!!5!ţÝT%Dh$i g8ţĄR>ţ›h gţŰgĄhţĹ`Tţžif…ţ˛‡ţaŸţašţ˛™ţbžţbž™NšŸŞţÓm!(/˝@U" '&( /)/))/B" ) *!††#Љ*Љ- ) " & 0üK° TXš˙Ŕ8YK° TK°T[K°T[Xš@8Y<ěô<ü<ôäě1/äěÄÔäě2Äîî99990KSXíí9í9íY"#.'5.546753.'>54&´diŇjfŃoÝÉÚĚd]ŽSSŻ\ăÖăÖdtzqá{ţÓ---´@AČ$Ź–ŁźëčŻ*.ţU#´œŠĂš jXV`ŐţOnZXhq˙ă)đ #'3‰@6$%&%&'$'B’ ’.’$’ &Œ($‘4'!%   ! + 1 4üK° TK° T[K° T[K°T[K°T[K° T[Xš1˙Ŕ8YÄěôěîöî991ä2ô<äěîöîî0KSXííY""32654&'2#"&546"32654&%3#2#"&546ŃWccWUccUžşť şťü—VcbWWcd1 üZ žźťŸŸšş‘”„‚••‚ƒ•ÜťťŰŰťźŰa•‚„””„–ůó Űť˝ÚŰźşÜ˙ăţđ 0Í@–  † †  † †††  !         B  (('•+•'”$‘Œ .  .'.'!!1üěÄÔÔěĆî99999991/ĆäöćîîĆ9990KSXíí9í9í9í9í9íí9í9ííí9Y"˛2]@˛ " ) **&:4D ^YZ UZZY0g{›š™—• “••"™-  ' (   2'') #**(/2; 49?2J LKFO2VZ Y UY\_2j i`2uy z““—•œœŸš › š 2 2°29]]3267 >73#'#"5467.54632.#"ň[UÔ _ŚIţ{ü;Bş h]ühäƒńţΆ†02޸SĽUWžDiƒ;#QĄX’Â?@ýřYËr„ţţ~ţă“YW׀ác?}<˘Ĺ$$ś/1oX3gĹŞoŐ7@ „üK°TK°T[Xš˙Ŕ8Yě1ôě0@ @P`p ]#oŞŐýŐ+°ţň{ 7@˜—  ÜK°TXš ˙Ŕ8YK°TXš @8Yä2ě991üě0#&547{†‚ƒ… –•”—ćţ>ççţ;ĺëĆŕßÄě¤ţňo @˜— Ü<ôě991üě03#654¤ –••– …ƒƒěţ<ßŕţ:ëĺĹççÂ=JĂđN@,  ™ ™ ‘    Ô<ä2Ü<ä2991ôÔ<ě2Äě2990 %#'-73%Ăţ™g:ţ°rţ°:gţ™:PrPßÂĂbËţ‡yËbĂÂcËyţ‡ËŮŰ #@ œ  Üü<ü<ě1/Ô<ü<Ä0!!#!5!Ž-ýÓ¨ýÓ-ýÓŞýÓ-Ş-ž˙Ăţ@ žƒüěÔĚ1üě073#đÓ¤RţŹţŔ@d߃śœÜĚ1Ôě0!!dýĺƒ¤ŰŽţˇƒüě1/ě073#ŰÓÓţţ˙B˛Ő-@BŸ/Ä991ôě0KSXííY"3#ŞýřŞŐům‡˙ăđ #@   ‘Œ üěôě1äôěî0"32'2#"‹œœű ţ÷űűţ÷ PţÍţĚţÍţÍ3343 ţsţ†ţ‡ţsyzáZŐ @@B     ÔK°TXš@8YěÄüě1/ě2ôěÔě0KSXY"´]7!5%3!!ţJţ™eĘJü¤ŞsH¸HúŐŞ–Jđš@'BĄ”  ‘   üK°TK°T[K°T[Xš˙Ŕ8YÄÔěŔŔ91/ě2ôěôě0KSXíí9Y"@2UVVzzv‡tvust‚†‚‚‚¨¨]]%!!567>54&#"5>32‰ÁüLs3aM§†_ÓxzÔXčE[ţôŞŞŞw‘:m—Iw–BCĚ12čÂ\Ľpţëœ˙ăsđ(p@. † †     “  “#‘ŒŁ)&  )üK°TK°T[Xš ˙Ŕ8YÄÄÔěôě991ěäôäěćîîîî90@ daa d!]!"&'532654&+532654&#"5>32?‘ŁţĐţč^ÇjTČmžÇšĽŽś•žŁ˜SžrsÉYć Ž%ĐÝň%%Ă12–„•Śwps{$&´ Ѳ|Ťd¤Ő @   B     ÜK° TK° T[Xš ˙Ŕ8YÔ<Äě291/äÔ<ě290KSXÉÉY"@* *HYiwŠ+&+6NO O Vfuz… ]] !33##!5ţţ5ţŐŐÉý^%üăÍü3¨ţ `Ăž˙ădŐ^@#†  ‰   Œ¤  üK°TK°T[Xš˙Ŕ8YK°TXš@8YÄÔěÄî1ääôěćîţÄî90!!>32!"&'532654&#"Ýý ,X,ú$ţÔţď^ĂhZŔk­ĘĘ­QĄTŐŞţ’ţîęńţő Ë10śœœś$&˙ă–đ $X@$ †   Ľ  ‰"‘Œ% " !%üěěôěä1äôäüäîîî90@ËËÍÍÍËˤ˛]]"32654&.#">32# !2¤ˆŸŸˆˆŸŸ L›LČÓ;˛káţđâţýţîPL›;ş˘ĄťťĄ˘şy¸$&ţňţďW]ţďëćţęybĽ¨hŐc@B üĚÄ991/ôě0KSXííY"K°TX˝@˙Ŕ878Y@X9Hg°°]]!#!¨ŔýâÓţý3ŐVú+‹˙ă‹đ #/C@%  ' - ‘Œ'Ł0 $*$ !0üÄěôÄěîî991ěäôěîî990"32654&%.54$32#"$54632654&#"‹ĽĽŚĽţĽ‚‘˙Ţßţ‘’Łţ÷÷÷ţ÷¤H‘ƒ‚““‚ƒ‘ڇ‡š›†‡šV ˛€łĐĐł€˛ "ƏŮččُĆat‚‚tt‚‚˙ă‡đ$X@#†  Ľ ‰ ‘Œ%!"" %üěäôěě1äôěćţőîî90@ÄÂŔŔŔÂÄŞźé]]7532#"543 !"&2654&#"áLœKČÓ:˛lŕţűâţąţĺLœ>ˆŸŸˆˆŸŸ¸$& V\ëćţsţ†ţŸţ[—ş˘ĄťťĄ˘şđĂ#@ƒڃü<ě21/ěôě073#3#đÓÓÓÓţţ#ţž˙Ă# %@ƒžƒŚ  ü<ě2ÔĚ1äüěî03#3#đÓÓÓ¤R#ţýŮŹţŔ@Ů^ŰŚM@*œœœœB¨§$#üě291ôě90KSXííííY" 5Űűřúţđţ‘ţ“śŃŚŃŮ`ۢ@ œœ#ü<Ä21ÔěÔě0!!!!Ůúţúţ˘¨đŞŮ^ŰŚO@+œœœœB¨§$#ü<ě91ôě90KSXííííY"55Ůúţđśţ/Śţ/śm“°đ$e@+$  †ˆ•‘ƒ   &%ÜK° TXš˙Ŕ8YÄüěÔěî99991/îöţôîÍ9990śy z z ]%3##546?>54&#"5>32‡ËËĹż8ZZ93ƒlOła^Ág¸ßHZX/'ţţ‘še‚VY5^1YnFCź98ŸL‰VV/5<4‡ţœq˘ L•@2  ŠŠL43Ź0Š7Ź$Š7CM34( (+(I+*(I,=MÜěüěţýţ<Ćî991ÔÄüěţíÔĆĹî2Äî990K° TK° T[K°T[K°T[K°T[X˝M˙ŔMM@878Y@ NN/N?N]32654&#"#"&5463253>54&'&$#"3267#"$'&5476$32úŽ|{zy!<›gŹ×ŘŤgœ;’Ľ?@hţŐ°{â`ąsmiůhZ}ţ٘šţ¸€€†ˆ~R˝Ôk{KOţÂţ菣¤ŽŒĽ¤ţHMIůČČúKLƒý ßąkźPƒ‹A@fţľÁŸţęjhmWQoagƒ}}I˝śJ}‡Ž bć{ţůţĐhŐ Â@A       B•    ÔÄ91/<äÔě90KSXííííííííY"˛ ]@BXvpŒ  VXP ghxv|rwx‡ˆ€ ˜™–]] !3#!#źţî%ţ{ĺ9҈ý_ˆŐýŽú+ţÉěŐ C@#• •• ­ . !üě2üěÔě9991/ěěôěî90˛"]!2654&#!2654&#%!2#!“DŁŁţź+”‘‘”ţ çú€|•ĽţđűýčÉý݇‹Œ…fţ>orqpŚŔą‰˘ ˘ČÚs˙ă'đ6@ ĄŽ •ĄŽ•‘Œ 0üě2ě1äôěôěîöî0´].# !267# !2'fç‚˙ţđ‚çfjí„ţ­ţz†S†íbŐ_^ţÇţŘţŮţÇ^_ÓHHŸghŸGɰŐ.@• •  2 üěôě99991/ěôě0˛`]3 !%! )“ô5ţáţËţBŸ˛–ţhţPţa/űw.,Śţ—ţ€ţ~ţ–É‹Ő .@•••­   üě2ÔÄÄ1/ěěôěî0˛ ]!!!!!!ɰýÇý9řü>ŐŞţFŞýăŞÉ#Ő )@••­ üě2ÔÄ1/ěôěî0˛ ]!!!!#ÉZýpPý°ĘŐŞţHŞý7s˙ă‹đ9@ ••ĄŽ•‘Œ43 üěüäüÄ1äôěôěţÔî990%!5!# !2.# !26Ăţśuţć ţ˘ţu‹^’opü‹ţîţík¨Ő‘ŚýSU™mn™HF×_`ţÎţŃţŇţÎ%É;Ő ,@•­ 8  üě2üě21/<ä2üě0˛P ]3!3#!#ÉĘŢĘĘý"ĘŐýœdú+Çý9É“Ő.ˇŻüK°TXš@8Yě1/ě0@ 0@P`Ÿ]3#ÉĘĘŐú+˙–ţf“Ő B@ •° 9 üK°TXš@8Yěä991äüě990@ 0 @ P `  Ÿ ]3+53265ÉĘÍăM?†nŐú“ţňôŞ–ÂÉjŐ ď@(BŻ  üě2ÔÄ91/<ě290KSXííííY"˛]@’ ((764GFCUgvwƒˆ”›ç    (+*66650 A@E@@@ b`hgwp ‹‹Ž šśľĹĹ×Öčéčę÷řů,]q]q3! !#ÉĘžýţöý3ĘŐý‰wýHüăĎý1ÉjŐ%@ •:üěě1/äě0@ 0P€€]3!!ÉĘ×ü_ŐúŐŞÉŐ ż@4  B Ż   >  üěüě91/<Äě290KSXííííY"˛p]@V   && & 45 i|{y €‚‚  #,'( 4<VY ej vy •›]]! !###É-}-ĹţËţÄŐüřú+üúáÉ3Ő y@BŻ6 üěüě991/<ě2990KSXííY"˛ ]@068HGif€ FIWXeiy…Š•šŸ ]]!3!#É–ÄţđýjÄŐűáú+áűs˙ăŮđ #@•• ‘Œ 3üěüě1äôěî0"32' ! 'ÜţýÜÜţ˙Ü:xţˆţĆţĹţ‡yLţ¸ţĺţćţ¸HH¤ţ[ţžţŸţ[¤bbĽÉŐ:@••   ? üě2üě91/ôěÔě0@ ?_Ż]32654&#%!2+#“ţššţ8Čűţ˙űţĘ/ýϒ‡†’ŚăŰÝâý¨sţřŮđ R@*  B ••‘Œ    3üěüě9991Ääôěî990KSXíí9Y""32#'# ! 'ÜţýÜÜţ˙? ôÝ!#ţĹţ‡y;:xŃLţ¸ţĺţćţ¸HHúĎţÝďĽabĽţ[ţžţüţŽÉTŐą@5  B• •    ?  üě2üÄě99991/<ôěÔě9990KSXíí9Y"˛@]@Bz%%%&'&&& 66FFhuuwˆˆ˜˜]]#.+#! 32654&#A{>ÍŮżJ‹xÜĘČüƒý‰ţ’••’ź~ţh–bý‰ŐÖ؍şOýƒ…‡˙ă˘đ'~@<    B Ą”••”%‘Œ( "-"(ÜÄěüěä99991äôäěîöîĆ90KSXí9í9Y"˛)]ś)/)O)].#"!"&'532654&/.54$32HsĚ_ĽłwŚzâ×ţÝţçjď€{ěr­ź‡š{âĘőiÚ¤Ĺ76€vce+ŮśŮŕ0/ĐEFˆ~n|-ŔŤĆä&˙úéŐJ@•@@Ôäüä1/ôě20K° TX˝@˙Ŕ878Y@  @ p Ÿ ]!!#!ďýîËýîŐŞúŐ+˛˙ă)Ő@@ •Œ  8AüK°TXš˙Ŕ8Yěüě1ä2ôě99990śŸ]332653! ˛ËŽĂÂŽËţßţćţĺţßŐüuđÓÓđ‹ü\ţÜţÖ*$hŐˇ@'BŻÔÄ91/ě290KSXííííY"˛P]@b*GGZ}ƒ *&&))% 833<<7HEEIIGYVfiizvvyyu€˜—)]]!3 3JýĆÓŮÚŇýÇŐűéú+DŚŐ {@I      B Ż    ÔĚ91/<ě2290KSXííííííííY"˛]@ň  ($ >>4 0 LMB @ Yjkg ` {|€ –•     !   # $ %  <:5306 9 ? 0FFJ@E@BBB@@ D M @@XVY Pfgab```d d d wv{xwtyywpx  †‡ˆ‰… Š —ŸŻ[]]3 3 3# #DĚ:9ă:9Íţ‰ţţĹţÂţŐűîűîú+úđ=;Ő f@  ÔÄÜÄÄ1´€ ]@Ż /<ě20K°BPX@   ěěěě@    Y3 3 # #ŮsuŮţ Ůţ\ţYÚŐýŐ+ý3üř{ý…˙üçŐ”@(BŻ@@ Ôäüä91/ě290KSXííííY"˛ ]@<5000F@@@QQQe„“ &)78@ ghxp Ÿ ]]3 3#Ůž›ŮýđËŐýšfüňý9Ç\Ő @B••B ÜK° TK° T[Xš˙Ŕ8YÄÔä991/ěôě0KSXííY"@@ )&8HGH    / 59? GJO UYfio wx Ÿ ]]!!!5!s•üPÇű=°üg՚űoŞš‘°ţňX;@Š˛ŠąCÜK° TXš@8YK°TK°T[Xš˙Ŕ8YüĚ21üěôě0!#3!°¨đđţXůü˙B˛Ő-@BŸ/Ä991ôě0KSXííY"#ŞŞýřŐům“Çţňo0@Š˛ŠąCüK°TK°T[Xš@8Y<Üě1üěôě0!53#5oţXďďřޏŮ¨ŰŐ@ ÜĚ91ôĚ290 # #źÉţHţHÉŐýÓ‹ţu-˙ěţţŹľŠÄÄ1Ôě0!5űŘţŹŞđ‰f1@ ´łDÜě1ôě0K° TK°T[X˝˙Ŕ@878Y #o™ţşfţŠv{˙ă-{ %ź@'  Šš †şš#¸Œ   E&üěĚÔě22991/ÄäôüôěĆîî9990@n0000 0!0"?'@@@@ @!@"PPPP P!P"P'p'…‡‡‡ ‡!…"' 'đ'000 0!@@@ @!PPP P!``` `!ppp p!€€€ €!]]"326=7#5#"&5463!54&#"5>32žßʁo™š¸¸?źˆŹËýű§—`śTežZóđ3f{bsŮ´)LýŞfaÁ˘˝Ŕ‹..Ş''üş˙㤠8@š  šŒ¸—G Füě22ôě1/ěäôÄěĆî0ś`€ ]4&#"326>32#"&'#3姒’§§’’§ýŽ:ą{Ě˙˙Ě{ą:šš/ËççËËççRdaţźţřţřţźad¨q˙ăç{?@†ˆ† ˆ šš¸Œ HEüä2ě1äôěţôîőî0@ € ].#"3267#"!2çNPłĆĆłPNMĽ]ýţÖ-U˘5Ź++ăÍÍă++Ş$$>:#q˙ăZ8@ššŒ¸—G Eüěôě221/ěäôÄěÄî0ś`€ ]3#5#"3232654&#"˘¸¸:ą|Ë˙˙Ë|ąýǧ’’¨¨’’§ś^ůě¨daDDaţËççËËççq˙ă{p@$ †ˆŠš ťš¸ ŒKEüěôěÄ91äôěäîîôî90@)?p Đđ?????,// , ooooo ]q]!3267# 32.#"ü˛ ͡jÇbcĐkţôţÇ)ü⸼ˆšš^ZžÇ44Ž*,8 CţÝė´Žž/řY@ Ї—ź    LüK° TXš @8YK°TXš ˙Ŕ8Y<Äü<ÄÄ991/ä2üěî2990ś@P ]#"!!##535463ř°cM/ţŃš°°Ž˝™Phcü/яNťŤqţVZ{ (J@#  †šš&#¸'ź š˝& G E)üÄěôě221/ÄäěäôÄěţŐî990ś`*€* *]4&#"326!"&'5326=#"3253˘Ľ•”ĽĽ”•Ľ¸ţţúaŹQQžRľ´9˛|ÎüüÎ|˛9¸=ČÜÜČÇÜÜëţâţéł,*˝ż[cb::bcŞşd4@ ‡¸ — N  Füě2ôě1/<ěôÄě90˛`]#4&#"#3>32d¸||•ŹššBłuÁƤý\žŸžž¤ý‡ýžedďÁy+@žąźFü<ě21/äüě0@  @ P ` p ]3#3#Á¸¸¸¸`ű é˙ŰţVy D@ ž ‡˝ź ąO  Fü<ě2ä991ěäôěî990@ @P`p]3+532653#Á¸ŁľF1iL¸¸`űŒÖŔœa™(éşœ ź@)Bź— F üě2ÔÄ91/<ěä90KSXííííY"˛ ]@_ ')+Vfgsw‚‰Ž“–—Ł    ('(++@ h` ‰…‰š—ާśĹÖ÷đ÷đ]q]33 ##şš%ëýŽkđýÇšüiăýôýŹ#ýÝÁy"ˇ—Füě1/ě0@ @P`pđ]3#Á¸¸ůěş{"Z@&  ‡ ¸źPPF#üě2üüüě91/<<äô<Äě290@0$P$p$$ $ $ż$ß$˙$ ]>32#4&#"#4&#"#3>32)EŔ‚ŻžšruŚšrwŚšš?°yzŤ‰|vőâý\žĄœž¤ý‡ž˘›żŁý‡`Žgb|şd{6@ ‡¸ ź N  Füě2ôě1/<äôÄě90´`Ď]#4&#"#3>32d¸||•ŹššBłuÁƤý\žŸžž¤ý‡`Žedďq˙ău{ J@šš ¸Œ QEüěôě1äôěî0@#?{{   {  { đ]"32654&'2#"s”ŹŤ•“ŹŹ“đţîđńţďßçÉÉçčČÇéœţČţěţíţÇ98şţV¤{>@šš¸Œ˝ź GFüě22ôě1äääôÄěÄî0@ `€ ŕ]%#3>32#"&4&#"326sšš:ą{Ě˙˙Ě{ą8§’’§§’’§¨ýŽ ŞdaţźţřţřţźaëËççËËççqţVZ{ >@š  š¸Œ˝ź GEüěôě221äääôÄěĆî0@ `€ ŕ]32654&#"#"3253#/§’’¨¨’’§s:ą|Ë˙˙Ë|ą:¸¸/ËççËËççýŽdaDDadŞůöşJ{0@  ‡¸ ź FüÄě21/äôěÄÔĚ90´PŸ].#"#3>32JI,œ§šš:ş….´Ëžý˛`Žfco˙ăÇ{'ç@<  S  SB †‰†‰šš%¸Œ( R"E(üÄěÔěä99991äôěţőîőî90KSXí9í9Y"˛']@m   . , , , ; ; ; ; $( ( *//*(() )!$'† † † †      '/)?)_))€)) )đ)]]q.#"#"&'532654&/.54632‹N¨Z‰‰b”?ÄĽ÷ŘZĂlfĆa‚ŒeŤ@Ť˜ŕÎf´?Ž((TT@I!*™‰œś##ž55YQKP%$•‚žŹ7ňž8@Šź‡  Fü<Äü<Ä2991/ěô<Äě2990˛Ż]!!;#"&5#53w{ţ…Ks˝˝Ő˘‡‡žţý ‰NšŸŇ`>Ž˙ăX`;@ ‡Œ ź¸  NFüěô9ě21/ää2ôÄě90´oŔ]332653#5#"&ޏ||•­¸¸CąuÁČĎşŚýaŸŸž¤{ű Źfcđ¨=`ű@'BżÔK° TXš@8YK°TK°T[Xš˙Ŕ8YÄ91/ě290KSXííííY"@ŽHj{†€‘¤  &&)) 55::0FFIIFH@VVYYPffiigh`ut{{uz……‰‰‰†––—š˜˜—¨§°Ŕß˙>]]3 3#=Ă^^Ăţ\ú`üTŹű V5` ë@IU U U U   B ż    ÔK° TK°T[K°T[K°T[K° T[Xš@8YK° TK° T[K°T[Xš˙Ŕ8YĚ91/<ě2290KSXííííííííY"@˙" 5 IIF @ [[U P nnf yy‡™˜” źźÎÇĎ         %%#'!%""%' $ ! # 9669 0FHF@B@@@D D D @@VVVPQRRPS T U cdejejjjn a g ouuy}x}zzxy  { v } ‡ˆ——”“œ›˜˜™@/– ŸŚŚ¤¤ŤŤŠŠŤ¤ Żľą˝ť¸ żÄĂĚĘy]]333# #V¸ćĺŮćĺ¸ţŰŮńňŮ`ü–jü–jű –üj;y` C@F      B ż  ÔK° TK°T[K°T[K°T[Xš@8YK°TXš˙Ŕ8YÄÔÄ91/<ě290KSXííííííííY"@˜   & =1 UWX f vzvt ‚ ™Ÿ—’  ŚŠŻĽŁ       )&% * :9746 9 0 IFE J @ YVYYWVYVV Y P o x ›”Ť¤° Ď ß ˙ /]] # # 3 dţkŞŮţşţşŮłţrŮ))`ýßýÁ¸ţHJţq=ţV`‹@C        B  ‡˝ ź  ÔK° TK°T[Xš @8YK°TXš ˙Ŕ8YÄÄ91ä2ôě9990KSXíííííí2Y"@đ     # 5 I O N Z Z j ‡ € “        '$$  )( % $ $ ' ** 755008 6 6 8 990A@@@@@@@@B E G II@TQQUPPVUVW W U U YYPffh ii`{xx‰Š … … ‰ ‰‰™ • • šš¤ ¤ ŤŤ°Ďß˙e]]+5326?3 3“N”|“lLT3!ţ;Ă^^ĂhČzšH†TNü”lXŰ` @BŠźŠ ÜK° TK° T[Xš˙Ŕ8YK°TXš@8YÄ2Ä991/ěôě0KSXííY"@B&GI  + 690 @@E@@CWY_ ``f``b € Ż ]]!!!5!qjýL´ü}´ýe`¨üۓ¨%ţ˛$w@4 %   ! Š ŠŔ Šą% $  C %ÔK° TXš@8Y<Äü<Ä299999991üěÄôěî99999990˛&]#"&=4&+5326=46;#"3>ůŠlŽ==kŠů>DV[noZVž”Ýď—ts•đݓXřŽŽœřXţގąÔě1üĚ0#ŽŞřţ˛$‡@6%   ŠŠ#ŔŠą%#C %ÔK° TXš˙Ŕ8YK°TXš@8Y<Ä2ü<Ä99999991üěÄôěî99999990˛&]326=467.=4&+532;#"+FŒUZooZUŒF?ů§lŽ>>Žl§ů?žVřœŽŽřŽW“Ýđ•st—ďݔŮÓŰ1#@ œœ ÔÄ1ÔüÔěŔ990#"'&'&'&#"5>32326Űiłan’ ›^XŹbiłan“ ›^VŠ1˛OD;>MS˛OE<>L5Ő b@ƒ ü<ě2991/ôüĚ0K° TX˝ @ ˙Ŕ878YK°TK°T[K°T[X˝ ˙Ŕ @878Yś P ]#53#3ËËˢ×ţú+eţ›ŹţÇ#˜!Q@+  †ˆ †ˆ š š¸Œ"  "ÜěÔ<Ô<<ě221äô<ÄěÄţôîőî9990%.'>7#&73Ś“¤¤JˆDF‰HA‰Mfńţ÷ ńfI‰ƒX⸚⥏)*ü *'Ş#ţä 32ţá!bđ`@!† Š  ”‘   Ü<ĚĚü<ÄÔÄ1/ě2ôäěÔ<î2î990K° TX˝˙Ŕ@878Y´66].#"!!!!53#535632NLˆ=”t‡ţy-üěÇÇÖč=—´ś))›Ô׏ţ/ŞŞяîó^Rź˛#/ƒ@I -'! - -šëě'šë!0 *$0* $ $(st*(s0Üäěôäě9999999991ÔäěôäěŔ9999999907'#"&''7.5467'7>324&#"326{ĎrÎ%$&(ŃrĎ;t=:x=ĎqĎ%%&&ĎsĎ7t@?s9ĎqĎ(&%%ĎsÎ>v:@t8ÎsĎ'%$ţ|pššprœRĂŐĆ@F  B Ó Ó   fe f eÔ<ě2ěüě2ě99991/ä2Ô<ě2Ô<ě290KSXííííY"K° TX˝˙Ŕ@878Y@(†Ś ľ' ' ')((79‡ ˆŚ ĽŞŠ]]!#!5!5'!5!3 3!!!ţcÉţ` Tţ´ţĂž{yżţÂţľTŸÇţ9Ç{3›{JýDźýś{›3ţ˘Ž˜@ őőÜ<ě21ÔěÔě0##ŽŞŞŞ˜ý öý ö\˙=˘đ >‘@54&.#"#"&'532654/.5467.54632{?>‹ú?>ĚS8alÎӃ\]>9Ě­IšXW”:fqÝր][;;ČŚI™¨.Z.L…‡-[.Kˆ“¤''PGZswšeZŒ54m@ލ¤''TLf{x™f[1,pE‚Ÿ×F)’@ÎÍddÜüÔě1ü<ě20K° TK° T[X˝@˙Ŕ878YK° TK° T[K°T[K°T[X˝˙Ŕ@878YK°TK°T[X˝@˙Ŕ878Y@````pppp]3#%3#^ËËţyËËĘĘĘĺÍ/IC@&=Ë>:ĚAĘ$1Ë04ĚGĘÉČ$É 7aD=0^* D^ JÜĚüěţí2î1/îöţýîÖîýîÖî02#"$'&5476$"3267>54&'..#"3267#"&54632˜mmllmmţů˜˜ţůmmllmm˜ƒâ^^``^^⃄ă^]]^\^ă§B‚B•§Ť›@zBC‰FŘűűŘIˆÍnmmţúš˜ţűmmnnmm˜šmmng^^^傁ă^^__^]⃅ă]^^ő! ŻŸŽ"ôĐŃňsŐ;đ)_@3(%ăÝá%Ý ßŢÝ ŕ‘* "(kl"k *ÜěĚüě22ŔŔ9991ôäüôěÄîíÖîî99990!!#5#"&546;54&#"5>32"326=‹°ýPŽ•,]€˜żźśuu>ˆDI‘EˇłţěĄ~bRh‚P{¸ţ@p?D‡q‡Š[[""°đCO@Mrž%# †@Ičččč č č č  č B  çŚ o o nüü<Ôě2991ô<ě2990KSXííííííííY" 5 5%ţÓ-ţ+#ţÓ-ţ+#żţôţôż˘R˘żţôţôż˘RŮŰ^@ œÜÔě1ÔÄě0!#!٨űŚ^ýÁ•d߃śœÜĚ1Ôě0!!dýĺƒ¤ĺÍ/8L`@6EBC?2ÉH0É9JCĘ 9ĘÉČ É$HE301B54&'.'2#"$'&5476$#32654&'2#'.+#ƒâ^^``^^⃄ă^]]^\^ㄘmmllmmţů˜˜ţůmmllmm}{{nWXf°Ži`C.‰Ź;I6B›f^^^傁ă^^__^]⃅ă]^^gnmmţúš˜ţűmmnnmm˜šmmnţbţě>KL?gwyVpMIßŃ`3ţœDŐb+ö/ˇďîÔĚ1üě0K° TK°T[X˝˙Ŕ@878Y!!ŐVýŞö”Ău=đ  @ĂÄĂ ‘ Z[ZÜěüě1ôěüě0"32654&'2#"&546PnnPPnoO@v+..š†‡´¸ooPOmmOOp1.-rB„ˇ´‡†şŮŰ .@ĐœĐ  œ   Ô<ě2ü<ě21/ěÔ<ěü<ě0!!#!5!!!Ž-ýÓ¨ýÓ-ýÓúţţ}Şţ}ƒŞƒűŚŞ^œ´đJ@$}}BÝÝ÷ Ý‘~ÜÄÔÄě91ôÄěüěî90KSXí2íY"!!56754&#"5>32 ¨ýŞ"?XhU4zHM…9‘Žţľ8rn81^BQ##{„l‹ţä0bÍđ(H@' Ý Ý Ý Ý ř÷Ý ř#‘)~&~ )ÜÄÄÔěÔě9991ôäěüäěÔěîî90#"&'532654&+532654&#"5>32 \ežą9}F4wCmxolV^^ad_(fQI€7ŠZ`mR|†yOFJLl?<:=svcE`sîRf1@ ´łDÔě1ôě0K° TK°T[X˝˙Ŕ@878Y3#‹Çţş™fţˆŽţVĺ` M@% ‡Œ ź˝!   NF!üě2ôěÄ91ää2ô<ěÜÄ990ś"`"Ď"]3326533267#"&'#"&'ޏЇ”•¸#% )I#ER2‘bf*ţV ýH‘”¨¨ü˘<9 ”NPOONNýמ˙;9Ő %@Á]] ÔÔüÜě91Ä2ôě90!###.54$yŔžŽ×ëŐůfůáNݸžčŰHŽFˇƒÔě1Ôě03#ŰÓÓFţ#ţuÁ@  ó' ÜÔěÔĚ1/ÔüÄ90!#"&'532654&'T76xv.W+"J/;<+->i0Y[ ƒ0.W=‰œĹß ,@Ý ÝÝ ÷‘ |]|| Üôäüä1ôěěÔěî2035733!œĚßć‰Íý× c)t'ý+n`Ődđ.@ăáÝ ŕÝ‘ klk Üěüě991ôěôěüě0!!2#"&546"32654&‹°ýPXłÎÎłłĐĐłi~hi}|P{ÝżżŰÜžżÝsĄˆ…  …‰ ÁH# †@I č č č č ččččB  çŚ o opü<üÔ<ě991ô<ě2990KSXííííííííY"5 %5 ÁŐţ+-ţÓ˛Őţ+-ţÓ#ţ^Rţ^ż  żţ^Rţ^ż  ˙˙‰˙ăđ&{' ‹ýd ë5˙˙‰˙ă?đ&{'t‹ýd ë5˙˙b˙ăđ&u' ‹ýd ë5˙ăŹŐ $†@/ †ˆ !ƒ# •Œ#%" " "!& %ÜěÔüěÔě99991äôěţÍôî9990K°TK°T[K°T[X˝%˙Ŕ%%@878Y@ ttttv]33267#"&546?>7>5#53ôž7ZZ:3ƒmN´`^Ŕg¸ŕIYX0&ÄĘĘDœe‚WX5^1YnFCź98ŸL‰VV/5<6ţ˙˙hk&$uźu˙˙hk&$sźu˙˙hm&$vźu´  +@ ]1˙˙h^&$tźu´ #+@ @O# /#]1˙˙hN&$rźu´  +@ 0?  ]1hm !Ë@T   !!  ! !!!B  Á • Ž  !  VV!"ÔÄÔě2Ôî299999991/<ćÖîÔî9990KSXííííííííY"˛ #]@  s › P#f iu {yyv v!€# ]]4&#"326!.54632#!#TY?@WX??Y˜ţđ!ţX=>ŸsrĄ?<҈ý_ˆŐZ?YWA?XXţóýN)sIs ĄrFv)ú‹ţHŐ‡@9  B• ••••­    ÔÔ<ě2ÔÄÄ91/<ěěÄôěěîî0KSXííííY"˛€]@gww† …– ż ]!!!!!!#!5ýÇý9řü=ýđ Íq‹ţśËŐŞţFŞýăŞţ՞üđ˙˙sţu'đ&&z-˙˙É‹k&(užu˙˙É‹k&(sžu˙˙É‹m&(vžu@@ ]1˙˙É‹N&(ržu @@ @]1˙˙;şk&,u/u˙˙˘k&,s/u˙˙˙ţ`m&,v/u´ +1˙˙XN&,r/u´ +1 şŐ g@  Š ••  2  yô<ě2ÄôěÄ91/Ć2îöîî20@( °Ÿ Ÿ Ÿ Ÿ ŸŸŸŸż ż ż ż żżżż]]! )#53!!3 !Ó ą–ţiţPţ`ÉÉËPţ°ó5ţáţËŐţ—ţ€ţ~ţ–źăţýę.,˙˙É3^&1tţu´"+@ 0?""]1˙˙s˙ăŮk&2u'u˙˙s˙ăŮk&2s'u˙˙s˙ăŮm&2v'u´+@]1˙˙s˙ăŮ^&2t'u´!0 +@ 0!?0 !/0!0]1˙˙s˙ăŮN&2r'u´ +@ @O]1?œĹ …@M œ  œœœœœ œ œ B   Ô<Ě291Ô<Ě290KSXííííííííY"  ' 7 œţ7Éwţ5ţ5vČţ8vËËLţ5ţ7yËţ5yÉËyţ5Ëf˙şĺ +ž@< +,  )&  *&•& •‘&Œ,+,* # )#3,üěüěŔ999999991äôěîŔŔ99999990@*WZWU!je!{vu! FYVjddj(|svz( ]] 324&'.#"&5!27!"&''śý3>Ą_Ü'y=Ą_Üţý''†NOy;‚ÝW˘fŞNPţˆţƀÝ[˘gXü˛@CHp¸¸@Cţ¸ţĺpźDžf bĽMKżYĆgţöžţŸţ[KKżX˙˙˛˙ă)k&8uîu˙˙˛˙ă)k&8sîu˙˙˛˙ă)m&8vîu´ +@ / ]1˙˙˛˙ă)N&8rîu´ +@P_@O /]1˙˙˙üçk&<ssuÉŐ =@• •ö  ? üě22üě91/ôüěÔě0@ ?_]332+#32654&#ÉĘţűţ˙űţĘĘţš™ŽŐţřáÜÜâţŽ'ýђ††‘ş˙ăŹ/š@0-'!  *†š*š—Œ.  !' $'$-F0üÄüĚĆîÔîî99991/äţîţŐî990@@'(Š Š     ! "&  : :!MM I!I"jj ĽĽŚ ]]4632#"&'532654&/.5467.#"#şďÚĐŰ—¨:A9Ś`áÓ@ˆIPŒAtx;e\`W§—ƒq‚ˆťqČŰčŕs`/Q*%jŽdʎ¤_[?T>7;‡[Źgp‹ƒű“˙˙{˙ă-f&DCR @?&/&&]1˙˙{˙ă-f&DvR @?&/&&]1˙˙{˙ă-f&DˆR´ (,+1˙˙{˙ă-7&DžR´.< +@ ./<.<]1˙˙{˙ă-&DjR ´-( +@(o(P-_(@-O(0-?(-( ]1˙˙{˙ă-&DœR%@&,,& 2882 +Ä+Ä1@ ?5?/5/]0{˙ăo{3>@C'-%= 4Š%†ˆŠ:š.†-ş*šť1 ¸Œ%?47&%7& =&-7"E?üěĚÔü<ÔěÄ999991Ää2ô<Ääü<ôěÄî2îôîî9990@0+0,0-0.0/00@+@,@-@.@/@0P+P,P-P.P/P0…+…0€@@ @°@Ŕ@Đ@ŕ@ŕ@đ@??? ??0,0-0.0/@,@-@.@/P,P-P.P/ooo oo`,`-`.`/p,p-p.p/€,€-€.€/]q].#">32!3267#"&'#"&5463!54&#"5>32"326=śĽ‰™šDJԄâü˛ ̡hČddĐj§řMI؏˝Ňýű§—`śTežZŽŐďߏo™š”—´Žž0Z^ţÝúZżČ55Ž*,ywxxť¨˝Ŕ‹..Ş''`ţf{bsŮ´)˙˙qţuç{&Fz˙˙q˙ăf&HC‹˙˙q˙ăf&Hv‹˙˙q˙ăf&Hˆ‹´"+1˙˙q˙ă&Hj‹@@ ]1˙˙˙ÇŚf'C˙ó˙˙of'v˙ó˙˙˙Ţ\f&óˆ˙´ +1˙˙˙ôF&ój˙´ +1q˙ău('@^%{&%#${##{#({'(#&'('%$%(('"#" ! B('&%"! ##š šŒ#ą)&' ! (%#" QE)üěôě99999991ěÄôěî9990KSXÉÉÉÉííííY"˛?*]@v%+("/#/$)%-&-'*(6%F%X X!` `!f"u u!u"%#%$&&&''(6$6%F$E%Z Z!b b!z{     {zzv v!x" *đ*']].#"32654&#"432''%'3%F2X)§šŽ’‘Ž6 ~rţäćçţĺÝ4*ŸţÁ!ľäM!ţŮ“ŘĂźŢŢźzź&ţŕ­˙ţÉ7˙ú7´kc\̑oab˙˙şd7&Qž˜˙˙q˙ăuf&RCs˙˙q˙ăuf&Rvs˙˙q˙ăuf&Rˆs´+1˙˙q˙ău7&Ržs´ .+@ /. .]1˙˙q˙ău&Rjs´ +@ @O0?]1ٖŰo )@ęęœ r ÜÔ<ü<Ä1ÔÄüÄîî03#3#!!ßööööýúúţoöţőAŞH˙˘œź +ä@<+,&  )&  *&š& š¸&Œ,+,* # #Q)E,üě2ôě2Ŕ9999991äôěîŔŔ99999990@p(?-YVUV jf!{    { z{ {!"#$%{&›•%¨ -đ-&YVUZ(ifej(ztvz(‰•š$˘­$]] 32654&'.#".5327#"&''‰ţ)gA“Ź\*g>—Š}66ń]ŸC‹_’56ţîđ`Ą?‹`!ý°*(čČOuš))ëÓHn.—MĹw834¨OłMĆxţíţÇ43¨N˙˙Ž˙ăXf&XC{˙˙Ž˙ăXf&Xv{˙˙Ž˙ăXf&Xˆ{´ +1˙˙Ž˙ăX&Xj{´ +@ @O0?]1˙˙=ţVf&\v^şţV¤>@ššŒ¸˝— GFüě22ôě1ěääôÄěĆî0@ `€ ŕ]%#3>32#"&4&#"326sšš:ą{Ě˙˙Ě{ą8§’’§§’’§¨ýŽžý˘daţźţřţřţźaëËççËËçç˙˙=ţV&\j^´+@ 0? /]1˙˙h1'qź;$´ +@@O]1˙˙{˙ă-ö&qJD´+@o]1˙˙h’'šÎJ$´+1@oo]0˙˙{˙ă-&šO×D´"+1˙˙ţuĽŐ&$ä˙˙{ţu€{&Dż˙˙s˙ă'k&&s-u˙˙q˙ăçf&Fv‰˙˙s˙ă'm'vLu& ˛<=/1˙˙q˙ăçf&Fˆ¤˙˙s˙ă'P&&zLu˙˙q˙ăç&F›¤˙˙s˙ă'm&&w-u@]1˙˙q˙ăçf&F‰‰˙˙ɰ&'wě‰˙˙q˙ăŰ&Gq @_?]1˙˙ şŐ’q˙ăô$J@$Ó ů"šš Œ¸—   GE%üěô<Äü<Ä1/ěäôÄěÄîý<î20ś`&€& &]!5!533##5#"3232654&#"˘ţşF¸šš¸:ą|Ë˙˙Ë|ąýǧ’’¨¨’’§śN}““}úü¨daDDaţËççËËçç˙˙É‹3&(qĄ=˙˙q˙ăö'q–H@p]1˙˙É‹m'yĄu(@@]1˙˙q˙ăH'š–H@p]1˙˙É‹P&(zĄu˙˙q˙ă&H›–˙˙ÉţuŐ&(Ě˙˙qţu{&Hx˙˙É‹g&(wŚo@@ ]1˙˙q˙ăa&H‰”˙ű´!+@!]1˙˙s˙ă‹m'v\u* ˛<=/1˙˙qţVZf&ˆhJ ˛ <=/1˙˙s˙ă‹m&*yu˙˙qţVZH&Jš‹˙˙s˙ă‹P'z\u*@?]0˙˙qţVZ&›hJ˙˙sţ‹đ'×^˙í*˙˙qţVZ4'Ăŕ J˙˙É;m'vu+´ +@ / ]1˙˙˙ĺdm'vuK*´+1K°QXť˙Ŕ˙Ŕ88Y@ €€@@]É‹Ő:@•  •­  8 Üě22Ěüě22Ě1/<ä2üěÜ22ě2203!533##!##53!5qĘŢʨ¨Ęý"ʨ¨ĘŢŐŕŕŕ¤űŻÇý9Q¤¤ŕŕxŸ>@! ‡ ‡¸— N  Ü2ě22ĚĚôě1/<ěôÄěÜ2ě290#4&#"##5353!!>32Ÿ¸||•Źš}}š`ţ BłuÁƤý\žŸžž¤ý‡ö¤zz¤ţźedď˙˙˙äx^'t.u,´ +1˙˙˙Óg7'ž˙ó´+1˙˙Y1'q˙.;,´+1˙˙˙ňHő'q˙˙˙ó´+1˙˙˙őgm'y.u,´+1˙˙˙äVH'š˙ó´+1˙˙°ţu%Ő'˙d,˙˙–ţu '˙JL˙˙É•P&,z/uł<<1´??]0Áy`,@ ¸żFüě91/ěä0@4D@P`p]3#Á¸¸\`ű {˙˙ÉţfďŐ'-\,@ě1˙˙ÁţVą'M8L@Fě1˙˙˙–ţf_m'v.u-´+1˙˙˙ŰţV\f'ˆ˙ů´+1˙˙ÉţjŐ'× .˙˙şţœ'׏ Nşœ` ť@(Bź F üě2ÔÄ91/<ě290KSXííííY"˛ ]@_ ')+Vfgsw‚‰Ž“–—Ł    ('(++@ h` ‰…‰š—ާśĹÖ÷đ÷đ]q]33 ##şš%ëýŽkđýÇš`ţĺýňýŽ!ýß˙˙Éjl'snv/˙˙ÁJl'sZvOą<1K°QXš@8Y@ŸO]0˙˙ÉţjŐ'×› /˙˙ˆţ­'× O@@]1˙˙ÉjŐ'qŸ˙Ă/˙˙Á'q9O @]1˙˙ÉjŐ'y1w/˙˙Á„'yÖsOK° QK°SK°QZ[Xš@8Y1˙ňuŐ ?@ •  : yô<ěÄü<Ä991/äě90´0P]3%!!'7ÓË9Pţw×ü^”MáŐý˜ŰoţîýăŞ;jnžH ^@ — z z Ô<äü<ä991/ě90K°TX˝ @ ˙Ŕ878Y@ @ P ` sz p ŕ đ ]37#'7Ǹ}Lɸ{JĹýŚZjüăšXj˙˙É3l'sĹv1@O]1˙˙şdm&vBQ @?O]1˙˙Éţ3Ő'× 1˙˙şţd{'א Q˙˙É3_&1wőg´ +@ /  ]1˙˙şdf&Q‰´ +@]1˙˙ÍšŐ'QU~ÉţVđ;@  AüK°TXš˙Ŕ8Yě2ÔüĚ1@ •°•‘/äôěôě0!"#367632+53265PţÍł×ĘĘNij™ăéQRľW1fOŹ˙Ţü˛Őń†CCţÁţĚüoŐa`œZ şţVd{;@ ‡‡¸ź NF üě2ôěÄ1/äôÄěÔě90´`!Ď!]+5327654&#"#367632dRQľţéi&&||•ŹššBYZuÁcc¤ýHÖ``œ01™˛Ÿžž¤ý‡`Že22wx˙˙s˙ăŮ1'q';2´ +@]1˙˙q˙ăuő&qs˙R´+1˙˙s˙ăŮm'y'u2´+@]1˙˙q˙ăuH&šsR´#+1˙˙s˙ăŮk'{'u2˙˙q˙ăuf'Ÿ Rs Ő;@•••­   üěÔÄÄÔě299991/ěě2ôě2î0!!!!! !# !3úýÇý9řű×ţOţAżągţżţŔ@AŐŞţFŞýăŞ|pm|Şţáţŕţßţßq˙ăĂ{'3„@1†ˆ Š. š(šť"%¸Œ4"1 K1 Q+E4üěôüôěÄ9991ä2ô<Ääě2Äî2îôî90@%?5_5p5Ÿ5Ď5Đ5đ5????? ooooo ]q].#"!3267#"&'#"32>32%"32654& ¤‰™šHü˛ ̡jČbdĐj ňQGьńţďńŒÓBNčâú°”ŹŤ•“ŹŹ”˜łŽž5ZžÇ44Ž*,nmnm98olkpţ݇çÉÉçčČÇé˙˙ÉTl's•v5˙˙ş”m&vBU˙˙ÉţTŐ'× 5˙˙‚ţJ{'× U˙˙ÉT_&5w}g@_]0˙˙şZf&U‰´ +@]1˙˙‡˙ă˘l's•v6˙˙o˙ăÇm&vBV˙˙‡˙ă˘m'v“u6 ´ ))Ic:1˙˙o˙ăÇf&ˆ%V ´ ))Ic:1˙˙‡ţu˘đ&6z‹˙˙oţuÇ{&Vz˙˙‡˙ă˘m&6w‹u ´+ ""Ic:1˙˙o˙ăÇf&V‰ ´+ ""Ic:1˙˙˙úţuéŐ&zP7˙˙7ţuňž&záW˙˙˙úé_&7wsg´ +1@_]0˙˙7ţ‚&Wq7p@]1˙úéŐF@ • • @ @ Ô<äĚü<äĚ1/ôě2Ô<ě20@@pŸ ]!!!!#!5!!ďýî ţ÷Ëţ÷ ýîŐŞýŔŞýżAŞ@7ňžC@ŠŠź ‡ Fü<<Ä2ü<<ÄÄ2991/ěô<Äü<Ü<ě20˛Ż]!!3#;#"'&=#535#53w{ţ…žž%&s˝˝ŐQQ‡‡‡‡žţéŽé‰''šPOŇéŽé>˙˙˛˙ă)^'tîu8´ '+@ ]1˙˙Ž˙ăX7'žƒX´&+1˙˙˛˙ă)1'qî;8´ +@ / ]1˙˙Ž˙ăXő'qƒ˙˙X´+1˙˙˛˙ă)m'yîu8´+@]1˙˙Ž˙ăXH'šƒX´+1˙˙˛˙ă)o&8œđi˙˙Ž˙ăXĘ&Xœ|Ä @@@!]1˙˙˛˙ă)k'{îu8˙˙Ž˙ă^f'Ÿ°X˙˙˛ţe)Ő&8ú˙đ˙˙Žţuč`&X'˙˙DŚt'vő|:´+1˙˙V5m'ˆEZ´+1˙˙˙üçt'vr|<´ +1˙˙=ţVm&ˆ^\´+1˙˙˙üçN&<rsu´ +1˙˙\l's•v=˙˙XŰm&vB]˙˙\N'z¨s=˙˙XŰ&]›˙˙\m&=wžu˙˙XŰf&]‰´ +@ ]1/ř#@ ‡ —Šź Lü<ĚüĚ1/ôěôě0!##53546;#"˜š°°Ž˝Ž°c'&яNťŤ™()g ˙ă¤,D@%š š Œ¸")%Š,$'—".EG* ,(%#'F-ü<Ěě222Ěôěě1/ôÜ<ě2äôÄěĆî04'&#"327667632#"'&'##5353!!ĺST’’TSST’’TSýŽ:YX{Ě€€Ě{XY:ššššEţť/ËtsstËËtsstRd01˘˘ţřţř˘˘10d¨}““}˙—PŐ)C@#• •• ­ . *üě2üěÔě9991/ěěôěî90˛"]!2654&#!2654&#%!2#!"#546÷DŁŁţź+”‘‘”ţ çú€|•Ľţđűýč„vœŔÉý݇‹Œ…fţ>orqpŚŔą‰˘ ˘ČÚ0_i1FľŁ˙˙ÉěŐĽş˙ă¤&8@š#š Œ¸Š—(EGF'üě22ôěÄě1/ôěäôÄěĆî067632#"'&'#!%4'&#"3276s:YX{Ě€€Ě{XY:šNýkrST’’TSST’’TSśd01˘˘ţřţř˘˘10d¨ŚüŔËtsstËËtsstěŐ 3@  . /Üě2üěÄĚ1@ • ­ •/ěäôěł 9/04'&#!!276!2#!#ONŁţźDŁNOý|NűţđűýčÉ8ˇ‹DCýÝDC¨ýšÚŢÝÚD‘˙ă¤>@  G /Üě22ôěÄĚ1@š¸ š Œ—/äôěÄôěÄł9/0>32#"&'##34&#"326s:ą{Ě˙˙Ě{ą:šş"Qr§’’§§’’§śdaţźţřţřţźad¨DŃüËççËËççs˙ă'đ0@†ˆ•‘ † ˆ• Œ0 Ü<ôěě1ôěôěôěôě0>3 !"&'53 !"shí†S†ţzţ­„íjfç‚ţđ˙‚çfbGGţaţ˜ţ™ţaHHÓ_^9'(9^_s˙ăZd$D@"!• % ĄŽ •ĄŽ•‘Œ%  0%üü2ěěÄ1äôěôěîöîÜě0´&&].# !267# !2676;#"'fç‚˙ţđ‚çfjí„ţ­ţz†S`œ SfăM?†nbŐ_^ţÇţŘţŮţÇ^_ÓHHŸghŸ$ĂbzŞ–q˙ăĚ"N@$†ˆ† ˆ šš¸Œ#‡—# HE#üô2Ěěě1ôěäôěţôîőî0@ $$€$$ $].#"3267#"!2546;#"çNPłĆĆłPNMĽ]ýţÖ-GFĄľE0iL~ő++ăÍÍă++Ş$$>: ÖŔœa˙˙ şŐ’˙—Ő.@• •  2 üěôě99991/ěôě0˛`]3 !%! )"#546÷ô5ţáţËţBŸ˛–ţhţPţa„vœŔ/űw.,Śţ—ţ€ţ~ţ–0_i1FľŁÉěŐ.@  .üěôě2ÄÄ1@ •  •­• /ěôěôě0)!"!!"$54$3!!ž@DţźŁNýčűţđűNý|ˇţď#‡“ú+ÚŢÝÚŔq˙ăZ?@ššŒ¸‡—G EüěÄôě221/üěäôÄěÄî0ś` €   ]5!#5#"3232654&#" M¸:ą|Ë˙˙Ë|ą:ý§’’¨¨’’§nŚůě¨daDDadšüŔËççËËççqţVuc'T@ )E Q E(üěÄô˛]ěÔěě99@   ššś(ôěÔüÔĚ99@%S ě910%!"'53254%&'&326&#">kţGÝxfööţřĐuŽďđ›'Ť””Źź~@3cnBOţđF™Fu\0%p‡9ţÇţíœţü ËĺčĂÂÇ *܃EŐ +@    ÜÄÄÔě2Ä1@ • •­•/ěôěôě0!5!!5!!5Eü>řý9ÇýŐú+ŞŞşŞu˙ăŮđD@&ĄŽ•••­• ‘Œ3üÄěôě91äôěôäîîôî90!!"56$3 ! 7327uţíţî‹üpo’^‹ţˆţĆţˇţ—Ü ˙ĘĘ˙   2`_×FHţgţ’ţŸţ[ˇĚĂţää˙ă{đ(@@$ † ˆ •‘)•­)† ˆ•#Œ)* &)üěÔěÔÄÄĚ1ôěôěôě9ôěôě0.54$32.#";#"3267# $546؃Ž ćYÉsržS˜Łž•śŽĽšÇžmČTjÇ^ţčţĐŁ%!Ť|˛Ń ´&${spwŚ•„–21Ă%%ňݐÄ˙–ţf#ŐA@ • °••­ üě2ÔÄÄ991ěôěîôě990˛ ]!!!!+53265ÉZýpPý°ÍăM?†nŐŞţHŞýŸţňôŞ–Â˙ţVře@# ‡ ˝Š‡—ź LüK° TXš@8YK°TXš˙Ŕ8Y<Äü<ÄÄ991ä2üěî299ôě990ś@P ]#"!!+53265#535463ř°cM/ţŃŽ˝Ž°cM°°Ž˝™Phcű띍™Ph*NťŤs˙ă—d&I@43! F'üěüôěüÄÄ1@•'$•$•ĄŽ•‘Œ'äôěôěţÔî99Üě0%!5!# !246;#".# !26Ăţśuţć ţ˘ţu‹^[ŁDÉăM?†npü‹ţîţík¨Ő‘ŚýSU™mn™źęŞ–Â×_`ţÎţŃţŇţÎ%ţRvŐ%•@ 'P $&ÔÔěÔěÔ]Äľ 91@ •˝%$&ä222ôěł990@ #%$$ě<ě<ś$ěś#$ě´%#@$"! #9927654'&'3#"'&547673ż6,3,,3,6ŮŢýşhC.Kd››dK.ChýşŢţý B9Iy\\yI9B z^űĎČŽwB‹AWWA‹BwŽČ1şG*O@, *&NF+üě2ôěÄÄĚÔě91@‡ '&‡& ‡ #¸—/<ěô<Äě9ě99ě0%27654'&'5+"&54&#"#3>323L•TWJ>yŕmoţŕÝFť||•ŹššBłuÁĆLiœbe›Ţp_!”‘ţěőţćČΟžž¤ý‡ýžedďčţň“gÉĆŐ .@ • üK°TXš@8YěÄ991/äě9903;#"&ÉĘn†?MăÍŐü-–Şô RŐ E@ •Ż  ü<ÄK°TXť@@88Yě2Ä1/ěÜ<ô20@ 0 @ P `  Ÿ ]33###53ÉĘżżĘżżŐýŞýżAŞÉ÷đf@ üě2ÔÄ9Ôě1@%    B  •‘Ż /<ěôě9990KSXííííY"#54&#" !#3632÷ŞI&F%ýÝţöý3ĘĘlUqˆUUHy6P#ýůüăĎý1Őý‰CO\[nšœË@   Füě2ÔÄ9Ä1@B  •— ź/<äüä90KSX@     ííííY˛]@5 ( ' ( ++@h `‰ … ‰ š —Ş § śĹÖ÷ đ ÷ đ ]´ q@%  ' ) +V f gs w ‚ ‰ Ž“ – —Ł ]46;#"3 ##šŁľż¨iL%ëýŽkđýÇš~ÖŔœa™ý˙ăýôýŹ#ýÝ * 2@F ü<ě21@ Š—/ěÔ<ě20@  @ P ` p đ ]33###53Á¸ąą¸ˇˇý8ýDź= @     ÔIJ€]ÔÄÄĚ9´ @ ]1@  — /<ôÄÄ90@2 ŠŠ Š        ěěěěěěěěěě<<ěěü<3''%'3%# =ëGţÔ!)KČ4:!ţÉíĂţĆţ~2źeccŊhahú×<üIJ˙ă'Ő'J@ )PP (üěüüüĚü<91@ !•!$Œ( /ô<<ô<Äě2909%#"'&5332653327653#5#"'&ŚEŔ‚Ż__Ë'9uŚË99w{SSËË?°yzVUŐ|v{zâűďş5Nž¤ěűď˘NM_`Łěú)Žgb>>˙–ţf3ŐŒ@)B • °Ż6  9üěä99üě991/ě299üě990KSXííY"˛ ]@068HGif€ FIWXeiy…Š•šŸ]]!3!+53265É–ÄţđýjÍăG?†nŐűáú+áű‡ţňôŞ–Â˙˙şţVd{Ks˙ăŮđ 1@ 3üě2ôě21@• •­ •‘ Œäôěôěě0! ! "!&32sy:;xţˆţĹţĆţ‡ľĘ˙ ŹţýVűÜÜřébĽţ[ţŸţžţ[¤ĹţäĂĂýzţ˙ţÂ=˙˙g˙ă&2ô̢4˙˙v˙ăÓë'ĚX Rs˙ăĎđ3@•Ż• ‘•Œ!  üěÔ<ěÜěÄ1/ôěôěôě0!4&#! !2!2"327&nzźţĹţĆţ‡y;pa'ăÍüXÜţýÜŻ€ŠÓ–ű‹Ó¤bbĽôţňü-Lţ¸ţćţĺţ¸gFqţVY{!:@ ‡ź"š¸"šŒ˝"# E"üěÔěÜěÄ91äôěôěôě04'&##"3232"327&Ą&&i‰đńţďńdRŘľRQý”ŹŤ•@TţVt™10üź98``ÖűŒ‰çÉÉç:đ6˙—ńŐ:@••   ? üě2üě91/ôěÔě0@ ?_Ż]32654&#%!2+#"#546÷ţššţ8Čűţ˙űţʄvœŔ/ýϒ‡†’ŚăŰÝâý¨0_i1FľŁšţV¤$O@$#šš¸Œ˝% Š—%G  F%üě22Ě99ôě1ôě99ääôÄěÄî0@ `&€& &ŕ&]%#46;#">32#"&4&#"326sşŁľţçiL:ą{Ě˙˙Ě{ą8§’’§§’’§¨ýŽ(ÖŔœa™ČdaţźţřţřţźaëËççËËççÉţřTŐV@  ?  üě22üÄě99991@• •  /ěÜôěÔě9990@ @u|]#.+#33 326&#A{>ÍŮżJ‹xÜĘĘţüƒý‰ţš™Ž´~ţh–bţ‘ŐţřÖ؍şOýђ ‘r˙ăđ!d@ -" "ÜěäüěÄ99991@B!Ą” • •”‘Œ"äôäěîöîÎ90KSX@ ííY6 327# '&546?6764'& ĚäĆĘâ{š‡ź­ářţýÖţ璑×âzŚ<;YZţĄä¤LäţŔ-|숋Đ_ppŮśŮ+23Ů@@md˙ăź{'Ď@  !! RE(üäěÔěÄ99991@ †'‰$†‰š$š¸Œ(äôěţőîőî90@S !S BKSXí9í9Y"˛]@/)?)_))€)) )đ)]@% '$&((*//*( ( ))$††††]@.,,,;;;; q>323267#"&546?>54&#" L´fÎŕ˜Ť@ŤeŒ‚aĆflĂZŘ÷ĽÄ?”b‰‰Z¨N?Źž‚•$%PKQY55ž##śœ‰™*!I@TT((˙˙É‹Ő7ţňţV×6@   O ü2ü2ĚĚÔĚ1@‡ ‡— ‡˝ üěôěÔ<ě20;#"&5# 54!23%&'&#"3wMc°Ž˝Žžţň/ľR5żţ†!n|wjű=hP™ŤťŽŇŘ`@o›š,0A37ţVňž?@ Fü<Äü<Ü29üĚ1@Šź‡‡˝/üěěô<Ěě2990!!;+53276="&5#53w{ţ…Ks˝¤´F0j&&Ő§‡‡žţý ‰NŽÖŔœ01™ŸŇ`>éŐX@ •@  ÔÔěüä991/ôě2Ä990K° TX˝@˙Ŕ878Y@@pŸ ]!!##"#546Ž;ýîË^„vœŔŐŞúŐ+Zi1FľŁ7ňI@  Fü<Äü<Ä2291@‡— Šź‡ /ěô<ě299ôě990˛Ż]!!;#"&5#53546;#"w{ţ…Ks˝˝Ő˘‡‡Ž˝Ž°cMĂcý ‰NšŸŇ`NťŤ™Q˙úţféŐT@• ˝•@@ ÔäüäÄ1ôě2ôě0K° TX˝@˙Ŕ878Y@@pŸ ]!!;#"&!ďýîn†?NăÍýîŐŞű=–ŞôĂ˙˙­˙÷_&8űĚä4˙˙°˙ăië'Ěî XN˙ăĎĘ:@!3   üÄüÄôÄěüÄ1@ • •Œ ôěü<ě2220!! 47!5!3254'5!ĎţŔĄŽţţŃţĎţ‘žţÁX˛Ç ŘŘĆąXţŘÂţËţwŠ>¸*‹˛˛aţ´ĘďţÝ"đĘLa˛É˙ávŐ-@   üěÔě/<91@ •ŒôěěÄ0%254'&'5!'&'&33ĆŘcAnłĄŽŔżţĎMčagĘn†"đĘŚmWDţŘÂţËĹÄtzđü–˙üđđd@  @ @Ôäüä9Ä9/ě1@ •‘ Ż/ě9ôěĚ990@        BKSXííííY""#3 632#54&×9%ţ„ËýđŮžNZوUUŞIGýżý9Çýšůˆ\[nƒy6P=ţVŘ{j@  ÔK° TK°T[Xš @8YK°TXš ˙Ŕ8YÄÄ9Ôě991@:        B ‡˝ š¸ ź Ääôěôě9990KSXíííííí2Y"@      '$$  )( % $ $ ' 755008 6 6 8 A@@@@@@@@B E G TQQUPPVUVW W U U ffh {‰Š … … ‰ ™ • • ¤ ¤ F]@%     # 5 I O N Z Z j ‡ € “ ]+5326?3 67632#54&#"“N”|“lLT3!ţ;Ă^0X‡ƒš˛Q99) hČzšH†TNü”Ŕ43`ż†rr:T*\ŐŔ@5    B ••• B ÜK° TK° T[Xš ˙Ŕ8YÄÔä99ÄÄ91/ěôěÔ<ě20KSXíí<<<323#‰ÁüL:sţ§â_%'ST†_ijxzÔXč"Jhě0ŞŞŞ@umHLIwKK!!CĚ12čÂ\RI`1]˙ÁůŐ5@ FüÔěěÔÔěĚ1@ •• • ôěÔěĚÔě0 4&#!!!%$ $5& šĽý÷Ąý)s˘Q;-˜ýÄţАţŰ%†“,Şţ%ĐhţŕV)$yňÝhţL?`3@  FüÄěÔÔěĚ1@‡˝‡ ‡ źôěÔěüĚ2ě03 4&#!!!32!"'hŞÎ–šĽţŸýŸÝiäŚ;-˜ţčťÔ§c%†“,Şţ&cÔţŕV)$yJX˙㼞$!"'&'5327674'&+#5333!Şpln‰ţíUQQLITNPłc9:VŔ>ĺĺĘçć}wsŞş}#Ź(rA…bLr¤ţ줺ţV¤{@@  Füě22ÔěĚ1@ B‡ Œź˝ěÄôôĚě0KSXś‡íĚY#36763254'&#"sšš4‡QҸMNüĎr98xÜ­zţĐ ŞBR1pq™ţWţäů…BAďÉţV“Ő&@ —˝Füě1ěě0@ @P`pđ]3#ÉĘĘŐř˙˙ÉţV'Ő'‚”‚ţVœŐ:@ ŠŠ — ˝  Ô<<Ě2ü<<Ě21ěě9/<ě2Ü<ě203!!!!#!5!5!5!sĘ_ţĄ_ţĄĘţĄ_ţĄ_Őý—¨đŞý,ÔŞđ¨˙˙ɔՔ˙˙É Đm'?ą'˙˙É °f'@Ő'˙˙q˙ă‘f'@śG˙˙Éţf$Ő'-‘/˙˙ÉţVŢ'Me/˙˙ÁţVď'MvO˙˙ÉţfňŐ'-_1˙˙ÉţVˇ'M>1˙˙şţVŢ'MeQ˙˙hm&$wžuą<1˙˙{˙ă-f&D‰Z´ +'+1˙˙˙ţ`m&,w/u ´ Ic:1˙˙˙ŕ^f&ó‰˙ ´ Ic:1˙˙s˙ăŮm&2w'u˙˙q˙ăuf&R‰vą <1˙˙˛˙ă)m&8wöuą<1˙˙Ž˙ăXf&X‰v ´ Ic:1˙˙˛˙ă)3&Ľ08˙˙Ž˙ăX1'q{;ž˙˙˛˙ă)Z&8¨6˙˙Ž˙ăX"&X¨˙žţČ˙˙˛˙ă)Z&8­0˙˙Ž˙ăX"&X­˙ÄţČ˙˙˛˙ă)`&8Š0˙˙Ž˙ăX"&XŠ˙žţČ˙˙q˙ă{˙˙h3&$Ľ˙˙{˙ă-1&ŚqR;˙˙h3&$§˙˙{˙ă-ô&D§˙“ţÁ˙˙H4'q×>ˆ˙˙{˙ăoň'qč˙ü¨s˙ăđ%T@!$"43 &üěü<ĚäüÄÄ1@"#•%•ĄŽ•‘Œ&äôěôěţÔî99ܰ KTXą"@8Y<Ě203## !2.# !2675#535!5‹yyuţć ţ˘ţu‹^’opü‹ţîţík¨Cýýţś ţÖX˙SU™mn™HF×_`ţÎţŃţŇţÎ%'ľX„ŚqţVú{ 4X@"2% G,E5üÄěôě22ÄÄ1@ #% ) †šš2/¸3ź š˝&)/ÄäěäôÄěţŐî99Ô<Ě20ś`6€6 6]4&#"3263#!"&'532767!5!6=#"3253˘Ľ•”ĽĽ”•Ľ¸łĆ:ţúaŹQQžRľZý„š9˛|ÎüüÎ|˛9¸=ČÜÜČÇÜÜënXF]@Œł,*_EG^[cb::bcŞ˙˙s˙ă‹m&*wJuą!<@”!T!$!]1˙˙qţVZc&‰JýJ˙˙Éjm'w˘u.˙˙˙éœm&Nwu*´ +1K°QXť˙Ŕ˙Ŕ88Y@ €€@@]˙˙sţeŮđ'4˙đ2˙˙qţeu{'€˙đR˙˙sţeŮ1'q';Ź˙˙qţeuő&qs˙­˙˙ ˙Ářm'wžuy˙˙XţL/f&‰T˙˙˙ŰţVdf'‰˙%ů ´ Ic:1˙˙É ĐŐ'=ą'˙˙É °Ő']Ő'˙˙q˙ă‘']śG˙˙s˙ă‹l'sv*˙˙qţVZc&JvýÉ˙ă-Ő5@8üě2üě2Ôě1@•­ •Œ/äěä2üěÄ03!327653! '&5!#ÉĘŢĘ>=™”B>Ęd`ţćţígdý"ĘŐýœdűěŸPNOK¤ŸýZ߀xxvé ý9ÉţVđ@@  üě22ÔěĚ1@ B• Œ˝ěÄôôĚě0KSXś‡íĚY%#3676324'&#"“ĘĘ8‘WâĆSTü‘Ą=<íşœýşšHW5xz¤ţ7ţÎŽ GFţ˙˙˙É3k'uu1˙˙şdd&QC˙ţ˙˙hs&‡s\}˙˙{˙ăÜs&§sě}˙˙Hl's\vˆ˙˙{˙ăoc&¨ve˙ý˙˙f˙şĺl'sţvš˙˙H˙˘œc&şvý˙˙hp&$|ĺz˙˙{˙ă-d'Ŕ˜˙ţD˙˙h6&$xź>˙˙{˙ă-H'ÂeD˙˙É‹p&(|Ľz˙˙q˙ăc'Ŕş˙ýH˙˙É‹6&(xŚ>˙˙q˙ăH'ŠH˙˙˙§sp&,|Yz˙˙˙Ác'Ŕf˙ýó˙˙w6&,x>>˙˙˙ăUH'Â$ó˙˙s˙ăŮp&2|Az˙˙q˙ăud'ŔŸ˙ţR˙˙s˙ăŮ6&2x>˙˙q˙ăuH'˜R˙˙ÇTp&5|yz˙˙‚Jc'Ŕ%˙ýU˙˙ÉT6&5x€>˙˙ş^H'Â-U˙˙˛˙ă)p&8|z˙˙Ž˙ăXd'ŔÔ˙ţX˙˙˛˙ă)6&8xě>˙˙Ž˙ăXH'ÂŤX˙˙‡ţ˘đ'×v6˙˙oţÇ{'×,V˙˙˙úţéŐ'×S7˙˙7ţňž'×WœţRsđ. 56$>54&#"57>54.#"5632?4oš˙ţę™Č1š\}p_sŁř54&#"57>54.#"5$32§Fp>!Bl˜ł•J˘őžc(v];?Řß"AW?-1CA#E¨“ †p¸tgÍDZX%KŠlaF='‚.`[b[3XpV‹U 2#Pš™ł×ĘĘQ̝ăéÉ×Ő˙Ţü˛Őń‡†ţÁţĚúŮq˙pD(4%3254'"632!"'#67&5#"'&76323 76'& ś% 44ĘnˆôţŞI5"ÄC0:XY|ˀ€Ë|YX:¸üŐST$TTTTţÜT‚Ż- ¸ÎţżH:E“<$d01˘˘˘˘10d^üćţjtsst–tssq˙ă%đ ;W@$3=E (B!8;7B/E<üěôě̲ ;]ôěĚôěě91@$3•­< ;‘<,Œ<ôěôĚÔĚôě990" 7654&327654'&'52 '&54767&'&5476!˸jkkjpkkÔô‚Ş_;̨_`Lm‚䖋ޘŹ_`œ›ýş›œ`aŤŤCU‚tĹMMţňMMMN†‡š'|OEH-AAˆž+Mdhaş€˛ "ccŮttttُcc"FYX‚SJq˙ăq 4C@6E B42()+&BE5üěôěĚ2ÔěĚ2ôěě1@4)"š.­5šŒ5ôěôě99Ě20" 7654'& '&5467&'&5473327654'qSRRS SSSRţ:4H‚’RQ…„ţ„…¤’;4?Ą+IHƒ‚IJ,ĹMMţňMMMN†‡MMJ@b™@Y "ccŮttttُĆ"#VKŽYIAčAAAAtw>\ţVŐŸ@ B  ÜK° TK° T[Xš ˙Ŕ8YÄÄÔěä991@ B• •• /ěôěÜě0KSX@ ííY@@ )&8HGH  /59?GJOUYfiowxŸ]]+53276=!5!5!!žHrţéi&&űő°üg•üPÇţßP%œ01™š‘ŞšűoXţVŰ`Ź@   ÜK° TK° T[Xš ˙Ŕ8YK°TXš @8YÄÄ´@`]Ä99Ô´@`]ě1@ BŠ ŠźŠ /ěôěÜě0KSX@ ííY@2&GI + 690EIWY_fh€Ż]]+53276=!5!5!!۞Hrţéi&&ý5´ýejýL´ţßP%œ01™¨%“¨üŰ˙˙hP&$›Ä@˙˙{˙ă-&D›_˙˙Éţu‹Ő&(z˘˙˙qţu{&Hz{˙˙s˙ăŮ3&2Ľb˙˙q˙ău1&¸qs;˙˙s˙ăŮ3&2Źi˙˙q˙ăué&RŹ˙ľţś˙˙s˙ăŮO'z't2˙˙q˙ău&›sR˙˙s˙ăŮ3&2§j˙˙q˙ău1&ńqs;˙˙˙üç1'qr;<˙˙=ţVő&q^˙\Š˙p\%3254'"632!"'#67&73Î% 44ĘnˆôţŞI5"ÄC1¸‚Ż- ¸ÎţżH:E“ţ˙ŰţVy` 8@ ‡˝ź  OF üěä991äôě990@  @ P ` p ]3+53265Á¸ŁľF1iL`űŒÖŔœa™q˙ăŒ #/A@1E%G +G!E0üěô<<ü<<ôěě1@(š .šŒ ¸ —/ěä2ô2ě2ě20 6& 23632#"'#5#"'&76'&  7/ST$¨¨ţÜTšőršrôĚ˙˙Ěôršrőˀ€]STţÜTSST$Túţjtsç–çs Ĺ^ý˘ĹţźýđţźĹ¨¨Ĺ˘˘˘˘üé–tsstţjtssqţVŒ{ %/D@1E$G+G'E0üěô<<ü<<ôěě1@ *š.š!¸ Œ˝ź0äää2ô<ě2ě20'&  7"'##"'&763253632 6& ÍSTţÜTSST$Tšôršrőˀ€ËőršrôĚ˙˙ú˘ST$¨¨ţÜTd–tsstţjtssţóĹýŽRޢ˘˘ĹŞŞĹţźýđţźţjtsç–çs˙ý˙ş|3 #!#'#7'7 3!Jĺ†afţp|҈ýÖÍ2F;R/ţîo˝]jŐţĄĄYţ'üńŽFF8ÄýąţO ˙şŠ",'&76!27&'!2767# '#&# rfÜuĂĂS†v=:efc.1üô ˆ‚tsfjwv„ţ´Â9Řt‚˙ˆˆFXťhĎĐ$xYvť+!üf //_ÓH$$Ç\/œţŘ­ ˙˘]ź"+'7&576!27&'32767#"'&#"i`˝U—–UQ.-Y_výÓcłPNONMRS]đ“7îGGłcc^NćĚ lOU ý^q+Ş$VqrÍg jŐ ;@  • •: ü<Ěěü<Ě1/äěÔ<ě20@ 0P€€]33#!!#53ÉĘżż×ü_żżŐýwý˙˛˙ş1##'!5!7 !é4ţ"Ëţ gZýî™8fýŚ,ţÔi>ýĚý ýłXÇRŞBYţ boţ{=4'&/&'&54632.#"3#"'&/&'&'&'53276 23Ť@ŤLLŕÎf´LN¨Z‰DE11”?ĆPS{W„Ÿ“*L'TrGYí$alfcca‚FF'K((%$JK‚žŹŽ((**T@%$!,KL‰œ[@Ÿ~$š=&[ó#ž5-,Xţ3`!;#"'&/&+=!qjýN\1“*Ll“TrGYí=Z^´ýe`¨üÝ1ţř~$š=&[ó?œ %PŐ6@ ÔÔěÔě9991@ •• •/ôěÔěÔě0##32654&+"56;2‘'ĘńššţEŻO˜Ťţôţ÷ZýŚ‘‡ˆ*,śFÜá×çP{7@   ÔÔěÔě991@ š † ˆš¸/ôěôîÔě032654'&#"5632##/dšLU†IVVN˜Ťű}„ÔÂĘŚ‘‡AH+śFntŰŐĺţü ěŐ (\@ #  . &%)ü<Ěě22ĚüěÔě9991@(•%• ••­#/ěěôěî99/<ě20˛*]!!!2654&#!2654&#%!2#!#53“[ţĽDŁŁţź+”‘‘”ţ çú€|•ĽţđűýčżżÉɐʇ‹Œ…fţ>orqpŚŔą‰˘ ˘ČÚp ˙ăÎŐ_@ 8AüK°TXš˙Ŕ8Y<Ěě2ü<Ěě21@ • • Œä2ôě9/<<ě2299990śŸ]3!33#! 5#53!3265˛ËáËĽĽţßţćţĺţߌŚŹýŽĂÂŽŐý–jý–¤–ţÜţÖ*$–¤¤}đÓÓđ˙˙hŐ0É˙B‹“33#!!!!#7#!#!¸ŞAX’— ţźš.ý˜AŞA°Žţ<šŮ—ţV“žŞţFŞý㪞žŐúŐýăÇşţFq˙B&-1&'&'!3267#"'#&'&3273&#"#ÇSošţ+”JajÇbcĐk{cPŞm!)ü81GŞ\9/ƒýź‡ššZoĎ ”—Z ţň6Zţ—44Ž*,! œ C Źŕ"2’ĹJŽžţcŹ˙–ţfRŐY@   ••° 9 üK°TXš@8Y<ě2ä99ÄÄ1äüěÔ<ě2990@ 0@P`Ÿ]#+53265#5333RżÍăM?†nżżĘżwýńţňôŞ–ÂŚ¸ýH˙ŰţVS@$žą ‡ ˝Šź  OFü<<ě22ä991äÜ<ä2ôě99ôě0@ @P`p]33#+53265#533#Á¸ŁŁŁľF1iLľľ¸¸`ţ¤ţ(ÖŔœa™ؤŹésţf°ń$C@$ • °%"•• Œ‘Ż%  %üěÔě22Ě991ěäôÄěÄîäě99053;#"&5# !232#"łÄn†EMăÍMěĽţňţŹTĽěüßęĚÍëëÍĚęíčú“–Şô„€Ť\\Ť€ýxţăţťEEţťqţV@{$H@"‡˝%"ššŒ¸ź%G E%üěôě22Ě991ěäôÄěÄîôě0ś`&€& &]#"&=#"3253;32654&#"@FľŁ:ą|Ë˙˙Ë|ą:¸Li1ű戮’¨¨’’§ţVŔÖźdaDDadŞűŒ™a=ËççËËçç TŐ ť@  ?  !ü<Ěě2üÄě99991@!  B• • /<ôěÔ2ě29990KSXíí9Y"˛@"]@Bz%%%&'&&& "66FFhuuwˆˆ˜˜]]#.+##53! 32654&#A{>ÍŮżJ‹xÜĘżżČüƒý‰ţ’••’ź~ţh–bý‰wڏÖ؍şOýƒ…J{=@ Fü<ÄÄü<<1@ ‡¸Š ź/äÔ<ě2ôěÄÔĚ0´PŸ]###533>32.#"ŤšŹŹš:ş….I,œ§h¤ţ<ĤřŽfc˝ÎĄ˙öěŐ3!733!#!53!ٗ –Ů—œţőţöËţöţôwţјŐŕŕŕ¤ţvý9ÇФ¤â ţVľ`+5326?!533!33!+“N”|“lLT3!ÍţÖđžĂ¸L¸Ăšďţ×ÁÚmhČzšH†TňÍţ3Íţ3ţđŽ˙ă`{ ,¸@ .% F-üě22ÔěĚÄ991@Šš¸-&†%ş"š*Œź-äôěüěôěÄÔäś%  9990@1?$?%?&?'O$O%O&O'_$_%_&_'o$o%o&o'$%&'$%&']@+?#?$?%?&?'?(?)O#O$O%O&O'O(O)_#_$_%_&_'_(_)]2654'&#"367632#!3267#"&ߏA@o™\]¸¸?^^ˆŹfe~űţţST—`śTe__Zóđ+f{b:9ml´)LŞf01a`˘˝``FE..Ş'üq˙ăZ{8@ššŒ¸źG Eüěôě221/ěäôÄěÄî0ś`€ ]53#5#"3232654&#"˘¸¸:ą|Ë˙˙Ë|ąýǧ’’¨¨’’§śŞű ¨daDDaţËççËËççş˙ăŁ{ 8@š  šŒ¸źG Füě22ôě1/ěäôÄěĆî0ś`€ ]4&#"326>32#"&'#3姒’¨¨’’§ý:ą|Ë˙˙Ë|ą:¸¸/ËççËËççRdaţźţřţřţźadŞ`ş˙㤠$C@š  šŒ¸!Š—G! F%üě22Ä99ôě1/üěäôÄěĆî0ś`&€& &]4&#"326>32#"&'#46;#"姒’§§’’§ýŽ:ą{Ě˙˙Ě{ą:šłĽţéZ[/ËççËËççRdaţźţřţřţźad¨~ĂӜ}}˙ăő{ 0@ †ˆš¸!†ˆš Œ!"EH!Ü<ôěě1ôěôěôěôě06763 #"'&'5327654'&#"LQQU–—ţÖý]SRMNONPłccccłPNON5#ţîţňţÂ$Ş+qrÍÍrq+q˙sç{'/O@( ,,H"E0üä2ěě991@†ˆš.*šš%¸Œ0äĚôěüÜěőî0@ 11€11 1].#"67632#"'#47&'&!23254#"çNPłĆc'>IjŁJ?_S›PI™ 9/•-U˘ţŠ:M’„e5Ź++ăÍÍrQ,3H=Y}/)9DhQ#3Ą :#ü:9KqţV@$K@$Š˝%"ššŒ¸—%OG E%üěôě22ä1ěäôÄěÄîüě990ś`€ ]#"&=#"323;32654&#"@FľŁ:ą|Ë˙˙Ë|ą:¸Li1ű戮’¨¨’’§ţVŔÖźdaDDad^ůؙa=ËççËËççq˙ăš$=@"šš Œ¸%Š—%  GE%üěôě221üääôÄěÄî0ś`€ ]546;#"#5#"3232654&#"˘ŁľżŞiL¸:ą|Ë˙˙Ë|ąýǧ’’¨¨’’§śČÖŔœa™ű‚¨daDDaţËççËËççq˙ă{"r@ KE#üÄěôě91@†ˆŠš ťš¸ Œ#äôěäěěôě90@)?$p$ $Đ$đ$?????,//,ooooo ]q]47632!"&'532767!7&'&#"qƒ„âü”•œţôkĐcbdcjˇfg ü˛¸]\šˆRS^ú’‘Ą˘ţíţöœœ,*Ž4cdžžWWZZq˙ă{A@$ †ˆŠšťš ¸ŒKEüÄěôě91äôěäîîôî905!.#"5>3 #"73267qN ͡jÇbcĐk 9ţ×üâţů¸ĽˆššZžÇ44Ž*,ţČţöţíţ˝#ė´Žž|˙ă„{ 4w@6.('4 KE5üÄěüěÜ<üÜÄś&  91@/Š.'"š"¸5 šŒ5ôěôěÔÜě´†ˆôě@  &"90@ 4 &'<<ü<<<%6'6'32#"'&'&'&5>3 73;#"'&5Nf ý— Rˆ¨`•”üä‚\ţLŃladbcĐk œ$˸&&i+@ŻWR֊Ď>8ţœE#Z`vţí˘Ą‘gœť'#d4Ž*,œ#)u”™10œ`ZČ˙˙…˙ăČ|I˙˙…˙ăČ|Ë…˙ă*|>i@@603273;#"'&5Â|ŠţţîPUTZGUU]—UTNH‰”›tCDFEwGQPabŞLÄq_ě¸&&i+@ŻWRţŕ@\’l­śŤ%88ZX83˜,-F@.. §NBj†”™10œ`ZČŚFq˙ăĹ|/;@ 1 &,E0üěÔěÄÄÔě1@š¸0Š0š)Œ0ôěÔěôě˛#90"327654'&+5327654'&'2# 76ńű`cchҗUTNH‰”›tCDFEhÄqr<ž˙ŰţV`K@ ‡ ˝Šź  OFü<<ě22ä991äÜ<ä2ôě990@ @P`p]33#+53265#53Á¸ŁŁŁľF1iLľľ`ţ¤ţ(ÖŔœa™ؤqţV¸ 0U@)  †šš&#¸-Š*— š˝*-+& G E1üÄěôě22Ä991/ÄäěôěôÄěţŐî990ś`2€2 2]4&#"326!"&'5326=#"32546;#"˘Ľ•”ĽĽ”•Ľ¸ţţúaŹQQžRľ´9˛|ÎüüÎ|˛9ŁľžŠiL=ČÜÜČÇÜÜëţâţéł,*˝ż[cb::bcČÖŔœa™qţVZ` #C@ †šš#źš˝ GE$üÄěôě21/ÄäěôěţŐî990ś`%€% %]!"326!"&'5326=#"43!˘ţއ–Ľ”•Ľ¸ţţúaŹQQžRľ´9˛|ÎüüÎ=ˆÍťÇÜÜëţâţéł,*˝ż[cb:ů*q˙ăO{8@Šš†ˆš¸Œ4 EüěÜäüÄ1äôěôěţÔî990%#5!#"!2.#"326Š›Ae×{ýţÖ-hĹ]_ŔcłĆĆłO|žŒýđ$$>:77Ş>>ăÍÍă`ţRd`#y@ %  $ÔÔěÔěÔÄľ 91@ š ˝ź$ä222ôěł  990´ěł<´ěľ<<ł<ł< 3#"&54767327654'&'bBŔţ_j&;––––;&jţ_ŔBC(::(čxüÜąS€c‚‚c€Są$úŽ-EIdccdIE-`˙ăd`#y@ %  $ÔÔěÔěÔÄľ 91@ š Œź$ä222ôěł  990´ěł<´ěľ<<ł<ł< 3#"&54767327654'&'b)ŮţrG,E––––E,GţrŮ)C'88'яýębLx>‚‚>xLbü-!@2FF2@!-ŽţVX`9@ ‡Œ ź ˝  NFüěôě21ää2ôÄě90´`Ď]332653##"&ޏ||•­¸¸CąuÁČşŚýaŸŸž¤{ůöVfcđşdC@! ‡¸ Š— N  Füě2Ä99ôě1/<üě99ôÄě90˛`]#4&#"#46;#">32d¸||•ŹšŁľţçiMBłuÁƤý\žŸžž¤ý‡~ÖŔœa™ĚedďşţVd!J@%  ‡¸"Š—‡ NF"üě2Ä99ôěÄ1/Üěüě99ôÄě90˛`#]+53265#"#46;#"632dŁľţéiLř•ŹšŁľţçiMƒçÁƤýHÖŔœa™˛=ž¤ý‡~ÖŔœa™ĚÉď >@ž ą Šź  Fü<<<ě2221/äÜ<ě2üě0@ @P`p]33###533#¸¤¤¸´´¸¸`ţ¤ţ<ĤŹé˙˙Śn`Mt„` '@   Üě2üě21@  Šź Š/ě2üě205!#3!53t¨¨ýđ°ꤤü褤Kß#<@ % V V$ÜüÜ<ü<ÜüÔ1@#!Ă !Ă—/ä/ě2Ô<ě903327673#"'#&'&#"#67632=¸ &}33[¸ &}33[üí %$R‡IJý… %$R‡IJLT5@  ÜÜÔ<2ü<ÜÄ1@š Š—/ä9/<ě2ÔěÄ033##4'# 7632&#"3˘¸úú¸=ţčő5*7M\üţ ýŽT˝öú„K9ÁţV_ (@  F üüÔÄ1@  — ‡˝ ôěä990;#"&5y=x1Fż™ůÎ|tœĚĘ(ÁţL6$˛@#&#" F%üü<ÔÄÔÄě̲#91@BŠ"Š"† “š ˝"ź —/ääüěôěě9/ěěł 990@$#ěě@  **8;ILT[q ]@$$%$$5$7E$FT$\ ]@    ]2!"'&'5327654'&+5!#3!CicUQţĐţč^cdjTČmžcd\[§ŽŽýj¸¸eÜ8+lhŠÝň%Ă12KK„KJŚóü3ţL¨ş˙ćb&^@PP F'üěüüüü<91@  ‡#Œ'ź'ô<<ô<Äě290@0(P(p(( ( (ż(ß(˙( ]%#"&5332765332653#5#"'&ŽCb`‚ŻžšruSSšrwŚšš=ZXyzVUŘy=<öâ¤ýb˘œ`^¤zýb˘œŔ˘zűž°e32>>şţVb&a@PP F'üěüüüü<91@  ‡#Œ'ź˝'ěô<<ô<Äě290@0(P(p(( ( (ż(ß(˙( ]%#"&5332765332653##"'&ŽCb`‚ŻžšruSSšrwŚšš=ZXyzVUŘy=<öâ¤ýb˘œ`^¤zýb˘œŔ˘zůôZe32>>şţV{0c@PP)%'F1üě2üüüě9Ě1@‡ %*!‡*-¸(ź&/<äô<Äě29Ôě0@02P2p22 2 2ż2ß2˙2 ]>32+5327654&#"#4'&#"#3>32)EŔ‚Ż__RQľţéi&&ruŚš99wSSšš?°yzUV‰|v{zâýHÖ``œ01™˛Ąœž¤ý‡ž˘NM_`Łý‡`Žgb>>˙ŰţVk{Q@N O Füě2ä99ôě1@ ‡¸ź/äôÄě9@  ‡ ˝ôě990´`Ď]#4&#"+532653>32k¸||•­ŁľF1iLšBłuÁƤý\žŸžž¤ýsÖŔœa™tŽedďşţVJ{;@ N  Füě2ôěÜÄ1@ ‡¸ ź Š˝ /üěäôÄěľ  90&54&#"#3>32;#"ţR||•ŹššBłuÁĆ&&i1Fľţś`Ö˛Ÿžž¤ý‡`ŽedďčýH™10œłd` y@BźNF üěüě991/<ě2990KSXííY"˛ ]@068HGif€ FIWXeiy…Š•šŸ ]]!3!#łÝÄţđţ#Ä`üy‡ű lü”q˙ău{ ,@Š šš¸Œ Q Eüě2ôě21äôěîÜě0"!.265!2#"q“•t•’•¨ý†¨–đţîđńţďßÁÁü č””čüţČţěţíţÇ98q$`I@  EüěÔě2ÔÄÄÄł 991@ Šź Š /ü<ôü<@Š 9Đ/ě0!!!!! '&76!#";ýÔýë:üáţť§¨¨§E*%đxxxxđ%`šţݛţ”œŽŽ‚lkŘŮlm”˙Ü>|$2@ &E E%üěÔüÔěě1@ ‡‡#Œ¸%äô<ě2ěÄ02765 26= "&'"&H`k&IĐţnĘI&k`ţB"F:.aע Öהģľ0[1ţĐţđ[0ľŁÄČT\ţ¤ţ€l˛6pŁuyŸí˙˙pţVŃi˙ĺ`/@   /Üě2991@ ‡Œ ź /ěôěÄÔĚ90%!"/32653#×rţů%832JI,œ§šš:ş….´Ëžü ŽfcşţVJ{:@ ‡ ˝‡¸ź FüÄě2Ä1äôěÄÔĚôě90´PŸ].#";#"&53>32JI,§LiéţľŁš:ş….´Ëžýž™aœŔÖtŽfc„~{%@ ÜĚě2Ě1@  ‡ ź‡/ě2üě9903!5346;#"ŕ¤ţ¤ŁľţéiLĺýż¤¤AÖŔœat~{%@ ÜĚĚüĚ1@  ‡ ź‡/ě2üě9903!534&+532Ę´ýđ¤LiéţľŁĺýż¤¤A™aœŔş—`°@4  BŠ Š ź     Füě2ÜÄě99991/<ôěÔě9990KSXíí9Y"˛@]@Bz%%%&'&&& 66FFhuuwˆˆ˜˜]]#.+#!232654&#0s2ŽĂ˘J{QŠš„ÚÖpýőĆwu t]ţ΀:ţ'`žĽiŒţŻVNM`ş—`E@  Füě2ÜÄě99991@  ŠŠź/ä2ěÔě9990332673#!32654&#şšŠQ{J˘ĂŽ2s0jpÖÚţ|šĆuw`ţ':€ţÎ]t ŒiĽžěţŻ`MNVoţVÇ{0€@C  S('  S'('BŠ˝1 '(†‰‰!šš.¸Œ1' ($R$+E1üÄěÔěä9999ěĚ1äôěţőőî9üě0KSXí9í9Y"˛0].#"#"/;#"&=32654&/.54632‹N¨Z‰‰b”?ÄĽ÷ŘdXLiéţľŁĚÁ‚ŒeŤ@Ť˜ŕÎf´?Ž((TT@I!*™‰œś ™aœŔÖűjYQKP%$•‚žŹ˙ŮţV×4@ O Fü<ě22ä991@ ‡˝ ‡—üě99ôě046;#"+5326žŽ˝Ž°cMŁľF1iKÂťŤ™Phű)ÖŔœa˙ŮţV× O@ !O F!ü<<ě22ä99Ě2Ä1@Šź! Ї˝! ‡—!üě99ôěÔ<ě2ôě0546;#"3#+53265#53#5žŽ˝Ž°cM˘ŁŁľF1iK´´Ż`NťŤ™Phý¨¤ţ(ÖŔœa™ؤi7ţV5e"śO ÔÜüě1@ ‡˝‡źôěôě04&+532;#"&—Mc°Ž˝ŽKi1FľŁ(hP™Ťťüí™aœŔţňţV×2@   O ü2ü2ĚĚÔĚ1@ ‡‡— /<ôěě2ÔĚ0!3## 54!346;#"#"3276wˇż5RľţŃžŽ˝Ž°cMĂłw|n!›o@`ŘŇŽťŤ™PhúŁ3A07ţŔň^3@   /<Ô<ě2991@ Š źŠ/<ě2ôěÄ990˛Ż]!5!4&+5323#˛ţ…{Ks˝˝Ő˘‡‡ţŔ>`‰NšŸŇý ţÂ7ţVöž=@Šź‡ ˝  Fü<Äü<Ä2991üěô<Äě2990˛Ż]!!;#"&5#53w{ţ…LiĘྣ‡‡žţü™aœŔÖĺ>˙ă`C@ ‡Š  Œź  NFüě2ôě221/ä2ôÄÜ22ě22ü0´` Ď ]3!33##5#"&=#5!326ޏ:¸şş¸CąuÁČŽŸýÇ||˛hřţřţ¤ţ<Źfcđç ¤ĽŸŸşq˙â„`S@ !  üÄüÄÔÄĚüÄ1@ Šź šŒ ôěü<ě2220@ŕŕďďĐĐßß@@OO ]##"5467#5!32654&'7!„ěaţäááţäaíşfˆ°°ˆf´źHë˜ëţÜ$ë˜ëH¤ÜB׋ŸÂŸ‹×BÜÁ\b,@   FüüÄÄÄÔě91@ šš¸ ź/ěôěě0+"'&53732654'&'5\Ž‘ŢFľRQ¸&(g3°JInhX§3"``ÖĘý6™12Ğčec–0[Ťs=`h@'BżÔK° TXš@8YK°TK°T[Xš˙Ŕ8YÄ91/ě290KSXííííY"33# =¤ú¤Ăţ˘ţ˘`ű ŹüTV5` ď@   ÔK° TK°T[K°T[K°T[K° T[Xš@8YK° TK° T[K°T[Xš˙Ŕ8YĚ91@  ż/<<ě290@0U U U U   BKSXííííííííY"@˙ - : FFI O TTZ _ aai vpvpˆ–—› łłÁČŔ       %%#'!%""% ' $ ! #966 90FHF@B@@@ D D D @@VVVPQRRP S T U cdejejjjn a gouuy}x}zzx y  { v }‡ˆ——”“œ›˜˜™ @/–ŸŚŚ¤¤ŤŤŠŠŤ ¤Żľą˝ť¸ żÄĂĚĘy]]!# # #335¸ćĺŮćĺ¸%ŮńňŮjü–jü–`üj–=F´ÔÔÄÄ1ľŠ—/<ôě0ˇ ü<<<ś  9@   ěě3676;#"# =ěPHJ|“lL*./!ĹĂţĄţŁŇÇ>=š$#‡^ű˛lü”fk`8@   ÔÜüÔÄ91łź/ä20@ ěěě3 3#fŮ%.Ůţ]Ë`ţ8ČýţđXţVż`Ş@"B Š ˝ŠźŠ OÜK° TK° T[Xš˙Ŕ8YK°TXš@8YÄ2Ä99ě1/ěôěüě0KSXííY"@B&GI + 690@@E@@CWY_``f``b€Ż]]!!;#"&=!5!qjýL´Li/FľŁý7´ýe`¨üۧ™aœŔÖ¨%X˙‘Ű`!ą@  "ÜKTK° T[Xš˙Ŕ8YK°TXš@8YÄ2Ä99ěÜ<ě21@ Šźš Š/ü<ÜěĚôě0@ BKSXííY"@:&GI #+ #690#@@ECWY_#``fb#€#Ż#]]!367632+#47!5!3254qjýLŻ"TA`„:&>R~i™ţ–´ýe˙8ŠFX`¨üۢG7W9W`/=3<;4¨%üĆ6]XţL/` Š@ "!ÜÔÄÔÄě̲91@BŠ!І “š ˝ź!äüěôěě9/ěěł 990@ ěě@  **8;ILT[q ]@  %$ 5 7E FT \ ]@    ]2!"'&'5327654'&+5!5!`Ćq˙ăĹ|/=@1 %,%E0üěÔěÄÔěÄ1@š¸0 Š 0š"Œ0ôěÔěôě˛( 90";#"327654'&% !"$5467&'&5476EwEFDCt›”‰HNTU—Ňhcc`ţöa——ţÖţĆîţţŠ|p<:!ÖŔœa™ţĺ>>ăÍÍă˙˙ş`ŃţňţV.9@ Fü<ü<ÜÄÜě991@  ˝źą /<Ě2ääüÄ03#33## 54!3#"3276Á¸¸¸ľ˝7KźţŃÁ¸u_+éËű ‹xG`Ý͋BA0 şţLœ` ## 33œšýŰëRý•đ9šţL—ţ TýÝ#şń`@ żŠFüüĚÄ1/ěě03!!ş¸üÉ`ü3“qţVř $C@š  š¸Œ#˝%‡—% "GE%üěôě221üěääôÄěĆî0@ `&€& &ŕ&]32654&#"#"32546;#"#/§’’¨¨’’§s:ą|Ë˙˙Ë|ą:ŁľţçiMš/ËççËËççýŽdaDDadĆÖŔœa™ůÚXĽ$L@ & %ÜÜ<ü<ÜěÄł#ĚĚ1@ † $Š! š—Š/ÔäôěÜ<ě2KPXÜÔYě032765&'&#"56763 3###53T?ŔV:9cłPONNLQQUŠmlpŞççĘĺärLb…Ar+Ź#}şŞswÔ¤ţě¤XĽ$M@ &"#E%üěÜ<ü<ÜÄł "#ĚĚ1@† Š$!#š —#Š#/ÔäôěÜ<ě2KPXÜÔYě0535&'&5476!2&'&#";3##÷çŞpln‰UQQLNONPłc9:VŔ>ĺĺʤÔwsŞş}#Ź+rA…bLrţš¤ţěq˙ăĂ &) 76'& %3!!!+5#"'&7632/ST$TTTTţÜT ¸iýL´ü—ž:XY|ˀ€Ë|YXňšúţjtsst–tssH^ţL¨üۓ¨d01˘˘˘˘10MüůqţL4@#5#"'&76323!2!"'&'5327654'&+5 76'& Z¸:XY|ˀ€Ë|YX:¸jţej€bVQţĐţč^cdjTČmžcd\]ĽŽŽú:ST$TTTTţÜTÍü3¨d01˘˘˘˘10d^ţL¨ţ$8*mhŠÝň%Ă12KK„KJŚóÓţjtsst–tssq˙‘ 3: 76'& %%!332!##47!#5#"'&763233254#/ST$TTTTţÜTŘ™ýghýLŻ<Űăţ˛)™ţ–:XY|ˀ€Ë|YX:¸ýŽFXúţjtsst–tss_üú“¨üŰ ö˝3<;4¨d01˘˘˘˘10d^ú6[7˙ă@žF.#"#"'&'#"'&5#533!!;5327654'&/&'&54632N¨Z‰ED11”?ĆQR|{ŘZa]g˝ŐQQ‡‡š{ţ…%&słfcca‚FF3,ą@ŤLLŕÎf´?Ž((**T@%$!,KL‰œ[[!&POŇ`>ţý ‰''M5-,QK($)$JK‚žŹ7ţV&/!05476;#"+53276=#"'&5#53!3wxWQĂŽ°c&'QRľF1i&&˝ŐQQ‡‡3ţˆ%&sžţÂNľ[V™((hű)Ö``œ01™POŇ`>úü˘•ý ‰''7˙pÉž-9D!6!2&'&#"63 #"'47!"'&5#533276'&#"&57!3w{•˙UQQLNONPłcccOÎ+eKTI™ţëŐQQ‡‡;BS_ƒr(ţր‹ţ™%&sžţÂz•#Ź+qrţfr Ťöv)2LOAPOŇ`>úů 'KV ř›ý ‰''/ţVo5+5327654&#"#!##535476;#"!;67632oRQľţéi&&||•ŹšţÓš°°WW˝Ž°c'&-ˇBYZuÁcc¤ýHÖ``œ01™˛Ÿžž¤ý‡Ńü/яNťUV™((hcŽe22wxÁ˙ăÉ#5.#"#"'&'#34632327654'&/&'&N¨Z‰DE11”?ĆPS{|ŘZb]h¸¸ŕÎf´ý8b_ca‚FF2-ą@ŤLL?Ž((**T@%$!,KL‰œ[[!&ýŹţÔý˛2-,QK($)$JKÁâ Ž@   Füü<ÔÄ2991@ B ŠźŠ—/ěěôě0KSX@  ííY@B &GI   + 09 @@@@@C EWY `````b fŻżß]]3!!!+Á¸iýL´ü—ž¸šţL¨üۓÍüů6˙âé 333# #333# #6t‘‰‘tšˆ˜™ˆšt‘‰‘tšˆ˜™ˆUţéţéýýţ=ţéţéýýţ6­é3@    Ü<ě2Ô<ě2Ä1@  ŠŠÔüĚ2ÔüĚ20!#!#!#!#6łýkłýkUţXţűrţXţűţJ3@ NF Ôüěôě2Ě1@‡Œ ‡ —ź˝ěěôěôĚě0%#"&54&+53232653#׃çÁĆLi1FľŁř•ŹššŹÉďčęaœŔÖýBţĂž¤yůěţVv!:@ #NF "Ôüěôě2ĚĚ1@‡Œ" ‡ —"‡˝ź"ěüěôěôĚě0%#"&54&+53232653;#"&'׃çÁĆLi1FľŁř•ŹšPh2FśžŹÉďčęaœŔÖýBţĂž¤yűŽ”fœšÝuœÄ0@ ÔÜ32ÄtNN^luu)qJy}ţ…wYYk\ţžgţŤ88†uœÄ:K°SX@ ÔÜ<Ě/ĚĚK° QXą@8Y1˛]@ Ô<ÔĚÔĚ0Y#4&#"#46;#">32ÄtNN^lugr ’B0)qJy}ţ…wYYk\ţž„xkW6Vr88†˙é­î #@Ü<ĚÜ<Ě1@ÔÔĚÜĚ03+5327653#zt43r,Bttý‚x66XVr‚uœ@ ÜĚĚ1@ /ÄÔĚÔĚ0.#"#3>32.biuu$uT Ż qkţśsa97Hä´ ÜÜ<Ě1ľ /ĚÔĚÔĚ032653#5#"&'H.bitt$uT ü qkJýa97H­u'ś ÜÜ<ÜÜ1@  /<ĚÔĚÔĚÜĚ032653;#"&=#"&'H.bit0B,rg$uT ü qkJý V6Xlx a97 œ!+33276?3327654'&+›CFCD‰ôtk=%%(f{n!!"ţ×}K'))'K}éN;[--sţ÷?ĄŤ5˙/.6œé 333# #6t‘‰‘tšˆ˜™ˆţéţéýýţ&­Ő+53276?33Ÿ1/.N]D0 ţâ{ÝÜ{bp"#WK/iţę˙˙ tŸf˙˙ tf&t˙˙ŽéÓŐ Á˙˙˛ţ×Ő ÂÄîéÚ@ žÜüÔĚ1Ôě0#5—R¤ÚŹţŔ@Źuď‡1´ Ü´? O ]ĚÜś ]<1ś—ôĚܲ]9Ě0526544u@XX@sPOOPď{X@?X{POćPPuď‡1´ ÔĚÜ@    ]<1ś —ôĚÔ˛]9Ě0"'&4763"3‡sPOOPs@XX@ďPPćOP{X?@Xuœ‰+@ ÔÄÜÜĚ91@   ÔÔĚÔĚÜĚ032765&'&#"567632#'y7$#?q22110335ŽWDDFk€[@*7K$@ ` XFh_@Cţ“uœ‰-@ ÜĚÜĚÄ91@   ÔÔĚÔĚÜĚ0#&'&547632&'&#"3ękGDEW­53301212q>$%6y[ţAmC@_hFX ` @$K7*@ 2ő°% % ęţ™gţťő‹´´‹ő 2ő°5-5őţgţ™ę'ő‹´´‹őÁ|?f=´uÜě91ľłôĚ2´]90K° TK°T[X˝˙Ŕ@878Y3# #ś”ő‹´´‹fţgţ™Á|?fL´uÜě91ľłô<Ô˛]90K° TK°T[X˝˙Ŕ@878Y@ 5:5:3]]33śő‹´´‹ő|ęţ™gţÁî?f7@ ´łuÜě91ôě290K° TK°T[X˝˙Ŕ@878Y3#'#ś”ő‹´´‹fţˆőőÁî?f7@ ´łuÜě91ô<ě90K° TK°T[X˝˙Ŕ@878Y373śő‹´´‹őîxőőţˆÖç^@ÜÜĚ1@/Ä0#^ˆýŐ+˙˙Őb+öqsîRf3#‹Çţş™fţˆŞđ‰f #o™ţşfţŠvÖţŃ^ü@ÜÜĚ1@/Ä0%#^ˆüýŐ+˙˙ŐţŔ+˙Tqů^Şţ‰˙’#o™ţşnţŠvsţR˙”3#‹Çţş™lţˆoÔ#E@ Ô<ÄK°PXł@@88Y2991/ÄÔÄ0@ `o]@ P```dd]!!!˛ełłţ›ŮJý'ţśoŮÔ#4śÔÄK°PXł@@88Y91ÔÄ0@`]@ P``d]!!˛eŮJ˙˙uţ‡#€ţ˙˙uţ‡#ţÔá–!533áţ>––j––,ţÔÔá–5!##––––ţÔ,d˙şU 533##5#5D–ŕŕ–ŕuŕŕ–ŕŕ–dß&u!5!&ţ>ÂߖÇ)9H W@ đłVVÜěÔě1ô<Ôě0K° TX˝˙Ŕ@878YK°TK°T[K°T[X˝@˙Ŕ878Y332673#"&Çv aWV` v ž‘‘žHKKJLšDfN@ ÎÍdÔě1üě0K° TK° T[X˝@˙Ŕ878Y° KT°KT[X˝@˙Ŕ878Y3#šĚĚĚîá  @Áň ÁńV xVÔěôě1ôěôě04&#"3267#"&54632˜X@AWWA@XzŸssŸŸssŸô?XW@AWX@s  ssŸŸLţuÁ @  óô 'ÔěÄÔĚ1/üüÄ90!33267#"&546¸w-+76 >&Dzs5=X..… W]0iśJ7c@$  ĂĂ íVwVvôěüě99991ü<üÔ<ě99990K° TK° T[X˝˙Ŕ@878Y'.#"#>3232673#"&ü9! &$}f[&@%9! &$}f[&@Z7IR‡“!7IR‡“đîŽfB@´łÔÜÔĚ991ô<ě20K° TK°T[X˝˙Ŕ@878Y3#3#ü˛ř‡Şß‰fţˆxţˆ˙˙Ţ­%3;#"'&5¸&&i+@ŻWRţëd¤”™10œ`ZȢďîf '#7'373\\]´ľľ´]\´śśîaať˝``˝ťuŤý # 5473733254˛ňţőľú‰żˇ‰ţź‰ˆÜů´„„żň/ŕŕţŠŽ˜MM‰zœî ą/Ě1ą/Ä03#zttü™uœ/2&'&#"#"'&'532654'&/&'&547632j1549W++](}24NMˆ9>=D@?>=RX o(l00GF‚@99 a /$*+MW33 k2-*)*IX01 uœ! #'#37˙ ‰Í͉ű‰ťťţĎţžööH+ßß˙˙uœ‰ƒÖX@ ŠÄÔě1/Ôě0!!5!•ţAGЈú¨ÖX'@??//ŠÄÔě21/ÔÜě]0!!5!3•ţAżˆœˆ4ú¨ÖX@ ŠÄÔě21/ÔÜě0!!5!3•ţAżˆhˆhú¨ÖX'@pp00ŠÄÔě21/ÔÜě]0!!5!3•ţAżˆ4ˆœú¨ÖX@ ŠÄÔě1/ěÄ0%3!5•ˆýšˆĐú¨ˆ˙˙Áýě?˙Ö‡ůp˙˙Őâ+v'q€q€˙˙ŽémŐ Ć˙˙îţ9œů3śţvJ˙!_@ Vw V v"ôěüě99991@  Ă Ă"Ô<üÔ<ě99990K° TX˝˙Ŕ@878Y'&'&#"#67632327673#"&ü9 &}33[&@%9 &}33[&@ţł7 %$R‡IJ!7 %$R‡IJü¨đţ‡f6@ ´ł¸DÜě91äôě0K° TK°T[X˝˙Ŕ@878Y # ým™ţşXfţŠvţýqî˙Pf6@ ´ł¸DÔě91äôě0K° TK°T[X˝˙Ŕ@878Y3#ţ‰Çţş™fţˆsüÁî˙?f<@´ł¸uÜě991äôě290K° TK°T[X˝˙Ŕ@878Y3#'#ýś”ő‹´´‹?fţˆőős˙˙ü´˙H7žűţ˙˙üŮb˙/öqü˙˙űě|  ĺü˙˙üż)˙1Hšűřý˜+ţd%@ žą¸Ôě91äüě0@4D]3#ý˜ĚĚhĺ°ü×F˙)I@Î͸ dd ÜüÔ9ě1äü<ě20@#4D`````````ppppp]3#%3#ţ^ËËţyËË)ĘĘĘËý7ňţ÷{"@ V@€ V /ĚěÜě1@Á@Ŕ /Üě0632#546?654&#"ý7pihX,#w3-.>GZdH3UC=A   (6%""($4˙˙üěá˙œűţ˙˙üôî˙˛fŸüüĹî˙Cf<@´ł¸uÜě991äô<ě90K° TK°T[X˝˙Ŕ@878Y373ýşő‹´´‹őNîxőőţˆsýźěţD¨˛/ě1ą/Ě0#ţDˆ¨ţDź˙˙üđě˙¨'ž˙4žĚü]î˙fB@´łÔÜÔĚ991ô<ě20K° TK°T[X˝˙Ŕ@878Y#!#ý͇řž‰ßfţˆxţˆx˙˙üż)˙1Ö'›üĆšűřüż)˙1H ľVV/ěÔě1´ đ/<Üě0#.#"#> Ďv aWV` v ž"ž)KKJLţé˙D( @ÔĚ0#3ţňÓ¤é?ýÂţ‚Á#55#53ţ‚ňppňĂţ˙{‰ţýÂţ‚Á53#7"ýńopňĂţţ‰{˙yš‡3#@Çu™ţˆ˙˙ü¨ýßţ‡˙UCűţřď˙˙ýqýÝ˙P˙Uvűţřďý$ţţ<˙Î#5353#ýÄ  xxţľxĄţFýÄţţÜ˙Î33##ýÄx  x2ĄxĄţU†?p!5!#Iţžęˆčˆţţđk{ŕ1@V/K° TK° T[K°T[Xš@8YÜ2Üě1@ Á/ÄüĚ0532654&'3#"&ţđ=X..… W]0i×w-+76 >&Dzs5ý€ţţV˙ž @  VÔüĚ21@Á Á/üÜě0"&5463"3ţVZ||Z(55(ţ}ZY|x5'(5ý ţţő˙M3!5353ţDąţąˆţœˆˆąý ţţő˙M#5!##ýźą깈ţňˆąý$ţţÜ˙Î #53533##ýÄ  x  xţľxĄĄxĄý ţˆţő˙5!ý ęţˆˆˆýzţV˙Ѐ '+53276=0RQľţéi&&€”Ö``œ01™”ýwţV˙̀ %3;#"'&5ýw¸&&iéţľQR€”™10œ``Ö˙˙ýšţ‡ţf˙S›üůC˙˙üŐţ‰˙'˙SjűţůCý(ţţÔ˙ž @V xVÔěôě1@Á Á/üÜě04&#"3267#"&54632ţ[6'(55('6y|ZZ||ZZ|ţę&65'(56&Z}}ZY||ýjţţ˙T @ÔĚ03#ýźÓ¤ŹţŔ˙˙ý#ţuţÁzü˙˙ýLţuţÁüýźţţD˙ ˛/ě1ą/Ě0#ţDˆ`ţtŒüđţP˙˙š#5!#é‰ţë‰fţśÂÂJücţ9˙˜˙X#"4533273273"ýţ Ďv aWV` v ž"žţ6KKJL˙˙ü´ţ9˙H˙Sžűţů˙˙üŮţŔ˙/˙Tü˙˙űěţţŹBü˙˙űěţ˙î ŔüűŒě˙­ #"'&'.#"5>32326SKOZq Mg3OIN’S5dJ t]F‰ Ž;73 !;?Ž<6 7=ýxÄ˙ˆh!5xýđh¤¤úíÄ˙˙h5!úíĤ¤űh˙˘˙źź'űČ`ő_^NĚOú˙ş˙‘'úygfFXYýŹţţ‚˙ž @  VÔüĚ21@Á Á/üÜě02#52654&#ýŹZ||Z(55(B}ZY|x5'(5üńţ[˙˙Ľ3!53üń‰‰ţ[JÂÂţśý!ţţă˙Ö!5#ţăţ>JŇ*ţ>ÂţśŇŇücţ9˙˜˙X632#&#"#&'"#72ýţ;tÚv gfv ifvÜtúRţć––•–ý+óţĺ­ '7'77ţ}`}}`}}`}}`p}`}}`}}`}}`ţÂ˙ Ň.54675>54'&'ţC!“‡RI 7!“‡RI Ç0PQn +0PQn ˙˙űě: ' ĺü ĺüţž˙˙ü¨đţ‡fCűţ˙˙ýqî˙Pfvűţ˙˙ü´˙H7žűţ˙˙ýÂţ‚ÁÄ˙˙üçF˙bŇü˙˙ýĆţVţ˘˙¤üüŐ˙+I#5!#!Ֆţ֖V––,ýţ2ţá˙¸!5!5!5!ţáţ>Âţ>Âţ2x–xýţţë˙ 3#3#ý––@––`ţtŒţtýţţá˙Ö!#!ý–ţÔ*ţ>,üśî˙Jf'73327673#"'&'#7&'&#"#67632ý˙Bmk  &}33[& !Bnk  &}33[& ˙gŠ  $%R‡JI g¨ $%R‡JI üś‰˙JĚ!%'.#"#4632326=3#"&3#3#ýü9 $(}gV$=09" (}gT";薖Җ–h! 2-ev 3)dw.–C–˙˙üśĹ˙J"tˇt§ücţ(˙˙ 7!#'73!'3ţp„ţ„ŻŻ„ç„~ŻŻţ(››Í͛›ÍÍý3ţţÍ˙¤#557'ţ2d›Í͛ţç„~ŻŻ~„ýxáţˆ&'&4767ţˆ@*,,*@rNPPNr‹*,@A++{OPćPN˙˙üż˙1Ř'¸ĺ˙˙ý+ţţĺ˙Îîů!ýxáţˆ050567654'&ýxrNPPNr@*,,*‹{NPćPO{++A@,*˙˙˙.D˙ú›ý”üţ˙o˙ż2>&"762"'"&46264&"ý 5O57O5÷>ľ||ś=>ś||śţ66O55ţĂ55M75m?|ł}A@}ł|ţÎ6M65O5˙˙üpţ˙… ćüÉ˙˙üpkŐ ćüÉPüpאk!!üp řŕk”üpţŔ˙T!!üp řଔý* Ö'#'&'&#"#67632327673#"'&O,$e5F˘qpČ[?9ZO,$a9G˘qpČ[?9J7  $0G‡JI "7  $,K‡JI ˙˙üpn çüÉüwţ(“˙Â5!'3#7üws„~ŻŻ~„ţĂd›Í͛˙˙ÉqŐ™˙˙ÁĐ`šÉŐ !#!#!#ÉSĘţ†Ëţ†ĘŐüôbúŐ+ýžÉeŐ !#####Éœ¸ššššŐüôbúŐ+ýž tŸf@ÔĚ1ÔĚ03 Ažntňţ ţVŸH@ÔĚ1ÔĚ0%#ŸAžnHţň˙˙É3ŐŹ˙˙şy`ĚśţV’˙¤ #"'&=3;’”• #ţV!.ĺĺ ˙˙˙ăő{˙˙q˙ăç{'yO˙„F˙˙˙ăő{'yŽ˙„˙˙ž˙Ă#sîRf1@ ´łDÔě1ôě0K° TK°T[X˝˙Ŕ@878Y3#‹Çţş™fţˆ˙˙×FRŇ&jl@ŻŸ_]@_q0˙˙hf'ţÚ&˙˙ŰHŽFy˙˙˙çuf'ţt*ę˙˙˙óf'ţ€,ä˙˙˙í}f'ţz.ę˙˙˙ň˙ăf'ţ4(˙˙˙á‘f'ţn9Ş˙˙˙Űf'ţh=6˙˙€Ň'˙.M˙˙hŐ$˙˙ÉěŐ%ÉjŐ@ •üüĚÄ1/ôě03!!ÉĄý)ŐŞúŐhŐ=@ B••ÔÄÄ1/ěôě0KSX@ěěěěY !3źţf5űš:ĺ9űš¨Őú+˙˙É‹Ő(˙˙\Ő=˙˙É;Ő+s˙ăŮđ!2@•‘"•­" •Œ"#3"üěÄôěÄě1ôěôěôě0!!"3276'&' ! '&76ĹÂý>b܁‚Ü܁€€Ü:xźźţĆţĹź˝˝źpކ¤¤ţĺţćţ¸¤¤¤¤¤ţ[ţžţŸŇÓŇŇbbÓŇ˙˙É“Ő,˙˙ÉjŐ.hŐ<@ B•ÔÄÄ1/<ôě0KSX@ěěěěY3#3#ĺŐ:ĺ9Ňţ&Őú+˙˙ÉŐ0˙˙É3Ő1ÉbŐ *@• •­•   ü<ÄÔ<Äě1/ěôěôě0!!!!!!2Çý9i™üg™ügqŞŞűŞ˙˙s˙ăŮđ2˙˙É;Őł˙˙ɍŐ3É‹Ő F@B ••  ü<Ô<Ě1/ě2ôě20KSX@   ěěěěY%!!5 5!!ąÚü>ßţ!°ý8ßŞŞŞpŞŞýó˙˙˙úéŐ7˙˙˙üçŐ<sŮŐ'<@) !%(üěÔ<<ü<<ÔěÄ1@•' •%'/Ô<ü<ôÔ<ü<0367654'&'&'&76753#–b‚‚b–Ę–b€€b–Ęôž˝˝őĘôźźôĘŽWsĆĹsWWsĹĆsWü† Ą‡ŸŸ†ĄţńţňĄ†˙˙=;Ő;sŰŐ.@ •ÜěÔ<ü<ÔěĚ1/ä22Ü<ě20!6'"'&336763#ÂÖź¸ՂnŠĘŠn‚Ő¸źÖ†°ŇĚh™ţgţ㤌ńüŒ¤™ţgţ˜ĚŇHîNĎç&3@ •‘&•("3'üÄüÄôÄěüÄ1/<ě222ôě0%!567654'&#"!5!&'&576! Ďý¨ącc„„ŘŘţ÷cd˛ý¨?žIHŔż1/ÁŔGGĄ˛˛˛aŚŚĘđ‘‘ţÝďĘŚŚa˛˛‹••¸>ĹĹĹÄţË””˙˙XN'r/u.´ +1˙˙˙üçN'rqu9´ +1˙˙q˙çäf&En˙˙…˙ăČf&PI˙˙şţVdf'ĆK˙˙Ś˜f&M˙F˙˙•˙â*Ň&Yq˙çäy *Č@ ,%E+üěÔÄÄ99@ ?/]q@ š)¸ š!Œź‡/ěäôěôě99@<ěěě<ěě10@ „†ˆ‰ €]@IIIJN LNIK ]@:9:88? <>]@ + +*))]@  ]@++]'&#"3273;#"'&'#"'&763 N,-˛†=MKLy†H¤c¤Í( #) Xn^T).^,ëruĆ7 çínŠśÜikŐç%ýĄŰ1)0œT*XoW)˜&ŠšŔţVˆ!7@E Füě2ÄÔěäÔě1@š šš Œ˝ěôěÔü9Ôě0%#! !"3 5 4# yšŞ˛ŹţÔYoĹ ţ0kęţűEţČţţîdZţőţ&J­:Ş@ŰţČ ţV`@@ ÔÔüÔÄ1@ ż˝/<ěä20@ ěě99ěě3#&+532iő^Ăţ;¸ţÚ,_1FŰýLdű ţVŞD~žq˙ăuđ-T@(/E( Q!E.üěÔěô˛ ]ěÄě99@%š%šŒ.ôěÔüÔĚ99@Sě910&#"#"'&4767&5!232654'&'&ěfďýĐuމ‰đ‰5KœšÝxţD7VUV•“Ź[a~@Fu\0%p‡ţëţ÷œœĚĽ@$OFţ(IqĚËrsčžÇ`g …˙ăČ|2=@" † ˆš¸3Š3'†(ˆ#š,Œ34 '0E3üěÔěÔÄÄÄ1ôěôěÔěôěôě0&'&547632&'&#";#"32767#"'&546‹p<@ ÔěÔÔÔÄüĚK°QXš@8Y1@š šŒ‡—ôě2ôěÜě0%#457654'&# !5!ʄOTJPŁE* :ý˘;ýěfý,KOxsPWKL,#%5,*3ěYššţ”ţ'ţişţVd{1@‡¸ ź˝ FN  Füě2ôěě1/ěäôÄě0@ €]#4&#"#367632d¸||•ŹššBYZuÁcc¤ű˛HŸžž¤ý‡`Že22wxq˙éu$!O@ š—"•"šŒ"#E QE"üě2ô˛]ě2ě1ôěÔ@?]ěôě0@ w #€#]!3276'&#"2#"'&76ąýƒEV•–SI 6V“™Q@=đ‰‰‰‰đńˆ‰‰ˆĆţŐœŠÉdžœ~ţü´ÔÓţŠţ‹ÔŐŐÔuvÓÔŚn` @ FüüÔÄ1@ ź‡/ěä0;#"'&5c"$lYo´RR`ý+‘.0œ`bÔĘż…` I@   F üě2ÄÔÄ1@ź /<ä20@   ěě <<ěě33 ##żžăŕţGţáţb‰ž`ţ/ŃţZýFBţ?= F@ ÔÄÔÄ1@ ‡ —/<ôě0@ě ěěěěě # #'&+5zĂţĆţ~ĂëJ/k`uâeú›<üÄ2Ć~ž˙˙ŽţVĺ`wJ`B@ÔÄÔěÄ1@ ź/ä20@ě ě9ě9!367676'&'31 ţŞĆ!xdLjşE.*ˆą{`üT|ʁp5dwƒY|rNÄŻätkţR&@@ (" %'ÔěÔěÔÔÄÔÄüĚ1@š šŒ'#‡"‡—'ôü<Ôě9ôěÜě0%#457654'&# %$47#5! $ڄOTJPŁE* :ý‘MţčÜĐý‹ýĆKOxsPWKL,#%5,*ľ,X$ĹRššţÝż Şţźţń˙˙q˙ău{RJ˙Ů˜`/@  ÜÄěÔěÄÄĚ1@ ‡Œ‡ź/ôě22ôě0!#3267#"&5!##J117,#J%x\ţcź`¸ýPH?… ƒ°œüX¨şţV¤{1@š¸š Œ˝EQ Füěěô˛]ěě1ěôěôě067632#"&'#44&#"326=—;śĚ˙˙Ě{ą:š+§’’§§’’§˜fZ#ţźţřţřţźadýŽĎçÝËççËËççqţRç{$6@ !& HE%üěôĚÔüÄ1@ššŒ% † ˆ š¸%ôüôěôěÜě0 !2.#"32#457654'&¨ţóţÖ-U˘LNPłĆĆŻƒPTJPŁE* >:##Ź++ăÍÍăLOxsPWKL,#%5,*q˙ăÖ` 1@  QEüěô˛]ěÔÄ1@ šŒ‡šźôěěôě0"32654'&'!##"'&76s˜RVŤ•“ŹVOšcÎm‰‰đńˆ‰‰qÎnsžÉçčȡzn’¸œÝţ휝œ›dm`#@  ÔÄüÄÄÄ1@ ‡ źš/ěôě20%;#"'&5!5!!ć$lYo´RRţ\ ţWĚ0œ`bÔ¸¸ýă‘•˙â*`+@ E FüěÔěä@?? ?]1@ źš/ěô<0327676'&'31'"'&5R27k–i;jşF-*€œţłeb`ý+‡@EĐvťf€wƒZ{sšýťäxvĹĘpţVŃh )=@+E(#E*üěÔ<Ěü<Ôěě1@š ¸*'‡Œ˝*ěô<ě2ô<ě20"27654'&'2##"'&7673=A__UVF6Œ‰‰ËˇÇ†ˆˆfŚB:VVMpˑýRh]ßĐp[„ţŮţńĄ˜ţn‘™œ’mŁNsžĘsgŻ.;ţUdaŽ@    Ô<Ô<9ąÄ1@ Š źŠ˝ü<ěü<ě90°%KSX@ ěěěě´ ´´ ´´9´9´  9´ 9Y#&+53;'$ܕţÍٲś1š1FA”3ŮţNś1š1FţţúýĐ×~ž§ţ0üčţ)~žpţVŃ`6@   ÜěÔ<ü<ÔěĚ1@ ź ‡Œ˝ěô<ě2ô<<0&'&53367653#EçkƒşUJ|ˇƒCUşƒvܡ%awó‰ý~ˇLBŐü,BT݁ýxünc#ţn‡˙ă'`8@E  EüÜěěÔüÔěěÜě1@ ź ‡/<ě2ô<Ä0 433233243! &ţa›ĆŢËŞËޏƛţaţđ!)Rë@ţŔđţOýćąđ@ţŔëýŽ+ţŐ˙˙}&Mj˙.˙˙•˙â*&jY˙˙q˙ăuf&}S˙˙•˙â*f&"Y˙˙‡˙ă'f&]YÉţVjŐ 3! # #ÉĘžýţ’†ý ĘŐý‰wýHüăţV„őý1Ś˙éM% 'G@)E& F(üě2ÔěěÔ˛?]ě1@ š("šŒ(š—(ôěôěÔś?]ě990267656#" '&76#327>&iPËDyĚz]6îö;~ţ‹ox†Ň¤Ú]űYß:PŽW­p=l“Ţşlţǧé‚_ŐŐ¨,žŐâţ嶖ţꀰœ-ўq˙éu$ 7@ !EE üěĚÜěěü<1@‡— ‡ ‡Œ ĚôěÜěôě04'&#" '&4632  Ž1B•SxyJţ̃ÓĐŻÚőţäţ#ţőź°/Ľpö~މZŞZ7ŞAi6 ŢţdüüţeśŇ ţóţ˝BWQß I@ "!ÜĚü9ÜÄ´?@]Ě1@•• •‘/ô<ĚěěĚÔě99@ oĎ]0#4''&"562%62#"F R*Ë*R Mw(oUCHk&_*SK…HţóĽývŠĽ H# Ş 0ţr{C @[)/B˙˙˙áĄf'ţnfP˙˙WQN'rĹufpţVŃ'A@)   $E(üěÔ<<ü<<ÔěÄ1@ ‡¸(‡ Œ— ˝(ěäô<ü<ô<ü<02##"'&76327676'&#"üDž‰‰…ǡdžˆˆ†ÇˇqMTVMqˇqLWULţc™œţíţ휙ţo‘™œœ™úwgsĘČugü¸HguČĘsgA˙âm`E@ EEüÄěÔüÔěÄě91@‡ź‡ Œô<ě2ôě22Ě05!#%$! 47)323764A,“Mţaţń")ţřţaM:ü’GŢĎŞĎި¸¸Ď¤ý­*ţŐR¤ĎѧţOýăާpţ[Íg9&'&47#"54654'&#"563277632327"'532ůö! ˝`Č7"7$>Ž9[@[˝`Č7"7ţÜ>Ž9[&ÍF˘]_I¤ đI5lţ÷|"Oš Šz:6hlŕ0'ţĂ[Ml |"Ošţ÷Šz:6hlýŕf$1 1sţXŮđD@!  üěÜś0]ü9Üś0]ěě1@ • ‘ •˝ ěÔ<ěôě0#&'&76!   76'„¸ü ˝˝ź;:źźźŸ{ţH‚‚¸€€ţpłŇÄÓŇŇÓţžţŸŇłI¤¤ţĺţ椤¤¤¤qţVu{ <@!E E üěܲ0]ü999Üěě1@ š¸ šŒ˝ ěô<ěôě0"32654'&#&'&7632s”VVUV•“ŹVV9Şžk‰‰ˆńđ‰jßstţntsčČÇtuü ţn’}œœœţČţěţíœ{‹ţRŤŐ$.@ & #%ÜěĚÔĚüÄ1@ ••Œ%•"%ôěôěÜě0 32#457654'&# '&76)Fţó`{[mČzYTJPŁE* :ţŔŽ•šŠxe+w˜ţÍţľ˜TOxsPWKL,#%5,*ËÖeNíąŞqţRQ` 4@ " E!üěĚÔĚüIJ]1@ ššŒ! š¸!ôěôěÜě0")!"32#457654'&gĚţÖ-­ţ[łĆĹoƒPTJPŁE* >œÇÎÍăLOxsPWKL,#%5,*˙˙É#Ő)˙@ţVF'6ˇ  (ÜĚü<ĚĚ1@‡ ‡ ‡—( ‡$‡˝(üěÔěôěĚÔěě0347632&'&#"!!#"'&'53276îˆ`Š1213$)),x:KAţż‹b­933.1220W@R‚ Žd ¤>Qoţɏý?’Ľs ¤K_ł˙üÔŐ7"'&76'&526n ę'BƒćQ_šýŹ'BƒćQ_‡ţ[~ý,`*l#˝FRśÚţ‘`*l#˝FRżˆB@ ÜĚ91śBŠ—/äÔě0KSX@ěěěěY #!3ˆţç¸âý&¸âpüĆMý]rţV`đ!#56! #'#64?!"QŞÍhĐ‚ŮíÖöáRR_@ÍśťĐţ¤0:ýŒIKiĆĎţÎţěýÂţXţ’LĘŃ}/M4ĐýĆ!÷wţ–x#&'#&' #'nďšd2ţFšb.źÓ-ňŕŹt¨`4ţĚŔ#Mýа!„¤ŘČţPţßţ‰^ösţKŐ=W@< 9:?5 +,">üÜěěÔü9Ô9ěěÜěÜKSX° +9> &1•Œ>ôě29ô<ĚĚ90'6767&'&'#"'&46733276=332764''3=DŰ´ţěvŒaŠyͤgDd''de’Óy{d;]ůT‡CHI}rHGÇFFt†AGC‡Tú_8dŕţďË挈d*…0Q€A^­­^^ą´˜ÉŸFţżŸˇţÍkmihĆńńĆhimw'ˇŸAF‚œţë‡ţU(`%S@!'E  E&üÜěěÔü9Ô9ěěÜěÜKSX°"Pe^Ґ8*ˆ7D˜ ! ! 12ŔÔ°œˆ.#A“L.#^YŒq4+& "H4B;;=/?"+ŸVhP’OţV ö!! 7654'&#"#676! 3 7ú˙ţíţŻţšşłllc¤´^#đ,VŁĄ˘˘ţ÷ţœŐ)č잣ńۄœe]’6?Ąf‘ńŘśţňţ…ľłdţVj{ # 7654'&#"#67632327\ÚęţîţŢB§\\T‹™PĚ%I‹î芯ţ/‘ŠýĹţď™yYÂk}oSKu,2Rœč¤œĹţຐsśď5%! &'&#"567632 67632'&#" ;!53276ÚnţÍţ€ţÜ"?E! rK,/ 4'Kr !D<&ţŇtEGúĂGH ŞĘţh=ť" ť C(FţK#C ť "&ţEýĂ !ŞŞ!6Ë{5%! &'&#"56763267632'&#";!53276šĚäţ[9ď6:ƒ@%(ĹĹ(%@ƒ:6ö-:IűkI:ž8ţî¤=35ţú53ţ¸ţgžžs˙ă%+$67632! '&76!2767&#"327*ţÖW8QU{‚ő2ţÎţůţÎ¤Ł‹|°s• K^—lŽČşźhiieżźb-sJ V"1ţźýđţźœ›PŢŇť 'ą$üA‚ćstŔ˝xssq˙ă[/&67632#"'&76!27674'&#"3276›ăI,)e[xĚ€€Ű˙‰ˆtgO_\SG]EZ¨ST’•VXXT—”RS7xJŠF61˘˘ý𢢜›PŢŇť '§'üřÍrsstËÇxsst,ţVˇŐ4@  Ü<Üěü<Üě1@  • ź ˝ěěô<ě2Ě20#5!#!#!3ˇËţëËţëËŕË`ţňdú `duţ‹7ţUĎ3@  Ü<Üěü<Üě1@  ‡ ź ˝ěĚô<ě2Ě20#5####!3­ĺšĺ­’š_˙pú†zppţp˙ňÍg3#"54654'&#"563277632327#"'$47(`Č7"7$>Ž9[@[˝`Č7"7ţÜ>Ž9[@[ţă™ţ÷|"Oš Šz:6hlŕ0%ţÁ[Ml |"Ošţ÷Šz:6hlŕ0%?[MşţV¤{$:@&E QF%üěěô˛ ]ěěÄ1@šš¸%"š Œ˝%ěôěôěě04767632#"'&')! $'&  7şZ6ž;śĚ€€Ěx[Y: ôţţ+STţÜTSST$T%ĐŁb^#˘˘ýđ˘˘10dţXŞÚ4–tsstţjtss˙˙q˙ăç{F˙˙˙ŰţVyM˙˙s˙ăŮđaq˙ăŘ{!&'&#"!!32?# '&76!2Ř%%cjˇf_Ľý[_fˇ€MJOhkţôœœ en('Ž c\АŠ\c§œœ(œœ Ä˙ă+{!56763 !"/532767!5!&'&#"Ä'(ne œœţôkhOJM€ˇf_ý[Ľ_fˇjc%ŽŁ œœý؜œ§c\АŠ\c ˙˙ɍՠ˙˙şţV¤Ŕ˙˙s˙ă'đ&ÉŐ ”@  >  üěüě91@ B Ż /<Äě290KSX@  ííííY˛p]@ 6II YY @  &)5:EJ ]]! !###É-}-ĹţËţÄŐţ!ßú+ţçúáţVł` O@ F  ÜěÜěě1@ B  ź ˝/ěÄě290KSX@   ííííY!!###ţšţě™ţëš`ţ{…ű ˛ţ` ú¤UţV¤{'4767632#"'&'!!#5#5'&  7şZ=—;śĚ€€Ě{XY:ĺţšeSTţÜTSST$TľçŒfZ#˘˘ýđ˘˘10dţČŞppŞô–tsstţjtss˙˙s˙ă'đH˙˙s˙ă'đ&y3˙˙s˙ă'đ'yä‘˙˙É‹k&Šuîu˙˙É‹N&Šru…ą’—B°“°˜Bą€BąB|°°#I°°#Ia°€bh°Fa°F`°’C°`#B°’C°`C°UX°°’C°`C8°°5Yą€BąB°°°°#Ih;°°5°°#I°@PX°°@8°°5°5Y˙úţfŹŐ4@  ÔĚü<ĚÜüĚ1@•°••/ôě2Ôěôě0%+532654&#!#!5!!!2ŹĚäL>†o||ţˆËţR‹ýŢhţňôŞ–Â"Ÿžý9+ŞŞţFéî˙˙Éjk&§sŽus˙ă'đN@  Üě2Ô<ĚĚ1@•­ Ą Ž• ‘ĄŽ•ŒôěôěôěôěôěąIąIPXł@8Y0! ! &! !!! 'Ôţőţąţz†OĐÓ˙ţřîüâîFӐŸhgŸŽŐ˝ţăďŞďţä˙˙‡˙ă˘đ6˙˙É“Ő,˙˙XN‘˙˙˙–ţf“Ő-T/Ő3@   ÔÔěÔ<ěÜě1@• ­• •/<ě2ôěüě0!565!32#!% 4&+pţČţ‘Ů•xęűţđűţLŞ@Łŕ+¸ýĘýű8Ş/ŚXţýšÚÝŢÚŚ‹‡ýÝÉĚŐ5@ üě2Ü<ě2Üě1@ • ­ •/<ěä2ü<ě20!!#3!332#4&+326 ý†ĘĘzĘęűţđű6Łŕ࡟Çý9ŐýœdýšÚŢÝÚˇ‹‡ý݇˙úŹŐ,@   ÔĚü<ĚÜě1@ •  • /<ôě2Ôě02#4&#!#!5!!şŢÉ||ţˆËţR‹ýîqéîţfŠŸžý9+ŞŞţF˙˙Ɇk&Žsîu˙˙É3k&Źuĺu˙˙#˝m'yruˇÉţż;Ő )@  •  üěÔüÔěě1ˇ • /<ä2ěĚ0)3!3!#­ţĘŢĘţŞŐúŐ+ú+ţż˙˙hŐ$ÉěŐ.@  . üě2ôěÄĚ1@ •• ­•/ěôěôě04&#!!26!!2)ŁţźDŁlýNűţůţüý衋‡ý݇¨Śţ@ÚŢÝÚŐ˙˙ÉěŐ%ÉjŐ@ •üüĚÄ1/ôě03!!ÉĄý)ŐŞúŐeţżŰŐ4@• •ÜěÔěÔĚü<ě1@ • •/ě22Ě2ôě0%!!67!3#!#Ó”ţpţą†&axŞŞűŢŞŞÔţ ţľD+?x4&úŐţAţżë˙˙É‹Ő((vŐ˜@   Ü<ě2ÔÄ991@B  Ż /<<ě2290KSX@    <<ííííY@ I:I:I:I:I:I:@  <<<<33 # # # 3ęĘŞőýßDÓţţţĘţţţÓDýßőŞŐýâýłüxţéţęü˙ˆMý‡˙ăšđ(?@ * %)ü2ÔěĚÔüĚ1@• ĄŽ• %Ą&Ž"•‘ Œ)äôěôěěôěÔě02#"$'532654&+532654&#"5>Iö8Žƒ‘Łţîzţä,™Š|źĐšĂĚÔłžŁĆ†\ÍqěđѲ|Ť!ĐćéBĐY+•„•Śwps{MĹ("É3Ő y@ B Ż 6 üěüě991/<ě2990KSXííY"˛ ]@068HGif€  FI WX ei y …Š •š Ÿ ]]#!33ÄýjţđÄ–Őú+áűŐűá˙˙É3m&Źyőu#´ +° KT° KT[°KT[Xť@ ˙Ŕ88Y1É†Ő Y@   üě2ÔÄ991@ B Ż /<ě290KSX@    <<ííííY3! # #ÉĘŇýż_ÜýúţďĘŐýâý˛üyţéţT:Ő%@   ÔÔěÔěě1@ •• /<ěôě035675!#!TŮ>WxĘţfbŞ/¤Xţú++¸ýĘţřý˙˙ÉŐ0˙˙É;Ő+˙˙s˙ăŮđ2É;Ő@• üěÔěě1/<ôě0#!#;Ęý"ĘŐú++úŐŐ˙˙ɍŐ3˙˙s˙ă'đ&˙˙˙úéŐ7#˝Ő>´ ÔÄÔÄ1śB •/ěě20KSX@   ěěěěY%+53276?3 3 OűM?w.-ţ!ŮsuŮľ2&]Ş*jkü”lyjŐ =@!   üěÔ<<ü<<Ôěě1@ ••/Ü<ě2ôÜ<ě203>54&'$%53# ŮććŮËŮääŮËţĂţŠW=Ë=UţŤţĂˢĚĹĹËËĹĹĚü+  -‹‹ţŐţőţ÷ţŐ˛˙˙=;Ő;ÉţżĺŐ )@ • üěÔě<üĚ1@ •/ě2Ěô<0)3!33#;űŽĘŢĘŞŞŐúŐ+úŐţŻłŐ$@  ÜěÔě2ě1ˇ• ­ /ä2ôě0!!"&533!3čţ_şŢÉ||xËdéîšţvŸžÇú+ÉĹŐ *@    üěÔüÔěě1@ •/ě2ô<<0%!3!3!3ŹOĘůĘOĘŞ+ú+ŐúŐ+ÉţżoŐ2@ •  üěÔüÔě<üĚ1@   •/ě22Ěô<<0)3!3!33#ĹůĘOĘOĘŞŞŐúŐ+úŐ+úŐţ<Ő *@••­•  ĚÜě2ÔěĚ1/ěôěôě0!!5!!2#4'&#!!276őţGƒNűţđű6ONŁţźDĄPO+ŞýšÚŢÝÚˇ‹DCýÝDC˙˙ÉFŐ&Ŕ,łÉěŐ $@• ­ •  üě2ÔěĚ1/ěäôě04'&#!!2763!2#!ONŁţźDŁNOü˛ĘNűţđűý衋DCýÝDC¨ýšÚŢÝÚo˙ă#đN@ Ü<ĚÔě2Ě1@•­ ĄŽ •‘ĄŽ•Œôěôěôěôěôěą IąIPXł@8Y0! 7!5!&! 56! ! 'oÓîüâîţř˙ÓĐO†ţzţąţőÔF˝ďŞď˝ŐŽţaţ™ţ˜ţaÓ˙ă0đ&8@•‘'•Œ'!•&­$#(  !%$'üě2Ô<ěÔěĚ1/äôěôěôě0"3276'&76! ! '&!#3~܂‚Ü܀€üs´´;:źźźźţĆţĹ´´ţĐĘĘL¤¤ţĺţ椤¤¤¤¤ýóÍĚŇÓţžţŸŇÓÍÍýkŐýjˆĆŐ@@  ÔÄěÔě2ě1@ B• •­ /<ôěôě0KSXˇ  ěěY3!!" &$54$)#!›•’:ţƒ•ţí˜d˙Ęţňţv'ƒ‡…űVŠ×Îŕú+wý‰˙˙{˙ă-{Dp˙ă7):@+E'Q! E*üě2ôěěÔÄ1@Š—*$šš ¸Œ*äô99ěîôě02#"'&5476$%676"32654&}đţîđńţö:[;z631-ú~LÇ‚Ó”ŹŤ•“ŹŹ{ţČţěţíţÇ0ĺw) vš ’ ,u™8wœçÉÉçčČÇéş>` /@ " F!üě2ÔěĚÔě1@ Š ŠźŠ /ěôěÔě0!2654&#32654&#%!2#!r~„„~ţúňh„„hţVśĹÔljŒçÖţ9ţ_ZZ^ÉţĘSJJO“…gy˜r–¤şĐ`śFüüÜĚ1´Šź/ôě03!!şýŁ`“ü3kţĺ`4@ Š ŠÜěÔěÔÄü<ě1@ Š źŠ/ě22Ě2ôě0%!!6765!3#!#ťţ}vţŘ[(bő““üt““:ŒţdÜ6(UÓŠÔü3ţRţĺŽ˙˙q˙ă{HFď`˜@   Ü<ě2ÔÄ991@B  ź /<<ě2290KSX@    <<ííííY@ I:I:I:I:I:I:@  <<<<33 ##'# 3?ˇéÖţnĚĹţ‡ťˇťţ‡ĹĚţnÖé`ýňţQýO6Éţ“mÉýĘąŻýň…˙ăČ|(N@ &* )ÜÄÄÔěĚÔě1@ †ˆš#¸)Š) † ˆ šŒ)ôü° KQXüôYěÔěôü° KQXüôYě0#"&'532654&+532654&#"5>32Â|ŠţţîPŠZGŞ]—Š–‰”›t‡‹wGĄabŞLÄăx\’l­śŤ%%pZXk˜YF@\§]şy` ?@B ź F F üěÔě99ě1/<ä2990KSX@  ěěY##3yˇýäěˇ`ű ƒü}`ü˙˙şy&Ěšš˙Ě#´ +°KT°KT[°KT[Xť@ ˙Ŕ88Y1ş‘` Y@  F üě2ÔÄ991@ B ź /<ě290KSX@    <<ííííY33 ##şˇâţTăÎţsš`ýňţOýQ5Čţ“Ls`$@ F  ÔÔěÔěě1ˇ ŠźŠ /<ěôě0356765!#!Lś8Dő¸ţ{X^™~ąšű ÍoţPÂĎşO` M@B ź  F F üěÜěě1/<Äě290KSX@   ííííY! !###ş >? šţ˸ţĘš`ýîű °ý'ŮüPş` '@ Šź F F üě2Üě2ě1/<ä2Üě03!3#!#şšUššýŤš`ţ7Éű ýü˙˙q˙ău{Rş`@Šź FFüěÔěě1/<ôě0#!#šýŤš`ű Íü3`˙˙şţV¤{S˙˙q˙ăç{F<m`ś ÜÔüÜĚ1ľŠź/ôě20!!#!<1ţBľţB`“ü3Í˙˙=ţV`\pţVgŐ (3B@5E)! '.E4üěÔ<<ü<<Ôěě1@,š¸—41š$Œ ˝4ěô<ě2äô<ě20327&#"#"323>32#"&'4&#"326/‘{brrb{‘ŕ9ƒS§éé§Sƒ9š9ƒS§éé§Sƒ9ŕ‘{brrb{‘/ëǨ¨Çű<9^N5=L^ýü^LţĂţíţíţËN^ýÇŮëǨýě¨Ç˙˙;y`[şţĺ` (@ ŠF üěÔ<ěüĚ1ˇź Š/ě2Ěô<0)3!33#ü9šUš““`ü3Íü3ţR–`;@Š źFÜěÔě2ě1/ä2Ôě°°#I° °#IRXą ¸˙Ŕ°8Y0!!"'&533!3HţŠ™f\¸45h)¸×_V¸ţőu;;öű ş˜` )@ F  F üěÔüÔěě1ˇ źŠ/ě2ô<<0%!3!3!3Úšú"šŮš“Íű `ü3Íşţĺ+`2@ Š  FüěÔüÔ<ěüĚ1@  ź Š/ě22Ěô<<0)3!3!33#˜ú"šŮšÚš““`ü3Íü3Íü3ţR>.` ,@ E  ÄÜě2Ôěě1@ Š źŠ Š/ěÔěôě02#!!5!!!2654&qÖççÖţ8ţ•$ţů~ƒƒ—ٍ¨¤͓ţ7“ţ_ZZ^˙˙ş›`'ó"ŕş>`%@ E  Füě2Ôěě1ˇŠ źŠ/ěäÔě04&#!!263!2#!zƒ~ţú~ƒý@šÖççÖţ9LZ^ţ_nţ7ٍ¨¤q˙ăç{M@ HÜ<Ěôě21@† ˆ †ˆšŠť š¸Œäôěôîţôîőîą IąIPXł@8Y073267!5!.#"563 !"'qž“ŇýČ2 ŸÇšĄŚ-ţŰţ˙˝“ŐVŤÚ“ißVŹFţĂţńţňţÂHÁ˙ăL{ :@ E  Füě2Ô<ěÔěě1@š¸šŒŠź/äÔěôěôě0"32654&632#"'##3J”ŹŤ•“ŹŹýqůđđţîđńţů и¸ßçÉÉçčČÇéţžţČţěţíţÇ.řý÷`ţAt"`<@  ÔÄěÔě21@ BŠź Š /<Ôěôě0KSXˇ  ěěY;#" .5463!##z€wřřw€ţúVtš×ŮśšĺţśS^a\üë‰˘Ąű Ůţ'˙˙q˙ăk&ÉCZ˙˙q˙ă&Éj–…ą’—B°“°˜Bą€BąB|°°#I°#°#Ia°€bh°#Fa°F`°’C°`#B°’C°`C°UX°°’C°`C8°°5Yą€BąB°°#°°#Ih;°#°5°°##I°@PX°#°@8°#°5°5Y/ţV?@N F ü<Ěě22ĚôüĚ1@ŠŠ‡ —/ěÔÄěÜ<ě2Ôě0#533!!>325654&#"#ß°°šýăB˛vśŘţŠ×ző||š§šя´ţLţmedéţęâţY)Œ.ŇПĞţű˙˙şŘm&Çv†q˙ăç{N@ HEüä2ü2Ě1@†ˆ†ˆš Š ťš¸Œäôěôîţôîőîą Ią IPXł @8Y02&#"!!327# ¤ŚĄšÇŸ 2ýČғž“˝ţ˙ţŰ-{FŹVßi“ÚŤVŞH>=˙˙o˙ăÇ{V˙˙ÁyL˙˙˙ôFą˙˙˙ŰţVyMLż`6@!E  ÔÔěÔ<ěÔěě1@Š ŠŠźŠ/<ěôěěÔě0356765!32#!!%2654&+Lś8DŘŤÖčçÖţ›ţšX^x~„„~Ł™~ąšţ7ٍ¨¤ÍoţPÂĎv_ZZ^ţşˇ`8@E   Füě2Ü<ě2Ôě1@ Š  Šź /<ä2Ü<ě2ě032#!!#3!2654&+NŤÖčçÖţ›ýŢšš"\~„„~Ł`ţ7ٍ¨¤ýü`ţ7Éü3_ZZ^ţ/‰:@N Fü<Ěě22ôěĚ1@Ї —/<ěÔÄěÜ<ě20#533!!>32#4&#"#ß°°šýăBłu˝Ę¸||˜Ššя´ţLţmedęíţĐ*ŸžÁĄţű˙˙ş‘m&Îvo˙˙şyk&ĚC]˙˙=ţV&ך^Ěşţĺ` )@ F Š F üěÔüÔěě1ˇ Šź /<ä2ěĚ0)3!3!#TţfšUšţf“`ü3Íű ţĺs˙ăŐ48@$%6 )  5üÜěěÔüÔěěÜě1@ $•-/<ě2ô<Ě0"'&46733276=332764''3#"'&':Óy{d;]ůT‡CHI}rHGÇFFt†AGC‡Tú_8d{{ђed''deą´˜ÉŸFţżŸˇţÍkmihĆńńĆhimw'ˇŸAF‚œţçžţf˛ą^^­­^^˙˙‡˙ă'`]ąŐ:@  Ü<Ěü<<ĚÔěĚ1@ •  •­• /ěôěôÔ<ě20!2#!!5!53!4'&#!!276XNűţđűýčţpĘqONŁţźDŁNOQâÚŢÝÚQ¤ŕŕ¤ýf‹DCýÝDCç:@E  Ü<Ěü<<ĚÔěě1@ Š  Š —Š/ěäÔěÔ<ě20$4&#!!2!5!3!!!2##ƒ~ţú~ýĂţťEšŠţWÖççÖň´^ţ“͓´ţL“ţĘŁţ°¤Ó˙ăđ+#3376!2&'&# !!!2767# '&ĘĘҝĂS†vwhfst‚˙ˆg˛ýF‰˙‚tsfjwv„ţ­Ăş Çý9Őýœ§Đ$#GŐ_//œwĆŞţó”//_ÓH$$ĎĆOÁ˙ă{#2&#"!!327# '&'##33676>ŚĄšć\" Ěţ, žUxž“źţó”{ “¸¸˜z—{FŹV´AWô^3VŞH­äýü`ţ3ʀžřŐ !#!#!#3 řáţęţéĘţçţęáĺąţÜţÜýĺýĺŐüó7ýÉ3` !#####3 Ăěă¸ĺěĂŽĂ‘óó•ţk•ţk`ýšĄţ_É Ő!#!#!#!#3!3  áţęţéĘţçţęáoýřĘĘ_<ĺąţÜţÜýĺýĺÇý9Őýœdüó7ýÉÁĐ`!#####!#3!3 ĐĂěă¸ĺěĂţk¸¸éÑóó•ţk•ţkçţ`ţéýšĄţ_sŮŐ‚@   Üě9ĚÜ´O]9ěĚÜś@@]9ě991@B • /<<ô9ěÔ<ě20KSX@  ííííY˛@]##767!#'&'!‹Ę“d‚Ő˝xŞţQţP¤tźŐ€`ř>ýƒYý§Y~¤ţĺb҆1ęý2‚ŇţžĄzĘ(k{`~@   Üě9Ěܲ€]9ěĚܲ0]9ě991@B •ź /<<ô9ěÔ<ě20KSX@ííííY´p]! #4'&'##767Eţ]ŃţťkK‰ĂV:V¸S8V‰Jlţťśţ–ýĚ&VœţěÇtOţ\˘KtÉœU'4ÉÄŐ! !#'&'##767!#3!ďţŸţP¤tźŐ€`™Ę“d‚Ő˝UnýľĘĘ„>ýƒqdý2‚ŇţžĄz ý§Y~¤ţĺbŇ_4ý9Őýœn(Á.`! !#4'&'##767!#3!7ţçţťkK‰ĂV:V¸S8V‰ţ’¸¸ţ]ŃwéýĚ&VœţěÇtOţ\˘KtÉœţ`ţ?ţ–sţVszS#"&#"3276&#"#"'&54763!27654'4327654!"567376767632'&#"ss˜ĆDş#`ÜA€t bTDt;ü<}JŁ5?u_hFAťXůVŁRuţĹĽŢ Ÿs j#B#' "2ZŚbrţďRUžĎgˆ‚r %§',a’zQ^XRj˝7Ś&6îJ´- ƒţƒŢ@' WoĘWd§ţýE\`[ţtČO#"&#"32632&#"#"'&53!2654'&'"#5223 54'&#"5673767632&#"Čvm˘D¨Pb!',˛-cX;b1Ň2i?‰Ä,ZnN .ër‚‚rë. >ţ.ţĄ˜˝˝˜_- > ^˜źź˜ţ˘ >‘¤ňó¤‘ ‘¤óň¤‘ ĄŞŇtÓŞ ŞÓţĆţÇŇŤ q˙ăĄ{&P%327654'&+"&'&'#";67>2# '&5476!36767623 !#"'&'&r-ĄHVV?Ş- ,4, -ŁGVUHŁ- ,4 É.ţ˙x‰‰t. 4 .w‰‰tţű. 4 ¤`tˇ§ƒa  _t¸źp_   “‰œî颈   ˆœď袉   ˙˙v˙ăút&"'—0'˙˙˜˙ăĄ&#'üţœ•˙Ă˙˙s˙ă3'<cSô˙˙‡˙ă'ŕ&<ősţV'đ9@  0üěüÔ´/?]ě1@ Ą Ž• ‘•/ěĚôěôě0´]!# '&76!2&'&# 3!#úŽţĽťĂĂĂS†vwhfst‚˙ˆˆˆ˜đkÉĆĐShĎĐ$#GŐ_//œţŘţӂ”ý°qţVç{9@  HEüěôÔě1@ † ˆš¸Š/ěĚôüőî0@ € ]! '&576!2&'&#";#˜ţű•—–UQQLNONPłccccłőɖŸú#Ź+qrÍšrqýĂŞ;˙ĽĘ§'''7'77'77ĘdŘiŘdŘ}Ž}ŘdŘiŘdŘiŽiŽ}ľ}Ž}ŘdŘ}Ž}ľ}Ž}ľdľűÚŢ˙Bz/!"'&'&'&547676763!47676762ţšţ3 8 Í 8 g    ý) M #&#"56763 v˘][“ˆ‹Jw}$)›/K†'*CýłÂţĽa"53#7ţĽňń…†Â ”žýłÂţĽa#55#53ţĽň†…ńÍţőgžůĘŮ M 365%$# ůĘ­˜Ýf'ďĄţŕţÎţťrţQĎ q\†t{÷ÖţF` &3@MZg#.#"#> #.#"#> #.#"#> #.#"#> #.#"#> #.#"#> #.#"#> #.#"#> ţÇv aWV` v ž"ž8v aWV` v ž"žůŽv aWV` v ž"žfv aWV` v ž"žůŽv aWV` v ž"žˇv aWV` v ž"ž÷ v aWV` v ž"ž‰v aWV` v ž"žAKKJLţQKKJLKKJLúKKJLKKJL)KKJLKKJLű˜KKJLřXýĂÂ- #)/'7'7'7%'%53-#%5#53 3#k–yo\Šűw–yo\Š–zV\ţăúL•yţŠ[`Ź@ţŔřÂŹţŔ@_Ó¤RÓÓ¤RZ–yţŠ\ľ–yW\ţăţń•zn[Šűw–yo\¨Ô¤‚RÔÔ¤‚Rߏ@ţŔřÂŹţŔ@˙˙ÉţVüm&=yőu˙˙ÁţV8&>š ˙Ě!ěŐ:@  Ü<Ěü<<ĚÔěĚ1@ •  •­• /ěôěôÔ<ě20!2#!#535334'&#!!276“Nűţđűý訨ʨÜONŁţźDŁNOQâÚŢÝÚQ¤ŕŕ¤ýf‹DCýÝDC&Ež 9@ E Ü<Ěü<<ĚÔěě1@ ŠŠ Š/ěÄÔěÔ<ě204'&#!!276!2#!#5333>C€ţůB>ýřĐyttsÖţ9››¸L^*.ţ—.+ßţĘURţ°RRя>ţÉáŐ'+#!2'674&+327'7UŒj’~ÖţĘČű€â šţţrG×j#u~{Sý¨Őqrے-,9†’ýĎ/´~şţV¤{)%'7654'& 32'#"'&'#367632*ŒnŠOSTţÜTSST’F“o•Wl{XY:šš:YX{Ě€€ ˜§]ĽsĹËtstsţjtsŽ]ł.01dýŽ Şd01˘˘ýđ˘Éj@ •üüÜĚ1/ôěĚ03!3!É÷Şý)Ő2ţ$úպКˇ FüüÜĚĚ1ľŠź/ôěĚ03!3!şƒ“ý˘`:ţ3ü3GďŐ )@ • • Ü<Ěü<ĚĚÄ1/ôüÜ<ě20!!5!!!!!NţůĄý)#ýÝ”Ş—ŞţŞýl8U` +@  Ü<Ěü<ĚÜĚ1@  Š Šź/ôüÜ<ě20!!5!!!!!?ţůý˘ ţ`ôޝţŰŞţ ÉţfĚŐ3@  üü<ÜĚÄüĚ1@•°••/ôěÔěôě0#!!!2+5327654&#“ĘĄý)ĄşqmĚäL>†87||Çý9ŐŞţFwrîţÎţňôŞKKÂ"ŸžşţV `3@  Füü<ÜĚÄüĚ1@Š˝ŠŠź/ôěÔěüě0#!!3 +5327654'&#r¸ý˘úFRRQľÁŹn!&&1†çţ`ŞţÁGQĺţňÖ``œ07“Ş )(ţż‘Ő33 3## # # 3ęĘŞőýß׈Ĺ)ţţţĘţţţÓDýßőŞŐýâýłý"ţAţéţęü˙ˆMýFţĺ`33 3###'# 3?ˇéÖţnfz¸!ţ‡ťˇťţ‡ĹĚţnÖé`ýňţQýčţL6Éţ“mÉýĘąŻýň˙˙‡ţušđ&z9Ť˙˙…ţuČ|&zÎËÉţż´Ő3! 3## #ÉĘŇýżí ĹEýúţďĘŐýâý˛ý#ţAţéţşţĺł`33 3###şˇâţTwޏ8ţsš`ýňţOýęţL5Čţ“ɆŐ373! ###ÉĘ­dÁýż_Üýúd­ĘŐýąTîËý˛üyţ%uąţş‘`37533 ##5#şˇ`eBâţTăÎţse`ˇ`ýňaÝvFţOýQ5ţĹÔaţ“!†Ő33#! # ##53Éʨ¨Ňýż_Üýúţďʨ¨ŐŕţŽâý˛üyţéţe=‘3!!3 ###53şˇdţœâţTăÎţsš}}z}ý5ţOýQ5Čţ“}2˛Ő _@   ÔÜě2ÔÄ991@B   Ż /<ě29ě0KSX@    <<ííííY!! # #!2Ňýż_ÜýúţďĘţ=Őýâý˛üyţéţ+*‚` _@   ÔÜě2ÔÄ991@B   ź /<ě29ě0KSX@    <<ííííY!3 ##!*8âţTăÎţsšţ`ýňţOýQ5Čţ“ĆÉţżŐ6@ •­•  • 8 üě2üě2<ě1/<Ěěä2üě0˛P]3!33##!#ÉĘŢĘÉÉĘý"ĘŐýœdúŐţAÇý9Áţĺ@`1@ ŠźŠ F Š  Füě2Ü<ěě2ě1/<Ěěä2Üě03!33##!#Á¸W¸¸¸¸ýЏ`ţ3Íü9ţLýüÉŐ -@• •­  8 üě2üě2Ä1/<ä2üěě03!!!#!#ÉĘŢĄý)Ęý"ĘŐýœdŞúŐÇý9Áć` +@Š Šź   Füě2Üě2Ä1/<ä2Üěě03!!!#!#Á¸Wý˘¸ýЏ`ţ3ÍŞüJýüÉţftŐ8@üěÔ<ěÜĚüĚ1@• ­••/<Üěôěôě0#!#!!2+5327654&#;Ęý"ĘrĄşqmĚäL>†87||Çý9+úŐŐýœwrîţÎţňôŞKKÂ"ŸžÁţV!`3@!F üěÔ<ěÜĚüĚ1@  Šź/<ÜĚôěÜĚ0#!#!3 +5327654'&ˆ¸ýЏÇúFRRQľÁŹn!&&1†çţĆü:`ţGQĺţňÖ``œ07“¤&.s˙ă÷ńAY%.54>323267#".'#"$&54>73267>54.#"+9lR2*DaSN}aF-?jQ&h;>e3.x=&QUW+BĂyŞţôźc[Ź÷sŤp8<{žR€ą?S0 $0>&1H3!(BTŽ1‰ŞÄkBŠƒtW22Tp{:S´˛ŞJ¨#&4tϨ Ë}§fšÍ|}ާbm:†Ž‘E/fcYC(+G[`_&bŤŽnq˙ăxz?P4>73267.54>3232>7#"&'#".>54.#"qKŃ†]Š[-2`ŠX'V$?/(PtMBpP-\_#D-)*%-8%7‚CFIG‡Ô‘LV"- !(,!(ƒŘœX›Fr˜Xb r> %gx‚@]ŸsA9h’Y›ń^    , T™Ö¸&^dc+KiB&HiC÷˙˙sţu'đ'z-ľ˙˙qţuç{'zŐ˙úţżéŐ ,@ @ @ ÄÜěü<ěüÄ1@ • •/Ěěôě20%3##!5!!×ÉÉËýîďýîŞţA+ŞŞ<ţĺm` (@   ÜÜü<ěÜĚ1@ ŠźŠ/Ěěôě20%3##!5!!ݏ¸ľţB1ţB™ţLśŞŞ˙˙˙üçŐ<=ţV`o@ź  ÔK° TK°T[Xš @8YK°TXš ˙Ŕ8YÔüI:91Ěä20@BKSXííííY"%#3 3ĹĂţ;Ă^^ĂţDźNü”l˙üçŐ!#!5!53 3!ßţřËţůýđŮž›ŮýđsţsŞŞýšfüňŞ=ţV` !!#5!5!53 ţFţúĂţďţ;Ă^^`ű˛XŞşşŞXNü”l=ţż;Ő%3## # 3 3ËpĹţ\ţYÚţ/ŮsuŮţ ŞţA{ý…¸ýŐ+ý3;ţĺy`%3## # 3 3q¸!ţşţşŮłţrŮ))Ůţk™ţL¸ţHJţqýß˙úţżGŐ5@• @ @ ÔäüäÔě<üĚ1@  • • /ě2Ěô<ě20%!33#!!5!!ÖŢĘÉÉűŽýîďýîŞ+úŐţA+ŞŞţĺB`3@Š  ÜÄüÄÔ<ěüĚ1@  Š źŠ /ě2Ěô<ě20%!33#!!5!!xZ¸¸¸ü9ţB1ţB™Çü9ţLśŞŞŻţż|Ő.@   ÜěÔ<ě2ě21@ •­ •/Ěěä2ôě0%3##!"'&533!3łÉÉËţ_şqmÉ||xËŞţAÇwrî7ţٟžd–ţĺ¸`F@ F  ÜěÔ<ě2ě21@ Š źŠ/Ěěä2Ôě°°#I°°#IRXą¸˙Ŕ°8Y0%3##!"'&=33!3¸¸¸ţŠ™f\¸45h)¸™ţL _V¸ęÓu;;žŻłŐ#"'&53;333###‚;şqmÉ||ÖËË֐Çwrî7ţٟž9ţÇdú+ÇţĎ–`5333###5#"'&=3ů Ż¸¸Ż ™f\¸4+¤ÂÄžű  ÄÄ_V¸ęÓu;0ŻłŐ$@  üě2ÔěĚ1ˇ• ­/<ôôě0!2#4&#!#zĄşŢÉ||ţˆËŐýœéîţfŠŸžý9Ő˙˙şdK˙ăđ"*I@#$ $3 +Ü2ÜěěôěÄ91@ĄŽ •$­ •(•‘Œ+äôěěô<ě2Ěôě076! !!267# '&'&=3%!&'& ˛"–ź:Cľťűp‹üpoƒ„’ţ˘Ĺź ŞvzŞKB@­b‚ţH€amŞŇŇŰţ„ţôţÎ`_×F$$ÍÂUgkßL>D9ż|¤¤|˙âf{%.i@.&&K /Ü2ěÜ@ p0°0Ď0]ěôěÄ91@&†ˆ &Šš"ť*š¸"Œ/äôěä˛o]2ěü<Ěô˛/]ě90"'&=33676!2!32767'$'&&'&#"XY`œ09Jt’˙⃄ü˛ fgˇjdcbchneţóœ”NRSˆš]\RZŹF1—!&łĄ‘’úZždc4Ž*—…—ZZWWž˙˙ţuđ'źP˙˙ţuf{'çQ˙˙É“Ő,˙˙(vm'y[uŞ˙˙FďH'š¨ĘÉţf5Ő32+5327654&#!#3!Š‹şqmĚäL>†87||ţˆĘĘžqwrîţÎţňôŞKKÂ"Ÿžý9Őý‰wżţVˆ`3 +5327654'&#!#33^HRRQľÁŹn!&&,‹ţüšš%ëwGQĺţňÖ``œ07“Ś$)ţ`ţă6ţVŐ!#!567!3#:Ęţ„bţ‘ÔCuxÉţ’†+ÔţţŞý8§.¨%5úŐŞţV.ţV+`%3##!56765!s¸ţŢ{ĺ¸ţ{v^ţĚł;bő™™ţVŞdžţ’ţüϙϧÔÉţf;Ő1@ 8üě2üěü<Ě1@ •­ /ä2üěÜĚ0%!#3!3+53276qý"ĘĘŢĘÎăL>†87h_ý9Őýœdú“ţňôŞKKÁţVˆ`/@ F Füě2Üěü<Ě1@ Š ź/ô<ÜěÜĚ0!#3!3+53276ĐýЏ¸W¸RQľÁŹn!&ýü`ţ3ÍűŒÖ``œ07ÉţVŐ!#!#3!33#;Ęý"ĘĘŢĘÉţ’†Çý9ŐýœdúŐŞţVÁţV@`!#!#3!33#ˆ¸ýЏ¸W¸¸ţŢ{ýü`ţ3Íü9™ţVŻţżłŐ/@ ÜěÔěü22ě1@ • ­•/Ěěä2ôě0%!"'&533!3##čţ_şqmÉ||xËËÉŞwrî7ţٟždú+ţżë–ţĺ`G@ FÜěÔěü22ě1@ Š źŠ/Ěěä2Ôě°°#I° °#IRXą ¸˙Ŕ°8Y0%!"'&=33!3##HţŠ™f\¸45h)¸¸¸™p_V¸ęÓu;;žű ţĺ´ÉţVčŐ%3####! !Éţ’†+ĹţËţÄ-}-ŞŞţVŞüúáŐüřÁţV`%3####! !H¸ţŢ{ĺ˛ţ˸ţʲ>?™™ţVްý'ŮüP`ýî˙˙ÁyO˙˙h’'šÎJ¤´+1@oo]0˙˙{˙ă-&šO×Ä´"+1˙˙hN&¤rźu´  +@ 0?  ]1˙˙{˙ă-&ÄjR ´-( +@(o(P-_(@-O(0-?(-( ]1˙˙HŐˆ˙˙{˙ăo{¨˙˙É‹m'yĄuŠ@@]1˙˙q˙ăH'š–É@p]1˙˙u˙ăŮđQ˙˙q˙ă{˙˙u˙ăŮN'r ul˙˙q˙ă&jTm˙˙(vN'rQuŞ˙˙Fď'jžĘ˙˙‡˙ăšN'r‡uŤ˙˙…˙ăČ&j:Ë˙˙ ˙ÁřŐy˙˙XţL/`T˙˙É31'qő;Ź˙˙şyő'q’˙˙Ě˙˙É3N'rőuŹ˙˙şy'j’Ě˙˙s˙ăŮN&˛r'u´ +@ @O]1˙˙q˙ău&Ňjs´ +@ @O0?]1˙˙s˙ăŮđa˙˙q˙ău{7˙˙s˙ăŮN&|r'u˙˙q˙ău&}js˙˙o˙ă#N'rguÁ˙˙q˙ăç&jâá˙˙#˝1'qr;ˇ˙˙=ţVő&q^˙×˙˙#˝N'rruˇ˙˙=ţV&j^×˙˙#˝k'{ruˇ˙˙=ţVf&Ÿ^×˙˙ŻłN'rĚuť˙˙–&j^ŰÉţżjŐ #@ •  üü<ěĚÄ1ś•/ĚĚôě03!!3#ÉĄý)ÉÉŐŞűţAşţĺĐ` #@ Š F üü<ěÜĚ1śŠź/ĚĚôě03!!3#şý˘¸¸`ŞüăţL˙˙ÉFN&żrˇu˙˙ş›&ßjGţVďŐ9@  Ü<<Ěü<ĚĚÄÜĚ1@ • •/ôüÜ<ě2ĚÜĚ0!!5!!!!!!+53265NţůĄý)#ýÝiGRżţéiL”Ş—ŞţŞýě”Č`nœa­8ţVU`;@  Ü<ÄĚü<ĚÜĚÜĚ1@ Š Šź/ôěÜ<ü<ĚÜĚ0!!5!!!!!!+53265?ţůý˘ ţ`nFRŔţéjKôޝţŰŞţŒ”Č`nœa­=ţf+Ő%+532767 # 3 3*SfäL>‡7( ţ^ţYÚţ/ŮsuŮţ žbzŞK5sxý…¸ýŐ+ý3;ţVd` +527>5 # 3 dţkkCQÄÁÄO5ţ˝ţşŮłţrŮ))`ýßţ&9Íasœ m˜´ţHJţq=;Ő3 3!!# #!5!ŮsuŮţNtţÎŮţ\ţYÚÔţŒ–ŐýŐ+ýwýD{ý…ź;y` 3 3!!# #!5ˇţŠŮ))ŮţŞ ţŕ~ŮţşţşŮţß”Ěţqţ4ýü¸ţH‘´Ő &@  ÜěÔě2ě1@ •­ • /ěäôě03!!"!"$54$3!fONŁDţźŁNONýčűţđűNˇŠCD#CD“ú+ÚÝŢÚfqő` %@ F EüěÔě2ě1ˇŠ źŠ /ěäÔě03!!"!"'&763!5>Bţů€C>Ŕţ9ÖsttyĐLZ+.i.*śű RRPRUĹ‘˙ăCŐ 09@2&)  1ÜěÔě29Ôěě1@"••­-Œ(ź1ěěä2ôěě20!"32765#"'&54$3!3327653#"'&ęţźŁNOO_´KV! 3j^nűNÉ?4pi;?Ęnh×Ůf1ÉCDţęP_m}ŸţÝ`61‰ĘŢÚfűě[JJO›ŸýZŕxx9q˙ăs` 08@2F&) E1üěÔě29Ôěě1@" Š1Š-Œ(ź1ěĚä2Ôěě20!"32765#"'&54763!3327653#"'&=ţů€C>A@j”\-1C]^ˆŹfetyи>¸dhÎÓd.*^\:9m4œţöl01a`ŚŞRUĹýaŸPOORAţ¸ěsxx%É˙ăđ7@@9., ,#8üÔěĚÔüĚěĚ1@•'•2ĄŽ•‘-2Œ8äĚôěôěěÔě904'&+5327654'&#"567632327653#"'&'&Ş\]ĽŽś•OOQR˜SžrsdeY憆GGƒ‘RQ?4pi;?Ęnh×Ůf0!˛„JKŚ;$&´ hi˛|UV!bb€[JJO›ŸýZŕxx8PaŤ˙ăF|5G@7., ,#6ÜÄÔěĚÔěěĚ1@†ˆš¸6Š6'š2Œ,6ĚôěÔěôü° KQXüôYě04'&+5327654'&#"5>32327653#"'&NH‰”›tCDFEwGQPabŞLÄqr<=ih<>¸dhÎÇpb8f83˜,-F@.. §NO]@AHOHXDEORAţ¸ěsxueÉţV<đ):@  '+%*üÔěĚěÔüĚ1@!•ĄŽ•‘'•(˝/ěěôěôěÔě90!#4'&+5327654'&#"5676323#sÉ\]ĽŽś•OOQR˜SžrsdeY憆GGƒ‘RQÉÉą…JKŚ;$&´ hi˛|UV!ba’ţůýŹŤţVƒ|)?@ !+) *ÜÄÔěĚěÔě1@†ˆš¸ Š Š˝/ěěÔěôü° KQXüôYě0%3##4'&+5327654'&#"5>32Čť¸¸NH‰”›tCDFEwGQPabŞLÄqr<¸dhÎÇpbţ{v^ţĚł;b`ýWŠORAţ¸ěsxue{†ţ’ţüϙϧÔ˙˙É˙ă-Ő¸Á˙ă`6@F  Füě2Üě2Ôüě1@ ŠźŠŒ /Ěôěä2Üě0327653#"'&=!#3!ˆzgh<>¸dhÎÇpbýЏ¸W`ýWŠORAţ¸ěsxue{Ěýü`ţ3Ís˙ă‰đ0@  üěÜěÄě1@••• ‘ŒäôěÔüĚě0# '&76! &! !2653‰d-‰|—ţ›ÄŔżĹe'ááţęýŰ%×{Ęşŕ9!ŇĚĐÍҎ׿ýŸý ”¤đq˙ăF{0@ E EüěÔěÄě1@šš š¸ŒäôěÔüĚě076!2&#"3253# '&q’– ĐşžÄ˝bZZb˝â¸Éĺţü•Ž/ĄnŞ||rţ|r|>žĹě禞˙ú˙ăfŐ/@  @@ÔäüäĚÜě1@ ••Œ Ěäôě2ě0327653#"'&5!5!×?4oi;?Ęnh×Öinýîď+ü–[JJO›ŸýZŕxx}âqŞŞ˙ăö`2@  ÔÜüĚĚÜě1@ ŠŒŠź Ěôě2ôě˛ ]0327653#"'&5!5!x>=ih<>¸dhÎÇpbţB1śýŽVFEORAţ¸ěsxue{~ŞŞ˙˙¤˙ă{đR˙˙…˙ăČ|ITţf:Ő/@ ÔÔěÔěěĚ1@ • ˝••2ěôěôě0356765!+532765!TÝ:WxÍăM?†77ţfbŞ0Łödţú“ţňôŞKLÁøýĘţřýLţVs`/@ FÔÔěÔěěĚ1@ Š ˝ŠźŠ2ěôěôě0356765!+532765!Lť3DőŁľF1a.&ţ{X^™}ŚСűŒÖŔœ0)ĄáoţPÂĎT Ő35675! 3 # # !TŮ>WysuŮţ Ůţ\ţYÚţ ý¸fbŞ/¤XţýŐ+ý3üř{ý…¸ýĘţřýL˛` # # !56765! ţkŞŮţşţşŮłţßţ0X^ţĚś8Dő')`ýßýÁ¸ţHJƒoţPÂĎ™~ąšţtÉčŐ32654&#!##!23 #“ţšš•ţęţĘČűhŮţ Ů/ýϒ‡†’ýłŠý¨ŐăŰ0*ý3üřşţV¨{ ##"&'#3>32&  “ţkŞŮţË\Ě{ą:šš:ą{ĚT%ţ+§ţܧ§$`ýßýÁĄ¨t˘adýŽ Şda˘k—‰ý–ççţjçˆźŐ3&$54$)!!!!!!3!!"ˆ˜d˙čýĹý;öü>ţôţv7•’8ţȒŠ×ÎŕŞţFŞýăŞwý‰Şţú‡t˙ăw{&/!3267# '&'##.5463!632.#"%;#"wü˛ ͡jÇbcĐkţô˜ĺţśĆVtš×ŮeVg⸼ˆššýK€wřřw€^ZžÇ44Ž*,œ˜Âţ'뉏˘ĄţÝė´ŽžŠS^a\˙˙sţřŮđ4˙˙qţVZ{T˙˙DŚŐ:˙˙V5`ZTţfsŐ%9@' !&ÔÔěÔ<ěÜÄĚě1@••!•˝/<Ěěôěěě035675!!2+5327654&#!#!TŮ>WxĄşqmĚäL>†87||ţˆĘţfbŞ/¤XţýœwrîţÎţňôŞKKÂ"Ÿžý9+¸ýĘţřýLţV `'9@)"#(ÔÔěÔ<ěÜÄĚě1@ŠŠ#Šź˝!/<Ěěôěěě0356765!3 +5327654'&#!#!Lś8DőúFRRQľÁŹn!&&,‹ţü¸ţ{X^™~ąšţGQĺţňŐa`œ07“Ś$)ţÍoţPÂĎÉţftŐ!?@ #8"üě2ü<ě2ÔĚěĚ1@•˝•­ /<ä2ü<ě2üě03!3!2+5327654&#!#!#ÉĘŢĘĄşqmĚäL>†87||ţˆĘý"ĘŐýœdýœwrîţÎţňôŞKKÂ"Ÿžý9Çý9şţV`#@@ % !F$üě2Ü<ě2ÜÄĚě1@ŠŠ!Šź˝#/Ěě<ä2Üěěě03!33 +5327654'&#!#!#şšUšúFRRQľÁŹn!&&,‹ţüšýŤš`ţ7ÉţGQĺţňŐa`œ07“Ś$)ţýüÉţżŐ !!#!3#qý"ĘrÉÉ+úŐŐúŐţAşţĺ9` 3##!#¸¸šýŤš`ü9ţLÍü3`˛˙ă Ő F@   8A!ü˛p]ěüěÔěł 991@ ••Œ /ä2ôěÜěś  9033265332#54&+! '&˛ËŽĂÂŽË ,”ŔœgQ]*-ţćţ呐ŐüuđÓÓđ‹ü\GCśŤF1l[R.•••$˛)ňK@  8Aü˛p]ě2ü<ěě991@ ••‘ /ÄÄ´`]ôěüĚ0ś  Ÿ ]376! #54&#"!2#54&#!˛‘$ËŽÂĂŽX•żœgQý¨¤$••ţŮţŮ9 đÓÓ𝶫F1l[ýÁ˛Äň%D@   8!&ü˛p]ěô<ě2Ôě991@  • •‘ /ôěÔ<ü<Ě0˛O']32#54&+#!"'&54! 4&#"3)G•żœgQGËţ*ɟn(!ËŽÂĂŽ5ZŚrśŤF1l[ţ=Ăł|îď#ţÖţÜţÎđÓÓ˘˘I|˛ÄňH@   8Aü˛p]ěüěÔě˛ 91@ •ź  •‘ /Äôě9ôüĚ0˛O ]32#54&+#4&#"#576! Y•żœgQGËŽÂÎː‘Z`śŤF1l[üO‹đÓÔď 9$•••\˛˙ă)Ő$30!2#54'&#!3276=3! '&˛ËX•_`œ07Qý¨WWĂÂWWˑ“ţéţ呐1¤ţ‹[[ŤF1l*1ţ™đjiijŹ 9㒕••›˙şđ$2%!67#"'&543 2#54'&#!3 7654'& fč<0I|ŕ‚ƒâƒq4ç•_`œ07Qý5˧OPPOţđOPPŻáĐ'.ˆ‡ëćĆŞäV]ţĎţ÷[[ŤF1l*1LL]]˘Ą]^^]Ą˘]˛˙)ŐD@8 :  üě2ô˛€]ě99ôě991@ ••ź  /ääěĚüĚ0%!2#54&#!3!2#54&#!}…•żœgQý°ËX•żœgQý¨ŻśŤF1l[Őţ‹śŤF1l[˛˙)ň@@  8Aü˛p]ěü<ěě991@ •‘ •/ěĚÄôě0śŸ]376! #54&#"!2#54&#˛‘(ËŽÄĂŹX•żœgQ¤$••ţÝţŐ9 đÓÖíý$śŤF1l[˛Žň-:#'&'&763!&'&#"#76! 32#54'&!#"327654:gi˜’m‚INK(*WÂĂWWː‘—\!%•_`œ05ţĐť™9:E5:.ą ßrs Tf˝“LQR2jjiđüu¤$•••[˘[[ŤF1j,1‡i--Q@“˛Äň+#! '&4763!332#54'&)"32765pG‘ţĺţ혐nŸÉÖËG•_`œ07ţţTŚZ5WWÂĂWWąţţܕ••Ž.ŕ|ł’ţn[[ŤF1l*1}H•ŕijjiđ˛)Ő:@ 8Aü˛p]ě2üě1@ •¸/Ääôě0˛9śŸ]363 #54&#"#˛Ë Ń(ËŽÂÁ°ËŐţ;dţÝţŐK2đÓŃňýó˛˙VŐ 3@ : üěô˛€]ě991@•  /äěĚ0@0P]!2#54&#!}…•żœgQý°ŐúÚśŤF1l[Ő˛˙ăçŐ327653#"'&!#3|%3x*%ËqXŇĆdqţĚËË`ý×ţĺ>WWK‡°ý7Ő}bbpi“üOŐţ‹A˙ă™Í$3! '&7#'&=33!2#54'&#%" 76'&ÖÉźźţĆţĹź˝Ăg”``œ07Q°•_`œ07Qý¨á|‚‚¸€€y&áţ¤ţŸŇÓŇŇbcÚ\[ŤF1l*1[[ŤF1l*1 ž¤ţĺţ椤¤¤Šž˛)Ő!## '&33276=3)Ë Ńţ혐ËWWÂÁYWËĹd•Ž+&ýóđjiihň˜˛˙)Ő !2#54'&#!5 uwüÉ •_`œ07QüÝ1ţkŐţŽü,[[ŤF1l*1ŻŔf˙ŇÉđ'1?%#"'&543267#"'&543 327%&#"32 7654'& ŽoUŹIe┃r0I|ŕ‚ƒâƒq9ƒI9~d›•ţÉX/? 9.YOPPOţđOPP@$2iůšwď'.ˆ‡ëćĆŞäţÚöd‡kŔWĆM( ]]˘Ą]^^]Ą˘]˛˙Äň?@  8Aü˛p]ěüěÔě1@•   •‘ /Äôě9ôĚ0˛O]%32#54&#!4&#"#576! )G•żœgQţîŽÄÏː‘!ŻśŤF1l[‹đÓÔď 9$••ţÖţÜ\˙â…Ő,3276=4'&#!#5354763!!"!2#5# '&ŮWWÂÁYW07Qý ˛˛`_•#ý Q70X•_`Ë Ńţ璐ąţ˜đijjgňĄl*1ŻŤ[[Ż1*k[[ŤýFd•”%˛˙ăÄŐ!! '&332765!2#54'&#)‘ţćţ呐ËWWĂÂWW•_`œ07Q&ý ţܕ•••$¤üuđjiijđ‹[[ŤF1l*1Œ˙ăSň" $53 6&#!5!2654& #4$ 5ţ÷ýJţřĘRS茼őýżAć“Äţ–¸ Ę++.’WHţąőčçö˘NM›IšŸ‚tYa[J¸¸ţń´\˙ănŐ@@  8ÔěÔěôěÄ1@ • Œ•ôÜěôěś 9˛Ŕ/0326=3! #"&=33ÂŽÄĂŹËţßţĺţćţßG’œgQÝýmđÓÔď 9ţÜţÖ-!üśŹF2lZ˛˙ă)“ 3276=3! '&576%7%5zZ[žĂWWˑŸţôţĎz=s–ý9ţ¤ţ™W/Żhiikď 9ţψ••ŻÖ&dŕĄAŒžžžœĄžU˛)ň7@  8Aü˛p]ěüě1@  •‘ /<ôě90śŸ]376! #4&#"˛‘!ËŽÂĂŽ¤$••ţÖţÜü\‹đÓÓđüu˛˙B)ň4'&#"#576! %5%$76aZ[žĂŽË  1y‘=ţ–Çűď\gW/ÎŻgjÔď 92‡••˛ÓţÚdŕĄAŒžžžœĄžU˛Ąň##576! #4'&ËˆKuËŽ‘9)ŸŻËuBGü”lP|Ý 9´••Łţęü\‹ĚP›˙şđ0%&'&43 2#54'&#!3!767654'&'& ˘EđĘâƒq4ç•_`œ07Qý5ËŤe, 7OţđOP—ŁÜÜŞŽćĆŞäV]ţĎţ÷[[ŤF1l*1LĂÂ,ƒ@Bž@^^]ĄŞt~˛ÄňH@   8Aü˛p]ěüěÔě˛ 91@ •ź •‘ /<ôě9ôüĚ0˛O ]32#54&+#4&#"#76! Y•żœgQGËŽÂÎː‘Z`śŤF1l[üO‹đÓÓđüu¤$•••\˙˙˛˙ă)Ő8˛˙ÄŐ!!# '&5332765332#54'&#^ Ńţ혐ËWWÂÁYWËG•_`œ07QĹd•)ą˜đjiihň úÚ[[ŤF1l*1˙˙‡˙ă˘đ6˛)ň.@  8Aü˛p]ěüě1@•‘ /Äôě0śŸ]376! #54&#"˛‘(ËŽÂĂŽ¤$••ţÝţŐ9 đÓÓđüuŒ˙ăSň0@ '&53 7654'&#""#6767&'&5476! "327654'&’RQ…„ýJ„„ĘRSčSSSRőâefg#R’HJ›““›IIţP´acIJĺćIJcaW"ccŻőttstö˘NMMN˘§MMM *c" Y[€`XX^‘€[YŮ01YtAAAAtY10˛ Ő=@ 8  Aü˛p]ě2üěĚ1@ ••¸ /Ääôěě0˛ 9˛]54&#"#363 3^ŽÂÁ°ËË Ń—uçŰ2đÓŃňýóŐţ;d•sâŻ˙˙sŮŐ:\ăň,<47632#"'!2#54'&#!##"'&=337654'&Вëô„‘‘„ôöIô•_`œ07Qţ Ë •_`œ07Q*Š]WW]Šˆ_WW_r•sppz•zpSÚ[[ŤF1l*1ţ=Ă[[ŤF1l*1ÜA>T]=BD=[V>C˙˙s˙ăŮđ2‡˙ă˘đ167654'&4'"!"'&'5&'&547632šqG^CCţź95+<&0âkl’‘ţçjxw€{vEBž[eK[Ľç”ýř 4D~n>=„>@%‘c3A +mlśŮpp/ĐE# ,,W`Ť×arÉ˙˙u˙˙˛ţ×Ő~^ńŠÂ#33ŐvŐńŃxń†%"#476327653˙[RB˜hjľ[RB˜hjÍTDD‚jlTDD‚jl˙˙žđ}fCô^ĺź7#47! !"33254'&'#"üž q3U7ţţű˜a\ "ÍĚ9ńÓS üA5ŕz\&Œ˛NZń˛%03!ZŞŞ}ń4ţb–ş˙ä`&^@PP F'üěüüüü<91@  ‡#Œź/ô<<ô<Äě290@0(P(p(( ( (ż(ß(˙( ]%#"&5332765332653#5#"'&ŽE``‚ŻžšruSSšrwŚšš?XXyzVUÖ|:<öâ¤ýb˘œ`^¤zýb˘œŔ˘zű Žh02>>şţVd{?@ ‡¸ź  Š  N  Füě22ô<ě1/üĚäôÄě90´`Ď]54&#"!!#3>32Ź||•ŹńýššBłuÁĆÂܟžž¤ţ6ŻţV ŽedďčâqţV´{ <@" GE!üěô<ě22ÜÔ1@š š¸ŒŠ ˝ź!ääěäôÄěĆî032654&#"##"3253!!/§’’¨¨’’§+¸:ą|Ë˙˙Ë|ą:¸ZţŚ/ËççËËççű\RdaDDadŞüOŻşţVž{=@ N  Füě2ô<ěÜÄ1@ ‡¸ ź˝Š /<ěěäôÄěľ  90!#4&#"#3>32!d¸||•ŹššBłuÁĆZţVHŸžž¤ý‡`Žedďčţ ŻŽ˙ăX?@ ‡ŒŠźNFüě2ô<ě21/ôüĚôÄě90´`Ď]3!!3276=3#5#"'&ޏňý>>|˜TV¸¸CąuÁddşZţLŞţ ŸPO_bĄĽývŹfcxxqţV/{<@ G Eüěôě22ÜÔ1@šš ¸ŒŠ˝źäôěäôÄěĆî03!#"325332654&#"ZŐţs:ą|Ë˙˙Ë|ą:¸üŐ§’’¨¨’’§ţř˘RdaDDadŞýĎËççËËççŽ˙ŕ,@ Füü<ÜÔěÄ1@ Šź Š—/äěĚôě0)3!!32#54'&Sţ[¸zý†í˜M`œ01ţLŞüůI[ŤF1i&&şţVd{>@‡¸ ź Š ˝ N  Füě2ô<ě1/üěäôÄě90´`Ď]!4&#"!!3>32Ź||•ŹńüVšBłuÁĆžŸžž¤üŒŻ Žedďčý\şţV6{ )u@ +G  F*üě2ôěÜÄł$Üüł!Ôě˛!$ISXł $<323#'&5476#"3276#§’’§šš:ą{Ě˙’˘5`Ź 4xBdB˜Ÿ‹J4/ËççËü' ŞdaţźţřŻĄZĄ+h|{Nvݐqq<q˙ă/ 4@ ! GE üěô<ě2ÜÄ1@šŒ Šź— äô<ü<ôě0!"32765#"4763!33˘ţƈbO§’šMS¸ţěK•ö˙}ů<¸ŐśzaŹËçksÔ‡ţCţݚ+Dߍ§´ţLŞşţVd5@ ‡¸ — ˝N  Füě2ôě1/ěěôÄě90˛`]#4&#"#3>32d¸||•ŹššBłuÁƤý\žŸžž¤űÝžýžedďÁţV×` @FüüÔÄ1@źŠ˝ôää0!!3y^ýę¸ţř˘ şţV†I@  NFüě2Ôěôě21@‡ ŠźŒ—˝ /äääô<ěÄěľ 90˛@]32653#5#"&5!#3”||•­¸¸CąuÁČţ—šš`ýaŸŸž¤{ű Źfcđçüú žţLq˙âź0\@ 2 $G,E1üěôěÜÄ´,ÜÜě1@ Š0ź1Š—1š(Œ1ôěôěô<ü<0´!""<<ľ!ěě˛<<#"327676''&5476;#&!!'&'&4763Ă[ĽAS§’­].ţÝSD81“N/VţÉŽ!…‡â÷qÚśZsşËç–IR\++˜(VL-%Ż)$žŞţś?‰ŚĄ˘뎘ŽţVX:@  ‡Œ— ź ˝  NFüěôě21ěääôÄě90´`Ď]332653##"&ޏ||•­¸¸CąuÁČşZű­ŸŸž¤{ůöVfcđ˙˙şdKq˙ăZ 4e@ GE5üěôü<@ (''*%%*3ÜüÔě9/ě˛ 91@.Š š¸šŒ'—/äôÄěôěÜě˛ 90@ `6€6 6ŕ6]32654&#"#5#"325&+"'&5473;2/§’’¨¨’’§énD¸:ą|Ë˙ĘWCv>!¸%“7)/ËççËËççkP¨ţŰýŐ¨daDE<6pG5P0,!K7şţV9{;@ N  Füě2ôěÜÄ1@ ‡¸ ź Š˝ /üěäôÄěľ  90!4&#"#3>329ţs||•ŹššBłuÁĆţř˘HŸžž¤ý‡`ŽedďčüTŽ˙ăX-b@ (N  F.ü<ěô<ě2ś -9ˇ  ěě° /1@%‡ŒŠź†—/ôěô<ü<ôÄěľ! (90#5#"'&=47#5367$732%326=4'&#X¸CąuĂbdzzÚp˜­Ý>Bi°‚Oý˜Š>Ay•­cW ýŕŹfcx{äIéĘŞ€`Ž&Ż$„%8ĂvĆĺJ˘MOž¤;Ď)žŽ˙ă +?@-% $NF,üěôě2ÜěÜÄ1@ &Š—$‡&)Œź$/äôÄěôě90332654'&/&7676;#"#5#"&ޏ||•­ M.=<‹ěě(`¸CąuÁČşŚýaŸŸž¤— źp0.-Ż *ó/(ü„Źfcđ˙˙˙ŰţVy`ů2˙ăZ#G@%  N!$ÔüĚÜěôě2Ä1@  !Š — Š ź ‡Œ /ôÄěô<ěôě90;32653#5#"&5#"'&5476;#"ňƒó||•­¸¸CąuÁČ;•^PZl}YYƒęŠýaŸŸž¤{ű Źfcđçü^P”zKWŻ ţV•{!<@ #E F"ü<ě2Ô<ěä1@ Š˝"š¸"ôěÔüě0ś!  ěě3!!"'&547654'&#"#4632†/îýĂQ@'$ÍC#@l;qšťŻÔsDEŔ ˘E+G56­dZY0Y^cŁÔŤe’“e˙˙şd{QFţV;`%X@##'  &ÔěÜěĚÜÄ9/ě1@#Šź&Š˝&üěôě990ś%  ěěś ! ěě3!!"'&547676/&5476;#&(3îýĂW:'$F[•L2Öse`6Žg+ś! ˘E/>A/­(32Âýę||•ŹššBłuÁĆŻŻžŸžž¤ý‡`Žedďčţ ˙˙Ž˙ăX`XŽţV-=@    NFüěôě2ÜÄ1@ ‡Œ —ź Š˝üěääôÄě903326533!#"&ޏ||•­¸ŐţsCąuÁČşŚýaŸŸž¤/řä˘VfcđŽ˙ă{%i@  PPF&üěü<ü<üě1@‡¸ "‡Œ ź /<ô<ôÄěôÄěľ9ľ  90@0'P'p'' ' 'ż'ß'˙' ]3>32#4&#"#5#"&533276¸BłYÁƸ||zUV¸CądÁȸ||‚XWĺ{Žedďčý\žŸž_`Łý‡ŹfcđçŚýaŸŸ_\şţVd{7@ ‡¸ ź ˝N  Füě2ôě1/ěäôÄě90´`Ď]#4&#"#3>32d¸||•ŹššBłuÁƤý\žŸžž¤űÝ Žedď˙˙qţVZ{JÁŸ`@FüüÔÄ1@źŠ/ěä0%!!3y&ý"¸ŻŻ`ŽţV%k@  PPF&üěü<ü<üě1@‡¸ "‡Œ ź—˝ /ěäôôÄěôÄěľ9ľ  90@0'P'p'' ' 'ż'ß'˙' ]3>32#4&#"##"&533276¸BłYÁƸ||vYV¸CądÁȸ||‚XWĺ/ýžedďčý\žŸž_\§űÝVfcđçŚýaŸŸ_\ţVż{$U@&E  G/Ü<ě222ôěÄä1@"šš¸Œ%Š˝ź%äěÜ<ü<äôÄěÄî˛IPXą32#"&'!!#54&#"326Őš:ą{Ě˙˙Ě{ą:éýš+§’’§§’’§ú–ÄŞdaţźţřţřţźadţô–°°)ËççËËçç˙˙q˙ău{RzţV–*"-6u@83 .# *E7ü<ěÜ<<ü<<ÜěÄ1@†&š—7/ ‡ Œ"˝7ěô<Äě2ôěěł#99˛#9ś3.  90´#,<<ľ. #ěě"'&'53&'&547632##4#"27654'&,Dd†„%ßKcçfep_˜{5S#Âal’~˘¸EU@<%I]7_E8BťQŁ-a`Ľta2N•ţŠ-blëţÚiZţn!vFDs:#÷ý+IżłJ>Ž˙ăś8@    NFüěôě2ÜÄ1@  ‡Œ— ź Š/ěääôÄě90332653!!5#"&ޏ||•­¸^ýęCąuÁČşZű­ŸŸž¤{üOŻŹfcđđĂR@ü<ě21@ƒƒ/ě/ě073#3#đÓÓÓÓţţRţ`¤ í27#"'&'3U ooÍ,rr€ON§cA˘UUŸWDţCÚ˙Ó´ Ü<Ě21śÜÜÜI:03#3#D––––-–d–˙˙ŤţC‚˙Ó'¨ţä°KRXť@8<1Y˙ţC˘˙Ó %ś  Ü<Ü<ÜĚ1@  Ü<Ü<ÜI:05!73#3#˙}––––Ă––––d–˙ţC˘˙Ó.@ Ü<Ü<ÜÜÜĚ1@   Ü<Ü<<ĚÜI:03#3#'#5#5! ––––ú–}-–d–úČȖ–DţťÚ˙QľÜĚ1ÜĚ03#D––Ż–˙˙ÇţťW˙Q&}ƒ˛ISXš@8Y1ÇţCW˙Ó O@   ÔĚÜĚÜI:1˛ISXA @˙Ŕ88Y@    Ü<Ü<ÜI:03#3#73#D––}––ú––ţٖ–––cţťť˙QľÜĚ1ÜĚ0!!cXý¨Ż–cţuť˙Ą´ ÜÜÜĚ1´ÜÜ<Ě0#5#5!ږáXő––––––ľÔĚ1ÜĚ03#––––˙˙––˙˙/ţš˙Ý'ß˙`&ĺöţëŒ=˛ ISXš ˙Ŕ8Ył I:1˛ ISXš ˙Ŕ8Y˛ ISXš˙Ŕ8Ył I:0Nĺä{ľÔĚ1ÜĚ03#N––{–DţCÚ˙ÓľÜĚ1ÜĚ03#D––-ţpdĆj!!dýĺj¤cť–ľÔĚ1ÜĚ0!!cXý¨––Ń˙8‹(´ÔěĚ1˛ĚĚ0´@P]3#Ńşş(úŻ–ľÔĚ1ÜĚ03#––––Ĺ[–ľÔĚ1ÜĚ03#Ŗ–––Ń‹`#ś Ô2ě2Ě1´ź/ĚôĚ0´@ P ]3#3#Ńşşşş`Ęý4ĘfÜ` ś  ÔěÔĚĚ1śŠź Š /ěôě06;#"!!fÍ㒔†nźýŠ^ô–ÂţcţCť˙Ó´ ÜÜÜĚ1´ÜÜ<Ě0#5#5!ږáXĂúú––˛ƒ`V@ FN  FüÄěôÄěě1@ Bź /<ô<90KSX@í <<ý <5–¸˛G.Ůţi=d¸ŞBôŮ]Gg`˛ţóš"ţ:T„ÔëŽ)yýú‰ÔX†`!ˇ  ÔÄÜĚÔě1ˇŠź Š /ě2ôě04&#!5!23!5!&n†ţZ¤ăÍŚűŇÎy–ôţňţ1CZ`Gˇ ÔÄÜüÔÄ1śBŠź /<ôě0KSX@     í íííY4&+532##n†Œ’Ü̒Ç[ţäŮË^ޕôţň<ýŢSţ­"Xh`$ľÜěĚÄ1ľŠź/ôě20@]1#!5!žşýtŃü/яşd`4@ FN Fü<ěôěě1ś Š ź/<ôüĚ0@ @P`p]!#3#4&#!5!2sššńšn†ţúăÍŠývy–ôţňşt`śFFüüě1˛ź/ô0˛]!#3tşş`XŚ` #ś  ÜÜěÔĚ1ľŠź/ôě20@ ]5!"#7XNrXşGя–Âý‡y Kşd` (@ F N Füěôěě1ľŠ ź/<ôě0@]!#4&#!#!2dşn†ţ˝šúăÍy–ü/`ôţňş˙ăż`*@ E FüüĚÔě1@ š Š źŒäô<ěî0332654&+532! şş•ł›Ż„w„„Äđţ˙ţţţ÷ů`ýęţýŔČëĹҏţęţđţĎţÚ/şÖt`śFFüüě1łźôĚ0˛]#3tşşÖŠXţV` ,ˇ FN Ôüěä1śŠź˝ äôě0@  ]#4&#!5!2şn†ţúăÍţV#–ôţňX` @ EN Ô<ôěě1ś Š źŠ/ěôě035!26&#!5! #Xt뒦×ţŒŔŰřňŽŸ’ţřţŘţżďX&@ F NÔěôěěÔě1śŠ ź—/ěôě04=!3!#ţTýťţţŹż“[ĹCţLţŹzţčlţňşd` )@ F N Füěôěě1ś ŠźŠ/ěôě0@]3!2%!4&#!şúăÍý6n†ţž`ôţňý˘ę–Xž`^@ F EôĚ99Ôěě1@ š¸Š ź/<ä99äôě0°BKSX@   ííí íł 99Y"#673632!5!4&ţáWWHşFdĆŮašŕĹÍýÎxŠѧ§“ţđČ €€ôţňý˘ŽĐ˨şţVt`śFFüüě1´˝źäě0˛]#3tşşţV XÎ` %ˇF  ÔĚÔěě1śŠź Š /ěôě0@]4&+532!5!n†”’ăÍýŠźy–ôţňý˘X˙ă(` *@ E ÔÜěÔěě1@ š Šź Œäôě2î0#5! !"264&+"ʸ ţëţýřöŔéě×яţßţńţ´ţ˙0ţDľüĽţ_ţЍN˙Oé`U@ F ÄÄÔ99ěě1śBź/ä2990KSX@  ííí9í999Y%67676535673ßVGu"ş,:ÉpĽÎˆ‘LŢƒ4U›}*÷ţÖţđŻëp>1=!ą"$şţVd`1@ FN FüěĚüěě1@ Š Šź˝äôěÔě0@]#4&#!;#"&5!2dşn†ţ˝\pTQ•óúăÍţV#–đU;zŔdôţňşd`,@ E N Fü<ěĚôěě1@ ŠŠź Š/ěôěÔě0! )5!2676&+;#"&5ş€*ţ×˙ţ€4ă×Ýâ{\Lwuqó`ţßţńţđţஷëćťđU;zŔCţVp`D@ F  ÔÔě9Ôěě1@ B˝ źä29ě0KSX@ í íY#3>=3#şţÚÍŘq_¸Ľ¨ţV`Şţ}՛˛ńÚC!`J@ F  ÔÄÔÄ99ěě1śBźŠ /ěô<0KSX@     őő <=3!5!CÚcMg¸śXCü"œ`ýú‰Ô›˛ţůÄţ:ŽşţVÜ`,@F Fü<ěÔěěÜě1ˇ Š ź˝/ěôüĚ0!#76654&#!5!2#3äl)ţW›zýŽBË'â*ýËşşu,/ŹH‚‹čÂVvţâ.ý¸4X` )ˇ FN Ôôěě1´Šź/ôě0@  ]!#4&#!5!2şn†ţúăÍy–ôţňş˝`/@F Füě2ÔěÔěě1@ Š ź Š/ěô<<Ôě033$763 76763)şš :š0nţ‚LœÇaƒš„ÝţTţĂ`ýńąSţĘlűţÍ+7ŸÔüýíÜţˆ`+@ F ÄÔÜěÔěě1@ Šź Š /<ěôě20!#4&#!+53265#5!2ˆşn†ţöŁľdDrLź~ăÍy–ýĹÖŔaŚ;ôţň˙˙ş `')–)˙˙ş `')–-˙˙şÖ `'-–-şä™`@ ´źDÔě1ôě03#ŇÇţş™`ţ„şän`@´źDDÔěÜě1ô<ě203#3#§Çţş™˝Çţş™`ţ„|ţ„˙×Ü"%0#4'&'37676537653#"'% '##5ą rb{ .q & q-aT !ýö}ţÁBýŽs12j˙î{˘Í@E#$]} qŤ!<"iúĹbP-üF`˙×Ü)*5"2767#"'&54767&'&5&76 '##5¨M@V:118UF%/>7P6.N@?^G?D)7-#ŽFý–}ţÁBýŽs)^ &# \*$@.") n F>]KH*!#TH#úĹbP-üF`…z %3#%3#3#%3#Ć´´ţ>´´ý´´” ý^ úúúúúúúě…< %3#%3#%3#3#%3#ˆ´´ţ>´´ţ>´´ý´´” ý^ úúúúúúúúúěŰě!#53ŽÓ¤RŹ@ţŔüýń 327654'&+533676Í7N5G4ŻpQf$h?FA@6b ! ¨eţżI(R[2*Ű #53 3#ŽÓ¤RÓÓÓ%Ź@ţŔý-ţ“°đ$%#5754&'./.54632.#"źË'/XZH߸gÁ^ałOlƒ39ZZ8ţţţ“{4<5/VV‰LŸÂ89źCFnY1^5YV‚ešŁUŢ"756767&'&54767632&767Ł/SD4Ž35gcbnZdF31`Č9:H:ZÍçU°!LOTAKv?=š0ps2#šn˙˙lţ Ă'{˙R˙˙‚ţóŔľ'z˙ôţ>oÁy3#Á¸¸ůě˙˙‚ţ˘ë&‹}9ţ˘˙˙‹˙Ć &m~ú„˙˙‚˙ěë &‹~źŠ˙˙‚˙ěë&‹źŠ˙˙ţ (f&X}ţ (f$3  !27# '&5767"Ă$ÄţÚ×ŕJKÁԖúţ^ЃÔ`‰eŸ~h'?6š§Žţű‡`¤v¸c–ŕße4-˙˙ţ (°&X}?}˙ÚR%67654'&'3#"'532‡Ź#ţ˘›—¸€Š˙˙˙Ťţ bś&\}q ‚ţ î?%#&'$473327676'&/3327653323#"'&'üT…ÁPx€mţíi¸l“_Qb_y^@@¸$;sR,%¸@nޏ\Kf% I0Š1_2F„,łkŞ>GHö´ÎÜł&%0žlŽ}=ęœJ<zgÂÍ2Š&ţŞÇq\ F{Ÿ˙˙‚ţ °&^â ‚ţ ć2?#&'$47332767654'367676)"'&5"3276'&'&XîPx€mţíi¸l“_Qf[˘+!'Ť (s{~OQ}aş¸Ęţäţě&4-ĄL~¨‘ťíť‰%ň›MGHö´ÎÜł&%DŠl“Š7(2’ln6"%GéŠmxşŠQlÂ?[F‡˙˙‚ţ ś&`}ű Ü %3276'&'&#")5!3%632Aťíť‰%0PząuýÁţ‘o¸Ů\Dxfş¸Ę¸?]D‡Qxţ’¸\ű?c!'EëŠmx˙˙Ü&b}ĎRuţ ˛**!27# '&54767&'&54763"32767SwSÁԖúţ[ŚbWqM3/XĚ|üĂt]0-.()žţţďěŃąžv¸cźoÉąeƒ8‚ĐMŠA4hKE¸•ƒšu˙˙uţ ˛F&d}w°˙ěl¸#5!€¸¸˙˙˙¤Ÿ&Ą}ő~˙˙kţG›&Œ~R~˙ČÇ!=#"'5327654'&'&767663'&'$54733276ĐJ&P DfXRNB8D-<9"5Œţ^ó.327654'&'&#"&#4763&547632#bzL,5;(.;Dn2KČxAZ˘M\MOśbxX˛'*9:X DD(ÁNOţě­f7*(”„?$S§-8’AP˙˙“ţľHś&§}? ‹˙Ć Ţ"327654'&'2#"'&5476ťB!799[]KB{˜Ćś“Ľ„`Q§%T*WE{R,,9.UMAxł |”ČKU#JďľNš˙Ťţ @† &"34'&!5 767"'&'&547632î?,3/ŔV%.Ź_]Ŕţ“g†¨>v-–(tYh‰YH‚Ä9!$3/,¸;ţôţĚ X*V¸L_” !"b‰Wg3Zf‚ţóŔJ6%#"'$47376767654'&'&'&'4762#&'&'&VfţŠąxHţŰ?¸B¤a=~ąT;~BrC:@ž_Đ`¸ B(EN><}ř9M ŞI&huqƒc“- !P85J.39s–J%*=­=!'&"7*S@UYD˙˙‚ţ ŔJ&o~ôţ Üş$š5%5%ÜHý¸HŞn‚nţŽn‚nÜş$ý&567&'&54763233"/#"'&5332767654&#" %!lE?I(7 /4KU^r8Z #08Ÿ " -d$* 9^W4'6O'&n=NVš)qaKî" %Üţ$˙ö5%%5%ÜHý¸Hţn‚nnn‚nÜş$Ş5%ÜHşn‚nÜš$ý-&'&5476323"'&'#5276767654&#") lE?I(7$# +Eȓ˜‹V " -ş 8_W4'6O -n=*{nmp" %Üţč$˙Ř5%ÜHţčn‚nČË8ô(#"'&54737676533254'3'&!9EO)"a 2=`YG g -SG„L(E?4mmb}8T"ŞRY$6ĂŽs9It…6Y !ěá 4&#"32>"&462–X@AWWA@XzŸćŸŸćô?XW@AWXłć  ćŸ˜šhÁ732767#"'&'˜ gC*6:)kXZZC5"LMDĽ6{S )L}@F€˙˙OżŚwŐ˙˙˙Oţ Ś˙čŐřÚóî 4373śĂ‹‚‚‹ĂîFĂĂţş¸Â”ź3#¸ÜÜźúź !#'3ź´%1œÄyI ŠÜ!nţÝţ”›Rđ#'337673#"Ś ´%1œÇBR´{6´)cóoajr›ţŠÜ!n›˜•UPymţúL%#'37676537653#"'Ť ´%1œÄ/(/H´/; ´'G›… 44.5WYžţ9ŠÜ!nr|> @2ŚŢ%,*ĘţĎ;l>3 Ż˙ě§ *"2767#"'&54767&'&'&76#zfˆ\MOY‡p0;JcX~VI|ee•pdkAXH,7âp ¨4C@#90¤L@rRiUZ‡hÔŔŽÇsBBsÇŽŔţĄëłţËuu5łëaUň#'#"'532N%bÄU`ޞ§´ĽŇţÜţŸţëţ†DK*‘2´2<!&'3673ĚbŸ~ĚZ00ZšÄĽxUö:ţćţĘţŨ ¨;6ţÓţIţĘú<3#&'#6Ě´UxĽÄšZ00ZšÄ~ŸbúţĘţIţÓ6;¨ ¨ţĹţĘćţ:dň#"'&'&547632#54'&#"żÎ=­:i_{•š\ %ZÄ[,,G\O98<SGU37e{a}Uwڇ–ţÍţ¤œnWl42@B^!xţŠ–$%-`+-!d! M fM˙˙‚˙ěë™&‹I„ý¨˙˙‚˙ěë&‹9„˙˙‚ţ ë&‹9˙˙˙‚ţë &‹'~źŠŽŠţ˙˙‚˙ěëś&‹€ź ˙˙‚ţ ë&‹€ź˙˙˙‚˙ěë&‹‚ź„˙˙‚ţ ë&‹‚ź˙˙˙ţ (Ż&XzŠ˙8˙˙ţ (Ş&X?˙˙ţ (f&X~Š˙˙ţ (f&XŻ˙˙ţ (Ş&XÂ˙˙ţ (f&X€––˙˙ţ (f&X‚–Ż˙˙˙Ťţ Á/'Iźţ>\˙˙˙Ťţ Ér'|źţ>\˙˙˙Ťţ &'|ů\˙˙˙Ťţ „°&\ô ˙¤ŸŮ:654'&32! '$&73! 76767#"'&54767632ľ)B,4((7(*HłnţĂţďţáţقţˇ@¸AËZAŃ×d#?z…Kb–NLZB`.+M;3*)3P&ţÚ´F=)d Š\^ˆtL"9;l&NKCW4,”E$2Hf6‰â˙˙˙¤Ÿ&Ąx~˙˙˙¤Ÿ&Ą‚xx‚˙§)-%2767654'&54767#"'$473¸Â$6ţĘ2 #déý­Gf>5ţ÷ăĄŔ€ţś?¸AËhXPA7.EB|=Q#!w*6şú(  %ţś{{qeVUI&b Š\^ˆ~B"˙˙‚˙§)+&¤ĄĘ˙˙ţČÉÄ&j|ꐓţľHî#"'$47332767654'3HdnůaP„mţ¸/¸1É]]LGÁL"f¸h8­˛ĹD%jdëQŹí45Ţb`¸Ţœ˙˙ţ (°'€––&X}?˙˙˙Ťţ @r'|˙ôţ>n˙˙‚ţóŔJo˙˙‚ţóŔr&o|˙ôţ>˙˙‹˙Ć Ţm˙˙¸Â”ź}˙˙ź~˙˙Rđ˙˙L€RĹ%'&547632&767#"'#'3ČX\lTX\D8/0EĂ=’ ´%1œÇBx:=œ$!"4'´Qjr›ţŠÜ!n›8j˙őâ$(327654'&#"327#"'&5732#"€-2!WZWXZV%2-Z(‘ .5_łŞŸž_52œ‘ZĄJkV×ŘŕŕŐÚ<…JĄĐ•ž¸y&ÄvţŠťţŃ‹ŚžĐ 3767"'&547632&#"327ĐAoDdN.†bpŒxXWs>0B7,gŒ`áp†5˙ľoU%m—Žao´3/AbM3))´I˜ˇá˙˙<„˙˙<…˙˙dň†‡˙ăđ (@  üěôěě1@    ‘Œäôěě0"32$  ‹œœţhö ţ÷ţ ţ÷PţÍţĚţÍţÍ3343 ţsţ†ţ‡ţsyzáZŐ (@  ÔěĚüü1@     /ě2ôěÔě0%!5!3%=ü¤JĘeţ™ŞŞŞ+H¸Hűá=Ő ˇ Üě2Ôě1ś  /ä2Ôě03!#3uČýlČČçîýhüĂŐţá=Ő ś  Ü2Ôě21ˇ   /ěôÔě0)5!!5!3=ü¤”ýl”ČŞšŞČá=Ő ˇ  ÜěÔ2ě1ˇ  /ěäÔě0%!!!3!Š”ü¤”ČýlŞŞ ČüŽá=ŐľÜě2Ä1ś  /äÔě0!#3!=ýlČČ”Öý*ŐýŤá=ŐśÜěÔě1ľ /äÔě0!#!3!=ČýlČ”crý8ÖAŐ'ľÜüĚ91´/ěÜĚ0ś‡‡ěě#3Aý“ţÉSuĂüNŐúŰĹÖAŐ (ś  Üü<ÜĚľ  /ôÜě´Ü<10%!3!#ŸţţÉɢý“ţ°ţ ĂüN{î 2@ EEüěܲ@]ü9Üěě1@ • •‘ /ôěÔ<ě02>4."#&'.4>329[œ¸ZZ¸œ_ČPGr……䆇䄄rEMťp`77`p_88úć 1§Ĺ§bb§Ĺ§1 ÁyŐ@ Żüüě1/ě03#Á¸¸Őú+q˙ă!“/@ E  EôěÔś 0   ]ěě1@    ŒôěÔě0 6&    šššţúţŤ†ţëţz>ţúšššţ†ţëţzţë='Ů+@  ÜÄ2üÄ291@ /ě2903#3˛łÂţç¸ţçÂ6ŁýQüÖ*Ż=q33# =¤ú¤Ăţ˘ţ˘qü˝ýCşq @ üěÔüě1ľŁ /ěô<0)3!3ü9šUšqý"Ţşq @ ü<Ôüě1ś Ł /ěôě0!5!!5ü9üňqü“K“qOâ!>@#E E"üÄěܲ@]üܲ@]ěÄě1@ • •‘ /ě2ôěÔ<ě0%!!5!&'.4> 2>4."ź‡ü:‡RJr……ä 惃sKRţQ[œ¸ZZ¸œ“““{ 1¨ĹŠbbŠĹ¨1 Ÿp`88`p`88şŚ %@    ěÜüÔĚĚ21ś   /ěÜÜÜĚ03"3#!5!ň„…ńpü9Çœ fšžüř“qçî2@ EüěÔ<ě2ÔüĚ1@    ‘/ôěÔ<ě2Ě0!#!##"&6 54'&"3qvšţCœřź°ąf^‹œ]8Ćmr^:ÉüŢţÄ<ÖUĺf˜ţÉƒ]8˜ĆƒÁDŐ '@   üü<ü<Ě1@    Ż/ôěÜě0#!!!y¸ƒţ5Ëßý!Փţ/’=ŔŐ '@   Ü<ü<üě1@    Ż/ôěÜě03!!!¸ý}Ëţ5ßý!Փţ/’şŐ %@ üü<Ôěě1ˇ   /ěěÔě0!!27654'&'2#!3œţĐ,R4,,=iXXXlýΚŢýľ]Oz}I_“‡_Ň­‡…ŐýœÁ$Ő;@   ôܲ_]9üÔě@    /ôě999@ ěě10#4'&'5!˝ˆ4B ¸5M‰ĂcAţďę¸ćţÉq™_–ÜÜ9V“= Ő4ˇÔÜü9Ě1@ /ô̲]ě촍]0 53#Tţ麸ßţÇö9ú+Áë!-@ #"üěÔěÔüě1@    ! /ě2ÔěÔě03432>324&#"!4&#"!ÁôĆ}x5%–ÓŇ^ˆş¤ZţýH¤Zl”ţîŚ˙K--ŇX€hý&|‚€Ĺ•ţncƒ§Ňň=‹Ő &@   Üü<ü<üĚ1ś  /ôÜ<Ü<0!5!3!!#ˆţľK¸Kţľ¸€”Áţ?”ü€=Ő9@  Üü<ü<Ü<ü<üĚ1@     /<ô<Ü<<ü<<0!!5!3!3!!#!ˆţľKšøLţ´¸ţ=“Áţ?Áţ?“üüşq!@ üěÔüě1ś Ł /ěôě0!!ü9šUqüq“ýľK=ĂŐ=łÔÄÄ1ˇB••/ěôě0KSX@ěěěěY! #ĆýtFCţ0ćţ0Bű~ú+ŐÁnŐ 4@ üěÜ<ü<Ôěě1@       /ěôěÜ<ě20327654'&+!!2/!!m¨]%i¤ţ ;°„@ED\ŒÔýTôqQE=4."ţľXEr„„rJS¸RJr…CEoJĽ[œ¸ZZ¸œOó“ţ{ 2ŚĆŚ1 ţ{† 1ŚĆSV/ţŢp_88_p`88Á}Ő @ üěÔěě1ľ /ôüĚ0#!#}¸ţľšŐú+BţĹÎÁ}ć #@   üü<Üüě1ľ /ÔĚüĚ0#!#3}¸ţľššâüOţü›ţüÁmŐ +@   ü<ěÜ<üě1@      /ěôěÔě0!%!!5!!z;ţ ôţ ŹýTŢýľK“ѓú+qOŐ $=@&E "E%üěܲ@]<ü<ܲ@]ěě1@ • • "#/ěÔ<ěÔ<ě02>4."%#&'.4767673 [œ¸ZZ¸œTXEr„„rJS¸RJr…CEoJR¸"p_88_p`88Î 2ŚĆŚ1 ţ{† 1ŚĆSV/ †qOŐ(#&'.4767675!5!!2>4."źXEr„„rJS¸RJr…CEoJRţľNţľţQ[œ¸ZZ¸œP 2ŚĆŚ1 ţ{† 1ŚĆSV/ ó““ýŕp_88_p`88Ůb/ö˛ÜĚ1˛ /ě0!!ŮVýŞö”Bŕžf#"&/#332?ž˘E=9Qc´‹ő”t2 %xfţź" %/Żőxŕ $â¤Dp˛/ě1˛/ě03#¤ĚĚĚżî=f7´uÜě91ś´łôě290K° TK°T[X˝˙Ŕ@878Y3#'#´”ő‹´´‹fţˆőő[îĽfEłÜĚ91ś ÜüĚ90ˇ  ěě@ Ueu…@ )9IUe]]!5'3Ľüś{ěśî”ćäBŕžf3326?3#'#"&'B‹x% 2t”ő‹´cQ9=Efâ$ ŕţˆőŻ/% "[îĽfCłÜĚ91ś ÜüĚ90ˇ  ěě@Ueu…&6FZj]]5%3%[śě{î”ä攚ţ‡f˙S˛/ě1˛/ě03#šĚĚ­ĚŐF'ľ/üÜě1´/<ü<03#%3#\ËËţyËËĘĘĘČuşˇ  ü<ÜÜě1´ /ěÜĚ0#527#53şň„…ń€ţőgšžČuşˇ  üÜÜ<ě1´ /ěÜĚ03"3#Čň„…ń  gšždűś ÜÜüÜĚ1ľ /ěÔě03#!!×ĚĚţłüMűĚýd“dŢ '@  ÜÜ<ü<ÜĚ1@   /ěÔěÔě03#3#!!×ĚĚĚĚţłüM„ĚěĚޒ˙ě÷“łÄÜÄ1˛ /ě0'!! üő““ĹţćŚ'(033!!3'#67654'&67654&ƒÍÍÍţu‹dŃruxt‹NM€ńddx>DD>x˜II’‰ţvŠýçţ!ßý ţóRTšxŽXY…Ż`aţćŁţw,0dc1-ýëţ!:;z{t‚˙ëŰ{*L@$% E+ü<ô<Ô<<ěÜü@!#91@‡Œ$+<ôěÔÄ@ ‡(‡¸+üěěÔÄ0%"3254"3254#"54!#"543263 #4#"h??AA??A¸ůć'+ćć¨,L˝–¸â‰Wđ@@@@@@@@üÁÍÉĐpءQQţžüÇ9ގ‹˙݇Œ/@@1(. #E0üě<ĚÜĚÜü<Ě1@‡‡!Œ0‡%*‡ ¸0üěĚÜĚÜôôěÔě0"3254"54$3  !2632&#"# 54-654!"`@@@CŇvťBţ™ţîţĉըŸŠ†iUvËŤţ:Ö×ţknL?o@@@@ţěä‰ÄţŤţěN;EjfŽŐa‘ůďe:.šş88U؉˙ěôŒ8327&'"254"%47&5476! #4'&# 63 #"'632# i60IKhhţŻ*)…“7!‹o¸^RżţýX;*:ú9ŤĚĚţu`ţ/'"­€6OÔfqłţ÷ýżAź…tqLIţś $\9.ČślţQŒ!6@   E"üĚÜĚÔüÜü1@‡¸" ‡ ˝"üěĚüěÄÜÄ0463 #"&'7325#'&&7'6m˘ÝešÍÖt ˝"xŻ‚ŘĐÖCBCŚquýôýţůđЍ Ńóßh!Ď ACBB˙˙—š )2@  #&E*üěÔĚÔĚÜ<ě1@ ‡ ¸*%/ÔĚÔÄĚôě0"32654& 4''&5432#5476°$ % U%|{¸eČŮÚô6ţ™ăL¸j` %"%:yxţŮý~)ŽRڎŔh–††KKŞ>Ü‹ţ †Œ 65@$- 3 (E7ü<ěĚÔĚÔ<ü<1@ 5/‡¸7‡&Œ7ôěôěĚÔĚ"32654&4763  !27632! 54-654!"#"`$ % ő琺Bţ™ţ­űďy#x—”žJţiţ:•O×ţknLIżŇo %"%0‰yKţéţpjNdfďD×ţüţ”QcwţőůŘiC‘|85s˝r˙îô– *;@&%   E+ü<ěÜĚĚÔĚÜě1@"‡)Œ+‡¸&ź+ěôĚÔĚÔěôě02654&'&47&7'73%$ć$!% ţ­ĽŚlÜ݁6ZA“‹|¸ýĚýł• $! $ý˜Vmę-ˇĆˆ˝G4 Ąp¨ž?ýÁý´ş˙ăź{1@ FüěĚÜĚÜě1@ ‡¸<üě@ŒôÄÜÄ0%"32544!  #"54$32Ľ@@@ţšţľćëäÖ)ë@@@@ëĆĆţPÄČČŽĚvvĚüǁ˙âƒĄ .<@- " 'E/üěĚÔĚÜ<Üě1@ $Œ/‡-‡)¸/ô<ě2ÜěôĚÔĚ0%"32654&672#4#"#"'&#" #"53232l$ % L ™ň¸7*>(€z*M#6Őűň—&8"$ń %"%3|ţŠüś0ŰŻqi˝áţPÄÚŇ–WuŤ˙˙ţ˛|+?@-$'+ ,<ĚÜĚüĚÜĚÜüĚ1@ )‡!¸,Œ&˝,ěôÄÜÄü<ěÄÜÄ0%"3254"3254 #"5#&767663 #4!" @@@ţ™@@@Žäď!ŮÓ˘7yÁ-ž¸ţć˛^ő@@@@ö@@@@ý˜ÝĂă×ÇedŐmúŰ%Ł‹W˙îË‘ ,9@. $  )E-ü<ěĚÔĚÔüÜüÜ1@ ‡'Œ-+"‡¸ô<ěĚÔĚôě0"32654&4323254#4#"%$7"@$ % ţůć쐋ľś'(¸ujţ‘ţ’ŐÓř %"%@ŮŐŻˆ¨Ě°XţűüsghýŠţš\—_˙㾍"9@ $ E#üĚÜĚüĚÜěĚ1@¸ź#‡ ŠŒ#ô<ěěěüÄÜÄ0254#"53265$54767653!"'#W@@>¸z]Uţčâî]ƒă¸ţišTrŮs@@@@üpeœgĚÝŰýuŠą/üŃţ˛ssH˙îs|2@  Eüě<ĚÜĚÜü1@  ¸ź‡ŒôüěüÄÜÄ0"325447&763! 3%$5@@@ţÔśˇĺíţěMg¸ýáýőî@@@@ýRÚÄ&śÂź—ţѨË'´ýLţBH˙îs2@  Eüě<ĚÜĚÜü1@  ¸—‡ŒôüěüÄÜÄ0"325447&76! 3%$5@@@ţÔśˇĺíţěMg¸ýáýő@@@@ý<ďĹ%ˇÂ˝­ţҨË'hű˜ţBY˙îĚé E"32654&!"32654&&''"&5623253765$7465&'7$ % ý$ % K”fg´ŚœüÔţ鼤¸Ł›ţçÓרIJŇ %"% %"%üIKٚbáëÇţv„„4ţˋ‚ŒËî˜42@7-]fĹnţ9Ľ™ş˙ăh%A@'$ F&üěĚÜĚÜüÜüĚ1@‡Œ&ô<ü<Ě@" ¸—&ěüÄÜÄ0!"'# 432!32533253"3254hţŠ”fg´ţžýÓţ輤¸˘›¸ü>@@@ ţĂJJ=|ßëĚţ\¤¤@ţżŚ§ôýĚ@@@@h˙ď} -?@, (,$ E.ü<ěĚÔĚÔüÔě1@"&¸ź. ‡Œ.ô<ü<ÄäôĚÔĚ0"32654&2533253!"'# 47&5432d$ % A¤¸˘›¸ţŠ”fg´ţž™‰ćěčBŇ %"%üł§4ţËŠŞ/üŃţĂJJ=đŚ%žř܉ţńM§h˙ď -?@, (,$ E.ü<ěĚÔĚÔüÔě1@"&¸—. ‡Œ.ô<ü<ÄäôĚÔĚ0"32654&2533253!"'# 47&5432d$ % A¤¸˘›¸ţŠ”fg´ţž™‰ćěčBŇ %"%üł§4ţËŠŞčűţĂJJ=đŚ%žř܋ţóL‘§@˙ă`$@ÜěÜě1@ ź‡ Œô<üü<03!23! '#"543225“¸ů¸ţOţł)3śĆœ)`ý,ţíÔüĹţž88œ–{‹r˙îô *;@&%   E+ü<ěÜĚĚÔĚÜě1@"‡)Œ+‡¸&—+ěôĚÔĚÔěôě02654&'&47&7'73%$ć$!% ţ­ĽŚlÜ݁6ZA“‹|¸ýĚýł• $! $ý˜Vmę-ˇĆˆ˝G4 Ąp¨žÚü&ý´‹˙ďŒ ,7@  '#E-ü<ĚěÔĚÔü1@+‡Œ.%‡‡¸.ôüÔüÔÜĚôě0"32654&4! ! &# ! ! '&54323 c$ $ ˝ţ€ýÔ6bćuřĺţŒ’ýÄţŤ‡UÓŕKˇX $ $č8$Ü{ťŒŸţţ›nE{ËŇN%O˙ 0@@2, %&E1ü<ĚěÔĚÜěÔěÜ1@‡%‡/Œ1!‡*¸ôěô<ěĚÔĚÔĚě0%"32654&&'&'&5! 765! '676%&4% $  ,ŤD ăĎů)@ ' 1#-E5ü<ĚěÔĚÔü<1@ ‡)Œ6/‡%‡!‡¸6ôěÜěÔüÔÜÄôě0"32654& 4%$54!232#"'&#"! '&5432h$ % $—ţ{ýÝĄËajjh@”Mó§qKÍy)ýŤţLJmá×_œ‹ %"%ţů˝1EćüYl0ţ”xP^b8RţÂţsu_|ŢÚ]FĘţ­đĄ'"2''&'$!32'&547"32?6A€€ńS2;9ŠÂ’ ţhhÍÔÓÔ¤ÚNU×~œőţą €ű †+;9j–qÎÖĐ!ţţćBŚaŚŠţČ˙˙n˙塀' ýu úÉű_˙¨ +@   /ĚÜĚÜü991@ /üĚĚÜĚ0! &7623$'4'74"YýÇţśĂĺň#!A[VЍüŢB8?<ţ˙¨kŮŘP$U.FŠM?>={É{+@  EüĚÜĚÜě1@   ‡¸<üěÜĚÜĚ0 ##"2#"53254#"ˇ¸˙n=ÚĺáŚ;C>@{ţjýËVÁÇÇŽţR777˙˙üšÉr&" ű@ě˙jiˇ  /ěÔÜÔě1ľ  /<Ě2ÔĚ0! ! !5 74! űţ%ţ&ţ?ţşţ˜%ť~?>ţÂţÁ~ťĹű@ěi$@  /ĚěÔÜÔě1ś /<Ě22ÔĚ0! ! 3!5 76! űţ%ţ&>ÔýŠţšţ˜%ť~?>ţÂwJ~~ťĹű@ě˙ji*@   /ěÜÄÜÄÜě1@    /<Ě2ÜüÜĚ0! ! !5 74! #5űţ%ţ&ţ?ţşţ˜ßî%ť~?>ţÂţÁ~ťĹNÜÜű@ěi.@  /ĚěÔÄÜÄÔě1@   /<Ě22ÜüÜĚ0! ! 3!5 76! #5űţ%ţ&>ÔýŠţšţ˜ßî%ť~?>ţÂwJ~~ťĹTÜÜüţý3ţś˙˛"36654'#"5432ýî‚AA\(DłŞeN[ĚźţĎo[$žşN[‹uÖü§ýŽţČ˙Ż%@ /ĚÔĚÜĚÜĚ1@ /ĚĚÜÄÜÄ0"3254"547&54323253ýró>Juum‚ž„˛ţ@’s> [yu?{EBXFţşĂű_˙¨ '656%"'&76! 4"3Y¨ŠVţĽA!. Ůĺ{x9üá322674&#"ŽCC›ňčĚjFPˆH OQ˛ľ$!%!˘p'(FnäJv-Oý!3]ď $ $˙˙z˙ăČ{&0˙Ó˙ö1, ("32654&&3 #"4/&5432N$ % ţ¤s $ˌeÓű‹qɘzm… %"%ţů´ƒľţçĎ82Žş´‘yڜţ,v\˙ăë#"6@ E#üěÜě@! ÜěÜÜĚ1@ ‡˜#Œ#ôÄÜÄüü04$54%&&5! $#"57"3254ÂiţŘó xÜŤäţâďď@@@ç¸ÜXş¸4 |ě`Pţ°¤Ůłý÷ ĺÜÝ?@@@@ź˙ę‘ ""32654&5&'7!$#"47#Ž$ % ţdtŚ„.;ŕŐűœď %"%ȈÄ_řp•˝Ź˜ţ‰ ńĐ8>™u“ţ%˜t/;4#"#"'&#"$#&532327632! '&57"32654&ŕ"3C2z7J,"Óűś…/IN\=0‚śBWţ–ţĄTO˝3HýŠ$ % Xt\DD\t] ńĎ5ö<\UCţţüŞţ÷fˆwpv Ę gH %"%ýńýĆV@/ü1/Ě03#ý´´Vţ›ű~ŕ˙Ł!'@ /ÔĚÜĚĚÜĚ1@  /Ü<ĚÜÄÜÄ0'6"%)56574 65ü+*+ľ×ţ„ţUˇ‘Gąóm++),}ĺţ݅.pˆƒˇ\(úű>Ç.ó4"!27676327673!#5654#"'&'&#";&543ü.đ%2~*&IHHܝ„BO™g(ţâĹĐLBC]i%>’e>.`h>3Č‚A?×~= h‚\$…kb8:;-FĄ_Zkf2)üNŕţŒ !@Š /<Ěü<Ü1@Š /<Ěü<Ü053533##5üN؎Ř؎¸ŽŘ؎ŘŘ˙˙ű Püšöţ>r@ /ĚÜĚ1@ /ĚÜĚ0432#"73254#"üšÔĐÔЄLTPPž´´ČČHHH‡˙ă` " 7654&' ! '&476‹^L:NbX1ˆcoŒţ÷ţí€qo’Ŕ„hł˝`™WŽŁü Ä’éýŽłĽ”ć•Äc˙g¨œ&24764'&#"676'&'&5476 ś€ ňŇpHź’gc/5pŘä†I´u ŚţÎö€€ýę‡uËpHECle\gâÔUÔܚ‰su—ČýϨ‡c˙y\ą$24"27#&5432# '&5?$5+€€rĐ%3Ýŕí]fÜţ́ŚĎÓ¸ţ”Ů|pHF€ţPśĆŘţäđfou—ČT˘ĽŕéţÇţĺŠaţűpH˙스/%24'$5432327#"'&#"%$'#"5432253âśţśďĄ3]L/|€tžkZ1„AQ˝ţfţÜ(3śĆœ)¸ƒDjžR—Ćć:jÄTţűh8KOČpĆţtţ$68œ–{‹‘ýÖţíc˙WÎą%24"$'&5?$532&'&32!€€­ţâţńţžrŠĎÓ¸ţ”Ů|T9ďlcŮÔě ~x˘˜€ý?Lv§T˘ĽŕéţÇţĺŠaţűmY<ĹĐäŘÉÇKc˙WÎą-224"7&5&326532&'&32$'&324!€€ýBĺ‘äűœ¸ł}b$|T9ďlcŮÔě ~x˘ţâţńţžrŠř=C˜€ËhĄ(Şç­­˘˝ë¤ ?fXţňmY<ĹĐäŘÉÇKLvČttY˙îô4@'&''"&54323253765'$543227#"$#""32654&˛Ľ”fg´ŚœýÔţ鼤¸Ł›ŮţŹúu ^|€u˝IţňSL\ßü>$ % ,Ľ™IKٚbßëÇţv„„4ţˋ‚jEašŘŃüĂTţűůW8ҋţž %"%‚ţŰ{ &%"324"324#"54!#"543263 #4#"h??AA??A¸ůć'+ćć¨,L˝–¸â‰Wđ€€€€üÁÍÉĐpءQQţžúŰ%ގ–ţRpt MU"32654&254"#&76767%4#"#"'&#"$#&3232763276'767‰$ % ĺnnţ´vp†+-•"2D2z7J,"Óűś„0IN\=0‚śŽJŘ%•.3?­5xvţ„'ށQœ %"%ýž933šhk//3wáąt\DD\tţß ńĎ5ş<\UCţţýČrT­Ť”F-2bG;ţĐ"‚b,i˙ö÷’ $5354#" #"524"Ĺm~¸ţŔţĹśĽÓýŹ€€‘ţšýŠejüsűţX°¤ţ\Ěëß|9ü€~˙çÉš LX"327$"3273253!"''&76324%$7&76%$5#0#&76262654&'&¨€A?ŕ€A?‘fx¸ţԅ$8ŸŮÄ$+Rb,7ţHţŁÂĺîuŠ ćÓ˘5r—ýô$!% @@@@@@@mýӔžJüśţžceĆÁă“$3ýÖţł- Ó/™×ԋuŠţęŸľ˛ îÉcdűę $! $~˙瓚 I"327$"3273653%"'%5254%$7&76%$5#0#&7626¨€A?ŕ€A?‘ Tc¸ţéb*@ţÖŰRX6&$ţHţŁÂĺîuŠ ćÓ˘5r—ý@@@@@@@mýo6 Jüśţ˝,/¸Ěáƒ7'ýÖţł- Ó/™×ԋuŠţęŸľ˛ îÉcdPi.".54>7!5!!"32>54&'7i7eŽŽĘÚČŹŽd7&KlGţÜęýqǔVXšĐxyӚY˛lĹŤŒc66c‹ŤĆlJ˜Š7ŔŔ^ŸĐsz֟\[ŸÖ{6yEr2b\TZ@#!#".54>7332>53!w!KNM#hś‡N&?Q*Đnq-Nj=8kT3Č“$ Kƒ°fWxc*s÷@nQ/+Lk?řúˇ¸Z˙Ň 5!4.#".54>2!ţ‹/A%'B/+(Ľ=B=iŽ ‹f:yýý'D33D( R0oC‰EOˆc88cˆOü'ţMPĂ.4.#"32>7#".54>7!5!!÷"@YmEgł„LL…łfjľƒJĚkť˙“ţžoXŘý´qý´؝XŞG†xdI(Y”Ăjiś†MK…ˇků¸ii¸ůŰŤuĹĹu­ŰZ8!4.#".54>32i+Kg<>lP-7:p0M6Nˆˇif˛„L>@kK*0Rp?>†?˘1ill3e˛„MF}­gűÂZ,#!#4.#".54>32!|ţÝĎ/@%&@0&%•BE;hRP‹g;ÓüéŠ(C03F(#P/M‘COˆe96`†PŰţFZö(4.#"32>7".5!5!>32&/Oj=kOýO‡ˇÎ´…MţEŠHŽHjˇ†MŞ€oP.)NpF@pR00R°fł…LL…łfaśýn0/I˛P- %#"3!!"$&546$3!!ŁJ˜×‰@@‰×˜ţůţóÇţŘĂ`aĂ(Ć žş] Ôwxԟ\FüéwϢĄĎwýÍţ2P:G!!3!nýâÉ!.xú1Z+(4.#"32>#".53>32`+Li=?jM*,Ni=>hL+„™iłƒJÉEŽMf˛„LK{W06\xCKxT.4XwýA_bK‰žrţŸ62N‹žpü˙Zö+4.#"32>#".5##!>32*+Lk?AlM+/Pj<@jM*ĚK„ľihśˆNëĐ€IžHkľƒć?pR0,PpEBnO--OnŠÎ˛‚KK‚˛gcţBvýj12K„Zţ+"32>5!#".54>3!!5!!Q@lO--Ol@>iL+Î˙M…łgh¸ˆON‰ˇiý‚LÁ.QoA@nQ//Qn@/ýůţŃe˛„MM„˛eh˛‚J{¸ýÍüP‚S$!4.#"#4>3!!"632ˆ,Mh<>e-PÉK„˛hŽţr>iM,‘f˛„Lč?nR0*'R}ţ gł†Mś1Tr@§aK„ąfţPţťc K4.#"32>2>73#".5#".54>2™*Lj“OwϙYV˜Đz|՚Xš0/'ť:Yr?DsU0 E nÇŹŒc67dŹĆŘČ­e7><qU'!R–‚kL)[ŸÖz{֝[W›×üě.>#K€]59_|D 6cŒŤÇlkÇŹd77dŹÇk{ÔZ'kE"1%P#".5!5!2>53K‚°eiľ…Lţ˘*-Nj|fH'Ďče˛„MO‡ľfX¸űđAqT12Vq>P&!#"&'.5467!5!32>534J“EpŽ=AB7DţĄƒ4+! )#$+e;:iP/Ě—05IGHŹeLšJśŤ )RpEn),/,Nj=öů˙Z""!#".54672>53!`ţÝN†´giˇ‡MNL™6--Nk|jN,Íĺ+ěţŃe˛„MK„˛gVˇ[„@n6@nQ//Qn@ýÍý]‚S#".5332>54&'7SL„˛fiłƒJÉ,Mi>=iL+>5{-H3če˛„MK„˛gűç@nQ//Qn@6|>œ/dfd‚S 4.#!!2>7##!!!2ˆ/Oj;ţć;jO/ËJGHܓ’.’üĽăg´†M@qR0ý¨,Nl?dŹEHCţˆşM†łPţşbF4.#"32>5>54.#"#".4>32™Y›ŇywКYXšĐx‚Ô—RÉ6a…O"?/$/ .@KZj>mČŹŽd78eŽ­ÇkoÉ­‹c5[])D0z֞[[žÖz{֞[Wœ×ýwAoV5ł'//!6cŒŹÇŘÇŤŒc66cŒŤÇlƒúv?GOPb 14.+32>#";+##".4>3!2™>m’TEET’mýœFU’l>>l’UFk\˘Ü€EĚF€ŢĽ^^ĽŢ€W€Ü˘\YŞ–qAüĚ@n†@o–WV•n?—~ٟ[ţŁ][ Ůüڟ[]ĄŮFä!#!3!3!ţßĎţËĎéüéŻř3ýÍţF‚S!4.#"#4>32ˆ/Oj;53`E“IgąƒJÉ,Mg<:iO/Ë”02Kƒ°fëţ>mQ0,Mi=řů˙nB-#".'332>=#".533267653BL…´i`Ş‚RĘ0Lc8;jO/FŽIiłƒJÉ,Ni=:c'YËčg˛„KS˝kFzZ40Sm>Ş1/J°gíţ@mQ.+(P|ú‚S!4.#"#3632ˆ+Kh<7g4QÉɑ’eąƒL|?nR0++N|ýuţaK„ąfý„Pk*!5#".54>32.#"32673°YŞUlÇŹŽd77dŽŹÇlpŇs[.\YS$wЛYXšĐy^ŞPťr2@6c‹ŤĆlkĆŤ‹c6JHž,ZŐô՞Z;;xýXZ)"32>5!#".54>3!3!Q@mO--Om@>iL+ĐţţM…łgiˇ‰NN‰ˇiÎĹ.QoA@nQ//Qn@/ýěţŃe˛„MM„˛eh˛‚J3ýÍý5‚S !4.#!!2>7#!!#!#!2ˆ )ţ4Ě)Ë2VsAţ4(Ŕţ˜É•AsV2Ş*=&ţĆ$;,S~U+şţ 9ţ/XZ.?#".'332>54.'.'.54>32#6.#".Kƒąfb­…TĘ1Ng:jN-VU^Ć]4R8če˛„MR˝lHzY3/Qn@72*63•Ueł…MTżkH|Z4/Rn@)D BFRZ‚S#"'!!332>53SL„˛f•‹’üĽÉ,Ni=53 K„ľihśˆN˙Đž/Pj732>54.'.54>32#.#"]ĄÚ~|ۤ_-H3’K7>k‘TSj==jS8mV4/Rn@8gQ6Í';#wŮĽaL~מY[Ÿ×{:omn:vQŠNV“l=53 ,T,PŠf:l #D;%?.Ěa=4.#"32>7+!!#".4>;5!5!54>2Ÿ-  -)//?%&@.Ż%?/ç:fŠPŻWţŠ2WvCDwX22XwDpţĂ=˝áíęĺ ýô Ó@Šx˝Y9šlţY…ţ|ţPţWô!%! %674#"&5! % %óţ1ţ,ôlŐˇ‰._‹z˝ţđţč+ţ,ÔÍSŠŽ‹.+RLo ţۤTnţľ8ţÇţŔdţ`ă'675$!2363 ! ##&!"#"32CxţšuçM6ţŽţsţcŃČžěź*ţ›˘rËÚööÚţęE)ËÝîÎŘţ ýűPţ˘ýçlaؕy°Zţ§ţ“dţXŹ!&732#"&5 Źţ]ţ[*łçčĎä8F›Œ‹ ţe’]N/I3ţü^@Ţ[7œrˇrţ2dţXŤ'!&732=6+537#&5! ŤţnţN ˛řÖĹggşĎĐˆG‰ŠĺďVţŻzkB3L.íĎڌú˙Ę@JKW~XţqŰ\,˛d­!$75&7! &324'"6­ţZţ^  ,CH!żęăăčŔ €’ůţřIJ:éQţ˝›U,ţX\ţ¤ţ•$ÔÖÚd˙üý56#"! !2363#"32ýţUóÉÎţTţcŸ÷D>ęƒüôěâŕî0ţR•^<]ţ€ýřźźýő€ţţtd˙ěŤ'6#"$! Ťţę+†ćčƒ.ţ!ţT‰uŽeţ›ţěŹuŠŤődţY­! 473254+5365!5 ŹţWţb¤ ćí퇇ÚţŒ2ţ˙ţm“NEIJţú(ň˜ĹţbĆC+ţřdţ`3675$%2363363 565&#'#"#'#&#4%"fDjţP‹ŐQUťËOR̍ţ‰žÓŰ “ ËĆ ‘ ŢÎ…ĄŻýTÇgˆ@! ŤŽĎޏş˛ţ5ţ„‡§yă<ţ÷řřţďřřţšţO-ţ‰ă6ˆdŤ! !234#"#!#"2ŤţmţL¤œCóŔť{Ł˝ćçűŇŰţ%  }>ą×eţÂýŤţ‰ţ~‚Ëű! )!363#"7ËţYţ`°ţPlB¨źěëëî ýóĺ  rţž€ýřyţ_ţ§d˙öß56#"#'#"$!2363 ŢţHúÇć“ ĺĆ÷ţL†éDVŰƒţz’–a!tţÝüü#ţŒţër–˜…ÂÂdŹ!! 4732+53274'$53ŹţXţ`4§"çęęgzŻďţŇśď/şçîţžc7Qiţěb6‡Č•!6°G))ţűË=HdţYŹ2! 3325 '%5%ŤţUţcŔÚřţ|Óţ Cţ˝Gţkoă Š4YîţΧŒ_nd˙öó9$5$#"#'#"$%7367 óţ>ŘŢ  ÝŰţBÇdž)ýoœŮQTܐ7ţ-n–gDPţËîî5ţ°ţŔk–nÓ1˘ wţÓ5áá‚Ëń! 3324&547ËţcţTśřáɜW\îýýîüţ‰wŘ ?”c-'9ĆdţYŰ: %3! ! %#d’˙ýĘýÁź†ţˇ‘ţ¸6‰*QţŤ&ýqý)ÝýŻQűGýĺF<ţYŻ!! 4732#"#'4+536363$ŻţWţe7¨%áů•„ … Ąnjł1HŽ:ţp¨|BZˆţüšÜËË܎š™ţmdţYŕ(0! 3! =4+5326#"! !2363 #"32Ěý÷ţš.JbhhvŻĚţ^ţ_œëLJßlÉľý-ůÝÝůDţ)×oĽ—űţăWţ(ěřĐĆţwţöO*źÚ|ţ˜ţŁdţY­ń! 4732#&3$!33­ţWţ`S%ăőöĎ}ţÜ{—F´ţpj]P0Gţü9dꏪ*,wkGdţVŢ(675$!236356#"#'#"#&%&,E[ţš‡×UQÉ—ţsÓÖÚ“ ßÍvąţđŻŽÇSÓ•óÂÂţKţgĽŞl+(ţíüüţ›ţ&Žoö˜G(ŸdţY­! 365## %3253­ţWţ`žâö3Żţ`:^Űăöłţtţüŕbĺ"Ž‚SűţŻë dŤ%! %34#"#54#532363 #"!2Ťţţ:Ÿ™I‘ƒ~V`z?:˘.ˇđâ Ćďţ 5Čť!#šĄÁÁţľý&•ţ‰ţ‚˙ěÉ'6##! '6#"3636úΚÁÜű˛_a¤źŻ?óőrţŰţräŰƒ)ţĹýľŞjţÇ`Mżęţř€hdţY$%#! 7! 6+532'6'&'3ŤÉţ)ţĽh*&ٚ’o{ˇZ‰…ËX?ţçţc#źěL‚ţcţÂţi2řˆęw/.­}.8dŹń ! !233#"32ŤţWţ` Ż2˛źëâăëýűýsNü‚ţvţ‚Ë%!236;'"#54#"363 ! 332#"‚Ë9@zpf~łe:ŁŸţ`ţWšďăáńń#ťťŁ Ă#!Ĺ ţ …ýăţÇţÇjŽFţYń%-! 4724'&' !33#3'6#&Žţ\ţ^U%ćéˆqYţé#M^¸˝R„ý……Ť˘Žţm“ahi Cţü coz49 Čýí;U˘U7HUihIľ¸­‚Ęń ! 3363#72ĘţaţXśM‡ ťčăçä ýó äýĄ„ýřyţ‰ţZţY˘×! 4772&'&'5%53%˘ţVţbZ,ŕţĂ=’dţœŻ´ţw“ĽxYUoţřË`yĽŞŒ´”Bţ…“ąšszbdŤ+! 5332'4'#53256+53274'&53Ťţ_ţZżâílľľdeľł[ŘéşŘ鐚”žhţ˜ eeţěÔŽ–zs˜„U !ĐdҌ/6‰~:_dţYů=! 63!2'4'#53654+53254#5325&'&'3ůţTţ76hšT%.)űhˆˆhfŠŠfhˆˆh›‘ڟœ˛˛˛˛ą˛|ţŐŘ+ ă?ţůţĺáţŠţł Ćކ¤Šœ„‘ŽR!"˛H61˜Ľ"(Ÿť&ˇ’0:dţóŹ27&% 7&'6#"•2đĄ¤ű>ŕ–Ţ•ćçěáöd$! %35#$ 3#3%#" 5;54 ŹţXţ`œîîţdHrrrţĐîŢĚţ4Ţîţ4śţąOfĄkQţŻŘ”Ą˛ÎÉÓcÖŘĂdţX2&!"'#!525#"3$%2363 #"321ţZ†Gţ\ććçřţK¤ćVOćĽŔéÝáĺýévŸţŽďBpţţœ”őţČČţpţʏďdţY_!! %$54#"'! ! 4'7_ýőţGD˜ľĽ `UţŻţČ6I@šbţY§srgźŸ8A:ţ¨ÔƒMţîţÜ){6\l‚ţYĘ(3324'7%#"'#723! ‚Ŕíßߍîţf–BđßťţcţVţýĚż0ýą?âţőţ7YăţűţpŒdţW $!6=3! 47$$5! eŘÎţžţڞòţŒţŞďţŒżţíţčkšţHţëŠužľŒLLţć8çTWJ˙&)ü*d˙ľ•54&#"'675&%'%"Št_‚C‚Ctâ¨ý—‘?ţěčh]˛|KytJfqIľ8ýŻ=žţŰŁĘ&*“ú2śś 5#5#5#śČţÔČČȐČČţ˘ČČźČČdő 2"4;%"4#"32;ĐŐŃšëţţFí|pux$ţďţăLľRQžÂ´şÉhŘ=@ B••ÔÄÄ1/ěôě0KSX@ěěěěY %##™œýÇĺýĆ.űœdŞú+Ő˙˙hK'œŔE„˙˙hŐ)˙˙hO'zŔt„ɰŐ@ˇüěÔě1ľBŻ/ě990KSX@ííííY sŁűłçÂüNÚýŐý‡ä˙˙ɰO'z)t†˙˙ɰN'r)u†˙˙ɰŐ'Śe†w^Ő?śÜěÔě1ľBŻ/ě990KSX@ííííY 5´ü]ŁŞűçÂţ(ţ&ţđxäy˙˙w^O'z1tŠ˙˙ɝŘ'‚5Ś˙˙6Ř'ŚĄ‚˙˙ɝŐ&Ś„5˙˙6Ő'ŚĄ„˙˙ɝO'…5Ś˙˙6O&…ŚĄ˙˙ÉEŐ'†•Ś˙˙ÉEŐ'ڰ†˙˙ÉEO'‡•Ś˙˙ÉEO&‡Ś°˙˙ɰO'zÉ0‡˙˙ÉóŐ'Š•Ś˙˙wEŐ&ŠŚ°˙˙ÉóO'‹•Ś˙˙wEO&‹Ś°˙˙w^O'z?0‹É •Ő3#ÉĚĚŐ̉œçß!38öîýYgg`ýŞnCü˝^Úĺˇ^nýç7€]ý€^Úĺˇ7ĺnýçn7]€]‰0­d"&533265453­ŸćŸzWA@XzCs  s!ţßAWX@+ö‰!­U#454&#"#462­zX@AWzŸćŸBţßö+@XWAţß!s  ‰0ľU!5!2654&#!5!2Łţć@XX@ţćsŸŸ0{X@?X{Ÿć ‰0­U 4&#"32>"&4623X@AWWA@XzŸćŸŸćC?XW@AWXłć  ćŸH>Ţ %™‡ţăţ'‡ţăÎ1üđ11üđ‰œĽßˇ ]]ÜěÜěÄ1ś÷‘ô<ě203!3ý䐜Cü˝Cü˝É~•K3#ÉĚĚK͉­!5!­ýÜ${‰1­V #5#53533ŘzŐŐzŐŐŐ{ŐŐ{‰1­‡##5!ŘzŐ$ ţ%Ű{{˙˙:Ř'ŸU‚˙˙ÇŐ'Ÿâ„˙˙É"Ő'Ÿ=†˙˙wqŐ'ŸŒŠ˙˙hŐ9˙˙hK'œŔE°˙˙hŐ0˙˙hO'zŔt°w^Ő:ľÜ<Ôě1łBŻ/ě0KSX@ííííY7 5wMűłçűś40ťý‡äýˆ˙˙w^O'z)t˛˙˙w^N'r)u˛˙˙w^Ő'Śś˛w^Ő:ľÜěĚ21łBŻ/ě0KSX@ííííY%5^űçűłśśxäyťýĐ˙˙w^O'z1tś˙˙ɝŐ'Ž5Ś˙˙6Ő&9ŚĄ˙˙ɝŐ'°5Ś˙˙6Ő&°ŚĄ˙˙ɝO'ą5Ś˙˙6O&ąŚĄ˙˙ÉóŐ'˛•Ś˙˙wEŐ&˛Ś°˙˙ÉóO'ł•Ś˙˙wEO&łŚ°˙˙ÉóO'ˇ•Ś˙˙wEŐ&śŚ°˙˙ÉóO'ˇ•Ś˙˙wEO&ˇŚ°˙˙w^N'r1uś‰› ß<´ÜĚ291ľB÷‘ôä0KSX@}}}}ííííY5 üéý`sb€bsţщœßł]Üě1´÷‘ôě03‰œCü˝˙˙˛˙ă)Ő8˙˙˛)K'œđE˲)ň*@ 8AüK°TXš˙Ŕ8Yěüě1ľ •‘ /<ôě03! #4&#"˛!!ËŽÂĂŽ¤$*ţÖţÜü\‹đÓÓđüu˙˙˛)O'zçtËw^Őś 2 Ü<ôě1ś• •/ěôě07! )5! )wž5ţáţËţBŸ˛–ţhţPţaŚ.,Śţ—ţ€ţ~ţ–˙˙w^O'zÇtÍ˙˙w^N'rÇuÍ˙˙w^Ő'ŚśÍy`Őˇ 2üěô<1ś ••/ěôě0%! )! !`ţaţPţh–˛ŸţBţËţá5ŚŚj‚€iŚţéţÔţŇţč˙˙y`O'z"tŃ˙˙É˙ăŹŐ&ŚÉƒ˙˙˛˙ăĽŐ'ŚÉ˙˙ÉŹň'˃Ś˙˙˛Ľň&ËŚ˙˙ÉŹO'ĚƒŚ˙˙˛ĽO&ĚŚ˙˙ÉóŐ'Í•Ś˙˙w˝Ő'Ś(Í˙˙ÉóO'ΕŚ˙˙w˝O&ÎŚ(˙˙ÉŐ'Ń˝Ś˙˙y˝Ő'Ś(Ń˙˙ÉO'Ň˝Ś˙˙y˝O&ŇŚ(˙˙đŐ'ѽΉœßľ ~ÜěĚ21@ Ý÷ Ý‘ôěôě0# $54$!3#"3nţđţ˙nÍ™ž¨ nË××Ęn“ š{˙˙˛˙ă•ß'Č|É˙˙˛•ň'Č|Ë˙˙w}ß'ČdÍ˙˙yŻß'Č–ŃF>ň %@ üěÜě21@ • •‘/ôěÜ9î0"32654&"$54$32#Bz­Č_€˛Ě̀˛ëţď#ŮěĘR¤—¨”Š“¤—ý3Iđěúáđěűę˙˙ÉÁK'œŔEéÉÁň %@  üě2Üě1@ • •‘/ôěÜ9î0"32654&#4$32#&Ĺf̲€_Č­ţTĘěŮ#ţďë˛R—¤“Š”¨—¤ý3ý{ěđáúěđ˙˙ÉÁO'zŔtéF˙ă>Ő (@  üěÜě21@ • •Œ‘ěôîÔ9ě0%2654&#"3#"$54$3Bf̲€_Č­ŹĘţđěŮţÝ벃—¤“Š”¨—¤Í…űęěđáúěđ˙˙F˙ă>O'zÓtë˙˙F˙ăüN'rÓuëÉ˙ăÁŐ (@  üě2Üě1@ • •Œ‘ěôîÔ9ě0%2654&#"672#"$53Ĺz­Č_€˛Ě̀˛ëţÝŮěţđʃ¤—¨”Š“¤—ÍIđěúáđě˙˙É˙ăÁO'z5tî˙˙Éň'çÚŚ˙˙Fłň'Śç˙˙É?ň'é~Ś˙˙Éň'Ś|é˙˙É?O&Śę~˙˙ÉO&ęŚ|˙˙É˙ăŐ'ëÚŚ˙˙F˙ăłŐ&ëŚ˙˙É˙ăO'ěÚŚ˙˙F˙ăłO&ěŚ˙˙É˙ă?Ő'î~Ś˙˙É˙ăŐ&îŚ|˙˙É˙ă?O'ď~Ś˙˙É˙ăO&ďŚ|˙˙đ˙ă?Ő&Îî~‰‹ ß $ˇ~ ]Üě2Ôě1@ ÝÝ÷‘ôôüÔě02654&#"632#"&53ÉXP^J\TaaQ_”ʎ‰•ŤůVFTHUGQK})†„Œ~†„J8‹¸ß 2654&#"03#"&54632xOaT\J^PŤ•‰ˇŹ”_ůKQGUHTFV}iýś„†~Œ„†˙˙F‘ň'Čxç˙˙ÉĂň'ČŞé˙˙F˙ă‘ß'Čxë˙˙É˙ăĂß'ČŞîF>ňś ÜěÜě1ľ •‘/ôěĚ0#4$32#4&#"Ę#ŮěĘĚf€˛úáđěűꤗŠ˙˙ÉÁK'œŔEÉÁňˇ üěÜě1ľ• ‘/ôěĚ04&#"#4$32÷˛€fĚĘěŮ#’Š—¤űéěđáú˙˙ÉÁO'zŔtF˙ă>Őś ÜěÜě1ˇ• Œ‘äôîĚ032653#"$5˛€fĚĘţđěŮţÝž’Š—¤űęěđáú˙˙F˙ă>O'zÓt ˙˙F˙ăüN'rÓu É˙ăÁŐˇ üěÜě1ˇ •Œ‘äôîĚ03#"$53326÷ĘţÝŮěţđĘĚf€˛žúáđěű餗Š˙˙É˙ăÁO'z5t ˙˙Éň'ÚŚ˙˙Fłň&Ś˙˙É?ň'~Ś˙˙Éň&Ś|˙˙É?O'~Ś˙˙ÉO&Ś|˙˙É˙ăŐ' ÚŚ˙˙F˙ăłŐ& Ś˙˙É˙ăO' ÚŚ˙˙F˙ăłO& Ś˙˙É˙ă?Ő' ~Ś˙˙É˙ăŐ& Ś|˙˙É˙ă?O' ~Ś˙˙É˙ăO& Ś|˙˙đ˙ă?Ő&Î ~‰‹ ßś] ]ÜěÔě1ˇ Ý÷‘ôôüĚ03#"&53326yˇ‰•ŤaO\T•Œ~†„JýśPML‰‹ ß32653#"&5T\OaŤ•‰ˇ•QLMPJýś„†~ŒwŐľ:Üüě1´•/ôě0!#!5!Ęý)Ą+Ş˙˙ÉjK'œŠE!ÉjŐ@ •:üěě1/ôě03!!ÉĄý)ŐŞúŐ˙˙ÉjO'zŠt!wŐľ:Üüě1´•/äě0!5!ü_×Őú+Ş+˙˙wO'złt#˙˙wÜN'rłu#˙˙ÉjŐ/˙˙ÉjO'z5t&˙˙É5Ő&Ś˙˙wŻŐ'Ś˙˙ÉíŐ&Ś!ƒ˙˙ÉĽŐ'Ś!˙˙ÉíO'"ƒŚ˙˙ÉĽO&"Ś˙˙É5Ő'#Ś˙˙wŻŐ&#Ś˙˙É6O'$Ś˙˙wŻO&$Ś˙˙ÉíŐ'&ƒŚ˙˙ÉĽŐ&&Ś˙˙ÉíO''ƒŚ˙˙ÉĽO&'Ś˙˙đíŐ&Î&ƒ‰œĽß´]ÜěĚ1śÝ÷‘ôôě0!!3Œýä nC‰œ ßľ ~ÜěĚ21@ Ý÷ Ý‘ôěôě0! $54$)!"3 ţúţđţ˙ţç͙ž¨ nË××Ęn“ š{‰œĽß3!5ýä Őü˝nw˙ăŠ} (@  ÜÔěÔ9ě1@ •Œ• Ôě2ôî0"32654&'2#"$547!5œ‹Č__ȘúţďěëţďLýšÓŚn¨””¨ƒ‘ŞáÝěđđěŞjŞ˙˙F˙ăY 'œi˙<F˙ăY} )@  üÄěÔ9ě1@ •Œ• Ôě2ôî0"32654&'!!#"$54$C™Č`^ȋ›ý™Mţďëěţďӑƒ¨””¨nŚŞŞjŞěđđěÝá˙˙ ˙ă'zi˙<<ĹwŠš "@  ÜÔěÔ9ě1ś•• /ě2Ôě0%2654&#"!5!&54$32˜Č__ȋœűęfLëěţýŞ‘ƒ¨””¨nŚŞŞjŞěđđěÝá˙˙wŠ'zŞ˙<>˙˙wŠ'rŞ˙<>FYš #@  üÄěÔ9ě1ś•• /ě2Ôě0%2654&#""$54$32!C›‹Č^`șúţýěëMgŞŚn¨””¨ƒ‘ŞáÝěđđěŞjŞ˙˙FY'zT˙<A˙˙É˙ăH}':žŚ˙˙w˙ăĐ}'Ś;:˙˙É3š'AÚŚ˙˙FYš'ŚyA˙˙É3'BÚŚ˙˙FY&BŚy˙˙FY'rT˙<A‰ß\ä 2654&#""&546 !Éj>_IEcI_ŁŹ(Ź0ƒMJBSKFXCIn~|„‡‡„Q;n‰‹.ß"&5332653ܨŤabaaŤ‹†„JýśPMMPJýś„†‰ß\ä 2654&#"0!5!&546 _IcEI_>jýmƒ0Ź(ŹŁMICXFKSBJnn;Q„‡‡„|~wŠšľ ÜÔěĚ1ľ• •/ěÔě0%2654&#!5!2#b؏űęúţď쥒Ľƒ‘ŞáÝěđ˙˙FY 'œ¤˙OFYšś üÄěĚ1ľ ••/ěÔě0%"$54$3!!"CěţďúűꏙƥĽđěÝ᪑ƒĽ’˙˙FY'z¤˙<OwŠšľ  ÜÔěĚ1ľ• •/ěÔě052#!5!2654&ěţýúűę˜ĹőĽđěÝ᪑ƒĽ’˙˙wŠ'zŞ˙<Q˙˙wŠ'rŞ˙<QFYšś üÄěĚ1ľ•• /ěÔě0"3!!"$54$3Cbƙűęúţýěő’Ľƒ‘ŞáÝěđ˙˙FY'z¤˙<T˙˙ÉHš'MžŚ˙˙wĐš&MŚ;˙˙É3š'OÚŚ˙˙FĆš&OŚ1˙˙É3'PÚŚ˙˙FĆ&PŚ1˙˙ÉHš'QžŚ˙˙wĐš&QŚ;˙˙ÉH'RžŚ˙˙wĐ&RŚ;˙˙É3š'TÚŚ˙˙FĆš&TŚ1˙˙É3'UÚŚ˙˙FĆ&UŚ1‰ß\ä"3!!"&5463ÜRiPY’ýnžŁŹ§vDZHCn~ƒ}‡w^Ő %5-5 ^űjü–çüěüśś2äÔŐä2ťéě¸éF Ő ˇ? Üěüě1ľ• /ôÔě0!3#$53TCcĘţúţ ʨţ™ţ˝ýXon˙˙É2K'œ EhÉŐ @ ? üěüě1ľ •/ôÔě053#3 ĂĘţ ţúĘcCT¨-nţcţ‘ý¨ţC˙˙ɍO'z thF Ő ˇ ? Üěüě1ľ •/äÔě0%#5%3# ĘôĘcţ˝ţŹ--noXýţ˝˙˙F O'zŁtj˙˙FĚN'rŁujÉŐ @  ? üěüě1ľ• /äÔě0%!#3#ĂţŹţ˝cĘôĘ-gCţý¨ţ‘ţcn˙˙ɍO'z3tm˙˙ÉäŐ'fÚŚ˙˙F‘Ő'Śüf˙˙ÉŐ'hƒŚ˙˙É´Ő'Śh˙˙ÉO'iƒŚ˙˙É´O&iŚ˙˙ÉäŐ'jÚŚ˙˙F‘Ő&jŚü˙˙ÉäO'kÚŚ˙˙F‘O&kŚü˙˙ÉŐ'mƒŚ˙˙É´Ő&mŚ˙˙ÉO'nƒŚ˙˙É´O&nŚ˙˙đŐ&Îmƒ‰œčß ś ] ] ÜěÔě1ˇÝ ÷‘ ôôÜě04&+3#X¸ĎHăěĆǜśţšĺŹV‰‹ěî+.#"#"&'532654'&/&'&54632¸Cw7Bh#-8GC>Ф=‹JG‰BAm'./G?;˘=~ÇH)@@V\`RʺªŇV\`RʺªŇžÓhZáţç¡%XÓhZá¡ţŰF˙ălň632#4&#"#"&3326tŇŞÂşĘR`\VŇŞÂşĘR`\VžX%ˇÂţçáZhÓý¨ţۡÂáZh˙˙F˙ălO'zót‚F˙ăܡ'32654 !"/.#"3"54!2ú!„rz|KŤČŁţŮŹ×42 „swUĄůҤ'­Ö4°X˧|`ĺĽţĂ­•ţČ~pX˧|`ĺĽJ š3ţç~˙˙F˙ăÜ'z‹˙<„F˙ăܡ'763 #52654&#"# '4!"326(24׏'ŁŇůĄUv€r„!24Ö­ţŮŁČŤK|zs„°p~ţȕŚţźĽĺ`|§ËXp~ţç8•­=Ľĺ`|§Ë˙˙F˙ăÜ'z‹˙<†˙˙É˙ăň&ځ•˙˙F˙ăƒň&Śî˙˙É˙ăň'‚•Ś˙˙F˙ăƒň&‚Śî˙˙É˙ăO'ƒ•Ś˙˙F˙ăƒO&ƒŚî˙˙É˙ă١'„ýŚ˙˙F˙ăUˇ'ŚŔ„˙˙É˙ăŮ'…ýŚ˙˙F˙ăU&…ŚŔ˙˙É˙ă١'†ýŚ˙˙F˙ăUˇ&†ŚŔ˙˙É˙ăŮ'‡ýŚ˙˙F˙ăU&‡ŚŔ‰ĎŻć'>72#52654&#"#"&'463"326[*'sožb„I=J>",BˆţRđÓÓđ‹ü\ţÜţÖ*$˛jĽt_UV˛˙ă)ň '2654&"#"'&54632! 33265đ,B:d:B–0<~JI§jŠ­ţßţĺţćţßËŽÂĂŽ€B,">>",BˆVU_tĽjýNţÜţÖ*$¤üuđÓÓđ˛˙ă)ň '"2654&'632#"&5! #4&#"ë,B:d:B–0<~JI§jŠ­!!ËŽÂĂŽUB,">>",BˆVU_tĽj˛$*ţÖţÜü\‹đÓÓđ˛˙ă)ň '"2654&74&#"#! #"&547632đ(B:d:BBŽĂÂŽË!!­Šj§IJ~<UB,">>",BˆŽđÓÓđüu¤$*ţÖţÜýNjĽt_UV˙˙˛˙ă)O'zçtĎ˙˙˛˙ă)O'zçtĐS^Ő$264&"&546; )5! '&óVšţhţŢĚf€˛Ę#Ůěž fýœ¤—Š’úáđěw_ň:@ ÜÜ9ěÜě1@ B •‘/Ěô9ěĚ0KSXˇííY%4$32#4&#"!7gěŮ#ʲ€fĚţŢţhšžXěđáú’Š—¤űédfF˙ă.Ő=@ ÜěÜě1@ B •Œ‘ä9ôîĚĚ0KSXˇííY#"$533265!>ţđěŮţÝʲ€fĚ"˜šü¨ěđáú’Š—¤ýœfw˙ă_Ő?@  ÜÜ9ěÜě1@ B •Œ‘ä9ôîĚĚ0KSXˇííY '!32653#"$5gţŞš˜"Ěf€˛ĘţÝŮěţđýôfdű餗Вúáđě˙˙‰ ÍK' ÷˙˙‰ Íň' ÷˙˙‰ ÍO' ÷˙˙‰˙ă;ä' ý÷˙˙‰˙ă;O' ý÷˙˙‰˙ă Íä'  ÷˙˙‰˙ă ÍO'  ÷‰¨(ä (2654&""&546323326=3#"&=ÉbFntnPX”ŹŹ”•Ť/šQ,CEŤmaŹZT:KMMKFHn…|p‡‡pX;§oBGj§§„‡ˆƒ9‰¨$ä 3>2654&"!&546323326=3#"&=!"&54632!2654&"ÉbFntnP?+Ź”•Ť/šQ,CEŤmaŹűĘ”ŹŹ”•Ť/ëbFntnPZT:KMMKFH;Xp‡‡pX;§oBGj§§„‡ˆƒ9…|p‡‡pX;T:KMMKFHFY‰<@   üÄěĚĚ91ˇB•• /ěÔěĚ0KSX@ ííY!"3"$54$3!7YűꏙĆběţďúXýňhňţţ‘ƒĽ’ĽđěÝáUš˙˙FY‰'z¤˙<ůwţŠš8ˇ  Ě9ÜÔěĚ1ˇB• •/ĚěÔě0KSX@ ííY!26544#!w™Ćběţýúü¨ gX‘ƒĽ’ĽđěÝáţŤš˙˙wţŠ'z\˙<űFţYš:@  üĚěÔĚ91ˇB • •/ĚěÔě0KSX@ ííY'!"$54$3"3!Yýœhü¨úţýěbƙXţišUáÝě𥒥ƒ‘˙˙FţY'zi˙<ý‰ľ\ä'%!"&5463"3!\ţą=.ýĚžŁŹ§RiPY’Ź÷Bč~ƒ}‡nDZHCwŐ%#535!53!3##qÉÉý=ĘýĂúÉÉĘŕ¤Ô­Đý-ţ‚¤ŕ!ŽŐ%#5#53!3!3´ĘÉÉúýĂĘ=ýÉŕŕŕ¤~Óý0­Ô¤˙˙!ŽO'ztwŐ533#!#5!5#5qĘÉÉý=ĘýĂúÉőŕŕ¤ţ‚ý-Đ­Ô¤˙˙wO'zÚt!ŽŐ3#!#!#5353´ÉÉúýĂĘ=ýÉÉĘő¤Ô­ý0Ó~¤ŕ˙˙!ŽO'zVt ›čß33#!#!5#53‰ĎţĽ‘mţ ßunfyţ~ÔnÉ˙ăÁŐ ,@  üě22Üě1@ • •Œ‘/ěôîÔ99ě0%2654&#"672#"'"#3Ĺz­Č_€˛Ě̀˛ëţÝ١{O{ʃ¤—¨”Š“¤—ÍIđěúáH+Ő˙˙ɰŐ'sZŐ@  2üěôě1ś• • /ěôě0# !3! !ôţËţá5ôĘţaţPţh–˛/ţéţÔţŇţč/ú+j‚€i‰œNß !!!5!—Šýůý;ţßVýnV‰ěN#5!5!5!53!!75$iţÎ2ţÜ$iţä*ţÖmւœ°°Vxn°°Vţ˘ţßnՆ†ý™  u!s #'#37˙ ‰Í͉ű‰ťťsţĎţžööH+ßß˙˙‰—ň'çYŔ˙˙‰ ąň&÷s˙˙‰ Éň&ř˙˙‰ ÉO&ř˙˙‰˙ă 7ä&ř ů˙˙‰˙ă 7O&ř ů˙˙‰˙ă Éä&ř ˙˙‰˙ă ÉO&ř ˙ě÷ĺŸ!!ůüŸ¨˙ě˙Ÿ!!#!ţYĘţXŸ¨ý ö˙ě˙ĆŸ !!###!ÚţYĘ÷ĘţXŸ¨ý öý ö˙ě˙‡Ÿ!!#####!›ţYĘ÷Ę÷ĘţXŸ¨ý öý öý ö˙ě˙ HŸ!!#######! \ţYĘ÷Ę÷Ę÷ĘţXŸ¨ý öý öý öý ö˙ě˙ Ÿ!!#########! ţYĘ÷Ę÷Ę÷Ę÷ĘţXŸ¨ý öý öý öý öý ö˙ě÷”!3!!¨Ę§űçŸőý ¨˙ě÷Ć” !333!!¨Ę÷ʧú&Ÿőý őý ¨˙ě÷‡”!33333!!¨Ę÷Ę÷ʧřeŸőý őý őý ¨˙ě÷ G”!3333333!!¨Ę÷Ę÷Ę÷ĘŚöĽŸőý őý őý őý ¨˙ě÷ ”!333333333!!¨Ę÷Ę÷Ę÷Ę÷ʧôăŸőý őý őý őý őý ¨˙ě˙” !3!!#!ÂęŐęţ?ęŐęţrŸőý ¨ý ö˙ě˙Ó”!333!!###!ÂęŐęîęŐęţ?ęŐęîęŐęţrŸőý őý ¨ý öý ö˙ě˙–”!33333!!#####!ÂęŐęîęŐęîęŐęţ?ęŐęîęŐęîęŐęţrŸőý őý őý ¨ý öý öý ö˙ě˙ Y”#!3333333!!#######!ÂęŐęîęŐęîęŐęîęŐęţ?ęŐęîęŐęîęŐęîęŐęţrŸőý őý őý őý ¨ý öý öý öý ö˙ě˙ ”+!333333333!!#########!ÂęŐęîęŐęîęŐęîęŐęîęŐęţ?ęŐęîęŐęîęŐęîęŐęîęŐęţrŸőý őý őý őý őý ¨ý öý öý öý öý ö˙ěSC !3!!#!¨Ę§ţYĘţXŸ¤ţ\¨ţ\¤˙ěSĆC!333!!###!¨ĘöʨţXĘöĘţXŸ¤ţ\¤ţ\¨ţ\¤ţ\¤˙ěS„C!33333!!#####!¨ĘöĘřʤţ\ĘřĘöĘţXŸ¤ţ\¤ţ\¤ţ\¨ţ\¤ţ\¤ţ\¤˙ěS FC#!3333333!!#######!¨ĘöĘřĘöĘŚţZĘöĘřĘöĘţXŸ¤ţ\¤ţ\¤ţ\¤ţ\¨ţ\¤ţ\¤ţ\¤ţ\¤˙ěS C+!333333333!!#########!¨ĘöĘřĘöĘřʧţYĘřĘöĘřĘöĘţXŸ¤ţ\¤ţ\¤ţ\¤ţ\¤ţ\¨ţ\¤ţ\¤ţ\¤ţ\¤ţ\¤˙ě˙”!33!!# #!ę՚šŐęţręՙ™ŐęţrŸőţňý ¨ý ďţö˙ě˙”%!3!!#!!2ĐŃü^DéD^ţŁţťéţťţŁĎŸ÷ţć¨őý ¨ý öţ˙ě˙WcŸ !!!5!5!!!wűűůţŃůüsţXŸ¨ţ¨¨ţ ˙ěţ ˇŸ#5!! !!'!%'! !7%!77'7! Ëţşýô ţúţwƒţúƒƒţúƒţwţú ýô‰ƒţúƒƒţúƒƒƒƒƒ‰ţú÷¨¨ţţu|ů||ů|ţ‹ńńţ‹|ů||ţ|||||u ˙ě÷ G7+/37;?CGKO!5#535#535#53533533533533#3#3#!!#3%#3%#3#3%#3%#3#3%#3%#3¨ĘĘĘĘĘĘĘ÷Ę÷Ę÷ĘĘĘĘĘĘĘŚöĽë÷÷ţ?÷÷ţ?÷÷‚÷÷ţ?÷÷ţ?÷÷‚÷÷ţ?÷÷ţ?÷÷Ÿ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨𨨨¨¨¨¨¨¨¨¨¨¨¨¨¨¨˙ě§‹Ÿ!!!!śřüĘŸúaO¨ř¨q:#[!' 7#ţ}ţCrŸţarźŸ¨ţCrŸžrţD˙ě:ž[! !„źrţaŸrţCţ}Ÿźrţbţar˝=` !#!#3!ĂfţfäúţĂ€Ŕţí`ýG [`3!!!!!!!! Ůjýöóţ ý/ţžtšč`”ţӔţˆ“ţíÍýÚ&{˙ăo{4=J%#"'&=!.#"5>32>32#!3267#"'&32767%2654'&#"JԄ℄N ̡hddddĐj§||MI؏˝ii~űţţST—`śTe__ZŽjkü÷SR‰™\]iߏA@o™\]›Z^‘’úZżČ5Ž*,=>` #% 54)3#4+327#!5#53!2xţţţúÜÜŢěňňěšÖŒçÖţ9||śĹԙľ´f¤_‘ţÚŞĐ˜r–¤ř¤Đ˙˙q˙ăç{Fşg`32654&#%! )sŮËËŮţş7F0ţÎţźţÉÍüÇÇÖŐǓţńţŕţßţđ$g` ! )#53!#32654&+ş7F0ţÎţźţɖ–zÁŮËËٍ`ţńţŕţßţđő¤¤ţŸÇÖŐÇţĚş‹` !!!!!!şÄýöóţ ý/`”ţӔţˆ“‚˙ăĹ|1#"&'5327654'&+5327654'&#"567632żp<54& #.54! ĂŹ++ăţfă++Ş$$>:#tNPłĆĆłPNMĽ]ý*ţÓţúU˘3MY + 3267>54&#"'>3 '# 5467'7˛ý°*(čČOuš))ëÓHn.—MĹw834¨OłMĆxţíţÇ43¨Nç)gA“Ź\*g>—Š}66ţďń]ŸC‹_’56đ`Ą?‹`q˙ăĂ{&/=5!&'&#"5>3267632#"'&'#"'&732767276'&#"qN ffˇjČbdĐj ňQGhiŒńˆ‰‰ˆńŒijBNčâ„„šRR‰™\]”VVUV•“ŹVVZždc44Ž*,nmn67œţíţ윜78lkp‘’ĘZYWWžţ´st’tsčČÇtuq/u{ 4&#"#32˛Ź“”ŹÂńđ/ÇéçÉ8ţČţěq˙ău/ 32653#"4Ź“”ŹÂţďńđţî/ÇéçÉţěţČ8—Ě`!264&#%!2#!#N[cc[ţH¸źÁÁźţ˙ˇĹţ˜^Ź^›ŞţśŞţ>2`!.54763!##"#676#";ľjpklŮ„šŠa;;?˘ĂŽ545ŘĆw?@@?wĆ Œi˘QPű Ů%$qţá2^66É**TS++2`!&'&'3;3!"'&546#"3ľ7545ŽĂ˘?;;aŠšţ|Ůlkp Ćw?@@?wS66^2ţáq$%Ůű PQ˘iŒţcQ++ST**˙˙<m`Öş˙ŕ`$ 653 &53ćsšŮţXŮš}Ž˘łý;ŰŕŕŰĹýM˘ŽL+ö%!5!2654&#!5!#TýZŸŸŸž¤ý…`ŹfcđL¸||–ʏ¸B˛tÂČŽNŰř5353!5!2654&#!5!#ŽĘĘĘŒýZŸŸŸž¤ý…`ŹfcđxĚĚţzĘʤ¸||”ޏ¸D°vŔČ/ţŞ{&#!5!2654&#!5!27654'&#!5!#¸|vz{âý\žĄœž¤ý‡ž˘MN`_Łý‡`Žgb>> EŔ‚Ż__šruŚš99wSSšš?°yzVU˙˙=`Y˙˙V5`Z˙˙XŰ`]x˙ăş`73264&+5%5!2 'ŠĄÓ€„{n ýÔţöF—oäţ}É˝Bdťd>““ţÂJŸm ś7łü{3!!łIý{Şü/˙˙=`N—ě`#!#ěśţś`ű ˇüI`˙˙—Ě`JZ^`367653#5&'&3¸U9Vˆmą¸ŻmŠÄV9S`ý1MsÉ,ţÔţěœ}îî}œ,ţÔÇuM˙˙Ls`Ď œhŕ !3#'!#š­Zőg„VţXV†qţ`üźÖÖœ–ŕ!!!!!5!#!Šţ.żţAŢý˘ţłeŠWĐ"ŕ_ř_ţŃ_ÖÖDXţIˇœŕ &327654'&#327654'&#%!2#!ţĚg1221gĚź^-..-^ţĹE‘OO)(N^hŹžţŻ+ţÎ&&MO%%Xü@? ]65dL.- rUpzœ•ŕ 327654'&#%! )ţšÂ[ZZ[Âţ瀀ţđţűƒývNOЍNN]ee×ŘfeœÝŕ !!!!!!Rţ-Ŕţ@ßý˘ŕ_ř_ţŃ_Sœąŕ !5!!5!5!5ąý˘Ţţ@Ŕţ-ŕüź_/_ř_HŒ~ď$5#5!#"'&547632&'&#"326ĐNJYXeÝ|}}|Ý\SRFFPOW­WVVW­Cjá]ţ™/rsĚÍsr'y5UVŞŠVUœLŕ 3!3#!#΀€ţ2ŕţŠWüźŽţrœţŕ3#ŕüź˙˝śţŕ 3+53265A@1(TFŕüö—DE`Tlœiŕ 33 ##ڤţ-ô§ţ<ŕţŸaţzţB“ţmœČŕ3!!Ęýˇŕý_œŰŕ 33###˝đň˝|ň€ó{ŕýÇ9üźŢýĂ=ý"œGŕ 33##ŤĄ|Źţ_{ŕýEťüźťýEœGŕ ##3G|ţ_Ť{ĄŕüźťýEDýEťHŒŻď"327654'&$  '&üŠRQQRŠ‹QQQQţŻŒwvvwţtww“[\Ÿž\[[\žŸ\[\vvĆĹvvuvŒGŒ>ď@"327654'&327654'&'52#"&54767&'&54763ÂsCDDCstDCCBšR65<%€j<=0ER^X65`l<=ca¸ˇÄ==ll*6RI˘)++LK,++,KL++5##,&)$%LY+8:6iG2278PyAA‚yP87'21I.*œŢŕ 32764'&#%!2+#ţ Y0110YţážQQQQž ƒţĆ))–))]?@ö@?ţ°œ[ŕ #'&'&+#!232654&#=)&''ˆy.,,LŠĄPO)*ţs \^^\$ )(GäÖTţŸD<32#"&'#3t45¸5445¸5ţŞ$pMPPPPMp$uucä@AA@ä@AA86Z[ţŘ[Z68^gGŒž3#5#"'&76322764'&"Jtt%78N€PQQP€N87ţš45¸5555¸5°Sü™^8Z[([ZĄä@AA@ä@AAGŒŐ#!32767#"'&547632&'&#"Őýë@AsC?>>>BADŠbc^]ŸŽSSt44Va:: ď2j88a WW•š[ZQRmT3210YGŒŐMK° SX@ ÔĚÄÔĚ2K°SK°QZK°T[X˝˙Ŕ˙Ŕ˙Ŕ888Y1@   ÔĚ/ĚÔĚÔĚ0Y5!.#"5>32#"&73267G‚sC}>?ƒCŠĹťŸŽŚthVauť2koaŽ•šľŁmTebXTŒb2&'&547632.#";#"32767#"&5476ůG&%HG{065>=f,K,,+*Ib]W-155_;65-9553–˘+,î$$4O,, ^$'U13 `fa<))RŒ`1#"'&'532654'&+5327654'&#"5>32ťFLHG{065>=23-KX+*Ib]V.156_:65-9j2–RQ,+ź H4O-+]4$'U 12  `33a<))G­ž 14'&#"327#"'&'53276=#"'&763253J44^]4444]^4¨PPĽ=7633223r99$88N‚OPPO‚N88$tmŕ=>>=ŕ=>>F NO e 45k37XX"XX7_z¨î3#53ztttýô‚‚uœç 33 ##uuZ”ţ‰†—ţšuýţţŰţ˛2ţÎuœ{"4@ $ #ÔÜ32>32#4&#"˛tHKYhuu'oMLl+yRowtHJZiţţžw[Wk\ţžsa97EBEB‰~ţ…wZXku­Ä4@ ÔÜţzx66X6V‚YYk\ţžsa8BDGŒĎ 6@ ÔĚÔĚK°SK°QZK°T[Xť˙Ŕ ˙Ŕ88Y1@ ÔĚ/Ě0"32654&'2#"&546‹]ml^]ll]—­­—˜ŹŹǁqq‚poƒWŽ›šŻŻš›ŽGŒu 67632#"'&'532764'&#"G0336Ľ^_]^ :5311213p?>>?p3121÷ XX™—YY _ ?@ć@? GŐĎ4'&"#46320T66ş67zʘ—WVŐoBAA@q›ŽWW›GŒĎŐ27653#"'&50Â66ş67zʘ—VWŐoBAA@q›ŽWW›u­ě#3>32#"&$4'&"27ęuu$pMPPPPMpf45¸5445¸5úţłb_86Z[ţŘ[Z6Ąä@AA@ä@AA#œŰÁ3#;#"'&5#535ěďď0Hww†33UUÁ˛PţŹM,V-,vTP˛nŒ˝3327653#5#"&nt''N^67tt+78Jy~”{ţˆY,-65\cý`9†nÇAÔ!5!27654'&#!5!#ţUŚe22<KLÇg#"FS10gg%dAl88u{(#"&53327653327653#5#"&Q+<=Rnxu$$IZ54t$$KY45tt(78LMlE!"Šzţ‰[+,64\cţ‰[+,66Zcýb;F&œŐ33#&{ÝÜ{ţřžýňýy­Ü #! !&'3254554#"ít n°ţυ9F}ľţŰ攥Ăţę^ؙ83•ţö¸a°ž _ˇ{Ż­Ő3#5&+532ă›Ü{ţătš<,|­ţ|ćýďďÔGXGŒĎď+&#" '&54767&54!232654'&'&yA– §‚JZVWţŇVWW!/b‹LţĚ+"766^]l9=P(r(B4?Kœ”WXXWšr]$,O˜'ţř(@ä?A‚jp69G­  )"27654'&'2##5"'&5476734 )=;67-!XQVVQs~SVV@h)%661FźQţ:5}t?3XJOĽ˜ZUâáUXš R=\ ,Ajq@:Š%­Ä'#&+53;'&Í^Á‰sa,Ł(^Á‰ţďra,Ł×ţĆźGX]×:ţDţřFY˙˙zîg ýd˙˙u‚uýd˙˙n˙đ˝s‡ýd˙˙&ŐsŠýd˙˙y˙Üo‹ýd˙˙˙ŐsŒýdy˙ď‚67632#"&'#44&#"326˛&_%s€  €No%tţi\[jj[\i92ľţŘś78ţł"{q‚‚qr˙˙G˙ xŽýd˙˙%˙ÄtýdşţVŁ{(!2.#">32#"&'#32654&#"şţaŹQQžRľ´9˛|ÎüüÎ|˛9¸¸Ľ•”ĽĽ”•ĽFł,*˝ż[cbţĆţýţüţĆbcŞ#ČÜÜČÇÜÜ˙˙œLŕct„`5!#3#3!53#53t¨¨¨¨ýđ°°°ꤤţʤţत ¤T‘ţV/%+53276'7#3/¤´F0j&*¸¸šŽÖŔœ06”ú†GŒž#367632#"'&$4'&"27ťtt%87N€PQQP€N78f54¸5555¸4ú_s^8Z[ţŘ[ZĄäA@@AäA@@GŒu&'&#"32767#"&54632u1122q>??>q22110h;ŸźžĽ533÷` @?ć?@ _˛—™° GKv+325&#"47&'&54632&'&#"632#"Z%0\R@5`$^žĽ4412/412q>??5{źŇ3î *š &;/Z–™° ` ?@ć@bŠiGŒĎ.&'&#"32654'&7#"&54632''7'37 i:;n\[nO$$ZY‘’˛Ž‹ dÉąrPŃşœ =67TŒb1#"'&'5327654'&+532654'&#"5>32˝N+,QR–2658-56:_651.V]aIV-+K-32==l/|GHLî ))żżunn77wU:8PýÝ#P,i/0˙é­\+53276=#5333î43r,Brrtnœ x66XU P#ýÝPG­ž ,5#"3276#"'&'53276=#"'&54763JĆ]4444]^44tPPĽ=7633223r99$88N‚OPPO‚Ýë>=ŕ=>>=˘ýŰ NO e 45k37XX‘‚XXn­˝3327653##"&nt''N^67tt+87Jy~”{ţˆY,-65\cüžO9†Iœ– 5333##53#Irtggttt™\ţć\ýýj‚zœ~ ;#"&5îC,rfţpUWlwIœ– 5!#3!53IMjjţłoł\\ţE\\ťIœ–5!#3#3!535#535IMjjjjţłoooł\\ž\Ą\\Ą\ž˙V­`3#"54;33#'#"3276ztteżŞztry "3rKNB ‚ü,|ssýW?#5˜$ z­~3;#"&5ztC,rfäüáSVXlx[­`+53276'7#3`34r,Bttňax66XS güďqœƒ3!!q“ýîýÝ_u­{467632+53265&7454&#"#4'&#"#367632Ÿ+=32#4'&#"î43r,B0t*pJz>?t'(N^66‘x66X6V~a88BDţ…wY,-56\u­U 4'&#"#367632;#"'&5P''N^66uu)89Jy?>0B,r34Y,-56\ţžsa8BDţzV6X66xqœÄ 33##qŤ-{ŤţÓ{ţůý~úţGŒĎ 2#"'&5476"!&'!3276‹—WVVW—˜UWWUőş6/‘/1ţw &6^]6&WW›šWXXWš›WWW@9\[8ďE-AA.GŽĎ&.#5!#3!535&'&5476767654'&O—˘—pFVVFp—ţ^—nCWWCnt6%66%Ş4#76$§\\ŒFW›šWG…\\†FWš›WE[ţ*,ApoA-ţ9Ô*Aâ@+F­a:.#"#"/;#"'&=32654'&/.547632;1j8W*,]({44MNˆ9> 0B“ r34@?>=RX l)k`GF‚@rýb/$+*MW33 V6X66x"j2-*TIX00˙é­Ę476;#"+5326z73zno>43r,B0‘]Me30U:ýJx66X6#­ŰÁ3#;+5326=#"'&5#535ěďď0Hw43r,B0†33UUÁ˛PţŹM,ax66X6V -,vTP˛^Œ!533!33##5#"&=)3276^ntgtuut+87Jy~Úţš''N^61™\ţćţć\ý`9†‚Y,-6/G‹Ř&5!327654'&'5!# '&54767GE()78Z[78*,?”G$"ZYţäYZ!"Jł\{':?KY7667YR8>#{\8?>LƒRRQR€R<=:uŠ’2653#"'&53„QHuDE…†EDuHâPZƒţs{>??>{ţ}ZPzœż3+"&53?27654'&'&gËH#"YZŽ,rftA Z87)2:0Ä8?>LƒRRlwţpU67YQ8C&œŐ# #3Ő{ÜÝ{ žœýňs7œn !!!5!G'ţL´ýÉ´ţ\^ţ=R^Ă7­ý!!#;#"&=!5!G'ţL´C,rfţ>´ţ\^ţ=R VXlx ^Ă7^n#47#5!5!3632#'3254#|`ĺ´ţ\'ţLn&ŠŇ m,7œ!!^ĂR^ţ=˘ŠjR37¨Ł!2#"'&'5327654'&+5!5!hCQ>63``°;??C5~Ex>?::hnţ\&§ =;M|CD m**PJ*)]R^GĎ !32767&'&"2#"&76Sţo/6^]6/ +6ş6,ǗWVVW—˜ŹVV*€MWXMŢmGYXFoƒvwţ^wwî˘wvü[î˙Ľf!5!73ţ°ýŤ¨‹î”äü[î˙Ľf3!ýPő‹¨îxä”ü[î˙Ľf#'!5ţ°ő‹¨ýéfţˆä”ü[î˙Ľf!!#ýPUý騋f”äüBî˙žf 3#'#3ţ5”ő‹´´”ő‹´fţˆőőxőüBî˙žf 73#'#ýË´´‹ő”´´‹őfőőţˆőőx˙˙ţhŐ'Öź$˙˙{ţ-{'ÖTD˙˙ÉěN'z­s%˙˙Ž˙ă¤N'¸>E˙˙Éţ‡ěŐ&%ÔĽ˙˙şţ‡¤&EÔš˙˙ÉţŔěŐ&%—˙˙şţŔ¤&E˙˙sţu'l'sLv‰˙˙qţuçf&ŠvC˙˙ɰO'zýt'˙˙q˙ăbN'¸ţ>G˙˙Éţ‡°Ő'ÔŽ'˙˙qţ‡Z'ÔzG˙˙ÉţŔ°Ő&'č˙˙qţŔZ&GO˙˙Éţw°Ő&'z[˙˙qţuZ&Gzö˙˙Éţ°Ő'ˆŚů&'˙˙qţZ'ˆ^ů&G˙˙É‹Z&(Ťî˙˙q˙ă^'Ť˙Ů˙H˙˙É‹Z&(Şě˙˙q˙ă^&HŞ˙×˙˙˙ÉţK‹Ő&(Ţą7˙˙qţK{&Hް7˙˙Éţv‹Ő&(°ł˙˙qţv{&H°›˙˙Éţu‹m'yĄu&(zž˙˙qţuH&H'š‡zK˙˙É#O'zvt)˙˙/řP&I› @˙˙s˙ă‹&*‹2"˙˙qţVZö&J‹I˙˙É;N'zs+˙˙ŽdN'¸>K˙˙Éţ‡;Ő'Ô+˙˙şţ‡d'ԏK˙˙É;P&+j@˙˙˙ídN'š>K˙˙ţt;Ő&+zţî˙˙˙˙ţtd&Kzţß˙˙˙˙Éţ9;Ő&+ß ˙˙şţ9d&Kß•˙˙ţv”Ő&,°˙J˙˙˙Óţvg'°˙L˙˙YZ&,¨ţt˙˙˙ôF&ó¨ţaţź˙˙Éjl'sâv.˙˙şœl'sZvN˙˙Éţ‡jŐ&.ÔÜ˙˙şţ‡œ&NÔ‘˙˙ÉţŔjŐ&. ˙˙şţŔœ&Nv˙˙Éţ‡jŐ'Ôš/˙˙Áţ‡'Ô'O ˙˙ţˆjk'ľ*u'Ô™/˙˙˙ýţ‡S1'q˙(;˙˙˙ÉţŔjŐ&/Ž˙˙˙ôţŔJ'˙O˙˙ÉţjŐ'ˆ—ů&/˙˙˙Ţţ\'ˆ˙ů&O˙˙Él'ssv0˙˙şf&Pv”˙˙ÉO'zwt0˙˙ş'›FP˙˙Éţ‡Ő'Ôt0˙˙şţ‡{'ÔćP˙˙É3N'zţs1˙˙şd'›Q˙˙Éţ‡3Ő'Ôţ1˙˙şţ‡d{'ԏQ˙˙ÉţŔ3Ő&1÷˙˙şţŔd{&QŒ˙˙Éţ3Ő'ˆţů&1˙˙şţd{'ˆ•ů&Q˙˙s˙ăŮZ&2°f˙˙q˙ău &R°˙˛ţ˛˙˙s˙ăŮV&2Žl˙˙q˙ău&R'jo˙tr˙˙s˙ăŮZ&2Ťj˙˙q˙ău^&RŤ˙ľ˙˙˙s˙ăŮZ&2Şh˙˙q˙ău^'Ş˙š˙R˙˙ɍl'sžv3˙˙şţV¤f&Sv2˙˙ɍO'z„t3˙˙şţV¤'›ŮS˙˙ÉTN'zƒs5˙˙şJ&U›˙˙Éţ‡TŐ'Ô}5˙˙şţ‡J{'Ô U˙˙Éţ‡T1'q}; "˙˙şţ‡Jő&q˙ #˙˙ÉţŔTŐ&5ĺ˙˙TţŔJ{&U˙˙˙‡˙ă˘O'z¸t6˙˙o˙ăÇ&›%V˙˙‡ţ‡˘đ'ÔŠ6˙˙oţ‡Ç{'ÔV˙˙‡˙ă˘m'sâv'z¤’6˙˙o˙ăâf&V&›ŒVv˙˙‡˙ă˘W&Żä6˙˙o˙ăǰ&#›" ˙˙‡ţ‡˘O'z›t *˙˙oţ‡Ç& +›*˙˙˙úéO'zrt7˙˙7ňN&W›˙#>˙˙˙úţ‡éŐ'Ôq7˙˙7ţ‡ňž'ÔčW˙˙˙úţŔéŐ&7b˙˙7ţŔž&ôW˙˙˙úţéŐ'ˆrů&7˙˙7ţ'ž'ˆ˙čů&W˙˙˛ţ‰)Ő'Őđ8˙˙Žţ‰X`'Ő{X˙˙˛ţv)Ő&8°ň˙˙ŽţvX`&X°˙˙˛ţK)Ő&8Ţŕ7˙˙ŽţKX`&XŢu7˙˙˛˙ă)Z&°.8˙˙Ž˙ăXě&+v–†˙˙˛˙ă)4&Ś28˙˙Ž˙ăXô'Ś˙ČţŔX˙˙h}&9žíF˙˙=7&Yžm˙˙ţ‡hŐ&9Ôź˙˙=ţ‡`&YÔ^˙˙DŚr'uő|:˙˙V5k'C Z˙˙DŚr'ső|:˙˙V5m'v†Z˙˙DŚN'jő>:˙˙V5'jEZ˙˙DŚN'zős:˙˙V5&Z›G˙˙Dţ‡ŚŐ&:Ôű˙˙Vţ‡5`&ZÔJ˙˙=;O'zĘs;˙˙;y&[›g˙˙=;N&;jĘ>˙˙;y&[jf˙˙˙üçO'zps<˙˙=ţV&\›f˙˙\m'vžu=˙˙XŰf&]ˆ˙˙\ţ‡Ő&=ÔŮ˙˙Xţ‡Ű`&]Ô1˙˙\ţŔŐ&=Ç˙˙XţŔŰ`&]˙˙şţŔd&Kf˙˙ňN&Wj˙->˙˙V5&ZœB˙˙=ţV&\œ˙˙{˙ăa&D€Ú˙˙/řP&A›˙ý@˛˙ă´ň7&#"#4>32"#"'532654.546mŽ@f_@&Ë9dŚcŮ07Ďţ˙CjjCţ÷Ó´Émąob—)F[dd[F)ßôZ@h§oüˆ‘ƒĎ‹\(Ĺ˝}_-C-->TŒ\¤É_ĐEFvX5P3) $2BgCť˙˙q˙ăuđH˙˙ţ‡hŐ'Ôˇ$˙˙{ţ‡-{'Ô!D˙˙hđ&$şźu˙˙{˙ă-{&DşT˙˙h:&$ą˙˙{˙ăŻĹ'ą˙—ţ‹D˙˙h:&$˛˙˙{˙ă-Ć&D˛˙”ţŒ˙˙h[&$¸˙˙{˙ăć'¸˙–ţ‹D˙˙hu&$ł˙˙{˙ă-'ł˙–ţ‹D˙˙ţ‡hm&„ÔŻ˙˙{ţ‡-f&¤Ô"˙˙hZ&$ľ˙˙{˙ă-'ľ˙‘ţŞD˙˙hZ&$ś˙˙{˙ă-'ś˙’ţŞD˙˙h‹&$ˇ˙˙{˙ă-5'ˇ˙”ţŞD˙˙hY&$´˙˙{˙ă-&D´˙’ţŞ˙˙ţ‡h’&ÄÔŔ˙˙{ţ‡-&ĹÔ3˙˙Éţ‡‹Ő&(Ôž˙˙qţ‡{&HÔ‹˙˙É‹đ&(şžu˙˙q˙ă{&Hş˙˙É‹^'tžu(˙˙q˙ă7'ž—H˙˙É:&(ą˙˙q˙ăčĹ'ą˙Đţ‹H˙˙É‹:&(˛î˙˙q˙ăĆ'˛˙ĐţŒH˙˙Éő[&(¸î˙˙q˙ă×ć&H¸˙Đţ‹˙˙É‹u&(łę˙˙q˙ă'ł˙Ńţ‹H˙˙Éţ‡‹m&ŒÔž˙˙qţ‡f'Ô‹& ˆ‹˙˙Zđ&,ş#u˙˙D|&óş ˙˙Čţ‡”Ő&,Ô.˙˙ˇţ‡ƒ&LÔ˙˙sţ‡Ůđ&2Ô'˙˙qţ‡u{&RÔs˙˙s˙ăŮđ&2ş'u˙˙q˙ău{&Rş}˙˙s˙ăŮ:&2ąl˙˙q˙ăÎĹ'ą˙śţ‹R˙˙s˙ăŮ:&2˛j˙˙q˙ăuĆ'˛˙ľţŒR˙˙s˙ăŮ[&2¸j˙˙q˙ă˝ć'¸˙śţ‹R˙˙s˙ăŮu&2łe˙˙q˙ău'ł˙śţ‹R˙˙sţ‡Ům&–Ô'˙˙qţ‡uf'Ôs& “ˆs˙˙g˙ăk's'ub˙˙v˙ăÓf&vsc˙˙g˙ăk'u'ub˙˙v˙ăÓf&Csc˙˙g˙ăđ&bş'u˙˙v˙ăÓ{&cş}˙˙g˙ă^'t'ub˙˙v˙ăÓ7&žsc˙˙gţ‡&bÔ'˙˙vţ‡Óë&cÔs˙˙˛ţ‡)Ő&8Ôő˙˙Žţ‡X`&XÔ{˙˙˛˙ă)đ&8şîu˙˙Ž˙ăX{&Xş}˙˙­˙÷_k'sîuq˙˙°˙ăif&v{r˙˙­˙÷_k'uîuq˙˙°˙ăif&C{r˙˙­˙÷_đ&qşîu˙˙°˙ăi{&rş}˙˙­˙÷_^'tîuq˙˙°˙ăi7'ž€r˙˙­ţ‡_&qÔő˙˙°ţ‡ië&rÔ{˙˙˙üçr&<ur|˙˙=ţVk&\C!˙˙˙üţ‡çŐ'Ôv<˙˙=ţV`'Ôt\˙˙˙üç÷&<şr|˙˙=ţV‚&\ş`˙˙˙üç^'tru<˙˙=ţV7&žw\˙˙q˙çäa&E pp˙˙q˙çäa&E ¨H˙˙q˙çäf&E }”˙˙q˙çäf&E Š„˙˙q˙çäf&E ~„˙˙q˙çäf&E ‹ ˙˙q˙çäm&E v˙˙q˙çäm&E ŒD˙˙ha&& p˙#˙˙ha&& ¨ţó˙˙ôf'&Œ }˙|˙˙ôf'&Œ Šˆ˙˙f'&Ž ~˙S˙˙Xf'&đ ‹˙o˙˙™m&&1 ˙Q˙˙ŕm&&x Œ˙N˙˙…˙ăČa&I pD˙˙…˙ăČa&I ¨9˙˙…˙ăČf&I } ˙˙…˙ăČf&I Š%˙˙…˙ăăf&I ~O˙˙…˙ăf&I ‹R˙˙-a'*˘ pţ˙˙-a'*˘ ¨ţ˙˙7f'*Ź }˙|˙˙If'*ž Šˆ˙˙­f'*" ~˙S˙˙éf'*^ ‹˙o˙˙şţVda&K pŚ˙˙şţVda&K ¨˘˙˙şţVdf&K }€˙˙şţVdf&K Šp˙˙şţVdf&K ~„˙˙şţVdf&K ‹Ž˙˙şţVdm&K œ˙˙şţVdm&K Œ‡˙˙éa',Ž pţ˙˙ća',Ť ¨ţ˙˙çf',Ź }˙|˙˙íf',˛ Šˆ˙˙nf',3 ~˙S˙˙Ÿf',d ‹˙o˙˙Żm',t ˙Q˙˙Ęm', Œ˙N˙˙›na&M p˙˙˙‘na&M ¨˙ ˙˙˙°šf&M }˙'˙˙˙şÇf&M Š˙<˙˙ĺf&M ~˙Q˙˙˙Ňîf&M ‹˙=˙˙˙Ënm&M ˙˙˙˙Ćnm&M Œ˙˙˙Aa'.Ž pţ˙˙5a'.˘ ¨ţ˙˙Kf'.¸ }˙|˙˙Kf'.¸ Šˆ˙˙Çf'.4 ~˙S˙˙f'.p ‹˙o˙˙"m'. ˙Q˙˙)m'.– Œ˙N˙˙q˙ăua&S px˙˙q˙ăua&S ¨n˙˙q˙ăuf&S }e˙˙q˙ăuf&S ŠT˙˙q˙ăuf&S ~ˆ˙˙q˙ăuf&S ‹‘˙˙˙ăüa&4# pţ˙˙˙ăVa&4} ¨ţ˙˙˙ăOf'4v }˙|˙˙˙ăYf'4€ Šˆ˙˙˙ăf'46 ~˙S˙˙˙ăPf'4w ‹˙o˙˙•˙â*a&Y p=˙˙•˙â*a&Y ¨˙˙•˙â*f&Y }'˙˙•˙â*f&Y Š!˙˙•˙â*f&Y ~`˙˙•˙â*f&Y ‹W˙˙•˙â*m&Y 8˙˙•˙â*m&Y Œ˙˙Ia'9b ¨ţ˙˙˙f'9 Šˆ˙˙f'96 ‹˙o˙˙3m'9L Œ˙N˙˙‡˙ă'a&] p^˙˙‡˙ă'a&] ¨T˙˙‡˙ă'f&] }Y˙˙‡˙ă'f&] Š^˙˙‡˙ă'f&] ~¤˙˙‡˙ă'f&] ‹‹˙˙‡˙ă'm&] c˙˙‡˙ă'm&] Œ^˙˙a&=N pţ˙˙qa'=˘ ¨ţ˙˙if'=š }˙|˙˙uf'=Ś Šˆ˙˙Cf'=t ~˙S˙˙yf'=Ş ‹˙o˙˙m'=B ˙Q˙˙Pm'= Œ˙N˙˙q˙çäf&E œt˙˙q˙çäf@˙˙…˙ăČf&I œT˙˙…˙ăČfA˙˙şţVdf&K œĆ˙˙şţVdfB˙˙˙nf&M œţă˙˙Ś˜fC˙˙q˙ăuf&S œ{˙˙q˙ăuf`˙˙•˙â*f&Y œ0˙˙•˙â*fa˙˙‡˙ă'f&] œM˙˙‡˙ă'fb˙˙qţVäa& ŔH˙˙qţVäa& ÁH˙˙qţVäf& ÂH˙˙qţVäf& ĂH˙˙qţVäf& ÄH˙˙qţVäf& ĹH˙˙qţVäm& ĆH˙˙qţVäm& ÇH˙˙ţVha& Č oş˙˙ţVha& É oş˙˙ţVôf& Ę oF˙˙ţVôf& Ë oF˙˙ţVf& Ě oh˙˙ţVXf& Í oŞ˙˙ţV™m& Î oë˙˙ţVŕm& Ď o2˙˙şţVda& Ü˙8˙˙şţVda& Ý˙8˙˙şţVdf& Ţ˙8˙˙şţVdf& ß˙8˙˙şţVdf& ŕ˙8˙˙şţVdf& á˙8˙˙şţVdm& â˙8˙˙şţVdm& ă˙8˙˙ţVéa& ä ož˙˙ţVća& ĺ o›˙˙ţVçf& ć oœ˙˙ţVíf& ç o˘˙˙ţVnf& č o#˙˙ţVŸf& é oT˙˙ţVŻm& ę od˙˙ţVĘm& ë o˙˙‡ţV'a& Y˙˙‡ţV'a& Y˙˙‡ţV'f& Y˙˙‡ţV'f& Y˙˙‡ţV'f& Y˙˙‡ţV'f& Y˙˙‡ţV'm& Y˙˙‡ţV'm& Y˙˙ţVa&  o\˙˙ţVqa&  o°˙˙ţVif&  o¨˙˙ţVuf&  o´˙˙ţVCf&  o‚˙˙ţVyf& ! o¸˙˙ţVm& " oP˙˙ţVPm& # o˙˙q˙çäH&Ešz˙˙q˙çäö&Eqy˙˙qţVäf& $H˙˙qţVäy&EH˙˙qţVäf&@H˙˙q˙çä7&E qn˙˙qţVä7& gH˙˙hm&&yşu˙˙h1&&qź;˙˙˙üŞf&&B œ˙R˙˙hf˙˙ţVhŐ&& oş˙˙†Âxa p˙˙śţV’˙¤†ÂxaH´ Ô<ܲ?]Ŕ1ś Ô´?_]°KPXĚŔYĚ̲?]90ąIąIPXł@@88Y#55#53xň†…ńÍţőgž˙˙śJ7ž˙˙śFJm't„j˙˙şţVdf& (˙8˙˙şţVd{&K˙8˙˙şţVdf&B˙8˙˙şţVd7&K q˙˙şţVd7& v˙8˙˙˙üíf'*b œ˙R˙˙˙çuf˙˙˙üŠf',n œ˙R˙˙˙óf ˙˙ÉţV;Ő&, o˙˙˙‰Â’f' p˙ œ ˙˙´Â”f' p˙. §B˙˙śÂJm't„ p˙˙˙ënH&Mš˙$˙˙˙ănö&Mq˙˙˙˙ŘnŇ&M š˙.˙˙€Ň%˙˙˙äx7&M q˙.˙˙˙ćzm&M r˙0˙˙˙őgm&.y.u˙˙Y1&.q˙.;˙˙˙üf'.q œ˙R˙˙˙í}f!˙˙~‹f' ¨ţř œ˙˙•Âąf' ¨˙ §_˙˙śÂJm't„ ¨˙˙•˙â*H&Yš'˙˙•˙â*ö&Yq$˙˙•˙â*Ň&Y š˙˙•˙â*ŇD˙˙şţV¤a&U pť˙˙şţV¤a&U ¨ą˙˙•˙â*7&Y q'˙˙•˙â*m&Y r˙˙˙üçm&9yvu˙˙˙üç1&9q€;˙˙˙üÇf'9ŕ œ˙R˙˙˙á‘f#˙˙5a'6¨ ¨ţ˙˙ŞF)Ň&j œl˙˙×FRŇ˙˙Şđ‰fC˙˙‡ţV'f& 0Y˙˙‡ţV'`&]Y˙˙‡ţV'f&bY˙˙‡˙ă'7&] qO˙˙‡ţV'7&  Y˙˙˙ü˙ăf'4; œ˙R˙˙˙ň˙ăf"˙˙˙üf'=D œ˙R˙˙˙Űf$˙˙NţVĎç&= o˙˙sîRfv†ÂxaH´ ÔŔܲ?]<1ś Ô´?_]°KPXĚŔYĚ̲?]90ąIąIPXł@@88Y53#7"†ň††ň͔žgd߃śœÜĚ1Ôě0!!dýĺƒ¤˙˙d߃ šdéłyśŠé/Ć1üě0!!dOűąydéœyśŠé/Ć1üě0!!d8üČydéœyľŠ/Ě1Ôě0!!d8řČyéyľŠ/Ě1Ôě0!!řy˙˙ţř&__J˙˙˙ěţ˙î&BBBŽéÓŐ@ žÜüÔĚ1ôě0#53Ó¤Ré­?ţÁ˛ţ×Ő@ žÜěÔĚ1ôě03#Ó¤R՘ţÁ?Ž˙Óţ@ žƒÔěÔĚ1üě0%3#Ó¤RţŹţŔ@˛ţ×Ő#5…R¤՘ţÁ?˜ŽémŐ '@ž   ÜüĚÔĚţÔÎ1ô<ě20#53#53Ó¤RšÓ¤Ré­?ţÁ­­?ţÁŽémŐ '@ ž  ÜěÔĚÜîÔÎ1ô<ě203#%3#Ó¤RšÓ¤RŐŹţŔ@ŹŹţŔ@Ž˙mţ '@ žƒ   ÜěÔĚÜîÔÎ1ü<ě20%3#%3#šÓ¤RţfÓ¤RţŹţŔ@ŹŹţŔ@ŽémŐ #5!#5R¤mR¤Ő­ţÁ?­­ţÁ?­9˙;ÇŐ '@𠁠YW Y Ô<ěü<ě1äôÔ<ě203!!#!5!¨°oţ‘°ţ‘oŐţ\™űŁ]™9˙;ÇŐ>@ šš  ÂY W Y Ô<<ě2ü<<ě21äôÄ2Ä2î2î20%!#!5!!5!3!!!Çţ‘°ţ‘oţ‘o°oţ‘oßţ\¤š™¤ţ\™ýá3Ń…! ˇ Ç \ Ôě1Ôě04632#"&3­~|ŤŹ}}Źú|ŤŤ|}ŹŹ3Őq3˘đţˆěÁţłÔě1˛ƒ/ě073#ěŐŐţţěkţśÔüÔě1´ƒ/<ě20%3#%3#–ŐŐýVŐŐţţţţěţ #@ƒ   ÔüÔěÔě1/<<ě220%3#%3#%3#–ÔÔŠŐŐú­ŐŐţţţţţţÜkŻi3#ÜÓÓiţq˙ă Lđ #'3?KŽ@D$%&%&'$'B@’ .’(’F’4 :&Œ$‘L%IC'1+C =  1 =I 7+ ! LüäěÔÄěäîîöîî991ä2ô<<ä2ě2îöîî20KSXííY"K°TK° T[K° T[K° T[K° T[K°T[X˝L@LL˙Ŕ878Y"32654&'2#"&5462#"&546!3#"32654&2#"&546"32654&ôWddWUccUžşť şťůtžźťŸŸšş% üZ VcbWWcd˛žşť şťŸWccWUcc‘”„‚••‚ƒ•ÜťťŰŰťźŰŕŰť˝ÚŰźşÜůóŽ•‚„””„–ýŸÜťťŰŰťźŰ”„‚••‚ƒ• q˙ă rđ "-7;EP\"32654&'2#"&546"32654&'2#"&546  &54%3#"26542#"&546"32654& WddWUccUžşť şťýyWddWUccUžşť şťřÖ<źťţšß üZ uŹcbŽcNžşť şťŸWccWUcc‘”„‚••‚ƒ•ÜţŠŰŰťźŰ”„‚••‚ƒ•ÜţŠŰŰťźŰŕŰť˝ÚŰźşÜůóŽ•‚„””„ţ5ÜţŠŰŰťźŰ”„‚••‚ƒ•(` Ő3(­Ëţß`uţ‹˙˙(`ĚŐ& Ů Ů,˙˙(`řŐ' Ů,& Ů ŮX(` Ő#3 WţßË`u˙˙(`ĚŐ& Ü Ü,˙˙(`řŐ& Ü' ÜX Ü, ţŤ˙Ă#'#Ť”ťź•RţůůŚžs#G@%ččččBçŚonüě291ôě90KSXííííY" 5sţÓ-ţ+#żţôţôż˘RÁ–#I@&ččččBçŚopü<ě91ôě90KSXííííY"5 ÁŐţ+-ţÓ#ţ^Rţ^ż  ˙˙ĂëĚ&™K'˙čN''=NÎ˙˙“OŐ'˙^O“°đ$#5>323#7>54'&Lż Za^Ág¸ßHZX/'ĹËËĹ-93A%‘­ #Cź98ŸL‰VV/5<4ţňţBţR-5^1Y7˙˙˙ě| B_˙§ţÇ˙… %ł ÄÔÄł991@  ÔÜÜ<Ě202$7#"$'56çĹĺëţ:ŕßţ<ěćÂţľhh~vvuw~ig˙§Çn %ł ÄÔÄł991@  ÔÜÜ<Ě202&$#"56$6ŕĆëĺţ;ççţ>ćěÄnvv~hhgi~wu˙ŞţIŐ3 # #çbţâbíícŐţ$ţ$Šţv˙˙=˙ĹĂƒ' ý{' ý{ “݁3_!!ÝVýŞ_Ţţ‰˙ăÍđ+@BŒ‘ÔĚ1ää0KSXííY"3#- ü\ đůó°ţňX 3!!#3hđţX¨đđ^ý#"ý#J°ţňX 53#5!!53°đđ¨ţXđ^JݏřޏÝ˙˙Jđ&"ˇ"g˙˙“Jđ&"J˙˙“Jđ'˙^"šd˙–] 7ˇ ÜÔ91@ B Šź Ěô<Äě20KSXˇěěY327# 'dšęűłţŕ˜uţĂČ]€ű(Žě˙;‡Ő 2###Ź×ë׎žŐ螸Ýü˛ůášŘÂ( 3+"&5463yŻŻv}Ź­~ýąŹ}|ŤŘÂ( ';2+‡ŻŻv~­Ź}ÂOŤ|}Ź˙˙=˙ĹĂk ý{˙B# #5#5đÓÓR¤#ţţüŰŹţŔ@Ź˙˙˙§ţÇn& ć ç˙˙=˙ňĂo' ý¨ ˙˙‘˙BCŐ'‘'Ž˙ŮHdÓœ1#"'&'&'&#"5>32326œžć’”ě 錄ܔžć’°Ň 錂×1˛OD;>MS˛OE<>L˙˙˙§ţÇ˙~ çř8Č| #'7!5!'737!!Ş ůqůţŸaúqú úqúaţŸúq)ţŸ`ůrů úrűbţžúqú ůrú2śś 535353úČ,ČČȐČČţ˘ČČźČČ˙˙(`$Ő' Ů,& Ů' Ů„ ŮXfNč 53!535353fČXČý¨ČČȐČČČČţpČČ ČČföNŢ 5353535353öČČČČČü,ČÜȆČČţpČČ ČČüôČČ ČČŰŽŐ3#3#ŰÓÓÓÓŐţü'ţdţĺýď 3#%3#3#3#dÓÓĆÓÓýÓÓÓÓiţţţ„ţůňţpDŐ %53535353#!5!3!†ČČČü,ČÜČ| ýfš šöČČ ČČüôČČ ČČţ„ýfš ›ýe ŰPŽ> 3#3#3#ŰÓÓÓÓÓÓ>ţýţöţŰŽw 3#3#3#3#ŰÓÓÓÓÓÓÓÓ‰ţěţü–ţđţWîđ "27654/2#"&546Ę2332Ę233—ĄŞŞĄ˘ŞŞ—VVŹ­VVVV­ŹVŻŢÓÔŢŢÔÓŢzœî@ Ü<Ü<Ě1@ÔÄÜĚ03#3#zttttýg‚?œôß Ô@ Ý ÷‘ ] ÜÔ<Äě291ôüÔ<ě290K°TK°T[K°T[K°T[K° T[K° T[X˝@˙Ŕ878YK°TK°T[X˝˙Ŕ@878Y@T /9IFYi‹Ťť       "5GK S[ e„Ľľ]] !33##5!5ÝţË5ڇ‡ţbfţ]ýämşşyfÓß !!67632#"&'53264&#"ŽţţyĄ^^a`°<~B9>>Eo‚‚o4h6ß_Ě MLƒ‡KJq fŽf\óđ/"327654'&&'&#"67632#"&547632łX3333XW3333Ť1221€DD &9:D‘TTXW‘§°llś122m45[Z4554Z[54bg KL™1LM„ONŢÔĆuv lœŐß!#!liţ¤ˆHţ3ß0üíäYěđ *:"32764'%&'&546 #"'&54767327654'&#"ş55j]\655ţěT./¤RQ./SZ85UVžŸUV56-/.UQ100/SS0/*,+KLV,+–+]12Hdt::dJ01:7PyAAAAyN98Ć?&%%$A?&%%$Séđ.532767#"&547632#"'&2654'&#"‘1220DC #<9E¨WX‘§WXklś122ĚXf33XU5443Žg KKš/˜„MNooÔĆuv rh\Z4554Z\44‰œ°k !!#!5!Q_ţĄiţĄ_kţČ_ţČ8_8‰Ô°3!!‰'üŮ3_‰a°Ľ!!!!‰'üŮ'üŮĽ^‡_o #&'&4767TRRTe^///._üţţţ€ƒ€ú~„gˆ3#676'&ge_/../_eT)**)„~ú€ƒ€~~uœÄ0@ ÔÜ32ÄtNN^luu)qJy}ţ…wYYk\ţžsa88†˙˙W˙ńîT ýd˙˙‰ĹC{ýd˙˙^´Ttýd˙˙b˙ńÍTuýd˙˙?ôC ýd˙˙f˙ńÓC ýd˙˙\˙ńóT ýd˙˙lŐC ýd˙˙Y˙ńěT ýd˙˙S˙ńéT ýd˙˙‰°Ď ýd˙˙‰8°— ýd˙˙‰Ĺ°  ýd˙˙o˙if ýd˙˙g˙iˆf ýd˙˙M˙đĄ‚rýd˙˙G˙đŐ‚xýd˙˙G˙đĎ‚ýd˙˙u!sĽýd˙˙G˙đŐ‚yýdVŽÖ##"32.#"3267!!!!!!ÝO˛cţţŰ%ţeąNL­bŔĚĚŔb­LÄýÓýę:ý/¸667756ŸGFęţDęFG €ţľ€ţk€s˙Śž9'.473&'3267#"'#7&'#7&'&76%73&'hA>›/(%:@ţÁwÓ]aŘy›A9&›A˛˛ œă‘X}R4>CţÁ5AëiĽŐ<)ű—^_ÓHH?W‡ćĎghĐšKüpţŘî”Ëű•(`˙äłđ,%6767# !2.#"3>32.#".aXj]aŮyţĘţ›e6{Ů_]Ôwęů|^™˜0šn&<$€‹Š'/_ÓHGžghŸGGŐ_^ţÇţŘţٜu]\YŞśŤ…ËŐ!!!!3###5qZýpPý°úúĘě~WŞţHŞţľEţÇ9Ebđ#!!53#535#535632.#"!!!5-üěżżÇÇÖč=—OLˆ=”t‡ţyěţžŞŞB_óś))›ÔHş˙B+#&'&#"#3676323632#4&#"#ĚŞm49wSSšš>YXyzU6%…ŞX\xŻžšruŚšžxGM_a˘ý‡`Žf21>&>EÖ3öáý\žĄœž¤ý‡u‡Ő"&)''#!333#3#!###535#53355KOś8~ÄÓĺÄĂĂĂĂţđÓĺÄĂĂĂĂ8~OOŻÎÎţň““4ýÚ&ýÚ{“{ýÚ&ýÚ&{“{{““ţňÎÎÉ˙ă ÎŐP32654&#+#!233!!;532654&/.54632.#"#"&'5#"&5‡ď…‘‘…Ýqzěďž­ězWQŽeţ›GlŤ`ť[z„_Ą<ĄÓÂ`ŠHJžU]‹;š›éËUˇfŤÉ˜/ýϒ‡†’ţĚČjqý¨ŐqRˆ>ţý ‰N#55YQKP%$•‚žŹŽ((TT@I!*™‰œś##ŸŇ`É˙ă3ŐE326&##.+#! 32654&/.54632.#"#"'&“ţ’••’żŮżJ‹xÜĘČüƒ}A{>[b`ca‚ŒeŤ@Ť˜ŕÎf´LN¨Z‰‰b”?ÄĽ÷ŘZa,/ýúŘ–bý‰ŐÖ؍ş$~´3YQKP%$•‚žŹŽ((TT@I!*™‰œś;ŽŐ"&)-1'#53'3!73!733#3#####5!73'!!7ś]:1Ě00ă00Í19]zžáţÚĂÜţŕŸŔĽĽţu‘ű ĽĽĺ}ýL‘uÂuü€€ü€€ýg™uuţüýg™uuuu_˙ăńŐ % #4&#!#)"33!3_˙¸°ţą¸Žýý˙ţú¸°S¸ŇţÖţÜţ‘VđÓú˛*$oţŞđÓN˙˙ţŔ&ӏŠ˙ăđ1@: Ó"+Ó ĄŽ•ĄŽ•/‘Œ) 2+"!)#&  , & &*!/<ÔÄ2üÄÄ99999999991Ä2äôěôěîöîî2Ý<î20K° TK° T[K° T[K°T[K°T[K°T[X˝2˙Ŕ22@878Y@z  1Ti lnooooiko o!o"o#n$l%i'i-ŸŸŸ Ÿ Ÿ Ÿ Ÿ ŸŸŸŸŸŸ–Ÿ Ÿ!Ÿ"Ÿ#Ÿ$Ÿ%Ÿ&Ÿ'Ÿ(Ÿ)Ÿ*Ÿ+Ÿ,-2   USjg ]].#"!!!!3267#"#734&5465#7332[ŠfĘ A7ýćž8ţŠ ʝfŠ[Yš`íţË(Ó7‹Â7œ(6ěbšbŐiZČť{.# .{ťĘZiÓHH"{/ #/{"G(Ő33!!###5ż˝uóý€ŞţX°ůý_˝—Tý‰wýsýĎý1ásŐ!5!!77#'%5'&ýîďýîĺPţËćPţĘËçM4čMžŞŞţńĄo؈˘oŮý¸şĄnو˘nĐţ9 ¤đ-bwƒ'67>32#"'&'"326767654'&'&67'>7632#"'.'&/#"'&54632326767654'&'&&#"32š˘">1–aJ{%A01Q[W7>/÷W1   >$< ůš ´. #ŽdCwŻË-^URB$`>DL_K>.3b @N\uLM„iIäą(S395lš9,8„ýG(/&  -ţ9)ЗiRm:3X’wdg7? 2řj7#=5(6$ 629T/ ˇ(2M !:5S}$@{mbőqŒ‚~Es/4 -& "TAB`]…’ü›|@8†nR€kcd]aCœű ".˙ăŽđ)5'632327&547632#527654'#"'&#"%654'&#"š‹“o|@X"07ăPYˆtaTkľ~jü†[Iw‰mqJ2530D#24!`đNkBąţŹX``SąăŤŁżÂ†q˘J<“Xr~hFŮlŻV1??0WŚD˘Ő$+15#53!23#3#+##5!3276!&'&+!!64—RRČűL\HGZMűţĘSţţMţ˙Mţ#ýÝ#ěVtqDjt,tkDqý¨xttzIYIíV,]˙[ąx$-#5&'&76753&'&'6767#5!'ůŒß‰¨¨‰ßŒi`p^_kbkN?H9x"cxhuŒ…OooOĽ§ĚmnÍŚ‰$F×_0,ű?'‘ŚýS*%˛§ l™ţŃţҙlŐ5!3!!3##!##5373!/331ľĺľ0ţűGž“ľŇŞţŞŐľ’˝IÁCŠDúŇiR{ýř{Ď{ýřýř{ĎĎĎ{Au˙ăźđ66767!5!67654&#"5>323!!!3267# $547#5\J€ţ5’ ;łĽ_ĚsrÚiőŻţýgŘC…üS1ź­rě{€ďjţçţݨĄJ,{ +kv€67Ĺ&&äĆUB{\* {;^~ˆFEĐ/0ŕŮK?{ŞţÓw!,&'&#2767#&'&576753w[TUeeUT[Y\Y[dšsÔÔy˛e]Y\ţŠ[CvlC¤Ői--űń--iÓH$"ţđuÖ9BËtčâ"#űŁůBuŞĄf´lCü˙Ë3!üÚ~„ĺ˙›dü=˙ö!5!'3 üGĺ„~d›ü=z˙Ë!#'73!5ý„~ŻŻ~„ĺ›Í͛ü=z˙Ë5!'3#7ü=ĺ„~ŻŻ~„d›Í͛üF˙ě 3#%3#%3#üËËËËţyËËfĘĘĘĘĘËűPF° 3#%3#%3#%3#ËËűkËËËËţyËË)ĘĘĘĘĘĘĘËü=z˙Ë #'73!'3#7üć„~ŻŻ~„<„~ŻŻ~„›Í͛›Í͛C˙ĎŘ $(B"326=7#5#"&54634&#"5>32%3#.#"3267#"&54632 pSHfźź™mŚÍĆŠogDc\”GÂÁ°ŘüDŘŠ^o8y‰‰y8o^I‚IĘěîŃC€öBRCI”‚ Mţ >Ož–›W\ 7˛$ĘúůË„˛4œ”“4ą"úŃÔůC˙Ďţ +EI.46'&#"#&'53254&'"326=7#5#"&54634&#"5>32%3#V‡šNz$p´;i0™‰ĘŞŻ‘%“‹ą={ű‰ pSHfźź™mŚÍĆŠogDc\”GÂÁ°ŘüDŘ}|ďŽ4ź9d$, !ó•5ĘLf,1„BRCI”‚ Mţ >Ož–›W\ 7˛$ĘúůËs˙ă'đ!.#"3267# !2'Y藣yyŁ—čYjí„ţ­ţz†S†íý #bvAZ4ű-4ZBuHHŸghŸGű[!ŹţşţťŹ!˙˙Ă˙ămđ&r&F˙ÖŐ+™¸,/¸-/¸ܸܸ,¸(и(/¸ÜA&6FVfv†–ŚśĆÖ ]Aĺő]¸¸ и¸ и¸и¸#и /ş!"+¸!0153&'&'6767!!5&'&76wI3cc3IĘ86QLNN7887NNMR48×ü_Ąk•—ił:rÍÍq;Ôzn #Ź+ü¤+Ş$ *ŞŢ rŸn<˙Ďĺ(2.#"3267#"&54632%3#"326&$  &54^o8y‰‰y8o^I‚IĘěîŃC€ÝŘüDŘkavva`wwţß‚ÚÚţ~Ů—˛4œ”“4ą"üŃÔůKůËž’‘Ÿ   řŐÔřřÔŐ<˙ĎM-1332653#5#"&.#"3267#"&54632%3#\źQPcuźź`žĄýŞ^o8y‰‰y8o^I‚IĘěîŃC€ÝŘüDŘLýőriuđüD PÁ˙˛4œ”“4ą"üŃÔůKůË˙˙¤˙ă{đR˙˙oţÖ#ăÁţó˙˙Ă&đ&r)I˙ăŒűo!6767632#"'&#"32767#"'&'&547!#"'&54632327676"#"'&'&54767632żlř(9BKc{=&%%03!((!,739%7`lG;7 ţ25]­šhB4,'5  'B[QF$%ˆ]c'G  %! }Kr~“,§ę1ýźŃŒ˜Ig)*!&!(D;wÖţ˝Ľ‚},75;!_']7:y}Š[´ĎžŁ\Ž@4>#,!, 'QFާ˙j(JG4$$,*)/9„yK#%ţů‹ŮP73276767654'&'&#"&'&"'632654'&'&54767767#"'&'672#"*i(X%# 1F‚S°E/ ËO.55Fu˝PU[QF[00rlÓ~œ"‘KI}!;IFs;nĄíň;_ţéT^͌Q79}w˛–^l.G‰yr\[4ţúO9%#i#Ţ^MX;€Ľyv@c„“}e.ID\7I;>2V秉uÓ°ţ˘ÓţţÉŐ3!3%!!!!!!ŐĘűŽĘţŇ’’ţnýęţnqúó úó dýˆxú+Űý%H‡#>54&#"#3>32uƒšƒ j_”Ů y¸/¸wFÚx”Ł ¤ý\/HT^ČŚý“ýœ^m ‘$RZ˜3%632##"#'7ˆš-ţP4ŞçÁ—-ƒ¸‚>ř•Ń {šßŃőę|aˆţőÉďčý\ž=ž¤ý‡BcL;˙átđ9#"'&5476323276765"#"'&54767632thÁ‚n<7# ;KQ>!|Za,4(XM‹•ľ!}ă,üţţ†Â‚<7D9#7.M=†„ž.1?@ '(MXI(' j˙ăFđ!2?632327654'&54?#"'&#"632327#"&#"jŒou9„!ydG>PPŐPP5Ęşň6…8^nm{z€}}ȋoÖz€ZĽ'PV‰aK~p’md Œ‹yk”bź^ňŢOP681/:Ş:b:D˙ănňJ327654'7#"'&'$#5"'47676766767632#"'&'&'&#"32ŰnZS_n0VBšR„äny#H‰B?„ÁX!$9BŠ„€Mw>7l. ;7%,;(Ó§˝uy,D0˙ä˙ăŇđ&3273#"'#67&5477632654#0)W:K…32#"&'####53&  Á¸¸šąýO:ą{Ě˙˙Ě{ą:š¸¸ĄĄ›§ţܧ§$“““}ţ˛daţźýđţźad¨úü}űă–ççţjçĆ˘Ő %# !3!# ýîęü”¨ĐdţXý0dd úóqűáú+áű6ÁŐ+/ą’—B°“°˜B°/ł,/°<ą•í°°-ݰ.<°-°ް#Íą?ą °<ą •í°#° °9° FhH°°)°#°#Ii;ą€BąB=°°#I°€bi°F`°Fa°’C°`#B°’C°`C°UX°°’C°`C8Y°˛& °<ą€BąB0°0ąţ°<°Ä°ąý°<°ą 6ü°<° ąý°<°9° FhH° ° °°#Ih;° <° °Ö°° ݰ,9°, FhH° °&Ö°&°°° #Ii;°/°,°#Ih:°°1#I°’C°`#B°’C°`C°PXľ& ,/°’C°`C°8K° RX° °#I°’C°`#B°’C°`C°@PX°’C°`C°@a°’C°`#B´ °’C°`C°8YYYą€BąB=°°#I°€bi°F`°Fa°’C°`#B°’C°`C°UX°°’C°`C8Y°˛#)°<ą€BąB1°°#I°RX ą°ąí°ąý  ą°°<  ą°°< Y3525!463"!4632#"&732654&#"5!6“–ş“ţđýjăggggŒ92299229ŒîŞkŔű̀•Şkű@áü4€•nŠżżŠŠżżŠNggNNggýD{{ĺĘ "-! ! ! ! '32654&#%!2+# ÚţJţŃţĎţR´12)ţ÷ţúţ†uyťýÓ˛ckkcţÁ?°´´°˛ńŰţÎţĐţL´00śeţ…ţůţűţ‡y ťwţŻXQPXd‰ƒ…‡ţ˜nţ;Cö0<67632#"'67327654'&#"#"'&57&547276545ˆ[ŤŰ„ƒFIœyŽeL )qz]E& J˝ţŸ‡EYƒq:?ß.蔁0.A ƂžMke”˝LPŤÚ×§<+(ŒhĂ|H=ţyţŢ|nŽ=B† üžî¤üďĆ{u.F/4_NČTŐ 33!27&#%!2+!67654'&,Ęd.ý@‘úţ˙űţţnX<-]\,qúó ýj’dŰÓŐÚýˆZý™)VŸžV)sţřŮđ!)%#'# ! % 7& 676'&B ôÝ3ţĹţ‡y;:xŃý+lllţđli$ ›› Ţ#››ţÝďĽabĽţ[ţžţüţŽ 22×22űjT%śýœľ%5űŻ$ścś$B˙î2 _327654'&'&'#"'&5476323276765""'&5476!6?232767#"'&B=]iS\Z—ÎV30FŸšn7;#FfS9!!ç< #5,h˝";<ś‰„2XngšZR{,##9>;K!QĄýIagÂŁSűć Ŕˆ‰DŁ5@7*'S:y}ž*‚7H0 5#!,I‘lť @3X§żnh0ŢÍ{(2r:=OS˙ălńIX&54'&#"#"'&527654'&#"3"'&547632763227767654'&#"R(O*\xggŒfg-.@@?@@?\QA@@@S6—fggf—˘eÓťp/$~AB}:1$ -*ü¤šMJJ@fˇŸŒ[Ś+8ÇÎvuuv° zVWWW–›•XWWVĘVW\uvœuuu# bW1ąW{|^1$h{ƒ€vC[SK\ţ•GChfy— /Č2Ő &.2&'&+3!.+!! !27&#676'&%3űLDEx-MeÇţř5q>ÍţHżJ‹xţn§üu1ý•E˜A+ZY*ü˛Ę—01/ÉţĺO„~ţh–bý‰ŐÖŘĐb)Ľýj’ý™)V>U)-úó ŠƒŐ§¸ /¸!/¸ ¸и/¸ ܸи!¸ܸÜAęú]A)9IYiy‰™ŠšÉŮ ]¸ и /ş9¸ /¸/¸/ş+¸ş +¸0132654&#+#!273 # #sţšš s­ţĘČűNŽžčţÍCéĎÔčI/ýϒ‡†’ý_6ý¨ŐăŰŹkŰęţ†ţkţü•É˙%TÇ$+.3&##&'&''7#!27%7 67654#“ŃČ?\üA>:AÍŮżKE6TţŽoF^Č~_ ţş,ś8~ƒ|§T3Jýۏ/ýîřýHD‚ţh—0& ü°,ŻŐ‚oތk؍şçţ]-Dƒbü‡g‹(Ř'4.#"#"&'532654&/.54632733###ćUW'AG/E8piŒ4sG[d/EK7?8pcŠ|3iиĄ˘¸ŠŒ‡‰ˇY"*/( VAO[`*,2,* M=H\ţŹTýČ”ţŘ(ţl˙ü0`!!#!!!!!!!3!!łţr˜ţsŕoţŐţ+öý…ď…ŕý›`€ü ŕ`fţ÷fţťf€üćf'“FŐ >@!  É  b b cbcÔäüäÔěÔě91ô<<ě2Ô<<Ä903#######5JޤŞqĂ7ËrqËrÉŐ˙ýžäţŃ/ţB^ţä^˙"hÄ %73# ' 3×ţş,śţ˘ŚÚŇýÇĺžýo-ţŁÓM†‚oŽüţFéú+žý„,ő’\™Ő %#!!!5!Č8ęüČküČOúĂ8üßd úóqdúódd XţL/ 654&#!5!5!5!!2!"'XŞŁÁšĽţđ÷ţ ÷ýÄ$ţ'Ůţ'ŹßŚšţţťÔ§cŁĚ†“Śe“e“¨ţ°¨ţ°aԊţÓf†J˙˙NĎç=˙˙N˙ăĎĘsţΕDU767654'&#"#"'&5733272632632!"'4'&'&#"'6763232767654'&'&#"Ž_}yj#1Q€–\$˜####‚,TGG\<‚„lG2űe$°ňţ×sa#0EKXQn#?QY>™k›DMý4ţëÇgiŕMqŤĚţí˘˙ă†đE#"'&'&5476?&'&547632#"'&547654'&#"3"32767'_˛űilE_†m˛l=Oc{ńˆT3-2") %+fa@aP/Z_|Ť{w:maZu> IhAŹ"%@_ŠŽŠl$=P”‹czS2VN-2!$+%$+@e—}N069n™Śa[u>_T˙ß M#"'&'!#!"'&547632327676=!7!&#"#"'&5476!27327î#X':'7á?<=˙**MĆţô€_4. B^l{>!ţ—'Ba>ÁnG#&#w§4$Bšť00!ňŁK=ýÜDc˜„€KĘ_4B( 03B{>ce‚šDInFT=I,F´w§7K. 0É#Ő )5!!5!3#üڐý°PĘŞ¸ŞÉ9˙ÇBk32767"'&'&47'&'&'#"'&547632326765&#"6767632377632#"'&'&'&#"×,5(.'*'E`Ÿ97Žy{7a;f7;>F3.^PeMD*#7@,j!HhH<=.%_yiĽpp3 T}€œ˜˛B',$ *ý5܀/,,@!;Da97žT‘łţÄţÉţVMć;ŠnwFţíťł^O?/,%!;>jytŸÖX<;}f?E'_nĽţúţôţą Hô—˜''#  .h˙çJ) 4&#"322#"&54ŠWOmVPmÂ˜Ëݢ˜ËÝ÷t}ţţĎt{ýŘŁĆţ˙ŘŁĆg˙ă˛đ4 4'+5654/&4?'&547 '&5474/Ä‹c2üű›>BŹd=VEőÄ/b5Œšńc2ltc2śc2Đţuc1‚LS2œ?BŹdÖ,>8?]/c6ź›ńc1‚LS2ý–tc1‚LS2śc1‚LS2˙ű˙ă9ń03#!".54?>3!4'.#!".54>323!2žO,‡"űô"…$„%@ý;5H *ÖY[śü#$‡"†x2 1[G(  W˙¸Ađ,!2#"&/#!"54?>3!!"&5462TPl 0%= -d,ţmF"…$…ţşmG- .7#*(/ ‚ý$ţű"Sae(!‡Íq~B;V˙¸şđ&!"&54>323!2#"&'&5 ýmG * 5G 0%9 . Śq~( 0 (/ ‚&ýJ“s!S'DQIF× 4632#"&3!53#5!źpQOooOQpƒ˜ýo——ůTQooQOonűuyy5yZ˙ŐR; ! ! ! ! ţHHţ¸ţćţĺé#ďţ[ţŸţžţ[ĽbreţHţý¸Â ôÝ!#ţĹţ‡y;:xŃ— L`  !!!!#!3#'!#33 # #—ƒţźţD—ƒľj˙—wŠZţDZŒ֏őöţĂRţëţé``€ţśýéţC5ü€ćć€ţłMţRţ.}ţƒŢ$˙đz`-1%5"'&'&5#2327#"'&5#!#"#463!#3#‰, †9áYl(Ht„ý*§ţ˛=Z2drĽśý!††Z4@'!8˘ ýÖŚzEBŻ ńĘbýăüüLs¨{dţYţŻ˜ţsZ{3#"#4763 3׎UE‚El4FŒĹŠdGQő´‰n ‚ËCFÁţ\ţ§ţxŸBýúž*WŸbOZý=šţţÉţžýýČ0Ő 3%!!,Ę:ý*ţnqúó ddúŐÉŐ3!3!!!!ÓĘűĘ ţnýěţn8qúó úó úqúŐţwSÁ ! ! !!5 5Śýţüúüđ—üúüđůĆýţÚY*üÖü§çdüÖü§ccSŁ˙ăťđ!!6$3 !"$'53 !"kJýîu ^‹ţuţ˘’ţůopü‹ţíţîk¨ţţoځSUţgţ“ţ’ţgHF×_`2/.2%ŠŐ!#!5!ŠĘý)Ą+ިŐ!5!¨ü_×Őú+Ş+˙üçŐ!# #3çŮţbţeŮËfýšÇý9WJŐ " )327&#!3676654'&|˛¨tKţ"ţPýý"űcő­â“öţoűĘűŻÍĐAfŐľ|ßcvţ~ţ–ŐdúóA‹Aúó xűăPfUÂmZ˙ă­ #2!7#"547632!3 32767654'&#"ç* 6ŻB8wxţ˛!Nbb|˞"#>Ë|OO'vNţţ÷† ý2˝Ľwx87ĽtžKsO= † =‚üí¨d01 ”P˛˛D10d^dúŹTţdü6‚‚ŸžJthi[˙ă“{ (232767# '&5477632!7!654'&#"Ú NĄ&# ¨G_yZ\klmkţô}Z5ľłüäfFý 9NŠJC0<7h:‚ýJ(u*œoŚDM˘Ą‘c“FPZd82vRsO 3#3#!!ɸ.¸Ô†˛†$ţ˛ÚNéű9˜ü`˙ţV 3##676#732767!ɸ.¸fʆĐ#5H2KţÜÜ1i0/éNŢ)deéúżűĐľT0Hôd01™ŹűŒÖ``;˙ă¸đ&0 #473>32#"&'532654&7>54&#"şţ;Hşt]ţéühäƒń2††02޸SĽUWžDiƒ;2[UÔ _ŚI@YËr„~•YWţí׀ác?}<˘Ĺ$$ś/1oX3gÎQĄX’Â?@Qˆ` $@   F ÄÄÔěě21@‡‡ź/äěÔě0!5!!5!ˆüÉţů`ű “o“Ë˙˙‰˙ăXđ&{' ë5u‹ýd˙˙^˙ăXđ&t' ë5u‹ýd˙˙‰˙ă^đ&{' ë5 ‹ýd˙˙^˙ă^đ&t' ë5 ‹ýd˙˙b˙ă^đ&u' ë5 ‹ýd˙˙?˙ă^đ& ' ë5 ‹ýd˙˙‰˙ă~đ&{' ë5 ‹ýd˙˙f˙ă~đ& ' ë5 ‹ýd˙˙‰˙ăwđ&{' ë5 ‹ýd˙˙b˙ăwđ&u' ë5 ‹ýd˙˙f˙ăwđ& ' ë5 ‹ýd˙˙l˙ăwđ& ' ë5 ‹ýd˙˙‰˙ăđ&{ ë5˙˙É“Ő,˙˙É'Ő&,,”˙˙ÉťŐ&,',”,(˙˙ÉQŐ&,9é˙˙hŐ9˙˙˜Ő&9,˙˙,Ő&9',,™˙˙ ŔŐ&9',',™,-˙˙ÉŐ&,;Ü˙˙=;Ő;˙˙=ŽŐ&;,˙˙=BŐ&;',,Ż˙˙ÉjŐ/˙˙s˙ă'đ&˙˙ɰŐ'˙˙ÉŐ0˙˙ÁyL˙˙Áé&LLp˙˙ÁY&L'LpLŕ˙˙ÁA&LYÂ˙˙=`Y˙˙=˝&YLD˙˙=-&Y'LDL´˙˙=&Y'LD'L´L$˙˙ÁJ&L[Ń˙˙;y`[˙˙;Ô&[L[˙˙;D&['L[LË˙˙ÁyO˙˙q˙ăç{F˙˙q˙ăZG˙˙ş{Py }Ő  ) !3 !## !5˛–ţhţPýŒţPţh–˛Ÿô5ţáţËôĘôţËţá5Őţ—ţ€ţ~ţ–j‚€iúŃ.,űw‰ţéţÔţŇţčɰŐ#űş +¸ ş+¸ş+¸¸ ¸ĐAęú]A)9IYiy‰™ŠšÉŮ ]¸ ¸ĐAęú]A)9IYiy‰™ŠšÉŮ ]¸¸%Üş"+¸ş+¸ş+¸ş +¸ 013 !#3 #32654&#! )“ô5ţáţËôHđń˙HNŸ““ŸţčŸ˛–ţhţPţaYł.,˛ÂĎĐĂžý职ЁŢţ—ţ€ţ~ţ–y }Ő(1C3 +3 !32654&+! ) #"35# !35#"&546!`Hđń˙Hô5ţáţËôNŸ““ŸNŐýŒţPţh–˛t˛–ţhüąNŸ““ŸNôţËţá5ôH˙ńđ/˛ÂĎĐĂł.,ü°ŒŠü j‚€iţ—ţ€ţ~ţ–ßŠŒž˛ţéţÔţŇţčłĂĐĎÂ˙˙s˙ă'đH˙˙˙ăő{dĚ?8 ´  ÔÔĚ2@ @@ 00 ]1@  œ Ôě99ĚĚ0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY5!!d‰xéĂű=éxUZ‰xéŞéxŁÜ @  œ Ôě99ĚĚ1´  ÔÔĚ2@ OO ?? ]0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY3'#'-ZˆxčŞęxÜţvxęű<ÄęxuĚP8 ´  ÔÔĚ2@ OO __ ]1@ œ Ôě99ĚĚ0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY'7!5!'7Pţwxéű=ĂéxŻZţwxéŞéxŁ˙ůŐ @ œ Ôě99ĚĚ1´  ÔÔĚ2@ @@ PP ]0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY#737‡ZţvxęŞčxŠxęÄű<ęxdĚP8Úś ÔĚ2ÔĚ2@ PP_ _O O]1@   œ Ôě9Ě2Ě20@   œü<<@ œü<<@ œ ü<<@ œü<<°KSXˇ <<<<´œě´œě´ œ ě´œěY5!'7'7!d‰xéźéx‰ţwxéüDéxUZ‰xééxţwZţwxééxŁ˙ďÜŢ@   œ Ôě9Ě2Ě21ś ÔĚ2ÔĚ2@__P POO@ @]0@   œü<<@ œü<<@ œ ü<<@ œü<<°KSXˇ <<<<´œě´œě´ œ ě´œěY3'7#7'-ZˆxččxţxZţvxęęxÜţvxęüCęxţvŠxę˝ęx 4Ÿł 7!!# ?,ţś^xü˘Št?Šü˘x^ţś 4Ÿł #'!5`?Šü˘x^ţśł?ýÔJü˘x^Š 4Ÿł %!5!73Ÿ?ýÔJü˘x^Šs?Š^xü˘J 4Ÿł %'3!_?Š^xü˘J4?,ţś^xü˘ŠdĚ?8'!5!!BȔ—ý˙éxţw‰xédȔ—š-ţĽUéx‰Z‰xé[UţúŞuĚP8!'7'7!'!5rȔ—éx‰ţwxéýœČ”—ţf×[UţúéxţwZţwxéţĽUŞ,ÓžP4327>76767632&'&'&#"#"'&/#7!í#/)85,0F"<;NJX[GR7<"#!2)85,/$#?2WG[XJN; Š?,ţśô!F0O<:" %7xţŸýéxUZ‰xéaxţÂţÂxaéxuĚP8 '7!' 7!'7PţwxéýţŸx>ţÂxaęéx‰UţwxéţŸx>>xţŸéxţwdĚ?8 !5!3#•űçéxţw‰x骪-éx‰Z‰xéYü¤ĽÜ %'3'!!5čxˆZˆxčZü¤ŞęxŠţvxęű檪uĚP8 †ˇ œÔě2ÔĚ2@ O O _ _ ]1@  œ ÔĚĚü99ĚĚ0@  œ ü<<@ œ ü<<°KSXł  <<´œ ě´ œ ěY!#3!'7'8ű窪éx‰ţwx-ţ§\ţ§éxţwZţwxĽ˙ůŐ !5!!7#7ţ¨\ţŚčxţxZţxxč+ŞŞűćęxţvŠxęĽÜ7!!5!7'3'Żčxţx‚ü¤€ţxxččxˆZˆxčÂęxţvŞŞŠxęęxŠţvxędĚ>†%52#!5! 767>54&'&'&>42/+-+-':1 üHéxţw‰xéŮŮÜŞ-)o=Ü  éxţwZţwxé(.46<=69)-dĚ>†>3276767654'&'&'&"5476767632+#5!5‘‚ 6 Š+/24>A1:'-+/24>‚Šý”éxţw‰xé×  ‚‚=69)-(.46=<69)-ÜÜéx‰Z‰xévĚP†>54'&'&'&"3)'7'7!#5#"'&'&'&5476767632# 6 +léx‰ţwxéý”Š‚>42/+-':1A>42/+ׂ  éxţwZţwxéÜÜ-)96<=64.(-)96=dĚP8X#532267676767632267676;'7'7#""'&'&'&'&'&""'&'&'&† éxţw‰xé 0$#$   "%'-0$' !  ' '- éx‰ţwxé  ('Z&("  "(&Z'( -éx‰Z‰xé$ -#%"&* 'éxţwZţwxé ""&*  *&"" džPF%'!5!!'7'7! pţœéxţw‰x领 pdéx‰ţwxéţ^ž:5éx‰Z‰xéo:ţËéxţwZţwxé*˙üŘ %'7 ý!§^ßÁ bţ9YţÁ‹žţXxýî¨ű¸ž‹ţŔČbţńZ ň #!5 Şţéxţw‰xé‘űoçéx‰Z‰xéŹ[ň !'7'7!#Ź—éx‰ţwxéţŞ‘éxţwZţwxéüZ˙ă Ő !5!3 ýiéxţw‰xéíŞDéx‰Z‰xéçŹ˙ă[Ő 3!'7'7ŹŞíéx‰ţwxéD‘üéxţwZţwxéÝ˙ůÔ 7#7!5łéxţwZţwxéýÔÔü=éxţw‰xéŞdĚ? !5!3?ü=éxţw‰xéŞ-éx‰Z‰xé,- eX&7#754767676 #4&'&'&"9čxţxZţvxę.-\ZnllnZ\-.ŞBB54'&/#7!!#"'&'&'&54767D !BB54'&´x\-..0YXpl€…gtTY0../Z#ţś,@Ş#B"!BB@RNžJV°]xţw‰x]TQ>°]x‰ţwx]ţŹxL iiţ ţ`iiTÁ4Ź]x‰Z‰x]ŕ4Ź]xţwZţwx]JŇiiiiuĚP8!7'!7!5!7!'7'7!'7!5˝giiţţÚyýěYu‚I0]x‰ţwx]ýĚu‚IţŤiiŇŇxĘK]xţwZţwx]ĘKxdĚ?8!!5!!ŻűÉ]xţw‰x]7űQix]x‰Z‰x]xiĽÜ#'3'#'ńx\xˆZŠx^xh°űP8^xŠţvx^űȰhuĚP87'!5!'7'7!5$iiűQ7]x‰ţwx]űÉiix]xţwZţwx]xĽ˙ůŐ737#73ńjhx^xţvZţxx\x%hh°űČ^xţvŠx^8dĚP8!7'!!5!'7'”iiüli…ý\]xţw‰x]¤]x‰ţwxiiiá]x‰Z‰x]]xţwZţwx¤˙đÜ7''3'7#7ńiiiá]x‰Z‰x]]xţwZţwx°ülii”iü{¤]x‰ţwx]ý\]xţw‰x ˙Ńł #7!##ÉPUýŠ?,ƒűUü°•vü°Uű„,?ŠýUPź˙ŃŸł5#'#5!#5'ö•ü°Uűƒ,?ŠýUv”ü°UűŠ?ýԄýUź4Ÿ 753!5373öü°UűŠ?ýԃýUP•qPUý„ýÔ?ŠűUü° 433!'3ɕPUýƒýÔ?ŠűUq”PUýŠ?,„űUdĚ?8!!!!5!!cÜű$ŠRü&xţw‰xÚűŽžxŠxx‰Z‰xxuĚP8!5!'!5!7'!5!Qű$܊űŽÚx‰ţwxü&RFxŠxxţwZţwxxdĚ?8#''''#53777?(F´´´´´ncéxţw‰xé‹F´´´´´n-F´´´´´néx‰Z‰xéF´´´´´nuĚP8577773'7'7#'''un´´´´´F‹éx‰ţwxécn´´´´´F-Şn´´´´´FéxţwZţwxén´´´´´FŁÜ3'!!!!#!5!5!5!'-Zˆxč(ţŘ(ţŘŞţÚ&ţÚ&ęxÜţvxęţŽŞŞŞţŹTŞŞŞręxŁ˙ůŐ#7!5!5!5!3!!!!7…ZţxxčţŘ(ţŘ(Ş&ţÚ&ţÚęxŠxęrŞŞŞTţŹŞŞŞţŽęxdĚ?8 5!!5!35!d‰xéqţéxŞ˙Ş˙UZ‰xéŞéxaŞŞŞŞŁÜ 3'#'3#3#-ZŠxęŞęxbŞŞŞŞÜţvxęţŽręxţVţŞ˙uĚP8  '7!5!'7%!#'#5Pţwxéţqéx‰űÎ˙˙Ş˙UţwxéŞéxţw(ŞŞŞŞŁ˙ůŐ 737533-ţvxęŞęxţv‚ŞŞŞŠxęrţŽęxţv4ţţ¨˙kË?9 !#3?űîęxţvŞŞŠxęתęxŠţ~\ţ€ŠxęuËI9 !'73#'7!uęxŠŞŞţvxęűî×ęxţv€ü¤‚ţvxę7†?~ 5!! !!Ďţö  űôdţü űôŒţöţöƒý}üüţďţ*^V 3! !!dţöţöƒý}üüţďţ*p ţöűô düţűô H†P~ !! !!¸űô  ţ’űô üŒƒţňƒ ţÖţ^˙ÍVŐ #!# !!!dƒţňƒ ţÖţe űôţön űôţ^V !! !3 3!!!Eţ*ţďüüţďdƒţöţöƒrţ*rţň$čüţţ|č ţöţţÔţ¤\d”^V )3! !3#!5#3 3 üšČţďüüţďČýĆČžČƒţöţöƒ\°üţýPd””x ţö@t %#!5#3'!3!3! !33'ÓȞȥdţxdĄ:üšČţŃţŃČýŮčtř””ZddűŽ\’ýćýnŞt^V%#!3!3! !3!5#3ÄšŘtIüššţţüüţţšţštř”äŘű\°üţýPěű”x^V%3 3!!! !!3 37áƒţöţöƒrţ*ţďţčüüţčţďkŠţöţöŠ€dô ţöý dôüţţč| ţö€^V %#!5#3 3!3!! !!33 37ÓČžČƒţöţöƒ:üšČţďţčüüţčţďČţ͊ţöţöŠ€ř””` ţöü¨\˜üţţčţh ţö€u†}~ 7!! !5#35! u\°üţýPd””x ţöĎfČţţČ:Čýbȃ  ƒzMŐ!#7!!#Múc"?,ţś^xü˘ŠŐcúŽŐţŸ?Šü˘x^ţśzMŐ35!3!5!73zpcţŢ?ýÔJü˘x^Šcrú+a?Š^xü˘J^˙ÍV 3 3# '! !! !áƒţöţöƒƒ  ţţţďüüţďe  ţöüőţö dţüCüţuĚP8)5A '7!"'&'&'&'#5367676762!'7$"!&'&'!27676PţwxéţĄ 21@=“:C.2 žž 21@=“:C.2 _éx‰ü_R#)l$hţ˜$#R#$Uţwxé@21.2@Ş@21.2@éxţw#ţđ˙˙w˙ů;Ü' Ď, ŃţÔuţtP'7!5!'7!5!'7!5!'7P˙˙ţwxéű=Ă××ű=Ă××ű=Ăéx‰˙˙U˙˙ZţwxéŞ×ת×תéxţwZ˙˙dŔ?D5!3!!#!d‰xé3ŞćţŞýÍéxUZ‰xémţ“Şţ“méxuŔPD '7!#!5!3!'7PţwxéýÍŞţćŞ3éx‰Uţwxéţ“mŞmţ“éxţwdŔPD3!'7'7!#!5މéx‰ţwxéţwŞţwéxţw‰xé×mţ“éxţwZţwxéţ“méx‰Z‰xédŔ?D5!333!!###!d‰xé§ŞŞŞţ⪪ŞţYéxUZ‰xémţ“mţ“Şţ“mţ“méxuŔPD '7!###!5!333!'7PţwxéţYŞŞŞţâŞŞŞ§éx‰Uţwxéţ“mţ“mŞmţ“mţ“éxţwdŔPD333!'7'7!###!5œŒdŒ éx‰ţwxéţŕŒdŒţŕéxţw‰xé×mţ“mţ“éxţwZţwxéţ“mţ“méx‰Z‰xé7Ä?@  !ĽúJţBžJˆôúAţƒžžţƒ‚uÄ}@ 7'!5! úúPűśJžţBˆúúţł}ţBţB7Ä}@7'! ! úúü–úý6ţBžĘžţBˆúúţ ôúAţƒžžţƒ}ţBţBhŐ %!3!3źýŰ ýĆՈĄˆŇýÇÇçüRŐţú+‡˙ănđmş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]ş+¸ş +¸0132#&'&#"327673#"‡ űű…B!ĘOœœOĘ!B…űűţ÷ézĆcI7™ţÍţĚţĚţ͙7IcĹŒ_˙ăÄL 0"'&547632654'&#"563 3276767&#"ľ\m`c˛u\6% GźGnth r5?Ł€ţÁ,/H@3H5,Yš„:$Ueˇž”˜I+HQ\‡N­,¨öt­qƒţ¸œzSd69->eSY׎lÉ‹Ő !5!!5!!5‹ü>řýřýŐú+ŞěŞëŞÉ˙˘‹5!#7#53!5!!5!733!‹ýKŞc˜˜ţĐd˜ţ0Ş4˜ęţâ˜śŐú+^^ŞěŞëŞ``Şţëýkţě›˙ě]Ž(673#"'&'#7&'&$32 '&#" 32$767&'&Yj€iEdČţ šť°80~iŞ?/cĆ`ťš°üÉô‘™šţÝRQQ$gý'-‘š™"SRR:;nSz˛ţ€ţž_'œŇBTą€cž_ űéĽN“‘››‘@DüRO“‘››‘g˙ú`Á8@ÔĚ91/ÄĚ90@cmpxyvn]] !3!Źţ^DýďŕCúšîűÄú?˙ú`Á%! !Ź˘üź3ý˝fý˝Ó<úńÁú?Ż˙ěIŽ!!"$54$3!!!W?JŒ‰”šýGŔţžžcŔšýG”‰‹K@ ősJx‹NLŸĆ`ťš`ȟMOŠx] ŻţĺIŻ&/!!!!3!!"''&'&54$;7#"ؖI$ţ˘šýݰ$$šýGA?d–`,,ąžžcŔęüÝFU ;¸°“Š}YIŻ7Ɵţ ţŸ ţî7c`ťš`ČüĹJx‘H ¸ üNG’x]ٛĺg% $54$)!!3!+ţŘţÖ*(şţFčiNvüŠ%Frßş›öđđöŽO:…Ž‘0QŽŻ˙ěIŽ&'&'&'!5!2#!5!676767!5Ą?JŒ‰”ýGšŔcžžţŔýG𔉋K@ ű 'Jx‹NLŸĆţ ťšţ ČŸMOŠx] ŻţĺIŻ&/'7!5!!5!&#!5!2+4'&'&'3276765 –IţÜ^šýéQ°$$ýGšA?d–`,,ąžžţŔę#FT‚ ;¸°“Š}YIţĺ7Ɵü ăŸ 7ţřcţ ťšţ Č;Jx‘H ţH ţNG’x]ٛĺg )5%2767!5&'&!5“(*ţÖţŘţFşčiNüŠv%FtÝţFgöńďöŽP:…Ž‘1RŽ,ëâ ¸/¸/01!!,żâüœţwqÁ@×ÖŻggÔěÔě1üěě20!#!#œŐđý ďÁřś}ůƒœţwqÁ@ÖׯggÔěÔě1ü<üü03!3œďöđţwJůƒ}řśţw;Á ]@    ÔÄ91ÄÔĚÎ990@0QVPZ spvupz €€ Z pp{ t €€ ]]!! !!5 7ęüA ýJďúŢŐýIÁÁý3ýŔ•!ăŮ-ŰלœÔÄ1Ôě0!!ŮúţתŮŰ !#!5!3!!5!ލýÓ-¨-ýÓý+ƒŞƒţ}ŞתŞŮŰŐ Wş+¸¸Đ¸¸ и¸ и¸ и/ş +¸ ş+¸¸¸и¸ Đ01!!#!5!3#Ž-ýÓ¨ýÓ-¨¨ ţŞţűŞű5Ě˙˙˙B˛Ő˙˙Š˙’<%?ŠPŻ%73% %#'ąţTUʍŹUţTŹUţT¨ţTU‚÷“÷ďţ÷“÷÷“÷ţď÷“˙˙DGžÂrýŇ˙˙XYŞŠ Ë%ˆ=˙×} *@    ÔĚ91ÔĚÄ903##'%\˝sýŽBţÁ}}`ůşs-Pbý;˙˙=˙×v& Xus†˙˙=˙×e& X s†ÜĺŰĺ 127#"#"'&'&'#"'&547632676;#"3Ľc‰d3668+MI6641C;It‡Y^^SI6?+((C;ItK@”t‰kđHMfpEF„?$Tx5@ejݍre!93Ex5@ƒđţúÜĺÎĺ#/;&'#"'&54763267632#"'&%27#""327654'&Ľ1C;Js‡Y^^TŽI6?+((C;Js‡Y^^TŽI66ţ6Ľc‰d3778ë•s~Šd3778]$Tx5@ejݍre!93Ex5@ejݍreMđHMfpEFôđţúHMfpEFË™I%!3!™ű‚ŞÔË~ü,ŻIŐ%!3IúfšňüËĘĘŐúőŻ˙”IŐA¸/¸/ş+¸¸Đş9ş9¸¸Đş901%&'&'3!!#4'!&'7`'JAWţÎă`ňţLqR]+XţÉŒü* Pʋ†s^ţă(ýRs“§°Ę57756uí˙úÜŃ5ş +¸ ¸ /¸/ş 9ş 9ş 901 7&'7%%'6 676rý{Ž‹ÔţŠEG…ţ%†yýÝ44RŔW!L!$îŇžłĆ Ą“żŇń&!L éţçţđ{ž°ţJP+3#°  +řfţJ›+ 7ş+¸¸и¸и/¸/ş9ş 90137#'° űPţľ ýMVŐüœ°oçü)gąnţJđ+3#3#  @  +řářfţJ›+{¸/¸/¸¸Đ¸/¸ܸи¸ ܸܸ ¸и¸ и¸и/¸/¸ /¸/ş 9ş 9ş 9ş 9013737##'   [PŤ   ]MćEü+qdý @oxűş×pü™÷AnÓ˘!3# iúhĂţŢţݢű^ŹüTÓ˘3 3#Ă#"Ăţ˜ú˘üTŹű^Ó˘32#4&#"#őńđőŹ”ĽŚ”ŹP(*ţÖţŘý°7ôÓÓôýÉÓ˘332653#"Ź”ŚĽ”ŹőđńőRPýÉôÓÓô7ý°ţŘţÖ*uţMś>2&#""&'7327㢗~”9GA˘—~”9G⧅}Œ‚Żú°§…}Œ‚Ż˙˙uţMŰ& i i%˙˙uţM& i' i% iJuţMś-6?67632&#"#"'&'7327&'&5476767654'&'ăSOJMG7”9GcBnnVsSOJMG7”9G]InoSuŠ=,EG%,˝=,HK%â§DAF7Œ‚ŻţÖK|’œoUţž§DAF7Œ‚Ż1Io›œsVý›/HgjG$ţ4Ö.JhgH$uţMŰMQZc67632&#"!67632&#"#"'&'7327!#"'&'7327&'&54767!!67654'&ăSOJMG7”9G~SOJMG7”9GcBnnVsSOJMG7”9Gţ‚SOJMG7”9G]InoSu‰~ţ‚ž=,HK% =,EG%â§DAF7Œ‚Żţâ7§DAF7Œ‚ŻţÖK|’œoUţž§DAF7Œ‚Ż$ţçDAF7Œ‚Ż0Io›œsVý’ńţ!Ö.JhgH$şţ+/HgjG$uţMmqu~‡67632&#"!67632&#"!67632&#"#"'&'7327!#"'&'7327!#"'&'7327&'&54767!)!67654'&ăSOJMG7”9G~SOJMG7”9G~SOJMG7”9GcBnnVsSOJMG7”9Gţ‚SOJMG7”9Gţ‚SOJMG7”9G]InoSu,ţ‚ýŰ~ţ‚ž=,HK%2=,EG%â§DAF7Œ‚Żţâ7§DAF7Œ‚Żţâ7§DAF7Œ‚ŻţÖK|’œoUţž§DAF7Œ‚Ż$ţçDAF7Œ‚Ż$ţçDAF7Œ‚Ż0Io›œsVý’ńţńţ!Ö.JhgH$şţ+/HgjG$uţL.3&#"7#'754'&'#"&'7327#4767>32";EY?w^Hž6źH\O3,, HO€”;E+@/VfmVm HO€ö‚Żţł?uœ]H˝˝H]sM3 ügĽ‡z‚Żˆ.Vr›mV_Ľ‡zuţM<%4'>7'7&#"7"&'7327&'&54767>2ˇ=,HK%€˜=Q ‡Hl;EYLmHH§7'&#"'"&'7327&'&54767>2ˇ=,HK%m#6,=iSH˛;Ec‹¤HKÂsŸ˜€”;E]InoSuŸ˜€JÖ.JghH$6B0ţ+‚@THţ֝?¤HK|ŔţžĽ‡z‚Ż1Io›œsV<¤ˆz˙˙yÍžŐ' ˙žţ…' đţ… G˙˙yÍžŐ' Gţ…' đ ˙ž˙˙ĄÍtÖ' ˙Ɛ ˙Ćţ…˙˙yÍžŐ' đ' ˙ž' đţ… ˙žţ…˙˙Ů-Űj' $ PٟÜj 3#3#!!ÓÓÓÓűĐXü¨ţËţ•Ş˙˙؟Üj& P' ˙ýţW' ˙ţ$' -ţW .$˙˙ٟŰj& z' ţW $ŮÓŰ2#"'&'&'&#"5>32326Űiłan’ ›^XŹbiłan“ ›^VŠ2łNE;=LTłNE;=KŮÓŰ23276767632.#"#"&'ŮgŠV^› “nałibŹX^› ’nałi2UK=;ENłTL=;EN˘1Ô).#"3".54>323265.#72#"&:QŸHRdhNiœ\dŽnxÂ>@°HRdhNiœ\dŽnxÄ.ttlH=Y›OšHL˘\}X[lH=Y›OšHL˘\}ŮWŰ­#"'"#322Ű{űćdfftXŞ{űćdfftX×ý€ÖÜţ#€ţ*ţ$ÝĐ0!#.5476767654&'30´ND:323267#"''ćcDXŹbiła]yŹ›¨eEVŠgiła`yŤ›S LTłNE+~FţŒ KUłNE,ţ…FŮۢ #"/&'&#"5>32326!!Űiłan’›^XŹbiłan“ ›^VŠűeúţołNE;=LTłNE;=Kˆ¨Ů`Űô#"/&'&#"5>32326!!Űiłan’›^XŹbiłan“›^VŠűeúţô˛OE;=LS˛NE; =KţkŞŮbŰÓ%&32767#"'!!'7!5!7&#"5>32Ë%H\Ż iłaBPŸü﹉lţ噸‘ZXŹbiłan“3ďý}oţé -X"˛OEşŞţdšŞó8LS˛NE;IüٸŰÁ"#"/&'&#"5>32326!!!!Űiłan’›^XŹbiłan“›^VŠűeúţúţÁ˛OE;=LS˛NE;?KţkŞËŞŮŰÁ.#"/&'&#"5>32326#5!7!5!7!!!!'Űiłan’›^XŹbiłan“›^VŠüLç•ŃýšŒoţKĐ…üÉŚoÁ˛OE;=LS˛NE;?KüLŞËŞŠsŞËŞ sŮ˙öŰB.32767#"'!!!!'7#5!7!5!7'&#"5>327b K`Jqiła'+\+ýzlňüłh’>ůTmţ?u2›^XŹbiłan“c†’"%]˛OEŤŞËŞÂNtŞËŞÚ=LS˛NE;%úNŮŰô;?@.9*-" *œ19œ"œ œ<-<Ô<Ä21ÔěÔěÜüÔěŔ9999990#"'&'&'&#"5>32326#"'&'&'&#"5>32326Űiłan’ ›^XŹbiłan“ ›^VŠgiłan’ ›^XŹbiłan“ ›^VŠołNE;=LTłNE;=KÚ˛OE;=LS˛NE;=KŮŰ˙43267#"'3267#"/'&#"5>327&#"5>29+VŠgiła@LJ“ZVŠgiłaƒ}¤‰9+XŹbiła@MH’ZXŹbiłÂ ¤a KU˛OEť8KUłNE; ţ˜@^ LTłNEť8LS˛NE;f@ٸŰÉ59#"/&'&#"5>32326#"/&'&#"5>32326!!Űiłan’›^XŹbiłan“›^VŠgiłaq›^XŹbiłan“Ć3VŠűeúţL˛OE;=LS˛NE;?KҲOE;=LS˛NE;?KüîŞŮyŰŃ5P#"/&'&#"5>32326#"/&'&#"5>32326#"/&'&#"5>32326Űiłan’›^XŹbiłan“›^VŠgiłan’›^XŹbiłan“›^VŠgiłaq›^XŹbiłan“Ć3VŠײOE;=LS˛NE;?KҲOE;=LS˛NE;?KҲOE;=LS˛NE;?KٸŰÁ"32?632.#"#"&'!5!5ŮgŠV^›“nałibŹX^›’nałiúţúţÁUK?;EN˛SL=;EOţČŞŞţ‹ŞŞŘ×Ű+  %5 % $%5$[ţáţœg&Yţ˘ţŕ%ZţŁţŢţŕţhÓŚ˛•ڞ—łŚ˛—¤˛—Ů6ŰÎ9%676767!!"'&'&'!5!!5!676762!!&'&'&[C-8›ţö7VYÎYW6 ţöœ8.CC.8ţd 6WYÎYV7 ţe8-Ů,CE[¨<0[2332[39¨\DD+N+DD\¨93[2332[0<¨[EC,Ů`ŰÎ !5!676762!!&'&'&!![C.8ţd 6WYÎYV7 ţe8-ý;úţ++DD\¨93[2332[0<¨[EC,ýăŞ˙˙Ů`Ű˙' š ˙˙ŮŰ˙' ýş&  š˙˙ŮŢ˙' ˙ţš&  0ý˝˙˙ŮÝ˙' ˙ţý˝&  .š˙˙Ď62Ď' ˙ôţî' ˙ô‰ W˙˙Í63Ě& ô' …† …ţîŮ`ۢ 3654'!!5!&547!5!!ć44ň34wúţ~ţ€ţ‰ú0IG00GG2đŞŞ?8>;¨¨_8Ů`Ű !!!!"264&'2#"&546Ůúţúţ…Hdd‘deH;k'**¨z{¤§˘¨đŞDbFE``‹bq+((d:sĄžvvŁŮ`ŰK!!!! &!56Ůúţúţ‚áŕţ˙ţć風đŞ뗲—•˛—Ů`Ű!!!! 3# Ůúţúţ$´Ÿž¸˘¨đŞ‚ýcŮţ'Ů`Ű!!!!33#Ůúţúţ$ڏžŸţý´˘¨đŞţ'ŮýcŮ`ŰĘ!!!!!!'Ůúţúţú+]^*ň^ôó]˘¨đŞNţä°ţä°°Ů`ŰÔ !!!!!3!Ůúţúţ‚ŚNßp!ýN˘¨đŞŔţNfýŮ`Ű07GO!!!!#"3###535463!3267#"&546324&#"'53#5#"&4632264&"Ůúţúţ¤?$mmC???DíţĎNB&H#$J'`qk[Q_C<17HĆBB@,I\\I,@Íp`ctiG6B?9iÚýĐ=$#tžu#g“SS“SŮ`Ű*!!!!>32#4&#"#4&#"#3>32ŮúţúţŸ!]?U\Z79EPZ7:DPZZV:;S˘¨đŞ==:xoţľHOM]QţĘHPL^PţĘ%U20=Ů`ŰÚ ,!!!!3#7#546?>54&#"5>32Ůúţúţ4eeb_--B6'Z0/`4\o$-,˘¨đŞČN2A+,/-7#!^aO&E++ Ů'ŰÝ>@" Ďœ Ď œ  Ü<Ä291Ô<Ě2ü<ěţ<ě990!!!!!'7!5!7!Ů}Ž/ţHĂ{üúţţ}ŽţŐśĂý‡˘;fŐ¨đŞţÇfÓŞđٸŰL !@  Ü<<Ü<<1ÔÜÜÜÜÜ0!!!!!!ŮúţúţúţתŞýŔŞŮ˙ÎŰ4!5!7!!!!!!'7!5!7!5!•ýD€™Q"ţrńýľnšü遙Rţ݁oţL˘ŞčT”ŞËŞËŞęT–ŞËŞŮŰ  )@    Ü<Ü<1ÔÜÜÜÜÜÜÜ0!!!!!!!!Ůúţúţúţúţ”ŞŞüKŞŞŮۨ T@.œœœœBѧœ $# ü<ě2291/ěôě90KSXííííY" 5 !!Űü@Ŕúţúţúţřţëţî˛pŞoüŞŮۨ V@/œœœœBѧœ$ # ü<<ě291/ěôě90KSXííííY"55 !5ŮúţÁAúţř°ţ‘Şţ˛ýÇŞŞÚ˙VÜ 3!! 5 !!Úúţü@ŔúţúţúţŞţëţî˛pŞoüŞÚ˙VÜ !!555 !5ÜúţúţŔBúţŞŞk°ţ‘Şţ˛ýÇŞŞÚţąÜ!5!7!5!7!!!!' 5'ţłÚ`ýĆȉŠ)Pţ"_=ý6ŠŠŢü@ŔúţŞŞsޤs1ŞsŞĽtFţëţî˛pŞoÚţąÜ!5!7!5!7!!!!'55'ţłÚ`ýĆȉŠ)Pţ"_=ý6ŠŠţÜúţŔŞŞsޤs1ŞsŞĽtF°ţ‘Şţ˛”.Ěß 5 5ĚüĆ:űĘ6üţüĆ:űĘ6ţpţrĹŸ ÎţpţrĹŸ ”.Ěß 5555”6űĘ:86űĘ:ÎýöŸýřĹŽÎýöŸýřĹŽ°ţň'!67&'&54767&'676'&'{)#Y4JJ4Y#)ţŔ)#Y4JJ4Y#) AAAAGFŁžâßŕ㞢GGGG˘žăŕß➣FGú2;;âÎá;<<;áţ2â;ŘÜč5$?$%5%67$'W´É ßeţöţť˛Ĕ‡ˇČţűäd?ţN˙Ĕ])]˛o&ś—˛Ż bRô)`˛q%ľ ˜˛Ż ţŸRŮŰd%'%5% >ýz™‡“ţ­ˆmţzČţF<ßËśęţ˝@6´Ś o@ćhś‹GpŮ˙ Ű˙%5'75%7-ý†™‡“ďü孈mţá†ČşţÄ%ËśęC@ţĘ´Śţŕţ‘@ćhś‹GpŮ˙/ŰV !5!%5%%%!!'’ţ‰/ôţƒ˝xýËv¤H-ţ‰réýŰf‹ý5L¤OlUýrŞC˘ŞÝ@=ÇV°lţь˛žţíŞŃ=Ů˙/ŰV%'!5!75%7%5!!'‘ ÖţţřGWţbč[ý˝„¤ÚýmmüÁN¤—L>üߪěw˛‹ő§°ˇe=ţ¨ˆŞ˝ţŘŞŃ=Ů˙Ü¨$%#"'&'&'&#"5>32326 5Üj˛bn’ š^XŹbh´`n” œ^V¨gü@Ŕúţđ´ND:3232655Üj˛bn’ š^XŹbh´`n” œ^V¨űfúţÁ˛NF<>LT˛NF<>L>°ţ‘Şţ˛Ů˙)ÜP14%&#"5>32%5%%%3267#"'&'&/' k XŹbh´`'+kýĆuĽE%ţsäýák œ^V¨hj˛bn’ "PĽvţ„1-LT´NDŁŞŢ9AťT°jţ͊˛œţăLT˛NF<ţń=ß &T˛N#Ąw˛‹ô¨°¸f=ý€J;Đ˙NÜ} 55 5ÚúţŔ8ü@Ŕúţ'°ţ‘Şţ˛ťţëţî˛pŞoĐ˙NÜ} 5 55Ňü@ŔúţűúţŔ'ţëţî˛pŞoö°ţ‘Şţ˛ĐţmÜ`!-%5%%%'5%%5 MMţÜ`ýşÂZŚD„ţOAňýč@ýFZŚDţt¸@ţmţŹ*ł_TW§ŞĘˆ&ţÔo°}ţ䎲šĽŞČţw&-r˛~‘°›ŢbUĐţmÜ`!7/%5%%'%5%75%ŔޘJŚ’¤ývąaŚdŽýě",ýŠ,ƒýV`ŚbţL"ýĚ_D2,Ł/*/ź°Ĺ¨&ţO{ޘ”Ÿ°­Â¸˛Äţ[&Ž}Şš”˘˛­Ů˙˛ŰP %5$Űţrýó ’ţoüsaţa^ţ~ď|Ś|Ů˙˛ŰP 55%$ُsüţo’ ýóaďţ|Ś|ţď‚^aŮ˙)ŰW!%5%5$Űţgü—VŹţţ$Üţü}ƒ×ž‘Ž…ßţĺ]]ţĺ×x„Ś|€Ů˙)ŰW3%55%$ŮŹVü—ţgƒü}ţÜţ$Ą…Ž‘ţBW×ţ€|Ś„ţˆ×]]Ů˙RŰW(%#"'&'&'&#"5>32326%5$Űiłan’ ›^XŹbiłan“ ›^VŠgţţ$Üţü}ƒąłNE;=LTłNE;=K$ţĺ]]ţĺ×x„Ś|€Ů˙RŰW(%#"'&'&'&#"5>3232655%$Űiłan’ ›^XŹbiłan“ ›^VŠűeƒü}ţÜţ$ąłNE;=LTłNE;=K$×ţ€|Ś„ţˆ×]]Ů˙ƒŰ&%5$%67%'îđţŰĂEƒšžtşÖ‹$÷ăţ‚ë‚k—Ą}u°U)Ś?ĽeKţtu•ďłuţÔíď"Śţ K 9'ŮţĺŰ'567$'567&'Ćđ%ţ=ţťţ⃚žtşÖ‹ţÜ÷ă~ë‚ţ•—Ą}uRU)Ś?Ľý›KŒu•ďłu,íďţŢŚ÷Küö9'ĚŁč_%!"54763!!"3!čüÂĘţ슊Č@üŔˆž^`ˆ@ŁČƍ‹–ŔˆŠ^`ĚŁč_75!27654&#!5!2#Ě@ˆ`^žˆüŔ@ȊŠţěĘŁ–`^ŠˆŔ–‹ĆČţęĚ˙;čĎ #";3!!!!#"54763˘úˆž^`ˆ0řrŞrnţdĘfýlpŞpČţ把ČÉŔˆŠ^`&pţ–ýp–ţ˜hČƍ‹Ě˙3čÇ 32654'&+ #!5!!5!32#úˆž^`ˆ0řrŞrţ’œĘýš”pŞpČŠŠČ9ŔˆŠ^`üÚţp––hţ˜ţęČƍ‹žŰč7!!!"'&54763!!"3!ňéűéüÁɊ‹‹ŠČ@üŔ‰ž_`ˆ@––,‹‹Čƍ‹–ŔˆŠ^`Ůöč7!!5!27654&#!5!2#Ůéű@ˆ`_ž‰üŔ@Ȋ‹‹ŠÉ––,–`^ŠˆŔ–‹Ćȋ‹ž˙Ű× '!";!!!!'7!5!7&'&54763!7!!Ńţʉž_`ˆ'œ}ýE=řüÉa†LţéT>š‚‹‹ŠČsc†L0ţ’RŔˆŠ^`–––í5¸––ƒ‹Čƍ‹ď7¸–Ů˙ö× '327654'&/!5!7+!!'7!5!7!5!^ťˆ`__BV™ý 5c†TpX‹‹ŠÉ÷?ŕüăb†LţĐm>ţUéÂ`^Šˆ`C –ď7Ë XĆȋ‹––í5¸–––ž˙jŰé )5!7!!'!"'&54763!!"3!Äţ.Bqx-ëýĽqxDüÁɊ‹‹ŠČ@üŔ‰ž_`ˆ@––Z<––Zi‹‹Čƍ‹–ŔˆŠ^`ž˙jŰé )5!7!!'5!27654&#!5!2#Äţ.Bqx-ëýĽqxţ'@ˆ`_ž‰üŔ@Ȋ‹‹ŠÉ––Z<––Zi–`^ŠˆŔ–‹Ćȋ‹Ó˘332653#"757!!Ź”ŚĽ”ŹőđńőîÄ54&'&'$  &'&'&547676!!#!5!ĹÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbÍdţœŞţœdŽ''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcb„ţ›Şţ›eŞeť˙ăů$7!!"2767>54&'&'$  &'&'&547676ĄrüŽ$Ö]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbתa''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$3?"2767>54&'&'$  &'&'&547676''7'77ĹÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbíýüxüüyýüxüüŽ''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbţžüüxüýyüüxüýť˙ăů$7 "2767>54&'&'$  &'&'&547676ćpxýgÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cb†pxý€''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$73#"2767>54&'&'$  &'&'&547676đÔÔŐÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbţ‹''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$ 2L"264&'2#"&54>"2767>54&'&'$  &'&'&547676ZPnn noO@v+..š†‡´¸đÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbAoPOmmžp1.-rB„ˇ´‡†şĚ''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$+E %#'-73%"2767>54&'&'$  &'&'&547676đţ˝C4ţŃfţŃ4Cţ˝4/f/÷Ö]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cb1ݰXˇţ­SˇX°ŻYˇSţ­ˇ''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$!;!!!!"2767>54&'&'$  &'&'&547676€ý€€ý€ŤÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cbjˆŔˆô''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰Œvwcbť˙ăů$37"2767>54&'&'$  &'&'&547676!!ĹÖ]\LMLLML\]Ö]\LMLLML\ţŽîbc1111cbîţěîbc1111cb8€ý€Ž''LM¸mj¸ML''''LM¸jm¸ML'˝dbcwvŒ‰wvcbddbcvw‰ŒvwcbţŞť˙ăů$!%!!!!#!5!QűX>úÂôdţœŞţœd‰űđ›úżYţ›Şţ›eŞeť˙ăů$ !!!%!!ĄrüŽPűX>úÂת\űđ›úżť˙ăů$   ' 7 %!%!!=ţ•kyţ–ţ–ykţ•yjjüűX>úÂěţ–ţ–xjţ•yjjyţ•k$űđ›úżť˙ăů$ 3#!%!!đÔÔţaűX>úÂţ†űđ›úżŻJš@ ÜÜ<Ü1<ÜÜÜ033!!ŻúäšýuýpŻJš!#!5!3Jú䐋ŻIš!#!5Iýs€ýsšúĺŻIš35!3!Ż€úĺŻ|š33!!ŻNý˛šýuýpŻ|š !#3!!!!.Ný˛Ný˛šţ$äŻJš !#3!!!!.úäúäšţ$äŻJš !3!!!#3šüGţšýuýpšŻJš !#33!!!#3.GVýŞţšúfšýuýpšŻJš!#3#3!!!!.cšüGšüGšúfšţ$äŻ˙ŻJë33!!!'!Ż'SsţĹjý\ţŞs=ţšýuÜ5ýYý6ŤýpŻ˙ŻJë!!!!'!#3!7!¨sęý­j˝ýţţséţhxĽjýĂë5ţäýÓ6÷ţ$šţ$ţääŻ˙ŻJë!!'!#3!#3‚sţŐţ6ţŞs=ţžü˙ë5ýYý6ŤýpšýuüńšŻ˙ŻJë!#3!!!!!'!#37!‘ôsę:ţŒjŢýçţţséţěţ˛jţGšţ$-5ţäýÓ6÷ţ$šüÁääŮ˙§Ë]*5$%67654&#"'632#"'732654'&'$Ů›@Če=M>P7sZ ˆ°”ăţ‰w㔰ˆ Zs7P>M=eČţŔ.¨(Y7O0<0:>~j yŸ[Œ<<Œ[Ÿy j~>:0<0O7YŮ˙§Ë]*327#"&5476%$'&54632&#"ËţeţŔČe=M>P7sZ ˆ°”ăwţ‰ă”°ˆ Zs7P>M=eČ@›.(Y7O0<0:>~j yŸ[Œ<<Œ[Ÿy j~>:0<0O7Y(ŮŰć 51ü˘úţ ÄţžýœŚŮŰć ƒ^ü˘Ş bbü:ČýďŚŮ˙žŰd 5! 5ŮŞü˘úţbŞŞÄţžýœŚŮ˙žŰd 5! Ůű¨^ü˘ŞbŞŞbbü:ČýďŚyg‡˘62"'&'!"&462!6"264ŸS몧ňQ3ýQ3Tň˘ŚëW4ŻüdrOOsOOS¨ď¤Q3CB3R˘ň§U4CDPrOOqyg‡˘"&462!6762"'&'!$264&"aS몧ňQ3Ż3Tň˘ŚëW4ýQœrOOsOşS¨ď¤Q3CB3R˘ň§U4CDPrOOqbgR˘ 7!6762"'&'$&"26bŔ1[뼢ňS4šOsPOtO.¨D/Y§ň˘R3BŽPQqOOy˙ ;d 3#!!#3%!5!¨¨( ý󀨨ţŘýó dýó€Şýs €Şî<›!##5!#T~čNčČě 35!3 3#ČKűőĂ#"Ăţ˜úŞŞěüTŹű^Čě !!3# ČKűľ@iúhĂţŢţÝěŞúž˘ű^ŹüTČě !!3 3#ČKűľ@Ă#"Ăţ˜ú쪠üTŹű^™~ )3!!&'.'&™ű‚ŞZVĽîF%ü,E=Ώ?~ţë%Fî¤VZDýźA?Î=™~ !53ďüÖ*ü,ÔŞÔüÖŞŞÔű‚˙úţw–Á # #ˇßËý}ý}ËÝÁřśwů‰J˙úţw–Á 3 3Ůý!˃ƒËý#ţwJů‰wřśŒţwÁ@ ÜÜÜÜ1@ ÜĚĚ0"# #4$HŰţĚ­˝ţ˝­ţĎăüű9ŕB(ţŘţžű ÇúĺŒţwÁ@ ÜÜÜÜ1@ ÜĚĚ02$53 3HŰ4­ţCţţC­1ĺăüÇű ţžţŘ(Bŕű9úĺ˙˙ţ#îuTŰHŽFˇƒÔě1Ôě03#ŰÓÓFţů1  !!'ů+]^*ň^ôó]ýţä°ţä°°ŮŰç3#3#!5!7 !! 'ßööööRţL´ţ‹xĘĘxţ‹´ţLuxţ6ţ6xőÉöţ<Şuxţ6Ęxţ‹Şţ‹xĘţ6xŮ˙Â'B  ' Ů''üٛţâ>€ý°Pú€Nq^ýD^ţ˘ĆŮ˙Â'B %  !'üŮüŮ''ýtţĘţ˘ŕNý˛€ý°PÝţ^ýDŮ˙Â'B 5  5!Ů''üŮüŮŒ6âbŕý˛Nú€Pý°Ýäţ˘źŮ˙Â'B5 5ŮŒýtNüŮ>ŕáâÝű]ÝPŮ˙Â'B 5 'üŮüŮNýtŒ>Pý°ÝŁÝţţŮ`Űô32?632.#"#"&'!5ŮgŠV^›“nałibŹX^›’nałiúţôUK= ;EN˛SL=;EOţČŞŞcy˘ 33#c×u?Ik×ţ8fşf˘ţţ%ÚqţüÝ#cy˘ 33#cČfşfČ×ţ•I?ţ‹#üÝţqÚţ%ţž˙úŰ )!"3!!"'&5463!! '&76)!"3!Űýk:((P:•ýj€ZY˛–ýkţńź˝˝ş—ýjȊ‹‹ŠÉ• ()9:PŞZX‚€´üD˝ž  ż˝Ş‹Ćȋ‹Ů˙úö )5!2#!5!2654'&#5!27654'&#!5! !Ů–˛YZ€ýj•:P((:ýk•ÉŠ‹‹ŠČýj—ş˝˝źţń Ş´€‚XZŞP:9)(ü‹Čƍ‹Ş˝żţôţóž˝ŇâN$!4&"#47632! #4'& äPtPŞZX‚€´üD|ŔźŞŠŒţpŠŒĆ:PP:ý:ȀZX˛€ý8Ćxźşţđý8ČȊŠŠŠĘý:Ň˙ăâ1$2653#"&5! '&3 765ĐPtPŞZX‚€´źţ„ýčŔźŞŠŒŠŒ1ý::PP:Ćý8€ZX˛€Čý:ţđţˆźşČý8ȊŠŠŠĘĆ|8Ő4'&'##47673#ŽZ:KŞK:ZŞŒl‘Ş“lŠŞŸ€Y:ü:Ć:Z€ýaČŒlaţŸlŠČýaŮ˙4ŰŐ###!5!5!5!333!!!!'5#YŞŞŞţ~‚ţ~‚ŞŞŞ‚ţ~‚ţ~ŞŞĚ,ýÔ,Şđ¨3ýÍ3ýͨđŞŞđđŮ^ŰŚ 3# 5¤ÓÓ7űřúţţîţ‘ţ“śŃŚŃŮ^ŰŚ 3#55=ÓÓdúţţîśţ/Śţ/śm”. Ěß  5 5 5 ĚüĆ:űĘ6ýüĆ:űĘ6üţüĆ:űĘ6ţpţrĹŸ ÎţpţrĹŸ ÎţpţrĹŸ ”. Ěß 555555”6űĘ:86űĘ::6űĘ:ÎýöŸýřĹŽÎýöŸýřĹŽÎýöŸýřĹŽŮţ.ŰÔ  5 !5! 5ŮÁü?úţúţü@Ŕúţţ޲ţŞţ‘ţŞNţëţî˛pŞoŮţ.ŰÔ 5 5!55Űúţü?ţżúţúţŔţްoŞp˛ţî9ŞŞř°ţ‘Şţ˛Ůۨ %5 5!Űúţü@ţž°°oŞp˛ţî9ŞŞŮۨ 7 5 !5!ŮÁü?úţúţ°˛ţŞţ‘ţŞŮ˙)ŰW5$%5$ŰţTüŞi™ţü}ƒţţ$Ü€ţ_…Ž‘žúŠ×€|Ś„x×ţĺ]]Ů˙)ŰW5$%$5Ů™iüŞţTÜţ$ţƒü}ţ€×ţB‘Ž…ý!]]×ţˆ„Ś|ţ€Ůţ“Ű!&!%'&'57&%5$%67&%7Űţóţ*ţズŐ˙Ú?đţŘľ;öƒŚ˝‚ČâiöÚţ€@šţ]0qw^×%¤ýĄKA6#Ž(A‡F+Ś3273267#"'' 5ćcCXŹbh´`^xn›ieEV¨hj˛b_zl›]ü@ŔúţLT´ND*óFé JV´ND+đFÍţëţî˛pŞoŮţĺܨ"%&#"5>3273267#"''55ćcCXŹbh´`^xn›ieEV¨hj˛b_zl›ţ[úţŔLT´ND*óFé JV´ND+đFͰţ‘Şţ˛ŮţŚŰW&&#"5>3273267#"''%5$ćcDXŹbiła]ym›ieEVŠgiła`yl›]ţţ$Üţü}ƒ. LTłNE+óFé KUłNE,ńF”ţĺ]]ţĺ×x„Ś|€áţ˘ăW&&#"5>3273267#"''55%$îcDXŹbiła]ym›ieEVŠgiła`yl›ţ[ƒü}ţÜţ$3 LTłNE+ôFę KUłNE,đF˜×ţ€|Ś„ţˆ×]]ŮţöŰ 7%'%5 '瞃ŮýšŰžÜýâL ‹Đž‘ţ  @ţÁYű8đýč@ŕŚ\üďÄ9ţ@aÎŮţöŰ ' 7%͞ƒŮG۞Üü´ţô‹Đž‘öţö@?YČđ@ýçŕŚţ¤ý<9ü@ţŸÎŮţ}Ű…5!%57%!!'71ŽĎý| ýäIÁžŰýˇ…Îüěvž\'ţ žÄ:ţýqŞ†ßŚ[×@ţĹZű8ńţťŞţß@áĐ_ÍŐţ}×…7!!'7#5!7%%%ŐĽéžéżý9ƒJüpvž\ş]ţFGjqœČţé8@ýÇšŚţŰţŔŞţß@áŞäľý 3!!"'&5]9Deţí´o>ůܚVf°ž™×Łýô]>#3]şşýôJ¨ýę] 4'&#!5!2Ł9Deţç´oýę$šVf°ž™×ůäŁýüX,&'&3!3#76l<(eşnP==ţűKnşe(!<˜ ýôţö_EťA_ţöýô ˜<¨ţ]> 3#!5!2765Łşo´ţíeD9>ůäיž°fVšŻţu(3ŻĆţ(÷Ř7†@Ő% !!!5 5!!3ţü7Öűôdţö  ţň†üüţďhűÂrƒţöţöƒvý˜şŐÄ! !!Őůĺ ůĺ $ű<ř–˙Ffü +   276764'&'&">  &vvýŠýŠrččýţn66\]Ú]\6666\]Ú]\6¨Šîîţčî5ţ•kŘkţ•üć\­ţSü¤ţSČÚ]\6666\]Ú]\6666\ţŞîţč˙˙š!Ž;˙‚˙ă¤>32#"&'#'%53%&  s:ą{Ě˙˙Ě{ą:šţé!8š#!ţźr§ţܧ§$śdaţźýđţźad¨ć]chŔƒaamü@–ççţjç’ţ.‚Đ!3!3: ¨ü¨ţŘřý^˘˜˙ě”č &Űş+¸ş#+¸#ş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]ş+¸ş +¸ ş$%+¸$¸Đ01! 4$32! 4$#"35%33!”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸ś|ŮěĄÚý—ęţÁţAż?ĆrĆĆţČţäţpłGąąţšý˙~+˜/üćŽ˜˙ě”č 8?ş+¸ş3&+¸3ş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]¸3¸и/Aę&ú&]A&)&9&I&Y&i&y&‰&™&Š&š&É&Ů& ]ş,9ş+¸ş +¸ ş+¸ş0)+¸001! 4$32! 4$#"!!56$7>54&#"5>32”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śO´ý\R!>/_N;„sa‘=ŁĹ0>˛ęţÁţAż?ĆrĆĆţČţäţpłGąąţšý˙ށMń"?U(?N&:Ť$—}:iF§˜˙ě”č Dľş+¸şB5+¸Bş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]Aę5ú5]A5)595I5Y5i5y5‰5™5Š5š5É5Ů5 ]ş5B9ş,5B9¸,/Aę,ú,]A,),9,I,Y,i,y,‰,™,Š,š,É,Ů, ]¸Üş&9ş;9ş+¸ş +¸ ş)"+¸)ş?8+¸?ş2/+¸2ş/2901! 4$32! 4$#"#"&'532654&+532654&#"5>32”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śš vŘĂ@ˆX[}DuskcŒ‘ZX\[4yk_ˆ=ĄÁhęţÁţAż?ĆrĆĆţČţäţpłGąąţš–]œ¨0OLGNŒ<:,+¸>ş2+¸201! 4$32! 4$#""32654&.#"632#"&5432”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śĄN\\NN\\ÔTa/w €N şÂ šŔęČ5jęţÁţAż?ĆrĆĆţČţäţpłGąąţšŸb[ZbbZ[bœ#”P =ą”‘łýçÚ ˜˙ě”č "ë¸#/¸$/¸Ü¸#¸и/¸ÜA&6FVfv†–ŚśĆÖ ]Aĺő]¸¸ÜAęú]A)9IYiy‰™ŠšÉŮ ]ş 9ş!9ş+¸ş +¸ ş!+¸01! 4$32! 4$#"!#!”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śkŤţ”ÁQţ1ęţÁţAż?ĆrĆĆţČţäţpłGąąţšKüŁ˜˙ě”č '?K ş+¸ş=+¸ş1F+¸1ş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]A&6FVfv†–ŚśĆÖ ]Aĺő]AęFúF]AF)F9FIFYFiFyF‰F™FŠFšFÉFŮF ]ş%F19¸%/Aę%ú%]A%)%9%I%Y%i%y%‰%™%Š%š%É%Ů% ]ş+=9¸+/ş4F19¸%¸7ܸ+¸@Üş+¸ş +¸ ş":+¸"ş.I+¸.şC+¸Cş4C901! 4$32! 4$#""32654&%.54632#"&546732654&#"”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śŻT__TT__ţĆjˇśivž­­žvWQMKRRKMQęţÁţAż?ĆrĆĆţČţäţpłGąąţšćPIIPQHIPIvStˆˆtSvƒ\Š——Š\ƒÁ=BB=>BB˜˙ě”č 4@‘ş+¸ş>)+¸>ş+¸ş/8+¸/A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]A>&>6>F>V>f>v>†>–>Ś>ś>Ć>Ö> ]Aĺ>ő>]ş)>9Aę8ú8]A8)898I8Y8i8y8‰8™8Š8š8É8Ů8 ]ş+¸ş +¸ ş 2+¸ ş,;+¸,ş5&+¸501! 4$32! 4$#"532676#"&54632#"&2654&#"”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śUa.w €OŸşÂ šżéČ5kŮN[[NN\\ęţÁţAż?ĆrĆĆţČţäţpłGąąţšý‹œ$“O <Ż”‘´ýčÚţö´b[[bb[[b˜˙ě”č &2>›ş+¸ş#+¸#ş*<+¸*ş60+¸6ş+¸A&6FVfv†–ŚśĆÖ ]Aĺő]Aęú]A)9IYiy‰™ŠšÉŮ ]Aę0ú0]A0)090I0Y0i0y0‰0™0Š0š0É0Ů0 ]Aę<ú<]A<)<9<I<Y<i<y<‰<™<Š<š<É<Ů< ]ş+¸ş +¸ ş-9+¸-ş$%+¸$ş3'+¸3¸$¸Đ01! 4$32! 4$#"35733!"32654&'2#"&546”ţ?ţÂţÄţ?ÎqžÁqÍúWśţ¸­­ţ¸śÍžŹźuŸţ>@EE@?FF?‚ˆˆ‚ƒˆˆęţÁţAż?ĆrĆĆţČţäţpłGąąţšţ>>'‰*ý6€Ţ—Ł˘——˘Ł—{äŃĐääĐŃä˙ěđĺœ5!ůđŹŹ˙ěšĺň!ůšXţ¨ý–¸Č3 ý– 2őÎČý–Č!Č@ý– 2őÎ˙ěđĺœ 5!!5!!5!ą4üď)üď4đŹŹŹŹŹŹ˙ěšĺň !!!!!ą4üď)üď4šXţ¨Xţ¨Xţ¨ý–¸Č 333     ý– üôŔ˛ýNf üôČý–Č !!!Č@ţŔ@ţŔ@ý– üôŔ˛ýNf üô˙ëđĺœ 53353353353ź´ł´˛´˝đŹŹŹŹŹŹŹŹ˙ěšćň 3333333ź´ł´˛´˝šXţ¨Xţ¨Xţ¨Xţ¨ý–¸Č 3333       –2ýÎř2ýÎsŮţ'ýsŮţ'Čý–Č !!!!Č@ţŔ@ţŔ@ţŔ@–2ýÎř2ýÎsŮţ'ýsŮţ'ý–ĺœ!!ÍýÓý–ŹűŚý–ĺň!!ÍýÓý–\ţ¨űüČý–ĺœ!!Čţ#ý–ŹűŚČý–ĺň!!Čţ#ý–\ţ¨űü˙ěý–¸œ!5!ýÔĚý–ZŹúú˙ěý–¸ň!!ýÔĚý–Xú¤˙ěý–œ!5!Čţ$ý–ZŹúú˙ěý–ň!!Čţ$ý–Xú¤đĺČ3! -đŘúÔŹšĺČ3! -š.ű*ţ¨ČđĺČ!!Č@ÝđŘúÔŹČšĺČ!!Č@Ýš.ű*ţ¨˙ěđ¸Č5!3, đŹ,ú(˙울Č!3, šXÖůŇ˙ěđČ5!!Ü@đŹ,ú(˙ěšČ!!Ü@šXÖůŇý–ĺČ3!! -ýÓý– 2úÔŹűŚý–ĺČ3!! -ýÓý– 2ű*ţ¨űüČý–ĺČ #!!!P@ÝýÓý–ZŘúÔŹűŚČý–ĺČ 33!!ČP -ţ#ý–,úÔŹűŚČý–ĺČ!!!Č@Ýţ#ý– 2úÔŹűŚČý–ĺČ #!!!P@ÝýÓý–.ű*ţ¨űüČý–ĺČ 33!!ČP -ţ#ý–\Öű*ţ¨űüČý–ĺČ!!!Č@Ýţ#ý– 2ű*ţ¨űü˙ěý–¸Č!5!3ýÔ, ý–ZŹ,őÎ˙ěý–¸Č!!3ýÔ, ý–XÖőÎ˙ěý–Č !5!!#ýÔÜ@Pý–ZŹ,ú(űŚ˙ěý–Č !5!33Čţ$, Pý–ZŹ,úÔúú˙ěý–Č!5!!Čţ$Ü@ý–ZŹ,őÎ˙ěý–Č !!!#ýÔÜ@Pý–XÖůŇűü˙ěý–Č !!33Čţ$, Pý–XÖű*ú¤˙ěý–Č!!!Čţ$Ü@ý–XÖőÎ˙ěý–ĺœ!5!!ýÔůýÓý–ZŹŹűŚ˙ěý–ĺň !!!!ýÔĚ-ýÓý–XVŹűŚ˙ěý–ĺň !5!5!!ýÔ,ÍýÓý–ZŹVţ¨űü˙ěý–ĺň!!!ýÔůýÓý–Xţ¨űü˙ěý–ĺœ!5!!Čţ$ůţ#ý–ZŹŹűŚ˙ěý–ĺň !!!!Čţ$Ýţ#ý–XVŹűŚ˙ěý–ĺň !5!5!!Čţ$Üţ#ý–ZŹVţ¨űü˙ěý–ĺň!!!Čţ$ůţ#ý–Xţ¨űü˙ěđĺČ5!3!, -đŹ,úÔŹ˙ěšĺČ !3!!, -ýÓšXÖúÔŹV˙ěšĺČ 5!3!!5, -ý3đŹ,ű*ţ¨V˙ěšĺČ!3!, -šXÖű*ţ¨˙ěđĺČ5!!!Ü@ÝđŹ,úÔŹ˙ěšĺČ !!!!Ü@Ýţ#šXÖúÔŹV˙ěšĺČ 5!!!!5Ü@ÝüăđŹ,ű*ţ¨V˙ěšĺČ!!!Ü@ÝšXÖű*ţ¨˙ěý–ĺČ #!5!3!¸ ýÔ, -đűŚZŹ,úÔŹ˙ěý–ĺČ !!3!!ýÔ, -ýÓý–XÖúÔŹűŚ˙ěý–ĺČ !5!3!!ýÔ, -ýÓý–ZŹ,ű*ţ¨űü˙ěý–ĺČ !!3!!ýÔ, -ýÓý–XÖű*ţ¨űü˙ěý–ĺČ !5!!!!ýÔÜ@ÝýÓý–ZŹ,úÔŹűŚ˙ěý–ĺČ !5!3!!Čţ$, -ţ#ý–ZŹ,úÔŹűŚ˙ěý–ĺČ !5!!!!Čţ$Ü@Ýţ#ý–ZŹ,úÔŹűŚ˙ěý–ĺČ !!!!!#ýÔÜ@Ýţ#Pý–XÖúÔŹVűü˙ěý–ĺČ #5!5!!!!Pţ$Ü@ÝýÓý–VŹ,ű*ţ¨űü˙ěý–ĺČ !!33!!Čţ$, PÝţ#ý–XÖű*VŹűŚ˙ěý–ĺČ !5!533!!Čţ$ÜP -ţ#ý–ZŹVÖű*ţ¨űü˙ěý–ĺČ !!!!!ýÔÜ@ÝýÓý–XÖű*ţ¨űü˙ěý–ĺČ !!3!!Čţ$, -ţ#ý–XÖű*ţ¨űü˙ěý–ĺČ !!!!!Čţ$Ü@Ýţ#ý–XÖúÔŹűŚ˙ěý–ĺČ !5!!!!Čţ$Ü@Ýţ#ý–ZŹ,ű*ţ¨űü˙ěý–ĺČ !!!!!Čţ$Ü@Ýţ#ý–XÖű*ţ¨űü˙ěđĺœ5!35!, -𬬬Ź˙ěšĺň!!!¸-ű,šXţ¨Xţ¨ý–¸Č33   ňÖű*ú¤űüČý–Č!!Č@ţŔ@ňÖű*ú¤űü˙ěDĺH5!5!ůűůœŹŹţ¨ŹŹxý–XČ333x   ý– 2őÎ 2őÎý–ĺH !!!!ÍýÓ-ýÓý–˛ŹŹŹüRxý–ĺœ !!##xmţs  ý–ŹűŚZűŚxý–ĺH !!3!!xmý3 -ţsý–˛ŹúúZŹüR˙ěý–¸H !5!5!5!ýÔ,ýÔĚý–ŽŹŹŹúN˙ěý–Xœ 5!###l   đŹúúZűŚZ˙ěý–XH !5!!!5!¸ý4lţ ţt,ý–ŹúNŽŹűŚDĺČ 3!!! -ýÓ-D„ű€ŹŹŹxđĺČ 333!x   đŘúÔ,úÔŹxDĺČ 3!3!¸ ü“ Íœ,ű€Źţ¨„ú(Ź˙ěD¸Č 5!5!5!3,ýÔ, DŹŹŹ€ů|˙ěđXČ 5!333Œ   đŹ,úÔ,ú(˙ěDXČ 5!35!3Œ ýÔĚ œŹ€úÔţ¨ŹŘů|ý–ĺČ 3!!!! -ýÓ-ýÓý– 2ű€ŹŹŹüRxý–ĺČ 333!!x   ţsý– 2őÎ 2úÔŹűŚxý–ĺČ 3!33!!¸ ü“  -ţsœ,ű€Źúú 2őÎZŹüR˙ěý–¸Č !5!5!5!3ýÔ,ýÔ, ý–ŽŹŹŹ€őÎ˙ěý–XČ !5!333xţtŒ   ý–ZŹ,őÎ 2őÎ˙ěý–XČ 5!3!5!33Œ  ţt,  œŹ€úÔúúŽŹűŚ 2őÎ˙ěý–ĺH !5!!5!ýÔůýÓý4ůý–ŽŹŹüRŹŹ˙ěý–ĺœ 5!!###ůţs   đŹŹűŚZűŚZ˙ěý–ĺH 5!!5!3!!ůü“ţt, -ţsœŹŹúúŽŹűŚZŹüR˙ěDĺČ 5!5!3!ůű, -DŹŹXŹ€ű€Ź˙ěđĺČ 5!333!Œ   đŹ,úÔ,úÔŹ˙ěDĺČ 5!5!333!ůűŒ   DŹŹXŹ€úÔ,ű€Ź˙ěý–ĺČ!5!5!5!3!!!!ýÔ,ýÔ, -ýÓ-ýÓý–ŽŹŹŹ€ű€ŹŹŹüR˙ěý–ĺČ5!333!!###Œ   ţs   đŹ,úÔ,úÔŹűŚZűŚZ˙ěý–ĺČ !!!!5!5!333!¸-ţsţ ţt,ýÔŒ   ý–ZŹüRŽŹűŚŹ€úÔ,ű€Źý–ĺœ 4763!!"Q[¨yţ‡Y[ý–`Ą†Ź~|ü ˙ěý–¸œ 4'&#!5!2.-Yţˆx¨[Qý–`~=?ʆx¨ü ˙ěđ¸Č 5!2653#xY[ Q[¨đŹ~|2űΨx†đĺČ !"'&533!ĺţ‡¨[Q [Yyđ†x¨2űÎ|~˙“ý–>Č3mů˛űý– 2őÎ˙“ý–>Č#3>˛ű˛ý– 2˙“ý–>Č # # 3 3>˛ýÜýݲ}ýƒ˛#$˛ý„ý–cűűcúç˙ěđ|œ5!đŹŹF¸Č3 F‚ú~|đĺœ5!|iđŹŹý–¸F3 ý–°űP˙ěš|ň!šXţ¨ČFČ!Č@F‚ú~|šĺň!|išXţ¨Čý–F!Č@ý–°űP˙ěšĺň5!5!!5iý—đŹVţ¨VČý–Č333ČP Pý–°‚ú~űP˙ěšĺň!!!iý—šXVŹVČý–Č#!#P@Pý–°‚ú~űP˙˙˙ě;(˙ěţ;˙!Oţţű˙ěţ;˙ö!Oţöţ ˙ěţ;!Oţüń˙ěţ;!Oţűě˙ěţ;!Oţúç˙ěţ;!Oţůâ˙ěţ;#!Oţ#řÝ˙ěţ;(!Oţ(÷Ř˙ěţq(!…ţ(÷Ř˙ěţ§(!ťţ(÷Ř˙ěţÝ(!ńţ(÷Ř˙ěţ(!'ţ(÷Ř˙ěţI(!]ţ(÷Ř˙ěţ(!“ţ(÷Ř˙ěţľ(3Éţ(÷Ř˙˙ţ:(' ˙ěţq( #'+/3!33!33!33!33!33!3§ĘüĘĘĘüÉňĘüĘĘĘüÉňĘüĘĘĘüÉţţűţűmţűţűnţűţűmţűţűnţűţűmţűţű ˙ěţ4('/7?GOW_gow‡—Ÿ§ŻˇżÇĎ×ßçď÷˙#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573ľżż’żż’żż’żżüżż’żż’żż’żżúżż’żż’żż’żżüżż’żż’żż’żżúżż’żż’żż’żżüżż’żż’żż’żżúżż’żż’żż’żżüżż’żż’żż’żż(űűűűűűűţűűűűűűűţűűűűűűűţűűűűűűűţűűűűűűűţűűűűűűűţűűűűűűűţűűűűűűű˙ěţ;(!%)-13#3#3!3!##!#3#3#3#3#3#3#ÉÉÉÉÉ^Ę^ĘĘý˘ĘĘĘ(ĘĘţlĘĘţlĘĘ(ĘĘţlĘĘţmÖÖţű÷ŘţűţűśţűýýŽţűý˙˙˙ě#;( #˙˙qţ:(…˙ěţ!&ţűě˙˙ţ9 '˙˙˙ě( ˙˙˙ěţ9(& &!"˙˙˙ěţ9(&!"˙˙˙ěţ9(& &"'˙˙˙ěţ9(&!&"'˙˙9( '˙˙˙ěţ9(& '˙˙˙ěţ9(& &!'ş˙Ő$!şü ůŕş˙Ő$!!!,7úÉrŠ<úR ůŕş˙Ő$ %3!254#!") ) ,äoääü‘ärVoVţŞü‘ţŞZäätääüŒtVţŞüŒţŞ˙˙ş˙Ő$'4+ş˙Ő$ !%!5!5!5!5!5!5!5!5!5!şúW7úÉ7úÉ7úÉ7úÉ7úÉü ůŕr°r˛r°r˛r°ş˙Ő$ !%3#3#3#3#3#şţá°°ţܲ˛ţް°ţܲ˛ţް°ü ůŕt8úČ8úČ8úČ8úČ8ş˙Ő$ #'+/37;?CGKOSW[_cg35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#35#!L˛˛$°°"˛˛üšŽŽŽŽŽŽŽŽŽŽ ˛˛˛˛˛˛˛˛$°°°°°°°°"˛˛˛˛˛˛˛˛$­­­­­­­­­­űˆŽŽŽŽŽÜŽţ.˛ţ,°ţ,˛ţ.ŽÜŽţ.˛ţ,°ţ,˛¸Žţ.˛ţ,°ţ,˛¸Žţ.˛ţ,°ţ,˛¸Žţ.˛ţ,°ţ,˛ţ.ŽţŢ ůŕş˙Ő$ !33775353535şúWââ„űý!űűäžyűB˘üߢţ|˘âü ůŕTâüţ}üüß<űB˝űäü ýüƒââş˙Ő$ !%353555#5#5#57#şţŹâýű„űäű!úÉyžyűBűüßűţ|ââü ůŕrââƒüý!üűäžűCĄüŕĄţ}Ąâş˙Ő$  $(-159=AFKOSW\aejos7'#7'7'#7'7'7'#7'7'7'75#7'7'7'7'7'37'75'7'7'7'37'75'7'37'35'!,2|5y2~~2O~~5’ţţ~|~ţ2~~2ě~~5’ţý~}}ţľ}}~ţľ~~~‰}1yţý|~|ţł|~|ţľ}||ţľ|~|ţł}}|˙z4|2ˆ~12ţ´~~~ţľ~|~ţś~~~ţł5“4~ť}22ţľ~}~ţľ4“5~4z2ú‰31|4ýä2~~1O~~4ţ˙~|~üĚ1~}1ě~~4ţý}}~ţľ~}}ţś~~~ě|1ţý|~|ţ´}~|ţś|||ţľ|~|ţ´|}}ţ4|1í~2™1ţ´~~~ţľ~|~ţľ~~~ţ´44~~1™1ţľ}|~ţľ44~~41ţŢ ůາ7!şřüüş˛%!!!,üěrřˆüvüüşšŐŽ%!!ŐůĺšôşšŐŽ!!!cúÉŠůĺ ýđrôş˙­"!şóúůäş˙­"!!!,ýńróˆ8úVůäš!Ž%!!˜űnŠ‘šôš!Ž !!!büSţďäűnŠ‘ ýđrô˙!$  ü ůŕ˙!$! ąĹýüó ŠĘúÄ ůŕţ7 üüüüţ7! ą˘ţŻţüüˆŚüčüü˙!$ü üđ˙!$ xĹű;rRffúŠ üđţ7řüţţ7 x˘ý^rřÁSSüŻüţ!7üţ!7 xŒűtrÁSSüŻüţ˙!$!üň$ůŕ˙!$ %!ąbcúüň˛ű6Ęrůŕţ!řţüţ %!ąQQüłřţ ýZŚrü˙!$ůŕ˙!$ ęĹúWýšĚýšůŕţřţüţ ę˘üzřţ­Śţ­ţü!ţü!  #ŒúWţ­Śţ­ţü˙!$  üňüđüđ˙!$ žuvýŠüó üňýˆxxýˆüđüđ˙!$ >ŐŐţ+ý‹uvýŠüó üň×ţ)ţ)×ýˆxxýˆüđüđpţ˙‹) )$7632#"'327$%&#"%632#"'‚ţ~€~ţţ~€~ţeMĽŚ§ĽMţłĽ§ŚĽţ>‡ĂĂÄÇţyĂÄĂĂďJ’JJ’ýś’JJ6ýŔ``ŔţŔ``ű˙„âqqâü|âqqţ#îu"@ÔĚ91ÔĚ990 úţţôţ ţ üĎüÇ9%űŰűÓ-pţ˙‹) 327$%&#"%632#"'ĺMĽŚ§ĽMţłĽ§ŚĽţ>‡ĂĂÄÇţyĂÄĂĂ“ýŔ``ŔţŔ``ű˙„âqqâü|âqqr˙‰' '/7?G%&'&'6767&'&'7%'676727"'64'7&"'62&47\+;.81F9K5Ú8.42d;E9Gœ,:.80G9J6ü&8.;+d1O9FíLšL&_Ŕ`JnýĄLšL'`Ŕ_ü¸n<1& j(0=Ju &,A=N:0('<1& j(0=Ju &1<>EB0(úÔn_I I'[Ę[JnýĄI I'[Ę[pţ˙‹) %/36%632#"'327&#"6767&'&6p‡ĂĂÄÇţyĂÄĂĂ AAAA‰ŤŤ–,+-,,-+öA@@ăŞR„âqqâü|âqqĹűž%ö%mąýÜą[úĐ0$ű %@%˘ü|ą"pţ˙‹) )73276'&#"7632#"'327$%&#"%632#"'™r99:9rr9:99í°XWXX°°XXWXţMĽŚ§ĽMţłĽ§ŚĽţ>‡ĂĂÄÇţyĂÄĂĂ˜ţřB!!BB!!ţo–e33eţje33ŻýŔ``ŔţŔ``ű˙„âqqâü|âqqp˙‹ @ ÜÔĚ1ÔÄ04767632#"'&'&pihśľŇŃľśhiihśľŃŇľśhiŃśľiiiiľśŃŃśľiiiiľśp˙‹ $32#"$27$%&#pŃkŇŃkŃŃţ•ŃŇţ•<§ĽMţłĽ§A˘kŇŇţ•ţ^ţ•ŇŇa`ŔţŔ`p˙‹ $32#"$"3pŃkŇŃkŃŃţ•ŃŇţ•<ŚĽţłMĽŚA˘kŇŇţ•ţ^ţ•ŇŇÝ`ŔýŔ`p˙‹ $32#"$327$pŃkŇŃkŃŃţ•ŃŇţ•\MĽŚ§ĽMA˘kŇŇţ•ţ^ţ•ŇŇ>ţŔ``Ŕp˙‹ $32#"$%&#"pŃkŇŃkŃŃţ•ŃŇţ•ŐţłĽ§ŚĽţłA˘kŇŇţ•ţ^ţ•ŇŇ>Ŕ``Ŕţp˙‹ $  $"327$!pŃkŁkŃŃţ•ţ]ţ•<ŚĽţłMĽŚ§ĽMýgA˘kŇŇţ•ţ^ţ•ŇŇÝ`ŔýŔ``Ŕp˙‹ $  $"!pŃkŁkŃŃţ•ţ]ţ•<ŚĽţł˜A˘kŇŇţ•ţ^ţ•ŇŇÝ`Ŕţpţ˙})6%63"'p‡ĂĂĂĂR„âqůÖqşţ˙Ç)#2ÇţyĂĂĂĂÖü|âq*qş˙ěš( 2654&#"!ŹúŹŤ|~­ţšŕú}ŹŹ}|ŤŤüv<ůÄşţ ( $%632#"'327$%&#"!IMĽŚ§ĽMţłĽ§ŚĽţ>‡ĂĂÄÇţyĂÄĂĂţ_O•ţŔ``ŔýŔ``ü|âqqâ„âqqůH(÷Řş ( !#%&#")%632şOţyĂÄĂĂţyŚúĎMŚĽŚŚMűěÂâqqâţ>~Á``Áşţ  3327$3!#"'$ş‡ĂĂÄÇú@1ţłŚŚĽŚţłţţ>âqqâÂűěţ‚Á``Á) %63"‡ĂĂŚĽţłÂâqv`Ŕţ) 2#%&#ĂÇuţłĽŚ)qâţ>Ŕ`ţ˙ 527$3ŚĽMuţyĂţ˙v`Ŕţ>âqţ˙ "'$33ĂĂţyuMĽŚţ˙qâÂţŔ`p‹)%632#%&#"p‡ĂĂÄÇuţłĽ§ŚĽţłÂâqqâţ>Ŕ``Ŕţpţ˙‹03327$3#"'$puMĽŚ§ĽMuţyĂÄĂĂţyţŔ``Ŕţ>âqqâ˙!$ü ůŕ˙!$ü ůŕ˙!$!ü ˙!$!$ůŕ3Ń…! 2654&#"4632"&nŠČЉce‹;­~|ŤŹúŹúdŠŠdc‰‰c|ŤŤ|}ŹŹş˙Ő$!%!!şüňœýdü ůŕr<ş˙Ő$!%!!şúW›ýeü ůŕr<ş˙Ő$!%!şúW7ü ůŕr<ş˙Ő$!%!şúW7úÉü ůŕr<ş˙Ő$ !%!!!!şý+cýý,býžü ůŕr<úÄ<˙!$ 462"! W|VV}ýÜĹýüó ,|VV|Vţ ĘúÄ ůŕ˙!$! cýüó ŠĘúÄ ůŕ˙!$! ąbüó ŠĘúÄ ůŕpţ„(  7& $  %ńĹâÄâĹţ;âţ<âýşýűţýýüţýűěţűƒƒƒƒú¨*––ţÖűXţ֖–ş˙Ő$ !!!!!!,7ýý,rúWbýžŠ<ý)ý) ůŕIeş˙Ő$ !!!!%!!,ÔcúÉrúWbýžMý)<úR ůŕreş˙Ő$ !!!!%!!,bŐúÉrý+cýŠ×eúR ůŕreş˙Ő$ !!!!!!,7ý+ýžrý+cýŠe×úR ůŕIep˙‹  $32#"$!327$%&'pŃkŇŃkŃŃţ•ŃŇţ•‰‰ţĚ]ýŁ4ŚĽŚŚMţł‰ŠA˘kŇŇţ•ţ^ţ•ŇŇÚO˛ţŹrţʞ``ÁüÁOý+p˙‹  $32#"$67$%&#"!pŃkŇŃkŃŃţ•ŃŇţ•uЉMţłŚŚĽŚţĚĎý14‰‰A˘kŇŇţ•ţ^ţ•ŇŇ^OÁüÁ``˛ţŹrţʞOcp˙‹  $32#"$!%&#"67$!pŃkŇŃkŃŃţ•ŃŇţ•\M‰‰ĐţĚŚŚĽŚ„Љ4ý˘A˘kŇŇţ•ţ^ţ•ŇŇźýÁOŐT˛``ű%O˛Tp˙‹  $32#"$327$!%&'pŃkŇŃkŃŃţ•ŃŇţ•\MŚĽŚŚ4ý0‰‰âţ̉ŠA˘kŇŇţ•ţ^ţ•ŇŇźýÁ``˛TŐOýúT˛Oý˙!$7!!xŒűtr ’úR ˙!$ %!#ŒúW˛űn’růŕ˙!$!xŒűtrŠ’úü ůŕş˙yęŻ!!!,Lű´r0Rű<6úĘş˙yęŻ!ş0‡6úĘş˙Ý"K%!!!,„ü|rhOŠünű’ş˙Ý"K!şh#nű’˙!$! #ŒúWŠ’úü ůŕ Ť€Ő "*2:AI3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'sMM7:ř=üýü=Č-0ĐY žG.Żb#ˇCýKSţ­uYţ§G†r=řýľ;ö>MMŐţ˘^›?ţ?îţ@Ç7ľá`˝d§?\ľgţíOOOOţč‚y>ý*<ţ?vţ˘^h˙ű—á"3263#!5276;'4?'4?26őŮu'6‡"gPů39†.4!  '*ĚC0.xáčV#m14He Ž'1l1 “Z+ddČŐ?33 #&'&+"'&#"/573;2?"#'57#&'#"#5676!5‹:¸+#9,–p!—ˆj[%+ > 7ÓVCĹCc":Ŕď8Ő}ţV .e3B=ýSe` e9*¤=9 3@=Úß}Ş˙˙‚k %C`Œˇă:dťć;emu}ŠÓý'S3273&'3327&'67&'67&'67'32654'&'2327654&#"3672 $54767&'&47'&327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&327632#"/#"57#"54?'&5432'&27632#"/"57#"54?'&5432'4327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&27632#"/#"57#"4?'&54327'4327632#"/#"57#"54?'&54327'&27632#"/"57#"54?'&5432&'67&'67&'67'&327632#"/#"57#"54?'&5432'&27632#"/"57#"54?'&5432'&27632#"/"57#"54?'&5432'&27632#"/"57#"54?'&5432'&327632#"/#"57#"54?'&5432üB€~ %<z*+'ţë)+(@&'$Ę|÷ŻŽř|e‹<-A}]\ŠB-7“„1SLoWŽţäţjţă\vLLýŠ)(0/ (( .1(%%,* # $ )*f$% +) $ #*+f%%,* $ $ )*űË  üť\o÷  [ Ž%)#ţˇ&'%ü&)#`#$ *) $ #+,üU  ţQ  0 üE%% +) $ $*+‰&EC&V*,)-)-*,ţ%&%&žf“‘ĐБ“fU 3HhfeefhH2Ůpu^čQFsĽŁć棼sKQčGýh!99!  !77!  Ń4 4 22 K44 22 22  11  š  ţă     ¨      Ą    7   Ů     úŕ%&%&â%'%&%'%&22  //  g     ű     ‚     ý44 22 ƒŠ ->O`q‚“¤ľĆ×čů +&'&54?632332?654/&#"2#"/54762#"/54762#"/54762#"/54762#"/54762#"/54762#"/547672#"/54762#"/54762#"/5476%2#"/5476%2#"/5476%2#"/5476D.2`{4&/<) eˆ>ţúO ,4H3R 07K÷ $  ¨ $  Š # › #  # ˝ $  Š #  $   $  ýU $   # " $   #  7Q=KG<s-8PZy9z €_e""#/2dt0&2j ,: . 4 . = , ý , ţü  -  - ú -  -  ű  . Ó . ç  , Ę  -  …˙÷§É !! …WşťVţşţţš9ýÇţŸýČ`ţ 8…˙÷§É !! 7 ! !…WşťVţşţţšDŒu€˜ţ‘Žţ9ýÇţŸýČ`ţ 8ţN ţć¡ţIŞëŐ 7%7&5476°9 ý}îV&ţ7ŕýÝA“ Ő6$ ý…ýôćţ8'^4?† ށŮ!2 7%7&547!&'6íI@ýÁçY%ţ1çýď4ĺű¨HFŮS"ýĹţŐţ="l-2ßúüDC[9Ş‚Ř &! 4$32 4$ #"&54>2‚ţJţÉţËţJÉhş˝hČúqŠ0Š´ţźţŹţź´^mNMn2Z^Z2ěţÉţKľ7ÂiÁÁţ™Äţčţw‰ąBŽŽţžąNmmN1Z00Z}ŸŃ C"32654%"32654&%#"&54767654$ #"&767&54! ą”ggJIhűœIhhIJgg[ś‚śZQoyţąţ ţąy}WZś‚€ˇ[zŔADŔégJIggIJggJIhhIJgU\‚ˇˇ‚\Q s™´ýý´™rW\ţüˇˇ\Žśř^ţ˘řą}ŸÉ A4&#"26%4&#"326! 547&'&632 $54'&'&632hIJgg”güMgJIhhIJg#ţ@ţźţżţ@z[ˇ€‚śZW}yOŕOyoQZś‚ś[s‘IhhIJggJJggJIggţ ÷ţŁ]÷´[śśţţ[Xr—´űű´˜q Q\śśţţ\‹}˙ýâĆ "32654&7#"32†ÉɏŽÉÇž˜ţÎŮ×ţÎ/Ú`Tš_ȐŽÉɎČ;™ţPţĎ1°2ÓY}žÉ1"264&"3264#"54327&5432#"'&'3xŠŠđЍłň¨¨yxŠüž&ţ˙ˇľţ˙˙ˇš€Ü˙ˇ¸ţ˙ˇľ ÚŠđŠŠđŠZŠđŠŠđýäTdľţ˙ľˇ€‰IUˇţ˙ˇľţ˙ Œ kŐ#5AMYer€š§ľĹŮ3#"'%&547654'!#"'4%$53!76=332654&#"#"&54632'#"&54632#"&54632&'&67632#"&'&676'.547>'.76$6&'&54%6&'&6>#"'.54>32#"'.54÷ [$gţi< D"űœ"D =ţif%LńçůWčđ‘ŤěĽ¨ę銧ęrƒ^]ƒƒ]^ƒŸ !! !! Ń.› .ţ *)X,)ýŻ,*))+ţ. } Ő›¤Ş™Œ+G  G+Œ™Ş¤™ţvK˜K9_ţâţę_9K˜Kýݧęę§ŚěěĽ]„„]_ƒƒŢ""""ýs!!""W&. - ýě. - a)," Ă"  ))  ě  !)ţ” /    ‘ pŐ%-5AMYdp|ˆ”ŚĘđ5#!4'&'5#2#"&546"264"264"2647>'.7>'.676&'&>&'&7>'.%7>'.676&'&676&'&53!76=3%#"'676%27+%&547654'7327&'$%'#327%654'&547ě1ËÝÄĘ8ţúŚĺ漣ç渁¸ź. . . . ţň - -Y - -ýü))G))ýŤ))U*)ţ>- - ~- - V†áŘůÉŘá†ţŠK;ţŠ yA řřC0Břř Ax ţ‰;K'6FJ> ěţÇţ$06ţ#ţÇë >JF6&Â@Ž@1Ańţe›ńA1@Ž@H磤ć椣筁¸€€¸ . .ýľ . .E - -ý˙- ,1))Ő),(9)(Š))ţu- ,ć - - Gœ77Wţőţ6Ę W77œGĺ D&& ĽËÇe‹‹eÇËĽ &&D "(=ˆ—pp—ˆ=("¸uŐ !!'!ž°úPnŕŐú8ČhűřˇvŐ "!!'!##+572367676˝łúMoŕ‡L)ţš>u e͢—I3?b›aŐú8ČhűřžA:ţFţ˝;/IƒŚtłťxˇvŐ !!'!  ##' ˝łúMoŕű÷›—_ţh˜[ţeţi[—ţiŐú8Čhűř†ţi—[ţeţf[—ţl[š›š §@36273 ##'5ń) UţŇ.WţÔţŇW1ţĎ@ţ ŢUţţS÷ţ Vůődőv#,5>~3+&=43+&=4%3+&=43+&=43+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#5676!5Ö\:V\9\:÷\:]:&]9[\:ýŤ:¸+#9,–p!—ˆj[%+ > 7ÓVCĹCc":Ŕď8Ď #8dĎ#7ăĎ$6šĎ$8;Î$7iĎ$7ëĎ #9špţPL  )Z. ;6ýŸZV Z3%Y63 .87€ÂĆp ˜“Ů 3DMy!674#!!6?676545&#'323276767654#3#&'&'454632767!672!&=75$/563&43!32+'!67#>54&53# ű ?ô I :W0 96;E,Q 2:&l6xý0 bˆm! oţ۸˝Žą"\ü>%Eţfţ™~ýńţe2UÖÉ6g!6V#p5Cü+ C ţ˜? P9 @´7H4XţÍÇm†M7RV /‚M(=H: ,qLUD)8ˆWqką’e-Pexúó —NW =$ U  ţ/0c›™)H?ő2@[nDF8T$.J?ŹŮ !' !žTú4X—ýÍKóGýĎŮţwű´L†ţ5ü_ĄKŹĐ !'7›ŒWú4Z~ĐţwűżD€ŸÔS&5476322632%632#"'&'#64'#"'&'&54654&'&54767632xŘJX%&XA,B:\8 [ÇEMH95##Fl% !9@!#jLĎ p_’ÎMi#"?8" %lF##58HN4hok@RRr*%tţëe BB9'7*$%) "fXSţÝçň5EIţęf" )%#,7'9CB Ť˜>E3#"'4332327$'#"$4727%672567654&5&§oJ°7.˜b9M ţúƒD† ţ˛ý™,B3 qY 5*Ä*]d=HN9%‡ĺ ˜sW$,ţđJ Ž ]T-MMńm@eöd: ,'Z MŢ 'cM&T)$$ <ţĽ „IľŹç2%!"&54676737#&'&54>;7!"&546767!7!"&54>3!6763!26ýP+=6ˆ/2´ţ˙D>Rý+>2,+v*>ç>+2  ,2 =,2  =,3>,Źç2463!2!2#!!#!32#3#!Ź>*v+,1>+ýR=Dţ˙ł20‡6=+ýP#,>3,=  2,= 2,  2+>˛Ô{"D%4&#!"!0#"3!!"3!#";#"3&'6737#&'6737!"'67!7!&'63!67!2I0!ţŸ6üŮOS˙ ţžSS: ÝSSŽ>SS]]JŤ]]äţĆ]]hý\\, Bv*>Kń%39’LKIOKHLKIhghghghgE?-üł“LĘ!D72654'6#"'4#"'54#"'54#"'675674767#%ą$4:JILLHOKHLKIhghgighgD>-ü˛sJ1 b6'SSý cRRţÄ ßSSŽ?SS\\KŹ\\ä;\\ţ–ý]]üÔ!AţŠ*>K›ąÓ{!C%254+'3254+'!254#!'!24+!&#!"463!!2!!#!3#3ÁSS?ŽSSß *vA!,]]ýj\\ţĹä\\ŹK\\ńIKLHKOIKL’93%üëN-?Eghghghgi“˙ůLÂ!C32=732=7325732'654&#'%2&'&5&'5&'ąIKLHKOHLLIJ:4$üëN->DghgighghłSS=ŽSSÝ ţĆSSb ýSS'6a!0J)K>*ţŠB üÔ\\üţ˜]]:ä]]ŤJ]]}ŻŘO€‹•¤łşÁÖÜăçëďó÷ű˙ &*.26:> 3656;2#'7+"/#"'+"5&54775%"'5476;25'7&56%635&56;374765'75'76=4'&+ +"'4!#"'4543$365&5&#%#754'&5&&547'5367&547+&'&'735&2?"5%75537'7'3533553535'32767&5%2?&#%55'575775775§1’:e ,$?F?Yř>ęF_LA3EžLŹŻHŃ3,8LYLäţĐlEF'!0<… k#gţšF  ™EeYÄ!! Gŕ€p&ţ­iq.8ZN$ĎË%`BCëf F4ůü"4._?ńeËe3&{E(1ţő-ÖŮ+$Kt8ż - ‡ ţ–$ţÖĚGs ĽsM ýůrEF›"şă2 >_ýŁpĚŘÁlTErf^5.>=9|5"-l)d ,&>vv]cccWpC-+ d•8 Bpp>W]oŘćaţxvuPp82,ŽD¨ ^8, ^B$Kťœ+ "1ŽR[+Ňe*ń;Đ 2 ››W Q—›Pţ‚ I&? gpëo% w ^SA$ Ÿ2 9i-5n02˘ţ†Çż Ai&ŽIY^P]D›%ˆ\??\OWC ,,1 /211/=;7777=321811{908hN%b\Dh,)h?Ě17I21!122223 21ʁŘ&2%2#"'&=477654'#"'5473Bq4|ýl anN iüĄĄl‹m b üľ9 b؍MOŠbý >YŃaYĆŽ58Šl7P ĚP@ Ş‚Ř$0<FX + &=6&# 3 6=%&#"';27!5%67%!&'&'2+"'&=476‰rţĂÂÔ ţ„ţúcRšڧţÔë~˛ßUęYţ­ţÔ¨Ń082.ԍţŕ_ţW҆_ţV"+Ň}ţIR8D).P9H'ŘţŻÖţ°ý“ƒŽ˛S„Ź]ţŮąÂţÄâŠZ–ŚYŕűHYoţ’X(I_ Ű ţ’‘°;.2lOţĎP%.G6R%&I8dČŘ)Nl>54'67&54&#"&'632.547#"'&'#"'3267654'7327323.#'654'567654&&5476;'&'%&+"#"8DH$$yU ?L[>!Wt…Jţ([Fho*ÁmŚ.2¤\=w\`|€UP7¸:/E" @7? EPţŚ˘]EixĂ Ňpˇ‚F@śT5ű†ym´,ą"&eżB@qŚ€˛‘(‹A _Ă% #+B7!ţęN &".ËOý˛S$ŞXE/K(Aa]dLP*'FCaYr= CŮ44mo C‚ţ˙ ś “(FKœWYŽüF•Ąvb‰ph´'UD˜'R< $ˆ“d˙üöŃ#+?Vmƒ˘­˛ˇźÁÉĐŐÚßĺíô#327&"#"'7'632&'$54#&73254'&#"'5&567#&''5$'67'654'6'5$'67'654$'67&'654'''5$56732#"'&#"&'$'63&47"7&'7&'7&'7&'54'6546767675477&545?&''5&#" '6%35&'.54>23#67!&#"W  OB7[l#> Ě Fţˆ_Vh "ď "Ž@.,=6tJţč€4VŽśp1EQJţ“qMiÎ v–hŁýţópHIŁŽ!:Ż˝JJJţ Í=4m\8B*ŇŽ?o ţv!"şt,`—s&*_~P1>5='g=>24<+ý-s[,*&sd1PT>3J@='h<42ĺJ-H#*ţőYT_Y)*)X^TYţő*$D  ?>}>  *0üt"J. ™Œ ‰&b54CUE ''¤!`9 !,(MTE *!… }q~=/+)f[4f !B" <@0&9c?"V+€GoM“K~a„? }b‰9e\ P&0@k"?c*‰G€E‰JŽX ?„e}9‰ \ŤÎÂ4 Ľ\6 '''' 6\Ľ ŞNŮ(&'65&'67327&+!65+"3yyys{Ĺw ĘĘƒŁľŽŠł¤cţŚc¨łŠŽľŢąąŽqXŸţńe¸óóˇXcţ÷6ţ ľŽŽľô6 cŞ˙ýˆŮ ,35'533#3!'#'5!5!5#53!5!5#!!-ʡŤ}} ”ţcˆą††ţk–v¤G ţôGţő @<<3ff˘XŻý苜…ţîꆛ‚q°X˘üĎťGccGŞ›J 326&#!2+73 ### 3(ŃttţŠvÎÔÔÎŃÚÜţgŽŰďŚţۡţnܧýؐüŸßŘŮŢţÍíţBţ(ţúţéᾪ˛×33#!!#'!'57!5#'5735׍ĽĽ$ţÜŤţŢ"ŁŁ×›”q˜ü‚~˜q”›Ş˙ý‚Ő+!#!573#'5!3!'573!#'73!#'5ťś ;jjýĹ ţJŞýÄss<ŞŐwýŃĄţIžýČjj8žˇĄ/w˛{Ř,32#' 3%+ &5%6323'#57'53œÝŇďţŠŃ^Vˆœ ŠQ6ţ‘Ź>ѨAąŠBŹŐؒ6ţʞšţ’ÖG2k >ŔéŞîYţ3É~ť||É~ރŮObs32732753"'#"'4323$4'5;+"'#"'53275'&'&5?5572%#&'&5%634%476=%ę@.!%,BE,#!-Q˛2" $nŢŕL/PĽuHED8ˆ32#"&546324&"26%! ! – ՒÉţbţäţŢţ{ą•ĆĘ=&*<<*(;ýE;R::R;ĺţKţÉţĘţJś67ľřŽÁϚ˜ţ{ţÉŹ˛Ŕž)::)*<<**<<*):<'ţĘţL´67ˇţI˙˙Ş‚Ő&'† ˙˙ރÔ&'… ˙˙Ş‚Ő&'… ˙˙Ş‚Ő&'… ˙˙Ş‚Ő&'… ˙˙Ş‚Ő&'… ˙˙Ş‚Ő&'… ˙˙Ş‚Ő&'… ‡˙ęĽá @FLRX^djp3264'&#"&47367'676756273#'#'5&'&'7&'677&'67'%%&'&'%6767%&'ô0/CB^0/AC/ýpkTcR|Â'N(ś‰OfUippqUfOŠś''NľŠQaQhű!$ Žb€)ˇdŒţŻËL÷Qýk ţđK´ĚRţt!% cţ'¸d&„//^„000Ă'N'ˇ|P_PfppoQ`Qyš'N'°ƒP\ QgppmQ \Pyş,  MŞ ĆNţ>&Ť`‚7" bţK*ŒVô&"Źg{‰ ţđMĽ ÂMŞ‚Ř %1=! !  54 #&'&#"#46324632#"&%4632#"&Şś67ľţKţÉţĘţJ˜]î_ţĄţţَEASvwSAF͒‘ÍäD10EE01DţD10EE01Dę7ˇţIţÉţĘţL´6őţŸaőů]ţŁý“U@SS@U’ĚĚÉ1DD10EE01DD10EEŞ‚Ř %1=! !  54 3327673#"&4632#"&%4632#"&Şś67ľţKţÉţĘţJ˜]î_ţĄţţŁúF@SwvT@E͑’ÍŮD10EE01DţD10EE01Dę7ˇţIţÉţĘţL´6őţŸaőů]ţŁţńU@SS@U‘ÍÍŽ1DD10EE01DD10EEŞ‚Ř %1! !  5# '&'32654&#"32654&#"Şś67ľţKţÉţĘţJ;lWPiţŘhQřV<=UU=Č-1×\ ÄH0ľe%˝FýKSţ­wZţŚG†r=řý´;÷=NN$‚E| 1† ?’'ŘţĄ_œ>˙?îţ@Ç7ľâ`˝d¨@\´hţíPPPPţç‚y?ý+<ţ>wţĄ_VG{?,rC‚AšÝƒ×+ +"'5$76%&'547327676=&#~‹jţtł°1/Q}›ţ˛ˆ]•(ÉţŻ+VžéRţĽŁž×ţ‡­Ćţxţ˙bOąĘ ŕP >ĹţţnčS˜ô]] =fŞPŘ+! &56;2'5$%75#"3ŻţuţďiŒłą1.Pţě~šNˆ]•(ţ7P,VŸčSZ¤žy­ĆˆcOąËţőţpáO >Ĺí‘čS–ő\^ ţÂţüfŻ˙0:Ű1>7#'#53'&'&54767&'&=33676=3#326'&i($…„lŘ܁ĘĘ“m……$(($…Ž[Uu&tU[Ž…$ţ÷&uU[ˇ‚ˇ[UV$ƒ˝ź|dŃdĘËbŃ e|ź˝ƒ$%ƒź ‚ZSSZ‚ źƒ%_TYţüŞŞYTŻţ˙*Ú $4&#"326&5432!!##53&w襤ç礥čüáŠPďěP§‰łţđŹýýş˘¤ä䤣ŘŘëîďLţ´ďńš~ţř|ţ˙|Żţ˙*Ú $32654&#"%#"54767!5!33#b襤ç礥čŠţ°ďěţ°§‰łţđŹýýş7¤ä䤣ŘŘëîďţ´Lďńš~|ţ˙|ţřŻ˙őĽŐ $&$76+"'&5'476!7!ôtţĆtsstEus ¨é파¨ŚČpiţŒîţ˜d5s qtţştrtt<ýÖ¤¤Ľëę§Śg\Žţuţ˘lăčS×Ř5264&#"#43233#!5 zŞŠ{yŤ–¸ťm㗗üŤňŤŤyšţüš¨{Ĺú(|—ŔjŘ#53533#632#4654&#"#*jj˜˛˛o˜˛ďŒ—›onš˜—´´—ţ}mţţťZĺy„îH{ŠŞzţFř2Ř 1"32654'#"&4767!!53#5!!3!!#3!!ÍpOO87O:=0L˜mk™L/>ţŕţΛ›2 — 1™™ţĎţŕŒO79NN97Â0Lؙ™ŘL1ŒţK—ӘţJśţJś˜ý-—ľ'Ř<%#5#535&'&'5'73'3#'73'676=35'73'33◰°Ľz–‘˜hNg‘’—‘‘eMj‘˜–zĽŻťťť—‹z–×TŽŒ™™ŒŽT—hOʍ‹šš‹ý7Nj–YŽŒ™™ŒŽYӖy‹—ě?Ř! #!!!'!27674'&#ô™.d ű;6ţŞzüý‘F‚H˘%QŘĐM_ţö\ý­‚ǃţ$‚P¤<]ÎÚ$!#"#&5463 67!2#654&#"Vţ⊁"T†]Ł’tƒ„s“˘]†U"‚¨ţâXĹ"€€„Ą„ťüű1((1ť„Ą„€"Äüűý¨ˇuŘ." 6&'67>3"#"54767&'&#52•“ÎÎ&Ď͕ƒLVaĄš{§ƒ.+’ţŮÓĐţؔ)0ŤzšşHUM\ĎţÚÎÎ&ϖ=B´ŽlţČl)•ŇŃţŮ'Ńҕ*l8lŽ´B=ŔjÚ&'5 %$ 56?63#'¨Ş[řW°ŚŚ°ţŠýţĽŞ¨˜tuétuéü4”ZZ—/űâ/˜[[”5  ç@Eo&<"3264,'532'&54632264&" &$#"#"&547>Bž„„_^…ţ^ţČţ”™ýl;‚ƒÍ“•ÎhIöýŤ^……ꆅ9l™ýţ–:…ƒÍ“•ÎhIő¸„ž……žţ (+|Tl§“ĎĎţÚgMLś„ž„„ž„x)+{TlŚ”Ďϔ’gMM ŘM>54'.#"32463227#"&5454&#"#"&'&54767632254&”K2q'$#K1o'#0ß´ŹÚţކGdAoc¤„–.% 3t88<­/3u77LJMŒq'##K2o'#$L1đĄÉݰťţ ´|XHwyoÇᆼ›<‘>b€WDs-Kx68<32>32#&'567'45'#&+"#4'3>$4&+"¨?w(ĆK>R0ƒD32>32gYYËËYËD,.:…?—#)ł•˜Žv$ˇE?w(ĆK>Ro}v­ŻvxJvŮČüašAjâ×ütAžżO°]źĆ€wϧŰĘý„ŠƒŘ!5!3##'!5!~ýŇ2˜ţ˙˜üĂk<ýŇĆ@˜iý80ţ˙ý80üĂk<˜ŔjŘ)127632#"'#576&#"4'5267>327&'"SkQmĂy™Ž›z,~Ѝšzi2@:$šž„“Ą(.-)zW]‚Ą Ÿ˜ŘüžÝžg‘Ť… ×vxţ-ĂýđaŢţíÉX[–ü&‘ŝ°9{˘'Q32263227632&#""'&#"#"'&#"#'3232762327632&#"#"'&#"#"'&"#'°Es- pŹ86rV+)|m^?_354.#"!&'.54>325467675#53533#63232>54.#"P#3Jœ“TRJWVJQS“OMJ4"ţ?őüš*&ElnĆhPL$ llill %LOhĆnlD')ýÖ----Ç+)Q•PQ’((’QP•Q)+ý¸ţŃ/ţ 6ÄklĹj$?6FWWF6?$jĹlkÄ6 ţ}++--âJŘHNRh|Ľť&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32767>4.#"327732>4.#"327>54.#"732>54.#"M_ 669ď4S55.˝+C55C&š.66 V\+55 c üŁ$ľţ•ˇ×ü˙Mç##$ 6ˆť$#$­s`%#$ţšd0"%)hŚ #"#ű_33@ţž]22-"ý40446üĘä/*33UýJ"+33^ţ1ýŃ/ţßáK=Ó0¤¤T* ####ýř ů #&$$&#ýŃ#&$$&# ý B #### üÚ*ę"$$" U˙ţÖÖ!'-2!35!#3!53573#'5#5!35!75!!5'57!Ťs\\sűs]]s Ş—űîJRüÚRIJý~֛›˘–ýˇ•ŁŁ˜E—˘›úű77ęƒ__ƒývt€€t4!ýÝśvŘ7CQ^&54767&'&'5676767&'&54>32! 535#5##3654."!2>4.#"Ë  <$))+N-N*)N-M,**%:  ü@ ŹŹvŹŹ˘<-MTM-?ŢŠţK5:664”59<5&?HPPIK* ')+K**K+)' *KIPPH>&5<:6ţu”N|l||l|ţ˛-I+N))N+@6ţŹ:55:5QŰŘ)5>o654&547!&54='&'654'67.5476;+"'5#"=6&'76767%25#654&'Fzę-ü6 ŠZ8.ž ,‹N0H!h6˘%`+EH )Ř#M ;,Jga#‡iR ţ‚ k'ţ Mč +1^hgţ˝üo8: (@sŽ.PůŔmz nxţë?.#1ţp#41§`&>%!ac,,ĹŔLHJ ­xţě}647| + OJJ)!0˙˙ű× P[32>4.#"32>54.#"!5&54767&'&546767&'&4>32'&'.#"ż:e79e89f76e`[űŮS Ľ’&(*UM,N)(N-KV)&&“Ś \@Eő€őCAÁpd88dpg66úť9: %N&KRS—* 'TM**MT' *—SRK&NţŰ :9„}qyƒƒyq}ÉcŘ $TdhyŠ67&'&"!3!67>54.#"!&'.54>325467675#53533#63232>54.#"!57!&'.54>3234'67632!P#3Jœ“TRJWVJQS“OMJ4"ţ?őüš*&ElnĆhPL$ llill %LOhĆnlD')ýÖ----¤ýsÎţč=BDw@>=)ń)==AwDB=ţéÇ+)Q•PQ’((’QP•Q)+ý¸ţŃ/ţ 6ÄklĹj$?6FWWF6?$jĹlkÄ6 ţ}++--üśČČÎ !yCB{C!$$!C{BCy! âJŘHLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M_ 669ď4S55.˝+C55C&š.66 V\+55 c üŁ$ý)×ý)ű_33@ţž]22-"ý40446üĘä/*33UýJ"+33^ţ1ýŃ/ËNNţÖOOU˙ţÖÖ%)5!5!!35!#3!53573#'5#5!35!Öý€ĘüěüŤs\\sűs]]s Ş—űî„^^ü/oo#››˘–ýˇ•ŁŁ˜E—˘›úű77śvŘ4@4767&'&'5676767&'&54>32!&535#5##3Ź  <$))+N-N*)N-M,**%:  ü@%ŹŹvŹŹ<5&?HPPIK* ')+K**K+)' *KIPPH>&5<:6ţn”5|l||l|LŕŘ3?HN654&5473#!&5454'+#"#7&'654'67654&547;2547#";65'"3%:U"-ü6 •Bu Zg0krX0c-h8ŞE+`%s H>É4wM-ć'9.QY / ţŹüo8: q§’hPSĺžmh #%Bz˙1"0@ţ)5"@YţóýR0˙˙ű×.&54767&'&546767&'&4>32; Ľ’&(*UM,N)(N-KV)&&“Ś 9: %N&KRS—* 'TM**MT' *—SRK&NţŰ :9CčÔ##"'##56'##"/547?˜^Ří'˘5@š_*S×U&/UťL ť;YÔ§ţěţę9UP(§`Ý ţĺ–—X…ŃI.ˇË‚ĽšsŃ222732#&547636=4'&# #4'&#"*Út pëŃz&Ýţ=<ý xÇQĺĐŰ>h˝G:ţřV He˝Žk%ŃţíPF5ÓNP ţţçýŮBí˛śŇ|-ţŰäýźťĄ—&ŹpţA&NŃŕąFXŇÔ &&5 –<ýăţF:ţţ^Ôýý;" €V –ýgýdœäGÔ7236;2"##'65##"'&5476;235&'&=476—Öe x<JTî`Ń(GňeRĐUdőżföB3 VNT<×GÔă48u <ĘB<Íh  ţŠm€MţëÉD:éS GEnQÉhBęŐ"<B+"'##56#+"'&575477;2732;276=4'3&'"—~Vľ"0‘b*S×V*8Ui QÎ"_|ţŽQ ”)w`ˇSg‰A ËćŽ? Őáţ6‹†ŃNÚ ţč›—#euŽB? ČÔgIÇţo‚…ť5 ÚF”§(°ĎűpZRśwÔ2367632#&5476(Ët*#\l‡Ń~ ĐýďýΨÇTÔë]1˘klŕSIúăý…ąÍÚÓ|-XŇÔ &47–÷EýÄ ýÎoÔýsU ýÝŠäHÜ2`g26;2"##'65##"'&5476;2&'5476&+"326733276=4/#"567654'&#"35&5›Ëhr=)ř\Ň"IńfRŃUdöŔg÷C3&=cŘGđŠ kv ó=ˆ=NŇr%SZž¨U ý6vk ť6)¸S<ÜÎF9„Ś×8:Ód  ţ§m€OţčËE:ëR pą&Ëiţł›Ě  ÔC”]&'Ax†…ž.+Ţ0 ‰nM,śWČűÎ`cŘ˙ţTÔ!1M3#&'&'0546%3#&'&'45463#&'&'546 $&54673 $64'&'v ‘Ě Ł0ĽA ’Í ˘1ŚY ’Í Ł1Ś,¨žšţąţ”ţąš˝¨ƒKV§.J/ŚVLƒ9?›c‚yÉŚt3Zrˆí`í—ĹťţÎű˛N‹ ąŃ[OÄ}ĄšýБBr‘­ţ1ąa`°bb°`aą1)EM¨˜UU˜¨ME)Ź˙öˇŐ3#"/4?23hHÄ0#ÔÓ!cZŐúýŁ-…‚@ÔŹ˙öoŐ3#'654'&'#"54732XW­đz=ä\ŕ9ňÔ`YŐ'6?FŠ’` 1TFG*ű֙-¨ƒ@Öx˙/łŐ#"=4?2%#"=4?2ýłŔ6Őą'VQýܖCŘŞ+YPŐĘúí›*¤~: Šűۉ8›z"CÓź˙öoŐ"'4723!# 5472!5kţűéémOüĽňţţědXX[ŐűŐ¤Š;•ýZĎ$ą}@áϜœľ˙ú"Ů 3363'$654'"ť-Ş‘ăýł8˘•wŮü?íţ˙ţWXÖűÔţc1 ”Ź0Ů 3%#'#3%#ą)N(ţŻ4Ůţ/Ąűcĺ Šý™ţ}­4Ů(,377#'#'547#5773%%‡.wwzy.ţŕ** ţŕ ŮţĐ<<ţ‹7‡Cţ׌ţŚA<Ž<{8‹Aţú†Mý–ţ‡‹tŹPŮH#0#"#"'5654'5673;54'56732733273+&+#&"#&'565ś¨łP8 cc 9Sľ§ƒ:-Œ-:ƒŁľS8!cc 7Pł¤ƒ:-Œ-:ƒZ#;17F-:ƒŻľS8!cc!8SľŻƒ:-F71;#ZţRľS9 cc 9Sľ„œŮ ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5;0/_í^//ţ†,/,-D--C-,.-äĐ zz Đä~jihh~äĐ zz Đä~hihj~ntt6tt´-.,-C..C.,.-n//_üR_//÷~ijhh~ţNĐ yy в~hiii~ÖŃ zz ŃsŸ.ţ€€.Ÿ ʁŹ#.6CMhwŒ—ŚŻ!2732!'5675'&=32#$'57637&/&+"+&532?4/%32#'#&&=4?#'57335'3!273+#='!"/547354;2?!&=!(‹:Mb­ţ¤Rť.qp7°ţÓž,ĘĘ_qýđ >MT,›•P$’ ´6œ…6$0_äý u3d´­Ud€tœČ_}s*$Ä"ĂŹRţÖt0XX__ç/iţký¸=ZŹG†8ţÔ*F €1 ţĆŹ.ţ­ Ĺ ţъfţőţď)MC =ţęg9E˘k×O 9ţË!(-ƒ);& Ć ţ]ŹţÔt!ţąy" łţĽ†& 2| ŹŞbła$ U+œ Ů #8M35733!&54?'7'327!!"'&%#'7367654'77'7'&#"'676ŐŤşĘŤţýó,&T>ë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ę7>54&#"5>32&54?'7'327!!"'&%#'7367654'77'7'&#"'676]Týń@Í1$Jë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ę32&54?'7'327!!"'&%#'7367654'77'7'&#"'676Z _­3lFHe5^\VOosHGJI)`VKm1šSüj,&T>ë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ęë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ęë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ęë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ęë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ęë=c#]–ţK9.‹UݧŇŇĆ:1ʈó%üćŠ`T?ę32#"&–źeËĹţ›ţ|ţ›ĹÉeţ(Ž<X<Žłţħ¨ţĂą“"32#"&$2#".46–źeËĹţ›ţ|ţ›ĹÉeţ(Ž<X<Žłţħ¨ţĂą“"@<#"4.#"–źeËĹţ›ţ|ţ›ĹÉe:<#"< !<"#;ŮÁţ˜ţzţĆĆc†hÁü– =B4.#"$32>4."–źeËĹţ›ţ|ţ›ĹÉe:<#"< !<"#;üĽ"< !<"#<@;ŮÁţ˜ţzţĆĆc†hÁü– =B54.#"##"'5##"$'&'0!5!5&'.4>32!!676767'%''H&(G()G'%H(ă%'ŠţËV W3WI„muţ‰w>DE}AB|GE=mţ“d^„JW4W V›sÖ'H''H'(H''Húň`XAK|@X1(ԁ3"|ˆ}DD}ˆ|" 2ý/ "1X@|ţľAX1# Ö/ 673&/'67 &'"&'6?&'3 ' âK[]œ><+Gg['fBôňBe&\hœ?(K?œ]\Kýă ˆŠ!˝ţĐ;32T $ů #ľ¤ACĹţâŤ,ţíśĹMMMţv ŐA5p_9D-ďţ–ţăM**¤  ű”B@0"@R//>wAˇ&oc/D&3.YaQ/5"1'"ţ´ţuАE62/uŠ= =!m- .... y˙ě˛Ű 7%  %  32+#".=!"&'&'#&=4;7337_ţěţě‹ý%ţíţěŠ Ö8)Â0/­_^Ť^ýM^Źź­1/Ě 9×53üü4í<üÄ&&<üÄ&Ń*(üÇD>?GGzB6üĘC{GG?>D9/››Cţ˝›}ŽŰ&632#"&'.#"'#!#!#Ҹž62ÉK#+~KF0R!9'/NŁÇxĺí_TţâŠţăV_‡T 'ŚNQ9;:#8łHL"CţßD™ý|ýŚ×ţ)×ţ)Z)Ű 532>4.#";267#&=&$32735&'.4>2ć2[02[24Z1/[ť–á­ţ)'5*+ţXÇë A323#67#&"#"/&'&547&#""'6%676V ón*[‘n%'ZxL0<{2;&b;0&8a>!U*~EmL‘K}`? {aˆ7c[ O&0>j!>a)†E~CˆK‘W‹ ={d{7ˆ [+M57LL75M-Z '*''*' Y (€5[Ł J5( üÖ\d (5J Ł[4Œ ''Ó/7O_ŸŤłťËÓŰăď2#".54>&'32367&%2327654'&''67&'&'&'676765467654'&#"7>326323#"'##"'&'#"&'&54767&'&54767232&'&#"6&%6767&'&'&#"676&5467&'&6732767&–$$$$áOG3%V c˜â™c V%4GL944m/122102/.303112.OF}6&V eý´"w?>v"¤pt #8ˆŠ7! vn¤":;@A<:"˘nx !6Šˆ6# sp%./13/.UVT\<>"$!!ţ• !"#">k•c V &6|FO 93399 <>#"#Ö><  "$ZTU./43..V5$##$Ů59gT;&'9Z^^Z9'':Tg9§'(''&()I8:9889: Z_59eU;'( łŔŔł:8.>euvc>-7:°bccb°;7-?cwud?/8K˘WZZW˘ **D@@D+8(':Te95^&)(&''(ÖDA:AD.*!žY[[Yž!&Ö !-x†”67&'67&'4&6%67.'%4'6&#"&'6767&54?67&'&#"#&'#&'5&'"'67&'&47632>4.#"%2#".4>Î'7,3 3%/0ţÜ),7ß=*#ţ×0*+3.22'ţ÷8  YfˇŠT,1'Ľ¤').U¨¸fY >98 "2 B2;F_ XB?2C 3" 894iźhgźikžce˝"SŸ[XŸVWŸXZŸ„٧#eŞjpÍMcNTvJKrZ1VlLWMI Šp jŞ…k%§nA V{ww[1‡ôô‡1[ ww{V @#fÜd-#JM 7B/"‰‰"0C7 NK",dÜf#ˆÎ˝hh˝ÎżggQU ŽXXŽ UdČÔ %3!'#!52#"62#".54>Ÿ"ů­ ýh9ý|M463%&$$Ôú5 Ş›űO ÂDý›n;ý $$$$ŞôŘ33'554#$/ŃýŽ[ƒüQ‡wţ“ŘýâGSGýUW GJGŻţ˙XÚ .5CK&5432632!!#!##53&4&#"326!&&#"327&54654'XŠPď™}}›ěP§‰łţđŹţ~ŹýýşÄčĄC;Œ„7?Ąčý_Xe‚jő;A¤çç¤>7†'sssîďLFFţ´ďńš~ţř|ţ˙ţ˙|¤äžÚבŘţź- ţř Š䤣Ř”ÔŰţl˘ŁrrŁ˘Żţq)Ő-5DL&'&6767&'"'&'&'&5'476!7!! 76'&'&'6'&ôuœtss-5 œ—Ęá¨ëíŚl&‡kڍŚääpiţŒî„ţ˜dţ˜=pDiűę/tEust,2—œ}tsŸ5sqtţşt-ԛ—1ü Ľ¤k‰&iĽëę§Ś g\Žţ}ţuţ˘läç  ţ˘An?\ü27/rttžs,͓™}šqtŁ˘ţƒÉĐ)8GO'"'!!##53&'&54326!7!&'&36'&&5'47&#"327674'Ą¨ë U`ţđŹýýş‰ŠPďš}z“äpiţŒîţ˜dţŇuœ>7‹;CĽćü˂Œ;C¤çç¤>Ňxts”ĽK) ţř|ţ˙|€îďLGD g\Žţuţ˘läçűsÚŕ”螝ýţ™Đ՞䤣Řhk¨¤rrĽŁŻţƒ˛Ř .4&#"326&54762!7!!!##53&w襤ç礥čüከąćÁ”hţŒîţ™n ‹¸ţđŹýý˝&¤ä䤣ŘŘëî o[ŽţŽtţ¤‚Ńꝇý|ţ˙|˙ ˙ăĐô+D#"'&'&'&47>76327'7'%'27>764'&'."(F3"D"&%#}bV`ZZ^;D"&&$ƒ[X]:3Gţ9ţ†á:ÎŔ‹]†ţ:ýF=~=HS]ł^X‚&% ŤiŠiD^‹żţ29áţ˝i‹üü\=<€<92-1X?:„<91*ĎţŁî=X62'%'!!#5!5!5&'&'.546767''7'''7"2767>54&'&'&î4p6łâ9ÎŔŒ]ł.(EGGE@Z-<ţí–ţí81VDEGFF'1ţ9ţT]ŒŔÎ9âTţ:ţŠG5>+.11./:9Š5>+.11./:9‡ ž\Šżţ2:âţa(EŤb_ŤE@( ¸–đ𖸠%CEŤ_bŠG(HiŠjËâ:ÎżŠ\ËiŠjÓ+.wBAw./+.wABw./€˙ă4ô+F!!#"'&'.546767675!5!' 2767>54&'&'&"Ľţí<-Z@EGGEDVRbfNZ@EGGEDV18ţíŹkbbjřC9:/.11.+>5Š9:/.11.+>5Őţ疑 (@EŤ_bŤEC%##(@EŤb_ŤEC% ‘–­kaţŸjűP/.wBAw.+/.wABw.+ ĄÄ+F####"&'&'&54767>32333'7 '%32676764'&'.#"‚Ü–U (@EŤ_bŤEC%##(@EŤb_ŤEC% U–Ü­kaţŸjűÉ/.wBAw.+/.wABw.+Ÿţí<-Z@EGGEDVRbfNZ@EGGEDV18ţíŹkţžţžjřC9:/.11.+>5Š9:/.11.+>55Ĺ @  ÜěÔěÄ1ÔěÔě0432#"732654&#"ÄÄţéÄÄţ陽……˝˝……˝ëÄţęÄĹţę…˝˝…†˝˝5Ĺ @  ÜÔĚ1ÔÄ0432#"ÄÄţéÄÄţéëÄţęÄĹţęúşK +@kk k kÜěÔK°TXš˙Ŕ8YěÄ1ÔěÔě04632#"&732654&#"úϑ‘Ďϑ‘Ď˜uSSuuSSuě’Í͒‘ÎΐSuuSSvvdPK!)7eK° RX@ *.,&"($ k3,k($kk8ÔěÔěÔěÔě991@&"6k0k 8Ô<ě2Ô<ě299990Y4632632#"'#"&7323&547&#"%6547232654&#"dϑRDDR‘ĎϑRDDR‘Ď˜uS?>Su^222Z>?SuuSě’Í ͒‘Î!!ΐSuXqpWv28ML88LM{WpqXuSSvTZ`z8Rm3#"2767>54&'&/2"'&'.5467676"2767>54&'&/2"'&'.5467676––R#)$#R#$ $LK:C.25521@=“:C.25521@=ýR#)$#R#$ $LK:C.25521@=“:C.25521@=züŕZF)(JG()KĽ.2IF21.2FI21–F)(JG()KĽ.2IF21.2FI21 ŞJ7Qk>767632"'&'.'!"'&'.546767632$"2767>54&'&'$"2767>54&'&'÷#61@=HK:C.25521@=“:C.5%ţĹ'21@=“:C.25521@=HK:C.6#šR#$$#R#$$ű÷R#)$#R#$ $5[51.2IF21.4`]21.2FI21.5[F)(GG()FF)(JG()KŇćR 5%%%xüĚÜÜţŽrĘü6ţŽ׊eMşM^‚xţ„x‚ąV–)7654'&'575#!&54767'5!s_vR$N:Č:N$Rv_Łţě¤{aT,X@X,Ta{´ß4b\)1˘%==%˘1)\b4ß´ť:ę`ž\KDúúDK\ž`ęŻţ˙*Ú 4&#"326&'&5432#w襤ç礥čţ$ş‰ŠPďěP§‰łŹ˘¤ä䤣ŘŘţ…€îďLţ´ďńš~ý{Yţ˙,Ú326& '6 !!#!5!(+Ąččţť~u¨ŰP§‰łţđŹţđ.ŘGäjtŚţ´ţ š~ţř|ţ˙|°ţ˙,Ú # !!#!5!îLţ´ţ´ň>>ţţđ­ţđ0oJţś;ýĹýĺţř|ţ˙|°ţ˙,Ú'!5!737!!!!##53šzţ{Œţä{­ţ{ţä†ţz˙ţđ­ýýŃ{|zţ˙hţ›ţzţä|ţë{˙ýŹ|ţ˙|Wx˙T% ! !5! #3 35!'TţÓţ?ţ?ţÓ˘LLńŹţwŽLLŽţüÖÖJ|ţAż|ţśJŰýŚZýt|ţśJ|ŐŐŽ˙,ÂŻ$264&"&7673% %&uŚuuŚ>ĎhH]Ź%Vţ™gVţŰYFhĎÝŚuuŚvýŮÎ#gGÎţέ”ŃҔŽţŇEgţÝÎEţ˙YÚ$&'&5%6;2#"'!!##53œ”uN)†…$#<Ď^túfFp!ţđ­ýýŹE˘•&ÁJ <„™ČţÔŠ;  ˙|ţ˙|…lPj…'#"'&#"'&'&'&47>7632327>76&'&'&/&'&'&47>762!2!%327>764'&'.#"&#"327>764'&'&ÍÖsŽ* 0$+$$$ 1#*# ZaZ%% NT12 4 #HH  ")mR‹čOeýbŐü  , 0  +  …Í ) . $J . %'.D"&B 1 $C mR )KĎy   ľ !   V!Eľdz267>54&'."#"'%"'&'.5467676;27>4.'&+"'&'.54676762%632$"267>54&'&ý.&&.&m,mQŰţ‘j–P(!N!"(! aVf&&bZ55!("!N!(P–joŰQm,úć.&&.&q    lü?W’,>&#< A#"< " (( " <"#A <#&>,’W?~    ŔlOOj…3!#!"'.'&47676?6767>'.'&#"#"'.'&47>763276;%32676764'.'&#"676764'.'&#"32ÍÖŐžeOčţuRd2!  HH# 7   ZTN +Za21#+$0 4$$$+$0 'ąsýš  *   * OĎK) Rd#!>& 3"9*$"D. ' - D! 2 . , T% #ý: & (  Iô˜čZx–´Ňţ-4H67&'&'&+"'&'&'&476767632%632 #"'%#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&476762I  Q\C--%("(/*0.,+"( /ŽX]â\ˆ9ţţ<…\âţŁXŽ/"$)0*3')"* %1*0CR[ţë        22 2 2 2 †%•'   &J  &%C\d#˝í_*]OŮţ‘”hXC%&  J&   “ŮO]*ýÝŮ    Ů   ")&`&"'$"/' <%‹ZS  ĎĎ % SZ‹%< /'* "%5"-($# ţŇ;ý‚8\= !  !  " ţňÂ÷/V’C "  !  !  [uV/á+    V˙ă^đau‡ 767>54&'&'&#"&54767632 '.5467&54732#"#"676767#"'&#"'67654 ozwbda_f_zxІ|wbdaM,krnulŒœšŽ†spsnun‹ţNJ*D$ lľŠQ$" 6*D?"5'K(2- # ž>   :72 331cd툍či`4331cd퍇ź>˜mœwn<;;8roţ쥘ţđwp:;;BV0/MÍď8:D@*|sa  -F(7 "*=8&0!2  1-5$& 6:B4V˙ă^đ (B\w.'%&'&"632%6767>54$2"'&'.546767" 767>54&'&'&'2 '&'&547676Š?'*&$ 1ó$-+h+-$F3782ˆ**?ţ’1 $&ţç>>9†|wbdabc`ňzwbda_f_zxŠšŽ†spsnun‹ţˎ†spsnulŒwI_ý"2[$  Ł""ƒ ţ ýgIƒ $[2!v 55 55 31cd퍅ńcaf31cd툍či`43d;8roţ쥘ţđwp:;;8roœwn<;x,AŞ-57'36%33#3#!2#!3#3##$'#7”$@d’’5Ť{s”Vdš]˜F0 0Fţř˜]šdV”s{Ť5ţ⒒d@×(ÚÉ j–P‚PĆ,ĆP‚P–` ÉÚ„Ü0ů ")- !676762!"'&'&'&54!ö¸űX¸$#R#+/ŽţRţŸţF¨ţF$#R#$1ţS­ýňŹh,ţÔ  ŞţލţÝkţÓ-Ş"ýs!ýßűăł}ďPĐăó476?6763&'&'&547632676767654'&547632!54'&'&54'&&#"'&/&'&'&#"#"'&'&/&'&#"&'&'&?6'&'#"'&'&#"!'476='654'&545454'327654'&'&327654'&/ł%4-)"$0JK&  )7   ýß %0‡'# #6 +-L _ˆ_^/s4* 1( .266 |/(1   \Ť   ýţ#:7  l€S&   xë71]/~[#<$  oť_%@,†: $";vRţÔ $X$+|‰‰ś!5DX&PY;ś9Do6 b'n•2  83ţeF] 4T&  &  /50$?- 1@& 3l K  C"P1Ö Ÿˇ:03<D:5XI.)D&ţ[+-1:   q/A8   g+Šjl9Lp{‰7654'"'&#"+"'&54?67676763276323273#5%6767'&#"6"/67#"27632327654'73654'676547&Řp/l0&–J!cS%YţřE]{@C"$4>™-;% žĚ,(6áY>řmüź!N$Xě6"/,(Ť4ňsS?X$U>"sJ?K(`./4‰+2K2.ž0>ü°S ˘Zp0+ţ 1^đ' ţÇ;cs  /č^"|Y/ 4Ť28ۇƒ´Ď•l%é%oté5oA='Y$ a…ŁT* ''G+- %_kj~r}jL`І|ď\gĂK@/.85–c($śšËŻ (2LS>54/##326?%%3254'654'3>7632#"&547>32'% ;66Ií ü€™ ’™ ƒ }¸ýgý„˝ ?ý¤6ýűqýn   -> 9@ îH67; ů˜’ ˜’zýƒýh¸| ýó8 >üś6!qýúę    ôýÂB5–Ž>%+?F4&'&/76765'7! !'!654'!4'!!$467>2"&'&!654'Ł Ň33Ň űŚ^^^ŻŻRXý¨üŽŻI´#ýJ2ýVŞülĹPú#Ţ ~!88!~ KŘppŘphČţŹţŹČ,ţÄp <(##(#idśšËŻ (2LS.#"227654&'''%'654+.#"65.'&54632#"'.6#"%  íI66; üo’ ™’ ¨Ć|™¸ýƒ>?%6!ýűqý   9 ý ;76Hî ý ’˜ ’ŐĆ |¸ýhýƒě> 8ˆ6ýúqým    BýÂX{[%G'23 %%.'&"27>7%$!"#232%"'&'.4676762%#"#Š2%kýż      Aý•ýéţŰ™ąˇţœ>>dţIýńąID`nţíS   SţínGŠYnš 5>5 šnŠ­)(%$#"#64'232%%&'&'&"27676č&ý•ýěř22řkýÚ**Ĺ!ţín`ŕ`nţí!##3ĆW 2327632#"'&'&5476Ĺ'( ď>‡ !ţ~ţśGH ".4F+Ž@xÂH )ţ0ýü$Š™'*'í˛Ĺ 23277632#"'&'&54763Ĺ'( ďe` ý}{*˜279HF`0@xŻJýŢL ˛†1 ,”ąA  ' 7 çɎţ8ţ7ŽÉţ7ŽÉɎęţ7Éţ7Éɍţ8ɍŻ?– ‘tţÉţŒţŒţÉtţŒ7tt7ęţŒţÉtţŒ7tt7ţŒuţÉń˙îœÜB2632#"'&'#"'&54767'&54763267632676ř ĐÄQ   x€ŹŢ L$3 Ěäz(   6XŽĚÜ3âţńĆď  šĐŕţŠ6*=P*> "#  ¨˜¸ĚüęR26#"'#"'&'+"'&'#"'&547&'&54767&&5476326763276T ń디% $$YyćX$ ‚Äzc0 + j–çů ę:  (ŰţÇ̢1#: _żţű‡$ #- °Ô˝ =1 '2ÄşÚ pDŐ #!!!!!%!!!!!!!!#!5!36ţHţV޸ŞţŚžţBý¨ţBžXČžţBČţBžČĆŤţUţHţV޸Pý¨ţBžXżýyČţBžČżpDŐ !!!!!!""ýŢţpýŢ"˛ţpýŢ"#pDŐ35#7!!#!5!3ăîîďrýŽđýŽrđsîđýŽrđspDŐ!!%!!!!!!“Žţr"ýŢţpýŢ"#ŽţpýŢ"#RbŐ !!#!5!3ҐţpđţpđEđüŤUđ lŐ3!!'#'!!#!!3!5@––ţÔţŽ–––,r–ČÜţÔ,Ü,Š–ţŽý_– –r,–ú,ţÔÜý_ĄÜ>vŐ #!!!!!'!!!!!!!!#!5!3ţ˜ţčhČţčýřţč ţčČţčČmţčţ„ý_Ą|Pýäý_ĄţHÜý_ĄÜpDŐK#";54&'&'&#'!326767657'&'&'.+3!76767>5{dłIB,$2$*DEłh{LGC_RQ|66R_CIJ{hłED*$2$,BFśd{LGC_RQű„66R_CIJ KIB`OT|87O\FGKzdśGB+%2%+BI´dzKGF\OTű„87O`BHL{dśGB+%2%+BI´dť˙ĺůó  #!! !!! 373#'7#ZŕżŕŕţAŕŕţAŕŕż:ŚŚLŚŚŚlŘ­mllmŮţzŘlţçmllmŮóţ|ţ}ţ}ţ|„ƒƒdţáţŕ ťdťťţ}źcźźź„ťT˙ă`đC54'&54762327632#"'&+"'&5476=#"#"'&476323(L,68x86,L şzFvd0000dvFzş L,68x86,L şzFvd0000dvFzş şzFvd0000dvFzş L,68x86,L ťyFvd0110dvFyť L,68x86,LV˙ç^đƒ&'##"&'&'&4767>32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675& Ô  R.-R  R-.R " Ô *!""! ((\(( !""!#%  Ô " R.-R  R-.R  Ô  %#!""! ((\(( !""!*“*!""! ((\(( !""!#%  Ő  R.-R  R-.R " Ő  %#!""! ((\(( !""!* Ô " R.-R  R-.R  Ô S˙ăađƒ4&'&'&'.546767622676767>32#"&'&'&'.#"'&'.54676767>5"#"&'&'&4767>32(,$ ((*& :.r06$&**& )'De!  'd8:b&$$&b:8d'  )a@/!  ')*&$6/r/6$&*)'  ')?c'  &d8:b&!$&b:=_& (bCc"  &d8:b& $&b:=_& (a?/!  ')*&$6/r/6$&*)'  ')De!  'd8:b&$$&b:8d'  )a@)' ((*& :.r06$&**& ((T˙ĺ`ň0267632#"'&'&'!&'&'&54676763267632#"'&'#"'&'&'&5476767!6767632#"'&'"'&'&'&54767#"'&'&'&5476767632!#"'&'&'&54767#"'&'&'&476767632&'&5476767632!#"'.'&5476767632&'&54767676Z   ( &        ţŰ    <   4 ţŰ         % (   ň   (  ţŰ 2     6  ţÚ         %    <    %  (   W˙ă_ő2767653"4'&'&W›†spsnulŒœœŒlunsps†ě;8roĄţđwn<;;Ź˘ţ˛ţj˘Źţ>-Ź˘›œý'†ţO^†__†^ţOqţ¸ýď4óţŮ4H4ţ"hţd˙ţd˙˙œ˙„0Ő!% %!-ş@– ţj– ţjţŔţj •ţk Őţ*ëţëęëţëëţ*Öëëę˜Ő37'73 #'ăxxîxxţ™ţ.xŇđŇxţ.Ňxţ.đţ.xšÎĐĐÎÎ ĐţňýĺĐţóţňĐ ýćţóĐpDŐ #'!5!73!ÔšGţFdţFGşýrţEGşdşGţEr¸ţFGťýŽqţFGşdťGţFqýşGţEd@˙ăLđ     - FOÔţFýşcţ,OOţ,cýşFţÔđýšdţ,POţ,dýšGţœÔOPÔţœ T˙ă`đ '%%%%%% % -őţÝwDţŰţáš{ţáwwţe#wýź%ţf{wwŸ„¤‡ţy¤ţ|ŸŸţ|¤ţy‡¤„…{ţŕxxţe#wýź%ţf{wwœţÝxEţŰţŕţy¤ţ| Ÿţ|¤ţy‡¤„Ÿ „¤ť˙ăůđ % %  Zp/ţAżýŃppýŃżţA/đýźÁţ}ţ}ÁýťEÁƒƒÁT˙ă`đ     - Zq˛ţďôţ ţNqqţNţ ôţď˛đţ ţNrqţNţ őţî˛qr˛ţîT˙ă`đ% % -ZŞy‰lţ”‰ţ‡ŞŞţ‡‰ţ”l‰yđţ”‰ţ‡ŤŞţ‡‰ţ”l‰yŞŤy‰T˙ă`đ%% %% -ZtGcďVţŞďţGţńttţńGţďţŞVďcGđţŠďţGţństţńGţďţŠWďcGtsGcďpDŐ/3%!!%#'''%!5!%777xŞoŞ:UţĹœ.ţcžţF™.ţd;UţÇŠoŞxŞoŞţĆU:ţe.šţEžţc.™ţČU9ŠožţE™.ţf:UţĹŤoŤxŞoŹţÄU9ţg.˜ţFźţf.›ţĹU:ŞoŞxŤoŠ9UţÇ™.§˙ă đ›54'&5476276767632+"#"32;2#"'&'&/"'&5476=&'&'#"'&'&547676;232?&547'&#"+"'&'&54767632676'K,68x86,L qA'C<4GW>L ƒd  f‚ L>WG4L „d  dƒ L>WG454&'&/54'&5476276767632+"#"32;2#"'&'&/"'&5476=&'&'#"'&'&547676;232?&547'&#"+"'&'&54767632676o**YK,68x86,L qA'C<4GW>L ƒd  f‚ L>WG4L „d  dƒ L>WG42#'"372"'&'&/"'&476="'&547>ľŸQ!//V–Z˘ *nN™+G80j@6R¨R6@j0/P1“Ną ˘TžP#00V–Z˘ ,lO@W+G80j@6RŹN6@j03L/•N˛ ĄÄ ]H,`,H Yc˘!77™\Ę4OO4ĐVA7§gU3š',H^ ]H,`,L&3c˘!77™\Ę4OO7ÍVA7ĽfV4š&,H^Ą˙ăđ™ąÉ67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"Z8%1T1%8¨5e %ZF\ +m8BS/?JV@6RTXN6@VGB1QB8n* \FZ% e53e!&ZFZ *n8BS/?JV@6R¨R6@VGB1QB8m+ \FZ&!e3ţ˜DA 5<; > +F$ÜH$F+ > ;<5 AÓcJ2QD++DQ2Jţ´ (5H,'9,J&0f‰) T|\`j4OO7g`\|T '‹g/& H,9',I4( (3J,&9-H &0f‰) T|\`j4OO4j`\|T '‹g/&J,9',H5(€""'!$(:UJJU:($!'""nF­w"2767>54&'&'767632"'"'&'.'"'&'.546767"'&'.546767632.546767632˘=>343343>==>343343>x>%85670-),(-%8/[0!-(,)-02y/8%0%)-02y/8%-(.'&$W/:#-(,)-02;>/;),)-02;>/8%-( 06{IF{6006{FI{605+'g>:c.&".c;=g'+&1N%&W'+&.c:>k#"$.c:>g'+,B:>g'+&.c;=?nF­\vŚ˝Ö%"'&'.546767"'&'.546767632.5467676267632"'"'&'.27654&'&'&"67&'&'&'276767&5467'&'&#"32767>54&/76767>54&'&'&#"Z0%8/y20-),(-!0[/8%-(,)0-<1:3%>(-%8/|/8%-(>%85670-),(-%8/[0!-(,)-02y/8%0M=  H C# B/g H Ö/*x#$  8## H g/B őPP  $#x*/ř%N1&+'g=;c."&.c:>g'.5 ?=;c.&&.c;=? 5+'g>:c.&".c;=g'+&1N8GG$> >$ ‚ýc.,bB$#>  şIr0C >'#> ţÂLM >#$Bb,.$ >#'> C0rI T˙ă`đ)T˝ć:eŠÓ&'#"&'&'&4767>3267'&#"327%32676764'&'.#"7632#"#.4767676324676762>322##"&'"'&'.5#"'.'&467"&'&'&4767>&'&'.'&'>76?&'326767767>5&'&'.#"767>7.'&/32>7674&'&'67'&'.#"67'&'.'67676767"2767>54&'&'"'&'.54?&'2767>54'7654&'&'&"67'&54676762:ä    äÎ$4 4$ww4 4 ĺxy   űĘ%" !()-+U$"! ((\(( !"&S+-)(! '7M"# V2% A()-.R$"! ((\(( !"(O-,*(A"#2P"# "MÁŽ   ´ ¸! *4 2ë kk  4 2 uKK   Ś ´    Ži2 4* !ý‰== 2 4  Í `_  wR#$$#R#$$  8 < c !<>  š   8 < d!!<>   "%UV*) !!$3R  R3&!-(-%Z& "#%(.2$( &&S+,))A!$3R  R3'A))XT$""#%(`$( " ţ ´     Ži3+!x== 3 Í _`   ţŽ    ´ š!+3ë kk 3 uKJ   ßF)(GG()Fţ$ä    äÍ%3 3%ww3 3 ĺxy   V˙ă^đ3N^"2767>54&'&/2"'&'.4676762 '&'&547676% %-—z35++++++53z35++++++5pWDM69?=;9JHŞDM69?=;9JHSšŽ†spsnun‹ţˎ†spsnulŒœţŁţ}ƒŁŁƒţ}Łţ(.h<;h.((.h; +F$ţ$ţ‚> +F$Hţ‚ ;<5 AŘ~ ;<5 AÓš+DQ2Jţ´ (5H,'9,J&0f‰) T|\`j4OO7g`\|T '‹g/& H,9',I4( (3J,&9-H &0f‰) T|\`j4OO4j`\|T '‹g/&J,9',H5(őţG+DQ2JÁÝ$(:UţÍÝ$(:U3Ý!'""űÝ!'""śţŐA''7'753'75377537'7'#5''#5'7#5'7'7âđÂ<†Ä<ÄxđÂ<†x†<ÂđxÄ<Ć<ÂđđÂ<†Ä<ÄxđÂ<†x†<ÂđxÄ<Ć<ÂëŠphMrhr›ŕ‹ohMăăMhoţëŠŕ›rhrMhpŠ‹phMrhr›ŕ‹ţęohMăăMho‹ŕ›rhrMhpœŐ!%)-153%% %%#'-75%77%7?5x# <ţö$ţÝ <ţ÷ţÝxţÝţ÷< ţÝ$ţö< #ŤŤ#ŤŤý÷ŹŤŤšŞŤŤýöŤŤxŤŐţĚŠţ°šhš¨¨™hšţŻŠţÍ3ŠQšh™¨¨šhšPŠ'ĹcĹccĹchcbbccbbgcĆcĆĆcĆ‚0ŐA37%37' 7'#%'#5'7#5'7'7-'7'753'7xŒdđ ČX<[Œdđţö đdŒY<\ČţůđdŒxŒdđţ÷Č[˙B-ĎDH2#"2767>5!"&54$3!57!#"'&'.5467676#Ý_>I-74ţÍŢý×3TŒČP>CPNąDG-2.1/&D9¨žĐ 88 '.* !-8D_čČ2ú{űŰjˇ@F'%.3r@Md7+4VýŞž˙Ýđ/2&'&54676762"'&'.546767Z y*,&'ˆ˛‚†Žˆ'&%1]~|45,-++-,54|45,-++-,5đ(+&a4|dƒÎ΃fz4a&$(üF*.j=3"&'&'&54767>32Ôîňr˛JŠ6464ˆNNˆ4646ŠJ´pňęŠţ`Â684F@NLBD64:866D@NLBD668Âţ^~*Ëž i654'&#"632327632!"'&5!267&'&#"#"'&54763247632327654'&547632#"— 6+Jo.^V|;-ţ˙it36?ţĹĚşĆfQMećEJS?(*$ s]vh2K)*NL13^Úv:Mc*„Zœ™Łţe—C0Ş3N35%&-Kt\K%9S >BWN=!$?$8(F!5{^? Z„ Q67654 547&'&+327#"'#536767&'&'&5432&5476323254'&5432ß?-BO>=ţţ‹v06&%K`dC+(‘k$'eM?$#=Hb B=)+8=.mŘ9eb PB÷°>$3g:84ţ!ţEB7WPfG+1KŤHŽP<Ff#&T'0P+A'ţ“š<ţú›œ¸ąœ›ƒ}DC‘ţä/'"05276767654'&'4‘rceNS((((Ś`hmşŠ§„Œ@DDF†ŠĄŠţä/CD}ƒ›œą¸œ›>C/GF†Š˝ť¤§…‰CGţń˜ !&547˜†‚ƒ…ţ°–•”—ćţ>ţ2ţ;ĺëĆŕßÄěţń˜ 0!!6P—”•–ţ°…ƒ‚ěţ<ßŕţ:ëĺĹΚţŰ! !ŰţÜţţ$ţţüŰţü ! Ű˙ţ"ţţţüü#ţ{! !{ţ<ýl”Äý`ţü9ţ‘ ! 9 ý`Ä”ýlţüüUţ?! !?ţţţěţţüwţ` ! w˙ţęţţţüüÄţHZîjţćjî•îjÍjîlţđ'7'7Zîjţćjîźîjţćú3ţćjîfţ˛$#"&=4&+5326=46;#"3ÔůŠlŽ==kŠůÔDV[noZVž”Ýď—ts•đݓXřŽŽœřXĄţ˛N$326=467.=4&+532;#"+ĄDVZon[VDÔůŠk==ŽlŠůÔžXřœŽŽřX“Ýđ•st—ďݔ˜˙ě”č ş+¸ş +¸ 01! 4$32!5##7#”ţ?ţÂţÄţ?ÎqžÁqÍűÓiÚĄţ˙ěŮęţÁţAż?ĆrĆĆţý\Ž/˜+ý‚˜˙ě”č *ş%+¸%ş +¸ 01! 4$32>54&#">32!5!>”ţ?ţÂţÄţ?ÎqžÁqÍýć>0ĹŁ=‘as„;N_/>!ţúR¤ţL}˛ęţÁţAż?ĆrĆĆţéFi:}—$Ť:&N?(U?"ńMŽt§˜˙ě”č 6™ş+Aęú]A)9IYiy‰™ŠšÉŮ ]¸1Üş.+¸.ş +¸ ş!'+¸!ş+¸ş9ş*'!901! 4$32%4&#">32+32#"&'32654&'26”ţ?ţÂţÄţ?ÎqžÁqÍţ|ÁĄ=ˆ_ky4[\XZ‘ŒcksuD}[Xˆ@ĂŘv hęţÁţAż?ĆrĆĆţs‰— ?<:<ŒNGLO0¨œ]r˜˙ě”č ş+¸ş +¸ 01! 4$32! !3535##”ţ?ţÂţÄţ?ÎqžÁqÍýţó ţC˝śÎęţÁţAż?ĆrĆĆţţź~ţƒŽÓӍH˜˙ě”č +‹ş!+Aę!ú!]A!)!9!I!Y!i!y!‰!™!Š!š!É!Ů! ]ş+¸ş ++¸ ş+¸ş($+¸(ş901! 4$32>32#"&'32654&#"75!5!”ţ?ţÂţÄţ?ÎqžÁqÍűďYe2hvvhDw_X…@žŐϰ?‘ýĂęţÁţAż?ĆrĆĆţó%aVUa/Źʘ•° ŤŽ˜˙ě”č 2ń¸3/¸4/¸3¸и/¸4¸ܸÜAęú]A)9IYiy‰™ŠšÉŮ ]¸¸ÜA&6FVfv†–ŚśĆÖ ]Aĺő]ş +¸ ş +¸ ş+¸ş,&+¸,ş/&,901! 4$32#"&54632"32654&#"7>325.”ţ?ţÂţÄţ?ÎqžÁqÍý˘\NN\\NN\qČęŔš Âş N€ w/aTJjęţÁţAż?ĆrĆĆţţZbbZ[bb*ţőÚçýł‘”ą= P”#œ˜˙ě”č ş+¸ş +¸ 01! 4$32%!35!”ţ?ţÂţÄţ?ÎqžÁqÍűÂĎţŻÁlýUęţÁţAż?ĆrĆĆţvüć]K˜˙ě”č 1=‹ş+¸ş+¸ş +¸Aęú]A)9IYiy‰™ŠšÉŮ ]A&6FVfv†–ŚśĆÖ ]Aĺő]Aę ú ]A ) 9 I Y i y ‰ ™ Š š É Ů ]ş/9ş;9¸;/Aę;ú;]A;);9;I;Y;i;y;‰;™;Š;š;É;Ů; ]¸5Üş+¸ş )+¸ ş+¸ş28+¸201! 4$32#"&5463232654&'>54&#"2#"&546”ţ?ţÂţÄţ?ÎqžÁqÍýš_TT__TT_ýâž­­žviśˇjvkKRRKMQQęţÁţAż?ĆrĆĆţţlHQPIIPPIŠ——Š\ƒvStˆˆtSvƒÄB>=BB=>B˜˙ě”č &2é¸3/¸4/¸Ü¸ÜAęú]A)9IYiy‰™ŠšÉŮ ]¸3¸'и'/¸-ÜA-&-6-F-V-f-v-†-–-Ś-ś-Ć-Ö- ]Aĺ-ő-]ş+¸ş +¸ ş +¸ş*0+¸*ş# 901! 4$32254&#"326#"&'4632#"&”ţ?ţÂţÄţ?ÎqžÁqÍüŃČéżš ÂşŸO€ w.aUJk<\NN[[NN\ęţÁţAż?ĆrĆĆţýK Účý´‘”Ż< O“$œ„[bb[[bb˜˙ě”č $0Óş%+¸%ş+¸ş++¸Aęú]A)9IYiy‰™ŠšÉŮ ]Aę+ú+]A+)+9+I+Y+i+y+‰+™+Š+š+É+Ů+ ]ş+¸ş .+¸ ¸¸(Ü01! 4$32!5##7##"&5463232654&#"”ţ?ţÂţÄţ?ÎqžÁqÍű$ŸuźŹž‰F?@EE@?Fţpˆƒ‚ˆˆ‚ƒˆęţÁţAż?ĆrĆĆţýŠ€Ę*‰'ýÂ$˘——˘Ł——ŁĐääĐŃää ˙–Ť=$>  767654'&'!5%3!!  '&'&54767ôţ̆„mommom„†4†„mommom„ýĽţáĄýP\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ű}9“:ű݈¨@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=6P  767654'&'!!567>54&#"5>32  '&'&54767ôţ̆„mommom„†4†„mommom„ţ)4ý \=)N=…kPĽ`aŞFşÝ7I׺\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ű€ˆˆ_A.Xx;_x55Ł'(ş›I„ZŢV@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=B\  767654'&'#"&'532654&+532654&#"5>32  '&'&54767ôţ̆„mommom„†4†„mommom„ttƒóŕLŸUD W˜Ÿ”„‹‘x~‚zB˜\RŤGşŐrţ=\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ýyœt°Âœ'(xrjw…_Z\b§Ždˆ @>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť='A  767654'&'!33##!5  '&'&54767ôţ̆„mommom„†4†„mommom„Ţţh˜*ËŞŞĄýĺ+\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6íý‚ üő†ţćœň@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=7Q  767654'&'!!>32#"&'532654&#"  '&'&54767ôţ̆„mommom„†4†„mommom„ýŁzţ#G#ČéđÚKœSL•VŠ˘˘ŠAC\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6cˆţŰ ŰťÁÖŁ)%’}|’X@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=%>X  767654'&'"32654&.#">32#"32  '&'&54767ôţ̆„mommom„†4†„mommom„ţÖl€€lmÔ=|< Š /ŽV´ŃÚľĎŰ â=|ţ^\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ý‹•‚€––€‚•ú“ŘÚEKŰź¸Ţ>-O@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť= :  767654'&'!#!  '&'&54767ôţ̆„mommom„†4†„mommom„ý\ţN¨˜ýÂÖ\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6`Eűš#…@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=#9E_  767654'&'"2654&%.546  &54632654&#"  '&'&54767ôţ̆„mommom„†4†„mommom„ţßs„„ć…„ţęhtĚdĚthuƒÔţtԄ9tihvvhit0\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ý,{Ř{|kl{EŽgŚŚgŽžs­şş­sž\hh\]hhĐ@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=2>X  767654'&'53267#"&54632#"&2654&#"  '&'&54767ôţ̆„mommom„†4†„mommom„ý§=|< Š .VľĎÚ´ĐÚţôâ=}ţmml€€J\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ů96ooţ÷œ—ţ÷oo6996oo —œ oo6ű“×ŰDJŮź¸ŢţĂţŃţćţŻ•‚••‚••@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=+8Ca  76767654'&'&'"32654'.  735733!  '&'&'&5476767ôţ̆„mo5885om„†4†„mo5885om„T,+VUVV++ď2QPPQţΠPţ3–•ƒţp\˜–|~-,Ąüg%“&ű݈¨@>}~•—ąŹ—•~}>@@>}~•—Źą—•~}> ˙–Ť= $!5!#%  '&'&54767°ţřĄţâ{\˜–|~{{~|–˜ţ¤˜–|~{{~|–ˆˆ#:“9üq @>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=6>7>54&#">32!5  '&'&54767ŁĂ×I7ÝşFŞa`ŠLk…=N)ţĂ\öýŐ\˜–|~{{~|–˜ţ¤˜–|~{{~|– ÇŢZ„I›ş('Ł55x_;xX.ţż_ˆˆ@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=(B>54&#">32+32#"&'32654&  '&'&54767ir׸GĄ\\˜Bz‚~x‘‹„”Ÿ˜W DUŸLŕóƒţ2\˜–|~{{~|–˜ţ¤˜–|~{{~|–ˆdާb\Z_…wjrx('œ°tœ=@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť= '! !335#$  '&'&54767œţhnţĄŞŞţo\˜–|~{{~|–˜ţ¤˜–|~{{~|–łý‚ ý œţㆠý@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=7>32#"&'32654&#"!5  '&'&54767CAŠ˘˘ŠV™HSœKÚđéČ#G#ćţ\˜–|~{{~|–˜ţ¤˜–|~{{~|–=ý¨’|}’''ŁÖÁťŰ %ˆ@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť= $>2#"&546.#"32654&#">32  '&'&54767Pmml€€­C|=âţóŰĎľÚŃ´VŽ/ Š <|=ţ\˜–|~{{~|–˜ţ¤˜–|~{{~|–+•‚€––€‚•úţŻţĺţÓţÂ޸źŰKEÚŘŤ@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť= !35$  '&'&54767Ö>ţh¨˛ýÖ\˜–|~{{~|–˜ţ¤˜–|~{{~|–@ˆűÝfEý@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť= +E2"&46' 654&'>54& 74632#"&  '&'&54767Yt„…ć„„/t„ԌԃuhtĚţœĚt-tihvvhit0\˜–|~{{~|–˜ţ¤˜–|~{{~|–Ě{lk|{Ř{Ežs­şş­sžŽgŚŚgŽĺ]hh]\hh‰@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=$>%32#"3267#"&'"&54632  '&'&54767!C}=â ÚĐ´ÚŃłV. Š <|=Al€€lmţÝ\˜–|~{{~|–˜ţ¤˜–|~{{~|–ŽQ/=޸źŮJDŰ×g•‚••‚••@>}~ţÔąŹţÔ~}>@@>}~,Źą,~}> ˙–Ť=  :2#"&546$  !5##7  '&'&54767™eddedddţžŠŠBŞű‘ÂĄł´–\˜–|~{{~|–˜ţ¤˜–|~{{~|–Őő÷őööő÷ő€ţĂţŃţÓţÂ>-/ýˆˆ#&“%üq @>}~ţÔąŹţÔ~}>@@>}~,Źą,~}>ušPj !!5!!PţţŔpűÝ#ţ@‚ţpđpüpté 7%÷ýŠľÔFýN‹´Şý4ýNGuĚP85 zűűDýć<2đ2pţJţJüt” '-ZýKŠűţ˲FýŞ´ÔGýNuPü!!uť¨\lý”ţ¤¨ýEž>ü~~ü>uu+"&'.546?!".4>3!'.5467>2ţp4,şü€,$$,€ş,4›2.ţp ,.ş".2."ş., ţpuĚP8!5! šűŰ%śţJZPŽţJţJuĚP8!5! šűŰ%śţJÜHţJţJuĚP8 #3#3#3!!5 šđđţŔxxČ<<éţo‘śţJşţpţpţpîţJţJuĚP8 55!#3#3#3š¸ţţ¸ţoPđđţŔxxČ<<ފţ΄„ţΊXý¨Xý¨Xý¨XuĚP8!!5 šűŰ%śţJşîţJţJäŔPD! 6üź–ţ>lú”‚ţńÂţ>ţ>äŔPD ! ţňDýRţ>lú”‚ţńÂţ>ţ>ä˙řP  Bţ˘lú”‚ŠývývuĚPb3!5 5! '&'.u$##+* ZśţJţMţM*+##$‚ŕ0U%!ĆţJţJĆ!%Uu˘P84676763!5 5! u$##+* ZśţJţMţM*+##$‚0U%!ĆţJţJĆ!%U0ě˙ńŮ!! ^ţŽr{ţ…VXeýoýouĚP855!źţDüqšžţ΄„ţΞ0ušj%5!!53  !<ý9Çúčţޘţhý9šîôîţţ>îţŹušj%5!!53  !<ý9Çúčţ˜ţhý9šîôîţţ>îţŹ+Z° !73#57!!+ IŠdŘý&–ý+ъ„ŹŠüˇÄÎôîýţČţ2Č&îţŹ+Z° 5!'53#'!!!+Ő–ÚŘdŠüˇąüˇÄIŠŹý|úČ&Čţ2Čýţî¤ţŹî˜˜2˜ !'!'!53 !ÜOýědcnčdţ‚˜ţhýžČ”žţČţśž˜˜žţ 2˜ 3#5!7!!! Ünčdţnýd;ýc˜ţh˜ţČţž”Čţčţ ž˜˜dd˜ !53#'5!'! !–]nč2ţn2üŐ2ňr-˜ţhüÓ°Jžţdţc;dJúž˜˜ždd˜ 7!573#5!! !–2+2nč2ţnüŁňr-˜ţhüÓLJd;cţdţžJúž˜˜ž<˙ŘÄŻ6767632"'&'&'! <'CZmo~yti^Z\X^Vqo÷ti^?)XĘţ6nGCZ.//+]Y݀zÚ_X0//+]>IžĘʞ ‚BP "&*.37#37#37#37#5!!!!3'#3'#3'#3'#á < ´ < ´ < ´ < xťť‡­ĂĂ­ţyťýä_< <(< <(< <(< <ZđđđđđđđđPţčź‚‚źţčhđđđđđđđĽpt> 7&#"7'7 !%˘Ż*ޤBFŻţ8ţŠţĺţWU¨{°FCŁ*°ţ9oţX¨:ţWţćubP˘ 55!5!!'!ţš¸¸šţ˜ý§XČý¨ČČXČŞřźddźřPRČČȧ˙Ĺt” '327'' !!iŻFB¤Ž*Ż˙8ţ‘¨ţX:ţĺ¨Á°*˘CF°˙9ţ¨ţĺţXU¨§pt>*%&#">7'&'&">327&5467>7tĽBEH€ŚŚ#&NKţX$W/,0$"¨ D5Hp*G6ŚŚ¨$"!0,0Y"ţW!F&'&#ţťGGCŁuaPŁ'467#"!4676?'&'.5!3!.5Pˇ›5ëę#$ý¨%"//"%X$# Ë5›‚eźeJ(0Y! "X0(Jeź§˙Ćt”*.'.54?'#"&'2767.'32t)H5§§ ţX"$ #0,0X"¨KN&#E€HEBĽ”ŽŁCGG¨¨&'&KţW"Y0,0$"¨E6GsŹPX'<6%"'&'.54676$4676762"'&'&&'.54676762$/ö+ăz >ü_ $#R#afü‚ţˇ#R#)ž>xĺţ”ÎbQuţý 88—RK…68ƒ# 88  ţţvc–<ĺ*676767632#"'&'&'&%.5467.546–A ''+/54<3˘‘ţo˘8n23'9%%%%büüb%%%‚&:?$ fLLf#&#/:&'X23X'ńrrń'X32X˘V2Žc"'&'.54?654&'&'&#!"#!".4?64/&4676763!23!2767>54/&546767622đ ţćZýœ ;:td Z đ‹đ  c ´  uuč ´ c  đ˘ń2c"'&'.54?654&'&'&+"#!".4?64'&4676763!2;2767>54/&546767622ţpW\xýj IJœ– ‚\W‹ţ˜ Űđ  ““8 ţüŰ ţ˜uŚP^'#76767&'&/3#>7!5!!5!.'PˆSŒJl.. &GG& GlHŽSýĚi7*üÖĺnK Knü**7‚OUŠnm¤'66'¤1ޤ”UýŐ=…Hdގ)ˇŽdH…=mţ˛Đ'*'$&'&#"'67667Đ h7ţHm^:-ˆ3ŐŢţ° REţ˛ SRŽőQO‰1ŘĚĄüLÜHOţ˛˛'57$'&54&#""OER ţ°ŢŐ3ˆ-:^mţH7hţ˛H܏´ĄĚŘ1‰OQü ŽţŽS ţ#îu ! !ůőţ ţ óţ˜Ňţ–jý.uűŰűÓ-1ýüްţň0 3%!#3!ČţÔ€đđý€°ůŚZddůŚdŻţň/ #3!53#5ËČČdý€đđ°ůŚžřŢdZdˇţň{3 #ˇŞţ檂üpüp¤ţňh # 3hţćŞţ檂üp˙˙ˇţňĎ&óóT˙˙¤ţňź&ôôT[[Ü '#'#'##'‰Ňx\xŇxjjxŇx\xŇÜý,x\ýeÓűȰhhűP8Óü›ě\xÔY˙ůYŐ73373737+ý.x\xŇxjjxŇx\xý.Ôx\ěü›Ó8űPhh°űČÓeý\xý,Ol„D=072767>54'&'&'&"7#7676767632#"'&ew@RNžJV !'7$"!3!&'&'&'!#!2767676Ţţwxéţ  !1cbîţěîbc1! ˝˝ "1cbîîbc1" `éxüâÖ]\LM& ŽŞŽ &ML\;ţRŞţR &ML\]Ö]\LM&ŻZţwxéZQvcbddbcvQZŞ[RwcbddbcwR[éxV''LM\7=eţ›=7\ML'ýĆţ›e;6\ML''''LM\6dĚ 8 ´  ÔÔĚ2@ @@ 00 ]1@  œ Ôě99ĚĚ0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY5!!d‰xé ‡öyéxUZ‰xéŞéxuĚ 8 ´  ÔÔĚ2@ OO __ ]1@ œ Ôě99ĚĚ0@  œ ü<<@ œü<<°KSXł <<´œ ě´œěY'7!5!'7 ţwxéöy ‡éxŻZţwxéŞéxdĚ 8Úś ÔĚ2ÔĚ2@ PP_ _O O]1@   œ Ôě9Ě2Ě20@   œü<<@ œü<<@ œ ü<<@ œü<<°KSXˇ <<<<´œě´œě´ œ ě´œěY5!'7'7!d‰xé€éx‰ţwxé÷€éxUZ‰xééxţwZţwxééxdĚ 8!!5!! s÷]xţw‰x]űöix]x‰Z‰x]xiuĚ 87'!5!'7'7!5 čiiöű]x‰ţwx]÷iix]xţwZţwx]xdĚ 8!7'!!5!'7'Xii÷¨iIř˜]xţw‰x]h]x‰ţwxiiiá]x‰Z‰x]]xţwZţwxdĚ 8 !5!3# Y÷#éxţw‰xéÝŞŞ-éx‰Z‰xéYü¤uĚ 8 #3!'7'7ŞŞÝéx‰ţwxé-ţ§\ţ§éxţwZţwxédĚ 8 !5!53#5! Y÷Ż]xţw‰x]QŞŞ÷7iiĄ]x‰Z‰x]Íü¤EŇiiuĚ 8 !'7'7!#3!7'Q]x‰ţwx]÷ŻŞŞÉiic]xţwZţwx]Í\ţťŇiiuĚ 8%77777773'7'7#'''''''uF´´´´´´´´´´´´F‹éx‰ţwxécn´´´´´´´´´´´´F×F´´´´´´´´´´´´FéxţwZţwxén´´´´´´´´´´´´F˙˙,X@ş,˙˙,ÝX ş,Ý˙˙,ÝX@'ş,ş,Ý˙˙,§XÓş,§˙˙,§X@'ş,ş,§˙˙,§X 'ş,Ýş,§˙˙,§X@'ş,'ş,Ýş,§˙˙„°@ş„˙˙,°@'ş,ş„˙˙,ݰ@'ş,Ýş„˙˙,ݰ@'ş,'ş,Ýş„˙˙,§°@'ş,§ş„˙˙,§°@'ş,'ş,§ş„˙˙,§°@'ş,Ý'ş,§ş„˙˙,§°@'ş,'ş,Ý'ş,§ş„˙˙„ݰ ş„Ý˙˙,ݰ@'ş,ş„Ý˙˙,ݰ 'ş,Ýş„Ý˙˙,ݰ@'ş,'ş,Ýş„Ý˙˙,§° 'ş,§ş„Ý˙˙,§°@'ş,'ş,§ş„Ý˙˙,§° 'ş,Ý'ş,§ş„Ý˙˙,§°@'ş,'ş,Ý'ş,§ş„Ý˙˙„ݰ@'ş„ş„Ý˙˙,ݰ@'ş,'ş„ş„Ý˙˙,ݰ@'ş,Ý'ş„ş„Ý˙˙,ݰ@'ş,'ş,Ý'ş„ş„Ý˙˙,§°@'ş,§'ş„ş„Ý˙˙,§°@'ş,'ş,§'ş„ş„Ý˙˙,§°@'ş,Ý'ş,§'ş„ş„Ý˙˙,§°@'ş,'ş,Ý'ş,§'ş„ş„Ý˙˙„§°Óş„§˙˙,§°@'ş,ş„§˙˙,§° 'ş,Ýş„§˙˙,§°@'ş,'ş,Ýş„§˙˙,§°Ó'ş,§ş„§˙˙,§°@'ş,'ş,§ş„§˙˙,§° 'ş,Ý'ş,§ş„§˙˙,§°@'ş,'ş,Ý'ş,§ş„§˙˙„§°@'ş„ş„§˙˙,§°@'ş,'ş„ş„§˙˙,§°@'ş,Ý'ş„ş„§˙˙,§°@'ş,'ş,Ý'ş„ş„§˙˙,§°@'ş,§'ş„ş„§˙˙,§°@'ş,'ş,§'ş„ş„§˙˙,§°@'ş,Ý'ş,§'ş„ş„§˙˙,§°@'ş,'ş,Ý'ş,§'ş„ş„§˙˙„§° 'ş„Ýş„§˙˙,§°@'ş,'ş„Ýş„§˙˙,§° 'ş,Ý'ş„Ýş„§˙˙,§°@'ş,'ş,Ý'ş„Ýş„§˙˙,§° 'ş,§'ş„Ýş„§˙˙,§°@'ş,'ş,§'ş„Ýş„§˙˙,§° 'ş,Ý'ş,§'ş„Ýş„§˙˙,§°@'ş,'ş,Ý'ş,§'ş„Ýş„§˙˙„§°@'ş„'ş„Ýş„§˙˙,§°@'ş,'ş„'ş„Ýş„§˙˙,§°@'ş,Ý'ş„'ş„Ýş„§˙˙,§°@'ş,'ş,Ý'ş„'ş„Ýş„§˙˙,§°@'ş,§'ş„'ş„Ýş„§˙˙,§°@'ş,'ş,§'ş„'ş„Ýş„§˙˙,§°@'ş,Ý'ş,§'ş„'ş„Ýş„§˙˙,§°@'ş,'ş,Ý'ş,§'ş„'ş„Ýş„§˙˙,ţpX˙œş,ţp˙˙,ţpX@'ş,ş,ţp˙˙,ţpX 'ş,Ýş,ţp˙˙,ţpX@'ş,'ş,Ýş,ţp˙˙,ţpXÓ'ş,§ş,ţp˙˙,ţpX@'ş,'ş,§ş,ţp˙˙,ţpX 'ş,Ý'ş,§ş,ţp˙˙,ţpX@'ş,'ş,Ý'ş,§ş,ţp˙˙,ţp°@'ş„ş,ţp˙˙,ţp°@'ş,'ş„ş,ţp˙˙,ţp°@'ş,Ý'ş„ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„ş,ţp˙˙,ţp°@'ş,§'ş„ş,ţp˙˙,ţp°@'ş,'ş,§'ş„ş,ţp˙˙,ţp°@'ş,Ý'ş,§'ş„ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„ş,ţp˙˙,ţp° 'ş„Ýş,ţp˙˙,ţp°@'ş,'ş„Ýş,ţp˙˙,ţp° 'ş,Ý'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ýş,ţp˙˙,ţp° 'ş,§'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,§'ş„Ýş,ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ýş,ţp˙˙,ţp°@'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,§'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ýş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ýş,ţp˙˙,ţp°Ó'ş„§ş,ţp˙˙,ţp°@'ş,'ş„§ş,ţp˙˙,ţp° 'ş,Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„§ş,ţp˙˙,ţp°Ó'ş,§'ş„§ş,ţp˙˙,ţp°@'ş,'ş,§'ş„§ş,ţp˙˙,ţp° 'ş,Ý'ş,§'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„§ş,ţp˙˙,ţp°@'ş„'ş„§ş,ţp˙˙,ţp°@'ş,'ş„'ş„§ş,ţp˙˙,ţp°@'ş,Ý'ş„'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„§ş,ţp˙˙,ţp°@'ş,§'ş„'ş„§ş,ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„§ş,ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„§ş,ţp˙˙,ţp° 'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş„Ý'ş„§ş,ţp˙˙,ţp° 'ş,Ý'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ý'ş„§ş,ţp˙˙,ţp° 'ş,§'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,§'ş„Ý'ş„§ş,ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,§'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ý'ş„§ş,ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ý'ş„§ş,ţp˙˙„ţp°˙œş„ţp˙˙,ţp°@'ş,ş„ţp˙˙,ţp° 'ş,Ýş„ţp˙˙,ţp°@'ş,'ş,Ýş„ţp˙˙,ţp°Ó'ş,§ş„ţp˙˙,ţp°@'ş,'ş,§ş„ţp˙˙,ţp° 'ş,Ý'ş,§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§ş„ţp˙˙„ţp°@'ş„ş„ţp˙˙,ţp°@'ş,'ş„ş„ţp˙˙,ţp°@'ş,Ý'ş„ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„ş„ţp˙˙,ţp°@'ş,§'ş„ş„ţp˙˙,ţp°@'ş,'ş,§'ş„ş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„ş„ţp˙˙„ţp° 'ş„Ýş„ţp˙˙,ţp°@'ş,'ş„Ýş„ţp˙˙,ţp° 'ş,Ý'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ýş„ţp˙˙,ţp° 'ş,§'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,§'ş„Ýş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ýş„ţp˙˙„ţp°@'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,§'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ýş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ýş„ţp˙˙„ţp°Ó'ş„§ş„ţp˙˙,ţp°@'ş,'ş„§ş„ţp˙˙,ţp° 'ş,Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„§ş„ţp˙˙,ţp°Ó'ş,§'ş„§ş„ţp˙˙,ţp°@'ş,'ş,§'ş„§ş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„§ş„ţp˙˙„ţp°@'ş„'ş„§ş„ţp˙˙,ţp°@'ş,'ş„'ş„§ş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„§ş„ţp˙˙,ţp°@'ş,§'ş„'ş„§ş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„§ş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„§ş„ţp˙˙„ţp° 'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş„Ý'ş„§ş„ţp˙˙,ţp° 'ş,Ý'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ý'ş„§ş„ţp˙˙,ţp° 'ş,§'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,§'ş„Ý'ş„§ş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ý'ş„§ş„ţp˙˙„ţp°@'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,§'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ý'ş„§ş„ţp˙˙,ţp°˙œ'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,ţpş„ţp˙˙,ţp°Ó'ş,§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş,ţpş„ţp˙˙,ţp°@'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,§'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş,ţpş„ţp˙˙,ţp° 'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„Ý'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ý'ş,ţpş„ţp˙˙,ţp° 'ş,§'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„Ý'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,§'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ý'ş,ţpş„ţp˙˙,ţp°Ó'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„§'ş,ţpş„ţp˙˙,ţp°Ó'ş,§'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,§'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş,§'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp° 'ş,Ý'ş,§'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,§'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,§'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,Ý'ş,§'ş„'ş„Ý'ş„§'ş,ţpş„ţp˙˙,ţp°@'ş,'ş,Ý'ş,§'ş„'ş„Ý'ş„§'ş,ţpş„ţpdĚ?8 !5!53#5!•üs]xţw‰x]ŞŞűűiiĄ]x‰Z‰x]Íü¤EŇiiuĚP8 !'7'7!#3!7']x‰ţwx]üsŞŞiic]xţwZţwx]Í\ţťŇii´Ü 3'#'##-Z-x\xŇxŇx\Ž.ýŇx\ün Óű#ÝÓűö’\˙ů´Ő733737#x\xŇxŇx\xýÓZ'x\’űöÓÝű#Ó ün\xýŇO€'ľ=%"'&'&'&767670327676764'&'&'&˝pk_V1..1Vbr‰xé`Xk_V1..1V_kpIęxţ¸XE?#!!';B˘]YQS@?#!!';BQ9€.-\ZnllnZ_.‰xé$-\Znl˙lnZ\-.)čxF!F@RNžJV>Žl§ůď˜mGĐĄBk˜đţî>DôdWŽű0Xd”Ýď—ts•đݓţ˛ß.W@#.  -&.%)/ÜK° TXš)˙Ŕ8YĚ299ĚÜ´]<Ü<Ě999991@Š &$Ŕ-ą/ôĚ2ÄôĚ2ě907&54&'>5!2;#"#!532654&+C­­I°02°Ký˝ů§lŽ>>Žl§ůţů5ŒUUŒ5D>đ˜kBĄű0Gm˜ń“Ýđ•st—ďݔdXЎWŮţ2Űů  5 1üŞúţű¨VüŞŞĚdţÎýĚáŚá22üšhţŚŮ'ć %#3 5'ŞŞţ ü˘úţČü:ÄţžýœŚŮ'ć 73 ŮŞL^ü˘ŞČű8bbü:ČýďŚŮ˙Â'B 7Ů''üٛâ>€ý°Pú€Nqţ˘ĆŮ˙Â'B 'Ů''üٛţ>€ý°Pú€Nq^ýDŮ˙Â'B Ů''üŮ>€ý°Pú€NŮ˙Â'B%  'üŮüŮ''ýt˘ŕNý˛€ý°PÝţŮ˙Â'B5  5Ů''üŮüŮŒbŕý˛Nú€Pý°Ýäţ#îu úôţ ţ uűŰűÓ-ŮŰ3!3!!#!#!5 ¨L¨3ţͨţ´¨ţÍ×-ýÓ-ýÓŞýÓ-ýÓ-ŞŮŰ333333#######5¨¨ś¨ś¨ĎϨś¨ś¨Ď×-ýÓ-ýÓ-ýÓŞýÓ-ýÓ-ýÓ-Ş:ţkĆű7!!  767654'&'$  $'&'&547676h0ţĐ8ţŔŒ‰rtrrtr‰Œ@Œ‰rtrrtr‰ţ ŽVŽŽGFFGŽŽţŞţrţގŽGFFGŽŽčţ’Č;:rsţ죟ţěsr:;;:rsŸŁsr:ôŽŹŞÉĹŹŞŽŽŞŹĹÉŞŹŽ:ţkĆű3?  767654'&'$  $'&'&547676!!#!5! ţŔŒ‰rtrrtr‰Œ@Œ‰rtrrtr‰ţ ŽVŽŽGFFGŽŽţŞţrţގŽGFFGŽ€ýs¨ýsB;:rsţ죟ţěsr:;;:rsŸŁsr:ôŽŹŞÉĹŹŞŽŽŞŹĹÉŞŹŽ€KýsŞýsŞ:ţkĆű3?  767654'&'$  $'&'&547676   '  ţŔŒ‰rtrrtr‰Œ@Œ‰rtrrtr‰ţ ŽVŽŽGFFGŽŽţŞţrţގŽGFFGŽ€]ÍÎxţ3Íwţ3ţ2xÍţ3B;:rsţ죟ţěsr:;;:rsŸŁsr:ôŽŹŞÉĹŹŞŽŽŞŹĹÉŞŹŽ€čţ3Íxţ2ţ3wÍţ3xÎÍ˙˙uţM %' io& i' i% iJuţMś327!5!>2&#"!!"&' ;E ţ€”2&#"!!!!"&' ;Eţř ţä$Ÿ˜€”;Eţđ ţÜŸ˜€›‚ŻÎŞđ¨@Ľ‡z‚Żţ٨đŞţĽ‡zuţMś&#"%"&'73275%>2";ECţľŸ˜€”;EţžJŸ˜€ö‚Żýçś şýmĽ‡z‚Żś ş“Ľ‡zuţMś*3&#"&'67"&'7327&'&54767>2";E™Iq(P >6DŸ˜€”;E]InoSuŸ˜€ţ=,HK%ö‚ŻţÖ)ˆAH!ţ+p$ ţžĽ‡z‚Ż1Io›œsV<¤ˆzüEÖ.JghH$uţM-2&#"676='73'"&'7327&'&53>2";E+@/V]H˝6źH\nUm —€”;D [>wfP3,, —I6ö‚Żüx/Ur]H˝˝H]œlVţĄĽ‡z‚ŻM>wšrN3 ™Ľ‡F4uţMś!3#!!>2&#"!!"&'732˛ÓÓwţĽ˘—~”9F 9ţĄ Š‘}”9GŚţýęr0ާ…}Œ‚Żţőüźţ˙­}Œ‚uţMś+3#>2&#""&'73273264&˛ÓÓc)˘—~”9GcBnnVs˘—~”9F (6o‡”Śţ~ç…|‚ŻţÖK|ţŇoUţž§…}Œ‚Żś“ŘuţMp.3#327264&#">2&#"632#"'"&'ÓÓţz;E-8pƖŠqŐS˘—€”;E;DŠÎܛWI —€Žţýľ‚Ż3>6‘яĄ]¤ˆz‚ŻţËéţŇŰ!ţŁĽ‡zuţMś 13#64&"327&'&767>2&#""&'­ÓÓ˔ŠÖ˘;E]InoSuŸ˜€”;EcBnnVsŸ˜€°ţzŃ‘ϐţ-‚Ż1Io7sV<¤ˆz‚ŻţÖK|ţŇoUţžĽ‡zuţMś!%7!>2&#"!!"&'73273!#3˜;˘—~”9GţÄŠ”9G ĹŹţĹŤ“›ţI§…}Œ‚ŻţĐýţŢ­{Ž‚Ż tţęţ˙žţMm-&#"!2#567&'!"&'7327!5!>2";Ed‹_``ţë!Ÿ˜€”;D ţÜť`ţĹ;`ť*Ÿ˜I6ö‚ŻýďĆŒˆebýIĽ‡z‚Żžş`:H:`ş*Ľ‡F4uţMś#&#"7'"&'7327'7'7>2";ExüüxąŸ˜€”;EŸzţüx˛Ÿ˜€ö‚ŻţXyüüx°ýôĽ‡z‚Żâ yüüxłŘĽ‡zuţMś*327#467>2&#"#4'"&' ;E-A 4y›yŸ˜€”;E Z>Vy|-Ÿ˜€›‚ŻŚ2PœţČIĎź+Ľ‡z‚ŻţćEaÖţˇ8ó2üJĽ‡zuţMś'&#"63"&'7327&'&53>2";E*’yţďŸ˜€”;E\?Vy~+Ÿ˜€ö‚Żü&8ţˇţŒ'ţ˘Ľ‡z‚ŻLFaÖIţČő1…Ľ‡zuţMŔů>32&#"#"&'7327!5ă˘KL~”9GA˘LK~”9Güď⧅}Œ‚Żú°§…}Œ‚Żg  kýbś>32&#"#"&'73275!ă˘KL~”9GA˘LK~”9GţÉ⧅}Œ‚Żú°§…}Œ‚ŻýĐ  ˙˙?œĹ™Ů˙ŰŚ 5 5ŰúţűřúţFśŃśeţ‘ţ“śŃŚŃŮ˙ŰŚ 55ŮúţúţFŃśţ/ěśţ/Śţ/śm˙˙Ů˙ÝŚ' /˙ť/˙˙Ů˙ŰŚ& ţť0˙˙Ů˙Ű'' á/˙˙Ů˙Ű'' á0˙˙Ů˙Ý' /Ě/˙˙Ů˙Ű ' ˙ţÇ0ŮţńÜN:A%#"'&'&'&#"5>32326#"'&'&'&#"5>32326 5Üj˛bn’ š^XŹbh´`n” œ^V¨hj˛bn’ š^XŹbh´`n” œ^V¨gü@ŔúţPłNE;=LTłNE;=K›˛PD:32326#"'&'&'&#"5>3232655Üj˛bn’ š^XŹbh´`n” œ^V¨hj˛bn’ š^XŹbh´`n” œ^V¨űeúţŔPłNE;=LTłNE;=K›˛PD:327&#"56767326 5Üj˛bDS4ŒWV¨hj˛bm“\¤Y@/XŹbh´`ES3‹VXŹbhZmM’p[¤Y@1V¨gü@Ŕúţ–˛PDƒ4KUłNE;é@âLTłNE‚4LR˛N"*,é@ăJ^ţëţî˛pŞoŮţ_ÜN5<#"'3267#"/'7&#"5>327&#"5>32732655Üj˛bDS4ŒWV¨hj˛bm“\¤Y@/XŹbh´`ES3‹VXŹbh´`n”[¤Y@1V¨űeúţŔ–˛PDƒ4KUłNE;é@âLTłNE‚4LR˛ND:é@ăJ^°ţ‘Şţ˛Ůý„ŰT 5!5!-5 !5!Űúţü‹uúţúţuü‹úţúţű°/Ş0˛Ňý\Şű^ŐҲţĐŞţŃ~ŞŮý„ŰT -55!55!Ůuü‹úţúţü‹ţsűŐҲţĐŞţŃţ᪪ü°/Ş0˛ŇůŞŞŮ˙ÜN%#"/&'&#"5>32326!! 5Üjłan’š^XŹbh´`n”œ^V¨űfúţü@Ŕúţ–˛PD:32326!!55Üjłan’š^XŹbh´`n”œ^V¨űfúţúţŔ–˛PD:323265-5Űiłan’›^XŹbiłan“›^VŠgúţü‹ţsuü‹úţž˛OE;=LS˛NE; =KJ°/Ş0˛Ňú:ŐҲţĐŞţŃŮţŰ !(#"/&'&#"5>32326-5 5Űiłan’›^XŹbiłan“›^VŠűeuü‹úţúţü‹ž˛OE;=LS˛NE; =KJŐҲţĐŞţŃűż°/Ş0˛ŇŮţ,Ű× -55!55!Ůuü‹úţúţü‹ţs%ŐҲţĐŞţŃţ᪪(°/Ş0˛ŇůŮŞŞŮţ,Ű× 5!5!-5 !5!Űúţü‹uúţúţuü‹úţúţ%°/Ş0˛Ňý\Ş~ŐҲţĐŞţŃű^ŞŮţ6Űî 5 5 -55Űúţü‹uúţúţuü‹úţ•°/Ş0˛ŇýV/°ţŃýŚŐҲţĐŞţŃţа/°Ůţ6Űî -555 5Ůuü‹úţúţü‹uúţ•ŐҲţĐŞţŃţ۰/°ý'°/Ş0˛ŇýK/°ţŃŮ˙„Ű& 55Űúţúţűřpţ/śŃűśŃŚŃśţ“Ů˙„Ű& 5 5Ůúţűřúţpśţ/śý›omśţ/Śţ/˙˙Ů˙„Ý&' /ţîG˙˙Ů˙„Ű&' ˙ţţäHÚ˙śÜ{ 5!5 5!Úúţü@ţžŃŞŞű•°oŞp˛ţî9ŞŞÚ˙śÜ{ !5! 5 !5!ÜúţúţŔü@úţúţŃŞúë˛ţŞţ‘ţŞŮ˙ŔŰÍ555Ůúţúţü@Ť˛p˛ýN˛p˛ü—°oŞp˛ţîŮ˙ŔŰÍ 55 5ŰúţúţúţŔü@úţŤp˛ţţ p˛ţýU˛ţŞţ‘ŮÜ(".#"#"&'5327>76325Üh¨V^œ ”n`´hbŹX^š ’nb˛júţü@ĘTL>7632 5Üh¨V^œ ”n`´hbŹX^š ’nb˛júýÁü?úţĘTL>ŞŞţÖŞŞÜVJ<:DN´TL<:DNüD°oŞp˛ţîŮţ˜ÜÔ$+5!5!.#"#"&'53276767632 5Ůúţh¨V^œ ”n`´hbŹX^š ’nb˛júýŔü@úţ>ŞŞţÖŞŞÜVJ<:DN´TL<:DNüD˛ţŞţ‘ŮfŰÎ $!!!5!676762!!&'&'&!!Ůúţ‚C.8ţd 6WYÎYV7 ţe8-ý;úţZŞ{+DD\¨93[2332[0<¨[EC,üéŞŮ˙ĎŰW7!!%5$Ůúţţţ$Üţü}ƒyŞąţĺ]]ţĺ×x„Ś|€Ů˙ĎŰW%!5505%$Űúţƒü}ţÜţ$yŞŞ×ţ€|Ś„ţˆ×]]Ůţ×ŰW !!'7!5!%5$Ź–Zóý˛…–Zţ N´ţţ$Üţü}ƒqP¨ŞřP¨Şţĺ]]ţĺ×x„Ś|€Ůţ×ŰW !!'7!5!55%$Ź–Zóý˛…–Zţ Ný˛ƒü}ţÜţ$qP¨ŞřP¨Ş×ţ€|Ś„ţˆ×]]Ů˙ ŰK75!5!%5$ŮúţţÍýŘ!:ţŁü[Ľ]3ŞŞţÖŞŞkţĺ-Q÷×tXŚVvŮ˙ ŰK75!5!55$%$Ůúţúţ]Ľü[ţŁ:!ýŘ3ŞŞţÖŞŞk×ţŠVŚXţŒ×÷Q-ŮţqŰK!5!7!5!7!!!!'%5$&ţłÚ`ýĆȉŠ)Pţ"_=ý6ŠŠŢţÍýŘ!:ţŁü[Ľ]ęŞsޤs1ŞsŞĽtţĺ-Q÷×tXŚVvŮţqŰK!5!7!5!7!!!!'55$%$&ţłÚ`ýĆȉŠ)Pţ"_=ý6ŠŠţÜ]Ľü[ţŁ:!ýŘęŞsޤs1ŞsŞĽt×ţŠVŚXţŒ×÷Q-ŮţyŰ‹:E#"'&'&'&#"5>76326#"'&'&'&#"5>32>%5$Űiłan’ ›^XŹbi˛b`Ą ›^VŠgiłan’ ›^XŹbiłan“ ޞ°gţÍýŘ!:ţŁü[Ľ](łNE;=LTłN9 A=Kš˛OE;=LS˛NE;C Eěţĺ-Q÷×tXŚVvŮţyŰ‹:E#"'&'&'&#"5>76326#"'&'&'&#"5>32>55$%$Űiłan’ ›^XŹbi˛b`Ą ›^VŠgiłan’ ›^XŹbiłan“ ޞ°űe]Ľü[ţŁ:!ýŘ(łNE;=LTłN9 A=Kš˛OE;=LS˛NE;C Eě×ţŠVŚXţŒ×÷Q-ŮýíÜ‹6A#"'3267#"/'7&#"5>327&#"56767326%5$Üj˛bDS4ŒWV¨hj˛bm“\¤Y@/XŹbh´`ES3‹VXŹbhZmM’p[¤Y@1V¨gţÍýŘ!:ţŁü[Ľ]$˛PDƒ4KUłNE;é@âLTłNE‚4LR˛N"*,é@ăJćţĺ-Q÷×tXŚVvŮýíÜ‹6A#"'3267#"/'7&#"5>327&#"5676732655$%$Üj˛bDS4ŒWV¨hj˛bm“\¤Y@/XŹbh´`ES3‹VXŹbhZmM’p[¤Y@1V¨űe]Ľü[ţŁ:!ýŘ$˛PDƒ4KUłNE;é@âLTłNE‚4LR˛N"*,é@ăJć×ţŠVŚXţŒ×÷Q-ŮţĄŰŽ7 5Ůúţúţü@ŔúţĂţ˛pôţ˛pŤţëţî˛pŞoŮţĄŰŽ%5555ŰúţúţúţŔòţ˛˛˛ţ˛i°ţ‘Şţ˛ľ˙ÉŸł ' '!Â]ý#żÝ\eÁý#ţ´ÝÂĎN\ý#żÝ]xý–Âý#LÝÁ ˙É ł !77 ! ýţˆ\Ýżý#ţ€ĎÂÝţ´ý#Nţˆ]ý#żÝýňĎÁý#ţ´Ýľ4Ÿ !7 7:\ý#żÝ]xý–Âý#LÝÁ]Ýżý#\eÁÝLý#Âý1 4  %''' !ý]Ýżý#\eÁÝLý#Âý1™\Ýżý#]ţˆjÂÝţ´ý#Á7†P~ % ! !!5 5!3ţü!üţýß…ýţö é †üüţďţţőƒƒţöţöƒƒ 7†?~% !!3ţü űô†üüţďţ*^V !!^üüţďţ* üţűô ^˙ÍVŐ!!!^ÖţÉ űôţľ˙ÉŸł' '!ŸÁý#ţ´ÝÂĎäÂý#LÝÁ ˙É ł!  ĎÂÝţ´ý#äĎÁý#ţ´Ýľ4Ÿ%7 7ĐÂý#LÝÁ4ÁÝLý#Âý1 4  ! ÁÝLý#Âý1ÂÝţ´ý#Á7†P~ % ! !3ţü!üţý߆üüţďţţ^˙ÍV ! !! !EţţţďüüţďÉţüCüţu˙ůR× #7!5!7ČZţxxčü/{ęxŠxęŞţ:ęxu-R '!5!'ČŠxęű…Ńčxˆ ţvxęţ:ŞęxŠH˙ů%× 7!!7Ňţvxę{ü/čxţxŠxęĆŞţäęxţvH-% 3'!!'ŇZˆxčŃű…ęx ţvxęţäŞĆęxş˙Ő$!%!!şúW7úÉü ůŕržş˙Ő$!!!şúW7úÉü ůŕžş˙Ő$!!,7úÉrŠ<úR ůŕş˙Ő$!!cúÉrŠ<úR ůŕ˙!$ výŠüó üňdxxýˆüđüđ˙!$ žuüó üňýˆđýˆüđüđ˙!$ ! žuvú} üňýˆxüđüđ˙!$! žëýŠüó üňxýˆüđüđ ş˙Ő$ #)-17#535#5#5#5##5#5#5##5##53#5#5#5##5ŐăqrrrrţĽĚęĘMrqęĚęĘţ¤rärrrrärrćtrśĚĚ´ĘĘü$ttttŹćrtttttúĆrtćśĚĚ´ĘĘĐtrć$˙ĘĐ# !$VVţşűŕśmý“ü$˙ĘĐ# ! !Şzý0üŞVVţşűŕ‹üąO ţmý“ü–˙Ffü   vvýŠýŠrččý5ţ•kŘkţ•üć\­ţSü¤ţS–˙Ffü7 –ččýó\­ţSü¤ţS"˙šŮ‰ ! ĐţRŽ[ŽţRGččýýpţ„( $  %pýűţýýüţý@¨*––ţÖűXţ֖–M˙ §M :lý”üLüŞüŞF M˙ §M  ü˛N ţ lý”üĆţîü†ţěĐVüŞüŞF  jŐ3!!!!!!#535#53ÉĘ[ţĽ[ţĽ×ü_żżżżŐţţ~Ş, *3###535#5333#yąą¸ˇˇˇˇ¸ąąźýÔ,8ýȐ˙×jŐ#3327673#"'!!&'&#"#>32ÉĘ &}f[×ü_ &}f[Őý, %$R†”ţ/Ş %$R†” Ő!2+##5332654&+!ÉČű€€űţĘżżĘţššţ[ŐqrŰÝqqý¨ϐŃ’‡†’АÉţfTŐ$Ç@  $ !? %üě2üÄě9999Ě991@&  B •°• $•/ôěÔě999ôě990KSXíí9Y"˛@&]@Bz%%%&'&&& &66FFhuuwˆˆ˜˜]]#.+;#"&! 32654&#A{>ÍŮżJ‹xÜn†?MăÍČüƒý‰ţ’••’ź~ţh–býń–ŞômÖ؍şOýƒ…H˙˘œź#(07#5#"''7&546;7&'&#"5>327354326=-¸?źˆ‡\g`n;ýű)ž T—`śTežZçx”_¨9ť58Żţź>c™šýĹĺc3VýŞfa<}N…V{˝Ŕż E..Ş''rłOËs+Aşţx.Ů´)ţâ 3{ ˙č˙B“333#;#"'&'##53w1ŔŞŔ ŃŞKs˝˝ŐQ fŞÖ‡‡žţÂ3ý͏ţo‰NšP ţÖr>˙˙ÉţżŐ6şţĺ!#4&#"#3676323#d¸||•ŹššBYZuÁcc¸¸žŸžž¤ý‡ýže22wxčýőţLÉţżjŐ%3###3!ÁŠĹEý3ĘĘžýŞţAĎý1Őý‰wýHşţĺœ33 3###şš%ëýŽ̟¸8ýÇšüiăýôţEţL#ýÝ\ţżčŐ !!#!5!s•üPÉű=°üg՚űoţAš‘Xţĺ“` !!#!5!qjýLl¸ü}´ýe`¨üŰţR¨%s˙ăwń-@••Œ‘Ż üěÔě221/ěäôÄěÄî053#5# !232#"łÄÄMěĽţňţŹTĽěüßęĚÍëëÍĚęíčú+焀Ť\\Ť€ýxţăţťEEţťÉţfŐ! !+53265##É-}-ÍăMD†nţËţÄŐüřú“ţňôŞ–ÂˇüúáhŐ %!#3!3źýŰ…ĺýÇ҈ĄˆŐÇçüRŐţ=ŕ{0#3 632#54&"$ţˇúţ\Ă^Tރš˛Qr)mü“`üTćῆrr:T*D đ # #3 3 67632#54&#"fţÉţţĹţÂţţŠĚ:9ă:54'&'&s~Ô&˘˘&Ô~~ÔţÚ˘˘ţÚÔ~Ő.]Ř=@ľN\ŞľN\.]Ř=ęŃzzŃţ❞ţâŃzzŃž}qäa ł!ˆSáÝűM!‰Rá}|pĺas˙•§?#-n@.  '&$ /$ ‘.üěôěěÄ9999991@ .'& ) )••‘Œ.äôěě/Ä9999999046$327#"''7&7&#"4'32>s~Ô&˘ăÄ ‚n€~ÔţÚ˘äÄ œnՑꏧw֜\Š‘ý§w֜\ęŃzvÄiÂjţޝžţâŃzwĹkÁj!žćŽ˜^`Ľá|ĺŻüg^`Ľá–”Ő .@••• •Ż  Ü<<<Ě2221/äěÜěěÜě03#3#3#3#–ţţţţţţţţŐÍßÍáÍáÍ)áŐ:@ Ż ÜÜÄĚ1/<ä0@íí22íí # #3˛.čţ]ţşćčşýFýâŐÉ;Ő -@    üüÜüÜüü1@ ‘• ­ /<ô<ěä03!#!#!ĘÔĘý"ĘÔŐýœüÇý9q><Ձ@  ÔÄÜÄÄ9/ě1´€ ]@Ż /<ě220K°BPX@     ěěěě@     @ ííY333 # #‚ÚĘ Řţ Řţ\ţXÚŐţdœţsý3üř{ý…–˘Ő 1@• Ż•  Ü<Ě2Ü<Ě2´??]1/<ě2ô<ě20%3#3#3#3#¤ţţţţýňţţţţÍÍŐÍűĹÍŐÍ\Ő 7@••  ôěÔÄ91/ěôě0@ BKSXííY" !!!!&ćýâűTŹüœdDçúŐ՚űo–h’h $@    ÜěÜěÜěĚ1/<<Ě2203#3#3#ĆĚĚţhĚĚţhĚĚh˙˙˙˙˙É‹Ő7o–Ő !@ •Ż• /Ě2üĚ21/ě2ôě20!!!!5!!o&ţÓ.üÚ-ţŇŐŞűŞŞo˙â1đ/,@!•‘ '•,Œ01*$ 0Ě2ÜěÜ2Ě1ä2ě2ô<ě20!"'53 !"563 676!2&# !27# '&Đ%4ÂţŹ€rmyţđ˙ymr€OÇ4%%4ÂT€rmy˙ţđymr€ţ˛Č4*B6Đ!Ż*:'(8)Ż Ď6AB6Ď Ż)ţČţŘţŮţĆ*Ż!Đ6oĚŐP@   Ô<<Ě2ě22Ô<<ü<<Ě21@ • • Ż/<ä2Ü<<ě22Ü<<ě2203!3!!!!#!#!5!!5!!‘Ę’ĘţëţëĘţnĘţŢ"ţŢ"Ę’ŐţxˆţxŞţŽŞţy‡ţy‡ŞrŞŞţŽr˙˙É3ŐŹĚˆŐ@•Ż•üěÄ21/ěüě03!!!ĚźýňŐŞűŞ˙˙É“Ő,oĚŐ7@   /<<Ě2ü<<Ě21@•• Ż /äÜ<ě2Ü<ě203!!!!#!5!!5!żĘCý˝Cý˝Ęý°Pý°PŐţxŞţŽŞţy‡ŞrŞÉ•Ő7@ ŻüK°TXš@8Y2ě21/ěĚĚ0@ 0 @ P `  Ÿ ]73#3#ÉĚĚĘĘÍÍŐűŚŸ˙ă¤Ő>@••‘Œ üÄěÔÄěÔě1äôěěÄ0@ BKSXíY"47!5!32654'3! $Ÿžťü¤ŹýxˇĹŰÉâŐËżáţťţšţÎţšßwNŞŞţetäw–¤ˆˆłÎŕĄÎćůc˙ă­đ #/9@1E- !'E0ü<ě2Ô<ě2ě1@š š‘0š*š$Œ0ôěÔěôěÔě02654&#""$54$322654&#""$54$32ˆ™ˇˇ™™ˇˇ™ůţÔ,ůů,ţÔů™ˇˇ™™ˇˇ™ůţÔ,ůů,ţÔPIIPPIIP¤Ľ˜—ŚŚ—˜ĽýPIIPPIIP¤Ś—˜ĽĽ˜—Śs˙ă§đ'(@ ) ‘(üěôěě1@ •#•‘Œ(äôěě046$32#"$&732>54.#"s~Ô&˘˘&Ô~~ÔţÚ˘˘ţÚÔ~Ő\œÖww֜\\œÖww֜\ęŃzzŃţ❞ţâŃzzŃž}áĽ``Ľá}|áĽ``Ľás˙‘§đ,P@  ! #.# ‘-üěôěěÄ9991@ ! (•(•‘Œ-äôěěŔ99046$32'#"$&73277654.#"s~Ô&˘˘&Ô~l˘§Äĺ˘ţÚÔ~Ő\œÖw§ţ‘ƒj\œÖww֜\ęžĐzzĐţ➞ţŕiÇkĘwzĐž|â¤`^žjţIŽĺ|â¤``¤âÉ;Ő -@   üüÜüÜüü1@ ‘ •­ /ôě2ä203!3!#ÉĘŢĘţ,Ędqý9ÇüýœdÉÇŐ (@ •Ż•­•  Ü<<Ü<<Ě1/ěüěüě03#3#3#ÉţţţţţţQÍţIÍŐÍ–hŐ ?@•Ż •­ •   Ü<Ě2ÜĚÜ<Ě2ś??? ]1/<ě2üěü<ě20#53#533#3#3#hţţţţýţţţţţţţÍú+Í„ÍţIÍŐÍs˙ă§đ'+>@- )(( ‘,üěôě9/Ěě˛/)]1@+Î(­•#•‘Œ,äôěěôě046$32#"$&732>54.#"3#s~Ô&˘˘&Ô~~ÔţÚ˘˘ţÚÔ~Ő\œÖww֜\\œÖww֜\ĆţţęŃzzŃţ❞ţâŃzzŃž}áĽ``Ľá}|áĽ``ĽáÍs˙ä§>,P@  %$#& !.! ‘-üěôěěÄ9991@ #&$%(•(•‘Œ-äôěěÄ99046$327#"$&732>54''&#"s~Ô&˘äÄ ƒžn~ÔţÚ˘˘ţÚÔ~Ő\œÖww֜\ţ”‚p§w֜\ęžĐzvÄiÂkţŕžžţâĐzzĐž|â¤``¤â|ĺŽţ?lĆ^`¤âs˙ărď%1=G@8&,20>üěô<ě2Ü<ě21@/•;• 5 )•#•‘#Œ>äôěě9/ě/ě0! #"&547 !&54632! 32654&#"4&#"326s†S“_ ™…„™ţţţű™„…™ _ţmţ­ţz™,,,,,,,,égŸs'O;‘‘H6ţžţâţâţž6H‘‘;O'sŸz<11<;22‡<11<;//dŔŐ #@• ­Ż  Ô<Äü<Ä1/äô<ě203!!#!5!­ĘIýˇĘýˇIŐýjŞýk•Ş˙˙=;Ő;s˙ărď3?Kf@•F4%+6:0Lüě2ô<ě2Ü<ě29/<ü<Ě1@•=•(I• C (7##•1•‘1ŒLäôěě9/ě/ě/<ě2ĚÄ0! #"&547"333###3&54632! 32654&#"4&#"326s†S“_ ™…„™î—ťĚééĚť—…™A;…ţďţ­ţz™,,,,,,,,égŸs'O;‘‘H6˘Šß˙˙Ş˙˙ߊ˘6H‘‘;OO4Ÿz<11<;22‡<11<;//É‹Ő;@ •••­•  üě2ÔÄÄÜ<ě21/ě2ěôěî20˛]!!!33##!!!ɰýĚęęĚţďřü>ŐŞţF˙˙Ş˙˙ýăŞ˙˙hŐ)É;Ő@• üěÔěě1/ěô<0)3!3;űŽĘŢĘŐúŐ+ÉyŐ=@ B• ü<Ô1/ôě20KSX@ěěěěY!# 5!!ąčßţ!°ý8ßŔkŞŞýšsŰŐ#O@%$!  /<<ě22Ô<ě2ěÔ<ě2ě1@• • /<<Ô<ě2ô<<Ô<ě2032653#2#4&##"#3"3ÂƊňÓţ‡ÖÖyÓňŠĘŠňÓyÖÖţ‡Óň+ŞţVâČţîţşţŰţşţîČâţVŞâČF%FČâÉöŐ.@ ŻüK°TXš@8YěÄÄ1/ěÄ0´í!##ÉŢţuÄŐý-úásŰŐ+f@- ,&'  #+ /<<<ě222Ô<ě2ÄěÔ<ě2ěÄ1@+š* •  #•*'"/<<Ô<ě2ô<<Ô<ě29/<ě205!5"3332653#!!2#4&##"#35ÁÖţ‡ÓňŠĘŠňÓţ‡ÖżţAÖyÓňŠĘŠňÓyÖ•Ş>FČâŞţVâČţîţş>Ş=ţşţîČâţVŞâČF=6-éŐ@ ÜĚÜĚ1/ĚÄ20!3!3éüM•-¨ţű˙ăŹÓ$36767#"&546?>7>5#53óż!Ya^Ág¸ßHZX/'ĹËËĹ-93B$BüS #Cź98ŸL‰VV/5<4ţúž­,5^1Y7°:X!##°¨đ¸ýľÇ:o#5!#śď¨š…ý&°ţňXĚ3!3hđţX¸ÚÇţňoĚ!533oţXďšţňK˙˙“°đK˙˙Şţź‚Ő'4ü64˙˙Şţź‚Ő';ü6;˙˙Şţź‚Ő'7ü69˙˙Şţź‚Ő'9ü6:˙˙Şţź‚Ő'4ü69˙˙Şţź‚Ő&49ü6˙˙Şţź‚Ő'9ü6;˙˙Şţź‚Ő&9;ü6˙˙Şţź‚Ő'4ü68˙˙ŞţźƒŐ&45ü6˙˙Şţź‚Ő&;4ü6˙˙Şţź‚Ő';ü64˙˙Şţź‚Ő&46ü6˙˙Şţź‚Ő'4ü66˙˙Şţź‚Ő&;:ü6˙˙Şţź‚Ő&7;ü6˙˙ŞţźƒŐ'7ü65˙˙Şţź‚Ő'8ü6:˙˙ŞţźƒŐ'5ü6;˙˙Şţź‚Ő&8;ü6˙˙Şţź‚Ő'7ü66˙˙Şţź‚Ő&:6ü6˙˙Şţź‚Ő&:;ü6˙˙Şţź‚Ő'7ü6;˙˙Şţź‚Ő'7ü64˙˙Şţź‚Ő&:4ü6˙˙Şţź‚Ő&:7ü6˙˙ŞţźƒŐ&58ü6˙˙Şţź‚Ő&99ü6˙˙Şţź‚Ő&66ü6˙˙ŞţźƒŐ&5:ü6˙˙Şţź‚Ő&78ü6˙˙Şţź‚Ő':ü64˙˙Şţź‚Ő&74ü6˙˙Şţź‚Ő';ü66˙˙Şţź‚Ő&;6ü6˙˙Şţź‚Ő&86ü6˙˙ŞţźƒŐ&65ü6˙˙Şţź‚Ő&9:ü6˙˙Şţź‚Ő'9ü67˙˙ŞţźƒŐ&:5ü6˙˙Şţź‚Ő&87ü6˙˙ŞţźƒŐ&54ü6˙˙Şţź‚Ő&48ü6˙˙ŞţźƒŐ&5;ü6˙˙Şţź‚Ő&;8ü6˙˙ŞţźƒŐ'9ü65˙˙Şţź‚Ő&98ü6˙˙ŞţźƒŐ&56ü6˙˙Şţź‚Ő&68ü6˙˙Şţź‚Ő&77ü6˙˙Şţź‚Ő&::ü6˙˙Şţź‚Ő&8:ü6˙˙ŞţźƒŐ&75ü6˙˙Şţź‚Ő&76ü6˙˙Şţź‚Ő&6:ü6˙˙Şţź‚Ő&88ü6˙˙ŞţźƒŐ&55ü6˙˙Şţź‚Ő&89ü6˙˙ŞţźƒŐ&95ü6˙˙ŞţźƒŐ&85ü6˙˙Şţź‚Ő&7:ü6˙˙Şţź‚Ő&96ü6˙˙Şţź‚Ő'9ü66˙˙r˙ăđi˙˙d˙ăź{j˙˙ÉĆŐX˙˙Śn`+v˙ăú)4>@01, *$6E5üěĚĚ9ÔĚěÔĚ1@ $• *•Œ05Ě2ô2ě2Üě0#"'&'&#"#"'&547673!27676323 4'&'3úftę[na`zxz{Ân[ętfCGoů~[UŠ]LKf›dKJ]ŠU[~úoFCţň‹žD@@DD€D‹ňĆâě˜kóâśţş63366336Fśâók˜ěâ˜˙ăĄĹ!<@!  # E"üěĚĚ9ÔĚěÔĚ1@ ŠŠ Œ! "Ě2ô2ě2Üě0!"$"# 33276762324ŠţrTţŐđţÔRţrŠĆ’Đ>IxdüdyI?ВĹţăţëţPââąţšúţű8[ 77 [8řG˙˙<rŐ&ž,ß˙˙>Š`&Ţós˙ăĐđ   !3#!! ! ţHţ˙¸Ň0ĘĘţĐţ˜ţĹţĆţˆx:;hLţ¸ţĺţćţ¸HĹ–ú+•ţčţfĽabĽţgp˙ăű{ "326&33###" r“ŹŹ“•ŤŹhŐ¸¸Đ ţůńđţîŕůßéÇČčç’çţÂżű  řţŇ98ţäÓżŐ3#!#!#3! !Ąĺ9҈ý_ˆŐüţ:ĘĘoţî%Őú+ţ•ýkŐýjĎýÁ˙ă{"-#5#"&547!#3!63!54&#"5>32"326=¸?źˆŹË/ţř¸¸Ňj•§—`śTežZóđţ‘ßʁo™šýŞfaÁ˘sPý÷`ţA"‹..Ş''üţ´f{bsŮ´)eţżŐ767!!3##!#!!ʆ&aOý)ŞŞĘü¨Şţp(”Ş?x4&ŞűţAţżëÔţ ţľD+kţĺç`76765!!3##!#!!°[(bRýŁ““šý-“fţ}v“(UÓŠÔ“üĆţRţĺŽ:ŒţdÜ6TŐ356765!!#!TÝ:WOý)ĘţfbŞ0ŁödţŞúŐ+¸ýĘţřýLŃ`356765!!+!Lť3DSýُţ{X^™}ŚС“ü3ÍoţPÂĎÉöŐ! !!+##É-}ý)Ĺţ„ËţÄŐüřŞúŐü úẏ`! !!###ş >?hýŁšţ˸ţĘš`ýî“ü3°ý'ŮüP˙˙s˙ăŮđ'yâ2˙˙q˙ău{&Ry.˙„s˙ăeđ3#%3# '&76   1ÓÓ¤ÓÓńýLĐĎĎĐ´ĐĎĎţČţţŕ ć Fţţţý›ŇŇÄÓŇŇÓý<Ň—ţ¸ţĺţćţ¸Hq˙ăC{3#%3#"32654&' ! źÓÓhÓÓJĂăáĹÂăă Iţˇţŕţßţ¸HĘţţţçţnçčČÇéœţČţěţíţÇ98˙˙s˙ă jđ&m'yryâ˙˙q˙ăś{'yo˙„'y.˙„n:ţWÎń '/7?GO€„%3#%3#3#%3#3#%3#"264"264$"264"264$"264"264$"2642+ '&' &547"#"&546;&546 676 3#J††ý††ýţř††"††ü{´ii´h ´ii´hŠ´ii´hĄ´ii´hý†´ii´hţ´ii´hŠ´ii´hGŤŤ4ŤţăUUţâŠ3ŤŤ2ŠUUŤ4ý݆†œœœIœœœţFœœœ]Ž÷ŽŽ÷äöŽŽööŽŽöţ9Ž÷ŽŽ÷ŽŽ÷ŽŽ÷ţ7Ž÷ŽŽ÷ŽŽ÷ŽŽ÷RĚŹŠĚ\…ŤËdfĘŹ…\ĘŤŹĚZ…ŤĚeeĚŤ…ZţҜ˙úţfŐ!!!2+5327654&#!#!ďýqmĚäL>†87||ţˆËýîŐŞţFwrîţÎţňôŞKKÂ"Ÿžý9+<ţVH`!!3 +5327654'&#!#!<1ţBúFRRQľÁŹn!&&,‹ţüľţB`“ţŞGQĺţňŐa`œ07“Ś$)ţÍ˙úéŐ!!;#"&!ďýîm†?MăÍýîŐŞü×–Şô)<m`!!;#"'&5!<1ţF##mXnśPSţE`“ýž‘.0œ`bÔ7ŻłŐ*@  üě2ĚÔěĚ1@ • ­•/<ôěôě0!2#4&#!#463!#"zĄşŢÉ||ţˆËŁľ ŕiM?ÎéîţfŠŸžý9?ÖŔœa˙˙şd(ÖX3#3ÖŞŞżˆXˆű0Xú¨ÖX3#3ÖŞŞżˆ$ˆüdXú¨ÖX3#3ÖŞŞżˆđˆý˜Xú¨ÖX3#3ÖŞŞżˆźˆţĚXú¨ÖX73#3#ÖŞŞżˆˆˆˆXú¨ÖX3##3sŞŞţ눈Xˆű0XÖX3##3sŞŞţ눈$ˆüdXÖX3##3sŞŞţ눈đˆý˜XÖX3##3sŞŞţ눈źˆţĚXÖX%3#!#3sŞŞţ눈ˆˆXÖX!#!!^ˆGţAXˆÖX!#3!!^ˆˆżţAXţ̈ÖX!#3!!^ˆˆżţAXý˜ˆÖX!#3!!^ˆˆżţAXüdˆÖX%!!3^żýšˆˆˆXfœŽä 3'#'^9÷L’k“LäÝCƒýUŤƒCf˜Žŕ #'737—9řL“k’L˜ÝCƒŤýUƒCĂœCŕ 3#3#'À€€ f *ŽDţ‘ČČĂœCŕ #53#73C€€€ fRŽüźoČČ˙˙ĂCDOýdÉţf;Ő3!3+53265!#ÉĘŢĘÍăM?†ný"ĘŐýœdú“ţňôŞ–Â_ý9şţVd4&#"#3>32+532765Ź||•ŹššBłuÁĆŁľF1n!&žŸžž¤ý‡ýžedďčýHÖŔœ08’˙úţLŐ*!!!2!"'&'5327654'&+5!#!ďýî^ţeicUQ˜˜ţčs‚‚j~‰Ŕcd\]ĽŽýžËýîժ˚ţ8+lhŠÜzy$Ă1KK†IJ˜ęüJ+7ţL4ž02!"'&'5327654'&+5!;#"&5#533!AicUQţĐţč^cdjTČmžcd\[§ŽŽýjKs˝˝Ő˘‡‡šeÜ8+lhŠÝň%Ă12KK„KJŚóý¤‰NšŸŇ`>ţ¨˙˙¤˙ă{đR…ţgČ|1&'&547632&'&#";#"32767#"$546‹p<HmmFE˜MU…ˆUU8ž%đĺÁş~` !!!!#şÄýöŐţ+ş`”ţӔýő˙˙o˙ăÇ{V îŐ3 3#!+!# ! !JĺĐŃĺ9҈ý_ˆ҈ý_ˆŐŹţî%sţî%Őű>Âú+ţţýçý{˙ă'{ 5@M"326=%#5#"'#5#"&5463!54&#"5>3205>32"326=63!54&#"žßʁo™š˛¸?źˆnQ¸?źˆŹËýű§—`śTežZóxežZóđţ‘ßʁo™šýˆ5yǧ—`[A3f{bsŮ´)LýŞfa' ŞfaÁ˘˝Ŕ‹..Ş''~D''üţ´f{bsŮ´)hnŚ<‹˙ă -đ 3676! ! '&'!# !  Jĺ¸-pź;:xţˆţĆţĹźP.ýgˆŐŹţî%ˆţHţý¸ŐţŽ}Ňţ[ţžţŸţ[ŇXrţý%ţ¸ţĺţćţ¸H{˙ă{{"-82 '&'#"&5463!54&#"5>3 6"326="32654&yđţîţˆ7!`Œ˛ąĚýű§—`śTežZ*qŠţOߏo™š”ŹŤ•“ŹŹ{ţČţěţíţǝ>RE‡aÁ˘˝Ŕ‹..Ş''˝˝ý¸f{bsŮ´)ŹçţnçčČÇé˙ăqŐ !3!2653! '!#źţî%ţ{ĺźJÂŽËţßţćţsv%ý_ˆŐýŽűrŔÓđ‹ü\ţÜţÖ4hţ{˙ă{(3%#"&5463!54&#"5>3232653#5# "326=“H˘˛ąËýű§—`śTežZóđ||•­¸¸CąuţĺţŰߏo™šßoÁ˘˝Ŕ‹..Ş''ü˙žŸŸž¤{ű ŹfcPf{bsŮ´)´Ő !!#3 3źţî%Ljý_ˆŐ:ĺÜ×ŇýÇýýŮţŐűáú+{˙ăN{ ("326=5#"&5463!54&#"5>323žßʁo™š?źˆŹËýű§—`śTežZóđ^Ăţ\3f{bsŮ´)ýÍŞfaÁ˘˝Ŕ‹..Ş''ü˙ţ5Źű ´Ő )!#!#333#źţî%~gţY’ĺˆý_ˆŐ:ĺgécŇý‹i5ý¨ţţŐüRŽűŞ‹{˙ăN{"-0!5#"&5463!54&#"5>32333#"326=!#u?źˆŹËýű§—`śTežZóxgƚۛŃÓţߏo™šGŞfaÁ˘˝Ŕ‹..Ş''~m͝ţcýÍ3f{bsŮ´)ţţV›Ő !+53276?!#3 3źţî%lKMJ|ŘŤL*+2ˆý_ˆŐ:ĺĎËŇýýqĆ?=Ş$%…2ţŐű@Ŕ{ţVN{'2!5#"&5463!54&#"5>323+5326?"326=u?źˆŹËýű§—`śTežZóđ^ĂţN”|“lLT3ţôߏo™šŞfaÁ˘˝Ŕ‹..Ş''ü˙ţwjű8ČzšH†B3f{bsŮ´)˙˙s˙ă'đ“˙˙˙ăő{ÉfŐ 37!!ÉĘü×ü_­(ý^Mý*ŞúÁc37#Á¸ę¸œxýIüžĺSœŐ 33#!!#53űʨ¨×ü_¨¨Őŕ¤üYŞQ¤xň 33###53Y¸áá¸ááţâ¤űŽR¤ ˙ăjđ% 3#! '&#5376 !&'! 76;:źĄ~ °źţĆţĹźą ~˘źţHj´iüF w¸vđŇľţăţžÄÓŇÄCľŇ¤¤†Öֆţú—¤¤— ˙ăŽ{'23##"'&'#53676"!&'&!3276Íđ‰oÄŔ ~‰đńˆ~ ÂĆoˆń”V?s?VŤýƒLV•“VM{œ~͐ôôÍ~œœsUƒUuţ%Ťgstgs˙ă jđ$. 676! ! '&'!     ':ź/##.˝;:xţˆţĆţĹ˝.$#.źţĆţĹţ‡yţHţý¸ţHţý¸đŇ5==5Ňţ[ţžţŸţ[Ň4=<4Ӥļ¤ţ¸ţĺţćţ¸HHţ¸ţĺţćţ¸Hq˙ăś{ 1"32654&!"32654&'267632#"'&'#"´”ŹŤ•“ŹŹü,”ŹŤ•“ŹŹ“đ‰‰ńđţîđń‰‰đńţďßçţnçčČÇéçţnçčČÇ霜œţČţěţíţǝ98 ŹŐ!#!5!ŹĘý)Ą+ŞÁţVy`3#\¸¸{ůöÉţVđ4&#"#367632#Pš™ł×ĘĘQfežăéÉ×Ő˙Ţűń‡CBţÁţĚüƒşţVd{#4&#"#3>32d¸||•ŹššBłuÁƤý\žŸžž¤űÝ Žedď˙˙đĂ# Ib !5!5!5!bţ>Âţ>ÂI–––5áŐ:@ üK° TXš˙Ŕ8Yě991äĚ@ _°ď]0ś P]3#5ˢŐýqţ›eĹŞoŐ7@ „üK°TK°T[Xš˙Ŕ8Yě1ôě0@ @P`p ]#oŞŐýŐ+wŃŐ #!5!!5ŃĘý°PýpŐú+ÉŞ¸ŞF Ő#";##"$54$3@ţššţĘĘţűţ˙ű/’†‡’×ú+XâÝŰăÉŐ 3333! ÉāˁĹţÓţţƒŐúáüú+řüÉ“m3#ÉĘĘmř“D UŐ%3 3# # #3ô>ă:9Íţ‰ţţĹţÂăţĆţÇÍwţĹűîú+úđîűŐ–:Ü #'+/37Úˇ/$0(7,48Ü<Ü<<<<ś#+ 3'Ü<<<<Ü<ś Ü<Ü<<<<ś Ü<<<<Ü<°9̰XKRX°8K° bf °TXą30<32#4&#"#9ţó`M1¸CąuÁȸ||•­MM 7ŃÔBłuÁƸ||•Źše,'"źxMüŹfcđçŚýaŸŸž¤‘?'źťGzýžedďčý\žŸžž¤űÝŽţVă5<!"'&76763!!32653#5#"&5#3!#"&5332765!"3 ţە^SWsvÝ™||•­¸¸CąuÁČáŐţsCąuÁȸ||•WVţۃƒś^S‘ƒBWţLýaŸŸž¤{ű ŹfcđçüűB˘VfcđçfţĄŸŸ__¤{{ŠŽţV ›H!&#5#"&5332654/&763!6763232653#5#"'&=4&#"#9ţó`M1¸CąuÁȸ||•­MM 7ŃÔc%ZkÁĆ>8nŒ­¸¸CąlŻbd||xŹše,'"źxMüŹfcđçŚýaŸŸž¤‘?'źťGzýž2ďčă—XOž¤{ű Źfcx{ä䟞ž¤űÝ˙˙ş[t`&-ţŠ VČ 332673 &Vv aWV` v žţޞKKJL˙˙ś[`&A˙S N~`6@  FüěÔ99Ä1ˇBźŠ /ě2ô<0KSXˇííY%2767653)5!3$Wq…2!şţţdţjÁÂą/8Şs4÷ţÖţtţVąŻ g` ##4673>=3|ë˙ýuŕ‹¸Ëˇţdţ7ţ”¸şÄţ<T ŁŚëÚé"yýúš›˛ţŐX˝`#!5!óşüeŃü/яş`!#3#4&#!5!2sššŞšn†üJłăÍŠývy–ôţňXť`35!26&#!5! #X-뒦×üÓyŰřňŽŸ’ţřţŘţżďXť4=!3!#¨Tű\ť¨ţŹż“[ĹCţLţŹzţčlţňş` 3!2%!4&#!şłăÍűWďn†ý`ôţňý˘ę–Xť` !#4&#!5!2ťşn†üKłăÍy–ôţňXť`!#4&#!+5265#5!2ťşn†ýĂŁľ rLźąăÍy–ýĹÖŔaŚ;ôţňŮ-ۡ Üüüě1ľœ Ôü<Ä05!3!Ů-¨--Ş-ýÓŞ˙˙ş˝–&=˙˙ş˝–&= ˙˙ş˝–&˛˙˙ş˝–& ˛˙˙˛ţťƒ`&$ě˙˙˛ţuƒ`&$ě˙˙˛ƒ`&$˙´ţ\˙˙X†`&%˙B˙˙CZ`&&ţœ˙˙Xh`&'˙˙˙şd`&(˙˙QÎ`'ţú)Z˙˙XŚ`&*ţ˙˙ş˙ăż`&,&˙˙QÖÎ`&-Zţú˙˙XţV`&.ţä˙˙X`&/˙:˙˙X&0ţÚ˙˙Xž`&2%˙˙XÎ`&4ţˇ˙˙X˙ă(`&5ƒ˙˙şţVd`&7I˙˙˙şd`&8{˙˙C!`&:ţn˙˙˙şţVÜ`&;˙˙X`&<˙I˙˙ş˝`&=˙˙ˆ`&><˙˙şt–&)Ć˙˙X†–&%Ă˙˙X–&/Š˙˙şd–&8ÄXƒ3>=3##67'#3x]Gg¸˛G.Ůţi=d¸ŞB—ˇť`ýú‰Ô›˛ţóš"ţ:T„ÔëŽ)ęC˙˙‚ţ ë'9˙‹˙˙ţ ď'9˙ƒ˙˙˙ěţ ‡X&„ŕ˙˙˙˙ěţ ~X'ŕ˙…˙˙‚ţ ë'€ź˙‹˙˙ţ ď'€ź˙ƒ˙˙˙ěţ óX&„€c˙˙˙˙ěţ ~X&…€c˙˙˙‚ţ ë'‚ź˙‹˙˙ţ ď'‚ź˙ƒ˙˙˙ěţ óX&„‚c˙˙˙˙ěţ ~X&…‚c˙˙˙‚˙ěë'9„‹˙˙˙ěď'9„ƒ˙˙˙ě‡â&„ŕL˙˙˙ě~â&…ŕL˙˙‚˙ěë'‚ź„‹˙˙˙ěď&ƒ‚ź„˙˙˙ěóâ&„‚cL˙˙˙ě~â&…‚cL˙˙‚˙ěë™'I„ý¨‹˙˙˙ěď™&ƒI„ý¨˙˙˙ě0a&„I˙+ţp˙˙˙ě~a&…I˙+ţp˙˙˙¤Ÿ'x~Ą˙˙˙Ľ\F&†xś˙˙˙ě?&‡,~˙˙˙ě x&ˆ>č˙˙˙¤Ÿ'‚xxĄ˙˙˙Ľ\F&†‚x°˙˙˙ě?&‡‚,x˙˙˙ě x&ˆ‚>â˙˙ţ (f'ŻX˙˙ţ >f'Ł}D˙˙˙ěţ>\/&E ˙8˙˙˙ěţ>>/&F ˙8˙˙ţ (f'~ŠX˙˙ţ >f'~&˙çD˙˙˙ě˙8\/&E~˙8˙˙˙ě˙8>/&F~˙8˙˙ţ (f'€––X˙˙ţ >f'€2D˙˙˙ěţ>\/&E€˙8˙˙˙ěţ>>/&F€˙8˙˙ţ (f'‚–ŻX˙˙ţ >f'‚2D˙˙˙ěţ>\/&E‚˙8˙˙˙ěţ>>/&F‚˙8˙˙˙Ťţ „°'ô \˙˙˙Ťţ ~°&Pô ˙˙˙Ťţ Á/&\Iźţ>˙˙˙Ťţ ~/&PIźţ>˙˙‚˙§)¤‚˙§Ů7%#"'$47332767654'&54767;#"'&/œcŠÍˇŔ€ţś?¸AËh—¸Âž#6ţĘ2 #déý­GG&+@X„A:g!axLn˙˙˙Ťţ 6r'|˙ôţ>˙ě‡X %+53276=3+HZ#c,1¸VV¸,1jŮŮť˙ě~X%+53276=3;#"+M˜Z#c,1¸1,c7n–VV¸,1jŮŮj1,¸˙˙‚ţóŔJo˙˙‚ţđż’˙˙˙ěţÔóX&ů~cţÔ˙˙˙ěţÔ~X&ú~cţÔüpn"56$3çţ=ćěĹßÔgi~wun52&$ßĹěćţ=Ԛuw~igý* '/&'&#"#67632O,$e5F˘qpČ[?8WH7  $0G‡JI  Ö'327673#"'&'O,$a9G˘qpČ[?8Wě7  $,K‡JI ˙˙şPšq˙,˙˙˙ělš&fq˙,˙˙şPýr˙,i,k ;#"'&=3!1,cK‚Ž\W¸L71,¸\W+˙˙ţP˙ös˙,˙˙şPŞt˙,˙˙˙ělŞ't˙,f˙˙šPýu˙,˙˙˙ělý'u˙,f˙˙ţčP˙Řv˙,˙˙˙ěţčl¸'v˙,f˙˙˙ôËdôw˙,˙˙˙ělô'w˙,f˙˙á<x˙,˙˙˙ěl&fx˙,˙˙ŁUŢL˙˙˙ľ…ƒ'y˙ÂR˙˙˙ľ…ƒ&0y˙Â˙˙lĂ9'z˙ÂR˙˙l„9&0z˙Â˙˙˙Ťţ @ľ'z˙Âţ>n˙˙˙Ťţ 6ľ&z˙Âţ>˙˙lţ Ă'{˙R˙˙lţ „&0{˙˙˙‚ţóŔľ'z˙ôţ>o˙˙‚ţđżť&’zXýD˙˙˙ěŃç&ůz˙+ţp˙˙˙ě~ç&úz˙+ţp˙˙ÁyRÁ„ 3;#"'&Á¸1,cK‚šPWsĄűkj1,¸\e˙˙‚ţ˘ë'}9ţ˘‹˙˙ţ˘ď&ƒ}9ţ˘˙˙˙ěţÔ‡X&„}ŕţÔ˙˙˙ěţÔ~X&…}ŕţÔ˙˙‹˙Ć '~ú„m˙˙‘^&Œ~^„˙˙‚˙ěë '~źŠ‹˙˙˙ěď &ƒ~źŠ˙˙˙ěóč&„~cR˙˙˙ě~č&…~cR˙˙‚˙ěë'źŠ‹˙˙˙ěď&ƒźŠ˙˙˙ěóâ&„cR˙˙˙ě~â&…cR˙˙ţ (f'}X˙˙ţ >f&D}ź˙Î˙˙˙ěţÔ\/&E} ţÔ˙˙˙ěţÔ>/&F} ţÔ˙˙ţ (fXţ >f0%3#"'&'&'!27# '&5767"#"5$3 "(1{R=IrbŕJIÁԖúţ^ЃÔ`‰ _Œ‡_Á&Čm3HZ¸¸–dœ˛Pˇü‰^¤v¸c–ŕße4)¸?6š [ _w˙ě\/&'&'&5672+5327676SSgU´RĄHK˘ŹÜLXŚJ‘KÝŁ€dăht^¸#4bš4bBP¸H:jV˙ě>/);#"'&'+53276767&'&'&5672~ÜAI2hrBVŃ~(;E)‘KÝŁ€dăht^eSgU´RĄHK˘ 4bš)N"w¸¨6a.%P¸H:jV#¸˙˙ţ (°'}?X˙˙ţ >°&D}?˙˙˙ě\L&E} ś˙˙˙ě>L&F} ś˙˙}˙ÚRZ}˙ÚGR &'3;#"'#"'532767654"9śăaRQS,cK‚“a]Ď.-fgsT!"Ź#?z™N‰†uIS,¸‚€!&¸* 1p*D˙˙}˙Ú°'}EZ˙˙}˙ÚG°&L}E˙˙˙Ťţ b&\˙Ťţ ~&3;#"'!5 767654x¸ I*eK‚‚2Dűţäţž0ËÚ# &pgM,¸>ţꅗ¸€ŠĐ:H~˙˙˙Ťţ bś'}q \˙˙˙Ťţ ~ś&P}q ˙˙‚ţ î^‚ţ GîF%7653323;#"'#"'&''&'#&'$473327676'&/3¸N0%¸@nޏS,cK‚‘vDm% I0Š1_@8‰'T…ÁPx€mţíi¸l“_Qb_y^@@¸$:ľ|_ĘÍ2Š&ţŞaS,¸`[ F{Ÿ<łkŞ>GHö´ÎÜł&%0žlŽ}=ęœJ<~˙ě˙ă î1%+53276=3327653763#"'&'#"'&€+8Lc‚Kc,P¸,+hm,%¸@nޏ\Kf%#?7‰0`DAbH<Š;!.¸,PdŔœ@dczgÂÍ2Ş&ţŞÇq\ =„œ!1(˙ě˙ă7î8#"'&'#"'&'+53276=3327653763;#"'ý%#?7‰0`DAbH<)+8Lc‚Kc,P¸,+hm,%¸@nޏS,cK‚‘vD =„œ!1(I;!.¸,PdŔœ@dczgÂÍ2Ş&ţŞaS,¸`Z˙˙‚ţ °'â ^˙˙‚ţ G°&Tâ ˙˙˙ě˙ă °&UŠ ˙˙˙ě˙ă7°&VŠ ˙˙‚ţ ć`‚ţ áć<I)"'&5#&'$47332767654'367676;#"/"3276'&'&uţě&4-JXîPx€mţíi¸l“_Qf[˘+!'Ť (s{l“HX}aş*=RK‚ƒgĚL~¨‘ťíť‰%ş€›MGHö´ÎÜł&%DŠl“Š7(2’l^F"%GéMF ,¸\v7QlÂ?[F‡˙ě2ĺ .327654'&#"!"'&'+53276=36767632Ш‘ťíş‹%0LşţěJNA'fŹ‚Kc,P¸-e_™KUskş¸ĘćlÂ?[F‡ýÉ*#=Џ,PdrNP2†T‰?!'DěŠmx˙ěĺ+8)"'&'+53276=36767632;#"/327654'&#"˜ţčJNA'fŹ‚Kc,P¸-e_™KUqmž*=RK‚ƒgĚ਑ťíş‹%0L*#=Џ,PdrNP2†T‰?!'DěKH ,¸\vćlÂ?[F‡˙˙‚ţ ś'}ű `˙˙‚ţ áś&\}ű ˙˙˙ě2ś&]}Ű ˙˙˙ěś&^}Ű ˙˙ÜbŹ))5!3%632;#"/%3276'&'&#"@ýżţ‘o¸Ů\Duiź*=RK‚ƒgĚýéťíť‰%0Pzą¸\ű?c!'EëMF ,¸\v¸?]D‡Qx˙ěÔ %3276'&'&#")5!3%6329ťíť‰%0PząuýÁţő ¸Ů\Duiş¸Ę¸?]D‡Qxţ’¸\ű?c!'EëŠmx˙ě¤))5!3%632;#"/%3276'&'&#"8ýżţő ¸Ů\Duiź*=RK‚ƒgĚýéťíť‰%0Pzą¸\ű?c!'EëMF ,¸\v¸?]D‡Qx˙˙Ü'}ĎRb˙˙Ź&d}ĎR˙˙˙ěÔ&e}ÇR˙˙˙ě¤&f}ÇR˙˙uţ ˛*duţ ˛%+! '&7.54762;# '!2764"˛˜ţ˙ţ[bť=D}aî_[9^DśU ţöřš)k_ÁÔý1ˆÎţocźz’Œ2t*n@00@p[C+ @M¸äkl=žv–8`3$˙ěř*727&'&5763"327%+5<ĄĘK4XĚ}űÚş>SF7J ţ\ţ˘˛X¸];dŒ}MЉ˙4F!¸Ĺ¤¸˙ěđ$/%+532767&'&5476762;#""654'îÂĘv`kB;(aD hYîYh MXD=p`vʨ4/gg/šš¸($'UZ'-)74--47)-'bM,(¸U __ ˙˙uţ ˛F'}w°d˙˙uţ ˛L&l}Šś˙˙˙ěřF&m}w°˙˙˙ěđL&n}Łś˙˙˙¤Ÿ'}ő~Ą˙˙˙Ľ\L&†}őś˙˙˙ě?&‡}Š~˙˙˙ě ~&ˆ}ťč˙˙kţG›'~R~Œ˙˙kţ Ŕ&‰~„k˙˙˙ě?&Š~,~˙˙˙ě ~&‹~8č˙˙˙ČÇi˙ČŇ!D#"'5327654'&'&7676'&'$54733276763;#"'ĐJ&P DfXRNB8D-<9_¸h$$EB|=Q#!v+6şú(  %ţś{{qe›˙ě))5!27654'&54767;#"'&/6ţś6”-6ţĘ2 héý­GG&+@X„A:g!a_¸h$$EB|=Q#!v+6şú(  %ý?¸+)x.›˙˙ţČjţČ#$%653;#"'#"'$&733276N¸1,cK‚pNyţű†UcEţÜ@¸AŚ(IPmŽI~ăjűkj1,¸3.(ąB"[Š\ss~B"5˙ěŻ +5327653ŻWPš‚Kc,1¸s˛e\¸,1j•˙ěş%+5327653;#"SM˜‚Kc,1¸1,cK‚–VV¸,1j•űkj1,¸˙˙Œţ^ókŒţgt5%327654'&'&#"#"'&#4763&547632;#"bzL,5;(.;DŔ …Kľ2KČxAZ˘M\HTŞ((&iK‚ݍ*9:X DD(ŠPNNOţ“m­f7*(”„?$GłC,,¸˙ě˙ÍŚm$%#"'+5326767632%327654'&#"da“În@h t4W‡^Q°[aýđ>Ÿ/4(*X.[4fb0¸G1ľP8TY¸NE5EK&)Ÿ/4:''5)24fb0¸$#1ľP8S§1>,¸ÄE5EX !a%˙˙“ţľHś'}? §˙˙“ţ +ź&ö}?&˙˙˙ě‡č'}ŕR„˙˙˙ě~č'}ŕR…˙˙‹˙Ć Ţm‘^î $&'&'&'3;#"'&'#"'&5476¤ xRo´t¸$8pK‚ZI-&Šœ8:˝Ěm*12e CY>)2Ń'+¨ŽeO,¸3;I0š­D˙ě˙˝˝ĺ-=67654'&#"27&'&5476&'5#"'+5327654'&”$"':Aů4N--0M,QßŘ@(J݃šx’‰Ťb 41}! @H=.%4-+#%vˆ iEN@TSZ 'šDłŃŢ49g=ql)¸D%'“i.C!v-‹3j  °;AWE… ¸L9P)8K6(¸œS/V¸L_”+Y‡9›K1\S˙˙‚ţóŔJo‚ţđż765&'&'&54767632;#"'&#"#"'$4733276L[/,4PT*uW€ ##rpl$-AIq€ÚYhźuţŰ?¸AŚBł[M•!3!+ (;=A<^†Ä¸ŹĽ#0{bV` )g™ZZ™rN˙˙‚ţ ŔJ'~ôţ o˙˙‚ţ ż'~ôţ ’˙˙˙ěţÔóX&ů~cţÔ˙˙˙ěţÔ~X&ú~cţÔ˙˙˙.˙ěżí&yţ–,˙˙˙.˙ěÚí&žyţ–,˙˙˙ĺ˙쿣&zţ–,˙˙˙ĺ˙ěÚŁ&žzţ–,˙˙ţ ż&{ţČ˙˙ţ Ú&ž{ţČT˙ěż#"'5327367653ż‹7M͞jK`UqˆţłŞ%¸BţÔÚUG´ ¸ ˜FüA+7‰¸ŽT˙ěÚ#"'5327367653;#"'&4;IĘĄjK`UqˆţłŞ%¸"@PiŻf<[A´ ¸ ˜FüA+7‰¸ŽüDŽTž¸ó)˙TL* 35'5467676?67654&#">32üüü–Ë,X\"$߸gÁ^ałOlƒ39ZZ8LüüüýŽţţ“{4<+VZ@ELŸÂ89źCFnY1^5YV‚ešŞŕ‚¨ !5!5!)5!ýţ­S2Sý˝ţŽRŕČČČČČ˙˙Ş7‚'Ľ˙XF˙˙Ş:‚ 'Ľb:˙˙Ş=‚ 'Ľ˙]C˙˙Ş;‚ '<Ľb˙˙Ş=‚ 'Ľ˙]Ľb˙˙Ş‚H'€&'€˙˙Ş‚H'€'€'˙˙Ş‚H'Ľţ '€'€˙˙Ş‚H'€&'€˙˙Ş‚H'€'€'˙˙Ş‚H'€''€Ľţ ˙˙Ş‚H&&Ľ '€˙˙Ş‚H&&Ľ '€˙˙Ş‚H'Ľţ ''€Ľ ˙˙Ş‚H''€&€˙˙Ş‚H''€'€˙˙Ş‚H'Ľţ '€'€˙˙Ş‚H&'€'€˙˙Ş‚H&'€'€˙˙Ş‚H'Ľţ '€'€˙˙Ş‚H&Ľ '€'˙˙Ş‚H&Ľ &'€˙˙Ş‚H&Ľ '€'Ľţ ˙˙Ş‚H'Ľ '€&€˙˙Ş‚H&'€'€Ľ ˙˙Ş‚H'Ľţ 'Ľ '€€˙˙Ş‚H'€'€&Ľ ˙˙Ş‚H'Ľ &'€€˙˙Ş‚H'Ľ 'Ľţ '€€˙˙Ş‚H'Ľ '€&Ľ ˙˙Ş‚H'Ľ '€&Ľ ˙˙Ş‚H'Ľ &Ľ '€Ľţ ˙˙Ş‚H'€''€˙˙Ş‚H'€&'€˙˙Ş‚H'€''€Ľţ ˙˙Ş‚H'€'€'˙˙Ş‚H'€&'€˙˙Ş‚H'€'Ľţ '€˙˙Ş‚H'€'&Ľ ˙˙Ş‚H'€'&Ľ ˙˙Ş‚H'€&Ľ 'Ľţ ˙˙Ş‚H'€&'€˙˙Ş‚H'€&'€˙˙Ş‚H'€''€Ľţ ˙˙Ş‚H'€''€˙˙Ş‚H'€'€'˙˙Ş‚H'€''€Ľţ ˙˙Ş‚H'€&'Ľ ˙˙Ş‚H'€'&Ľ ˙˙Ş‚H'€'Ľţ 'Ľ ˙˙Ş‚H'€&'€Ľ ˙˙Ş‚H'€'Ľ '€˙˙Ş‚H'€'€'Ľ Ľţ ˙˙Ş‚H'€'Ľ &€˙˙Ş‚H'€'€&Ľ ˙˙Ş‚H'€'€'Ľţ Ľ ˙˙Ş‚H'€&&Ľ Ľ ˙˙Ş‚H'€&&Ľ Ľ ˙˙Ş‚H'€'Ľţ &Ľ Ľ ˙˙Ş‚H'Ľ &'€˙˙Ş‚H'Ľ '€'˙˙Ş‚H'Ľ 'Ľţ '€˙˙Ş‚H'Ľ &'€˙˙Ş‚H'Ľ '€'˙˙Ş‚H'Ľ '€'Ľţ ˙˙Ş‚H'Ľ &&Ľ ˙˙Ş‚H'Ľ &&Ľ ˙˙Ş‚H'Ľ 'Ľţ 'Ľ ˙˙Ş‚H'Ľ ''€˙˙Ş‚H'Ľ ''€˙˙Ş‚H'Ľ 'Ľţ '€˙˙Ş‚H'Ľ &'€˙˙Ş‚H'Ľ &'€˙˙Ş‚H'Ľ 'Ľţ '€˙˙Ş‚H'Ľ &Ľ '˙˙Ş‚H'Ľ &Ľ &˙˙Ş‚H'Ľ &Ľ 'Ľţ ˙˙Ş‚H'Ľ 'Ľ '€˙˙Ş‚H'Ľ &'€Ľ ˙˙Ş‚H'Ľ 'Ľţ 'Ľ €˙˙Ş‚H'Ľ '€&Ľ ˙˙Ş‚H'Ľ 'Ľ &€˙˙Ş‚H'Ľ 'Ľ 'Ľţ €˙˙Ş‚H'Ľ 'Ľ &Ľ ˙˙Ş‚H'Ľ 'Ľ &Ľ ˙˙Ş‚H'Ľ 'Ľ &Ľ Ľţ ÜŐ #3 !!#!]ÍîÍţW:ţ\˜ý€™w9ţă8qúóqú+Ąţ_ŐÇü÷ÉNŐ  %*!2#!327&#363&#!3654/654'ÉfçúŔţţđűý†ę;33;ęÖ$ $ýţĘ#ĐĐ>ĐĐŐŔąĺ]aţáČÚéý{wˆýÜúó űDÜĺD–6ÍÄ6č3Ő! )327&#!36'貖ţhţPýý’cő  öţpĘĆßßŐţ—ţ€ţ~ţ–qúóA‹Aúó űk•{qœÉSŐ3%!!!!!!-ĘţŇxýÇý9řűvqúó ddýädýsdÉěŐ !!!!!#3É#ýoQýŻţn.ĘĘŐdýädýqúós˙ă‹đ&&$#"32767!5!# !2dţü…ť‡‡ť‘eVţRuţć ţ˘ţu‹^’oüRŠŠäaG@ű;@&5çdýSU™mn™HFűcIŻţşţťŻfžŐ3%!#3!53#.ĘţnXddý¨ddqúó ddúódd ˙–ţfYŐ6765%!#!53265-V?OţԐÍăţí?†nqúąňd J^ę dú“ţňôd–ÂÉ0Ő !3 #!3ɐŸüŁ’™üÂţpdĘŐý‰wý@üëĎý1qúó É2Ő !!!3É’×ű—dĘŐúdoúó ÄoŐ !#!! !3!3Ýţ_GţbţnŘ}×ţŇĘúĘqűŽRúŐüřú+qúó úó r˙ăÚđ'( ! '&76 7& 676'&&:źž˝˝ţĆţĹź˝˝źGlllţđli$ ›› Ţ#››űĚđŇŐţ ţĄÔÓÓŇabÓŇúŽ22×22űjT%śýœľ%5űŻ$ścś$ýôˆ˙ÜŸö-6&/.4%&  %5 64&/.$ PdˆŹoЍ&œŞn°žÎţŢm”nĘÉţŕţţűßgŠzŠoʡĆ-[ţƚ)'šţ˙NXdť''ă´pu‰éi$2ëţXîf|•’ý† /ĎŒô˙ú°Ő 3%!!!!rČüŔśýîţpýěqúó ddúqą˙ăóŐ $!&%! 65! ĆX!ű†!YţÓ‘€ €‘ţŹýfţŹqü™ţć‚ba@üŔţž`|gdü5đÓÓđËü\ţÜţÖ*$ˇŐ 3%! 3!šîČţţސŮÚdýÇţĚqúó dűéú+DŽŐ 3!3%! ! 3! !ÄDČţźű5DČţźţť:9:9dţ‰ţ|ţĹţÂţ€qúó úó dűîűîú+úđlŐ 3%! 3 ! #(\Ćü¤ţ~¸v„bţL:ţHţŠţ|dśqúó dýÎ2ý„ü§2ýÎ{˙üŹŐ 3!! #3nÚdýđţpýđ”Şţ2ČĚĘÂüňý9ÇüňŞýVý{˙ă“{",34&'3!5#"&546;54&#"5>3 5#">76/–=Kˆdţ°?źVŹËýűĐu—`śTwß8ţ°Đ6/^b;:ţgCˆzӆ]ˆýYýŞfaÁ˘˝ŔH‹..t''üţ‹UýíNHGÜýg‹wt”˙ă-!>32#"&'!4'&'676763&#"327”N:ą|Ë˙˙Ë|ą:ţ˛^,<<,9üR†ůĽKM_]Ľý˘daţźýđţźad¨tŸ‚= üz =OsKÚúŹTţdihtJžŸ‚‚q˙ăç{#%#"!2&'&#"3276%çMĽ]ýţÖ-U˘LEmGJXHCQRHVţ,${z$d$$>:##düWS%€ęćƒ&”˙ă-!!5#"323327654'&'&#"ĹNţ˛:ą|Ë˙˙Ë|ąýv9,<<,^(†ýĽ]_MKĽś^ůě¨daDDaţZžKsO= † =‚úŹTţdü6‚‚ŸžJthio˙ă}{!327# 32!.#"}ý‹K_ŮĂmĂkţôţÇ)üĺý#ĆĹiĚŠJ@ţb]u-)8 CţÚ÷qzţŰţóŽÓžç/ă 3476%#"!!!#5354763g.9‡ńŽ”:9„ţ|ţą°°WXźŽ -8‘űśJ_D8‹d97’ddüćddźTVqţVđ{#.=65326=#"325!!"&32767654'&#"jëülQžRľ´:ą|Ë˙˙Ë|ą:NţÖţÍrĘy^,<<,9/ĽKM_]Ľúü=ƌoú—€,*˝żqdaDDad¨ü-ţâţéwŸ‚= † =OsKýÂihtJžŸ‚‚şH "34'&3'!>32!4&#"! GŒS5ü‡ëOIƁÔŰţŹkk€•ţą hžý”@Á[:śú´Ldýžedďčý\Пžž¤ýUć5 33#!!J‡ ššKOţąüüh˜éËű ˙×ţV #676#532765!3#¨‡%G(=ôÝ1l$%OQRa¸¸űĐľT0Hôd01™ŹűŒÖ``žéş2 !3 #!3şO„ŒýHіýmţąd‡üiăýöýŞ#ýݰú´Lćę&5#"'&5!3J=(G%‡őśRQOLi” H0Tľ0úZ``Ö~űJœ^dş‡{"&1<!>32>32!4&#"!4&#"!3%34'&%34'&şOIƁԝTށÔŰţŹkk€•ţŹkk€•ţąd‡[ GŒS5ă GŒS5`ŽedŹJ€vďčý\ПžžŤý\Пžž¤ýUüüh˜ hžý”@Á[: hžý”@Á[:şH{ "34'&%3'!>32!4&#"! GŒS5ü‡ëOIƁÔŰţŹkk€•ţą hžý”@Á[:üh˜dŽedďčý\Пžž¤ýUq˙ău{ #2#"27&"676'&sđţîđńţď‚3x33x3d4'pp'Ú3(pp({ţČţěţíţÇ98ű× ş ükp-€ţ$€-Rü’-ۀ-qţVđ{-%!!>32#"&4'&'&'676#&#"32żţ˛N:ą|Ë˙˙Ë|ąŠ9,<<,^ü؆Ľ]_MKĽ¨ýލdaţźýđţźaŚžKsO= üz =‚ýoHú¸Ę‚‚ŸžJthiqţVđ{-%#"325!!3#32767654'&#"˘:ą|Ë˙˙Ë|ą:Nţ˛ý<^,<<,9(††ţĽKM_]Ľ¨daDDad¨ůř”Ÿ‚= † =OsKü2HüHihtJžŸ‚‚şß{3'!>32.#"!†ęN:ş…4I,œ§ţ˛üüh˜dŽfc…Ëžýzo˙ăÇ{E67654'&/&'&5432654&/.54632.#"#"&'i'K&'q4Ľ=B%%U+.„39GÓS OjqL‘4vŕÎf´LJ\_opPx3Ą„÷ŘZĂlů=vf03"3;@{R?Bsl37'*7CoTüţ78^UNO,,—ˆŚľ z1$YXDL#/ž¤Ŕ%%7ˆž%&7#!!;!"&5#53Đ*‡\{ţ…Ks˝ţ­Ő˘‡‡jU|˙ü7­N(ţŹdýU‰NdŸŇudTą˙ĺD` "%&'&5##!5#"&5!3265!ů GŒS5C‡ëţŹIƁÔŰTkk€•TS hžlýŔÁ[:˜ühdŽedďč¤ý0Ÿžž¤Ť=ą` 3%! 3!ÍYƒţŁţńT^^dţ\ţÔüüh˜düTŹű Vň`3!3%!!3! !ńđ‡ňübđ‡ňţůTćĺNćĺdţŰţĘńňţÇüüh˜üh˜dü–jü–jű –üjL` 3%! 3 ! #Ť—ýUţ˘|ţĽĺţpţăţă|[üüh˜dţţ-ýsţÓ=ţVĂ`7%! 3+53267Ҳ>ţ•ţć^]_lţP’|““XQ+üűۙŒdü—iű8Ç{dCYXb` 3%!!!5!\ývŒŠü‰ńýw‰űö‰ýüüh˜ddühdd˜˙˙hŐ$˙˙ÉěŐ%˙˙s˙ă'đ&˙˙ɰŐ'˙˙É‹Ő(˙˙É#Ő)˙˙s˙ă‹đ*˙˙É;Ő+˙˙—öŐĎ˙˙˙–ţf“Ő-˙˙ÉjŐ.˙˙ÉjŐ/˙˙ÉŐ0˙˙É3Ő1˙˙s˙ăŮđ2˙˙ɍŐ3˙˙sţřŮđ4˙˙ÉTŐ5˙˙‡˙ă˘đ6˙˙˙úéŐ7˙˙˛˙ă)Ő8˙˙hŐ9˙˙DŚŐ:˙˙=;Ő;˙˙˙üçŐ<˙˙\Ő=˙˙{˙ă-{D˙˙ş˙ă¤E˙˙q˙ăç{F˙˙q˙ăZG˙˙q˙ă{H˙˙/řI˙˙qţVZ{J˙˙şdK˙˙ÁyL˙˙˙ŰţVyM˙˙şœN˙˙Á9Ĺ˙˙ş{P˙˙şd{Q˙˙q˙ău{R˙˙şţV¤{S˙˙qţVZ{T˙˙şJ{U˙˙o˙ăÇ{V˙˙7ňžW˙˙Ž˙ăX`X˙˙=`Y˙˙V5`Z˙˙;y`[˙˙=ţV`\˙˙XŰ`]ˆ˙ăđ   6/&"27ö ţöţ ţřŘĚĚd3{44{3ţşĘĘđţsý ţsóü#ÔՏ0úŮ÷ţ,ţ-kŹŐ37!!5!5%6ĘbJűÜJţ™gqúó dúdd HdH‚šđ(7!676'&'$32!!7676&#"ű)`"LlDbZE‚Ńţçľó0Q]ţú(űčž=y‡m˜Ád͕@9\9p¨dşĎţÝ9hôĚbŹ–‘ţiddAbż¨•œ˙ăsđ$*0"'5327&+5327&#"56325654&'>54+ťÔ!ÄŞeO6?ĚÔ;2:LœŮćŻć €Ž˘ţĐĚuWEdJj D• d <h@Ѳ|Ş!ŐÝň’Učl$–ţyXŹZ¸Ő#3 !!3#!!5§ËČţÔţQŻ“­­ţpýßqúóÁüăÍü3dţ\¤”˙ăŒŐ#66'&#"!! !"'532˙ČgśĚĚd1j´ÎKţEţÔţ˝šĐ˝Ü‘ŕýýüć\Ü`ýI× Kďdţ# őţFů<ˆdq˙ăŞđ %%6'27&"2'& 632# |ĘĘţ&ÍÍd:Ť-(Ť?ô§¨"™ţÖ^BhőţđöţßţîPpc \Ęłţ‘ţ#•2"Œ32Çv cSRav  Ÿ6978w{züÇ˙9ř j@Ă úVVÔěÔě1ôüĚ20K° TX˝˙Ŕ@878YK°TX˝@˙Ŕ878YK°TK°T[X˝˙Ŕ@878Y332673#"&üÇv cSRav  Ÿř6978w{zýšţfŰGˇÎdÔě1Ôě0K°TK°T[X˝@˙Ŕ878YK°TX˝˙Ŕ@878Y3#ýšĚĚŰÍüćî˙˛ö@Ě1Ô<Ě203#3#ţůšä™‹šä™öţřţřüNî˙ö#!#ýęäęäöţřţř––53#–––––73#'3#ú––ú–––––– 3#3#'3#}––}––ú–––d–––˙– 3#3#'3#}––}––ú––d––––˙––3#3#––––d––˙– 3#3#3#3#ú––––ú––––d––d––˙ěď&;#"'&'#"'$&733$767654'3ďF??7K˙˙˙ě‡Xů˙˙˙ě~Xú˙Ľ\,>%!$'$&73!2%7&'&547676323!!"'654'&'&#"xhnţčţđţĎ}ţˇ@¸AËQ+č"Rź:4RQ‰P ţôioh4"(=)1$+<'gŠ\^ˆsM6,|y$›K2S–%j¸ßAzG' <8BN˙ě?Ů0654'&323276767'&54767632#!V)B,4((7(*HýŽńT—O<?a‚Nb–NLZB`.NJ|m‘ţż+M;3*)3P&ţˇ ]027EW4,”E$2Hf3ŒĐˆ,'˙ě !5;#"'+5327&'&54767632"67654'&'&fˇ$'“وššˆŮ“'$šA??8 D?$ 9úP–2*I1C2¸99¸(M.L,0W¸ 5+5DE2.4! kţ Ŕä.@%&'&'&547676323!!#'$'&5473!2766'&'&#"¸B.y9“(“)Wp8c2ţô0-=€žŻÍţŽ^E>¸><Œ–Ől/"'"3 9Ld/  #+mš=ĽE2X‘:Ö¸zF‘NVžŠ}Ś`k›L:‚DbZzWK# :<,; ˙˙˙ě?ه˙˙˙ě ˆ˙˙˙ě‡č&„}ŕR˙˙˙ě~č&…}ŕRśˇ %4'&"2>"'&4762<R8R8z?@¸?@@?¸@Ü(8)*8…¸@@@@¸@??˙˙ţď '~źŠ'ŽŠţƒ˙˙˙ěţôč&„'~cRŽPţô˙˙˙ěţô~č&…'~cRŽPţô˙˙˙ěďś'€ź ƒ˙˙˙ěóâ&„€cL˙˙˙ě~â&…€cL˙˙ţ >Ż&DzŠ˙8˙˙˙ě\K&EzXţÔ˙˙˙ě>K&FzXţÔ˙˙ţ >Ş&D?˙˙˙ě\F&E °˙˙˙ě>F&F °˙˙ţ >Ş&DÂ˙˙˙ě\F&Eś˙˙˙ě>F&Fś˙˙ţ >°&D'}?€ç˙˙˙ěţ>\L&E'€˙8} ś˙˙˙ěţ>>L&F'€œ˙8} ś3_+ 5_üĄ_•ţž–bŐţV'ŐJ@!B • Ż 6Üěüě99Ě1/<ě299Üě0KSXííY"˛]33+532765#Ő¸â¸RQľţéi&&ý¸Őűƒ}úÖ``œ01­}űƒ` 2@ Šź F ü<<ě221/äÜ<ě20@  @ P ` p ]33###53ø¤¤¸´´`ţ¤ţ<ĤţňţV.` 54!333##"3276!ţŃÁ¸ľż5R ľw{i&ţVÝÍ`ű ›p?`3A0˙˙’cč3'q˝=rźU˙˙’ač4'q˝˙rź[˙˙’^č3'zźPq˝=˙˙“cĺZ'sđdrźU˙˙“cĺZ'uŒdrźU˙˙’ačZ'sđdq˝˙˙˙’ačZ'uŒdq˝˙˙˙vj 3'tŔ\q˝=˙˙‹cíZ'wźbrźU˙˙vj V'rź}tŔ\˙˙‹cíW'wźuzź|˙˙vj0Z's@dtŔ\˙˙‹c:'vźus(D˙˙‹cm:'uâDvźu˙˙vc u'vźutŔŒ˙˙vV Y'yźPtŔp˙˙ƒVőZ'yźPsđd˙˙ƒVőZ'yźPuŒd˙˙ƒVő‹'şŤyźP˙˙‹c['şŕvźu˙˙üî˙Pj&˛¸ţřZ,,!!,ţÔ,ţÔ˙ăOŐ=32653#"&[ÂhqĘÓ÷`ž=ěQQ•Ëîüţćę,˙˙˙Ťţ &&˝|ů˙Ťţ ö&3;#"'!5 767654x¸ I*eĂú‚2Dűţäţž0ËÚ# &pgM,¸>ţꅗ¸€ŠĐ:H~˙˙ţČ#Ä'|ꐀ˙˙˙ě`Ä'|˙S˙˙˙ěşÄ'|˙S‚˙˙‚ţđżF'|źý’˙˙˙ěţÔ8@'|˙+ţ '~cţÔů˙˙˙ěţÔ~@'|˙+ţ '~cţÔú˙˙˙Ťţ ~r'|źţ>PÁ9 9ľF üěÄK°SK°QZXš˙Ŕ8Y1´—‡/ěä0@  @ P ` p đ ]3;#"&5Á¸Li ľŁű‚™aœŔÖ˙˙‘^îŒ˙˙q˙ă%đä˙˙q˙ăqĺ˙˙–ţu `&ó˙JOw`73#!!dž˛†$ţ˛ÚNd˜ü`˙ţVw`#676#732767!5ʆĐ#5H2KţÜÜ1i0/éNŢ)deűĐľT0Hôd01™ŹűŒÖ``˙˙˙Óţvg`'°˙ó˙˙ˇţ‡ƒ`&óÔđŘĂű3#3#đÓÓÓÓÖţ#ţ—öŐ +@ • •   Ô2ě2ü2ě21/ě2ôě20!#3!53#—^ĘËý˘ÉĘŐŞűŞŞ­• ?!5 ü¤?ŞŞ˙˙ČË8ň'qXw˙˙ČË8 U'rXw˙˙Čş8č'wôq˙˙ČË8'tXw˙˙ČË8 U'uXw˙˙Čş8 'w,t˙˙Üż$ž'tôz˙˙Üż$ń'uôzÁNŐ@ TŻüüüÄ1/ěě0333Á¸ŐŐúž“˙ěNŐ@TŻ ÄüüüÄ1/ěě20%3!533yŐýžŐ¸“““B˙ěyŐ@ TŻÄüüě1/ěě0)533yţsŐ¸“Bq˙㌓8@ E EôěÔś0 ]99ěüÄ1@    Œ /ěôěÔě0 6& #" 3 šššţú*NYĂţë†hí>ţúšššý †ţëĂŠ“˙ě˙㌓A@E E ÄôěÔś0 ]9ěüÄ1@     Œ  /<ě2ôěÔě0 6& "'!53&54 3 šššţú*N˛NţJíh†hí>ţúšššý “ŠĂţëĂŠ“˙ě˙ă!“8@ E EÄôěÔś0 ]99ěě1@    Œ /ěôěÔě0 6& &54 #"'!5 šššţúíh†ţëĂYNţJ>ţúšššýœŠĂţëţzţë“=xŮ 4@   ÜÄ2üÄ2ÜÄ91@  ‡/ěě290)33!xýŢţçÂłłÂţçj*Żţ]ŁýQýi˙ěxŮ 6@   ÄÜÄ2üÄ2ÜÄ91@    ‡/ě2ě290%!5!33xütjţçÂłłÂţ瓓“—Żţ]ŁýQýi˙ě'Ů 4@     ÄÜÄ2üÄ2Ě91@   ‡ /ěě290#5!33jţçÂłłÂţç“—Żţ]ŁýQüÖ=Đq) #33Đţěţ˘ţ˘Ă¤úmˆ˝ýCqý"˙ěĐq )5333!ţěˆmúmˆţěţ˘“Ţý"“˝˙ěq)533#ţěˆmú¤Ăţ˘“Ţü˝şOq $@  üěÔüüÄ1śŁ‡/ě2ô<0)3!33OűkšUšÎqý"Ţý"˙ěOq (@   ÄüěÔüüÄ1ˇŁ ‡/ě22ô<0)533!33OúÎšUšÎ“Ţý"Ţý"˙ěq $@  ÄüěÔüě1śŁ‡/ě2ô<0)533!3űkΚUš“Ţý"ŢşOq $@   ü<ÔüüÄ1ˇ Ł /ě2ôě035!!5!3şüňÇΓK“ý"“˙ěOq $@   ÄüÔüüÄ1ˇ Ł /ě2ôě0#5!!5!3ÜüňÇΓK“ý"“˙ěq @ ÄüÔüě1ś Ł /ěôě0!5!!5űkÜüňqü“K“qÔâ:@!E E üěܲ@]üܲ@ ]ěüÄ1@ •• ‘ /ěôěÔ<ě0!&'.4> !2>4."RJr……ä 惃sKRü9[œ¸ZZ¸œ 1¨ĹŠbbŠĹ¨1 ý…“­p`88`p`88˙ěÔâ!>@#E E"Äüěܲ@]üܲ@]ěüÄ1@ • •‘ /ě2ôěÔ<ě0%!!5!&'.4> 2>4."źűRJr……ä 惃sKRţQ[œ¸ZZ¸œ“““{ 1¨ĹŠbbŠĹ¨1 Ÿp`88`p`88˙ěOâ:@!EE Äüěܲ@]üܲ@]ěě1@ •• ‘ /ěôěÔ<ě0#5!&'.4> 2>4."RJr……ä 惃sKRţQ[œ¸ZZ¸œ“{ 1¨ĹŠbbŠĹ¨1 üň­p`88`p`88şOŚ &@    ÔÄüÜĚĚ21ś   /ěÜÜÜĚ03"3#!5!ň„…ń>űk•œ fšžüř“˙ěOŚ "ˇ  ÄÔÄÜĚĚ21ś   /ěÜÜÜĚ03"3#!5!ň„…ń>úcœ fšžüř“˙쁌 $@   ÄÜüÜĚĚ21ś   /ěÜÜÜĚ03"3#!5!ň„…ńpűk•œ fšžüř“qľî7@ EüěÔ<ě2ÔüÜÄ1@    ‘ /ěôěÔ<ě2Ě0!!##"&6 !354'&"3.ţCœřź°ąf^‹vÎü ]8Ćmr^ŢţÄ<ÖUĺf˜śÉý"“qɃ]8˜Ćƒ˙ěľî;@! E ÄüěÔ<ě2ÔüÜÄ1@   ‘ /ě2ôěÔ<ě2Ě0%!##"&6 !3!554'&"3.ţCœřź°ąf^‹vÎů7é]8Ćmr^“KţÄ<ÖUĺf˜śÉý"““ŢɃ]8˜Ćƒ˙ěçî7@ EÄüěÔ<ě2ÔüĚ1@    ‘ /ěôěÔ<ě2Ě0%!##"&6 !!554'&"3.ţCœřź°ąf^‹vúé]8Ćmr^“KţÄ<ÖUĺf˜śÉü“ŢɃ]8˜ĆƒÁ•Ő ,@   üü<ü<ÜÄ1@   Ż  /ěôěÜě03!!!!!Áƒţ5Ëţ5Փţ/’ý´“˙ě•Ő 0@   Äüü<ü<ÜÄ1@    Ż  /ě2ôěÜě0#53!!!!!Őƒţ5Ëţ5“B“ţ/’ý´“˙ěDŐ ,@    Äüü<ü<Ě1@    Ż /ěôěÜě0)53!!!!yţsŐƒţ5Ëţ5“B“ţ/’=•Ő ,@  Ü<ü<üüÄ1@   Ż  /ěôěÜě0!!5!!5!3ţ5Ëţ5ƒŐߒѓúž“˙ě•Ő 0@  ÄÜ<ü<üüÄ1@    Ż  /ě2ôěÜě0#5!!5!!5!3ţ5Ëţ5ƒŐ“L’ѓúž“˙ěŔŐ ,@    ÄÜ<ü<üě1@    Ż /ěôěÜě0)5!!5!!5!Ŕý,ţ5Ëţ5ƒ“L’ѓşŒŐ *@  üü<ÔěüÄ1@     ě2ěÔě0!!27654'&3!23œţĐ,R4,,=ýŮšUiXOÓŢýľ]Oz}I_ý"Őýœ‡_Ҥ‚“˙ěŒŐ.@  Äüü<ÔěüÄ1@    /ě22ěÔě0#533!23!!27654'&ΚUiXOÓţţĐ,R4,,=“Býœ‡_Ҥ‚“Ţýľ]Oz}I_˙ěŐ *@  Äüü<Ôěě1@     /ě2ěÔě0!!27654'&533!2#œţĐ,R4,,=ý ΚUiXXXlŢýľ]Oz}I_ý"“Býœ‡_Ň­‡…ÁůŐ@@  ôܲ_]9üÔüÄ@    /ěôě999@  ěě10!4'&'5!!Ş5M‰Ăcý™ˆ4B˜™_–ÜÜ9V“ţďę¸ćœ@9“˙ěůŐD@   Äôܲ_]9üÔüÄ@     /ě2ôě999@  ěě10#5!&'&'&'5!!ť 5M‰Ăcý™ˆ4B˜“X]°–ÜÜ9V“ţďę¸ćœ@9“˙ě$Ő@@   Äôܲ_]9üÔě@     /ěôě999@  ěě10#5!&'&'&'5!ť 5M‰Ăcý™ˆ4B “X]°–ÜÜ9V“ţďę¸ćţÉq=áŐ:@   ÔÜü9ÜÄ1@  /ěô̲]ě촍]0!533TţéşŐßţÇö9úž“˙ěáŐ >@  ÄÔÜü9ÜÄ1@  /ě2ô̲]ě촍]0#5!533hţéşŐ“LţÇö9úž“˙ě Ő:@  ÄÔÜü9Ě1@  /ěô̲]ě촍]0#5!53hţéş“LţÇö9ú+ÁŔ#1@%!$üěÔěÔüüÄ1@    # /ě22ÔěÔě03432>3234&#"!4&#"!ÁôĆ}x5%–ÓŇ^ˆŐţq¤ZţýH¤Zl”ţîŚ˙K--ŇX€hýš“|‚€Ĺ•ţncƒ§Ňň˙ěŔ%5@'#&ÄüěÔěÔüüÄ1@    $ /ě222ÔěÔě0#53432>3234&#"!4&#"!ŐôĆ}x5%–ÓŇ^ˆŐţq¤ZţýH¤Zl”ţ“[Ś˙K--ŇX€hýš“|‚€Ĺ•ţncƒ§Ňň˙ěë#1@%!$ÄüěÔěÔüě1@    " /ě22ÔěÔě0#53432>324&#"!4&#"!ŐôĆ}x5%–ÓŇ^ˆş¤ZţýH¤Zl”ţ“[Ś˙K--ŇX€hý&|‚€Ĺ•ţncƒ§Ňň=ÜŐ -@   Üü<ü<üÜÄ1@    /ěüÜ<ü<0!!5!3!!!ˆţľK¸Kţľœ“Áţ?“ý“˙ěÜŐ1@   ÄÜü<ü<üĚÄ1@    /ě2ôÜ<ü<0#5!!5!3!!!œţľK¸Kţľœ“î“Áţ?“ý“˙ě‹Ő -@   ÄÜü<ü<üĚ1@    /ěôÜ<ü<0)5!!5!3!!@ýŹœţľK¸Kţľ“î“Áţ?“=XŐ>@ Üü<ü<Ü<ü<üÜÄ1@    /ě2ô<Ü<<ě220%!!5!3!3!!!ţ=šţľKšøLţ´œ“îý““Áţ?Áţ?“ý“˙ěXŐB@  ÄÜü<ü<Ü<ü<üÜÄ1@    /ě22ô<Ü<<ě220#5!!5!3!3!!!%!œţľKšøLţ´œýŹţ=“î“Áţ?Áţ?“ý““îý˙ěŐ>@  ÄÜü<ü<Ü<ü<üĚ1@    /ě2ô<Ü<<ü<<0)5!!5!3!3!!!źű0œţľKšøLţ´¸ţ=“î“Áţ?Áţ?“ýîýşOq %@   üěÔüüÄ1ˇ Ł /ě2ôě03!3!şÇÎü$Uqý"“ŢýľK˙ěOq *@    ÄüěÔüüÄ1@  Ł  /ě22ôě0#53!3!ÎÇÎü$U“Ţý"“ŢýľK˙ěq %@  ÄüěÔüě1ˇ  Ł /ě2ôě0)53!!űkÎÇüňU“ޓýľK=ŐC´  ÔÄÄÄ1@ B•• /ěěôě0KSX@ěěěěY!!!ĆýtFsţ0†ţhéBű~ŔŐúž“˙ěŐ Fľ  ÄÔÄÄ1@ B••  /ě2ěôě0KSX@ěěěěY!5!!!ĆýtFýléţh†ţhéBű~Ŕ“Búž“˙ěĂŐC´  ÄÔÄÄ1@ B•• /ěěôě0KSX@ěěěěY!5!!ĆýtFýléţh†ţ0Bű~Ŕ“Bú+ÁóŐ 8@!  üěÔ<ü<ÔěüÄ1@       /ě2ôěÜ<ě20327654'&+!!!2/!m¨]%i¤ţ ;ţ ô°„@ED\ŒÔ†qQE=4."RJr…CEoJRţľXEr„„rJSü9[œ¸ZZ¸œ† 1ŚĆSV/ ó“ţ{ 2ŚĆŚ1 ň“"p_88_p`88˙ěÔŐ*#5!5&'.4767675!5!!2>4."RJr…CEoJRţľXEr„„rJSü9[œ¸ZZ¸œ“ó 1ŚĆSV/ ó“ţ{ 2ŚĆŚ1 ň“"p_88_p`88˙ěOŐ(#5!5&'.4767675!5!2>4."RJr…CEoJRţľXEr„„rJSţQ[œ¸ZZ¸œ“ó 1ŚĆSV/ ó“ţ{ 2ŚĆŚ1 ţ{"p_88_p`88ÁQŐ %@   üěÔěüÄ1ˇ  /ěôüĚ0!!#!3ĹţľšźÔBţĹÎúž“˙ěQŐ *@  ÄüěÔěüÄ1@    /ě2ôüĚ0#5!!#!3ŮţľšźÔ“ŻţĹÎúž“˙ě}Ő %@   ÄüěÔěě1ˇ  /ěôüĚ0#5!!#!Ůţľšź“ŻţĹÎú+ÁQć (@   üü<ÜüüÄ1ˇ   /ěÔĚüĚ0!!#3!3ĹţľššÔOţü›ţüüą“˙ěQć -@   Äüü<ÜüüÄ1@     /ě2ÔĚüĚ0#5!!#3!3Ůţľššԓźţü›ţüüą“˙ě}ć (@    Äüü<Üüě1ˇ   /ěÔĚüĚ0#5!!#3!Ůţľšš“źţü›ţüüÁBŐ /@   ü<ěÜ<üüÄ1@      /ě2ôěÔě0!!!5!3z;ţ ôţ ŹŐŢýľKý"qѓúž“˙ěBŐ3@   Äü<ěÜ<üüÄ1@      /ě22ôěÔě0!53!!5!3z;ý7Őôţ ŹŐŢýľKý"“Ţѓúž“˙ěmŐ /@    Äü<ěÜ<üě1@      /ě2ôěÔě0!53!!5!z;ý7Őôţ ŹŢýľKý"“Ţѓú+qÔŐ &B@%(E# E'üěܲ@ ]<ü<ܲ@]ěüÄ1@ •# •$  /ěěÔ<ěÔ<ě02>4."&'.4767673! [œ¸ZZ¸œœRJr…CEoJR¸XEr„„rJS"p_88_p`88ü~† 1ŚĆSV/ †ţ{ 2ŚĆŚ1 ň“˙ěÔŐ (F@ *E#'E)Äüěܲ@]<ü<ܲ@#]ěüÄ1@•' •( /ě2ěÔ<ěÔ<ě02>4."!5!5&'.4767673 [œ¸ZZ¸œlűRJr…CEoJR¸XEr„„rJS"p_88_p`88ý““ó 1ŚĆSV/ †ţ{ 2ŚĆŚ1 ň˙ěOŐ &B@(E# E&'Äüěܲ@ ]<ü<ܲ@]ěě1@ •# •  %/ěěÔ<ěÔ<ě02>4."5&'.4767673!5 [œ¸ZZ¸œœRJr…CEoJR¸XEr„„rJSý0"p_88_p`88ýó 1ŚĆSV/ †ţ{ 2ŚĆŚ1 ţ{“qÔŐ*!&'.4767675!5!!!2>4."RJr…CEoJRţľNţľXEr„„rJSü9[œ¸ZZ¸œ† 1ŚĆSV/ ó““ň 2ŚĆŚ1 ň“"p_88_p`88˙ěÔŐ ,%!5!5&'.4767675!5!!2>4."ÔűRJr…CEoJRţľNţľXEr„„rJSţQ[œ¸ZZ¸œ“““ó 1ŚĆSV/ ó““ň 2ŚĆŚ1 ňp_88_p`88˙ěOŐ*)5!5&'.4767675!5!!2>4."źý0RJr…CEoJRţľNţľXEr„„rJSţQ[œ¸ZZ¸œ“ó 1ŚĆSV/ ó““ň 2ŚĆŚ1 p_88_p`88˙˙üěű˙ œűţ˙˙˙ކ‚Ő'†'Ę ˙˙ކƒŐ'†'É ˙˙ކ‚Ő'†'É ˙˙ކ‚Ő'†'É ˙˙ކ‚Ő'†'É ˙˙ކ‚Ő'†'É ˙˙ކ‚Ő'†'É ˙˙ކ‚Ő'†'É —ŕ :@   Ô@ ? o   ]Ü99ÔÜ99ÔĚ991ś ÔĚ2Ü<Ě0#'##'##'d22Ż222Ż22dŕČddddČÉţVüŐ!#!3!3#3ÄýjţđÄ–Éţ’†áűŐűáúŐŞţVÁţV8`!##333#€ˇýäěˇí¸ţŢ{ƒü}`üü9™ţVŽţVX` %5#"&5332653!"&'5326 CąuÁȸ||•­¸ţţúaŹQQžRľ´ţÝjBfcđçŚýaŸŸž¤{ü+ţâţéł,*˝ĐÂĐ•XśŠÄÔ1Ôě0!5!•ţ-ÓЈœ˝X'3ÖI(œsIˆnhäX#'3äţh'OĐý˜W™`4ňX#'3ňýňv5]ĐüdDŕZůX#'3ů ýč|;dĐű07!œ˝X#Öç(ýřXţ̈I˙˙œ•$@ţĚ˙˙h˝$AţĚ˙˙n4ä$BţĚ˙˙`ň$CţĚnhäX#7äOýŮhţđˆ™Wý˜˙˙h˝$EţĚ˙˙Âh•đ@ý˜˙˙4˝đAý˜˙˙näđBý˜`4ňX#7ň]ýËvźˆŕDüd˙˙n4ä$JţĚ˙˙4˝đEý˜˙˙Â4•ź@üd˙˙˝źAüdZůX%#7ůdýĹ|ˆˆ!7ű0˙˙`ň$OţĚ˙˙näđJý˜˙˙˝źEüd˙˙•ˆ@ű0ą<0Ö^XľÔě1ÄÄ33ֈXú¨J=˝_<őĆUĆU÷Öý3 r Umţ â÷ÖúQ rZÍfŞ‹55ŽĹ´žŞšq=3ۤ=´Ů‹žăd‹Ű˛‡á–œdž¨‹˛đ˛ž´Ů´Ů´Ů?“‡y}É–s)ÉÉšÉ3sÉ\É\˙–?ÉuÉçÉüÉLsÓÉLsÉ‡ă˙ú۲yéD{=ă˙ü{\°˛Ç´Ů˙ěŞç{şfqqěqŃ/qş9Á9˙ۢş9ÁËşşĺqşqJş+o#7Žź=‹Vź;ź=3X˛´Ů‹55ʁ^R˛\×Ĺsĺž´ŮădŐĂ´Ů5^5bsŽž‹Ű#5‰Ĺ`ĺÁÁ‰Á‰Áb?yyyyyyË–sÉÉÉÉ\;\˘\˙ţ\3 üÉLsLsLsLsLs´Lf۲۲۲۲ă˙ü×É şç{ç{ç{ç{ç{ç{Ű{fqěqěqěqěq9˙Ç99˙Ţ9˙ôĺqşĺqĺqĺqĺqĺq´ŮĺHŽŽŽŽź=şź=yç{yç{yç{–sfq–sfq–sfq–sfq)Éq3 qÉěqÉěqÉěqÉěqÉěq3sq3sq3sq3sqÉ˙ĺTɏx\˙ä9˙Ó\9˙ň\˙ő9˙ä\°9–\É9Á¸ÉrÁ\˙–9˙Ű?ɢş˘şuÉ9ÁuÉ9ˆuÉÁuÉźÁ˙ňFüÉşüÉşüÉş‚ÍüÉşLsĺqLsĺqLsĺqs/qÉJşÉJ‚ÉJş‡+o‡+o‡+o‡+oă˙ú#7ă˙ú#7ă˙ú#7۲Ž۲Ž۲Ž۲Ž۲Ž۲ŽéD‹Vă˙üź=ă˙ü{\3X{\3X{\3XŃ/ á˙—}Éş} s–sfq3 ˙—}ÉqĺqƒLuꤚ˙–Ń˙3s~ßşÔÉ\ ÷ɢš9 ź=˲ü˙–şLsNgĺv—sq7˙—šÉr+dɰţň#7ă#7ă˙úÝ­°NÄÉó˙üŘ={\3XT T\Ÿh3q–T]ŸhXş\ÉđÉŹ]É `É dÉ <qŻÉKɧÁsÉdÉaşyç{\˙ţ9˙ŕLsĺq۲Ž۲Ž۲Ž۲Ž۲Žěqyç{yç{ËŰ{3sq3sq?ɢ˙éLsĺqLsĺqT ŸX9˙Ű `É dÉ <q3sqçÉuÉüÉşyç{ËŰ{LfĺHyç{yç{ÉěqÉěq\˙§9˙Ă\9˙ăLsĺqLsĺqÇJ‚ÉJş۲Ž۲އ+oă˙ú#7œ,GÉ˙đâÉ´q–qâq{\3Xyç{ÉěqLsĺqLsĺqLsĺqLsĺqă˙üź=̊žşŃ79˙Űüqüqy˙ý– f u ă˙˛+o3XÓPŐP} Ű yÉěq\˙–9˙Ű@sq Jă˙öź ÍŽqşşefqq’qěqěqŽ|S…A…4…Pq9˙Ű‘qq qÄ`Ä`Žşş9ľŚůt*KćL:ÁŚÁ˺˺˺+˙Ű#şłĺqÝqӔGpPPOJşIş>„>tÔşÔş+o°˙ٰ˙Ůą7°ţň#7#7ńqÉÁź=‹Vź=ăf3X3XŸXŸmXXXXLsŁşPqŞq;şVţňVşşŃqXXqvqq˜7á7:7É/ Á<Á66JO<u1uf˙éu]H^H 6ű&: Ž ‹Ž‹˛‹Äuuuuőuőu  ÁÁÁÁ3ÖŐsŞ3ÖŐŞs˛o˛ouuuudŠdÇšîLśđ†˙˙ďhuTzüuuőuňÖňÖňÖňÖňÖÁŐ%Žîśü¨ýqüÁü´üŮűěüżý˜ü×ý7üěüôüĹýźüđü]üżüżţýý˙yü¨ýqý$ýÄţUţđý€ý ý ý$ý ýzýwýšüŐý(ýjý#ýLýźüđücüĹüżüżüżü´üŮűěűěűŒýxúíűhúýŹüńý!ücý+ţűěü¨ýqü´ýüçýĆüŐýýýüśüśüśücý3ýxüżý+ýx˙.üüpüpüpüpý*üpüw<É‹ÁĺÉ.É: : üÉ3şśefqe˛žs׊‹Űř˙çř˙óD˙í€˙ň™˙á›˙Űľy}ÉuÉyÉ{\ÉLs\É?ÉyçÉüÉÉLsÉÓÉÉă˙úă˙üLs{=LsN\ă˙üFqS…şľŚĄ•FqŔź ĺqS…ZkşĺqľŚˇżź=ŽxJvkĺqŃJş˛qqŃdĄ•GpŸ;Gpł‡ľĄ•ĺqĄ•ł‡?ÉęŚôq—W˝˙á—WGpłAOpLsĺq0‹˛qšÉŤ˙@GłGżěrwxsł‡sFqUÉë-~OŰd$s6˜sĺqă,J7Opşfq9˙ŰLsěqěÄ×Éş–sçÉ5U s–s sÉÉJ˙úáÉ–s‡\É\\˙–ŔT\ÉJ˙úŽÉüÉŕ#Éy}É}ÉáÉ@eÉž(!‡üÉüÉŽÉTçÉÉLsÉÓÉ–să˙úŕ#ăy{=6É|ŻŽÉŔÉŠ<É}É–oŁÓˆç{ďpˇş4şˆkěq5FA…3ş3şŐşL ş;şĺq;şşfqŠ<ź=×pź;rşş–Rş‰ş§>QşˇşdqźÁĐtěqěq/4şdq+o9Á9˙ô9˙Ű8L0ş7/Őş3şź=;şxsł‡*`ŠÓţÁ D3 GÉÁLsĺk7ɘÁsS[Ú2Lsĺq@R2@R2đs<q sq pv9˜xsł‡–sfq;űÚýýłýłůĘX÷ÖXřX.ÉjÁ}!ˇ&ÓÉşáÉ4şfGš8ţÉ=şž(5F!‡A…ŽÉŐşŽÉŐşŽ!Ő=Ú2§*ÉIÁÉÁŚÉSÁs‹q–sfqă˙úŠ<ă˙üź=ă˙üź={=ź;y˙út|Żş–|Żş–|Żş‡Ó‡Ó\Éž(5F?ÉŐż56].ÉIÁ6ÉrÁ|Żş–É2Á9Áyç{yç{ËŰ{ÉěqLuěqLuěqž(5F!‡A…T ŸXüÉ3şüÉ3şLsĺqLsĺqLsĺq–odqŕ#ź=ŕ#ź=ŕ#ź=|Żş–áÉ4şÉQşfGš8{=ź;{=ź;}‘ˇq ‘-qĚÉôŤnÉľŤ“6¨.çÉ˝Á3sGq/˙ú°ę¤S…TL ZTóL'ÉęşAˆătLsqéD‹VĽT>LŚÉLşXÉvşď˛۲˛˛۲&›t˛۲β˛۲u˛—˛äA۲¨˛&˛7\˛یš\۲۲۲S˛&›˛۲˛‡۲یe˛LsR\Ls‡uu‹˛^x"ž6^ZËşşq"şŽ“qDŽşšş“qş;Á'ş qŽşqşŽFŽ9˙Ű2  şŸFËş  &şŽ‘ŽĘŽşqÁĘŽ/ĺqzޞđw`DŤ˙˙DÇÇcc/NDădc\ŃĹ\Ńˆfc˛ŢX•CŔXş.şţXş0ş.şźXsXËXşEX.şˆX™XNşŐş*CŚCMşźXwşBÄş˘şÄşSş(ş…Ѕ•Űü‹Ű?“ĂŁ9˙ľ9lÝ˙Ť9lC‚9Áˆ‚1‹ˆ‚ˆ‚***}}Ý˙ŤÝ˙Ť Ă Ă Ź‚ Ź‚ffĆuĆuX˙ěK5k˜ЏôŒŕ“1‹Ý˙ŤC‚C‚ÜÜÜÜÜÜČě˜OOóL¸LLRLLLŻL‡LUL<L<LdL…™‹˛\Wˆ‚5kVzˆ‚ˆ‚ˆ‚ˆ‚ˆ‚ˆ‚ˆ‚ˆ‚*******Ý˙ŤÝ˙Ťâ˙ŤÝ˙ŤKKK)‚)‚Џŕ“*Ý˙ŤC‚C‚1‹L¸LLRLLLRLjLĐL<L<Ld‡ááááááÖ֝9Á’qd=ź=;ş;şŔq;şĄqÁ=xşĺÁÍ=ŹÁČ=D=;ş=ßÁ=ÁËpČ==Ŕq=Á=Á.ÁŔqŔqŮB¤ż[B[šŐ‚Č‚Č{d{dă˙ě7Ĺ]‚x‹‰Ülx‹€r[ş")>WE_HHöY"ş~h~h@€rx‹2Os N~sx‹MĘnű`P{Püšű@ű@ű@ű@üţü§ű`űNzBzŽ˙Óa\îźd“ýűű>üNűüš‡ c c]cc Y]‚d–ji:~:~šP†Z"ZPşZ|ZPZ}PźP…ZPZXZ­‚łPP‚P|Z­‚­‚˛P˛P*FՂ­ZÄn­‚ĹP\Z­‚ˆZ­‚ZFdZW‚PPWF…ZdZddDPGd.d#ddadd%dvd-d/‚Cd$d/dWd/‚?d1<Nd/dBd/d-d-‚ˆd/d/‚éF.‚üZ#d{dddd‚d—dĂd.‚ndmd°úndyyyy'É'É'É'É'w'wŽÉ­ŽÉ­ŽÉ­źÉÉźÉÉ'ÉźÉwźÉw'w ÉX‰c^c^‰‰%‰‰şH‰ ɉ‰‰¸E ÉďwyyyyŐwŐwŐwŐwŐwŐwŽÉyŽÉ­ŽÉ­źÉwźÉwźÉwźÉwŐw‰‰‰۲۲۲۲×w×w×w×w×y×y^ɲ^ɲ^ɲlÉ4wlÉ4w”É4y”É4y”đy‰˛˛íwyFÉÉÉFFFÉÉáÉ*F…ɇɅɇÉáÉ*FáÉ*F…ɇɅɇɅđA‰A8F3ÉF3ÉFÉÉÉFFFÉÉáÉ*F…ɇɅɇÉáÉ*FáÉ*F…ɇɅɇɅđz‰z‰áwuÉuÉuÉáwáwáwuÉuÉţÉ&wřÉÉřÉÉţÉ&wţÉ&wřÉÉřÉÉřđ‰‰‰ĐwĐFĐFĐ ĐwĐwĐwĐFĐFŽÉGwyÉĐFyÉĐFĐF͉Ÿ‰͉ĐwĐFĐFĐFĐwĐwĐwĐFĐFŽÉGwyÉ=FyÉ=FŽÉGwŽÉGwŞÉ=FŞÉ=F͉ŐwÓFÓÉÓÉÓÉÓFÓFÓFÓÉÓÉ­ÉFVÉ+ÉVÉ+É­ÉF­ÉFVÉ+ÉVÉ+ÉVđY‰]‰Y‰˛F˛F˛F"F"F"F"FGÉúFGÉúFGÉúF ÉĚF ÉĚF ÉĚF ÉĚF ‰wÉÉÉwwwÉÉÁÉ?w‡ÉŒÉ‡ÉŒÉÁÉ?wÁÉ?w‡ÉŒÉ‡ÉŒÉ‡đY‰‰ŕ‰SÉSwSwSÉSÉSÉÓÉÓÉÓÉÓFÓFÓF­ÉFY‰Őwy–y–y–y–ĎMĎMĎwĎwdÉw‰۲۲۲۲۲۲×S×S×y×y”É4y‰ĽFĽwĽwĽFĽFĽwĽw‚‰Éŕ‰`‰`‰`‰`‰`‰`‰`‰š‰ĽFĽwĽFĽw ‰ ‰ ‰‰‰ ‰ ‰™‰•‰ĐFĐFĐwĐwĐFĐF͉%w%!%!%w%w%!%!Y É)É#sż‰ż‰u`‰ z‰ ‰ ‰ ‰ ‰ ‰ ‰Ń˙ěń˙ě˛˙ěs˙ě 4˙ě ő˙ěń˙ě˛˙ěs˙ě 3˙ě ő˙ěü˙ěż˙ě‚˙ě E˙ě ˙ěń˙ě˛˙ěp˙ě 2˙ě ő˙ěü˙ě˙ěO˙ě Ł˙ě 3˙ěw˙ěq˙ěź=˝ Ű{°>fq׺×$íşS‚9Á(˘şŞ ş3şĺqfyqyqy3/qĺqĺq2—Đ2Đ2Š<˜şĺŽ•Ž/ź=‹V3X5xŞłź=ƒ—2—šZLr čuá//SçHĘ||˙˝NÎYĹĹ÷H„G €˙ü°pű+"M"M>G/Mmu>GVGVGâTŕR>GnzhuüuEuOGöGOGOGmu\#=nÂnüuV&7yűGSGé%nzu=nV&7yűKySGé%şĘůt9‘>GöGöGOGâT_Ý˙é>G=nI˙zIIŕ˙V˙zá[qüuüuI˙éÖuEqOGOGâFK˙é\#^YGäu@zV&î7~7î7#7OGü[ü[ü[ü[üBüByç{}ÉŽ}Éş}Éş–sfq)Éq)Éq)Éq)Éq)ÉqÉěqÉěqÉěqÉěqÉěqšÉŃ/3sqÉŽÉşÉ˙íÉş\9˙Ó\9˙ô?ɢş?ɢş?ɢşuÉMÁuM˙ýuÉ9˙ôuÉ9˙ŢçÉËşçÉËşçÉËşüÉşüÉşüÉşüÉşLsĺqLsĺqLsĺqLsĺqÓÉşÓÉşÉJşÉJşÉJşÉJT‡+o‡+o‡+o‡+o‡+oă˙ú#7ă˙ú#7ă˙ú#7ă˙ú#7۲Ž۲Ž۲Ž۲Ž۲Žyź=yź=éD‹VéD‹VéD‹VéD‹VéD‹V{=ź;{=ź;ă˙üź={\3X{\3X{\3Xş#‹Vź=ç{Ń/&˛ĺqyç{yç{yç{yç{yç{yç{yç{yç{yç{yç{yç{yç{ÉěqÉěqÉěqÉěqÉěqÉěqÉěqÉěq\Z9D\Č9ˇLsĺqLsĺqLsĺqLsĺqLsĺqLsĺqLsĺqNgĺvNgĺvNgĺvNgĺvNgĺv۲Ž۲ŽÝ­°Ý­°Ý­°Ý­°Ý­°ă˙üź=ă˙üź=ă˙üź=ă˙üź=FqFqFqFqFqFqFqFqyy'iŞńS…S…S…S…S…S…°°şĚ0lşşşşşşşş˛Ż°ś7hx“ľ›ľ‘ľ˙ąľ˙ťľľ˙Óľ˙Ëľ˙Ć ţĚęńĺqĺqĺqĺqĺqĺqoÉÂ̂å•Ą•Ą•Ą•Ą•Ą•Ą•Ą•Eű.ł‡ł‡ł‡ł‡ł‡ł‡ł‡ł‡kżˇĂ‘Ç_žFqFqS…c…ş<şľ˙ľŚĺqĺqĄ•Ą•ł‡ł‡FqFqFqFqFqFqFqFqyy'iŞńşşşşşşşş˛Ż°ś7hx“ł‡ł‡ł‡ł‡ł‡ł‡ł‡ł‡kżˇĂ‘Ç_žFqFqFqFqFqFqFqyyť˙üŠy†ś†śśşş<şşşp˙üř˙çr˙üř˙óɉ´śľ˙ëľ˙ăľ˙Řľľ˙äľ˙ć\˙ő\Í˙üD˙í~•śĄ•Ą•Ą•Ą•şşĄ•Ą•ă˙üă˙üĂ˙ü™˙á{Ş×Şł‡ł‡ł‡ł‡ł‡‡˙ü€˙ňa˙ü›˙ŰNs†ŁV‹™Ěădădddd˙싎‹˛‹Ž‹˛%Ž%Ž%Ž%Ž99¸3¸3­ěWěě‹Ü™ źq âqŃ(ý()(Ń(ý()(ś 3ž3Á´Ăâ“?“˙ěn˙§n˙§˙Ş=ÝVţ‰°°`JݓݓúděŘŘ=˛n˙§=™‘dn˙§´8°úN(´f´f‹Űad´p‹Ű‹ŰÇ5Wnz5?5f5\5l5Y5S9‰9‰9‰÷o÷g0u5W5‰5^5b5?5f5\5l5Y5S9‰9‰9‰÷o÷g"MVGOGuVGVs`…Ëşüu .É—Éé;F_( .Đ.D]1u!Şüü=ü=ü=üűPü=&C&C–süĂ#˙Ö&<‰<ꤖoĂčI ĚÉHZÂ;”jĂDN˙ä‹ hĆR6”nœČLsbBƒSVČ,ŠyÉ(˜˙ü'yő\ŸXNNîľD?ÉyJ\ ‚Ö}źWآJTšÉŽ9˛högd˙űş(V FhZ —ž$Ň<ČĘÉ|3Łuuă˙üWŞZě[ĎOĎ˙=;6QÁ‰Á^Á‰Á^ÁbÁ?Á‰ÁfÁ‰ÁbÁfÁl‹‰\ÉđÉ„ÉbÉyaő ‰WÉ{=w= =uÉ–s)ÉçÉ9ÁŠÁÁ~Áź=}=í= ]=Áź;”;;9ÁfqqËş öy)É öy se´d´Ł´u´Ł´d´Ł´ ´ ´ ´ ´d´u´,´´d´Ľ´u´Ľ´d´u´d´Ľ´u´Ľ´Ľ´d´v´d´v´d´d´*´Z´Ź´Z´Ź´Ý´d´-´O´Ţ´p´Ó´´d´d´´Ł´u´u´´Ł´d´w´d´d´x´v´x´d´d´d´d´u´d´Ľ´u´Ľ´d´¤´ ´ź´ź´ ´d´u´d´u´Ł´Ł´d´Ł´u´Ł´k´u´7´^´H´^´^´^´@´^´^´^´u´z´z´^´u´w´u´d´u´d´d´u´d´7´u´7y‡#_ÉÉř›Z˙úZ˙úřŻřŻžŮřŻřŻžŮ,œœd´Ů´Ů´Ů˛Š´DX===ˇÜŞÜ´,Ż,Ż´í°ffŰŰŰŰ+uPuuu+uPuuu+u+u+uyyĄy´Ů´Ů´Ř´Ů´Ů´Ů´˘´ŮдٴٴٴٴٴٴٴٴٴٴٴٴشٴٴٴٜٜŮĎÍ´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ú´Ú´Ú´Ú`”`”ś°´Ř´Ů´Ů´Ů´Ů´Ů´Ú´Ů´Ů´Đ´Đ´Đ´Đ´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ě´Ě´Ě´Ě´ž´Ů´ž´Ů´ž´žŰŰŰ´Ů´Ů´Ů´Ů>Ů>Ů´ť´ť´ť´ť´ť´ť´ť´ť´ť´ť´ť´ť´ťřŻřŻřŻřŻ*Ż*ŻřŻřŻřŻřŻřŻřŻřŻřŻ´Ů´Ů´Ů´Ů´Ů´Ůyy´b´y*îŰČŰČŰČ´´˙ú˙úŒŒô‹Űů´ŮŮŮŮŮŮ´ŮÜcÜc´ž´Ů´Ň´Ň´|´Ů´Ů´Ů a” a”´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´á´Ů´Ů´Ů´Ő–ěěěXřŻžŮřŻřŻžŮřŻřŻXřŻžŮřŻžŮřŮŃJŃr’´Ł´Ł´Ł´Łč;°Ç°Çxôxdxôxd´Ů÷´ŮŔ°Ŕ†Ŕ°Ŕ†+Ż+* 8œ 8œ Pœ 8œ Œx Pü–ľŚşł‡Fq 8œü#°°°°°°°°°°Ł¨ŁŁ¨Ł¨+Ż´7şü–'˙ƒ’,˜,˜,˜,˜,˜,˜,˜,˜,˜,˜Ń˙ěŃ˙ěŃŃČŃ˙ěŃ˙ěŃŃČŃ˙ëŃ˙ěŃŃČŃŃŃČŃČŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃŃŃČŃČŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃŃŃČŃČŃČŃČŃČŃČŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃŃČŃ˙ěŃxŃŃxŃxŃ˙ěŃ˙ěŃ˙ěŃŃxŃxŃ˙ěŃ˙ěŃ˙ěŃŃxŃxŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃ˙ěŃŃ˙ěŃ˙ěŃŃ˙“Ń˙“Ń˙“Ń˙ěŃŃ|ŃŃ˙ěŃČŃ|ŃČŃ˙ěŃČŃ˙ěŃČ'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě'˙ě''˙ě'˙ě'˙ě'˙ě'q'˙ě''˙ě'˙ě'˙ě'˙ě'˙ě''˙ě'˙쏺şşşşşşşşşlşlşşşgşgş'''''''''''''''''űpôűpűrűpűpűpűpűpűpűpűpűp7p7şTşĂşĂşĂşűpűp''''¸3şşşşş'''ôpşşşşűpűpűpűp'''¤ş¤şÜşÜş',Ťh,d,Ş,ƒ,…,…•Ş+Ş,Ş}}_}} ÷Œ ‘,¸,ˇ,ˇBš,d,˜,Ź,Ź,Ÿ,Ť,Ź,Ź,˛ߓ,ąߓ,},Ź,Ş,dZdřŞ2ŞEŞ\Ş,Ş,˛,ŞŻŞ,Ť,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,‡,Ş,Ş,Ş,Ş,Ý,ŞéŻŮŻŮŻ,Ż,S,Ŕ,ř,,ě,],ˇ,Ŕ,ç,,m,Ť,E,Š,Ŕ,°,A,É,â,U,ś,Q,0,É,â,U,ś,L,0,C,š,X,ä,B,ś,X,ä,ŘĆŹŹ,x,źĆľÜŹß­üŹ „,Ź,œ,œ,œ,œ,œ,œ,œ,œ,Ź,Ş,Ş,Ş,1ô–ô–ô–ô–ô–ô–,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,X,X,j,Ć, T},y,},),œ,,,,džŞŻŻŻ %˘6Ż´ ´Ď´€´ ´´´ú´d´T´ ŔŇ´ąŮŻÜYܰܰĚxÜŽÜE´´V´´I´V´V´x´„´ł´+´ś´5´ś´X´Š´3´í´´Ż´ń´ü´p´p´p´p´R´ ´>´p´ť´T´V´S´T´W´W´/´V´0´/´0´0´0´2´„´˜´p´@´T´ť´T´T´T´p´§´§´Ą´Ą´n´n´T´V´Ą´ś´œ´‚´Ą´a´a´T´T,f,z,z,z,z,Ş´´°´”Ž”xNŽNx´>´ž´N´n´X´~´ ´‘´‘´´´š´Ű´#´9´U´w´Ä´l´f´Ą,˜,˜,˜,˜,˜,˜,˜,˜,˜,˜´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´u´ü´u´ü´u´u´u´u´u´u´u´ä´ä´ä´u´u´ě´u´u´u´+´+´´´´´<´‚´Ľ´u´§´§´u´§´s´–´˘´˘´umOôö°öݎ¤sˇs¤´[´Y´O´O Bu xd xu xd xd xu xd xd xu xd xu xuÜÜ,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü„Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,Ü,´d´u´´wOwOßß´ŮŮŮŮŮŮŮŮô´Ů´Ů::: šu+u+u+u+u+u+u+u+u+u+u+˙ž+u+u+u+u+k´´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ú´Ú´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´Ů´ľ´ ´ľ´ ´7´7´^´^´ľ´ ´ľ´ ´7´^°u°u°H°Hşşşş''''şô$ô$ü–ü–ü"ôpôMôMu 9 u˙×Ó ÉçH#˙čÉş?ɢş{\3X@sçÉyŕ= DąVźh<É‹ÁGpPĺqíbf˙ér ,qssu@xC@~–yyɃv–˙Ű{\í–{\ssg–)É?>8–{\(–ÉoŸo:oüÉ÷Ě\É:o\ÉŸcssɐÉţ–ss–s$d{=–súÉyÉÉNs‰ÉNs6?°Ç°Ç?“,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Şr+dÔÉľŚ pv9˜;<@>ŁsźpĐÓžÁeKkˆT5L mÉşLsĺqŘsłq Ýs&q:B˙úz<ă˙úŠ<|ŻşňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖňÖôfôfĂĂĂÉş˙ú­7ę¤S…íş+o ˙á{  ë{ #Ů{Ĺ‹{Ĺ‹{Ź‹{ seqÉ#Á§Sjxt ˘ Ýs&qu 9ÁâÉş˛đ 553ĹšwÓFçÉ\É ˜DЖЖĺqƒ/ / /ź/ź/}/ăo Ť Ž ‘Ž }Ž <Ž.şVÄśNŮ 1X?ş,XżX׺uXX´Ůwşwşwşwş˛˛˛ŢX•CŔXş.QţX0ş°QźXsXËXEXˆX™XşŐşŚCMşźXwşB.şŢXsXŐşXˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ěKHÓ˙ě ˙ěKHÓ˙ě ˙ě**ň˙ě*˙ě**ň˙ě*˙ě**ň˙ě*˙ě**ň˙ě*˙ěÝ˙Ťj˙ŤÝ˙Ťj˙Ť)‚)‚Ď˙ěk˙ě)‚)‚Ď˙ěk˙ěŕ““Ý˙Ť"˙Ť:˙ěj˙ěC‚Ť‚:˙ěj˙ěüpý*XX˙ěXiXXX˙ěXX˙ěXX˙ěX˙ôX˙ěXX˙ěĂŁ9˙ľp˙ľ9lplÝ˙Ť"˙Ť9lplC‚Ť‚:˙ěj˙ě9ÁpÁˆ‚ہ:˙ěj˙ě1‹J‘ˆ‚ہ:˙ěj˙ěˆ‚ہ:˙ěj˙ě**ň˙ě*˙ě**ň˙ě*˙ě**ň˙ě*˙ě}3}}3}Ý˙Ťj˙ŤÝ˙Ťj˙Ť Ă 3‚´˙ě#˙ě Ă 3‚´˙ě#˙ě Ź‚ ͂Ë˙ěđ˙ě Ź‚ ͂Ë˙ěđ˙ěf˜^˙ě˙ěf˜^˙ě˙ěĆuBuĆ˙ěÜ˙ěĆuBu/˙ěÜ˙ěKHÓ˙ě ˙ě5kŹkÓ˙ě ˙ě˜žĎ˙ěk˙ěЏp˙ěŚ˙ěôŒSŒI˙ě ˙ěŕ““:˙ěj˙ě1‹J‘8˙ě°˙ěÝ˙Ť"˙ŤC‚Ť‚C‚Ť‚:˙ěj˙ě˙.Ć˙.˙ĺĆ˙ĺĆTĆT4,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Ş,ŞíŮɍčÖÉcÉ3s$f"˙–É=É3ÄLrˆŞ˙ú¤ąČÝDrl¨˙üK{Ş”fqŞ”ěoš/ŞqĺşĎćĎ˙×5şĎć "şĺşĺqŞqŞqßş+oš7ęąÜ=HVhL˙=¸Xy}É–s)ÉÉšÉ3sÉŒ—\˙–?ÉuÉçÉüÉLsÓÉLsÉ‡ă˙ú۲yéD{=ă˙ü{\ç{şfqqěqŃ/qş9Á9˙ۢş9ÁËşşĺqşqJş+o#7Žź=‹Vź;ź=3Xˆk‚œZ”qA‹j‡á–œdž¨‹˙šü×ýsüśý üĎüĎüÇüÇýšüćüN––ہ:˙ěj˙ěHÓ˙ě ˙ěŹkÓ˙ě ˙ě:˙ěj˙ěśہ:˙ěj˙ěہ:˙ěj˙ě*ň˙ě*˙ě*ň˙ě*˙ě*ň˙ě*˙ě*ň˙ě*˙ě_üŐ9îţňx’x’x’x“x“x’x’xvx‹xvx‹xvx‹x‹xvxvxƒxƒxƒx‹ü,â˙Ťâ˙Ťp˙ěŚ˙썂:˙ěj˙ěj˙Ť9ÁJ‘–qâq9–ĎOĎ˙9˙Ó9ˇ˛đŒ—´­ČČČČČČÜÜ:Á:˙ě:˙ě’q’˙ě’˙ěd=d˙ěd˙ěź=ź˙ěź˙ě;ş;˙ě;˙ě;ş;˙ě;˙ěŔqŔ˙ěŔ˙ě;ş;˙ě;˙ěĄqĄ˙ěĄ˙ěÁ˙ě˙ě=˙ě˙ěxşx˙ěx˙ěĺÁĺ˙ěĺ˙ěÍ=Í˙ěÍ˙ěŹÁŹ˙ěŹ˙ěČ=Č˙ěČ˙ěD=D˙ěD˙ě;ş;˙ě;˙ě=˙ě˙ěßÁß˙ěß˙ě=Á=˙ě=˙ěËpË˙ěË˙ěČ=Č˙ěČ˙ě=˙ě˙ěŔqŔ˙ěŔ˙ě=Á=˙ě=˙ě=Á=˙ě=˙ě.Á.˙ě.˙ěŔqŔ˙ěŔ˙ěŔqŔ˙ěŔ˙ěüě,Ş,Ş,Ş,Ş,Ş,Ş,Ş,Şł—.ÉjÁŽľÂçn`#Z獵Âçn`n獵Âçn`n獵Âç#Z`n獵Â3Öœ>Ě?¸@<@<@ĚA˜BPChDŒDÔFFÔGřHÔI IŘJKPKœLL„M$MŕN0NäO@OlOĚP$PŹQ|QœQźQÜRÔRěSS0S`STĐU¨UŔUŘUđVV8VPVhVŒV°W|WŹWÄWÜXX<XlY4ZlZ„ZœZĚ[[[¤\Ě\đ]]4]`]˜]Ř_”_Ź_Ä_Ü``$`<`T`x`œbLbdb|b”b´bŕc chdÜdôe e,e\etffDfpf˜fÄfäfügg,gDghg€g˜g°gÔgěhh,h<hřii4iXi|i”iŹiÄiÜjj,jPjtjŒj¤jČjŕjřkk@k„l l lÄlčm m0mTmxmm¨mŘn$nHnlnn´nĚnäoÔoěp$p<p`pxpœp´pčqdqôrr<rTrlrœrČrŕsxtt@t`tŒtŹtÄtÜu|v¤vźvÔvěww(wPwhw€w¨wĚwäwüx$xHx`xxx¤xČyLyäzz4zdzˆz´zŘzđ{{,{D{\{t{˜{ź{ŕ||$|<|T|l|„|œ|Ä}}č~°~Ŕt€€¨8ř‚´‚ăXƒÔ„|…T…°†`‡‡˜ˆP‰Š0‹‹\‹ĚŒˆœüŽä¤t„‘(‘@‘X’’Ź“D””Ŕ•”–Ü–ě—ˆ˜ ˜°™L™Ř™đšš´›@›üĚžÔŸŕ ŔĄ˘ Ł Ł€¤¤ ĽĽ¨ĽčŚŚ€ŚŚ¨ŚŔŚŘŚđ§§ §8§P§h§ˆ§¨§Đ§ř¨¨0¨P¨t¨Œ¨¤¨ź¨Ô¨ěŠŠŠ4ŠDŠ\ŠtŠŒŠ¤ŠźŠÔިŤœŤČŤŕŤřŹ<ŹTŹlŹ„ŹœŹ´ŹĚŹô­ ­$­<­T­lŽޜ޴ŽĚŽäŽüŻŻ,ŻDŻ\ŻtŻŒŻ¤ŻźŻÔŻě°°°4°L°d°|°”°Ź°Ä°Ü°ôą ą$ą<ąTąlą„ąœą´ąĚąäąü˛ˆłł4łxłě´ľœś€ˇl¸d¸|¸”¸Ź¸Ä¸Ü¸ôš š$š<šTšlš„šœš´şşŒşôťXź8˝˝Œž$ž´ż żtŔ,Ŕ„ÁÁÂlĂ,Ă<äÄPÄěňĆHÇČ,ȸÉÉhʤË<ËÔ̌Í(ÎÎČĎxĐ\ŃŇ Ň0Ň@Ó\Ô(԰ՔÖLÖč×ÜŘĐŮLŮäڐŰŰŰhÜܜÜôŢŢěßŔŕ°áXáěâ”ă(ăÔä„ä”äüĺdĺđćdćđçLç¨čźé`ęlęŕëŒëěě€ěôítîîĐď`ďđňň¤ó óüőö0öŔ÷T÷čř€ůů¨ů¸úˆűHűXűčü ü\ýýĐţŒ˙˙ä hôÄXüČ,œ ź0Ŕ €Ř T Ŕ ř < L d t „ ź $ Œ    Č đ T Č$€°ŔÜü,@`|č8L`„¨Ôđ|äP°pÜH”źTŒœĐ\¨Üđ,řTŹ(<Pd¨¤¸ LhŘô@h´Đäř<\Đ Dh”°ŕ$8¤ČÜđ  < „   ź Đ!!!,!@!T!°!Ě!č""("t"˜"Ŕ##<#œ#¸#Ě#ŕ#ô$$$,$P$x$ $Ŕ%<%°%Č&&(&(&h&€&”&Ô&č'L'`'t''Ź( (4(\(l(|(Ź(Ü) )<)L)\)) )¸)Đ)ŕ*0*`*x*ˆ*¤*Ŕ*Ü*ô++(+@+P+`+˜,,,$,4,ä,ô--h-x-ˆ-č-ř...”.¤.´/t/„00Č0ě11(1@1X1p1ˆ2Ř3t3ô4Ř5¨6L6Č77ŕ8`8ä8ô9„:@:P:Ě;`< < ==Œ>L?X?ě@€@˜@°@Č@ŕ@řA8BB°ChC„CœDdEEŔFxG$GČHdHtI$I€IđJhJÄKÜL´MHMÔNˆOpOčPXQ QźRPRčSXSÄT`UU(U8UHU¸V$V4VDVTW$W°X0X@XXXpXˆY(Y´YĚZxZˆZ˜Z¨Z¸[P[ŕ\P\h\€\˜\đ]]€]]Č^T^d_X``ź`üaađbbb bhbxbˆb˜ccĐcŕd8d”dđe\eÜeôfhggÔhph€iHiäjj¤j´k¤lhlŘmm¨nnnčnřo@oPo`o¤o´pœpŹqq€qÜrHrÄrÜsLsđt”u$u<uÜv€v˜w<wLw\wlw|xxŹy<yTyly„yÜz´zÄ{d{ř|ˆ|ř}<}|}Ř~0ü€x€đÜ‚¸ƒƒ€ƒƒ ƒě„<„T„l……”†Œ‡x‡˜‡¸‡Đ‡čˆ„‰‰hŠŠ4Š\Š„ŠŔŒŒŔŒŘŒđŒŽ,ŽŒT˜řXä‘t‘Ř’8’P’h’Ź’đ“<“„“Đ””ź•\•Ě–8–œ–ü—”˜,™ ™üšš,šˆšŕšđ›Œ›Ôœœ`œ¨ˆüžˆžŘŸ$Ÿ„Ÿ” pĄlĄ„ĄœĄŹĄÄĄÜ˘8˘œ˘čŁ4ŁŹ¤$¤`¤œĽĽ¤ĽđŚ<ŚLŚxژŚČ§§§ §D§h§x§ˆ§ §¸§Đ§č¨¨¨(¨8¨P¨h¨€¨˜¨Č¨ôŠŠŠ,ŠDŠ\ŠtЌФŠźŠÔŠěŞŞŞ4Ş€ŞĚŞäŞüŤˆŹŹtŹÔ­$­t­ěŽhŻ8°°äąČ˛|ł8łÜ´|´Œľ ľ°ś8śźˇDˇTˇdˇä¸d¸Čš0šşştť ťť,ť<ťLťřź¨˝P˝üž,ž\żżŹŔhÁ Áx¨Ă@ĂěÄtÄđĹXĹ´ĆTÜĆäǤČ<ČŔÉ,É Ę<ĘŹË(˔Ëč̀Í(Í8͜ÍŹÎÎŕĎdĎtĐ$Đ4ĐÔĐäĐôŃŃPŃ`Ń´ŃŘҨÓ4ÓÜÔdÔř՜Ö ֐׈Ř$؜ŘÜŮxÚlÚčÚřŰřÜ|ÝhŢ(Ţ8Ţä߈ߘŕdŕtá\áÜáěâpăHăÄăÔääěĺ´ĺÄćŕç`ç çÜččLč éé,éTéÔęę<ędętęÔëë,ëHëtëŹëŘěěHě˜ěÔí„íŕîhî´ď$ďXďŹđđ„đźńńxńÜň<ňôó,ó„ôô°ő(ő°ö0ö¸÷8÷řřř¨řŔřŘůůPůđú úŕű,űLű¨űŘüHü¸üĐüčýýý0ýLýdý|ý”ýŹýÄţ,ţDţ˜ţ°ţô˙ ˙Ě˙ä¨Ŕ,DÄÜô $ŕ@ĚäLĚxź\„ ,HÄPdx źě D Ŕ D Ź ô D ”  @ € ¤ Ř < ě@Xpˆ¨ŔŘđ 8Ph€˜°ČŕřĚäü¨Ŕ @Xh€ °ŔĐPĐ4DTdč@ŒÔ d¤ôPě˜đ\¤T°@”č`ŕ<Ř0°üh  \ č!,!˜""`"°##Ě$T$€$Č$đ%L%¸&&h&&Đ''T'˜'ô( (Ä)ˆ*X++¨,\-8../T00Ř1€22¸3ˆ484ü5Ŕ6477Ŕ8 9H::Ě;ˆ>0>”??|@@H@ÄA(A B<BĐBčClDD„E8E`EčF„FĐFäG0G”HHŒIIœJ@KKpLtLŕMđNŘO\OÄP(P°QQ|QřRhRŒSSˆTT|ULU VV€VŕWHXXœXŘY(YxYüZLZÄ[D[°\d\¸]]\]´^p^Ä_$_ě`@`¤a a¨b bˆcctcźd dČe(eˆeđf\f´g8g„gŕhLhŕiHiĐj(j k k„kĐl@lÔm$mn nÄo$oppxpđqdqÄr4r”rČss„sœsŹsÄt0tHt`txtčuuu0uHu`uxuu¨uŔuŘuđvv v8vPvhv€v˜vÄväww@w|w¸wüx0xxxxŹxŘxüyy,yDy\yly„y”yŹzz(z@zXzźzÔzě{{{4{L{d{|{”{Ź{Ä{Ü{ô| |$|<| |Đ|ŕ|ř}d}|}ä}ü~~,~”~Ź~Ä~Ü~ô $<Tl„œ´Ěäü€€p€ˆ€ €¸€ĐLdŕř‚x‚‚¨ƒ(ƒ@ƒXƒpƒˆƒ ƒ¸ƒĐƒč„„„0„H„`„x„„¨… …t…Œ…¤…ź…Ô†(†@†˜†°‡‡ ‡8‡‡¨‡Ŕ‡Ř‡đˆˆ ˆ8ˆPˆhˆ€ˆ˜ˆ°ˆČˆŕˆř‰‰h‰ ‰Ř‰đŠ(Š@ŠxАЍЏŠĐŠč‹‹‹0‹H‹`‹x‹‹¨‹Ŕ‹Ř‹đŒŒ Œ8ŒtŒÔŒôpˆŽŽ Ž˜ްŽČ@Xpˆ ¸ĐčPä‘8‘P‘¤‘ź’’(’@’”’Ź’Ä’Ü’ô“ “$“<“T“l“„“œ“´“Ě“ä“ü”4”p”Ĕܕ4•L• •¸•Đ–(–@–X–p–ˆ– –¸–Đ–č———0—H—`—x——¨—ř˜|˜°™™`™x™ôš šŒš¤šźšÔšě›››4›L›d›|›”›Ź›Ä›Ü›ôœhœŔœŘ4L¨ŔŘž4žLždž|ž”žŹžÄžÜžôŸ Ÿ$Ÿ<ŸTŸlŸ„ŸœŸ´  $ ` ĚĄ8ĄœĄ´˘˘0˘˜˘°ŁŁ€٘Łü¤¤,¤˜¤ÔĽˆĽ ŚTŚl§$§<§đ¨¨ ¨8¨¤Š МŞŞ”ŞŹŞÄŤ@ŤXŤŘŤđŹŹ ʘŹü­d­|­ŕ­řŽ\ŽtŽÔŽäŽôŻ Ż$Ż<ŻTŻlŻ„ݜŻ´°4°´ą8ąŔąŘąđ˛˛ ˛8˛P˛h˛Üłˆ´´ ´œ´´ľ4ľLľľĚśś ś\śtś°śČˇˇˆˇ˜¸¸8¸˜¸Đ¸čššš0šHš`šxššŹšÔşş@ş„şÔşüť,ťhťŹťüź0ź|źŕ˝\˝đž ždžźż(ż¨żđŔHŔ€ÁÁđÂÂL€¸ĂĂäÄPÄ`ĨĹĹ0ĹŔĹäĆ Ć0ĆhĆxƈƘƨÇÇXÇčȤČÜÉÉXÉČĘ8ĘHʄĘČË$˘˨˸ËČĚĚ8ĚHĚp̀ĚÜĚěÍ ÍlÍčÎ8ÎhΘĎĎ8ĎTτϸĎŘĐĐ@ĐpĐĐьŃŘŇDŇlҰŇčÓhÓđÔXŐ0ՔŐüÖp×׏Ř<ŘĐŘôŮ(ŮÄÚXÚÜŰDۀ۸ÜÜ\ܨÜôÝpݘÝřŢ0޸ß4ߌß ß´ßČßÜßđŕŕ`ŕtŕˆáááXá”áüâ\âŕăpääDäˆĺĺ\ĺ”ĺÄĺđć,ć„ć¸ćřçç°č,čŒčđé éę ęČëëpëŘěPě”ěří íPíœířîdîĐîđďď8ďXď„ď´ďĚďäďüđđ,đDđ\đtđŒđ¤đźđÔđěńńń4ńLńdń|ń”ńŹńÄńÜńôň ň$ň<ňTňtň”ňŹňÄňÜňôó ó$ó<óTóló„óœó´óĚóäóüôô,ôDô\ôtôŒô¤ôźôÔôěőő$ő<őTőlő„őœő´őĚőäőüöö,öDö\ötöŒö¤öźöÔöě÷÷÷4÷T÷l÷„÷œ÷´÷Ě÷ä÷üřř,řDř\řtřŒř¤řźřÔřěůůů4ůTůtůŒů¤ůźůÔůěúúú4úLúdú|ú”úŹúÄúÜúôű ű$ű<űTűlű„űœű´űĚűäűüüü,üDü\ütüŒü¤üźüÔüěýýý4ýLýdý|ý”ýŹýÄýÜýôţ ţ$ţ<ţTţlţ„˙˙,˙D˙\˙t˙Œ˙¤˙ź˙Ô˙ě4Ld|”ŹÄÜô $<Tl„œ´Ěäü,D\tŒ¤źÔô $<Tl„œ´Ěäü,D\tŒŹÄÜô $<Tl„œ´Ěäü,D\tŒ¤źÔě4Ld|”ŹÄÜô $<Tl„œ¸Đě   8 P h € ˜ ° Č ä   4 P l „ œ ´ Ě ä ü  , H d € ˜ ´ Đ ě   8 P h € ˜ ° Č ä   4 P l ˆ ¤ ź Ô ě4Ld€˜´Đč0H`xŹÄŕü,D\tŒ¤źÔđ $@\x”ŹźÔäü $4L\t„œŹÄÜô $<Tl„œ´Ěäü,D\tŒ¤źÔě4Ld|”ŹÄÜô $<Tl„œ´Ěäü,D\tŒ¤źÔě,DTdÔäü,D\t źĚä0H`xˆ ¸Đč0H`x¨¸Đč0Hdt¨¸Čŕř(@\lˆ˜°Ŕ,,,,,,,,,,,,,,,,,Xh”Ŕě,D€źô  t Đ!,!`!¸"<"|"˜"Ŕ##T#l#l#l#l#l#l#l$ř&&(&@&`&|&”&´&Ř'H'ź'ě((„(˜(ř)X)„)¨)Ä* *<*l*„*œ*¸+$+\+Œ+ź+Đ,,,4,X,¸,Ě- -T-|-ź..,.h.Ě.ü/8/8/8/8/8/8/8/8/8/8/8/8/8/Œ/Đ0Ü1@1Đ1ř2¨343h3„3Ź3ä4 4”4¨4ź4Đ4ä4ř5 5 545H5\5p5„5˜5Ź5Ŕ5Ô5č5ü66$6˜7H7Ř88€99ˆ:l;<;č>`>¸@D@ŕAxB BxCCŹCĐCđDD@DxDźDôE´FŒGGHDHŕIxIˆIœI´JôKäL4LLđMœN0OOP PPRřS TTTÄUdV|WxX(Y@YčZˆZč[t[Č\\t\„\”]ˆ]ź]Ě]Ü^Ô_˜` `œadbDbpc´ddŹe<eČf@fˆfüg€hhˆh¸hüiPiŔiŕjj0j´kdll<l¤m<mŒmŹmĚměn n,nLnlnŒnŹnĚněo o$o4oLolo„o”oŹoĚoôp pp4pTpdptp„p”p¤pźpÜpôqqq<qdq|qŒq¤qÄqÔqäqôrrˆttätôuu´vdwwÄxäzz8zhz˜zČ{{`||°|ü}H}”}ŕ~(~t~°~ě°ě€@€ŔL‚‚Ôƒč„H„„Č……8…p…¨…ŕ†d†ä‡ ‡Œˆ4ˆÜ‰L‰ź‰äРЀŠđ‹‹8‹T‹p‹Œ‹ÔŒŒdŒŹŒČŒäLĚŽ4ŽtŽ´Žô4ě,lŹě‘,‘l‘Č’$’|’Ô““d“°“ü”8”t”¸”ü•<•|•ŕ–4–”–ô—`—ŕ˜4˜x˜ź™™ôššpš´šü›X›°œ œ|œ°œä4pžDžÜŸŸx 8 œ ĚĄ0ĄÔ˘(˘ŒŁ0Ł„ŁŹŁđ¤4¤Ě¤řĽ4ĽČĽŘĽěŚ8ŚLŚ\ŚźŚÔŚě§„¨<¨\¨€Š,ŠŘŠôŞ`ވŤLŤxŤ ŤŕŹ Źpʈʍ­tŽŹ°T°ôąź˛„˛¨˛Ě˛čłł,ł`łł°´´p´ěľ4ľ”ľôś`śČˇHˇź¸P¸ŕšÔştť$ź ź€źŘ˝”žž ž@ž`ž€ž¤žÄż żŒżÔŔŔXŔ¤ŔčÁČÂLÂŘĂdĂźÄĈĹŤĹěĆ,ƔĆřÇ@DŽČ ČxČĚÉ ɌÉřĘxĘđˤĚX̜ĚäÍpÍřÎ4ÎlÎŔĎĎ Đ,МŃ ŃPєŇŇlŇŔÓӌÔ ÔxÔäŐDŐ\ŐźŐüÖ@ÖtÖ¨ÖĐÖô×ŔŘtŮDÚÚ´ۜ܀Ý@ÝôŢDހŢäßßXß|ߤßČßěŕŕLŕ|ŕźŕřá<á˜áěâXâÜădă”ăŔăřä0äœĺĺXĺœĺŔĺôć,ć`ć´ćäçç<ç ččč<čpčÜé é`é éĚéüę`ę˜ęĐëTëŘěPěČí$íˆíŔíôî\îźďďhď ďŘđ,đ€ńń¨ňňxňÄóóˆôôˆőőhőŔö4ö¤öČöč÷ ÷0÷¤ř řdř|řđůPůÄú0ú¤ű űhűÜü@ütüěýýPý€ýŹýÄýäţ<ţ\ţ|ţœţźţä˙ ˙4˙\˙|˙ĐĚđ4TtĚ$p¨t,˜   , < L | Č  D ` ˜ Đ ě $ D ` „ ¨ Ä ä  p ¨ Ä ü T ˆ ¤ ř$ĚÜPxčě| |ôđ"X$Ä$ŕ$ü%%4%h% %Ř&&L&Œ&Ô' 'D'h'Œ'°'Ô'ř((@(`(„(¨(Ě(ě) ),)P)x) )Ě)ř* *P*|*¤*Ě*ô+ +L+t+¤+Đ+ř, ,L,x, ,Č,ô- -H-l-˜-Ä-ě..@.l.”.Ä.ř/,/`/”/Č/ü040l0¤0Ü11D1x1Ź1ŕ2202\2ˆ2°2Ř3303d33ź3đ44H4|4¨4Ô5585l5°5ŕ66T6ˆ6¸6ř7,7\7œ7ä8(8„8¸8đ9 9T9t99Đ9ě::$:@:\:x:”:°:Ô:ü; ;H;\;x;”;°;Ě;č<< <<$>ˆ>¤>Ŕ>Ü??h?€?˜@tA AČB8BŹCĚD´E EEĚFF0F\F„F°FŘGG0G\GŔH$H ILJŒKL,MŔN4P€R S€TTUXVpWLXLYdZ0[\\t]¤^$^Ô_œ`(`Řa bbđc¸d|dŹdŘee0e`eěff<ffäg g<glgŒgÜh,hXhˆhĐiiliźjjXj°kktllpl¸mmœnn¨oxpq0r\rčsHs¨sättLtttœt´tĚu$uxv<vüwřx¨yXzxz¸zř{T{{Ě||d|č|č|ü}},}@}\}x}œ}°}Ě}č~ ~(~L~p~œ~°~Ě~č (Lpœ¸Ü€€,€P€|€¨€Ü€đ (LhŒ°Üř‚‚@‚l‚‚ź‚čƒƒ8ƒ\ƒ€ƒŹƒĐƒü„(„\„€„Ź„Ř… …8…l… …Ü…đ† †(†L†h†Œ†°†Ü†ř‡‡@‡l‡‡ź‡čˆˆ8ˆ\ˆ€ˆŹˆĐˆü‰(‰\‰€‰Ź‰ŘŠ Š8ŠlŠ ŠÜŠř‹‹@‹l‹‹ź‹čŒŒ@ŒlŒ˜ŒĚŒř,`œŔěŽŽLŽxŽŹŽŕH|°ě \˜Üđ‘ ‘(‘L‘h‘Œ‘°‘Ü‘ř’’@’l’’ź’č““8“\“€“Ź“Đ“ü”(”\”€”Ź”Ř• •8•l• •Ü•ř––@–l––ź–č——@—l—˜—Ě—ř˜,˜`˜œ˜Ŕ˜ě™™L™x™Ź™ŕššHš|š°šě› ›\›˜›Ü›řœœ@œlœœźœč@l˜Ěřž,ž`žœžŔžěŸŸLŸxŸŹŸŕ  H | ° ěĄ Ą\Ą˜ĄÜ˘˘,˘X˘Œ˘¸˘ěŁ Ł\وŁźŁđ¤,¤`¤œ¤ŘĽĽHĽ|Ľ°ĽěŚ Ś\ژŚÜ§§L§ˆ§Ě¨¨L¨¨ÜŠ(ŠtŠźŞŞĚŤ”Źx­X­¤­ŕŽŽPŽ„ŽŹŽŕŻŻ4Ż|ŻÔ°”ąh˛L˛t˛ÜłXłÄ´pľľ„śś¨ˇLˇĐ¸h¸äšlšđşPş°şŔşüť4ťLťdť|ť”ťŹťÄź”˝`˝°žžÄż€żäŔ@ŔÄÁDÁÔÂdÂŔĂ$ÌĂđÄ,ÄhĀĘÄÜĹ$ĹlĹźĆ4ưÇDÇÜČ`ȨČěÉPɰĘĘXĘĐËDĚ$ÍÍÔΤÎđĎ8πĎČĐĐXĐ´ĐÜŃŃ,ŃXфѰŃÜŇŇLҀҸŇđÓ$ÓPÓ|Ó¨ÓĐÔÔ0Ô`ԐŐ<Ő`՜ŐŕÖÖ4Öp֔ÖĐ××X×ČŘ$Ů`ÚÚlÚ|ÚĚŰ ŰLۀŰ´ÜLܜÜÔÝ ݐÝđŢPŢxŢ ß ßlßčŕŕ0ŕ\ŕĐá˜â|ă$ăĚä„äÜäěäüĺ ĺććŒçç|č čÜéäęHę°ëëŘěDě°í íípî8îôďďDďTďÔđ0đĐńœňDó(óˆóŕôhő4ö÷÷p÷€řźů<ůLůůüúŔűüü@üźüÜüüýý<ýLýdý|ý”ýŹýÄýÜýôţ ţ$ţ<ţTţlţ„ţœţ´ţĚţäţü˙˙,˙D˙\˙t˙Œ˙¤˙ź˙Ô˙ě4Ld|”ŹÄÜô $<Tl„œ´Ěäü,D\tŒ¤źÔě4L\l|Œh0HŔ(x`źü<€ŔŘđ d Ř ř     d œ Ü T d Œ ´ Ü,T|¤Ěđ4X|œČô L`¤ü€ °ÜěP,´dŔTœth Lt¤ĐXÜ”8XxŔ<˜ě`œ¸!°$`$Ô%„&(&¨'ˆ(H(Č)Ŕ*Œ+4+Đ,€-H-`-”-Ź.$.|.¤.ŕ/ /`/˜/Č00T0l0„0œ0´0Ě0ä0ü11,1D1\1t1Œ1¤1ź1Ô1ě22242L2d2|2”2Ź2Ä2Ü2ô3 3$3<3T3´3Ě3ä3ü44,4D4\4t4Œ4¤4ź4Ô4ě55545L5d5|5”5Ź5Ä5Ü5ô6 6$6<6T6l6„6œ6´6Ě6ä6ü77,7D7\7t7Œ7¤7ź7Ô7ě88848L8d8|8”8¤9P9`9p9ˆ9 9¸9Đ9ŕ:X:p:ˆ:¸:ř;;;0;H;H;H;H;H;H;H;H;H;H;H;H;H;H;H;H;H;p;˜;ŕ<(<<>,>D>\>t>Œ>¤>ź>Ě???0?H?`?x??¨?Ŕ?Ř?đ@@ @8@P@h@€@˜@°@ŔATAźB@BXBpBˆB B°CC,CDCTC¨CŔCŘCčDźELEěFFF4FLF\G8GÄHhH€H˜H°HČHŘI\IČJLJdJ|J”JŹJźKDKœL,LDL\LtLŒL¤LźLÔLěMMM4MLM\N(N”OO,O OÔPP(PČQ8QČQŕQřRR(R8R°SlSüT T T°UTUlU„UœU´UĚUäUüVV,VDV˜WWWWWWWŒWÄWŕWüXX4XPXxX XĚXôYYHYpY˜YŔYčZZ<ZdZŒZ¸Zŕ[[0[X[€[Ź[Ô[ü\(\P\x\ \Č\đ]]D]l]˜]Ŕ]č^^8^`^Œ^´^Ü__0_X_€_¨_Đ_ü`$`L`x` `Č`đaa@ala”aźačbb8b`bˆb°bÜcc,cXc€c¨cĐcřd dLdtdœdČdđee@eŒffˆfČgggĚhh\hŒhči„j jXjĚkkpkÄl l°mLmÄn`nŘo@pp|p´qqTq r\rĐs\sřt”tŕuŹvv|v¸wwlwźxxx x0x@xPx`xpx€xx x°xŔxĐxŕxđyyy y0y@yPy`ypy€yy y°yŔyĐyŕyđzzz z0z@zPz`zpz€zz z°zŔzĐzŕzđ{{{ {0{@{Ź{ě||}}\}Ě~X~”pü€ €€,€<€L€\€l€|€Œ€œ€ŔŒ‚(‚řƒ „<„腅ꆆX†„†œ†Ŕ†đ‡ ‡D‡|‡řˆˆˆŘ‰tŠŠÜŠěŠü‹‹,‹|‹œ‹ź‹Ü‹ôŒ Œ$Œ<ŒTŒlŒ„ŒœŒ´ŒĚŒäŒü<\|Ž ŽlŽźŽŘŽô,Hd€œ¸Ôđ (D`|˜´Đě‘‘ ‘X‘p‘đܑô’ ’$’D’d’|’ŕ’đ“““(“T“ʓēܔ”X”t”Œ”¤”ź”Ԕ압•4•l•Ź•ä–t——¤˜ ˜|˜ä™™D™p™Ŕššdš°šü›D›ěœœ@œôžLžäŸˆ $ € äĄ@Ąœ˘˘\˘ÜŁ`Łä¤pĽĽ”ĽřŚdŚČ§l¨¨źŠ ЌŠđŞ|ŤŤœŤđŹLŹ ­­˜ŽޏŻh°°t°ŕąDąÜ˛€łłhłŔ´´„´üľpľôś|ˇˇPˇ¨ˇř¸P¸°šštščşTťťäź¨˝0˝źžDžXž|ž žÄžčż ż0żTżxżäŔ Ŕ\ŔČŔôÁÁ8Á\Á€Á Á´ÁČÁÜÁđÂÂ(Â<ÂPÂdˆœ°ÂÄÂŘÂüĂĂ$Ă8ĂTĂ|ZT+h ™h>˜2 ăů  : ` ƒ˛  (Z4;b ;Ż;Ĺ 0 Ë ď ţ " F m "Ž :Ä %: h:ř ;— ;ťCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. DejaVu changes are in public domain DejaVu SansDejaVu SansBookBookDejaVu SansDejaVu SansDejaVu SansDejaVu SansVersion 2.29Version 2.29DejaVuSansDejaVuSansDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr.Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr.http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/LicenseDejaVu SansDejaVu SansBookBook˙~ZZ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aŹŁ„…˝–膎‹Š¤ŠÚƒ“ň󍗈ĂŢńžŞőôö˘­ÉÇŽbcdËeČĘĎĚÍÎéfÓĐŃŻgđ‘ÖÔŐhëí‰jikmln oqprsutvwęxzy{}|¸Ą~€ěîşýţ    ˙ řů !"#$%&'()*+ú×,-./0123456789:âă;<=>?@ABCDEFGHI°ąJKLMNOPQRSűüäĺTUVWXYZ[\]^_`abcdefghiťjklmćçnopqrstuvwxyz{|}~€Ś‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛łŘá´ľśˇ¸šşťź˝žżŔÁÂĂŰÜÝŕŮßÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`Ÿabcdefghijklmnopqrstuv›wxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý˛ł Ţ ß ŕśˇÄ á´ľĹ â‚‡ ă ä ĺŤ ć ç č é ę ë ěĆ í î ď đ ń ň ó ôžż ő ö ÷ ř ů ú ű ü ýź ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H÷ I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚Œ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O˜ P Q R¨ S T U V W X Y Zš [™ď \ ] ^ _ ` a bĽ c d e’ f g h i j k l m n o p qœ r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ § Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś §”• ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWšXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ŔÁƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02C9uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02ECuni02EDuni02EEuni02F3uni02F7 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0351uni0352uni0353uni0357uni0358uni035Auni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni0520uni0521uni0522uni0523uni0524uni0525uni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni05B0uni05B1uni05B2uni05B3uni05B4uni05B5uni05B6uni05B7uni05B8uni05B9uni05BAuni05BBuni05BCuni05BDuni05BEuni05BFuni05C0uni05C1uni05C2uni05C3uni05C6uni05C7uni05D0uni05D1uni05D2uni05D3uni05D4uni05D5uni05D6uni05D7uni05D8uni05D9uni05DAuni05DBuni05DCuni05DDuni05DEuni05DFuni05E0uni05E1uni05E2uni05E3uni05E4uni05E5uni05E6uni05E7uni05E8uni05E9uni05EAuni05F0uni05F1uni05F2uni05F3uni05F4uni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni066Euni066Funi0674uni0679uni067Auni067Buni067Cuni067Duni067Euni067Funi0680uni0681uni0682uni0683uni0684uni0685uni0686uni0687uni0691uni0692uni0695uni0698uni06A1uni06A4uni06A6uni06A9uni06AFuni06B5uni06BAuni06BFuni06C6uni06CCuni06CEuni06D5uni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni07C0uni07C1uni07C2uni07C3uni07C4uni07C5uni07C6uni07C7uni07C8uni07C9uni07CAuni07CBuni07CCuni07CDuni07CEuni07CFuni07D0uni07D1uni07D2uni07D3uni07D4uni07D5uni07D6uni07D7uni07D8uni07D9uni07DAuni07DBuni07DCuni07DDuni07DEuni07DFuni07E0uni07E1uni07E2uni07E3uni07E4uni07E5uni07E6uni07E7uni07EBuni07ECuni07EDuni07EEuni07EFuni07F0uni07F1uni07F2uni07F3uni07F4uni07F5uni07F8uni07F9uni07FAuni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EBDuni0EC0uni0EC1uni0EC2uni0EC3uni0EC4uni0EC6uni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni0ED0uni0ED1uni0ED2uni0ED3uni0ED4uni0ED5uni0ED6uni0ED7uni0ED8uni0ED9uni0EDCuni0EDDuni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1401uni1402uni1403uni1404uni1405uni1406uni1407uni1409uni140Auni140Buni140Cuni140Duni140Euni140Funi1410uni1411uni1412uni1413uni1414uni1415uni1416uni1417uni1418uni1419uni141Auni141Buni141Duni141Euni141Funi1420uni1421uni1422uni1423uni1424uni1425uni1426uni1427uni1428uni1429uni142Auni142Buni142Cuni142Duni142Euni142Funi1430uni1431uni1432uni1433uni1434uni1435uni1437uni1438uni1439uni143Auni143Buni143Cuni143Duni143Euni143Funi1440uni1441uni1442uni1443uni1444uni1445uni1446uni1447uni1448uni1449uni144Auni144Cuni144Duni144Euni144Funi1450uni1451uni1452uni1454uni1455uni1456uni1457uni1458uni1459uni145Auni145Buni145Cuni145Duni145Euni145Funi1460uni1461uni1462uni1463uni1464uni1465uni1466uni1467uni1468uni1469uni146Auni146Buni146Cuni146Duni146Euni146Funi1470uni1471uni1472uni1473uni1474uni1475uni1476uni1477uni1478uni1479uni147Auni147Buni147Cuni147Duni147Euni147Funi1480uni1481uni1482uni1483uni1484uni1485uni1486uni1487uni1488uni1489uni148Auni148Buni148Cuni148Duni148Euni148Funi1490uni1491uni1492uni1493uni1494uni1495uni1496uni1497uni1498uni1499uni149Auni149Buni149Cuni149Duni149Euni149Funi14A0uni14A1uni14A2uni14A3uni14A4uni14A5uni14A6uni14A7uni14A8uni14A9uni14AAuni14ABuni14ACuni14ADuni14AEuni14AFuni14B0uni14B1uni14B2uni14B3uni14B4uni14B5uni14B6uni14B7uni14B8uni14B9uni14BAuni14BBuni14BCuni14BDuni14C0uni14C1uni14C2uni14C3uni14C4uni14C5uni14C6uni14C7uni14C8uni14C9uni14CAuni14CBuni14CCuni14CDuni14CEuni14CFuni14D0uni14D1uni14D2uni14D3uni14D4uni14D5uni14D6uni14D7uni14D8uni14D9uni14DAuni14DBuni14DCuni14DDuni14DEuni14DFuni14E0uni14E1uni14E2uni14E3uni14E4uni14E5uni14E6uni14E7uni14E8uni14E9uni14EAuni14ECuni14EDuni14EEuni14EFuni14F0uni14F1uni14F2uni14F3uni14F4uni14F5uni14F6uni14F7uni14F8uni14F9uni14FAuni14FBuni14FCuni14FDuni14FEuni14FFuni1500uni1501uni1502uni1503uni1504uni1505uni1506uni1507uni1510uni1511uni1512uni1513uni1514uni1515uni1516uni1517uni1518uni1519uni151Auni151Buni151Cuni151Duni151Euni151Funi1520uni1521uni1522uni1523uni1524uni1525uni1526uni1527uni1528uni1529uni152Auni152Buni152Cuni152Duni152Euni152Funi1530uni1531uni1532uni1533uni1534uni1535uni1536uni1537uni1538uni1539uni153Auni153Buni153Cuni153Duni153Euni1540uni1541uni1542uni1543uni1544uni1545uni1546uni1547uni1548uni1549uni154Auni154Buni154Cuni154Duni154Euni154Funi1550uni1552uni1553uni1554uni1555uni1556uni1557uni1558uni1559uni155Auni155Buni155Cuni155Duni155Euni155Funi1560uni1561uni1562uni1563uni1564uni1565uni1566uni1567uni1568uni1569uni156Auni1574uni1575uni1576uni1577uni1578uni1579uni157Auni157Buni157Cuni157Duni157Euni157Funi1580uni1581uni1582uni1583uni1584uni1585uni158Auni158Buni158Cuni158Duni158Euni158Funi1590uni1591uni1592uni1593uni1594uni1595uni1596uni15A0uni15A1uni15A2uni15A3uni15A4uni15A5uni15A6uni15A7uni15A8uni15A9uni15AAuni15ABuni15ACuni15ADuni15AEuni15AFuni15DEuni15E1uni1646uni1647uni166Euni166Funi1670uni1671uni1672uni1673uni1674uni1675uni1676uni1680uni1681uni1682uni1683uni1684uni1685uni1686uni1687uni1688uni1689uni168Auni168Buni168Cuni168Duni168Euni168Funi1690uni1691uni1692uni1693uni1694uni1695uni1696uni1697uni1698uni1699uni169Auni169Buni169Cuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20D0uni20D1uni20D6uni20D7uni20DBuni20DCuni20E1uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Buni210Cuni210Duni210Euni210Funi2110Ifrakturuni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211BRfrakturuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134alephuni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Buni214Eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2214uni2215uni2216 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2221uni2222uni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222Funi2230uni2231uni2232uni2233 thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni223Euni223Funi2240uni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22B0uni22B1uni22B2uni22B3uni22B4uni22B5uni22B6uni22B7uni22B8uni22B9uni22BAuni22BBuni22BCuni22BDuni22BEuni22BFuni22C0uni22C1uni22C2uni22C3uni22C4dotmathuni22C6uni22C7uni22C8uni22C9uni22CAuni22CBuni22CCuni22CDuni22CEuni22CFuni22D0uni22D1uni22D2uni22D3uni22D4uni22D5uni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni22F2uni22F3uni22F4uni22F5uni22F6uni22F7uni22F8uni22F9uni22FAuni22FBuni22FCuni22FDuni22FEuni22FFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2307uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2324uni2325uni2326uni2327uni2328uni232Buni232Cuni2373uni2374uni2375uni237Auni237Duni2387uni2394uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni23E3uni23E5uni2422uni2423uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni268Cuni268Duni268Euni268Funi2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26A2uni26A3uni26A4uni26A5uni26A6uni26A7uni26A8uni26A9uni26AAuni26ABuni26ACuni26ADuni26AEuni26AFuni26B0uni26B1uni26B2uni26B3uni26B4uni26B5uni26B6uni26B7uni26B8uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2780uni2781uni2782uni2783uni2784uni2785uni2786uni2787uni2788uni2789uni278Auni278Buni278Cuni278Duni278Euni278Funi2790uni2791uni2792uni2793uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27C5uni27C6uni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F0uni27F1uni27F2uni27F3uni27F4uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni27FDuni27FEuni27FFuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2906uni2907uni290Auni290Buni2940uni2941uni2983uni2984uni29CEuni29CFuni29D0uni29D1uni29D2uni29D3uni29D4uni29D5uni29EBuni29FAuni29FBuni2A00uni2A01uni2A02uni2A0Cuni2A0Duni2A0Euni2A0Funi2A10uni2A11uni2A12uni2A13uni2A14uni2A15uni2A16uni2A17uni2A18uni2A19uni2A1Auni2A1Buni2A1Cuni2A2Funi2A7Duni2A7Euni2A7Funi2A80uni2A81uni2A82uni2A83uni2A84uni2A85uni2A86uni2A87uni2A88uni2A89uni2A8Auni2A8Buni2A8Cuni2A8Duni2A8Euni2A8Funi2A90uni2A91uni2A92uni2A93uni2A94uni2A95uni2A96uni2A97uni2A98uni2A99uni2A9Auni2A9Buni2A9Cuni2A9Duni2A9Euni2A9Funi2AA0uni2AAEuni2AAFuni2AB0uni2AB1uni2AB2uni2AB3uni2AB4uni2AB5uni2AB6uni2AB7uni2AB8uni2AB9uni2ABAuni2AF9uni2AFAuni2B00uni2B01uni2B02uni2B03uni2B04uni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B0Euni2B0Funi2B10uni2B11uni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2B1Funi2B20uni2B21uni2B22uni2B23uni2B24uni2B53uni2B54uni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2E18uni2E22uni2E23uni2E24uni2E25uni2E2Euni4DC0uni4DC1uni4DC2uni4DC3uni4DC4uni4DC5uni4DC6uni4DC7uni4DC8uni4DC9uni4DCAuni4DCBuni4DCCuni4DCDuni4DCEuni4DCFuni4DD0uni4DD1uni4DD2uni4DD3uni4DD4uni4DD5uni4DD6uni4DD7uni4DD8uni4DD9uni4DDAuni4DDBuni4DDCuni4DDDuni4DDEuni4DDFuni4DE0uni4DE1uni4DE2uni4DE3uni4DE4uni4DE5uni4DE6uni4DE7uni4DE8uni4DE9uni4DEAuni4DEBuni4DECuni4DEDuni4DEEuni4DEFuni4DF0uni4DF1uni4DF2uni4DF3uni4DF4uni4DF5uni4DF6uni4DF7uni4DF8uni4DF9uni4DFAuni4DFBuni4DFCuni4DFDuni4DFEuni4DFFuniA644uniA645uniA646uniA647uniA64CuniA64DuniA650uniA651uniA654uniA655uniA656uniA657uniA662uniA663uniA664uniA665uniA666uniA667uniA668uniA669uniA66AuniA66BuniA66CuniA66DuniA66EuniA68AuniA68BuniA68CuniA68DuniA694uniA695uniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA726uniA727uniA728uniA729uniA72AuniA72BuniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA746uniA747uniA748uniA749uniA74AuniA74BuniA74EuniA74FuniA780uniA781uniA782uniA783uniA789uniA78AuniA78BuniA78CuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniF000uniF001uniF6C5uniFB00uniFB03uniFB04uniFB05uniFB06uniFB13uniFB14uniFB15uniFB16uniFB17uniFB1DuniFB1EuniFB1FuniFB20uniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29uniFB2AuniFB2BuniFB2CuniFB2DuniFB2EuniFB2FuniFB30uniFB31uniFB32uniFB33uniFB34uniFB35uniFB36uniFB38uniFB39uniFB3AuniFB3BuniFB3CuniFB3EuniFB40uniFB41uniFB43uniFB44uniFB46uniFB47uniFB48uniFB49uniFB4AuniFB4BuniFB4CuniFB4DuniFB4EuniFB4FuniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBD9uniFBDAuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE00uniFE01uniFE02uniFE03uniFE04uniFE05uniFE06uniFE07uniFE08uniFE09uniFE0AuniFE0BuniFE0CuniFE0DuniFE0EuniFE0FuniFE20uniFE21uniFE22uniFE23uniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D300u1D301u1D302u1D303u1D304u1D305u1D306u1D307u1D308u1D309u1D30Au1D30Bu1D30Cu1D30Du1D30Eu1D30Fu1D310u1D311u1D312u1D313u1D314u1D315u1D316u1D317u1D318u1D319u1D31Au1D31Bu1D31Cu1D31Du1D31Eu1D31Fu1D320u1D321u1D322u1D323u1D324u1D325u1D326u1D327u1D328u1D329u1D32Au1D32Bu1D32Cu1D32Du1D32Eu1D32Fu1D330u1D331u1D332u1D333u1D334u1D335u1D336u1D337u1D338u1D339u1D33Au1D33Bu1D33Cu1D33Du1D33Eu1D33Fu1D340u1D341u1D342u1D343u1D344u1D345u1D346u1D347u1D348u1D349u1D34Au1D34Bu1D34Cu1D34Du1D34Eu1D34Fu1D350u1D351u1D352u1D353u1D354u1D355u1D356u1D538u1D539u1D53Bu1D53Cu1D53Du1D53Eu1D540u1D541u1D542u1D543u1D544u1D546u1D54Au1D54Bu1D54Cu1D54Du1D54Eu1D54Fu1D550u1D552u1D553u1D554u1D555u1D556u1D557u1D558u1D559u1D55Au1D55Bu1D55Cu1D55Du1D55Eu1D55Fu1D560u1D561u1D562u1D563u1D564u1D565u1D566u1D567u1D568u1D569u1D56Au1D56Bu1D5A0u1D5A1u1D5A2u1D5A3u1D5A4u1D5A5u1D5A6u1D5A7u1D5A8u1D5A9u1D5AAu1D5ABu1D5ACu1D5ADu1D5AEu1D5AFu1D5B0u1D5B1u1D5B2u1D5B3u1D5B4u1D5B5u1D5B6u1D5B7u1D5B8u1D5B9u1D5BAu1D5BBu1D5BCu1D5BDu1D5BEu1D5BFu1D5C0u1D5C1u1D5C2u1D5C3u1D5C4u1D5C5u1D5C6u1D5C7u1D5C8u1D5C9u1D5CAu1D5CBu1D5CCu1D5CDu1D5CEu1D5CFu1D5D0u1D5D1u1D5D2u1D5D3u1D7D8u1D7D9u1D7DAu1D7DBu1D7DCu1D7DDu1D7DEu1D7DFu1D7E0u1D7E1u1D7E2u1D7E3u1D7E4u1D7E5u1D7E6u1D7E7u1D7E8u1D7E9u1D7EAu1D7EB dlLtcaronDieresisAcuteTildeGrave CircumflexCaron uni0311.caseBreve Dotaccent Hungarumlaut Doubleacute arabic_dot arabic_2dots arabic_3dotsarabic_3dots_aarabic_2dots_a arabic_4dots uni066E.fina uni066E.init uni066E.medi uni06A1.fina uni06A1.init uni06A1.medi uni066F.fina uni066F.init uni066F.medi uni06BA.init uni06BA.medi arabic_ring uni067C.fina uni067C.init uni067C.medi uni067D.fina uni067D.init uni067D.medi uni0681.fina uni0681.init uni0681.medi uni0682.fina uni0682.init uni0682.medi uni0685.fina uni0685.init uni0685.medi uni06BF.fina uni06BF.init uni06BF.mediarabic_gaf_barEng.altuni0268.dotlessuni029D.dotless uni03080304 uni03040308 uni03070304 uni03080301 uni03080300 uni03040301 uni03040300 uni03030304 uni0308030C uni03030308 uni030C0307 uni03030301 uni03020301 uni03020300 uni03020303 uni03060303 uni03060301 uni03060300 uni03060309 uni03020309 uni03010307 brailledotJ.alt uni0695.finauniFEAE.fina.longstart uni06B5.fina uni06B5.init uni06B5.medi uni06CE.fina uni06CE.init uni06CE.medi uni0692.final.alt uni06D5.finauni0478.monographuni0479.monographiogonek.dotlessuni2148.dotlessuni2149.dotlessuni1E2D.dotlessuni1ECB.dotlessdcoI.alt arrow.base uni0651064B uni0651064C uni064B0651 uni0651064E uni0651064F uni064E0651 uni0654064E uni0654064F uni07CA.fina uni07CA.medi uni07CA.init uni07CB.fina uni07CB.medi uni07CB.init uni07CC.fina uni07CC.medi uni07CC.init uni07CD.fina uni07CD.medi uni07CD.init uni07CE.fina uni07CE.medi uni07CE.init uni07CF.fina uni07CF.medi uni07CF.init uni07D0.fina uni07D0.medi uni07D0.init uni07D1.fina uni07D1.medi uni07D1.init uni07D2.fina uni07D2.medi uni07D2.init uni07D3.fina uni07D3.medi uni07D3.init uni07D4.fina uni07D4.medi uni07D4.init uni07D5.fina uni07D5.medi uni07D5.init uni07D6.fina uni07D6.medi uni07D6.init uni07D7.fina uni07D7.medi uni07D7.init uni07D8.fina uni07D8.medi uni07D8.init uni07D9.fina uni07D9.medi uni07D9.init uni07DA.fina uni07DA.medi uni07DA.init uni07DB.fina uni07DB.medi uni07DB.init uni07DC.fina uni07DC.medi uni07DC.init uni07DD.fina uni07DD.medi uni07DD.init uni07DE.fina uni07DE.medi uni07DE.init uni07DF.fina uni07DF.medi uni07DF.init uni07E0.fina uni07E0.medi uni07E0.init uni07E1.fina uni07E1.medi uni07E1.init uni07E2.fina uni07E2.medi uni07E2.init uni07E3.fina uni07E3.medi uni07E3.init uni07E4.fina uni07E4.medi uni07E4.init uni07E5.fina uni07E5.medi uni07E5.init uni07E6.fina uni07E6.medi uni07E6.init uni07E7.fina uni07E7.medi uni07E7.init Ringabove uni2630.alt uni2631.alt uni2632.alt uni2633.alt uni2634.alt uni2635.alt uni2636.alt uni2637.alt uni047E.diacuni048A.brevelessuni048B.brevelessy.alt uni02E5.5 uni02E6.5 uni02E7.5 uni02E8.5 uni02E9.5 uni02E5.4 uni02E6.4 uni02E7.4 uni02E8.4 uni02E9.4 uni02E5.3 uni02E6.3 uni02E7.3 uni02E8.3 uni02E9.3 uni02E5.2 uni02E6.2 uni02E7.2 uni02E8.2 uni02E9.2 uni02E5.1 uni02E6.1 uni02E7.1 uni02E8.1 uni02E9.1stem¸€@˙űţúů%ř2÷–öőţôţó%ňń–đ%ďŠAďţî–í–ěúëúęţé:čBçţć2ĺäSĺ–äŠAäSăâ/ăúâ/áţŕţß2ŢݖÜţŰÚ}ŮťŘţ֊AÖ}ŐÔGŐ}ÔGÓŇÓţŇŃţĐţĎţÎţ͖ĚËĚţËĘ2ÉţƅĆĹÄţĂţÂţÁţŔţżţžţ˝ţźţťţşš†%šţ¸ˇť¸ţˇś]ˇťˇ€śľ%ś]@˙ś@ľ%´ţł–˛ţąţ°ţŻţŽd­ŹŤ%ŹdŤŞŤ%ŞЊAŠú¨ţ§ţŚţĽ¤ţŁ˘Ł2˘Ąd ŠA –Ÿţž žţ œ›œd›š›š™ ˜ţ—– —ţ– •ŠA•–”“”(“’ú‘ť‘ţ]ť€Ž%]@Ž%ţŒ‹.Œţ‹.І%ŠA‰ˆ ‰ˆ ‡†%‡d†…†%…„ţƒ‚ƒţ‚ţ€ţţ@˙~}}~ţ}}|d{T{%zţyţxw v uţtúsúrúqúpţoţnţl!kţjBjSiţh}gBfţeţdţcţbţa:`ú^ ]ţ[ţZţYX YúX WW2VţUTUBTSSRQJQţP OţNMNţMLţKJKţJIJI IH GţF–E–DţC-CúBťAK@ţ?ţ>=>=<=<; <@˙; :ţ9ţ878ú76765 65 43 21 2ţ1 0/ 0 / .- .- ,2+*%+d*)*%)('%(A'%&% &% $ţ#ţ"!! dú d BţúBBţdţţţţBţ-B}dţ  ţ   ţ  ţ-ţdţ@-ţ-ţ¸d…++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++munin-2.0.25/master/DejaVuSansMono.ttf000066400000000000000000011624541243472346000176160ustar00rootroot00000000000000 FFTMOńpÉ,GDEFnSywHŽGPOS\†ř8ŞGSUBSUT:¤źOS/2ˆü‰˛?`Vcmap_ωU?¸zcvt é— U40fpgm[kßWdŹgaspX glyf薥őXĽ$headěś>łý@6hheaˇýx$hmtx ,rýœşlocaz„X1hmaxp˙ 1GŔ name`ééGŕ!postÍĐŠhřuprep:ÇŔŢÄ>‹îĹŮrmĹŮrm Ś„…–——˜žŸ ĄĽŚ§¨Ź­­Žśˇ˝žĂÄÄĹĹĆ$%kllmno|}     Ű Ü ă ä X °řarab&cyrl4dfltFgrekPlao \latnj˙˙ SRB ˙˙˙˙˙˙˙˙4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4˙˙mark mark,mark4mkmk:rtbdB &.6>FPX`RxŔš | ž„\4Ş4Ň7:" pýä#h&0  c"cŕ" ]j]jbj¸Ž $6HZl~ ŕP|H 0˙ŕŹ˙Ü ŕP|H <˙ˆP˙„ ¨, ýÜ T˙` ýÜ ŕP|H  ˙¤  Ü ă#hhhŔnĘ ěÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\XdýßÔ|d˙˛hţˆ0˙`t˙Xt˙XüýĚ ýĐ<ýˇ˙|˙Œ0ýŕ0ýěhţL ţ„(ţÜ ţŔT˙pl˙xýĚˆýĐ`˙x<˙D(ţDü˙dţ|t˙XLţ\8˙(PýÜ@ţ´@ýŕt˙Xt˙X4ýč`ýŕt˙Xdýě ýç4ýÜXýÜHýŕ.ýäýăÔ˙D5˙jT˙j`˙_ ţpiý¨Fý¨WýÚWýÚ…ý¨@ý¨TýÚQýÚXý¨:ý¨BýÚ`ýÚ‚˙jL˙j[˙›Z˙œ[˙jI˙jW˙œT˙œL˙j4˙jK˙œ]˙œÔ˙L”˙@ô˙jV˙jŕ˙8ˆ˙8ô˙jb˙jtý¨\ý¨Źţ Xţ Tý¨Hý¨„˙X˙Tý¨8ý§¸ýäXţ hý¨dý¨ÄýäXţ ôţ ôţ ôţ ôţ ?˙jĆ˙j,˙j,˙jT˙_î˙j,˙j,˙jT˙dT˙d¸˙d˙dLţp˜ţpOţ˘[ţ˘ŔdýŘĚýŘ˙€d˙Xd˙x°˙XdţhţhDţŒXţŒ,˙Ll˙„l˙„T˙p<˙„X˙|l˙„H˙€H˙|T˙týýţˆ ţlýý<˙„T˙pýý|˙€D˙\8˙\8˙\8˙\8˙\źýŔŒý˝źýŔœýź˜ţ Xţ,˙l˙d\ţ ţ,˙l,˙lxţDţ,˙l,˙lLţ ţ,˙l˙lđ˙lŘ˙lđ˙lĐ˙pđ˙lĐ˙hđ˙lÜ˙lzý×zý×ŕ˙“^˙zý×zý×’˙Ÿ^˙Ÿ^˙-d˙ž˙uj˙ŕţŕýš8˙j˙:˙KÚ˙QŘ˙˘˙]Xţmţţad˙‡j˙u˙uŹţŁF˙X˙'ţţUÂýĹ@˙L˙{R˙KR˙o°˙'ýŇLýéýŃ.ţ‘ý­’ýź:ţ‹Rţ…xýĐt˙XDýŘôýĐ4ýŕEýßţnPýÜ ţp ôôř4D"  K3 N Qo T Ws g gw n ox r Öz Ř Űß M Ră T Té V Wę#hhh¸ŽÎ $6HZl~ œh“5 œh[ œh›ö Tl+ú œhßÝ œhßÝ œhßÝ \hŸÝ Ü ă  !"$ &,28>DJPV]j]j]j]j]jbj]j]jh°|’ âĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú ˜„dtР̸h¨dü8 |Ô$ ô|`HĐLŔDü˜ \đÜt@¸4Hč¸ěÔœ(|ôXTü„œřđĚÄ˜(řlđđtźŹ<˜0źÚxŽx_`Ÿ ičFčWčWč…č@čTčTč[č:čBč`č‚LLL[Z[IŻWTLâ4âKŞ]ސl8ôô@^Ş  äô@bŞŇčşčŹčXč˛čŚč„čXč˛č–ç¸čXčĆčÂčÄčXčoMźâŞż˜ń!Tą˙ńŒxóxú¤ú¤T€T€¸€€Ě&”~Oč[č°¸ ŘXŕŒPXD€Řô,aDf\ŘPčh<č Č\œČ\Ř\ô0,Ä0ŕ@đ, d `ř€Ô|tL`0ܤȰ0€„Ü@Ř\ ŕÜ Ź¸T`@´”L8ˆ4Ρ5ŢóĹD´80H <DŒÜ<Č˜xˆ(LĐX$TÔtđŘŔÜčÜŔäěôĐäđčČŕ„0¨TÄLh„„0Řp€Lh<řpřřʏl$dŹ`Ô0œh8<ŕ÷ď PČLdhźŒŘx„8„T´äˆ‡R m$vęˆ2zŻ`îƒM;)üRŚDhp_)I R|Ôo~ę4Ôćôôö÷ů>>#AD$  K( N Qd T Wh g gl j mm p Űq M MÝ R RŢ T Tß V Wŕ  !"$ &,28>DJPV]j]j]j]j]jbj]j]jh°Ć&Ě  &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöüDhłxzOšâhšDšäh*hDhhhh“DhšĆhĐhvhhţVžhšţYDxžhţVÂţVĆhxhhsDţVhDDDDDDzzzzhhhh6ähhhhhhhhhhh46ĆĆĆĆĆĆvvvvhhhhhžhhhhhhhhhhţVţVţVDDĆłłĐłĐłĐ6h6hzvzvzvzvšhţVšhţVšhţVhţVâžâžhhhhhhhhššţYDšxšxšxšxäžäž9hţVhţVhhhhhhDĆDĆhhhhhhhxhxhhhhhhhhhh“shţVhšhšhšhhhhhhhh łĐ66hhhţVVhł"ţVhţVšhţVhhhDDxäžţVhů˙hXţVŇţVjţřhhhhDĆD¤ţVh$=D]‚‡4Š˜:š§I޸WşÂfÄĹoČČqĘŮrÜă‚ĺďŠňó•ö÷—úü™˙œ ¤Żą"#ˇ&3š6kÇńńýóôţ ĺ ć ě ěŹ|4pb °ÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô ú     $ * 0 6 < B H N T Z ` f l r x ~ „ Š  – œ ˘ ¨ Ž ´ ş Ŕ Ć Ě Ň Ř Ţ ä ę đ ö ü      & , 2 8 > D J P V \ b h n t z € † Œ ’ ˜ ž ¤ Ş ° ś ź Â Č Î Ô Ú ŕ ć ě ň ř ţ     " ( . 4 : @ F L R X ^ d j p v | ‚ ˆ Ž ” š   Ś Ź ˛ ¸ ž Ä Ę Đ Ö Ü â č î ô ú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹ˛¸žÄĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđöü &,28>DJPV\bhntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^hŐhhŐhłŐł6Ő6zŐzžŐžšŐšhŐhhŐhšŐšhŐhšŐšhŐhhŐhhŐhhŐhhŐh6Ő6hŐhhŐhhŐhhŐhhŐhhŐhhŐhšŐšh`hhhł`łhhv`vhhh`hţVhhhhţVšš22h`hh`hh`hh`hţVh`hţVh`hh`hhhh`hh`hh`hh`hh`hţVh`hhhhhhhzŐzłŐzzzzhhhh6Ő6hhhhhhhŐhhhhhh6Ő66Ő6hhhhhhh`hł`vvvvhhhhhhhhhhhh`hhhhhhţVhhţVhţVhhhhŐh`łłłłłłł6h6Ő6hhzvzvzvzŐv`zvšhţVšhţVšhţVšŐhţVhhhŐhhhhhhhhhhŐhh`hšhţVhŐšš`šš2šŐ2š2šŐš22šŐš22hhhŐh`hhăhŐhţVh`hţVhhhhhhhŐhh`h6h6Őh`6h`hhhhhhŐh`hhhŐhhhhŐhhhhhhhhhhhhhhŐh`hhhhţVhšhšhšhhhhhhŐhhŐhhhhŐhhh Ő łŐłł`ł6Ő66Ő6hŐhhhh`hţVVŐVhŐhłŐłŐţVhhţVšŐšhŐhţVhhhŐhhŐhhŐhšš22hhhŐhhŐhţVh`hţVhŐhůŐů˙`˙hŐhh`hţVěŐěh`hţV6Ő6ţVhŐhh`hhŐhhŐhh`hţVhŐh6Ő6h`hh`hh`hh`hŒŒ)`)ł`łYYhhv`vv`vš`šv`vZ`Zr`rv`vą`ąţV>>ţVh`hţV•`•n`nţVh`hh`hţVooooţVD`Dh`h88PP>>ţVh`hh`hţVh`hţVś`śţVüf&ţVh`hh`hh`hh`hhhţVh`hhh6`6ţVh`hţVh`hţVc`ch`h``h`hţVssţVssţVx`xţVssţV¤`¤ţVhhţVh`hh`hh`hh`hh`hhhh`h`ţVh`h˙Žh`hţVh`hţV$$ŞŞ$$h`h ` >`>h`hh`hţVh`hhhţV$$ŞŞh`hh`h`h`v`h`h`h`h`h`h`h`h`h`h`ł`h`h`hh`h`h`h`h`h`h`h`5`h`h`ł`h`'đ'}{}hŕhœRŕRœEŕEœ^ŕ^œrŕrœŕœhŕhœhŕhœźŕźœ?ŕ?œaŕaœiŕiœhŕhœhŕhœhŕhœGŕGœŕœhŕhœhŕhœhŕhœ6Ő\œađadâd5đ5gđ'eâe`â`6Ő6ţLhŐ¤ţViŐihhh`hhŐ $=D]‚˜4š¸KşÂjÄČsĘđxňóŸökĄŃŃććńńó 4;9=AaCGffnkp…tЋЖ—ŒłłŽľÇ˘ÜÜŁ¤ĽŚŠ ĺ çŞ ë ě­ J JŻ…–˜žĄĽ¨ŤŽś"žĂ+ĹĹ12ĘĐÖÜâčîôú $*06<BHNTZ`flrx~„А–œ˘¨Ž´şŔĆĚŇŘŢäęđh`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`hhhhhhhhhhhhhhhhhhhhhhhhhhh`h`h`ű/…–˜žĄĽ¨śžĂ-ĹĹ3ČžŘ ntz€†Œ’˜ž¤Ş°śźÂČÎÔÚŕćěňřţ "(.4:@FLRX^djpv|‚ˆŽ”š ŚŹŃŃ ŃŃ ŃŃ ŃţŃ ŃŃ ŃţŃ ŃŃ ŃŃ ŃŃ ŃţŃ ŃŃ ŃŃ ŃŃ ŃŇŃŃ ŃŇŃŃ ŃŇŃŃ ŃŃŃŃ ŃŃ ŃŃ ŃŃ ŃŃ ŃŃ ŃŃ Oillo|>DJPV\bhntz€†Œ’˙÷tŃwŃwŃwŃwŃŃŃtŃŃ`Ń~Ń~Ń`Ń~Ń`ű/llo| ÖParab&cyrl:dfltVgrek`lao llatnv˙˙ SRB ˙˙˙˙˙˙˙˙˙˙4ISM >KSM >LSM >MOL JNSM >ROM JSKS >SSM >˙˙˙˙˙˙ ccmp>dligDfinaJinitPligaVlocl\loclbloclhmedinrligt   (08@HPX`hXjnö ú ~ ţ ~ œÚňÉĘËĚ !$% > $$XLMLM…š›žĄĽ¨¸žÁÂĹČČ&   Śgp5 i k m o q u w { }  … ‰  ‘ “ • — ™  Ą Ľ Š ­ ą ľ š ˝ Á Ĺ É Í Ń Ő × Ů %    !  5 1 9 = C A ) E I O U Mő 4D# U U4T' s y  ƒ ‡ ‹  › Ÿ Ł § Ť Ż ł ˇ ť ż Ă Ç Ë Ď Ó S Ű '    #  7 3 ; ? + G K Q Wůůűűý 4=@D"T' r x ~ ‚ † Š Ž š ž ˘ Ś Ş Ž ˛ ś ş ž Â Ć Ę Î Ň R Ú &    "  6 2 : > * F J P Vůůűűý 4=@D"  â u ă u Ć Ç> $ ŕ o Ţ k Ü i á o ß k Ý i Ć Ç O LI óćLMѐ3™3™×f  ć"˙Ňůű(PfEd@ ˙˙ţšmă`ß˙ß,äp, ä¸ęę~Ăăđöů!AEMšÁÉÍÓŢéîó?CXauz~ŠŒĄÎá_s›ŁłťÄČĚů  :UZmt{€„‡‘˜¤ŠŻžĚů‚„ˆŠ—ŸŁĽ§ŤšźÍü .<[ex{…ˇż-Kcw™›Ą­ąš˝ÇÍÝĺëőůEMWY[]}´ÄÓŰďôţ  # & 7 : > I _ q Ž ” ľ!!!!!!!"!$!&!+!.!_" """" "-"="i"‹"’"Ą"Ć"Í"é"ď####!#(#+#5#>#D#I#M#P#T#\#`#e#i#p#z#}#ƒ#‹#•#Ž#Ď$#&/&‹&œ&Ą&ą'' '''K'M'R'V'^'u'”'Ż'ž'Ć'ŕ'é)ë)ű*/+,d,o,w,z,}..%..§§§ŒöĹűűű•űŸű­űéű˙ţtţüţ˙˙ý˙˙  Íćôřü$DLPťĆĚĐÖŕîóCXatz~„ŒŽŁĐđr˘ŞşŔÇËĎ  !@Z`ty~ƒ†‘˜¤ŠŻžĚđ„‡Š”™ĄĽ§Ş­ťČĐ,0>bw{…›š0Th|›ŸŹ°śźĆĘŘŕčîř HPY[]_€śĆÖÝňö   & / 9 < E _ p t   !!! !!!!"!$!&!*!.!S!"""""'"8"A"m""•"Ĺ"Í"Ú"ď#####%#+#5#7#A#G#K#P#R#W#^#c#h#k#s#}#€#ˆ#•#›#Î$#%&8&& &°''' ')'M'O'V'X'a'”'˜'ą'Ĺ'ŕ'č)ë)ú*/+,d,n,u,y,|.."..§§§‰öĹűűRűŠűžűŞűčűüţpţvţ˙˙ů˙˙˙ă˙Â˙š˙ˇ˙´˙ł˙ą˙Ż˙­˙§˙Ľ˙¤˙ ˙ž˙œ˙š˙™˙•˙‘˙…˙‚˙n˙f˙T˙P˙M˙H˙G˙F˙E˙D˙6˙$˙˙ţüţöţňţđţîţěţÖţÎýćýĺýäýÜý×ýÔýÓýÎýĘýĹýżýťýšýˇýśý­ý§ýœý˜ý“ý…ýxýUőÎőÍőËőĘőČőÂőÁőŔőżőžőźőťőşőŻó­ç¨çŁç™ç˜ç“ç‡ç†ç…ççnçlçcçNçMç ç çć˙ćűć÷ćöćóćéćçćăćáćŮć×ćÍćËćÉćÇćĹćżć˝ćťćšćˇćśćľć´ćłćąć°ćŻć­ćŹćŞćŠć¨ćŁć˘ć ć˜ć—ć–ćć{ćkćićhć]ććććććĺüĺűĺúĺ÷ĺőĺŃĺĄĺ ĺŸĺžĺĺ—ĺĺŠĺ‡ĺ„ĺ‚ĺ_ĺYĺMĺHĺ8ĺ7ĺ5ĺ3ĺ0ĺ.ĺ%ĺ$ĺ"ĺ ĺĺĺĺĺĺĺĺĺĺĺĺ ĺäüäÝäŠăŽăŚă˘ăŸă‘ăBăAă?ă>ă=ă<ă9ă8ă6ăăăăâőâîŕíŕßŕŹßĘށŢxŢsŢrŢqÜ×ÜÎÜĆcícéc€H žśŽ¤jX č ç ĺ ě Œő ~ ĂbÍă†ćđôö¨řůŤü!­$AÓDEńLMóPšőťÁ_ĆÉfĚÍjĐÓlÖŢpŕéyîîƒóó„?…CCĹXXĆaaÇtuČzzĘ~~Ë„ŠĚŒŒÓŽĄÔŁÎčĐáđ_&rs–›˜˘Ł¤ŞłŚşť°ŔIJÇȡËĚšĎůťćčě  î  đńňó!:ô@UZZ$`m%tt3y{4~€7ƒ„:†‡<‘‘>˜˜?¤¤@ŠŠAŻŻBžžCĚĚDđůE‚O„„Q‡ˆRŠŠTU”—V™ŸZĄŁaĽĽd§§eŞŤf­šhťźuČÍwĐü}Ş Ť­Ž°,.ł0<ś>[Ăbeáwxĺ{{煅蛡隿 -!0K7TcShwc|™s››‘ŸĄ’Ź­•°ą—śš™ź˝ĆÇŸĘÍĄŘÝĽŕĺŤčëąîőľřů˝żŐ EŰHMPWYY[[]]_}€´1śÄfĆÓuÖŰƒÝď‰ňôœöţŸ ¨  ł  #š & &Ć / 7Ç 9 :Đ < >Ň E IŐ _ _Ú p qŰ t ŽÝ  ”ř   ľý!!!!! !!!!!!!!"!"!$!$!&!& !*!+!!.!.#!S!_$!" 1""Ż""°""ł"" ´"'"-ž"8"=Ĺ"A"iË"m"‹ô""’"•"Ą"Ĺ"Ć$"Í"Í&"Ú"é'"ď"ď7##8##?##M##!O#%#(U#+#+Y#5#5Z#7#>[#A#Dc#G#Ig#K#Mj#P#Pm#R#Tn#W#\q#^#`w#c#ez#h#i}#k#p#s#z…#}#}#€#ƒŽ#ˆ#‹’#•#•–#›#Ž—#Î#ĎŤ$#$#­%&/Ž&8&‹ Ţ&&œ 2& &Ą ?&°&ą A'' C'' G' '' K')'K g'M'M Š'O'R ‹'V'V 'X'^ 'a'u —'”'” Ź'˜'Ż ­'ą'ž Ĺ'Ĺ'Ć Ó'ŕ'ŕ Ő'č'é Ö)ë)ë Ř)ú)ű Ů*/*/ Ű++ Ü,d,d ĺ,n,o ć,u,w č,y,z ë,|,} í.. ď.".% đ.... ô§§ ő§§ §‰§Œ öĹöĹ űű űRű űŠű• @űžűŸ LűŞű­ Nűčűé Rűüű˙ Tţpţt Xţvţü ]ţ˙ţ˙ ä˙ů˙ý ĺÖpÖŁ ę×ö×˙    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜žŁ˘¤ŚĽ§ŠŤŞŹ­ŻŽ°ąłľ´ś¸ˇźť˝žÂrdeiÄxĄpkvj戚ťsîďgwٰŻÂl|cnˇTҧm}Ćb‚…—śˇžżşťš xÁ: ĐŃ  ĂyźŔȄŒƒŠ‘Ž•–”œ›ófvqrstzwug¸Ë¸ËŞ‘¸f¸‡¸ĂË˸¸Ë‰şËŚü˃ň Ç7ƒžX!ˏœçuźÓÉŰuç9şËÓ!߸‰ž‰Ăž{žXm¤Ž{¸o{¸RÍŃ͇‡“¤oÍ˸ƒ‘Ý´‹ô˜éZ´şĹ!ţŐöŞ=f‹ĹššƒŐs ţáŐ+¤´œbœŐ˜‡ŐŐđ¤¸#Ӹˌź1NÓ {T\qŰ…#wé`jĎՏ#fy```{{w`Şébř{!Ŝ{´RNNŃfœœfœfœÍúƒ‘ţHF?{L˜˘'oo5jo{ŞŞ-–{öŞ3=œf‹öÍoD7fî…´}sŐˇ, °%Id°@QX ČY!-,°%Id°@QX ČY!-,  °P° y ¸˙˙PXY°°%°%#á °P° y ¸˙˙PXY°°%á-,KPX ¸EDY!-,°%E`D-,KSX°%°%EDY!!-,ED-,°%°%I°%°%I`° ch ŠŠ#:Še:-˙˙hţ–h¤źśƒ/ÄÔě1ÔěÔě0!%!!hüsüĺţ–řňr)ĎŐ @‡†ˆ Ô<ě2991/äüě03#3#ËĄËËŐýqţ›eý¸ţRŞŐ@‰ˆÔěÜě1ô<ě20###ŽŃŽŐýŐ+ýŐ+ÍžJ@0Œ Œ    ÔĚ91/<Ô<<ü<<Ô<<Ä2ě220333!3!###!5!!5!#3Źhői iôţçTúţßh iöiŸhţţ)Tţö/hőTöžţaŸţašţ˛™ţbžţbž™NšŸýÇţ˛žţÓZ /d@9($)%/%‹$Ž(‹Ž!$, ( 0Ô<ě2ü<ěüäî1/Ć2ÄîöîîĆöî99990>54&'#.'5.546753.'´n|pŢhumÔdfÉbdËcČĘÓżdO˘TUĄPÎŘéźDţNtd]gѝp^VdűŔ-.)´>BĘś–ťëë­+/ţQššÎ !°˜ *9V@/7(" ’"’7“(’.‘“’+  % 4  + :ÄÔěüěîţî99991/îîöîţîî9999032654&#"4632#"&'%32654&#"4632#"&¸iNMklLNi‡¸†@s..2ş‡ˆśţH#)üiOMllMMk‡¸‡@u--1ş†‡¸?NjkMMljO‡š0./t?…şˇ`˘`ĺOikMMkjN‡š0--uA†š¸9˙ăĹđ*7ł@b  -,.+2345617B7 1 +"1—"!%—–™ (! 7+!(!(! .8ÜěÄüÄĆîî99999991/ĆäöîÖÎî9990KSXí9í9íí9Y" >54/3#'#"5467.54632.#"3267>7# '&¤JKŞŐNSşjŘţ抋20Ç­AƒF;}Eap:6\[ț*\,#‹ýŃ1–h F'ĄóXĺmFD ̉ędHŠG–ގ'%[M;ĎIŁ\—Ç ŞžŐˇˆÔě1ôÄ0#žŽŐýŐ+Şţňu @œ›  Ôě2ě991üě0#&547u…ƒƒ… —””—äţ;ćĺţ:ćîĂŕßÄě\ţň' @œ›  Ôüě2991üě03#654\ —””— …ƒƒěţ<ßáţ<ěčĆăäĆŚJ+đN@,    –    Ô<ě2Ü<ě2991ôÔ<ě2Äě2990 %#'-73%+ţšf9ţ°sţ°9fţš9PsPßÂĂbËţ‡yËbĂÂcËyţ‡ËXqy“ '@Ą  Ą   Ô<ěü<ě1Ô<ěü<ě0!!#!5!ź˝ţC¨ţDź“ţDŞţDźŞź“ţáň/@ Ł˘ÔěÔĚ1üě03#öüŚc/Ďţdßmƒś ÔÄ1Ôě0!!d ý÷ƒ¤éĺ1ś˘Ôě1/ě03#éüü1ţĎf˙B7Ő@ ˆÔěÔě1ôÄ03#yžüîżŐům…˙ăLđ # @Ľ — —–™$!"!$üěěÔěî1äôěîÔî0@Ö////////// / / ?????????? ? ? OOOO O ____ _ ŸŸŸŸŸŸŸŸŸŸ Ÿ Ÿ ŻŻŻŻŻŻŻŻŻŻ Ż Ż żżżżżżżżżż ż ż F////////// / / __________ _ _ żżżżżżżżżż ż ż $]]4632#"&"32'2#"ăM68PO98K…‹‹Ž‹‹Žďőőďďôôî7PP78NLœţĐţÉţĘţĐ0670 ţxţţ‚ţxˆ~ˆöFŐ &@——ˆ— ## ÔěÄüě1/ě2ôěÔě0%!5%3!!:ţŽPĘ6üČŞuL¸JúŐŞ˜#đQ@)%%B§ —–—  "$üÄüěŔŔ91/ě2ôěôĚ0KSXí9í2Y"%!!567>54&#"5>32uŽüuť5dF“€[ČpgÇaŰ Yd8ŐŞŞŞĹ.>z—O}ŽBCĚ12é˝`ŔtAć‰˙ă7đ(G@)— ‹ Ś —‹ Ś—#–™Š)&" )üÄÄüěÔě91ěäôěôěîöîî90#"&'532654&+532654&#"5>32“œţëőgÖgfĆbڞ˛˜šš‹œ‘†Yžhy˝IÚ‰'ǕÎë&$É54–‚™Śzms{((ş Űľ{¤foŐ B@   B —ˆ   $üüÔ<ě291/äÔ<ě290KSXÉÉY" !33##!5ßţ)×!ęÇÇÉý‡üëÍü3¤ţœdż˙ă-Ő=@"—‹Ž— —ˆ ™Ş "üÄüÄěî1ääôěîöîţÄ90!!>32#"&'532654&#"ĎôýÄ+W,čţă÷wĹN\şa§ľť§QšFŐŞţ‘ţîęěţđ Í21°˘ ˛%%…˙ăLđ$=@#— — Ť‹Ž—–™%"& "%üěěüäě1äôěôěĺîî90.#">32# !2"32654&ß?ŽMŔĆ0ŞnŘíôÝţüň#J”ţ݁””†ˆˆ´ş%'ţßţçdkţ÷óňţöu‘zýlş¤¤şą­Ž°‹7Ő5@%%B—ˆ"üěÄ991/ôě0KSXííY"!#!‹ŹýęÓý5ŐVú+ƒ˙ăNđ #/C@% —'—-—–™'Š0 $*$ "!0üÄěüÄěîî991ěäôěîî990"32654&%.54632#"$54632654&#"h‡“•…ˆ“•ţʁ‘ňĐŃň‘–Ÿţţääţ˙ŸM€yz€{y€ŗŠŠ™—Œ‰˜T!´˛ŃѲ´!!ȟĘäăÉ Ébx~~xz€˙ăFđ $;@"—Ť ‹ Ž—"—–"™%"  &%üäěüěě1äôěîöîőî902654&#"532#"543 !"&T““†ˆ‡á?ŽMŔĹ/ŞnŘíóŢňţÝţëI”–ş¤¤şą­Ž°ý‰ş%'!dk ôń ţŠţoţ‡ţséĺ'@ ˘Ź˘Ô<ě21/ěôě03#3#éüüüü'ţŃţ9ţĎ“ţáň' %@˘Ł˘Ź  ÔüÔüÔĚ1äüěî03#3#öüŚc üü/ĎţÇţŃXyw!@Ž­('üě291ôě90 5yüŽRűß!ÁţŔţᢌ˘X`y˘@   Ô<Ä21ÔěÔě0!!!!X!űß!űß ŹBŞXyw!@Ž­('ü<ě91ôě9055X!űßRÁśţ^Śţ^ˇ=ôđ"{@B  %%B‹ —–†!    ) #ÔěÄÔÔěî99991/îöţôîÍ9990KSXí9í9Y"#546?>54&#"5>323#Źž=TZ>/ƒmN˛b^żhşÝC^XE&ĹËË‘šb‰RY;X1YnEDź98ŔĄLƒ\VBT=/ţňţţÁšs 4p@1(+$ 4Ż Ż '$Ż+Ż1+5' ( + . !+ -.5ÜěüÄţ<Äî991ÄÔüÄţÄŐÄîî999990@ €€€€€€]4&#"326#5#"&5463254&#"!267# !2€kkkk€Œ%ƒRĄÓÓĄP†$°‘öţÝJ6l90?{:ţ›ţ]x<Ńú!››‚››ţčo?DňźźňF=?œžţţšţˇţz‡ŇŒ†Îţöŕ%ŹŐ ˜@A%%%% % % %  % B—°ˆ   / Üě91/<äüě90KSXííííííííY"˛]@    †‰]]!3#!#hŐŞţąőÉŃnýőlŃ#ýŽú+…ţ{ŚqŐ =@#— —ˆ— ą 21 0!üě2üěÔě9991/ěěôěî9032654&#32654&#%!2)qﰖž¨ď뒃”ţJşĺřƒƒ“§ţöţůţFÉýÝ{’‰fţ>p}qdŚĆľ‰žĎ ËĎ‹˙ă1đ.@ł˛— ł ˛— –™2 10üě2ě1äôěôěîöî0%# !2.#"32671M˘[ţáţĂ?[˘MJŞVĹÄÄĹXŠI5))–pn™))Ď=@ţĐţÍţÎţĐ@=‰RŐ(@— ˆ— 2 10üěüě99991/ěôě0% 6&!# )´˙ĘÉ˙`dVDţźţŞţŃŚűHKűűw/ţ”ţ€ţ‚ţ•ŐĹNŐ )@——ˆ—ą  13 üě2üÄÄ1/ěěôěî0!!!!!!ĹvýTŽýrżüwŐŞţFŞýăŞéXŐ $@——ˆą14 üě2üÄ1/ěôěî0!!!!#éoý\eý›ËŐŞţHŞý7f˙ăPđ<@!—— ł ˛— –™ 625üěüÄüÄ1äôěôěţÔî990%# !2.#"3267#5!PQËvţäţÄ@^ŹPQŞ_ĹĹżĆCe)Ůš{KM—on™56ĎMIţĎţÎţÉţŐ!‘ډHŐ &@—ąˆ 1 0 üě2üě21/<ä2üě03!3#!#‰Ë)ËËý×ËŐýœdú+Çý9ÉŐ %@ —ˆ—77 Ôě2üě21/ě2ôě20!!!!5!!É=ţÇ9üĂ9ţÇŐŞűŞŞm˙ăźŐ,@ ˛—— ˆ™  5üÔüÄ1äôěîöÎ990753265!5!#"&m[ÂhqţƒGÓ÷`ž=ěQQ•ËDŞüţćę,‰ÉŐ —@!% %B´  0 üě2Ŕ91/<ě290KSXííY"˛]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##‰ËwíýťVôţšËŐýh˜ýžüě¤ý¸×sŐ@ —ˆ14üěě1/äě03!!×ËŃüdŐúŐŞVyŐ …@,  B ´   / 0 üěüě91/<ě2Ä90KSXÉÉÉÉY"˛ ]@$  &)&) 6968  ]]! !###Vťţö™ţőşŐýřú+'üíúŮ‹FŐ m@B´10 üěüě991/<ě2990KSXÉÉY"˛]@&)&8Wdjuz &)FIWgh]]!3!#‹řĂ˙ţĂŐű3Íú+Íű3u˙ă\đ #@ ——–™2 625üěüě1äôěî0#"32#"32‰‡š™‡‡™š‡Ó÷ýýö÷üý÷éIţćţˇţ¸ţćIţzţ€~ˆ‡€ţ€ĹuŐ+@—— ˆ 2 8 3üě2üě91/ôěÔě032654&#%!2+#ęŒœţL´úţ˙űęĘ/ýϔ……“ŚăŰÝâý¨uţň\đ=@ —— –™ 2 625üěüě99991Ääôěî9990"#"32#"32ú÷÷üý÷‰‹Č—‡š™‡‡™š‡€†‡€ţ€ţyţÚţ™Hžd÷Iţćţˇţ¸ţćŃŐj@8  %%B— — ˆ    21  0üě2üÄě99991/<ôěÔě9990KSXíí9Y"#.+#!232654&#řNnRËٲM{cÁË öĄýĐݑŽ—ÁoŚţhyĄ]ý‰ŐŢҔťYý‰‹˙ăJđ'„@=  %  %B ł§—ł§—%–™( &919"0(üěÄüěä99991äôěôěîöî90KSXí9í9Y"˛]@ ]].#"#"&'532654&/.54$32ô\š^Śm•jŇŔţřüiÔksÍh™Şu‘lĐź ßVž˘Í;<…qch#1ŇľŐŕ--×ID‰{pv /ž Čń'/˘Ő@—ˆ::Ôěüě1/ôě20!!#!/sţ-Ëţ+ŐŞúŐ+“˙ă=Ő)@ —™ˆ10üěüě1ä2ôě9033267>53#"&'.“Ë  yVWx! Ę9FBŞjiŞCE:=˜ü m];<<;\löühĺÁ?;::;>Ĺ9˜ŐL@)%%%%B´/0üě91/ě290KSXííííY"%3#3h_ŃţKőţKŃŞ+ú+ŐŃŐ á@D    %%% % B ´   /Ě91/<ü<Ä90KSXííííÉÉÉÉY"˛ ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏŞÓŹĹßżËĘżŐűD"üÜžú+wü‰žŐ Ć@K % % % %%%% % B ´  ;/; 0 üäüä91/<ě290KSXííííííííY"˛7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VŮHNŮţAßŮţ’ţuÚôŐýÍ3ýBüéƒý}%ŹŐY@.%%%%B´<< Ôěüě9991/ě290KSXííííY"3 3#%×lkŮţ!ËŐým“üÉýbžœ‘Ő E@%%B—ˆ—/0 üÄüÄ991/ěôě0KSXííY"˛]˛]!!!5!˛Éüô"ü ÷ý՚űoŞš‘Ďţňw@śˇśľ=ÔüÄ21üěôě0!#3!ϨđđţXůüf˙B7Ő@ ˆÔěÔě1ôÄ0 #%žüíŐům“Zţň@śˇśľ=ÔÄ2ě1üěôě0!53#5ţXđđřޏH¨‰Ő@ ˆÔĚ91ôĚ290 # #ÁȲţ‘ţ’˛ČŐýÓ‹ţu-ţŃţmľ¸/Ě1Ôě0!5Ńű/ţmPPîöf%@ şš<Ôě1ôK° TK°T[Xš@8Yě0 #Ýšţťfţˆx…˙ă#{ )n@*  śŒ!‹ żŒ$ž™   D >*ôěÄüě22991/Ääôüôěîî99990@00 0!0"       ˘    ]#"326757#5#"&546;5.#"5>32ž=ĄŁzl˜Žšš;ł€ŤĚűó÷†“^Ŕ[fťX‹Ĺ=& 3qpepÓş)LýŚd_Á˘ťÂ†y64¸''RR2“Á˙ăX 0@ Œ Œ™ž›G Fôě22üě1/ěäôěî9904&#"326>32#"&'#3–ˆ…†ŠŠ†…ˆýă,›fĘčéËd™.¸¸/ÖÚŰŐÔÜÚxRXţÉţďţëţĹWSĂ˙ă%{/@ ‹ Ŕ‹ŔŒŒ ž™ FôÄ2ě1äôěţôîőî0%# !2.#"3267%JRţüţŰ%QšNI“]­şťŹ`˜A9++88*,ÁA:ŕĐĎá;>{˙ă0@ŒŒ™ž›G Hôěüě221/ěäôěî9903#5#"3232654&#"Z¸¸.™dËéęĘešţˆ……‹‹……ˆŃCůěSW;7Wţ ÖÚÜÔŐŰÚ{˙ăX{E@& ‹ śŒ ÁŒž ™ IHôěüěÄ991äôěäîîôî990!3267# 32.#"Xü㿎XŔmiĂ[ţűţÚ đÖ÷¸‘ˆ…Ź^ZˇČ89ˇ++9 @ţŢĹ˘Š°œĂ'4@ śŒ›    Ô<Äü<Ä2991/ä2üěî2990#"!!#!5!5463'ŃcMţ¸ţŐ+Šł™Qgcü/яN¸Ž{ţH{ )H@' ' ‹ ŒŒŒ$žĂ(Â*' G!H*ôÄěüě221ääÄôěîîŐî999904&#"326#"&'5326=#"3253Z‡‡Žˆ‡¸îçLŚSb C•ˆ,˜mÄęęÄl–/¸9Ď××ĎĎŮÚţÝüţüś.,˘°}^\::VZ‘Ă,@ Œž › J  Fôě2üě1/<ěôě990#4&#"#3>32šjq‹¸¸1¨sŤŠśýJś—ގŤý‡ý¤`cá˛D .@ś Ä ›ÂśL LK Ô<äěü<ě1/ě2äüěî0!!!5!!3#×münmţḸ`ü/BCéşţV 8@ ŒśÄ›ÂĂ  Ô<ě2ÄÄ991ääüěîî990!5!+53263#XţĂőłĽţęZZ¸¸ĺűŒĂӜ}Ľéě˛ Ĺ@:  B›  DE ôěě291/<ěä90KSXííííííY"˛]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##ěžăŕţGţáţb‰žü{ŃţZýFBţ?   &@  ś Ĺś L ÔěüĚ991/ěüě990;#"&5!5![Y×鼾ţŮß–|~œÔÂůmo{"Ł@'  Œ žÂMNMNME#ôK° TK°T[Xš˙Ŕ8Yü<üěüě91/<<äô<ě299990@G000000 0 0 ?????????€€€€€€€ € € #]>32#4&#"#4&#"#3>32¤"iJ‡o¨5FP;¨9JI9§§!c?LeîHEŃţßýwís{ĺýđp{ĺý``32šjq‹¸¸1¨sŤŠśýJś—ގŤý‡`¨`cá‰˙ăH{ #@ŒŒ ž™ D>ôěüě1äôěî0"32654&'2#"hŒŒé÷öęéöößÚÖŐŰŰŐÖڜţŇţâţáţÓ-.žţVT{3@ŒŒž™Ă GFôě22üě1äääôěî990%#3>32#"&4&#"326wšš.™dËçčĘf™đ‡…†ŠŠ†…‡ýÉ SWţĆţęţďţÉWőÖÚŰŐÔÜÚ‰ţRw 3@ Œ Œž™Ă G>ôěüě221äääôěî99032654&#"#"3253#L‡……‰‰……‡-™eÉéčĘd™.šš+ÖÚŰŐŐŰÚýŠSY7:WSůöjƒ{O@ —ž  ÔÄě21/äôěÔĚ990@%  0030@@C@PPPP].#"#3>32ƒ;zIŹśšš.żƒDv6y.*ŘĚýÓ`Űw"$Ő˙ă{'u@@    B ‹Ŕ‹ŔŒŒ%ž™( OI"E(ôÄěüěä99991äôěţőîőî990KSXí9í9Y".#"#"&'532654/.54632ÍO S}{\ˇJ‰ěŇSśjgźTz†őEŸ’ÚĘZŚ9´..QSKJ#œ}Śť##ž55cY€1“ĄŻ!ƒž1@śÂś  Ô<Äü<Ä2991/ěô<Äě2990!!;#"&5!5!f˘ţ^^uĎáĎŞţŐ+žţý |b“ŚË`>Ă˙ă^,@ Œ™   JFôěüě21/ä2ôě990332653#5#"&økp‚Ššš1Šqʍ¨śýJ—ގŤyű˘¨adádm`e@)BÂIEôě91/ä290KSXííííY"˛']@%]]3 3#dżEFżţrí`üTŹű Ń` @E      B    /Ě91/<ô<Ä90KSXííííÉÉÉÉY"˛ ]@Œ      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #śĂ ˘Ăśţú°ł˛°`üwBýž‰ű fýšL…` Š@H      B  IE ôÄüÄ91/<ä290KSXííííííííY"˛ ]@ fivy  :4 ZV ]] # # 3 ^ţo¸Őţ¸ţšŐ¸ţoĚ)'`ýčý¸Áţ?Hţk•hţV` @E       B  ŒĂ IEôěÄ91ä2ôě9990KSXííííí9íY"˛8]@v  &&8IIY ]]+532673 3Z.Gc".Š\”mQ\GţOĂLGĂhużţř:NNš^ÄNü”lËb X@BśÂśIE ôÄě2991/ěôě0KSXííY"˛8]@68EJWXejuz ]!!!5!ă-ý}ƒüťƒý•b¨üܖŞ%Ýţ˛ô$f@5 %   ! ś śĆ Çśľ% $  = %Ô<Äü<Ä299999991üěäôěî99999990#"&=4&+5326=46;#"3ô@ůŠkŒ>>jŠů@FŒU[noZUŒž”Ýď—tr–đݓWŽřŽŽœřVţžˇľÔě1üĚ0#žŹřÝţ˛ô$j@7%   śś#ĆÇśľ%#= %Ô<Ä2ü<Ä99999991üěäôěî99999990326=467.=4&+532;#"+ÝDVZon[VD>ů¨k@@k¨ů>žXřœŽŽřX“Ýđ–rt—ďݔXěy &@    'üÄ1Ôü<Ôě2990#"'&'.#"5>32326yKOZq Mg3OIN’S5dJ t]F‰ Ž;73 !;?Ž<6 7=ĎŐ @†ˆ Ô<ě2991/ôüĚ0533ËËĄ×ţţű)eţ›ýqŐţÇ%˜!N@*‹ ‹Ë Ëž ™ " E"ôěÔ<Ô<<ě221Ää2ô<Äěţôîőî990.'>7#&5473%C‚??ƒBI‚9gáţüŢg9‚ţބ  5Ź(,üš-(Ź"ţâ9űú=ţá"ü+` 츸ë‹Xđ>@  ś ‹§—– — Ô<ÄÄü<ÄÔÄ1/ě2ôěôěÔ<î2990.#"!!!!53#5354632D>C†sţü3ěÇÇŰßA‰ś¸,,łŔُţ/ŞŞяîţúÍĂLB /@ (-  * -'! ˙¸@'˙) -0)$ !'$* xyx( $0ÔÄ2ěüÄ2ě9999999991ÔÄ2ěüÄ2ě99999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|ŚZڍ^Ś.[20`0¤\ڍ^Ś.[3.^ƒZ{{Z\}~tŚ]Ś1]02[-Ś^§ŁZŚ3].2]-Ś_¨%ŹŐ@D% % %%B ç çˆ< e e<Ô<ěě2ü<ě2ě99991/ä2Ô<ě2Ô<ě290KSXííííY"3 33!!!#!5!5'!53%×lkŮţśüţĹV‘ţoËţqZţËóŐým“ýĎo—#oýô o#—oţ˘ž˜!źˇÔ<ě21ÔěÔě0##žŹŹŹ˜ý öüý öÇ˙= đ2>j@<#$93 $*ÎϏÎĎ0–?#54&¨S9akÍԂ[]=:Ě­I›WW”9fqÝր][<;ȧH™ţ>=÷><ś¤''PGZswšeZŒ54m@ލ¤''TLf{x™f[1,pE‚ŸýŐ-Z/L‡…-Z/Lˆ?F‘@ŢÝaaÔüÔě1ô<ě203#%3#?ËˈĘĘĘĘĘ}ŃN1ID@' Ú ÚÜ&Ô>ÚÚŮÔ>Ó2ŃJ\ ^,8 8YD/ćţĹţĺ2î1ôěüôěÔěţýîÖî0.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u‡Œ‚8g24r=´ĎĐł=rÄjľKKMMKLľijľLLKLKKľkÚZZ\[[[Ú~}Ú[[[\ZZÚ/l•€„ŽhČŹ­ĘĄJKK¸jhˇKLLLLLľij¸KKJgZZ[Ü~}Ú[[[[[[Ú}~Ü[ZZŐÁđ %)d@6  (ó&í&ńí  ďîíđ#–*& (' j kji*üěÄüě22ŔŔ9991ôäüôěÄîíÖîî99990"326=7#5#"&546;54&#"5>32!!ʐ|WHiƒ1ƒR–ťŹśwu3}CD‡?¸ŹýkœýdPDN@Ms=ţ@pABˆtŒZ\#!Źý {w# /@  üŹ  v vÔü<Ôě2991ô<ě2990 5 5LţÓ-ţ+›ţÓ-ţ+#żţôţôż˘R˘żţôţôż˘RXsy^@  'üÔě1ÔÄě0!#!X!¨ü‡^ţ?dßmƒś ÔÄ1Ôě0!!d ý÷ƒ¤}ŃN4L…@I  ] ] B  ×× ÖAÔ)Ő5Ô)ÓŃM  \\ [G#X;#Y//ćţĺţőÄîî299991ôěüäţí2îÖî9990KSXíí9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.X“XP:&rk1=-7‚čffZJJDÚZZ\[[[Ú~}Ú[[[\ZZÚ~jľKKMMKLľijľLLKLKKľLbeG]C;şŽP*ţŘśTč6?>5VZZ[Ü~}Ú[[[[[[Ú}~Ü[ZZgJKK¸jhˇKLLLLLľij¸KKJ=b“öśśÔĚ1Ôě0!!=VýŞö”+uŚđ @Ě Í̖STS Ôěüě1ôěüě02#"&546"32654&hAu,-/ş†‡´¸…OomOPqpđ1.-rB„ˇ´‡†şoPPlnNOpXy“.@ ă  ă    Ô<ě2ü<ě21/ěÔ<ěü<ě07!!!!#!5!X!űßd˝ţC¨ţDźŞŞ“ţˇŞţ´LŞIBœ}đa@WWBA     @–ÔÄÔÄě9991ôěäÔěî990KSXí9íY"!!57>54&#"5>32ăšýĹçeQdR1q?Ay;ŽŹJwrnâaz3=L$$}…k9wuFœđ(\A          @#–) & )ÔÄÄÔěÔě991ôěäôěîĆöîî90#"&'532654&+532654&#"5>32Ű^cžą:r;Eq-evnmBJ]b`W,p;Eu2‘¨X`lP|†yQDJLl?<8?yvcG]Űîşf%@ şš<Ôě1ôK° TK°T[Xš@8Yě03#ôĆţťšfţˆĂţTž` L@* Œ‹™Ă Â!   JF!ôěüěÄ9991ä2äô<ěüÄ9903326533267#"&'#"&'øxoš ! &D">K .…Y\,ţT ýHŽ—ŞŚü ;8 ”OOPNLPýŐj˙;Ő #@ˆWW1 ÜüüÔě91Ä2ôÄĚ0!###.54$FŔż×ěŐůfůáNݸžčé/ĺ`šľÔě1Ôě03#éüü`ţĎ˙˙‹ţu)ŹXœ“ß 9A      @ – aW}a Ôěěüě1ôěäÔěî2035733!jÍßĺŠĚý× c)t'ý+nôŐÝđ 3@óńíđí –  jkjiüěüě991ôěôěüě0"32654&'2#"&546!!hfssfeusgŞËĘŤŞĘËŤ¤ý\{œ‹‹šˆ‹œuŕźťßßťźŕü`{Á\# /@  üŹ vv Ô<üÔ<ě991ô<ě2990 5 %5 ‡Őţ+-ţÓţ:Őţ+-ţÓ#ţ^Rţ^ż  żţ^Rţ^ż  ˙˙ţňZ{'ݸüV'{ţţœ /˙˙ţňZ{'{ţţœ& /tÉüV˙˙ţňZŒ'ݸüV'u˙œ /Á˙ĺÝŐ!%‚@G  %%B!‹ "†$ —™$ˆ&# # )"#&ÔüÄÔěÖî99991äôěţÍôî9990KSXí9í9Y"33267#"&546?>54565#53%ž=TZ>/ƒmN˛b^żhşÝC^XC&ÄĘĘDšb‰RY;X1YnEDź98ŔĄLƒ\V@T?ţ˙˙%Źk&$ ,u@O ]1˙˙%Źk&$ *u@O ]1˙˙%Źm&$ -u´  +@ /  ]1˙˙%Ź^&$ +u´# +@O#@]1˙˙%ŹN&$ )u´ +@p0? /]1%Źm !Á@W % %%% %!%! %!! % !B  — Č  É  !  PPK/K!"Üäüäî2î299999991/<ććÖîî9990KSXííííííííY"˛€]@… ŠŠ…  € €€]]4&#"326!.54632#!#Y?@WX??Y˜ŐŞţ”:A rrĄ@;ŹŃnýőlŃZ?YWA?XXüýP!yIrĄĄrIv$ú‰…ţ{œŐg@7 % %%%B— ——ˆ—°ą   c /Ô<î2ÖÄÄ91/<îîîôî2îî0KSXííííY"!!!!!!#!‰ţŽ3ţÍeýáţ e¸šxĘ5ŐŞţFŞýăŞţŐŞüü˙˙‹ţu1đ&Źd&˙˙ĹNk&( ,u˙˙ĹNk&( *u˙˙ĹNm&( -u˙˙ĹNN&( )u˙˙Ék&, ,u˙˙Ék&, *u˙˙Ém&, -u ´ Ic:1˙˙ÉN&, )u´+1NŐ ;@!ś —ˆ —  21 0 0ü<ě2ěüěÄ91/Ć2îöîî20 )#53 6&!#!!´VDţťţŤţŃ}}/˙ĘÉ˙`ţřŐţ”ţ€ţ‚ţ•ŕ{úŃűHKűţ+•ýá˙˙‹Fb&1 +y´"+@O"@]1˙˙u˙ă\k&2 ,u@O]1˙˙u˙ă\k&2 *u@O]1˙˙u˙ă\m&2 -u´ +@ /]1˙˙u˙ă\^&2 +u´ 0!+@O0@!]1˙˙u˙ă\N&2 )u´ +@p0? /]1–Ž;T .@     Ô<Ě91Ô<Ě290 7   –^ţ˘t^_tţ˘\tţŁţ¤%\^uţ˘^uţ˘ţ¤w^ţ˘˙ş° +k@:+)&  *&——&–™, #* #)+262#5,üěüěŔ999999991/äôěîŔŔ9999990324&' .#"#"&''7&5327sƒTš‡ ýÝřsVƒť)+÷ýy´=g˛ %÷üs­9‹d/NZInˆ-ýËĎQUţÜţ†PećQţţŁţzţ€QQËFüIž‡€RPÉJ˙˙“˙ă=k&8 ,u@O]1˙˙“˙ă=k&8 *u@O]1˙˙“˙ă=m&8 -u´ $+@ $/ $ ]1˙˙“˙ă=N&8 )u´$!+@p!$0!?$ !/$!$]1˙˙%Źk&< *u@ ]1ɍŐ4ľ—— ¸@ ˆ 28  3üě22üě99991/ôüěÔě032654&#33 !##“꾝žţLĘţřřţüţĘ!ý󄃃ƒ´ţňŇÚŰŃţ‘ź˙ă}/V@1-'!  *‹Œ*Œ›™.  !' $'$-DF0ôěüĚĆîÔîî99991/äţîţŐî9904632#"&'532654&/.5467.#"#źŇŘĚŇ›¨7C:—oŕÄE‡BL…;l€AxC\[˘œyqyrťqŐÎÝŘ|d1M*%]¤tš˛¤aQG_J'8…O€Ť#krƒ‹ű“˙˙…˙ă#f&DC˙˙…˙ă#f&Dv˙˙…˙ă#f&Df˙˙…˙ă#7&Dv˙˙…˙ă#&Dj˙˙…˙ă#&Dt)˙ă°{ C@I=70 6 %C ‹Œ"7‹6ż. śÁ3Œ@:ž("™D%=/.M/u MCM6+sDôÄěüěÄüÄě29991ä2ô<ě2ô<ě2ôîţ<ôî999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321ŠxYS\JíMWWLëţepO27„Gn• '…aœŁČżuc^8„>M„<[|%!„YŽ‘şHZqYa…4—…ˆ+#"Ą33Ź)+RNPPʤŤłXx€+'¨#!?@=BíţÎ˙˙Ăţu%{&ŹhF˙˙{˙ăXf&HC˙˙{˙ăXf&Hv˙˙{˙ăXf&Hf˙˙{˙ăX&Hj@@]1˙˙˛Df&óC˙˙˛Df&óv˙˙˛Df&óf @@ 0 ]1˙˙˛D&ój´ +1‰˙ăH)‹@O BŒ $Œ™ ›*'! !'D! >*ôěüě9999991ěĚôěî99990KSXííí9íY"#"32.''7'3%.#"32654&ÍĹśűĺäűűŕ"#!H&ţéíśŰ!!Ž#R-’™”ˆ‰”:/Ôţ„ČţôţŘ(  (-Y,\bPȑ^bţ ŇÇÄÔÔÄnË˙˙Ă7&Qv˙˙‰˙ăHf&RC˙˙‰˙ăHf&Rv˙˙‰˙ăHf&Rf´+@]1˙˙‰˙ăH7&Rv´. +@ 0 ?. /. .]1˙˙‰˙ăH&Rj´ +@ p_PO@]1X–yo '@ţţ  w Ô<Äü<Ä1ÔÄüÔěî03#3#!!îőőőőţj!űß‹őŮö˘Ş/˙ –ź +s@>+,&  )&  *&Œ& Œž&™,+,* # )#D>,ôěüěŔ999999991äôěîŔŔ99999990 32654&'.#".5327#"&''mţ1$eA H#cC‹•‹')öédž<“]¤*,öęg9 \ ýŃ//ŰŐ4oŻ0.ÖĘ0tG GĂq.78°MĂBÁzţáţÓ;<şL˙˙Ă˙ăf&XC˙˙Ă˙ăf&Xv˙˙Ă˙ăf&Xf´ +@]1˙˙Ă˙ă&Xj´ +@ p_PO@]1˙˙hţVf&\vžţVT3@ŒŒ™žĂĹ GFôě22üě1ěääôěî990%#3>32#"&4&#"326wšš.™dËçčĘf™đ‡…†ŠŠ†…‡ýÉÉý˛SWţĆţęţďţÉWőÖÚŰŐÔÜÚ˙˙hţV&\j˙˙%Ź0& 6$´ +@ @O /]1˙˙…˙ă#ö&‰D˙˙%Źm& 1$´+@ _PO@/ ]1˙˙…˙ă#H&‹D˙˙%ţuŕŐ'uÇ$˙˙…ţur{'uYD˙˙‹˙ă1k&& *Zu˙˙Ă˙ă%f&FvZ˙˙‹˙ă1t' -~|&˙˙Ă˙ă%f&fZF˙˙‹˙ă1P& 2K&˙˙Ă˙ă%&ŒKF˙˙‹˙ă1m&& .Zu˙˙Ă˙ă%f&FgZ˙˙‰Rg&' .˙˛o˙˙{˙ă ' (:˙ŻG š@8@]1˙˙NŐ’{˙ăŃ$H@ "ç ¸ @"ŒŒ™ž›   GH%ôěü<Äü<Ä1/ěäôěîý<î2990!5!533##5#"3232654&#"ZţĎ1¸żż¸.™dËéęĘešţˆ……‹‹……ˆŃ5y••yúúSW;7Wţ ÖÚÜÔŐŰÚ˙˙ĹN0& 6(˙˙{˙ăXö&‰#H˙˙ĹNm& 1(˙˙{˙ăXH&‹H˙˙ĹNP& 2(˙˙{˙ăX&ŒH˙˙ĹţuNŐ'u1(˙˙{ţuX{'uöH˙˙ĹNg&( .$o˙˙{˙ăXa&Hg#ű˙˙f˙ăPm' -u*˙˙{ţHf&fJ˙˙f˙ăPm& 12*˙˙{ţHH&‹J˙˙f˙ăPP& 22*˙˙{ţH&ŒJ˙˙fýĂPđ'Ť€˙á*˙˙{ţHN'—.J˙˙‰Hm' -u+´ +@ /]1˙˙Ăm' -uKK°QXš@8Y@p`O]0ÎŐ?@!—  —ąˆ   1 0ü<ě22Ěü<ě22Ě1/<ä2üěÜ<<ě2203!533##!##53!5‰Ę*ʇ‡ĘýÖʆ†Ę*Őŕŕŕ¤űŻÇý9Q¤¤ŕŕF?@" ś Œž› J  Fô<Ěü22Ěüě1/<ěôěÜ<ě2990#4&#"##5353!!>32šjq‹¸}}¸aţŸ1¨sŤŠśýJś—ގŤý‡ö¤zz¤ţÂ`cá˙˙É^' +u,´ +@ O@ ?0 / ]1˙˙˛D7&vó˙˙É0& 6,´+@O@]1˙˙˛Dö&‰ó˙˙Ém& 1,´+@O@]1˙˙˛DH&‹ó˙˙ÉţuŐ&,uF˙˙˛ţuD&LuP˙˙ÉP& 2,˛D` "@śÂśLLK Ôäěüě1/ě2ôě0!!!5!!×münmţá`ü/B˙˙˙ćĚŘ =@˛—™!  — ˆ— "!ÔĚ2ÜĚ2ÔĚÄÄ1/ě2ô<ě22ôěôĚ0%532765!5!#"'&!#3!53#Œ=„Ga'&ţýHH¨AA@ý-]ääýŁää@ěQQJKËDŞüţćuuĂŞűŞŞ˙űţKŠ I@& Œ Ă śÄ›Âś ! Ô<ÄĚÜ<ĚÜ<ü<ÄÄ1/ě2ä2ü<ě2î2ôě0!5!+53263#!!!5!#3#ŇţĂőłĽţęZZ¸¸üi‚,ý+ë뗗ĺűŒĂӜ}ĽéŔü/BCé˙˙m˙ăĘm' -0u-˙˙şţV¨f&fć˙˙‰ýŕÉŐ&Ťjţ.˙˙ěýŕ˛'Ť˙ţNě˛` Ä@9  B  DE ôěě291/<ě290KSXííííííY"˛]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##ěžăŕţGţáţb‰ž`ţ/ŃţZýFBţ?˙˙Čsl' *ţív/@ ]1˙˙  l' *˙ĄvOK°QXš@8Y@ŸO]0˙˙×ýŕsŐ&Ťfţ/˙˙ ýŕ &ŤűţO˙˙×sŐ' (Ž˙m/˙˙ †' ( ˙šO˙˙×sŐ'y`†/˙˙ ź'yאO˙ösŐ 7@ —ˆ  1 4ü<ěě2.9991/äě903%!!'7×Ë;NţwŃüd‘PáŐý˜ŰoţîýăŞ;jnžL >@!  śĹś  Ô<Ěü<Ě2999991/ěüě9990;#"&5'!5!%[Y×鼾ţŐP{ţŮß;Pţu–|~œÔÂ$Ńo/ýžŰnţí˙˙‹Fk' *!u1˙˙Ăm&vQ˙˙‹ýŕFŐ&Ť*ţ1˙˙Ăýŕ{&Ť0ţQ˙˙‹Fm&1 .*u˙˙Ăf&Qgô˙˙–&Q{`ţI“ţV=ň2@ —–ˆ— 10ôě2üěÄ1/Ôěäôě90+5327654&#"#3>32=YZĽÍ§Z-,t|˜ĘĘ6¸~ťšçüĂijœ>>’ń´ŠÚËüWŐĆotţűĂţV{ 2@ ŒžÂś JF!ôě2üěÄ1/Ôěäôě90+5327654&#"#367632YZĽÍšZ-,jqFE¸¸1TTsŤTUśý6Ăijœ>>~ʗŽ[\Ťý‡`¨`21qp˙˙u˙ă\0& 62´+@ O@/ ]1˙˙‰˙ăHö&‰R´+1˙˙u˙ă\m& 12´ +@/ ]1˙˙‰˙ăHH&‹R´#+@]1˙˙u˙ă\k& 32˙˙‰˙ăHf&RHÁŐ;@—  —ˆ— ą  -ÜěüÄÄÔě299991/ěě2ôě2î0%! )!!!";ÁýŁţŮőô(RţšHţ¸ţţą‹‹ą=ŞŞMœĄKŞţFŞýăćţ¤ţŚĺ˙ăş{ 8i@92/ & 8 ‹ ś Œ#ÁŒ5/ž)#™92& MuMCM,s9ôěüěÄüě29991ä2ô<ě2äî2îôî9999904654&#"265&#"!3267#"&'#"32>32PVWMţŚfRPhgPPŹţcpPƒ/;}Jb“04€T˝ŞŞ˝Y€/%‚Wݐ‘ & ‘‡‰ž+ýę¨ď#ާţóţó§‡Tِ53Ź+)CBDA88>A>AíţÎ˙˙Ńk' *˙ľu5˙˙jˆm'vÎU˙˙ýŕŃŐ&Ťrţ5˙˙ ýŕƒ{&ŤˆţU˙˙Ńg&5 .˙Äo˙˙jƒf&UgZ˙˙‹˙ăJk' *u6˙˙Ő˙ăm&vV˙˙‹˙ăJm' -u6˙˙Ő˙ăf&fV˙˙‹ţuJđ&Ź6˙˙Őţu{&ŹV˙˙‹˙ăJm&6 .u˙˙Ő˙ăf&Vg˙˙/ţu˘Ő&Ź7˙˙ƒţuž&ŹyW˙˙/˘m&7 .u´ +1˙˙ƒ~&W (/˘Ő-@ — —ˆ: : Ô<ěĚü<Ěě1/ôě2Ô<ě20!!!!#!5!!/sţ- ţ÷Ëţ÷ ţ+ŐŞýŔŞýżAŞ@ƒžB@! śś ś  Ô<<ÄÄü<<ÄÄ2991/ěô<Äě2Ô<ě2990!!3#;#"&=#535!5!f˘ţ^ĺĺ^uĎáĎŞĺĺţŐ+žţéŽé|b“ŚËéŽé>˙˙“˙ă=^' +u8´/ +@O@ ]1˙˙Ă˙ă7&vX´'+@/ ]1˙˙“˙ă=0& 68´+@ O@/ ]1˙˙Ă˙ăö&‰X´+1˙˙“˙ă=m& 18´+@/ ]1˙˙Ă˙ăH&‹X´+@]1˙˙“˙ă=U&8t O˙˙Ă˙ăŮ&XtÓ˙˙“˙ă=k& 38˙˙Ă˙ăf&X˙˙“ţe=Ő&8uđ˙˙Ăţu°^&Xu—˙˙Ńt' -|:´+1˙˙Ńm&fZ´+1˙˙%Źt' -|<´ +1˙˙hţVm&f \˙˙%ŹN&< )u´ +1˙˙œ‘k' *u=˙˙Ëm&vV]˙˙œ‘P& 22=˙˙Ë&Œ]˙˙œ‘m&= .u˙˙Ëf&]gĂ',@ ś Œ ›Â Ô<ÄüÄ991/äüěî990#!5!546;#"ڏţŐ+ŠłÝŃcMĂű=яN¸Ž™QF˙ăX%>32#"&'##53533!!#&#"32y,›fĘčéËd™.¸{{¸aţŸˆ…†ŠŠ†…ŃRXţÉţďţëţĹWSö¤zz¤ücŹÚŰŐÔÜĽŐ)?@$— —ˆ— ą 2 !$'+ÔÜÔ9ě2ÜěÔě91/ěěôěî9032654&#32654&#%!2)"#546x°–ž¨xt’ƒ”ţÂBĺřƒƒ“§ţöţůţž>dœŠÉýÝ{’‰fţ>p}qdŚĆľ‰žĎ ËĎ/Wp1FŸš˙˙ŚqŐGÁ˙ăX>32#"&'#!!&#"32y,›fĘčéËd™.¸đýČˆ…†ŠŠ†…ŃRXţÉţďţëţĹWS¸űýŹÚŰŐÔÜ0ĄŐ 327654'&#'3)'Ąď°KKOO¨ďë{e5……ţůţFŚqÉýÝ>=’DE¤żdĄËgh´ä=<˙ă” !&#"32>32#"'&'#'҈„†FDDF†„ţl,šfĘttttĚdLL.¸ÂzYŹÚmnŐÔnnRRX›œţďţ랝+,S´ä|‹˙ă1đ/@21 Ü<ôě1@ ł ˛— ł˛—– ™äôěôěîöî0>3 !"&'532#"‹M˘[?ţĂţá[˘MIŠXĹÄÄĹVŞJž))ţgţ’ţţj))Ď=@0230@=<˙ă•g"%# !2676;".#"3267âM˘[ţáţĂ?ZO*ZĽT3,JŞVĹÄÄĹXŠI5))–p*™32jœ>5‡F=@ţĐďţÎţĐ@=^˙ăsŽ!%# !2676;".#"3267ŔJRţüţŰ%FC=ZĽZ-,I“]­şťŹ`˜A9++8(8rGjœ>>~”A:ŕĐĎá;>˙˙NŐ’ÉŐ3 !#"#546 6&!#FéVDţźţŞé6<0œŔc˙ĘÉ˙Őţ”ţ€ţ‚ţ•//&r1FľŁúŃűHKűűwƒNŐ#";5!! $5476%3ƒď¨ž–°ďýE†ţFţůţö5e{ëɉ’{‰Śú+ĎËĄdżÂ˙ă4 32654&#"5!#5#"32_ˆ…†ŠŠ†…Łđ¸.™dËéčĘf›,ţTÚÜÔŐŰ}¸ůěSW;7XR‹ˆţ=G{ 7%2654&#"#"/532376?654'&'&'&'&32hŒŒ§(>vwĹf2—BFKI I<' )iëy|öęéö{ÚÖŐŰŰŐÖÚL (=\ˆRR $­+.! ”—-ţÓţáţâ—&ĹNŐ +@ 1 3 üÄÄüě21@ — —ˆ—ą/ěěôěî0!5!!5!!5NüwżýrŽýTŐú+ŞŞşŞu˙ă\đ=@ 26 25ôěÄôě991@ ł — –——™ôěÔîôôÔî9905!54#"5>32#"327uŠ–VŞJM˘[ý÷÷ýýö׌””~ éSń@=Ď))ţ€ţyţzţ€~#řţű˙ţ‰˙ă7đ(>@  22&0)üěÔěÔÄÄ1@ ł —–)—ą)ł —#™)ôěÔěôě9ôěÔě0.54$32.#";#"3267#"$546¸ƒ‰ÚI˝yhžY†‘œ‹šš˜˛˛ŚbĆfgÖgőţëœ"˘{ľÝ ş(({smzŚ™‚–45É$&ëΕÇ?ţV’Ő!!!!+532765|ýľ ýôYZĽ°ŠZ-,ŐŞţHŞý#Ăijœ>>~ĂţV'$+"!!+532765!5!547676;'Ńa'&ţQRľF1i&&ţ×(W%6†MIţĎţÎţÉţŐ!‘ŚţRśI ! 5 3 3325ÚDţ`ţH&ţ0ŘttÚý˘ĆŘĚŠţ?ţuěěoä¸ýŐ+üŚţÓţꊊEA&#767653#"'&54&#"#367632ó"&76/§˜šJI_BG}ŚŚMKUv˜śţŕ™14IBœ›ţeäá``Ö —ގŤý‡ý¤† 1áÉ:Ő!5!!;#"'&5ţÇ=ţÇ,-ZšŮŞ\Y+ŞŞüz=>ŤjfĆÉŐ!!3!!#!!5!!5!!É=ţÇ ţ÷9üĂ9ţůţÇŐŞýŔŞţiŞŞ—Ş@nĂŐ67632'&#"##3‡Ąi~\/j!-<Bm¤VôţšËËœŞ c3r%3sŹüě¤ý¸Őýhě˛5476;#"33 ##ěYZĽÍšZ-,ăŕţGţáţb‰žę”Ăijœ>>~ţŃţZýFBţ?  ;#"&=#53!5!;+[Y×鼾ääţŮß ÝÝ –|~œÔÂϧüɎ1mŐ% # #''3C\PţńżţżţśżŠ"ţ–PŽż˝ňnţţűÁŔý@‘Jűo |m˙ĺoŐ"%#"&33265332653#5#"&8"iJ‡o¨5FP;¨9JI9§§!c?LerHEŃ!ţü ís{ĺöü đp{ĺöú+`=ĂţR{#4&#"#3>32šjq‹¸¸1¨sŤŠśűœd—ގŤý‡`¨`cáu˙ă\đ  32'&#"32767\÷ţö÷üý÷Ô:Dš™C; 9C™šD8 éţzţ€~ˆ‡€ţ€ţĚ{{ţř¸úvuű˙˙˙ă§' y¤2‘˙˙ ˙ă˛{' „R—-˙ă¤đ%63273# &#"327-N5>Îo“毴oţ8݈=ŠŠyyŠŠ=é Yžƒú+Í üvŔ~^ţćţˇţ¸ţćVţRŤ{ 763273##"'&7327&#"VúPeŇo~ç°ľnÓęoV°×AAÎ( /´s%—+nú+͝ýř—ź’ţţu"m†mţâB8™Ő!+#"#54763! 27654&+™ţČVn]Ę6<0œ``~'—RţÓ@œ]ţ¤Mý¨//&r1FľRQţÜEţ’8D…“ýĎžţVT˜*3265'"#"67232#"&'#76;#"wŃ"…‡ű Ö. [ÂËçčĘf™,šË?NÍšŠ /ţ‰2ÚÖ˘ţďFI¤ţĆţęţďţÉWSýÉŹ.OœÝţřŃŐ#.+#33232654&#řN76SËٲM{cÁËËŐöĄýĐݑŽ—š77§ţhyĄ]ţ‘ŐţřŢҔťYý‰‹˙ăJđ'>323267#"$546?>54&#"áižVß źĐl‘uŞ™hÍskÔiüţřŔŇj•mŚ^š\˘''ńČ ž/ vp{‰DI×--ŕŐľŇ1#hcq…<;Ő˙ă{'>323267#"&546?>54&#"PŚZĘڒŸEő†zTźgjśSŇ썉Jˇ\{}S O9!!ŻĄ“1€Yc55ž##ťŚ}œ#JKSQ..˙˙xmŐčvţV[!&'&#"3;#"'&5# 54!238!n|wx'%d°ŽĂQWžţň/ľR5ż-0A3šű=g)(™V\´ŽŇŘ`@o›ƒţVž !!;+53276=#"&5!5!f˘ţ^^uĎYZĽÍšZ-,(ĎŞţŐ+žţý |b“Ăijœ>>~ŚË`>/˘Ő&#5463!!#ŃF1œŔÖÝţ-Ë/7&r1FľŁŞúŐ+ƒ!!;#"&5!5!5476;#"f˘ţ^^uĎáĎŞţŐ*YZĽÍšZ-,`ý |b“ŚË`Ăijœ>>~/ţV˘Ő!!;#"'&5!/sţ-,-ZšßĽZYţ+ŐŞúÁ~>>œjiĂ?˙˙ ˙ăČ' š¨8˙v˙˙'˙ăŞq' |X˙dJ‡´##"47#5! 54'5‡ő{nţŕđňţßo{řĎx†´4ł†x´Ź†ţŕźţÉţ‘n8ź!…ŹŹLţˇŢćţ÷ ćŢILŹš*Ő!"'&533254'3úŞ\ZĚ,,Zš´†xÚzn“jfĆ?űĐ~>> ćŢIL†ţŕźţɸźŔ×#367632'&#"köˇţSÁHÇcm.-PKG "(3tţ*ýbž7ým‘Č*9† ţVÉm+5326?3 67632'&#"nQGJ|“lLT3!ţ;Ă^2Q+31705+hË:=šH†TNü”ť~)“ )œ‘Ő!3!#!!5#5!!˛Éţučţ÷Pţđ"ü ´"vý՚ý°ŞţiŞš§Ş@œ5b!!!#!!5!5!!Ţ-ţň8ţžYňƒüťáţőŽý•b¨ţޤţҖޤg˙äˇŐ 7654'&+5!5!2! $5ädc{dd\^¤ŽrýĘţˆh‚bVPţĐţčţÜţĐłKKKK†IJŚšŞ¨ţG8+lhŠÝňňÝ˙äˇŐ3! $54767635!!#" 76îČţĐţÜţčţĐRUciţˆČý rŽŚ\\dc{ddłÝňň݊hl+8š¨ŞţGŚJI†KKKK}ţLT` 5!!#"3267# $547676pţejýeŽŽĽ]\dcžmČTjdc^ţčţĐQVb€Üܨ“ţ ŚJK„KK21Ă%ň݊hm*8­ţV$` 2767# 4%$54#0!!5! ťTMOQWPVaţ –ëţŢĺýejţžoţ0âţî,ł î5%b|8“¨ţdĺţě1a‹˜#đ 6323#!!5!5!67654'&#"¤ĐżŰ -"BPć8ţťŽüu~ţĺ˛i–9DľŢcé˝``JUŞ?ţ¨ŞŞ—Ş‚T<>š<…˙äśŐ % 7654'&#!!!!2! &53h<= \^¤ţGœý/"icUPţĐţčţRz,ʞ[ŽÇ+3†IJ ŞţI8+leÝň[tľG)}ţLT` 7654'&#!!!76!"'57?\]ĽţÔđýȨgƒcUQţĐţčťÔŞţöĂ-5†IJ,¸ţ39+lhŠÝňJĂcÂ˙ăž 4'&+#5333#!"'53276MJY­>ĺĺĘççĽlunŠţœŸłc9ˇrO_¤ţě¤}nw°š~FŹVrA}ţVg{#36763254'&#"6šš4‡QҸMNüĎr98xÜ­zţĐ ŞBR1pq™ţWţäů…BAďÎŐ3#ĘĘŐú+˙˙9˜Ő'‚˙6‚ʤ-Ő3!!!!#!5!5!5!Ę^ţ˘^ţ˘Ęţ `ţ `Őţl¨đŞţ˙Şđ¨˙˙ÎŐ˙˙˙%Źm&$ .u˙˙…˙ă#f&Dg˙˙Ém&, .u˙˙˛Df&óg˙˙u˙ă\m&2 .u˙˙‰˙ăHf&Rg˙˙“˙ă=m&8 .u´#+@ /##]1˙˙Ă˙ăf&Xg˙˙“˙ă= ' )ů&8iŞ˙˙Ă˙ă2&&Xq<˙˙“˙ă=ů' )ů&8 *˙˙Ă˙ă˘&&X†<˙˙“˙ă=ű' )ů&8 .˙˙Ă˙ă˘&&X‘<˙˙“˙ă=ů' )ů&8 ,˙˙Ă˙ă˘'…<ž˙˙z˙ăW{ţ˙˙%Ź ' )ů'iŞ$˙˙…˙ă#2'q<Ś˙˙%Ź 'iŞ& 2„$˙˙…˙ă#2'q<Ö˙˙œ0' 6ވ˙˙)˙ă°ö&‰¨˙˙f˙ăPm' .u*˙˙{ţHf&gJ˙˙‰Ém' .u.˙˙ě˛m' .uN˙˙uţe\đ&uđ2˙˙‰ţeH{&uđR˙˙uţe\0& 6Ą˙˙‰ţeHö&‰˘˙˙˙äˇm' .uy˙˙}ţLTf&g7˙˙şţVËa&g#űć˙˙f˙ăPk' *Zu*˙˙{ţHf&vJ=˙ă”Ő%2763#"'&5!#3!3m6!śh9…€H†ţŐśś+ˇR‡Of'ţŔţ‹ŒMS™b–ý9Őýœdüuţď‹'˙˙‹Fk' ,u1˙˙Ăf&CQ˙˙œk' *đuˆ˙˙)˙ă°f&v¨˙˙˙ş°k' *uš˙˙/˙ –f&vş˙˙%Źk& 4$˙˙…˙ă#f&”D˙˙%Źm& 0$˙˙…˙ă#H&–D˙˙ťNk& 4(˙˙{˙ăXf&”H˙˙ĹNm& 0(˙˙{˙ăXH&–H˙˙ťk& 4,˙˙˛Df&”ó˙˙Ém& 0,˙˙˛DH&–ó˙˙u˙ă\k& 42˙˙‰˙ăHf&”R˙˙u˙ă\m& 02˙˙‰˙ăHH&–R˙˙‰Ńk& 4Î5˙˙hƒf'”–U˙˙Ńm& 0Î5˙˙jƒH'––U˙˙“˙ă=k& 48˙˙Ă˙ăf&”X˙˙“˙ă=m& 08˙˙Ă˙ăH&–X˙˙‹ýâJđ&Ť6˙˙Őýâ{&ŤV˙˙/ýâ˘Ő&Ť7˙˙ƒýâž&ŤYW}ţRTđ. 56$>54&#"57>54.#"5632 4oš˙ţę™Č1š\}p_sŁř54&#"57>54.#"5$32Fp>!Bl˜ł•J˘őžc(v];?Řß"AW?-1CA#E¨“ †p¸tgÍDZX%KŠlaF='‚.`[b[3XpV‹U 32=Ët|˜ĘĘ6¸~ťšçúkŸ´ŠÚËüWŐĆotţű˙lŸ(1%7276"'676#"'#7&/'&'&3232654&"m B{€Š rh¤úG0wD &8MdŁ\]ťĄP{#¸ý™lÔooԐ›>>t#ôÚţÇO9 Y%Z5H›ž7WSCüńţTÚÜÔŐŰœţV’Ő!!3+53276=!5!˛Éüô"YZĽÍšZ-,üĂ÷ý՚űo*”Ăijœ>>~š‘ËţVb!!#+53276=!5!ă-ý}ƒYZĽÍšZ-,ý|ƒý•b¨üܖĂijœ>>~Ş%˙˙%ŹP& 2$˙˙…˙ă#&ŒD˙˙ĹţuNŐ&Ź2(˙˙{ţuX{&Ź2H˙˙u˙ă\ ' )ů'iŞ2˙˙‰˙ăH2'q<¸˙˙u˙ă\ &2' +őiŞ˙˙‰˙ăH2'q<ˇ˙˙u˙ă\P& 22˙˙‰˙ăH&ŒR˙˙u˙ă\ 'iŞ& 2„2˙˙‰˙ăH2'q<Ţ˙˙%Ź0& 6<˙˙hţVö&‰\ ˙l %7276"#7&'&5!5!676#"Ř B{€wD3'ţŮß rh¤úF›>ţœO9ÂaJ¸ůűwt#ôÚţÇj˙lg{.%7276"'676"'#7&'&=4&#"#3>324 B{€šzgŸúG1wD3'5ZI9§§!c?…98›>>r.üÎţČO9ÂaJ¸ëís{ĺý``>t#ôÚţÇO9ÂaJ¸;>ţşţV` ,@ ŒśÂĂ  ÔěÄÄ991äôîî990!5!+5326XţĂőłĽţęZZĺűŒĂӜ}x˙ăY12654&"&#"32>32#"&'#5#"323íQ SS ŚQPQRRQPó]=z‹Œz<\o\32#"&'#äQ SS ýZQPPSSPPó]=yŒŒz<\o\G­ş JRţü’Ă\ŘD%QM((_]q"!ýä ^Ź`˜A–7ŕĐSţ]++œ čL„˝8 rM†…ýq;>źŐ 3!!!!!5! ËţůŃüdţő ŐýŞţiŞAŞ!˙şÉ#!5!7##'ÍóóËţ-.d'JţuËţ†gĐ[ý„|ŞBJ8jýÍýÖýäFŐţ{5.#"3#"'&/&/5632654/&'&54632ÍO S}{\ˇJ‰vh°˜“*L'TrGYí3e2{zD>z†őEĄGIÚĘZŚ9´..QSKJ#œ}Ś^R ˜~$š=&[ó5#ž`cY€1!GJĄŻ!Ëţb!;#"'&/&#=!ă-ýj1 “*L4[TrGYí=Zƒý•b¨üË ţř~$š=&[ó?œ%7šŐ"#5463!2##326&#v6<0œŔ~'úţ˙űĘƌœ//&r1FľŁăŰÝâý¨ţ” “˙ăźŐ)533!33##"&'.=)3267>5~ËĘ9FBŞjiŞCE:ŕýë  yVWx! AŞęýęýŞĺÁ?;::;>Ĺâ`m];<<;\l9˜Ő #3#iţĄŃľőľŃ+úŐŐú+ŃŐ!!2#.+##5332654&#ăLöĄ’N76SËٲM{cmËÎÎˉ‘Ž—ŐŢҔť77§ţhyĄ]ý‰wŚý‰Žƒ{.#"!!##533>32ƒ;zIŹ[M ýýšÜÜš.żƒDv6y.*l\Ą¤ţ<ĤřŰw"$š˙ă8{ )32654&#"3>32+3267#"&'.ţ> ¤zl˜°¸¸<˛€ŹĚüňřˆ’^Ŕ\fźXŠĆ<& +qpepÓş)LŚd_Á˘ťÂ†y64¸''RR2“{˙ă{0@ŒŒ™žÂG Hôěüě221/ěäôěî99053#5#"3232654&#"Z¸¸.™dËéęĘešţˆ……‹‹……ˆэű˘SW;7Wţ ÖÚÜÔŐŰÚŔ˙áWy 0@ Œ Œ™žÂG Fôě22üě1/ěäôěî9904&#"326>32#"&'#3•ˆ……‹‹……ˆýă.™dËéęĘeš,¸¸-ÖÚÜÔŐŰÚxSWţĹţëţďţÉWS‹^Á˙ăX $9@Œ  Œ™ž!Œ›G! F%üě22Ä99ôě1/üěäôÄěĆî04&#"326>32#"&'#46;#"–ˆ…†ŠŠ†…ˆýă,›fĘčéËd™.¸łĽĚ¸ZZ/ÖÚŰŐÔÜÚxRXţÉţďţëţĹWS~ĂӜ}}¸˙ă{0@ Ü<Ôě1@‹Ŕ ‹ ŔŒ Œž ™äôěţôîőî0>3 !"&'532654&#"¸JœR&ţÚţüPšNH”\ŽşźŹ`˜@%++ţČţěţěţČ*,ÁA:ŕĐĎá;>Ă˙s:{!)47&'&!2.#"63 !"'3254#"´ 90•%QšNI“]­şcUĂ-ţ˛RG+>œjiĂĄS,+;7W{˙ă7 &32654&#"%5476;#"#5#"32;mjkookjDGH„8H$#ˇ${P´ÎĎłQ{#ţTÚÜÔŐŰ ”Ăijœ>>~ű‚SW;7WSz˙ăW{432!"&'5326=!7!.#"z÷Öđ ţÚţű[ĂimŔXŽżüă¸^Ź…ˆ•^ű"ţŔţôţíţÇ++ˇ98ȡœ°Şz˙ăW{?@ I HôěÄôě991@ ‹ Œ žśÁŒ™ôěôîôôôî9905!54&#"5>3 #"73267zżŽXŔmiĂ[&ţŕđÖ÷¸•ˆ…ŹZˇČ89ˇ++ţÇţíţôţŔ"Ć˘Ş°œ˙ăł{ )%654'2273;#"&5 '&'&'& 56BLţ+>ç—üwšŒ9P!1„jâţ”cGF:ţ“šÖŠĎ>8ţœE#Züču”™aœşČQ`vţíţ˝‘gœť("chŽVŠ˙ę({09@ Œ Œž2ś2&Œ%!Œ*™2 &.F1üěÔěÔÄÄ1ôěÔěÔěôěÔě0&'&54632&'&#";#"32767#"'&546ÁwA@ôŃQ[\ihWVLŠ”HH‡ŚŸ–¨Z[­c[[MaZ[Vţ‹Š”_A@^†ž § VJ=+,nQb54"­[\Śm”Š˙ę({(<@! ‹ŔŒ#ž)ś) ‹ Ŕ Œ™)& )ÜÄÄÔěÔě1ôüüěÔě9ôüýî0#"&'532654&+532654&#"5>32„•ţë˙Uś`Lśd­ľŠ–žĽˆ•ŠK­hiˇPŇô‚_”mڎ­"#ibQnW=JV§ž†^8˙ę™{B#"&'5327654'&+5327654'&#"56763273;#"'&55c88hhż@ˆH9DDK‚CE@?qv|f6688h8AANODE<ž[KЊO 0ƒA=Ó1_JJmŚ\[­"45bQ77,+=J++ § OAfƒ”™10œ`ZȢA°˙Ő"y( !27654'&+532764&%632#"'$žţ­Sv<;;!‹ˆˆ‹!;yţąUĄ ÉkbbkË ŸUţíŘţ^ţA;;LL67šss.­”gŽŽg”Ž=ÂXŠşţVq^!+53265!5!!5!qţŸłĽţęZZţţĂőh¤ţ(ĂӜ}}ؤgţ {ţH4&05476;#"#"&'5326=#"43#"326íHH†1:hhÎ>†CO‚6xn#{XŽĐĐŽ÷Ömssngn^ Ăijœ>>~űĘűƒ‚ś.,˘°}^\:é<ýۧŘţbŮڝţH4^ $!"326#"&'5326=#"4763!|ţř‡Žˆ‡¸îçLŚSb C•ˆ,˜mÄęuqČé9§ŘţbŮÚţÝüţüś.,˘°}^\:ᥟzX˜ %#5!#"!2&'&#"32˛œBHXNĘüţÖ,>hh€xpVH˛dbbd˛Ž˛Œýđ">:KŹMrqţfqrfţQk^".5 3 3265â+]ŸÜž^+ ţrÚ.$Řý‡ăaËŰ<ţTţł8VA""AV8TŹţrŽú–LE"ţĐţńEfj^ ! 5473 33254Ö˛ţăţѸţrÚ(*Řýöu{q?ńţ˛§ąňţsýZž;hh?źţR^332653##"&ź¸lp‚Џ¸2¨rʍ¨śýJ—ގŤyůôVadáĂ>32#4&#"#5476;#"}2¨rʍ¸jr€Œ¸ZZ¤ÎşZX `cáäýJś—ގŤý‡ę”Ăijœ|~ĂţV(>32+5327654&#"#5476;#"}1ŠrŤŠX[ĽĚ¸[-,jr€Œ¸ZZ¤ÎşZX `cáäý6Ăijœ>>~ʗގŤý‡ę”Ăijœ|~Ž23#!!!!!5!!5!! ¸¸ţâÖbţžnünlţ‚~ţâéÍţ ¤ţˏ5¤iĆ ^!#"'&5!5!; ĚŚZXţŕŘXZşjfĆ;ý8~| 2^ !!!!5!! ’ţ’nünlţ”^üžBXy&;#"&=&#"5>32!5!3267#"'’.H>Řꤜ./OIN’S)&ţÚŢr\F‰JKOUi–“(?œÔÂĆ ;?Ž<6‰ü§5=>Ž;7-4 ;#"&=# 5432!5!3#'&#"3Ş[YÖ輾>ţéö5*ţŮßúú¸GN\–|~œÔÂÜ˝öƒü󠠄K9 ţV  ;#"&5!5![Y×鼾ţŮß|~œÔÂِ(ţL¨-;#"&5#5!!2#"'&'532654'&+5!¨HHŹť„‘쀺ţˇTgOE@óŕKOPUC W˜ JJ„ŒXýě–|~œÔÂůţA¨ţ$8+lhŠÝň%Ă12–„KJŚóhj{!%#"&3326532653#5#"&2"hJˆn¨4FP<¨8”8¨¨ d>LfHEŃ!‰ýís{ĺýđp{ĺű `LfHEŃ!‰ýís{ĺýđp{ĺů×)32+532654&#"#4&#"#3>32ž"iJ‡oĄ–ş¨SN5FP;¨9JI9§§!c?S,5îHEŃţßýcÂԜ|~•ís{ĺýđp{ĺý^^@;#+˛ţVM{+532765367632#4&#"ę{ˆ5Dş1DCW¨VVš\^oA@ÖŔœ01™rŹe22wxčý\žŸž__¤ˆţV{ 4'&#"#3>32;#"'&č./]p@Aľľ2†X¨VV?4ˆ<>˛ŸOO__¤ý‡^ŹedwxčýH™10œ``A{ !3!#ÝÄţđţ#Ä{üy‡ű…‡üy‰˙ăH{  #"%"!&'&!3276Ň÷öęéöߌH?7?HŠýÓ4HŒH4{ţŇţâţáţÓ-’m_°°_mýŕ„OmmOEŒ`!!!!!"'&763#";ţ‹dţœ€ý¨ó~~~~ó —KKKK—`Şţí›ţ¤ŹŽŽ“hgĎĐhiŞ˙â&{.4'&#"3276=332#"'&'#"'&57!2€9P‘ƒHJ|")u) }Ś07‰_CC_vD8@jëxZţœqĄosçţČO+šśśš+OŤˆžz2ee2zš|ˇ˙­ í°‰ţVH&/#5!#3!535&'&76767654'&đ˜đĄ_|{_˘đýhđŹd{{dʏE,HH,ýO1HH1o¤¤üu—ţâţá–uđĽĽí{–—{¨üÂBnŐÖmBü×HImÖŐnI˜˙ĺą^732653#5#"&'˜;zIŹśšš.żƒDv6ç.*ŘĚ+ű˘Űw"$˜˙ĺą732653#5#"&'˜;zIŹśšš.żƒDv6ç.*ŘĚěůáŰw"$fţV€^;#"&=#"&'532653YZNbĽł.żƒDv6;zIŹśš}}œÓĂďw"$ź.*ŘĚ+jţVƒ{.#"#3>32ƒ;zIŹśšš.żƒDv6y.*ŘĚü)Ůw"$jţVƒ{;#"&53>32.#"#,,[ęţĽłš.żƒDv6;zIŹ[[}?>œÓĂrŮw"$ź.*llĚ 2{476;#"!!5!RR´Ňźj&$pünhĺÔb`œ02˜ýޏ 2{!!5!4&+532ČjünnHlşĐ´RRĺýޏVš`œ`bzW^!#&'&+#!2327654'&#Ô7545ŽĂ˘?;;aŠš„ŮlkpýőĆw?@@?w 66^ţÎq$%ţ'^NMŚiŒţŻ++ST**zW^!#!3327673327654'&+ÔjpklŮţ|šŠa;;?˘ĂŽ545ţ(Ćw?@@?wĆSŒi˘QP^ţ)%$qţĐ^66ţ7**TS++źţV{8.#"#"';#"&=327654'&/&'&54632ŘN§[ˆDF20”@ÄRRz|Řhj&"nčţ´¤fdbb‚FF24Ş@ŹLLŕÎfľ?Ž((**T@%$!*ML‰Z[Ÿ70œŔÖű5-,QK((%$JK‚žŹ}ţVT+5326546;#"ÓłĽţęZZŠłÝŃcMĂӜ}}Â¸Ž™Qg}ţVT!+53265!5!!5!546;#"4ţŸłĽţęZZţţĂ=ŠłÝŃcMh¤ţ(ĂӜ}}ؤiP¸Ž™QgýĽ}ţVT^;#"&54'&+532Ó'&cŃÝłŠ--ZęţĽłČüßg()™Ž¸ |@>œÓvţV[!#"327673## 54!3476;#"8łtn!ʡż5RľţŃžWQĂŽ°d%'š3A0Ǜo@`ŘŇŽ´\V™()gŚţÂ+`!5!4&+532!!Hţ^˘^uĎáĎŞ+ţŐţÂ>`|b“ŚËý ţƒţWž!!;#"&5!5!f˘ţ^^uĎáĎŞţŐ+žţű÷|b“ŚË >˙ăŃ`!533!33##5#"&=)3276ޏ:¸™™¸CYYuÁÇńýÇ>>|•WMĤřţřţ¤ţ<Źf21đç ŸPO_U_˙âr`#5! 7654'&'5!# '&54767_şm?B° XXBGd´ěr86ţäţ>ŽŽ45wź¤ÜEio‡ŸÂabž’do?ܤdqnˆëţܑ’ä“kmhAw` !+"'&5#5!?27654'&'&UBr86ţäáFľRQ›S&(g3XXBO\LÚdqnˆëţÜ``Ö;ý6™12abž’dw7,HŠ`!# #3ŠÄţ˘ţ˘Â¤úŹüT`Â` !# # #33”¸ˇ­¸¸“ë­Á­jü–jü–`üj–HŠ >;#"# #4N”|’lLT2"ĆÄţ˘ţ˘ÂČČzšH†Tű˛lü”fk}3 3#fŮ%.Ůţ]Ë}ţ8Čýýó ÂţV`!!;#"&=!5!Ő§ýů;4ˆzýéţ `¨üۧ™10œŔÖ¨%§˙‘*`!#47!5!5!332!'3254#Ş™ţ–´ýejýLŻ<Űăţ˛ŽFX3<;4¨%“¨üŰ ö˝“6[}ţLT` 2!"'&'5327654'&+5!5!aj€bVQţĐţč^cdjTČmžcd\]ĽŽŽýejÜ8*mhŠÝň%Ă12KK„KJŚó“¨iţLh`$- 76654'&+5!5!2#4'07&#"327ăţą*öž \^¤ŽŽýejţeidTQ'd™(— }ŃžžcţL˝ű;*1…JJŚó“¨ţ$8+lg‹qUe¤R8yú*K/KÂ327654'&#"56763 #ž?żW::f°PONNLQQUŠmlpŞËrLb…Ar+Ź#}şŞswýtÂ#&'&5476!2&'&#"3ĘŞpln‰UQQLNONPłc9:VŔüâŒwsŞş}#Ź+rA…bLrÂ3!"'&'5327674'&#žËŞplmŠţíUQQLNNOPłc9:VŔôýtwsŞş}#Ź+rA…bLrÂţJ#476!2&'&#"32767# '&5Ân‰UQQLNONPłc99cłPNONLQQUţí‰n>ş}#Ź+rA…űŕ…Ar+Ź#}ş_-sB (47632 7 654'&#"47632"'&_ššŘԚšţŃţOţĚľedĆdeŠdeă"!/."!B^!"5ԜœÔŘţĐ0ٍccƍŠffff‰.""""./B!!Ń} -@ś śÂś  F!üě2ÔěÔě1/ěôěÔě9032654&#32654&#%!2#!›Ý]_Z^áŇUTTVţe˛Ŕb`sŃÁţcţ˜i?\dÂţčU?.VŠ”ˆi}œuš¨°˙Ő"y+";#"3$''"'&5467.5476322s9@< Љ‰Š <@7uTxţěV“­ddjbbjdd­–Ř6=š76NJ@6ž˘s—ţxţ¨Â>WV”gŽŽg”WV6l0%#5!#"'&76325476;#"#&'&#"32ÎtŁ:˜Ô{}|Ű3H ><ˆžN˝?7†KJJK†‚˛Œýđ2Ÿ   Ř^`œ03—”j&BrqţfqrA{ 3!3#!#ĘĘĘýăĘ{ţAżű…ýîĘţV3#3## 54!3!5#"3276š¸¸¸´ž5QľţĐÂţÂ3ľw{j&éËű ›p?`ÝÍяű3A0wţLZ` ## 33ZşýÜěRý–đ8şţL—ţ TýÝ#őÜ{3!!őĘý{ü/Ş#ţV|)%#"'&76325476;#"#276'&"ť,BC]ŽnmmnŽ]CB,==ˆžOšţ)??Ű????Ű?¨d01˘˘˘˘10dĆÖ``œ01™ůÚ¤ţjtsst–tssÂ$327654'&#"56763 3###53ž?żW::f°PONNLQQUŠmlpŞççĘĺärLb…Ar+Ź#}şŞswÔ¤ţě¤Â$5&'&5476!2&'&#";3###5HŞpln‰UQQLNONP°f::Wż>ĺĺĘç¸ÔwsŞş}#Ź+rA…bLrţš¤ţě¤˙ăš #26&"3!!!+5#"32¨dŻeeŻn ţaŸýő^!;8N€ĄĄ€N8:úţjçç–ç+^ţL¨üۓ¨a31DD10MüűţL´ C3276'&#"%#5#"'&76323!2#"'&'5327654'&+5!22XW3223WX2´o#55JzLMMLzJ55#o ö?M;31ś¨9;<@3xAr;<78chţqúţjtsst–tss_ü3¨d01˘˘˘˘10d^ţL¨ţ$8*mhŠÝň%Ă12KK„KJŚó6˙‘™ ,326&"!5!332+#47'#5#"3233254#ŠdŻeeŻţs ţai$„ˆČ\Ř\#jKy™™yKj#n0 h*5úţjçç–çüţ“¨üŰ ö˝3.#"#"'&'#"&5#5333#;532654'&/.54632/e6RR;Y%w02”‚6:8>q€aQQoăă-Ek>v;NTj&g[‡{=l?Ž((TT@I!,KL‰œś!&ŸŇ`>ţý ‰NM55YQK($)$•‚žŹ™ţV4%.!5476;#"+53276=#"'&5#53!3‰A<“‚„J==ˆ5%NĄ;=eeĽţçUžţÂNśZV™()gű)×_`œ02˜PMÔ`>úü ý Š&'ľ˙pž.6@3632&'&#"632#"'47&'#"&5#533254#"&57#3uäZ310.///0l;;;2vłČ1+\!r€aQQţ$-WO=ŐMTÝ-Ežţ‚#Ź+qrţfr°ö˝9DhT"2€ŸŇ`>úô9Kiř›ý ‰N‡ţVH3+5327654&#"####53546;#";67632G11l™Œ?KJYho´njjhqij;/´m(56Ft<;¤ýHÖ``œ01™˛Ÿžž¤ý‡Ńü/яNťŤ™PhcŽe22wxć˙ăë%7&'&#"#"'&'#367632327654'&/&'&ž;>ABgf$&n/•<>][ŁALODŠŠKT›LDCýëKEJIa54%"…0€92?Ž)TT?&$!,KL‰›\[&ý:ŠMVţˇýÎ3-+RK(#*$JAŰô 3!!!+ۊýůýqvŠóţL¨üۓÍüú˙âB 333# #333# #t‘‰‘tšˆ˜™ˆšt‘‰‘tšˆ˜™ˆUţéţéýýţ=ţéţéýýţ­B!#!#!#!#łýkłýkUţXţűrţXţű˛ţJ 4&+53232653#„ţŰ9O%5ˆzşpŠŠc×ęaœŔÖýBţĂž¤yůěbÉĹţV "32653;#"'&'5#"4'&+532ž”Zgo0>*m/2OŠë?*mbŔţĂž¤yűŽ”fœ\gçŹÉ×ę10œŔÖAœ @ ÔÜ32tNN^luu)qJy}ţ…wYYk\ţžgţŤ88†Aš3>32#4&#"#5476;#"ľ)qJy}tNN^lu43r “BŹ98†‚ţ†wYXj\ţž1Sw66WUć­ë 3+532653#wtgr,B0ttý‚xlX6Vr‚™œ8.#"#3>327.bjtt%uT Ż qkţśsa97™Œ832653#5#"&'š.bjtt%uT ü qkJýa97Q­€32653;#"'&=#5#"&'Q.biuB-r33$vS ü qkJýŐH VX66x a970œĄ!+33276?3327654'&+ŹCGDD‰ôuj=%%(f{n!!!ţ×|K((((K|éN;[--sţ÷?ĄŤ5˙/.œB 333# #t‘‰‘tšˆ˜™ˆţéţéýýţ­Ŕ+5326?33Š1]O\D05 ţâ{ÜÝ{bpEW(K/iţę˙˙ětëfČ˙˙ĎÇ-ş˙˙ĎÇ-ť˙˙đÂáÁ™ßďň452654DŽŕ@XX@rPPPPď=>X@?X=>POćPPßďň"'&4763"3ňtPNNPt@XX@ďPPćOP>=X?@X>^Žső327654'&#"567632#ý(y6$$>q31210336­WEDGkM@*7K$@ ` XFh_@Cţ“^Žső#&'&547632&'&#"3ÓkGDFV­63301213q>$$6yMţAmC@_hFX ` @$K7*@)î¨f7@ şš Ôě91ôě290K° TK°T[X˝˙Ŕ@878Y3#'#“ö‹ľ´‹fţˆőő)î¨f7@ şš Ôě91ô<ě90K° TK°T[X˝˙Ŕ@878Y373ö‹´ľ‹öîxőőţˆ$ç­@ÔĚ1@ÔÄ0#ʈýŐ+˙˙=b“ö‰$ţŃ­ü@ÔĚ1@ÔÄ0%#ʈüýŐ+˙˙=ţ›”˙/śś#!!h˛ełłţ›ŮJý'ţśśŘ#!h˛eŮJ˙˙ßţň#bţ˙˙ßţň#cţ>˙”U 533##5#5–ŕŕ–ŕuŕŕ–ŕŕ–ˆßJu!5!Jţ>Âߖ˙˙/)˘H‹˙˙DÎŒVá{ W˛Č ¸@ Č P{PÔěôě1Ôěôě0K° TK° T[X˝˙Ŕ@878YK° TX˝@˙Ŕ878Y#"&546324&#"326{ŸtsŸŸstŸ{X@@WW@@Xôs  ssŸŸs?XW@AWX¤ţu"ł  ¸@  |ÔěÄÔĚ1/ÔüÄ90!33267#"&546w-+76 >&Dzs5=X..… W]0i˛7ť@!  ĚĚ PPÔěÔě99991Ô<üÔ<ě99990K° TK° T[X˝˙Ŕ@878YK°TX˝@˙Ŕ878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ†”!7JQ†”˙˙XîfţĄŢs%3;!"'&5ţĄk¸&&iúţńŻWRý–d¤”™10œ`ZȢ%ŞŹ '&73733256ľ˛ňţöśúˆż¸ˆţꋇ€Üů´‡Ŕń/ŕŕţŠŽ˜MMŒVœ| ;#"&5#5!„88ˆ’hrş.EGWwl:Q[œv/).#"#"&'532654'&/.54632P1j8WV>](}24›‰8{D@}=RX o)k`‚@q a//$)*+MWfk2-*SIXaœż #'#37ą˙ ‰Î͉úˆźťţĎţžööH+ßß^œs#&'&547632&'&#"3ÓkGDFV­63301213q>$$6y[ţAmC@_hFX ` @$K7*@,ĽX!!5!ţyЈú¨,ĽX!!5!3ţńˆœˆ4ú¨,ĽX3#!5ˆˆţđhú¨hˆ,ĽX3#!5ˆˆţźœú¨4ˆ,ĽX%3!5ˆý‡ˆĐú¨ˆ˙˙ÓÇüż˙˙ţ D˙ÁŞ˙˙îöfC˙˙Űîşfv˙˙)î¨ff˙˙˛7v=b“öśśÔĚ1Ôě0!!=VýŞö”˙˙ťŃ Ô/)˘H š @ šPPÔěÜě1ô<Ôě0332673#"&/w `WU`w ž‘žHLJJLDÎ@ ŢÝaÔě1ôě03#ÍÍĚ˙˙?F‘j™ň8Ć2#567654#"56Jć24”C1xZ@VĆŞ@$C!Xl05^ ƒ˙˙Vá{tXîf%@şšÔÜÔĚ991ô<ě203#3#Şŕ‰ łř‡fţˆxţˆ˙˙)î¨fg"#ވŞţDź˙˙VîvŞ'’Ě’˙4Ňîf#!#„͇řž‰ßfţˆxţˆx˙˙/)˘Ü'sĚr/)˘H >32#.#"/ ž‘ž w`UW` )LJJLŐÇ" #3ÄﻒÇYďÂâÁ#55#53áńppńĂţ˙{‰ţđÂáÁ53#3"đńppńĂţţ†{Űîćf3# Ćqšfţˆ˙˙yý¸X˙0CbřĘ˙˙yý¸X˙0v˙žřĘœýÔţë53#5#5Lˆˆ°ţ:ąţąˆĚýţë#33Tˆˆ°ý˛ą깈s†^p!5!#ÖţžęˆčˆţŁü.q532654&'3#"&Ł=X..… W]0ihw-+76 >&Dzs5úţ Ö˙Á "&463"Ö]]3GGţlb€¸bG23Gbý˛Lţë3!5353›ąţąˆţ:ˆˆą^ý˛Hţë#5!##ą깈ţcˆˆą_ýIţë #53533##ąąˆąąˆý˛ˆąąˆąsţc^ţë5!tęţcˆˆöţV€ %+53276=YZĽÍšZ-,€”Ăijœ>>~”śţVۀ 73;#"'&5śš,-ZšÍĽZY€”~>>œjiĂţcÎ˙/@ŢaÔě1Ôě03#ÍÍŃĚ?ţd’˙.@ ŢaaÔüÔě1Ô<ě203#%3#@ĘĘˆĘĘŇĘĘʍţ D˙Á ľ ÔĚĚĚ1ľ  ÔĚĚĚ0#"&546324&#"326D]\\]bG33FF33Gţć\€€\\\2GF34FG˜ýâĺ˙;@ÔĚ1ÔĚ03#öﻒĹţ§‹ţu)8ł  ş@ |ÔěÔĚÄ1/öţĹ90@ IYiy‰™]!#"&'532654&'ź85xv-W,"K/:=,,>i0Y[ ƒ0.W=˙˙Žţu#u $ýs­˙/#ʈŃţDźUýĺ|˙/#5!#|‰ţë‰ŃţśÂÂJÎţ9˙X#"4533273273"h;tÚv gfv ifvÜtţ‹R––•–ţâ)ţ¨˙“@ ş Ôě91Ô<ě90373ö‹´ľ‹öţxőőţˆ)ţ¨˙“@ ş Ôě91Ôě2903#'#“ö‹ľ´‹mţˆőő/ţ˘˙8 š @ šPPÔěÜě1ô<Ôě0332673#"&/w `WU`w ž‘žČLJJL/ţ˘˙: #.#"#>32˘w `WU`w ž‘žţLJJLţ˛˙5†@!  ĚĚ PPÔěÔě99991Ô<üÔ<ě99990@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@ţX7JQ†”!7JQ†”=ţ›”˙/śśÔĚ1Üě0!!>VýŞŃ”˙˙ţŃţmB˙˙ţŃ˙]š˙˙Xěy aÄ&h!5&ühh¤¤ÄŃh5!ŃĤ¤/˙ –ź'‹\ ]`LĐM˙ş°'ogDdFFJúţ Ö˙Á 26544#ú3GG3]]ţlG32Gb¸€Uţ€|˙Ę3!53U‰‰ţ€JÂÂţśUý |˙/!!|ýŮžţëŃýÚ&ţbţęÎţ9˙X632#&#"#&'"#72h54'&' ’ˆRJ 6"”†RH Ç0PQn +0PQn ˙˙ËŃ &ÔÔ˙˙˙ďÂâÁ˜˙˙DĎs˙đž7"#4%62#&% nţâţô~vüäéĺüvţóŽŽđ<<đŽětëf3ěAžntňţćţVĺH%#ĺAžnHţňţVú˙¤ #"=3;ú„X•3ţVˇ—¤h˙˙“ţáň'˙˙Űîşfv˙˙?FşŘ&jĚr˙˙Źf&×Ěţ>˙˙é/ĺ`y˙˙˙Nf&ŰĚýD˙˙ţíHf&ÝĚý˙˙˙f&ßĚýD˙˙˙ľ˙ă\f&ĺĚýÚ˙˙ţpŹf&ęĚü•˙˙˙·f&îĚýó˙˙6ĎŘ&ţÍ˙˙%ŹŐ$˙˙ŚqŐ%˙˙×sŐI%ŹŐ1´/0ôä1´´—/ěä0@%%%%ěěěě% !3Şţžţž†űyÉőŞyű‡ŞŐ˙˙ĹNŐ(˙˙œ‘Ő=˙˙‰HŐ+u˙ă\đ6@ 26 25üěÄüěIJ€]1@—–—ą —™ôěôěôě0!5!#"32#"320ţqY‡š™‡‡™š‡Ó÷ýýö÷üý÷ÇŞˆIţćţˇţ¸ţćIţzţ€~ˆ‡€ţ€˙˙ÉŐ,˙˙‰ÉŐ.%ŹŐ0´/0ôä1ł´/<ä0@%%%%ěěěě3#3#öŃÉőÉŃţŐú+#˙˙VyŐ0˙˙‹FŐ1‰HŐ (ˇ1  Ô<Äô<Ä1@ —ˆ —ą — /ěôěôě0!5!5!!5HüAôý×)ËüAŐŞŞüňŞý9ŞŞ˙˙u˙ă\đ2˙˙‰HŐU˙˙ĹuŐ3xmŐ <ľ 1 Ô<ä21@ —ˆ—/ě2ôě20@% %%%ěěěě !!5 5!!ţ9"ü Ćţ:őüŢëýżŞŞA@ŞŞ˙˙/˘Ő7˙˙%ŹŐ<uZŐ&/M@"2  &,2(0Ô<<ÜěÄ2ü<<Ä2Üě1@&(——ˆ '—  — /ü<Ü<ě2ôü<Ü<ě203!535&'&547675#5!67654'&'Ͱa|{aą“ţ“ąa{{b°“ń“L+CC+LËL*DD*+v[sëësZtŞŞtZsëës[vŞŞüŁ*DžD*ýÉ7*DžD*˙˙žŐ;uZŐ9@  Ô<ÔěÄü<ÄÔě1@ —  —ˆ/ä22ü<Ü<ě2067633!535&'&3ÍI.KË{b°“ţ“°b{ËL-IŐü["W‘DWţŠţxż— ÖŞŞÖ —żˆWţŠţź‘W"ĽJ‡´@@qqro prol ôěäôěäää991@ ř÷ů/<î2öî0353&5323!5654#"Jő{n đň!o{řţ1x†´ššł†xʆ ź7oţ’ţČźţß…ŹŹLIŢć ţ÷ćŢţˇLŹ˙˙ÉN' )uß˙˙%ŹN' )uę˙˙F˙ć•f&öĚ˙˙Š˙ę(f&úĚ˙˙ĂţVf&üĚ˙˙6Ďf&ţĚ˙˙3˙˙iŘ& ÍF˙ć•z *'&'&3273;#"'&''&'&767ţ,-ąb=MJMU…Hi;c¤Í( #) Xn^T).\-Ćrv~Ą çěo‰ˇÜikŐ*ţ˝%ýĄŰ1)0œT*XmY*–œ)‡——ţVa#%#54'$QšÍŤţ‚ŤQă ţ0kęţűEţçţšţěb6ţŃţ=q'Ş0˝ ţŕ ţVm`&+532 3#Ü-^1FÂA˙Fżţ[žD~ž°ýS]ű ţVމ˙ăH" 4"32654&%&'&54632&'&#"76hŒŒţY(>íĹf2—BFUR I<' )iëy|öęéö{ßÚÖŐŰŰŐÖÚL (=\ˆ¤ $­+.! ”—ţâţáţÓ-—&˙˙Š˙ę({˜ţR&%#457654'&# !5!ř„OTJPŁE* :ýľLýěfüţ.,KOxsPWKL,#%5,*3ŕeššţaţZţiĂţV{.@ J  Fôě2üě1@  Œž ÂĂ /ääôě90#4&#"#3>32šjq‹¸¸1¨sŤŠśű `—ގŤý‡`¨`cá‰˙ăHÜ9@ D >ôě2üě21@ śŒŒ›™äôěÄěśďż@]ě0&'&#"!32762#"ƒ?HŒH?5ýË@HŒH@ţëé÷öęéöö<⇙™‡â¸ŕ‰šš‰8ţwţţŠţy‡vs‰6Ď`@ ÔĚüĚ1@ śÂś/ěôě0;#"'&'#5Ä"$lYo´RQŇ`ý+‘.0œ`bÔ;˙˙ě˛`úD† # #'&#5‚ĂţĆţ~ĂëJ/š1Feú›<üÄ2Ćž˙˙ĂţTž`wtB`!367676'&'31ĘţŞĆ!xdLjşE.*ˆą{`üT|ʁp5dwƒY|rNÄŻätĄţR8&%#457654'&# 4%$47#5! „OTJPŁE* 9ý’MţčÜĐý‹ýÇKOxsPWKL,#%5,*áčp$ĹRššţÝż Ş&Üţż˙˙‰˙ăH{RP˙Ůž`!#3267#"&5!##P117,#J%q\ţT´`¸ýPH?… ƒ°œüX¨žţVT|.@ G  Fôě2üě1@ ŒŒž™ Ăääôěî906#"&'#764&#"326„čttčĘf™,šnƒ䇅†ŠŠ†…‡{žţęţďţÉWSýÉĆ<†ý´ÖÚŰŐÔÜÚĂţR%{$%#457654'&# !2.#"ě„OTJPŁE* :ţüţŰ%QšNI“]­ş]^KOxsPWKL,#%5,*8(8*,ÁA:ŕĐŃno‰˙âk` 2@  D>ôěôěÄł991@ ŒśÂ™äôě2ě0"32654'&7'"763!a‡FHŒŹ<ÝΗr×éö{sń§PSŐŐŰےů-˘ţćä§- ™¸Ÿ2^!@  ÔĚüÄĚ1@ Œ Âś/ěôě20%;#"'&5!5!!ć$lYo´RRţ˜’ţ’Ě0œ`bÔśśýă‘3˙˙i`%27676'&'31%"'&5#5!t–Z;jşF-*€…ţú´RRҏ"#œłvťf€wƒZ{sšáËÓ`bÔ;ý+‘.0LţV…h )O@ '#*° KQXÜÔYěÔ´0'€']<Äü<Ô´0€]ě1@'ŒŒ ž™Ă*ěä2ô<ě2ě20"27654'&'2##"'&7673A\VMMG*ŠwÁˇÇ|~~hšA1LLNeˑýRh]ßÝc[„ţŮţ斘ţn‘™›,„mŁKsžŘegŻ.YţVx`#&+53 3;# îŽţ÷żtˇ/œ1FC żţ‹ś/1Fţ˙úzýÖ ĺ~ž°ţ„,üôţ~žƒţVN`%67653#&'&533Ä?>Tš‚yˇy‚šT>?ˇŒ@Wځýxؑ‡ţo‘‡‘ŘˆýŚW@ÔF˙ăŒ`&#"&'#"'&37676376' ƒ2KşU‚€XşK2ƒž~)@V"Ş"V@)~`ţřýż{šgLHkš{Aţíţáâ>‘oRyţ‡Ro‘>â˙˙6Ď&ţj˙˙3˙˙i& j˙˙‰˙ăHf&Ě˙˙3˙˙if& Ě˙˙F˙ăŒf&Ě•˙čC$ # 76'&%$'&763 '7676] N“ŹŽI5í|Ŕu˙ţítf €†ŇM2ţŽCđ6RĽŻ6WpA{‰ĄĽzýúţ‰á Ʋ—ĘÔţ‚Í˙ ţýiĄ˜őr˙éS$ $6'&'&'&7!2#"'&3276‹5JgŹ“NéţÝnđ-RŤ‡€ €‰äÁŸ• ĂNr^ydPpżwŚĄ‰{AŞ K¤ű~ÔČţţ}ĆŐŐČëţSjœ~"šá#4''&5676'&­qO*Ë*d\txL—Jsĺo@z8 vVOţúĽývŠ´~*+4Ş0ţr‰51_”T˙˙ţpšf&Ěü•˙˙"šN& )umţVdŐ'#&'&7673567654'&'ĸłh„„]ž¸˛i……^˝V5RR*a¸W4QQ(ţV“y–§vaţŸx—ţâţň§xĽGnŐź‡Fü˝CImÖšŠD9˙˙˜` !32376&7%&# 67#5!’ý°'TąŞŻQ0ţäî'(íţç 0A_¨ýţŤÓţ+Tý‘÷ýß3ţĚ ¸3ţ[’g/&'&7'&7676'&#"56776327'5˝ö!˝`ȍ=`ˆ[+Ž9[R~ö!*˝`ȍ=`ˆ[+Ž9[&͘­7 đœclţ÷|Y‘DT„|ËŠhlŕ="îŒpl |Y‘DT„|ËŠhlýŕfMZ  uţV\đ #"32&'&32‰‡š™‡‡™š˙ł_{÷üý÷|^ľ ’ţćţˇţ¸ţćýĎ–"”żˆ‡€ţ€ţyţ|•"ţj‰ţVH{ "32654&#&'& hŒŒ1¸¨`{öŇ÷{_ßÚÖŐŰŰŐÖÚü ţm“w–.ţŇţâţá–v‹ţRLŐ#"32#457654'&#"'&76)çÚMb°zYTJPŁE* 9ęŸ{Ÿ‹2e+w˜ţÍţÎţĐTOxsPWKL,#%5,*˞nÍąŞ›ţR)`#!"#457654'&#"76))ţ›ÁI]]_b…NTJPŁE* 9ťţۓŠ eÄUlÔŃnoJOxsPWKL,#%5,*8(ˆ˙˙éXŐ)ţV#!47632.#"!!#"&'53276ވ`Š1c3$R,x:KAţż‹b­9f.1d0W@R‚ Žd¤>Qoţɏý?’Ľs¤!K_`˙üŐ7"'&76'&52ăn ę'BƒćQ_šýŹ'BƒćQ_‡ţ[~ý,`*l#˝FRśÚţ‘`*l#˝FR„M #!3Mţç¸âý&¸âpüĆMý]!ţVšń!#56#'0#0?&'&ŞbT›B×ŔŕáîŽ9[@[˝`Č7"7ţÜ>Ž9[@[ţă™ţ÷|"Oš Šz:6hlŕ0%ţÁ[Ml |"Ošţ÷Šz:6hlŕ0%?[MžţVT| 7636#"&')! $&#"32žn×čttčĘf™,¨ţhţՇ…†ŠŠ†…<†žţęţďţÉWSţsŞÚ)ŹÚŰŐÔÜ˙˙Ă˙ă%{F˙˙şţVMu˙ă\đ&'&#"!3276 32† 5Dš™C6 >ýżBC™šD@Ö÷ţö÷üý÷qßopŢŞţՈ†Oţzţ€~ˆ‡€ţ€˘˙ă {!&'&#"!!32?# '&76!2 %%cjˇf_Ľý[_fˇ€MJOhkţôœœ en('Ž c\АŠ\c§œœ(œœ ˘˙ă {"056763 !"/532767!5!&'&#"˘'(ne œœţôkhOJM€ˇf_ý[Ľ_fˇjc%ŽŁ œœý؜œ§c\АŠ\c ˙˙ɍՠ˙˙žţVTŔ˙˙‹˙ă1đ&VyŐ ! !###Vťţö™ţőşŐţ{…ú+'ţ` úŮţVO` !!###ĚΚâ™ăš`ţ{…ű ˛ţ` ú¤UţVT|##5#537636#"&'!&#"32wšiinƒŐčttčĘf™,á;‡…†ŠŠ†…ţĆppŞŹ>„žţęţďţÉWSţ㪓ŹÚŰŐÔÜ‹˙ă1đ7532#"5>3 !"&‹IŠXĹÄÄĹVŞJM˘[?ţĂţá[˘5Ď=@0230@=Ď))ţgţ’ţţj)˙˙‹˙ă1đ&/y‹˙˙‹˙ă1đ'y˙c3˙˙ĹNk' ,uK˙˙ĹNN' )8uK˙žţ*o×/32654&#"##5!!676767632#"'4=N qjqjW.EËö~ţC%0"@• X Uki÷Sţá•Ë —Ž*\Ťţo-ŞŞýó* % T päţFţčwu˙˙×sk' *HuI‹˙ă1đL@!—ął˛—ł˛—–™21 0üě2ü2Ě1äôěôěîöîüîąIąIPXł@8Y0327# !2&#"!^Ŕ˝ź–š°ţáţĂ?°š˜žžŁs•äţÖ}ĎR–oo™RĎ}ţôţ˙Ş˙˙‹˙ăJđ6˙˙ÉŐ,˙˙ÉN&< )u´+1˙˙m˙ăźŐ-˙íÇŐ%326&+32+##526!Z}y^ţţĎŹĘěŠvŚŽ•ţý¨âţHă+úţĆý÷ĄWŞ"ÇŐ%32654&+!#3!332#!Z}x_şţuşş‹şłwgţţŚŽ‚Œ•ý)Çý9Őýœdý¨qcęÜă˙žo×"676767632#4&#"##5!%0"@• X UËjqjW.EËö~-ýó* % T päţǎ*\Ťţo-ŞŞ˙˙‰Ék' *uP˙˙‹Fk' ,uN˙˙hm& 1Y‰ţžHŐ 33!3!#‰Ë)ËţvŤŐúŐ+ú+ţžB˙˙%ŹŐ$ŚqŐ2@— —ˆ—  21 0üě2üěÄ91/Ěěôěě032654&#!3)!qﰖž¨ĚýEë{e5……ţůţF†ÉýÝ{’‰fţ>żdĄËghŐ˙˙ŚqŐ%×sŐś14üěě1´—ˆ/ôě03!!לý/ŐŞúŐ!ţž°Ő0@  ÔěÜěÔěÜě1@ —ˆ—/Ě2ě22ôě0%3#!#32!!3!7yŞüĹŞM0'TËţB /ŃŞţBţžěL ŇŞţ×ŕţáţá˙˙ĹNŐ(ÂŐx@   Ü<ü<Ŕ91@ B´ /<<ě2290KSX@ % %ííY@ I:I:I:I:I:I:ˇ <<<<33 ##'# 3 ťĎţá0ĹŢYťYŢĹ0ţáĎŐý­SýŚü…Šşţ0Đşýv{Zý­˙˙‰˙ă7đ‹FŐ <@  B´ 10 üěüě991/<ě2990KSXÉÉY"33!#‹ĂřĂţŐű3Íú+Íű3˙˙‹Fm& 1N˙˙‰ÉŐ.FŐ$@  ÔÜěÔě1@ —— ˆ/<ôěě0#526!#ăËýŠv.Ë+úţťţĄWŞú++˙˙VyŐ0˙˙‰HŐ+˙˙u˙ă\đ2‰HŐ@ 10üěüě1ľ—ˆ/<ôě0!#!#‰żËý×ËŐú++úŐ˙˙ĹuŐ3˙˙‹˙ă1đ&˙˙/˘Ő7hŐ?@ B—™ˆÔÄÄ1ä2ôě0KSX@%%%%ěěěěY+532767673 3ĺ;E,LE\”mQ.-"ţXŮ74ŐŠžoJ+'Ź/.M *5üÂ>BŐg@2  2 Ô<<Ôěü<<Ôě1@— ˆ—/Ü<ě2ôÜ<ě20° KT°KT[°KT[°KT[Xż! ˙Ŕ @868Y3#5&%>54&'ĽIIĽË śśţőËúǸ ËĽIIĽ<{ÜÇČÜz ţŞţ˙ţüţŹ ˜˜ WS űáÜČÇÜ˙˙žŐ;Pţž•Ő $@ˆ —  ÔěÔěÜě1/ě2Ěě2033!33#PË)ˆŞŐúŐ+úŐţB‰DŐ @— ˆ   0üěÔě21/ě2Üě0332673##"&‰Ënmuz[ËËv–~ˇŻÔţŁPExú+’:Är`Ő &@   ÔěÜěÜě1@ ˆ—/ě2ü<<0)33333`üşŕşŕşŐúŐ+úŐ+<ţž°Ő/@   ÔěÜěÜüÜě1@  ˆ —/Ěě22ü<<03333333#<şŕşŕş†ŞŐúŐ+úŐ+úŐţB uŐ*@ 2 ÔÜě2/ě1@ —ą ś ˆ— /ěôěôě0%32654&+!5!32#œŒŠĘţűϊűţţúŚ“……”ý)+Şý¨âÝŰăAnŐ ,@  2Ôě2/ěÜě1@ — ą—ˆ/<ä2ěôě0!3%327654&+332#ŁËü[fN+ôěěüěÔÄ1@Œ"ś#ś(Œ ž™+äôěÜěÔěî0! 3 632#"6/&4767676%67…ţăţ䐌ý˜xŢŢ÷öęéű$[§€3#F#3đbJĹ/°ţPŐہ{ţŇţáţâţÓ3-§wR•IšUA Ž  +tšŃ` -@ś śÂś  F!üě2ÔěÔě1/ěôěÔě9032654&#32654&#%!2#!‰ď_eUkóäUTTVţeŞČ_c…mŃÁţcţ“pPO^ÇţĎUCCV–špoˆuš¨ń`@ śÂÜěÄ1/üě0#!š¸đĘü6`–iţâh`0@  ÔěÜěÔěÜě1@ ś Âś/Ě2ě22ôě0%3#!#325!!3ďy–ý-–C7 ěšţ„"–ţLţâ´Ćd ü64ţňd÷!˙˙{˙ăX{H;—`x@  Ü<ü<Ŕ91@ B /<<ě2290KSX@  ííY@ I:I:I:I:I:I:ˇ <<<<33##'#3¨˙Çďłżh¨hżłďÇ˙`ţP°ţlý4ąţĄ_ąýđĚ”ţP˙˙Š˙ę({Ă` =@ F üě2Ôě21@B /<ě2990KSX@ ééY #33#bţ¸¸縸)ü×`ü×)ű ˙˙ĂH&‹n˙˙ě˛`ú`"@ ÔÜěÔě1@śÂ ś /<ěôě0!#!+53265 ¸ţ_—ş7#U^`ű Ęő˝ţŃé–vŽ=›` N@B      Üě2Üě21/<Äě290KSX@  ííííY3 3###=¸ww¸¸ţĺ¸ţĺ¸`ýMłű ĺţáýĂ` $@ś   F üě2Ôě21/<ä2Ôě0!#3!3#bţ¸¸縸ýý`ţ9Çű ˙˙‰˙ăH{RĂ`@śÂFüěÔě1/<ôě0!#!#bţ¸W¸Ęü6`ű ˙˙žţVT{S˙˙Ă˙ă%{Fá`@ śÂÜüĚĚ1/üü<0#!5!иţÉ&Ęü6ʖ–˙˙hţV`\cţVec@    Ô<<Ôěü<54&xjjxÜÉÇ޸ŢÇÉܸ¸xjjÖ™őő˘œ ++ ™ţgţőţŐţŐţőţs€üŠ˘őő™˙˙L…`[|ţâ^` $@ Âś  ÜěÔěÜě1/ě2Ěě20%#!3!3^–ü´¸渖ţL`ü6Ęü6Ăb!@   FüěÔě21śś  /ě2Üě0332673##"&øknXrE¸¸5Œ‹ŒČóoţ‘d]'őűžŇ+Ł}U` $@ Âś   ÜěÜěÜě1/ě2ü<Ä0)33333Uü(¨đ¨đ¨`ü6Ęü6ĘPţâ¸`-@   ÜěÜěÜüÜě1@  Âś/Ěě2ü<Ä0)333333#"ü.¨đ¨đ¨–`ü6Ęü6Ęü6ţLŒ`)@  ÔÜě2/ě1@ ś ś Âś /ěôěÔě0%32654&+#5!!2#Îř|†‰yř¸ř°Ńíč֜XZZZýţʖţ;§¨¨¤hi` +@   Ôě2/ěÜě1@ śś /<ä2ěÔě0!3%32654&+332#ą¸üľS|†‰ySśś[ŃíčÖ`ű šY[[[ýü`ţ;§¨¨¤Ă8`*@ś ś     Füě2Üě91/äěÔě0%32654&+3!2#{ř€€ř¸¸Đíç֙YZ^Xýţ`ţ;§¨¨¤Ă˙ă%{K@  Ü<Ôě2Ä1@‹Ŕ‹ŔŒ śŒž™ äôěÜîţôîőîą IąIPXł @8Y07532767!5!&'&#"5>3 !"&ĂA˜`Ź^S ýâE^Ź]“INšQ%“’ţüR9ż>;qd°‰Rp:AÁ,*ţČţěţ윜+N˙ă{ ?@#Œž Œ™ś   Üě2Ô2ěÔě1/äÜîäîôě904&#"726332#"'##3ÍpLLqjUUeý9Žҝß暙Óޏ¸?ĆŮôÁÁęúţÜţÓţŇţçíţ`¨Ř`B@  ÜÔěÔě291@ B śśÂ /<ôěÔě90KSXˇ  ííY;#".5463!##“r7äă8rë5ŞÜ–¸ÁţţaUmVüŒß‚§¨šű Çţ9˙˙{˙ăXm&kCâ˙˙{˙ăXż&kj#Ż#ţVT533!!>32564&#"##ž¸Ŕţ@1¨|°śúíy­j{Š‹¸я´ţLţs`cćßţ´ţŽ.Ľ˜ˇŤţűŃ˙˙ m&ivQĂ˙ă%{L@ ‹Ŕ‹ŔŒśŒ ž™  F ôÄ2ü2Ä1äôěÜîţôîőîąIąIPXł@8Y0%# '&!2.#"%!3267%JRţü’“%QšNI“]­]Eýâ S^Ź`˜A9++œœ8*,ÁA:pS‰°dq;>˙˙Ő˙ă{V˙˙˛DL˙˙˛D&ój´ +1˙˙şţVM Ë`%2+##+53265!327ĐĐ ˝ĺRCź'#U^5Ÿíč™iţ—™Ęő˝ţрi–vŽŽţ;§ţ°¤Až`%254+32+!#3!3 ĐĐ Ÿí褽ţ”¨¨l¨™ľ´ţ—§ţ°¤ýý`ţ9Ç#9533!!>32#4&#"##ž¸Ŕţ@1¨sŤŠšjq‹¸я´ţLţs`cáäţžB—ގŤţűŃ˙˙ě˛m&pv0˙˙Ăm&nC@˙˙hţVH&‹yĂţâ` 33!3!#øç¸ţ —`ü6Ęű ţâ˙˙u˙ă\đa˙˙‰˙ăH{×s@—ˆ14üěüĚ1/ôěĚ03!3!×ň§ý/Ő2ţ$úŐňš@ śÂÜěÜĚ1/üěĚ0#!3š¸8š¨üX`:ţUsŐ 3!!!!##U‚œý/#ýÝ˂číŞţ˝ŞüÂ>ń` !#53!!!!‚‚đýČ ţ`ô޸ţöŞţ ×ţfsŐ#!!!2+5327654&#˘Ëœý/7şqohfäL>†87||Çý9ŐŞţFwrîţÎţô|zŞKKÂ"ŸžţVR`#!!3 +5327654'&#š¸đýČúHRRQľÁŹn!&&1†çţ`¸ţĎGQĺţňÖ``œ07“Ş )ţžÂŐ3 3333###'0ţáĎťĎţáö:ŞŢYťYŢ{Zý­Sý­SýŚý/ţBŠşţ0Đşýv;ţâŽ`33333###';ďÇ˙¨˙ÇďÍM–4żh¨hżĚ”ţP°ţP°ţlýĘţLąţĄ_ąýđ˙˙‰ţu7đ&ʎM˙˙Šţu({&Ź˝m‰ţžÉŐ%3###33VrÔţšËËwíýťŞţBě¤ý¸Őýh˜ýžěţâ˛`%3###33,†Äţb‰žžăŕţG¸ţ*Bţ?`ţ/ŃţZţžłŐ%3##!#3!3ŢŐŐËý×ËË)ËŞţBÇý9Őýœdbţâ|`%3##!#3!3šĂøţ¸¸縸ţ*ůţ`ţC˝˙˙‹ţu1đ&ŹdW˙˙Ăţu%{&Źhw/ţž˘Ő %3##!5!!ĎŐŐËţ+sţ-ŞţB+ŞŞáţâ` %3##!5!!ĐĂøţÉ&ţɸţ*ޞ˛˙˙%ŹŐ<\ţVt`3 3#\ĂIIĂţTŔ`ü”lű˛ţDź%ŹŐ3 3!!#!5!5%×lkŮţ! ţöËţřŐým“üÉPŞţ\¤ŞP\ţVt`3 33##5#535\ĂIIĂţTČČŔČČ`ü”lű˛5–ńń–5ţžżŐ%3## # 3 3XfÔţ’ţuÚôţPŮHNŮţAŞţBƒý}žýÍ3ýBLţâ†`%3## # 3 3úŒÄţ¸ţšŐ¸ţoĚ)'Ďţo¸ţ*Áţ?Hţk•ýčŒG×#4&#"#36?6?2GËjqjW.EËË#20@•0 X Uôţ ڗŽ*\Ťţc×ýU'% T p˙˙ĂK˙˙ÉŐ,˙˙Âm& 1L˙˙;—H&‹l‰ţf¸Ő32+5327654&+#33sˇtohfäL>†87||—wËËwíqwrîţÎţô|zŞKKÂ"Ÿžý¸Őýh˜ěţVm`3 +5327654'&+#33j:HRRQľÁŹn!&&1†Ý'žžăŕwGQĺţňÖ``œ07“Ş )&ţ?`ţ/щţfHŐ%+532765!#3!3HhgăL>†87ý×ËË)ËhţňzzŞKKÂ_ý9ŐýœdĂţV`+532765!#3!3RQľÁŹn!&ţ¸¸ç¸Ö``œ07“ ţ`ţC˝ŒţžG× %"'&'&5332767653##|#3/@•0 X TËjqjW.FËËŐŞ$'% T päŃţI—Ž*\Ťzú)ţžěĂţâb%6#"&53326=3##c<1TsŤŠšjq‹¸¸Ă¸~3$2áä ţő—ގŤÎűžţâÖÇ#¸ůá˙˙%Źm& 1F´+@ _PO@/ ]1˙˙…˙ă#H&‹f˙˙%ŹN&F )u´ +@p0? /]1˙˙…˙ă#&jf˙˙œŐˆ˙˙)˙ă°{¨˙˙ĹNm& 1K˙˙{˙ăXH&‹k˙˙u˙ă\đQ˙˙z˙ăW{ţ˙˙u˙ă\N' )uÄ˙˙z˙ăW&jĹ˙˙ÂN' )uL˙˙;—&jl˙˙‰˙ă7N' )˙ďuM˙˙Š˙ę(&jńm˙˙˙äˇŐy˙˙}ţLT`7˙˙‹F0& 6N˙˙Ăö&‰n˙˙‹FN' )uN˙˙Ă&jn˙˙u˙ă\N&T )u´ +@p0? /]1˙˙‰˙ăH&tj´+@ pO@]1˙˙u˙ă\đ*˙˙‰˙ăH{˙˙u˙ă\N' )uÔ˙˙‰˙ăH&jŐ˙˙‹˙ă1N' )˙ßuc˙˙Ă˙ă%&jěƒ˙˙h0& 6Y˙˙hţVö&‰y˙˙hN' )uY˙˙hţV&jy˙˙hk& 3Y˙˙hţVf&y˙˙‰DN' )u]˙˙Ă&j}×ţžsŐ %3##!!˘ŐŐËœý/ŞţBŐŞţâń` %3##!!šĂøđýȸţ*`¸˙˙AnN' )ua˙˙hi&j˙˙‰˙ă7đR˙˙Š˙ę({ú˙˙uţň\đ4˙˙‰ţRwT˙˙ŃŐ:˙˙Ń`Z1˙Ů–"$/#4'&'3767653653#"''##53— ra{ .r &q,bS !żžöţ/”ÓŰ#12j˙î{˘Í@E#$]|0qŤ!<"üÉ5üÇDƒúAŰb1˙Ů–)*5"32767#"'&54767&'&'&76'##53|LAV:218UG&/=8O6-N@?_F?D(7-"ŽGqžöţ/”ÓŰ#)^ %$ \*$@.!* n F?\KH* #TH#űĂ5üÇDƒúAŰbZw %3#%3#3#%3#Ă´´ţ˜´´ţ ´´” ý^ úúúúúúúěŃ %3#%3#%3#3#%3#´´ţś´´ţś´´ţ…´´Ě ţ& úúúúúúúúúěÖűě!#53ŠÓ¤RŹ@ţŔdýmń 327654'+53367657M593ŻpQf$h?FA@6b !ŠeţżI(R[2*Öű #53 3#ŠÓ¤RÓÓÓ%Ź@ţŔý-ţÚ÷đ$%#5754&'./.54632.#"Ë'/XZH߸gÁ^ałOlƒ39ZZ8ţţţ“{4<5/VV‰LŸÂ89źCFnY1^5YV‚eš˛U-Ţ"%56767&'&54767632&767˛/SD4Ž35gcbnZdF31`Č9:H:ZÍçU°!LOTAKv?=š0ps2#š˙˙˝ţ &ú#˙˙ţóŃ\&"˙rýä Ä3# ¸¸ůě˙˙EţȰ' <,ţČ K˙˙Ţ˙Ćó' =q„˙˙E˙ë° ' =¸Š K˙˙E˙ë°' >¤Š K˙˙Xţ ­g' <— Xţ ­g$$27'&5767&XĂ$ÄţÚ×ŕJÁԖúţ”ŠƒÔ`‰eŸ‡_'@5š ´ź÷‰^Łv¸bĘŢße4)˙˙Xţ ­°' <Ęč˙Účj%67654'&'3#"'532TŽ!ţľ­ ¸€’˙˙˙ĚţDś' <U ˙!ţ˜î?%#"'&7673327676'4/37653323#"'&'Œ &!UNBAE3I0<¨^yM\dsŐč‚቏+;H2zmĽ^\꜑#P}gÂŁx&ţŞŸ™R" C~m8(˙˙˙!ţ˜°' >c ˙ţŔ =%327654'&#"67632+"'&5#"'&5473767654'&'3H€Ij($@GgLÄK1ŽšŹZX¸Ú%5,0.3cM‚[|dŹh<2=B%A ! Ş ¸.DF-%!mN€<ąRNyžmK݃+VZËźŹĚœ‘2);jˆh>ÔH7(˙˙˙ţŔM' <Oˇ ¤ %327654'&#"!#53367632,ŒIj($?GhKˆýűŕŕ¸L1ŽšŤ[W¸~¸.DF-%!mNţظ\ű€<ąRNyžmK˙˙ ¤' <Y zţ ˇ**!27# '&54767&'&54763"32767XwSÁԖúţ[ŚbWqM3/XĚ|üĂt]0-.()žţţďěŃąžv¸cźoÉąeƒ8‚ĐMŠA4hKE¸•ƒšu˙˙zţ ˇF' <}° ˙ěĺ¸#5!ů¸¸˙˙˙ľ˙¤ŒĚ' <ü6 S˙˙ţ|t' =S~ L˙ČŸ!=#"'5327654'&'&767663#'&54733276{J&P DfXRNB8D-<9wLR! Xn*' X &/.Q&+üŃ8ąüOţš\ˆ79L¸K5:,]-#4BţČK%63#"'&&733276u¸2le–˘cwň@¸AŚ(IiTcI9(jű–ţzGœ1H*VŠ\ss~B")‚ţTó.327654'&'&#"&#4763&547632#XzL,5;(.;Dn2KČxAZ˘M\MOśbxX˛'*9:X DD(ÁNOţě­f7*(”„?$S§-8’AP˙˙6ţľ`' <ęĘ UŢ˙ĆóŢ"327654'&'2#"'&5476B!799[]KB{˜Ćś“Ľ„`Q§%T*WE{R,,9.UMAxł |”ČKU#JďľNšLţ 3† &"4'&!5 767&'&'&547632á?,3/ŔV%.Ź-şžţjsĄŕ1v-‹3tÓ9>YHƒÄ9!$7+(¸;ţôţÚŽ.TV¸Lh‹+b‰ŮZ3[ŽfţóŃ5%#"'$47332767654'&'&767632#4'&y„ŕą]HţŰ?¸B¤KSxlkA;"„b^M`72¸'#}[7 Ă0&huqƒc“-##NG".*3:,ƒ–=2IB‰="9), g:^M˙˙ţ Ń' =rţ DşŒš5%5%DHý¸HŞn‚nţŽn‚nDşŒý&567&'&54763233"/#"'&5332767654&#"t$!lD?I'8 .4LT^s7Z $08ž " ,d$* 9^W4'6O'&n=NVš)qaKî" %DţŒ˙ö5%%5%DHý¸Hţn‚nnn‚nDşŒŞ5%DHşn‚nDšŒý/&'&54763233"'&'#5276767654'&#"’ lD?I'8" +Eɓ™‹V  ,ş 8_W4'6O -n=*{nmp" %DţčŒ˙Ř5%DHţčn‚n0ĘĄô('&54737676537654'3'&x!9EO)"a 2=`KG g&ZG„M'DA2omb}8T"¨RY$6Ĺ­s9It…6X !Váz 4&"2>#"&4632X€XX€Xzžtr  rtô?XW@AWXłć  ćŸšĐÁ732767#"&' gC*6:*kWZZB6"˜DŚ6{S )L}@"F€˙˙˝żx3˙˙˝ţ ˙Ĺ3řÚ\îv4373Š‚‚ŒÄîFĂĂţşúÂÖź3#úÜÜźú–< !#'3<´&1›ÄyI ŠÜ!nţÝţ”›š8#'337673#"í ´&1›ĆCR´z6 ´*bôoajr›ţŠÜ!n›˜•UPymţú†L%#'37676537653#"'ä ´&1›Ä/(0H´/<´(Fœ„!34.5WYžţ9ŠÜ!nr|> @2ŚŢ%,*ĘţĎ;l>3 ě˙ěä *"2767#"'&54767&'&'&76`ygˆ\NNY‡p0Őá˙˙˙ľ˙¤Œ™' >p  S ˙§]*%267654/&54767#"'$473&˘Ú64_ˇ>.VţhG ”ŽhR¤cĎplţś?¸AËOXj<9U9iĘDGTOAŽŃţÂ7.?#˘›ou\N/ b Š\^ˆxH˙˙ ˙§a8' GŞA˙˝“ĺ&6F('&5473327&'&5476&'5#"'767654'&#"%327654'&ÝţÜCv¸-(;G--0M,QŰÜ;(J݃š$"':AGb 41~!$@€K5:,+  iEN@TSZ 'šC´ÖŮ49g=qlä@H=.%4-+#%vź%'Šr.C!0B7,gŒ`áo†6˙ľoU%m—Ż`m!´3/AbM3))´I˜ˇá˙˙~R,˙˙~R-˙˙Ą0.>˙ëd{*>@ #% +ÜěĚĚÜ<ĚĚ/ě1@™%+<ôĚÜĚ@ (Œ!ž,ü<ěĚÜĚ0%&76'&&76'&#"547#"543263 #4#"??BL??B˘ĆćôĘʑ,L˝–¸â‰WôBA?>BA?>üĂÍÉĘpĐżQQţžüÇ9ގl˙ÝŽ,"2"54767$32632&#"# '4%7654‚€€DŇźť—ĺţ˜śţăçJÖPžŠ†i?3Ěkţ]´˛ÖţČKM?o€”ä‰abţŠíu;\SfŽŐa‘ůƎ:F‚˝78UŘy˙ëP8327&'"'&#"%47&76$#&67 #"'632Y60I616ţŽ*, ĺ!ż¸Šą›*:ú9ŤĚĚţu`ţ0'"/Ü€6OÓŮţŕţÖýżAˇ¸KĽĽ %[9.ČľöţŰŒ!463 #"&'7325#'&&7'6÷˘Ýe›ĚÖt ˝!yŻ‚×Ń×CBBŚquýôýţůđЍ Ńóßh!Ď ACBB|˙˙Uš )"32654&24''&5432#5476n$ % *ú|{¸eČŮÚô6ţÄĎL¸j` %"%:yxţŮý~)ŽRڎŔh•††KKŞ>ÜaţɃ 9"32654&&5456767$ 3276320! 54-6546$ % #ŇĺvĘÉţŠţűŠÇł]#x—†°.ţ¤ţ>ĺţâr>>$o %"%ţěŃ…}@ţźÖ~Y9peˇDŘóţľQcFÓřâlWNnŠ-7Vźr˙î\– ,2654&'&! 3%$4567&7'7×$!% ‚/@¸ţţ˘Śl´Ŕ~.ZA“¤ $! $ýŒŽ¸?ýÁý´=‘Qmę.°şu˝G4 Ą{˙ăV|,@ /üĚÜĚ/ě1@ Œž™<ôĚÜĚüü0%"32544$#"54$76f@@@řţĘţËçëÚĹ)ë@@@@ëÉĂţPßČČŽÇyxĚüÇ•˙âoĄ *%"32654&"#" #"5323272#4#"€$ % äzw6Őűňƒ^"$J…ň¸7fń %"%ú&áţPÄÚŇ–WţŕţŠüś0Űţŕţ>|#$"2"22#"5#&567663 #4#"&€€ţ퀀ŚńÚÓ!§ł‘7y‹ž¸ô{^܀Ś€ýÝšĂăIž˛edŐmúŰ%Ł‹j˙âh|'>@ $/ü<ĚÜĚ@ )ÜěÜě1@Œ"™)<ôě@ &Œ ž)ü<ěĚÜĚ0&7'64323254#4%$7"6CBCţôĘŘţŞ˛ü¤bRţŹţ°ŘÖBCACKą­ĘŕÔŘźJţűüjeýˇţ­h0šK˙ăT 24#"53265$54767653!"'#€@>¸z]Uţčâî]x˜¸ţ´ŽTrŮs€@ü0eœgĚÝŰýuŠą/üŃţ˛ss|˙îT}"247&76% 3%$Š€€ţÔśˇĺíţě%<¸ţ ţî€ýŇÚÄ&śÄź—ţѨĚ'´ýLţB|˙îT"247&76! 3%$Š€€ţÔśˇĺíţě%<¸ţ ţî€ýŇÚÄ&śÄź—ţѨË'hű˜ţBc˙ďö J"32654&"32654&+&'#"'&5432'3253765&7465&'7„$ % ý’$ & ŕcge…~PLŇŘńfЏrtóĐłJwT˜\Uú &"$ %"%űöIJTOšbßĹÇţo;„„4ţˋ‚Ě¨Ń˜P6A^g[Ăoţ¤PIc˙ďb$0+&'#"'&5432'32537653"32654&b\U{cge…~PLŇŘńfЏrt¸üÔ$ & ,¤PIIJTOšbßĹÇţo;„„4ţˋ‚čýĺ %"%e˙îl~ ,"32654&2537653%&'# 47&76b$ $ 0n¸uh¸ţŕigeţޘŠäíţÖŇ %"%üł§4ţËŽĽ/üŃţŔIJ=đŚ%žůۏţސ§e˙îl ,"32654&2537653%&'# 47&76b$ $ 0n¸uh¸ţŕigeţޘŠäíţÖŇ %"%üł§4ţËŻĽčűţŔIJ=đŚ%žůۏţސ§˙ă``3323!"'#"543225c¸˝Đ¸ţxđ)3śĆœ)`ý,ţíÔüĹţž88œ–{‹r˙î\ ,2654&'&! 3%$4567&7'7×$!% ‚/@¸ţţ˘Śl´Ŕ~.ZA“¤ $! $ýŒŽ¸Úü&ý´=‘Qmę.°şu˝G4 Ąd˙îmŒ +"32654&&! ! &%$&7676=$ $ Wţ˝ýó6¸tąÓţŠmáţ2ţ§ßŇŕJŽŰX $ $č8$Ü{źŠžţţš˛{ĚŃN&`˙îp .%"32654&%&'&'&7!2765!"'676F% $ ţôčW‹D ăĎúNčbfPţĆĺ'ˇGř!$ $•ţ‰ýÔúÝTˇÖë‰ţލrJco<ůo˙äb{"326! %&$'423 54! P@@<ţô)˝ôţ"đţÜĺŮFţĚţéT€€ÎYţ×ý¸ţŮœÓ×=IŘÄĚŐa˙î#œ 2:%"32654&%!$76! 6'&'7%&'&'&7!276 54! H& $ JFţęţ ňŽr cž€˛ţôčXŠD âÎűNčbfPţ¤tţŒţśř!$ $=™üéš1T„vŽ ’—ýĂúÝTˇÖë‰ţŃEmMd˙罚 6"327$"327$7&76365+&7632676#4#"€A?‘€A?îţ`‚ŒĆžşßᚌ˘5@V÷¸C?/@@@L@@@üE>Š/™ľ˛}ĚţŸśľ ˇŠcbţşüŠWZýšţłw˙îj %-"32654&7$%&'&763 54\$ % ôţůúţ ĘŞ†Üí=A8)SUţÄţŔB<S %"$Đ36ţŃýŒűH9Ş×ŘG)#Ż$67œšŸT˙îÚŘ 6"32654&$'&%$76!232'&#"%$'&762$ % TţŔýţžˆ\oEh@”Mó‡qKUŇPćýđţěˆnŕ×^™‹ %"%ţůţĂ+DçüYl0ţ•yP^d6QţÁţqt^}ßÖ]F0˙&ŠĄ$"2''&'$! '&5"32?6*€€Ę+=xĽ‚×ţâ ˆÓÔ#esZŒŻhŕţá €ű™†N)=‰ť“mÎŘÍÍĂdÄ˝ţĎ˙˙Z˙ĺe€'lŃúÉlŃýuű‰˙” ! &7623$54'74"mţţśĂĺń#!AVЍýB8?ţ˙¨kŮŘP$U.FŠŒ~>=!{ ##"2#"5324#jˇ¸˙¤=ÚĺáŚ;C>{ţjýËVÁÇÇŽţ‰nn˙˙üĹ!r&m|ű/Sě~i! ! !5 74! $ţ&ţ>ţşţ˜%ť~?>ţÂţÁ~ťĹSći! ! 3!= 74! %ţ&>ÔýŠţşţ˜%ť~?>ţÂwJ„~ťĹSě~i! ! !5 74! #5$ţ&ţ>ţşţ˜Ţî%ť~?>ţÂţÁ~ťĹNÜÜSći! ! 3!= 74! #5%ţ&>ÔýŠţşţ˜Ýî%ť~?>ţÂwJ„~ťĹTÜÜĎý3‡˙˛"36654'#"5432ż‚AA\(DłŞeN[ĚźţĎo[$žşN[‹uÖxýŽ™˙Ż"325"547&5423253,ró>Jęm‚ž„˛,ţW’s> [yu?{EBXFţşĂD '656%"'&76! 4"3Œ¨ŠVţĽA!. Ůĺ{x9üá’f>.`h>4Č‚A?×~= h‚\$…kb8:;-FĄ_Zkf2)Iŕˆ 53533##5J؎Ř؎¸ŽŘ؎ŘŘ˙˙˙đávP–ö;r 432#"324–ÔĐÔЄLTž´´Č 3z! 473! 4'$33ţ1ţ=PžU˝ţÜľ~iďţÉibcWţˇOÖJfĄ3‚ž4! %56'&53!! 4ţ<ţ1ƒŁľ~Ąkźţďţń  ýŕ!ŤTŠx˝Y9švţwsţ•ţknţWb!%! %674#"&5! % %aţ ţlŐˇ‰._‹z-łţžţśFH+ţ,ÔÍSŠŽ‹.+RLo ţۤTnţľBţ˝ţŔ7ţWš !,6752363 ! 54+"&$54+"32Ý(TţŢX[P<ŞfţŚţŞI+yhĘZţËtԕGwş™á, ČĆbbţ+ţę]ţÄmţLţ˙ȧVÔńś÷ţč ţW3! 473! 5 &5 3ţIţ%ź$ţ&>°8– ţw’js…ţűń¤ ŢoeK…rţdžţW2'! 673! =4+5374# #&5! 2ţ4ţ:iŔp íIIâáţü-Ą<ąžĺí-ţ„˜]mxRţößbóŒđóĘXxR~Xţ{Ń\+ţţž2 ! 75&7!  4'"62ţ5ţ8ČČTW\Fšţëţő Íž¨şŻřţůIJ:éQţ˝›U-ţ\pţţ˜!ÔÖÚ7š %#65+"! 5!2363 6#&32šď˘Ô„!SţËţ‡}’GJtAýŞFW´ĽŹHCţ˘§ŽBuśÜţćccýyi‘ţď˝ţáŸ3#! #&! 2đ’ÉţüţćƔîŇĂ#ţĽČcţ ţćţôĎZěžţY4! 473! =+53254!5 4ţCţ(p­bîAAäţZZţőţw§‹fq€ţćü2˜Ććšţ€Đ11ţŘ ţW2 #&$'6?! &65lţí_ž$ţł^M>p ůĚĆvŸ\ˆţ˝ţYţ1x°Oh_[ ‚Ëţ)eľœ¨uGž4! !234!#5!  ! 4ţEţ%ËÄDţä蝣˟ýâďţ  }í˜>>&ţ†ýT—ţ‰ţ‚ž3ű! )!"363! %2ţ2ţ:MÎţ#@¸Íšţęţď$ýÜęś[°ţڀţ gţ…ţ„7š ##654#"#4+"#&=!2363 šźłł™K@ BM”ËÂÇ{hIF`€ĆěÚŔĎ×ĎţëĎäţüÖŔáěfŘhhţ&Ÿ4!! 473! !#53274%$534ţDţ'eŻ[ţě?R×ţéţÜŹďWşčÚţ&˛ˇZ~“ţßIJ‡Č•!6°G))ţűË=iŸţY32! 3! 5 '%5%3ţ0ţ>ť'ţMÝýńhţ˜”ţkoă ¨4>>HS2>+3ö‹|'! %!5!$! 3#3%! ! 5)54!  ţIţ8Äţďţ<Ěłrrrţäţďţú ýéţ÷ţňśţąOfĄkQţŻŘ”Ą˛ÎÉÓcÖŘĂ7ţXš!,!"'#!52'4#&3$5!23634+"32šţÍ~ ţłˇ Mas€ţÂ1ˇD>ś3˝ˆLI§v–ţjt˜ţ|Žç ˛˝ţÁٔxđŒ‘‘ţuţŽĄŻ§ţƒÓkţYf!! %$54#"'! ! 4'7fýőţGD˜ľĽ `UţŻţČ6I@šbţY§srgźŸ8A:ţ¨ÔƒMţîţÜ){6\lĄţY4(3! 4%7%#"'#% 3! Ą­#ţůŤţ>šU&ťţ;ţ3ţýĚż0ýą?âţőţ7YăţűţpŒmţWc$!6=3! 47$$5! nöţ–ţڞòţŒţŞďţdż?;ţĹţŔkšţHţëŠužľŒLLţć8çTWJ˙&)ü* ˙y354&#"'675&%'% ďt_‚C‚Ctěä§ţy‘ţ`ţÜ^q˛|‡ytJf­Iľ8ý=\ ţŰŁĘb*“#2Žă 3#3#3##ŔŔŃşşţ/˝˝ă°˝ŽčŽ•ő<2"4;%"4#"32lĐŐŃšëţţFí|pux$ţďţăLľRQžÂ´şÉ)˙ă°{ B32654&#"26=%!>54&#"5>32>32+3267#"&'#"&ş1ŠxYS\JţMŽLţëepO27„Gn• '…aœŁČżuc^8„>M„<[|%!„YŽ‘¤HZqYa…ţq4—…ˆ+#"Ą33Ź)+RNPPʤŤłXx€+'¨#!?@=Bí2Š˙ę({0#"'&'532654'&+532654'&#"567632wA@ôŃQ[\ihWVLŠ”HH‡ŚŸ–¨Z[­c[[MaZ[Vţ‹Š”A@^†ž § VJ=+,nQb54"­[\Śm”˛ţPDd %!!5!!!#53öţ)ţ“’ţ“ţḸяüžý˝é˙ăş{ 6326="326&!54&#"5>32>32#"&'#"&ąPVWMZfRPhgPPüTëcpPƒ/;}Jb“04€T˝ŞŞ˝Y€/%‚WݐÍ & ‘‡‰ž+¨ďţÝŽ§§ţyTِ53Ź+)CBDAţěýţě>A>Aí2‰/H{  #4&#"‰öŇ÷ЍŒ/.ţŇţâÖÚÚÖˆ˙ăG/  33265Göţ.÷ЍŒ/ţâţŇ.ÖÚÚÖ+Ś[%!5!2654&#!5!#áýJś—ގŤý‡^¨adá¸lp‚Џ¸2¨rʍ?˙ţ’W75353!5!2654&#!5!#?ŽŽŽˆţćid€xţEvDFžzĚĚˆĘĘýü¸lp‚Џ¸2¨rʍ+Ś")5!2654&#!5!2654&#!5!#HEŃţßýwís{ĺýđp{ĺý``œ…pžž¸ˇžUÚ×Öś××?œ’ŕ32654&#%!2+#ž”XcbYţ흣˘ž”ƒţĆSJKR]öţ°œŔŕ#'.+#!232654&#–1E4€‰p1M>z€›ĽeţŸ‹\Y_[' ?]äÓZ4ţŸD|vShPţ×IKHMœĎŕ!!#!ÍţڀţŮŕ_ýĺAŒŕ33267>53#"&'.A L67K €$,*kCBk*,$ÝýÉ=4!!!!4<8ýý€l$! !#näœíŕ 333# #ä|Zk…mZ|x€yŕýYÁţ>¨üźńţEŒŒ )#"326757#5#"&546;5.#"5>32Ť&ffMD_ntt&pQl€ž™œT];y:Av7X|&×??8?vh+ţš]85l[hmKDg..REŒŒ )32654&#"3>32+3267#"&'.&&ffMD_ntt&pQl€ž™œT];y:Av7X|&Ó??8?vh+f]85lZimKDg..RGŒŠ53#5#"&546323264&#"tt`?€““€?aţÇVTSXXSTżNýO/0°›™Ž0Ąđz{î{űŒÖ B32654&#"26=%!4654&#"5>32>32+3267#"&'#"&5™kK84:/ţĘ0n0ţĘ6@F2Q #S-E^T=bg~yI>;#T'1S&9NT8m\)3?26JŕUJLXP ZQ`.+-,`\`d1CH^#$"%„ŹGŒŠ4&"2>32#"&'#3V¨WW¨˙aA’“€?`tt]đz{î{Ü.1Ž™›°0/OgGŒŠ3#5#"&546323264&#"tt`?€““€?aţÇVTSXXSTżDü™O/0°›™Ž0Ąđz{î{1Œ !3267#"&54632.#" ţ xn7yEB{9Ľšľ˜†œt\UTm ď2gp fݚ–ł˘nZ_cW1Œ 5!54&#"5>32#"&732671öxn7yEB{9Ľšľ˜†œt\UTm ť2gp fݚ–ł˘nZ_cWO‚(.54632.#";#"3267#"&546˙KQ™„3sCBm0W][Uhd^jrm>s0=r6 Ž]đH5KX ]0*"0Q>-7;af]=SO‚(#"&'532654&+532654&#"5>32ŇKQ™„3sCBm0W][Uhd^jrm>s0=r6 Ž]žH5KX ]0*"0Q>-7;af]=SGŚŠ '4&#"32#"&'5326=#"&5463253UQUZZVPɖ‘0i4>d+]V_E|““|D^tgčxxčz)‘f[bF53Ż”“°02QIވ !#5!#3#53WţŘć?ćľľssž#PPţ-ţźƒ8œ™ 33##8x0ţęBŽţűVxţěţyDIű%œŹ">32#4&#"#4&#"#3>32‹B/UFj",2%j$/.#jj?'0@Ď)&u˘ţ•g…@E€ţ™g†?E€ţ™s6"#'[­v+5327654&#"#367632v89hu9CGR,+tt54Ilj!ţpm;32#"&'53264&#"X.c4¤¸¸¤3a1.\;muvl=_)îŽţĘŽl$!~č~!#:Ő— 46 #4&#":›&œ{[YX[Ő ŠŠ xzzx:Œ—Ő  &533265—›ţڜ{[YX[Ő ŠŠ xzzxG­Š#3>32#"&$4&"2źuu`?€’’€@`8U¨WW¨ëţÂbP/0°›™Ž0Ąđz{î{Mœ„Á!!;#"&5#535}ţů;J‚ƒkźźÁ˛PţŹF7R]rTP˛[Œv332653#5#"&[tCGRWttkGlj‰…ţ{TPg`býŽ^68~˙Ň}!5!2654&#!5!#´ţKľ`YslţqÁj=?Žg32#"&'#3‡‡Žˆ‡¸îçLŚSb C•ˆ,˜mÄęęÄl–/¸ŠĎ×מŮÚ#üś.,˘°}^\ţĆţůţřţĆVZ‘˙˙:œ–ŕşœ5`!!!5!!5!!5!!5ţnünlţpţ”’ţ’h¤ţˏ5¤iţ— ţV ;+53276=#"&5!5![Y×YZĽÍšZ-,0ĽľţŮß–|~€Ăijœ>>~ÔÂůGŒŠ#3>32#"&$4&#"32ťtt`?€““€?a9VTSXXSTëNqO/0°›™Ž0Ąđz{î{XŒy#"&632.#"3267y.c4¤¸¸¤3a1.\;muvl=_)źŽ6Žl$!}ut~!#QI€+325&#"47&'&547632.#"632#"d&/\R@5a$^`^Ľ63302b3q>>>5|źŇ4ě *š &:/Z–™XX `@?ć@bŠj:Œ—)#"&54632.''7'37.#"32654&¨|sŸŸŸ .Ż•sŠPˇm4\a^UV^%ƒwÔp–ŚŚ–”Ś237,pQ57ţîvonwwn=rO‚(#"&'532654&+532654&#"5>32ŃT]ŽĄ5sQ0"*0] XK5HWœz#"3###535463z„>1óótźźkqU.98PýÝ#P,gab­o53#5!3#+53276=ΙČ<””98h “9œ\ÇPýé\ m;d+]V_E|“‘~4ŰwuxčzzŁ‘f[bF53Ż”ł[Ťv332653##"&[tCGRWttkGlj‰…ţ{TPg`büO68~CœŽ3#!3#3!535#535#4ttľ)ßßćýŔćńńľ‚rţć\­PP­\Ęaœp #"&5#5!;phqľ)99uœun@PţpFFIœˆ !#3!53#I?ććýÁććPţ-PPÓGœŠ#3!535#535#5!#ŠčćýÁćččć?ćő\­PP­\ĘPPĘd­m3#"54;33#'0#"3276‡ttdżŞytrx !3rJMB ‚ü,|ssýW?#5˜$ U­| ;#"&5#5!ƒ98ˆ“dvş.‘FFXtp(QU­| ;+53276=#"&5#5!ƒ98ˆ89ht9hrş.EGbm;32+53276=14&#"#4&#"#3>32ŠB.V"#23_uj3",2%j$/.$ii>(0@Ď)&:;˘ţÝSm;32#4&#"MU!1$XT8[]V;;FQ‘xlX6V~a88†ţ…wYYk\U­|$54'&#"#367632;#"'&5š:G()WW*+7[//$1!U&'œH/Y,-56\ţžsa8BDţÍH V6X66x?œ’ 33##?Ť-{ŤţÓ{ţůý~úţ:Œ— #"'&547"!&'&!3276Ő&NNNM”“MNNŕX-(e(-WţĄ !-XY-!TU ĄTTTTĄ U=5cc5=ţĎJ,==,:Ž—&/#5!#3!535&'&5476767654'&3—˘—fwx=%ţ;Ö )=xw>)[­v<.#"#"/;#"'&=32654'&/.547632P1j8W*,]({44MN‰8> 0B“ r34@>?=RX!k)k`FG‚@98ýb/$+*MW33 V6X66x"192-*TIX00x­Y46;#"+5326 j{mo>1gr,B0‘]MecU-:ýJxlX6M­„Á!!!;+53276=#"'&5#535}ţůJ‚88h‚u9ƒ56źźÁ˛PţŹF]m;T_Ă^­s!!#;#"'&=!5!jţšG$2!V&'ţŻGţĹ^ţ=R V6X66x ^ĂM^„#47#5!5!3632#'03254#’aĺ´ţ\'ţLn&ŠŇ m,8œ!!^ĂR^ţ=˘ŠjR33¨ž2#"&'532654&+5!5!dCP>iżą;}C5~Dx~uhnţ\'§ xM|‡mTPJS]R^:Œ—ä .#"!326 #"&54UYXUcţVXYVţž&œ›”“›l~˘˘~g~ŁŁ]ÜĐŃŰŰŃĐ˙˙%ţ ŹŐ&Ş$˙˙…ţ #{&ŞD˙˙ŚqP& 2%˙˙Á˙ăX&Œ2E˙˙ŚţcqŐ&¨%˙˙ÁţcX&¨E˙˙Śţ›qŐ&ś%˙˙Áţ›X&śE˙˙‹ţu1k' *Zu&Źd&˙˙Ăţu%f&vZ&ŹhF˙˙‰RP& 2Î'˙˙{˙ă&ŒÎG˙˙‰ţcRŐ&¨Î'˙˙{ţc&¨G˙˙‰ţ›RŐ&śÎ'˙˙{ţ›&śG˙˙}ţuRŐ'Źţň'˙˙{ţu&ŹěG˙˙‰ţRŐ&˛Î'˙˙{ţ&˛G˙˙ĹţNŐ&˛(˙˙{ţX{&˛H˙˙ĹţNŐ&ľ(˙˙{ţX{&ľH˙˙ĹţuNm& 1&(Ź2˙˙{ţuXH&‹&HŹ2˙˙éXP& 26)˙˙Ă'P& 2I˙˙f˙ăP0& 62*˙˙{ţHö&‰J˙˙‰HP& 2+˙˙ĂP& 2K˙˙‰ţcHŐ&¨+˙˙Ăţc&¨K˙˙‰H5' )\+˙˙ĂX'jHK˙˙ţuHŐ'Źţ‰+˙˙7ţu'ŹţŹK˙˙‰ţHŐ&ł+˙˙Ăţ&łK˙˙ÉţŐ&ľ,˙˙˛ţD&ľL˙˙‰Ék' *u.˙˙ě˛k' *˙%uN˙˙‰ţcÉŐ&¨.˙˙ěţc˛&¨2N˙˙‰ţ›ÉŐ&ś.˙˙ěţ›˛&ś2N˙˙×ţcsŐ&¨2/˙˙ ţc &¨O˙˙×ţcs0& 6=˙˙ ţc 0& 6>˙˙×ţ›sŐ&ś2/˙˙ ţ› &śO˙˙×ţsŐ&˛2/˙˙ ţ &˛O˙˙Vyk' *u0˙˙mof&vP˙˙VyP& 20˙˙mo&ŒP˙˙VţcyŐ&¨0˙˙mţco{&¨P˙˙‹FP& 21˙˙Ă&ŒQ˙˙‹ţcFŐ&¨1˙˙Ăţc{&¨Q˙˙‹ţ›FŐ&ś1˙˙Ăţ›{&śQ˙˙‹ţFŐ&˛1˙˙Ăţ{&˛Q˙˙Ĺur' *˙w|3˙˙žţVTf&†S˙˙ĹuP& 23˙˙žţVT&ŒS˙˙ŃP& 2Î5˙˙jƒ&ŒU˙˙ţcŃŐ&¨Î5˙˙jţcƒ{&¨U˙˙ţcŃ0& 6ÎY˙˙=ţcƒö&‰Z˙˙ţ›ŃŐ&ś5˙˙=ţ›ƒ{&śU˙˙‹˙ăJP& 26˙˙Ő˙ă&ŒV˙˙‹ţcJđ&¨6˙˙Őţc{&¨V˙˙‹ţcJP& 2&6¨˙˙Őţc&Œ&V¨˙˙/˘P& 27˙˙ƒP& 2W˙˙/ţc˘Ő&¨7˙˙ƒţcž&¨W˙˙/ţ›˘Ő&ś7˙˙ƒţ›ž&śW˙˙/ţ˘Ő&˛7˙˙ƒţž&˛W˙˙“ţd=Ő&Š8˙˙Ăţd^&ŠX˙˙“ţ=Ő&ľ8˙˙Ăţ^&ľX˙˙“ţ=Ő&˛8˙˙Ăţ^&˛X˙˙9˜E' +\9˙˙dm&vŘY˙˙9ţc˜Ő&¨9˙˙dţcm`&¨Y˙˙Ńr' ,|:˙˙Ńm&CŔZ˙˙Ńr' *|:˙˙Ńm&v@Z˙˙Ń4'j$:˙˙Ńż&jŻZ˙˙ŃP& 2:˙˙Ń&ŒZ˙˙ţcŃŐ&¨:˙˙ţcŃ`&¨Z˙˙žP& 2;˙˙L…&Œ[˙˙ž5' )\;˙˙L…ż&jŻ[˙˙%ŹP& 2<˙˙hţV&Œ\˙˙œ‘t' -.|=˙˙Ëm&f]˙˙œţc‘Ő&¨2=˙˙Ëţcb&¨]˙˙œţ›‘Ő&ś2=˙˙Ëţ›b&ś]˙˙Ăţ›&śK˙˙ƒâ'j˙˘ŇW˙˙Ń&tZ˙˙hţV&t \˙˙Ă'P& 2A˙˙‰˙ăH"ů˙˙%ţcŹŐ&¨$˙˙…ţc#{&¨D˙˙%ţcŹt' -|“˙˙…ţc#m&fč”˙˙%Źů& 1€&$ ,˙˙…˙ă#˘'…<Ĺ˙˙%ţcŹm& 1“˙˙…ţc#&rčĚ”˙˙ĹţcNŐ&¨(˙˙{ţcX{&¨H˙˙ĹN^' +*u(˙˙{˙ăX7&vH˙˙ĹţcNt' -|›˙˙{ţcXm&f"œ˙˙ÉţcŐ&¨,˙˙˛ţcD&¨L˙˙uţc\đ&¨2˙˙‰ţcH{&¨R˙˙uţc\t' -|Ł˙˙‰ţcHm&f¤˙˙˙ă§k' *˙‘ub˙˙ ˙ă˛f&v—c˙˙˙ă§k' ,˙‘ub˙˙ ˙ă˛f&C—c˙˙˙ă§^' +˙‘ub˙˙ ˙ă˛7&v—c˙˙ţc§&¨‘b˙˙ ţc˛{&¨—c˙˙“ţc=Ő&¨8˙˙Ăţc^&¨X˙˙ ˙ăČk' *˙vuq˙˙'˙ăŞf'v˙dr˙˙ ˙ăČk' ,˙vuq˙˙'˙ăŞf'C˙dr˙˙ ˙ăČ^' +˙vuq˙˙'˙ăŞ7'v˙dr˙˙ ţcČ'¨˙vq˙˙'ţcŞq'¨˙dr˙˙%Źr' ,|<˙˙hţVm&CĚ\˙˙%ţcŹŐ&¨<˙˙hţV`'¨ú\˙˙%Ź^' +u<˙˙hţV7&v\˙˙F˙ć•r&öo˙˙F˙ć•r&ö§˙˙F˙ć•r&ö|˙˙F˙ć•r&ö‰˙˙F˙ć•r&ö}˙˙F˙ć•r&öŠ˙˙F˙ć•Ń&ö~˙˙F˙ć•Ń&ö‹˙˙%Źr&×oţ˘˙˙%Źr&×§ţp˙˙ţkŹr&×|ýv˙˙ţkŹr&׉ýv˙˙˙Źr&×}ýó˙˙˙Źr&׊ýó˙˙˙ÁŹŃ&×~ţ˘˙˙˙ŹŃ&׋ţp˙˙Š˙ę(r&úo˙˙Š˙ę(r&ú§˙˙Š˙ę(r&ú|˙˙Š˙ę(r&ú‰˙˙Š˙ę(r&ú}˙˙Š˙ę(r&úŠ˙˙˙~Nr&Űoý˙˙˙~Nr&ۧý˙˙ýŠNr&Ű|ü•˙˙ýŠNr&ۉü•˙˙ţNr&Ű}üŕ˙˙ýóNr&ŰŠüŕ˙˙ĂţVr&üo˙˙ĂţVr&ü§˙˙ĂţVr&ü|˙˙ĂţVr&ü‰˙˙ĂţVr&ü}˙˙ĂţVr&üŠ˙˙ĂţVŃ&ü~˙˙ĂţVŃ&ü‹˙˙˙LHr&Ýoý]˙˙˙LHr&ݧý]˙˙ý?Hr&Ý|üJ˙˙ý?Hr&݉üJ˙˙ýŁHr&Ý}ü|˙˙ýHr&ÝŠü|˙˙ţcHŃ&Ý~ýD˙˙ţcHŃ&Ý‹ýD˙˙6Ďr&ţo˙˙6Ďr&ţ§˙˙őđr&ţ|˙˙őđr&ţ‰˙˙'r&ţ}˙˙r&ţŠ˙˙ĎŃ&ţ~˙˙ĎŃ&ţ‹˙˙˙~r&ßoý˙˙˙~r&ß§ý˙˙ýŁr&ß|üŽ˙˙ýŁr&߉üŽ˙˙ţr&ß}üŕ˙˙ýór&ߊüŕ˙˙ţŽŃ&ß~ý˙˙ţŽŃ&ß‹ý˙˙‰˙ăHr&o˙˙‰˙ăHr&§˙˙‰˙ăHr&|˙˙‰˙ăHr&‰˙˙‰˙ăHr&}˙˙‰˙ăHr&Š˙˙˙É˙ă\r&ĺoýÚ˙˙˙~˙ă\r&ĺ§ý˙˙ýŠ˙ă\r&ĺ|ü•˙˙ýŠ˙ă\r&ĺ‰ü•˙˙ţ˙ă\r&ĺ}ýv˙˙ţ‰˙ă\r&ĺŠýv˙˙3˙˙ir& o˙˙3˙˙ir& §˙˙3˙˙ir& |˙˙3˙˙ir& ‰˙˙3˙˙ir& }˙˙3˙˙ir& Š˙˙3˙˙iŃ& ~˙˙3˙˙iŃ& ‹˙˙ţčŹr&ę§üů˙˙ý?Źr&ę‰üJ˙˙ýDŹr&ęŠü1˙˙ţŹŃ&ę‹üů˙˙F˙ăŒr&o˙˙F˙ăŒr&§˙˙F˙ăŒr&|˙˙F˙ăŒr&‰˙˙F˙ăŒr&}˙˙F˙ăŒr&Š˙˙F˙ăŒŃ&~˙˙F˙ăŒŃ&‹˙˙˙ɇr&îoýÚ˙˙˙e‡r&î§ýv˙˙ýЇr&î|ü•˙˙ýЇr&î‰ü•˙˙ţś‡r&î}ý˙˙ţ˘‡r&îŠý˙˙ţů‡Ń&î~ýÚ˙˙ţއŃ&î‹ý˙˙F˙ć•f&öC˙˙F˙ć•fń˙˙Š˙ę(f&úC˙˙Š˙ę(fň˙˙ĂţVf&üC˙˙ĂţVfó˙˙Ďf&ţC˙˙6Ďfô˙˙‰˙ăHf&C˙˙‰˙ăHf˙˙3˙˙if& C˙˙3˙˙if˙˙F˙ăŒf&C˙˙F˙ăŒf˙˙FţV•r&żƜ˙˙FţV•r&ŔƜ˙˙FţV•r&ÁƜ˙˙FţV•r&ÂƜ˙˙FţV•r&ƜĂ˙˙FţV•r&ƜÄ˙˙FţV•Ń&ĹƜ˙˙FţV•Ń&ĆƜ˙˙%ţVŹr&Çn˙˙%ţVŹr&Čn˙˙ţkţVŹr&Én˙˙ţkţVŹr&Ęn˙˙˙ţVŹr&nË˙˙˙ţVŹr&nĚ˙˙˙ÁţVŹŃ&Ín˙˙˙ţVŹŃ&În˙˙ĂţVr&ŰĘţČ˙˙ĂţVr&ÜĘţČ˙˙ĂţVr&ÝĘţČ˙˙ĂţVr&ŢĘţČ˙˙ĂţVr'ĘţČß˙˙ĂţVr'ĘţČŕ˙˙ĂţVŃ&áĘţČ˙˙ĂţVŃ&âĘţČ˙˙˙LţVHr&ăn˙˙˙LţVHr&än˙˙ý?ţVHr&ĺn˙˙ý?ţVHr&ćn˙˙ýŁţVHr&nç˙˙ýţVHr&nč˙˙ţcţVHŃ&én˙˙ţcţVHŃ&ęn˙˙FţVŒr&Ę˙˙FţVŒr&Ę˙˙FţVŒr&Ę˙˙FţVŒr&Ę˙˙FţVŒr&Ę˙˙FţVŒr&Ę˙˙FţVŒŃ&Ę˙˙FţVŒŃ&Ę˙˙˙ÉţV‡r&n˙˙˙eţV‡r&n˙˙ýŠţV‡r&n˙˙ýŠţV‡r&n˙˙ţśţV‡r&n˙˙ţ˘ţV‡r&n ˙˙ţůţV‡Ń&!n˙˙ţŽţV‡Ń&"n˙˙F˙ć•H&‹ö˙˙F˙ć•ö&‰ö˙˙FţV•f&#Ɯ˙˙FţV•z&öƜ˙˙FţV•f&ńƜ˙˙F˙ć•7&öp˙˙FţV•7&fƜ˙˙%Źm& 1×˙˙%Ź0& 6×˙˙˙‡Źf&×›ţp˙˙ŹfÎ˙˙%ţVŹŐ&×n˙˙ďÂáro˙˙ţVú˙¤ĘďÂár#525#53áńŽŽńĂţ˙dŻ˙˙˛7v˙˙F˛‹&jpT˙˙ĂţVf&'ĘţČ˙˙ĂţV{&üĘţČ˙˙ĂţVf&óĘţČ˙˙ĂţV7&üp˙˙ĂţV7&uĘţČ˙˙ţNf&Ű›ýv˙˙˙NfĐ˙˙ţ[Hf&Ý›ýD˙˙ţíHfŃ˙˙‰ţVHŐ&Ýn˙˙őÂđr'o˙›ú˙˙'Âr'o˙8Śd˙˙²Ń&opš˙˙/ĎH&‹ţ˙˙6Ďö&‰ţ˙˙ĎŘ&ţ™˙˙6ĎŘÖ˙˙Ď7&ţp˙˙Ď‹&ţq˙˙Ém& 1ß˙˙É0& 6ß˙˙ţżf&ß›ý¨˙˙˙fŇ˙˙őÂđr'§˙›ú˙˙Âr'§˙$Śd˙˙²Ń&§pš˙˙3˙˙iH&‹ ˙˙3˙˙iö&‰ ˙˙3˙˙iŘ& ™˙˙3˙˙iŘő˙˙žţVTr&o˙˙žţVTr&§˙˙3˙˙i7& p˙˙3˙˙i‹& q˙˙%Źm& 1ę˙˙%Ź0& 6ę˙˙ţ[Źf&ę›ýD˙˙ţpŹfÔ˙˙˙~ur&ç§ý˙˙F‘Ř&j›r˙˙?FşŘÍ˙˙îöfC˙˙FţVŒf&/Ę˙˙FţVŒ`&Ę˙˙FţVŒf&Ę˙˙F˙ăŒ7&p˙˙FţVŒ7&ŸĘ˙˙ţŚ˙ă\f&ĺ›ý˙˙˙ľ˙ă\fÓ˙˙ţڇf&î›ý˙˙˙·fŐ˙˙JţV‡´&în˙˙ŰîşfvďÂár53#3"đđńĂŻŻddßmƒś ÔÄ1Ôě0!!d ý÷ƒ¤˙˙dßmƒłěŃyśśý/Ć1üě0!!Ńű/yěŃyśśý/Ć1üě0!!Ńű/yěŃyľś/Ä1Ôě0!!Ńű/yěŃyľś/Ä1Ôě0!!Ńű/y˙˙ţŃ˙]&BBđĎÇ-@ ŁľÔüÔĚ1üě0#53ËüĚbÇĎ~ţ‚ĎÇ-@ ŁľÔěÔĚ1üě03#1üřbÎţ“ţáň/˛ُśÔěÔĚ1üě03#öüŚc/ĎţĎÇ-#5Ëb™ĹÎţÎÓÇţ %@Ł ľ  ÔĚÔěÔüÔĚ1ü<ě20#53#53œüĚbţ5ţǙbÇĎ~ţ‚ĎĎ~ţ‚ÓÇü '@ Łľ  ÔěÔěÔĚÔÎ1ü<ě203#%3#üřbţ5üĚbÎţÎÎţÓţáü/ *´ ُ@  ÔěÔěÔĚÔÎ1ü<ě203#%3#üřbţ5üĚb/ĎţĎĎţÓÇü #5!#5Ďb™ĹÇbšÄÎţÎÎţÎ˘˙;/Ő '@Ë ˆĘ RQ R Ô<ěü<ě1äôÔ<ě203!!#!5!ąnţ’ąţ’nŐţ\™űŁ]™˘˙;/Ő<@ËË Ę ˆR Q R Ô<<ě2ü<<ě21äôÄ2Ô<î2î20%!#!5!!5!3!!!/ţ’ąţ’nţ’nąnţ’nßţ\¤š™¤ţ\™ýá?Ń‘! ˇ Đ V Ôě1Ôä04632#"&?Ź}|­Ž}|Ťú|ŤŹ{|­Ť?áq?˘đţˆP1 #@˘   ÔüÔěÔě1/<<ě2203#3#3#Püü3üüţfüü1ţĎ1ţĎ1ţĎŃ˜'3?Kt@%1= ČČ1¸ľ%Č+‘C¸@&7ČIF:4(:PFz4P@ PzP"P.zP@(/ÄěÄôěîöîîöî99991/<î2î2öîţîî299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'üH_EDbcCE_yĽxxڧwy¤LaEEacCEayŚyxŚŚxyŚ aEF`bDEayŚyx§§xyŚ7aŸ`ýJGacECcaEyĽŚxy¨ŚÓEaaECcaEx§§xy¨§ý"GaaGCcaExŚŚxy¨§Ń˜ DP\h4632#"&62654&#"'4626763267632#"'&'#"'&'#"&732654&#"32654&#"32654&#"ŚyxŚŚxyŚyaŠacCE’%'ű˘ŠČE FedE  Fed‹‹deF  EdeF Fce‰eO:8RR8:OxQ::PR8:QzQ::PR8:Qyx§§xy¨§żŠaaECcýaŸ`ýJyĽS  SS SŚxy¨T TT  TŚ{GacECcaEGaaGCcaEGaaGCcaŹ`$Ő3ŹŽĘţŕ`uţ‹˙˙`şŐ'ʖĘ˙j˙˙€`PŐ'Ę,'ĘţÔĘŹ`$Ő#3$VţŢĚ`u˙˙`şŐ'͖Í˙j˙˙€`PŐ&Í'Í,ÍţÔZ/#@ üŹvÔě291ôě90 5/ţÓ-ţ+#żţôţôż˘R¤y#@ üŹvÔ<ě91ôě90 5 ¤Őţ+-ţÓ#ţ^Rţ^ż  ˙˙ĐŐ'ţĚ4ôđ%#56763253767654'&Źž Yb^`_hşon"!^XE&ĹË->B%‘­ #Dź9``ĄLAB\VBT=ýĹţţBţR-;,,1Y7˙˙ťŃ BžĎţňw !#3#3!ϨđđđđţXýEýFZţň !53#53#5ţXđđđđřޏşť˙˙!ąń' 5ţź 5˙˙!ń' 5ţź4˙˙Đąń'ţĚ 5=•đ ,47632""327654'&'2#"'&5476"%F$W+,,+WX+,,+X•LLLL•–JKKL @ !ĄUUŻŽUUUUŽŻUUYnm×ÖnmmnÖ×mnHœˆ !3!53#3#z(ćýŔć´´ttýÝPPÓD‚ œß 5ł ¸ ˛ş @  W ÔÔ<Äě291ôôÔ<ě29033##5!5 !w˘ttŠţ}ƒţîßýćoşşy“ţc?}ß!!!>32#"&'532654&#"fÖţ6TTXY™Jz04?9= 25D‡IJLL‰Ą–´Ť...´P\\PS****ĎhQQž;JJ‰‡KJĐáÔŢ ţŽh¸h21Â12=œ…ß!#!=Hţ´ƒCţDß0üíä;Œ–î.="327654'&'&'&547632#"'&54767327654&#"hT-../RU-../ŔP--KK‚KK--P]12PPŽPP210'(KL('NMK(')+*š++*+NM*+/23Gc;::;cG3288Yq?@?@pZ88ĆC#$$#CDH$$0ˆđ.27654'&#"532765#"'&547632#"'&SP-..-PS+***Œ(X/x==jDˆHIKL‰˘KKZ[Ź-..44]\4421ab21ţŸhQPž854&Ře_]]_eTSS„ý}~ý„‚ţ€ţAœ @ ÔÜ32tNN^luu)qJy}ţ…wYYk\ţžsa88†˙˙=˙ń•TŰýd˙˙X“C{ýd˙˙B}Ttýd˙˙F˙ńœTuýd˙˙ CÝýd˙˙?˙ń}CŢýd˙˙I˙ńĄTßýd˙˙=…Cŕýd˙˙;˙đ–Ráýd˙˙0˙ńˆTâýd˙˙?śăýd˙˙8ś—äýd˙˙Ĺś ĺýd˙˙Ř˙iúfćýd˙˙Ř˙iůfçýd˙˙E˙đŒ‚Čýd˙˙1˙đ ‚Îýd˙˙:˙đ—‚×ýd˙˙żs|ýd˙˙1˙đ ‚Ďýd ˙éĚĺ##"32.#"3267!!!!!!Ż;†JžÜÜžL…:9‚I™™I‚9ţ^‘ţoŹýăŹ78?*?77ŁIGďţ8ďGIƒţ­ƒţ`ƒ{˙Śc9'.473&'3267#"'#7&'#7&'&76?3&',;8+$"5:ţŢlŔUXĹn;4";˘˘’đŽĎ„PqJ8=ţŢ0;ëiĽŐ<)ű—^_ÓHH?W‡ćĎgjΚKüpţŘî”Ëű•(_˙äYđ,%6767# !2.#"3>32.#"óYQbUYČoţăţ¸HqČWUĂn×ĺrVŒ,Že#7!v€Š'/_ÓHGžghŸGGŐ_^ţÇţŘţٜu]\YŞśŤCŐ!!!!3###5éZýpPý°÷÷Ęé~WŞţHŞţľEţÇ9E‹lđ#!!53#535#535632.#"!!!?-üěżżÇÇÖč=—OLˆ=”t‡ţyěţžŞŞB_óś))›ÔHm˙Bo)632#4&#"#5#4&#"#3>323 0?‡o¨5FP;¨]iĆ9JI9§§!c?L3!BjbŃţßýwís{ĺý°ţ’Eđp{ĺý``ţý ‰N#55YQKP%$•‚žŹŽ((TT@I!*™‰œś##ŸŇ` ˙ăÉŐE326&##.+#!232654&/.54632.#"#"'&‹Ł]``]‹z/YM$¤ĄTP*N(:?>?>SZAm)na„At02k:WX?^)}jž‹9>/ýúŘ–bý‰ŐÖ؍ş$~´3YQKP%$•‚žŹŽ((TT@I!*™‰œśŃŐ *-037#!3!73!733#3#####53'#53'33ěáŮšpgţýäý1Œ Ĺ2CY†żżČż†YD2ĹFInŚ$„uuţüý—muuü€wü‰€uÂýŤý™gu*˙ă§Ő %2#4&#!#)"33!3*ŁÎԕŽţň•|ţaÎԕ~ŇţÖţÜţ‘VđÓú˛*$oţŞđÓN˙˙{ţ›Ń&Ókz%˙ă%đ3p@< ç1&çł ˛—(#ł˛ —–#™43('1)-&- 2'-4ÔÄÄ2ěÄ2Ä99999999991äôěôěĆ2îöîî2Ő<î2032.#"!!!!3267#"#73&'&54767#7Ó0ßT“JBŸN’Žá1ţFi1ţÓŽ“OCH”Uâţí,Ž1uŚ1´!(*Ď=DĐĚl-.&nËŃC>Ď*( n -/ l*§Ő33!!###5´Ź<Ýýş„ţ~răýœŹŠTý‰wýsýĎý1ás/˘Ő!5!!77#'%5'ţ+sţ-ĺPţËćPţĘËĐMŃMžŞŞţńĄo؈˘oŮý¸şĄnو˘nţ9Ćđ-bwƒ'67>32#"'&'"326767654'&'&67'>7632#"'.'&/#"'&54632326767654'&'&&#"32fbU!O3'A"+0.!‚. !  ü°_ \5#?\kŸ2,,#2!$(2( 4" )1>((E8&^ ,9Q Fţ‘ ţ9)ЗiRm:3X’wdg7? 2řj7#=5(6$ 629T/ ˇ(2M !:5S}$@{mbőqŒ‚~Es/4 -& "TAB`]…’ü›|@8†nR€kcd]aCœű ".˙ăŽđ)5'632327&547632#527654'#"'&#"%654'&#"š‹“o|@X"07ăPYˆtaTkľ~jü†[Iw‰mqJ2530D#24!`đNkBąţŹX``SąăŤŁżÂ†q˘J<“Xr~hFŮlŻV1??0WŚjŃŐ$)! 3#3#+##535#537!&#!3276'!Ĺ´‚^x_ ^r&a~áęĘ[[[[ĘÜMĽýţęąu ýňŐţ÷t:9s{FYý¨rsstcccţCtç;8s5˙[‰x$-#5&'&76753&'&'6767#5!'ь߉¨¨‰ßŒi`p^_kbkN?H9x"cxhuŒ…OooOĽ§ĚmnÍŚ‰$F×_0,ű?'‘ŚýS*%˛§ l™ţŃţҙl'ŠŐ5!3!#3##!##5373!/3FĽĐĽíAŹ…¤żšţ3›Á¤…ŹCŻ=ƒ>ăż`R{ýř{Ď{ýřýř{ĎĎĎ{A˙ăŃđ667654&#"5>323#!!3267#"$547#536767!5? 7Ś^š\ižVß œé^Ě':ü§,Ş™hÍskÔiüţřŮ HˆţEŻ 4cq…<;Í''ńČK={[/ {9b{‰DI×--ŕŐN@{ O/{‚ţÓO!,&'&#2767#&'&576757O[TUeeUT[Y\Y[dšsÔÔy˛e]Y\ţŠ[CvlC¤Ői--űń--iÓH$"ţđuÖ9BËtćâ"#űŁůBuŞĄf´lCŒ˙ä1đ %3267# !2."_|dT Ȅţřţ¸E}=[~čoi ‰† ƒ7@,ƒL¨]r•4‚*:0N˛ţŻţĚž ˙ĎĐ(2.#"3267#"&54632%3#"326.2"&54Ä:F#KVVK#F:-Q.~”•ƒ*PʇýއĂ=II=323‡¸‡]W˛!{¸/¸tKŻb‹š śýJˇ G'QWş¨ý‡ý¤ab‘‚ ^TH632#64&#"#'?3%Ǘŋš‡¸‡]W˛!{¸éŢ ţ1¸$ţÁ¸Ă‘‚EmýJˇH…Wş¨ý‡­EbOűžYbcJ…Ő %# !3!# ýG¸šüâHŚMţ¸ýZMd úóqűáú+áű ÇŐ #  "32!!3463"##526ebţžą223äbţžý őĚWÜU&őĚWÜU& ýę•ţěţ ”1¤űQ~ƒŽ¸>;ű\Żü‚ƒŽ¸>}ŃN*3>"32>54.'2#".5467>32654&#%!2+#hjľ–MMKLľijľ˜KL–ľkÚZZ\[śÚ~}Úś[\ZZÚ&“RXXRţř’••’“uçJ–¸jhˇKLLL˜ľij¸–JgZZ[Ü~}Úś[[śÚ}~Ü[ZZţ¸ţéICBISqmopţÖBšŐ 33!27&#%!2+!67654'&˘Ŕ` ý`sďööđňţ€1:+YX*qúó ýj’dŰÓŐÚýˆZý™)VŸžV)ţřźđ (%#'#  %27&"676'&\ćÓż,ţđţşF Eľý]ě]]ě][††{††ţÝďĽabĽţ[ţžţüţŽ 22×22űjT%śýœľ%5űŻ$ścś$%˝Ő &.2&'&+3!.+!!2!27&#676'&%3śA::f&AVyŠŕ-`5­ţ‹˘?vfţŤAŮÖd)ýň7%LK$ý2Ź—01/ÉţĺO„~ţh–bý‰ŐÖŘĐb)Ľýj’ý™)V>U)-úó “fŐh@6    B  × ˆ  ` `_`_/üţěŐîÖî91ô<<ě2Ô<<Ä90KSXÉÉÉÉY"###5!3###ś˘r˘´‰}Źrœ7ŚqŐ^ţä^˙ýžâţÓ-ţB0™Ő %#!!!5!bśĹýJZCýJÉű—śý]d úóqdúódd ˙˙J‡´î˙˙‰ÉŐ.˙˙%Źm‡ ˙çĆ-)7 7673 $54$32!"53!25&'&#"é6Ky {U>ZLtţĹţŕ ˘"š˜"Łü3ŕ8M{€{M7äM3TT<`xGZłAݰEŽŽţť°IpP3RQ4O˙˙ţăe{'uÉüV& /{ţţœ˙˙ţăeŒ'uÉüV& /tţţœ˙˙ţăZ{'ŢÉüV& /{ţţœ˙˙ţăZŒ'ŢÉüV& /tţţœ˙˙ţăZŒ'ŢÉüV& /uţţœ˙˙ ţăZ{'ŢÉüV& /Ýţţœ˙˙ţăj{'ßÉüV& /{ţţœ˙˙ţăj{'ßÉüV& /Ţţţœ˙˙ţâ_{'áÉüV& /{ţţœ˙˙ţâ_Œ'áÉüV& /uţţœ˙˙ţâ_{'áÉüV& /Ţţţœ˙˙ţâ_{'áÉüV& /ŕţţœ˙˙řZ{& /{ţţœBĺ} 5!!B#Z pü ZR#Z ¤ ZľM '#'’"Z ¤ Z$MţÝZ üp Z#Bĺ} '7!5!'7ţÝZ üp Z#ţÝZ ¤ ZţÝľM !737@ţÜZ ¤ ZţŢ#Z pü ZţÝBĺ}!5!'7'˛ým ZţÝ#Z “ Z#ţÝZß Z#R#Z  ZţÝRţÝZľM%7#7'3'ş ZţŢRţÜZ  Z$R"Z Ý ZţÝ#Z “ Z#ţÝZ ¸a 7!##¸:œăntý’':ý’tnă¸a #5'#5!ý’tnăœ'ţdăý’tn¸a )53753ßţdăý’tnntý’ăţd¸a 733!¸ntý’ăţd:œăntý’Bĺ}3!'7!5!7ÁÎţѓŽcţ} ZţÝ#Z 㔎ƒ¤úR¨ Z#R#Z úRBĺ}#5!7!'7'7!'Î/“Žcƒ Z#ţÝZ ţ”ŽߤúR¨ ZţÝRţÝZ úRY‹xa532767676767632&'&'&#"#"'&/#7!$f ! +!3-68+2",j!!!3 .6+85.0$m:œâ w '07)(6;C+ : ,:'+€ŕœ:Y‹xa5!5!#5#"'&'&'.'&#"'6767632327676­ţőœ:m$0.58+6. 3!!!j,"2+86-3!+ ! fâ:ţdŕ€+':, : +C;6()70' wBĺ}!!'#537i&ýÚ Zú– ZţÝ#Z –úZƒ¤ Zú Z#R#Z úZľM'75'3''# Zú Z$R"Z úZ ¤& Zú– Z#ţÝZ –úZ ýÚBĺ}'73'7'7#'7!5h Zú– Z#ţÝZ –úZ ýÚƒ Zú ZţÝRţÝZ úZ ¤ľM77#75'73ş Zú ZţŢRţÜZ úZ ¤' Zú– ZţÝ#Z –úZ &Bĺ}'!5!7ňZúýä ZţÝ#Z úZ1ňZú Z#R#Z úZBĺ}'7!'7'7!'4ňZú Z#ţÝZ ýäúZ1ňZú ZţÝRţÝZ úZBĺ} 53#5!5뤤ý4 ZţÝ#Z ƒúýhú Z#R#Z ľM %'3'3!5 Z$R"Z úýh¤Ě Z#ţÝZ ý4¤¤Bĺ} !'7'7!#3ćĚ Z#ţÝZ ý4¤¤ƒ ZţÝRţÝZ ú˜ľM 7#7#5!ş ZţŢRţÜZ ú˜Šý4 ZţÝ#Z ̤¤ľM%'7'3'73!5úZ  Z$R"Z  Zúúýh¤úZ  Z#ţÝZ ýč Zú¤¤Bĺ#(276767654'&'&'4#!5d >b-*,%:0ý“ ZţÝ#Z ƒ  ¤*+(54<852.& Z#R#Z Bĺ#)!'7'7!"'&'&'&547676763"mE Z#ţÝZ ý“0:%,*-11> ƒ ZţÝRţÝZ &.258<45(+¤  Bĺ#$>2+#5!5!54767676"3276767654'&'&'&l>b-*,%:0—¤ţΠZţÝ#Z 2)-019 o #*+(54<852.&ŐŐ Z#R#Z };47(+Ł }  Aĺ#%?!'7'7!#5#"'&'&'&54767676";54'&'&'&e910-)2 Z#ţÝZ ţΤ—0:%,*-11> o #+(74;} ZţÝRţÝZ ŐŐ&.258<45(+¤  } Bĺ}X3267676767632267676?'7'7#&"'&'&'&'&'&""'&'&'&#5! !  Z#ţÝZ   > >   ZţÝ#Zƒ" *!#$' *  ZţÝRţÝZ  %  '%  %' "  Z#R#ZBя‘!'7#5!3'7'˛ţč<Œ2ĺ ZţÝ#Z <Œ2÷ Z#ţÝZßţň î Z#R#Z  î ZţÝRţÝZq`• %7'7]¸JţąQďg„zý=— ZĂӄhď PJšÔţV}ý쪡e 5!#” ZţŢ"Z †¤Ç Z#R#Z ű•ǡe !#!'7'<ţ ¤„ Z$ţÜZÇü9k ZţÝRţÝZˇe !3!5”â¤ýz ZţŢ"ZžÇű• Z#R#Zˇe '7'7!3< Z$ţÜZ ý|¤ž ZţÝRţÝZ kü9şR %!5!7#7yţAc ZţÝRţÝZÝѤü‹ ZţÝ#Z?’] !3!5ҤüŠ ZţŢ"Zžżý Z#R#ZQX€ĺ)7676767632#4'&'&'&7#7K$<9JGTWDL7: ˜%#0(79).%$ ZţÝRţÝZ5NSH;9!6:IFT7/0'$&$2(G ZţÝ#ZQX€ĺ*7#756'&'&'&'&0#676767632† ZţÝRţÝZ $%.)97(0#%˜ :7LDWTGJ9<$5 ZţÝ#Z G(2$&$'0/7TFI:6!9;HSN2Ÿ 7!##5!¸:œăntý’†l':ý’tnă?PPBÖ !!#33#'7!5!'7ć#Z Ěý4 Zţݤ¤¤¤ţÝZ ý4Ě Zł#Z ¤ Z#ţݘüŸ#ýh#ţÝZ ¤ ZXyů6#"'&'&'&547672767>54'&/#7!•J%%%'HD_SlhX[HJ%%%%Jw422-A8;>112-!:œzJZ[ghX\HC+%%'GKY[eg[WMs2=>FD{2,/2{DF>H'ăœ:Xyů6#5!#52767>54'&'7#"'&'&'&54767<ăœ:!-211>;8A-224wJ%%%%JH[XhlS_DH'&&&Iz:ţdă'H>FD{2/,2{DF>=2sMW[ge[YKG'%%+CH\Xhg[[IBߏ}5!B#Z pß{#Z ¤Bĺƒ!!BMü Zţ݃¤ Z#ľM3'#|"Z ¤MţÝZ üťM#'ş¤ Z$Műłp Z#Bߏ}!5!'7űłp Z#ߤ ZţÝBĺƒ'7!5ţÝZ üƒ{ţÝZ ¤ľM!37¤ ZţŢMü ZţÝGĺM!#73ĺ{ţÝZ ¤#Z pB|  '7!5!'7 5!!ţÝZ üp Z#űł#Z pü ZţÝZ ¤ ZţÝýĘR#Z ¤ Z*§M !737 3'#'2ţÜZ ¤ ZţŢýĘR"Z ¤ Z#Z pü ZţÝMţÝZ üp ZB| '7!5!'7%!!ţÝZ üp ZüÖ#Z pü ZţÝuRţÝZ ¤ ZÁ#Z ¤ Z#B|'5!!!!5 É#Z pü  pü ZţÝ>ÉR#Z ¤  ¤ Z#R*§M73'#'#'3hĘR"Z ¤  ¤ Z$R„ÉţÝZ üp  üp Z#B|'7!5!'7!5!'7ĆÉţÝZ üp  üp Z#>ÉRţÝZ ¤  ¤ ZţÝR*§M%#73737#hČRţÜZ ¤  ¤ ZţŢRÉÉ#Z pü  pü ZţÝBA! '7!=!ţÝZ ü#Z pß{ţÝZ ¤¤{#Z ¤BA! !! !5!'7BMü ZţÝMűłp Z#ߤ Z#¤ ZţÝBĺ}!73!!!'7#5!!qŁVa6úţŇZˆţEV`6ăNZţÝ#Z"ţ>RRjŐ¨;mR¤RŚ:lNZ#R#Z RRB可!!373'7'7#'7#537!7'!ţţRRßȚNZ#ţÝZNăŒ|NZţÝ#ZNÂ.Œ9#!RRƒRRöNZţÝRţÝZNž ~NZ#R#ZNÚ ţô¤RRBĺ}!'7#5!7!5!73'7'%!7'!`ţ]Va6ú.ZţxťV`6ăNZ#ţÝZţŢÂRRţ–¨;mR¤RŚ:lNZţÝRţÝZ RRBĺ}!!5!RRpüâNZţÝ#ZNƒRRRNZ#R#ZNRľM#'3'#'RNZ$R"ZNRSpüNZ#ţÝZNüâpRBĺ}!5!'7'7!5!7˛üNZ#ţÝZNüâpRƒRNZţÝRţÝZNRRľM%37#73ťRNZţŢRţÜZNRRÝpüâNZţÝ#ZNüRBĺ}!!7/7'7!5˛ýmRR“R¤NZ#ţÝZNţNZţÝ#ZNƒRRR¤NZţÝRţÝZNNZ#R#ZNľM'77#7'3ťSRRSQNZţŢRţÜZNNZ$R"ZpRRýmRRAţNZţÝ#ZNďNZ#ţÝZ›˙Ć6a##7!#Žtn:ýĚ:œn3:âtý’:5pœ:ýĚ:›˙Ć6a '#5!#5'5Cý’:3nœ:ýĚ:nâý’:4:ţdpýË:nt›6›%753!5373ˇý’:4:ţdpýË:ntón:ýÍnţd:4:ý’›6›%3!'3Žn:ýÍnţd:4:ý’n:ýĚ:œp5:ý’tBĺ}5!!!!!żZţÝ#ZĐüŢw™ügw"?Z#R#ZRwRwRBĺ}!5!7!5!'!5!7ý0"wüg™wüŢĐZ#ţÝ?RwRwRZţÝRţÝBĺ}37773'''#5:—–––;!\–––—[` ZţÝ#ZƒC­­­­C¤j­­­­j Z#R#ZBĺ}'7'7#'''53777˛ Z#ţÝZ `[—–––\!;–––—:ƒ ZţÝRţÝZ j­­­­j¤C­­­­CľM%#5#535#535'3'3#3ş¤úúúú Z$R"Z úúúźźź¤t¤ř Z#ţÝZ ř¤t¤ľM533#3#7#75#535#5¤úúúú ZţŢRţÜZ úúú˝˝¤t¤÷ ZţÝ#Z ÷¤t¤Bĺ} !553353!ţţ ZţÝ#Z ť{ťƒ¤ Z#R#Z ¤¤¤¤¤ľM '3'#7#7 Z$R"Z Ľ٤n Z#ţÝZ ţţ}ťťţĘťťBĺ} !'7'7!+53#53° Z#ţÝZ ţţ}ťťţĘťťƒ ZţÝRţÝZ ¤¤¤ľM 7#77'3'3ş ZţŢRţÜZ ¤Ł¤ßţţ ZţÝ#Z }ťť6ťťBĺ} !!#3ć#Z Ěý4 Zţݤ¤Z#Z ¤ Z#ţݘBĺ} 3#'7!5!'7뤤ţÝZ ý4Ě ZZ#ýh#ţÝZ ¤ ZźŚ 5!5! !!? üöOţ‹uü˙ôĂĂ]Ěţ%uuÉţ¨óŢv 333'#!#Ś\Ě^ÄvĘţ¨ČtPüö Âţďü˙uBźšŚ !!75!!5’üö Âţđüţtô]Ě]Ăţ‹ÉXÉţ‹óŢv ###3!3,^Ě\ÂţŒČXĘţŠ& üöÂü˙ţ‹óŢv 3'335%!!# #Î^ÄÂ\ĚţîXţ¨ČtvĘŕpÂÂţţňŒŒFţčšguţ‹ţ™óŢv %3'3#!5%# #3!Î^ÄÂ\Č^ţ$ČtvĘĘýŇ~ÂÂý‚ŒŒFéuţ‹ţţčóŢv #3#!5#3/# #3!ŕđJ\Č^Ę^|HGeČtvĘĘýšJý‚ŒŒ~{GGýMéuţ‹ţţčóŢv 3#!!5#3# #3!F \Č F Ę^ţČtvĘĘýďŸý‚ŒŠüWŒ~ýČéuţ‹ţţčóŢv 3'333'37# ##!#Î^ÄÂ\ĚfÄÂd^ŹČtvĘĘĘţ¨ČˆÂÂýž ÂÂ^­uţ‹ČýÇ9óŢv #!5#3'%3'37#7# ##3!3Č^Ę^Ä fÄÂd^ŹČČČtvĘĘĘĘýČˆţJŒŒśÂÂČÂÂ^ţ‹Čuţ‹ČţßţčBźšŚ '#35!7'!!!5 5ŒŒ~ÂÂýČţčętţŒ—Éý˘É]ĂĂ]ţîÉęÉÉţ‹ţ‹ÉEŒF 7!##!#*:œăntý’aüI':ý’tnăťIüFEŒF %!53753!5!lţdäý’tn~ćűşüĺntý’ăţd&űťIüóŢv #7#3'# #3 3\ÂÄ^^ÄÂČtvĘĘţŠţŒČPýÖÂÂ*ÂÂOuţ‹ţtţ‹uBĺ}'0#"'&'#53676323'7'7%&'&#"!3276Ĺ4RvxN1kk2Ow9g' í Z#ţÝZ ţ™ 0GD2 &ţŰ +JD5ß@3PO2B¤B4R,( :  ZţÝRţÝZ ¤11¤/0*§M !#737'#' RţÜZ ¤ ZÂ"Z ¤ Z$#Z pü Z*ţÝZ üp Z#B˙a7!5!'7!5!'7'7!5! üp  üp Z#ÉÉÉÉţÝZ üp? ¤  ¤ ZţÝRÉÉRÉÉRţÝZ ¤Bĺ}#5!5!53!¤ţĽ ZţÝ#Z [¤qßúú Z#R#Z úú¤Bĺ}!5!53!'7'7!#˛ţp¤\ Z#ţÝZ ţ¤¤ߤúú ZţÝRţÝZ úBĺ}#53533'7'7##÷ ZţÝ#Z ÷¤ř Z#ţÝZ ř¤ß Z#R#Z úú ZţÝRţÝZ úBĺ}#5##5#53533533Ҥt¤÷ ZţÝ#Z ÷¤t¤˝ßúúúú Z#R#Z úúúú¤Bĺ}#53533533'7'7##5##ţźź¤t¤ř Z#ţÝZ ř¤t¤ߤúúúú ZţÝRţÝZ úúúBĺ}53533533'7'7##5##5 ZţÝ#Z §†8†¨ Z#ţÝZ ¨†8†ß Z#R#Z úúúú ZţÝRţÝZ úúúúźŚ !! ?ÂÂOü˙ţ‹uôĂäţÝuuBź¸Ś 7% !5’Âţďuţ‹ü˙ôţzĂR#ţ‹ţ‹#¤ź¸Ś7 ! ?ÂÂSÂý:ţ‹uľuţ‹ôĂÆţzĂRţÝuuţÝ#ţ‹ţ‹#%ŹŐ %!3!3hŐţV[ţ7Ńl nŃţ7˛üüRŐţ{…ú+u˙ă\đ #&'&#"327673 u ö…B!ĘOœœOĘ!B…ţ oôĆcI7™ţÍý˜ţ͙7IcĹś˙ăL 0"'&547632654'&#"563 3276767&#" \m`c˛u\6% GźGnth r5?Ł€ţÁ,/H@3H5,Yš„:$Ueˇž”˜I+HQ\‡N­,¨öt­qƒţ¸œzSd69->eSY׎l˛Ő 7!!5!!5!!˛´ýL´ýLkü•ŞěŞëŞú+˛˙˘5!#7#53!5!!5!733!ýŠšZŠ‹ţëDŠţ2ţ›/ŠŐţűŠŐú+^^ŞěŞëŞ``ŞţëýkţěIbŠŁ!0?"'&''7&'&54767>2"&'2767>54'&&cv-'''OOžÝ_@8vcu-'''OOžÝ_A:÷ŁGE:;9($(ŻýŘ#&GŁFF:;9˘cv8@_pm__ONP(-vcu:A_mp__OOP(-9;ŒSPF($(ŽýŘ9;ŒPSF'˙úُO@*iiiiBůűÔĚ91/äě90KSXííííY"#3 !ŃýţáúqĂűé˙úُ!#7!ßýřŃhqýúq́P¸3!!"&63!!"!0",˜ZŘţ(ˆč††čˆŘţ(\JN*"‡f_‚–ŞÄQŽQÄŞKM€_fށ˙OPi%+%3!!"''7&'&6;73#!!#"!#LŘţ(0,:ŁCyEB†čˆŞ6Ł'|°>ţŽv\JK-".4ú"$:ŽŞ ˝1ÝcŹŠŽQÄą2Şţ#އKK‚_fŞf_lF‚ĽO]B°/° 3° 3ąíąíąí°°ް2ąíąí°°ް2°2ąíąíąí01!3!!".>3!!"Nüí=c…Řţ(ˆć††ćˆŘţ(…c=ÖŞI9[ŞÜÜŞ[9IP¸&'.#!5!2#!5!276767!5  ,˜Zţ(؈膆čˆţ(Ř\JL, üâ1f_‚–ŞÄţŻţrţŻÄŞKM€_fށ˙OPi%+&#!5!27+'7#53!5!3276767!73&'&'…ţ(Ř/-9ŁCyDD†čˆŤ6Ł'{Ž’ţŔrx\JJ. ţÓ4ů %: Ş ˝1ÝcŹŠţrţŻÄą2ŞÝŞýyKK‚_fŞf_lF‚ĽO]5!&'&#!5!2#!5!2767ƒ>b†ţ(؈憆ćˆţ(؆b>,ŞI9[ŞÜţţÜŞ[9I˜ţL9îš@ €€ÔěÔě1Ä2Ôě0!#!˜Ą›ý•ţL˘ř^řâţL=î 7´  ż @  Ô<Ä91äôěî990!!5 5!!LńüR%ýŰšý# ţՉ\—P_ŒüÝX-yל ÔÄ1Ôě0!!X!űßתXy“!5!!5!3!!yűß!ý›ţDź¨˝ţCéŞűmIŞLţ´Şţˇ˙˙f˙B7Ő˙˙ŚŻ+U ţe˙˙+GŚÂrýŇ˙˙?š‘ęÄÉ;˙Ů   /@     ÔÄ991ÔÄŔŔ90'%3##d)#ŰӔ/ţöÝ}bý%żƒůź9˙˙;˙Ů v'u˙e†ˇ˙˙;˙Ů e'Ý˙e†ˇşúđ %.#"326"&'#"&54632>3"3Ş8\32#"&'#"&54632ś9[=G[TFBiË8\=G[SDCj~/“[wŹŁ~S€NA„U}Ś„^ˆsˆd†lk€ut†c…jmv˙uŰ §Ôdƒ|kÖĽ­Îs}Tő!3!Tü*Ş,ÖüÔ}Tő!3!Tü*Şýp¤ÖüÔ¤,˘33# ¤NíMżţűţű˘ű^ŹüT¤,˘3 3#¤żżţłí˘üTŹű^¤,˘$476767632#4'&'&'&#"#¤;9_UijŞB9Ź KGLV32326yKOZq Mg3OIN’S5dK t]F‰Ż;73 ";@Ž<7  6<Xńy32767>32.#"#"&'XJ‰F]t Kd5S’NIO3gM qZOK?<6  7<Ž@;" 37;XŽyG&'&#"5>323267#"''43OIN’S61-NˆSXIF‰JKOQdSˆP  ;@Ž<7 Wţ‘"323326X!űß!KOZq!Sc1NJO’R`‚!t]DŠ˘Ş¤°;83$777=X`yĂ!!#"'&'.#"5>32326X!űß!KOZq Mg3OIN’S5dK t]F‰ ŹcŻ;73 ";@Ž<7  6<XbzŐ'767#"'!!'7#5!7&'&567676ǧfYUE5kIQ%\n*ýx˜rYéQ’MoIF\<[ETFR‚ Ćqţŕ$"B˛2(˛ŤţdšŤç%(9ŹL5XXŔy$!!!!#"'&'.#"5>32326X!űß!űß!KOZq Mg3OIN’S52'V t]F‰ŘŹŔŹĎŻ;73 ";@Ž<7 " 6<X1y0%#5!7!5!73!!!'#"'&'.#"5>32326Qůu‹ţ{hq,ůţ‹‹ý„gqTKOZq Mg3OIN’S52'V t]F‰ŔŹŔŹR=ŹŔŹR Ż;73 ";@Ž<7 " 6<Xy.1%!5!7!5!7&'.#"5>3273267#"'!!!!'hţđMEţnĐK Mg3OIN’S523J:V›Q F‰JKO!8Ąţ!E$ýŸFœŔŹŔŹŃ";@Ž<7 î8á32326#"'&'.#"5>323326yKOZq Mg3OIN’S5dK t]F‰JKOZq Sc1NJO’R`‚ t]DŠĂŻ;73 ";@Ž<7  6<ţа;83 $77 7=X0yĂ8&#"5>327&'&#"5>323267#"'3267#"/'Ý00NJO’R:G67'43OIN’S520N]Ša91F‰JKO?J4r[DŠKKOdgbŠŁ 7˛ ;@Ž<7 !7)ţ˝32326#"'&'.#"5>323326!!yKOZq Mg3OIN’S5dK t]F‰JKOZq Sc1NJO’R`‚ t]DŠü*!űß“Ż;73 ";@Ž<7  6<ţа;83 $77 7=ţˆŹX•y“7S#"'&'.#"5>323326#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Sc1NJO’R`‚ t]DŠKKOZq Mg3OIN’S5dK t]F‰JKOZq Sc1NJO’R`‚ t]DЏ°;83 $77 7=Ż;73 ";@Ž<7  6<ţа;83 $77 7=XŔy$!5!53276767632.#"#"&'yűß!űßJ‰F]t V'25S’NIO3gM qZOKŘŹŹţ”ŹŹ#?<6 " 7<Ž@;" 37;WÝy' %52% $'"51ţpţśZ¸šVý(Iţ§¸šţŠٜ˛œٞţśœ˛œٞXDzž;%76767!##"'&'&'#5!!5367676323!&'&'&i1*+Vá WJRNMR  áW,!::!,ţŠá\HSLPM% áţŞ+*ß%'H:^¨2:A<336G84¨^:H'@'H?Y¨ L=@33/N0<¨^:H'%X`zž!!5367676323!&'&'&!!i:!,ţŠá\HSLPM% áţŞ+*ýž!űß#'H?Y¨ L=@33/N0<¨^:H'%ýäŞ˙˙X`y& $š˙˙X˙éy& '$š'$š$ýş˙˙X˙ěy'$”ý˝& $ţoš˙˙W˙ěz'$”š& $ţný˝J.‡Ő 3#3#!5!5Jěěěě=üűüű>ţđ§ţ𚏏–ŞŞJ.‡Ő ##!!!!‡ěěěüŻüűüű>ţđ—ţđţ7ŹBŞX`y˘ 365&'!!5!&547!5!!%43‘448űß>ţŔ!ţÉú0IG00GG2đŞŞ?8>;¨¨_8X`y !!!!"264&'2#"&546X!űß!űßIdd’deH:l'**Šz{¤¨ ŹBŞŹbFE``‹bq+((d:sĄžvvŁX`yK!!!!2&'56X!űß!űßćË×ÚŘÜŇ ŹBŞS—˛— ž˛—X`yD!!!!73# X!űß!űßÖę˘éŤŚ ŹBŞňZýŚŞţVX`yD!!!!33#X!űß!űßÖ•ŚŤé˘ ŹBŞLţVŞýŚX`yĽ!!!!!!'X!űß!űß° TU ÚUÜŰT ŹBŞ­˙ž˙ŸŸX`y° !!!!!3!X!űß!űß–-Éeý“ ŹBŞţz(ýiE`Œ07GO!!!!#"3###535463!3267#"&54632.#"'53#5#"&4632264&"X!űß!űß4@#mmC???DíţĐJB&G$$K&aqk[Q_B;18BÇCC?-I\\I-?Ěp`ctiF6A?9iÚýĐ=$#tžu#g“SS“SX`y*!!!!>32#4&#"#4&#"#3>32X!űß!űß."]?T\Y88EQY7:DQYYU;;R ŹBŞĽ=:xoţľHOM]QţĘHPL^PţĘ%U20=X`yÚ ,!!!!3#7#546?>54&#"5>32X!űß!űßĂffc`--A6(Y1/a3\p$-, ŹBŞiČN2A+,/-7#!^aO&E++ X%yÝ<@       Ô<Ä291Ô<Ä2ü<Äţ<Ä990!3!!!'7#5!7!X‡ö}¤Ëţ˛¸ýyř}¤ÉJ¸ýţ˘;fŐŞěŹţĹhÓŹěXŔyB !!!!!!X!űß!űß!űßŘŹŔŹ‚ŞX yú%#5!7!5!7!5!73!!!!!'Gď=XţkĺXýĂ‹U7ëţČY‘ţ Z:ýwSŔŹŔŹŔ޸AwŞŔŹŔŹś@Xyî 7!!!!!!!!X!űß!űß!űß!űߏŹ„ŹŔŹ‚ŞXy? (@ĺä ( ' ü<ě2291/ěôě905!5yűß!üß!űßśśL¨K¸çţ ŞŞXy? (@ĺä  (' ü<<ě291/ěôě90-5!!X#üÝ!űß!űßśęç¸ţľ¨ţ´VŞV˙TwŸ 3!!5!5V!űß!űß!üß!űߏÂśL¨K¸çţ ŞŞV˙TwŸ 3!!-5!5V!űß!üß!űß!űߏÂęç¸ţľ¨ţ´VŞŞVţľwŸ#5!7!5!73!!!'5 Ęp[ţ5mš{*Éţ•[Ćý”™y~űß!üߏŹ`ŞĄu,Ş`ʟvëśL¨K¸çVţľwŸ#5!7!5!73!!!'-5 Ęp[ţ5mš{*Éţ•[Ćý”™yŁ!üß!űߏŹ`ŞĄu,Ş`ʟvëęç¸ţľ¨ţ´Wy&%5767$'5674˝ţŕ[Řš‚zšŘ˘bžţĽŘÁš|˜Ű Űˆ˛ŞMţţ)I˛g#ˆ˛ŞţM(J˛h#X˙ăy %5%%%'áţw2r™K/ţ’dŇýţt™äţŮé”›ŚŢm0ńxśŠţťŽˇËţ‹0ÝoVX˙ăy '75%%5%'đ‰ýÎr™KţŃndţ.t™ä'éo›ŚŢţ“0ńxśŠEގËu0ý#oVX˙ y!5!%5%%%!!'X˙ÓÇţôC_ţ^?sĄMţ¤NŞţ#N+ýžP˘ęJ>ýžŞƒ¨´`5íY¸dń|ś–ěŞó5X˙ y!!'7#5375%7%57'ŕ™ýËNƒýEO˘>łë:ţŰfLţNćtĄĐřÎt€¨ąńŞó5žŞ˛\śhě}¸˜a5ý…H<V˙Ôw?#%#"'&'.#"5>323265wKOZq Mg3OIN’S52'V t]F‰Jűß!üßőŻ;73 ";@Ž<7 " 6<śL¨K¸çV˙Ôw?!(%#"'&'&'&#"5676323276-5wKHGOZq M343OFGINIIS52'V t]FDEü)!üß!űßőŻ;3 " @Ž< " 6ęç¸ţľ¨ţ´V˙ w+.%"5>327%5%%%3267#"'&'&''}QIN’SEţ^AsĄMţ§PŠţ#Bt]F‰JKOZq _˘4ţýŐO;@Ž<7փ¨ľ_5ěX¸cň|ś–Ď6V˙ w27'732767#"'&'&''5676?5%7%5ƒôĘ3—ýÍ;L t]FDEJGLGOZq P32326&%&%5$7$7wKOZq Mg3OIN’S5dK t]F‰JţÝţl”#ˇţä÷ţŠaíˇŻŻ;73 ";@Ž<7  6<RţĐO]ţŢďɗ‚9Ś=}–ËV˙Žwą*%#"'&'.#"5>3232655%$wKOZq Mg3OIN’S5dK t]F‰ü)ˇíaţŠ÷ţçş#”ţlŻŻ;73 ";@Ž<7  6<Rď˖}=Ś9‚”Ěď"]OV˙[w§67&%'&'5$774Łh›m ľUéÁ˛ţÖ ˘ŚŔéGöc _eT§2ţŞw™ď°nţëwÔď÷ýô2"O0ŚBţźj%V˙[w§'567&'567&™Łh›m ľUéÁ˛* ˘ŚŔéţšöc _eTĽ2Vw™ď°nwÔď÷ 2ýŢO0ŚBDj%XŁy_%!"'&54763!!"3!yý˝ÉŠ‹‹ŠČDýź‰ž_`ˆDŁ‹‹Čƍ‹–ŔˆŠ^`XŁy_75!27654&#!5!2#XDˆ`_ž‰ýźDȊ‹‹ŠÉŁ–`^ŠˆŔ–‹Ćȋ‹X˙Äy> #"&'&5476;7!!!!"#'J‰ž_+30TD‹‹ŠČ~KĄ9ţşÝ#ý˝ K˘ÉŔˆŠ^+#E‹Čƍ‹ß5Ş–ýp–ß5X˙Äy> 32654'&'7+'7!5!!5!237RJ‰ž_+30TD‹‹ŠČ~KĄ9ţíFÝýÝC K˘9ŔˆŠ^+#E‹Čƍ‹ß5Ş––ß5Xy%!5%!"'&54763!!"3!yűß!ý˝ÉŠ‹‹ŠČDýź‰ž_`ˆDŞŞŞš‹‹Čƍ‹–ŔˆŠ^`Xy%!=!27654&#!5!2#yűßDˆ`_ž‰ýźDȊ‹‹ŠÉŞŞŞš–`^ŠˆŔ–‹Ćȋ‹X˙,yÖ&%!!'7#5!7&'&5476;73!!!#"$UýrGŸ6ă:qY‹‹ŠČ˛Gž5âţěÜđýÝ^‰ž_=RŞŞÔ5ŸŞŹ Y‹Čƍ‹Ö5Ą–ýp–&Ŕˆˆ`=X˙,yÖ!++!!'7#5!7!5!&#!5!27327654'&'ƒ92‹‹ŠÉD4VýqFŸ5â3ţ˛Ű ýźD&#Ižţźˆ`__Ç 2Ćȋ‹šŞÔ5ŸŞš––Ű5ü9`^Šˆ`X˙0y!%!'7!5!7#"'&54763!!"3!!yţ§„Rţ č|†ÉŠ‹‹ŠČDýź‰ž_a‡DţąAQŞŞĐjfŞš‹ŒÇƍ‹–ŔˆŠ^`–5eX˙0y"%!'7!5!7#!5!27654&#!5!2yţ§„Rţ č|ý˝D‡a_ž‰ýźDȊ‹‹]zTQŞŞĐjfŞ›–`^ŠˆŔ–‹Ćnj^DeXwy‹1°/°3ąíąí°°ް2ąíąí°/°3ąíąí01!!!!X!ü‰wűß‹Şý@ŞXwy‹1°/°3ąíąí°°ް2ąíąí°/°3ąíąí01!5!!5yűßwü‰‹űěŞŔŞXyô H°/°3ąíąí° °ް 2ąíą í°°ް2ąíąí°/°3°3° 3ąíąí017!!!!!!X!űß!ü‰wű߸ŞćŞý˜ŞXyô J°/°3ąíąí°°ް2ąíąí° °ް 2ąíą í°/° 3ąíąíąíąí01%!5!5!!5yűß!űßwü‰¸ŞŞ<üDŞhŞOi‚ž3?2"&'&'&547676"2767>54&'&'3!!#!5!úÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:FތţěŒţížPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9ţëŒţîŒOi‚ž372"&'&'&547676"2767>54&'&'!5úÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:FÂýMžPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9ţՌŒOi‚ž3?2"&'&'&547676"2767>54&'&'77''7úÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:FţBcÄĂcĂÂcÂÂcžPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9­cÄĂcĂÂcÂÂcÂOi‚ž372"&'&'&547676"2767>54&'&''úÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:F,cţcžPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9KcţcOi‚ž73#2"&'&'&547676"2767>54&'&'éüüÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:FţĎżPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9Oi‚ž2L2#"&546"326542"&'&'&547676"2767>54&'&'h7b%&'œqq—š§nNL88OôÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:F)'%`8nš—qqœ‡MpLM77äPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9Oi‚ž!'/7=E2"&'&'&547676%&'&'& 654'67676-úÝžOO''''OOžÝžOO''''OOf˙:F-ţěTţ1-F:ţžţ:E.ţűţěS˙1.E:žPOO__pm__ONPPNO__mp__OOAţϚ9FPQţź™ţŇ9ƒ.™9떖EQPDš19Oi‚ž!;!!!!2"&'&'&547676"2767>54&'&'+{ý…{ý…ĎÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:F;gZfÖPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9Oi‚ž372"&'&'&547676"2767>54&'&'!5!úÝžOO''''OOžÝžOO''''OO~ŁGE:;99;:EGŁFF:;99;:F2ţm“žPOO__pm__ONPPNO__mp__OO=9;ŒSPŒ;99;ŒPSŒ;9ţIŒPiƒœ%!!!3!!#!5!ôüčŒ3űÍҌ8ţȌţÉ7őüĺ§ű͘ţnjţĘ6ŒPiƒœ %!!!!5ôüčŒ3űÍrýMőüĺ§űÍ_ŒŒPiƒœ%!!!7   'ôüčŒ3űÍŹc  cţôcţřţöc őüĺ§űÍ#cţő cţôţřcţ÷c Piƒœ 3#!!!éüü üčŒ3űÍţĎęüĺ§űÍé/ĺ`šľÔě1Ôě03#éüü`ţĎ›É7 !!'  TS ŮTÚÚS8˙˙ž˙žž˙X`yĂ!532767>32.#"#"&'yűßJ‰F]t Kd5S’NIO3gM qZOK ŹŹˇ?<6  7<Ž@;" 37;XţAy 755%5!5X!űß#ţűß!üß!űßĘśţ´¨ţľ¸çŹśL¨K¸çţ ŞŞXţAy % 5 -5!!yüÝ#űß!űß!üß!űß!űßĘęç¸K¨L ęç¸ţľ¨ţ´VŞVw?  55!5!wüß!űß!űß!‰ęç¸K¨LVŞXy? 55%5!X!űß#üÝ!‰śţ´¨ţľ¸çöŞŞV˙wą $75$&%&%5$7$7¤"ąËţřŢţnłˇţäíţŸW÷ˇţÝţl”ČĎüܜƒ8Č6üsď˖}=Ś9‚—ÉďţŢ]OV˙wą $'$'5%$5)ŕnţŢţřËąą#”ţlţݡ÷WţŸíţ䡚6Č8ƒœÜüĎű0O]"ďɗ‚9Ś=}–ËVţŒw)%*67&'&%&''&'57&%5$?7d˘MjT˜VĘĽŠţ3ËąţŢ!ł˘şŁĐ÷ś3Ňţňaí4m"cjX)3őS]ď‡[ţîeĽďšĄœÜüĎČýČ3N@Č%HŁZ-Ś=}ţ¤k$VţŒw)$(6%'56?56%7$'57&%˘Ľšť˙ËDŃ>ţ’ॢWwZŒŠNçœĚ(ţĺۡ+/m")3ýó3 Ś+SŘi0Č6šţ3hiü˜y÷‡ŹďËjeĺď˖ÜX˙[y§3!!!'7#! !PžYäţŘţćBýzržYä†ţ˘ţh§?ÝŞý@Şţä?Ýü–Ŕý@X˙[y§3!'7#5!!5!!PžYäýzržYä(ýž†sţć˜§?Ýűěţä?ÝŞŔŞŞý@ŔX˙>yô!!!!!!'7!5!7!X!ü‰wţŇ R`ţ§„Rţ čgýąôŞý˜ŞfŞĐjfŞ€X˙>yô%!'7!5!7!5!!5!!yţ§„Rţ čgýąwü‰!ţŇ R¸ŞĐjfŞ€ŞhŞüDfVţíw?%%&'&#"5>327%5 %3267#"''43OIN’S:Z0ýě!üß!ţx2XIF‰JKOQd>ˆ3  ;@Ž<7 ҧ¨K¸çęś{ß"327V!üß!ţ?E>XIF‰JKOQd>ˆC43OIN’S:Z0ýěśęç¸ţľ¨ţí"323267#"''&%&%5$7$743OIN’S61-NˆSXIF‰JKOQdSˆšţÝţl”#ˇţä÷ţŠaíˇ  ;@Ž<7 Wţ‘"323267#"''55%$43OIN’S61-NˆSXIF‰JKOQdSˆţ˜ˇíaţŠ÷ţçş#”ţl  ;@Ž<7 Wţ‘"ř # #hÖŁţÍţÍŁřýGÇţ9’ţň>Ź 3 3hţ*Ł33Łţňşţ8Č’>Ž !!# #œ™ügĚÖŁţÍţÍŁŽrcýGÇţ9’>ˆ !!!!# #œ™üg™ügĚÖŁţÍţÍŁˆrˆrcýGÇţ9Ďţňw!##Ϩđ¸ůmZţň##5¸đřŢ“Ďţňw33ϸđţň"ůmZţň!533ţXđ¸ţň“%–ŻC!!3#ň˝ţCÍrrCr[ţ  –—C!!3# ˝ţCrrCr[ţ %ŃŻ~!!3#ň˝ţCÍrrCr­ţ  Ń—~!!3# ˝ţCrrCr­ţ Xsy^!#yü‡¨^ŹţÁëap$%%$灁‰‰ţţ‰ţń¸¸¸¸ýřЉ‰€‚ŠŠţ~ýřôąąţ ýĺą˙˙°Ë Žœ°Ë%6 %!&'&"1˜1™2űŔť*ŔzôzŔ°`°XX°ţ rĹoGGn¸Y  67" Ň,›J5ţPţP5J­ř…X*7ýú7*#LţČ8ŚĺP"2642#"''7&546Ċ‡ÇŒîži56؝]ĚQÍBÖɉLJ‰Ăo3…N˜ÖEĚQĚ\|ŘGéŠ+-7AJT35#"&546;5#"&46235462+32"&=54&#"3#"2653264&"2654&#ĎςˇYxxYˇ‚Ď‚¸€€ZxxZ€€¸‚ţÉE1/EE0uu0EE`EŸv/EDaEEaDE/˘ĐţČwZ€\Z‚Đ‚ś€ZwwZ€ś‚Đ‚Z\€Zw u0EE`Eţ`E/1EE0E`EE0ýëu0EE1/EXsy^!3!yűߨysëţÁ+Ńľ~!#!ľýčrŠ ýĹ­ŃŚ~5!#Šr rýS;+˙Žľ;!!3ľývrr­ýĹ˙ŽŚ;)3!rýv;ýSţL4732#"'&'.#"0 žĘPd@7* hţŞ$źTA6?&Hý•ţÓűö|ţČ( #"&546323250Ç žĘPd@7* h(üV$ýýţDTA6?&Hk- héiÉ !!!#%!!h\‘ţrţoâa ţ`ÉüŢž"žž(ËI  !! #37!#3'ËţQüęţÓ'ČČ'ţHƒƒţo99ČɃƒšţo!ţpţáţâ=ťťýĂţâťť}(TI #!!7!#3'âlČČŢü)×ý‘ƒƒţokkČɃƒš=ţáţâr!rťťýĂţâťť+2łŸ" #/;GS_kwƒ›§łżË×ăďű+7CO[gs‹—ŁŻťÇÓăďű!2#!"543!254#!"+"=4;2+"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4"=43+"=4;2+"=4;2"=43!2#Žľ\\üK\=ľüKl]Џ\¸\\\]ŚiiüĹ\][]\\\\\\\\]\\]\\\\\\x::f>]ýY­"\ţI\\ˇ\\ţIˇţ`LLMK\y>ţŢ>(ËI !! 3#)%3!'Żüęţű-'ČČ'¸ţúƒČČ9ţ6ƒšüß‘ţáťťţáţâ=ýĂťH˙ÓˆJ7 hýŕHŘŘH--JţäJ˙4ŃĄ!!!ríţrŃZ‰ůmř“˙4ËĄ !%!!5!5!5!!Ĺű­áüáüáüĚmř“rşŹěލ˙4ËĄ 3#3#!%!!5!!îőőőőţĹű­áüáüoöţőţžmř“r‡ŞX˙4ËĄ  ! !! !ĂĽŚţZţáţţSű;Ĺű­đńüÜţZŚŚű$ÄţđüĘmü­đţá˙˙˙4ËĄ& :–˙4ËĄ '3276'&#"!#"'&'!!67632!€ôzzzzőőzzzzüáIw™˜™˜wHSű;Ĺű­Hw˜™˜™wIüőý΍GG2GGű$Ę_EXXE^ýĹmý¨_DXXE_çţ˘Ë3#%673#&'%676'&1rs˜rs2ţÎsr˜srˇôTTTT@TTőőT|Ŕ°Bôţ B°ý@°Bţ)×B)ý΍1Ě1@ü4121˙˙tËD& : yČ˙4ËĄ !%!!Ĺű­Yü§áüžbĚmř“Ć5Aů¸˙4ËĄ !!!!Ëű;Ĺrü§ˆbĚmůY5Aů¸˙4ËĄ !%!5!Ĺű­áüáüáüÎĚmř“rXˆŔˆaű…eţĚ˙4ËĄ !%! !Ĺű­áü2üÎáüĚmř“rŕţxý›1éţxé˙4ËĄ !%!!5!!Ĺű­áüî ZţëZ üĚmř“rĎ ZnZ ˙4ËĄ !!'7!!!'7Ëű;ĹrţëZ üîáü ZĚmůęţëZ ý1X1üę Z˙ÄËŐ'327#"'$%'3632# 6'&#"€ôzz=>ţlĎ–WW™˜ţĎsżPYX˜™2ţ灞ţv”Ňőzz>ÜţçGjŒü˛X°`O°úŽX°ţ ţݰţéňü•ŒG%ţ˘Ź3 33!#!!3˜/Éţ˜ţ É.öŽööŐ^ţ˘ú+ţ˘^ŐúŐkü•k˙4ËĄ 7!!#xđńrű;ráţcŚ/ţíűłKrř“müěüĺüu˙4ËĄ % !%!50!53!ŠţŢţŢţŔĹű­áü‚Ý‚üŞyű‡ţŠmř“rZ[zú†Ô˙4ËĄ !!%!!''!Ĺű;´ŸţGZ ¤ ZţHĄř“r‰ţěZ úEť Zůw%ţ˘Ź3 !#!3!###.ţ7÷˜řţ7/˜öö˜öŐ^ţ˘ú+ţ˘‰ü•kü•k˙4ËĄ! !! 3!xáţţSű;Ĺű­žŚüZKűłţ{mű§üuĺ˙4ËĄ ! !%!#5!5!Šýź"ýžĹű­áţ~Ýţ~áü+ű‡ţ‚mř“rÔú†z[Z˙4ËĄ !7!)!7Ĺýď Zţěšý˝ţb¸ţěZ Ěmř“űúE Zţě‰ůwZ ˙˙˙4ŃŐ& 9 ˙˙˙4ËŐ& 8Ú˙˙˙4Ë?& 8 uČ˙˙˙4Ńé& 9 :˙˙˙4ËD& 8 yČ˙˙˙4ËĄ& –˙˙˙ěZĺ^' Č%˙˙˙4ËĄ&–˙˙›É' ;˙%˙˙?Ô‘H' ;˙8 :˙˙tËŚ' ;– yČ˙˙XěyH' ;˙8a˙˙XyH' ;˙8!%ŹŐ *!%#567!676&'&'&'&Şý|z*(2J E<iKH#&şőŮGIJEÂ‡Ř Eý˘—|-2 M3 +ţO  ! rŽ;ýŸĆ ?Ž9yý?pý㏠ ! X˙ăyđ*= 67 '&5677%"632327'&32767#"'&'.#"yŢ{h p{ţ"zi piE5 5dJ t]BFţZCEŽF4 Zq Mg3đħţĐŽţ°´ÄĨ1ŽPł$˜sÎ 7%’˜ý‚ţے˜˜sÎ3 !Xţ˘y3#"'#&'&#"5>323326yKOGU˜43OIN’S52˜^NF‰zŽ;7 ü(  ;?Ž<6 Ďűó'=ţáŃ'3#3!!#7#537éüü ü`?ţ‡+š¨Ć0'ţŃţ7ĎşrSSrş˙4ËĄ!!!!3!!!'7#5!7!xáürĹű÷Ĺdƒ˘ţő“žýűÇdƒ “ţeZ‰ůmř“n;fŐŞěŹţĹhÓŹě˙˙˙4ËĄ&"–˙˙6Ď`ţ˙˙žţVT|˙˙F˙ăŒ`˙˙˙4Ëz& 8ö˙˙œ˙45{& 7+˙˙˙4Ń`& 9ţ˙˙˙4Ë`& 8˙˙F˙ć•zöţ.ˇľ !ˇ /Üě/Üě1ˇś ś/<ě2Üě0#5!!!#áÇożoÇţ.Ú­ţ%Ű­ţ&H˙Óˆ:07 %#"326=7#5#"&546;54&#"5>32hýŕHŘŘHţ#[]E>Vcii!fHatŽŠŒLT5m4:j2O85%--JţäJó??8?vh+ţš]85l[hmKDg/RÚË: 935#35#35#!5!#"326=7#5#"&546;54&#"5>32assŞssţŹssű;Ĺüˇ#[]E>Vcii!fHatŽŠŒLT5m4:j2Op"¸ţŁr§??8?vh+ţš]85l[hmKDg..RÚË:1=[%5!!5!#"326=7#5#"&546;54&#"5>32#"326757#5#"&546;5.#"5>32›0ű;0´#[]E>Vcii!fHatŽŠŒLT5m4:j2Op""[]E>Vbii"eIasŽŠŒLS5m4:j2Op"Úrrrr??8?vh+ţš]85l[hmKDg..R}??8?vh+ţš]85l[hmKDg..RkËŠ*.26:>B#5#"&546;54&#"5>32#"326=%=!!%-!!%qi!fHatŽŠŒLT5m4:j2O85%Ń#[]E>VcĘţÔ,ţÔ,ţÔý“ţÔ,ţÔ,ţÔ,ţš]85l[hmKDg/R}??8?vhţńyŒyźrDŒyŒyŒyŒYrJŒyŒR8~Ď4<DLTZ`%#5&'&'&''7&5475'7676767537'5676767'7&'&'&'5'7'%654šd3/D9ą2°°2ą9D/3d4.E9ą2°Ż2°9E.42* ¨¨ *2ƒ2* ¨¨ *2źŠŠ*ŠŠ8Ë8fWfEOPDfWg8ËË8fWeDPOEeWf8g * apĂa *  * aţĂa * łba.43•ab-45F^Š˘'04>2".33&'."#67>76#FV“ĘŢʓVV“ĘŢʓđŔÁď"v ˛ v"Z¤Ď83Pv"ţÎĽ"vP3ŢʓVV“ĘŢʓVV“nţ˜h<8PvDDvP8˘ţ‚"vP9ţÁ~?9Pv"F^Š˘&0!4>2".7!&'."67>4'&hóţţŃV“ĘŢʓVV“ĘŢʓDvP47ţ´9°; ˛ ;Ńţ´74PvD"MÇţýŢʓVV“ĘŢʓVV“’˛ v"i c;DD;gý—"v ˛P F^Š˘ %7'32>4.#52".‘ŽÍîVţ—FĘýúoDv ˛ vDDv YoʓVV“ĘŢʓVS’wţVî—ĘFţ_Y vDDv ˛ vDoV“ĘŢʓVV“Ę˙4ËĄ!!!xáürĹZ‰ůmř“ý𸆠#53ŰĂ şŚ ţüZýđę—â0ýóţ†ýîüíýüۉ3#ĂÉösţ¸‰ #5Ű“ˠА ‰ęüĽţWţţeEî%3ęý𚆠53öZţü Śş ýđęz ţýýĐţüięöýüš‰#0šĂ‰ös ţš‰ 3#öĂ Đ Ë“‰ęüÍýŰţţť›ěŠ[ýü¸m#!!ŰĂ ţ#ýü qĂýüۉ3#ĂÉösţ¸‰!!ŰÝý`‰÷NĂ uýü¸m!5!őţ# ýüŽĂöőýü¸z3#őĂĂzö‚ţ¸z3!5!őĂý`ÝzöšĂ ýęÁm #4763!!"ĆşoyşţçeD9ýęuߑž°fW™ýüƆ#'&%'53 763ý:*eşnKţű==Mnşe(Á =“ţCýč ˇ_AťEcł ýčţH˜< ţÁ† 3!!"'&5Ć9Deţí¸{o†ř”šVf°žád ýôĆŒ#3Ćşşýô ˜ýęĹm 4'&#!5!2 9Deţçşyoýę}™Wf°ž‘ßř‹ ýüŔ†&'&3!3#76Ô<(eşnM==ţűKnşe*Á!<˜¸ýôţMcEťA_ţIýô˝“=ţņ 3#!5!2765 şo{¸ţíeD9†řœáž°fVšţÇ(3Ćţ(÷Řźv% !!!!55!#Žţ‹uŠXü˙ďý ̟uuÉ™ý]ĂĂ]eËÄ! !!Ëű;bcű;Ĺ $ű<ř–ţ.:ľˇ ÜěÜě1´ś/<Üě03!3–¨T¨ţ.‡ţ%Űýy˙ěđĺœ5!ůđŹŹ˙ěšĺň!ůšXţ¨ý–¸Č3 ý– 2őÎČý–Č!Č@ý– 2őÎ˙ěđĺœ 5!!5!!5!ą4üď)üď4đŹŹŹŹŹŹ˙ěšĺň !!!!!ą4üď)üď4šXţ¨Xţ¨Xţ¨ý–¸Č 333     ý– üôŔ˛ýNf üôČý–Č !!!Č@ţŔ@ţŔ@ý– üôŔ˛ýNf üô˙ëđĺœ 53353353353ź´ł´˛´˝đŹŹŹŹŹŹŹŹ˙ěšćň 3333333ź´ł´˛´˝šXţ¨Xţ¨Xţ¨Xţ¨ý–¸Č 3333       –2ýÎř2ýÎsŮţ'ýsŮţ'Čý–Č !!!!Č@ţŔ@ţŔ@ţŔ@–2ýÎř2ýÎsŮţ'ýsŮţ'ý–ĺœ!!ÍýÓý–ŹűŚý–ĺň!!ÍýÓý–\ţ¨űüČý–ĺœ!!Čţ#ý–ŹűŚČý–ĺň!!Čţ#ý–\ţ¨űü˙ěý–¸œ!5!ýÔĚý–ZŹúú˙ěý–¸ň!!ýÔĚý–Xú¤˙ěý–œ!5!Čţ$ý–ZŹúú˙ěý–ň!!Čţ$ý–Xú¤đĺČ3! -đŘúÔŹšĺČ3! -š.ű*ţ¨ČđĺČ!!Č@ÝđŘúÔŹČšĺČ!!Č@Ýš.ű*ţ¨˙ěđ¸Č5!3, đŹ,ú(˙울Č!3, šXÖůŇ˙ěđČ5!!Ü@đŹ,ú(˙ěšČ!!Ü@šXÖůŇý–ĺČ3!! -ýÓý– 2úÔŹűŚý–ĺČ3!! -ýÓý– 2ű*ţ¨űüČý–ĺČ #!!!P@ÝýÓý–ZŘúÔŹűŚČý–ĺČ 33!!ČP -ţ#ý–,úÔŹűŚČý–ĺČ!!!Č@Ýţ#ý– 2úÔŹűŚČý–ĺČ #!!!P@ÝýÓý–.ű*ţ¨űüČý–ĺČ 33!!ČP -ţ#ý–\Öű*ţ¨űüČý–ĺČ!!!Č@Ýţ#ý– 2ű*ţ¨űü˙ěý–¸Č!5!3ýÔ, ý–ZŹ,őÎ˙ěý–¸Č!!3ýÔ, ý–XÖőÎ˙ěý–Č !5!!#ýÔÜ@Pý–ZŹ,ú(űŚ˙ěý–Č !5!33Čţ$, Pý–ZŹ,úÔúú˙ěý–Č!5!!Čţ$Ü@ý–ZŹ,őÎ˙ěý–Č !!!#ýÔÜ@Pý–XÖůŇűü˙ěý–Č !!33Čţ$, Pý–XÖű*ú¤˙ěý–Č!!!Čţ$Ü@ý–XÖőÎ˙ěý–ĺœ!5!!ýÔůýÓý–ZŹŹűŚ˙ěý–ĺň !!!!ýÔĚ-ýÓý–XVŹűŚ˙ěý–ĺň !5!5!!ýÔ,ÍýÓý–ZŹVţ¨űü˙ěý–ĺň!!!ýÔůýÓý–Xţ¨űü˙ěý–ĺœ!5!!Čţ$ůţ#ý–ZŹŹűŚ˙ěý–ĺň !!!!Čţ$Ýţ#ý–XVŹűŚ˙ěý–ĺň !5!5!!Čţ$Üţ#ý–ZŹVţ¨űü˙ěý–ĺň!!!Čţ$ůţ#ý–Xţ¨űü˙ěđĺČ5!3!, -đŹ,úÔŹ˙ěšĺČ !3!!, -ýÓšXÖúÔŹV˙ěšĺČ 5!3!!5, -ý3đŹ,ű*ţ¨V˙ěšĺČ!3!, -šXÖű*ţ¨˙ěđĺČ5!!!Ü@ÝđŹ,úÔŹ˙ěšĺČ !!!!Ü@Ýţ#šXÖúÔŹV˙ěšĺČ 5!!!!5Ü@ÝüăđŹ,ű*ţ¨V˙ěšĺČ!!!Ü@ÝšXÖű*ţ¨˙ěý–ĺČ #!5!3!¸ ýÔ, -đűŚZŹ,úÔŹ˙ěý–ĺČ !!3!!ýÔ, -ýÓý–XÖúÔŹűŚ˙ěý–ĺČ !5!3!!ýÔ, -ýÓý–ZŹ,ű*ţ¨űü˙ěý–ĺČ !!3!!ýÔ, -ýÓý–XÖű*ţ¨űü˙ěý–ĺČ !5!!!!ýÔÜ@ÝýÓý–ZŹ,úÔŹűŚ˙ěý–ĺČ !5!3!!Čţ$, -ţ#ý–ZŹ,úÔŹűŚ˙ěý–ĺČ !5!!!!Čţ$Ü@Ýţ#ý–ZŹ,úÔŹűŚ˙ěý–ĺČ !!!!!#ýÔÜ@Ýţ#Pý–XÖúÔŹVűü˙ěý–ĺČ #5!5!!!!Pţ$Ü@ÝýÓý–VŹ,ű*ţ¨űü˙ěý–ĺČ !!33!!Čţ$, PÝţ#ý–XÖű*VŹűŚ˙ěý–ĺČ !5!533!!Čţ$ÜP -ţ#ý–ZŹVÖű*ţ¨űü˙ěý–ĺČ !!!!!ýÔÜ@ÝýÓý–XÖű*ţ¨űü˙ěý–ĺČ !!3!!Čţ$, -ţ#ý–XÖű*ţ¨űü˙ěý–ĺČ !!!!!Čţ$Ü@Ýţ#ý–XÖúÔŹűŚ˙ěý–ĺČ !5!!!!Čţ$Ü@Ýţ#ý–ZŹ,ű*ţ¨űü˙ěý–ĺČ !!!!!Čţ$Ü@Ýţ#ý–XÖű*ţ¨űü˙ěđĺœ5!35!, -𬬬Ź˙ěšĺň!!!¸-ű,šXţ¨Xţ¨ý–¸Č33   ňÖű*ú¤űüČý–Č!!Č@ţŔ@ňÖű*ú¤űü˙ěDĺH5!5!ůűůœŹŹţ¨ŹŹxý–XČ333x   ý– 2őÎ 2őÎý–ĺH !!!!ÍýÓ-ýÓý–˛ŹŹŹüRxý–ĺœ !!##xmţs  ý–ŹűŚZűŚxý–ĺH !!3!!xmý3 -ţsý–˛ŹúúZŹüR˙ěý–¸H !5!5!5!ýÔ,ýÔĚý–ŽŹŹŹúN˙ěý–Xœ 5!###l   đŹúúZűŚZ˙ěý–XH !5!!!5!¸ý4lţ ţt,ý–ŹúNŽŹűŚDĺČ 3!!! -ýÓ-D„ű€ŹŹŹxđĺČ 333!x   đŘúÔ,úÔŹxDĺČ 3!3!¸ ü“ Íœ,ű€Źţ¨„ú(Ź˙ěD¸Č 5!5!5!3,ýÔ, DŹŹŹ€ů|˙ěđXČ 5!333Œ   đŹ,úÔ,ú(˙ěDXČ 5!35!3Œ ýÔĚ œŹ€úÔţ¨ŹŘů|ý–ĺČ 3!!!! -ýÓ-ýÓý– 2ű€ŹŹŹüRxý–ĺČ 333!!x   ţsý– 2őÎ 2úÔŹűŚxý–ĺČ 3!33!!¸ ü“  -ţsœ,ű€Źúú 2őÎZŹüR˙ěý–¸Č !5!5!5!3ýÔ,ýÔ, ý–ŽŹŹŹ€őÎ˙ěý–XČ !5!333xţtŒ   ý–ZŹ,őÎ 2őÎ˙ěý–XČ 5!3!5!33Œ  ţt,  œŹ€úÔúúŽŹűŚ 2őÎ˙ěý–ĺH !5!!5!ýÔůýÓý4ůý–ŽŹŹüRŹŹ˙ěý–ĺœ 5!!###ůţs   đŹŹűŚZűŚZ˙ěý–ĺH 5!!5!3!!ůü“ţt, -ţsœŹŹúúŽŹűŚZŹüR˙ěDĺČ 5!5!3!ůű, -DŹŹXŹ€ű€Ź˙ěđĺČ 5!333!Œ   đŹ,úÔ,úÔŹ˙ěDĺČ 5!5!333!ůűŒ   DŹŹXŹ€úÔ,ű€Ź˙ěý–ĺČ!5!5!5!3!!!!ýÔ,ýÔ, -ýÓ-ýÓý–ŽŹŹŹ€ű€ŹŹŹüR˙ěý–ĺČ5!333!!###Œ   ţs   đŹ,úÔ,úÔŹűŚZűŚZ˙ěý–ĺČ !!!!5!5!333!¸-ţsţ ţt,ýÔŒ   ý–ZŹüRŽŹűŚŹ€úÔ,ű€Źý–ĺœ 4763!!"Q[¨yţ‡Y[ý–`Ą†Ź~|ü ˙ěý–¸œ 4'&#!5!2.-Yţˆx¨[Qý–`~=?ʆx¨ü ˙ěđ¸Č 5!2653#xY[ Q[¨đŹ~|2űΨx†đĺČ !"'&533!ĺţ‡¨[Q [Yyđ†x¨2űÎ|~˙“ý–>Č3mů˛űý– 2őÎ˙“ý–>Č#3>˛ű˛ý– 2˙“ý–>Č # # 3 3>˛ýÜýݲ}ýƒ˛#$˛ý„ý–cűűcúç˙ěđ|œ5!đŹŹF¸Č3 F‚ú~|đĺœ5!|iđŹŹý–¸F3 ý–°űP˙ěš|ň!šXţ¨ČFČ!Č@F‚ú~|šĺň!|išXţ¨Čý–F!Č@ý–°űP˙ěšĺň5!5!!5iý—đŹVţ¨VČý–Č333ČP Pý–°‚ú~űP˙ěšĺň!!!iý—šXVŹVČý–Č#!#P@Pý–°‚ú~űP˙˙˙ěĺ( 2˙ěţĺ˙!ůţţű˙ěţĺ !ůţ ýö˙ěţĺ!ůţüń˙ěţĺ!ůţűě˙ěţĺ!ůţúç˙ěţĺ!ůţůâ˙ěţĺ#!ůţ#řÝ˙ěţĺ(!ůţ(÷Ř˙ěţF(!Zţ(÷Ř˙ěţ§(!şţ(÷Ř˙ěţ(!ţ(÷Ř˙ěţh(!|ţ(÷Ř˙ěţÉ(!Ýţ(÷Ř˙ěţ*(!>ţ(÷Ř˙ěţ‹(3žţ(÷Ř˙˙iţĺ( :} ˙ěţF( #'+/3!33!33!33!33!33!3Ś ü䟟Ÿüĺž ü䟟Ÿüĺž ü䟟Ÿüĺžţţűţűmţűţűnţűţűmţűţűnţűţűmţűţű˙ěţĺ( '/7?GOW_gow3##3#3#3#;##;##;##;##;##;##;##;##;##;##;##;##Š  žž  žž  žž  ž>ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ>ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ> ŸŸ  ŸŸ  ŸŸ  ŸŸ űţűţűţűţűţűţűţűţűůâţűţűţűţűřÝţűţűţűţűřÝţűţűţűţű˙ěţĺ(!%)-13#3#3!3!##!#3#3#3#3#3#3#žžžžžޟޟ ţ#ŸŸŸ|  ţŸŸţŸŸ|  ţŸŸţmÖÖţű÷ŘţűţűśţűýýŽţűý˙˙˙ě#ĺ( /#˙˙Eţä( =Z˙ěţh!|ţűě˙˙iţĺ D}˙˙˙ěh( D˙˙˙ěţĺ(& D& E F˙˙˙ěţĺ(& E F˙˙˙ěţĺ(& D& F K˙˙˙ěţĺ(& E& F K˙˙iĺ( D}˙˙˙ěţĺ(& D K˙˙˙ěţĺ(& D& E K˙ąËw!ĹNÄű<˙ąËw7!!!xáürĹ$ŕűŽÄű<˙ąËw 3!254#!") ) xäääýçärVVţŞýçţŞääääýčVţŞýčţŞ˙˙˙ąËw& X O˙ąËw !%!5!5!5!5!5!5!5!5!5!Ĺű­áüáüáüáüáüNÄűž ŸŸ?ţÁŸŸ ž:ý´“II“L“IIüŘ޸[[¸ý"¸[[˙ąËw !!!!!!Ĺű­ˇţIŕţIý×NÄű<š¸ü ŕýÖ˙ąËw !%!!5!!!Ĺű­ˇţI)ˇü NÄű"Ż-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8Ç)kOkaKA-'–= //G)‰ŞÝ,YţŚ=  !H$ /+ţHDH)á+) $., f›ŸYY˙úxŤ !=Z…ąÜ Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO€~ )š*+'ţë)+(@&'$Ę|÷ŻŽř|e‹?/A}]\ŠB-7“„1SLoWŽţäţjţă\vLLr%%,* #$ )*n$ % +) $ #*+ý    ? ů'+&ţ´()&ű(+&p   üň% % +) $ $*+„*EC*Z*,)-)-*,ţ%&%&žf“‘ĐБ“fU 5HhfeefhH2Ůpu^čQFsĽŁć棼sKQčGţ4 4  22044 22 9     ű  ýL%('*Ţ%)(*%)(*t     ţ144 22 0´r!2CTev‡˜ŠşËÜíţ+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.ÄN 0d&K4iš    }    g    s            &        ‘    ţ    Ě    Ů    Á    ĆHƒ5-V"*2Ľţąîíţąš™űż-­.ŠřţüřŠ”T<:U'EGE'Dîţ˛Nî•””ţí–ÖţÓ-ֈö……öˆU]˙ţ˙\`CD‹cbF]WöřWąZA@ZZ@AZZA@[[@AZKPrq  qrPGe†Ţޝ†dMPä  äP }ŸŮ2ţÎٛ˙ţżk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqOý.N97OO79N'ţŤ÷őţŤ]E‹ac‹DC_\˙n˙\U>D‹bcŠEXFDbbDEaaEEaaEDaaţ+čţšG詄UňŤŤňUSjŽŠë늏i LVňŤŤňV‚6›Ę "32654&7#"32?ÉɏŽÉÇž˜ţÎŮ×ţÎ/Ú`TšcȐŽÉɎČ;™ţPţĎ1°2ÓY.ŁË1"264&"3264#"54327&5432#"'&'@Kjj–jiO—iiLKiý÷ĄrqĄ rtPŠŸss ĄrqQÜŠđŠŠđŠZŠđŠŠđýäTdľţ˙ľˇ€‰IUˇţ˙ˇľţ˙ ˙˙˝Č)5AMYdp{†‘Šľ3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<‡Ž;Ö.=+ý˛,>/Ö;އťKyüz~LZ|WX{{XX{IE11EE11ET    m   â  ţů  ;  ţÉ R   ţ˙  Ę  ȇ‹…s@dd@s…‹‡}ţ˝>}=/Nęţn’ęN/=}>ţ@‰ŔŔ‰ˆÁÁ‡MllMNkkśýéë& % ţI% % "!$#  "! "Č!!ţÖ & %ą % & ÉÉ%-5AMYdp|ˆ”ŚŔÚ5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7ÔliilŒYz{XW|{‰bEEbEd‘  š  ţě  8  ţÁ  @  ń  Í  .HxtüŹtxH¸%?%5ČE$„…6  6…„$DÉ5%?%-5!!Ž1(§˙˙§~(1Ż 5,4t4(4Äţ˛NÄ4(4t4;ź„…ťť…„źh–hh–ŕ%%ţ#%%Ř $ %ţ_ $ $ř!"­!$!/!!Š!"ţż $ $‹ $ %ę:-,GŮţŒtŮG,-:ş XL†Ź˘RqqR˘Ź†LX ![$n“€[ii[€“n$[!ob !!'!téüKZüůGü•kc˙ýn "!!'!##&+572367676hű˙Nn_5ć, S Grj3#-EmDűďJü‚~o.(ţÉă*!ś4\tR~ƒU…LÚ !!'!  ##' Š˝üCI3ýZ  >ţô <ţňţő< ţôŮü5ËDü˝CXţő <ţóţň< ţ÷; ÉYD36273 ##'5&< +ZţŔ@\ţÁţż\DţźCýě űZýäýčYýë\˙üľ5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)ŁA({@(­@){A)ÎA(@A(ţ^)4Ä 'iOj_J@,&“< /‰/F(†¨Ú0‘'ů&Ÿ‘&‚'ܐ'J&¤‘(lNţŇ5  >! )&ţV?<?$Ľ&$ '& Z‡‹N Nƒ‚ />Eqw†!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53° *üě, Ç 3)="(&)09$) L&TţE` MPÎřAý[M˛H üY ţŽ ţß$ ;—&&e=O%/ ýN˙ý ,8(.7L1Rţŕťf~H8SQ,zH%9D6 )jGP@ö4€Rjdډ_*KfsűDŽIR 9! O  î-]‘&C+Ő/3#"'43727&'#"$472776725676&5&űU8†Ă)$ tJ .; Çd3f˙ţ,"3' VD (ă™ GL/7;;,g št^F$Ý< ŽLD&?>ÄX4RČ !/# I ?„‰ P?D!)Mţćv>“/˘z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2hýô!.)g$'‰Ä30ýš!/&j ! /:(/  )/ 9)/  9)0:*/˘z2463!2!2#!!+32#3#i9/ ! j&/!ýš03ĉ'$g).!*:0)9  /)9 /)  /(:Ă!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'ţá+ýpCCo ţŕCC˙´CCŽ2CCKK<‹LLš˙KK%ý“JJ”60"2=2).=<==<@=:>=;TT USUT UT83$ýQŒEĘ!D72654'6#"'4#"'54#"'54#"'675674767#%Ş$4:JILLHOKHLKIhghgighgD>-ü˛sJ1 b6'SSý cRRţÄ ßSSŽ?SS\\KŹ\\ä;\\ţ–ý]]üÔ!AţŠ*>K›Ă!!D!254+'3254+'!254#!'!254!&#!"0!463!!2#!!#!3#3lCC2ŽCC´˙CCţŕ oCCýp+ţá'qýŞ=2"06”JJý“%KK˙šLL‹:=@<==<=.)ýgŻ$38TU TUSU TTŒ˙ůEÂ!C32=732=7325732'654&#'%2&'&5&'5&'ŞIKLHKOHLLIJ:4$üëN->DghgighghłSS=ŽSSÝ ţĆSSb ýSS'6a!0J)K>*ţŠB üÔ\\üţ˜]]:ä]]ŤJ]] ˙ţĹżO€ˆŸŽľźÍÓÚŢâćęîňöúţ!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uéo,Mz"060D˝/˛5I:2'5:ƒ†6 &" *:D:­çS46$.e QÉNţđ5  u4MDa• 6ŞbUţţP+ ,H;`›I23ľÖN5(˝ý (#I0ˇMšÓ '^5%Ě#ŁĽ!:X+‘ "*  ţěŢă›6W}W:ţuW4 5vŽT ­& /Hţ3Vœ žœXD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[ŻťOţÂ`_A[-)$t7ˆ L-$ L6=˜" (CJ#ŤR"Ä0Š :‚~GB{~Eţoj<4S[żZa LC5 ) .U%+Z&)ƒţ͢ ›7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3Ś(-<((')))())( ˙űČÓ&2%2#"'&=477654'#"'5473ôt\*eýč OÉ@UýCƒXqů P ýS. P ӍMOŠbý >YŃaYĆŽ58Šl7P ĚP@ ÉĂ$0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7×\ţ˙žŹţËŐP—¸‡‡ôżg㑵žHţěô‰rŠ'.)%­sęMţ§éŞ MţŚ#Şfţ›C-7!%A.; ÂţӎŽţďÎw:ސŇk‹Kđžţ˙ˇqz† śü+H*ţÖG;M ę˛ ţÖtu/&((A÷A&:+C;."Ż/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&Ü07 ^< 1x,Bą5ţą@2 JVŤMv!#uA+UBDX[fš*;-10)..C,ˇsB#HKU‹ •P‚]12<0üŃVQ‰ Ä}%'Hˆ6-T}^€$k7 R—‡2'Ć7f!Aţ\;y?1!50BEt„"!zkQ;0šqu0\ˇo‚i:5oPĽýZjsXFaŔPJÂGl;4ejN˙˙ƒ^1F[q‹•šŸ¤ŠŽł¸˝ÂÇĚŃü7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'Hź ‚@‘ţ˘XO`= Ü Ą;*)8 kDţ˙v/P’k-J KDţ°hGaĘ DŠ`–ë÷gBD–ę 6ŚŹDDDţŸ ź=3dTDW, › :gň ţ•—j)YŠi#'WtI-9w18$^8;./7-ýI)jS)'#i\-IM91D;8%a7/.ŘD=uöRNBR&'%QBNRöqĎ d2 D s9ý8C ["ü|44&3, '2^3ŸR T(B?#'9C- !y ~#Z10>N?$%—Y4 )%FN? ({ Űusis< 3(&^T05<>7;,#4[:O(vAfG‡EtYB z^~4j #,;b:['~Av@~E‡Q‚ Bak4~_Şž˛H#˜T2 $$$$ 2T˜"`˙˙qŘ$&'6&'67327&#!65#&3ÖjjdnŻh ąąwž˜– WţŃV“Ÿ–˜žÝąąŽqZre¸óóÂ[cţ÷7ţ ľŽŽľô7 cy˙ţXÚ ,35'533#3!'#'5!5!5#53!5!5#!!üĘśŞ~~ ”ţbˆ°††ţl–v¤F ţôFţô A<<3ff˘XŻý苜…ţîꆛ‚q°X˘üĎťGccGap 3264&#!2+73 #'#5# 3mŤ`hh`ţÎ2ŠŽŽŠŤł´ţą`łÄˆŃłhţśľ|ţ;vŮvüźĘˇą˛śüÂţ“ţ}ÖÖääŠfĚ˙űÍ33#!!#'!'57!5#'5735 śŻŻ6ţĘśţĚ4ŽŽÍš”p˜ü†z˜p”š7šd+!#!573#'5!3!'573!#'73!#'5ÄIxŹOOţTxţˇ€ţSVV­€dYţ\yţˇvţVPPŞvIy¤Ył',32#' 37+ &5%6323'#57'53mŻŚ˝ţđĽJl{Ë~m@+ţÝźh4ˆú1Ľ…4Œ†4ˆ¨'0ţţžź>,_ ŠÍvŇNţkąnĽmmąnÉÁObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='Ü4&#68$$B )îZľś>&A†_;i88u-o1bFGfQ˘_ďĐM5mw€LÚbkj‡I,KňŔ=''8 0##Rm4 üÚš+ž¨ŻáÜ´5!PP"4\=Ńťœ¸ţčÇŽŠ"8QĽĂ˝Ž<˝WTÚŚ9[”°&Ź”BCŽ›(Ćg˙ůj[T_g2#27654'73&#"#'&'#"56='"'46'4#"4735#5&547/63654'%654i=Ku/3źnoƒ|s׉nI3n ';6WN`fI:% +KkŃsĹ:omźŰP˝|@R/%S <…[Er*JKNˇZEnv‘ś˘i˜íţ÷ţâ )‡%*6&Ű-ŠCl67jG‡V°"6;›%Ÿ 2֙p ç–+nEUťŻ_rBţ(†Ea€LtD:•j[~^9šŒÂ"22#'#"'#&'663327'#&'756=4'&+"6ŤžŠxdœq•…݉sŃĽ[šyŽW—źăeš6Ęo`Oa‰!Ľˆź°ys•`Mţk{eK[Žef â ‹™ OmŢY<0}ś  !432#"767 654'YôőYţ§őôţ§x_Pšţ툋—KĄ†ţŮ\YţěŚQőZţŚőôţŠWô´_‹bţíýńŒĺţYţäXÁÄţĄĂş(432654#">32#"&546324&"26%#"5432ižtvĄţłäęţǏxsŸq1"00" 0ýÍ/B//B/#ţ úúţŸaúú`ir›Ś|ŕHţÇúА›!//!"00""00"!/0 úţĄ_úúbţž ’Ě9>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'ę&$h%$%%34$&ţ1++XSA N@`˜==Žk>P CRX++XYC P>kŽ==l?L ?Q‹ oL+ NnţůŸ;PÖ?ýüÔ; @ ţË nMţӏNnä3%%%%34%&&%s==`?J >PW,,WW? K?_==‰f?H?PW,,WU?H?^‘ęŇ<…›=ţĄ…Ke+cLţŤ mCž†P`kŐ<—<!¤°4(0847632#"'&7327654#"&#%#&7&'67&'67!ŤŤńóŤŞŞŤóńŤŤv‰ˆŔÁ‰‰ţîÁŔˆ‰Ó¤=6 5N'V[Sţ.U[RęóŤŹŹŤóńŤŞŞŤńż‰ŠŠ‰żĂˆˆţŢ ĚţőĘŻX[V[X[V[!¤°4(0847632#"'&7327654#"73$3&'67&'67!ŤŤńóŤŞŞŤóńŤŤv‰ˆŔÁ‰‰ţîÁŔˆ‰ŃŚ=6ţóţý3QNV[Sţ.U[RęóŤŹŹŤóńŤŞŞŤńż‰ŠŠ‰żĂˆˆţw Ěţđ Ę'X[V[X[V[!¤°4!)47632#"'&%#$''&'6%&'6!ŤŤńóŤŞŞŤóńŤŤ4>;D@KDzcngkţ?dnhkęóŤŹŹŤóńŤŞŞŤíţ˝Iř Ökpinipi !¤°4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==ź,Â/ýĽĹ0œ#ś¨H ™8&O”6ýă ţ÷|ţň7iY0Âţ6.Á/¤==e6a&i1r4ţîz0Ç1šĆ2œ+ްK“Nƒ2HŒQÖ>>>>Űf^2Ć"/Ć1]ţîÓ8`1"Y 4f2yœ5Ć+ +"'5$76%&'547327676=&#;… hţz°­0/O{™ţˇ†[’(Âţ´*TœĺQţŤĄ›ĹţŞĂţ~ý`NŽÇŠÜO =ÂţţtäR–đ[\ 8d•<ß+% &56;2'5$%75#"3šţvţîhŒ˛˛0.Pţě~šNˆ^–(ţ8P,V čRZ¤žy­ĆˆcOąËţőţpáO >Ĺí‘čS–ő\^ ţÂţüf˝˙`Ť1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|f‡ĚĐzżż‹g}}"&&"}†UQn$mQU†}"ú$nQUVV{xVVUQ<"{łąu^Ĺ^żŔ\Ĺ _uął{"#|ą zUOOUz ą|#YOT{zQPPQz{TO‘˙›@>)4'&#"3276&5476327#'#53'&­`_„‡__ž‡„_`ýo‹ŠŠĹЊ‰q“ßä‡ŃŃ™k‡]^^]‡†˛YYÁĂň‰‰ˆĹÁhŮgŃÓfŮ‘˙›@> '"3276'&'7#5373'#"'&5476j‡__ž‡„_``_ČŃчäߓq‰ŠŠÂŊŠ‹qĽYXţňş]]XY†ÚfÓŇhÚhĂĈ‰‰ˆÄÁjšź0 '&'&376&+"'&5'476%7!˘Z{z[ZZ[~\Yƒśš‚ƒ‚˛˛WţŢm‚pţçN#ZX[ţ[YZ[öţP€€ˇśƒQmţ€p#ţďT˛ąG*ŠŽ52764'&#"#463233#!5čsPQPPtrQPŽô­ąyzg֏üLQQäQPPQrŽö{{ޟtú|gŽŽ*#Ž"#53533#632#47654&#"#dd¨¨i§qq„CB’igIIuŞŞţ“gzyąUŘr}ppDt PQsţ_C…ŽS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3íűűí|íú}}úíË! -/@ /- !^'?XY??~YX?(Fţ˜}R}ţ˜hţ˜h}ýŽ}hL……S<#5#535&'&'5'73'3#'73'676=35'73'13§|‡e{vw}wwUATwx|xxS@Wwx}vv|dˆšš|re{ąEus~~suE|VAKtrrtýś@X{Ius~~suI­{dr|×*úŽ! #!!!'!27674'&#߁_í82ţ˝Vý)‰3{D™#MŽĹHZűWýĎ{s{ţ?zK›8š! %#"#&5463 67!2#6#";Íz\)MaBuh __ itBaM(]yÍ ¤ţäŽtŒt¤ý[+##+Ľ¤tŒtŽý\ýó5˙řœÄ."264&'67>3"#"&54767&'&#52hqžžáŸrd:BJ|^€d#!p⥠âq $cƒ]7A;şŞńŠŠńŞ{26”ŽX˙Y "zŹŹňňŹŹz" YXŽ”62 śÎ&'5 %$ 56?6'.ˆ‹j‡‡ţéý–ţ拈|˝˝˝˝*xIIz'ü¨&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMmţŠ˙ţŐ}ĎÉ l¨yzŠU<ĘţMnnšnmę+}Ďţ7 l¨yzŠU<Ƀ|˛||˛ţ,&(uO#eœŠÂÂţíaHGŠ|˛||˛|Q'(sO#eœ‹Â‹‰`IH=˙ý”! <>'.463227#"&5454&#"&'&5476766&D„9‚BB8ÍĞ—Ŕ˙v?W:pbW~ütp„) "-ffÉ)-gtpQ@3ƒAA:ACjąÂ›ĽţGžmN?ijbŻŚŤv‘ˆr56WŔGe((Wi0154d)-?Ă/ţę˘6?2>32>32#&'567'6'#4&&#4'3>64&"Á-S‹5,9"\0+Fţôgv!4u|‡W")^,k ikdSňś!e˜b[Ÿ€¨š_[ąŃţÇőH”|NYCŚŽňŚ™ý:ÂöRޤýHB’’=†Gý`ţSż”nžUľ|ę#!!!53&54632!!5#67654&"U'űŮŒţtü0ˇ„„¸0ţZ =y­y= :…]†Zs˘ăă˘sZ†† Jjk••kjJ 2˙fŸĆ4%353'5#"'&''#&&#4'3>32>32YE;<ˆˆ<‡-!&Y*dx cf_Oz.*O„2)7âZe`Ž`b<`°ŁýíW¸ŻýušœAL™Ąh`Ј˛¤ýű8™Ç!5!1##'!5!Őţ_drŔrý•Pkţ^K{UýžÇŃýžĆý_WĄ{źĎ'/27632#"'#576&#"4'5267>327&'"2XCZŸd}uud$gqŠ~dV)40„tlx„!&%"dLk„ƒ}Îý:ľ›UwŒmƒąa4 ˆţsŞĐ—OśâĽHK{ü×w˘Y@xŽ A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YçR #{=('%{XNCEz>O&z>'(#ó&çR #{=O&{YNCEz>'(%{=('#ó&ˆŔee22eeŕ$Él66kd23dÉEPŔdd33ddŕ$Ęl76kd34eĘE^s#!5!37!!'ŇÓó‘ ţýţô‘óÔôţôţý ‘ôLţŘţç3—4ţčţŘ(ţĚţń—ţđţÍ(CŽ€ $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'ţ¨Dý} 5RT—P=: SSPSS ;r>>p  p>>r> !ţAččţŰ% )–RS—Q1 )6BB6) 1Q—SR–) ţŰp  ""V{zHNRh|Ľť&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"ŠI )),ˇ(?)(#!3()3Ž$))BGĹ!(( K{ýmgŠţęŒ,ý´;ąîh IXI ţîL$  ăP   H''1ţ|G''#ýÄs%'')ý‹7$ ''A ýěŠ ''HţžţTŹÝŹ9.Ą%~~ “ţrFýĂ)ýź~ý— wpa!'-23353#3!53573#'5#5335!75!!5'57!íň–ěePPeüeQQeč•DüpáHý>H@˛AýΈˆŽ~ƒţ‚}}…ü„~Žˆűœ00mrTTrýÇeppe-Ýţ!Ţ˙řóĹ7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 çüíŢ܍a…1%?E?%4śţ™,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB,ţĽ Çţn ?%#Najiţůý-/‚ö4^t&AęŤYcgbá3%' ţť+ ((NV8OQÄż>:<uyúg**œ5 kœ5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"Č+L)+L*+M)(LH     Äüă> |n @: !:;! 8An} E04¸`aˇ30ŘTL**LTM((Ę    ü ++xÜ: 8>>q ?9 9? q>>8 :Üx++c^UZbbZU^j˙üg% $TdhyŠ47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5ôdó4:;i865%ţÁýŤ1MNJ96 MMJMM 68JNM0ţv    +ţ0’Ç +/0U-,,Ź+,.T1/, ĆŹ9j9:h  h:9j9ţa××ţđ &ŒLMŒK- '2==2' -KŒMLŒ& ţđ1  ýŠŽŽ“V//X//X//V6›ĹHLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.Â*C,+%š#7+,7–%,+ FKŃ#++ P‚ýDý˛Ný˛AM**4ţd;K))$ý ›'**,ýdY&"**E ýĚŁ#**Lţˆţ:ĆĽ??ň@@”=Ĺ%)5!5!3353#3!53573#'5#5335!mýřDý€Íá‹Ű^JJ^üW^KK^׋ü˛˛LLüćZZ,}}ƒuzţ%yu„„u{Ř{uƒ}űë--âďÇ4@4767&'&'5676767&'&54>32!&7535#5##3Ş 1!!#?%?#!?% >$""/ áüőÜ_ŒŒ¨1+ 4:AA<="  !#=""=#!  "=![1”=%T e >6.HC'L"‹'G€ ţ×üá12Œh˜„[FHĺ¸`[$%okß+*8ţd .řNëýcčv[Ć.7&546767&'&546767&'&4>32 †w "E> #@!!?% =E!w‡ ./‚î@ =CDz" E>"">E "zDC= @î‚/.€…QO##"'##565'##"/547?kMąĂ …,4N"DąF &Fi™?šJO‰ăä/FB!‰Oś é{|ęImŹ<&–§=ˆ…ĂM2227632#&547636=4'&#"#4'&#"=ł` ]ÁŹdśţŽ2ţ c¤BźŤ†ŘU›;/ŮG;SœXMâB:ţŽ@B Ő˝ţ;7h’–­f%ţĐ ´ťţ#>…|Ž\ţ@ʏ’9‘…@O &&5 i×ţC ţn:Őţ^ĽŚţ¨Oýžýš G  ýŢýŰ%˝2…ŸO7236;2"'##'65##"'&5476;235&'&=476j°S c1=EĂOŹ ;ÇSCŤFRʝTĘ6*F@E1°;Oş+.`„1Ś62¨V âţćYiäŚ8/ŔD ;8[B ĽV†RP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F”(wQ"DąG".FWƒCŠďNfţęBy" bO–DUq5Ś˝u4  PšţˆroŹ@ ł ć|ďS`64 ¤Ż'<¤ţˇkn™,ł:y‰!‘Şěü@JD …ĆO2367632#&5476;§_#KYoŹhŤţMţ2ФEOÁL)…XY¸D<Îşýö6Šł­f%‘…@O &47iž9ţ) ţ2\OýçE ýŸ[ r1† V2`g26;2"'##'65##"'&5476;2&'5476&+"3276733276=4/#"567654'&#"35&5mŚV^2"ĚL ­<ĆTCŹFR˝UË7* 2Qą;Ƌ XaČ2p2@­^ DJ‚ŠF Đ,aXj™-!˜DŘ2VŠ9/mˆą.0­R ăţäZjć§9/ÂC \‘ §Vţ Ż7yMó5bomœ&#ˇ'p[?$–GĽüOQ.ŁĆ,H3#&'&'&6%3#&'&'&63#&'&'&6 $&54673 >4'&'~ vĽ …' Š w§ „( Š wŚ …' Š$ˆ›–ţďţŮţˆk=Fˆő ö‡F>jG3~Pjb¤‡^*IerŔNŔ{ ˜ů̑?qšŽJAŸeƒ}Ίv6\~ţx(ONPPNO(!8?ˆ|EE|ˆ?8!r!_Ş3#"/4?23Dš-!ČÇ]UŞűFš+}{<Ž˘!/Ş3#'654'&'#"547326RŁăs9×WÔ5ĺČ[SŞ%3;Bƒ‰[/OBC'ü*ž|<j˙_gĽ#"=4?2%#"=4?2ŮŒľ3ɧ%QMýűŽ?Ë )TKĽżű7’(›w7џü5’s ?|ŔO"'4723!#"5472!5˝ÖŔŔYAý>ÇÔÂRHIÂOűó°‡q 1 ýÓŤ‘g 4Ş€€D%Ž 3363'$6'"I+Ąˆ×ýÔ4‹ ˜pŽüuŕňţoS‚üţą^Łą* Ż 3%#'#3%#ś';&ţÂ2 ŻţI˜űŚʗHýźţ“‡j7*šŻ(,377#'#'547#5773%%ö,ppsr,ţđ'zzxz'ţđŻţá9…8ţ 4€?ţč„ţš/9†9e5ƒ>ř:ýšţœƒ_`˙ţqE#&#"'5654'5673;54'56732733273+&##&"#&'565*”ŸG1 VV2Iž“s3'{'3sžI1VV 0G s3'{'3s­P3+1='3s™ŸH1WW1HŸ™s3'=1+3PţˆŸH2WW2HŸ.˙đŁ ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5Î*)SR))ţľ&*&';((:'&)'ČśkkśČn\\[[nČś kk śČn[[\\n`ff/ee.((&(;((:(&((@))SüČS**˜n\][[oţ„ś jj ś|o[\\\nťˇ jj ˇe‹(ţ°P(‹ /˙ű˘N#.6CMhwŒ—ŚŻ!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K„ţ÷>Ž #WU*† ĺy "њšHV ýΡz/;@"żq=o ‰)we)$I­ýĹY'L‰ „ALaXw˜Hĺ ••ƒ>ăX%CÉII°$PţĚţC/DÎN6g+ĺ ř b%ď ƒ×#ţń ƒ – ćjŐnNË Đ :3ň ÔO+5{bQ¤< ,ëĺd- –Á ƒĺX˙]Ü ˆţ÷f '^ ƒ‚J‰JA!Ó< •8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676Ü}ˆ“]}ţžţ =-Ť-HW(ţŸ7*! >€yšš*1“cąý˝{F=.Ť,H-.'”d°(#Y+Gţ‹C†8957jNť})%%tGl5nm3(,H:ţÎ0/(_kiźN}!N˙920K †1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@ňţ‰.’#5*"I?6O"[m" cýĺ<,§+GU ţ¨5) đ<|w••)/a­ýËyD<,§+G,,&‘aŤ(!>B<#q'%NG91 Mč7835hLˇ{'$$qEh3kj2'+Gú8ţÖ/.&HghˇL{ Lú8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676öD|q%N24H'CB=9PS3464E>6O#]o<ýk <-Ş,GV$ţ¤6)"ţ=~x˜˜Ž*0’bŻýÄzE<.Š+G--&“b­)"í<+BI N $% $B G @6%6ţĄ7946iMš|($%sEi4mk3(,Gţ9ţŇ0.'SiišM{!Mý8//$­d "5H333##5!5&54?'7'7!!"'&%#'73676'77'7'&'676ŻŻ‡\\xţÝţč"@/ł.K[5ţ9+#9A…€ŸŸ—,3šgšýŁ€J@0ł.K00(›h¸+$wÄ,ţÔHmmIţŢ;<79oQă+&'yJp7sq5*/K <ţÁ22)…ooÄQƒ"Rţő;@2> “32EX!#2632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676ĘHćevyn$L27C'€y™™*1“cąýż{F=.Ş,H-.&•c°)"¸ERUHHS S /(*. ţČ8956jNť~(%%tGk5nm3(,H:ţĎ00'\jiťN}!N˙91/K† "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7ý<,§+GU ţ¨5) đ<|w••)/a­ýËyD<,§+G,,&‘aŤ(!Ű.T--T.ŔH D&RECSukf{ýÜ7835hLˇ{(#$qEi4lj2'+Gú8ţÖ/.&HhgˇLz Lú8*.- ¤X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676˛Ěnżţúţœ!?/ą.JY0ţ•8+"(@ƒ}žž”,2—fśýŹH?/Ż-J.0'™f´*#Ŕ&ţK”ţ:;68nPÁ*%'wIn7rp5).J<ţĆ21(vmmÁQ"Pţů;:1-¤K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/ą.JY0ţ•8+"(@ƒ}žž”,2—fśýŹH?/Ż-J.0'™f´*#ˆ:<68mPŔ*&&wHn7qp5 ).J;ţĆ11)wnlÁP‚!Pţř;;19˙˙˜9'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv ţ˙I” MO $Ép%„|I ^ ƒ—ý[€T—<KŤ"(–™~GŮW$?8?])Î( EA÷sÂ#ţŔĐL, ëTŘ 0ř ` +ţüWţűVۄţ˙`$$a.Ł|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-šJţÎ|‹ţˇ°@ń‘h'\-Öe@<ţšr2&H); čuZJM üÍ=9jl:j€gbƒ.Qńţi2QŔ|ţ酝ţśł:*}( ¸dpRˇ!h Üj Ä`]_ŠĚi$x:-(^%ą,3˝"¸Řż´Ea‡ HMP EŢ7šg /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1˛Mţă{ţÇŽG&€ţz v$ŹEţđxŠţݨEĹë(+=RĚ:n:D!sŤ Y!úgQKuý˘Ďm;} uA;>ő‚eţçá¸=gţń†žţÂŻCyĽ?°?ýÍţÔ˘B|“*¨>ţüw4I ™'ż 5@Â`  ţýŠbÇCˇ$Đ Í j$ÎHŰ?˛iĎM!%.Ł|7H27&' # &5%6367&#'.7&67263'#%; 65%&# ŒmJB|…e6´OţŢ}Ÿţ°I+o|BJn‹ţ›^jaygwaaygxaj^ýĺw‚$ŽFţěyţŘŞFGœ›”˘ţ퇢ţ˝ąD{§C´?ţ`”›œ’Í– “B]w‚‚w]B“ –JţĐĽC}–.Ť?ţřyP%.232#!7&!"4#".54767267Œ†pń ń … {u*đ‚ţ_ JšcllĆm8*#I…‘„%<($|ʀXţ¤#{NwŔtű7mĹnld4)ž5:I…IIB“,<•_4767632#"'&'&!%!!˙  ţ>Wü$`ü 4 ýńZűŚ|b<•_/374767632#"'&'&4767632#"'&'&!%!!  Ń  ýUWü$`ü H ô  ý ZűŚ|b<•_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!  č  é  ýUWü$`ü H     ý ZűŚ|b<•[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  Ń  ţ/  Ń  ýUWü$`ü   ţK   ô  ýZűŚ|b<•_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!  Ń  ţ/  Ń  é  ţ>Wü$`ü   ţL   ô  Č ýńZűŚ|b<˙ü•V/G_w“—4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!ç  ţ0    Ń  ţ/  Ń  ýUWü$`ü +    .  ţ    @  üăZűŚ|b.Łt )2 $$ >54.#"4>32#"&hš–ţđţŮţđ–™ţ˜…đđ…‰đ€ň‡š..--t“ţîţÖţň——*“ýƄđ„„đ„ƒó‚‚óœ2..2/.Ły )62 $$ >54.#"4>32#"&$2#".46hš–ţđţŮţđ–™ţ˜…đđ…‰đ€ň‡š..--ýć1.-.y“ţîţÖţň——*“ýƄđ„„đ„ƒó‚‚óœ2..2/¨/2..2/.Łt 2 $$2>4.#"hš–ţđţŮţ𖙲-..-t“ţîţÖţň——*“ýf/2..2/.˙öŁj '2 $$2>4.#"$32>4."hš–ţđţŮţ𖙲-..-ýq.-.1-j“ţîţÖţň——*“ýf/2..2/y2..2/R–7!!R-űӖR–7!!%!!RłţMzłţM––˙ţ;ť 67'&/#'3#67$#%‡€×ŻžŇP=Ű=Ͱ̟çţb’N+ť#đ!f"K++!|o5ý›<É?ţ1s^#'3#67$#śBěBÝ˝ÜËůţBTđ..#…x:ýkAŮDţ '˙˙Ş(''7'777'77'/'7%턌„!bƒŒ‚ě탍ƒa 2Öě~ăƒŔ€~ŔƒáÄ…b„Ž„ď… bPţćÜđÁ„ää„Á˛ÓR32>54.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7'ü :!9!"9 :!¸ ‰űF GůF;kY_ţĎ1278e56d:81)ţ×RLk<GúG E~^˙ : : ; ;űĺNG 5 e4G( Li) enf77fne )iýś (G4eţó5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$üą%8Đ8EFu/- 6uNDL2ˇś2LENu/80uFD8ŃţjćçţU˝ţ4ţ5żďB%y…\AęĚ@Y„y$F 0=/0 Ÿä,-X7ˆ0 ;~*2 %ÚÚ% 2*~69ˆ7X-,äăoýěoţ ýň ýôţó+F9d1 ) đ( 1d9C1ź˙ýě*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32”D$ú "śž@FĆţčŞ,ţîźÂNNNţvÔF8p^Lb2 ňţ– ţŘN**ľ+ ű”B@0"AR/0?wAˇ%od/D&3.YaQ/5#3$"ţ´ţuАI' @3/uŠ= =#n- .... žw3% % 32+#".7!"&'&'#&=4;73737€ĎĎĎţDĎĎĎŻ *‘Ď$#‚GFHĚýúÍH‚%#Ι+Ą(&˝aa˝'Ämý“99mý“9ů ý•3.055_4iý—4_550.3k  #ttňňtťk"632&'.'#####֊v)%—8 _^¨>:k{•ZʞG_?×gÖ@`H,>|:=+,j,,<†6O/2Ů33ţţ<bţžbţžÄJ˙ý‡ 132>4.#"367#&7&$735&'.4>2Ď,P*+P,.N+)P¤…Ć—ţd"/%(ţMMŽŘ~95DLM‰‘‹NMD2)WN,,NWP**ţgˆ¨!ʇ„w֜s~ × ‡&ˆ—ŠJJŠ—ˆ&łÓ?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:ÚţŮŃŃ'ŃŕNmNNmÓ€ U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T €˙ŇţŮĐĐ'\nMMnM* §? !&+05:?DP‘3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761´a$O` "NiB*4l,4"U47),3(üŕ$aM#"aT*BF 4,=44#Y3,)ý0BB0/CBO"!-$F$FJßF1.#- -#-2MßJF$G# 8<g7*!2U6J%n=_CBnT‡> rYw0d "*7]6U$u=n;wBLz >‡\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$ý;QWš$.AŽP-{ "R Ç&.FRŠ–žŚ˛şÂĘÖ2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&hˇ@9h),)RP| ˆ |PR-*g:>/**Y&()((')&&)')(()% @9f+.TRţ"`33`Š\_ .np, ˇŒ00441/‹¸ ,pn, ]]Â&&()&&EEEJ03ţŮ2WyQT.,d9@.**..12Ž30IDE%&**%&Fڰ+.SEFE.IMMI."#FES.ˆ !  ";-0.--.0ŮIM+.REF$$‘œœ‘1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>ƒGIIGƒ"" 7447#.$$FER/+L"  !Ž75/57%"€IJJI€*˙ţ§ )p~Œ67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>š"0'-, )*˙#'0Ł5%"˙*%%, ),,"čGNY ”I'+""$(J“ĄYNO21, 9,4=SM:7,: -12-[Ľ[ZĽ[]ŚWXŚţI‹OM‹KL‹MNŒ2Ž“ Y{•\ błCWDJgABcp7L^BML0”b \•u]! “@R%KlhhO+wŐŐw+O hhlK$PZŔX'@D 0:)ww*;0 EA&XŔZw´Ľ[[Ľ´§[[GJŒ˜ŠMMŠ˜ŒJ"Ż( %3!'#!52#"62#".54>o:ű5ţ(ˇţ67%'$(űánüŞ HŠ0ţLş*ýçˆI"33'554#$/* ýÜPRüĆ 6hţÁ"ţ&>I >ýŞ >A>óßŘ!!Žuźźţ‹ťŘţ‰űŸaŢóÁ!&5476'#5!+ČÁţ{ŔČh_aö6‘ýřŽ6mHHm.rŁóZy™'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M9Ł8G ţ)•ý:       Ö        r‘         0   L:5’U    ç    .\Ł rŒ26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&Ź#  #  @Ň!R<ĽţíOq< ; 3@M JC3 ; 763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ“Í E7Ÿţń9E"  21 +96  >B+  # zOţo       ´       ˛Ž49D   /    "    :     ţ      =J”Zx–´Ňţ-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=đ›?^'ţĄ_)\?›đ=a! !# "!.8?ż""  "  "  "   f  2 .?E ‚SĄ@6•üf G=. 2  ŕ6@ţˆ•˜  B   )_>9 Ž9>_)  % ωţI    †    ? *        ş…Ş ;d.      ?P   !-  ţ@( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  ţZ0-  Yi D   cp-)L &gK1 [šN3$ n/ "!0{Iö"H#fmt2>•,7HBI.;/8[,  Q[z)  .)ŃS9L *E   '+(4%(4  *X >  7A)Ż ‚–0'-570+I;-% *ţ§#%(0  ]'5.  U-•¤ü9Lp{‰7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547&Š t!M#l5G;@ź\ 2BX-0%-m * ‡‘ 'Ą?,ąNýŤď ?¨'!Ÿ&­R;-> <\-R5-6E!"$b$6$!q",ý˘; t@P"ű#C ß  *FSŔ "ĽDX@! %z$(œ`]”jMŚP   Ś&O/+@ü p_u<  3  DMKZRdYL6D•_YŤBI‹5.!!''kGW„zŚ")3SZ67654/##3276?7%754'654'36767632#"'&54767632'ň0,,;Ŕ ý(| w| kוýäýűiŤ5ţ.U,ţ\\¤ ýę    %gŇ .  Á;,-0j{w {w3ýűýä–ŘţV. ŇýT, Ľ\ţ[^     Ć ţ-5&ŕŤÄ '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'•$$•üćCCC||]ŞţVýŁ|ęěýâV#ţĺýu    Ž9ĘZ(f(Y<™PP™PŽňńŽŐáPr+  VHWťzÝ")3SZ&'&#"227654'&''/%'654.#"65&'&'&547632#"'&'&76#"ň Ŕ;,,0ýw |w ˆĄ•ýú Ň5, ţ\\¤ýŁ     Š. ţ.V0-,:Á ýŁ w{ w­ Ř•ýĺýúŔhÓ .o,ţ[\Ľ ýč     ÜŞ6ţ.;+–]#C4'%%.'&"27>7%$66%"'&'&'&47676762%'b&ŕ˘×ţI    ˇţ)ţ^ŕtƒœNţń/  /ţ˛ţdƒÉ÷IWŇ?    @ŃVůiDV /  V%Ź&%$64'%%&'&'&"27676čÄţţ@Ë))ËŔüţ< "  " ÷â]N¸O]â    ˜Ŕ9|23277632#"'&'&5476"# őŇ6vţŽţŕ>? (-=%P8jŠó?  #ţjţ<  y†"$"Jr‡B23277632#"'&'&5476"" öŃYTo ýÍk%…,02?=VŽ8ji™Aý{ĂC {œu+'qP?  ' 7 ŰssţţssţsstsXţŒrsţrtssţsr@źQĎ  ' 7 5íţäţĺíţäííĹţĺíţĺííţĺíƒ˙ěNžB2632#"'&'#"'&547677&'&54763267632676É   ПBt  ahŒ´>) Śšc!  ,HsŚž *ˇÜĄÂ   }ŠśţĐ,"2A "Řě  ‰{•Ś3˙ýž+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  Ó΂    NjÉM  rŹkW* & \„ĘÚ *3 #Ŕţﳎ*3 T§ĺv! ( šşĽę5+" ,ŤŁçż @‘V #!!!!!%!!!!!!!!#!5!3 ţťţĹ;E;˙JţśţEţśJť”Jţś“ţśJ“Đ<ţÄţťţĹ;E;ţEţśJťKţ!”ţˇI”KV{ !!!!!!÷„ţ|ţăţ|„ţîţ‹uv9˜f !!#!5!335#ÂÖţ*´ţ+Ő´ł˛˛´ţ*Ö´Öýw˛0Ąr!!%!!!!!!Ń/ţŃ0 ţ`ţĎţ` 1Ą/ţĎţ` 1 ›) !!#!5!3Ë^ţ˘Ňţ˘^ŇŔŇýęŇ^~S3!!'#'!!#!!3!5Lƒƒţúţꃃ„DƒŻÁţúÁƒţźýłƒʃD„ÚţúÁýłMÁA #5!#3!3'3#!#35!3###5353ţĹőő;őŻőőţ9őőnjőőŻőőŻăăţËýÝ#5AţIýÝ#ˇäţšłýÝ#łä0ĄvQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>Sü•S>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% ˘>#"? ?"#> ˘   G  ˘ >#"? ?"#>˘  G  ů   F  ˘>##> >##> ˘  F   Ą ?#"> >"#?Ą˙íˇŠ›4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)˙ĺşˆ0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h â         á   -  ( á        á   ‡     ŕ '    *  á        ŕ   .    ŕ     +˙çŚj276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%˙ćŹt?247676763"'&'&'&5!276767653"4'&'&'&đLEA86:4DDMMDD4:68AEţętjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(˙đŠ8 %%! !)tËĚtőţ›ţœJ‡ţHcˆdeˆcţH•]Fţş]ţŮţ‚~Ęţ]ţýţ^ţý˘C˙ćŽ5 )!%%!2#"'&'&'&54767676hzţt@z@Az@ţt{ne_RP)((&SNcdome_RP)((&SMdd0ţ‡éţˆééxé}*(QObbrle]TP)**(QObbooe]TN+*(˙ćŠ.'"276767654'&'&'! !˜_)(""""()_)(""""(Yˆ¸ţˆţ›ţœˆţ¸¸$(*/.*(#  #(*./*($‡ţ]ţýţ^ţý˘#˙éŽ< '1%%2"'&'&'&5476767! !#xÍÎxřţ˜ţ™a)(#""#()a)(#""#(Y‰ţDg‰gh‰gţD•^Iţˇ^ţÖţW $(*0.+($  $(+.0*($ ‹ţYţűţZţűŚ(˙đŠ8 3'7'3!%%!! !hEŰąC˛ąCąŰDeţľ g  g ţľfˆ¸ţˆţ›ţœˆţ¸ ҁсŃiţĆÂţĆĂĂ:ÂŃţ]ţýţ^ţý˘=˙ü” 3'7'3!%%!7!7'7!hTDEDDTƒ¨ţރţ¨ţЃţި‚N˙ĎPĎĐPĎ˙IQ2P11P2#ţmůţmůů“ůŹó–ó––ó–(˙öŠ? -5%7'%!! !] ţP ¤ gĽąţľfeeˆ¸ţˆţ›ţœˆţ¸r­ŒÂ6ţ‘96ŒŒĆţÌ]ţ^ţýţ^ţý˘.Ł /'%!!%!77!˘ţÄyrëţâryţĈyqm"ţ_ţĐö^÷ö^öţĐlçţŒ%ŤĐ%tću%ţ°ýţß´ţßłł!´6˙ţ›‚3% %#'-7í÷:|ţĆ:|ţĆ÷ţĆ|9ţÇ|kţ”śÖľśÖľţ•kľÖśľÖW˙˙z`37'%7% %#'ZZ´ZZţňţŁZ]´^Zţ˘^Zţ˘´ţŁZ˛››ĘœË”ţm˜Ę˜Ęţm“Ęœ0˙ýĄo #'!5!73!ĹP6ţ°Mţ°6Pţ$ÝţŻ6PMP6ţŻÝţŻ6Rţ#ÜţŻ6QLR6ţŻÜţ$Q6ţŽL$˙đ­z     - h<_ţőľţK ţĄ<;ţĄ ţL´ţö_zţK ţĄ<;ţ  ţJśţô`;<_ţő ˙顆 '!'/7'?!7% % -ĄŢ[şßŰ9^Ű[[ţČŢZţGßÚţČ^ÚZZz'}*ţÖ}ţŮzyţŮ}ţÖ*}'q^Ü\\ţČŢZţGßÚţČ^ÚZZ:Ţ\ťßÜOţÖ}ţŘzyţŮ}ţÖ*}'yz(}2˙äŸ % %  h_Řţ‡yţ(_^ţ(zţ†Ř˙ţŁţšţşŁţëŁFGŁ˙ŕ˛s% % -hVHĎzţ†Ďţ¸VUţ¸Ďţ†zĎHrţ†Ďţ¸VUţ¸Ďţ…{ĎHUVHĎ˙ꡆ% % -h‚hţëhţႁţáhţëh†ţëhţႂţáhţëh‚‚h$˙Ý­h7% %' 7-'hXË5 ´ţ˙´ţö5ËXVĚ6ţőł˙ł 6Ěgţ˙łţö5ËVWĚ6ţöłţ˙ł 6ĚWVË5 ł0Ąt/37%!!%'#''7'%!5!%7'77;[‚TďAđ:#ţĹTţŻ8#ţĆđAî€T‚[‚TďAđţĆ#9ţŽTţĹ#8îAî€T TţŽ8#ţÇđAđ‚Tƒ[Uƒń@îţČ#7ţŻSţÇ#9ď@ďU[ƒTďAď8#1˙đ čŸ54'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X ř ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W ˇ    > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW“,f ',;[;;+*Q„--}KOW*AA*WSGu5-ˆU&+;;[;,)  '+;[<>**Q…--}KNW+@@-USFu5-‡S(+;>Y;+* !˙ĺ°˝™ąÉ67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+ţÓ:6-21 4 $:<;$ 4 22-6 O;(A7##7A(;ţ÷ !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $­i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632 o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& ť†nŠŁżŘô%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 ˛!_  ş, 9 R%5Âs  _!Č#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#ŽL% %Lýě %#M L:2(&6  ű_ M#% č  6&(2: ˙íť”-[Ő3b‘ŻÝ &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762‹Ż    Żž(  b›  (›Ź      üÍ #!"G"!# * " ' ## G!""  '  Y m  Š   ( y ‹  ( O k  w Š  m Q (  ţO (  ‹ ˆ   ? ?   + / L* / *   +. M+ .*  Ý !!!! '? ?' "#& #'"!!  '? ?'  !"!  $& ţŒ ‹  m P   ĺ O   ‹ ˆ    ţ“ m  ‹ Ž   y ‹   O k  Ł   ţ“Ż    Żž bš šŹ      %˙ߏj<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-–[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuţßzţŢ"z!uv!z"ţŢzţß#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,ţŢzţßvvţŕzţŢ"z vv!z2˙íŸ9“œ§˛ÁĐ"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-‰+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CˆC,4F:6(A6.Y# K9I R*€"(-62 #9ţ~ţÉ3 #9;ţÉ 01+5€6 00,5`%;G,AţŢ $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#Öţ~&41%%14>3t-3>41%%14>3f^CC^Býß%@ţŰş#@ţÝăţŰ@%ýĆţÝ@#ä-4>41%%14>4ţŒ-3>41%%14>3Ń+  V  ++  V  !˙ă°r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeţăBääAăýťäBă†ăAä#U##U##U##U#ýÇV%**%V&**KV&**&V%**~ŽffŽeýßăAă†ăAă$ăAăýüăAă„V%**%V&**üľV&**&V%**Ě#U##U##U##U# ˙꺍 &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3šţÁ?ű_?ţÁôü6Ć üĎü6Ć  Ć6ü] Ć6üţ'?&M&ŠC_CC_?&M&< 'L&&L'Ă!Ć6üü˘ Ć6ü^ü6Ć!üĎü6Ć ŢţÂ>ýő_CC_Dý<>ţÂ"˙éŻl267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;Ö'&1'ţŰh 9##8ţ)'1!, Ň;#A#;Ň '&1')ţ8##9 hţŰ'12Ö;# 4ţľ%.&! Â6 = 6Ä%".% ţľ3 3 Gţó%.5Ä6 = 6 %".ţđG 4 $˙ő­8 ! 54."#"54$32632#"_”‚éöé‚ ŕţŔ“‡Š’ţŔâÉţăɀč~~čýa>⍍ţűâţÂE˙ÁŒ  %!#!3!üp EEűţ?üp9Eű˙=”V %!%!35!üc×űđE:œüd FFűđ8˙¸™ %!!!ü[:Fűü:¤ü\;[űü0Ąq %!!7!üNíű×]<˛üN;)Gűí+˙úŚt  ,ţüoţýýÄţüţüţü9ţýţüţţţű;ţűţýţ’ţüţü˙ śœ#ś›œůqÍ˙ ™!ţË™ůrŽQţË€k!ýÓků` ÝĎôŮ!733ôţé}b>vĎóóÓÄţÇ!#7#Ô)…iC~Ćţîďď˙˙ĎŃŮ' “Ý “˙#˙˙öÄŰÇ' ”Ý ”˙#g˙]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#š     42;%-ú´n`ÔŽúrrŁ#26A@:V7:$)&7.Y›q   % $.277g[•š˝Ł(Ëdü˘VDQ49%*,04?()-#úćţ˙˙ŮŇÉ52&'&547676762"'&'&'&5476767h‚c"$n‘jlŽn(Lfe*+$$$$+*e*+$%%$+É! #'(*dRj¨¨jSc*('!üů"%*,20,+%""%+,02,*%"ž˙ăÓ%C&'&547676762476767622"'&'&'&5476767hcŘn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,ŸƒDj*('(&,,&('(*kCƒ˙"&*,11,*%##%*,11,*&".iŁ%%&%&54767676247676762hhţÔ*(42u24)(()42u24(*”ţĂiÂĹ\=97,*+*96@@69*+*,79=’ZĹr˙ű_'#"'&'&'&547676763"'&'&'&5476767632_ŃÓdœA=;0-/.=:DD:=./-0;=AžbÓŠxţ”Ş1.=8DC9() 1F="%".4"tNa5Œ&$4! /.r<@6B2L˛_0>Q#kI|…Î"rz7&‹)?),%=^K=.C26F@13.!9+cM313 ĆN676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26šţŃ`', =NR6#!vWR>4 2:O t51"".1&X°.RO A5ȏ˝ )T/1ţĽÎ86,FAS :#(=‹:tA0 9SD 'A#5ţ×}11BO9đ˙›á‚ "'&'&'&547676763"3ᗊƒpm8884ql‡Š—YTN‡! !C@RP]e:6pl‡†˜™‰€tm9:'62Ő~•~jf77đ˙›á‚"05276767654'.'4đ]PR@C! !‡NTY—Їlq4888mpƒŠe'67fj~•~Ő27&:9mtŠ™˜…ˆlo7:f˙‡kR !&547jljjlţďyyxzQťţ“ţ‰ţşżqśľpżn˙‡c$0!!676n wu;;vţ÷i43f$şţœ°°łłšľ˛˛lcC˙}ŽU# 3ŐţŒtŐţŠ‚ëěýD˙}U 3 DuţŒÔtţŒ‚ëěýýŇ˙V˙.! !ţţśţáJţŠëěýŇ˙V˙. ! ÓęţJáţŠëěýýÍ˙AŃ! !ţmţ^˘“ţ\žGHü¸Î˙BŇ ! ÎŁţ^’˘ţ^žHHü¸ü¸Éţĺv!'7DÄWččWÄĂWçÂçWĂÉţë|'7'7ÄWččWÄbĂWçű>çWĂţ¸¸^$#"&=4&+5326=46;#"3¸—˛xMe,,fLx˛—1d=AOOA=dƂ…Ç׈i€h†ŘDށOߍ€€ŒßOůţ°Ři(326=467&'&=4&+532;#"+ú5nCFVU$#Cn5ĽÂBB*)p//oTBBÂĽĚP€âށAAáP‚DBÉۇ45‚iŠŮÉDCS/~ĺ #!5!3}ţĽăýńţúăŠţĽŞt’]} 7%ýd”^ş=ý¤Š]•ýdý¤>S˘~5 /ý%Ű0~ţ‚¨#Ş#ţÉţÉtÁ]Ť '-fý˘”œţń\=]ýd•]ş>ý¤-Ą¤á!'7!.€ Řţ(ţ÷€ýěďňŔ``ŔňI)ˆ=2"&'&'&5476?!".'&47>3!'&'&54767>2ˆ ţÔ '!  ‹ý`!! ‹  !' ,Ć& ţÔ   Œ&‹   ţÔSś~&!5! Fýň7ţÉŇ8ţÉţÉ-x¤!5!5 VüŘ(Mţłr¨úţ˛ţ˛6u› #3#3#3!!5 é´´đZZ–--ďţÓ-Iţˇ(,ţÔ,ţÔ,ţÔ,˛ţ¸ţˇSœ~  55!#3#3#3Fƒ´´ƒţă9ŤŤäUUŽ**ŠbÚ]^ÚbŤţUŤţUŤţUŤS„~ô!!5 Fýň7ţÉ.ŠţÉţÉ`tq!%  ¨ýqţŽűďĆËËRţŽţŽ{¤V$%! ŔSţţŔŰü%äÁÁ@ţŔţŔ{V˝ tůŰü%îÎţ2ţ26Œ›=3!5 5!"'&'&'&6  $hIţˇý˜$  Őh$  •ţˇţˇ•  6‹›<47676763!5 5!"6  $hIţˇý˜$  ó$  •ţˇţˇ•  $O‚ŕ!! eţëţä ţţ6n›55!âlMţłlýT‰wćccćw¤ekl!5!!53 ' !_ţú˛[ţĽy"ţŢţkŠdŠţĽţĽâŠ""Šňe/lĺ5!!53 ' !_ţú˛[ţĽ"ţŢţ/ŠdŠţĽţĽâŠ""Šň5ˇœü !73#57!%!6ÍUcG™ýůjýýśbĘzbýŞŒďdŠţ“ţ¸ŽÇŠ""ŠňaÖpŤ 5!'53#'!!!7%aÜcߎA[ýŘÄý؁(ZqţZ{{ţä{ţĒҒűű}ŰTM %'!'!53 !“;ţqKĘRnKţ’a2ţÎţ6Űw–îwţ’–ţ’Iw22wţŠT‚}> 3#5!7!!! –ZŒQţtZţQ°0ţđLţ´>ţs˘ţsŁäţjLK2NŸu '!53#'5!'7! !Łp…Sn%ţ’R&ý %ľUa2ţÎýŸ÷wţ’Kţ’J,L÷ťw22w)ý¨1 '7!573#5!7! !œr&j&St&ţŒSýp¸Wl6ţĘý”qűM,LţŒLţŒyűžy77y‘˝@Ź!6767632#"'&'&'! ‘ 6IYZgb^UMI%&&"LF\Zfc^UM3!çtţŒ§:6I&&&#LHZZhc\UMH'&&#L2<tt€ XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*r€r+r€r+rV…€…{‹‹{ţę…ţ€°*q+*r*+r++r+ŤŤŤŤŤŤŤŤ9ÇÇƆ\]†ĆÇŤŤŤŤŤŤŤtš]˘ 7&#"7'7 #%5˛Ž#t…69Ď.ţwZćţŚY“96…t"Ď.*ţ¨X/ćţ§ĺSŃ~k 55!5!!7'!n‚‚n˙ţUގţVŽŽގşą†GG†ą8:ŽČu\j '327'' #3ƒŽ95…t"ŽĎ.ţÖYţ§/ćY濏"u„69Ď.ţxXćţ¨XNšƒî2%&#"6767&'&"67632&'&547676767‚}:"  s %*&*(&ţŒ"!#!ţ÷"O>>;Ž*‰§E/4767!"!47676763"'&'&'&5!3!&'&5ڌv ţ¸ ţ5 $ %% $ Ë H vgMME %!#"!% EMuŻ\—2&'&'&'&54767#"'&'276?&'&'32\": ö ţ¨#'$'$#Y@öI:86†—s…6::I ö ţ§#&'#'" X ÷ :5*œě+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$¸ŕŞ[ /  ýH =ýaö=   / ZŤţďI=X  q> d(*c Á    ÂXJn´°.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)„Fţş„-Y)) .EOÍÍO/3S>>S&/ #$))%#Ă]]Ă#%))$#&žŤŚe"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762ŤĂ ĺIţ ]]ňIĺ Ăš Ă  Q ’  šš  ’ Q  Ă%eŤńg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762Ťţť GKaýç u~iKG E˛ţÜ ˛Ă ęú  Ó˛ ţÜ2 Ÿ˛+#76767&'&/3#6767!5!!5!&'&'Ÿg?j7R=y66y=R6k?ţVO ýœńS+ +Sýd _8=ey‹u'&uŠtj<ţu,*44Gee‡eeG35*+7ţ˛š'*'$&'&#"'67667š h7ţHm^:-ˆ3ŐŢţ° REţ˛ SRŽőQO‰1ŘĚĄüLÜH7ţ˛š'57$'&54&#""7ER ţ°ŢŐ3ˆ-:^mţH7hţ˛H܏´ĄĚŘ1‰OQü ŽţŽS uţ#\u ! !hôţ ţ óţ˜Ńţ—iý/uűŰűÓ-1ýüކţňK 3 #‡Şţ窂üpüp†ţňK # 3JţçŞţ窂üpuţ#\u hôţ ţ uűŰűÓ-Xqy“33#####533ܨőő¨č¨ôô¨×źţDŞţDźţDźŞźţDXqy“333333#######5ʨ˘¨˘¨ss¨˘¨˘¨rןţDźţDźţDŞţDźţDźţDźŞ˙˙–Ž;T™˙ąËw7!!!xáürĹ$đýžÄű<˙ąËw!!!xáürĹđűŽÄű<˙ąËw7!!xáürĹ$ŕűŽÄű<˙ąËw%!!YürĹ$ŕűŽÄű<˙ąËw% hËţ5ýžbcýJĘĘţ6býžýž˙ąËw žĘýžbcýţ6”ţ6býžýž˙ąËw ! žĘËűÓbcýţ6Ębýžýž˙ąËw! ž•ţ5ýžbcýĘţ6býžýž ˙ąËw #)-17%#535#5#5#5##5'3#5#5#5#5#5##5##5###5ËÍZssssôޚ´đVČrrrrĹsZšŽš´šVr~ĚrZHŽŽNłłýrrrrZZrĚHŽŽNłłbČVrrrrrrVȏţLŃŐ'!2#.+;#"'&32654&# öĄ’N76SËٲM{cÁ,-ZšßĽZYËݑŽ—óŢҔť77§ţhyĄ]ýk~>>œjiý‰VţVyŐ ##! !+532765žţö™ţőşYZĽÍˇZ-,'üíúŮŐýřúĂijœ>>’%ŹŐ %!#3!3iŐţVOőţ7Ńn lѲüüRŐţ{…‰HŐ3!!#‰Ëôý ËŐýœŞý9Ă`#3!{¸¸Ÿýý`ţ9–L˙ç…h '"27654'&'2#"'&7673A\VMMG*ŠwÁˇÇ|~~hšA1LLNeˑýRh]ßÝc[„ţŮţ斘™›,„mŁKsžŘegŻ.˜˙ĺą!#5#"&'532654&+532ąš.żƒDv6;zIŹśMcŃÝłŞŰw"$ź.*Ř̐gQ™Ž¸‰˙ăH{"264   676326­†^\‡`ţsŇ÷öţ-öüýÇ!\…‡[Ŕ^ˆ[]…ţŇýĂţÓ-=ţâ°ţP@7'"]_$5˙˙ć˙ëhWýdœÉŕ3#3h݄ţí›ţí„űĺüźDÁ˙ĺÝŐ%36767#"'&5476?>5#5%ž Yb^`_hşon"!^XE&ĹË->B%DüS #Dź9``ĄLAB\VBT=;ţţúžŽ-;,,1Y7Ď:w!##Ϩđ¸ýľZ:#5!#J𨸅ý&ĎţňwĚ3!3‡đţX¸ÚZţňĚ!533ţXđ¸ţňK˙˙Ú÷đó,ĽX3#3,ŞŞńˆXˆű0Xú¨,ĽX3#3,ŞŞńˆ$ˆüdXú¨,ĽX3#3,ŞŞńˆđˆý˜Xú¨,ĽX3#3,ŞŞńˆźˆţĚXú¨,ĽX%3#3#,ŞŞńˆˆˆˆXú¨,ĽX3##3űŞŞţšˆˆXˆű0X,ĽX3##3űŞŞţšˆˆ$ˆüdX,ĽX3##3űŞŞţšˆˆđˆý˜X,ĽX3##3űŞŞţšˆˆźˆţĚX,ĽX%3#!#3űŞŞţšˆˆˆˆX,ĽX!#!!´ˆyţXˆ,ĽX!#3!!´ˆˆńţXţ̈,ĽX!#3!!´ˆˆńţXý˜ˆ,ĽX!#3!!´ˆˆńţXüdˆ,ĽX%!!3´ńý‡ˆˆˆXTœ|ä 3'#'L:öL’j”LäÝCƒýUŤƒCT˜|ŕ #'737†:řL”j’L˜ÝCƒŤýUƒC(œ¨ŕ 3#3#'(€€€ f*ŽDţ‘ČČ(œ¨ŕ #53#73¨€€€ fRŽüźoČČ˙˙(¨D ýd˙˙éĺ'ˆIJ !5!5!5!Jţ>Âţ>ÂI–––áĎŐ3#ËĄŐýqţ›eŞžŐˇˆÔě1ôÄ0#žŽŐýŐ+‰˙ăH %"32654&'6#"467.5463%!"hŒŒčřöęéö{1PAžüţ(źrßÚÖŐŰŰŐÖڜţŃţâţáţÓ-ĺŘ*/Ž1|”–‡I5#7N@* ś Œě›      JEEô<äě2ü<Äî2991/<ćěţîîî299903#'#"!#!##535463¸¸w´cM“¸ţ%¸ÉÉŠłéë™Qgeű˘Ńü/яN¸Ž#7B@# śŒ›   JE Eô<äěü<Äî991/<ćţîî29990#!"!!##5354637¸ţŐcM%ţ۸ÉÉŠłůě{Qgeü/яN¸Ž˙˙Eţ °& K E˙˙˙Eţ ĺ& ? Eü˙˙˙˙ěţ źX& R E ˙˙˙˙ěţ ĺX& S E ˙˙˙Eţ °& K D˝˙˙˙Eţ ĺ& ? Dx˙˙˙˙ěţ X& R DŒ˙˙˙˙ěţ ĺX& S DŒ˙˙˙Eţ °& K F“˙˙˙Eţ ĺ& ? Fr˙˙˙˙ěţ  X& R Fz˙˙˙˙ěţ ĺX& S F˜˙˙˙E˙ë°˝& K E7'˙˙E˙ěĺĂ& ? E-˙˙˙ěźx& R Eâ˙˙˙ěĺm& S E×˙˙E˙ë°& K F“„˙˙E˙ěĺ' F„ ?˙˙˙ěy& R Fă˙˙˙ěĺ|& S FŒć˙˙E˙ë°W& KńLýf˙˙E˙ěĺH'ń4ýW ?˙˙˙ě¸ő& RńKţ˙˙˙ěĺ& Sń]ţ˙˙˙ľ˙¤Œr& S >tâ˙˙˙j˙¤ĺ' >„v C˙˙˙ě?' >,~ @˙˙˙ěĺ' >–€ A˙˙˙ľ˙¤Œ~& S Fˆč˙˙˙j˙¤ĺ ' FŒt C˙˙˙ě?' F,x @˙˙˙ěĺ ' FšŠ A˙˙Xţ ­g& E{Ż˙˙Xţ ůg& ‰ E/}˙˙˙ěţ>\/' Ea˙8 Š˙˙˙ěţ>ü/' E ˙8 ‹˙˙Xţ ­g& =Š˙˙Xţ ůg& ‰ =&˙ç˙˙˙ě˙8\/' =ź˙8 Š˙˙˙ě˙8ü/' =˙8 ‹˙˙Xţ ­g& D*–˙˙Xţ ůg& ‰ DĹB˙˙˙ěţ\/' Dđ˙ Š˙˙˙ěţ>ü/' D˙8 ‹˙˙Xţ ­g& F2Ż˙˙Xţ ůg& ‰ FĹ^˙˙˙ěţ\/' Fü˙ Š˙˙˙ěţ>ü/' F˙8 ‹˙˙˙Ěţa7& >ĐŚ˙˙˙`ţ ĺD' >\´ •˙˙˙Ěţ›'ńUýŞ˙˙˙`ţ ĺ„'ńéý“ •˙˙ ˙§]A˙ƒ˙§2%#"'$4733267654'&54767;#"'&'ő0Q€cĎplţś?¸AËOL˘Ú64)ś>.VţhFd((&*=#>ś2(I=/ b Š\^ˆxHj<9"1B,f%TOAŽŃţÂ7.NýÂ?¸˙˙˙ě+ Â˙˙˙ěć Ă˙˙ ˙§cG&A GŹ˙˙˙ƒ˙§J' GT E˙˙˙ě+9' H F˙˙˙ěć9' Hœ G˙˙6ţľ° U˙Őţ ć &#"'&47332767654'3;#"'ČGŽŒŹ{ę5¸7Ą9T?:!e¸#"#V4^Wţ÷t<;?xŽŽŽŽ´C3§^w¸Ë3UT8@¸0­˙˙˙˝“ĺC˙˙ňĺ&6D%3!"''&5473327&'&5476&'5%67654'&#"%3276'&'&bţˆžJƒ¤‘Dv¸-(0g:-0M,QÔăůGýÍ$"':AG 5' 3¸¸43%@€K5:,+ CfN@TSZ 'šAśČçO@H=.%4-+#%vź_U[1C "&_˙˙˙ě˙˝ăĺ Ň˙ěňĺ,:%&'&5476&'53!"'+532767654'&#"%3276'&'&\:-0M,QÔăůG Ęţ žJ†Ą÷îFâ$"':AG 5' 3ČCfN@TSZ 'šAśČçO8¸44¸U@H=.%4-+#%vź_U[1C "&_˙ěźX %!#53 76=3`HţŠŐž,1¸VV¸,1jŮŮť˙ěĺX%#!5!276=33!!"^L×ţą˘,0¸2,Ł*ţŸÖVV¸,1jŮŮj1,¸˙˙ţóŃ˙˙˙{ţđĺ ×˙˙˙ěţÔX' =‡ţÔ R˙˙˙ěţÔĺX' =“ţÔ S˙˙DşŒš˙˙˙ěĺš&˙˙DşŒý"ĺk ;#"'&=3Ú1,cK‚Ž\W¸L71,¸\W+˙˙DţŒ˙ö˙˙DşŒŞ˙˙˙ěĺŞ&˙˙DšŒý˙˙˙ěĺý&˙˙DţčŒ˙Ř˙˙˙ěţčĺ¸&˙˙0ĘĄô˙˙˙ěĺô&˙˙Váz ˙˙˙ěĺ& ˙˙˛U-Ţô˙˙Đƒ&ú!Â˙˙ćƒ'! u˙˙ł :&ú"˙öÂ˙˙äć:'"' u˙˙Lţ 3ś&"`ţ>˙˙Zţ ĺś'"2ţ> Ő˙˙śţ  &ú#ů˙˙ţ ć&#V u˙˙ţóŃW&"˙Yýß˙˙˙{ţđĺ`'"ţäüč ×˙˙˙ěţč'"˙ęţp R˙˙˙ěĺč'"ţp S˙˙ ÄúLć 3;!"'&L¸2,´ĐţřęPXsĄűkj1,¸\e˙˙Eţ˘°& K <ţ˘˙˙Eţ˘ĺ' <Ńţ˘ ?˙˙˙ěţÔźX& R <řţÔ˙˙˙ěţÔĺX& S <ţÔ˙˙Ţ˙Ćó& =j„˙˙ňĺ' =Ć„ Ń˙˙E˙ë° & K =żŠ˙˙E˙ěĺ ' =œŠ ?˙˙˙ě#č' =“R R˙˙˙ěĺč' =“R S˙˙E˙ë°& K >şŠ˙˙E˙ěĺ' >¨Š ?˙˙˙ě,â& R >œR˙˙˙ěĺź& S >›,˙˙Xţ ­g& <Ÿ˙˙Xţ ůg' <p˙Î ‰˙˙˙ěţÔ\/' < ţÔ Š˙˙˙ěţÔü/' < ţÔ ‹˙˙Xţ ­gXţ ůg.%3#"'&'&'27'&5767&5$Ń(1{R=IrbŕJÁԖúţ”ŠƒÔ`‰eŸ‡_Ă$Äm3HZ¸¸–dœ˛PˇüŠ]Łv¸bĘŢße4)¸@5š [ _w˙ě\/&'&'&5672+5327676SSgU´RĄHK˘ŹÜLXŚJ‘KÝŁ€dăht^¸#4bš4bBP¸H:jV˙ěü/);#"'&'+53276767&'&'&5672~ÜAI2h6ýž—¸€•Ĺ:H~˙˙˙ĚţDś& <] ˙˙˙`ţ ĺś' <ď  •˙˙˙!ţ˜îţŐţĺîF"'&''#"'&7673327676'&/37653323;#"'4A@E2J/1%=Gq_ev<¤W!.052#)Ÿ1'/-%¤% *i¤),;?d<G!C~m8(P¨^yM\dsŐč‚቏+;H2zmĽ^\꜑#P}gÂŁx&ţŞ‹),¸`a ˙ě˙Ý”č1%"'&=#+32767327673276765##"'&7#ćG¤F$L*Fe;E ,Q2I3FABNU!>¤h+&Ľ%*ľTdOœŔvG#¸%,9?#@*8m~C "R™ŸVţÚţčxŁÂgt˙ě˙Ýćč7323;#"'#"'&'#"'&'+53276=32765Ń!5d¤*,""@e;6:HO7* F35C%&F:DF*7@˘`*%Rڊx&ţŞ‹),¸`X I6[m8*6759,%¸#GvŔœOdTtgÂ˙˙˙!ţ˜°& >6 ˙˙ţŐţĺ°' >ě  ™˙˙˙ě˙Ý”°' >–  š˙˙˙ě˙Ýć°' >R  ›˙˙˙ţŔţĹţĺ G%327654'&#"%;#"/+"'&5#"'&5473767654'&'367632ýŒIj($?GhK=.';4fʈÚ&4-//3fJ‚Z}eŹh<2ÔH7(2€<ąRN˙ěÁ ,%327654'&#""'&'+53276=367632#IŒIj($?GhKRJNA'f^‚K+%A¸-L1’–Ť[W¸~¸.DF-%!mNţŘ*#=Џ,PdrNP2€<ąRNyžmK˙ěĺ 6%327654'&#""'&'+53276=367632;#"/#ýŒIj($?GhKRJNA'fDP*-¸-L1’–Ť[W.';4fʈ¸.DF-%!mNţŘ*#=Џ.2€rNP2€<ąRNy4G ,¸^x˙˙˙ţŔ4& <Ož˙˙ţĹţĺ4' <ž Ą˙˙˙ěÁv' <Wŕ ˘˙˙˙ěĺh' <4Ň Ł˙˙ ¤ ĺ '%327654'&#"%;#"/#!#53367632ŒIj($?GhK=*=%-:]U}•ýű˛˛¸L1’–Ť[W¸.DF-%!mNN5FC¸Oi¸\ű€<ąRN˙ě¤ %327654'&#"!#53367632,ŒIj($?GhKˆýűţţ¸L1ŽšŤ[W¸~¸.DF-%!mNţظ\ű€<ąRNyžmK˙ěĺ '%327654'&#"%;#"/#!#53367632ŒIj($?GhK=*=%-:]U}•ýűÚÚ¸L1’–Ť[W¸.DF-%!mNN5FC¸Oi¸\ű€<ąRN˙˙ ¤&  <C˙˙ĺ' <C Š˙˙˙ě¤' <C Ş˙˙˙ěĺ' <C Ť˙˙zţ ˇ* ”ţ ô,7347&'&5476762;# '!27'&"676'”ť=& hYîYe Ev7DW_”ŕĐţˇřš)k_ÁԖúţRbŠ4/F†0Ԍ2H9)74--38&">8`@%(¸äjm=žv¸bžw $A7. ˙ěů*727&'&5763"327%+5=ĄĘK4XĚ}űÚş>SF8I ţ\ţ˘˛Y¸];dŒ}MЉ˙4F!¸Ĺ¤¸˙ěĺ$/%+532767&'&5476762;#""654'hÂĘđÚkB;(aD hYîYf MXD=pŰńʨ4/gg/šš¸($'UZ'-)74--38)-'bM,(¸U __ ˙˙zţ ˇF&  <w°˙˙”ţ ôL' <Öś ą˙˙˙ěůF' <w° ˛˙˙˙ěĺL' <ś ł˙˙˙ľ˙¤ŒŔ& S <đ*˙˙˙j˙¤ĺL' <öś C˙˙˙ě?' <Š~ @˙˙˙ěĺ~' <"č A˙˙ţ|t& L =]~˙˙˙íţĺ' =Nk B˙˙˙ě?& @ =,~˙˙˙ěĺ~& A =–č˙˙˙ČŸ˙Ą˙Čĺ!D#"'5327654'&'&7676##"'&547#76767;5#"'&5J&P DfXRNB8D-<9_¸h$$EB|=Q&v+6şú(  %ţśz|qe›˙ěć))5!27654'&54767;#"'&/œţPœ“/6ţĘ2 hęýŹF F&,@X„B:f"``¸h$$EB|=Q&v+6şú(  %ý?¸+)x.›˙˙BţČK ţČĺ$##"'&547#3276767;5#"'&5¸EcTiI(ŚA¸@ňwc}^h3N8‚K+,1ű–ţŘ9ƒ)"B~ss\ŠţýV*"/~?]3¸,1j˙ěé )5!27653éWPţđýşÚ,1¸s˛e\¸,1j•˙ěĺ%)5327653;! hLţđţŕęÚ,0¸2,ÚéţßţôVV¸,1j•űkj1,¸˙˙‚ţTóGţĺt4%327654'&'&#"#"'&#4763&547632;#" zL,5;(.;DŔ …KŇp#IČxAI˘M\HTŞ(RfV­¨*9:X DD(ŠPNKOţ“m­f7*(”„?$Gł@^¸˙ě˙ÍŚm*%'+53276767632%327654'&'&#"d`ŒÔp@h t4,+‡^]EE˝ýđ>Ÿ/4:''5)24ed0¸$#1ľP8OŤ$*ŽME5EX !a%˙ě˙Îĺm/%#"'+53276767632;#"%327654'&'&#"|a‹Ön@h¸Œ4,+‡^]HBÁ3&id›Žţ>Ÿ/4:''5).4fb0¸$#1ľP8S§1>/¸ÇE5EX d%˙˙6ţľ„& U <Óî˙˙˙Őţ ćŻ' <w M˙˙˙ěźč& R <R˙˙˙ěĺč& S <R˙˙Ţ˙ĆóŢňĺî $&'&'&'3;#"'&'#"'&5476 xRo´t¸$8pq¨ZI-&Šœ8:˝Ěm*12e CY>)2Ń'+¨ŽeO,¸3;I0š­D˙ě˙˝ăĺ-=67654'&#"27&'&5476&'5#"'+5327654'&ş$"':Aů4N--0M,QŰÜ;(J݃šx’ŻŃb 41~! @H=.%4-+#%vˆ iEN@TSZ 'šC´ÖŮ49g=ql)¸D%'Šr.C!v-‹3j  °;AWE… ¸L9P)8K6(¸œS/V¸L_”+Y‡9›K1\S˙˙ţóŃ˙{ţđĺ7%&'&'&54767632;#"'&##"'&'&73327676 ,)MW,‚.@"##C@"*5NhľŒLy“ä $˛Eq‚:€<3, $.=N/[ŠŔ¸ŹĽ EW3235hýęýęuFX^"!Ýşhż^b˛Nmƒ/>ZUËţüţéňübŞ=*(DV\BALĄŔ89źDEnY1X;YTBEbš“ţţ˙˙%ŹŐ$˙˙ŚqŐ%˙˙‹˙ă1đ&˙˙‰RŐ'˙˙ĹNŐ(˙˙éXŐ)˙˙f˙ăPđ*˙˙‰HŐ+˙˙ÉŐ,˙˙m˙ăźŐ-˙˙‰ÉŐ.˙˙×sŐ/˙˙VyŐ0˙˙‹FŐ1˙˙u˙ă\đ2˙˙ĹuŐ3˙˙uţň\đ4˙˙ŃŐ5˙˙‹˙ăJđ6˙˙/˘Ő7˙˙“˙ă=Ő8˙˙9˜Ő9˙˙ŃŐ:˙˙žŐ;˙˙%ŹŐ<˙˙œ‘Ő=˙˙…˙ă#{D˙˙Á˙ăXE˙˙Ă˙ă%{F˙˙{˙ăG˙˙{˙ăX{H˙˙Ă'I˙˙{ţH{J˙˙ĂK˙˙˛DL˙˙şţVM˙˙ě˛N˙˙  O˙˙mo{P˙˙Ă{Q˙˙‰˙ăH{R˙˙žţVT{S˙˙‰ţRwT˙˙jƒ{U˙˙Ő˙ă{V˙˙ƒžW˙˙Ă˙ă^X˙˙dm`Y˙˙Ń`Z˙˙L…`[˙˙hţV`\˙˙Ëb]˙˙…˙ăLđ˙˙öFŐ˙˙˜#đ˙˙‰˙ă7đ˙˙foŐ˙˙˙ă-Ő˙˙…˙ăLđ˙˙‹7Ő˙˙ƒ˙ăNđ˙˙˙ăFđŰîćf@ÔĚ1ÔĚ03# Ćqšfţˆ?‘ŮQ@ ŢaaÔüÔě1Ô<ě20K°TX˝@˙Ŕ878YK°TK° T[X˝˙Ŕ@878Y3#%3#?ËˈĘĘŮËËËŰîZökľÔÄ1ÔÄ0K° TX˝˙Ŕ@878YK°TX˝@˙Ŕ878Y@&  //// //]]3# şĺšöţř˛éŃ@ Ě Ě ÔÄÔÄ99991Ô<üÔ<ě990K°TK°T[X˝@˙Ŕ878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyîööiľÔÄ1ÔÄ0K° TX˝˙Ŕ@878YK°TX˝@˙Ŕ878YK°TX˝@˙Ŕ878Y@ //]#1Śăöţř7îšř]@ ÔÄ91Ô<Ä90K° TX˝˙Ŕ@878YK°TX˝@˙Ŕ878Y@ //, ]3#'# ˝ÓŒŚĽŒřţö˛˛7îšři@ ÔÄ91ÔÄ290K°TX˝@˙Ŕ878YK° TX˝˙Ŕ@878Y@ //*//]373 ӌĽŚŒÓî ˛˛ţöřZj@ ÔÄ991ÔÜÔĚ0'3$řll/{˘m > #.#"/ ž Ÿ waSRd {xz{w8796/{˘m ˛¸@ PPÔěÔě1ÔüÄ20332673#"&/w dRSaw Ÿžm6978w{zƒÎPˇŢaÔě1Ôě03#ÍÍPÍXck@ ÔĚÔĚ1Ô<Ě203#3#\şĺšzşĺškţřţřťcyk#!#uŚĺůŚĺkţřţřf•ń$(#5476?>54'&'&56763#ŽÂ7:)*%>8'9@B9Q[~CG=9. ÇËË‘šbEBTY;X1I*%#DŮ>"Y`ĄLAB\VE'*=ţĂţ=œ“0śśÔĚ1Ôě0!!=VýŞ0”œ˙45˙Ś!5!5üg™Ěr˙4Ë˙Ś!5!Ëű;ĹĚr˙4Ń˙Ś!5!Ńý/ŃĚr^Ôsé 2"&46"264hrL&'œâ—šŤvURyVéP%`8nš—âœ|TyRTv?F‘3#%3#?ËˈĘĘĘĘĘ––53#–––––73#'3#ú––ú–––––– 3#3#'3#}––}––ú–––d–––E˙ěĺ&"'&547332767654'3;#"'&'şƒ)¸+ubE‚W-7¸!K4/+X`t8AŰ>|Š0l7%5A8>7KZd3(¸,*OQ/9˙ě?Ů0654'&323276767'&54767632#!V)B,4((7(*HýŽńT—O<?a‚Nb–NLZB`.NJ|m‘ţż+M;3*)3P&ţˇ ]027EW4,”E$2Hf3ŒĐˆ,'˙ěĺ 3;!"'#!5327&'&5476762"67654'&'ȡ$&”áţňş¸ˆţÄâ’($š€28 D@$ 8úP–2*I1C2¸99¸(M.L,0W¸ 5+5DE2.4!˙íţĺä.@%&'&'&54767632;+'$'&547332766'&'&#"ŒB.y9“(“)Wp8c2X]0LhŽ—¤ţÓ^E>¸>:Ăluž{/"'"5 9Ld/  #+mš=ĽE2X‘:Ö¸Sm•JNžŠ}Ś`k›I=‚"'&4762<R8R8z?@¸?@@?¸@Ü(8)*8…¸@@@@¸@??•ţV<ŐD@!B´ —  10üěüÄě291/<Ôěě2990KSXÉÉY33+532765#•š5šYZĽÍšZ-,ýËšŐű—iúĂijœ>>’iű—E˙ë°'&5473327654'–ژţéߚ)¸+ub„źj{G„{yo9;á>|Š0lALj@Gţ|tŮ8654'&32676#"'&54767632'&'&5473)B,4((7(*Hţ[ÔbË?z…Kb–NLc9g'!.9ĽťéΊMRˇVV+M;3*)3P&ý;fÔ4KCW-3”E$2Zwf üŽłƒ”żj}´Řť™H(°˙˙Eţ ° ' I˜ţ & K =¸Š˙˙E˙ë°ś' DŠ  K˙˙Xţ ­°'"˙Ž˙8˙˙Xţ ­Ş' EÂ˙˙Xţ ­Ş' >T˙˙˙Ěţľ&$>ýŇ˙ľ˙¤Œx9654'&"32#"'&&733276767#"'&54767632Ł)B,4P7&,Hi§˛ĽŁrô$¸$xZƒTź0A&?z…Kb–NLZB`.¸,L95T2R$ţŚT&()XŠ\^ˆ“-"2(hLDV‚,4”D$2Hf3‹ţť˙˙BţČúÄ'$„6ţľ°#"'&47332767654'3dGŽŒŹ{ę5¸7Ą9T?:"F¸H˙ť¤t<;?xŽŽŽŽ´C3§b`ů˜Ÿ˙˙Lţ 3H'$pţ˙˙ţóŃ'$˙(ýŕ˙˙Ţ˙ĆóŢJ=Ôw˘{_<őĆUĆUű‰ýžUmţŃű‰˙žŃhŃŃRž!9Ş\ŚX“déf…ö˜‰f…‹ƒé“XXXô%Ś‹‰Ĺéf‰Ém‰×V‹uĹu‹/“9%œĎfZH…ÁĂ{{Ă{òşě mÉž‰jՃĂdLhËÝÝXՋÍ%Ç?wXd=+XBFŰĂjé‹XôÁÁ%%%%%%‹ĹĹĹĹÉÉÉÉ‹uuuuu–““““%Éź………………)Ă{{{{˛˛˛˛‰Ă‰‰‰‰‰X/ĂĂĂĂhžh%…%…%…‹Ă‹Ă‹Ă‹Ă‰{{Ĺ{Ĺ{Ĺ{Ĺ{Ĺ{f{f{f{f{‰ĂFɲɲɲɲɲ˙˙˙ümş‰ěěČ × × × ˙öL‹Ă‹Ă‹Ă“Ău‰u‰u‰Hj j‹Ő‹Ő‹Ő‹Ő/ƒ/ƒ/ƒ“ÓÓÓÓÓĂ%h%œËœËœËĂFŚÁ0<‹<^ƒˆĹu‰?Ă4AÉÉně 1mĂu -V8ž‹Őxvƒ/ƒ/ 'Jšœœ}­˜}Â}9¤%…ɲu‰“ÓÓÓÓĂz%…%…)f{‰ěu‰u‰}şf{=‹Ă)/%…%…ť{Ĺ{ť˛É˛u‰u‰‰hj“ÓËŐ/ƒ}Ž‰Ă“œË%…Ĺ{u‰u‰u‰u‰%h jƒşxx/!ŐË79Žš{ŔÁ¸Ă{{zzŠŠ8°ş{zffźĂÎƠX (hhg˛ˆ‰Eމ˜˜fjj  zzź}}}vڃ_AHHf§}iÂÂÂÂ_Ѱ6Ęwő#ÂÂ6™™ľ‡ćۏ˛ĹAAć™™Q0ěĎĎđßß^^))$=$=śśßß>ˆ/V¤XţĄ%V[^,,,,,ӍŰ)=/?™VX)"VŇ//ŐďđŰyyœĚsŁúb^_söś?˜‹Ž$UÎ))//=X/úUU΋Űď˙ěć“Ű?é˙ţí˙˙ľţp˙Î6%Ś×%Ŝ‰uɉ%V‹‰u‰Ĺx/%uuJÉ%FŠĂ63F— ‰Š˜Ă‰6ěDĂtĄ‰PžĂ‰Ÿ3LYƒF63‰3F•r"ţp"m93u‰‹›é`„!Y4žĂşu˘˘Éž‹VU‹‹‹ĹĹ˙ž×‹‹ÉÉm˙í"˙ž‰‹h‰%ŚŚ×!ʼn‹‹‰V‰u‰Ĺ‹/hBP‰r< Aŋ<L…}Ńi{;ŠĂĂě=ÉþĂáhcL|Ă}PhĂĂN¨{{#ĂŐ˛˛ş A#ěĂhĂu‰×U×;‰Š‰ěb‹Ă/á%\%\LŒĂÉ;‰ě‰ĂŒĂÇ%…%…)Ĺ{uzuz;‰Š}‹Ă‹Ău‰u‰u‰‹Ăhhhhhh‰Ă×Ah‰Šu‰11ZÖdÖÚ˛˝L˝ EŢEEXXXčč˙Ě˙Ě˙"˙"˙˙ zz˙ě˙śB‚6ŢLDDDDDD0V˝˝\ú–š†ěƚ~~ĄČ6֒˝EEEEEEXXXX˙Ě˙Ě˙ś ú–š†ŻŹ~~Ą>lyö|ar{•jK||cceerd`oawT0ZűŠüĆSSSSĎxD˙đV_I˙đ– žn7 žž7Ÿž žž7ŸŸ7Ÿ-77 7ž7žVž ŸŸŸžv ŸŸ‹7kĄm #•)О‰ˆ+?+üő77LL,:d^E<<.?AäEEGűGG11OOGI8%[:X::GM[˙%#H™[#{:œ GXQ:OWbG[CaIGdUU~%%UU?::[xMĐ Fa^M3:%…ŚÁŚÁŚÁ‹Ă‰{‰{‰{}{‰{Ĺ{Ĺ{Ĺ{éĂf{‰Ă‰Ă‰Ă7‰Ăɲ‰ě‰ě‰ě× × × × VmVmVm‹Ă‹Ă‹Ă‹ĂŞŞjj==‹Ő‹Ő‹Ő/ƒ/ƒ/ƒ/ƒ“ÓÓĂ9d9dLL%hœËœËœËÃhÉ%…%…%…%…Ĺ{Ĺ{Ĺ{ɲu‰u‰    “Ă ' ' ' '%h%h%hFFFFFFFF%%ţlţl˙˙˙Á˙ŠŠŠŠŠŠ˙˙ý‹ý‹ţýôĂĂĂĂĂĂĂĂ˙M˙Mý@ý@ý¤ýţcţc66őő'˙˙ý¤ý¤ţýôţŽţމ‰‰‰‰‰˙Ę˙ý‹ý‹ţžţŠ33333333ţéý@ýEţFFFFFFFF˙Ę˙fý‹ý‹ţˇţŁţůţŽFFŠŠĂĂ6‰‰33FFFFFFFFFF%%ţlţl˙˙˙Á˙ĂĂĂĂĂĂĂĂ˙M˙Mý@ý@ý¤ýţcţcFFFFFFFF˙Ę˙fý‹ý‹ţˇţŁţůţŽFFFFFFF%%˙‡%ďďĂĂĂĂĂţ˙ţ[ţí‰ő'/66ÉÉţż˙ő3333žž33%%ţ[ţp˙?FFFFFţŚ˙ľţŚ˙ÎJŰďddĎĎ“ĎÓÓÓÓ˘˘??PʀʀZ¤ĐôĎZ!!Đ=H ?I=;0ŘŘA=XBF ?I=;0ŘŘE1:1 {_‹m *{%*/.j5'‚Œ:TTJ B%0J‰%  BBB¸¸¸¸BBYYBBBBBBBBBABBqˇˇˇˇş?QQ2BXXBBBBGB*BB*B*BBBBBBBB››››BBBBBBBBóBóóóóóóóBEEóB*BBBBBBBB%uś˛˛I˙ú˙ú‚‚˜XXfŚ+?;;;ş)}}¤¤¤¤?5XJWXXXXXXXXXXXXXXXWXXXXXWJJXXXXXXXEXXXXXXXXVVVVWXXXXVVVVVVVVVXVVVVVVXXXXXXXXXXXXXXOOOOOOOOOPPPPéXXXVXVVVVXXXXVVVVPIr’’’’’ĎZĎZ% % Xa¸ŚGX++|h}2H%%˙ě?XX%XX6žFœFHRFFFöő    –˙ě˙ěČ˙ě˙ěČ˙ë˙ěČČČ˙ě˙ě˙ě˙ěČČ˙ě˙ě˙ě˙ěČČČČČČ˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ěČ˙ěxxx˙ě˙ě˙ěxx˙ě˙ě˙ěxx˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙“˙“˙“˙ě|˙ěČ|Č˙ěČ˙ěČ˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ě˙ěi˙ě˙ě˙ě˙ěE˙ěi˙ě˙ě˙ě˙ě˙ěi˙ě˙ěŰŰDDŰŰŰŰŰŰŰŰu77˙ě˙ě˙ě˙ě7777?˙ěaaŻŻ"2"Y::Č;+6.oc…ÉN8/&///ŒŒ "N`yaĚ7g!!!!œ•˝‘‘GŽCL×54=/U28Y^CVpސœj6”âgv€‘2 ‘1.r˘jDą7`./<KD$>K--9.7.P<<<<<<....RR–s'źJ*R*"ˆóŢ..:=4%=?D-W&W;%˜J@ƒ3@V90›~0G+%(C(#(=(.6W0$2$017+!$%2 02)!"$E=80+ÍQÝÓög˙ž.rA1đđfnCDŇŇÍÎÉÉůStSt-IS-6SS`{{66O6ee5a}T2)‘XtSuN*u5&%277u††uXX–V%‰ĂL˜‰ćÁĎZĎZÚ,,,,,,,,,,,,,,,TT(((鈉##EE˙ě˙ěEE˙ě˙ěEE˙ě˙ěEE˙ě˙ěEE˙ě˙ěEE˙ě˙ě˙ś˙j˙ě˙ě˙ś˙j˙ě˙ěXX˙ě˙ěXX˙ě˙ěXX˙ě˙ěXX˙ě˙ě˙Ě˙`˙Ě˙` ˙ƒ˙ě˙ě ˙ƒ˙ě˙ě6˙Ő˙ě˙ě˙ě˙ě˙|˙ě˙ěD˙ěD"DD˙ěD˙ěD˙ě0˙ěV˙첳äLZś˙|˙ě˙ě LEE˙ě˙ěŢňEE˙ě˙ěEE˙ě˙ěXX˙ě˙ěXX˙ě˙ěXX˙ě˙ěčččč˙Ě˙`˙Ě˙`˙"ţÖ˙ě˙ě˙"ţÖ˙ě˙ě˙ţĹ˙ě˙ě˙ţĹ˙ě˙ě ˙ě˙ě ˙ě˙ěz”˙ě˙ěz”˙ě˙ě˙ś˙j˙ě˙ě˙í˙ě˙ě˙Ą˙ě˙ěB ˙ě˙ě‚G˙ě˙ě6˙Ő˙ě˙ěŢň˙ě˙ěLZ˙|˙|˙ě˙ě˙–˙@S˙ŕ…_ł_R%Ś‹‰Ĺéf‰Ém‰×V‹uĹu‹/“9%œ…ÁĂ{{Ă{òşě mÉž‰jՃĂdLh˅ö˜‰f…‹ƒŰ?Űy77//Xťf=œ^?E˙ě˙ě˙í˙j•EEEXXX˙Ě˙śB6LŢLLLL˜Ü˜˜ ü,„ÜxĐ 8d˜ x ( č d ¸  čœŕ4€Ä ôŘ€ €Ü,Đ(€ěźô´PĐD츴ř„ř  œ!!T!Œ!Đ""@"„#p$$ˆ%%Ŕ&8''p'Ř(P)L)¤*°+ +˜,,,Ŕ-P.<.°/ /Ź0ř1ä2Đ3X4$4T5$5¤5¤5ô6¸7L8d989„:¨:ě<<ě=`=˜=Ä?,?X?Đ@<@đAŔBB´CC@CPC¸DHDŔDŕEE FF8F\FŒF¸FđH$HÜHôI I$I<ITIlI„IŹIĐJlJ˜JźJŕKK<KtKčLěMM4MdMœMŔN@O$O<OTOlO„OœO´QQQ4QLQdQ„QœQ´QŘQřS S$S<STS|SŹSÜT8U<UTUlU”UÄUÜVpVˆV´VĚVüWW,WDW\WtWŒW¤WźWÔWěXXXDXTYY(Y@YXYpYˆY Y¸YĐYčZZZ0ZHZ`ZxZZ¨ZŔZđ[$[°\D\x\\¸\Đ\ř]](]@]X]¨^P___0_H_``\`€`´`Ě`ä`üaa,aDa¸bHb`bxbb¨bŔbŘbđc€ddDdddŒd´dĚdäe|f”fŹfÄfÜfôg g$g<gTglg„gœg´gĚgägühh8hPh¸iLixi iĚiějj<jTjlj„jœj´jĚjđkk4kLkpkˆk k¸kĐkčlldlŘm˜m¨n ndnÔo`oÔp@pPp´qqlrrtssČt txtüuXuĐvv\v¸w wTw xxLxxüyy,yyüzlzđ{\{Ô|L|\|Č},}h}Ä~~ ~<~¨~üT¸€€H€´ Œř‚d‚Đƒ0ƒ”ƒč„„ „d„t„Œ„¤„ź„Ô„ě……4…L…l…Œ…Ź…Ě…ě† †,†D†T†t†Œ†Ź†Ä†Ü†ô‡ ‡$‡<‡T‡l‡„‡œ‡´‡Ě‡ä‡üˆˆ,ˆˆ¨ˆŔˆŘˆđ‰‰ ‰8‰P‰h‰€‰˜‰°‰Č‰ŕ‰řŠŠ(Š@ŠXŠpŠˆŠ Š¸ŠĐŠč‹‹‹0‹H‹`‹x‹‹¨‹ŔŒLŒŕŒřTôŽDŽ”ŽŹŽÄŽÜŽô,Ld|”´Ěäü`ě‘`‘Ŕ’\’ř“X“ě”x”°”ü•œ•đ–D–Ä–ě—X—Ź˜(˜¸™H™ôš|šü›p›čœLœětž<žđŸŹ , tĄĄxĄä˘P˘ ˘äŁ@Ł´¤¤8¤h¤ÜĽ<ĽpĽřŚ`ŚČ§H§¨¨ ¨<¨¨Š МŞ4ŞpŞŹŞüŤ<ŤŤĐŹ Ź|Źě­­ĐŽ0ŽxŽÜŻ ŻdŻĚ°<°¨°ĐąąHąxąŔ˛˛„łłpłĐ´0´¤ľ(ľŔśHśŘˇˇlˇ¤ˇÄ¸H¸¸š(š¤şpťťÄźP˝ ˝˜žDž€žäż$żtżÜŔ@Ŕ ŔŘÁÁXÁ¸Â$Â\œ¬¼ÂĚÂÜĂĂTĂ°Ä ÄhÄÄÄôĹĹ4ĹDĹlňŜŰĹÜĹřĆĆĆźÇ Č8ČHȄČŘÉ ÉˆÉŔĘĘ<Ę`ʈʰĘĐĘŕĘđËËË Ë0Ë\ËlËŔËđĚĚHĚX̸̨ĚÔĚđÍÍ4Íl͈ͰÍÔÍđÎÎÎ<Î`΀ÎÄÎôĎĎ<ĎhτϴĎäĐĐPĐźĐčŃdŃtѐѴŃüŇ<ŇxŇĚÓÓŕÔ ÔÔ,Ô<ÔXÔpԌԨÔŘÔüŐ(ŐpŐ¤ÖÖÖ,Ö@րּ֠ÖäÖô×××4×D×\×t׌פ׼×Ô×ě×üŘ ŘŘ|،؜جŮLŮ\ŮlŮÄŮÔŮäÚDÚTÚdÚtÚčÚřŰŰčŰřܜÝDÝ\Ýt݌ݤݼÝÔÝěŢ|Ţđß,ßĐßŕŕHŕ¸á`á¸áČâââhâäâôă@ăĐäDäŘĺ8ĺœćpćĚç(çŹçÄçÜçôč č$č°é4éœé´éĚęTęČëhëĐě4ě¤íí(í”íđîîîěďˆďřđđđ„đôńdńtń„ń”ńĐňňxňÔňěóóó4óÄóÜô„ô”ô¤ôČôŘő<ő˜öö ö8öPö€ö÷÷(÷`÷đřřĚřÜůHů`ůpůÔůäůôúúHúXúhúxűűäűôüHüŹýýhýÜţ\ţĐ˙x(ÄÔ 8přÔäPhxÜd¸Č ,p€Xhź tŘ L Č 8 ě ” ( @ X ź Ô Œ œ Ź Ě Ü@č0`p€Ä<pĚ,ˆäüT”Đ $<lœŹÜ \¤ěL\l„œü`¨đXŹČřH`p€˜°ŔĐč0H`p€˜°ČŕDTd|”ŹÄÜô $<Tl„°Üô ,<L\l´ô@`źě\Ěäü  , D ` x  ¨ Ŕ Ř!D!\!°!Č" "$"ä"ü#°#Č$,$D$Ä$Ü$ô% %$%ŕ&<&Č&ŕ'H'Č(l(„(°)P)|)˜*(*D*Č+ +P+`+t+œ+¸+č,@,ź-@-Ź-ô.D.”//H/ˆ/Ź/ŕ080P0h0€0˜0°0Č0ŕ0ř11(1@1X1p1ř22ŕ2đ333 303°444œ4Ź4ź4Ě5Œ66Ô7D7Ä8x9 9˜::ˆ;H;°<h>ř?D?Ř@pA A|B<BčC„D<DźDŘE8E„EœEŕF,F|FÔGGlGĐH$H@H I<IhI|IŹJJdJŕKlKČLDLŔM8M„MěNPN´OO„OôPPPĐQ Q|RR SSSěTlTÜUTU¤V$V¸WWtWôXŹYY€YřZ|[[x[Ü\L\°\ä]4]ô^€^¸_`_”_Č` `h`ĐaaLa´aôb$bTb°bŕccPcˆc¨cŕdd@dˆdĚe,eTe¸eđflfčg<gřhLh¤ii\iĐjDj¸jđk(kkđl<lŒlźlěm@m€mÄnnpn˜nŹnŔnÔnčodotoźppdp´q8q¸r,rlr´s sds¨sÜt tHt¤tŘu(uHuĐv8vŒvřw(w˜x,xŘy y„yězHzœzÄzô{@{œ{ř|P|h|€|˜|°|Č|ŕ|ř}}0}L}d}|}”}Ź}Ä}Ü}ô~ ~$~<~T~l~„~œ~¸~Ô~ě4Ld|”ŹÄÜô€ €$€<€T€l€„€œ€´€Ě€ä€ü,D\tŒ¤źÔě‚‚‚4‚L‚d‚|‚”‚ʂĂ܂ôƒ ƒ$ƒ<ƒTƒlƒ„ƒœƒ´ƒĚƒäƒü„„,„D„\„t„„ʄĄ܄ô… …$…<…T…l…„…œ…´…Ě…ä…ü††,†D†\†t†Œ†¤†ź†Ô†ě‡‡‡4‡L‡d‡|‡”‡Ź‡Ä‡Ü‡ôˆ ˆ$ˆ<ˆTˆlˆ„ˆœˆ´ˆĚˆäˆô‰ ‰$‰<‰T‰t‰Œ‰¤‰ź‰Ô‰ěŠŠŠ4ŠLŠdŠ|Š”ŠŹŠÄŠÜŠô‹ ‹$‹<‹T‹l‹„‹œ‹´‹Ě‹ä‹üŒŒ,ŒDŒ\ŒtŒŒŒ¤ŒźŒÔŒě4Ld|”ŹÄÜôŽ Ž$Ž<ŽTŽlŽ„ŽœŽ´ŽĚŽäŽü,D\tŒ¤źÔě4Ld|”ŹÄÜô‘ ‘$‘<‘T‘l‘„‘œ‘´‘Ě‘ä‘ü’’,’D’\’t’Œ’¤’ź’Ô’ě“““4“L“d“|“”“ʓēܓô” ”$”<”T”l”„”œ”´”Ě”ä”ü••,•D•\•t•Œ•¤•ź•Ô•ě–––4–L–d–|–”–¤–ź–Ě–ä–ô— ——4—D—\—l—„—”—Ź—Ä—Ü—ô˜ ˜$˜<˜T˜l˜„˜œ˜´˜Ě˜ä˜ü™™,™D™\™t™Œ™¤™ź™Ô™ěššš4šLšdš|š”šŹšÄšÜšô› ›$›<›T›l›„›œ›´›Ě›ä›üœœ,œDœ\œtœŒœ¤œźœÔœě,<Lp€˜°Čŕřžž(ž8žPž`žxž”žŹžÄžÜžôŸ ŸŸ4ŸLŸdŸ|Ÿ”Ÿ¤ŸŔŸŘŸđ    8 H ` x  ¨ Ŕ Ř đĄĄĄ0Ą@ĄPĄhĄ€Ą˜Ą°ĄČĄŕĄđ˘˘˘0˘@˘d˘d˘d˘d˘d˘d˘d˘d˘d˘d˘d˘d˘˘ ˘Ě˘řŁ ŁHŁ`ٜŁŘ¤¤8¤”¤đĽPĽ„ĽÜŚ`Ś Śź§§¨dАаŠĚŠěŞŞ$ŞDވŞĐŞěŤhŤ|ŤŹŤÜŤřŹŹ0Ź0ʏŹđ­`­ČŽHŽpŻ(Ż´Żä°°(°\°°ôąąą0ąDąXąlą€ą”ą¨ąźąĐąäąř˛ ˛ ˛4˛H˛\˛p˛„˛řł¨´8´x´ŕľ\ľŕśŔˇŒ¸0¸¸¨š¸şşXťäź€˝˝”žž ż4ż¨ŔDŔ”ŔđÁXÁœÂÂĐĂ@ĂŘĈĹ<Ĺ|ŌŜĹŹĆ4ĆTĆtƔĆ´ĆÔĆôÇÇ4ÇTÇtǔÇ´ÇĚÇüČ0ČdȔČÜÉ$ÉTɄɰÉÜĘ$ĘlËËźĚĚL̔ĚÜÍÍ\͘ÍÔÎÎLΘĎ ĎŹĐpŃ8ŇPҰŇôÓ,ÓdӜÓÔÔ ÔDÔĐŐ`՜ÖÖŹ×T×x× ×Č×đŘŘ@Řd؈ŘÜŮ0لŮĚÚÚ\Ú¤ÚŕŰ ۄÜÜdܤÜäÝ$ÝdÝŔŢŢ\ޜŢÜßß\ߜßđŕHŕ˜ŕčá0á|áÄââLâˆâČăă@ă|ăÔä$ä„ääĺ<ĺŹććDćˆćŘçxçČč$čhčŹééTé¤ę ę@ętęÄęüëXëđě ěˆíTíĐíüîXîčď|ďŘđhđ¸ńńpńœńÜńěňňň$ňˆň ň¸ó0óôôô@ôhôőő|őěö„÷\÷t÷Ź÷Ü÷üřXř´ů ů€ůčúlúäű|üýý´ţl˙`˙Ř$ŕTl”´Ô\¸$lŹě8€dčtř,ˆČ(„Č  h Ě 4 ˆ Ü D ¨  ¨ H ô8|ˆÄüdĚ`đXŔL¸$xČDĐ8¤üTĐPČ”HřŕАD”Ě , d ” Ä!,!|!Đ""<"¤# #¤$8$Œ$Ü%(%t%đ&t''¸'Ě'Ü((@(h((Ä))$)D)d)„)Ź)Ô)ü*$*D*˜*¨*ě+0+ˆ,p,”,¸,Ř,ř--p-Č..d.ź3h3Ě3ô4 4d4´55(5´686P6ˆ6ź77T7 7đ8€8Đ99h9¸::P: :đ;; ;8;P;h;€;˜;°;Č;ŕ;ü<<,<Č=”=ř>8> >¸>Č>Ř>č???0?H?X?¨@@@ěAěBźCěDE<EźEčF F<FtFŹFČGG G<G`G„G GŔGôHLH„H HŘI0IdI€IĚIřJ<JXJtJJŹJŕKKPKŒKÄLLLL˜LźLŕMM(MLMpM”M¸MŘMüN NDNdN„N¤NČNđOODOpO˜OČOôPPDPlP˜PÄPěQQHQpQ˜QÄQđRR@RlR˜RŔRäSS<SdSŒS¸SäT T<TpT¤TŘU U@UtUŹUäVVTVˆVźVđW$WXW|W¨WÔXX(XPX|X¨XÜYY4YhY”YŔYôZ ZLZ€Z°Zä[([X[Œ[Ě\\0\p\¤\Ô]]\] ]ü^0^h^˜^Ě^ě__H_d_€_œ_¸_Ô_đ` `(`L`t`˜`Ŕ`Ô`đa a(aDa`a|a˜a´aĐaěbb$b@b\bxbŒc@dČepe„e˜e´eČeÜeřff,fHf\ftffŹfŘg,gDgœgři,i´j<kÜkřl$l@lllˆl´lÔmm mHmdmmŹmŘmôn n<ndn€nŹnČnđo o8oTo|o˜oŔoŕppXpäq8qœr”sHsüt4tˆtÜu4uŒuđv@vhvvĐwDw”wčxxDxpxœxŕy$y@y\ytyŒyŘzz0zXz€zź{{4{\{Ŕ||<|||ź}0}¤~~”~ź~ä 8T€œÄ€´ Ô…ŕˆ ˆÔ‰0‰€‰ŕŠh‹0‹řŒ\Œř,‘Đ’’€’ô“L”¤–<–„–¸—„˜H˜ŕ™xš<››ČœŒŸü xĄ˘äŚ ڈ§§€§ä¨h¨řŞ8Ť\ŤôŹ€­(ޘŻT°°¨ąŔ˛T˛čł¨´(´¤ľ0ľľôś”ˇ@ˇ¤¸¸ šš¸ştť8ť¨źHź˝(˝ěžhżÁ´ÂLĂhÄ|ŌÇČȐÉTĘĘŹËËźĚ̤ÍhÍźÍěĎ ĎđĐ0ЌĐđŃPŃ Ńđ҄ÓDÔ(Ö ×ŘŮ<Ú(Ű8ÜXÝ4ÝôŢřŕ(átâhăăpä(ĺ ć`çäéŹę@ęřë`ëěěě0ěěĐíDî8ďlđ€ń(ń¤ňDóDő÷¤ůPůÔú úHúüTýđ˙Źd °8ŕ „  PLxXÜ@¤č,ôčhœŘLŹ”PĐ˜đX  €!!¤"`"ŕ#T#Ě$4$€$ŕ%D%œ&L&&ŕ'0'˜(D)ř+ř-8/h13Đ9Ě;(=x>8>đ?´A4B°DETF˜GGDGxG¨GŘH0HLHhH„H¨HĚHčIIüJ¨K|KřLxM˜N|NčOTOOĐOřP PHPpP˜PŔPčQQtQäRR@RlR˜RČSlS”SźT T\T„T´TäUU\U°UÜVVLVVŕW,WxWÄXXlXŕY|YÔZZt[[´\X]4]Đ^ü`0`Ča(aˆaÄaěbb4bxbĚbÜcc4c\c„c´cäddDdčede¸eđff<fźg g€g”gźh8hXhxh˜h¸hČhđii@ihii¸iŕjj0jTjtj˜jźjŕkk,kXk„k°kÄkÔkül lPlČmhmđnn n8nPnhn€n˜n°nČnŕnřoo(o@oXopoˆo o¸oĐočppp0pHp`pxpp¨pŔpŘpđqq q8qPqhq€q˜q°qČqŕqřrr(r@rXrprˆr r¸rĐrŕs|sŒsœs´sĚsäsüt t„t”udutv(v\v v°vŔvŘvđwww(w\wlw|w”w¤wźwĚwäwôx xx4xDx\xtxŒx¤xźxÔxěyyy4yLydyty¨yŔyŘyđzz z8zPzhz€z˜z°zČzŕzř{{({@{X{h||h|ě}}}4}L}\}Ä}Ü}ô~~\~t~Œ~œp€€ €¸€Đ€čŕ‚dƒƒƒ0ƒHƒ`ƒpƒč„L„Ą܄ô… …$…4…ŕ†8†Č†ŕ†ř‡‡(‡@‡X‡p‡ˆ‡ ‡¸‡Đ‡č‡řˆÄ‰0‰¸‰ČŠ<ŠtŠźŠĚ‹h‹ěŒ|Œ”ŒŹŒÄŒÜŒědŽ ްŽŔTd 8Ph€˜°Čŕř‘L‘´‘´‘´‘´‘´‘´’D’T’d’t’„’”’¤’´’Ä’Ô’ä’ô“““$“4“D“T“d“t“„“”“¤“´“ēԓä“ô”””$”4”D”T”d”t”„”””¤”´”ĔԔä”ô•••$•4•D•T•d•t•„•”•¤•´•ĕԕä•ô–––$–P–Č—P˜|™™„ššLš€šÔ››D›p›ôœ œ<œXœtœźœäœü PÄž`žüŸŔ x ¨ ĚĄĄ$ĄDĄ”˘ ˘tŁ$ŁDŁ\Łtٌ٤Łź¤l¤„¤ä¤üĽĽ$ Y +k™W_ŔB]„ˇ â @ Ž “Ô4Ň ž    S  b  • Č ď " :R &Ź hhCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBookBookDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoVersion 2.29Version 2.29DejaVuSansMonoDejaVuSansMonoDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License˙~Z Y  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aŹŁ„…˝–膎‹Š¤ŠÚƒ“ň󍗈ĂŢńžŞőôö˘­ÉÇŽbcdËeČĘĎĚÍÎéfÓĐŃŻgđ‘ÖÔŐhëí‰jikmln oqprsutvwęxzy{}|¸Ą~€ěîşýţ    ˙ řů !"#$%&'()*+ú×,-./0123456789:âă;<=>?@ABCDEFGHI°ąJKLMNOPQRSűüäĺTUVWXYZ[\]^_`abcdefghiťjklmćçnopqrstuvwxyz{|}~€Ś‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘Řá’“”•–—˜™š›ŰÜÝŕŮßœžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙     Ÿ !"#$%&'›()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖײłŘŮśˇÄÚ´ľĹۂ‡ÜŤÝĆŢßŕáâăäžżĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙     ÷ !"#$%&'()*+,-./Œ0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł˜´ľś¨ˇ¸šşťź˝š™ďžżŔÁÂĽĂÄŒĆÇČÉĘ˜ĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚ§ŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóô”•őö÷řůúűüýţ˙      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { |š } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙            ŔÁ               ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   Ą ˘ Ł ¤ Ľ Ś § ¨ Š Ş Ť Ź ­ Ž Ż ° ą ˛ ł ´ ľ ś ˇ ¸ š ş ť ź ˝ ž ż Ŕ Á Â Ă Ä Ĺ Ć Ç Č É Ę Ë Ě Í Î Ď Đ Ń Ň Ó Ô Ő Ö × Ř Ů Ú Ű Ü Ý Ţ ß ŕ á â ă ä ĺ ć ç č é ę ë ě í î ď đ ń ň ó ô ő ö ÷ ř ů ú ű ü ý ţ ˙                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni0674uni0679uni067Auni067Buni067Euni067Funi0680uni0683uni0684uni0686uni0687uni0691uni0698uni06A4uni06A9uni06AFuni06BEuni06CCuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni2045uni2046uni2047uni2048uni2049uni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimatedonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangle logicaland logicalor intersectionunionuni222Cuni222Duni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Funi2290uni2291uni2292 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1dotmathuni22C6uni22CDuni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni2341uni2342uni2343uni2344uni2347uni2348uni2349uni234Buni234Cuni234Duni2350uni2352uni2353uni2354uni2357uni2358uni2359uni235Auni235Buni235Cuni235Euni235Funi2360uni2363uni2364uni2365uni2368uni2369uni236Buni236Cuni236Duni236Euni236Funi2370uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27C5uni27C6uni27E0uni27E8uni27E9uni29EBuni29FAuni29FBuni2A2Funi2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Euni2C6Funi2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2E18uni2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA789uniA78AuniA78BuniA78CuniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D670u1D671u1D672u1D673u1D674u1D675u1D676u1D677u1D678u1D679u1D67Au1D67Bu1D67Cu1D67Du1D67Eu1D67Fu1D680u1D681u1D682u1D683u1D684u1D685u1D686u1D687u1D688u1D689u1D68Au1D68Bu1D68Cu1D68Du1D68Eu1D68Fu1D690u1D691u1D692u1D693u1D694u1D695u1D696u1D697u1D698u1D699u1D69Au1D69Bu1D69Cu1D69Du1D69Eu1D69Fu1D6A0u1D6A1u1D6A2u1D6A3u1D7F6u1D7F7u1D7F8u1D7F9u1D7FAu1D7FBu1D7FCu1D7FDu1D7FEu1D7FF dlLtcaron DiaeresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.altuni066Euni066Funi067Cuni067Duni0681uni0682uni0685uni0692uni06A1uni06B5uni06BAuni06C6uni06CEuni06D5š€˛”]A–€ţţţţšţ ˛ëGA% } % 2 – ţţ%ţ%ţ@Yţţţý}üţűţú2ůťř}÷öŒ÷ţ÷ŔöőYöŒö€őô&őYő@ô&óň/óúň/ńţđţď2îí–ěëGěţě¸˙Ń@˙ëGęédę–édčţçćçţćĺţäkăţâťáŕáúŕߖŢţÝţÜŰÜţŰږŮŘŮţ؍ Ř×}Ö:Ս Ő:ÔţÓŇ ÓţŇ ŃţĐţϊĎÎÍţ̖ˋ%ËţĘţÉ}ČţÇţĆţŚ ÄţĂţÂţÁţŔ Ŕż ž˝ťžţ˝ź]˝ť˝€źť%ź]ź@ť%şţš–¸AˇţśAśúľš ´ţłd˛dą°ŻţŽţ@ý­ţŹţŤŞţЍŠ2¨§Ś§(ŚĽ¤-Ľ}¤-Łţ˘ţĄţ Ÿ dŸžŸž œţ›š ›ţš ™˜.™ţ˜.—A—––•ť–ţ•”]•ť•€”%”]”@“ţ’ţ‘%‘ť%‹%AŽ Ž Œ‹%Œd‹Š‹%Љţˆţ‡ţ†…†ţ…„ţƒţ‚B‚Sţ€x~}ţ~}}|ţ{zţwţvţut uu¸@Út tŔss@rţqţpţonSo–nm(nSm(lţk2jţi2húgťfţeţdţcbcţbbaţ`ţ_ţ^Z ^]d\Č[Z [Z YţXWţVţUU2TţSţRţQ}PţONţM-MţLťK(JIJ7ICIHEHţGCGdFEFťEDCD7CBCC¸@@ BABB¸@ A@AA¸Ŕ@ @? @@¸€@ ? ? ?¸@@d>ţ=-=ú<ţ;(:ţ9B9d818K7ţ6-6ţ5K404K303ţ2B2ţ1-10/-/. .ť-,--¸€@ ,,,¸@@–+*%+ţ* *%):)ţ(ţ'ţ&%B%E$#ţ""ţ! -!} -KBţţţţţţBF-B-Bţ-B¸@  ¸Ŕ@   ¸€@    ¸@´  ¸@7 ţ  ţ ţ-ţ:ú-:-¸d…++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++munin-2.0.25/master/MasterBuilder.pm000066400000000000000000000001721243472346000173260ustar00rootroot00000000000000package MasterBuilder; # $Id$ use base qw(Module::Build); use lib '../common/blib/lib'; use warnings; use strict; 1; munin-2.0.25/master/_bin/000077500000000000000000000000001243472346000151355ustar00rootroot00000000000000munin-2.0.25/master/_bin/munin-cgi-graph.in000077500000000000000000000343011243472346000204560ustar00rootroot00000000000000#!@@PERL@@ -T # -*- cperl -*- =begin comment Copyright (C) 2004-2010 Jimmy Olsen, Steve Schnepp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . $Id$ =end comment =cut use strict; use warnings; use IO::Handle; BEGIN { no warnings; $Date::Manip::Backend = 'DM5'; } use Date::Manip; use POSIX qw(strftime locale_h); use CGI::Fast qw(:cgi); use CGI::Carp qw(fatalsToBrowser); use Time::HiRes qw(gettimeofday tv_interval); use Munin::Master::GraphOld; use Munin::Master::Utils; use Munin::Master::Logger; use Log::Log4perl qw( :easy ); my $GRAPHER = "$Munin::Common::Defaults::MUNIN_LIBDIR/munin-graph"; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; my %period = ( "day" => 300, "week" => 1800, "month" => 7200, "year" => 86400, "week-sum" => 1800, "year-sum" => 86400 ); my $logfile; my $scale = "day"; my @params ; push @params, "--config", $ENV{'MUNIN_CONFIG'} if (defined $ENV{'MUNIN_CONFIG'}); push @params, "--no-fork"; # FastCgi forks for us push @params, "--skip-locking", "--skip-stats", "--nolazy"; push @params, "--log-file", $logfile; my $config = graph_startup(\@params); logger_open($config->{'logdir'}); logger_debug() if defined($ENV{CGI_DEBUG}); # BEGIN FAST-CGI LOOP: setlocale (LC_TIME, 'C'); my $nb_request = 0; my $nb_request_max = 0; while (new CGI::Fast) { # 1rst thing is to validate the URL. Only a subset of chars are allowed. # Return 404 if not compliant, w/o logging. # This fixes http://bugs.debian.org/668666 and closes a lots of other potential bugs. if ( has_offending_chars($ENV{PATH_INFO}) || has_offending_chars($ENV{QUERY_STRING}) ) { # If parameters are not valid, just pretend we didn't find anything. print "Status: 404 Not Found\r\n", "Content-Type: image/png\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request: $nb_request/$nb_request_max\r\n", "\r\n"; next; } my $pinpoint = undef; my $path = $ENV{PATH_INFO} || ""; DEBUG "Request path is $path"; # The full URL looks like this: # Case 1: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # Backend/dafnes.client.example.com/diskstats_iops-week.png # $path should be # /client/Backend/dafnes.client.example.com/diskstats_iops-week.png # # Interesting bits about that url: Nested groups! # # Case 2: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # Backend/dafnes.client.example.com/diskstats_iops/sda-week.png # $path should be # /client/Backend/dafnes.client.example.com/diskstats_iops/\ # sda-week.png # # Interesting bit that url: Nested groups at the start and multigraph # nesting bits at the end. # # Case 3: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # dafnes.client.example.com/if_err_bond0-day.png # $path: # /client/dafnes.client.example.com/if_err_bond0-day.png # # Simplest (old munin 1.2): No nesting at any end, fixed number of /es # # Despite the slippery structure of the $path this expression works with # the rest of the code. To make a more scientific try we would need to # split on / and traverse the $config to determine what kind of part # (domain, nested domain, host, service/plugin, or nested service) # we're looking at. # # Scale will in any case work out since - is only used before the # day/week/month/year/pinpoint part, and the next part is always .png. # # Note: $serv *may* have some "-" inside (See #1218) my ($dom, $host, $serv, $scale) = $path =~ m#^/(.*)/([^/]+)/([\w-]+)-([\w=,]+)\.png#; ## avoid bug in vim DEBUG "asked for ($dom, $host, $serv, $scale)"; if ($scale =~ /pinpoint=(\d+),(\d+)/) { $pinpoint = [ $1, $2, ]; } if (! &verify_parameters ($dom, $host, $serv, $scale)) { # If parameters are not valid, just say we didn't find anything. print "Status: 404 Not Found\r\n", "Content-Type: image/png\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request: $nb_request/$nb_request_max\r\n", "\r\n"; next; } # Environment variables are cleared each request # so we must set RRDCACHED_ADDRESS each time $ENV{RRDCACHED_ADDRESS} = $config->{rrdcached_socket} if $config->{rrdcached_socket}; my $filename = get_picture_filename ($config, $dom, $host, $serv, $scale, $ENV{QUERY_STRING}); my $time = time; # If a "Cache-Control: no-cache" header gets send, we regenerate the image in every case: # Removed $pinpoint from the $no_cache expression - janl 2010-09-29 my $no_cache = defined($ENV{HTTP_CACHE_CONTROL}) && $ENV{HTTP_CACHE_CONTROL} =~ /no-cache/i; # Be able to deactivate the cache with the url if (defined(CGI::param("no_cache")) && CGI::param("no_cache") eq "yes") { $no_cache = 1; } # Having some QUERY_STRING disables the cache. if (defined($ENV{QUERY_STRING}) && $ENV{QUERY_STRING} ne "") { $no_cache = 1; } # Compute the cache values # FIXME: Take the plugins update_rate into account here, at least for # the day graph. update_rate should be in $config # my $graph_ttl = $pinpoint ? 1 : $period{$scale}; my $graph_ttl = $period{$scale} || 1; my $graph_last_expires = $time - ($time % $graph_ttl); my $graph_epoch = (! $no_cache) && file_newer_than($filename, $graph_last_expires); if ($graph_epoch) { # The graph is fresh enough. Sending either IMS if asked, or # just skip generation # Check for If-Modified-Since and send 304 if not changed: if (defined $ENV{HTTP_IF_MODIFIED_SINCE} && ! rfctime_newer_than($ENV{HTTP_IF_MODIFIED_SINCE}, $graph_epoch)) { my $headers = get_headers_for_file($filename, $graph_ttl); print "Status: 304\r\n", "Content-Type: image/png\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request: $nb_request/$nb_request_max\r\n", "Content-Length: 0\r\n", "Expires: $headers->{Expires}\r\n", "Last-Modified: ", $headers->{"Last-Modified"}, "\r\n". "\n"; # We replied, continue with the next request next; } } else { # Should generate it my $scale_options; if ($pinpoint) { $scale_options = "--pinpoint=" . $pinpoint->[0] . "," . $pinpoint->[1]; } else { $scale_options = "--$scale"; } # Try to generate the graph my $generated_file = eval { draw_graph_or_complain($dom, $host, $serv, $scale_options, $filename); }; # handle exceptions if ($@) { if ($@ =~ m/^Could not find FQN/) { # Unknown graph asked print "Status: 404 Not Found\r\n", "Content-Type: image/png\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request: $nb_request/$nb_request_max\r\n", "\r\n"; # Next item next; } # Generic error # .. we DO NOT DIE, as spawn-fcgi doesn't like it. ERROR "[ERROR] $@"; print "Status: 500\r\n", "Content-Type: text/plain\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request $nb_request/$nb_request_max\r\n", ""; next; } # draw_graph_or_complain return 0, but already displayed a message next unless ($generated_file); } # Now send it: headers print "Status: 200\r\n", "Content-Type: image/png\r\n", "X-Munin-Pid: $$\r\n", "X-Munin-Request: $nb_request/$nb_request_max\r\n", ""; my $headers = get_headers_for_file($filename, $graph_ttl); foreach my $header_name (keys %$headers) { print "$header_name: $headers->{$header_name}\r\n"; } print "\r\n"; # ... and graph data send_graph_data($filename); # If $no_cache, remove the file. No need to keep it anyway. # And it handles http://bugs.debian.org/668667 unlink($filename) if $no_cache; } continue { $nb_request++; if ($nb_request_max && $nb_request > $nb_request_max) { # Cycle last; } } # END FAST-CGI LOOP - Time to die. Nicely. exit 0; sub get_headers_for_file { my ($filename, $graph_ttl) = @_; # At this time the file exists and should be served my @stats = stat ($filename); my $mtime_epoch = $stats[9]; my $last_modified = get_w3c_date_from_epoch($mtime_epoch); # "Expires" has to use last modified time as base: my $graph_next_expires = $mtime_epoch - ($mtime_epoch % $graph_ttl) + $graph_ttl; my $expires = get_w3c_date_from_epoch($graph_next_expires); return { "Expires" => $expires, "Last-Modified" => $last_modified, "Content-Length" => $stats[7], }; } sub get_w3c_date_from_epoch { my($epoch) = @_; return strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime($epoch)); } sub send_graph_data { # Serve the graph contents. my($filename) = @_; my $buffer; if (! open (GRAPH_PNG_FILE, '<', $filename) ) { ERROR "[FATAL] Could not open image file \"$filename\" for reading: $!\n"; # We don't send anything... # .. we DO NOT DIE, as spawn-fcgi doesn't like it. return; } # No buffering wanted when sending the file local $| = 1; while (sysread(GRAPH_PNG_FILE,$buffer,40960)) { print $buffer; } close (GRAPH_PNG_FILE); } sub get_picture_filename { my $config = shift; my $domain = shift; my $name = shift; my $service = shift; my $scale = shift; my $params = shift; # XXX - hack to fix cgitmpdir default $config->{cgitmpdir} ||= "$Munin::Common::Defaults::MUNIN_DBDIR/cgi-tmp"; my $cgi_tmp_dir = $config->{cgitmpdir} . "/munin-cgi-graph"; $params = $params ? "?$params" : ""; $params =~ tr/\//_/; # / are forbidden in a filename $params = $1 if $params =~ m/(.*)/; # XXX - Q&D untaint return "$cgi_tmp_dir/$domain/$name/$service-$scale.png" . $params; } sub has_offending_chars { my $url_part = shift; return 0 if ! defined $url_part; # "." and ":" are for ip_ in IPv4 & IPv6 return $url_part =~ m:[^a-zA-Z0-9_/.,=&\:-]:; } sub verify_parameters { my $dom = shift; my $host = shift; my $serv = shift; my $scale = shift; if (!$dom) { WARN '[WARNING] Request for graph without specifying domain. Bailing out.'; return 0; } if (!$host) { WARN '[WARNING] Request for graph without specifying host. Bailing out.'; return 0; } if (!$serv) { WARN '[WARNING] Request for graph without specifying service. Bailing out.'; return 0; } if (!$scale) { WARN '[WARNING] Request for graph without specifying scale. Bailing out.'; return 0; } else { if (!defined $period{$scale} && $scale !~ /pinpoint=\d+,\d+/) { WARN '[WARNING] Weird pinpoint setting "'.$scale.'". Bailing out.'; return 0; } } # Checks the image size requested. if (( CGI::param("size_x") || "") =~ m/^(\d+)/) { my $max_size_x = ( $config->{max_size_x} || 4000); if ($1 > $max_size_x) { WARN "[WARNING] Asked image size x too large : $1 > $max_size_x. Bailing out."; return 0; } } if (( CGI::param("size_y") || "") =~ m/^(\d+)/) { my $max_size_y = ($config->{max_size_y} || 4000); if ($1 > $max_size_y) { WARN "[WARNING] Asked image size y too large : $1 > $max_size_y. Bailing out."; return 0; } } return 1; } sub file_newer_than { my $filename = shift; my $time = shift; if (-f $filename) { my @stats = stat (_); # $stats[9] holds the "last update" time and this needs # to be in the last update period my $last_update = $stats[9]; if ($last_update > $time) { return $last_update; } else { return 0; } } # No file found return 0; } sub draw_graph { my $dom = shift; my $host = shift; my $serv = shift; my $scale = shift; my $filename = shift; # remove old file if present if (-f $filename and !unlink($filename)) { ERROR "[FATAL] Could not remove \"$filename\": $!"; } $serv =~ s{[^\w_\/"'\[\]\(\)+=-]}{_}g; $serv =~ /^(.+)$/; $serv = $1; #" # . needs to be legal in host names $host =~ s{[^\w_\/"'\[\]\(\)\.+=-]}{_}g; $host =~ /^(.+)$/; $host = $1; #" # FIXME: Make "root" implied! my @params = ( '--host', $host, '--only-fqn', "root/$dom/$host/$serv", $scale, '--output-file', $filename ); # Sets the correct size on a by_graph basis push @params, "--size_x", CGI::param("size_x") if (defined(CGI::param("size_x"))); push @params, "--size_y", CGI::param("size_y") if (defined(CGI::param("size_y"))); push @params, "--upper_limit", CGI::param("upper_limit") if (CGI::param("upper_limit")); push @params, "--lower_limit", CGI::param("lower_limit") if (CGI::param("lower_limit")); # Sometimes we want to set the IMG size, and not the canvas. push @params, "--full_size_mode" if (CGI::param("full_size_mode")); # Sometimes we want only the graph. Nothing else. push @params, "--only_graph" if (CGI::param("only_graph")); # XXX - the debug param is sticky. It really should be per request. push @params, "--debug" if (CGI::param("debug")); graph_main(\@params); return $filename; } sub draw_graph_or_complain { my $t0 = [ gettimeofday ]; # Actuall work done here. my $ret = draw_graph(@_); my $graph_duration = tv_interval($t0); if (! -f $ret) { my ($dom, $host, $serv, $scale, $filename ) = @_; WARN "[WARNING] Could not draw graph \"$filename\": $ret"; print "Status: 500\r\n", "Content-Type: text/plain\r\n", "\r\n", "Could not draw graph \"$filename\"\r\n"; return 0; } else { print "X-Graph-Duration: $graph_duration\r\n"; return $ret; } } sub rfctime_newer_than { # See if the file has been modified since "the last time". # Format of since_string If-Modified-Since: Wed, 23 Jun 2004 16:11:06 GMT my $since_string = shift; my $created = shift; my $ifmodsec = &UnixDate (&ParseDateString ($since_string), "%s"); return 1 if ($ifmodsec < $created); return 0; } # vim: syntax=perl ts=8 munin-2.0.25/master/_bin/munin-cgi-html.in000077500000000000000000000102201243472346000203130ustar00rootroot00000000000000#!@@PERL@@ -T # -*- cperl -*- =begin comment Copyright (C) 2004-2010 Jimmy Olsen, Steve Schnepp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . =end comment =cut use strict; use warnings; use POSIX qw(strftime); use CGI::Fast qw(:cgi); use CGI::Carp qw(fatalsToBrowser); use Time::HiRes qw(time); use Munin::Master::HTMLConfig; use Munin::Master::HTMLOld; use Munin::Master::Utils; use Munin::Master::Logger; use Log::Log4perl qw( :easy ); use Data::Dumper; my @times = ("day", "week", "month", "year"); my $config; my $lastchanged = 0; my @params; push @params, "--config", $ENV{'MUNIN_CONFIG'} if (defined $ENV{'MUNIN_CONFIG'}); # grab config html_startup(\@params); while(new CGI::Fast){ print header("text/html"); $config = get_config(1); show_page(); } sub show_page { my @path = split(/\//, $ENV{PATH_INFO}); emit_page(\@path); } sub get_next_part { my $path = shift; my $part; do { $part = shift(@$path); } while(defined $part && $part eq ""); return $part; } sub emit_page { my $path = shift; my $group = $config; #process groups $group = traverse_groups($path, $group); update_timestamp(); if(!defined $group->{"depth"} || $group->{"depth"} == 0){ #root url my $problems = get_next_part($path); if(defined $problems && $problems eq "problems.html"){ emit_problem_template(1); } else { unshift(@$path, $problems); (my $category, my $time) = get_global_category($path, $group); if(defined $category){ emit_category_template($category, $time, 1); } else { emit_main_index($group->{"groups"},0,1); } } } elsif(!$group->{"ncategories"}) { # group my $cmp_time = get_comparison_group($path, $group); if(defined $cmp_time){ # comparison template emit_comparison_template($group, $cmp_time, 1); } else { #group page emit_group_template($group, 1); } } else { #node my $service = get_node_service($path, $group); if(defined $service){ emit_service_template($service, 1); } else { emit_graph_template($group, 1); } } } sub traverse_groups { my ($path, $group) = @_; my $part = get_next_part($path); while(defined $part && (defined $group->{"groups_hash"}->{$part})) { $group = $group->{"groups_hash"}->{$part}; $part = get_next_part($path); } if(defined $part){ unshift(@$path,$part); # put the unprocessed part back on } return $group; } sub get_comparison_group { my ($path, $group) = @_; if(!$group->{"compare"}){ return undef; } # group is not a comparison group my $part = get_next_part($path); if(defined $part && $part =~ m/^comparison-([a-z]+)\.html/i){ if(grep /^$1$/, @times){ return lc $1; } } if(defined $part){ unshift(@$path, $part); #put the unprocessed part back on } return undef; } sub get_global_category { my ($path, $group) = @_; my $part = get_next_part($path); if(!defined $part){ return undef; } foreach my $category (@{$group->{"globalcats"}}) { foreach my $time (@times) { if($category->{"url" . $time} eq $part){ return ($category, $time); } } } return undef; } sub get_node_service { my ($path, $group) = @_; my $part = get_next_part($path); if(!defined $part){ return undef; } foreach my $category (@{$group->{"categories"}}) { foreach my $service (@{$category->{"services"}}) { if($part eq $service->{"node"}.".html"){ return $service; } } } return undef; } # CGI in perl 5.20 is now seriously broken as it doesn't import into the namespace. # So we have to delegate explicitely. It's easier than prefixing with CGI:: each use. sub header { return CGI::header(@_); } sub path_info { return CGI::path_info(@_); } sub url { return CGI::url(@_); } sub script_name { return CGI::script_name(@_); } munin-2.0.25/master/_bin/munin-check.in000066400000000000000000000101621243472346000176660ustar00rootroot00000000000000#!@@BASH@@ # -*- sh -*- # Copyright (C) 2008 Matthias Schmitz # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 dated June, # 1991. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # $Id$ #### # prints usage function usage() { echo "Usage: munin-check [options] Options: -h|--help Show this help. -f|--fix-permissions Fix the permissions of the munin dirs and files. Needs superuser rights. Please don't use this script if you are using 'graph_strategy cgi'! It doesn't care about the right permissions for www-data yet... " } # Get options from the command line TEMP=$(getopt -o fh --long fix-permissions,help -n 'munin-check' -- "$@") if [[ $? -ne 0 ]]; then echo "Terminating..." >&2 exit 1 fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while :; do case "$1" in -h|--help) usage ; exit 0; shift ;; -f|--fix-permissions) PLEASE_FIXME="true" ; shift ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done #### # sets owner to "@@USER@@" function fix_owner() { fix_object=$1; shift fix_owner=$1; shift if [[ $(id -u) -eq 0 ]]; then # -R is wrong, in case we're not recursing, and if we are # recursing then fix_owner will be called again. OK, that's # slower, but still more correct. chown $fix_owner $fix_object; else echo "Fixing the permissions needs superuser rights. You should run \"munin-check -f\" as root." exit 0; fi } #### # check if "@@USER@@" is owner, if PLEASE_FIXME set it calls fix_owner() function owner_ok() { object=$1; shift || exit 1 correctowner=$1; shift || exit 1 owner=$(ls -ld $object | awk '{print $3}') if [[ "$owner" != "$correctowner" ]]; then echo "# $object : Wrong owner ($owner != $correctowner)"; if [[ "$PLEASE_FIXME" == "true" ]]; then fix_owner $object $correctowner fi fi if [[ -d $object ]]; then if [[ -n "$norec" ]]; then # The $norec variable cuts off recursion return 0 fi case $object in "lost+found") return 0;; esac # ... and then dive into it for subobject in $object/*; do owner_ok $subobject $correctowner done fi } function perm_ok(){ object=$1; shift || exit 1 correctperm=$1; shift || exit 1 perm=$(perl -e 'printf "%o\n", 07777 & (stat $ARGV[0])[2]' $object) if [[ $perm -ne $correctperm ]]; then echo "# $object : Wrong permissions ($perm != $correctperm)"; if [[ "$PLEASE_FIXME" == "true" ]]; then chmod $correctperm $object fi fi if [[ -d $object ]]; then # check the owner of the dir ... if [[ -n "$norec" ]]; then # The $norec variable cuts off recursion return 0 fi case $object in "lost+found") return 0;; esac # ... and then dive into it for subobject in $object/*; do perm_ok $subobject $correctperm done fi } #### # main echo "check @@HTMLDIR@@" owner_ok @@HTMLDIR@@ @@USER@@ for dir in @@DBDIR@@/*; do # Do not check the plugin-state directory case $dir in */plugin-state) continue;; esac echo "check $dir" owner_ok $dir @@USER@@ done echo "check miscellaneous" norec=yes owner_ok @@LOGDIR@@ @@USER@@ norec=yes owner_ok @@DBDIR@@ @@USER@@ norec=yes perm_ok @@DBDIR@@ 755 for dir in @@DBDIR@@/datafile @@DBDIR@@/limits @@DBDIR@@/*.stats; do norec=yes owner_ok $dir @@USER@@ norec=yes perm_ok $dir 644 done norec=yes owner_ok @@PLUGSTATE@@ @@PLUGINUSER@@ norec=yes perm_ok @@PLUGSTATE@@ 775 norec=yes perm_ok @@CONFDIR@@/plugin-conf.d 755 echo "Check done. Please note that this script only checks most things," echo "not all things." echo echo "Please also note that this script may be buggy." echo munin-2.0.25/master/_bin/munin-cron.in000077500000000000000000000011651243472346000175600ustar00rootroot00000000000000#!@@GOODSH@@ # This used to test if the executables were installed. But that is # perfectly redundant and supresses errors that the admin should see. @@LIBDIR@@/munin-update $@ || exit 1 # The result of munin-limits is needed by munin-html but not by # munin-graph. So run it in the background now, it will be done # before munin-graph. @@LIBDIR@@/munin-limits $@ # We always launch munin-html. # It is a noop if html_strategy is "cgi" nice @@LIBDIR@@/munin-html $@ || exit 1 # The result of munin-html is needed for munin-graph. # It is a noop if graph_strategy is "cgi" nice @@LIBDIR@@/munin-graph --cron $@ || exit 1 munin-2.0.25/master/_bin/munin-datafile2storable.in000077500000000000000000000003321243472346000222010ustar00rootroot00000000000000#!@@PERL@@ # $Id$ use strict; use warnings; use Data::Dumper; use Storable; use Munin::Master::Utils; while (my $file = shift) { my $config = munin_readconfig_raw($file); Storable::nstore_fd($config, \*STDOUT); } munin-2.0.25/master/_bin/munin-graph.in000077500000000000000000000206261243472346000177230ustar00rootroot00000000000000#!@@PERL@@ # -*- cperl -*- =encoding utf8 =begin comment Copyright (C) 2004-2010 Jimmy Olsen, Steve Schnepp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . $Id$ =end comment =cut use strict; use warnings; use IO::Handle; BEGIN { # This is needed because Date::Manip has deprecated the functional # interface in >= 6.x. So, we force the use of the 5.x API. $Date::Manip::Backend = 'DM5'; # Double line here to avoid spurious warnings about D::M::Backend being # used only once. $Date::Manip::Backend = 'DM5'; } use Date::Manip; use POSIX qw(strftime); use Time::HiRes qw(gettimeofday tv_interval); use IO::File; use Munin::Master::GraphOld; use Munin::Master::Utils; use Munin::Master::Logger; use Log::Log4perl qw( :easy ); my $GRAPHER = "$Munin::Common::Defaults::MUNIN_LIBDIR/munin-graph"; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; my %period = ( "day" => 300, "week" => 1800, "month" => 7200, "year" => 86400, "week-sum" => 1800, "year-sum" => 86400 ); my $logfile; my $scale = "day"; my @params = @ARGV; push @params, "--no-fork"; # We do *not* want to fork. Perf -> FastCGI push @params, "--log-file", $logfile; my $config = graph_startup(\@params); logger_open($config->{'logdir'}); logger_debug() if $config->{debug} or defined($ENV{CGI_DEBUG}); if (! graph_check_cron() ) { # Should not be launched from cron. INFO "[INFO] graphing is cgi, do nothing"; exit 0; } # BEGIN FAST-CGI LOOP: my $nb_request = 0; my $nb_request_max = 0; my $graph_fh = new IO::File($config->{dbdir} . "/graphs"); while (my $path = <$graph_fh>) { my $pinpoint = undef; DEBUG "Request path is $path"; # The full URL looks like this: # Case 1: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # Backend/dafnes.client.example.com/diskstats_iops-week.png # $path should be # client/Backend/dafnes.client.example.com/diskstats_iops-week.png # # Interesting bits about that url: Nested groups! # # Case 2: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # Backend/dafnes.client.example.com/diskstats_iops/sda-week.png # path should be # client/Backend/dafnes.client.example.com/diskstats_iops/\ # sda-week.png # # Interesting bit that url: Nested groups at the start and multigraph # nesting bits at the end. # # Case 3: # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\ # dafnes.client.example.com/if_err_bond0-day.png # path: # client/dafnes.client.example.com/if_err_bond0-day.png # # Simplest (old munin 1.2): No nesting at any end, fixed number of /es # # Despite the slippery structure of the $path this expression works with # the rest of the code. To make a more scientific try we would need to # split on / and traverse the $config to determine what kind of part # (domain, nested domain, host, service/plugin, or nested service) # we're looking at. # # Scale will in any case work out since - is only used before the # day/week/month/year/pinpoint part, and the next part is always .png. # my ($dom, $host, $serv, $scale) = $path =~ m#^/(.*)/([^/]+)/(\w+)-([\w=,]+)\.png#; ## avoid bug in vim DEBUG "asked for ($dom, $host, $serv, $scale)"; if ($scale =~ /pinpoint=(\d+),(\d+)/) { $pinpoint = [ $1, $2, ]; } if (! &verify_parameters ($dom, $host, $serv, $scale)) { ERROR "Invalid parameters!"; next; } my $filename = get_picture_filename ($config, $dom, $host, $serv, $scale, $ENV{QUERY_STRING}); my $time = time; my $no_cache = 0; # Compute the cache values my $graph_ttl = $period{$scale} || 1; my $graph_last_expires = $time - ($time % $graph_ttl); if ($pinpoint || ! -f $filename || (stat(_))[9] < $graph_last_expires) { # Should generate it my $scale_options; if ($pinpoint) { $scale_options = "--pinpoint=" . $pinpoint->[0] . "," . $pinpoint->[1]; } else { $scale_options = "--$scale"; } next unless draw_graph_or_complain($dom, $host, $serv, $scale_options, $filename); } # Now send it: headers DEBUG "X-Munin-Request: $nb_request/$nb_request_max"; } continue { $nb_request++; if ($nb_request_max && $nb_request > $nb_request_max) { # Cycle last; } } # END FAST-CGI LOOP - Time to die. Nicely. exit 0; sub get_w3c_date_from_epoch { my($epoch) = @_; return strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime($epoch)); } sub send_graph_data { # Serve the graph contents. my($filename) = @_; my $buffer; if (! open (GRAPH_PNG_FILE, '<', $filename) ) { ERROR "[FATAL] Could not open image file \"$filename\" for reading: $!\n"; die "[FATAL] Could not open image file \"$filename\" for reading: $!\n"; } # No buffering wanted when sending the file local $| = 1; while (sysread(GRAPH_PNG_FILE,$buffer,40960)) { print $buffer; } close (GRAPH_PNG_FILE); } sub get_picture_filename { my $config = shift; my $domain = shift; my $name = shift; my $service = shift; my $scale = shift; my $params = shift; my $cgi_tmp_dir = $config->{htmldir}; $params = $params ? "?$params" : ""; $params =~ tr/\//_/; # / are forbidden in a filename $params = $1 if $params =~ m/(.*)/; # XXX - Q&D untaint return "$cgi_tmp_dir/$domain/$name/$service-$scale.png" . $params; } sub verify_parameters { my $dom = shift; my $host = shift; my $serv = shift; my $scale = shift; if (!$dom) { WARN '[WARNING] Request for graph without specifying domain. Bailing out.'; return 0; } if (!$host) { WARN '[WARNING] Request for graph without specifying host. Bailing out.'; return 0; } if (!$serv) { WARN '[WARNING] Request for graph without specifying service. Bailing out.'; return 0; } if (!$scale) { WARN '[WARNING] Request for graph without specifying scale. Bailing out.'; return 0; } else { if (!defined $period{$scale} && $scale !~ /pinpoint=\d+,\d+/) { WARN '[WARNING] Weird pinpoint setting "'.$scale.'". Bailing out.'; return 0; } } return 1; } sub file_newer_than { my $filename = shift; my $time = shift; if (-f $filename) { my @stats = stat (_); # $stats[9] holds the "last update" time and this needs # to be in the last update period my $last_update = $stats[9]; if ($last_update > $time) { return $last_update; } else { return 0; } } # No file found return 0; } sub draw_graph { my $dom = shift; my $host = shift; my $serv = shift; my $scale = shift; my $filename = shift; # remove old file if present if (-f $filename and !unlink($filename)) { ERROR "[FATAL] Could not remove \"$filename\": $!"; die("[FATAL] cannot remove old graph file \"$filename\": $!"); } $serv =~ s{[^\w_\/"'\[\]\(\)+=-]}{_}g; $serv =~ /^(.+)$/; $serv = $1; #" # . needs to be legal in host names $host =~ s{[^\w_\/"'\[\]\(\)\.+=-]}{_}g; $host =~ /^(.+)$/; $host = $1; #" # FIXME: Make "root" implied! my @params = ( '--host', $host, '--only-fqn', "root/$dom/$host/$serv", $scale, '--output-file', $filename ); graph_main(\@params); return $filename; } sub draw_graph_or_complain { my $t0 = [ gettimeofday ]; # Actuall work done here. my $ret = draw_graph(@_); my $graph_duration = tv_interval($t0); if (! -f $ret) { my ($dom, $host, $serv, $scale, $filename ) = @_; WARN "[WARNING] Could not draw graph \"$filename\": $ret"; return 0; } else { return $ret; } } sub rfctime_newer_than { # See if the file has been modified since "the last time". # Format of since_string If-Modified-Since: Wed, 23 Jun 2004 16:11:06 GMT my $since_string = shift; my $created = shift; my $ifmodsec = &UnixDate (&ParseDateString ($since_string), "%s"); return 1 if ($ifmodsec < $created); return 0; } # vim: syntax=perl ts=8 munin-2.0.25/master/_bin/munin-html.in000077500000000000000000000053151243472346000175640ustar00rootroot00000000000000#!@@PERL@@ # -*- cperl -*- =encoding utf8 =begin comment Copyright (C) 2002-2009 Jimmy Olsen, Audun Ytterdal, Kjell Magne Øierud, Nicolai Langfeldt, Linpro AS, Redpill Linpro AS and others. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. $Id$ =end comment =cut use warnings; use strict; use Munin::Master::HTMLOld; $|=1; html_startup(\@ARGV); html_main(); # ### The End 1; =head1 NAME munin-html - A program to generate html-pages in an Munin installation =head1 SYNOPSIS munin-html [options] =head1 OPTIONS =over 5 =item B<< --service >> Limit services to those of EserviceE. Multiple --service options may be supplied. [unset] =item B<< --host >> Limit hosts to those of Ehost. Multiple --host options may be supplied. [unset] =item B<< --config >> Use EfileE as configuration file. [/etc/munin/munin.conf] =item B<< --help >> View help message. =item B<< --[no]debug >> If set, view debug messages. [--nodebug] =back =head1 DESCRIPTION Munin-html is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-html creates the html pages. =head1 FILES /etc/munin/munin.conf /var/lib/munin/datafile /var/log/munin/munin-html /var/cache/munin/www/* /var/run/munin/* =head1 VERSION This is munin-html version svn-trunk-r4007 =head1 AUTHORS Knut Haugen, Audun Ytterdal and Jimmy Olsen. =head1 BUGS munin-html does, as of now, not check the syntax of the configuration file. Please report other bugs in the bug tracker at L. =head1 COPYRIGHT Copyright (C) 2002-2009 Knut Haugen, Audun Ytterdal, and Jimmy Olsen / Linpro AS. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =head1 SEE ALSO For information on configuration options, please refer to the man page for F. =cut # vim:syntax=perl:ts=8 munin-2.0.25/master/_bin/munin-limits.in000077500000000000000000000072121243472346000201170ustar00rootroot00000000000000#!@@PERL@@ # -*- cperl -*- =encoding utf8 =begin comment Copyright (C) 2004-2008 Jimmy Olsen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. $Id$ =end comment =cut use warnings; use strict; use Munin::Master::LimitsOld; limits_startup(\@ARGV); limits_main(); # ### The End exit 0; =head1 NAME munin-limits - A program to check for any off-limit values =head1 SYNOPSIS munin-limits [options] =head1 OPTIONS =over 5 =item B<< --service >> Limit services to those of EserviceE. Multiple --service options may be supplied. [unset] =item B<< --host >> Limit hosts to those of Ehost. Multiple --host options may be supplied. [unset] =item B<< --contact >> Limit contacts to those of Econtact. Multiple --contact options may be supplied. [unset] =item B<< --config >> Use EfileE as configuration file. [@@CONFDIR@@/munin.conf] =item B<< --always-send >> Force sending of messages even if you normally wouldn't. The can be a whitespace or comma separated list of the values "ok", "warning", "critical" or "unknown". This option may be specified several times, to add more values. Use of "--always-send" overrides the "always_send" value in munin.conf for configured contacts. See also --force. =item B<< --force >> Alias for "--always-send ok,warning,critical,unknown" =item B<< --[no]force-run-as-root >> Force running as root (stupid and unnecessary). [--noforce-root] =item B<< --help >> View help message. =item B<< --[no]debug >> If set, view debug messages. [--nodebug] =back =head1 DESCRIPTION Munin-limits is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-limits checks if any values are above or below the set limits, and saves these notes to a file. This file is later used by programs like munin-nagios (to warn nagios) and munin-html (to incorporate them in the web display). If a service has fields with "warning" or "critical"-options (e.g. "load.warning 10"), and the munin-server configuration file contains the necessary configuration options, munin-limits will check its value. =head1 FILES @@CONFDIR@@/munin.conf @@DBDIR@@/* @@STATEDIR@@/* =head1 VERSION This is munin-limits version @@VERSION@@ =head1 AUTHORS Knut Haugen, Audun Ytterdal and Jimmy Olsen. =head1 BUGS munin-limits does, as of now, not check the syntax of the configuration file. Please report other bugs in the bug tracker at L. =head1 COPYRIGHT Copyright (C) 2002-2006 Knut Haugen, Audun Ytterdal, and Jimmy Olsen / Linpro AS. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =head1 SEE ALSO For information on configuration options, please refer to the man page for F. =cut # vim: syntax=perl ts=8 munin-2.0.25/master/_bin/munin-storable2datafile.in000077500000000000000000000003161243472346000222030ustar00rootroot00000000000000#!@@PERL@@ # $Id$ use strict; use warnings; use Storable; use Munin::Master::Utils; while (my $file = shift) { my $config = Storable::retrieve($file); munin_writeconfig("stdout", $config, \*STDOUT); } munin-2.0.25/master/_bin/munin-update.in000077500000000000000000000114271243472346000201030ustar00rootroot00000000000000#!@@PERL@@ # -*- cperl -*- use warnings; use strict; # $Id$ use English qw(-no_match_vars); use Getopt::Long; use Pod::Usage; use Log::Log4perl qw(:easy); use Munin::Master::Update; use Munin::Master::Logger; use Munin::Master::Config; use Munin::Master::Utils; # TODO # # - Include data from Munin::Master::Config in config dump? # - nested groups Getopt::Long::Configure(qw(auto_help)); my $globconfig = Munin::Master::Config->instance(); my $config = $globconfig->{'config'}; sub main { exit_if_run_by_super_user(); configure(); logger_open($config->{'logdir'}); logger_debug() if $config->{debug}; my $update = Munin::Master::Update->new(); $update->run(); return 0; } sub configure { my %args = parse_args(); # Uses default file if config_file is not defined by arguments. $config->parse_config_from_file($args{config_file}); if (defined $config->{'includedir'}) { my $dirname = $config->{'includedir'}; my $DIR; opendir($DIR, $dirname) or WARN "[Warning] Could not open includedir directory $dirname: $OS_ERROR\n"; my @files = grep { ! /^\.|~$/ } readdir($DIR); closedir($DIR); @files = map { $_ = $dirname.'/'.$_; } (sort @files); foreach my $f (@files) { $config->parse_config_from_file($f); } } # Arguments overrides settings from config file. Note that # this only handles settings that are on the base level, not # anything within groups or hosts. $config->set(\%args); } sub parse_args { my $do_usage = 0; my $do_version = 0; my %args = ( "version" => \&print_version_and_exit, ); GetOptions ( \%args, "config_file=s", "debug!", "fork!", "host=s@", "service=s@", "timeout=s", "version!", ) or pod2usage(1); delete $args{version}; $args{limit_hosts} = { map { $_ => 1 } @{$args{host}} }; delete $args{host}; $args{limit_services} = { map { $_ => 1 } @{$args{service}} };; delete $args{service}; return %args; } exit main() unless caller; 1; __END__ =encoding utf8 =head1 NAME munin-update - A program to gather data from machines running munin-node =head1 SYNOPSIS munin-update [options] Options: --config_file= Use as configuration file. --[no]debug Enable [or disable] debug messages. [--nodebug] --[no]fork Query hosts in parallell (--fork), or sequentially (--nofork). [--fork] --host Limit graphed hosts to . Multiple --host options may be supplied. --service Limit graphed services to . Multiple --service options may be supplied. --timeout= TCP timeout when talking to clients. [$timeout] --help View this message. --version View version information. =head1 OPTIONS =over 5 =item B<< --config_file= >> Use EfileE as the configuration file. [@@CONFDIR@@/munin.conf] =item B<< --[no]debug >> If set, log debug messages. [--nodebug] =item B<< --[no]fork >> If set, will fork off one process for each host. [--fork] =item B<< --host >> Limit fetched data to those from Ehost. Multiple --host options may be supplied. [unset] =item B<< --service >> Limit fetched data to those of EserviceE. Multiple --service options may be supplied. [unset] =item B<< --timeout >> Set the network timeout to . [180] =item B<< --help >> Print the help message then exit. =item B<< --version >> Print version information then exit. =back =head1 DESCRIPTION Munin-update is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-update does the gathering. It is usually only used from within munin-cron. It contacts each host's munin-node in turn, gathers data from it, and stores them in .rrd-files. If necessary, it will create the rrd-files and the directories to store them in. =head1 FILES @@CONFDIR@@/munin.conf @@DBDIR@@/* @@LOGDIR@@/munin-update @@STATEDIR@@/* =head1 BUGS For a list of bugs concerning munin-update, see FIX. Please report bugs in the bug tracker at L. =head1 AUTHORS The Munin Team. FIX =head1 COPYRIGHT Copyright Š 2002-2009 Jimmy Olsen, Audun Ytterdal, Tore Andersson, Kjell-Magne Øierud, Linpro AS, Redpill Linpro AS This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License. munin-2.0.25/master/doc/000077500000000000000000000000001243472346000147735ustar00rootroot00000000000000munin-2.0.25/master/doc/munin-check.pod000066400000000000000000000016541243472346000177060ustar00rootroot00000000000000=encoding utf8 =head1 NAME munin-check - A program to fix permissions of Munin directories and files =head1 SYNOPSIS munin-check [--options] =head1 OPTIONS =over 5 =item B<< -h|--help >> Display usage information. =item B<< -f|--fix-permissions >> Fix the permissions of the munin dirs and files. =back =head1 DESCRIPTION munin-check is a utility that fixes the permissions of the munin directories and files. Note: munin-check needs superuser rights. Please don't use this script if you are using 'graph_strategy cgi'! It doesn't care about the right permissions for www-data yet... =head1 AUTHOR Matthias Schmitz =head1 COPYRIGHT Copyright (C) 2002-2008 Matthias Schmitz. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =cut munin-2.0.25/master/doc/munin-cron.pod.in000077500000000000000000000024561243472346000202030ustar00rootroot00000000000000=encoding utf8 =head1 NAME munin-cron - A program to batch other Munin master programs =head1 SYNOPSIS munin-cron [--options] =head1 OPTIONS =over 5 =item B<< --service >> Limit services to EserviceE. Multiple --service options may be supplied. [unset] =item B<< --host >> Limit hosts to EhostE. Multiple --host options may be supplied. [unset] =item B<< --config >> Use EfileE as configuration file. [F<@@CONFDIR@@/munin.conf>] =back =head1 DESCRIPTION Munin-cron is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-cron batches all the above tasks by running their respective programs. All parameters are passed directly to the underlying programs, so only use parameters that are understood by all the other programs. =head1 AUTHORS Audun Ytterdal and Jimmy Olsen. =head1 COPYRIGHT Copyright (C) 2002-2008 Audun Ytterdal and Jimmy Olsen / Linpro AS. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =cut munin-2.0.25/master/doc/munin.conf.pod.in000066400000000000000000000264751243472346000201740ustar00rootroot00000000000000=encoding utf8 =head1 NAME munin.conf - Munin configuration file =head1 DESCRIPTION Munin is a group of programs to gather data from hosts, graph them, create html-pages, and optionally warn contacts about any off-limit values. The hosts are divided into three groups: One master (could be more, but Munin is not cluster aware so they'll likely be independent). The master contacts a number of machines running munin-node, these are called nodes. Each node has data from one or more hosts that is monitored by Munin. F is the configuration file for the Munin master server. The programs using it are munin-update, munin-graph, munin-limits and munin-html. There is also quite extensive documentation of this file at L The format of the file is simple. A minimal configuration looks something like: [machine1.your.dom] address localhost The default location of F is F<@@CONFDIR@@/munin.conf>. If your placement deviates from this norm, use the "--config EfileE"-option when running the munin-* programs. Munin-update will expand all node-entries in this file, and save them to F<@@DBDIR@@/datafile>, which is used by all programs in the package together with this file. Any directives in this file will override directives of the same name in F. E.g., if you want to change the title of the "load"-graph in the above minimum configuration, you would modify the two bottom lines to: [machine1.your.dom] address localhost load.graph_title Edited title of the load-graph This will override the C attribute of the C field/data series while keeping all the others at their default. =head1 GLOBAL DIRECTIVES These directives should appear in F before any host or group definitions. =over =item B I (Default: F<@@DBDIR@@>) Directory for generated database files. Required. =item B I (Default: F<@@LOGDIR@@>) Directory for log files. Required. =item B I (Default: F<@@HTMLDIR@@>) Directory for HTML pages and graphs. Required. =item B I (Default: F<@@STATEDIR@@>) Directory for files tracking munin's current running state. Required. =item B I (Default: F<@@CONFDIR@@/templates>) Directory for templates used to generate HTML pages. Required. =item B I This directive determines whether munin-update fork when gathering information from nodes. Possible values are C and C. Default is C. If you set it to C munin-update will collect data from the nodes in sequence rather than in parallel and this will take considerably more time. Affects: munin-update. =item B I Choose palette between the very nice "C", and the good old "C". =item B I This directive sets the resolution of the RRD files that are created. Possible values are C and C. Default is C. C is really huge, it saves the complete data with 5 minute resolution for 400 days. This will probably increase the I/O load on your Munin master, and currently has very little benefit. Affects: munin-update. =item B I Deprecated. (Graphs are now always drawn via CGI.) =item B I The local address to connect any node from in case the master has several IP interfaces. This can be overridden by a group or global directive. Without this directive Munins traffic will originate from the master server according to the IP routing table. =item B This directive specifies the maximum number of processes to be used for gathering information from nodes. If left blank, munin will use as many processes as necessary. Affects: munin-update. =item B This directive specifies the maximum number of concurrent rrdgraph proesses started by munin-graph. The default is 6. A setting of 0 disables concurrent processing. Affects: munin-graph =item B This directive specifies the maximum number of concurrent munin-cgi-graph jobs. The web server can start a high number of munin-cgi-graph jobs which we can't stop, but munin-cgi-graph will throttle down how many rrdgraph calls will be running at the same time to this number. Affects: munin-cgi-graph and munin-fastcgi-graph. =item B Can have four values. C, C, C, and C. C and C require a TLS connection, while C will not attempt one at all. The current default is C because C is broken. C causes bad interaction between munin-update and munin-node if the node is unprepared to go to TLS. If you see data dropouts (gaps in graphs) please try to disable TLS. Affects: munin-update. =item B This directive can be C or C. It determines if the remote certificate needs to be signed by a CA that is known locally. Default is C. Affects: munin-update. =item B This directive sets the location of the private key to be used for TLS. Default is @@CONFDIR@@/munin.pem. The private key and certificate can be stored in the same file. Affects: munin-update. =item B This directive sets the location of the TLS certificate to be used for TLS. Default is @@CONFDIR@@/munin.pem. The private key and certificate can be stored in the same file. Affects: munin-update. =item B This directive sets the CA certificate to be used to verify the node's certificate, if tls_verify_certificate is set to C. Default is @@CONFDIR@@/cacert.pem. Affects: munin-update. =item B This directive sets how many signings up a chain of signatures TLS is willing to go to reach a known, trusted CA when verifying a certificate. Default is C<5>. Affects: munin-update. =item B This directive, if defined, searches a dump of the certificate provided by the remote host for the given regex. The dump of the certificate is two lines of the form: Subject Name: /C=c/ST=st/L=l/O=o/OU=ou/CN=cn/emailAddress=email Issuer Name: /C=c/ST=st/O=o/OU=ou/CN=cn/emailAddress=email So, for example, one could match the subject distinguished name by the directive: tls_match Subject Name: /C=c/ST=st/L=l/O=o/OU=ou/CN=cn/emailAddress=email Note that the fields are dumped in the order they appear in the certificate. It's best to view the dump of the certificate by running munin-update in debug mode and reviewing the logs. Unfortunately, due to the limited functionality of the SSL module in use, it is not possible to provide finer-grained filtering. By default this value is not defined. Affects: munin-update. =item FIXME: This section MAY be complete, it may be missing a directive or two. =back =head1 HOST DEFINITIONS Host definitions can have several types. In all forms, the definition is used to generate the host name and group for the host, and the following lines define its directives. All following directives apply to that node until another node definition or EOF. Note that when defining a nodename it is vital that you use a standard DNS name, as in, one that uses only a-z, '-', and '.'. While other characters can be used in a DNS name, it is against the RFC, and Munin uses the other characters as delimiters. If they appear in nodenames, unexpected behavior may occur. The simplest node definition defines the section for a new node by simply wrapping the DNS name of the node in brackets, e.g. C<[machine1.your.dom]>. This will add the node C to the group C. The next form of definition is used to define the node and group independently. It follows the form C<[your.dom;machine1.sub.your.dom]>. This adds the node C to the group C. This can be useful if you have machines you want to put together as a group that are under different domains (as in the given example). This can also solve a problem if your machine is C, where having a group of C makes little sense. Multiple groups can be specified by adding more Cs, e.g. C<[servers;local;mail;mail.foo.net]>, if you need a more hierarchical structure. =head1 NODE DIRECTIVES These are directives that can follow a node definition and will apply only to that node. =over =item B
The IP address of the node. Required. =item B The local address to connect to the node from. This overrides a group or global directive. =item FIXME: This section is incomplete. =back =head1 PLUGIN DIRECTIVES These directives should appear after a node definition and are of the form CvalueE>. Using these directives you can override various directives for a plugin, such as its contacts, and can also be used to create graphs containing data from other plugins. =over =item FIXME: This section is (obviously) incomplete. =back =head1 FIELD DIRECTIVES These directives should appear after a node definition and are of the form CvalueE>. Using these directives you can override values originally set by plugins on the nodes, such as warning and critical levels or graph names. =over =item B The graph height for a specific service. Default is C<175>. Affects: munin-graph. =item B The graph width for a specific service. Default is C<400>. Affects: munin-graph. =item B The value at which munin-limits will mark the service as being in a warning state. Value can be a single number to specify a limit that must be passed or they can be a comma separated pair of numbers defining a valid range of values. Affects: munin-limits. =item B The value at which munin-limits will mark the service as being in a critical state. Value can be a single number to specify a limit that must be passed or they can be a comma separated pair of numbers defining a valid range of values Affects: munin-limits. =item FIXME: This section is incomplete. =back =head1 EXAMPLES On all the examples below, all the 'top-level' parameters (dbdir, logdir, htmldir, tmpldir) are not present. They are only skipped for brevity - they are needed. =head1 EXAMPLE 1 An example with three servers on two domains: [machine1.one.dom] address machine1.one.dom [machine2.one.dom] address 10.33.32.123 [machine3.two.dom] address localhost This will appear as two groups (one.dom and two.dom), having respectively two and one node. =head1 EXAMPLE 2 Summarize the 'load'-graphs of the two servers in one.dom, in a 'total load'-graph. [one.dom;Totals] update no load.graph_title Total load load.sum_load.label load load.sum_load.special_stack machine1=machine1.one.dom:load.load machine2=machine2.one.dom:load.load =head1 AUTHORS Jimmy Olsen, Audun Ytterdal, Brian de Wolf, Nicolai Langfeldt =head1 COPYRIGHT Copyright (C) 2002-2008 Audun Ytterdal, Jimmy Olsen, Nicolai Langfeldt, Linpro AS and others. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =head1 SEE ALSO For more information, see the man pages of the individual munin-* programs or the Munin homepage L. =cut munin-2.0.25/master/doc/munin.pod000066400000000000000000000022671243472346000166340ustar00rootroot00000000000000=encoding utf8 =head1 NAME munin - Munin manpage hub =head1 DESCRIPTION Munin is a group of programs to gather data from hosts, graph them, create html-pages, and optionally warn contacts about any off-limit values. The Munin master contains the following programs: munin-update - to gather data from machines running munin-node. munin-graph - to create graphs from data contained in rrd-files. munin-limits - to check for any off-limit values. munin-html - to draw html-pages on an Munin installation munin-cron - to batch other munin programs =head1 SEE ALSO For more information, see the man pages of the individual programs L, L, L, L, L or the Munin homepage L. =head1 AUTHORS Jimmy Olsen, Audun Ytterdal, Brian de Wolf, Nicolai Langfeldt =head1 COPYRIGHT Copyright (C) 2002-2008 Audun Ytterdal, Jimmy Olsen, Nicolai Langfeldt, Linpro AS and others. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =cut munin-2.0.25/master/extras/000077500000000000000000000000001243472346000155345ustar00rootroot00000000000000munin-2.0.25/master/extras/munin-update_old.in000077500000000000000000001053011243472346000213330ustar00rootroot00000000000000#!@@PERL@@ -w # -*- cperl -*- # # Copyright (C) 2002-2009 Jimmy Olsen, Audun Ytterdal # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 dated June, # 1991. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Script to update the RRD-files with current information. # # $Id$ use strict; $|=1; use Carp; use English qw(-no_match_vars); use Getopt::Long; use IO::Socket; use Munin::Common::Defaults; use Munin::Common::Timeout; use Munin::Common::TLSClient; use Munin::Master::Logger; use Munin::Master::Utils; use POSIX ":sys_wait_h"; use RRDs; use Storable qw(fd_retrieve nstore_fd); use Time::HiRes; my $DEBUG=0; my $STATS; my $cli_do_fork; my $cli_timeout; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; my $config; my $do_fork = 1; my $serversocket = "munin-server-socket.$$"; my $timeout = 180; my $tls; my %children = (); my @limit_hosts = (); my @limit_services = (); my @queue = (); sub main { my $TIMEOUT = 240; my $oldconfig; parse_args(); exit_if_run_by_super_user(); $config = munin_readconfig_base($conffile); logger_open($config->{'logdir'}); $oldconfig = &munin_readconfig_part('datafile', 1); # CLI parameters override the configuration file. if (defined $cli_timeout) { $timeout = $cli_timeout; } elsif (exists $config->{'timeout'}) { $timeout = $config->{'timeout'}; } if (defined $cli_do_fork) { $do_fork = $cli_do_fork; } elsif (exists $config->{'fork'}) { $do_fork = ($config->{'fork'} =~ /yes/i ? 1 : 0); } if (! -d $config->{rundir}) { mkdir ($config->{rundir}, oct(700)); } munin_runlock("$config->{rundir}/munin-update.lock"); if (!open ($STATS,'>', "$config->{dbdir}/munin-update.stats.tmp")) { logger("[WARNING] Unable to open $config->{dbdir}/munin-update.stats"); # Use /dev/null instead - if the admin won't fix he won't care open($STATS, '>', "/dev/null") or die "Could not open STATS to /dev/null: $?"; } if ($do_fork) { set_up_ipc_socket(); } logger("Starting munin-update"); my @work = find_hosts_for_update(); @queue = build_work_queue($oldconfig, @work); do_some_work($TIMEOUT); unlink ("$config->{rundir}/$serversocket"); # XXX: WTF is that ? # { # my $overwrite = munin_readconfig($conffile); # $config = munin_overwrite($config, $overwrite); # } compare_configs ($oldconfig, $config); if (munin_getlock("$config->{rundir}/munin-datafile.lock")) { munin_writeconfig("$config->{dbdir}/datafile",$config); } else { die "Could not create lockfile '$config->{rundir}/munin-update.lock'"; } write_stats_and_log_update_time(); munin_removelock("$config->{rundir}/munin-datafile.lock"); munin_removelock("$config->{rundir}/munin-update.lock"); return 0; } sub parse_args { my $do_usage = 0; my $do_version = 0; # Get options print_usage_and_exit() unless GetOptions ( "host=s" => \@limit_hosts, "service=s" => \@limit_services, "config=s" => \$conffile, "debug!" => \$DEBUG, "version!" => \&print_version_and_exit, "fork!" => \$cli_do_fork, "timeout=i" => \$cli_timeout, "help" => \&print_usage_and_exit ); } sub print_usage_and_exit { print qq{Usage: $0 [options] Options: --version View version information. --help View this message. --service Limit graphed services to . Multiple --service options may be supplied. --host Limit graphed hosts to . Multiple --host options may be supplied. --config Use as configuration file. [$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf] --[no]debug View debug messages. [--nodebug] --[no]fork Don't fork one instance for each host. [--fork] --timeout= TCP timeout when talking to clients. [$timeout] }; exit 0; } sub print_version_and_exit { print qq{munin-update version $Munin::Common::Defaults::MUNIN_VERSION. Written by Audun Ytterdal, Jimmy Olsen, Tore Anderson / Linpro AS Copyright (C) 2002-2009 This is free software released under the GNU General Public License. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, please refer to the file COPYING that is included with this software or refer to http://www.fsf.org/licensing/licenses/gpl.txt }; exit 0; } sub exit_if_run_by_super_user { if ($EFFECTIVE_USER_ID == 0) { print qq{This program will easily break if you run it as root as you are trying now. Please run it as user '$Munin::Common::Defaults::MUNIN_USER'. The correct 'su' command on many systems is 'su - munin --shell=/bin/bash' Aborting.\n\n}; exit 1; } } sub set_up_ipc_socket { my $socket_file = "$config->{rundir}/$serversocket"; my $uaddr = sockaddr_un($socket_file); socket Server, PF_UNIX, SOCK_STREAM, 0 or die "socket: $!"; unlink $socket_file; bind Server, $uaddr; chmod oct(700), $socket_file; listen Server, SOMAXCONN; } sub find_hosts_for_update { my @hosts = (); if (@limit_hosts) { for my $nodename (@limit_hosts) { push @hosts, map { @{munin_find_field ($_->{$nodename}, "address")} } @{munin_find_field($config, $nodename)}; } } else { push @hosts, @{munin_find_field($config, "address")}; } return @hosts; } sub build_work_queue { my ($oldconfig, @work) = @_; # Go through scheduled work to weed out a few bits, and prepare some info for my $host (@work) { my $loc = munin_get_node_loc($host); my $name = munin_get_node_name($host); # Skip anything that has been disabled with the "update" setting if (!munin_get_bool ($host, "update", "true")) { logger ("Skipping \"$name\" (update disabled by config)"); next; } # We need to connect to this node; queue it logger ("Queuing \"$name\" for update."); push (@queue, [$loc, $host, munin_get_node ($oldconfig, $loc)]); } return @queue; } sub start_parallell_do_node { if (defined $config->{max_processes}) { while (keys %children < ($config->{max_processes} - 1)) { do_node(@{pop @queue}); } } else { do_node(@{pop @queue}) while @queue; # No limit on number of procs } } # FIX better name :) sub do_some_work { my ($TIMEOUT) = @_; my $bad_procs = 0; do_with_timeout($TIMEOUT, sub { if ($do_fork) { start_parallell_do_node(); # Loop as long as there are kids or queue... while ((scalar (keys %children) - $bad_procs > 0) or @queue) { logger ("Debug: Doing a pass to check children status.") if $DEBUG; my $timed_out = !do_with_timeout(10, sub { accept (Client, Server); }); # end eval if ($timed_out) { foreach my $key (keys %children) { if (waitpid ($key, WNOHANG) != 0) { my $loc = $children{$key}->[0]; my $newnode = $children{$key}->[1]; my $oldnode = $children{$key}->[2]; my $name = munin_get_node_name ($newnode); logger ("Reaping child: $name."); delete $children{$key}; munin_copy_node_toloc ($oldnode, $config, $loc); } } if (@queue and defined $config->{max_processes} and $config->{max_processes}) { logger ("Debug: Checking whether to spawn off more procs from queue."); while (keys %children < ($config->{max_processes}-1-$bad_procs)) { logger ("Debug: Popping queue item and spawning new proc."); do_node(@{pop @queue}); } } next; } close STDIN; ## no critic open (STDIN, "<&Client") || die "can't dup client to stdin"; ## critic my $pid; my $name; my $loc; my $tmpref; eval { $tmpref = fd_retrieve (\*STDIN); }; if ($@) { $bad_procs++; logger ("[WARNING] Error communicating with process: $@"); } else { ($pid, $loc, $name) = ($tmpref->[0], $tmpref->[1], $tmpref->[2]); logger ("connection from $name ($pid)"); eval { my $newnode = fd_retrieve (\*STDIN); munin_copy_node_toloc ($newnode, $config, $loc); }; if ($@) { logger ("[WARNING] Error during fd_retrieve of config: $@"); my $loc = $children{$pid}->[0]; my $newnode = $children{$pid}->[1]; my $oldnode = $children{$pid}->[2]; munin_copy_node_toloc ($oldnode, $config, $loc); } delete $children{$pid}; waitpid ($pid, 0); logger ("connection from $name ($pid) closed"); } if (@queue and defined $config->{max_processes} and $config->{max_processes} and scalar (keys %children) < (($config->{max_processes})-1-$bad_procs)) { do_node(@{pop @queue}); close (Client); } } } else { # No forking, just poll the nodes sequentially... while (@queue) { do_node(@{pop @queue}); } } }) or die "Timed out waiting for children.\n"; if ($bad_procs) # Use old configuration for killed children { foreach my $key (keys %children) { my $loc = $children{$key}->[0]; my $newnode = $children{$key}->[1]; my $oldnode = $children{$key}->[2]; my $name = munin_get_node_name ($newnode); munin_copy_node_toloc ($oldnode, $config, $loc); logger ("Attempting to use old configuration for $name."); } } } sub write_stats_and_log_update_time { my $update_time= Time::HiRes::time; $update_time = sprintf ("%.2f",(Time::HiRes::time - $update_time)); print $STATS "UT|$update_time\n"; close ($STATS); rename ("$config->{dbdir}/munin-update.stats.tmp", "$config->{dbdir}/munin-update.stats"); logger("Munin-update finished ($update_time sec)"); } # compare_configs is used to monitor for config changes which we # have to act upon. sub compare_configs { my $old = shift; my $new = shift; my $just_upgraded = 0; if (!defined $old->{version} or $old->{version} ne $Munin::Common::Defaults::MUNIN_VERSION) { $just_upgraded = 1; } foreach my $node (@{munin_find_field($new, "label")}) { my $oldnode = munin_get_node ($old, munin_get_node_loc ($node)); my $name = munin_get_node_name ($node); my ($oldval, $newval); $oldval = munin_get ($oldnode, "max", ""); $newval = munin_get ($node, "max", ""); if ($just_upgraded or $oldval ne $newval) { logger ("Notice: compare_configs: $name.max changed from ".(length $oldval?$oldval:"undefined")." to $newval."); change_max (munin_get_filename ($node), $newval); } $oldval = munin_get ($oldnode, "min", ""); $newval = munin_get ($node, "min", ""); if ($just_upgraded or $oldval ne $newval) { logger ("Notice: compare_configs: $name.min changed from ".(length $oldval?$oldval:"undefined")." to $newval."); change_min (munin_get_filename ($node), $newval); } $oldval = munin_get ($oldnode, "type", "GAUGE"); $newval = munin_get ($node, "type", "GAUGE"); if ($just_upgraded or $oldval ne $newval) { logger ("Notice: compare_configs: $name.type changed from ".(length $oldval?$oldval:"undefined")." to $newval."); change_type (munin_get_filename ($oldnode), munin_get_filename ($node), $newval); } } } sub change_type { my $ofile = shift; my $nfile = shift; my $val = shift; if (defined $ofile and -f $ofile) { logger ("[WARNING]: Changing name of $ofile to $nfile"); unless (rename ($ofile, $nfile)) { logger ("[ERROR]: Could not rename file: $!\n"); } } logger ("INFO: Changing type of $nfile to " . (defined $val?$val:"GAUGE")); RRDs::tune ($nfile, "-d", "42:".(defined $val?$val:"GAUGE")); } sub change_max { my $file = shift; my $val = shift; logger ("[WARNING]: Changing max of \"$file\" to \"$val\".\n"); RRDs::tune ($file, "-a", "42:".(defined $val?$val:"U")); } sub change_min { my $file = shift; my $val = shift; logger ("[WARNING]: Changing min of \"$file\" to \"$val\".\n"); RRDs::tune ($file, "-i", "42:".(defined $val?$val:"U")); } sub do_node { my ($loc, $newconf, $oldconf) = @_; return unless munin_get ($newconf, "update", "true"); # Skip unless we're updating it return unless munin_get ($newconf, "fetch_data", "true"); # Old name for "update" my $name = munin_get ($newconf, "host_name") || munin_get_node_name ($newconf); unless ($newconf->{"address"}) { logger("[ERROR] No address defined for node: $name"); return; } logger ("Debug: do_node: Starting on \"$name\".") if $DEBUG; # Then we fork... if ($do_fork) { my $pid = fork; if (!defined($pid)) { # Something went wrong logger ("Error: Unable to fork: $!"); return; } elsif ($pid) { # I'm the parent $children{$pid} = [$loc, $newconf, $oldconf]; return; } # else I'm the child -- go spawn } $0 .= " [$name]"; # First we get lock... unless (&munin_getlock(munin_get($newconf, "rundir")."/munin-".join('-',@{munin_get_node_loc($newconf)})."-".munin_get_node_name($newconf).".lock")) { logger ("[ERROR] Could not get lock for \"$name\". Skipping node."); if ($do_fork) { # Send the old config to the server before we die alarm (0); # Don't want to interrupt this. my @tmp = ($$, munin_get_node_loc($newconf), $name); if (ref $oldconf) { copy_node ($oldconf, $newconf); write_refs_to_parent($newconf, \@tmp, \%{munin_get_separated_node ($newconf)}); } else { # Well, we'll have to give _something_ to the server, or it'll time out. write_refs_to_parent($newconf, \@tmp, {}); } exit 1; } else { return 0; } } my $socket; if (munin_get ($newconf, "local_address")) { $socket = new IO::Socket::INET ('PeerAddr' => "$newconf->{address}:". munin_get ($newconf, "port", "4949"), 'LocalAddr' => munin_get ($newconf, "local_address", undef), 'Proto' => "tcp", "Timeout" => munin_get($newconf, "timeout", 60)); } else { $socket = new IO::Socket::INET ('PeerAddr' => "$newconf->{address}:". munin_get ($newconf, "port", "4949"), 'Proto' => "tcp", "Timeout" => munin_get($newconf, "timeout", 60)); } my $err = ($socket ? "" : $!); if ($do_fork) { $SIG{ALRM} = sub { close $socket; die "$!\n"}; alarm ($timeout); my @tmp = ($$, munin_get_node_loc ($newconf), $name); if (!$socket) { logger ("[ERROR] Could not connect to $name($newconf->{address}): $err - Attempting to use old configuration"); # If we can't reach the client. Using old Configuration. if (ref $oldconf) { copy_node ($oldconf, $newconf); alarm (0); # Don't want to interrupt this. write_refs_to_parent($newconf, \@tmp, \%{munin_get_separated_node ($newconf)}); } else { # Well, we'll have to give _something_ to the server, or it'll time out. write_refs_to_parent($newconf, \@tmp, {}); } } else { my $ctx; if (!config_and_fetch_node($newconf,$oldconf,$socket)) { copy_node ($oldconf, $newconf); write_refs_to_parent($newconf, \@tmp, \%{munin_get_separated_node ($newconf)}); exit 1; } close $socket; alarm (0); # Don't want to interrupt this. write_refs_to_parent($newconf, \@tmp, \%{munin_get_separated_node ($newconf)}); alarm ($timeout); } alarm (0); munin_removelock(munin_get($newconf, "rundir")."/munin-".join('-',@{munin_get_node_loc($newconf)})."-".munin_get_node_name($newconf).".lock"); exit; } else # No forking... { if (!$socket) { logger ("[ERROR] Could not connect to $name($newconf->{address}): $err\nAttempting to use old configuration"); # If we can't reach the client. Using old Configuration. if (ref $oldconf) { copy_node ($oldconf, $newconf); } } else { next unless (config_and_fetch_node($newconf,$oldconf,$socket)); close $socket; } } munin_removelock(munin_get($newconf, "rundir")."/munin-".join('-',@{munin_get_node_loc($newconf)})."-".munin_get_node_name($newconf).".lock"); } sub write_refs_to_parent { my ($conf, @refs) = @_; socket my $sock, PF_UNIX, SOCK_STREAM, 0 or die "socket: $!"; connect $sock, sockaddr_un(munin_get($conf, "rundir")."/$serversocket") or die "connect: $!"; for my $ref (@refs) { nstore_fd($ref, $sock) or die "Could not nstore_fd: $!"; } close $sock; } sub write_socket_single { my $socket = shift; my $text = shift; logger ("[DEBUG] Writing to socket: \"$text\".") if $DEBUG; my $timed_out = !do_with_timeout(5, sub { if ($tls && $tls->session_started()) { $tls->write($text) or exit 9; } else { print $socket $text; } }); if ($timed_out) { logger ("[WARNING] Socket write timed out\n"); return; } return 1; } sub read_socket_single { my $socket = shift; my $res; return unless defined $socket; my $timed_out = !do_with_timeout($timeout, sub { if ($tls && $tls->session_started()) { $res = $tls->read(); } else { $res = <$socket>; } chomp $res if defined $res; }); if ($timed_out) { logger ("[WARNING] Socket read timed out\n"); return; } logger ("[DEBUG] Reading from socket: \"$res\".") if $DEBUG; return $res; } sub read_socket { my $socket = shift; my @array; return unless defined $socket; local $_; my $timed_out = !do_with_timeout($timeout, sub { if ($tls && $tls->session_started()) { while (defined ($_ = $tls->read())) { chomp; last if (/^\.$/); push @array, $_; } } else { while (<$socket>) { chomp; last if (/^\.$/); push @array, $_; } } }); if ($timed_out) { logger ("[WARNING] Socket read timed out: $@\n"); return; } logger ("[DEBUG] Reading from socket: \"".(join ("|",@array))."\".") if $DEBUG; return (@array); } sub read_socket_discard_comments { my ($socket) = @_; my @chunks = read_socket($socket); return grep { $_ !~ /^#/} @chunks; } sub config_and_fetch_node { my ($newconf,$oldconf,$socket) = @_; my $fetchdomain; my $name = munin_get_node_name ($newconf); my $host_time = Time::HiRes::time; my $clientdomain = eval { get_node_domain($socket); }; if ($EVAL_ERROR) { logger("[WARNING] $EVAL_ERROR '$name' skipping"); return 0; } # Decide what to ask for if (munin_get_bool ($newconf, "use_node_name")) { $fetchdomain = $clientdomain; } else { $fetchdomain = $name; } run_starttls_if_required($socket, $name); negotiate_capabilities($socket); logger("[DEBUG] Configuring node: $name") if $DEBUG; my @services; my $timed_out = !do_with_timeout(5, sub { write_socket_single($socket, "list $name\n"); my $list = read_socket_single($socket); exit 1 unless defined $list; chomp $list; @services = split / /,$list; }); if ($timed_out) { logger ("Error: Could not get list from $newconf->{address}: $!\nAttempting to use old configuration"); if (ref $oldconf) { copy_node ($oldconf, $newconf); } @services = []; } for my $service (@services) { my $servname = $service; $servname =~ s/\W/_/g; config_node_service($oldconf, $newconf, $socket, $servname, $service); fetch_node_service ($newconf, $socket, $servname, $service); } $host_time = sprintf ("%.2f", (Time::HiRes::time - $host_time)); print $STATS "UD|$name|$host_time\n"; return 0 unless $socket; return 1; } sub get_node_domain { my ($socket) = @_; my $node_domain = read_socket_single ($socket); croak "Got no reply from node" unless $node_domain; chomp $node_domain; $node_domain =~ s/\#.*(?:lrrd|munin) (?:client|node) at // or croak "Got unknown reply from node"; return $node_domain; } sub run_starttls_if_required { my ($socket, $name) = @_; # TLS should only be attempted if explicitly enabled. The default # value is therefore "disabled" (and not "auto" as before). my $tls_requirement = &munin_get ($config, "tls", "disabled"); logger ("[DEBUG]: TLS set to \"$tls_requirement\".") if $DEBUG; if ($tls_requirement ne "disabled") { my $key; my $cert; my $depth; my $ca_cert; my $tls_verify; $key = $cert = munin_get ($config, "tls_pem"); $key = &munin_get ($config, "tls_private_key", "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.pem") unless defined $key; $cert = &munin_get ($config, "tls_certificate", "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.pem") unless defined $cert; $ca_cert = &munin_get ($config, "tls_ca_certificate", "$Munin::Common::Defaults::MUNIN_CONFDIR/cacert.pem") unless defined $ca_cert; $tls_verify=&munin_get ($config, "tls_verify_certificate", "no"); $depth=&munin_get ($config, "tls_verify_depth", 5); $tls = Munin::Common::TLSClient->new({ DEBUG => $DEBUG, logger => \&logger, read_fd => fileno($socket), read_func => sub { read_socket_single($socket) }, tls_ca_cert => $ca_cert, tls_cert => $cert, tls_paranoia => $tls_requirement, tls_priv => $key, tls_vdepth => $depth, tls_verify => $tls_verify, write_fd => fileno($socket), write_func => sub { write_socket_single($socket, @_) }, }); if (!$tls->start_tls()) { $tls = undef; if ($tls_requirement eq "paranoid" or $tls_requirement eq "enabled") { logger ("[ERROR]: Could not establish TLS connection to \"$name\". Skipping."); exit 13; } } } } sub negotiate_capabilities { my ($socket) = @_; my $capabilities = 'foo'; write_socket_single($socket, "cap $capabilities\n"); my ($cap) = read_socket_discard_comments($socket); logger("[DEBUG]: Session capabilities: $cap");# if $DEBUG; } sub config_node_service { my $oldconf = shift; my $newconf = shift; my $socket = shift; my $service = shift; my $servname = shift; my $fields = {}; munin_set_var_loc ($newconf, [$servname, "realservname"], $service); logger("[DEBUG] Inspecting possible service: $servname") if $DEBUG; return if (!munin_get_bool ($newconf->{$servname}, "update", "true")); return if (!munin_get_bool ($newconf->{$servname}, "fetch_data", "true")); return if (@limit_services and !grep (/^$servname$/, @limit_services)); my @graph_order = split (/\s+/, munin_get ($newconf->{$service}, "graph_order", "")); my $serviceconf_time = Time::HiRes::time; logger("[DEBUG] Configuring service: $servname") if $DEBUG; write_socket_single ($socket, "config $service\n"); my @lines = read_socket($socket); return unless $socket; return unless (@lines); for (@lines) { if (/\# timeout/) { logger("Client reported timeout in configuration of $servname"); if ($oldconf->{$servname}) { logger("Attempting to use old configuration"); copy_node ($newconf->{$servname}, $oldconf->{$servname}); } else { logger("Skipping configuration of $servname"); delete $newconf->{$servname}; } } elsif (/^(\w+)\.(\w+)\s+(.+)/) { my ($client,$type,$value) = ($1,$2,$3); $client = &sanitise_fieldname ($client, $fields); if (($type) and ($type eq "label")) { $value =~ s/\\/_/g; # Sanitise labels push (@graph_order,$client) unless grep (/^$client$/, @graph_order); } munin_set_var_loc ($newconf, [$servname, $client, $type], "$value"); logger ("config: $servname->$client.$type = $value") if $DEBUG; } elsif (/(^[^\s\#]+)\s+(.+)/) { my ($keyword) = $1; my ($value) = $2; munin_set_var_loc ($newconf, [$servname, $keyword], "$value"); logger ("Config: $servname->$keyword = $value") if $DEBUG; if ($keyword eq "graph_order") { @graph_order = split (/\s+/, $value); } } } for my $field (keys %{$newconf->{$servname}}) { # Skip anything that isn't a field next if $field =~ /^#%#/; next unless (ref ($newconf->{$servname}->{$field}) eq "HASH" and defined ($newconf->{$servname}->{$field}->{"label"})); my $fhash = $newconf->{$servname}->{$field}; # Check if file exists my $fname = munin_get_filename ($fhash); (my $dirname = $fname) =~ s/\/[^\/]+$//; if (! -f "$fname") { logger ("creating rrd-file for $servname->$field: \"$fname\""); munin_mkdir_p ($dirname, oct(777)); my @args = ("$fname", "DS:42:".munin_get($fhash, "type", "GAUGE").":600:". munin_get($fhash, "min", "U") . ":" . munin_get($fhash, "max", "U")); my $resolution = &munin_get ($fhash, "graph_data_size", "normal"); if ($resolution eq "normal") { push (@args, "RRA:AVERAGE:0.5:1:576", # resolution 5 minutes "RRA:MIN:0.5:1:576", "RRA:MAX:0.5:1:576", "RRA:AVERAGE:0.5:6:432", # 9 days, resolution 30 minutes "RRA:MIN:0.5:6:432", "RRA:MAX:0.5:6:432", "RRA:AVERAGE:0.5:24:540", # 45 days, resolution 2 hours "RRA:MIN:0.5:24:540", "RRA:MAX:0.5:24:540", "RRA:AVERAGE:0.5:288:450", # 450 days, resolution 1 day "RRA:MIN:0.5:288:450", "RRA:MAX:0.5:288:450"); } elsif ($resolution eq "huge") { push (@args, "RRA:AVERAGE:0.5:1:115200"); # resolution 5 minutes, for 400 days push (@args, "RRA:MIN:0.5:1:115200"); # Three times? ARGH! push (@args, "RRA:MAX:0.5:1:115200"); # Three times? ARGH! } RRDs::create @args; if (my $ERROR = RRDs::error) { logger ("[ERROR] Unable to create \"$fname\": $ERROR"); } } } munin_set_var_loc ($newconf, [$servname, "graph_order"], join(' ',@graph_order)); } sub fetch_node_service { my $newconf = shift; my $socket = shift; my $service = shift; my $realservname = shift; write_socket_single ($socket, "fetch $realservname\n"); my @lines = &read_socket($socket); return 0 unless $socket; my $fields = {}; for (@lines) { next unless defined $_; if (/\# timeout/) { logger("Client reported timeout in fetching of $service"); } elsif (/(\w+)\.value\s+([\S:]+)\s*(\#.*)?$/) { my $key = $1; my $value = $2; my $comment = $3; my $when = "N"; if ($value =~ /^(\d+):(.+)$/) { $when = $1; $value = $2; } if ($value =~ /\d[Ee]([+-]?\d+)$/) { # Looks like scientific format. RRDtool does not # like it so we convert it. my $magnitude = $1; if ($magnitude < 0) { # Preserve at least 4 significant digits $magnitude=abs($magnitude)+4; $value=sprintf("%.*f",$magnitude,$value); } else { $value=sprintf("%.4f",$value); } } $key = &sanitise_fieldname ($key, $fields); if (exists $newconf->{$service}->{$key}->{"label"}) { my $fname = munin_get_filename ($newconf->{$service}->{$key}); logger("[DEBUG] Updating $fname with $value") if $DEBUG; RRDs::update ("$fname", "$when:$value"); if (my $ERROR = RRDs::error) { logger ("[ERROR] In RRD: unable to update $fname: $ERROR"); } } else { logger ("[ERROR] Unable to update $service -> $key: No such field (no \"label\" field defined when running plugin with \"config\")."); } } elsif (/(\w+)\.extinfo\s+(.+)/) { # FIX never used? munin_set_var_loc ($newconf, [$service, $service, $1, "extinfo"], $2); } } return 1; } # FIX never called? sub fetch_node { my ($newconf,$oldconf,$socket) = @_; my $name = munin_get_node_name ($newconf); logger("[DEBUG] Fetching node: $name") if $DEBUG; for my $service (keys %{$newconf}) { next if ref ($newconf->{$service}) ne "HASH"; next if $service =~ /^#%#/; logger("[DEBUG] Fetching service: $service") if $DEBUG; next unless exists ($newconf->{$service}->{"graph_title"}); next unless (munin_get_bool ($newconf->{$service}, "update", "true")); next unless (munin_get_bool ($newconf->{$service}, "fetch_data", "true")); next if (@limit_services and !grep (/^$service$/, @limit_services)); # Read (and get rid of) realservname my $realservname = ( $newconf->{$service}->{"realservname"} || $service ); delete $newconf->{$service}->{"realservname"} if exists $newconf->{$service}->{"realservname"}; write_socket_single ($socket, "fetch $realservname\n"); my @lines = &read_socket($socket); return 0 unless $socket; my $fields = {}; for (@lines) { next unless defined $_; if (/\# timeout/) { logger("Client reported timeout in fetching of $service"); } elsif (/(\w+)\.value\s+([\S:]+)\s*(\#.*)?$/) { my $key = $1; my $value = $2; my $comment = $3; my $when = "N"; if ($value =~ /^(\d+):(.+)$/) { $when = $1; $value = $2; } if ($value =~ /\d[Ee]([+-]?\d+)$/) { # Looks like scientific format. RRDtool does not # like it so we convert it. my $magnitude = $1; if ($magnitude < 0) { # Preserve at least 4 significant digits $magnitude=abs($magnitude)+4; $value=sprintf("%.*f",$magnitude,$value); } else { $value=sprintf("%.4f",$value); } } $key = &sanitise_fieldname ($key, $fields); if (exists $newconf->{$service}->{$key}->{"label"}) { my $fname = munin_get_filename ($newconf->{$service}->{$key}); logger("[DEBUG] Updating $fname with $value") if $DEBUG; RRDs::update ("$fname", "$when:$value"); if (my $ERROR = RRDs::error) { logger ("[ERROR] In RRD: unable to update $fname: $ERROR"); } } else { logger ("[ERROR] Unable to update $name -> $service -> $key: No such field (no \"label\" field defined when running plugin with \"config\")."); } } elsif (/(\w+)\.extinfo\s+(.+)/) { munin_set_var_loc ($newconf, [$service, $service, $1, "extinfo"], $2); } } } return 1; } sub sanitise_fieldname { my $lname = shift; my $done = shift; my $old = shift || 0; $lname =~ s/[\W-]/_/g; return substr ($lname,-18) if $old; #$lname = Digest::MD5::md5_hex ($lname) if (defined $done->{$lname}); $done->{$lname} = 1; return $lname; } sub copy_node { my $from = shift; my $to = shift; if (ref ($from) eq "HASH") { foreach my $key (keys %$from) { next if $key =~ /^#%#/; $to->{$key} = $from->{$key}; } } else { $to = $from; } return $to; } exit main() unless caller; 1; __END__ =head1 NAME munin-update - A program to gather data from machines running munin-node =head1 SYNOPSIS munin-update [options] =head1 OPTIONS =over 5 =item B<< --service >> Limit fetched data to those of EserviceE. Multiple --service options may be supplied. [unset] =item B<< --host >> Limit fetched data to those from Ehost. Multiple --host options may be supplied. [unset] =item B<< --config >> Use EfileE as configuration file. [@@CONFDIR@@/munin.conf] =item B<< --help >> View help message. =item B<< --[no]debug >> If set, view debug messages. [--nodebug] =item B<< --[no]fork >> If set, will fork off one process for each host. [--fork] =item B<< --timeout >> Set the network timeout to . [180] =back =head1 DESCRIPTION Munin-update is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-update does the gathering. It is usually only used from within munin-cron. It contacts each host's munin-node in turn, gathers data from it, and stores them in .rrd-files. If necessary, it will create the rrd-files and the directories to store them in. =head1 FILES @@CONFDIR@@/munin.conf @@DBDIR@@/* @@LOGDIR@@/munin-update @@STATEDIR@@/* =head1 VERSION This is munin-update version @@VERSION@@ =head1 AUTHORS Audun Ytterdal, Jimmy Olsen, and Tore Anderson. =head1 BUGS munin-update does, as of now, not check the syntax of the configuration file. Please report other bugs in the bug tracker at L. =head1 COPYRIGHT Copyright Š 2002-2009 Audun Ytterdal, Jimmy Olsen, and Tore Anderson / Linpro AS. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =head1 SEE ALSO For information on configuration options, please refer to the man page for F. =cut # vim:syntax=perl:ts=8 munin-2.0.25/master/extras/percentile.in000077500000000000000000000044571243472346000202330ustar00rootroot00000000000000#!@@PERL@@ -w =head1 NAME percentile - Munin support script to calculate the running n'th percentile of a data-set. =head1 USAGE To calculate the 95th percentile of the dataset "in" from a graph for all the different time periods: in95thday.calculate percentile %{in}f 1day 95 in95thweek.calculate percentile %{in}f 1week 95 in95thmonth.calculate percentile %{in}f 1month 95 in95thyear.calculate percentile %{in}f 1year 95 In the above the 95th perceintile for the different period lengths are stored in different time series and they will all be graphed on all the graphs. If you need only the monthly 95th percentile you can just calculate that instead. Remember to supply config for these data series in the usual way. =over 2 =item %{in}f is replaced with the name of the rrd file containing the in dataset. =item The second argument is the period to compute for, the values shown above are supported by rrd. =item 95 is the percentile to compute =back The returned value is stuffed in in95th(day|week|month|year).value and the value is graphed as usual. =head1 BUGS None! =head1 AUTHOR Unatributed, attached to tocket #443 by the anarcat in the Munin trac. =head1 LICENSE GPLv2 =cut use strict; use RRDs; ## no critic Prototypes my $me=$0; sub percentile($;$$) { my ($rrdfile,$duration,$n_th) = @_; # duration should be 1day, 1week, 1month or 1year. $duration ||= "1week"; $n_th ||= 95; # can't have 0th percentile my ($start,$step,$names,$data) = RRDs::fetch($rrdfile,"MAX","-s","-$duration"); my @sums = (); my $timestamp = $start; ROWLOOP: foreach my $row (@$data) { my $sum = 0; $timestamp += $step; foreach my $field (@$row) { next ROWLOOP if (! defined $field); # skip rows that have NaN $sum += $field; } push(@sums,$sum); } my $which = int(scalar(@sums)*($n_th)/100); @sums = sort{$a<=>$b}(@sums); return $sums[$which]; } # -- main() sub usage { if (defined($_[0])) { print STDERR "$me: $_[0]\n\n"; } print STDERR "$me <1day|1week|1month|1year> \n"; exit 1; } my $rrdfile = shift(@ARGV) or usage "No rrdfile name given."; my $period = shift(@ARGV) or usage "No period given."; my $nth = shift(@ARGV) or usage "No percentile given."; print ".value ",&percentile($rrdfile,$period,$nth) ,"\n"; munin-2.0.25/master/lib/000077500000000000000000000000001243472346000147745ustar00rootroot00000000000000munin-2.0.25/master/lib/Munin/000077500000000000000000000000001243472346000160625ustar00rootroot00000000000000munin-2.0.25/master/lib/Munin/Master/000077500000000000000000000000001243472346000173155ustar00rootroot00000000000000munin-2.0.25/master/lib/Munin/Master/Config.pm000066400000000000000000000406421243472346000210660ustar00rootroot00000000000000package Munin::Master::Config; use base qw(Munin::Common::Config); # $Id$ # Notes about config data structure: # # In Munin all configuration and gathered data is stored in the same # config tree of hashes. Since ~april 2009 we've made the tree object # oriented so the objects in there must be instantiated as the right # object type. And so we can use the object type to determine # behaviour when we itterate over the objects in the tree. # # The Class Munin::Common::Config is the base of Munin::Master::Config. # The master programs (munin-update, munin-graph, munin-html) instantiate # a Munin::Master::Config object. # # Please note that the munin-node configuration is also based on # Munin::Common::Config but is quite a lot simpler with regards to syntax # # The Class Munin::Master::GroupRepository is based on Munin::Master::Config # and contains a tree of Munin::Master::Group objects. # # The M::M::Group objects can be nested. Under a M::M::Group object there # can be a (flat) collection of M::M::Host objects. The M::M::Host class # is based in M::M::Group. # # A M::M::Host is a monitored host (not a node). Munin gathers data # about a host by connecting to a munin-node and asking about the host. # # Since multigraph plugins are hierarchical each host can contain # data for nested plugin names/dataseries labels. # # The configuration file formats are everywhere identical in structure # but the resulting configuration tree differs a bit. On the munin-master # the syntax is like this: # # Global setting: # # attribute value # # Simple group/host/service tree: # # Group;Host:service.attribute # Group;Host:service.label.attribute # # Groups can be nested: # # Group;Group;Group;Host:(...) # # (When multigraph is supported) services can be nested: # # (...);Host:service:service.(...) # (...);Host:service:service.service.(...) # # All attributes (attribute names) are known and appears in the @legal # array (and accompanying hash). # # Structure: # - A group name is always postfixed by a ; # - The host name is the first word with a : after it # - After that there are services and attributes # # For ease of configuration munin supports a [section] shorthand: # # [Group;] # [Group;Group;] # [Group;Host] # [Group;Host:service] # # The section is prefixed to the subsequent settings in the appropriate # manner with the correct infixes (";", ":" or "."). Usage can look like # this: # # [Group;] # Group;Host:service.attribute value # # is equivalent to # # [Group;Group;] # Host:service.attribute value # # is equivalent to # # [Group;Group;Host] # service.attribute value # # is equivalent to # # [Group;Group;Host:service] # attribute value # # As part of multigraph we're supporting nested services as well: # # [Group;Group;Host] # service.attribute value # service.service.attribute value # # [Group;Group;Host:service] # attribute value # Group;Group;Host:service.attribute # :service.attribute value # Group;Group;Host:service.service.attribute # # [Group;Group;Host:service.service] # attribute value # Group;Group;Host:service.service.attribute # service.attribute value # ...;Host:service:service.service.attribute # use warnings; use strict; use Carp; use English qw(-no_match_vars); use Munin::Common::Defaults; use Munin::Master::Group; use Munin::Master::Host; use Log::Log4perl qw( :easy ); my $MAXINT = 2 ** 53; my %booleans = map {$_ => 1} qw( debug fork tls_verify_certificate update use_node_name use_default_node ); { my $instance; sub instance { my ($class) = @_; $instance ||= bless { # To be able to identify if we're the root instance or a nested one. root_instance => 1, config => bless ( { config_file => "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf", dbdir => $Munin::Common::Defaults::MUNIN_DBDIR, debug => 0, fork => 1, rrdcached_socket => "", # default is unused graph_data_size => 'normal', graph_strategy => 'cron', groups => {}, local_address => 0, logdir => $Munin::Common::Defaults::MUNIN_LOGDIR, max_processes => 16, rundir => $Munin::Common::Defaults::MUNIN_STATEDIR, timeout => 180, tls => 'disabled', tls_ca_certificate => "$Munin::Common::Defaults::MUNIN_CONFDIR/cacert.pem", tls_certificate => "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.pem", tls_private_key => "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.pem", tls_verify_certificate => 0, tls_verify_depth => 5, tmpldir => "$Munin::Common::Defaults::MUNIN_CONFDIR/templates", staticdir => "$Munin::Common::Defaults::MUNIN_CONFDIR/static", cgitmpdir => "$Munin::Common::Defaults::MUNIN_DBDIR/cgi-tmp", }, $class ), oldconfig => bless ( { config_file => "$Munin::Common::Defaults::MUNIN_DBDIR/datafile", }, $class ), }, $class; return $instance; } } # Returns true if $char is the last character of $str. sub _final_char_is { # Not a object method. my ($char, $str) = @_; return rindex($str, $char) == ( length($str) - 1 ); } sub _create_and_set { my ($self,$groups,$host,$key,$value) = @_; # Nested creation of group and host class objects, and then set # attribute value. my $setref = $self; # Used as "iterator" as we traverse the hash. my @key = split(/\./, $key); my $last_word = pop @key; if ($booleans{$last_word}) { $value = $self->_parse_bool($value); } # If there is a host there is a group. So need only check group to see # how deep we go. if ($#{$groups} == -1) { $self->{$key} = $value; return; } foreach my $group (@{$groups}) { # Create nested group objects $setref->{groups}{$group} ||= Munin::Master::Group->new($group); if ($setref eq $self) { $setref->{groups}{$group}{group}=undef; } else { $setref->{groups}{$group}{group}=$setref; } $setref = $setref->{groups}{$group}; } if ($host) { if (! defined ( $setref->{hosts}{$host} ) ) { $setref->{hosts}{$host} = Munin::Master::Host->new($host,$setref,{ $key => $value }); } else { $setref->{hosts}{$host}->{$key} = $value; } } else { # Implant key/value into group $setref->{$key} = $value; } # } sub set_value { my ($self, $longkey, $value) = @_; my ($groups,$host,$key) = $self->_split_config_line($longkey); $self->_create_and_set($groups,$host,$key,$value); } sub _extract_group_name_from_definition { # Extract the group name from any munin.conf section name # # This a object method for the sake of finding it with the help of # a object of the right kind. # Cases: # * foo.example.com -> example.com # * bar;foo.example.com -> bar # * foo -> foo # * bar;foo -> bar # * bar; -> bar # # More cases: # * bar;foo.example.com:service my ($self, $definition) = @_; my $dot_loc = index($definition, '.'); my $sc_loc = index($definition, ';'); # Return bare hostname return $definition if $sc_loc == -1 and $dot_loc == -1; # Return explicit group name return substr($definition, 0, $sc_loc) if $sc_loc > -1 and ($dot_loc == -1 or $sc_loc < $dot_loc); # Return domain name as group name return substr($definition, $dot_loc + 1); } sub _concat_config_line { # Canonify and concatenate current prefix and and the config line # we're parsing now in a correct manner. # See also _split_config_line. # No sanity checking in this procedure. Use _concat_config_line_ok to # get sanity/syntax checking. my ($self, $prefix, $key, $value) = @_; my $longkey; # Allowed constructs: # [group;host] # port 4949 # # This is shorthand for [domain;host.domain]: # [host.domain] # port 4949 # # [group;] # [group;host] # [group;host:service] # [group;host:service.field] # [group1;group2;host:service.field] # keyword value # field.keyword value (only if no service in prefix) # group_order .... # # And more recently this for nested services (multigraph). # [group1;group2;host:service:service...] # :service.field.keyword value # # Rules: # - Last ';' terminates group part # - Last ':' terminates the host part # - The rest is a collection of services and time series data # - which we collect under the host name in the data-structure. # Note that keywords can come directly after group names in the # concatenated syntax: group;group_order ... if ($prefix eq '') { # If the prefix is empty then the key had better be well formed and # complete, because we'll use it without further checking. return $key; } if (index($prefix,';') == -1) { # Handle shorthand: Group name is given by host name my $group = $self->_extract_group_name_from_definition($prefix); $prefix = "$group;$prefix"; } if (_final_char_is(';',$prefix)) { # Prefix ended in the middle of a group. The rest can be # appended. $longkey = $prefix.$key; } elsif (index($prefix,':') != -1) { # Host name ends explicitly in the prefix. Use "." everywhere after : # Key is a nested service name $longkey = $prefix.'.'.$key; } else { # Prefix ends in host name but ":" is missing. $longkey = $prefix.':'.$key; } return $longkey; } sub _concat_config_line_ok { # Concatenate config line and do some extra syntaxy checks # # If the arrived at config line is not legal as far as we can tell # then croak here. my ($self, $prefix, $key, $value) = @_; if (!defined($key) or !$key) { ERROR "[ERROR] Somehow we're missing a keyword sometime after section [$prefix]"; die "[ERROR] Somehow we're missing a keyword sometime after section [$prefix]"; } my $longkey = $self->_concat_config_line($prefix,$key,$value); # _split_config_line_ok has the best starting point for checks on the # syntax/contents and so we call that to get the checks performed. # eval { $self->_split_config_line_ok($longkey); }; if ($EVAL_ERROR) { # _split_config_line_ok already logged the problem. my $err_msg = "[ERROR] config error under [$prefix] for '$key $value' : $EVAL_ERROR"; ERROR $err_msg; die $err_msg; } return $longkey; } sub _split_config_line { # After going to all that trouble with putting a "longkey" together # we now persue splitting the key in a nice and accurate manner. # # See also _concat_config_line my ($self,$line) = @_; my $groups; my $host; my $key; # Cases to keep in mind # htmldir # Group;address # Group;Group;address # Group;Host:address # Group;Host:if_eth0.in.value # Group;Host:snmp_foo_if_input.snmp_foo_if_input_0.value my $sc = index($line,';'); if ($sc == -1) { $groups=''; } else { # Note that .+ is greedy so $groups is the whole groups grouping $line =~ /(.+);(.*)/; ($groups, $line) = ($1, $2); } # Now left with (1:1 with cases above) # address # address # Host:address # Host:if_eth0.in.value # Host:snmp_foo_if_input.snmp_foo_if_input_0.value my $cc = index($line,':'); if ($cc == -1) { # No host delimiter: the rest is a setting $host = ''; $key = $line; } else { # Can see host delimiter. Copy it and the rest is a setting. $host = substr($line,0,$cc); substr($line,0,$cc+1) = ''; $key = $line; } return ([split(';',$groups)],$host,$key); } sub _split_config_line_ok { # Split config line and do some extra syntaxy checks # # If all is not well we'll corak here. my ($self,$longkey,$value) = @_; my ($groups,$host,$key) = $self->_split_config_line($longkey); my @words = split (/[.]/, $key); my $last_word = pop(@words); if (! $self->is_keyword($last_word)) { # We have seen some problems with $value in the following # error message. Se make sure it's defined so we can see the # message. $value = '' unless defined $value; croak "Parse error in ".$self->{config_file}." for $key:\n". " Unknown keyword at end of left hand side of line $NR ($key $value)\n"; } if ($host =~ /[^-A-Za-z0-9\.]/) { # Since we're not quite sure what context we're called in we'll report the error message more times rather than fewer. ERROR "[ERROR] Hostname '$host' contains illegal characters (http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names). Please fix this by replacing illegal characters with '-'. Remember to do it on both in the master configuration and on the munin-node."; croak "[ERROR] Hostname '$host' contains illegal characters (http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names). Please fix this by replacing illegal characters with '-'. Remember to do it on both in the master configuration and on the munin-node.\n"; } return ($groups,$host,$key); } sub _parse_config_line { # Parse and save contents of random user configuration. my ($self, $prefix, $key, $value) = @_; my $longkey = $self->_concat_config_line_ok($prefix,$key,$value); $self->set_value($longkey,$value); } sub parse_config { my ($self, $io) = @_; my $section = undef; my $continuation = ''; my $prefix = ''; while (my $line = <$io>) { $self->_strip_comment($line); $self->_trim($line); # Handle continuation lines (ending in \) if ($line =~ s|\\$||) { $continuation .= $line; next; } elsif ($continuation) { $line = $continuation . $line; $continuation = ''; } # This must be handled after continuation hadling otherwise # empty lines will be ignored in continuation context. next if !length($line); # Group/host/service configuration is saved for later persual. # Everything else is saved at once. Note that _trim removes # leading whitespace so section changes can only happen if a new # [foo] comes along. if ($line =~ m{\A \[ ([^]]+) \] \s* \z}xms) { $prefix = $1; } else { my($key,$value) = split(/\s+/,$line,2); $self->_parse_config_line($prefix,$key,$value); } } } sub look_up { # The path through the hash works out to: # $self->{groups}{localdomain}[...]{hosts}{localhost} my ($self,$key) = @_; my (@groups) = split(';',$key); my $host = pop(@groups); my $value = $self; for my $group (@groups) { if (defined $value and defined $value->{groups} and defined $value->{groups}{$group}) { $value = $value->{groups}{$group}; } else { return undef; } } if (defined $value and defined $value->{hosts} and defined $value->{hosts}{$host}) { return $value->{hosts}{$host}; }; return undef; } sub get_groups_and_hosts { my ($self) = @_; return $self->{groups}; } sub get_all_hosts { # Note! This method is implemented in multiple classes to make the # recursion complete. my ($self) = @_; my @hosts = (); for my $group (values %{$self->{groups}}) { push @hosts, $group->get_all_hosts; } return @hosts; } sub set { my ($self, $config) = @_; # Note: config overrides self. %$self = (%$self, %$config); } 1; __END__ =head1 NAME Munin::Master::Config - Holds the master configuration. =head1 METHODS =over =item B my $config = Munin::Master::Config->instance; Returns the (possibly newly created) singleton configuration instance. =item B $config->set_value($longkey, $value); Set a value in the config, where $longkey is the full ;:. separated value. =item B $config->parse_config($io); Populates the fields of $config from the configuration file referred to by filehandle $io. =item B my $value = $config->look_up($key); Look up a group/host by a key such as "localdomain;localhost" etc. If the path does not exist create it with correct class and so on. Lookup ends at host name. If something is missing along the way undef is returned. =item B my $gah = $config->get_groups_and_hosts(); Returns all the groups and hosts defined in the configuration. =item B my $hosts = $config->get_all_hosts(); Returns a list of all the hosts defined in the configuration. =item B $config->set(\%attrs); Sets the keys and values in $config to those in %attrs. =back =cut # vim: ts=8 : sw=4 : et munin-2.0.25/master/lib/Munin/Master/GraphOld.pm000066400000000000000000001740721243472346000213660ustar00rootroot00000000000000package Munin::Master::GraphOld; # -*- cperl -*- =encoding utf-8 =begin comment This is Munin::Master::GraphOld, a package shell to make munin-graph modular (so it can loaded persistently in munin-cgi-graph for example) without making it object oriented yet. The non "old" module will feature propper object orientation like munin-update and will have to wait until later. Copyright (C) 2002-2010 Jimmy Olsen, Audun Ytterdal, Kjell Magne Řierud, Nicolai Langfeldt, Linpro AS, Redpill Linpro AS and others. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . $Id$ =end comment =cut use warnings; use strict; use Exporter; our (@ISA, @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(graph_startup graph_check_cron graph_main graph_config); use IO::Socket; use IO::Handle; use RRDs; use POSIX qw(strftime); use Digest::MD5; use Getopt::Long; use Time::HiRes; use Text::ParseWords; # For UTF-8 handling (plugins are assumed to use Latin 1) if ($RRDs::VERSION >= 1.3) { use Encode; } use Munin::Master::Logger; use Munin::Master::Utils; use Munin::Common::Defaults; use Log::Log4perl qw( :easy ); # RRDtool 1.2 requires \\: in comments my $RRDkludge = $RRDs::VERSION < 1.2 ? '' : '\\'; # And RRDtool 1.2.* draws lines with crayons so we hack # the LINE* options a bit. my $LINEkluge = 0; if ($RRDs::VERSION >= 1.2 and $RRDs::VERSION < 1.3) { # Only kluge the line widths in RRD 1.2* $LINEkluge = 1; } # RRD 1.3 has a "ADDNAN" operator which evaluates n + NaN = n instead of = NaN. my $AddNAN = '+'; if ($RRDs::VERSION >= 1.3) { $AddNAN = 'ADDNAN'; } # Force drawing of "graph no". my $force_graphing = 0; my $force_lazy = 1; my $do_usage = 0; my $do_version = 0; my $cron = 0; my $list_images = 0; my $output_file = undef; my $log_file = undef; my $skip_locking = 0; my $skip_stats = 0; my $stdout = 0; my $force_run_as_root = 0; my $conffile = $Munin::Common::Defaults::MUNIN_CONFDIR . "/munin.conf"; my $libdir = $Munin::Common::Defaults::MUNIN_LIBDIR; # Note: Nothing by default is more convenient and elliminates code while # for cgi graphing - but it breaks how munin-graph expected stuff to work. # I think. my %draw = ( 'day' => 0, 'week' => 0, 'month' => 0, 'year' => 0, 'sumyear' => 0, 'sumweek' => 0, 'pinpoint' => 0, ); my %init_draw = %draw; my $pinpoint = {}; my ($size_x, $size_y, $full_size_mode, $only_graph); my ($lower_limit, $upper_limit); my %PALETTE; # Hash of available palettes my @COLOUR; # Array of actuall colours to use { no warnings; $PALETTE{'old'} = [ # This is the old munin palette. It lacks contrast. qw(22ff22 0022ff ff0000 00aaaa ff00ff ffa500 cc0000 0000cc 0080C0 8080C0 FF0080 800080 688e23 408080 808000 000000 00FF00 0080FF FF8000 800000 FB31FB )]; $PALETTE{'default'} = [ # New default palette.Better contrast,more colours #Greens Blues Oranges Dk yel Dk blu Purple lime Reds Gray qw(00CC00 0066B3 FF8000 FFCC00 330099 990099 CCFF00 FF0000 808080 008F00 00487D B35A00 B38F00 6B006B 8FB300 B30000 BEBEBE 80FF80 80C9FF FFC080 FFE680 AA80FF EE00CC FF8080 666600 FFBFFF 00FFCC CC6699 999900 )]; # Line variations: Pure, earthy, dark pastel, misc colours } my $range_colour = "22ff22"; my $single_colour = "00aa00"; # Use 400 x RRA step, in order to have 1px per RRA sample. my %times = ( "day" => "-2000m", # (i.e. -33h20m) "week" => "-12000m", # (i.e. -8d13h20m) "month" => "-48000m", # (i.e. -33d8h) "year" => "-400d", "pinpoint" => "dummy", ); my %resolutions = ( "day" => "300", "week" => "1500", "month" => "7200", "year" => "86400" ); my %sumtimes = ( # time => [ label, seconds-in-period ] "week" => ["hour", 12], "year" => ["day", 288]); # Limit graphing to certain hosts and/or services my @limit_hosts = (); my @limit_services = (); my $only_fqn = ''; my $watermark = "Munin " . $Munin::Common::Defaults::MUNIN_VERSION; # RRD param for RRDCACHED_ADDRESS my @rrdcached_params; my $running = 0; my $max_running = 6; my $do_fork = 1; # "global" Configuration hash my $config = undef; # stats file handle my $STATS; my @init_limit_hosts = @limit_hosts; my @init_limit_services = @limit_services; sub process_pinpoint { my ($pinpoint, $arg_name, $arg_value) = @_; # XXX - Special hack^h^h^h^h treatment for --pinpoint if ($arg_value && $arg_value =~ m/^(\d+),(\d+)$/ ) { # "pinpoint" replaces all the other timing options $draw{'day'}=0; $draw{'week'}=0; $draw{'month'}=0; $draw{'year'}=0; $draw{'sumweek'}=0; $draw{'sumyear'}=0; $draw{'pinpoint'}=1; $$pinpoint->{'start'} = $1; # preparsed values $$pinpoint->{'end'} = $2; } } sub process_fqn { my ($fqn, $arg) = @_; # Reset what to draw whenever we specify a new fqn $draw{'day'} = $draw{'week'} = $draw{'month'} = $draw{'year'} = $draw{'sumweek'} = $draw{'sumyear'} = $draw{'pinpoint'} = 0; return $arg; } sub graph_startup { # Parse options and set up. Stuff that is usually only needed once. # # Do once pr. run, pr possebly once pr. graph in the case of # munin-cgi-graph # Localise the stuff, overwise it will be stacked up with CGI %draw = %init_draw; @limit_hosts = @init_limit_hosts; @limit_services = @init_limit_services; $pinpoint = undef; my $pinpointopt = undef; $force_graphing = 0; $force_lazy = 1; $do_usage = 0; $do_version = 0; $cron = 0; $list_images = 0; $output_file = undef; $log_file = undef; $skip_locking = 0; $skip_stats = 0; $stdout = 0; $size_x = undef; $size_y = undef; $full_size_mode = undef; $only_graph = undef; $lower_limit = undef; $upper_limit = undef; # Get options my ($args) = @_; local @ARGV = @{$args}; # NOTE! Some of these options are available in graph_main too # if you make changes here, make them there too. my $debug; &print_usage_and_exit unless GetOptions ( "force!" => \$force_graphing, "lazy!" => \$force_lazy, "host=s" => \@limit_hosts, "service=s" => \@limit_services, "only-fqn=s" => sub{ $only_fqn = process_fqn(@_); }, "config=s" => \$conffile, "stdout!" => \$stdout, "force-run-as-root!" => \$force_run_as_root, "day!" => \$draw{'day'}, "week!" => \$draw{'week'}, "month!" => \$draw{'month'}, "year!" => \$draw{'year'}, "pinpoint=s" => sub{ process_pinpoint(\$pinpoint,@_); }, "sumweek!" => \$draw{'sumweek'}, "sumyear!" => \$draw{'sumyear'}, "size_x=i" => \$size_x, "size_y=i" => \$size_y, "full_size_mode!"=> \$full_size_mode, "only_graph!"=> \$only_graph, "upper_limit=s" => \$upper_limit, "lower_limit=s" => \$lower_limit, "list-images!" => \$list_images, "o|output-file=s" => \$output_file, "l|log-file=s" => \$log_file, "skip-locking!" => \$skip_locking, "skip-stats!" => \$skip_stats, "version!" => \$do_version, "cron!" => \$cron, "fork!" => \$do_fork, "n=n" => \$max_running, "help" => \$do_usage, "debug!" => \$debug, ); if ($do_version) { print_version_and_exit(); } if ($do_usage) { print_usage_and_exit(); } exit_if_run_by_super_user() unless $force_run_as_root; # Only read $config once (thx Jani M.) # # FIXME - the loaded $config is stale within 5 minutes. # we either need to die or restart ourselves when this # happens. if (!defined($config)) { munin_readconfig_base($conffile); # XXX: check if it needs datafile at that point $config = munin_readconfig_part('datafile', 0); } $config->{debug} = $debug; my $palette = &munin_get($config, "palette", "default"); $max_running = &munin_get($config, "max_graph_jobs", $max_running); if ($config->{"rrdcached_socket"}) { if ($RRDs::VERSION >= 1.3){ # Using the RRDCACHED_ADDRESS environnement variable, as # it is way less intrusive than the command line args. $ENV{RRDCACHED_ADDRESS} = $config->{"rrdcached_socket"}; } else { ERROR "[ERROR] RRDCached feature ignored: RRD version must be at least 1.3. Version found: " . $RRDs::VERSION; } } if ($max_running == 0) { $do_fork = 0; } if (defined($PALETTE{$palette})) { @COLOUR = @{$PALETTE{$palette}}; } else { die "Unknown palette named by 'palette' keyword: $palette\n"; } return $config; } sub graph_check_cron { # Are we running from cron and do we have matching graph_strategy if (&munin_get($config, "graph_strategy", "cron") ne "cron" and $cron) { # Strategy mismatch: We're run from cron, but munin.conf says # we use dynamic graph generation return 0; } # Strategy match: return 1; } sub graph_main { my ($args) = @_; local @ARGV = @{$args}; # The loaded $config is stale within 5 minutes. # So, we need to reread it when this happens. $config = munin_readconfig_part('datafile'); # Reset an eventual custom size $size_x = undef; $size_y = undef; $full_size_mode = undef; $only_graph = undef; $lower_limit = undef; $upper_limit = undef; $pinpoint = undef; # XXX [DEBUG] my $debug = undef; GetOptions ( "host=s" => \@limit_hosts, "only-fqn=s" => sub { $only_fqn = process_fqn(@_); }, "day!" => \$draw{'day'}, "week!" => \$draw{'week'}, "month!" => \$draw{'month'}, "year!" => \$draw{'year'}, "pinpoint=s" => sub{ process_pinpoint(\$pinpoint,@_); }, "sumweek!" => \$draw{'sumweek'}, "sumyear!" => \$draw{'sumyear'}, "o|output-file=s" => \$output_file, # XXX [DEBUG] "debug!" => \$debug, "size_x=i" => \$size_x, "size_y=i" => \$size_y, "full_size_mode!"=> \$full_size_mode, "only_graph!" => \$only_graph, "upper_limit=s" => \$upper_limit, "lower_limit=s" => \$lower_limit, ); # XXX [DEBUG] logger_debug() if $debug; my $graph_time = Time::HiRes::time; munin_runlock("$config->{rundir}/munin-graph.lock") unless $skip_locking; unless ($skip_stats) { open($STATS, '>', "$config->{dbdir}/munin-graph.stats.tmp") or WARN "[WARNING] Unable to open $config->{dbdir}/munin-graph.stats.tmp"; autoflush $STATS 1; } process_work(@limit_hosts); $graph_time = sprintf("%.2f", (Time::HiRes::time - $graph_time)); rename( "$config->{dbdir}/munin-graph.stats.tmp", "$config->{dbdir}/munin-graph.stats" ); close $STATS unless $skip_stats; munin_removelock("$config->{rundir}/munin-graph.lock") unless $skip_locking; $running = wait_for_remaining_children($running); } # -------------------------------------------------------------------------- sub get_title { my $service = shift; my $scale = shift; my $scale_text; if ($pinpoint) { my $start_text = localtime($pinpoint->{"start"}); my $end_text = localtime($pinpoint->{"end"}); $scale_text = "from $start_text to $end_text"; } else { $scale_text = "by " . $scale; } my $title = munin_get($service, "graph_title", $service); # Substitute ${graph_period} in title my $period = munin_get($service, "graph_period", "second"); $title =~ s/\$\{graph_period\}/$period/g; return ("$title - $scale_text"); } sub get_custom_graph_args { my $service = shift; my $result = []; my $args = munin_get($service, "graph_args"); if (defined $args) { my $result = [ grep /\S/, "ewords('\s+', 0, $args) ]; return $result; } else { return; } } # insert these arguments after all others # needed for your own VDEF/CDEF/DEF combinations sub get_custom_graph_args_after { my $service = shift; my $result = []; my $args = munin_get($service, "graph_args_after"); if (defined $args) { my $result = ["ewords('\s+', 0, $args)]; return $result; } else { return; } } # set a graph end point in the future # needed for CDEF TREND and PREDICT sub get_end_offset { my $service = shift; # get number of seconds in future return munin_get($service, "graph_future", 0); } sub get_vlabel { my $service = shift; my $scale = munin_get($service, "graph_period", "second"); my $res = munin_get($service, "graph_vlabel", munin_get($service, "graph_vtitle")); if (defined $res) { $res =~ s/\$\{graph_period\}/$scale/g; } return $res; } sub should_scale { my $service = shift; my $ret; if (!defined($ret = munin_get_bool($service, "graph_scale"))) { $ret = !munin_get_bool($service, "graph_noscale", 0); } return $ret; } sub get_header { my $service = shift; my $scale = shift; my $sum = shift; my $result = []; my $tmp_field; # Picture filename push @$result, get_picture_filename($service, $scale, $sum || undef); # Title push @$result, ("--title", get_title($service, $scale)); # When to start the graph if ($pinpoint) { push @$result, "--start", $pinpoint->{start}; push @$result, "--end", $pinpoint->{end}; } else { push @$result, "--start", $times{$scale}; } # Custom graph args, vlabel and graph title if (defined($tmp_field = get_custom_graph_args($service))) { push(@$result, @{$tmp_field}); } if (defined($tmp_field = get_vlabel($service))) { push @$result, ("--vertical-label", $tmp_field); } push @$result, '--slope-mode' if $RRDs::VERSION >= 1.2; push @$result, "--height", ($size_y || munin_get($service, "graph_height", "175")); push @$result, "--width", ($size_x || munin_get($service, "graph_width", "400")); push @$result, "--full-size-mode" if ($full_size_mode); push @$result, "--only-graph" if ($only_graph); push @$result,"--rigid" if (defined $lower_limit || defined $upper_limit); push @$result, "--imgformat", "PNG"; push @$result, "--lazy" if ($force_lazy); push(@$result, "--units-exponent", "0") if (!should_scale($service)); return $result; } sub get_sum_command { my $field = shift; return munin_get($field, "sum"); } sub get_stack_command { my $field = shift; return munin_get($field, "stack"); } sub expand_specials { my $service = shift; my $order = shift; my $preproc = []; my $single ; # Test if already expanded { my $cached = $service->{"#%#expand_specials"}; if (defined $cached) { DEBUG "[DEBUG] expand_specials(): already processed " . munin_dumpconfig_as_str($cached); return $cached; } DEBUG "[DEBUG] expand_specials(): not processed, proceeding for " . munin_dumpconfig_as_str($service); } # we have to compute the result; my $result = []; my $fieldnum = 0; for my $field (@$order) { # Search for 'specials'... my $tmp_field; if ($field =~ /^-(.+)$/) { # Invisible field $field = $1; munin_set_var_loc($service, [$field, "graph"], "no"); } $fieldnum++; if ($field =~ /^([^=]+)=(.+)$/) { # Aliased in graph_order my $fname = $1; my $spath = $2; my $src = munin_get_node_partialpath($service, $spath); my $sname = munin_get_node_name($src); if(!defined $src) { ERROR "[ERROR] Failed to find $fname source at $spath, skipping field"; next; } DEBUG "[DEBUG] Copying settings from $sname to $fname."; foreach my $foption ("draw", "type", "rrdfile", "fieldname", "info") { if (!defined $service->{$fname}->{$foption}) { if (defined $src->{$foption}) { munin_set_var_loc($service, [$fname, $foption], $src->{$foption}); } } } if (!defined $service->{$fname}->{"label"}) { munin_set_var_loc($service, [$fname, "label"], $fname); } munin_set_var_loc( $service, [$fname, "filename"], munin_get_rrd_filename($src)); } elsif (defined($tmp_field = get_stack_command($service->{$field}))) { # Aliased with .stack DEBUG "[DEBUG] expand_specials ($tmp_field): Doing stack..."; my @spc_stack = (); foreach my $pre (split(/\s+/, $tmp_field)) { (my $name = $pre) =~ s/=.+//; # Auto selects the .draw my $draw = (!@spc_stack) ? munin_get($service->{$field}, "draw", "LINE1") : "STACK"; munin_set_var_loc($service, [$name, "draw"], $draw); # Don't process this field later munin_set_var_loc($service, [$field, "process"], "0"); push(@spc_stack, $name); push(@$preproc, $pre); push @$result, "$name.label"; push @$result, "$name.draw"; push @$result, "$name.cdef"; munin_set_var_loc($service, [$name, "label"], $name); munin_set_var_loc($service, [$name, "cdef"], "$name,UN,0,$name,IF"); if (munin_get($service->{$field}, "cdef") and !munin_get_bool($service->{$name}, "onlynullcdef", 0)) { DEBUG "[DEBUG] NotOnlynullcdef ($field)..."; $service->{$name}->{"cdef"} .= "," . $service->{$field}->{"cdef"}; $service->{$name}->{"cdef"} =~ s/\b$field\b/$name/g; } else { DEBUG "[DEBUG] Onlynullcdef ($field)..."; munin_set_var_loc($service, [$name, "onlynullcdef"], 1); push @$result, "$name.onlynullcdef"; } } } # if get_stack_command elsif (defined($tmp_field = get_sum_command($service->{$field}))) { my @spc_stack = (); my $last_name = ""; DEBUG "[DEBUG] expand_specials ($tmp_field): Doing sum..."; if (@$order == 1 or (@$order == 2 and munin_get($field, "negative", 0))) { $single = 1; } foreach my $pre (split(/\s+/, $tmp_field)) { (my $path = $pre) =~ s/.+=//; my $name = "z" . $fieldnum . "_" . scalar(@spc_stack); $last_name = $name; munin_set_var_loc($service, [$name, "cdef"], "$name,UN,0,$name,IF"); munin_set_var_loc($service, [$name, "graph"], "no"); munin_set_var_loc($service, [$name, "label"], $name); push @$result, "$name.cdef"; push @$result, "$name.graph"; push @$result, "$name.label"; push(@spc_stack, $name); push(@$preproc, "$name=$pre"); } $service->{$last_name}->{"cdef"} .= "," . join(",$AddNAN,", @spc_stack[0 .. @spc_stack - 2]) . ",$AddNAN"; if (my $tc = munin_get($service->{$field}, "cdef", 0)) { # Oh bugger... DEBUG "[DEBUG] Oh bugger...($field)...\n"; $tc =~ s/\b$field\b/$service->{$last_name}->{"cdef"}/; $service->{$last_name}->{"cdef"} = $tc; } munin_set_var_loc($service, [$field, "process"], "0"); munin_set_var_loc( $service, [$last_name, "draw"], munin_get($service->{$field}, "draw")); munin_set_var_loc( $service, [$last_name, "colour"], munin_get($service->{$field}, "colour")); munin_set_var_loc( $service, [$last_name, "label"], munin_get($service->{$field}, "label")); munin_set_var_loc( $service, [$last_name, "graph"], munin_get($service->{$field}, "graph", "yes")); if (my $tmp = munin_get($service->{$field}, "negative")) { munin_set_var_loc($service, [$last_name, "negative"], $tmp); } munin_set_var_loc($service, [$field, "realname"], $last_name); } elsif (my $nf = munin_get($service->{$field}, "negative", 0)) { if ( !munin_get_bool($service->{$nf}, "graph", 1) or munin_get_bool($service->{$nf}, "skipdraw", 0)) { munin_set_var_loc($service, [$nf, "graph"], "no"); } } } # for (@$order) # Return & save it for future use $service->{"#%#expand_specials"} = { "added" => $result, "preprocess" => $preproc, "single" => $single, }; return $service->{"#%#expand_specials"}; } sub single_value { my $service = shift; my $graphable = munin_get($service, "graphable", 0); if (!$graphable) { foreach my $field (@{munin_get_field_order($service)}) { DEBUG "[DEBUG] single_value: Checking field \"$field\"."; $graphable++ if munin_draw_field($service->{$field}); } munin_set_var_loc($service, ["graphable"], $graphable); } DEBUG "[DEBUG] service " . join(' :: ', @{munin_get_node_loc($service)}) . " has $graphable elements."; return ($graphable == 1); } sub get_field_name { my $name = shift; $name = substr(Digest::MD5::md5_hex($name), -15) if (length $name > 15); return $name; } sub process_work { my (@hosts) = @_; # Make array of what is probably needed to graph my $work_array = []; if ($only_fqn) { push @$work_array, munin_find_node_by_fqn($config,$only_fqn); } elsif (@hosts) { foreach my $nodename (@hosts) { push @$work_array, map {@{munin_find_field($_->{$nodename}, "graph_title")}} @{munin_find_field($config, $nodename)}; } } else { FATAL "[FATAL] In process_work, no fqn and no hosts!"; } # @$work_array contains copy of (or pointer to) each service to be graphed. for my $service (@$work_array) { # Want to avoid forking for that next if (skip_service($service)); # Fork (or not) and run the anonymous sub afterwards. fork_and_work(sub {process_service($service);}); } } sub process_field { my $field = shift; return munin_get_bool($field, "process", 1); } sub fork_and_work { my ($work) = @_; if (!$do_fork) { # We're not forking. Do work and return. DEBUG "[DEBUG] Doing work synchronously"; &$work; return; } # Make sure we don't fork too much while ($running >= $max_running) { DEBUG "[DEBUG] Too many forks ($running/$max_running), wait for something to get done"; look_for_child("block"); --$running; } my $pid = fork(); if (!defined $pid) { ERROR "[ERROR] fork failed: $!"; die "fork failed: $!"; } if ($pid == 0) { # This block does the real work. Since we're forking exit # afterwards. &$work; # See?! exit 0; } else { ++$running; DEBUG "[DEBUG] Forked: $pid. Now running $running/$max_running"; while ($running and look_for_child()) { --$running; } } } sub remove_dups { my @ret; my %keys; for my $order (@_) { (my $name = $order) =~ s/=.+//; push @ret, $order unless ($keys{$name} ++); } return @ret; } sub process_service { my ($service) = @_; # See if we should skip the service return if (skip_service($service)); # Make my graphs my $sname = munin_get_node_name($service); my $skeypath = munin_get_keypath($service); my $service_time = Time::HiRes::time; my $lastupdate = 0; my $now = time; my $fnum = 0; my @rrd; DEBUG "[DEBUG] Node name: $sname\n"; my $field_count = 0; my $max_field_len = 0; my @field_order = (); my $rrdname; @field_order = @{munin_get_field_order($service)}; # Array to keep 'preprocess'ed fields. DEBUG "[DEBUG] Expanding specials for $sname: \"" . join("\",\"", @field_order) . "\"."; my $expanded_result = expand_specials($service, \@field_order); my $force_single_value = $expanded_result->{single}; my @added = @{ $expanded_result->{added} }; # put preprocessed fields in front unshift @field_order, @{ $expanded_result->{preprocess} }; # Remove duplicates, while retaining the order @field_order = remove_dups ( @field_order ); # Get max label length DEBUG "[DEBUG] Checking field lengths for $sname: \"" . join('","', @field_order) . '".'; $max_field_len = munin_get_max_label_length($service, \@field_order); # Global headers makes the value tables easier to read no matter how # wide the labels are. my $global_headers = 1; # Default format for printing under graph. my $avgformat; my $rrdformat = $avgformat = "%6.2lf"; if (munin_get($service, "graph_args", "") =~ /--base\s+1024/) { # If the base unit is 1024 then 1012.56 is a valid # number to show. That's 7 positions, not 6. $rrdformat = $avgformat = "%7.2lf"; } # Plugin specified complete printf format $rrdformat = munin_get($service, "graph_printf", $rrdformat); my $rrdscale = ''; if (munin_get_bool($service, "graph_scale", 1)) { $rrdscale = '%s'; } # Array to keep negative data until we're finished with positive. my @rrd_negatives = (); my $filename; my %total_pos; my %total_neg; my $autostacking = 0; DEBUG "[DEBUG] Treating fields \"" . join("\",\"", @field_order) . "\"."; for my $fname (@field_order) { my $path = undef; my $field = undef; if ($fname =~ s/=(.+)//) { $path = $1; } $field = munin_get_node($service, [$fname]); next if (!defined $field or !$field or !process_field($field)); DEBUG "[DEBUG] Processing field \"$fname\" [" . munin_get_node_name($field) . "]."; my $fielddraw = munin_get($field, "draw", "LINE1"); if ($field_count == 0 and $fielddraw eq 'STACK') { # Illegal -- first field is a STACK DEBUG "ERROR: First field (\"$fname\") of graph " . join(' :: ', munin_get_node_loc($service)) . " is STACK. STACK can only be drawn after a LINEx or AREA."; $fielddraw = "LINE1"; } if ($fielddraw eq 'AREASTACK') { if ($autostacking == 0) { $fielddraw = 'AREA'; $autostacking = 1; } else { $fielddraw = 'STACK'; } } if ($fielddraw =~ /LINESTACK(\d+(?:.\d+)?)/) { if ($autostacking == 0) { $fielddraw = "LINE$1"; $autostacking = 1; } else { $fielddraw = 'STACK'; } } # Getting name of rrd file $filename = munin_get_rrd_filename($field, $path); if (! $filename) { ERROR "[ERROR] filename is empty for " . munin_dumpconfig_as_str($field) . ", $path"; # Ignore this field next; } if(!defined $filename) { ERROR "[ERROR] Failed getting filename for $path, skipping field"; next; } # Here it is OK to flush the rrdcached, since we'll flush it anyway # with graph my $update = RRDs::last(@rrdcached_params, $filename); $update = 0 if !defined $update; if ($update > $lastupdate) { $lastupdate = $update; } # It does not look like $fieldname.rrdfield is possible to set my $rrdfield = munin_get($field, "rrdfield", "42"); my $single_value = $force_single_value || single_value($service); # XXX - single_value is wrong for some multigraph, disabling it for now $single_value = 0; my $has_negative = munin_get($field, "negative"); # Trim the fieldname to make room for other field names. $rrdname = &get_field_name($fname); reset_cdef($service, $rrdname); if ($rrdname ne $fname) { # A change was made munin_set($field, "cdef_name", $rrdname); } # Push will place the DEF too far down for some CDEFs to work unshift(@rrd, "DEF:g$rrdname=" . $filename . ":" . $rrdfield . ":AVERAGE"); unshift(@rrd, "DEF:i$rrdname=" . $filename . ":" . $rrdfield . ":MIN"); unshift(@rrd, "DEF:a$rrdname=" . $filename . ":" . $rrdfield . ":MAX"); if (munin_get_bool($field, "onlynullcdef", 0)) { push(@rrd, "CDEF:c$rrdname=g$rrdname" . (($now - $update) > 900 ? ",POP,UNKN" : "")); } if ( munin_get($field, "type", "GAUGE") ne "GAUGE" and graph_by_minute($service)) { push(@rrd, expand_cdef($service, \$rrdname, "$fname,60,*")); } if ( munin_get($field, "type", "GAUGE") ne "GAUGE" and graph_by_hour($service)) { push(@rrd, expand_cdef($service, \$rrdname, "$fname,3600,*")); } if (my $tmpcdef = munin_get($field, "cdef")) { push(@rrd, expand_cdef($service, \$rrdname, $tmpcdef)); push(@rrd, "CDEF:c$rrdname=g$rrdname"); DEBUG "[DEBUG] Field name after cdef set to $rrdname"; } elsif (!munin_get_bool($field, "onlynullcdef", 0)) { push(@rrd, "CDEF:c$rrdname=g$rrdname" . (($now - $update) > 900 ? ",POP,UNKN" : "")); } next if !munin_draw_field($field); DEBUG "[DEBUG] Drawing field \"$fname\"."; if ($single_value) { # Only one field. Do min/max range. push(@rrd, "CDEF:min_max_diff=a$rrdname,i$rrdname,-"); push(@rrd, "CDEF:re_zero=min_max_diff,min_max_diff,-") if !munin_get($field, "negative"); push(@rrd, "AREA:i$rrdname#ffffff"); push(@rrd, "STACK:min_max_diff#$range_colour"); push(@rrd, "LINE1:re_zero#000000") if !munin_get($field, "negative"); } # Push "global" headers or not if ($has_negative and !@rrd_negatives and $global_headers < 2) { # Always for -/+ graphs push(@rrd, "COMMENT:" . (" " x $max_field_len)); push(@rrd, "COMMENT:Cur (-/+)"); push(@rrd, "COMMENT:Min (-/+)"); push(@rrd, "COMMENT:Avg (-/+)"); push(@rrd, "COMMENT:Max (-/+) \\j"); $global_headers = 2; # Avoid further headers/labels } elsif ($global_headers == 1) { # Or when we want to. push(@rrd, "COMMENT:" . (" " x $max_field_len)); push(@rrd, "COMMENT: Cur$RRDkludge:"); push(@rrd, "COMMENT:Min$RRDkludge:"); push(@rrd, "COMMENT:Avg$RRDkludge:"); push(@rrd, "COMMENT:Max$RRDkludge: \\j"); $global_headers = 2; # Avoid further headers/labels } my $colour = munin_get($field, "colour"); if ($colour && $colour =~ /^COLOUR(\d+)$/) { $colour = $COLOUR[$1 % @COLOUR]; } # Select a default colour if no explict one $colour ||= ($single_value) ? $single_colour : $COLOUR[$field_count % @COLOUR]; # colour needed for transparent predictions and trends munin_set($field, "colour", $colour); $field_count++; my $tmplabel = munin_get($field, "label", $fname); # Substitute ${graph_period} my $period = munin_get($service, "graph_period", "second"); $tmplabel =~ s/\$\{graph_period\}/$period/g; push(@rrd, $fielddraw . ":g$rrdname" . "#$colour" . ":" . escape($tmplabel) . (" " x ($max_field_len + 1 - length $tmplabel))); # Check for negative fields (typically network (or disk) traffic) if ($has_negative) { my $negfieldname = orig_to_cdef($service, munin_get($field, "negative")); my $negfield = $service->{$negfieldname}; if (my $tmpneg = munin_get($negfield, "realname")) { $negfieldname = $tmpneg; $negfield = $service->{$negfieldname}; } if (!@rrd_negatives) { # zero-line, to redraw zero afterwards. push(@rrd_negatives, "CDEF:re_zero=g$negfieldname,UN,0,0,IF"); } push(@rrd_negatives, "CDEF:ng$negfieldname=g$negfieldname,-1,*"); if ($single_value) { # Only one field. Do min/max range. push(@rrd, "CDEF:neg_min_max_diff=i$negfieldname,a$negfieldname,-"); push(@rrd, "CDEF:ni$negfieldname=i$negfieldname,-1,*"); push(@rrd, "AREA:ni$negfieldname#ffffff"); push(@rrd, "STACK:neg_min_max_diff#$range_colour"); } push(@rrd_negatives, $fielddraw . ":ng$negfieldname#$colour"); # Draw HRULEs my $linedef = munin_get($negfield, "line"); if ($linedef) { my ($number, $ldcolour, $label) = split(/:/, $linedef, 3); unshift(@rrd_negatives, "HRULE:" . $number . ($ldcolour ? "#$ldcolour" : "#$colour")); } elsif (my $tmpwarn = munin_get($negfield, "warning")) { my ($warn_min, $warn_max) = split(':', $tmpwarn,2); if (defined($warn_min) and $warn_min ne '') { unshift( @rrd, "HRULE:" . $warn_min . "#" . ( $single_value ? "ff0000" : $COLOUR[($field_count - 1) % @COLOUR])); } if (defined($warn_max) and $warn_max ne '') { unshift( @rrd, "HRULE:" . $warn_max . "#" . ( $single_value ? "ff0000" : $COLOUR[($field_count - 1) % @COLOUR])); } } push(@rrd, "GPRINT:c$negfieldname:LAST:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:c$rrdname:LAST:$rrdformat" . $rrdscale . ""); push(@rrd, "GPRINT:i$negfieldname:MIN:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:i$rrdname:MIN:$rrdformat" . $rrdscale . ""); push(@rrd, "GPRINT:g$negfieldname:AVERAGE:$avgformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:g$rrdname:AVERAGE:$avgformat" . $rrdscale . ""); push(@rrd, "GPRINT:a$negfieldname:MAX:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:a$rrdname:MAX:$rrdformat" . $rrdscale . "\\j"); push(@{$total_pos{'min'}}, "i$rrdname"); push(@{$total_pos{'avg'}}, "g$rrdname"); push(@{$total_pos{'max'}}, "a$rrdname"); push(@{$total_neg{'min'}}, "i$negfieldname"); push(@{$total_neg{'avg'}}, "g$negfieldname"); push(@{$total_neg{'max'}}, "a$negfieldname"); } else { push(@rrd, "COMMENT: Cur$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:c$rrdname:LAST:$rrdformat" . $rrdscale . ""); push(@rrd, "COMMENT: Min$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:i$rrdname:MIN:$rrdformat" . $rrdscale . ""); push(@rrd, "COMMENT: Avg$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:g$rrdname:AVERAGE:$avgformat" . $rrdscale . ""); push(@rrd, "COMMENT: Max$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:a$rrdname:MAX:$rrdformat" . $rrdscale . "\\j"); push(@{$total_pos{'min'}}, "i$rrdname"); push(@{$total_pos{'avg'}}, "g$rrdname"); push(@{$total_pos{'max'}}, "a$rrdname"); } # Draw HRULEs my $linedef = munin_get($field, "line"); if ($linedef) { my ($number, $ldcolour, $label) = split(/:/, $linedef, 3); $label =~ s/:/\\:/g if defined $label; unshift( @rrd, "HRULE:" . $number . ( $ldcolour ? "#$ldcolour" : ((defined $single_value and $single_value) ? "#ff0000" : "#$colour")) . ((defined $label and length($label)) ? ":$label" : ""), "COMMENT: \\j" ); } elsif (my $tmpwarn = munin_get($field, "warning")) { my ($warn_min, $warn_max) = split(':', $tmpwarn,2); if (defined($warn_min) and $warn_min ne '') { unshift( @rrd, "HRULE:" . $warn_min . "#" . ( $single_value ? "ff0000" : $COLOUR[($field_count - 1) % @COLOUR])); } if (defined($warn_max) and $warn_max ne '') { unshift( @rrd, "HRULE:" . $warn_max . "#" . ( $single_value ? "ff0000" : $COLOUR[($field_count - 1) % @COLOUR])); } } } my $graphtotal = munin_get($service, "graph_total"); if (@rrd_negatives) { push(@rrd, @rrd_negatives); push(@rrd, "LINE1:re_zero#000000"); # Redraw zero. if ( defined $graphtotal and exists $total_pos{'min'} and exists $total_neg{'min'} and @{$total_pos{'min'}} and @{$total_neg{'min'}}) { push(@rrd, "CDEF:ipostotal=" . join(",", @{$total_pos{'min'}}) . (",$AddNAN" x (@{$total_pos{'min'}} - 1))); push(@rrd, "CDEF:gpostotal=" . join(",", @{$total_pos{'avg'}}) . (",$AddNAN" x (@{$total_pos{'avg'}} - 1))); push(@rrd, "CDEF:apostotal=" . join(",", @{$total_pos{'max'}}) . (",$AddNAN" x (@{$total_pos{'max'}} - 1))); push(@rrd, "CDEF:inegtotal=" . join(",", @{$total_neg{'min'}}) . (",$AddNAN" x (@{$total_neg{'min'}} - 1))); push(@rrd, "CDEF:gnegtotal=" . join(",", @{$total_neg{'avg'}}) . (",$AddNAN" x (@{$total_neg{'avg'}} - 1))); push(@rrd, "CDEF:anegtotal=" . join(",", @{$total_neg{'max'}}) . (",$AddNAN" x (@{$total_neg{'max'}} - 1))); push(@rrd, "LINE1:gpostotal#000000:$graphtotal" . (" " x ($max_field_len - length($graphtotal) + 1))); push(@rrd, "GPRINT:gnegtotal:LAST:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:gpostotal:LAST:$rrdformat" . $rrdscale . ""); push(@rrd, "GPRINT:inegtotal:MIN:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:ipostotal:MIN:$rrdformat" . $rrdscale . ""); push(@rrd, "GPRINT:gnegtotal:AVERAGE:$avgformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:gpostotal:AVERAGE:$avgformat" . $rrdscale . ""); push(@rrd, "GPRINT:anegtotal:MAX:$rrdformat" . $rrdscale . "/\\g"); push(@rrd, "GPRINT:apostotal:MAX:$rrdformat" . $rrdscale . "\\j"); } } elsif ( defined $graphtotal and exists $total_pos{'min'} and @{$total_pos{'min'}}) { push(@rrd, "CDEF:ipostotal=" . join(",", @{$total_pos{'min'}}) . (",$AddNAN" x (@{$total_pos{'min'}} - 1))); push(@rrd, "CDEF:gpostotal=" . join(",", @{$total_pos{'avg'}}) . (",$AddNAN" x (@{$total_pos{'avg'}} - 1))); push(@rrd, "CDEF:apostotal=" . join(",", @{$total_pos{'max'}}) . (",$AddNAN" x (@{$total_pos{'max'}} - 1))); push(@rrd, "LINE1:gpostotal#000000:$graphtotal" . (" " x ($max_field_len - length($graphtotal) + 1))); push(@rrd, "COMMENT: Cur$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:gpostotal:LAST:$rrdformat" . $rrdscale . ""); push(@rrd, "COMMENT: Min$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:ipostotal:MIN:$rrdformat" . $rrdscale . ""); push(@rrd, "COMMENT: Avg$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:gpostotal:AVERAGE:$avgformat" . $rrdscale . ""); push(@rrd, "COMMENT: Max$RRDkludge:") unless $global_headers; push(@rrd, "GPRINT:apostotal:MAX:$rrdformat" . $rrdscale . "\\j"); } # insert these graph args in the end if (defined(my $tmp_field = get_custom_graph_args_after($service))) { push(@rrd, @{$tmp_field}); } my $nb_graphs_drawn = 0; for my $time (keys %times) { next unless ($draw{$time}); my $picfilename = get_picture_filename($service, $time); DEBUG "[DEBUG] Looking into drawing $picfilename"; (my $picdirname = $picfilename) =~ s/\/[^\/]+$//; DEBUG "[DEBUG] Picture filename: $picfilename"; my @complete = get_fonts(); # Watermarks introduced in RRD 1.2.13. push(@complete, '-W', $watermark) if $RRDs::VERSION >= 1.2013; # Do the header (title, vtitle, size, etc...), but IN THE BEGINNING unshift @complete, @{get_header($service, $time)}; if ($LINEkluge) { @rrd = map { my $line = $_; $line =~ s/LINE3:/LINE2.2:/; $line =~ s/LINE2:/LINE1.6:/; # LINE1 is thin enough. $line; } @rrd; } push @complete, @rrd; # graph end in future push (@complete, handle_trends($time, $lastupdate, $pinpoint, $service, $RRDkludge, @added)); # Make sure directory exists munin_mkdir_p($picdirname, oct(777)); # Since version 1.3 rrdtool uses libpango which needs its input # as utf8 string. So we assume that every input is in latin1 # and decode it to perl's internal representation and then to utf8. if ($RRDs::VERSION >= 1.3) { @complete = map { my $str = $_; $str = encode("utf8", (decode("latin1", $_))); $str; } @complete; } # Surcharging the graphing limits my ($upper_limit_overrided, $lower_limit_overrided); for (my $index = 0; $index <= $#complete; $index++) { if ($complete[$index] =~ /^(--upper-limit|-u)$/ && (defined $upper_limit)) { $upper_limit = get_scientific($upper_limit); $complete[$index + 1] = $upper_limit; $upper_limit_overrided = 1; } if ($complete[$index] =~ /^(--lower-limit|-l)$/ && (defined $lower_limit)) { $lower_limit = get_scientific($lower_limit); $complete[$index + 1] = $lower_limit; $lower_limit_overrided = 1; } } # Add the limit if not present if (defined $upper_limit && ! $upper_limit_overrided) { push @complete, "--upper-limit", $upper_limit; } if (defined $lower_limit && ! $lower_limit_overrided) { push @complete, "--lower-limit", $lower_limit; } DEBUG "\n\nrrdtool 'graph' '" . join("' \\\n\t'", @rrdcached_params, @complete) . "'\n"; $nb_graphs_drawn ++; RRDs::graph(@rrdcached_params, @complete); if (my $ERROR = RRDs::error) { ERROR "[RRD ERROR] Unable to graph $picfilename : $ERROR"; # ALWAYS dumps the cmd used when an error occurs. # Otherwise, it will be difficult to debug post-mortem ERROR "[RRD ERROR] rrdtool 'graph' '" . join("' \\\n\t'", @rrdcached_params, @complete) . "'\n"; } elsif (!-f $picfilename) { ERROR "[RRD ERROR] rrdtool graph did not generate the image (make sure there are data to graph).\n"; } else { # Set time of png file to the time of the last update of # the rrd file. This makes http's If-Modified-Since more # reliable, esp. in combination with munin-*cgi-graph. # Since this disrupts rrd's --lazy option we're disableing # it unless we (munin-graph) were specially asked --lazy. # This way --lazy continues to work as expected, and since # CGI uses --nolazy, http IMS are also working as expected. if (! $force_lazy) { DEBUG "[DEBUG] setting time on $picfilename"; utime $lastupdate, $lastupdate, $picfilename; } if ($list_images) { # Command-line option to list images created print $picfilename. "\n"; } } } if (munin_get_bool($service, "graph_sums", 0)) { foreach my $time (keys %sumtimes) { my $picfilename = get_picture_filename($service, $time, 1); DEBUG "Looking into drawing $picfilename"; (my $picdirname = $picfilename) =~ s/\/[^\/]+$//; next unless ($draw{"sum" . $time}); my @rrd_sum; push @rrd_sum, @{get_header($service, $time, 1)}; # graph end in future push (@rrd_sum, handle_trends($time, $lastupdate, $pinpoint, $service, $RRDkludge, @added)); push @rrd_sum, @rrd; my $labelled = 0; my @defined = (); for (my $index = 0; $index <= $#rrd_sum; $index++) { if ($rrd_sum[$index] =~ /^(--vertical-label|-v)$/) { (my $label = munin_get($service, "graph_vlabel")) =~ s/\$\{graph_period\}/$sumtimes{$time}[0]/g; splice(@rrd_sum, $index, 2, ("--vertical-label", $label)); $index++; $labelled++; } elsif ($rrd_sum[$index] =~ /^(LINE[123]|STACK|AREA|GPRINT):([^#:]+)([#:].+)$/) { my ($pre, $fname, $post) = ($1, $2, $3); next if $fname eq "re_zero"; if ($post =~ /^:AVERAGE/) { splice(@rrd_sum, $index, 1, $pre . ":x$fname" . $post); $index++; next; } next if grep /^x$fname$/, @defined; push @defined, "x$fname"; my @replace; if (munin_get($service->{$fname}, "type", "GAUGE") ne "GAUGE") { if ($time eq "week") { # Every plot is half an hour. Add two plots and multiply, to get per hour if (graph_by_minute($service)) { # Already multiplied by 60 push @replace, "CDEF:x$fname=PREV($fname),UN,0,PREV($fname),IF,$fname,+,5,*,6,*"; } elsif (graph_by_hour($service)) { # Already multiplied by 3600, have to *divide* by 12 push @replace, "CDEF:x$fname=PREV($fname),UN,0,PREV($fname),IF,$fname,+,12,/,6,*"; } else { push @replace, "CDEF:x$fname=PREV($fname),UN,0,PREV($fname),IF,$fname,+,300,*,6,*"; } } else { # Every plot is one day exactly. Just multiply. if (graph_by_minute($service)) { # Already multiplied by 60 push @replace, "CDEF:x$fname=$fname,5,*,288,*"; } elsif (graph_by_hour($service)) { # Already multiplied by 3600, have to *divide* by 12 push @replace, "CDEF:x$fname=$fname,12,/,288,*"; } else { push @replace, "CDEF:x$fname=$fname,300,*,288,*"; } } } push @replace, $pre . ":x$fname" . $post; splice(@rrd_sum, $index, 1, @replace); $index++; } elsif ( $rrd_sum[$index] =~ /^(--lower-limit|--upper-limit|-l|-u)$/) { $index++; $rrd_sum[$index] = $rrd_sum[$index] * 300 * $sumtimes{$time}->[1]; } } unless ($labelled) { my $label = munin_get($service, "graph_vlabel_sum_$time", $sumtimes{$time}->[0]); unshift @rrd_sum, "--vertical-label", $label; } DEBUG "[DEBUG] \n\nrrdtool graph '" . join("' \\\n\t'", @rrd_sum) . "'\n"; # Make sure directory exists munin_mkdir_p($picdirname, oct(777)); $nb_graphs_drawn ++; RRDs::graph(@rrdcached_params, @rrd_sum); if (my $ERROR = RRDs::error) { ERROR "[RRD ERROR(sum)] Unable to graph " . get_picture_filename($service, $time) . ": $ERROR"; } elsif ($list_images) { # Command-line option to list images created print get_picture_filename ($service, $time, 1), "\n"; } } # foreach (keys %sumtimes) } # if graph_sums $service_time = sprintf("%.2f", (Time::HiRes::time - $service_time)); DEBUG "[DEBUG] Graphed service $skeypath ($service_time sec for $nb_graphs_drawn graphs)"; print $STATS "GS|$service_time\n" unless $skip_stats; foreach (@added) { delete $service->{$_} if exists $service->{$_}; } @added = (); } # sets enddate --end and draws a vertical ruler if enddate is in the future # future trends are also added to the graph here sub handle_trends { my $time = shift; my $lastupdate = shift; my $pinpoint = shift; my $service = shift; my $RRDkludge = shift; my @added = @_; my @complete; # enddate possibly in future my $futuretime = $pinpoint ? 0 : $resolutions{$time} * get_end_offset($service); my $enddate = time + ($futuretime); DEBUG "[DEBUG] lastupdate: $lastupdate, enddate: $enddate\n"; # future begins at this horizontal ruler if ($enddate > $lastupdate) { push(@complete, "VRULE:$lastupdate#999999"); } # create trends/predictions foreach my $field (@{munin_find_field($service, "label")}) { my $fieldname = munin_get_node_name($field); my $colour = $single_colour; # Skip virtual fieldnames, otherwise beware of $hash->{foo}{bar}. # # On a sidenote, what's the output of the following code ? # perl -e '$a = {}; if ($a->{foo}{bar}) { print "Found Foo/Bar\n"; } \ # if ($a->{foo}) { print "Found Foo\n"; }' next if ! defined $service->{$fieldname}; if (defined $service->{$fieldname}{'colour'}) { $colour = "$service->{$fieldname}{'colour'}66"; } my $rrd_fieldname = get_field_name($fieldname); my $cdef = ""; if (defined $service->{$fieldname}{'cdef'}) { $cdef = "cdef"; } #trends if (defined $service->{$fieldname}{'trend'} and $service->{$fieldname}{'trend'} eq 'yes') { push (@complete, "CDEF:t$rrd_fieldname=c$cdef$rrd_fieldname,$futuretime,TRENDNAN"); push (@complete, "LINE1:t$rrd_fieldname#$colour:$service->{$fieldname}->{'label'} trend\\l"); DEBUG "[DEBUG] set trend for $fieldname\n"; } #predictions if (defined $service->{$fieldname}{'predict'}) { #arguments: pattern length (e.g. 1 day), smoothing (multiplied with timeresolution) my @predict = split(",", $service->{$fieldname}{'predict'}); my $predictiontime = int ($futuretime / $predict[0]) + 2; #2 needed for 1 day my $smooth = $predict[1]*$resolutions{$time}; push (@complete, "CDEF:p$rrd_fieldname=$predict[0],-$predictiontime,$smooth,c$cdef$rrd_fieldname,PREDICT"); push (@complete, "LINE1:p$rrd_fieldname#$colour:$service->{$fieldname}->{'label'} prediction\\l"); DEBUG "[DEBUG] set prediction for $fieldname\n"; } } push(@complete, "COMMENT:Last update$RRDkludge: " . RRDescape(scalar localtime($lastupdate)) . "\\r"); # If pinpointing, --end should *NOT* be changed if (! $pinpoint) { if (@added) { # stop one period earlier if it's a .sum or .stack push @complete, "--end", (int(($enddate-$resolutions{$time}) / $resolutions{$time})) * $resolutions{$time}; } else { push @complete, "--end", (int($enddate / $resolutions{$time})) * $resolutions{$time}; } } return @complete; } sub get_fonts { # Set up rrdtool graph font options according to RRD version. my @options; if ($RRDs::VERSION < 1.2) { # RRD before 1.2, no font options } elsif ($RRDs::VERSION < 1.3) { # RRD 1.2 # The RRD 1.2 documentation says you can identify font family # names but I never got that to work, but full font path worked @options = ( '--font', "LEGEND:7:$libdir/DejaVuSansMono.ttf", '--font', "UNIT:7:$libdir/DejaVuSans.ttf", '--font', "AXIS:7:$libdir/DejaVuSans.ttf", ); } else { # At least 1.3 @options = ( '--font', 'DEFAULT:0:DejaVuSans,DejaVu Sans,DejaVu LGC Sans,Bitstream Vera Sans', '--font', 'LEGEND:7:DejaVuSansMono,DejaVu Sans Mono,DejaVu LGC Sans Mono,Bitstream Vera Sans Mono,monospace', # Colors coordinated with CSS. '--color', 'BACK#F0F0F0', # Area around the graph '--color', 'FRAME#F0F0F0', # Line around legend spot '--color', 'CANVAS#FFFFFF', # Graph background, max contrast '--color', 'FONT#666666', # Some kind of gray '--color', 'AXIS#CFD6F8', # And axis like html boxes '--color', 'ARROW#CFD6F8', # And arrow, ditto. ); } if ($RRDs::VERSION >= 1.4) { # RRD 1.4 has border, adding it push @options, ( '--border', '0', ); } return @options; }; sub graph_by_minute { my $service = shift; return (munin_get($service, "graph_period", "second") eq "minute"); } sub graph_by_hour { my $service = shift; return (munin_get($service, "graph_period", "second") eq "hour"); } sub orig_to_cdef { my $service = shift; my $fieldname = shift; return unless ref($service) eq "HASH"; if (defined $service->{$fieldname} && defined $service->{$fieldname}->{"cdef_name"}) { return orig_to_cdef($service, $service->{$fieldname}->{"cdef_name"}); } return $fieldname; } sub reset_cdef { my $service = shift; my $fieldname = shift; return unless ref($service) eq "HASH"; if (defined $service->{$fieldname} && defined $service->{$fieldname}->{"cdef_name"}) { reset_cdef($service, $service->{$fieldname}->{"cdef_name"}); delete $service->{$fieldname}->{"cdef_name"}; } } sub ends_with { my ($src, $searched) = @_; my $is_ending = (substr($src, - length($searched)) eq $searched); return $is_ending; } sub skip_service { my $service = shift; my $fqn = munin_get_node_fqn($service); # Skip if we've limited services with the omnipotent cli option only-fqn return 1 if ($only_fqn and ! ends_with($fqn, $only_fqn)); DEBUG "[DEBUG] $fqn is in ($only_fqn)\n"; # Skip if we've limited services with cli options return 1 if (@limit_services and ! (grep { ends_with($fqn, $_) } @limit_services)); DEBUG "[DEBUG] $fqn is in (" . join(",", @limit_services) . ")\n"; # Always graph if --force is present return 0 if $force_graphing; # See if we should skip it because of conf-options return 1 if (munin_get($service, "graph", "yes") eq "on-demand" or !munin_get_bool($service, "graph", 1)); # Don't skip return 0; } sub expand_cdef { my $service = shift; my $cfield_ref = shift; my $cdef = shift; my $new_field = &get_field_name("cdef$$cfield_ref"); my ($max, $min, $avg) = ( "CDEF:a$new_field=$cdef", "CDEF:i$new_field=$cdef", "CDEF:g$new_field=$cdef" ); foreach my $field (@{munin_find_field($service, "label")}) { my $fieldname = munin_get_node_name($field); my $rrdname = &orig_to_cdef($service, $fieldname); if ($cdef =~ /\b$fieldname\b/) { $max =~ s/([,=])$fieldname([,=]|$)/$1a$rrdname$2/g; $min =~ s/([,=])$fieldname([,=]|$)/$1i$rrdname$2/g; $avg =~ s/([,=])$fieldname([,=]|$)/$1g$rrdname$2/g; } } munin_set_var_loc($service, [$$cfield_ref, "cdef_name"], $new_field); $$cfield_ref = $new_field; return ($max, $min, $avg); } sub parse_path { my ($path, $domain, $node, $service, $field) = @_; my $filename = "unknown"; if ($path =~ /^\s*([^:]*):([^:]*):([^:]*):([^:]*)\s*$/) { $filename = munin_get_filename($config, $1, $2, $3, $4); } elsif ($path =~ /^\s*([^:]*):([^:]*):([^:]*)\s*$/) { $filename = munin_get_filename($config, $domain, $1, $2, $3); } elsif ($path =~ /^\s*([^:]*):([^:]*)\s*$/) { $filename = munin_get_filename($config, $domain, $node, $1, $2); } elsif ($path =~ /^\s*([^:]*)\s*$/) { $filename = munin_get_filename($config, $domain, $node, $service, $1); } return $filename; } # Wrapper for munin_get_picture_filename to handle pinpoint sub get_picture_filename { my $of; if (defined $output_file) { $of=$output_file; goto exit_label; } $of = munin_get_picture_filename(@_); exit_label: return $of; } sub escape { my $text = shift; return if not defined $text; $text =~ s/\\/\\\\/g; $text =~ s/:/\\:/g; return $text; } sub get_scientific { my $value = shift; $value =~ s/m/e-03/; $value =~ s/k/e+03/; $value =~ s/M/e+06/; $value =~ s/G/e+09/; return $value; } sub RRDescape { my $text = shift; return $RRDs::VERSION < 1.2 ? $text : escape($text); } sub print_usage_and_exit { print "Usage: $0 [options] Options: --[no]fork Do not fork. By default munin-graph forks sub processes for drawing graphs to utilize available cores and I/O bandwidth. [--fork] --n n Max number of concurrent processes [$max_running] --[no]force Force drawing of graphs that are not usually drawn due to options in the config file. [--noforce] --[no]lazy Only redraw graphs when needed. [--lazy] --help View this message. --version View version information. --debug View debug messages. --[no]cron Behave as expected when run from cron. (Used internally in Munin.) --host Limit graphed hosts to . Multiple --host options may be supplied. --only-fqn For internal use with CGI graphing. Graph only a single fully qualified named graph, e.g. --only-fqn root/Backend/dafnes.example.com/diskstats_iops Always use with the correct --host option. --config Use as configuration file. [$conffile] --[no]list-images List the filenames of the images created. [--nolist-images] --output-file -o Output graph file. (used for CGI graphing) --log-file -l Output log file. (used for CGI graphing) --[no]day Create day-graphs. [--day] --[no]week Create week-graphs. [--week] --[no]month Create month-graphs. [--month] --[no]year Create year-graphs. [--year] --[no]sumweek Create summarised week-graphs. [--summweek] --[no]sumyear Create summarised year-graphs. [--sumyear] --pinpoint Create custom-graphs. is the standard unix Epoch. [not active] --size_x Sets the X size of the graph in pixels [175] --size_y Sets the Y size of the graph in pixels [400] --lower_limit Sets the lower limit of the graph --upper_limit Sets the upper limit of the graph NOTE! --pinpoint and --only-fqn must not be combined with --[no] options. The result of doing that is undefined. "; exit 0; } 1; munin-2.0.25/master/lib/Munin/Master/Group.pm000066400000000000000000000047631243472346000207610ustar00rootroot00000000000000package Munin::Master::Group; use base qw(Munin::Master::GroupRepository); # $Id$ use warnings; use strict; use Carp; use Munin::Master::Host; sub new { my ($class, $group_name) = @_; my $self = { group_name => $group_name, hosts => {}, }; return bless $self, $class; } sub add_attributes { my ($self, $attributes) = @_; my %valid_attributes = map {$_ => 1} qw(node_order local_address contacts); croak "Invalid attributes: " . join(', ', keys %$attributes) if grep { !$valid_attributes{$_} } keys %$attributes; %$self = (%$self, %$attributes); } sub add_host { my ($self, $host) = @_; $self->{hosts}{$host->{host_name}} = $host; } sub give_attributes_to_hosts { my ($self) = @_; my %not_inheritable = map {$_ => 1} qw(group_name hosts node_order); my %attributes = grep { !$not_inheritable{$_} } %$self; map { $_->add_attributes_if_not_exists(\%attributes) } values %{$self->{hosts}}; return 1; } sub get_all_hosts { my ($self) = @_; my @hosts = (); for my $group (values %{$self->{groups}}) { push @hosts, $group->get_all_hosts; } push @hosts, values %{$self->{hosts}}; return @hosts; } 1; __END__ =head1 NAME Munin::Master::Group - Holds information on host groups. Groups can be nested. =head1 METHODS =over =item B my $group = Munin::Master::Group->new($name, $parent); Constructor. $name is the name of the group. =item B $group->add_attributes(\%attrs); Sets attributes %attrs for the group. Valid attributes are: =over 4 =item node_order Override the order of the hosts within the group. =item local_address The local address the update process should bind to when contacting the nodes in this group. =item contacts The contacts for this group. See L. =back An exception will be thrown if invalid attributes are provided. (Full details here: L.) =item B $group->add_host($host); Adds host $host to the group. =item B $group->give_attributes_to_hosts(); Propagates the attributes of $group to all hosts in the group. (This does B apply to hosts belonging to sub-groups.) =item B my @hosts = $group->get_all_hosts(); Returns the list of all hosts associated with this group, including those belonging to any sub-groups. =back =cut # vim: ts=4 : sw=4 : et munin-2.0.25/master/lib/Munin/Master/GroupRepository.pm000066400000000000000000000017231243472346000230520ustar00rootroot00000000000000package Munin::Master::GroupRepository; use base qw(Munin::Master::Config); # $Id$ use warnings; use strict; use Carp; use Log::Log4perl qw( :easy ); sub new { # This is now a container class used on some entries in the # Munin::Master::Config instance. It used to be a # self-contained, self-booting class instantiator. my ($class, $gah) = @_; my $self = bless {}, $class; # $gah is usually a pointer to # Munin::Master::Config->instance()->{config}{groups}; $self->{groups} = $gah; return $self; } 1; __END__ =head1 NAME Munin::Master::GroupRepository - FIX =head1 METHODS Inherits methods from Munin::Master::Config. =over =item B my $gr = Munin::Master::GroupRepository->new($groups_and_hosts); Constructor. $groups_and_hosts is the list of groups and hosts to associate with the instance. (This will usually be C<< Munin::Master::Config->instance()->{config}{groups}; >> =back =cut # vim: ts=4 : sw=4 : et munin-2.0.25/master/lib/Munin/Master/HTMLConfig.pm000066400000000000000000000620711243472346000215530ustar00rootroot00000000000000package Munin::Master::HTMLConfig; use warnings; use strict; use Exporter; our (@ISA, @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(generate_config get_peer_nodes); use POSIX qw(strftime); use Getopt::Long; use Time::HiRes; use Scalar::Util qw( weaken ); use Munin::Master::Logger; use Munin::Master::Utils; use Data::Dumper; use Log::Log4perl qw( :easy ); my @times = ("day", "week", "month", "year"); my $DEBUG = 0; my $INDEX_FILENAME = "index.html"; my $config; my $limits; my $cache; my $categories; my $problems; sub generate_config { my $use_cache = shift; if ($use_cache) { $cache = undef; # undef, for RAM usage # if there is some cache, use it (for cgi) my $newcache = munin_readconfig_part('htmlconf', 1); if (defined $newcache) { $cache = $newcache; return $cache; } } $categories = {}; $problems = {"criticals" => [], "warnings" => [], "unknowns" => []}; my $rev = munin_configpart_revision(); $config = munin_readconfig_part('datafile', 0); initiate_cgiurl_graph(); # we don't set a default like for others if ($rev != munin_configpart_revision()) { # convert config for html generation: reorder nodes to their rightful group node_reorder($config); } $limits = munin_readconfig_part("limits"); # if only limits changed, still update our cache if ($rev != munin_configpart_revision()) { $cache = undef; # undef, for RAM usage $cache = get_group_tree($config); } return $cache; } sub node_reorder { my $totalconfig = shift; my $group = shift || $config; my $children = munin_get_sorted_children($group); # traverse group foreach my $child (@$children) { # if this is a node if(defined $child->{'address'}){ # if renaming is active if(defined $child->{"html_rename"}){ (my $groups, my $name) = munin_get_host_path_from_string($child->{"html_rename"}); # add the node at its new place my $currentgroup = $totalconfig; foreach my $local_group (@$groups){ if(!defined $currentgroup->{$local_group}){ $currentgroup->{$local_group} = {'#%#name' => $local_group, '#%#parent' => $currentgroup}; weaken($currentgroup->{$local_group}{'#%#parent'}); } $currentgroup = $currentgroup->{$local_group}; } if(defined $currentgroup->{$name}){ ERROR $child->{"html_rename"} . " already exists. Renaming not possible."; } else { # remove node from structure undef $group->{$child->{"#%#name"}}; # change name into new name $child->{"#%#origname"} = $child->{"#%#name"}; $child->{"#%#name"} = $name; # add to new group $child->{"#%#origparent"} = $group; $currentgroup->{$name} = $child; $child->{"#%#parent"} = $currentgroup; weaken($child->{"#%#parent"}); } } } else { # reorder group node_reorder($totalconfig, $child); } } } sub initiate_cgiurl_graph { if (!defined $config->{'cgiurl_graph'}) { if (defined $config->{'cgiurl'}) { $config->{'cgiurl_graph'} = $config->{'cgiurl'} . "/munin-cgi-graph"; } else { $config->{'cgiurl_graph'} = "/munin-cgi/munin-cgi-graph"; } DEBUG "[DEBUG] Determined that cgiurl_graph is ".$config->{'cgiurl_graph'}; } } sub add_graph_to_categories { my $srv = shift; my $category = $srv->{"category"}; my $srvname = $srv->{"label"}; if(!defined ($categories->{$category})){ $categories->{$category} = {}; } if(!defined ($categories->{$category}->{$srvname})){ $categories->{$category}->{$srvname} = []; } push @{$categories->{$category}->{$srvname}}, $srv; } sub get_group_tree { my $hash = shift; my $base = shift || ""; my $graphs = []; # Pushy array of graphs, [ { name => 'cpu'}, ...] my $groups = []; # Slices of the $config hash my $cattrav = {}; # Categories, array of strings my $cats = []; # Array of graph information ('categories') my $path = []; # (temporary) array of paths relevant to . (here) my $rpath = undef; my $visible = 0; my $css_name; my $children = munin_get_sorted_children($hash); foreach my $child (@$children) { next unless defined $child and ref($child) eq "HASH" and keys %$child; $child->{"#%#ParentsNameAsString"} = munin_get_node_name($hash); # TODO: is this value used anywhere? if (defined $child->{"graph_title"} and munin_get_bool($child, "graph", 1)) { #graph $child->{'#%#is_service'} = 1; # TODO: is this value used anywhere? my $childname = munin_get_node_name($child); my $childnode = generate_service_templates($child); push @$graphs, {"name" => $childname}; $childnode->{'name'} = $child->{"graph_title"}; add_graph_to_categories($childnode); # Make sure the link gets right even if the service has subservices if (munin_has_subservices ($child)) { $childnode->{'url'} = $base . $childname . "/$INDEX_FILENAME"; #TODO: html generation should generate urls } else { $childnode->{'url'} = $base . $childname . ".html"; #TODO: html generation should generate urls } $childnode->{'host_url'} = $base . $INDEX_FILENAME; #TODO: Think of a nicer way to generate relative urls (reference #1) for (my $shrinkpath = $childnode->{'url'}, my $counter = 0; $shrinkpath; $shrinkpath =~ s/^[^\/]+\/?//, $counter++) { die ("Munin::Master::HTMLConfig ran into an endless loop") if ($counter >= 100); $childnode->{'url' . $counter} = $shrinkpath; } push @{$cattrav->{lc munin_get($child, "graph_category", "other")}}, $childnode; # If this is a multigraph plugin there may be sub-graphs. push( @$groups, grep {defined $_} get_group_tree($child, $base.munin_get_node_name($child)."/")); $visible = 1; } elsif (ref($child) eq "HASH" and !defined $child->{"graph_title"}) { #group push( @$groups, grep {defined $_} get_group_tree($child, $base.munin_get_node_name($child) . "/")); if (scalar @$groups) { $visible = 1; } } } foreach my $group (@$groups) { $group->{'peers'} = get_peer_nodes($group->{"#%#hash"}, lc munin_get($group->{"#%#hash"}, "graph_category", "other")); } return unless $visible; $hash->{'#%#visible'} = 1; # TODO: is this value used anywhere? # We need the categories in another format. foreach my $cat (sort keys %$cattrav) { my $obj = {}; $obj->{'name'} = $cat; $obj->{'url'} = $base . "${INDEX_FILENAME}#" . $cat; $obj->{'services'} = [sort {lc($a->{'name'}) cmp lc($b->{'name'})} @{$cattrav->{$cat}}]; $obj->{'state_' . lc munin_category_status($hash, $limits, $cat, 1)} = 1; #TODO: shrinkpath reference #2 for ( my $shrinkpath = $obj->{'url'}, my $counter = 0; $shrinkpath =~ /\//; $shrinkpath =~ s/^[^\/]+\/*//, $counter++ ) { die ("Munin::Master::HTMLConfig ran into an endless loop") if ($counter >= 100); $obj->{'url' . $counter} = $shrinkpath; } push @$cats, $obj; } # ...and we need a couple of paths available. # TODO: think of a nicer way to generate urls @$path = reverse map { { "pathname" => $_, "path" => ( defined $rpath ? ($rpath .= "../") . $INDEX_FILENAME : ($rpath = ""))} } reverse(undef, split('\/', $base)); # TODO: think of a nicer way to generate urls my $root_path = get_root_path($path); # We need a bit more info for the comparison templates my $compare = munin_get_bool($hash, "compare", 1); my $comparecats = []; my $comparegroups = []; if($compare){ ($compare, $comparecats, $comparegroups) = generate_compare_groups($groups); } my %group_hash = (map {$_->{'name'} => $_} @{$groups}); my $ret = { "name" => munin_get_node_name($hash), "url" => $base . $INDEX_FILENAME, "path" => $path, "#%#hash" => $hash, "depth" => scalar(my @splitted_base = split("/", $base . $INDEX_FILENAME)) - 1, "filename" => munin_get_html_filename($hash), "css_name" => $css_name, "root_path" => $root_path, "groups" => $groups, "groups_hash" => \%group_hash, "graphs" => $graphs, "multigraph" => munin_has_subservices ($hash), "categories" => $cats, "ngroups" => scalar(@$groups), "ngraphs" => scalar(@$graphs), "ncategories" => scalar(@$cats), "compare" => $compare, "comparegroups" => $comparegroups, "ncomparegroups" => scalar(@$comparegroups), "comparecategories" => $comparecats, "ncomparecategories" => scalar(@$comparecats), }; if($ret->{'depth'} == 0){ #root node does not have peer nodes # add categories my $catarray = []; foreach (sort keys %{$categories}) { my $currentcat = $categories->{$_}; my $srvarray = []; foreach (sort keys %{$currentcat}) { my $srv_nodename = $_; $srv_nodename =~ s/ /_/g; my $srv = { "graphs" => $currentcat->{$_}, "name" => $_, "service" => $srv_nodename, }; push @$srvarray, $srv } my $filename = munin_get_html_filename($hash); $filename =~ s/index.html$/$_/; my $cat = { "name" => $_, "urlday" => "$_-day.html", "urlweek" => "$_-week.html", "urlmonth" => "$_-month.html", "urlyear" => "$_-year.html", "path" => $path, "graphs" => $srvarray, "filename-day" => $filename . "-day.html", "filename-week" => $filename . "-week.html", "filename-month" => $filename . "-month.html", "filename-year" => $filename . "-year.html", }; push @$catarray, $cat; } $ret->{"problems"} = $problems; $ret->{"globalcats"} = $catarray; $ret->{"nglobalcats"} = scalar(@$catarray); } #TODO: shrinkpath reference #3 if ($ret->{'url'} ne "/index.html") { for ( my $shrinkpath = $ret->{'url'}, my $counter = 0; $shrinkpath =~ /\//; $shrinkpath =~ s/^[^\/]+\/*//, $counter++ ) { die ("Munin::Master::HTMLConfig ran into an endless loop") if ($counter >= 100); $ret->{'url' . $counter} = $shrinkpath; } } return $ret; } sub generate_compare_groups { my $groups = shift; my $comparecats = []; my $comparecatshash = {}; my $comparegroups = []; foreach my $tmpgroup (@$groups) { # First we gather a bit of data into comparecatshash... if ($tmpgroup->{'ngraphs'} > 0 && !$tmpgroup->{"multigraph"}) { # no compare links for multigraphs push @$comparegroups, $tmpgroup; foreach my $tmpcat (@{$tmpgroup->{'categories'}}) { $comparecatshash->{$tmpcat->{'name'}}->{'groupname'} = $tmpcat->{'name'}; foreach my $tmpserv (@{$tmpcat->{'services'}}) { $comparecatshash->{$tmpcat->{'name'}}->{'services'}->{$tmpserv->{'name'}}->{'nodes'}->{$tmpgroup->{'name'}} = $tmpserv; $comparecatshash->{$tmpcat->{'name'}}->{'services'}->{$tmpserv->{'name'}}->{'nodes'}->{$tmpgroup->{'name'}}->{'nodename'} = $tmpgroup->{'name'}; $comparecatshash->{$tmpcat->{'name'}}->{'services'}->{$tmpserv->{'name'}}->{'nodes'}->{$tmpgroup->{'name'}}->{'nodeurl'} = $tmpgroup->{'url'}; } } } } if (scalar @$comparegroups <= 1) { return (0, [], []); # ($compare, $comparecats, $comparegroups) } # restructure it, comparecats need to end up looking like: ->[i]->{'services'}->[i]->{'nodes'}->[i]->{*} # not really restructuring; this just sorts all arrays, but doesn't take the node order into account. my $empty_node = { }; foreach my $tmpcat (sort keys %$comparecatshash) { foreach my $tmpserv (sort keys %{$comparecatshash->{$tmpcat}->{'services'}}) { my @nodelist = map {defined $comparecatshash->{$tmpcat}->{'services'}->{$tmpserv}->{'nodes'}->{$_->{'name'}} ? $comparecatshash->{$tmpcat}->{'services'}->{$tmpserv}->{'nodes'}->{$_->{'name'}} : { nodename => $_->{'name'}, } } (@$groups); delete $comparecatshash->{$tmpcat}->{'services'}->{$tmpserv}->{'nodes'}; $comparecatshash->{$tmpcat}->{'services'}->{$tmpserv}->{'nodes'} = \@nodelist; } my @servlist = map {$comparecatshash->{$tmpcat}->{'services'}->{$_}} sort keys %{$comparecatshash->{$tmpcat}->{'services'}}; delete $comparecatshash->{$tmpcat}->{'services'}; $comparecatshash->{$tmpcat}->{'services'} = \@servlist; } @$comparecats = map {$comparecatshash->{$_}} sort keys %$comparecatshash; return (1, $comparecats, $comparegroups); } # This is called both at group level, service level, and subservice level sub munin_get_sorted_children { my $hash = shift || return; my $children = munin_get_children($hash); my $group_order; my $ret = []; if (defined $hash->{'group_order'}) { $group_order = $hash->{'group_order'}; } elsif (defined $hash->{'domain_order'}) { $group_order = $hash->{'domain_order'}; } elsif (defined $hash->{'node_order'}) { $group_order = $hash->{'node_order'}; } else { $group_order = ""; } my %children = map {munin_get_node_name($_) => $_} @$children; foreach my $group (split /\s+/, $group_order) { if (defined $children{$group}) { push @$ret, $children{$group}; delete $children{$group}; } elsif ($group =~ /^(.+)=([^=]+)$/) { # "Borrow" the graph from another group my $groupname = $1; my $path = $2; my $borrowed = munin_get_node_partialpath($hash, $path); if (defined $borrowed) { munin_copy_node_toloc($borrowed, $hash, [$groupname]); $hash->{$groupname}->{'#%#origin'} = $borrowed; } push @$ret, $hash->{$groupname}; } } foreach my $group (sort {$a cmp $b} keys %children) { push @$ret, $children{$group}; } return $ret; } sub generate_service_templates { my $service = shift || return; return unless munin_get_bool($service, "graph", 1); my %srv; my $fieldnum = 0; my @graph_info; my @field_info; my @loc = @{munin_get_picture_loc($service)}; my $pathnodes = get_path_nodes($service); my $peers = get_peer_nodes($service, lc munin_get($service, "graph_category", "other")); my $parent = munin_get_parent_name($service); my $filename = munin_get_html_filename($service); my $root_path = get_root_path($pathnodes); my $bp = borrowed_path($service) || "."; $srv{'node'} = munin_get_node_name($service); DEBUG "[DEBUG] processing service: $srv{node}"; $srv{'service'} = $service; $srv{"multigraph"}= munin_has_subservices($service); $srv{'label'} = munin_get($service, "graph_title"); $srv{'category'} = lc(munin_get($service, "graph_category", "other")); $srv{'path'} = $pathnodes; $srv{'peers'} = $peers; $srv{'root_path'} = $root_path; $srv{'filename'} = $filename; $srv{'url'} = "$srv{node}.html"; my $path = join('/', @loc); my %imgs; $imgs{'imgday'} = "$path-day.png"; $imgs{'imgweek'} = "$path-week.png"; $imgs{'imgmonth'} = "$path-month.png"; $imgs{'imgyear'} = "$path-year.png"; $imgs{'cimgday'} = "$path-day.png"; $imgs{'cimgweek'} = "$path-week.png"; $imgs{'cimgmonth'} = "$path-month.png"; $imgs{'cimgyear'} = "$path-year.png"; if (munin_get_bool($service, "graph_sums", 0)) { $imgs{'imgweeksum'} = "$path-week-sum.png"; $imgs{'imgyearsum'} = "$path-year-sum.png"; } # dump all the png filename to a file my $fh = $config->{"#%#graphs_fh"}; if ($fh) { # values %imgs = the image file # get them uniq, so we don't write them twice my %paths = map { $_, 1 } (values %imgs); foreach my $img (keys %paths) { print $fh "/" . $img . "\n"; } } my $imgpath = $root_path; if ( munin_get($config, "graph_strategy", "cron") eq "cgi" ) { $imgpath = $config->{'cgiurl_graph'}; } map { $srv{$_} = $imgpath . "/" . $imgs{$_} } keys %imgs; # Compute the ZOOM urls { my $epoch_now = time; # The intervals are a bit larger, just like the munin-graph my $start_day = $epoch_now - (3600 * 30); my $start_week = $epoch_now - (3600 * 24 * 8); my $start_month = $epoch_now - (3600 * 24 * 33); my $start_year = $epoch_now - (3600 * 24 * 400); my $size_x = 800; my $size_y = 400; my $common_url = "$root_path/static/dynazoom.html?cgiurl_graph=$config->{'cgiurl_graph'}&plugin_name=$path&size_x=$size_x&size_y=$size_y"; $srv{zoomday} = "$common_url&start_epoch=$start_day&stop_epoch=$epoch_now"; $srv{zoomweek} = "$common_url&start_epoch=$start_week&stop_epoch=$epoch_now"; $srv{zoommonth} = "$common_url&start_epoch=$start_month&stop_epoch=$epoch_now"; $srv{zoomyear} = "$common_url&start_epoch=$start_year&stop_epoch=$epoch_now"; } for my $scale (@times) { my ($w, $h) = get_png_size(munin_get_picture_filename($service, $scale)); if ($w && $h) { $srv{"img" . $scale . "width"} = $w; $srv{"img" . $scale . "height"} = $h; } } if (munin_get_bool($service, "graph_sums", 0)) { $srv{imgweeksum} = "$srv{node}-week-sum.png"; $srv{imgyearsum} = "$srv{node}-year-sum.png"; for my $scale (["week", "year"]) { my ($w, $h) = get_png_size(munin_get_picture_filename($service, $scale, 1)); if ($w && $h) { $srv{"img" . $scale . "sumwidth"} = $w; $srv{"img" . $scale . "sumheight"} = $h; } } } # Do "help" section if (my $info = munin_get($service, "graph_info")) { my %graph_info; $graph_info{info} = $info; push @{$srv{graphinfo}}, \%graph_info; } #TODO move this ugly code to the templates $srv{fieldlist} .= "
"; foreach my $f (@{munin_get_field_order($service)}) { $f =~ s/=(.*)$//; my $path = $1; next if (!defined $service->{$f}); my $fieldobj = $service->{$f}; next if (ref($fieldobj) ne "HASH" or !defined $fieldobj->{'label'}); next if (!munin_draw_field($fieldobj)); #DEBUG "DEBUG: single_value: Checking field \"$f\" ($path)."; if (defined $path) { # This call is to make sure field settings are copied # for aliases, .stack, et al. Todo: put that part of # munin_get_rrd_filename into its own functino. munin_get_rrd_filename($f, $path); } my %field_info; $fieldnum++; $field_info{'hr'} = 1 unless ($fieldnum % 3); $field_info{'field'} = $f; $field_info{'label'} = munin_get($fieldobj, "label", $f); $field_info{'type'} = lc(munin_get($fieldobj, "type", "GAUGE")); $field_info{'warn'} = munin_get($fieldobj, "warning"); $field_info{'crit'} = munin_get($fieldobj, "critical"); $field_info{'info'} = munin_get($fieldobj, "info"); $field_info{'extinfo'} = munin_get($fieldobj, "extinfo"); my $state = munin_field_status($fieldobj, $limits, 1); if (defined $state) { $field_info{'state_warning'} = $state eq "warning" ? 1 : 0; $field_info{'state_critical'} = $state eq "critical" ? 1 : 0; $field_info{'state_unknown'} = $state eq "unknown" ? 1 : 0; } push @{$srv{'fieldinfo'}}, \%field_info; } my $state = munin_service_status($service, $limits, 1); if (defined $state) { $srv{'state_warning'} = $state eq "warning" ? 1 : 0; $srv{'state_critical'} = $state eq "critical" ? 1 : 0; $srv{'state_unknown'} = $state eq "unknown" ? 1 : 0; push @{$problems->{"warnings"}}, \%srv if $state eq "warning"; push @{$problems->{"criticals"}}, \%srv if $state eq "critical"; push @{$problems->{"unknowns"}}, \%srv if $state eq "unknown"; } return \%srv; } #TODO: move path specific information to html generation sub get_path_nodes { my $hash = shift || return; my $ret = []; my $link = $INDEX_FILENAME; unshift @$ret, {"pathname" => munin_get_node_name($hash), "path" => ""}; while ($hash = munin_get_parent($hash)) { unshift @$ret, {"pathname" => munin_get_node_name($hash), "path" => $link}; $link = "../" . $link; } $ret->[0]->{'pathname'} = undef; return $ret; } #TODO: This really needs some refactoring sub get_peer_nodes { my $hash = shift || return; my $category = shift; my $ret = []; my $parent = munin_get_parent($hash) || return; my $me = munin_get_node_name($hash); my $pchildren = munin_get_children($parent); my @peers = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [ $_, munin_get_node_name($_) ] } @$pchildren; foreach my $peer (@peers) { next unless defined $peer and ref($peer) eq "HASH"; next if defined $category and lc(munin_get($peer, "graph_category", "other")) ne $category; next if (!defined $peer->{'graph_title'} and (!defined $peer->{'#%#visible'} or !$peer->{'#%#visible'})); next if (defined $peer->{'graph_title'} and !munin_get_bool($peer, "graph", 1)); my $peername = munin_get_node_name($peer); next if $peername eq "contact" and munin_get_node_name($parent) eq "root"; if ($peername eq $me) { unshift @$ret, {"name" => $peername, "link" => undef}; } else { # Handle different directory levels between subgraphs and regular graphs if (munin_has_subservices ($hash)) { if (munin_has_subservices ($peer)) { # I've got subgraphs, peer's got subgraphs unshift @$ret, {"name" => $peername, "link" => "../$peername/index.html"}; } else { # I've got subgraphs, peer's a regular graph unshift @$ret, {"name" => $peername, "link" => "../$peername.html"}; } } elsif (munin_has_subservices ($peer)) { # I'm a regular graph, peer's got subgraphs unshift @$ret, {"name" => $peername, "link" => "$peername/index.html"}; } else { if (defined $peer->{'graph_title'}) { # Both me and peer are regular graphs unshift @$ret, {"name" => $peername, "link" => "$peername.html"}; } else { # We're not on the graph level -- handle group peering unshift @$ret, {"name" => $peername, "link" => "../$peername/index.html"}; } } } } return $ret; } #TODO: move url logic to html generation sub get_root_path{ my ($path) = @_; if ($path) { (my $root = $path->[0]->{'path'}) =~ s/\/index.html$//; return $root; } return ""; } #TODO: move url logic to html generation sub borrowed_path { # I wish I knew what this function does. It appears to make # .. path elements to climb up the directory hierarchy. To # "borrow" something from a different directory level. my $hash = shift; my $prepath = shift || ""; my $postpath = shift || ""; return unless defined $hash and ref($hash) eq "HASH"; if (defined $hash->{'#%#origin'}) { return $prepath . "../" . munin_get_node_name($hash->{'#%#origin'}) . "/" . $postpath; } else { if (defined $hash->{'#%#parent'}) { if (defined $hash->{'graph_title'}) { return borrowed_path($hash->{'#%#parent'}, $prepath . "../", $postpath); } else { return borrowed_path( $hash->{'#%#parent'}, $prepath . "../", munin_get_node_name($hash) . "/" . $postpath ); } } else { return; } } } #TODO: This method is obsolete when cgi-graphing is the only strategy left sub get_png_size { my $filename = shift; my $width = undef; my $height = undef; return (undef, undef) if (munin_get($config, "graph_strategy", "cron") eq "cgi") ; if (open(my $PNG, '<', $filename)) { my $incoming; binmode($PNG); if (read($PNG, $incoming, 4)) { if ($incoming =~ /PNG$/) { if (read($PNG, $incoming, 12)) { if (read($PNG, $incoming, 4)) { $width = unpack("N", $incoming); read($PNG, $incoming, 4); $height = unpack("N", $incoming); } } } } close($PNG); } return ($width, $height); } 1; munin-2.0.25/master/lib/Munin/Master/HTMLOld.pm000066400000000000000000000744251243472346000210720ustar00rootroot00000000000000package Munin::Master::HTMLOld; =encoding utf-8 =begin comment -*- perl -*- This is Munin::Master::HTMLOld, a minimal package shell to make munin-html modular (so it can loaded persistently in munin-fastcgi-graph for example) without making it object oriented yet. The non-"old" module will feature propper object orientation like munin-update and will have to wait until later. Copyright (C) 2002-2009 Jimmy Olsen, Audun Ytterdal, Kjell Magne Øierud, Nicolai Langfeldt, Linpro AS, Redpill Linpro AS and others. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. $Id$ This is the hierarchy of templates * munin-overview.tmpl - Overview with all groups and hosts shown (2 levels down) * munin-domainview.tmpl - all members of one domain, showing links down to each single service and/or sub-group * munin-nodeview.tmpl - two (=day, week) graphs from all plugins on the node * munin-serviceview.tmpl - deepest level of view, shows all 4 graphs from one timeseries * Zoom view - zoomable graph based on one of the other four graphs OR * munin-nodeview.tmpl - multigraph sub-level. When multigraph sublevels end ends the next is a munin-serviceview. * Comparison pages (x4) are at the service level. Not sure how to work multigraph into them so avoid it all-together. =end comment =cut use warnings; use strict; use Exporter; our (@ISA, @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(html_startup html_main get_config emit_main_index emit_comparison_template emit_group_template emit_graph_template emit_service_template emit_category_template emit_problem_template update_timestamp); use HTML::Template; use POSIX qw(strftime); use Getopt::Long; use Time::HiRes; use File::Copy::Recursive qw(dircopy); use IO::File; use Munin::Master::Logger; use Munin::Master::Utils; use Munin::Master::HTMLConfig; use Log::Log4perl qw( :easy ); my @times = ("day", "week", "month", "year"); my $DEBUG = 0; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; my $do_usage = 0; my $do_version = 0; my $stdout = 0; my $force_run_as_root = 0; my $config; my $limits; my $htmltagline; my %comparisontemplates; my $tmpldir; my $htmldir; my $do_dump = 0; my $do_fork = 1; my $max_running=6; my $running=0; my $timestamp; my $htmlconfig; sub update_timestamp { # For timestamping graphs $timestamp = strftime("%Y-%m-%d %T%z (%Z)", localtime); if ($timestamp =~ /%z/) { # %z (numeric timezone offset) may not be available, but %Z # (timeszone name) seems to be universaly supported though the # timezone names are not really standardized. $timestamp = strftime("%Y-%m-%d %T%Z", localtime); } $htmltagline = "This page was generated by Munin version ".$Munin::Common::Defaults::MUNIN_VERSION." at $timestamp"; } sub html_startup { my ($args) = @_; local @ARGV = @{$args}; $do_usage = 1 unless GetOptions ( "host=s" => [], "service=s" => [], "config=s" => \$conffile, "debug!" => \$DEBUG, "stdout!" => \$stdout, "force-run-as-root!" => \$force_run_as_root, "help" => \$do_usage, "version!" => \$do_version, "dump!" => \$do_dump, "fork!" => \$do_fork, ); print_usage_and_exit() if $do_usage; print_version_and_exit() if $do_version; exit_if_run_by_super_user() unless $force_run_as_root; munin_readconfig_base($conffile); # XXX: should not need that part here, yet. $config = munin_readconfig_part('datafile', 0); logger_open($config->{'logdir'}); logger_debug() if $DEBUG; $tmpldir = $config->{tmpldir}; $htmldir = $config->{htmldir}; $max_running = &munin_get($config, "max_html_jobs", $max_running); update_timestamp(); %comparisontemplates = instanciate_comparison_templates($tmpldir); } sub get_config { my $use_cache = shift; # usecache should match being in a cgi ($ENV{SCRIPT_NAME}) $htmlconfig = undef; # avoid double ram usage if ($use_cache) { $htmlconfig = generate_config($use_cache); } else { my $graphs_filename = $config->{dbdir} . "/graphs"; my $graphs_filename_tmp = $graphs_filename . ".tmp." . $$; $config->{"#%#graphs_fh"} = new IO::File("> $graphs_filename_tmp"); $htmlconfig = generate_config($use_cache); # Closing the file $config->{"#%#graphs_fh"} = undef; # Atomic move rename($graphs_filename_tmp, $graphs_filename); # htmlconf cache # munin-html writes it # munin-cgi-html reads it # # full cron - written, never read # munin-html and munin-cgi-html - written, and read as cache # full munin-cgi-html - should not exist! # and here, we avoid leaving a never-updating cache file my $cachefile = "$config->{dbdir}/htmlconf.storable"; munin_writeconfig_storable($cachefile, $htmlconfig); } return $htmlconfig; } sub html_main { my $staticdir = $config->{staticdir}; copy_web_resources($staticdir, $htmldir); my $configtime = Time::HiRes::time; get_config(0); my $groups = $htmlconfig; $configtime = sprintf("%.2f", (Time::HiRes::time - $configtime)); INFO "[INFO] config generated ($configtime sec)"; if (munin_get($config,"html_strategy","cron") eq "cgi"){ INFO "[INFO] html_strategy is cgi. Skipping template generation"; return; } my $update_time = Time::HiRes::time; my $lockfile = "$config->{rundir}/munin-html.lock"; INFO "[INFO] Starting munin-html, getting lock $lockfile"; munin_runlock($lockfile); # Preparing the group tree... if (!defined($groups) or scalar(%{$groups} eq '0')) { LOGCROAK "[FATAL] There is nothing to do here, since there are no nodes with any plugins. Please refer to http://munin-monitoring.org/wiki/FAQ_no_graphs"; }; if (defined $groups->{"name"} and $groups->{"name"} eq "root") { $groups = $groups->{"groups"}; # root->groups } if ($do_dump) { print munin_dumpconfig_as_str($groups); exit 0; } generate_group_templates($groups); generate_category_templates($htmlconfig->{"globalcats"}); emit_main_index($groups,$timestamp,0); emit_problem_template(0); INFO "[INFO] Releasing lock file $lockfile"; munin_removelock("$lockfile"); $update_time = sprintf("%.2f", (Time::HiRes::time - $update_time)); INFO "[INFO] munin-html finished ($update_time sec)"; } sub find_complinks{ my($type) = @_; my @links = (); foreach my $current (qw(day week month year)) { my $data = {}; if ($type eq $current) { $data->{'LINK'} = undef; } else { $data->{'LINK'} = "comparison-$current.html"; } $data->{'NAME'} = $current; push(@links, $data); } return \@links; } sub emit_comparison_template { my ($key, $t, $emit_to_stdout) = @_; ( my $file = $key->{'filename'}) =~ s/index.html$//; $file .= "comparison-$t.html"; DEBUG "[DEBUG] Creating comparison page $file"; # Rewrite peer urls to point to comparison-$t my $comparepeers = []; for my $peer (@{$key->{'peers'}}){ my $comparelink = $peer->{"link"}; next unless $comparelink; # avoid dead links $comparelink =~ s/index.html$/comparison-$t.html/; push((@$comparepeers), {"name" => $peer->{"name"}, "link" => $comparelink}); } # when comparing categories, we're generating the page inside the # domain, but the images' urls will point inside the node itself, # or even worse within a category inside it. We strip out the # extra '../' that is used to generate a relative path which is no # longer valid. foreach my $cat(@{$key->{'comparecategories'}}) { foreach my $service(@{$cat->{'services'}}) { foreach my $node(@{$service->{'nodes'}}) { foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear cimgday cimgweek cimgmonth cimgyear zoomday zoomweek zoommonth zoomyear)) { next unless defined($node->{$imgsrc}); $node->{$imgsrc} =~ s|^\.\./\.\./(?:\.\./)?|../|; } } } } $comparisontemplates{$t}->param( INFO_OPTION => 'Groups on this level', NAME => $key->{'name'}, GROUPS => $key->{'comparegroups'}, PATH => $key->{'path'}, CSS_NAME => get_css_name(), R_PATH => $key->{'root_path'}, COMPLINKS => find_complinks($t), LARGESET => decide_largeset($comparepeers), PEERS => $comparepeers, PARENT => $key->{'path'}->[-2]->{'name'}, CATEGORIES => $key->{'comparecategories'}, NCATEGORIES => $key->{'ncomparecategories'}, TAGLINE => $htmltagline, "COMPARISON-$t" => 1, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $comparisontemplates{$t}->output; } else { ensure_dir_exists($file); open(my $FILE, '>', $file) or die "Cannot open $file for writing: $!"; print $FILE $comparisontemplates{$t}->output; close $FILE; } } sub emit_graph_template { my ($key, $emit_to_stdout) = @_; my $graphtemplate = HTML::Template->new( filename => "$tmpldir/munin-nodeview.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1, filter => sub { my $ref = shift; $$ref =~ s/URLX/URL$key->{'depth'}/g; }); DEBUG "[DEBUG] Creating graph(nodeview) page ".$key->{filename}; $graphtemplate->param( INFO_OPTION => 'Nodes on this level', GROUPS => $key->{'groups'}, PATH => $key->{'path'}, CSS_NAME => get_css_name(), R_PATH => $key->{'root_path'}, PEERS => $key->{'peers'}, LARGESET => decide_largeset($key->{'peers'}), PARENT => $key->{'path'}->[-2]->{'name'}, NAME => $key->{'name'}, CATEGORIES => $key->{'categories'}, NCATEGORIES => $key->{'ncategories'}, TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $graphtemplate->output; } else { my $filename = $key->{'filename'}; ensure_dir_exists($filename); open(my $FILE, '>', $filename) or die "Cannot open $filename for writing: $!"; print $FILE $graphtemplate->output; close $FILE; } } sub emit_category_template { my ($key, $time, $emit_to_stdout) = @_; my $graphtemplate = HTML::Template->new( filename => "$tmpldir/munin-categoryview.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1, filter => sub { my $ref = shift; $$ref =~ s/URLX/URL/g; }, ); my $filename = $key->{'filename-' . $time}; DEBUG "[DEBUG] Creating global category page ".$filename; foreach my $graphs(@{$key->{'graphs'}}) { foreach my $graph(@{$graphs->{'graphs'}}) { foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear cimgday cimgweek cimgmonth cimgyear zoomday zoomweek zoommonth zoomyear)) { $graph->{$imgsrc} =~ s|^(?:\.\./)+|| } } } $graphtemplate->param( PATH => $key->{'path'}, CSS_NAME => get_css_name(), HOST_URL => $key->{'host_url'}, R_PATH => ".", "TIME".$time => 1, NAME => $key->{'name'}, TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, CATEGORY => $key->{"name"}, SERVICES => $key->{"graphs"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $graphtemplate->output; } else { ensure_dir_exists($filename); open(my $FILE, '>', $filename) or die "Cannot open $filename for writing: $!"; print $FILE $graphtemplate->output; close $FILE; } } sub ensure_dir_exists { my $dirname = shift; $dirname =~ s/\/[^\/]*$//; munin_mkdir_p($dirname, oct(755)); } sub emit_problem_template { my ($emit_to_stdout) = @_; my $graphtemplate = HTML::Template->new( filename => "$tmpldir/munin-problemview.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1, ); my $filename = munin_get_html_filename($config); $filename =~ s/index.html$/problems.html/g; INFO "[INFO] Creating problem page ".$filename; $graphtemplate->param( CSS_NAME => get_css_name(), R_PATH => ".", NAME => "Problem overview", TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, CRITICAL => $htmlconfig->{"problems"}->{"criticals"}, WARNING => $htmlconfig->{"problems"}->{"warnings"}, UNKNOWN => $htmlconfig->{"problems"}->{"unknowns"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $graphtemplate->output; } else { ensure_dir_exists($filename); open(my $FILE, '>', $filename) or die "Cannot open $filename for writing: $!"; print $FILE $graphtemplate->output; close $FILE; } } sub emit_group_template { my ($key, $emit_to_stdout) = @_; my $grouptemplate = HTML::Template->new( filename => "$tmpldir/munin-domainview.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1, filter => sub { my $ref = shift; $$ref =~ s/URLX/URL$key->{'depth'}/g; }); DEBUG "[DEBUG] Creating group page ".$key->{filename}; $grouptemplate->param( INFO_OPTION => 'Groups on this level', GROUPS => $key->{'groups'}, PATH => $key->{'path'}, R_PATH => $key->{'root_path'}, CSS_NAME => get_css_name(), PEERS => $key->{'peers'}, LARGESET => decide_largeset($key->{'peers'}), PARENT => $key->{'path'}->[-2]->{'name'} || "Overview", COMPARE => $key->{'compare'}, TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $grouptemplate->output; } else { my $filename = $key->{'filename'}; ensure_dir_exists($filename); open(my $FILE, '>', $filename) or die "Cannot open $filename for writing: $!"; print $FILE $grouptemplate->output; close $FILE or die "Cannot close $filename after writing: $!"; } } sub emit_zoom_template { my($srv, $emit_to_stdout) = @_; my $servicetemplate = HTML::Template->new( filename => "$tmpldir/munin-dynazoom.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1 ); my $pathnodes = $srv->{'path'}; my $peers = $srv->{'peers'}; #remove underscores from peers and title (last path element) if ($peers){ $peers = [ map { $_->{'name'} =~ s/_/ /g; $_;} @$peers ]; } $pathnodes->[scalar(@$pathnodes) - 1]->{'pathname'} =~ s/_/ /g; $servicetemplate->param( INFO_OPTION => 'Graphs in same category', SERVICES => [$srv], PATH => $pathnodes, PEERS => $peers, LARGESET => decide_largeset($peers), R_PATH => $srv->{'root_path'}, CSS_NAME => get_css_name(), CATEGORY => ucfirst $srv->{'category'}, TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), SHOW_ZOOM_JS => 1, ); if($emit_to_stdout){ print $servicetemplate->output; } else { my $filename = $srv->{'filename'}; ensure_dir_exists($filename); DEBUG "[DEBUG] Creating service page $filename"; open(my $FILE, '>', $filename) or die "Cannot open '$filename' for writing: $!"; print $FILE $servicetemplate->output; close $FILE or die "Cannot close '$filename' after writing: $!"; } } sub emit_service_template { my ($srv, $emit_to_stdout) = @_; my $servicetemplate = HTML::Template->new( filename => "$tmpldir/munin-serviceview.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1 ); my $pathnodes = $srv->{'path'}; my $peers = $srv->{'peers'}; #remove underscores from peers and title (last path element) if ($peers){ $peers = [ map { $_->{'name'} =~ s/_/ /g; $_;} @$peers ]; } $pathnodes->[scalar(@$pathnodes) - 1]->{'pathname'} =~ s/_/ /g; $servicetemplate->param( INFO_OPTION => 'Graphs in same category', SERVICES => [$srv], PATH => $pathnodes, PEERS => $peers, LARGESET => decide_largeset($peers), R_PATH => $srv->{'root_path'}, CSS_NAME => get_css_name(), CATEGORY => ucfirst $srv->{'category'}, TAGLINE => $htmltagline, ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); # No stored filename for this kind of html node. if($emit_to_stdout){ print $servicetemplate->output; } else { my $filename = $srv->{'filename'}; ensure_dir_exists($filename); DEBUG "[DEBUG] Creating service page $filename"; open(my $FILE, '>', $filename) or die "Cannot open '$filename' for writing: $!"; print $FILE $servicetemplate->output; close $FILE or die "Cannot close '$filename' after writing: $!"; } } sub decide_largeset { my ($peers) = @_; return scalar(@$peers) > $config->{'dropdownlimit'} ? 1 : 0; } sub emit_main_index { # Draw main index my ($groups, $t, $emit_to_stdout) = @_; my $template = HTML::Template->new( filename => "$tmpldir/munin-overview.tmpl", die_on_bad_params => 0, loop_context_vars => 1, global_vars => 1, filter => sub { my $ref = shift; $$ref =~ s/URLX/URL0/g; }, ); # FIX: this sometimes bugs: # HTML::Template::param() : attempt to set parameter 'groups' with # a scalar - parameter is not a TMPL_VAR! at # /usr/local/share/perl/5.10.0/Munin/Master/HTMLOld.pm line 140 $template->param( TAGLINE => $htmltagline, GROUPS => $groups, CSS_NAME => get_css_name(), R_PATH => ".", ROOTGROUPS => $htmlconfig->{"groups"}, MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION, TIMESTAMP => $timestamp, NGLOBALCATS => $htmlconfig->{"nglobalcats"}, GLOBALCATS => $htmlconfig->{"globalcats"}, NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}), NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}), NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}), ); if($emit_to_stdout){ print $template->output; } else { my $filename = munin_get_html_filename($config); ensure_dir_exists($filename); DEBUG "[DEBUG] Creating main index $filename"; open(my $FILE, '>', $filename) or die "Cannot open $filename for writing: $!"; print $FILE $template->output; close $FILE; } } sub copy_web_resources { my ($staticdir, $htmldir) = @_; unless(dircopy($staticdir, "$htmldir/static")){ ERROR "[ERROR] Could not copy contents from $staticdir to $htmldir"; die "[ERROR] Could not copy contents from $staticdir to $htmldir"; } } sub instanciate_comparison_templates { my ($tmpldir) = @_; return ( day => HTML::Template->new( filename => "$tmpldir/munin-comparison-day.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1 ), week => HTML::Template->new( filename => "$tmpldir/munin-comparison-week.tmpl", die_on_bad_params => 0, global_vars => 1, loop_context_vars => 1 ), month => HTML::Template->new( filename => "$tmpldir/munin-comparison-month.tmpl", global_vars => 1, die_on_bad_params => 0, loop_context_vars => 1 ), year => HTML::Template->new( filename => "$tmpldir/munin-comparison-year.tmpl", global_vars => 1, die_on_bad_params => 0, loop_context_vars => 1 )); } sub get_css_name{ #NOTE: this will do more in future versions. knuthaug 2009-11-15 return "style.css"; } sub fork_and_work { my ($work) = @_; if (!$do_fork || !$max_running) { # We're not forking. Do work and return. DEBUG "[DEBUG] Doing work synchrnonously"; &$work; return; } # Make sure we don't fork too much while ($running >= $max_running) { DEBUG "[DEBUG] Too many forks ($running/$max_running), wait for something to get done"; look_for_child("block"); --$running; } my $pid = fork(); if (!defined $pid) { ERROR "[ERROR] fork failed: $!"; die "fork failed: $!"; } if ($pid == 0) { # This block does the real work. Since we're forking exit # afterwards. &$work; # See?! exit 0; } else { ++$running; DEBUG "[DEBUG] Forked: $pid. Now running $running/$max_running"; while ($running and look_for_child()) { --$running; } } } sub generate_category_templates { my $arr = shift || return; foreach my $key (@$arr) { foreach my $time (@times) { emit_category_template($key, $time, 0); } } } sub generate_group_templates { my $arr = shift || return; return unless ref($arr) eq "ARRAY"; foreach my $key (@$arr) { if (defined $key and ref($key) eq "HASH") { if (defined $key->{'ngroups'} and $key->{'ngroups'}) { fork_and_work(sub {generate_group_templates($key->{'groups'})}); emit_group_template($key,0); if ($key->{'compare'}) { # Create comparison templates as well foreach my $t (@times) { emit_comparison_template($key,$t,0); } } } if (defined $key->{'ngraphs'} and $key->{'ngraphs'}) { emit_graph_template($key, 0); foreach my $category (@{$key->{"categories"}}) { foreach my $serv (@{$category->{"services"}}) { unless($serv->{"multigraph"}){ emit_service_template($serv); #emit_zoom_template($serv); } } } } } } } sub print_usage_and_exit { print "Usage: $0 [options] Options: --help View this message. --debug View debug messages. --version View version information. --nofork Compatibility. No effect. --service Compatibility. No effect. --host Compatibility. No effect. --config Use as configuration file. [/etc/munin/munin.conf] "; exit 0; } 1; =head1 NAME munin-html - A program to draw html-pages on an Munin installation =head1 SYNOPSIS munin-html [options] =head1 OPTIONS =over 5 =item B<< --service >> Compatibility. No effect. =item B<< --host >> Compatibility. No effect. =item B<< --nofork >> Compatibility. No effect. =item B<< --config >> Use EfileE as configuration file. [/etc/munin/munin.conf] =item B<< --help >> View help message. =item B<< --[no]debug >> If set, view debug messages. [--nodebug] =back =head1 DESCRIPTION Munin-html is a part of the package Munin, which is used in combination with Munin's node. Munin is a group of programs to gather data from Munin's nodes, graph them, create html-pages, and optionally warn Nagios about any off-limit values. Munin-html creates the html pages. =head1 FILES @@CONFDIR@@/munin.conf @@DBDIR@@/datafile @@LOGDIR@@/munin-html @@HTMLDIR@@/* @@STATEDIR@@/* =head1 VERSION This is munin-html version @@VERSION@@ =head1 AUTHORS Knut Haugen, Audun Ytterdal and Jimmy Olsen. =head1 BUGS munin-html does, as of now, not check the syntax of the configuration file. Please report other bugs in the bug tracker at L. =head1 COPYRIGHT Copyright (C) 2002-2009 Knut Haugen, Audun Ytterdal, and Jimmy Olsen / Linpro AS. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program is released under the GNU General Public License =head1 SEE ALSO For information on configuration options, please refer to the man page for F. =cut # vim:syntax=perl:ts=8 munin-2.0.25/master/lib/Munin/Master/Host.pm000066400000000000000000000046771243472346000206060ustar00rootroot00000000000000package Munin::Master::Host; use base qw(Munin::Master::Group); # $Id$ use warnings; use strict; use Carp; sub new { my ($class, $host_name, $group, $attributes) = @_; $attributes ||= {}; my $self = { host_name => $host_name, group => $group, port => 4949, update => 1, use_node_name => 0, %$attributes, }; # "Address" is required but must be lazy about it. # die "Attribute 'address' is required for $host_name, config line $.\n" unless $self->{address}; return bless $self, $class; } sub get_full_path { # Find the full nested named path of the current host object # might one for M::M::Group too and make it recursive instead of # "just" iterative but not now. my ($self) = @_; my $group; my @groups = ( $self->{host_name} ); $group=$self->{group}; while (defined($group)) { unshift(@groups,$group->{group_name}); $group=$group->{group}; } return join(";",@groups); } sub add_attributes_if_not_exists { my ($self, $attributes) = @_; %$self = (%$attributes, %$self); } sub get_canned_ds_config { my ($self, $service, $data_source) = @_; # XXX: Could this be done in some sane way? my %ds_config; my $svc_ds_prefix = "$service.$data_source."; for my $svc_ds_prop (keys %$self) { if (index($svc_ds_prop, $svc_ds_prefix) == 0) { my $prop = substr($svc_ds_prop, length($svc_ds_prefix)); $ds_config{$prop} = $self->{$svc_ds_prop}; } } return \%ds_config; } 1; __END__ =head1 NAME Munin::Master::Host - Holds information on hosts we are interested in collecting data from. =head1 DESCRIPTION NOTE that a host and a node are not the same thing -- some hosts may report services for several nodes, for example if they have SNMP plugins installed. =head1 METHODS =over =item B my $host = Munin::Master::Host->new($hostname, $group, \%attrs); Constructor. C<$group> is the C object this host belongs to. Valid attributes include C, C, and c. =item B Returns the full nested named path of the host object (eg. "group1;group2;hostname"). =item B $host->add_attributes_if_not_exists(\%attrs); Merges the new attributes from %attrs into the host object, without overwriting any existing =item B FIX =back munin-2.0.25/master/lib/Munin/Master/LimitsOld.pm000066400000000000000000000741261243472346000215650ustar00rootroot00000000000000package Munin::Master::LimitsOld; # -*- perl -*- =begin comment This is Munin::Master::LimitsOld, a minimal package shell to make munin-limits modular (so it can be loaded persistently in a daemon for example) without making it object oriented yet. The non-'old' module will feature propper object orientation like munin-update and will have to wait until later. Copyright (C) 2004-2009 Jimmy Olsen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. $Id$ =end comment =cut use warnings; use strict; use Exporter; our (@ISA, @EXPORT); @ISA = qw ( Exporter ); @EXPORT = qw ( limits_startup limits_main ); use POSIX qw ( strftime ); use Getopt::Long; use Time::HiRes; use Text::Balanced qw ( extract_bracketed ); use Log::Log4perl qw ( :easy ); use Munin::Master::Logger; use Munin::Master::Utils; use Munin::Common::Defaults; my $DEBUG = 0; my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; my $do_usage = 0; my $do_version = 0; my @limit_hosts = (); my @limit_services = (); my @limit_contacts = (); my @always_send = (); my $stdout = 0; my $force = 0; my $force_run_as_root = 0; my %notes = (); my $config; my $oldnotes; my $modified = 0; my %default_text = ( "default" => '${var:group} :: ${var:host} :: ${var:graph_title}${if:cfields \n\tCRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields \n\tWARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields \n\tUNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields \n\tOKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}\n', "nagios" => '${var:host}\t${var:graph_title}\t${var:worstid}\t${strtrunc:350 ${if:cfields CRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields WARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields UNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields OKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}}', "old-nagios" => '${var:host}\t${var:plugin}\t${var:worstid}\t${strtrunc:350 ${var:graph_title}:${if:cfields CRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields WARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields UNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields OKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}}' ); sub limits_startup { # Get options my ($args) = @_; local @ARGV = @{$args}; $do_usage = 1 unless GetOptions( "host=s" => \@limit_hosts, "service=s" => \@limit_services, "contact=s" => \@limit_contacts, "config=s" => \$conffile, "debug!" => \$DEBUG, "stdout!" => \$stdout, "force!" => \$force, "always-send=s" => \@always_send, "force-run-as-root!" => \$force_run_as_root, "version!" => \$do_version, "help" => \$do_usage ); print_usage_and_exit() if $do_usage; print_version_and_exit() if $do_version; exit_if_run_by_super_user() unless $force_run_as_root; @always_send = qw{ok warning critical unknown} if $force; munin_readconfig_base($conffile); # XXX: check if it does actualy need that part $config = munin_readconfig_part('datafile', 0); logger_open($config->{'logdir'}); logger_debug() if $DEBUG; } sub limits_main { # We're liable to receive SIGPIPEs if the given commands don't work $SIG{PIPE} = 'IGNORE'; my $update_time = Time::HiRes::time; my $lockfile = "$config->{rundir}/munin-limits.lock"; INFO "[INFO] Starting munin-limits, getting lock $lockfile"; munin_runlock("$config->{rundir}/munin-limits.lock"); $oldnotes = &munin_readconfig_part('limits', 1); initialize_for_nagios(); initialize_contacts(); process_limits(); close_pipes(); &munin_writeconfig("$config->{dbdir}/limits", \%notes); &munin_writeconfig_storable("$config->{dbdir}/limits.storable", \%notes); $update_time = sprintf("%.2f", (Time::HiRes::time - $update_time)); munin_removelock("$config->{rundir}/munin-limits.lock"); INFO "[INFO] munin-limits finished ($update_time sec)"; } sub close_pipes { foreach my $cont (@{munin_get_children($config->{"contact"})}) { if($cont->{pipe}) { my $c = munin_get_node_name($cont); DEBUG "[DEBUG] Closing pipe for contact $c"; close $cont->{pipe} or WARN "[WARNING] Failed to close pipe for contact $c: $!"; } } } sub process_limits { # Make array of what needs to be checked my %work_hash_tmp; my $work_array = []; foreach my $workfield ( @{munin_find_field_for_limits($config, qr/^(critical|warning)/)}) { my $parent = munin_get_parent($workfield); if (!defined $work_hash_tmp{$parent}) { $work_hash_tmp{$parent} = 1; push @$work_array, $parent; } } # Process array containing services we need to check foreach my $workservice (@$work_array) { process_service($workservice); } } sub initialize_contacts { my $defaultcontacts = munin_get($config, "contacts", ""); if (!length $defaultcontacts) { my @tmpcontacts = (); foreach my $cont (@{munin_get_children($config->{"contact"})}) { if (munin_get($cont, "command")) { push @tmpcontacts, munin_get_node_name($cont); } } $defaultcontacts = join(' ', @tmpcontacts); } munin_set_var_loc($config, ["contacts"], $defaultcontacts); DEBUG "[DEBUG] Set default \"contacts\" to \"$defaultcontacts\""; } sub initialize_for_nagios { if ( !defined $config->{'contact'}->{'nagios'}->{'command'} and defined $config->{'nsca'}) { $config->{'contact'}->{'old-nagios'}->{'command'} = "$config->{nsca} $config->{nsca_server} -c $config->{nsca_config} -to 60"; $config->{'contact'}->{'old-nagios'}->{'always_send'} = "critical warning"; } if (!defined $config->{'contact'}->{'nagios'}->{'always_send'}) { $config->{'contact'}->{'nagios'}->{'always_send'} = "critical warning"; } } sub print_usage_and_exit { print "Usage: $0 [options] Options: --help View this message. --debug View debug messages. --stdout Log to stdout as well as the log file. --always-send Send messages to contacts even if state has not changed since the last run. The list is a space or comma separated list of severities. Choose from one or more of \"critical\", \"warning\", \"unknown\" and \"ok\". --force Alias for \"--always-send ok,warning,critical,unknown\". Overrides --always-send command line, as well as the always_send contact configuration options. --service Limit notified services to . Multiple --service options may be supplied. --host Limit notified hosts to . Multiple --host options may be supplied. --contact Limit notified contacts to . Multiple --contact options may be supplied. --config Use as configuration file. [/etc/munin/munin.conf] "; exit 0; } # Get the host of the service in question sub get_host_node { my $service = shift || return undef; my $parent = munin_get_parent($service) || return undef; if (munin_has_subservices($parent)) { return get_host_node($parent); } else { return $parent; } } sub get_notify_name { my $hash = shift || return; if (defined $hash->{'notify_alias'}) { return $hash->{'notify_alias'}; } elsif (defined $hash->{'graph_title'}) { return $hash->{'graph_title'}; } else { return munin_get_node_name($hash); } } # Joined "sub-path" under host level sub get_full_service_name { my $service = shift || return undef; my $parent = munin_get_parent($service); my $name = get_notify_name($service); if (defined $parent and munin_has_subservices($parent)) { return (get_full_service_name($parent) . " :: " . $name); } else { return $name; } } # Joined group path above host level sub get_full_group_path { my $group = shift || return undef; my $parent = munin_get_parent($group); my $name = get_notify_name($group); if (defined $parent and munin_get_node_name($parent) ne "root") { return (get_full_group_path($parent) . "-" . $name); } else { return $name; } } sub process_service { my $hash = shift || return; my $hobj = get_host_node($hash); my $host = munin_get_node_name($hobj); my $hostalias = get_notify_name($hobj); my $service = munin_get_node_name($hash); my $hparentobj = munin_get_parent($hobj); my $parent = munin_get_node_name($hobj); my $gparent = munin_get_node_name($hparentobj); my $children = munin_get_children($hash); if (!ref $hash) { LOGCROAK("I was passed a non-hash!"); } return if (@limit_hosts and !grep (/^$host$/, @limit_hosts)); return if (@limit_services and !grep (/^$service$/, @limit_services)); DEBUG "[DEBUG] processing service: $service"; # Some fields that are nice to have in the plugin output $hash->{'fields'} = join(' ', map {munin_get_node_name($_)} @$children); $hash->{'plugin'} = $service; $hash->{'graph_title'} = get_full_service_name($hash); $hash->{'host'} = $hostalias; $hash->{'group'} = get_full_group_path($hparentobj); $hash->{'worst'} = "ok"; $hash->{'worstid'} = 0 unless defined $hash->{'worstid'}; my $state_file = sprintf ('%s/state-%s-%s.storable', $config->{dbdir}, $hash->{group}, $host); DEBUG "[DEBUG] state_file: $state_file"; my $state = munin_read_storable($state_file) || {}; foreach my $field (@$children) { next if (!defined $field or ref($field) ne "HASH"); my $fname = munin_get_node_name($field); my $fpath = munin_get_node_loc($field); my $onfield = munin_get_node($oldnotes, $fpath); my $oldstate= ''; # Test directly here as get_limits is in truth recursive and # that fools us when processing multigraphs. next if (!defined($field->{warning}) and !defined($field->{critical})); # get the old state if there is one, or leave it empty. if ( defined($onfield) or defined($onfield->{"state"}) ) { $oldstate = $onfield->{"state"}; } my ($warn, $crit, $unknown_limit) = get_limits($field); # Skip fields without warning/critical definitions next if (!defined $warn and !defined $crit); DEBUG "[DEBUG] processing field: " . join('::', @$fpath); DEBUG "[DEBUG] field: " . munin_dumpconfig_as_str($field); my $value; { my $rrd_filename = munin_get_rrd_filename($field); my ($current_updated_timestamp, $current_updated_value) = @{ $state->{value}{"$rrd_filename:42"}{current} || [ ] }; my ($previous_updated_timestamp, $previous_updated_value) = @{ $state->{value}{"$rrd_filename:42"}{previous} || [ ] }; my $heartbeat = 600; # XXX - $heartbeat is a fixed 10 min (2 runs of 5 min). if (! $field->{type} || $field->{type} eq "GAUGE") { $value = $current_updated_value; } elsif (! defined $current_updated_value || ! defined $previous_updated_value || $current_updated_timestamp == $previous_updated_timestamp) { # No derive computing possible. Report unknown. $value = "U"; } elsif (time > $current_updated_timestamp + $heartbeat) { # Current value is too old. Report unknown. $value = "U"; } elsif ($current_updated_timestamp > $previous_updated_timestamp + $heartbeat) { # Old value is too old. Report unknown. $value = "U"; } elsif ($field->{type} eq "COUNTER" && $current_updated_value < $previous_updated_value) { # COUNTER never decrease. Report unknown. $value = "U"; } elsif ($current_updated_value eq "U") { # The current value is unknown. Report unknown. $value = "U"; } elsif ($field->{type} eq "ABSOLUTE") { # The previous value is unimportant, as if ABSOLUTE, the counter is reset anytime the value is read $value = $current_updated_value / ($current_updated_timestamp - $previous_updated_timestamp); } elsif ($previous_updated_value eq "U") { # The previous value is unknown. # Report unknown, as we are not ABSOLUTE $value = "U"; } else { # Everything is ok for DERIVE/COUNTER # compute the value per timeunit $value = ($current_updated_value - $previous_updated_value) / ($current_updated_timestamp - $previous_updated_timestamp); } } # De-taint. if (!defined $value || $value eq "U") { $value = "unknown"; } else { $value = sprintf "%.2f", $value; } # Some fields that are nice to have in the plugin output $field->{'value'} = $value; $field->{'crange'} = (defined $crit->[0] ? $crit->[0] : "") . ":" . (defined $crit->[1] ? $crit->[1] : ""); $field->{'wrange'} = (defined $warn->[0] ? $warn->[0] : "") . ":" . (defined $warn->[1] ? $warn->[1] : ""); DEBUG("[DEBUG] value: " . join('::', @$fpath) . ": $value (crit: " . $field->{'crange'} . ") (warn: " . $field->{'wrange'} . ")"); if ($value eq "unknown") { $crit->[0] ||= ""; $crit->[1] ||= ""; my $state = "unknown"; my $extinfo = defined $field->{"extinfo"} ? "unknown: " . $field->{"extinfo"} : "Value is unknown."; my $num_unknowns; if ( $oldstate ne "unknown") { $hash->{'state_changed'} = 1; } else { $hash->{'state_changed'} = 0; } # First we'll need to check whether the user wants to ignore # a few UNKNOWN values before actually changing the state to # UNKNOWN. if ($unknown_limit > 1) { if (defined $onfield and defined $onfield->{"state"}) { if ($onfield->{"state"} ne "unknown") { if (defined $onfield->{"num_unknowns"}) { if ($onfield->{"num_unknowns"} < $unknown_limit) { # Don't change the state to UNKNOWN yet. $hash->{'state_changed'} = 0; $state = $onfield->{"state"}; $extinfo = $onfield->{$state}; # Increment the number of UNKNOWN values seen. $num_unknowns = $onfield->{"num_unknowns"} + 1; } } else { # Don't change the state to UNKNOWN yet. $hash->{'state_changed'} = 0; $state = $onfield->{"state"}; $extinfo = $onfield->{$state}; # Start counting the number of consecutive UNKNOWN # values seen. $num_unknowns = 1; } } } } if ($state eq "unknown") { $hash->{'worst'} = "UNKNOWN" if $hash->{"worst"} eq "OK"; $hash->{'worstid'} = 3 if $hash->{"worstid"} == 0; } elsif ($state eq "critical") { $hash->{'worst'} = "CRITICAL"; $hash->{'worstid'} = 2; } elsif ($state eq "warning") { $hash->{'worst'} = "WARNING" if $hash->{"worst"} ne "CRITICAL"; $hash->{'worstid'} = 1 if $hash->{"worstid"} != 2; } munin_set_var_loc(\%notes, [@$fpath, "state"], $state); munin_set_var_loc(\%notes, [@$fpath, $state], $extinfo); if (defined $num_unknowns) { munin_set_var_loc(\%notes, [@$fpath, "num_unknowns"], $num_unknowns); } } elsif ((defined($crit->[0]) and $value < $crit->[0]) or (defined($crit->[1]) and $value > $crit->[1])) { $crit->[0] ||= ""; $crit->[1] ||= ""; $hash->{'worst'} = "CRITICAL"; $hash->{'worstid'} = 2; munin_set_var_loc(\%notes, [@$fpath, "state"], "critical"); munin_set_var_loc( \%notes, [@$fpath, "critical"], ( defined $field->{"extinfo"} ? "$value (not in " . $field->{'crange'} . "): " . $field->{"extinfo"} : "Value is $value. Critical range (" . $field->{'crange'} . ") exceeded" )); if ( $oldstate ne "critical") { $hash->{'state_changed'} = 1; } } elsif ((defined($warn->[0]) and $value < $warn->[0]) or (defined($warn->[1]) and $value > $warn->[1])) { $warn->[0] ||= ""; $warn->[1] ||= ""; $hash->{'worst'} = "WARNING" if $hash->{"worst"} ne "CRITICAL"; $hash->{'worstid'} = 1 if $hash->{"worstid"} != 2; munin_set_var_loc(\%notes, [@$fpath, "state"], "warning"); munin_set_var_loc( \%notes, [@$fpath, "warning"], ( defined $field->{"extinfo"} ? "$value (not in " . $field->{'wrange'} . "): " . $field->{"extinfo"} : "Value is $value. Warning range (" . $field->{'wrange'} . ") exceeded" )); if ( $oldstate ne "warning") { $hash->{'state_changed'} = 1; } } else { munin_set_var_loc(\%notes, [@$fpath, "state"], "ok"); munin_set_var_loc(\%notes, [@$fpath, "ok"], "OK"); if ($oldstate ne 'ok') { $hash->{'state_changed'} = 1; } } } generate_service_message($hash); } sub get_limits { my $hash = shift || return; # This hash will have values that we can look up such as these: my @critical = (undef, undef); my @warning = (undef, undef); my $crit = munin_get($hash, "critical", undef); my $warn = munin_get($hash, "warning", undef); my $unknown_limit = munin_get($hash, "unknown_limit", 3); my $name = munin_get_node_name($hash); if (defined $crit and $crit =~ /^\s*([-+\d.]*):([-+\d.]*)\s*$/) { $critical[0] = $1 if length $1; $critical[1] = $2 if length $2; } elsif (defined $crit and $crit =~ /^\s*([-+\d.]+)\s*$/) { $critical[1] = $1; } elsif (defined $crit) { @critical = (0, 0); } if(defined $crit) { DEBUG "[DEBUG] processing critical: $name -> " . (defined $critical[0]? $critical[0] : "") . " : " . (defined $critical[1]? $critical[1] : ""); } if (defined $warn and $warn =~ /^\s*([-+\d.]*):([-+\d.]*)\s*$/) { $warning[0] = $1 if length $1; $warning[1] = $2 if length $2; } elsif (defined $warn and $warn =~ /^\s*([-+\d.]+)\s*$/) { $warning[1] = $1; } elsif (defined $warn) { @warning = (0, 0); } if(defined $warn) { DEBUG "[DEBUG] processing warning: $name -> " . (defined $warning[0]? $warning[0] : "") . " : " . (defined $warning[1]? $warning[1] : ""); } if ($unknown_limit =~ /^\s*(\d+)\s*$/) { $unknown_limit = $1 if defined $1; if (defined $unknown_limit) { if ($unknown_limit < 1) { # Zero and negative numbers are not valid. $unknown_limit = 1; } } DEBUG "[DEBUG] processing unknown_limit: $name -> $unknown_limit"; } return (\@warning, \@critical, $unknown_limit); } sub generate_service_message { my $hash = shift || return; my $critical = undef; my $worst = $hash->{"worst"}; my %stats = ( 'critical' => [], 'warning' => [], 'unknown' => [], 'foks' => [], 'ok' => []); my $contacts = munin_get_children(munin_get_node($config, ["contact"])); DEBUG "[DEBUG] generating service message: " . join('::', @{munin_get_node_loc($hash)}); my $children = munin_get_children( munin_get_node(\%notes, munin_get_node_loc($hash))); if ( defined($children) ) { foreach my $field (@$children) { if (defined $field->{"state"}) { push @{$stats{$field->{"state"}}}, munin_get_node_name($field); if ($field->{"state"} eq "ok") { push @{$stats{"foks"}}, munin_get_node_name($field); } } } } $hash->{'cfields'} = join " ", @{$stats{'critical'}}; $hash->{'wfields'} = join " ", @{$stats{'warning'}}; $hash->{'ufields'} = join " ", @{$stats{'unknown'}}; $hash->{'fofields'} = join " ", @{$stats{'foks'}}; $hash->{'ofields'} = join " ", @{$stats{'ok'}}; $hash->{'numcfields'} = scalar @{$stats{'critical'}}; $hash->{'numwfields'} = scalar @{$stats{'warning'}}; $hash->{'numufields'} = scalar @{$stats{'unknown'}}; $hash->{'numfofields'} = scalar @{$stats{'foks'}}; $hash->{'numofields'} = scalar @{$stats{'ok'}}; my $contactlist = munin_get($hash, "contacts", ""); DEBUG("[DEBUG] Contact list for " . join('::', @{munin_get_node_loc($hash)}) . ": $contactlist"); foreach my $c (split(/\s+/, $contactlist)) { next if $c eq "none"; my $contactobj = munin_get_node($config, ["contact", $c]); if(!defined $contactobj) { WARN("[WARNING] Missing configuration options for contact $c; skipping"); next; } if (@limit_contacts and !grep (/^$c$/, @limit_contacts)) { next; } my $obsess = 0; my $always_send; if (@always_send) { # List of severities from command line argument $always_send = \@always_send; } else { # List of severities from contact configuration my $always_send_config = munin_get( $contactobj, "always_send" ); my @always_send_config = ($always_send_config); $always_send = \@always_send_config; } $always_send = validate_severities($always_send); foreach my $cas ( @{$always_send} ) { if(defined($stats{$cas})) { $obsess += scalar @{$stats{$cas}}; } } if (!$hash->{'state_changed'} and !$obsess) { next; # No need to send notification } DEBUG "[DEBUG] state has changed, notifying $c"; my $precmd = munin_get($contactobj, "command", undef); if(!defined $precmd) { WARN("[WARNING] Missing command option for contact $c; skipping"); next; } my $pretxt = munin_get( $contactobj, "text", munin_get( munin_get_node($config, ["contact", "default"]), "text", $default_text{$c} || $default_text{"default"})); my $txt = message_expand($hash, $pretxt, ""); my $cmd = message_expand($hash, $precmd, ""); $txt =~ s/\\n/\n/g; $txt =~ s/\\t/\t/g; if($cmd =~ /^\s*([|><]+)/) { WARN "[WARNING] Found \"$1\" at beginning of command. This should no longer be necessary and will be removed from the command before execution"; $cmd =~ s/^\s*[|><]+//; } my $maxmess = munin_get($contactobj, "max_messages", 0); my $curmess = munin_get($contactobj, "num_messages", 0); my $curcmd = munin_get($contactobj, "pipe_command", undef); my $pipe = munin_get($contactobj, "pipe", undef); if ($maxmess and $curmess >= $maxmess) { DEBUG "[DEBUG] Resetting pipe for $c because max messages was reached"; close($pipe) or WARN "[WARNING] Failed to close pipe for $c: $!"; $pipe = undef; munin_set($contactobj, "pipe", undef); } elsif ($curcmd and $curcmd ne $cmd) { DEBUG "[DEBUG] Resetting pipe for $c because the command has changed"; close($pipe) or WARN "[WARNING] Failed to close pipe for $c: $!"; $pipe = undef; munin_set($contactobj, "pipe", undef); } if (!defined $pipe) { DEBUG "[DEBUG] Opening pipe for $c"; pipe(my $r, my $w) or WARN "[WARNING] Failed to open pipe for $c: $!"; my $pid = fork(); defined($pid) or WARN "[WARNING] Failed fork for pipe for $c: $!"; if($pid) { # parent DEBUG "[DEBUG] Opened pipe for $c as pid $pid"; close $r; $pipe = $w; munin_set($contactobj, "pipe_command", $cmd); munin_set($contactobj, "pipe", $pipe); munin_set($contactobj, "num_messages", 0); $curmess = 0; } else { # child close $w; open(STDIN, "<&", $r); exec($cmd) or WARN "[WARNING] Failed to exec for contact $c in pid $$"; exit; } } DEBUG "[DEBUG] sending message to $c: \"$txt\""; if(defined $pipe and !print $pipe $txt, "\n") { WARN "[WARNING] Writing to pipe for $c failed: $!"; close($pipe) or WARN "[WARNING] Failed to close pipe for $c: $!"; $pipe = undef; munin_set($contactobj, "pipe", undef); } munin_set($contactobj, "num_messages", $curmess + 1); } } sub message_expand { my $hash = shift; my $text = shift; my @res = (); while (defined($text) && length($text)) { if ($text =~ /^([^\$]+|)(?:\$(\{.*)|)$/) { push @res, $1; $text = $2; } my @a = extract_bracketed($text, '{}'); if(!defined $a[0]) { $text = $a[1]; next; } if ($a[0] =~ /^\{var:(\S+)\}$/) { $a[0] = munin_get($hash, $1, ""); } elsif ($a[0] =~ /^\{loop<([^>]+)>:\s*(\S+)\s(.+)\}$/) { my $d = $1; my $f = $2; my $t = $3; my $fields = munin_get($hash, $f, ""); my @res = (); if ($fields) { foreach my $sub (split /\s+/, $fields) { if (defined $hash->{$sub}) { push @res, message_expand($hash->{$sub}, $t); } } } $a[0] = join($d, @res); } elsif ($a[0] =~ /^\{loop:\s*(\S+)\s(.+)\}$/) { my $f = $1; my $t = $2; my $fields = munin_get($hash, $f, ""); my $res = ""; if ($fields) { foreach my $sub (split /\s+/, $fields) { if (defined $hash->{$sub}) { push @res, message_expand($hash->{$sub}, $t); } } } $a[0] = $res; } elsif ($a[0] =~ /^\{strtrunc:\s*(\S+)\s(.+)\}$/) { my $f = "%." . $1 . "s"; my $t = $2; $a[0] = sprintf($f, message_expand($hash, $t)); } elsif ($a[0] =~ /^\{if:\s*(\!)?(\S+)\s(.+)\}$/) { my $n = $1; my $f = $2; my $t = $3; my $res = ""; my $field = munin_get($hash, $f, 0); my $check = (defined $field and $field ne "0" and length($field)); $check = (!$check) if $n; if ($check) { $res .= message_expand($hash, $t); } $a[0] = $res; } push @res, $a[0]; $text = $a[1]; } return join('', @res); } =pod Get a list of severities, and return a sorted, lower cased, unique and validated list of severities. Expects and returns an array reference. If none of the severities given are on the allowed_severities list, it will return a reference to an empty array. =cut sub validate_severities { my $severities_ref = shift; my @severities = grep { defined $_ } @{$severities_ref}; my @allowed_severities = qw{ok warning critical unknown}; # Flatten, split on comma and whitespace, and lowercase my @expanded_severities = split( /[[:space:],]+/, lc( join( ',', @severities ) ) ); # Remove duplicates my %seen; my @unique_severities = grep { !$seen{$_}++ } @expanded_severities; # Filter on allowed values my %count; my @validated_severities; foreach my $severity ( @unique_severities, @allowed_severities ) { $count{$severity}++; } foreach my $severity ( keys %count ) { if ( $count{$severity} == 2 ) { push @validated_severities, $severity; } } # Sort the final list my @sorted_severities = sort(@validated_severities); return \@sorted_severities; } 1; munin-2.0.25/master/lib/Munin/Master/Logger.pm000066400000000000000000000074241243472346000211010ustar00rootroot00000000000000package Munin::Master::Logger; # $Id$ =encoding utf-8 =head1 NAME Munin::Master::Logger - Munin master's old logging routines =head1 SYNOPSIS This module contains Munin master's old logging routines while we're switching to Log::Log4perl. It also sets up Log4perl according to our needs. Do not use "logger" when writing new code, use the Log::Log4perl :easy API. This module takes care of initializing Log::Log4perl at load time. =head1 SUBROUTINES =over =item B needs to be called once in the main program with one argument: The directory where the munin logs goes. The running programs name ($0) will be used as the log name (e.g. munin-graph.log). =item B Do not use. =item B Use to set the programs log level to debug, info, warn, error, or fatal. This corresponds to the log levels used in syslog, but syslog is not used for logging. =item B Set up DEBUG logging. Both STDOUT and the log file will receive DEBUG level output. =back =head1 AUTHOR Munin master logging ported to Log4perl by Nicolai Langfeldt. Split out into this module by Kjell Magne Øierud. =head1 LICENSE GPLv2 =cut use base qw(Exporter); use strict; use warnings; use English qw(-no_match_vars); use File::Basename qw(basename); use Log::Log4perl qw(:easy); our @EXPORT = qw(logger_open logger_open_stderr logger_debug logger_level logger); # Early open of the log. Warning and more urgent messages will go to # screen. Log::Log4perl->easy_init( $WARN ); my $logdir = undef; my $logopened = 0; my $me = $1 if basename($PROGRAM_NAME) =~ m/(.*)/; # Fast untaint $PROGRAM_NAME sub _warn_catcher { if ($logopened) { WARN "[PERL WARNING] ".join(" ",@_); } else { print STDERR join(" ",@_); } } sub logger_open_stderr { if (!$logopened) { # I'm a bit uncertain about the :utf8 bit. Log::Log4perl->easy_init( { level => $INFO, file => ":utf8>&STDERR" } ); $logopened = 1; } get_logger('')->debug("Opened log file"); # Get perl warnings into the log files $SIG{__WARN__} = \&_warn_catcher; } sub logger_open { # This is called when we have a directory and file name to log in. my $dirname = shift; $logdir=$dirname; if (!defined($dirname)) { confess("In logger_open, directory for log files undefined"); } my $log_filename = shift || "$dirname/$me.log"; if (!$logopened) { # I'm a bit uncertain about the :utf8 bit. Log::Log4perl->easy_init( { level => $INFO, file => ":utf8>>$log_filename" } ); # warn "Logging to $dirname/$me.log"; $logopened = 1; } get_logger('')->debug("Opened log file"); # Get perl warnings into the log files $SIG{__WARN__} = \&_warn_catcher; } sub logger_debug { # Adjust log level to DEBUG if user gave --debug option my $logger = get_logger(''); WARN "Setting log level to DEBUG\n"; if (defined($logdir)) { Log::Log4perl->easy_init( { level => $DEBUG, file => ":utf8>>$logdir/$me.log" }, { level => $DEBUG, file => "STDERR" } ); } else { # If we do not have a log file name to log to just send # everything to STDERR Log::Log4perl->easy_init( { level => $DEBUG, file => "STDERR" } ); } # And do not open the loggers again now. $logopened=1; } sub logger_level { my ($loglevel) = @_; my $logger = get_logger(''); $loglevel = lc $loglevel; my %level_map = ( debug => $DEBUG, info => $INFO, warn => $WARN, error => $ERROR, fatal => $FATAL, ); unless ($level_map{$loglevel}) { ERROR "Unknown log level: '$loglevel'\n"; return; } $logger->level($level_map{$loglevel}); INFO "Setting log level to $loglevel\n"; } sub logger { my ($comment) = @_; INFO @_; } 1; munin-2.0.25/master/lib/Munin/Master/Node.pm000066400000000000000000000533531243472346000205510ustar00rootroot00000000000000package Munin::Master::Node; # $Id$ # This module is used by UpdateWorker to keep in touch with a node and # parse some of the output. use warnings; use strict; use Carp; use Munin::Master::Config; use Munin::Common::Timeout; use Munin::Common::TLSClient; use Data::Dumper; use Log::Log4perl qw( :easy ); use Time::HiRes qw( gettimeofday tv_interval ); use IO::Socket::INET6; my $config = Munin::Master::Config->instance()->{config}; # Quick version, to enable "DEBUG ... if $debug" constructs my $debug = $config->{debug}; # Note: This timeout governs both small commands and waiting for the total # output of a plugin. It is reset for each read. sub new { my ($class, $address, $port, $host, $configref) = @_; my $self = { address => $address, port => $port, host => $host, tls => undef, reader => undef, pid => undef, writer => undef, master_capabilities => "multigraph dirtyconfig", io_timeout => 120, configref => $configref, }; return bless $self, $class; } sub do_in_session { my ($self, $block) = @_; if ($self->_do_connect()) { $self->_run_starttls_if_required(); my $exit_value = $block->(); $self->_do_close(); return { exit_value => $exit_value }; # If we're still here } return 0; # _do_connect failed. } sub _do_connect { # Connect to a munin node. Return false if not, true otherwise. my ($self) = @_; LOGCROAK("[FATAL] No address! Did you forget to set 'update no' or to set 'address ' ?") if !defined($self->{address}); # Check if it's an URI or a plain host use URI; # Parameters are space-separated from the main address my ($url, $params) = split(/ +/, $self->{address}, 2); my $uri = new URI($url); # If address is only "ssh://host/" $params will not get set $params = "" unless defined $params; # If the scheme is not defined, it's a plain host. # Prefix it with munin:// to be able to parse it like others $uri = new URI("munin://" . $url) unless $uri->scheme; LOGCROAK("[FATAL] '$url' is not a valid address!") unless $uri->scheme; if ($uri->scheme eq "munin") { $self->{reader} = $self->{writer} = IO::Socket::INET6->new( PeerAddr => $uri->host, PeerPort => $self->{port} || 4949, LocalAddr => $config->{local_address}, Proto => 'tcp', MultiHomed => 1, Timeout => $config->{timeout} ); if (! $self->{reader} ) { ERROR "Failed to connect to node $self->{address}:$self->{port}/tcp : $!"; return 0; } } elsif ($uri->scheme eq "ssh") { my $ssh_command = "ssh -o ChallengeResponseAuthentication=no -o StrictHostKeyChecking=no "; my $user_part = ($uri->user) ? ($uri->user . "@") : ""; my $remote_cmd = ($uri->path ne '/') ? $uri->path : ""; # Add any parameter to the cmd my $remote_connection_cmd = $ssh_command . " -p " . $uri->port . " " . $user_part . $uri->host . " " . $remote_cmd . " " . $params; # Open a triple pipe use IPC::Open3; $self->{reader} = new IO::Handle(); $self->{writer} = new IO::Handle(); $self->{stderr} = new IO::Handle(); DEBUG "[DEBUG] open3($remote_connection_cmd)"; $self->{pid} = open3($self->{writer}, $self->{reader}, $self->{stderr}, $remote_connection_cmd); ERROR "Failed to connect to node $self->{address} : $!" unless $self->{pid}; } elsif ($uri->scheme eq "cmd") { # local commands should ignore the username, url and host my $local_cmd = $uri->path; my $local_pipe_cmd = "$local_cmd $params"; # Open a triple pipe use IPC::Open3; $self->{reader} = new IO::Handle(); $self->{writer} = new IO::Handle(); $self->{stderr} = new IO::Handle(); DEBUG "[DEBUG] open3($local_pipe_cmd)"; $self->{pid} = open3($self->{writer}, $self->{reader}, $self->{stderr}, $local_pipe_cmd); ERROR "Failed to execute local command: $!" unless $self->{pid}; } else { ERROR "Unknown scheme : " . $uri->scheme; return 0; } # check all the lines until we find one that matches the expected # greeting; ignore anything that doesn't look like it as long as # there is output. This allows to accept SSH connections where # lastlog or motd is used. until(defined($self->{node_name})) { my $greeting = $self->_node_read_single(); if (!$greeting) { die "[ERROR] Got unknown reply from node ".$self->{host}."\n"; } if ($greeting =~ /\#.*(?:lrrd|munin) (?:client|node) at (\S+)/i) { $self->{node_name} = $1; } }; INFO "[INFO] node $self->{host} advertised itself as $self->{node_name} instead." if $self->{node_name} && $self->{node_name} ne $self->{host}; return 1; } sub _run_starttls_if_required { my ($self) = @_; # TLS should only be attempted if explicitly enabled. The default # value is therefore "disabled" (and not "auto" as before). my $tls_requirement = exists $self->{configref}->{tls} ? $self->{configref}->{tls} : $config->{tls}; DEBUG "TLS set to \"$tls_requirement\"."; return if $tls_requirement eq 'disabled'; my $logger = Log::Log4perl->get_logger("Munin::Master"); $self->{tls} = Munin::Common::TLSClient->new({ DEBUG => $config->{debug}, logger => sub { $logger->warn(@_) }, read_fd => fileno($self->{reader}), read_func => sub { _node_read_single($self) }, tls_ca_cert => $config->{tls_ca_certificate}, tls_cert => $config->{tls_certificate}, tls_paranoia => $tls_requirement, tls_priv => $config->{tls_private_key}, tls_vdepth => $config->{tls_verify_depth}, tls_verify => $config->{tls_verify_certificate}, tls_match => $config->{tls_match}, write_fd => fileno($self->{writer}), write_func => sub { _node_write_single($self, @_) }, }); if (!$self->{tls}->start_tls()) { $self->{tls} = undef; if ($tls_requirement eq "paranoid" or $tls_requirement eq "enabled") { die "[ERROR] Could not establish TLS connection to '$self->{address}'. Skipping.\n"; } } } sub _do_close { my ($self) = @_; close $self->{reader}; close $self->{writer}; $self->{reader} = undef; $self->{writer} = undef; # Close stderr if needed close $self->{stderr} if $self->{stderr}; $self->{stderr} = undef if $self->{stderr}; # Reap the underlying process waitpid($self->{pid}, 0) if (defined $self->{pid}); } sub negotiate_capabilities { my ($self) = @_; # Please note: Sone of the capabilities are asymetrical. Each # side simply announces which capabilities they have, and then the # other takes advantage of the capabilities it understands (or # dumbs itself down to the counterparts level of sophistication). DEBUG "[DEBUG] Negotiating capabilities\n"; $self->_node_write_single("cap $self->{master_capabilities}\n"); my $cap = $self->_node_read_single(); if (index($cap, 'cap ') == -1) { return ('NA'); } my @node_capabilities = split(/\s+/,$cap); shift @node_capabilities ; # Get rid of leading "cap". DEBUG "[DEBUG] Node says /$cap/\n"; return @node_capabilities; } sub list_plugins { my ($self) = @_; # Check for one on this node- if not, use the global one my $use_node_name = defined($self->{configref}{use_node_name}) ? $self->{configref}{use_node_name} : $config->{use_node_name}; my $host = $use_node_name ? $self->{node_name} : $self->{host}; my $use_default_node = defined($self->{configref}{use_default_node}) ? $self->{configref}{use_default_node} : $config->{use_default_node}; if (! $use_default_node && ! $host) { die "[ERROR] Couldn't find out which host to list on $host.\n"; } my $list_host = $use_default_node ? "" : $host; $self->_node_write_single("list $list_host\n"); my $list = $self->_node_read_single(); if (not $list) { WARN "[WARNING] Config node $self->{host} listed no services for $host, (advertised as $self->{node_name}). Please see http://munin-monitoring.org/wiki/FAQ_no_graphs for further information."; } return split / /, $list; } sub parse_service_config { my ($self, $service, $lines) = @_; my $errors; my $correct; my $plugin = $service; my $nodedesignation = $self->{host}."/".$self->{address}."/".$self->{port}; my $global_config = { multigraph => [], }; my $data_source_config = {}; my @graph_order = ( ); # Pascal style nested subroutine local *new_service = sub { push @{$global_config->{multigraph}}, $service; $global_config->{$service} = []; $data_source_config->{$service} = {}; }; local *push_graphorder = sub { my ($oldservice) = @_; # We always appends the field names in config order to any # graph_order given. # Note that this results in duplicates in the internal state # for @graph_order but munin_get_field_order() will eliminate # them before graphing. if (@graph_order) { foreach (@{$global_config->{$oldservice}}) { if ( $_->[0] eq 'graph_order' ) { # append to a given graph_order $_->[1] .= join(' ', '', @graph_order); @graph_order = ( ); return; } } push @{$global_config->{$oldservice}}, ['graph_order', join(' ', @graph_order)]; } @graph_order = ( ); }; DEBUG "[DEBUG] Now parsing config output from plugin $plugin on " .$self->{host}; new_service($service); # every 'N' has the same value. Should not take parsing time into the equation my $now = time; for my $line (@$lines) { DEBUG "[CONFIG from $plugin] $line" if $debug; if ($line =~ /\# timeout/) { die "[ERROR] Timeout error on $nodedesignation during fetch of $plugin. \n"; } next unless $line; next if $line =~ /^\#/; if ($line =~ m{\A multigraph \s+ (.+) }xms) { push_graphorder($service); $service = $1; if ($service eq 'multigraph') { ERROR "[ERROR] SERVICE can't be named \"$service\" in plugin $plugin on ".$self->{host}."/".$self->{address}."/".$self->{port}; $errors++; last; } if ($service =~ /(^\.|\.$|\.\.)/) { ERROR "[ERROR] SERVICE \"$service\" contains dots in wrong places in plugin $plugin on ".$self->{host}."/".$self->{address}."/".$self->{port}; $errors++; last; } if ($service !~ m/^[-\w.:.]+$/) { ERROR "[ERROR] SERVICE \"$service\" contains weird characters in plugin $plugin on ".$self->{host}."/".$self->{address}."/".$self->{port}; $errors++; last; } new_service($service) unless $global_config->{$service}; DEBUG "[CONFIG multigraph $plugin] Service is now $service"; $correct++; } elsif ($line =~ m{\A ([^\s\.]+) \s+ (.+?) \s* $}xms) { $correct++; my $label = $self->_sanitise_fieldname($1); # add to config if not already here push @{$global_config->{$service}}, [$label, $2] unless grep { $_->[0] eq $label } @{$global_config->{$service}}; DEBUG "[CONFIG graph global $plugin] $service->$label = $2" if $debug; } elsif ($line =~ m{\A ([^\.]+)\.value \s+ (.+?) \s* $}xms) { $correct++; # Special case for dirtyconfig my ($ds_name, $value, $when) = ($1, $2, $now); $ds_name = $self->_sanitise_fieldname($ds_name); if ($value =~ /^(\d+):(.+)$/) { $when = $1; $value = $2; } DEBUG "[CONFIG dirtyconfig $plugin] Storing $value from $when in $ds_name"; # Creating the datastructure if not created already $data_source_config->{$service}{$ds_name} ||= {}; $data_source_config->{$service}{$ds_name}{when} ||= []; $data_source_config->{$service}{$ds_name}{value} ||= []; # Saving the timed value in the datastructure push @{$data_source_config->{$service}{$ds_name}{when}}, $when; push @{$data_source_config->{$service}{$ds_name}{value}}, $value; } elsif ($line =~ m{\A ([^\.]+)\.([^\s]+) \s+ (.+?) \s* $}xms) { $correct++; my ($ds_name, $ds_var, $ds_val) = ($1, $2, $3); $ds_name = $self->_sanitise_fieldname($ds_name); $data_source_config->{$service}{$ds_name} ||= {}; $data_source_config->{$service}{$ds_name}{$ds_var} = $ds_val; DEBUG "[CONFIG dataseries $plugin] $service->$ds_name.$ds_var = $ds_val" if $debug; push ( @graph_order, $ds_name ) if $ds_var eq 'label'; } else { $errors++; DEBUG "[DEBUG] Protocol exception: unrecognized line '$line' from $plugin on $nodedesignation.\n"; } } if ($errors) { WARN "[WARNING] $errors lines had errors while $correct lines were correct in data from 'config $plugin' on $nodedesignation"; } $self->_validate_data_sources($data_source_config); push_graphorder($service); return (global => $global_config, data_source => $data_source_config); } sub fetch_service_config { my ($self, $service) = @_; my $t0 = [gettimeofday]; DEBUG "[DEBUG] Fetching service configuration for '$service'"; $self->_node_write_single("config $service\n"); # The whole config in one fell swoop. my $lines = $self->_node_read(); my $elapsed = tv_interval($t0); my $nodedesignation = $self->{host}."/".$self->{address}."/".$self->{port}; DEBUG "[DEBUG] config: $elapsed sec for '$service' on $nodedesignation"; $service = $self->_sanitise_plugin_name($service); return $self->parse_service_config($service, $lines); } sub spoolfetch { my ($self, $timestamp) = @_; DEBUG "[DEBUG] Fetching spooled services since $timestamp (" . localtime($timestamp) . ")"; $self->_node_write_single("spoolfetch $timestamp\n"); # The whole stuff in one fell swoop. my $lines = $self->_node_read(); # using the multigraph parsing. # Using "__root__" as a special plugin name. return $self->parse_service_config("__root__", $lines); } sub _validate_data_sources { my ($self, $all_data_source_config) = @_; my $nodedesignation = $self->{host}."/".$self->{address}.":".$self->{port}; for my $service (keys %$all_data_source_config) { my $data_source_config = $all_data_source_config->{$service}; for my $ds (keys %$data_source_config) { if (!defined $data_source_config->{$ds}{label}) { ERROR "Missing required attribute 'label' for data source '$ds' in service $service on $nodedesignation"; $data_source_config->{$ds}{label} = 'No .label provided'; $data_source_config->{$ds}{extinfo} = "NOTE: The plugin did not provide any label for the data source $ds. It is in need of fixing."; } } } } sub parse_service_data { my ($self, $service, $lines) = @_; my $plugin = $service; my $errors = 0; my $correct = 0; my $nodedesignation = $self->{host}."/".$self->{address}.":".$self->{port}; my %values = ( $service => {}, ); DEBUG "[DEBUG] Now parsing fetch output from plugin $plugin on ". $nodedesignation; # every 'N' has the same value. Should not take parsing time into the equation my $now = time; for my $line (@$lines) { DEBUG "[FETCH from $plugin] $line"; if ($line =~ /\# timeout/) { die "[WARNING] Timeout in fetch from '$plugin' on ". $nodedesignation; } next unless $line; next if $line =~ /^\#/; if ($line =~ m{\A multigraph \s+ (.+) }xms) { $service = $1; if ($service =~ /(^\.|\.$|\.\.)/) { ERROR "[ERROR] SERVICE \"$service\" contains dots in wrong places in plugin $plugin on ".$self->{host}."/".$self->{address}."/".$self->{port}; $errors++; last; } if ($service !~ m/^[-\w.:.]+$/) { ERROR "[ERROR] SERVICE \"$service\" contains weird characters in plugin $plugin on ".$self->{host}."/".$self->{address}."/".$self->{port}; $errors++; last; } $values{$service} = {}; if ($service eq 'multigraph') { $errors++; ERROR "[ERROR] SERVICE can't be named \"$service\" in plugin $plugin on ". $nodedesignation; last; } $correct++; } elsif ($line =~ m{\A ([^\.]+)\.value \s+ ([\S:]+) }xms) { my ($data_source, $value, $when) = ($1, $2, $now); $correct++; $data_source = $self->_sanitise_fieldname($data_source); DEBUG "[FETCH from $plugin] Storing $value in $data_source"; if ($value =~ /^(\d+):(.+)$/) { $when = $1; $value = $2; } $values{$service}{$data_source} ||= { when => [], value => [], }; push @{$values{$service}{$data_source}{when}}, $when; push @{$values{$service}{$data_source}{value}}, $value; } elsif ($line =~ m{\A ([^\.]+)\.extinfo \s+ (.+?) \s* $}xms) { # Extinfo is used in munin-limits my ($data_source, $value) = ($1, $2); $correct++; $data_source = $self->_sanitise_fieldname($data_source); $values{$service}{$data_source} ||= {}; $values{$service}{$data_source}{extinfo} = $value; } else { $errors++; DEBUG "[DEBUG] Protocol exception while fetching '$service' from $plugin on $nodedesignation: unrecognized line '$line'"; next; } } if ($errors) { my $percent = ($errors / ($errors + $correct)) * 100; $percent = sprintf("%.2f", $percent); WARN "[WARNING] $errors lines had errors while $correct lines were correct ($percent%) in data from 'fetch $plugin' on $nodedesignation"; } return %values; } sub fetch_service_data { my ($self, $plugin) = @_; my $t0 = [gettimeofday]; $self->_node_write_single("fetch $plugin\n"); my $lines = $self->_node_read_fast(); my $elapsed = tv_interval($t0); my $nodedesignation = $self->{host}."/".$self->{address}."/".$self->{port}; DEBUG "[DEBUG] data: $elapsed sec for '$plugin' on $nodedesignation"; $plugin = $self->_sanitise_plugin_name($plugin); return $self->parse_service_data($plugin, $lines); } sub quit { my ($self) = @_; my $t0 = [gettimeofday]; $self->_node_write_single("quit \n"); my $elapsed = tv_interval($t0); my $nodedesignation = $self->{host}."/".$self->{address}."/".$self->{port}; DEBUG "[DEBUG] quit: $elapsed sec on $nodedesignation"; return 1; } sub _sanitise_plugin_name { my ($self, $name) = @_; $name =~ s/[^_A-Za-z0-9]/_/g; return $name; } sub _sanitise_fieldname { # http://munin-monitoring.org/wiki/notes_on_datasource_names my ($self, $name) = @_; $name =~ s/^[^A-Za-z_]/_/; $name =~ s/[^A-Za-z0-9_]/_/g; return $name; } sub _node_write_single { my ($self, $text) = @_; DEBUG "[DEBUG] Writing to socket: \"$text\"."; my $timed_out = !do_with_timeout($self->{io_timeout}, sub { if ($self->{tls} && $self->{tls}->session_started()) { $self->{tls}->write($text) or exit 9; } else { print { $self->{writer} } $text; } return 1; }); if ($timed_out) { LOGCROAK "[FATAL] Socket write timed out to ".$self->{host}. ". Terminating process."; } return 1; } sub _node_read_single { my ($self) = @_; my $res = undef; my $timed_out = !do_with_timeout($self->{io_timeout}, sub { if ($self->{tls} && $self->{tls}->session_started()) { $res = $self->{tls}->read(); } else { $res = readline $self->{reader}; } # Remove \r *and* \n. Normally only one, since we read line per line. $res =~ tr/\x{d}\x{a}//d if defined $res; return 1; }); if ($timed_out) { LOGCROAK "[FATAL] Socket read timed out to ".$self->{host}. ". Terminating process."; } if (!defined($res)) { # Probable socket not open. Why are we here again then? # aren't we supposed to be in "do in session"? LOGCROAK "[FATAL] Socket read from ".$self->{host}." failed. Terminating process."; } DEBUG "[DEBUG] Reading from socket to ".$self->{host}.": \"$res\"." if $debug; return $res; } sub _node_read_fast { my ($self) = @_; # We cannot bypass the IO if using TLS # so just reverting to normal mode. return _node_read(@_) if $self->{tls}; # Disable Buffering here, to be able to use sysread() local $| = 1; my $io_src = $self->{reader}; my $buf; my $offset = 0; while (my $read_len = sysread($io_src, $buf, 4096, $offset)) { $offset += $read_len; # Stop when we read a \n.\n # ... No need to have a full regex : simple index() my $start_offset = $offset - $read_len - 3; $start_offset = 0 if $start_offset < 0; last if index($buf, "\n.\n", $start_offset) >= 0; # if empty, the client only sends a plain ".\n" last if $buf eq ".\n"; } # Remove the last line that only contains ".\n" $buf =~ s/\.\n$//; return [ split(/\n/, $buf) ]; } sub _node_read { my ($self) = @_; my @array = (); my $line = $self->_node_read_single(); while($line ne ".") { push @array, $line; $line = $self->_node_read_single(); } DEBUG "[DEBUG] Reading from socket: \"".(join ("\\n",@array))."\"."; return \@array; } # Defines the URL::scheme for munin package URI::munin; # We are like a generic server require URI::_server; @URI::munin::ISA=qw(URI::_server); # munin://HOST[:PORT] sub default_port { return 4949; } 1; __END__ =head1 NAME Munin::Master::Node - Provides easy access to the munin node =head1 SYNOPSIS use Munin::Master::Node; my $node = Munin::Master::Node->new('localhost', '4949', 'foo'); $node->do_in_session(sub{ ... # Call misc. methods on $node }); =head1 METHODS =over =item B FIX =item B FIX =item B FIX =item B FIX =item B FIX =item B FIX =back munin-2.0.25/master/lib/Munin/Master/ProcessManager.pm000066400000000000000000000167111243472346000225720ustar00rootroot00000000000000package Munin::Master::ProcessManager; # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); use IO::Socket; use POSIX qw(:sys_wait_h); use Storable qw(nstore_fd fd_retrieve); use Time::HiRes; use Munin::Common::Timeout; use Munin::Master::Config; use Munin::Master::Logger; use Log::Log4perl qw( :easy ); my $E_DIED = 18; my $E_TIMED_OUT = 19; my $E_CONNECT = 20; my $config = Munin::Master::Config->instance()->{config}; sub new { my ($class, $result_callback, $error_callback) = @_; croak "Argument exception: result_callback" unless ref $result_callback eq 'CODE'; $error_callback ||= sub { warn "Worker failed: @_" }; my $self = { max_concurrent => $config->{max_processes}, socket_file => "$config->{rundir}/munin-master-processmanager-$$.sock", result_callback => $result_callback, error_callback => $error_callback, worker_timeout => 180, timeout => 240, accept_timeout => 10, active_workers => {}, result_queue => {}, pid2worker => {}, }; return bless $self, $class; } sub add_workers { my ($self, @workers) = @_; for my $worker (@workers) { croak "Argument exception: \@workers" unless $worker->isa('Munin::Master::Worker'); } $self->{workers} = \@workers; } sub start_work { my ($self) = @_; DEBUG "[DEBUG] Starting work"; my $sock = $self->_prepare_unix_socket(); $self->_start_waiting_workers(); do_with_timeout($self->{timeout}, sub { $self->_collect_results($sock); return 1; }) or croak "Work timed out before all workers finished"; $self->{workers} = []; DEBUG "[DEBUG] Work done"; $self->_free_socket($sock); } sub _prepare_unix_socket { my ($self) = @_; if ( -e $self->{socket_file} ) { unlink $self->{socket_file} or croak "unlink failed: $!"; } socket my $sock, PF_UNIX, SOCK_STREAM, 0 or croak "socket failed: $!"; bind $sock, sockaddr_un($self->{socket_file}) or croak "bind failed: $!"; chmod oct(700), $self->{socket_file} or croak "chmod failed: $!"; listen $sock, SOMAXCONN or croak "listen failed: $!"; return $sock; } sub _start_waiting_workers { my ($self) = @_; while (@{$self->{workers}}) { DEBUG "[DEBUG] Active workers: " . (scalar keys %{$self->{active_workers}}) . "/" . $self->{max_concurrent}; last if scalar keys %{$self->{active_workers}} == $self->{max_concurrent}; # Here we just start'em, check results in _collect_results $self->_start_next_worker(); } continue { # Sleep for a random time, to avoid too much process creation all at once sleep ( rand ($config->{worker_start_delay}) ) if $config->{worker_start_delay}; } } sub _start_next_worker { my ($self) = @_; my $worker = pop @{$self->{workers}}; my $pid = fork; if (!defined $pid) { LOGCROAK "Forking worker failed: $!"; } elsif ($pid) { $self->{active_workers}{$pid} = $worker; $self->{result_queue}{$worker->{ID}} = $worker; } else { $0 .= " [$worker]"; my $res = $self->_do_work($worker); DEBUG "[DEBUG] Exit status $res for worker $worker"; exit $res; } } sub _collect_results { my ($self, $sock) = @_; while (%{$self->{result_queue}} || @{$self->{workers}}) { do { $self->_vet_finished_workers(); $self->_start_waiting_workers(); } while (!%{$self->{result_queue}} && @{$self->{workers}}); my $worker_sock; DEBUG "[DEBUG] Active workers: " . (scalar keys %{$self->{active_workers}}) . "/" . $self->{max_concurrent}; if (not %{$self->{active_workers}}) { # Nothing left do do last; } my $timed_out = !do_with_timeout($self->{accept_timeout}, sub { accept $worker_sock, $sock; return 1; }); if ($timed_out) { if (defined($self->{host})) { my $nodedesignation = $self->{host}."/". $self->{host}{address}.":".$self->{host}{port}; WARN "[WARNING] Calling accept to collect results from " . $nodedesignation . " failed. This could be due to network problems/firewalled munin-node. Remaining workers: " . join(", ", keys %{$self->{result_queue}}); } else { INFO "[INFO] Remaining workers: " . join(", ", keys %{$self->{result_queue}}); } next; } # if timed_out next unless fileno $worker_sock; my $res = fd_retrieve($worker_sock); my ($worker_id, $real_res) = @$res; delete $self->{result_queue}{$worker_id}; $self->{result_callback}($res) if defined $real_res; } while (%{$self->{active_workers}}) { $self->_vet_finished_workers(); } } sub _free_socket { my ($self, $sock) = @_; unlink $self->{socket_file} or $! ne 'No such file or directory' && croak "unlink failed: $!"; close $sock or croak "socket close failed: $!"; } sub _vet_finished_workers { my ($self) = @_; while ((my $worker_pid = waitpid(-1, WNOHANG)) > 0) { if ($CHILD_ERROR) { DEBUG "[DEBUG] Got error from $worker_pid: $CHILD_ERROR. Handling error"; $self->_handle_worker_error($worker_pid); } my $child_exit = $CHILD_ERROR >> 8; my $child_signal = $CHILD_ERROR & 127; INFO "[INFO] Reaping $self->{active_workers}{$worker_pid}. Exit value/signal: $child_exit/$child_signal"; delete $self->{active_workers}{$worker_pid}; } } sub _handle_worker_error { my ($self, $worker_pid) = @_; my %code2msg = ( $E_TIMED_OUT => 'Timed out', $E_DIED => 'Died', $E_CONNECT => 'Connection failed', ); my $worker_id = $self->{active_workers}{$worker_pid}{ID}; my $exit_code = $CHILD_ERROR >> 8; $self->{error_callback}($self->{active_workers}{$worker_pid}, $code2msg{$exit_code} || $exit_code); } sub _do_work { my ($self, $worker) = @_; DEBUG "[DEBUG] Starting $worker"; my $retval = 0; my $res; eval { my $timed_out = !do_with_timeout($self->{worker_timeout}, sub { $res = $worker->do_work(); return 1; }); if ($timed_out) { ERROR "[ERROR] $worker timed out"; $res = undef; $retval = $E_TIMED_OUT; } elsif (!defined($res)) { ERROR "[ERROR] $worker failed to connect to node"; $retval = $E_CONNECT; } }; if ($EVAL_ERROR) { ERROR "[ERROR] $worker died with '$EVAL_ERROR'"; $res = undef; $retval = $E_DIED; } # Stop trying if we already erred. return $retval if $retval; my $sock; unless (socket $sock, PF_UNIX, SOCK_STREAM, 0) { ERROR "[ERROR] Unable to create socket: $!"; return $E_DIED; } unless (connect $sock, sockaddr_un($self->{socket_file})) { ERROR "[ERROR] Unable to connect to socket: $!"; return $E_DIED; } nstore_fd([ $worker->{ID}, $res], $sock); close $sock; return $retval; } 1; __END__ =head1 NAME Munin::Master::ProcessManager - Manager for parallel execution of Workers. =head1 SYNOPSIS use Munin::Master::ProcessManager; my $pm = Munin::Master::ProcessManager->new(sub { my ($res) = @_; # Do something with $res ... }); $pm->add_workers(...); $pm->start_work(); =head1 DESCRIPTION FIX =head1 METHODS =over =item B FIX =item B FIX =item B FIX =back munin-2.0.25/master/lib/Munin/Master/Update.pm000066400000000000000000000262431243472346000211040ustar00rootroot00000000000000package Munin::Master::Update; # $Id$ use warnings; use strict; use English qw(-no_match_vars); use Carp; use Time::HiRes; use Log::Log4perl qw( :easy ); use Munin::Common::Defaults; use Munin::Master::Config; use Munin::Master::Logger; use Munin::Master::UpdateWorker; use Munin::Master::ProcessManager; use Munin::Master::Utils; my $config = Munin::Master::Config->instance()->{config}; sub new { my ($class) = @_; # This steals the groups from the master instance of the config. my $gah = $config->get_groups_and_hosts(); my $self = bless { STATS => undef, old_service_configs => {}, old_version => undef, service_configs => {}, workers => [], failed_workers => [], group_repository => Munin::Master::GroupRepository->new($gah), config_dump_file => "$config->{dbdir}/datafile", }, $class; } sub run { my ($self) = @_; $self->_create_rundir_if_missing(); $self->_do_with_lock_and_timing(sub { INFO "[INFO]: Starting munin-update"; $self->{old_service_configs} = $self->_read_old_service_configs(); $self->{workers} = $self->_create_workers(); $self->_run_workers(); # I wonder if the following should really be done with timing. - janl $self->_write_new_service_configs_locked(); }); } sub _read_old_service_configs { # Read the datafile containing old configurations. This should # not fail in case of problems with the file. In such a case the # file should simply be ingored and a new one written. Lets hope # it does not repeat itself then. my ($self) = @_; # Get old service configuration from the config instance since the # syntaxes are identical. my $oldconfig = Munin::Master::Config->instance()->{oldconfig}; my $datafile = $oldconfig->{config_file} = $config->{dbdir}.'/datafile'; my $file; if (-e $datafile ) { if (! open( $file, '<', $datafile)) { WARN "[Warning] Cannot open datafile $datafile"; return {}; } eval { $oldconfig->parse_config($file); }; if ($EVAL_ERROR) { WARN "[Warning] Could not parse datafile $datafile: $EVAL_ERROR"; } } return $oldconfig; } sub _create_rundir_if_missing { my ($self) = @_; unless (-d $config->{rundir}) { mkdir $config->{rundir}, oct(700) or croak "Failed to create rundir (".$config->{rundir}."): $!"; } } sub _create_workers { my ($self) = @_; # FIX log skipped and queued workers: # logger("Skipping '$name' (update disabled by config)"); # logger("Queuing '$name' for update."); my @hosts = $self->{group_repository}->get_all_hosts(); if (%{$config->{limit_hosts}}) { @hosts = grep { $config->{limit_hosts}{$_->{host_name}} } @hosts } @hosts = grep { $_->{update} } @hosts; return [ map { Munin::Master::UpdateWorker->new($_) } @hosts ]; } sub _do_with_lock_and_timing { my ($self, $block) = @_; my $lock = "$config->{rundir}/munin-update.lock"; munin_runlock($lock); my $update_time = Time::HiRes::time; if (!open ($self->{STATS}, '>', "$config->{dbdir}/munin-update.stats.tmp")) { WARN "[WARNING] Could not open STATS to $config->{dbdir}/munin-update.stats.tmp: $!"; # Use /dev/null instead - if the admin won't fix he won't care open($self->{STATS}, '>', "/dev/null") or LOGCROAK "[FATAL] Could not open STATS to /dev/null (fallback for not being able to open $config->{dbdir}/munin-update.stats.tmp): $!"; } # Place global munin-update timeout here. my $retval = $block->(); $update_time = sprintf("%.2f", (Time::HiRes::time - $update_time)); print { $self->{STATS} } "UT|$update_time\n"; close ($self->{STATS}); $self->{STATS} = undef; rename ("$config->{dbdir}/munin-update.stats.tmp", "$config->{dbdir}/munin-update.stats"); INFO "[INFO]: Munin-update finished ($update_time sec)"; munin_removelock($lock); return $retval; } sub _run_workers { my ($self) = @_; if ($config->{fork}) { my $pm = Munin::Master::ProcessManager ->new($self->_create_self_aware_worker_result_handler(), $self->_create_self_aware_worker_exception_handler()); $pm->add_workers(@{$self->{workers}}); $pm->start_work(); } else { for my $worker (@{$self->{workers}}) { my $res ; eval { # do_work fails hard on a number of conditions $res = $worker->do_work(); }; $res=undef if $EVAL_ERROR; my $worker_id = $worker->{ID}; if (defined($res)) { $self->_handle_worker_result([$worker_id, $res]); } else { # Need to handle connection failure same as other # failures. do_connect fails softly. WARN "[WARNING] Failed worker ".$worker_id."\n"; push @{$self->{failed_workers}}, $worker_id; } } } } sub _create_self_aware_worker_result_handler { my ($self) = @_; return sub { $self->_handle_worker_result(@_); }; } sub _handle_worker_result { my ($self, $res) = @_; if (!defined($res)) { # no result? problem LOGCROAK("[FATAL] Handle_worker_result got handed a failed worker result"); } my ($worker_id, $time_used, $service_configs) = ($res->[0], $res->[1]{time_used}, $res->[1]{service_configs}); my $update_time = sprintf("%.2f", $time_used); INFO "[INFO]: Munin-update finished for node $worker_id ($update_time sec)"; if (! defined $self->{STATS} ) { # This is may only be the case when we get connection refused ERROR "[BUG!] Did not collect any stats for $worker_id. If this message appears in your logs a lot please email munin-users. Thanks."; } else { printf { $self->{STATS} } "UD|%s|%.2f\n", $worker_id, $time_used; } $self->{service_configs}{$worker_id} = $service_configs; } sub _create_self_aware_worker_exception_handler { my ($self) = @_; return sub { my ($worker, $reason) = @_; my $worker_id = $worker->{ID}; DEBUG "[DEBUG] In exception handler for failed worker $worker_id"; push @{$self->{failed_workers}}, $worker_id; }; } # FIX merge with UpdateWorker::_get_rrd_file_name # FIX seems like dead code? Or only used in ensure_? sub _get_rrd_file_name { my ($self, $host, $service, $ds_name, $ds_type) = @_; my $type_id = lc(substr(($ds_type), 0, 1)); my ($g, $h) = split /;/, $host; # // ... perl mode my $file = sprintf("%s-%s-%s-%s.rrd", $h, $service, $ds_name, $type_id); # Not really a danger (we're not doing this stuff via the shell), # so more to avoid confusion with silly filenames. ($g, $file) = map { my $p = $_; $p =~ tr/\//_/; $p =~ s/^\./_/g; $p; } ($g, $file); my $rrd_file = File::Spec->catfile($config->{dbdir}, $g, $file); croak "RRD file '$rrd_file' not found" unless -e $rrd_file; return $rrd_file; } sub _write_new_service_configs_locked { my ($self) = @_; my $lock_file = "$config->{rundir}/munin-datafile.lock"; munin_runlock($lock_file); my $config_dump_file = $self->{config_dump_file}; my $config_dump_file_tmp = "$config_dump_file.$$"; open my $dump, '>', $config_dump_file_tmp or croak "Fatal error: Could not open '$config_dump_file_tmp' for writing: $!"; $self->_write_new_service_configs($dump); close $dump or croak "Fatal error: Could not close '$config_dump_file_tmp': $!"; rename $config_dump_file_tmp, $config_dump_file or croak "Fatal error: Could not rename '$config_dump_file_tmp' to '$config_dump_file': $!"; munin_removelock($lock_file); } sub _write_new_service_configs { my ($self, $io) = @_; my $datafile_hash = {}; print $io "version $Munin::Common::Defaults::MUNIN_VERSION\n"; $datafile_hash->{version} = $Munin::Common::Defaults::MUNIN_VERSION; $self->_print_service_configs_for_not_updated_services($io, $datafile_hash); $self->_print_old_service_configs_for_failed_workers($io, $datafile_hash); for my $host (keys %{$self->{service_configs}}) { for my $service (keys %{$self->{service_configs}{$host}{data_source}}) { for my $attr (@{$self->{service_configs}{$host}{global}{$service}}) { print $io "$host:$service.$attr->[0] $attr->[1]\n"; munin_set_var_path($datafile_hash, "$host:$service.$attr->[0]", $attr->[1]); } for my $data_source (keys %{$self->{service_configs}{$host}{data_source}{$service}}) { for my $attr (keys %{$self->{service_configs}{$host}{data_source}{$service}{$data_source}}) { print $io "$host:$service.$data_source.$attr $self->{service_configs}{$host}{data_source}{$service}{$data_source}{$attr}\n"; munin_set_var_path($datafile_hash, "$host:$service.$data_source.$attr", $self->{service_configs}{$host}{data_source}{$service}{$data_source}{$attr}); } } } } # Also write the binary (Storable) version munin_writeconfig_storable($config->{dbdir}.'/datafile.storable', $datafile_hash); } sub _print_service_configs_for_not_updated_services { my ($self, $handle, $datafile_hash) = @_; my @hosts = $self->{group_repository}->get_all_hosts(); for my $workerdata (@hosts) { my $worker = $workerdata->get_full_path(); my @data = grep { /\.update$/ and !$workerdata->{$_} } keys %$workerdata; for my $match (@data) { my $prefix = substr $match, 0, -6; for my $datum (grep { /^\Q$prefix\E/ } keys %$workerdata) { printf $handle "%s:%s %s\n", $worker, $datum, $workerdata->{$datum}; munin_set_var_path($datafile_hash, $worker . ":". $datum, $workerdata->{$datum}); } } } } sub _print_old_service_configs_for_failed_workers { my ($self, $handle, $datafile_hash) = @_; for my $worker (@{$self->{failed_workers}}) { # The empty set contains "undef" it seems next if !defined($worker); my $workerdata = $self->{old_service_configs}->look_up($worker); # No data available on the failed worker if (!defined($workerdata)) { INFO "[INFO] No old data available for failed worker $worker. This node will disappear from the html web page hierarchy\n"; next; } for my $datum (keys %$workerdata) { # Skip some book-keeping next if ($datum eq 'group') or ($datum eq 'host_name'); if (defined $workerdata->{$datum}) { printf $handle "%s:%s %s\n", $worker, $datum, $workerdata->{$datum}; munin_set_var_path($datafile_hash, $worker . ":". $datum, $workerdata->{$datum}); } else { WARN "[Warning] no data $worker -> $datum"; } } } } 1; __END__ =head1 NAME Munin::Master::Update - Contacts Munin Nodes, gathers data from their service data sources, and stores this information in RRD files. =head1 SYNOPSIS my $update = Munin::Master::Update->new(); $update->run(); =head1 METHODS =over =item B my $update = Munin::Master::Update->new(); Constructor. =item B $update->run(); This is where all the work gets done. =back munin-2.0.25/master/lib/Munin/Master/UpdateWorker.pm000066400000000000000000000736761243472346000223120ustar00rootroot00000000000000package Munin::Master::UpdateWorker; use base qw(Munin::Master::Worker); # $Id$ use warnings; use strict; use Carp; use English qw(-no_match_vars); use Log::Log4perl qw( :easy ); use File::Basename; use File::Path; use File::Spec; use Munin::Master::Config; use Munin::Master::Node; use Munin::Master::Utils; use RRDs; use Time::HiRes; use Data::Dumper; use Scalar::Util qw(weaken); use List::Util qw(max); my $config = Munin::Master::Config->instance()->{config}; # Flags that have RRD autotuning enabled. my $rrd_tune_flags = { type => '--data-source-type', max => '--maximum', min => '--minimum', }; sub new { my ($class, $host, $worker) = @_; my $self = $class->SUPER::new($host->get_full_path); $self->{host} = $host; $self->{node} = Munin::Master::Node->new($host->{address}, $host->{port}, $host->{host_name}, $host); $self->{state} = {}; $self->{worker} = $worker; weaken($self->{worker}); return $self; } sub do_work { my ($self) = @_; my $update_time = Time::HiRes::time; my $host = $self->{host}{host_name}; my $path = $self->{host}->get_full_path; $path =~ s{[:;]}{-}g; my $nodedesignation = $host."/". $self->{host}{address}.":".$self->{host}{port}; my $lock_file = sprintf ('%s/munin-%s.lock', $config->{rundir}, $path); if (!munin_getlock($lock_file)) { WARN "Could not get lock $lock_file for $nodedesignation. Skipping node."; die "Could not get lock $lock_file for $nodedesignation. Skipping node.\n"; } # Reading the state file, no need to lock it, since it's per node and we # already have a lock on this. my $state_file = sprintf ('%s/state-%s.storable', $config->{dbdir}, $path); DEBUG "[DEBUG] Reading state for $path in $state_file"; $self->{state} = munin_read_storable($state_file) || {}; my %all_service_configs = ( data_source => {}, global => {}, ); INFO "[INFO] starting work in $$ for $nodedesignation.\n"; my $done = $self->{node}->do_in_session(sub { eval { # A I/O timeout results in a violent exit. Catch and handle. my @node_capabilities = $self->{node}->negotiate_capabilities(); # Handle spoolfetch, one call to retrieve everything my %whole_config; my @plugins; if (grep /^spool$/, @node_capabilities) { my $spoolfetch_last_timestamp = $self->get_spoolfetch_timestamp(); local $0 = "$0 -- spoolfetch($spoolfetch_last_timestamp)"; %whole_config = $self->uw_spoolfetch($spoolfetch_last_timestamp); # XXX - Commented out, should be protect by a "if logger.isDebugEnabled()" # since it is quite expensive #DEBUG "[DEBUG] whole_config:" . Dumper(\%whole_config); # spoolfetching reported no data, skipping it. if (! $whole_config{global}{multigraph}[1]) { INFO "[INFO] $nodedesignation didn't send any data for spoolfetch. Ignoring it."; # adding ourself to failed_workers, so we use push @{ $self->{worker}->{failed_workers} }, $self->{ID}; die "NO_SPOOLFETCH_DATA"; } # Gets the plugins from spoolfetch # Only keep the first one, the others will be multigraph-fetched @plugins = ( $whole_config{global}{multigraph}[0] ) ; } # Note: A multigraph plugin can present multiple services. @plugins = $self->{node}->list_plugins() unless @plugins; for my $plugin (@plugins) { if (%{$config->{limit_services}}) { next unless $config->{limit_services}{$plugin}; } DEBUG "[DEBUG] for my $plugin (@plugins)"; # Ask for config only if spoolfetch didn't already send it my %service_config = %whole_config; unless (%service_config) { local $0 = "$0 -- config($plugin)"; %service_config = $self->uw_fetch_service_config($plugin); } unless (%service_config) { WARN "[WARNING] Service $plugin on $nodedesignation ". "returned no config"; next; } # Check if this plugin has already sent its data via a dirtyconfig # Note that spoolfetch also uses dirtyconfig my %service_data = $self->handle_dirty_config(\%service_config); # default is 0 sec : always update when asked my $update_rate = get_global_service_value(\%service_config, $plugin, "update_rate", 0); my ($update_rate_in_seconds, $is_update_aligned) = parse_update_rate($update_rate); DEBUG "[DEBUG] update_rate $update_rate_in_seconds for $plugin on $nodedesignation"; if (! %service_data) { # Check if this plugin has to be updated if ($update_rate_in_seconds && $self->is_fresh_enough($nodedesignation, $plugin, $update_rate_in_seconds)) { # It's fresh enough, skip this $service DEBUG "[DEBUG] $plugin is fresh enough, not updating it"; next; } # __root__ is only a placeholder plugin for # an empty spoolfetch so we should ignore it # if asked to fetch it. # But we should still do everything after than. if ($plugin ne "__root__") { DEBUG "[DEBUG] No service data for $plugin, fetching it"; local $0 = "$0 -- fetch($plugin)"; %service_data = $self->{node}->fetch_service_data($plugin); } } # If update_rate is aligned, round the "when" for alignement if ($is_update_aligned) { foreach my $service (keys %service_data) { my $current_service_data = $service_data{$service}; foreach my $field (keys %$current_service_data) { my $whens = $current_service_data->{$field}->{when}; for (my $i = 0; $i < scalar @$whens; $i ++) { my $when = $whens->[$i]; my $rounded_when = round_to_granularity($when, $update_rate_in_seconds); $whens->[$i] = $rounded_when; } } } } # Since different plugins can populate multiple # positions in the service namespace we'll check for # collisions and warn of them. for my $service (keys %{$service_config{data_source}}) { if (defined($all_service_configs{data_source}{$service})) { WARN "[WARNING] Service collision: plugin $plugin on " ."$nodedesignation reports $service which already " ."exists on that host. Deleting new data."; delete($service_config{data_source}{$service}); delete($service_data{$service}) if defined $service_data{$service}; } } # .extinfo fields come from "fetch" but must be saved # like "config". for my $service (keys %service_data) { for my $ds (keys %{$service_data{$service}}) { my $extinfo = $service_data{$service}{$ds}{extinfo}; if (defined $extinfo) { $service_config{data_source}{$service}{$ds}{extinfo} = $extinfo; DEBUG "[DEBUG] Copied extinfo $extinfo into " ."service_config for $service / $ds on " .$nodedesignation; } } } $self->_compare_and_act_on_config_changes(\%service_config); %{$all_service_configs{data_source}} = ( %{$all_service_configs{data_source}}, %{$service_config{data_source}}); %{$all_service_configs{global}} = ( %{$all_service_configs{global}}, %{$service_config{global}}); my $last_updated_timestamp = $self->_update_rrd_files(\%service_config, \%service_data); $self->set_spoolfetch_timestamp($last_updated_timestamp); } # for @plugins # Send "quit" to node $self->{node}->quit(); }; # eval # kill the remaining process if needed if ($self->{node}->{pid} && kill(0, $self->{node}->{pid})) { INFO "[INFO] Killing subprocess $self->{node}->{pid}"; kill 'TERM', $self->{node}->{pid}; } if ($EVAL_ERROR =~ m/^NO_SPOOLFETCH_DATA /) { INFO "[INFO] No spoofetch data for $nodedesignation"; return; } elsif ($EVAL_ERROR) { ERROR "[ERROR] Error in node communication with $nodedesignation: " .$EVAL_ERROR; return; } # Everything went smoothly. DEBUG "[DEBUG] Everything went smoothly."; return 1; }); # do_in_session munin_removelock($lock_file); # Update the state file DEBUG "[DEBUG] Writing state for $path in $state_file"; munin_write_storable($state_file, $self->{state}); # This handles failure in do_in_session, return undef if ! $done || ! $done->{exit_value}; return { time_used => Time::HiRes::time - $update_time, service_configs => \%all_service_configs, } } sub get_global_service_value { my ($service_config, $service, $conf_field_name, $default) = @_; foreach my $array (@{$service_config->{global}{$service}}) { my ($field_name, $field_value) = @$array; if ($field_name eq $conf_field_name) { return $field_value; } } return $default; } sub is_fresh_enough { my ($self, $nodedesignation, $service, $update_rate_in_seconds) = @_; DEBUG "is_fresh_enough asked for $service with a rate of $update_rate_in_seconds"; my $last_updated = $self->{state}{last_updated}{$service} || "0 0"; DEBUG "last_updated{$service}: " . $last_updated; my @last = split(/ /, $last_updated); use Time::HiRes qw(gettimeofday tv_interval); my $now = [ gettimeofday ]; my $age = tv_interval(\@last, $now); DEBUG "last: [" . join(",", @last) . "], now: [" . join(", ", @$now) . "], age: $age"; my $is_fresh_enough = ($age < $update_rate_in_seconds) ? 1 : 0; DEBUG "is_fresh_enough $is_fresh_enough"; if (! $is_fresh_enough) { DEBUG "new value: " . join(" ", @$now); $self->{state}{last_updated}{$service} = join(" ", @$now); } return $is_fresh_enough; } sub get_spoolfetch_timestamp { my ($self) = @_; my $last_updated_value = $self->{state}{spoolfetch} || "0"; return $last_updated_value; } sub set_spoolfetch_timestamp { my ($self, $timestamp) = @_; DEBUG "[DEBUG] set_spoolfetch_timestamp($timestamp)"; # Using the last timestamp sended by the server : # -> It can be be different than "now" to be able to process the backlock slowly $self->{state}{spoolfetch} = $timestamp; } sub parse_update_rate { my ($update_rate_config) = @_; my ($is_update_aligned, $update_rate_in_sec); if ($update_rate_config =~ m/(\d+[a-z]?)( aligned)?/) { $update_rate_in_sec = to_sec($1); $is_update_aligned = $2; } else { return (0, 0); } return ($update_rate_in_sec, $is_update_aligned); } sub round_to_granularity { my ($when, $granularity_in_sec) = @_; $when = time if ($when eq "N"); # N means "now" my $rounded_when = $when - ($when % $granularity_in_sec); return $rounded_when; } sub handle_dirty_config { my ($self, $service_config) = @_; my %service_data; my $services = $service_config->{global}{multigraph}; foreach my $service (@$services) { my $service_data_source = $service_config->{data_source}->{$service}; foreach my $field (keys %$service_data_source) { my $field_value = $service_data_source->{$field}->{value}; my $field_when = $service_data_source->{$field}->{when}; # If value not present, this field is not dirty fetched next if (! defined $field_value); DEBUG "[DEBUG] handle_dirty_config:$service, $field, @$field_when"; # Moves the "value" to the service_data $service_data{$service}->{$field} ||= { when => [], value => [], }; push @{$service_data{$service}{$field}{value}}, @$field_value; push @{$service_data{$service}{$field}{when}}, @$field_when; delete($service_data_source->{$field}{value}); delete($service_data_source->{$field}{when}); } } return %service_data; } sub uw_spoolfetch { my ($self, $timestamp) = @_; my %whole_config = $self->{node}->spoolfetch($timestamp); # munin.conf might override stuff foreach my $plugin (keys %whole_config) { my $merged_config = $self->uw_override_with_conf($plugin, $whole_config{$plugin}); $whole_config{$plugin} = $merged_config; } return %whole_config; } sub uw_fetch_service_config { my ($self, $plugin) = @_; # Note, this can die for several reasons. Caller must eval us. my %service_config = $self->{node}->fetch_service_config($plugin); my $merged_config = $self->uw_override_with_conf($plugin, \%service_config); return %$merged_config; } sub uw_override_with_conf { my ($self, $plugin, $service_config) = @_; if ($self->{host}{service_config} && $self->{host}{service_config}{$plugin}) { my %merged_config = (%$service_config, %{$self->{host}{service_config}{$plugin}}); $service_config = \%merged_config; } return $service_config; } sub _compare_and_act_on_config_changes { my ($self, $nested_service_config) = @_; # Kjellm: Why do we need to tune RRD files after upgrade? # Shouldn't we create a upgrade script or something instead? # # janl: Upgrade script sucks. This way it's inline in munin and # no need to remember anything or anything. my $just_upgraded = 0; my $old_config = Munin::Master::Config->instance()->{oldconfig}; if (not defined $old_config->{version} or ($old_config->{version} ne $Munin::Common::Defaults::MUNIN_VERSION)) { $just_upgraded = 1; } for my $service (keys %{$nested_service_config->{data_source}}) { my $service_config = $nested_service_config->{data_source}{$service}; for my $data_source (keys %{$service_config}) { my $old_data_source = $data_source; my $ds_config = $service_config->{$data_source}; my $group = $self->{host}{group}{group_name}; my $host = $self->{host}{host_name}; my $old_host_config = $old_config->{groups}{$group}{hosts}{$host}; my $old_ds_config = undef; if ($old_host_config) { $old_ds_config = $old_host_config->get_canned_ds_config($service, $data_source); } if (defined($old_ds_config) and %$old_ds_config and defined($ds_config->{oldname}) and $ds_config->{oldname}) { $old_data_source = $ds_config->{oldname}; $old_ds_config = $old_host_config->get_canned_ds_config($service, $old_data_source); } if (defined($old_ds_config) and %$old_ds_config and not $self->_ds_config_eq($old_ds_config, $ds_config)) { $self->_ensure_filename($service, $old_data_source, $data_source, $old_ds_config, $ds_config) and $self->_ensure_tuning($service, $data_source, $ds_config); # _ensure_filename prints helpfull warnings in the log } elsif ($just_upgraded) { $self->_ensure_tuning($service, $data_source, $ds_config); } } } } sub _ds_config_eq { my ($self, $old_ds_config, $ds_config) = @_; $ds_config = $self->_get_rrd_data_source_with_defaults($ds_config); $old_ds_config = $self->_get_rrd_data_source_with_defaults($old_ds_config); # We only compare keys that are autotuned to avoid needless RRD tuning, # since RRD tuning is bad for perf (flush rrdcached) for my $key (keys %$rrd_tune_flags) { my $old_value = $old_ds_config->{$key}; my $value = $ds_config->{$key}; # if both keys undefined, look no further next unless (defined($old_value) || defined($value)); # so, at least one of the 2 is defined # False if the $old_value is not defined return 0 unless (defined($old_value)); # if something isn't the same, return false return 0 if (! defined $value || $old_value ne $value); } # Nothing different found, it has to be equal. return 1; } sub _ensure_filename { my ($self, $service, $old_data_source, $data_source, $old_ds_config, $ds_config) = @_; my $rrd_file = $self->_get_rrd_file_name($service, $data_source, $ds_config); my $old_rrd_file = $self->_get_rrd_file_name($service, $old_data_source, $old_ds_config); my $hostspec = $self->{node}{host}.'/'.$self->{node}{address}.':'. $self->{node}{port}; if ($rrd_file ne $old_rrd_file) { if (-f $old_rrd_file and -f $rrd_file) { my $host = $self->{host}{host_name}; WARN "[WARNING]: $hostspec $service $data_source config change " . "suggests moving '$old_rrd_file' to '$rrd_file' " . "but both exist; manually merge the data " . "or remove whichever file you care less about.\n"; return ''; } elsif (-f $old_rrd_file) { INFO "[INFO]: Config update, changing name of '$old_rrd_file'" . " to '$rrd_file' on $hostspec "; unless (rename ($old_rrd_file, $rrd_file)) { ERROR "[ERROR]: Could not rename '$old_rrd_file' to" . " '$rrd_file' for $hostspec: $!\n"; return ''; } } } return 1; } sub _ensure_tuning { my ($self, $service, $data_source, $ds_config) = @_; my $success = 1; my $rrd_file = $self->_get_rrd_file_name($service, $data_source, $ds_config); $ds_config = $self->_get_rrd_data_source_with_defaults($ds_config); for my $rrd_prop (keys %$rrd_tune_flags) { INFO "[INFO]: Config update, ensuring $rrd_prop of" . " '$rrd_file' is '$ds_config->{$rrd_prop}'.\n"; RRDs::tune($rrd_file, $rrd_tune_flags->{$rrd_prop}, "42:$ds_config->{$rrd_prop}"); if (my $tune_error = RRDs::error()) { ERROR "[ERROR] Tuning $rrd_prop of '$rrd_file' to" . " '$ds_config->{$rrd_prop}' failed.\n"; $success = ''; } } return $success; } sub _update_rrd_files { my ($self, $nested_service_config, $nested_service_data) = @_; my $nodedesignation = $self->{host}{host_name}."/". $self->{host}{address}.":".$self->{host}{port}; my $last_timestamp = 0; for my $service (keys %{$nested_service_config->{data_source}}) { my $service_config = $nested_service_config->{data_source}{$service}; my $service_data = $nested_service_data->{$service}; for my $ds_name (keys %{$service_config}) { my $ds_config = $service_config->{$ds_name}; unless (defined($ds_config->{label})) { ERROR "[ERROR] Unable to update $service on $nodedesignation -> $ds_name: Missing data source configuration attribute: label"; next; } # Sets the DS resolution, searching in that order : # - per field # - per plugin # - globally my $configref = $self->{node}{configref}; $ds_config->{graph_data_size} ||= get_config_for_service($nested_service_config->{global}{$service}, "graph_data_size"); $ds_config->{graph_data_size} ||= $config->{graph_data_size}; $ds_config->{update_rate} ||= get_config_for_service($nested_service_config->{global}{$service}, "update_rate"); $ds_config->{update_rate} ||= $config->{update_rate}; $ds_config->{update_rate} ||= 300; # default is 5 min DEBUG "[DEBUG] asking for a rrd of size : " . $ds_config->{graph_data_size}; # Avoid autovivification (for multigraphs) my $first_epoch = (defined($service_data) and defined($service_data->{$ds_name})) ? ($service_data->{$ds_name}->{when}->[0]) : 0; my $rrd_file = $self->_create_rrd_file_if_needed($service, $ds_name, $ds_config, $first_epoch); if (defined($service_data) and defined($service_data->{$ds_name})) { $last_timestamp = max($last_timestamp, $self->_update_rrd_file($rrd_file, $ds_name, $service_data->{$ds_name})); } else { WARN "[WARNING] Service $service on $nodedesignation returned no data for label $ds_name"; } } } return $last_timestamp; } sub get_config_for_service { my ($array, $key) = @_; for my $elem (@$array) { next unless $elem->[0] && $elem->[0] eq $key; return $elem->[1]; } # Not found return undef; } sub _get_rrd_data_source_with_defaults { my ($self, $data_source) = @_; # Copy it into a new hash, we don't want to alter the $data_source # and anything already defined should not be overridden by defaults my $ds_with_defaults = { type => 'GAUGE', min => 'U', max => 'U', update_rate => 300, graph_data_size => 'normal', }; for my $key (keys %$data_source) { $ds_with_defaults->{$key} = $data_source->{$key}; } return $ds_with_defaults; } sub _create_rrd_file_if_needed { my ($self, $service, $ds_name, $ds_config, $first_epoch) = @_; my $rrd_file = $self->_get_rrd_file_name($service, $ds_name, $ds_config); unless (-f $rrd_file) { $self->_create_rrd_file($rrd_file, $service, $ds_name, $ds_config, $first_epoch); } return $rrd_file; } sub _get_rrd_file_name { my ($self, $service, $ds_name, $ds_config) = @_; $ds_config = $self->_get_rrd_data_source_with_defaults($ds_config); my $type_id = lc(substr(($ds_config->{type}), 0, 1)); my $path = $self->{host}->get_full_path; $path =~ s{[;:]}{/}g; # Multigraph/nested services will have . in the service name in this function. $service =~ s{\.}{-}g; # The following is rigged to match the corresponding function in # munin-graph/munin-html where it's less clear what are groups and # what are hosts and what are services, and they simply pop # elements off the end and so on. my $file = sprintf("%s-%s-%s-%s.rrd", $path, $service, $ds_name, $type_id); $file = File::Spec->catfile($config->{dbdir}, $file); DEBUG "[DEBUG] rrd filename: $file\n"; return $file; } sub _create_rrd_file { my ($self, $rrd_file, $service, $ds_name, $ds_config, $first_epoch) = @_; INFO "[INFO] creating rrd-file for $service->$ds_name: '$rrd_file'"; munin_mkdir_p(dirname($rrd_file), oct(777)); my @args; $ds_config = $self->_get_rrd_data_source_with_defaults($ds_config); my $resolution = $ds_config->{graph_data_size}; my $update_rate = $ds_config->{update_rate}; if ($resolution eq 'normal') { $update_rate = 300; # 'normal' means hard coded RRD $update_rate push (@args, "RRA:AVERAGE:0.5:1:576", # resolution 5 minutes "RRA:MIN:0.5:1:576", "RRA:MAX:0.5:1:576", "RRA:AVERAGE:0.5:6:432", # 9 days, resolution 30 minutes "RRA:MIN:0.5:6:432", "RRA:MAX:0.5:6:432", "RRA:AVERAGE:0.5:24:540", # 45 days, resolution 2 hours "RRA:MIN:0.5:24:540", "RRA:MAX:0.5:24:540", "RRA:AVERAGE:0.5:288:450", # 450 days, resolution 1 day "RRA:MIN:0.5:288:450", "RRA:MAX:0.5:288:450"); } elsif ($resolution eq 'huge') { $update_rate = 300; # 'huge' means hard coded RRD $update_rate push (@args, "RRA:AVERAGE:0.5:1:115200", # resolution 5 minutes, for 400 days "RRA:MIN:0.5:1:115200", "RRA:MAX:0.5:1:115200"); } elsif ($resolution =~ /^custom (.+)/) { # Parsing resolution to achieve computer format as defined on the RFC : # FULL_NB, MULTIPLIER_1 MULTIPLIER_1_NB, ... MULTIPLIER_NMULTIPLIER_N_NB my @resolutions_computer = parse_custom_resolution($1, $update_rate); foreach my $resolution_computer(@resolutions_computer) { my ($multiplier, $multiplier_nb) = @{$resolution_computer}; # Always add 10% to the RRA size, as specified in # http://munin-monitoring.org/wiki/format-graph_data_size $multiplier_nb += int ($multiplier_nb / 10) || 1; push (@args, "RRA:AVERAGE:0.5:$multiplier:$multiplier_nb", "RRA:MIN:0.5:$multiplier:$multiplier_nb", "RRA:MAX:0.5:$multiplier:$multiplier_nb" ); } } # Add the RRD::create prefix (filename & RRD params) my $heartbeat = $update_rate * 2; unshift (@args, $rrd_file, "--start", ($first_epoch - $update_rate), "-s", $update_rate, sprintf('DS:42:%s:%s:%s:%s', $ds_config->{type}, $heartbeat, $ds_config->{min}, $ds_config->{max}), ); DEBUG "[DEBUG] RRDs::create @args"; RRDs::create @args; if (my $ERROR = RRDs::error) { ERROR "[ERROR] Unable to create '$rrd_file': $ERROR"; } } sub parse_custom_resolution { my @elems = split(',\s*', shift); my $update_rate = shift; DEBUG "[DEBUG] update_rate: $update_rate"; my @computer_format; # First element is always the full resolution my $full_res = shift @elems; if ($full_res =~ m/^\d+$/) { # Only numeric, computer format unshift @elems, "1 $full_res"; } else { # Human readable. Adding $update_rate in front of unshift @elems, "$update_rate for $full_res"; } foreach my $elem (@elems) { if ($elem =~ m/(\d+) (\d+)/) { # nothing to do, already in computer format push @computer_format, [$1, $2]; } elsif ($elem =~ m/(\w+) for (\w+)/) { my $nb_sec = to_sec($1); my $for_sec = to_sec($2); my $multiplier = int ($nb_sec / $update_rate); my $multiplier_nb = int ($for_sec / $nb_sec); DEBUG "[DEBUG] $elem" . " -> nb_sec:$nb_sec, for_sec:$for_sec" . " -> multiplier:$multiplier, multiplier_nb:$multiplier_nb" ; push @computer_format, [$multiplier, $multiplier_nb]; } } return @computer_format; } # return the number of seconds # for the human readable format # s : second, m : minute, h : hour # d : day, w : week, t : month, y : year sub to_sec { my $secs_table = { "s" => 1, "m" => 60, "h" => 60 * 60, "d" => 60 * 60 * 24, "w" => 60 * 60 * 24 * 7, "t" => 60 * 60 * 24 * 31, # a month always has 31 days "y" => 60 * 60 * 24 * 365, # a year always has 365 days }; my ($target) = @_; if ($target =~ m/(\d+)([smhdwty])/i) { return $1 * $secs_table->{$2}; } else { # no recognised unit, return the int value as seconds return int $target; } } sub to_mul { my ($base, $target) = @_; my $target_sec = to_sec($target); if ($target %% $base != 0) { return 0; } return round($target / $base); } sub to_mul_nb { my ($base, $target) = @_; my $target_sec = to_sec($target); if ($target %% $base != 0) { return 0; } } sub _update_rrd_file { my ($self, $rrd_file, $ds_name, $ds_values) = @_; my $values = $ds_values->{value}; # Some kind of mismatch between fetch and config can cause this. return if !defined($values); my ($previous_updated_timestamp, $previous_updated_value) = @{ $self->{state}{value}{"$rrd_file:42"}{current} || [ ] }; my @update_rrd_data; if ($config->{"rrdcached_socket"}) { if (! -e $config->{"rrdcached_socket"} || ! -w $config->{"rrdcached_socket"}) { WARN "[WARN] RRDCached feature ignored: rrdcached socket not writable"; } elsif($RRDs::VERSION < 1.3){ WARN "[WARN] RRDCached feature ignored: perl RRDs lib version must be at least 1.3. Version found: " . $RRDs::VERSION; } else { # Using the RRDCACHED_ADDRESS environnement variable, as # it is way less intrusive than the command line args. $ENV{RRDCACHED_ADDRESS} = $config->{"rrdcached_socket"}; } } my ($current_updated_timestamp, $current_updated_value) = ($previous_updated_timestamp, $previous_updated_value); for (my $i = 0; $i < scalar @$values; $i++) { my $value = $values->[$i]; my $when = $ds_values->{when}[$i]; # Ignore values that is not in monotonic increasing timestamp for the RRD. # Otherwise it will reject the whole update next if ($current_updated_timestamp && $when <= $current_updated_timestamp); if ($value =~ /\d[Ee]([+-]?\d+)$/) { # Looks like scientific format. RRDtool does not # like it so we convert it. my $magnitude = $1; if ($magnitude < 0) { # Preserve at least 4 significant digits $magnitude = abs($magnitude) + 4; $value = sprintf("%.*f", $magnitude, $value); } else { $value = sprintf("%.4f", $value); } } # Schedule for addition push @update_rrd_data, "$when:$value"; $current_updated_timestamp = $when; $current_updated_value = $value; } DEBUG "[DEBUG] Updating $rrd_file with @update_rrd_data"; if ($ENV{RRDCACHED_ADDRESS} && (scalar @update_rrd_data > 32) ) { # RRDCACHED only takes about 4K worth of commands. If the commands is # too large, we have to break it in smaller calls. # # Note that 32 is just an arbitrary choosed number. It might be tweaked. # # For simplicity we only call it with 1 update each time, as RRDCACHED # will buffer for us as suggested on the rrd mailing-list. # https://lists.oetiker.ch/pipermail/rrd-users/2011-October/018196.html for my $update_rrd_data (@update_rrd_data) { RRDs::update($rrd_file, $update_rrd_data); # Break on error. last if RRDs::error; } } else { RRDs::update($rrd_file, @update_rrd_data); } if (my $ERROR = RRDs::error) { #confess Dumper @_; ERROR "[ERROR] In RRD: Error updating $rrd_file: $ERROR"; } # Stores the previous and the current value in the state db to avoid having to do an RRD lookup if needed $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; return $current_updated_timestamp; } sub dump_to_file { my ($filename, $obj) = @_; open(DUMPFILE, ">> $filename"); use Data::Dumper; print DUMPFILE Dumper($obj); close(DUMPFILE); } 1; __END__ =head1 NAME Munin::Master::UpdateWorker - FIX =head1 SYNOPSIS FIX =head1 METHODS =over =item B FIX =item B FIX =back =head1 COPYING Copyright (C) 2002-2009 Jimmy Olsen, et al. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. munin-2.0.25/master/lib/Munin/Master/Utils.pm000066400000000000000000001427271243472346000207700ustar00rootroot00000000000000package Munin::Master::Utils; # -*- cperl -*- # $Id$ use strict; use warnings; use Carp; use Exporter; use English qw(-no_match_vars); use Fcntl qw(:DEFAULT :flock); use File::Path; use IO::Handle; use Munin::Common::Defaults; use Munin::Master::Logger; use Munin::Master::Config; use Munin::Common::Config; use Log::Log4perl qw(:easy); use POSIX qw(strftime); use POSIX qw(:sys_wait_h); use Symbol qw(gensym); use Data::Dumper; use Storable; use Scalar::Util qw(isweak weaken); our (@ISA, @EXPORT); @ISA = ('Exporter'); @EXPORT = ( 'munin_nscasend', 'munin_createlock', 'munin_removelock', 'munin_runlock', 'munin_getlock', 'munin_readconfig_raw', 'munin_readconfig_storable', 'munin_writeconfig', 'munin_writeconfig_storable', 'munin_read_storable', 'munin_write_storable', 'munin_delete', 'munin_overwrite', 'munin_dumpconfig', 'munin_dumpconfig_as_str', 'munin_readconfig_base', 'munin_readconfig_part', 'munin_configpart_revision', 'munin_draw_field', 'munin_get_bool', 'munin_get_bool_val', 'munin_get', 'munin_field_status', 'munin_service_status', 'munin_node_status', 'munin_category_status', 'munin_get_picture_filename', 'munin_get_picture_loc', 'munin_get_html_filename', 'munin_get_filename', 'munin_get_keypath', 'munin_graph_column_headers', 'munin_get_max_label_length', 'munin_get_field_order', 'munin_get_rrd_filename', 'munin_get_node_name', 'munin_get_orig_node_name', 'munin_get_parent_name', 'munin_get_node_fqn', 'munin_find_node_by_fqn', 'munin_get_node_loc', 'munin_get_node', 'munin_set_var_loc', 'munin_set_var_path', 'munin_set', 'munin_copy_node_toloc', 'munin_get_separated_node', 'munin_mkdir_p', 'munin_find_field', 'munin_find_field_for_limits', 'munin_get_parent', 'munin_get_children', 'munin_get_node_partialpath', 'munin_has_subservices', 'munin_get_host_path_from_string', 'print_version_and_exit', 'exit_if_run_by_super_user', 'look_for_child', 'wait_for_remaining_children', ); my $VERSION = $Munin::Common::Defaults::MUNIN_VERSION; my $nsca = new IO::Handle; my $config = undef; my $config_parts = { # config parts that might be loaded and reloaded at times 'datafile' => { 'timestamp' => 0, 'config' => undef, 'revision' => 0, 'include_base' => 1, }, 'limits' => { 'timestamp' => 0, 'config' => undef, 'revision' => 0, 'include_base' => 1, }, 'htmlconf' => { 'timestamp' => 0, 'config' => undef, 'revision' => 0, 'include_base' => 0, }, }; my $configfile="$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf"; # Fields to copy when "aliasing" a field my @COPY_FIELDS = ("label", "draw", "type", "rrdfile", "fieldname", "info"); my @dircomponents = split('/',$0); my $me = pop(@dircomponents); sub munin_draw_field { my $hash = shift; return 0 if munin_get_bool ($hash, "skipdraw", 0); return 0 if !munin_get_bool ($hash, "graph", 1); return defined $hash->{"label"}; } sub munin_nscasend { my ($name,$service,$label,$level,$comment) = @_; if (!$nsca->opened) { open ($nsca ,'|-', "$config->{nsca} $config->{nsca_server} -c $config->{nsca_config} -to 60"); } if ($label) { print $nsca "$name\t$service: $label\t$level\t$comment\n"; DEBUG "To $nsca: $name;$service: $label;$level;$comment\n"; } else { print $nsca "$name\t$service\t$level\t$comment\n"; DEBUG "[DEBUG] To $nsca: $name;$service;$level;$comment\n"; } } sub munin_createlock { # Create lock file, fail and die if not possible. my ($lockname) = @_; if (sysopen (LOCK,$lockname,O_WRONLY | O_CREAT | O_EXCL)) { DEBUG "[DEBUG] Creating lock : $lockname succeeded\n"; print LOCK $$; # we want the pid inside for later use close LOCK; return 1; } else { LOGCROAK("Creating lock $lockname failed: $!\n"); } } sub munin_removelock { # Remove lock or die trying. my ($lockname) = @_; unlink $lockname or LOGCROAK("[FATAL ERROR] Error deleting lock $lockname: $!\n"); } sub munin_runlock { my ($lockname) = @_; unless (munin_getlock($lockname)) { LOGCROAK("[FATAL ERROR] Lock already exists: $lockname. Dying.\n"); } return 1; } sub munin_getlock { my ($lockname) = @_; if (-f $lockname) { DEBUG "[DEBUG] Lock $lockname already exists, checking process"; # Is the lockpid alive? # To check this is inteligent and so on. It also makes for a # nice locking racing-condition. BUT, since munin-* runs from # cron every 5 minutes this should not be a real threat. This # ream of code should complete in less than 5 minutes. open my $LOCK, '<', $lockname or LOGCROAK("Could not open $lockname for reading: $!\n"); my $pid = <$LOCK>; $pid = '' if !defined($pid); close($LOCK) or LOGCROAK("Could not close $lockname: $!\n"); DEBUG "[DEBUG] Lock contained pid '$pid'"; # Make sure it's a proper pid if (defined($pid) and $pid =~ /^(\d+)$/ and $1 != 1) { $pid = $1; if (kill(0, $pid)) { DEBUG "[DEBUG] kill -0 $pid worked - it is still alive. Locking failed."; return 0; } INFO "[INFO] Process $pid is dead, stealing lock, removing file"; } else { INFO "[INFO] PID in lock file is bogus. Removing lock file"; } munin_removelock($lockname); } DEBUG "[DEBUG] Creating new lock file $lockname"; munin_createlock($lockname); return 1; } sub munin_delete { my ($config,$data) = @_; for my $domain (keys %{$data->{domain}}) { unless ($config->{domain}->{$domain}) { DEBUG "[DEBUG] Removing domain: $domain"; delete ($data->{domain}->{$domain}); next; } for my $node (keys %{$data->{domain}->{$domain}->{node}}) { unless ($config->{domain}->{$domain}->{node}->{$node}) { DEBUG "[DEBUG] Removing node from $domain: $node"; delete ($data->{domain}->{$domain}->{node}->{$node}); } } } return ($data); } sub munin_overwrite { # copy from $overwrite OVER $config. my ($configfile,$overwrite) = @_; for my $key (keys %$overwrite) { next if substr($key,0,3) eq '#%#'; if (ref $overwrite->{$key}) { if (!defined $configfile->{$key}) { if (ref $overwrite->{$key} eq "HASH") { $configfile->{$key}->{'#%#parent'} = $configfile; weaken($configfile->{$key}->{'#%#parent'}); $configfile->{$key}->{'#%#name'} = $key; munin_overwrite($configfile->{$key},$overwrite->{$key}); } else { $configfile->{$key} = $overwrite->{$key}; } } else { munin_overwrite($configfile->{$key},$overwrite->{$key}); } } else { $configfile->{$key} = $overwrite->{$key}; } } return ($configfile); } sub munin_readconfig_storable { my ($file) = @_; my $part = undef; $file ||= $configfile; # try to read storable version if ((-r $file) && open (my $CFG_STORABLE, '<', $file)) { DEBUG "[DEBUG] munin_readconfig: found Storable version of $file, using it"; $part = Storable::fd_retrieve($CFG_STORABLE); close ($CFG_STORABLE); } return $part; } sub munin_readconfig_raw { my ($conf, $missingok) = @_; my $part = undef; $conf ||= $configfile; # try first to read storable version $part = munin_readconfig_storable("$conf.storable"); if (!defined $part) { if (! -r $conf and ! $missingok) { WARN "munin_readconfig: cannot open '$conf'"; return; } if (open (my $CFG, '<', $conf)) { my @contents = <$CFG>; close ($CFG); $part = munin_parse_config (\@contents); } } return $part; } sub munin_parse_config { my $lines = shift; my $hash = {}; my $prefix = ""; my $prevline = ""; foreach my $line (@{$lines}) { chomp $line; if ($line =~ /#/) { next if ($line =~ /^#/); $line =~ s/(^|[^\\])#.*/$1/g; $line =~ s/\\#/#/g; } next unless ($line =~ /\S/); # And empty lines... if (length $prevline) { $line = $prevline . $line; $prevline = ""; } if ($line =~ /\\\\$/) { $line =~ s/\\\\$/\\/; } elsif ($line =~ /\\$/) { ($prevline = $line) =~ s/\\$//; next; } $line =~ s/\s+$//g; # And trailing whitespace... $line =~ s/^\s+//g; # And heading whitespace... if ($line =~ /^\.(\S+)\s+(.+)\s*$/) { my ($var, $val) = ($1, $2); $hash = munin_set_var_path ($hash, $var, $val); } elsif ($line =~ /^\s*\[([^\]]*)]\s*$/) { $prefix = $1; if ($prefix =~ /^([^:]+);([^:;]+)$/) { $prefix .= ":"; } elsif ($prefix =~ /^([^:;]+);$/) { $prefix .= ""; } elsif ($prefix =~ /^([^:;]+);([^:;]+):(.*)$/) { $prefix .= "."; } elsif ($prefix =~ /^([^:;]+)$/) { (my $domain = $prefix) =~ s/^[^\.]+\.//; $prefix = "$domain;$prefix:"; } elsif ($prefix =~ /^([^:;]+):(.*)$/) { (my $domain = $prefix) =~ s/^[^\.]+\.//; $prefix = "$domain;$prefix."; } } elsif ($line =~ /^\s*(\S+)\s+(.+)\s*$/) { my ($var, $val) = ($1, $2); $hash = munin_set_var_path ($hash, "$prefix$var", $val); } else { warn "Malformed configuration line \"$line\"."; } } return $hash; } sub munin_get_var_path { my $hash = shift; my $var = shift; my $val = shift; DEBUG "DEBUG: Getting var \"$var\" = \"$val\"\n"; if ($var =~ /^\s*([^;:]+);([^;:]+):(\S+)\s*$/) { my ($dom, $host, $rest) = ($1, $2, $3); my @sp = split (/\./, $rest); if (@sp == 3) { return $hash->{domain}->{$dom}->{node}->{$host}->{client}->{$sp[0]}->{"$sp[1].$sp[2]"}; } elsif (@sp == 2) { return $hash->{domain}->{$dom}->{node}->{$host}->{client}->{$sp[0]}->{$sp[1]}; } elsif (@sp == 1) { return $hash->{domain}->{$dom}->{node}->{$host}->{$sp[0]}; } else { warn "munin_set_var_path: Malformatted variable path \"$var\"."; } } elsif ($var =~ /^\s*([^;:]+);([^;:]+)\s*$/) { my ($dom, $rest) = ($1, $2); my @sp = split (/\./, $rest); if (@sp == 1) { return $hash->{domain}->{$dom}->{$sp[0]}; } else { warn "munin_set_var_path: Malformatted variable path \"$var\"."; } } elsif ($var =~ /^\s*([^;:\.]+)\s*$/) { return $hash->{$1}; } else { warn "munin_set_var_path: Malformatted variable path \"$var\"."; } return; } sub munin_find_field { # Starting at the (presumably the root) $hash make recursive calls # until for example graph_title or value is found, and then # continue recursing and itterating until all are found. # # Then we return a array of pointers into the $hash # # This function will not use REs as they are inordinately # expensive. There is a munin_find_field_for_limits that will # match REs instead of whole strings. my ($hash, $field, $avoid) = @_; my $res = []; if (ref ($hash) eq "HASH") { foreach my $key (keys %{$hash}) { next if substr($key,0,3) eq '#%#'; last if defined $avoid and $key eq $avoid; # Always check $key eq $field first here, or we break if ($key eq $field) { push @$res, $hash; } elsif (ref ($hash->{$key}) eq "HASH") { push @$res, @{munin_find_field ($hash->{$key}, $field, $avoid)}; } } } return $res; } sub munin_find_field_for_limits { my ($hash, $field, $avoid) = @_; my $res = []; if (ref ($field) ne "Regexp") { $field = qr/^$field$/; } if (ref ($hash) eq "HASH") { foreach my $key (keys %{$hash}) { next if substr($key,0,3) eq '#%#'; last if defined $avoid and $key eq $avoid; if (ref ($hash->{$key}) eq "HASH") { push @$res, @{munin_find_field_for_limits ($hash->{$key}, $field, $avoid)}; } elsif ($key =~ $field) { push @$res, $hash; } } } return $res; } sub munin_get_children { my $hash = shift; my $res = []; return if (ref ($hash) ne "HASH"); foreach my $key (keys %{$hash}) { next if substr($key,0,3) eq '#%#'; if (defined $hash->{$key} and ref ($hash->{$key}) eq "HASH") { push @$res, $hash->{$key}; } } return $res; } sub munin_get_separated_node { my $hash = shift; my $ret = {}; if (ref ($hash) eq "HASH") { foreach my $key (keys %$hash) { next if substr($key,0,3) eq '#%#'; if (ref ($hash->{$key}) eq "HASH") { $ret->{$key} = munin_get_separated_node ($hash->{$key}); } else { $ret->{$key} = $hash->{$key}; } } } else { return; } return $ret; } sub munin_get_parent_name { my $hash = shift; if (ref ($hash) eq "HASH" and defined $hash->{'#%#parent'}) { return munin_get_node_name ($hash->{'#%#parent'}); } else { return "none"; } } sub munin_get_orig_node_name { my $hash = shift; if (ref ($hash) eq "HASH" and defined $hash->{'#%#name'}) { return (defined $hash->{'#%#origname'}) ? $hash->{'#%#origname'} : $hash->{'#%#name'}; } else { return; } } sub munin_get_node_name { my $hash = shift; if (ref ($hash) eq "HASH" and defined $hash->{'#%#name'}) { return $hash->{'#%#name'}; } else { return; } } sub munin_get_node_fqn { my $hash = shift; if (ref ($hash) eq "HASH") { my $fqn = ""; if (defined $hash->{'#%#name'}) { $fqn = $hash->{'#%#name'}; } if (defined $hash->{'#%#parent'}) { # Recursively prepend the parent, concatenation with / $fqn = munin_get_node_fqn ($hash->{'#%#parent'}) . "/" . $fqn; } return $fqn; } else { return; } } sub munin_find_node_by_fqn { # The FQN should be relative to the point in the hash we're handed. my($hash,$fqn) = @_; my $here = $hash; my @path = split('/',$fqn); foreach my $pc (@path) { next if $pc eq 'root'; if (exists $here->{$pc}) { $here = $here->{$pc}; } else { confess "Could not find FQN $fqn!"; } } return $here ; } sub munin_get_picture_loc { my $hash = shift; my $res = []; if (ref ($hash) ne "HASH") { # Not a hash node return; } if (defined $hash->{'#%#origin'}) { $res = munin_get_picture_loc ($hash->{'#%#origin'}); } elsif (defined $hash->{'#%#origparent'}){ $res = munin_get_picture_loc ($hash->{'#%#origparent'}); push @$res, munin_get_orig_node_name ($hash) if defined $res; } elsif (defined $hash->{'#%#parent'}) { $res = munin_get_picture_loc ($hash->{'#%#parent'}); push @$res, munin_get_orig_node_name ($hash) if defined $res; } return $res; } sub munin_get_node_loc { my $hash = shift; my $res = []; if (ref ($hash) ne "HASH") { # Not a has node return; } if (defined $hash->{'#%#parent'}) { if(defined $hash->{'#%#origparent'}){ $res = munin_get_node_loc ($hash->{'#%#origparent'}); } else { $res = munin_get_node_loc ($hash->{'#%#parent'}); } push @$res, munin_get_orig_node_name ($hash) if defined $res; } return $res; } sub munin_get_parent { my $hash = shift; if (ref ($hash) ne "HASH") { # Not a has node return; } if (defined $hash->{'#%#parent'}) { return $hash->{'#%#parent'}; } else { return; } } sub munin_get_node { # From the given point in the hash itterate deeper into the # has along the path given by the array in $loc. # # If any part of the path in $loc is undefined we bail. my $hash = shift; my $loc = shift; foreach my $tmpvar (@$loc) { if (! exists $hash->{$tmpvar} ) { # Only complain on a blank key if is no key like that. Usually it # shouln't, so it avoids a needless regexp in this highly used # function ERROR "[ERROR] munin_get_node: Cannot work on hash node '$tmpvar'" if ($tmpvar !~ /\S/); return undef; } $hash = $hash->{$tmpvar}; } return $hash; } sub munin_set { my $hash = shift; my $var = shift; my $val = shift; return munin_set_var_loc ($hash, [$var], $val); } sub munin_set_var_loc { my $hash = shift; my $loc = shift; my $val = shift; my $iloc = 0; # XXX - Dirty breaking recursive function # --> Using goto is BAD, but enough for now START: # Find the next normal value (that doesn't begin with #%#) my $tmpvar = $loc->[$iloc++]; $tmpvar = $loc->[$iloc++] while (defined $tmpvar and substr($tmpvar,0,3) eq '#%#'); if (index($tmpvar, " ") != -1) { ERROR "[ERROR] munin_set_var_loc: Cannot work on hash node \"$tmpvar\""; return; } if (scalar @$loc > $iloc) { if (!defined $hash->{$tmpvar} or !defined $hash->{$tmpvar}->{"#%#name"}) { # Init the new node $hash->{$tmpvar}->{"#%#parent"} = $hash; weaken($hash->{$tmpvar}->{"#%#parent"}); $hash->{$tmpvar}->{"#%#name"} = $tmpvar; } # Recurse $hash = $hash->{$tmpvar}; goto START; } else { WARN "[WARNING] munin_set_var_loc: Setting unknown option '$tmpvar' at " . munin_get_keypath($hash) unless Munin::Common::Config::cl_is_keyword($tmpvar); # FIX - or not. $hash->{$tmpvar} = $val; return $hash; } } sub munin_get_node_partialpath { my $hash = shift; my $var = shift; my $ret = undef; return if !defined $hash or ref ($hash) ne "HASH"; my $root = munin_get_root_node ($hash); my $hashloc = munin_get_node_loc ($hash); my $varloc = undef; if ($var =~ /^\s*([^:]+):(\S+)\s*$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); push @$varloc, @leftarr, @rightarr } elsif ($var =~ /^\s*([^;:.]+)\s*$/) { push @$varloc, $var; } elsif ($var =~ /^\s*([^.]+)\.([^:;]+)$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); push @$varloc, @leftarr, @rightarr; } elsif ($var =~ /^\s*(\S+)\s*$/) { my @leftarr = split (/;/, $1); push @$varloc, @leftarr; } else { ERROR "[ERROR] munin_get_node_partialpath: Malformed variable path \"$var\"."; } # We've got both parts of the loc (varloc and hashloc) -- let's figure out # where they meet up. do { $ret = munin_get_node ($root, [@$hashloc, @$varloc]); } while (!defined $ret and pop @$hashloc); return $ret; } sub munin_set_var_path { my $hash = shift; my $var = shift; my $val = shift; my $result = undef; DEBUG "[DEBUG] munin_set_var_path: Setting var \"$var\" = \"$val\""; if ($var =~ /^\s*([^:]+):(\S+)\s*$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); $result = munin_set_var_loc ($hash, [@leftarr, @rightarr], $val); } elsif ($var =~ /^\s*([^;:\.]+)\s*$/) { $result = munin_set_var_loc ($hash, [$1], $val); } elsif ($var =~ /^\s*([^:;]+)$/) { my @leftarr = split (/\./, $1); $result = munin_set_var_loc ($hash, [@leftarr], $val); } elsif ($var =~ /^\s*(.+)\.([^\.:;]+)$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); $result = munin_set_var_loc ($hash, [@leftarr, @rightarr], $val); } elsif ($var =~ /^\s*(\S+)\s*$/) { my @leftarr = split (/;/, $1); $result = munin_set_var_loc ($hash, [@leftarr], $val); } else { ERROR "Error: munin_set_var_path: Malformatted variable path \"$var\"."; } if (!defined $result) { ERROR "Error: munin_set_var_path: Failed setting \"$var\" = \"$val\"."; } return $hash; } sub munin_get_root_node { my $hash = shift; return if ref ($hash) ne "HASH"; while (defined $hash->{'#%#parent'}) { $hash = $hash->{'#%#parent'}; } return $hash; } sub munin_writeconfig_loop { my ($hash,$fh,$pre) = @_; foreach my $key (keys %$hash) { next if substr($key,0,3) eq '#%#'; my $path = (defined $pre ? join(';', ($pre, $key)) : $key); if (ref ($hash->{$key}) eq "HASH") { munin_writeconfig_loop ($hash->{$key}, $fh, $path); } else { next if !defined $pre and $key eq "version"; # Handled separately next if !defined $hash->{$key} or !length $hash->{$key}; (my $outstring = $hash->{$key}) =~ s/([^\\])#/$1\\#/g; # Too much. Can be seen in the file itself. # DEBUG "[DEBUG] Writing: $path $outstring\n"; if ($outstring =~ /\\$/) { # Backslash as last char has special meaning. Avoid it. print $fh "$path $outstring\\\n"; } else { print $fh "$path $outstring\n"; } } } } sub munin_read_storable { my ($storable_filename, $default) = @_; if (-e $storable_filename) { my $storable = eval { Storable::retrieve($storable_filename); }; return $storable unless $@; # Didn't managed to read storable. # Removing it as it is already torched anyway. unlink($storable_filename); } # return default if no better option return $default; } sub munin_write_storable { my ($storable_filename, $data) = @_; DEBUG "[DEBUG] about to write '$storable_filename'"; # We don't need to write anything if there is nothing to write. return unless defined $data; my $storable_filename_tmp = $storable_filename . ".tmp.$$"; # Write datafile.storable, in network order to be architecture indep Storable::nstore($data, $storable_filename_tmp); # Atomic commit rename ($storable_filename_tmp, $storable_filename); } sub munin_writeconfig_storable { my ($datafilename,$data) = @_; DEBUG "[DEBUG] Writing state to $datafilename"; munin_write_storable($datafilename, $data); } sub munin_writeconfig { my ($datafilename,$data,$fh) = @_; DEBUG "[DEBUG] Writing state to $datafilename"; my $is_fh_already_managed = defined $fh; if (! $is_fh_already_managed) { $fh = gensym(); unless (open ($fh, ">", $datafilename)) { LOGCROAK "Fatal error: Could not open \"$datafilename\" for writing: $!"; } } # Write version print $fh "version $VERSION\n"; # Write datafile munin_writeconfig_loop ($data, $fh); if (! $is_fh_already_managed) { DEBUG "[DEBUG] Closing filehandle \"$datafilename\"...\n"; close ($fh); } } sub munin_dumpconfig_as_str { my ($config) = @_; local $Data::Dumper::Sortkeys = sub { [ sort grep {!/^#%#parent$/} keys %{$_[0]} ]; }; local $Data::Dumper::Indent = 1; return Dumper $config; } sub munin_dumpconfig { my ($config) = @_; my $indent = $Data::Dumper::Indent; my $sorter = $Data::Dumper::Sortkeys; $Data::Dumper::Sortkeys = sub { [ sort grep {!/^#%#parent$/} keys %{$_[0]} ]; }; $Data::Dumper::Indent = 1; print "##\n"; print "## NOTE: #%#parent is hidden to make the print readable!\n"; print "##\n"; print Dumper $config; $Data::Dumper::Sortkeys = $sorter; $Data::Dumper::Indent = $indent; } sub munin_configpart_revision { my $what = shift; if (defined $what and defined $config_parts->{$what}) { return $config_parts->{$what}{revision}; } my $rev = 0; foreach $what (keys %$config_parts) { $rev += $config_parts->{$what}{revision}; } return $rev; } sub munin_readconfig_part { my $what = shift; my $missingok = shift; if (! defined $config_parts->{$what}) { ERROR "[ERROR] munin_readconfig_part with unknown part name ($what)."; return undef; } # for now, we only really care about storable. # No reason to bother reading non-storable elements anyway. my $filename = "$config->{dbdir}/$what.storable"; my $part = {}; my $doupdate = 0; if (! -f $filename) { unless (defined $missingok and $missingok) { ERROR "[FATAL] munin_readconfig_part($what) - missing file"; exit(1); } # missing ok, return last value if we have one, copy config if not if (undef == $config_parts->{$what}{config}) { # well, not if we shouldn't include the config if ($config_parts->{$what}{include_base}) { $doupdate = 1; } } } else { my @stat = stat($filename); if ($config_parts->{$what}{timestamp} < $stat[9]) { # could use _raw if we wanted to read non-storable fallback $config_parts->{$what}{config} = undef; # Unalloc RAM for old config, since it will be overriden anyway. $part = munin_readconfig_storable($filename); $config_parts->{$what}{timestamp} = $stat[9]; $doupdate = 1; } } if ($doupdate) { $part->{'#%#name'} = 'root'; $part->{'#%#parent'} = undef; $part = munin_overwrite($part, $config) if ($config_parts->{$what}{include_base}); $config_parts->{$what}{config} = $part; ++$config_parts->{$what}{revision}; } return $config_parts->{$what}{config}; } sub munin_readconfig_base { my $conffile = shift; $conffile ||= $configfile; $config = munin_readconfig_raw($conffile); if (defined $config->{'includedir'}) { my $dirname = $config->{'includedir'}; DEBUG "Includedir statement to include files in $dirname"; my $DIR; opendir($DIR, $dirname) or WARN "[Warning] Could not open includedir directory $dirname: $OS_ERROR\n"; my @files = grep { ! /^\.|~$/ } readdir($DIR); closedir($DIR); @files = map { $_ = $dirname.'/'.$_; } (sort @files); foreach my $f (@files) { INFO "Reading additional config from $f"; my $extra = munin_readconfig_raw ($f); # let the new values overwrite what we already have $config = munin_overwrite($config, $extra); } } # Some important defaults before we return... $config->{'dropdownlimit'} ||= $Munin::Common::Defaults::DROPDOWNLIMIT; $config->{'rundir'} ||= $Munin::Common::Defaults::MUNIN_STATEDIR; $config->{'dbdir'} ||= $Munin::Common::Defaults::MUNIN_DBDIR; $config->{'logdir'} ||= $Munin::Common::Defaults::MUNIN_LOGDIR; $config->{'tmpldir'} ||= "$Munin::Common::Defaults::MUNIN_CONFDIR/templates/"; $config->{'staticdir'} ||= "$Munin::Common::Defaults::MUNIN_CONFDIR/static/"; $config->{'htmldir'} ||= $Munin::Common::Defaults::MUNIN_HTMLDIR; $config->{'spooldir'} ||= $Munin::Common::Defaults::MUNIN_SPOOLDIR; $config->{'#%#parent'} = undef; $config->{'#%#name'} = "root"; return $config; } sub munin_get_html_filename { # Actually only used in M::M::HTMLOld my $hash = shift; my $loc = munin_get_node_loc ($hash); my $ret = munin_get ($hash, 'htmldir'); my $plugin = "index"; # Sanitise $ret =~ s/[^\w_\/"'\[\]\(\)+=-]\./_/g; $hash =~ s/[^\w_\/"'\[\]\(\)+=-]/_/g; @$loc = map { my $l = $_; $l =~ s/\//_/g; $l =~ s/^\./_/g; $l; } @$loc; if (defined $hash->{'graph_title'} and !munin_has_subservices ($hash)) { $plugin = pop @$loc or return; } if (@$loc) { # The rest is used as directory names... $ret .= "/" . join ('/', @$loc); } return "$ret/$plugin.html"; } sub munin_get_picture_filename { my $hash = shift; my $scale = shift; my $sum = shift; my $loc = munin_get_picture_loc ($hash); my $ret = munin_get ($hash, 'htmldir'); # Sanitise $ret =~ s/[^\w_\/"'\[\]\(\)+=-]\./_/g; $hash =~ s/[^\w_\/"'\[\]\(\)+=-]/_/g; $scale =~ s/[^\w_\/"'\[\]\(\)+=-]/_/g; @$loc = map { my $l = $_; $l =~ s/\//_/g; $l =~ s/^\./_/g; $l; } @$loc; my $plugin = pop @$loc or return; my $node = pop @$loc or return; if (@$loc) { # The rest is used as directory names... $ret .= "/" . join ('/', @$loc); } if (defined $sum and $sum) { return "$ret/$node/$plugin-$scale-sum.png"; } elsif (defined $scale) { return "$ret/$node/$plugin-$scale.png"; } else { return "$ret/$node/$plugin.png"; } } sub munin_path_to_loc { my $path = shift; my $result = undef; if ($path =~ /^\s*([^:]+):(\S+)\s*$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); $result = [@leftarr, @rightarr]; } elsif ($path =~ /^\s*([^;:\.]+)\s*$/) { $result = [$1]; } elsif ($path =~ /^\s*(.+)\.([^\.:;]+)$/) { my ($leftstring, $rightstring) = ($1, $2); my @leftarr = split (/;/, $leftstring); my @rightarr = split (/\./, $rightstring); $result = [@leftarr, @rightarr]; } elsif ($path =~ /^\s*(\S+)\s*$/) { my @leftarr = split (/;/, $1); $result = [@leftarr]; } else { ERROR "[ERROR] munin_path_to_loc: Malformatted variable path \"$path\"."; } if (!defined $result) { ERROR "[ERROR] munin_path_to_loc: Failed converting \"$path\"."; } return $result; } sub munin_get_keypath { my $hash = shift; my $asfile = shift || ''; my @group = (); my $host = 0; my @service = (); my $i = $hash; while (ref ($i) eq "HASH") { # Not sure when a #%#name node can go missing my $name = $i->{'#%#name'} || '*BUG*'; goto gotoparent if $name eq '*BUG*'; last if $name eq 'root'; if ($host) { # Into group land now unshift(@group,$name); } else { # In service land, working towards host. # If i or my parent has a graph_title we're still working with services if (defined $i->{'#%#parent'}{graph_title} or defined $i->{graph_title}) { $name =~ s/-/_/g; # can't handle dashes in service or below unshift(@service,$name); } else { $host = 1; unshift(@group,$name); } } gotoparent: $i=$i->{'#%#parent'}; } if ($asfile) { return (shift @group).'/'.join('/',@group).'-'.join('-',@service); } else { return join(';',@group).':'.join('.',@service); } } sub munin_get_filename { my $hash = shift; my $loc = munin_get_keypath ($hash,1); my $ret = munin_get ($hash, "dbdir"); if (!defined $loc or !defined $ret) { return; } return ($ret . "/$loc-" . lc substr (munin_get($hash, "type", "GAUGE"), 0,1). ".rrd"); } sub munin_get_bool { my $hash = shift; my $field = shift; my $default = shift; my $ans = munin_get ($hash, $field, $default); return if not defined $ans; if ($ans =~ /^yes$/i or $ans =~ /^true$/i or $ans =~ /^on$/i or $ans =~ /^enable$/i or $ans =~ /^enabled$/i ) { return 1; } elsif ($ans =~ /^no$/i or $ans =~ /^false$/i or $ans =~ /^off$/i or $ans =~ /^disable$/i or $ans =~ /^disabled$/i ) { return 0; } elsif ($ans !~ /\D/) { return $ans; } else { return $default; } } sub munin_get_bool_val { my $field = shift; my $default = shift; if (!defined $field) { if (!defined $default) { return 0; } else { return $default; } } if ($field =~ /^yes$/i or $field =~ /^true$/i or $field =~ /^on$/i or $field =~ /^enable$/i or $field =~ /^enabled$/i ) { return 1; } elsif ($field =~ /^no$/i or $field =~ /^false$/i or $field =~ /^off$/i or $field =~ /^disable$/i or $field =~ /^disabled$/i ) { return 0; } elsif ($field !~ /\D/) { return $field; } else { return; } } sub munin_get { my ($hash, $field, $default) = @_; # Iterate to top if needed do { return $default if (ref ($hash) ne "HASH"); my $hash_field = $hash->{$field}; return $hash_field if (defined $hash_field && ref($hash_field) ne "HASH"); # Go up $hash = $hash->{'#%#parent'}; } while (defined $hash); return $default; } sub munin_copy_node_toloc { my $from = shift; my $to = shift; my $loc = shift; return unless defined $from and defined $to and defined $loc; if (ref ($from) eq "HASH") { foreach my $key (keys %$from) { next if substr($key,0,3) eq '#%#'; if (ref ($from->{$key}) eq "HASH") { munin_copy_node_toloc ($from->{$key}, $to, [@$loc, $key]); } else { munin_set_var_loc ($to, [@$loc, $key], $from->{$key}); } } } else { $to = $from; } return $to; } sub munin_copy_node { my $from = shift; my $to = shift; if (ref ($from) eq "HASH") { foreach my $key (keys %$from) { if (ref ($from->{$key}) eq "HASH") { # Easier to do with the other copy function munin_copy_node_toloc ($from->{$key}, $to, [$key]); } else { munin_set_var_loc ($to, [$key], $from->{$key}); } } } else { $to = $from; } return $to; } sub munin_node_status { my ($config, $limits, $domain, $node, $check_draw) = @_; my $state = "ok"; return unless defined $config->{domain}->{$domain}->{node}->{$node}; my $snode = $config->{domain}->{$domain}->{node}->{$node}; foreach my $service (keys %{$snode}) { my $fres = munin_service_status ($config, $limits, $domain, $node, $service, $check_draw); if (defined $fres) { if ($fres eq "critical") { $state = $fres; last; } elsif ($fres eq "warning") { $state = $fres; } } } return $state; } sub munin_category_status { my $hash = shift || return; my $limits = shift || return; my $category = shift || return; my $check_draw = 1; my $state = "ok"; return unless (defined $hash and ref ($hash) eq "HASH"); foreach my $service (@{munin_get_children ($hash)}) { next if (!defined $service or ref ($service) ne "HASH"); next if (!defined $service->{'graph_title'}); next if ($category ne munin_get ($service, "graph_category", "other")); next if ($check_draw and not munin_get_bool ($service, "graph", 1)); my $fres = munin_service_status ($service, $limits, $check_draw); if (defined $fres) { if ($fres eq "critical") { $state = $fres; last; } elsif ($fres eq "warning") { $state = $fres; } elsif ($fres eq "unknown" and $state eq "ok") { $state = $fres; } } } return $state; } sub munin_service_status { my ($config, $limits, $check_draw) = @_; my $state = "ok"; return unless defined $config; for my $fieldnode (@{munin_find_field ($config, "label")}) { my $field = munin_get_node_name ($fieldnode); my $fres = munin_field_status ($fieldnode, $limits, $check_draw); if (defined $fres) { if ($fres eq "critical") { $state = $fres; last; } elsif ($fres eq "warning") { $state = $fres; } } } return $state; } sub munin_field_status { my ($hash, $limits, $check_draw) = @_; my $state = "ok"; # Return undef if nagios is turned off, or the field doesn't have any limits if ((!defined munin_get ($hash, "warning", undef)) and (!defined munin_get ($hash, "critical"))) { return; } if (!defined $check_draw or !$check_draw or munin_draw_field ($hash)) { my $loc = munin_get_node_loc ($hash); my $node = munin_get_node ($limits, $loc); return $node->{"state"} || "ok"; } return $state; } sub munin_graph_column_headers { my ($config, $domain, $node, $serv) = @_; my $ret = 0; my @fields = (); foreach my $field (keys %{$config->{domain}->{$domain}->{node}->{$node}->{client}->{$serv}}) { if ($field =~ /^([^\.]+)\.negative$/ and munin_draw_field ($config->{domain}->{$domain}->{node}->{$node}, $serv, $1)) { return 1; } elsif ($field =~ /^([^\.]+)\.label$/ and munin_draw_field ($config->{domain}->{$domain}->{node}->{$node}, $serv, $1)) { push @fields, $1; } } return 1 if (munin_get_max_label_length ($config->{'domain'}->{$domain}->{'node'}->{$node}, $config, $domain, $node, $serv, \@fields) > 20); return $ret; } sub munin_get_max_label_length { my $service = shift; my $order = shift; my $result = 0; my $tot = munin_get ($service, "graph_total"); for my $field (@$order) { my $path = undef; (my $f = $field) =~ s/=.+//; next if (!munin_get_bool ($service->{$f}, "process", 1)); next if (munin_get_bool ($service->{$f}, "skipdraw", 0)); next if (!munin_get_bool ($service->{$f}, "graph", 1)); my $len = length (munin_get ($service->{$f}, "label") || $f); if ($result < $len) { $result = $len; } } if (defined $tot and length $tot > $result) { $result = length $tot; } return $result; } sub munin_get_field_order { my $hash = shift; my $result = []; return if !defined $hash or ref($hash) ne "HASH"; my $order = munin_get ($hash, "graph_order"); if (defined $hash->{graph_sources}) { foreach my $gs (split /\s+/, $hash->{'graph_sources'}) { push (@$result, "-".$gs); } } if (defined $order) { push (@$result, split /\s+/, $order); } for my $fieldnode (@{munin_find_field ($hash, "label")}) { my $fieldname = munin_get_node_name ($fieldnode); push @$result,$fieldname if !grep m[^\Q$fieldname\E(?:=|$)], @$result; } for my $fieldnode (@{munin_find_field ($hash, "stack")}) { my $fieldname = munin_get_node_name ($fieldnode); push @$result,$fieldname if !grep m[^\Q$fieldname\E(?:=|$)], @$result;; } # We have seen some occurances of redundance in the graph_order # due to plugin bugs and so on. This make process_service # generate rrd commands with multiple definitions of the same # data. SO: Make sure there is no redundance in the order. my %seen = (); my $nresult = []; for my $field (@$result) { next if exists($seen{$field}); push @$nresult, $field; $seen{$field}=1; } return $nresult; } sub munin_get_rrd_filename { my $field = shift; my $path = shift; my $result = undef; # Bail out on bad input data return if !defined $field or ref ($field) ne "HASH"; # If the field has a .filename setting, use it if ($result = munin_get ($field, "filename")) { return $result; } # Handle custom paths (used in .sum, .stack, graph_order, et al) if (defined $path and length $path) { my $sourcenode = munin_get_node_partialpath ($field, $path); $result = munin_get_filename ($sourcenode); for my $f (@COPY_FIELDS) { if (not exists $field->{$f} and exists $sourcenode->{$f}) { DEBUG "DEBUG: Copying $f...\n"; munin_set_var_loc ($field, [$f], $sourcenode->{$f}); } } } else { $result = munin_get_filename ($field); } return $result; } sub munin_mkdir_p { my ($dirname, $umask) = @_; eval { mkpath($dirname, 0, $umask); }; return if $EVAL_ERROR; return 1; } sub exit_if_run_by_super_user { if ($EFFECTIVE_USER_ID == 0) { print qq{This program will easily break if you run it as root as you are trying now. Please run it as user '$Munin::Common::Defaults::MUNIN_USER'. The correct 'su' command on many systems is 'su - munin --shell=/bin/bash' Aborting. }; exit 1; } } sub print_version_and_exit { print qq{munin version $Munin::Common::Defaults::MUNIN_VERSION. Copyright (C) 2002-2009 Jimmy Olsen, Audun Ytterdal, Tore Andersson, Kjell-Magne Øierud, Nicolai Langfeldt, Linpro AS, Redpill Linpro AS and others. This is free software released under the GNU General Public License. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, please refer to the file COPYING that is included with this software or refer to http://www.fsf.org/licensing/licenses/gpl.txt }; exit 0; } sub look_for_child { # wait for child process in blocking or non-blocking mode. my ($block) = @_; my $pid; if ($block) { $pid = waitpid(-1, 0); } else { $pid = waitpid(-1, WNOHANG); if ($pid == 0) { return 0; } } if ($pid < 0) { ERROR "[ERROR] Unexpectedly ran out of children: $!"; croak "[ERROR] Ran out of children: $!\n"; } if ($? != 0) { WARN "[WARNING] Child $pid failed: " . ($? << 8) . "(signal " . ($? & 0xff) . ")"; } return 1; } sub wait_for_remaining_children { my ($running) = @_; while ($running > 0) { look_for_child("block"); --$running; } return $running; } sub munin_has_subservices { my ($hash) = @_; return 0 unless defined $hash; # Only services (which again require graph_title) can have subservices return 0 unless defined $hash->{'graph_title'}; if (!defined $hash->{'#%#has_subservices'}) { $hash->{'#%#has_subservices'} = scalar (grep $_, map { ref($hash->{$_}) eq "HASH" and $_ ne '#%#parent' and defined $hash->{$_}->{'graph_title'} ? 1 : undef } keys %$hash); } return $hash->{'#%#has_subservices'}; } sub munin_get_host_path_from_string { # splits a host definition, as used in the config, into a group array and a host name my $key = shift; my (@groups) = split(';', $key); my $host = pop(@groups); if(scalar @groups > 0){ } else { my @groups = split('.', $key); if(scalar @groups > 1){ @groups = ($groups[0]); } } return (\@groups, $host); } 1; __END__ =head1 NAME Munin::Master::Utils - Exports a lot of utility functions. =head1 SYNOPSIS use Munin::Master::Utils; =head1 SUBROUTINES =over =item B Gets current status of a category. Parameters: - $hash: A ref to the hash node whose children to check - $limits: A ref to the root node of the limits tree - $category: The category to review - $check_draw: [optional] Ignore undrawn fields Returns: - Success: The status of the field - Failure: undef =item B Read configuration file, include dir files, and initialize important default values that are optional. Parameters: - $file: munin.conf filename. If omitted, default filename is used. Returns: - Success: The $config hash (also cached in module) =item B Copy hash node. Parameters: - $from: Hash node to copy - $to: Where to copy it to Returns: - Success: $to - Failure: undef =item B Copy hash node at. Parameters: - $from: Hash node to copy - $to: Where to copy it to - $loc: Path to node under $to Returns: - Success: $to - Failure: undef =item B =item B =item B Check whether a field will be visible in the graph or not. Parameters: - $hash: A ref to the hash node for the field Returns: - Success: Boolean; true if field will be graphed, false if not - Failure: undef =item B Gets current status of a field. Parameters: - $hash: A ref to the field hash node - $limits: A ref to the root node of the limits tree - $check_draw: [optional] Ignore undrawn fields Returns: - Success: The status of the field - Failure: undef =item B Search a hash to find hash nodes with $field defined. Parameters: - $hash: A hash ref to search - $field: The name of the field to search for, or a regex - $avoid: [optional] Stop traversing further down if this field is found Returns: - Success: A ref to an array of the hash nodes containing $field. - Failure: undef =item B Get variable. Parameters: - $hash: Ref to hash node - $field: Name of field to get - $default: [optional] Value to return if $field isn't set Returns: - Success: field contents - Failure: $default if defined, else undef =item B Get boolean variable. Parameters: - $hash: Ref to hash node - $field: Name of field to get - $default: [optional] Value to return if $field isn't set Returns: - Success: 1 or 0 (true or false) - Failure: $default if defined, else undef =item B =item B Get all child hash nodes. Parameters: - $hash: A hash ref to the parent node Returns: - Success: A ref to an array of the child nodes - Failure: undef =item B Get the field order in a graph. Parameters: - $hash: A hash ref to the service Returns: - Success: A ref to an array of the field names - Failure: undef =item B Get rrd filename for a field, without any bells or whistles. Used by munin-update to figure out which file to update. Parameters: - $hash: Ref to hash field Returns: - Success: Full path to rrd file - Failure: undef =item B Get the full path-name of an html file. Parameters: - $hash: A ref to the service hash node Returns: - Success: The file name with full path - Failure: undef =item B Get the length of the longest label in a graph. Parameters: - $hash: the graph in question - $order: A ref to an array of fields (graph_order) Returns: - Success: The length of the longest label in the graph - Failure: undef =item B Gets a node by loc. Parameters: - $hash: A ref to the hash to set the variable in - $loc: A ref to an array with the full path of the node Returns: - Success: The node ref found by $loc - Failure: undef =item B Get location array for hash node. Parameters: - $hash: A ref to the node Returns: - Success: Ref to an array with the full path of the variable - Failure: undef =item B Return the name of the hash node supplied. Parameters: - $hash: A ref to the hash node Returns: - Success: The name of the node =item B Gets a node from a partial path. Parameters: - $hash: A ref to the "current" location in the hash tree - $var: A path string with relative location (from the $hash). Returns: - Success: The node - Failure: undef =item B Get parent node of a hash. Parameters: - $hash: A ref to the node Returns: - Success: Ref to an parent - Failure: undef =item B Return the name of the parent of the hash node supplied Parameters: - $hash: A ref to the hash node Returns: - Success: The name of the parent node - Failure: If no parent node exists, "none" is returned. =item B Get the full path+name of a picture file. Parameters: - $hash: A ref to the service hash node - $scale: [optional] The scale (day, week, year, month) - $sum: [optional] Boolean value, whether it's a sum graph or not. Returns: - Success: The file name with full path - Failure: undef =item B Get location array for hash node for picture purposes. Differs from munin_get_node_loc in that it honors #%#origin metadata Parameters: - $hash: A ref to the node Returns: - Success: Ref to an array with the full path of the variable - Failure: undef =item B Get the root node of the hash tree. Parameters: - $hash: A hash node to traverse up from Returns: - Success: A ref to the root hash node - Failure: undef =item B Get the name of the rrd file corresponding to a field. Checks for lots of bells and whistles. This function is the correct one to use when figuring out where to fetch data from. Parameters: - $field: The hash object of the field - $path: [optional] The path to the field (as given in graph_order/sum/stack/et al) Returns: - Success: A string with the filename of the rrd file - Failure: undef =item B Copy a node to a separate node without "specials". Parameters: - $hash: The node to copy Returns: - Success: A ref to a new node without "#%#"-fields - Failure: undef =item B =item B =item B =item B munin_has_subservices($hash); Checks whether the service represented by $hash has subservices (multigraph), and returns the result. Parameters: - $hash: Hash reference pointing to a service Returns: - true: if the hash is indeed a service, and said service has got subservices - false: otherwise =item B munin_mkdir_p('/a/path/', oct('777')); Make a directory and recursively any nonexistent directory in the path to it. =item B =item B =item B Take contents of one config-namespace and replace/insert the instances needed. =item B =item B Returns a loc array from a path string. Parameters: - $path: A path string Returns: - Success: A ref to an array with the loc - Failure: undef =item B Read a partial configuration Parameters: - $what: name of the part that should be loaded (datafile or limits) Returns: - Success: a $config with the $specified part, but overwritten by $config =item B =item B =item B Gets current status of a service. Parameters: - $hash: A ref to the field hash node - $limits: A ref to the root node of the limits tree - $check_draw: [optional] Ignore undrawn fields Returns: - Success: The status of the field - Failure: undef =item B Sets a variable in a hash. Parameters: - $hash: A ref to the hash to set the variable in - $var: The name of the variable - $val: The value to set the variable to Returns: - Success: The $hash we were handed - Failure: undef =item B Sets a variable in a hash. Parameters: - $hash: A ref to the hash to set the variable in - $loc: A ref to an array with the full path of the variable - $val: The value to set the variable to Returns: - Success: The $hash we were handed - Failure: undef =item B Sets a variable in a hash. Parameters: - $hash: A ref to the hash to set the variable in - $var: A string with the full path of the variable - $val: The value to set the variable to Returns: - Success: The $hash we were handed - Failure: The $hash we were handed =item B =item B =back =head1 COPYING Copyright (C) 2003-2007 Jimmy Olsen, Audun Ytterdal This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. =cut # vim: syntax=perl ts=8 munin-2.0.25/master/lib/Munin/Master/Worker.pm000066400000000000000000000017421243472346000211300ustar00rootroot00000000000000package Munin::Master::Worker; # $Id$ use warnings; use strict; use Scalar::Util qw(refaddr); use overload q{""} => 'to_string'; sub new { my ($class, $identity) = @_; my $self = bless {}, $class; $identity = refaddr($self) unless defined $identity; $self->{ID} = $identity; return $self; } sub to_string { my ($self) = @_; return sprintf("%s<%s>", ref $self, $self->{ID}); } 1; __END__ =head1 NAME Munin::Master::Worker - Abstract base class for workers. =head1 SYNOPSIS See L. =head1 METHODS =over =item B Munin::Master::Worker->new($identity); Constructor. This is an abstract class, so this shouldn't be called directly. The optional $identity argument should be a unique identifier for the process. =item B print $worker->string; # Stringifies too print "Worker $worker just died"; Returns a unique string representation of the worker. =back =cut # vim: ts=4 : sw=4 : et munin-2.0.25/master/munin.conf.in000066400000000000000000000117631243472346000166400ustar00rootroot00000000000000# Example configuration file for Munin, generated by 'make build' # The next three variables specifies where the location of the RRD # databases, the HTML output, logs and the lock/pid files. They all # must be writable by the user running munin-cron. They are all # defaulted to the values you see here. # #dbdir @@DBDIR@@ #htmldir @@HTMLDIR@@ #logdir @@LOGDIR@@ #rundir @@STATEDIR@@ # Where to look for the HTML templates # #tmpldir @@CONFDIR@@/templates # Where to look for the static www files # #staticdir @@CONFDIR@@/static # temporary cgi files are here. note that it has to be writable by # the cgi user (usually nobody or httpd). # # cgitmpdir @@DBDIR@@/cgi-tmp # (Exactly one) directory to include all files from. includedir @@CONFDIR@@/munin-conf.d # You can choose the time reference for "DERIVE" like graphs, and show # "per minute", "per hour" values instead of the default "per second" # #graph_period second # Graphics files are generated either via cron or by a CGI process. # See http://munin-monitoring.org/wiki/CgiHowto2 for more # documentation. # Since 2.0, munin-graph has been rewritten to use the cgi code. # It is single threaded *by design* now. # #graph_strategy cron # munin-cgi-graph is invoked by the web server up to very many times at the # same time. This is not optimal since it results in high CPU and memory # consumption to the degree that the system can thrash. Again the default is # 6. Most likely the optimal number for max_cgi_graph_jobs is the same as # max_graph_jobs. # #munin_cgi_graph_jobs 6 # If the automatic CGI url is wrong for your system override it here: # #cgiurl_graph /munin-cgi/munin-cgi-graph # max_size_x and max_size_y are the max size of images in pixel. # Default is 4000. Do not make it too large otherwise RRD might use all # RAM to generate the images. # #max_size_x 4000 #max_size_y 4000 # HTML files are normally generated by munin-html, no matter if the # files are used or not. You can change this to on-demand generation # by following the instructions in http://munin-monitoring.org/wiki/CgiHowto2 # # Notes: # - moving to CGI for HTML means you cannot have graph generated by cron. # - cgi html has some bugs, mostly you still have to launch munin-html by hand # #html_strategy cron # munin-update runs in parallel. # # The default max number of processes is 16, and is probably ok for you. # # If set too high, it might hit some process/ram/filedesc limits. # If set too low, munin-update might take more than 5 min. # # If you want munin-update to not be parallel set it to 0. # #max_processes 16 # RRD updates are per default, performed directly on the rrd files. # To reduce IO and enable the use of the rrdcached, uncomment it and set it to # the location of the socket that rrdcached uses. # #rrdcached_socket /var/run/rrdcached.sock # Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime # something changes (OK -> WARNING, CRITICAL -> OK, etc) #contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm #contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm # # For those with Nagios, the following might come in handy. In addition, # the services must be defined in the Nagios server as well. #contact.nagios.command /usr/bin/send_nsca nagios.host.comm -c /etc/nsca.conf # a simple host tree [@@HOSTNAME@@] address 127.0.0.1 use_node_name yes # # A more complex example of a host tree # ## First our "normal" host. # [fii.foo.com] # address foo # ## Then our other host... # [fay.foo.com] # address fay # ## IPv6 host. note that the ip adress has to be in brackets # [ip6.foo.com] # address [2001::1234:1] # ## Then we want totals... # [foo.com;Totals] #Force it into the "foo.com"-domain... # update no # Turn off data-fetching for this "host". # # # The graph "load1". We want to see the loads of both machines... # # "fii=fii.foo.com:load.load" means "label=machine:graph.field" # load1.graph_title Loads side by side # load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load # # # The graph "load2". Now we want them stacked on top of each other. # load2.graph_title Loads on top of each other # load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load # load2.dummy_field.draw AREA # We want area instead the default LINE2. # load2.dummy_field.label dummy # This is needed. Silly, really. # # # The graph "load3". Now we want them summarised into one field # load3.graph_title Loads summarised # load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load # load3.combined_loads.label Combined loads # Must be set, as this is # # not a dummy field! # ## ...and on a side note, I want them listen in another order (default is ## alphabetically) # # # Since [foo.com] would be interpreted as a host in the domain "com", we # # specify that this is a domain by adding a semicolon. # [foo.com;] # node_order Totals fii.foo.com fay.foo.com # munin-2.0.25/master/static/000077500000000000000000000000001243472346000155155ustar00rootroot00000000000000munin-2.0.25/master/static/definitions.html000066400000000000000000000047621243472346000207270ustar00rootroot00000000000000 Munin :: definitions
FieldTypeWarnCrit

Definition of terms used in Munin

Data types:

– Gauge A data source of type gauge shows the state of the data source at the exact moment that Munin is run (every 5 minutes). Any peaks in-between data gatherings, will not be in the graph.
– Counter A data source of type counter shows the state of the data source as an average between two plots (i.e. 5 minutes). Short peaks will therefore be hard to spot, but long peaks will be spottable, even though it occurs between plots.
– Derive For the purposes of viewing data, the derive type works the same way as a counter
– Absolute Absolute works much as a counter, with the exception that it is assumed that the counter value is set to 0 upon each read of it. It's not a good idea to run these plugins by hand in-between Munin runs, since Munin won't receive all the data it expects.

Munin
munin-2.0.25/master/static/dynazoom.html000066400000000000000000000151021243472346000202420ustar00rootroot00000000000000
Zooming is very easy, it's done in 3 clicks (regular clicks, no drag&drop):
  • First click to define the start of zoom.
  • Second click to define the ending of zoom.
  • Third click inside the defined zone to zoom, outside to cancel the zone.
Plugin Name (domain/hostname/plugin_name) :
Start/Stop of the graph
(format:2005-08-15T15:52:01+0000)
(epoch) :
/
( / )
Limit low/high : /
Graph size (w/o legend) (pixels): /
munin-2.0.25/master/static/favicon.ico000066400000000000000000000037761243472346000176530ustar00rootroot00000000000000)<č()x ˙˙˙UUU˙ŞŞŞ @!! !!@!! !@B@! ! !  @!! !B@$! $@"! @! @B! @A@!  @! @@! @! !$!!!!!BA33113313333313333333333333331331313333333333133"313313111 !"""!B@!@"DDB""@   D D@Aomunin-2.0.25/master/static/formatdate.js000066400000000000000000000306501243472346000202050ustar00rootroot00000000000000// formatDate : // a PHP date like function, for formatting date strings // authored by Svend Tofte // the code is in the public domain // // see http://www.svendtofte.com/javascript/javascript-date-string-formatting/ // and http://www.php.net/date // // thanks to // - Daniel Berlin , // major overhaul and improvements // - Matt Bannon, // correcting some stupid bugs in my days-in-the-months list! // - levon ghazaryan. pointing out an error in z switch. // - Andy Pemberton. pointing out error in c switch // // input : format string // time : epoch time (seconds, and optional) // // if time is not passed, formatting is based on // the current "this" date object's set time. // // supported switches are // a, A, B, c, d, D, F, g, G, h, H, i, I (uppercase i), j, l (lowecase L), // L, m, M, n, N, O, P, r, s, S, t, U, w, W, y, Y, z, Z // // unsupported (as compared to date in PHP 5.1.3) // T, e, o Date.prototype.formatDate = function (input,time) { var daysLong = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var daysShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var switches = { // switches object a : function () { // Lowercase Ante meridiem and Post meridiem return date.getHours() > 11? "pm" : "am"; }, A : function () { // Uppercase Ante meridiem and Post meridiem return (this.a().toUpperCase ()); }, B : function (){ // Swatch internet time. code simply grabbed from ppk, // since I was feeling lazy: // http://www.xs4all.nl/~ppk/js/beat.html var off = (date.getTimezoneOffset() + 60)*60; var theSeconds = (date.getHours() * 3600) + (date.getMinutes() * 60) + date.getSeconds() + off; var beat = Math.floor(theSeconds/86.4); if (beat > 1000) beat -= 1000; if (beat < 0) beat += 1000; if ((String(beat)).length == 1) beat = "00"+beat; if ((String(beat)).length == 2) beat = "0"+beat; return beat; }, c : function () { // ISO 8601 date (e.g.: "2004-02-12T15:19:21+00:00"), as per // http://www.cl.cam.ac.uk/~mgk25/iso-time.html return (this.Y() + "-" + this.m() + "-" + this.d() + "T" + this.H() + ":" + this.i() + ":" + this.s() + this.P()); }, d : function () { // Day of the month, 2 digits with leading zeros var j = String(this.j()); return (j.length == 1 ? "0"+j : j); }, D : function () { // A textual representation of a day, three letters return daysShort[date.getDay()]; }, F : function () { // A full textual representation of a month return monthsLong[date.getMonth()]; }, g : function () { // 12-hour format of an hour without leading zeros, 1 through 12! if (date.getHours() == 0) { return 12; } else { return date.getHours()>12 ? date.getHours()-12 : date.getHours(); } }, G : function () { // 24-hour format of an hour without leading zeros return date.getHours(); }, h : function () { // 12-hour format of an hour with leading zeros var g = String(this.g()); return (g.length == 1 ? "0"+g : g); }, H : function () { // 24-hour format of an hour with leading zeros var G = String(this.G()); return (G.length == 1 ? "0"+G : G); }, i : function () { // Minutes with leading zeros var min = String (date.getMinutes ()); return (min.length == 1 ? "0" + min : min); }, I : function () { // Whether or not the date is in daylight saving time (DST) // note that this has no bearing in actual DST mechanics, // and is just a pure guess. buyer beware. var noDST = new Date ("January 1 " + this.Y() + " 00:00:00"); return (noDST.getTimezoneOffset () == date.getTimezoneOffset () ? 0 : 1); }, j : function () { // Day of the month without leading zeros return date.getDate(); }, l : function () { // A full textual representation of the day of the week return daysLong[date.getDay()]; }, L : function () { // leap year or not. 1 if leap year, 0 if not. // the logic should match iso's 8601 standard. // http://www.uic.edu/depts/accc/software/isodates/leapyear.html var Y = this.Y(); if ( (Y % 4 == 0 && Y % 100 != 0) || (Y % 4 == 0 && Y % 100 == 0 && Y % 400 == 0) ) { return 1; } else { return 0; } }, m : function () { // Numeric representation of a month, with leading zeros var n = String(this.n()); return (n.length == 1 ? "0"+n : n); }, M : function () { // A short textual representation of a month, three letters return monthsShort[date.getMonth()]; }, n : function () { // Numeric representation of a month, without leading zeros return date.getMonth()+1; }, N : function () { // ISO-8601 numeric representation of the day of the week var w = this.w(); return (w == 0 ? 7 : w); }, O : function () { // Difference to Greenwich time (GMT) in hours var os = Math.abs(date.getTimezoneOffset()); var h = String(Math.floor(os/60)); var m = String(os%60); h.length == 1? h = "0"+h:1; m.length == 1? m = "0"+m:1; return date.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m; }, P : function () { // Difference to GMT, with colon between hours and minutes var O = this.O(); return (O.substr(0, 3) + ":" + O.substr(3, 2)); }, r : function () { // RFC 822 formatted date var r; // result // Thu , 21 Dec 2000 r = this.D() + ", " + this.d() + " " + this.M() + " " + this.Y() + // 16 : 01 : 07 0200 " " + this.H() + ":" + this.i() + ":" + this.s() + " " + this.O(); return r; }, s : function () { // Seconds, with leading zeros var sec = String (date.getSeconds ()); return (sec.length == 1 ? "0" + sec : sec); }, S : function () { // English ordinal suffix for the day of the month, 2 characters switch (date.getDate ()) { case 1: return ("st"); case 2: return ("nd"); case 3: return ("rd"); case 21: return ("st"); case 22: return ("nd"); case 23: return ("rd"); case 31: return ("st"); default: return ("th"); } }, t : function () { // thanks to Matt Bannon for some much needed code-fixes here! var daysinmonths = [null,31,28,31,30,31,30,31,31,30,31,30,31]; if (this.L()==1 && this.n()==2) return 29; // ~leap day return daysinmonths[this.n()]; }, U : function () { // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) return Math.round(date.getTime()/1000); }, w : function () { // Numeric representation of the day of the week return date.getDay(); }, W : function () { // Weeknumber, as per ISO specification: // http://www.cl.cam.ac.uk/~mgk25/iso-time.html var DoW = this.N (); var DoY = this.z (); // If the day is 3 days before New Year's Eve and is Thursday or earlier, // it's week 1 of next year. var daysToNY = 364 + this.L () - DoY; if (daysToNY <= 2 && DoW <= (3 - daysToNY)) { return 1; } // If the day is within 3 days after New Year's Eve and is Friday or later, // it belongs to the old year. if (DoY <= 2 && DoW >= 5) { return new Date (this.Y () - 1, 11, 31).formatDate ("W"); } var nyDoW = new Date (this.Y (), 0, 1).getDay (); nyDoW = nyDoW != 0 ? nyDoW - 1 : 6; if (nyDoW <= 3) { // First day of the year is a Thursday or earlier return (1 + Math.floor ((DoY + nyDoW) / 7)); } else { // First day of the year is a Friday or later return (1 + Math.floor ((DoY - (7 - nyDoW)) / 7)); } }, y : function () { // A two-digit representation of a year var y = String(this.Y()); return y.substring(y.length-2,y.length); }, Y : function () { // A full numeric representation of a year, 4 digits // we first check, if getFullYear is supported. if it // is, we just use that. ppks code is nice, but wont // work with dates outside 1900-2038, or something like that if (date.getFullYear) { var newDate = new Date("January 1 2001 00:00:00 +0000"); var x = newDate .getFullYear(); if (x == 2001) { // i trust the method now return date.getFullYear(); } } // else, do this: // codes thanks to ppk: // http://www.xs4all.nl/~ppk/js/introdate.html var x = date.getYear(); var y = x % 100; y += (y < 38) ? 2000 : 1900; return y; }, z : function () { // The day of the year, zero indexed! 0 through 366 var s = "January 1 " + this.Y() + " 00:00:00 GMT" + this.O(); var t = new Date(s); var diff = date.getTime() - t.getTime(); return Math.floor(diff/1000/60/60/24); }, Z : function () { // Timezone offset in seconds return (date.getTimezoneOffset () * -60); } } function getSwitch(str) { if (switches[str] != undefined) { return switches[str](); } else { return str; } } var date; if (time) { var date = new Date (time); } else { var date = this; } var formatString = input.split(""); var i = 0; while (i < formatString.length) { if (formatString[i] == "%") { // this is our way of allowing users to escape stuff formatString.splice(i,1); } else { formatString[i] = getSwitch(formatString[i]); } i++; } return formatString.join(""); } // Some (not all) predefined format strings from PHP 5.1.1, which // offer standard date representations. // See: http://www.php.net/manual/en/ref.datetime.php#datetime.constants // // Atom "2005-08-15T15:52:01+00:00" Date.DATE_ATOM = "Y-m-d%TH:i:sP"; // ISO-8601 "2005-08-15T15:52:01+0000" Date.DATE_ISO8601 = "Y-m-d%TH:i:sO"; // RFC 2822 "Mon, 15 Aug 2005 15:52:01 +0000" Date.DATE_RFC2822 = "D, d M Y H:i:s O"; // W3C "2005-08-15 15:52:01+00:00" Date.DATE_W3C = "Y-m-d%TH:i:sP"; munin-2.0.25/master/static/logo-h.png000066400000000000000000000034021243472346000174070ustar00rootroot00000000000000‰PNG  IHDRs)!bgAMAą üabKGD˙˙˙ ˝§“ pHYs × ×B(›xtIMEŮ  J–&IDAThŢ͚ylTEÇ?łô€‚H ĽĹ ˆ‚ť(‡AT¤Šˆ)Tźˆ!`ä2¤Á`ƒ *hЈƢb""$‚(hB Â"¨@¤b0€EˆŇŇvÇ?Ţoa:}Ż{ôíŰý&M:ÇŰßźůÎď|ŁhŠŠ@5hŽ}=@žŃ×؟äoţ$żÇŁŔűÖmüʀ_Ź9•ŔKVŸ2ţϢŔuFßd`™ËšşËŢľ5ú†›ö(`] ň^ž6ځť\äĺťÍ}Čł&TŸűHäŕ8Đ%‰šł‡’˜w…EdИëAfŚp'p p"ŃÄP‚vŞ(Ÿ[YrŇş'xNC€öInfś ĺ,wj2“ZCŢM†™˜.ćä0°¨†Śđ[ č ôH0Ż0Ň2ĄA"n+>@Ł€6™"ó6` 0VüŃ"`PtjĹFMJ0§7p‘‹Ÿ |€úg‚ĚžŔ&`˘thgž*Ś$0™z‘後ůIf‘DrťĺÇ;ś‘ĽkNHM&w°(`y•~‘ů8P,ąČS>›€q㣁Â,úK€Ňýf>0˘5d^ěV‰fŞÝ(h!˘S9Bf[!4ČŔëţtÉě Ř7( 30Čęď”ĺÜŇk­–9*2/—<1[š°Řj÷I˛đ4îÚ(Ż Pž*™|( ¤Šs†Š˝¸Ô{Ţ ’ęłH`,ŐŔÄ'y:QŕĺFXŕŞ,o[–`ŒabˍąĂŔY$łĘjĹßZśíŔ?ňîZrížÉY#vš ću+pÚŞzbPk´ÝlŽâdvÖZ‘ ´X9çs\¨4)ŕˉbˆďŽűą"ĂÇg:Ś0ÝMŁ™KZHâ“éóK{Oßšhs\ćŤ9”–LąÖ9!ÊPiíGVń=çłŇ}ĆÂâÚŮüóu~“ŘîńâđÝÂç<{VLć9éO5?\ɅĎk&ŃżsˆĚŔI‰śΰźÓ$yĹňׄL›qě”(˛Úrěó™85ƒœ•Ă0çšÄ4Ăƀ੽M‚ä,Čą‚ANŠł<ŔâĘŕV/yy’'™6xÁăÇjqŽwĚvŰëb×ă'jO Ţ'yU‰ľq›s°´RČ *ÖX źî%/$fS‹Y'2"^*˘!˘)ˆhŽśÇ(łçśܤ“WĹ­Ĺ ŕˇ$sM€Z đ;𵗼 đF1Ş Ł*Ş@;dtąˆ,DŠßQaÍ⨯´Đň—áÜňóڇŔîŀĐ3^!ŕ3œŰŤ›ů)E×°fœŇ„´v"߸ö)Ĺ IiœśvňÁˆ?ąîŕ[+ o BÖĄ}Šš°ޑbFPĺĎ€C^ ‰2Ą "š‚m Š´˘ єˆĆöú+Eáůc­¨ Ç(ă~`)đ)°ř;çígFťĚąoŮMCΉúƒB#°ĹËgşš­)՚ZłCiú)M縆(E;ń˝#1†Ë“ J9š×Ž„c̤éOó/ É JrŠIižôNă}40¸[rłŽrˆ‡YĎŹJCN=Î]( vžĺ暐YúŹs=2ŁTÁBĽ¨QŠb­(ÓÎ €/"šiZ3IkökMŕŽHŒĺŔ^­9ŽŃ+cĐ.czT´ńB´Ţľ6Xă|ÚŤ3ő†5V ź–ŚŹŮBŰÄ(;59“łóFÍĚF'zœżKQŽą_)ţĂ)0#yNç3Ô ílÄ)Ľ¨ŽŽÇšż%ŞÎ×É™UŔ“Ŕ-V(_ââ'°§ŘOšÚš¸7Ŕ÷›ehhs2ĎâĚĹ<łoWˆ#ââřĘvń~¤&~Ą\Ö;Ř#7‹÷˝,ŐÖŕM)˘Ľëqî7'S˘ť^.ý­Aƒ‹Ďl””(Nr.Ü4H'€c†Ť¨mĄJs3΍űą8×O bFTĚíęRSVŢ_mśăßŰ{YﲞcFťŘŁČbžŰIyÇEf߸ťřť’ä†Đk¨IENDŽB`‚munin-2.0.25/master/static/logo.png000066400000000000000000000007311243472346000171640ustar00rootroot00000000000000‰PNG  IHDR)< UŽí0PLTEŞŞŞUUU˙˙˙˙˙˙˙˙˙˙˙˙ˇŘQ1bKGDˆH pHYs  ­#˝utIMEÔý}Žţ/IDATxœ•ÔąŇƒ ŕl°ńŞl˛É&ďáÂŤą•cÉOř+ŚCÓťýęĹ$(€˜áMq‰]R+\ťi!ƒ÷kŢ ‹p7U„Š–*óR˝fŚô‰C?âź¤ŻąąŠ“|O˜tÍÚő…¤kY]…űŚBZřśóÂ:­ĄVT AL˝ÂC9mW‹°mŔD !Dt8ŰRëŁ:ÔТ&úşi&Z§ғ´ž—”/­ç[ĎŽőŽő_+ž7MMý™†R‚´bĽkRű™˜ŰJ|cńgř9JœˇV…YgSŒ5EĺčMfŐhťŞťúŽŔއîpWŞŚ:VŰóśčŞIéŕ `hVŢŕlŔu=XĄžtŹq¨#ÍM=kĎkÚáŇşŒ6fV{ik§fř¸ëy˛#<5ăIENDŽB`‚munin-2.0.25/master/static/querystring.js000066400000000000000000000021231243472346000204450ustar00rootroot00000000000000/* Client-side access to querystring name=value pairs Version 1.3 28 May 2008 License (Simplified BSD): http://adamv.com/dev/javascript/qslicense.txt */ function Querystring(qs) { // optionally pass a querystring to parse this.params = {}; var query_string = window.location.search; if (qs == null) qs = query_string.substring(1, query_string.length); if (qs.length == 0) return; // Turn back to // See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1 qs = qs.replace(/\+/g, ' '); var args = qs.split('&'); // parse out name/value pairs separated via & // split out each name=value pair for (var i = 0; i < args.length; i++) { var pair = args[i].split('='); var name = decodeURIComponent(pair[0]); var value = (pair.length==2) ? decodeURIComponent(pair[1]) : name; this.params[name] = value; } } Querystring.prototype.get = function(key, default_) { var value = this.params[key]; return (value != null) ? value : default_; } Querystring.prototype.contains = function(key) { var value = this.params[key]; return (value != null); } munin-2.0.25/master/static/style-1.2.css000066400000000000000000000070431243472346000176710ustar00rootroot00000000000000body, h1, h2, h3, p, span, div { font-family: verdana, helvetica, arial, sans-serif; font-size: small; } body { background-color: #ffffff; color: #000000; } h3.nobottom { margin-top: 20px; margin-bottom: 0px; } div.logo { background-image: url(logo.png); background-repeat: no-repeat; width: 41px; height: 59px; } div.lighttext { background-color: #ffffff; color: #777777; font-style: italic; } .domain { font-size: medium; font-weight: bold; } .host { font-weight: bold; } .service { font-size: x-small; font-weight: bold; } .center { text-align: center; } .small { font-size: smaller; } .noborder { border-width: 0px; border-collapse: collapse; } table.largeinvisiblebox { border-width: thin; border-top: 0px; border-bottom: 0px; border-left: 0px; border-right: 0px; border-color: #999; border-style: solid; padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; white-space: nowrap; max-width: 90%; width: 80%; } table.invisiblebox { border-width: thin; border-top: 0px; border-bottom: 0px; border-left: 0px; border-right: 0px; border-color: #999; border-style: solid; padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; white-space: nowrap; width: 1%; } td.graphbox { border-width: thin; border-top: 1px; border-bottom: 1px; border-left: 1px; border-right: 1px; border-color: #999; border-style: solid; padding: 4px 4px 4px 4px; margin: 0px 0px 0px 0px; white-space: nowrap; width: 100%; } .box { border-width: thin; border-top: 1px; border-bottom: 1px; border-left: 1px; border-right: 1px; border-color: #999; border-style: solid; padding: 4px 4px 4px 4px; margin: 2px 2px 2px 2px; text-align: left; width: 80%; max-width: 90% } td.legendbox { border-width: thin; border-top: 1px; border-bottom: 1px; border-left: 1px; border-right: 1px; border-color: #999; border-style: solid; padding: 8px 4px 2px 2px; margin: 2px 2px 2px 2px; text-align: left; width: 100%; } td.wrap { white-space: normal; max-width: 1%; } td.linkbox { border-width: thin; border-top: 1px; border-bottom: 1px; border-left: 1px; border-right: 1px; border-color: #999; border-style: solid; padding: 4px 4px 4px 4px; margin: 2px 2px 2px 2px; width: 100%; white-space: normal; } .warntext { font-weight: bold; background-color: #cccc00; } .crittext { font-weight: bold; background-color: #ff6f22; } .ruler { background-color: #999999; border: 0px; height: 1px; } .ruler2 { background-color: #999999; border: 0px; height: 2px; } a.meek:link { color: #486aaf; font-size: small; } a.meek:visited { color: #af1a00; font-size: small; } a.meek:active { color: #486aaf; font-size: small; } a.meek:hover { color: #999999; font-size: small; } a.warn:link { color: #cc9900; } a.warn:visited { color: #cc9900; } a.warn:active { color: #cc9900; } a.warn:hover { color: #cc9900; } a.crit:link { color: #cc0000; } a.crit:visited { color: #cc0000; } a.crit:active { color: #cc0000; } a.crit:hover { color: #cc0000; } a:link { color: #486aaf; } a:visited { color: #486aaf; } a:active { color: #486aaf; } a:hover { color: #486aaf; } munin-2.0.25/master/static/style-new.css000066400000000000000000000077211243472346000201650ustar00rootroot00000000000000/* Overall layout */ html, body { margin: 0; padding: 0; height: 100%; background: #fdfdfd; font-size: 90%; } select { border: 1px solid #d1d1d1; } body, h1, h2, h3, p, span, div { font-family: "vera sans","dejavu sans",helvetica,verdana,arial,sans-serif; color: #666666; } h3 { margin-top: 1em; margin-bottom: 0px; font-size: 110%; letter-spacing: 0.05em; margin-left: 0px; padding-left: 10px; padding-bottom: 0px; padding-top: 0px; text-decoration: underline; } a:link, a:visited, a:link:active, a:link:hover { color: #486aaf; text-decoration: none; } a:link:hover { text-decoration: underline;} .warntext { font-weight: bold; background-color: #cccc00; padding: 0px; margin: -1px; border: 1px solid #b9b900; } .crittext { font-weight: bold; background-color: #ff6f22; padding: 0px; margin: -1px; border: 1px solid #f16722; } a.unkn:link { color: #ffaa00; } a.unkn:visited { color: #ffaa00; } a.unkn:active { color: #ffaa00; } a.unkn:hover { color: #ffaa00; } a.warn:link { color: #ffd300; } a.warn:visited { color: #ffd300; } a.warn:active { color: #ffd300; } a.warn:hover { color: #ffd300; } a.crit:link { color: #ff0000; } a.crit:visited { color: #ff0000; } a.crit:active { color: #ff0000; } a.crit:hover { color: #ff0000; } img { border: 0px; } img.i { border: 1px solid #a0a0a0; } img.iwarn { border: 1px solid #ffd300; } img.icrit { border: 1px solid #ff0000; } img.iunkn { border: 1px solid #ffaa00; } /* Header */ #header { width: 90%; margin: 0 auto; background-color: #fbfbfb; border: 1px solid #cfd6f8; border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-top: 0; padding: 3px; height: 40px; } #header p { margin: 0; } h1, h2 { margin: 0; padding: 0; font-size: 110%; font-weight: bold; margin-left: auto; margin-right: auto; } #nav h2 { margin-top: 0.4em; } h1 .logo { display: block; float: left; background-image: url(logo-h.png); background-repeat: no-repeat; width: 115px; height: 30px; padding-right: 10px; margin-top: 7px; padding-bottom: 6px; } /* Main */ #main { width: 90%; margin: 0 auto; } .contentpusher { clear: both; } /* Navigation */ #nav { float: left; width: 200px; } #nav ul li { list-style-type: none; margin: 0 0 0 3px; padding: 2px; } #nav ul { margin: 0.2em 0 0.8em 0; padding: 0; } .navigationjump { display: none; } /* Content */ #content { border-left: 1px solid #cfd6f8; margin-left: 220px; padding: 1em; } #content li { margin-left: -20px; } #content > ul:first-of-type { margin-left: 2em; } .comparison #content { margin-left: 0; } #content h2 { display: none; } ul.groupview li.last { margin-bottom: 1em; } /* Content: comparison */ td { vertical-align: top; } .node { width: 500px; } /* Content: service view */ #legend { margin: 2px; border-collapse: collapse; } #legend tr, #legend td{ padding: 3px 2px 3px 2px; margin: 1px; } #legend th{ border-bottom: 1px solid #999999; } #legend .oddrow{ background-color: #f8f8f8; } #legend .oddrow td{ border-bottom: 1px solid #d8d8d8; } #legend .evenrow{ background-color: #fdfdfd; } #legend .evenrow td{ border-bottom: 1px solid #d8d8d8; } #legend .lastrow td{ border-bottom: 0px solid transparent !important; } #legend .field, #legend .internal { width: 20em; text-align: left; } #legend .type { width: 7em; text-align: center; } #legend .warn, #legend .crit { width: 5em; text-align: center; } /* Footer */ #footer { width: 90%; margin: 0 auto; background-color: #fbfbfb; border: 1px solid #cfd6f8; padding: 5px; clear: both; } #footer p.navigation { margin: 0; } #footer p.tagline { margin: 0; font-size: 80%; text-align: left; } .categoryview .node { display: inline-block; } munin-2.0.25/master/static/style.css000066400000000000000000000123471243472346000173760ustar00rootroot00000000000000html { } body, h1, h2, h3, p, span, div { font-family: "vera sans", "dejavu sans", helvetica, verdana, arial, sans-serif; color: #333333; } h1{ margin: 0.5em; } body { background-color: #fdfdfd; width: 99%; margin: 0em auto 1em auto; padding: 0.0em 0.1em 1em 0.1em; font-size: 90%; } select { border: 1px solid #d1d1d1; } h2 { margin: 0em; padding: 0px; font-size: 110%; font-weight: bold; margin-left: auto; margin-right: auto; } h3.nobottom { margin-top: 0px; margin-bottom: 0px; font-size: 120%; letter-spacing: 0.05em; margin-left: 0px; padding-left: 10px; padding-bottom: 0px; padding-top: 0px; } div.logo { background-image: url(logo-h.png); background-repeat: no-repeat; width: 115px; height: 30px; padding-right: 10px; margin-top: 7px; padding-bottom: 6px; } div.lighttext { background-color: #ffffff; color: #777777; font-style: italic; } .domain { font-size: medium; font-weight: bold; } .host { font-weight: bold; } .service { font-size: small; font-weight: bold; } .center { text-align: center; } .small { font-size: smaller; } .noborder { border-width: 0px; border-collapse: collapse; } table.largeinvisiblebox { border-width: thin; border-top: 0px; border-bottom: 0px; border-left: 0px; border-right: 0px; border-color: #999; border-style: solid; padding: 0px 0px 0px 0px; margin: 0px auto 0px auto; white-space: nowrap; max-width: 97%; width: 90%; min-width: 50%; } #header-table{ width: 90%; margin: 0 auto 0em auto; background-color: #fbfbfb; border-bottom: 1px solid #cfd6f8; border-left: 1px solid #cfd6f8; border-right: 1px solid #cfd6f8; overflow: auto; } #header-table td{ padding-bottom: 0px; margin: 0em auto 0em auto; } #header-table tr{ margin: 0em auto 0em auto; padding: 0px; } #header-table td.overview{ margin: 0em auto 0em auto; text-align: left; } #header-table td.overview h1{ margin-top: 0em; margin-bottom: 0em; margin-left: 0.1em; padding-top: 1px; } #header-table td.logo{ width: 115px; height: 48px; margin: 0em auto 0em auto; } table.invisiblebox { border: 0px solid #999999; width: 90%; padding: 0px 0px 0px 0px; margin-top: 10px; margin-left: auto; margin-bottom: 0px; margin-right: auto; white-space: nowrap; } table.invisiblebox tr{ padding-bottom: 15px; } td.graphbox { padding: 5px; white-space: nowrap; } td.graphbox > table { border-left: 1px dashed #aaaaaa; padding-left: 10px; margin-bottom: 1em; white-space: nowrap; } .box { padding: 4px; margin: 10px auto 0px auto; text-align: left; } #legend { margin: 2px; } #legend tr, #legend td{ padding: 3px 2px 3px 2px; margin: 1px; } #legend th{ border-bottom: 1px solid #999999; } #legend .oddrow{ background-color: #f8f8f8; } #legend .oddrow td{ border-bottom: 1px solid #d8d8d8; } #legend .evenrow{ background-color: #fdfdfd; } #legend .evenrow td{ border-bottom: 1px solid #d8d8d8; } #legend .lastrow td{ border-bottom: 0px solid transparent !important; } td.legendbox { border: 1px solid #999999; padding: 8px 4px 2px 2px; margin: 8px 2px 2px 2px; text-align: left; width: 90%; } td.wrap { white-space: normal; width: 20%; } td.linkbox { padding: 4px 4px 4px 4px; margin: 10px auto 0px auto; max-width: 97%; width: 90%; min-width: 50%; white-space: normal; } #generated-table { width: 90%; margin: 1em auto -0.5em auto; padding-right: 0.5em; background-color: #fbfbfb; border: 1px solid #bbc3ea; } #generated-table tbody td { text-align: right; margin: 0px; padding: 0px; } .warntext { font-weight: bold; background-color: #cccc00; padding: 0px; margin: -1px; border: 1px solid #b9b900; } .crittext { font-weight: bold; background-color: #ff6f22; padding: 0px; margin: -1px; border: 1px solid #f16722; } .ruler { background-color: #999999; border: 0px; height: 1px; } .ruler2 { background-color: #999999; border: 0px; height: 2px; } a:link,a:visited,a:active { text-decoration: none; } a:hover { text-decoration: underline; } a.meek:link { color: #486aaf; font-size: small; } a.meek:visited { color: #af1a00; font-size: small; } a.meek:active { color: #486aaf; font-size: small; } a.meek:hover { color: #999999; font-size: small; } li li { margin-left: -1.2em; } ul li { margin-left: -1.2em; } a { border-width: 0px; } .heading { font-weight: bold; } a.unkn:link { color: #ffaa00; } a.unkn:visited { color: #ffaa00; } a.unkn:active { color: #ffaa00; } a.unkn:hover { color: #ffaa00; } a.warn:link { color: #ffd300; } a.warn:visited { color: #ffd300; } a.warn:active { color: #ffd300; } a.warn:hover { color: #ffd300; } a.crit:link { color: #ff0000; } a.crit:visited { color: #ff0000; } a.crit:active { color: #ff0000; } a.crit:hover { color: #ff0000; } a:link { color: #486aaf; } a:visited { color: #486aaf; } a:active { color: #486aaf; } a:hover { color: #486aaf; } img { border-width: 2px; border-color: transparent; } img.warn { border-width: 2px; border-color: #ffd300; } img.crit { border-width: 2px; border-color: #ff0000; } img.unkn { border-width: 2px; border-color: #ffaa00; } munin-2.0.25/master/static/zoom.js000066400000000000000000000112301243472346000170340ustar00rootroot00000000000000// Insert values in the form var qs = new Querystring(); var form = document.getElementById("myNewForm"); var image = document.getElementById("image"); var divOverlay = document.getElementById("overlayDiv"); form.plugin_name.value = qs.get("plugin_name", "localdomain/localhost.localdomain/if_eth0"); form.start_epoch.value = qs.get("start_epoch", "1236561663"); form.stop_epoch.value = qs.get("stop_epoch", "1237561663"); form.lower_limit.value = qs.get("lower_limit", ""); form.upper_limit.value = qs.get("upper_limit", ""); form.size_x.value = qs.get("size_x", ""); form.size_y.value = qs.get("size_y", ""); form.btnMaj.onclick = majDates; form.btnZoomOut.onclick = zoomOut; // Refresh the image with the selected params var scale = refreshImg(); function refreshImg() { image.src = qs.get("cgiurl_graph", "/munin-cgi/munin-cgi-graph"); + form.plugin_name.value + "-pinpoint=" + parseInt(form.start_epoch.value) + "," + parseInt(form.stop_epoch.value) + ".png" + "?" + "&lower_limit=" + form.lower_limit.value + "&upper_limit=" + form.upper_limit.value + "&size_x=" + form.size_x.value + "&size_y=" + form.size_y.value ; return ((+form.stop_epoch.value) - (+form.start_epoch.value)) / (+form.size_x.value); } var start_epoch = (+form.start_epoch.value); var stop_epoch = (+form.stop_epoch.value); var initial_left; var initial_top; updateStartStop(); function updateStartStop() { form.start_iso8601.value = new Date(form.start_epoch.value * 1000).formatDate(Date.DATE_ISO8601); form.stop_iso8601.value = new Date(form.stop_epoch.value * 1000).formatDate(Date.DATE_ISO8601); } function divMouseMove(mouseMouveEvent) { var delta_x; var size_x; // Handling the borders (X1>X2 ou X1 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Perl::Critic'; plan ( skip_all => "Test::Perl::Critic required for testing coding standard" ) if $@; plan ( skip_all => "Only tested in dev environment (\$ENV{MUNIN_ENVIRONMENT} eq 'dev')" ) if $ENV{MUNIN_ENVIRONMENT} && $ENV{MUNIN_ENVIRONMENT} ne 'dev'; all_critic_ok(); munin-2.0.25/master/t/munin_master_config.t000066400000000000000000000141241243472346000207060ustar00rootroot00000000000000# -*- cperl -*- # vim: ts=4 : sw=4 : et use warnings; use strict; use Test::More tests => 5; use_ok('Munin::Master::Config'); use Munin::Master::Config; use Munin::Common::Defaults; my $config = Munin::Master::Config->instance(); my $userconfig = $config->{config}; $userconfig->parse_config(\*DATA); # Build the correct answer by hand. my $fasit = { 'root_instance' => 1, oldconfig => { config_file => "$Munin::Common::Defaults::MUNIN_DBDIR/datafile" }, config => { config_file => "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf", dbdir => '/opt/munin/sandbox/var/opt/munin', debug => 0, fork => 1, graph_data_size => 'normal', groups => { marvin => { hosts => { marvin => { use_node_name => 1, address => '127.0.0.1', port => '4948', 'load1.graph_title' => 'Loads side by side', 'load1.graph_order' => 'fii=fii.foo.com:load.load fay=fay.foo.com:load.load', host_name => 'marvin', update => 1, }, }, group => undef, group_name => 'marvin', }, }, htmldir => '/opt/munin/sandbox/www', local_address => 0, logdir => '/opt/munin/sandbox/var/log/munin', max_processes => 16, rundir => '/opt/munin/sandbox/var/run/munin', timeout => 180, tls => 'disabled', tls_ca_certificate => '/opt/munin/common/t/tls/CA/ca_cert.pem', tls_certificate => '/opt/munin/common/t/tls/master_cert.pem', tls_private_key => '/opt/munin/common/t/tls/master_key.pem', tls_verify_certificate => 1, tls_verify_depth => '5', tmpldir => '/opt/munin/sandbox/etc/opt/munin/templates', staticdir => '/opt/munin/sandbox/etc/opt/munin/static', rrdcached_socket => '/var/run/rrdcached.sock', cgitmpdir => '/opt/munin/sandbox/var/cache/munin-cgi', }, }; $fasit->{config}{groups}{marvin}{hosts}{marvin}{group} = $fasit->{config}{groups}{marvin}; is_deeply($config, $fasit, 'Config hash contents'); ### _final_char_is ok( Munin::Master::Config::_final_char_is('h', 'blah'), 'it was the last character'); ok(! Munin::Master::Config::_final_char_is('a', 'blah'), 'it was not the last character'); ok(! Munin::Master::Config::_final_char_is('z', 'blah'), 'it not in the string at all'); __DATA__ # Example configuration file for Munin, generated by 'make build' # The next three variables specifies where the location of the RRD # databases, the HTML output, and the logs, severally. They all # must be writable by the user running munin-cron. dbdir /opt/munin/sandbox/var/opt/munin htmldir /opt/munin/sandbox/www logdir /opt/munin/sandbox/var/log/munin rundir /opt/munin/sandbox/var/run/munin # Where to look for the HTML templates tmpldir /opt/munin/sandbox/etc/opt/munin/templates staticdir /opt/munin/sandbox/etc/opt/munin/static # Make graphs show values per minute instead of per second #graph_period minute # Graphics files are normally generated on-demand by a CGI process. # See http://munin-monitoring.org/wiki/CgiHowto2 for more # documentation. # #graph_strategy cgi cgitmpdir /opt/munin/sandbox/var/cache/munin-cgi # Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime # something changes (OK -> WARNING, CRITICAL -> OK, etc) #contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm #contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm # # For those with Nagios, the following might come in handy. In addition, # the services must be defined in the Nagios server as well. #contact.nagios.command /usr/bin/send_nsca nagios.host.comm -c /etc/nsca.conf tls disabled tls_private_key /opt/munin/common/t/tls/master_key.pem tls_certificate /opt/munin/common/t/tls/master_cert.pem tls_ca_certificate /opt/munin/common/t/tls/CA/ca_cert.pem tls_verify_certificate yes tls_verify_depth 5 rrdcached_socket /var/run/rrdcached.sock # a simple host tree [marvin] address 127.0.0.1 port 4948 use_node_name yes load1.graph_title Loads side by side load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load # # A more complex example of a host tree # ## First our "normal" host. # [fii.foo.com] # address foo # ## Then our other host... # [fay.foo.com] # address fay # ## Then we want totals... # [foo.com;Totals] #Force it into the "foo.com"-domain... # update no # Turn off data-fetching for this "host". # # # The graph "load1". We want to see the loads of both machines... # # "fii=fii.foo.com:load.load" means "label=machine:graph.field" # load1.graph_title Loads side by side # load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load # # # The graph "load2". Now we want them stacked on top of each other. # load2.graph_title Loads on top of each other # load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load # load2.dummy_field.draw AREA # We want area instead the default LINE2. # load2.dummy_field.label dummy # This is needed. Silly, really. # # # The graph "load3". Now we want them summarised into one field # load3.graph_title Loads summarised # load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load # load3.combined_loads.label Combined loads # Must be set, as this is # # not a dummy field! # ## ...and on a side note, I want them listen in another order (default is ## alphabetically) # # # Since [foo.com] would be interpreted as a host in the domain "com", we # # specify that this is a domain by adding a semicolon. # [foo.com;] # node_order Totals fii.foo.com fay.foo.com # munin-2.0.25/master/t/munin_master_config_concat.t000077500000000000000000000153121243472346000222400ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; use Test::More tests => 45; # use Test::More qw(no_plan); use_ok('Munin::Master::Config'); # Get a empty class variable so we can test some class functions alone my $c = bless { }, 'Munin::Master::Config'; # Test class my $tc; $tc = "Simple basics "; is ( $c->_concat_config_line('','htmldir','/foo/bar'), 'htmldir', $tc.'1'); is ( $c->_concat_config_line('grouphere;lookfar.langfeldt.net:if_eth0','graph_args','--l 0 -base'), 'grouphere;lookfar.langfeldt.net:if_eth0.graph_args', $tc.'2'); is ( $c->_concat_config_line('grouphere;lookfar.langfeldt.net:if_eth0','up.label','Spazz'), 'grouphere;lookfar.langfeldt.net:if_eth0.up.label', $tc.'3'); $tc = "Settings at all levels "; is ( $c->_concat_config_line('','address','127.0.0.1'), 'address', $tc.'1'); is ( $c->_concat_config_line('Group;','address','127.0.0.1'), 'Group;address', $tc.'2'); is ( $c->_concat_config_line('Group;Group2;','address','127.0.0.1'), 'Group;Group2;address', $tc.'3'); is ( $c->_concat_config_line('Group;','Group2;address','127.0.0.1'), 'Group;Group2;address', $tc.'4'); is ( $c->_concat_config_line('Group;Host.example.com','address','127.0.0.1'), 'Group;Host.example.com:address', $tc.'5'); is ( $c->_concat_config_line('Group;','Host.example.com:address','127.0.0.1'), 'Group;Host.example.com:address', $tc.'6'); is ( $c->_concat_config_line('Group;Group2;','Host.example.com:address','127.0.0.1'), 'Group;Group2;Host.example.com:address', $tc.'7'); is ( $c->_concat_config_line('Group;','Group2;Host.example.com:address','127.0.0.1'), 'Group;Group2;Host.example.com:address', $tc.'8'); is ( $c->_concat_config_line('Group;Group2;','graph_title','Test9'), 'Group;Group2;graph_title', $tc.'9'); is ( $c->_concat_config_line('Group;Host.example.com','service.graph_title','Foo!'), 'Group;Host.example.com:service.graph_title', $tc.'10'); is ( $c->_concat_config_line('Group;Host.example.com:service','graph_title','Foo!'), 'Group;Host.example.com:service.graph_title', $tc.'11'); is ( $c->_concat_config_line('Group;Host.example.com','service.service2.graph_title','Foo!'), 'Group;Host.example.com:service.service2.graph_title', $tc.'12'); is ( $c->_concat_config_line('Group;Host.example.com:service','service2.graph_title','Foo!'), 'Group;Host.example.com:service.service2.graph_title', $tc.'13'); is ( $c->_concat_config_line('Group;Host.example.com:service.service2','graph_title','Foo!'), 'Group;Host.example.com:service.service2.graph_title', $tc.'14'); $tc = "Implicit group names "; is ( $c->_concat_config_line('foo.example.com','port','4949'), 'example.com;foo.example.com:port', $tc.'1'); is ( $c->_concat_config_line('foo.example.com','address','4949'), 'example.com;foo.example.com:address', $tc.'2'); is ( $c->_concat_config_line('foo.example.com','if_eth0.up.label','4949'), 'example.com;foo.example.com:if_eth0.up.label', $tc.'3'); is ( $c->_concat_config_line('localhost','port','4949'), 'localhost;localhost:port', $tc.'4'); $tc = "Prefix/keyword combos "; is ( $c->_concat_config_line('Group;','port','4949'), 'Group;port', $tc.'1'); is ( $c->_concat_config_line('Group;','Host.example.com:port','4949'), 'Group;Host.example.com:port', $tc.'2'); is ( $c->_concat_config_line('Group;Host.example.com','port','4949'), 'Group;Host.example.com:port', $tc.'3' ); is ( $c->_concat_config_line('Group;Host.example.com','service.port','4949'), 'Group;Host.example.com:service.port', $tc.'4' ); is ( $c->_concat_config_line('Group;Host.example.com:service','port','4949'), 'Group;Host.example.com:service.port', $tc.'5' ); $tc = "Prefix/keyword combos, nested groups "; is ( $c->_concat_config_line('Group;','Group2;Host.example.com:port','4949'), 'Group;Group2;Host.example.com:port', $tc.'1'); is ( $c->_concat_config_line('Group;Group2;','Host.example.com:port','4949'), 'Group;Group2;Host.example.com:port', $tc.'2'); is ( $c->_concat_config_line('Group;Group2;Host.example.com','port','4949'), 'Group;Group2;Host.example.com:port', $tc.'3' ); is ( $c->_concat_config_line('Group;Group2;Host.example.com','service.port','4949'), 'Group;Group2;Host.example.com:service.port', $tc.'4' ); is ( $c->_concat_config_line('Group;Group2;Host.example.com:service','port','4949'), 'Group;Group2;Host.example.com:service.port', $tc.'5' ); $tc = "Prefix/keyword combos, nested services "; is ( $c->_concat_config_line('Group;','Host.example.com:service.service2.port','4949'), 'Group;Host.example.com:service.service2.port', $tc.'1' ); is ( $c->_concat_config_line('Group;Host.example.com','service.service2.port','4949'), 'Group;Host.example.com:service.service2.port', $tc.'2' ); is ( $c->_concat_config_line('Group;Host.example.com:service','service2.port','4949'), 'Group;Host.example.com:service.service2.port', $tc.'3' ); is ( $c->_concat_config_line('Group;Host.example.com:service.service2','port','4949'), 'Group;Host.example.com:service.service2.port', $tc.'4' ); $tc = "Prefix/keyword combos, nested groups and services "; is($c->_concat_config_line('Group;','Group2;Host.example.com:service.service2.port','4949'), 'Group;Group2;Host.example.com:service.service2.port', $tc.'1' ); is($c->_concat_config_line('Group;Group2;','Host.example.com:service.service2.port','4949'), 'Group;Group2;Host.example.com:service.service2.port', $tc.'2' ); is($c->_concat_config_line('Group;Group2;Host.example.com','service.service2.port','4949'), 'Group;Group2;Host.example.com:service.service2.port', $tc.'3' ); is($c->_concat_config_line('Group;Group2;Host.example.com:service','service2.port','4949'), 'Group;Group2;Host.example.com:service.service2.port', $tc.'4' ); is( $c->_concat_config_line('Group;Group2;Host.example.com:service.service2','port','4949'), 'Group;Group2;Host.example.com:service.service2.port', $tc.'5' ); $tc = "Prefix/keyword combos, various service.field.keyword combinations "; is ( $c->_concat_config_line('Group;','Host.example.com:service.field.max','4949'), 'Group;Host.example.com:service.field.max', $tc.'1' ); is ( $c->_concat_config_line('Group;Host.example.com','service.field.max','4949'), 'Group;Host.example.com:service.field.max', $tc.'2' ); is ( $c->_concat_config_line('Group;Host.example.com:service','field.max','4949'), 'Group;Host.example.com:service.field.max', $tc.'3' ); is ( $c->_concat_config_line('Group;Host.example.com:service.field','max','4949'), 'Group;Host.example.com:service.field.max', $tc.'4' ); # Alright, can anyone think of any more tests? # Probably even more combinations of nesting in both ends to see if that # somehow trips up the code. munin-2.0.25/master/t/munin_master_config_split.t000077500000000000000000000103251243472346000221230ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; # This test-set does the reverse of munin_master_config_concat, but this is simpler # because all variations of prefix/key combined in the concat function works out to # one canonical format, which breaks down in a predictable manner. use Test::More tests => 24; # use Test::More qw(no_plan); use_ok('Munin::Master::Config'); # Get a empty class variable so we can test some class functions alone my $c = bless { }, 'Munin::Master::Config'; # Test class my $tc; $tc = "Simple basics "; use Data::Dumper; # print Dumper $c->_split_config_line('htmldir'); is_deeply ( [$c->_split_config_line('htmldir')], [[],'','htmldir'],$tc.'1'); is_deeply ( [ $c->_split_config_line('grouphere;lookfar.langfeldt.net:if_eth0.graph_args') ], [['grouphere'],'lookfar.langfeldt.net','if_eth0.graph_args'], $tc.'2'); is_deeply ( [ $c->_split_config_line('grouphere;lookfar.langfeldt.net:if_eth0.up.label') ], [['grouphere'],'lookfar.langfeldt.net','if_eth0.up.label'],$tc.'3'); $tc = "Settings at all levels "; is_deeply ( [ $c->_split_config_line('address') ], [[],'','address'], $tc.'1'); is_deeply ( [ $c->_split_config_line('Group;address') ], [['Group'],'','address'], $tc.'2'); is_deeply ( [ $c->_split_config_line('Group;Group2;address') ], [ ['Group','Group2'],'','address'], $tc.'3'); is_deeply ( [ $c->_split_config_line('Group;Host.example.com:address') ], [['Group'],'Host.example.com','address'], $tc.'5'); is_deeply ( [ $c->_split_config_line('Group;Group2;Host.example.com:address') ], [['Group','Group2'],'Host.example.com','address'], $tc.'7'); is_deeply ( [ $c->_split_config_line('Group;Group2;graph_title') ], [['Group','Group2'],'','graph_title'], $tc.'9'); is_deeply ( [ $c->_split_config_line('Group;Host.example.com:service.graph_title') ], [['Group'],'Host.example.com','service.graph_title'], $tc.'10'); is_deeply ( [ $c->_split_config_line('Group;Host.example.com:service.service2.graph_title') ], [['Group'],'Host.example.com','service.service2.graph_title'], $tc.'12'); $tc = "Implicit group names "; is_deeply ( [ $c->_split_config_line('example.com;foo.example.com:port') ], [['example.com'],'foo.example.com','port'], $tc.'1'); is_deeply ( [ $c->_split_config_line('example.com;foo.example.com:address') ], [['example.com'],'foo.example.com','address'], $tc.'2'); is_deeply ( [ $c->_split_config_line('example.com;foo.example.com:if_eth0.up.label') ], [['example.com'],'foo.example.com','if_eth0.up.label'], $tc.'3'); is_deeply ( [ $c->_split_config_line('localhost;localhost:port') ], [['localhost'],'localhost','port'], $tc.'4'); $tc = "Prefix/keyword combos "; is_deeply ( [ $c->_split_config_line('Group;port') ] , [['Group'],'','port'], $tc.'1'); is_deeply ( [ $c->_split_config_line('Group;Host.example.com:port')], [['Group'],'Host.example.com','port'], $tc.'2'); is_deeply ( [ $c->_split_config_line('Group;Host.example.com:service.port') ], [['Group'],'Host.example.com','service.port'], $tc.'4' ); $tc = "Prefix/keyword combos, nested groups "; is_deeply ( [ $c->_split_config_line('Group;Group2;Host.example.com:port') ], [['Group','Group2'], 'Host.example.com', 'port'], $tc.'1'); is_deeply ( [ $c->_split_config_line('Group;Group2;Host.example.com:service.port') ], [['Group','Group2'], 'Host.example.com', 'service.port'], $tc.'4' ); $tc = "Prefix/keyword combos, nested services "; is_deeply ( [ $c->_split_config_line('Group;Host.example.com:service.service2.port') ], [['Group'],'Host.example.com','service.service2.port'], $tc.'1' ); $tc = "Prefix/keyword combos, nested groups and services "; is_deeply ( [ $c->_split_config_line('Group;Group2;Host.example.com:service.service2.port') ], [['Group','Group2'],'Host.example.com','service.service2.port'], $tc.'1' ); $tc = "Prefix/keyword combos, various service.field.keyword combinations "; is_deeply ( [ $c->_split_config_line('Group;Host.example.com:service.field.max') ], [['Group'],'Host.example.com','service.field.max'], $tc.'1' ); # Alright, can anyone think of any more tests? # Probably even more combinations of nesting in both ends to see if that # somehow trips up the code. munin-2.0.25/master/t/munin_master_grouprepository.t000066400000000000000000000001411243472346000227270ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 1; use_ok('Munin::Master::GroupRepository'); munin-2.0.25/master/t/munin_master_host.t000066400000000000000000000001261243472346000204130ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 1; use_ok('Munin::Master::Host'); munin-2.0.25/master/t/munin_master_htmlconfig.t000066400000000000000000000007041243472346000215720ustar00rootroot00000000000000use warnings; use strict; use English '-no_match_vars'; use Test::More tests => 4; use_ok('Munin::Master::HTMLConfig'); my $test_path = [ {'path' => "../../index.html" } ]; #munin_get_root { is(Munin::Master::HTMLConfig::get_root_path($test_path), "../.."); $test_path = [ {'path' => "../index.html" } ]; is(Munin::Master::HTMLConfig::get_root_path($test_path), ".."); is(Munin::Master::HTMLConfig::get_root_path(), ""); } munin-2.0.25/master/t/munin_master_limitsold.t000066400000000000000000000023631243472346000214430ustar00rootroot00000000000000# -*- perl -*- use warnings; use strict; use Test::More tests => 7; use_ok('Munin::Master::LimitsOld'); # Test values my $severities_csv = ["ok,warning,critical,unknown"]; my $severities_mix = [ "ok,Warning, CRITICAL", "unknown" ]; my $severities_bad = [ "ok", "warning", "critical", "unknown", "fluffy" ]; my $severities_dup = [ "ok", "warning", "ok", "critical", "unknown" ]; # Result value (must be sorted) my $severities = [ "critical", "ok", "unknown", "warning" ]; is_deeply( Munin::Master::LimitsOld::validate_severities($severities), $severities, "validate always-send" ); is_deeply( Munin::Master::LimitsOld::validate_severities($severities_csv), $severities, "validate always-send (comma separated)" ); is_deeply( Munin::Master::LimitsOld::validate_severities($severities_mix), $severities, "validate always-send (mixed separation and case)" ); is_deeply( Munin::Master::LimitsOld::validate_severities($severities_bad), $severities, "validate always-send (with bad value)" ); is_deeply( Munin::Master::LimitsOld::validate_severities($severities_dup), $severities, "validate always-send (with duplicate value)" ); is_deeply( Munin::Master::LimitsOld::validate_severities([]), [], "validate always-send (with empty list)" ); munin-2.0.25/master/t/munin_master_logger.t000066400000000000000000000001301243472346000207100ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 1; use_ok('Munin::Master::Logger'); munin-2.0.25/master/t/munin_master_node.t000066400000000000000000000152221243472346000203660ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; use Munin::Master::Config; use Test::More tests => 15; use Test::MockModule; use Test::MockObject::Extends; use Test::Exception; use Test::Differences; use Data::Dumper; use_ok('Munin::Master::Node'); my $config = Munin::Master::Config->instance(); $config->{node}{use_node_name} = 1; sub setup { my $node = Munin::Master::Node->new('127.0.0.1', 4949, 'node'); my $node_mock = Test::MockObject::Extends->new($node); $node_mock->mock('_node_write_single', sub {}); $node_mock->mock('_node_read_fast', sub { my ($self) = @_; return $self->_node_read(); }); return $node_mock; } ### new { my $node = Munin::Master::Node->new(); isa_ok($node, 'Munin::Master::Node','Create a node object'); } ### _do_connect { my $node = setup(); $node->mock('_node_read_single', sub { return '# munin node at foo.example.com' }); my $inet = Test::MockModule->new('IO::Socket::INET6'); $inet->mock(new => sub { return {} }); $node->_do_connect(); is($node->{node_name}, 'foo.example.com','Node name is detected'); } ### _extract_name_from_greeting { my $node = Munin::Master::Node->new(); is($node->_extract_name_from_greeting('# munin node at foo.example.com'), 'foo.example.com', 'Node name from new greeting'); is($node->_extract_name_from_greeting('# lrrd client at foo.example.com'), 'foo.example.com', 'Node name from old greeting'); } ### negotiate_capabilities { my $node = setup(); $node->mock('_node_read_single', sub { return 'cap multigraph'; }); my @res = $node->negotiate_capabilities(); is_deeply(\@res, ['multigraph'], 'Capabilities - single'); } { my $node = setup(); $node->mock('_node_read_single', sub { return '# Unknown command. Try list, nodes, config, fetch, version or quit'; }); my @res = $node->negotiate_capabilities(); is_deeply(\@res, ['NA'], 'Capabilities - single'); } { my $node = setup(); $node->mock('_node_read_single', sub { my @array = ('cap bar baz foo'); return \@array; }); my @res = $node->negotiate_capabilities(); is_deeply(\@res, ['NA'], 'Capabilities - none'); } ### list_plugins { my $node = setup(); $node->mock('_node_read_single', sub { return 'foo bar baz'; }); $node->{node_name} = 'node'; my @res = $node->list_plugins(); is_deeply(\@res, [qw(foo bar baz)], 'List plugins'); } ### fetch_service_config { my $node = setup(); $node->mock('_node_read', sub { my @array = ('# timeout: bla bla bla'); return \@array; }); throws_ok { $node->fetch_service_config('foo') } qr/Timeout error on node/, 'Fetch service config - Timeout throws exception'; } { my $node = setup(); $node->mock('_node_read', sub { my @array = ( '', '# bla bla bla', 'foo bar', 'zap gabonk', 'baz.bar foo', ); return \@array; }); #die Dumper { $node->fetch_service_config('fun') }; my %res = $node->fetch_service_config('fun'); eq_or_diff(\%res, { global => { multigraph => [ 'fun' ], fun => [ [ 'foo', 'bar' ], [ 'zap', 'gabonk' ], ], }, data_source => { fun => { baz => { bar => 'foo', extinfo => 'NOTE: The plugin did not provide any label for the data source baz. It is in need of fixing.', label => 'No .label provided', }, }, }, }, 'Fetch service config - missing label', ); } { my $node = setup(); $node->mock('_node_read', sub { my @array = ( '', '# bla bla bla', 'foo bar', 'zap gabonk', 'baz.label foo', 'zip.label bar', ); return \@array; }); my %res = $node->fetch_service_config('fun'); is_deeply(\%res, { global => { multigraph => ['fun'], fun => [ [qw(foo bar)], [qw(zap gabonk)], ['graph_order', 'baz zip'], ], }, data_source => { fun => { baz => {label => 'foo'}, zip => {label => 'bar'}, }, }, }, 'Fetch service config - implicit graph order' ); } { my $node = setup(); $node->mock('_node_read', sub { my @array = ( '', '# bla bla bla', 'foo bar', 'zap gabonk', 'baz.label foo', 'zip.label bar', 'graph_order zip baz', ); return \@array; }); my %res = $node->fetch_service_config('fun'); is_deeply(\%res, { global => { multigraph => [qw( fun )], fun => [ [qw( foo bar )], [qw( zap gabonk )], [ 'graph_order', 'zip baz' ], ], }, data_source => { fun => { baz => { label => 'foo', }, zip => { label => 'bar', }, } }, }, 'Fetch service config - explicit graph_order' ); } ### fetch_service_data { my $node = setup(); $node->mock('_node_read', sub { my @array = ('# timeout: bla bla bla'); return \@array; }); throws_ok { $node->fetch_service_data('foo') } qr/Timeout in fetch from 'foo'/, 'Fetch service data - Timeout throws exception'; } { my $node = setup(); $node->mock('_node_read', sub { my @array = ( '', '# bla bla bla', 'fun.value bar', 'zap.value gabonk', 'baz.value foo', ); return \@array; }); my $time = time; # this will work, except when the clock ticks at the wrong time my %res = $node->fetch_service_data('foo'); is_deeply(\%res, { foo => { fun => { value => ['bar'], when => [$time], }, zap => { value => ['gabonk'], when => [$time], }, baz => { value => ['foo'], when => [$time], }, }, }, 'Fetch service data' ); } # vim: sw=8 : ts=4 : et munin-2.0.25/master/t/munin_master_plugin_config.t000066400000000000000000000154501243472346000222670ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; use English qw(-no_match_vars); use Data::Dumper; use Test::More qw(no_plan); # use Test::More tests => 15; use_ok('Munin::Master::Node'); my $node = bless { address => "127.0.0.1", port => "4949", host => "localhost" }, "Munin::Master::Node"; $INPUT_RECORD_SEPARATOR = ''; my @input = split("\n",); # print "Input: ",@input,"\n"; my %answer = $node->parse_service_config("Test", \@input); =comment # This is the old datastructure returned by parse_service_config. # Kept here as a reference until multigraph is fully working. -janl 2009-10-23 my $fasit = { 'data_source' => { 'system' => { 'info' => 'CPU time spent by the kernel in system activities', 'draw' => 'AREA', 'min' => '0', 'max' => '200', 'critical' => '100', 'warning' => '60', 'label' => 'system', 'type' => 'DERIVE' }, 'user' => { 'info' => 'CPU time spent by normal programs and daemons', 'draw' => 'STACK', 'min' => '0', 'warning' => '160', 'max' => '200', 'type' => 'DERIVE', 'label' => 'user' } }, 'global' => [ [ 'graph_title', 'CPU usage' ], [ 'graph_order', 'system user nice idle iowait irq softirq' ], [ 'graph_args', '--base 1000 -r --lower-limit 0 --upper-limit 200' ], [ 'graph_vlabel', '%' ], [ 'graph_scale', 'no' ], [ 'graph_info', 'This graph shows how CPU time is spent.' ], [ 'graph_category', 'system' ], [ 'graph_period', 'second' ] ] }; =cut my $fasit = { 'data_source' => { 'Test' => { 'system' => { 'info' => 'CPU time spent by the kernel in system activities', 'draw' => 'AREA', 'min' => '0', 'max' => '200', 'critical' => '100', 'warning' => '60', 'label' => 'system', 'type' => 'DERIVE' }, 'user' => { 'info' => 'CPU time spent by normal programs and daemons', 'draw' => 'STACK', 'min' => '0', 'warning' => '160', 'max' => '200', 'type' => 'DERIVE', 'label' => 'user' } } }, 'global' => { 'multigraph' => [ 'Test' ], 'Test' => [ [ 'graph_title', 'CPU usage' ], [ 'graph_order', 'system user nice idle iowait irq softirq' ], [ 'graph_args', '--base 1000 -r --lower-limit 0 --upper-limit 200' ], [ 'graph_vlabel', '%' ], [ 'graph_scale', 'no' ], [ 'graph_info', 'This graph shows how CPU time is spent.' ], [ 'graph_category', 'system' ], [ 'graph_period', 'second' ] ] } }; is_deeply(\%answer,$fasit,"Plugin config output"); __DATA__ graph_title CPU usage graph_order system user nice idle iowait irq softirq graph_args --base 1000 -r --lower-limit 0 --upper-limit 200 graph_vlabel % graph_scale no graph_info This graph shows how CPU time is spent. graph_category system graph_period second system.label system system.draw AREA system.max 200 system.min 0 system.type DERIVE system.warning 60 system.critical 100 system.info CPU time spent by the kernel in system activities user.label user user.draw STACK user.min 0 user.max 200 user.warning 160 user.type DERIVE user.info CPU time spent by normal programs and daemons munin-2.0.25/master/t/munin_master_plugin_fetch.t000066400000000000000000000046071243472346000221150ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; use English qw(-no_match_vars); use Data::Dumper; # use Test::More qw(no_plan); use Test::More tests => 2; use_ok('Munin::Master::Node'); my $node = bless { address => "127.0.0.1", port => "4949", host => "localhost" }, "Munin::Master::Node"; $INPUT_RECORD_SEPARATOR = ''; my @input = split("\n",); # make time() return a known-good value. BEGIN { *CORE::GLOBAL::time = sub { 1234567890 }; } my $time = time; my %answer = $node->parse_service_data("cpu", \@input); =comment Keep old correct answer for reference. my $fasit = { 'irq' => { 'when' => '1256305015', 'value' => '2770' }, 'system' => { 'when' => 'N', 'value' => '66594' }, 'softirq' => { 'when' => '1256305015', 'value' => '127' }, 'user' => { 'when' => 'N', 'value' => '145923' }, 'idle' => { 'when' => 'N', 'value' => '2245122' }, 'iowait' => { 'when' => 'N', 'value' => '14375' }, 'nice' => { 'when' => 'N', 'value' => '268' } }; =cut my $fasit = { cpu => { irq => { when => [ 1256305015 ], value => [ 2770 ], }, system => { when => [ $time ], value => [ 66594 ], }, softirq => { when => [ 1256305015 ], value => [ 127 ], }, user => { when => [ $time ], value => [ 145923 ], }, iowait => { when => [ $time ], value => [ 14375 ], }, idle => { when => [ $time ], value => [ 2245122 ], }, nice => { when => [ $time ], value => [ 268 ], }, }, }; is_deeply(\%answer,$fasit,"Plugin fetch output"); __DATA__ user.value 145923 nice.value 268 system.value 66594 idle.value 2245122 iowait.value 14375 irq.value 1256305015:2770 softirq.value 1256305015:127 munin-2.0.25/master/t/munin_master_plugin_multigraph_config.t000066400000000000000000000206471243472346000245270ustar00rootroot00000000000000# -*- cperl -*- use warnings; use strict; use English qw(-no_match_vars); use Data::Dumper; use Test::More qw(no_plan); # use Test::More tests => 15; use_ok('Munin::Master::Node'); # use_ok('Munin::Master::Logger'); # logger_debug(); # Mock object enough to be able to call (some) object methods. my $node = bless { address => "127.0.0.1", port => "4949", host => "localhost" }, "Munin::Master::Node"; $INPUT_RECORD_SEPARATOR = ''; my @input = split("\n",); # print "Input: ",@input,"\n"; my %answer = $node->parse_service_config("multigraph_tester", \@input); # Output captured from Data::Dumper my $fasit = { 'data_source' => { 'multigraph_outofscope' => { 'i' => { 'label' => 'number i' } }, 'multigraph_tester.en' => { 'one' => { 'label' => 'number 1' } }, 'multigraph_tester' => { 'three' => { 'label' => 'number 3' }, 'one' => { 'label' => 'number 1' }, 'two' => { 'label' => 'number 2' } }, 'multigraph_tester.to' => { 'two' => { 'label' => 'number 2' } }, 'multigraph_tester.tre' => { 'three' => { 'label' => 'number 3' } } }, 'global' => { 'multigraph_outofscope' => [ [ 'graph_title', 'The out of namespace graph' ], [ 'graph_info', 'The "multigraph protocol keyword allows the plugin to place data anywhere in the host/node namespace. The intended use is to be able to produce multiple root graphs and sub-graph spaces, but this is not enforced.' ], [ 'graph_order', 'i' ] ], 'multigraph' => [ 'multigraph_tester', 'multigraph_tester.en', 'multigraph_tester.to', 'multigraph_tester.tre', 'multigraph_outofscope' ], 'multigraph_tester.en' => [ [ 'graph_title', 'The number 1 sub-graph' ], [ 'graph_info', 'This and the other . (dot) separated nested graphs are presented in a page linked to from the root graph' ], [ 'graph_order', 'one' ] ], 'multigraph_tester' => [ [ 'graph_title', 'Root graph of multigraph test' ], [ 'graph_info', 'The root graph is used to click into sub-graph page. Eventually the root graph should be able to borrow data from the sub graphs in a fairly easy manner. But not right now.' ], [ 'graph_order', 'one two three' ] ], 'multigraph_tester.to' => [ [ 'graph_title', 'The number 2 sub-graph' ], [ 'graph_order', 'two' ] ], 'multigraph_tester.tre' => [ [ 'graph_title', 'The number 3 sub-graph' ], [ 'graph_order', 'three' ] ] } }; # print Dumper %answer; is_deeply(\%answer,$fasit,"Multigraph plugin config output"); __DATA__ graph_title Root graph of multigraph test graph_info The root graph is used to click into sub-graph page. Eventually the root graph should be able to borrow data from the sub graphs in a fairly easy manner. But not right now. one.label number 1 two.label number 2 three.label number 3 # multigraph multigraph_tester.en graph_title The number 1 sub-graph graph_info This and the other . (dot) separated nested graphs are presented in a page linked to from the root graph one.label number 1 # multigraph multigraph_tester.to graph_title The number 2 sub-graph two.label number 2 # multigraph multigraph_tester.tre graph_title The number 3 sub-graph three.label number 3 # multigraph multigraph_outofscope graph_title The out of namespace graph graph_info The "multigraph protocol keyword allows the plugin to place data anywhere in the host/node namespace. The intended use is to be able to produce multiple root graphs and sub-graph spaces, but this is not enforced. i.label number i munin-2.0.25/master/t/munin_master_plugin_multigraph_fetch.t000066400000000000000000000035631243472346000243510ustar00rootroot00000000000000# -*- cperl -*- # vim: ts=4 : sw=4 : et use warnings; use strict; use English qw(-no_match_vars); use Data::Dumper; use Test::More tests => 2; use_ok('Munin::Master::Node'); # use_ok('Munin::Master::Logger'); # logger_debug(); # Mock object enough to be able to call (some) object methods. my $node = bless { address => "127.0.0.1", port => "4949", host => "localhost" }, "Munin::Master::Node"; $INPUT_RECORD_SEPARATOR = ''; my @input = split("\n",); # make time() return a known value. BEGIN { *CORE::GLOBAL::time = sub { 1234567890 }; } my $time = time; my %answer = $node->parse_service_data("multigraph_tester", \@input); # Output captured from Data::Dumper my $fasit = { 'multigraph_outofscope' => { i => { when => [ $time ], value => [ 42 ], } }, 'multigraph_tester' => { three => { when => [ $time ], value => [ 3 ], }, one => { when => [ $time ], value => [ 1 ], }, two => { when => [ 1256305817 ], value => [ 2 ], } }, 'multigraph_tester.en' => { one => { when => [ 1256305817 ], value => [ 1 ], } }, 'multigraph_tester.to' => { two => { when => [ $time ], value => [ 2 ], } }, 'multigraph_tester.tre' => { three => { when => [ $time ], value => [ 3 ], } } }; # print Dumper \%answer; is_deeply(\%answer, $fasit, 'Multigraph plugin fetch output'); __DATA__ one.value 1 two.value 1256305817:2 three.value 3 # multigraph multigraph_tester.en one.value 1256305817:1 # multigraph multigraph_tester.to two.value 2 # multigraph multigraph_tester.tre three.value 3 # multigraph multigraph_outofscope i.value 42 munin-2.0.25/master/t/munin_master_processmanager.t000066400000000000000000000040351243472346000224520ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 17; use Time::HiRes qw(sleep); use File::Temp qw( tempdir ); use_ok('Munin::Master::ProcessManager'); use Munin::Master::Config; my $config = Munin::Master::Config->instance()->{config}; $config->{rundir} = tempdir(CLEANUP => 1); ### Uncomment to see log messages # #use Munin::Master::Logger; #logger_debug(); #$config->{debug} = 1; # # Define some test workers # package Test::Worker; use base q(Munin::Master::Worker); sub do_work { my ($self) = @_; 1 for (0 .. rand 1_000_000); # sleep and alarm does not mix ... return $self->{ID}; } package Test::NastyWorker; use base q(Munin::Master::Worker); use Carp; sub do_work { croak "I'm nasty!"; } package Test::SpinningWorker; use base q(Munin::Master::Worker); sub do_work { 1 while (1); } package main; # # The tests # sub result_callback { my ($res) = @_; ok($res->[0] == 1 || $res->[0] == 2 || $res->[0] == 3, "$res->[0] in 1,2,3"); is_deeply($res, [$res->[0], $res->[0]], "\$res == [X,X], X <- $res->[0]"); } { my $pm = Munin::Master::ProcessManager->new(\&result_callback); isa_ok($pm, 'Munin::Master::ProcessManager'); $pm->add_workers( Test::Worker->new(1), Test::Worker->new(2), Test::Worker->new(3), ); $pm->start_work(); } { my $pm = Munin::Master::ProcessManager->new(\&result_callback); $pm->{max_concurrent} = 1; $pm->add_workers( Test::Worker->new(1), Test::Worker->new(2), Test::Worker->new(3), ); $pm->start_work(); } sub result_callback2 { my ($res) = @_; is($res->[1], 1, "Got 1"); } sub error_callback2 { my ($worker_id, $msg) = @_; ok($msg eq 'Timed out' || $msg eq 'Died', "Got error msg $msg"); } { my $pm = Munin::Master::ProcessManager->new(\&result_callback2, \&error_callback2); $pm->{worker_timeout} = 1; $pm->add_workers( Test::NastyWorker->new(), Test::SpinningWorker->new(), Test::Worker->new(1), ); $pm->start_work(); } munin-2.0.25/master/t/munin_master_update.t000066400000000000000000000035511243472346000207250ustar00rootroot00000000000000use warnings; use strict; use English qw(-no_match_vars); use Test::MockModule; use Test::More tests => 2; use File::Temp qw( tempdir ); use_ok('Munin::Master::Update'); my $config = Munin::Master::Config->instance()->{config}; $config->{dbdir} = tempdir(CLEANUP => 1); # Make 'keys' return the keys in sorted order. package Munin::Master::Update; use subs 'keys'; package main; *Munin::Master::Update::keys = sub { my %hash = @_; sort(CORE::keys(%hash)); }; # sub remove_indentation { my ($str) = @_; $str =~ s{\n\ *}{\n}xmsg; $str =~ s{\A \n }{}xms; return $str; } # my $mockconfig = Test::MockModule->new('Munin::Master::Config'); $mockconfig->mock(get_groups_and_hosts => sub { return () }); # { my $update = Munin::Master::Update->new(); $update->{service_configs} = { 'g1;host1' => { global => { service1 => [['graph_title', 'service1']], }, data_source => { service1 => { data_source1 => {max => 'U', min => 'U'}, data_source2 => {max => 'U', min => 'U'}, }, }, }, 'g1;host2' => { global => { service1 => [['graph_title', 'service1']], }, data_source => { service1 => { data_source1 => {max => 'U', min => 'U'}, }, }, }, }; my $result = ""; open my $fh, '>', \$result or die $OS_ERROR; $update->_write_new_service_configs($fh); my $expected = "version $Munin::Common::Defaults::MUNIN_VERSION\n" . remove_indentation(q{ g1;host1:service1.graph_title service1 g1;host1:service1.data_source1.max U g1;host1:service1.data_source1.min U g1;host1:service1.data_source2.max U g1;host1:service1.data_source2.min U g1;host2:service1.graph_title service1 g1;host2:service1.data_source1.max U g1;host2:service1.data_source1.min U }); is($result, $expected, 'Write new service config'); } munin-2.0.25/master/t/munin_master_updateworker.t000066400000000000000000000001371243472346000221540ustar00rootroot00000000000000use warnings; use strict; use Test::More tests => 1; use_ok('Munin::Master::UpdateWorker'); munin-2.0.25/master/t/munin_master_utils.t000066400000000000000000000036161243472346000206050ustar00rootroot00000000000000use warnings; use strict; use English '-no_match_vars'; use Scalar::Util "weaken"; use Test::More tests => 11; use_ok('Munin::Master::Utils'); # munin_mkdir_p { ok(munin_mkdir_p("./mkdirt", oct(444)), "Creating valid dir"); ok(!munin_mkdir_p("./mkdirt/bad", oct(444)), "Creating invalid dir"); eval { rmdir("./mkdirt") }; ok(!$EVAL_ERROR, "Removing dir (please do manual cleanup on failure)"); } # munin_get { my $sentinel = 12345; is(munin_get(undef, undef, $sentinel), $sentinel, "munin_get from undef gives back default"); my $th1 = {"tfield" => 5}; is(munin_get($th1, "tfield", $sentinel), 5, "munin_get recovers numeric field"); my $th2 = {"tfield" => {"innerfield" => 5}}; is(munin_get($th2, "tfield", $sentinel), $sentinel, "munin_get returns default on hash field"); my $h = { "a" => { "upper1" => "1-a", "upper2" => "2-a", "aa" => { "field1" => "1-aa", "field2" => "2-aa", }, "ab" => { "field1" => "1-aa", "field2" => "2-ab", "field3" => "3-ab", }, "ac" => { "field1" => "1-ac", "field2" => "2-ac", }, }, "b" => { "ba" => { "field1" => "1-ba", }, }, }; $h->{a}{aa}{'#%#parent'} = $h->{a}; weaken($h->{a}{aa}{'#%#parent'}); $h->{a}{ab}{'#%#parent'} = $h->{a}; weaken($h->{a}{ab}{'#%#parent'}); $h->{a}{ac}{'#%#parent'} = $h->{a}; weaken($h->{a}{ac}{'#%#parent'}); $h->{b}{ba}{'#%#parent'} = $h->{b}; weaken($h->{b}{ba}{'#%#parent'}); is(munin_get($h, "a", $sentinel), $sentinel, "munin_get returns default on hash field"); is(munin_get($h->{a}->{aa}, "field1", $sentinel), $h->{a}->{aa}->{field1}, "munin_get recovers field value"); is(munin_get($h->{a}->{aa}, "upper2", $sentinel), $h->{a}->{upper2}, "munin_get recovers field value, from above"); is(munin_get($h->{a}->{ba}, "upper2", $sentinel), $sentinel, "munin_get recovers default, no value from above"); } munin-2.0.25/master/t/no-fixes.t000066400000000000000000000025211243472346000164060ustar00rootroot00000000000000# vim: ts=4 : sw=4 : et use warnings; use strict; # Check for comments and POD flagged with FIX. # Are there any modules that already does this? # Perl::Critic::Policy::Bangs::ProhibitFlagComments doesn't consider # POD. Make a Perl::Critic::Policy out of this? use English qw(-no_match_vars); use File::Find; use FindBin; use Test::More; use Pod::Simple::TextContent; if ($ENV{TEST_POD}) { plan tests => 1; } else { plan skip_all => 'set TEST_POD to enable this test' } my $count = 0; find(\&fixes, "$FindBin::Bin/../lib"); is($count, 0, "Should not find any FIX comments"); sub fixes { my $file = $File::Find::name; # skip SVN stuff if ( -d and m{\.svn}) { $File::Find::prune = 1; return; } return unless -f $file; # # Check comments # open my $F, '<', $file or warn "Couldn't open $file: $!" && return; while (<$F>) { if (m{#\s*FIX}) { printf "Found a FIX comment at %s: %d\n", $file, $.; $count++; } } close $F; # # Check POD # my $pod_parser = Pod::Simple::TextContent->new; my $pod = ""; $pod_parser->output_string(\$pod); $pod_parser->parse_file($file); my $pod_count = scalar(grep {/FIX/} split /\n/, $pod); printf "Found %d FIX(es) in POD in %s\n", $pod_count,$file if $pod_count; $count += $pod_count; } munin-2.0.25/master/t/pod-coverage.t000066400000000000000000000007251243472346000172350ustar00rootroot00000000000000use strict; use warnings; use Test::More; use FindBin; use lib "$FindBin::Bin/../lib"; plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Pod::Coverage'; plan ( skip_all => "Test::Pod::Coverage required for testing POD coverage" ) if $@; plan ( skip_all => "Only tested in dev environment (\$ENV{MUNIN_ENVIRONMENT} eq 'dev')" ) if $ENV{MUNIN_ENVIRONMENT} && $ENV{MUNIN_ENVIRONMENT} ne 'dev'; all_pod_coverage_ok(); munin-2.0.25/master/t/pod.t000066400000000000000000000004401243472346000154360ustar00rootroot00000000000000use strict; use warnings; use Test::More; use FindBin; use lib "$FindBin::Bin/../lib"; plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; eval 'use Test::Pod'; plan ( skip_all => "Test::Pod required for testing for POD errors" ) if $@; all_pod_files_ok(); munin-2.0.25/master/www/000077500000000000000000000000001243472346000150525ustar00rootroot00000000000000munin-2.0.25/master/www/munin-categoryview.tmpl000066400000000000000000000054011243472346000216040ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-comparison-day.tmpl000066400000000000000000000027031243472346000220230ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-comparison-month.tmpl000066400000000000000000000027221243472346000223740ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-comparison-week.tmpl000066400000000000000000000027611243472346000222050ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-comparison-year.tmpl000066400000000000000000000027131243472346000222070ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-domainview.tmpl000066400000000000000000000061611243472346000212420ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-dynazoom.tmpl000066400000000000000000000035071243472346000207410ustar00rootroot00000000000000

Graph zoom

Zooming is easy, it's done in 3 clicks (regular clicks, no drag&drop):
  1. First click to define the start of zoom.
  2. Second click to define the ending of zoom.
  3. Third click inside the defined zone to zoom, outside to cancel the zone.
Plugin Name (domain/hostname/plugin_name) :
Start/Stop of the graph
(format:2005-08-15T15:52:01+0000)
(epoch) :
/
( / )
Limit low/high : /
Graph size (w/o legend) (pixels): /
munin-2.0.25/master/www/munin-htaccess.in000066400000000000000000000015211243472346000203220ustar00rootroot00000000000000# This file can be used as a .htaccess file, or a part of your apache # config file. # # For the .htaccess file option to work the munin www directory # (@@HTMLDIR@@) must have "AllowOverride all" or something close # to that set. # # As a config file enclose it in like so: # # AuthUserFile @@CONFDIR@@/munin-htpasswd AuthName "Munin" AuthType Basic require valid-user # This next part requires mod_expires to be enabled. # # We could use around here, but I want it to be # as evident as possible that you either have to load mod_expires _or_ # you coment out/remove these lines. # Set the default expiery time for files 5 minutes 10 seconds from # their creation (modification) time. There are probably new files by # that time. ExpiresActive On ExpiresDefault M310 # munin-2.0.25/master/www/munin-nodeview.tmpl000066400000000000000000000024261243472346000207200ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-overview.tmpl000066400000000000000000000140311243472346000207410ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-problemview.tmpl000066400000000000000000000110301243472346000214220ustar00rootroot00000000000000 munin-2.0.25/master/www/munin-serviceview.tmpl000066400000000000000000000116321243472346000214320ustar00rootroot00000000000000

Service graphs

"> " alt="daily graph" class="iwarncrit" width="" height=""/> "> " alt="weekly graph" class="iwarncrit" width="" height=""/>
"> " alt="monthly graph" class="iwarncrit" width="" height=""/> "> " alt="yearly graph" class="iwarncrit" width="" height=""/>
" alt="summed weekly graph" width="" height=""/> " alt="summed weekly graph" width="" height=""/>

Graph Information

Note: This service is in WARNING state because one of the values reported is outside the allowed range. Please see further down for information about the ranges and the graph for the values.

Note: This service is in CRITICAL state because one of the values reported is outside the allowed range. Please see further down for information about the ranges and the graph for the values.

Note: This service is in UNKNOWN state, because something bad happened. Please check your network, the munin-node, and the plugin.

oddrowevenrow lastrow"> oddrowevenrow">
Field Internal name /static/definitions.html#data_types">Type Warn Crit Info
 
 
 
This field has the following extra information:
munin-2.0.25/master/www/partial/000077500000000000000000000000001243472346000165065ustar00rootroot00000000000000munin-2.0.25/master/www/partial/bottom_navigation.tmpl000066400000000000000000000023071243472346000231310ustar00rootroot00000000000000 :: "> "> Overview :: :: :: "> munin-2.0.25/master/www/partial/footer.tmpl000066400000000000000000000004631243472346000207050ustar00rootroot00000000000000 munin-2.0.25/master/www/partial/generated_by.tmpl000066400000000000000000000001711243472346000220330ustar00rootroot00000000000000
munin-2.0.25/master/www/partial/head.tmpl000066400000000000000000000024041243472346000203050ustar00rootroot00000000000000 /static/style-new.css" type="text/css" />