pax_global_header00006660000000000000000000000064122532723720014517gustar00rootroot0000000000000052 comment=bd7576bce1f97ae1e0eba5c0abd76d257ddadb3f glances-1.7.3/000077500000000000000000000000001225327237200131435ustar00rootroot00000000000000glances-1.7.3/.gitignore000066400000000000000000000005431225327237200151350ustar00rootroot00000000000000*~ *.py[co] # Packages *.egg *.egg-info dist build # Eclipse *.pydevproject .project .metadata bin/** tmp/** tmp/**/* *.tmp *.bak *.swp *~.nib local.properties .classpath .settings/ .loadpath # External tool builders .externalToolBuilders/ # Locally stored "Eclipse launch configurations" *.launch # CDT-specific .cproject # PDT-specific .buildpath glances-1.7.3/.travis.yml000066400000000000000000000002341225327237200152530ustar00rootroot00000000000000language: python python: - "2.6" - "2.7" - "3.2" - "3.3" install: - pip install -r requirements.txt --use-mirrors script: python setup.py install glances-1.7.3/AUTHORS000066400000000000000000000012271225327237200142150ustar00rootroot00000000000000========== Developers ========== Nicolas Hennion (aka) Nicolargo http://blog.nicolargo.com https://twitter.com/nicolargo contact@nicolargo.com Alessio Sergi (aka) Al3hex https://twitter.com/al3hex Brandon Philips (aka) Philips http://ifup.org/ Jon Renner (aka) Jrenner https://github.com/jrenner ========= Packagers ========= Geoffroy Youri Berret for the Debian package http://packages.debian.org/fr/sid/glances gasol.wu@gmail.com for the FreeBSD port Frederic Aoustin (https://github.com/fraoustin) and Nicolas Bourges (installer) for the Windows port Aljaž Srebrnič for the MacPorts package http://www.macports.org/ports.php?by=name&substr=glances glances-1.7.3/COPYING000066400000000000000000000167441225327237200142120ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. glances-1.7.3/MANIFEST.in000066400000000000000000000004621225327237200147030ustar00rootroot00000000000000include AUTHORS include COPYING include NEWS include README.rst include conf/glances.conf include glances/data/css/*.css include glances/data/html/*.html include glances/data/img/*.png include man/glances.1 recursive-include docs images/*.png glances-doc.html recursive-include i18n *.mo prune docs/_build glances-1.7.3/NEWS000066400000000000000000000165621225327237200136540ustar00rootroot00000000000000Version 1.7.3 ============= * Add --password argument to enter the client/server password from the prompt * Fix an issue with the configuration file path (#296) * Fix an issue with the HTML template (#301) Version 1.7.2 ============= * Console interface is now Microsoft Windows compatible (thk to @fraoustin) * Update documentation and Wiki regarding the API * Added package name for python sources/headers in openSUSE/SLES/SLED * Add FreeBSD packager * Bugs corrected Version 1.7.1 ============= * Fix IoWait error on FreeBSD / Mac OS * HDDTemp module is now Python v3 compatible * Don't warn a process is not running if countmin=0 * Add Pypi badge on the README.rst * Update documentation * Add document structure for http://readthedocs.org Version 1.7 =========== * Add monitored processes list * Add hard disk temperature monitoring (thanks to the HDDtemp daemon) * Add batteries capacities information (thanks to the Batinfo lib) * Add command line argument -r toggles processes (reduce CPU usage) * Add command line argument -1 to run Glances in per CPU mode * Platform/architecture is more specific now * XML-RPC server: Add IPv6 support for the client/server mode * Add support for local conf file * Add a uninstall script * Add getNetTimeSinceLastUpdate() getDiskTimeSinceLastUpdate() and getProcessDiskTimeSinceLastUpdate() in the API * Add more translation: Italien, Chinese * and last but not least... up to 100 hundred bugs corrected / software and docs improvments Version 1.6.1 ============= * Add per-user settings (configuration file) support * Add -z/--nobold option for better appearence under Solarized terminal * Key 'u' shows cumulative net traffic * Work in improving autoUnit * Take into account the number of core in the CPU process limit * API improvment add time_since_update for disk, process_disk and network * Improve help display * Add more dummy FS to the ignore list * Code refactory: PsUtil < 0.4.1 is depredicated (Thk to Alessio) * Correct a bug on the CPU process limit * Fix crash bug when specifying custom server port * Add Debian style init script for the Glances server Version 1.6 =========== * Configuration file: user can defines limits * In client/server mode, limits are set by the server side * Display limits in the help screen * Add per process IO (read and write) rate in B per second IO rate only available on Linux from a root account * If CPU iowait alert then sort by processes by IO rate * Per CPU display IOwait (if data is available) * Add password for the client/server mode (-P password) * Process column style auto (underline) or manual (bold) * Display a sort indicator (is space is available) * Change the table key in the help screen Version 1.5.2 ============= * Add sensors module (enable it with -e option) * Improve CPU stats (IO wait, Nice, IRQ) * More stats in lower space (yes it's possible) * Refactor processes list and count (lower CPU/MEM footprint) * Add functions to the RCP method * Completed unit test * and fixes... Version 1.5.1 ============= * Patch for PsUtil 0.4 compatibility * Test PsUtil version before running Glances Version 1.5 =========== * Add a client/server mode (XMLRPC) for remote monitoring * Correct a bug on process IO with non root users * Add 'w' shortkey to delete finished warning message * Add 'x' shortkey to delete finished warning/critical message * Bugs correction * Code optimization Version 1.4.2.2 =============== * Add switch between bit/sec and byte/sec for network IO * Add Changelog (generated with gitchangelog) Version 1.4.2.1 =============== * Minor patch to solve memomy issue (#94) on Mac OS X Version 1.4.2 ============= * Use the news virtual_memory() and virtual_swap() fct (PsUtil) * Display "Top process" in logs * Minor patch on man page for Debian packaging * Code optimization (less try and except) Version 1.4.1.1 =============== * Minor patch to disable Process IO for OS X (not available in PsUtil) Version 1.4.1 ============= * Per core CPU stats (if space is available) * Add Process IO Read/Write information (if space is available) * Uniformize units Version 1.4 =========== * Goodby StatGrab... Welcome to the PsUtil library ! * No more autotools, use setup.py to install (or package) * Only major stats (CPU, Load and memory) use background colors * Improve operating system name detection * New system info: one-line layout and add Arch Linux support * No decimal places for values < GB * New memory and swap layout * Add percentage of usage for both memory and swap * Add MEM% usage, NICE, STATUS, UID, PID and running TIME per process * Add sort by MEM% ('m' key) * Add sort by Process name ('p' key) * Multiple minor fixes, changes and improvements * Disable Disk IO module from the command line (-d) * Disable Mount module from the command line (-m) * Disable Net rate module from the command line (-n) * Improved FreeBSD support * Cleaning code and style * Code is now checked with pep8 * CSV and HTML output (experimental functions, no yet documentation) Version 1.3.7 ============= * Display (if terminal space is available) an alerts history (logs) * Add a limits classe to manage stats limits * Manage black and white console (issue #31) Version 1.3.6 ============= * Add control before libs import * Change static Python path (issue #20) * Correct a bug with a network interface disaippear (issue #27) * Add French and Spanish translation (thx to Jean Bob) Version 1.3.5 ============= * Add an help panel when Glances is running (key: 'h') * Add keys descriptions in the syntax (--help | -h) Version 1.3.4 ============= * New key: 'n' to enable/disable network stats * New key: 'd' to enable/disable disk IO stats * New key: 'f' to enable/disable FS stats * Reorganised the screen when stat are not available|disable * Force Glances to use the enmbeded fs stats (issue #16) Version 1.3.3 ============= * Automaticaly swith between process short and long name * Center the host / system information * Always put the hour/date in the bottom/right * Correct a bug if there is a lot of Disk/IO * Add control about available libstatgrab functions Version 1.3.2 ============= * Add alert for network bit rate° * Change the caption * Optimised net, disk IO and fs display (share the space) Disable on Ubuntu because the libstatgrab return a zero value for the network interface speed. Version 1.3.1 ============= * Add alert on load (depend on number of CPU core) * Fix bug when the FS list is very long Version 1.3 =========== * Add file system stats (total and used space) * Adapt unit dynamicaly (K, M, G) * Add man page (Thanks to Edouard Bourguignon) Version 1.2 =========== * Resize the terminal and the windows are adapted dynamicaly * Refresh screen instantanetly when a key is pressed Version 1.1.3 ============= * Add disk IO monitoring * Add caption * Correct a bug when computing the bitrate with the option -t * Catch CTRL-C before init the screen (Bug #2) * Check if mem.total = 0 before division (Bug #1) glances-1.7.3/README.rst000066400000000000000000000114301225327237200146310ustar00rootroot00000000000000.. image:: https://api.flattr.com/button/flattr-badge-large.png :target: https://flattr.com/thing/484466/nicolargoglances-on-GitHub .. image:: https://travis-ci.org/nicolargo/glances.png?branch=master :target: https://travis-ci.org/nicolargo/glances .. image:: https://badge.fury.io/py/Glances.png :target: http://badge.fury.io/py/Glances .. image:: https://pypip.in/d/Glances/badge.png :target: https://crate.io/packages/Glances Follow Glances on twitter: `glances_system`_ =============================== Glances - An eye on your system =============================== .. image:: https://raw.github.com/nicolargo/glances/master/docs/images/glances-white-256.png :width: 128 **Glances** is a cross-platform curses-based monitoring tool written in Python. It uses the `psutil`_ library to get information from your system. .. image:: https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png Requirements ============ - ``python >= 2.6`` (tested with version 2.6, 2.7, 3.2, 3.3) - ``psutil >= 0.5.1`` (recommended version >= 1.2.1) - ``jinja`` (optional for HTML output) - ``pysensors`` (optional for HW monitoring support) [Linux-only] - ``hddtemp`` (optional for HDD temperature monitoring support) - ``batinfo`` (optional for battery monitoring support) [Linux-only] - ``setuptools`` Installation ============ PyPI: The simple way -------------------- Glances is on `PyPI`_. To install, simply use `pip`_: .. code-block:: console pip install Glances To upgrade Glances to the latest version: .. code-block:: console pip install --upgrade Glances Linux ----- Actually, packages exist for Arch Linux, Fedora/CentOS/RHEL, Debian (Sid/Testing) and Ubuntu (13.04+), so you should be able to install it using your favorite package manager. FreeBSD ------- To install the precompiled binary package: .. code-block:: console # pkg_add -r py27-glances To install Glances from ports: .. code-block:: console # cd /usr/ports/sysutils/py-glances/ # make install clean OS X ---- OS X users can also install Glances using `Homebrew`_ or `MacPorts`_. Homebrew ```````` .. code-block:: console $ brew install brew-pip $ export PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages $ brew pip Glances If you get the following error: .. code-block:: console Error: Failed executing: pip install glances==X.X --install-option=--prefix=/usr/local/XXX/glances/X.X (.rb:) Try to run: .. code-block:: console $ pip install glances==X.X --install-option=--prefix=/usr/local/XXX/glances/X.X $ brew link Glances MacPorts ```````` .. code-block:: console $ sudo port install glances Windows ------- Glances proposes a Windows client based on the `colorconsole`_ Python library. Glances < 1.7.2 only works in server mode. It will run in server mode automatically. Thanks to Nicolas Bourges, Glances can be easily installed using a Windows installer: Glances-1.7.2-win32.msi_ (32-bit, MD5: dba4f6cc9f47b6806ffaeb665c093270) Otherwise, you have to follow these steps: - Install Python for Windows: http://www.python.org/getit/ - Install the psutil library: https://pypi.python.org/pypi?:action=display&name=psutil#downloads - Install the colorconsole library: http://code.google.com/p/colorconsole/downloads/list - Download Glances from here: http://nicolargo.github.io/glances/ Source ------ To install Glances from source: .. code-block:: console $ curl -L https://github.com/nicolargo/glances/archive/vX.X.tar.gz -o glances-X.X.tar.gz $ tar -zxvf glances-*.tar.gz $ cd glances-* # python setup.py install *Note*: Python headers are required to install psutil. For example, you need to install first: * On Debian/Ubuntu, the *python-dev* package * On CentOS/Fedora, the *python-devel* package (from the EPEL repository) * On openSUSE/SLES/SLED, the *python-devel* package (from Oss repository) Puppet ------ You can install Glances using `Puppet`_: https://github.com/rverchere/puppet-glances Usage ===== Just run: .. code-block:: console $ glances and RTFM... Documentation ============= For complete documentation see `glances-doc`_. Author ====== Nicolas Hennion (@nicolargo) License ======= LGPL. See ``COPYING`` for more details. .. _psutil: https://code.google.com/p/psutil/ .. _glances_system: https://twitter.com/glances_system .. _PyPI: https://pypi.python.org/pypi .. _pip: http://www.pip-installer.org/ .. _Homebrew: http://mxcl.github.com/homebrew/ .. _MacPorts: https://www.macports.org/ .. _Glances-1.7.2-win32.msi: http://glances.s3.amazonaws.com/Glances-1.7.2-win32.msi .. _colorconsole: https://pypi.python.org/pypi/colorconsole .. _Puppet: https://puppetlabs.com/puppet/what-is-puppet/ .. _glances-doc: https://github.com/nicolargo/glances/blob/master/docs/glances-doc.rst glances-1.7.3/TODO000066400000000000000000000001371225327237200136340ustar00rootroot00000000000000See open issues here: https://github.com/nicolargo/glances/issues?milestone=&page=1&state=open glances-1.7.3/conf/000077500000000000000000000000001225327237200140705ustar00rootroot00000000000000glances-1.7.3/conf/glances-monitor.conf000066400000000000000000000057751225327237200200560ustar00rootroot00000000000000[cpu] # Limits values for CPU user in % # Defaults values if not defined: 50/70/90 user_careful=50 user_warning=70 user_critical=90 # Limits values for CPU system in % # Defaults values if not defined: 50/70/90 system_careful=50 system_warning=70 system_critical=90 # Limits values for CPU iowait in % # Defaults values if not defined: 40/60/80 # Not easy to tweek... # Source: http://blog.scoutapp.com/articles/2011/02/10/understanding-disk-i-o-when-should-you-be-worried # http://blog.logicmonitor.com/2011/04/20/troubleshooting-server-performance-and-application-monitoring-a-real-example/ # http://blog.developpeur-neurasthenique.fr/auto-hebergement-iowait-ma-tuer-1-2-vmstat-mpstat-atop-pidstat.html (FR) iowait_careful=40 iowait_warning=60 iowait_critical=80 [load] # Value * Core # Defaults values if not defined: 0.7/1.0/5.0 per Core # Source: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages # http://www.linuxjournal.com/article/9001 careful=0.7 warning=1.0 critical=5.0 [memory] # Defaults limits for free RAM memory in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [swap] # Defaults limits for free swap memory in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [temperature] # Temperatures in °C for sensors # Defaults values if not defined: 60/70/80 careful=60 warning=70 critical=80 [hddtemperature] # Temperatures in °C for hddtemp # Defaults values if not defined: 45/52/60 careful=45 warning=52 critical=60 [filesystem] # Defaults limits for free filesytem space in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [process] # Limits values for CPU per process in % # Defaults values if not defined: 50/70/90 cpu_careful=50 cpu_warning=70 cpu_critical=90 # Limits values for MEM per process in % # Defaults values if not defined: 50/70/90 mem_careful=50 mem_warning=70 mem_critical=90 [monitor] # Define the list of processes to monitor # *** This section is optionnal *** # The list is composed of item (list_#nb <= 10) # An item is defined: # * description: Description of the processes (max 16 chars) # * regex: regular expression of the processes to monitor # * command: (optional) full path to shell command/script for extended stat # Use with caution. Should return a single line string. # Only execute when at least one process is running # By default display CPU and MEM % # Limitation: Do not use in client / server mode # * countmin: (optional) minimal number of processes # A warning will be displayed if number of process < count # * countmax: (optional) maximum number of processes # A warning will be displayed if number of process > count list_1_description=Stress programs list_1_regex=.*stress.* list_1_command=stress --version list_1_countmin=1 list_1_countmax=4 list_2_description=Python programs list_2_regex=.*python.* list_3_description=Famous Xeyes list_3_regex=.*xeyes.* list_3_countmin=0 list_3_countmax=1 glances-1.7.3/conf/glances.conf000066400000000000000000000055031225327237200163560ustar00rootroot00000000000000[cpu] # Limits values for CPU user in % # Defaults values if not defined: 50/70/90 user_careful=50 user_warning=70 user_critical=90 # Limits values for CPU system in % # Defaults values if not defined: 50/70/90 system_careful=50 system_warning=70 system_critical=90 # Limits values for CPU iowait in % # Defaults values if not defined: 40/60/80 # Not easy to tweek... # Source: http://blog.scoutapp.com/articles/2011/02/10/understanding-disk-i-o-when-should-you-be-worried # http://blog.logicmonitor.com/2011/04/20/troubleshooting-server-performance-and-application-monitoring-a-real-example/ # http://blog.developpeur-neurasthenique.fr/auto-hebergement-iowait-ma-tuer-1-2-vmstat-mpstat-atop-pidstat.html (FR) iowait_careful=40 iowait_warning=60 iowait_critical=80 [load] # Value * Core # Defaults values if not defined: 0.7/1.0/5.0 per Core # Source: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages # http://www.linuxjournal.com/article/9001 careful=0.7 warning=1.0 critical=5.0 [memory] # Defaults limits for free RAM memory in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [swap] # Defaults limits for free swap memory in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [temperature] # Temperatures in °C for sensors # Defaults values if not defined: 60/70/80 careful=60 warning=70 critical=80 [hddtemperature] # Temperatures in °C for hddtemp # Defaults values if not defined: 45/52/60 careful=45 warning=52 critical=60 [filesystem] # Defaults limits for free filesytem space in % # Defaults values if not defined: 50/70/90 careful=50 warning=70 critical=90 [process] # Limits values for CPU per process in % # Defaults values if not defined: 50/70/90 cpu_careful=50 cpu_warning=70 cpu_critical=90 # Limits values for MEM per process in % # Defaults values if not defined: 50/70/90 mem_careful=50 mem_warning=70 mem_critical=90 [monitor] # Define the list of processes to monitor # *** This section is optionnal *** # The list is composed of item (list_#nb <= 10) # An item is defined: # * description: Description of the processes (max 16 chars) # * regex: regular expression of the processes to monitor # * command: (optional) full path to shell command/script for extended stat # Use with caution. Should return a single line string. # * countmin: (optional) minimal number of processes # A warning will be displayed if number of process < count # * countmax: (optional) maximum number of processes # A warning will be displayed if number of process > count #list_1_description=Redis server #list_1_regex=.*redis-server.* #list_1_command=echo "Additional stats" #list_2_description=Python programs #list_2_regex=.*python.* #list_2_countmin=1 #list_2_countmax=8 #list_3_description=Famous Xeyes #list_3_regex=.*xeyes.* glances-1.7.3/docs/000077500000000000000000000000001225327237200140735ustar00rootroot00000000000000glances-1.7.3/docs/Makefile000066400000000000000000000127001225327237200155330ustar00rootroot00000000000000# 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/Glances.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Glances.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/Glances" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Glances" @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." glances-1.7.3/docs/_build/000077500000000000000000000000001225327237200153315ustar00rootroot00000000000000glances-1.7.3/docs/_build/doctrees/000077500000000000000000000000001225327237200171415ustar00rootroot00000000000000glances-1.7.3/docs/_build/doctrees/environment.pickle000066400000000000000000000352241225327237200227040ustar00rootroot00000000000000(csphinx.environment BuildEnvironment qoq}q(Udlfilesqcsphinx.util FilenameUniqDict q)qc__builtin__ set q]RqbUappq NU reread_alwaysq h]Rq Utitlesq }q (U glances-docqcdocutils.nodes title q)q}q(U rawsourceqUU attributesq}q(Udupnamesq]Uclassesq]Ubackrefsq]Uidsq]Unamesq]uUchildrenq]qcdocutils.nodes Text qXGlancesqq}q(hXGlancesq Uparentq!hubaUtagnameq"Utitleq#ubUindexq$h)q%}q&(hUh}q'(h]h]h]h]h]uh]q(hX#Welcome to Glances's documentation!q)q*}q+(hX#Welcome to Glances's documentation!q,h!h%ubah"h#ubuU domaindataq-}q.(Ustd}q/(U anonlabels}q0(Umodindexq1U py-modindexUUgenindexq2h2UUsearchq3UsearchUuUlabels}q4(h1U py-modindexUcsphinx.locale _TranslationProxy q5csphinx.locale mygettext q6U Module Indexq7q8h6h7q9bh2h2Uh5h6UIndexq:q;h6h:qh6h=q?buUversionq@KUobjectsqA}U progoptions}uUc}qB(hA}h@KuUpy}qC(hA}Umodules}h@KuUjs}qD(hA}h@KuUrst}qE(hA}h@KuUcpp}qF(hA}h@KuuU glob_toctreesqGh]RqHUimagesqIh)qJ(Ximages/client-connected.pngqKh]qLhaRqMXclient-connected.pngqNqOXimages/load.pngqPh]qQhaRqRXload.pngqSqTXimages/cpu.pngqUh]qVhaRqWXcpu.pngqXqYXimages/screenshot-wide.pngqZh]q[haRq\Xscreenshot-wide.pngq]q^Ximages/logs.pngq_h]q`haRqaXlogs.pngqbqcXimages/per-cpu.pngqdh]qehaRqfX per-cpu.pngqgqhXimages/sensors.pngqih]qjhaRqkX sensors.pngqlqmXimages/diskio.pngqnh]qohaRqpX diskio.pngqqqrXimages/header.pngqsh]qthaRquX header.pngqvqwXimages/network.pngqxh]qyhaRqzX network.pngq{q|Ximages/processlist-wide.pngq}h]q~haRqXprocesslist-wide.pngqqX images/fs.pngqh]qhaRqXfs.pngqqXimages/client-disconnected.pngqh]qhaRqXclient-disconnected.pngqqXimages/hddtemp.pngqh]qhaRqX hddtemp.pngqqXimages/processlist.pngqh]qhaRqXprocesslist.pngqqXimages/mem-wide.pngqh]qhaRqX mem-wide.pngqqXimages/screenshot.pngqh]qhaRqXscreenshot.pngqqXimages/monitored.pngqh]qhaRqX monitored.pngqqXimages/footer.pngqh]qhaRqX footer.pngqqXimages/cpu-wide.pngqh]qhaRqX cpu-wide.pngqqXimages/battery.pngqh]qhaRqX battery.pngqqXimages/mem.pngqh]qhaRqXmem.pngqquh]q(hhhhlhNhvhhhgh{hhXhhhbhh]hqhhShheRqbU doctreedirqU8/home/nicolargo/Dropbox/dev/glances/docs/_build/doctreesqUversioning_conditionqU citationsq}UversionqK)UsrcdirqU(/home/nicolargo/Dropbox/dev/glances/docsqUconfigqcsphinx.config Config q)q}q(U source_suffixqU.rstUtexinfo_documentsq]q(UindexqUGlancesqXGlances DocumentationqXNicolas HennionqhU One line description of project.U MiscellaneoustqaU copyrightqX2013, Nicolas HennionUtemplates_pathq]qU _templatesqaUlatex_documentsq]q(hU Glances.texhhUmanualtqaU overridesq}Upygments_styleqUsphinxqUexclude_patternsq]qU_buildqaUreleaseqU1.7.3qUprojectqXGlancesUlatex_elementsq}Uhtmlhelp_basenameqU GlancesdochhU extensionsq]Uhtml_static_pathq]qU_staticqaU html_themeqUdefaultqU man_pagesq]q(UindexqUglancesh]qhaKtqaU master_docqhUsetupqNubUmetadataq}q(h}h$}uUversionchangesq}Utoc_num_entriesq}q(hKh$KuUnumbered_toctreesqh]RqU found_docsqh]q(hh$eRqU longtitlesq}q(hhh$h%uU dependenciesq}qhh]q(hKhPhhZh_hdhihnhshxh}hhhhhUhhhhhheRqsUtoctree_includesq}qh$]qX glances-docrasU temp_datar}Utocsr}r(hcdocutils.nodes bullet_list r)r}r(hUh}r(h]h]h]h]h]uh]rcdocutils.nodes list_item r )r }r (hUh}r (h]h]h]h]h]uh!jh]r (csphinx.addnodes compact_paragraph r)r}r(hUh}r(h]h]h]h]h]uh!j h]rcdocutils.nodes reference r)r}r(hUh}r(U anchornameUUrefurihh]h]h]h]h]Uinternaluh!jh]rhXGlancesrr}r(hh h!jubah"U referencerubah"Ucompact_paragraphrubj)r}r(hUh}r(h]h]h]h]h]uh!j h]r (j )r!}r"(hUh}r#(h]h]h]h]h]uh!jh]r$j)r%}r&(hUh}r'(h]h]h]h]h]uh!j!h]r(j)r)}r*(hUh}r+(U anchornameU #introductionUrefurihh]h]h]h]h]Uinternaluh!j%h]r,hX Introductionr-r.}r/(hX Introductionr0h!j)ubah"jubah"jubah"U list_itemr1ubj )r2}r3(hUh}r4(h]h]h]h]h]uh!jh]r5(j)r6}r7(hUh}r8(h]h]h]h]h]uh!j2h]r9j)r:}r;(hUh}r<(U anchornameU#usageUrefurihh]h]h]h]h]Uinternaluh!j6h]r=hXUsager>r?}r@(hXUsagerAh!j:ubah"jubah"jubj)rB}rC(hUh}rD(h]h]h]h]h]uh!j2h]rE(j )rF}rG(hUh}rH(h]h]h]h]h]uh!jBh]rIj)rJ}rK(hUh}rL(h]h]h]h]h]uh!jFh]rMj)rN}rO(hUh}rP(U anchornameU#standalone-modeUrefurihh]h]h]h]h]Uinternaluh!jJh]rQhXStandalone moderRrS}rT(hXStandalone moderUh!jNubah"jubah"jubah"j1ubj )rV}rW(hUh}rX(h]h]h]h]h]uh!jBh]rYj)rZ}r[(hUh}r\(h]h]h]h]h]uh!jVh]r]j)r^}r_(hUh}r`(U anchornameU#client-server-modeUrefurihh]h]h]h]h]Uinternaluh!jZh]rahXClient/Server moderbrc}rd(hXClient/Server modereh!j^ubah"jubah"jubah"j1ubeh"U bullet_listrfubeh"j1ubj )rg}rh(hUh}ri(h]h]h]h]h]uh!jh]rj(j)rk}rl(hUh}rm(h]h]h]h]h]uh!jgh]rnj)ro}rp(hUh}rq(U anchornameU#command-referenceUrefurihh]h]h]h]h]Uinternaluh!jkh]rrhXCommand referencersrt}ru(hXCommand referencervh!joubah"jubah"jubj)rw}rx(hUh}ry(h]h]h]h]h]uh!jgh]rz(j )r{}r|(hUh}r}(h]h]h]h]h]uh!jwh]r~j)r}r(hUh}r(h]h]h]h]h]uh!j{h]rj)r}r(hUh}r(U anchornameU#command-line-optionsUrefurihh]h]h]h]h]Uinternaluh!jh]rhXCommand-line optionsrr}r(hXCommand-line optionsrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jwh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#interactive-commandsUrefurihh]h]h]h]h]Uinternaluh!jh]rhXInteractive commandsrr}r(hXInteractive commandsrh!jubah"jubah"jubah"j1ubeh"jfubeh"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#configurationUrefurihh]h]h]h]h]Uinternaluh!jh]rhX Configurationrr}r(hX Configurationrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]r(j)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#anatomy-of-the-applicationUrefurihh]h]h]h]h]Uinternaluh!jh]rhXAnatomy of the applicationrr}r(hXAnatomy of the applicationrh!jubah"jubah"jubj)r}r(hUh}r(h]h]h]h]h]uh!jh]r(j )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#legendUrefurihh]h]h]h]h]Uinternaluh!jh]rhXLegendrr}r(hXLegendrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#headerUrefurihh]h]h]h]h]Uinternaluh!jh]rhXHeaderrr}r(hXHeaderrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#cpuUrefurihh]h]h]h]h]Uinternaluh!jh]rhXCPUrr}r(hXCPUrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#loadUrefurihh]h]h]h]h]Uinternaluh!jh]rhXLoadrr}r(hXLoadrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r (U anchornameU#memoryUrefurihh]h]h]h]h]Uinternaluh!jh]r hXMemoryr r }r (hXMemoryrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#networkUrefurihh]h]h]h]h]Uinternaluh!jh]rhXNetworkrr}r(hXNetworkrh!jubah"jubah"jubah"j1ubj )r}r (hUh}r!(h]h]h]h]h]uh!jh]r"j)r#}r$(hUh}r%(h]h]h]h]h]uh!jh]r&j)r'}r((hUh}r)(U anchornameU#sensorsUrefurihh]h]h]h]h]Uinternaluh!j#h]r*hXSensorsr+r,}r-(hXSensorsr.h!j'ubah"jubah"jubah"j1ubj )r/}r0(hUh}r1(h]h]h]h]h]uh!jh]r2j)r3}r4(hUh}r5(h]h]h]h]h]uh!j/h]r6j)r7}r8(hUh}r9(U anchornameU #disk-i-oUrefurihh]h]h]h]h]Uinternaluh!j3h]r:hXDisk I/Or;r<}r=(hXDisk I/Or>h!j7ubah"jubah"jubah"j1ubj )r?}r@(hUh}rA(h]h]h]h]h]uh!jh]rBj)rC}rD(hUh}rE(h]h]h]h]h]uh!j?h]rFj)rG}rH(hUh}rI(U anchornameU #file-systemUrefurihh]h]h]h]h]Uinternaluh!jCh]rJhX File systemrKrL}rM(hX File systemrNh!jGubah"jubah"jubah"j1ubj )rO}rP(hUh}rQ(h]h]h]h]h]uh!jh]rRj)rS}rT(hUh}rU(h]h]h]h]h]uh!jOh]rVj)rW}rX(hUh}rY(U anchornameU#processes-listUrefurihh]h]h]h]h]Uinternaluh!jSh]rZhXProcesses listr[r\}r](hXProcesses listr^h!jWubah"jubah"jubah"j1ubj )r_}r`(hUh}ra(h]h]h]h]h]uh!jh]rbj)rc}rd(hUh}re(h]h]h]h]h]uh!j_h]rfj)rg}rh(hUh}ri(U anchornameU#monitored-processes-listUrefurihh]h]h]h]h]Uinternaluh!jch]rjhXMonitored processes listrkrl}rm(hXMonitored processes listrnh!jgubah"jubah"jubah"j1ubj )ro}rp(hUh}rq(h]h]h]h]h]uh!jh]rrj)rs}rt(hUh}ru(h]h]h]h]h]uh!joh]rvj)rw}rx(hUh}ry(U anchornameU#logsUrefurihh]h]h]h]h]Uinternaluh!jsh]rzhXLogsr{r|}r}(hXLogsr~h!jwubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#footerUrefurihh]h]h]h]h]Uinternaluh!jh]rhXFooterrr}r(hXFooterrh!jubah"jubah"jubah"j1ubeh"jfubeh"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#api-documentationUrefurihh]h]h]h]h]Uinternaluh!jh]rhXAPI documentationrr}r(hXAPI documentationrh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#supportUrefurihh]h]h]h]h]Uinternaluh!jh]rhXSupportrr}r(hXSupportrh!jubah"jubah"jubah"j1ubeh"jfubeh"j1ubah"jfubh$j)r}r(hUh}r(h]h]h]h]h]uh]r(j )r}r(hUh}r(h]h]h]h]h]uh!jh]r(j)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameUUrefurih$h]h]h]h]h]Uinternaluh!jh]rhX#Welcome to Glances's documentation!rr}r(hh,h!jubah"jubah"jubj)r}r(hUh}r(h]h]h]h]h]uh!jh]r(j )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU #get-the-codeUrefurih$h]h]h]h]h]Uinternaluh!jh]rhX Get the coderr}r(hX Get the coderh!jubah"jubah"jubah"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]r(j)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU #contentsUrefurih$h]h]h]h]h]Uinternaluh!jh]rhXContentsrr}r(hXContentsrh!jubah"jubah"jubj)r}r(hUh}r(h]h]h]h]h]uh!jh]rcsphinx.addnodes toctree r)r}r(hUh}r(UnumberedKUparenth$U titlesonlyUglobh]h]h]h]h]Uentries]rNjraUhiddenU includefiles]rjaUmaxdepthKuh!jh]h"Utoctreerubah"jfubeh"j1ubeh"jfubeh"j1ubj )r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(h]h]h]h]h]uh!jh]rj)r}r(hUh}r(U anchornameU#indices-and-tablesUrefurih$h]h]h]h]h]Uinternaluh!jh]rhXIndices and tablesrr}r(hXIndices and tablesrh!jubah"jubah"jubah"j1ubeh"jfubuU indexentriesr}r(h]h$]uUall_docsr}r(hGAԫ]1h$GAԫ]1uUsettingsr}r(Ucloak_email_addressesUtrim_footnote_reference_spaceU halt_levelKUsectsubtitle_xformUembed_stylesheetU pep_base_urlUhttp://www.python.org/dev/peps/rUdoctitle_xformUwarning_streamcsphinx.util.nodes WarningStream r )r }r (U_rer cre _compile r U+\((DEBUG|INFO|WARNING|ERROR|SEVERE)/[0-4]\)rKRrUwarnfuncrNubUenvhU rfc_base_urlUhttp://tools.ietf.org/html/rUgettext_compactUinput_encodingU utf-8-sigruUfiles_to_rebuildr}rjh]rh$aRrsUtoc_secnumbersr}U_nitpick_ignorerh]RrU _warnfuncrNub.glances-1.7.3/docs/_build/doctrees/glances-doc.doctree000066400000000000000000003604401225327237200226760ustar00rootroot00000000000000cdocutils.nodes document q)q}q(U nametypesq}q(XloadqNXcommand referenceqNXlogsqNXprocesses listq NXheaderq NXclient/server modeq NXstandalone modeq NXglancesq NXnetworkqNXapi documentationqNX introductionqNXsupportqNX3X1X file systemqNX2Xmonitored processes listqNXmemoryqNXusageqNXinteractive commandsqNXxml-rpc serverqXcommand-line optionsqNXsensorsqNX configurationqNXlegendqNXfooterqNXpsutilqXtable of contentsqNXdisk i/oqNXcpuq NXanatomy of the applicationq!NuUsubstitution_defsq"}q#Uparse_messagesq$]q%Ucurrent_sourceq&NU decorationq'NUautofootnote_startq(KUnameidsq)}q*(hUloadq+hUcommand-referenceq,hUlogsq-h Uprocesses-listq.h Uheaderq/h Uclient-server-modeq0h Ustandalone-modeq1h Uglancesq2hUnetworkq3hUapi-documentationq4hU introductionq5hUsupportq6X3Uid6q7X1Uid4q8hU file-systemq9X2Uid5q:hUmonitored-processes-listq;hUmemoryqhUxml-rpc-serverq?hUcommand-line-optionsq@hUsensorsqAhU configurationqBhUlegendqChUfooterqDhUpsutilqEhUtable-of-contentsqFhUdisk-i-oqGh UcpuqHh!Uanatomy-of-the-applicationqIuUchildrenqJ]qKcdocutils.nodes section qL)qM}qN(U rawsourceqOUUparentqPhUsourceqQcdocutils.nodes reprunicode qRX8/home/nicolargo/Dropbox/dev/glances/docs/glances-doc.rstqSqT}qUbUtagnameqVUsectionqWU attributesqX}qY(UdupnamesqZ]Uclassesq[]Ubackrefsq\]Uidsq]]q^h2aUnamesq_]q`h auUlineqaKUdocumentqbhhJ]qc(cdocutils.nodes title qd)qe}qf(hOXGlancesqghPhMhQhThVUtitleqhhX}qi(h]]h\]hZ]h[]h_]UrefidqjUid7qkuhaKhbhhJ]qlcdocutils.nodes Text qmXGlancesqnqo}qp(hOhghPheubaubcdocutils.nodes paragraph qq)qr}qs(hOX.This manual describes *Glances* version 1.7.3.qthPhMhQhThVU paragraphquhX}qv(hZ]h[]h\]h]]h_]uhaKhbhhJ]qw(hmXThis manual describes qxqy}qz(hOXThis manual describes hPhrubcdocutils.nodes emphasis q{)q|}q}(hOX *Glances*hX}q~(hZ]h[]h\]h]]h_]uhPhrhJ]qhmXGlancesqq}q(hOUhPh|ubahVUemphasisqubhmX version 1.7.3.qq}q(hOX version 1.7.3.hPhrubeubhq)q}q(hOX>Copyright © 2012-2013 Nicolas Hennion qhPhMhQhThVhuhX}q(hZ]h[]h\]h]]h_]uhaKhbhhJ]q(hmX(Copyright © 2012-2013 Nicolas Hennion q}q(hOX>hPhubeubhq)q}q(hOX November 2013qhPhMhQhThVhuhX}q(hZ]h[]h\]h]]h_]uhaK hbhhJ]qhmX November 2013qq}q(hOhhPhubaubcdocutils.nodes topic q)q}q(hOUhPhMhQhThVUtopicqhX}q(hZ]h[]qUcontentsqah\]h]]qhFah_]qhauhaK hbhhJ]q(hd)q}q(hOXTable of ContentsqhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qhmXTable of Contentsqq}q(hOhhPhubahVhhubcdocutils.nodes bullet_list q)q}q(hOUhPhhQNhVU bullet_listqhX}q(hZ]h[]h\]h]]h_]uhaNhbhhJ]qcdocutils.nodes list_item q)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]q(hq)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qh)q}q(hOUhX}q(h]]qhkah\]hZ]h[]h_]Urefidh2uhPhhJ]qhmXGlancesqȅq}q(hOhghPhubahVhubahVhuubh)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]q(h)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qhq)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qh)q}q(hOUhX}q(h]]qUid8qah\]hZ]h[]h_]Urefidh5uhPhhJ]qhmX Introductionq݅q}q(hOX IntroductionqhPhubahVhubahVhuubahVU list_itemqubh)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]q(hq)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qh)q}q(hOUhX}q(h]]qUid9qah\]hZ]h[]h_]Urefidh=uhPhhJ]qhmXUsageqq}q(hOXUsageqhPhubahVhubahVhuubh)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]q(h)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qhq)q}q(hOUhX}q(hZ]h[]h\]h]]h_]uhPhhJ]qh)r}r(hOUhX}r(h]]rUid10rah\]hZ]h[]h_]Urefidh1uhPhhJ]rhmXStandalone moderr}r(hOXStandalone moder hPjubahVhubahVhuubahVhubh)r }r (hOUhX}r (hZ]h[]h\]h]]h_]uhPhhJ]r hq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPj hJ]rh)r}r(hOUhX}r(h]]rUid11rah\]hZ]h[]h_]Urefidh0uhPjhJ]rhmXClient/Server moderr}r(hOXClient/Server moderhPjubahVhubahVhuubahVhubehVhubehVhubh)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPhhJ]r(hq)r }r!(hOUhX}r"(hZ]h[]h\]h]]h_]uhPjhJ]r#h)r$}r%(hOUhX}r&(h]]r'Uid12r(ah\]hZ]h[]h_]Urefidh,uhPj hJ]r)hmXCommand referencer*r+}r,(hOXCommand referencer-hPj$ubahVhubahVhuubh)r.}r/(hOUhX}r0(hZ]h[]h\]h]]h_]uhPjhJ]r1(h)r2}r3(hOUhX}r4(hZ]h[]h\]h]]h_]uhPj.hJ]r5hq)r6}r7(hOUhX}r8(hZ]h[]h\]h]]h_]uhPj2hJ]r9h)r:}r;(hOUhX}r<(h]]r=Uid13r>ah\]hZ]h[]h_]Urefidh@uhPj6hJ]r?hmXCommand-line optionsr@rA}rB(hOXCommand-line optionsrChPj:ubahVhubahVhuubahVhubh)rD}rE(hOUhX}rF(hZ]h[]h\]h]]h_]uhPj.hJ]rGhq)rH}rI(hOUhX}rJ(hZ]h[]h\]h]]h_]uhPjDhJ]rKh)rL}rM(hOUhX}rN(h]]rOUid14rPah\]hZ]h[]h_]Urefidh>uhPjHhJ]rQhmXInteractive commandsrRrS}rT(hOXInteractive commandsrUhPjLubahVhubahVhuubahVhubehVhubehVhubh)rV}rW(hOUhX}rX(hZ]h[]h\]h]]h_]uhPhhJ]rYhq)rZ}r[(hOUhX}r\(hZ]h[]h\]h]]h_]uhPjVhJ]r]h)r^}r_(hOUhX}r`(h]]raUid15rbah\]hZ]h[]h_]UrefidhBuhPjZhJ]rchmX Configurationrdre}rf(hOX ConfigurationrghPj^ubahVhubahVhuubahVhubh)rh}ri(hOUhX}rj(hZ]h[]h\]h]]h_]uhPhhJ]rk(hq)rl}rm(hOUhX}rn(hZ]h[]h\]h]]h_]uhPjhhJ]roh)rp}rq(hOUhX}rr(h]]rsUid16rtah\]hZ]h[]h_]UrefidhIuhPjlhJ]ruhmXAnatomy of the applicationrvrw}rx(hOXAnatomy of the applicationryhPjpubahVhubahVhuubh)rz}r{(hOUhX}r|(hZ]h[]h\]h]]h_]uhPjhhJ]r}(h)r~}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rhq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPj~hJ]rh)r}r(hOUhX}r(h]]rUid17rah\]hZ]h[]h_]UrefidhCuhPjhJ]rhmXLegendrr}r(hOXLegendrhPjubahVhubahVhuubahVhubh)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rhq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rh)r}r(hOUhX}r(h]]rUid18rah\]hZ]h[]h_]Urefidh/uhPjhJ]rhmXHeaderrr}r(hOXHeaderrhPjubahVhubahVhuubahVhubh)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rhq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rh)r}r(hOUhX}r(h]]rUid19rah\]hZ]h[]h_]UrefidhHuhPjhJ]rhmXCPUrr}r(hOXCPUrhPjubahVhubahVhuubahVhubh)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rhq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rh)r}r(hOUhX}r(h]]rUid20rah\]hZ]h[]h_]Urefidh+uhPjhJ]rhmXLoadrr}r(hOXLoadrhPjubahVhubahVhuubahVhubh)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rhq)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rh)r}r(hOUhX}r(h]]rUid21rah\]hZ]h[]h_]Urefidhah\]hZ]h[]h_]Urefidh;uhPj6hJ]r?hmXMonitored processes listr@rA}rB(hOXMonitored processes listrChPj:ubahVhubahVhuubahVhubh)rD}rE(hOUhX}rF(hZ]h[]h\]h]]h_]uhPjzhJ]rGhq)rH}rI(hOUhX}rJ(hZ]h[]h\]h]]h_]uhPjDhJ]rKh)rL}rM(hOUhX}rN(h]]rOUid28rPah\]hZ]h[]h_]Urefidh-uhPjHhJ]rQhmXLogsrRrS}rT(hOXLogsrUhPjLubahVhubahVhuubahVhubh)rV}rW(hOUhX}rX(hZ]h[]h\]h]]h_]uhPjzhJ]rYhq)rZ}r[(hOUhX}r\(hZ]h[]h\]h]]h_]uhPjVhJ]r]h)r^}r_(hOUhX}r`(h]]raUid29rbah\]hZ]h[]h_]UrefidhDuhPjZhJ]rchmXFooterrdre}rf(hOXFooterrghPj^ubahVhubahVhuubahVhubehVhubehVhubh)rh}ri(hOUhX}rj(hZ]h[]h\]h]]h_]uhPhhJ]rkhq)rl}rm(hOUhX}rn(hZ]h[]h\]h]]h_]uhPjhhJ]roh)rp}rq(hOUhX}rr(h]]rsUid30rtah\]hZ]h[]h_]Urefidh4uhPjlhJ]ruhmXAPI documentationrvrw}rx(hOXAPI documentationryhPjpubahVhubahVhuubahVhubh)rz}r{(hOUhX}r|(hZ]h[]h\]h]]h_]uhPhhJ]r}hq)r~}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjzhJ]rh)r}r(hOUhX}r(h]]rUid31rah\]hZ]h[]h_]Urefidh6uhPj~hJ]rhmXSupportrr}r(hOXSupportrhPjubahVhubahVhuubahVhubehVhubehVhubaubeubhL)r}r(hOUhPhMhQhThVhWhX}r(hZ]h[]h\]h]]rh5ah_]rhauhaKhbhhJ]r(hd)r}r(hOhhPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjhuhaKhbhhJ]rhmX Introductionrr}r(hOhhPjubaubhq)r}r(hOXGlances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information.rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]rhmXGlances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information.rr}r(hOjhPjubaubhq)r}r(hOXGlances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring.rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]rhmXGlances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring.rr}r(hOjhPjubaubhq)r}r(hOX`Glances is written in Python and uses the `psutil`_ library to get information from your system.rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(hmX*Glances is written in Python and uses the rr}r(hOX*Glances is written in Python and uses the hPjubh)r}r(hOX `psutil`_UresolvedrKhPjhVhhX}r(UnameXpsutilrUrefurirX!https://code.google.com/p/psutil/rh]]h\]hZ]h[]h_]uhJ]rhmXpsutilrr}r(hOUhPjubaubhmX- library to get information from your system.rr}r(hOX- library to get information from your system.hPjubeubhq)r}r(hOXConsole (80x24)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]rhmXConsole (80x24)rr}r(hOjhPjubaubcdocutils.nodes image r)r}r(hOX!.. image:: images/screenshot.png hPjhQhThVUimagerhX}r(UuriXimages/screenshot.pngrh]]h\]hZ]h[]U candidatesr}rU*jsh_]uhaKhbhhJ]ubhq)r}r(hOXFull view (>80x24)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]rhmXFull view (>80x24)rr}r(hOjhPjubaubj)r}r(hOX&.. image:: images/screenshot-wide.png hPjhQhThVjhX}r(UuriXimages/screenshot-wide.pngrh]]h\]hZ]h[]j}rU*jsh_]uhaK hbhhJ]ubeubhL)r}r(hOUhPhMhQhThVhWhX}r(hZ]h[]h\]h]]rh=ah_]rhauhaK"hbhhJ]r(hd)r}r(hOhhPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjhuhaK"hbhhJ]rhmXUsagerr}r(hOhhPjubaubhL)r}r(hOUhPjhQhThVhWhX}r(hZ]h[]h\]h]]rh1ah_]rh auhaK%hbhhJ]r(hd)r}r(hOj hPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjjuhaK%hbhhJ]rhmXStandalone moderr}r(hOj hPjubaubhq)r}r(hOX Simply run:rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK'hbhhJ]rhmX Simply run:rr}r(hOjhPjubaubcdocutils.nodes literal_block r)r}r(hOX $ glanceshPjhQhThVU literal_blockrhX}r(UlinenosrUlanguagerXconsoleU xml:spacerUpreserverh]]h\]hZ]h[]h_]uhaK)hbhhJ]rhmX $ glancesrr }r (hOUhPjubaubeubhL)r }r (hOUhPjhQhThVhWhX}r (hZ]h[]h\]h]]rh0ah_]rh auhaK.hbhhJ]r(hd)r}r(hOjhPj hQhThVhhhX}r(h]]h\]hZ]h[]h_]hjjuhaK.hbhhJ]rhmXClient/Server moderr}r(hOjhPjubaubhq)r}r(hOXzIf you want to remotely monitor a machine, called ``server``, from another one, called ``client``, just run on the server:hPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK0hbhhJ]r(hmX2If you want to remotely monitor a machine, called rr}r(hOX2If you want to remotely monitor a machine, called hPjubcdocutils.nodes literal r)r }r!(hOX ``server``hX}r"(hZ]h[]h\]h]]h_]uhPjhJ]r#hmXserverr$r%}r&(hOUhPj ubahVUliteralr'ubhmX, from another one, called r(r)}r*(hOX, from another one, called hPjubj)r+}r,(hOX ``client``hX}r-(hZ]h[]h\]h]]h_]uhPjhJ]r.hmXclientr/r0}r1(hOUhPj+ubahVj'ubhmX, just run on the server:r2r3}r4(hOX, just run on the server:hPjubeubj)r5}r6(hOXserver$ glances -shPj hQhThVjhX}r7(jjXconsolejjh]]h\]hZ]h[]h_]uhaK3hbhhJ]r8hmXserver$ glances -sr9r:}r;(hOUhPj5ubaubhq)r<}r=(hOXand on the client:r>hPj hQhThVhuhX}r?(hZ]h[]h\]h]]h_]uhaK7hbhhJ]r@hmXand on the client:rArB}rC(hOj>hPj<ubaubj)rD}rE(hOXclient$ glances -c @serverhPj hQhThVjhX}rF(jjXconsolejjh]]h\]hZ]h[]h_]uhaK9hbhhJ]rGhmXclient$ glances -c @serverrHrI}rJ(hOUhPjDubaubhq)rK}rL(hOX>where ``@server`` is the IP address or hostname of the server.rMhPj hQhThVhuhX}rN(hZ]h[]h\]h]]h_]uhaK=hbhhJ]rO(hmXwhere rPrQ}rR(hOXwhere hPjKubj)rS}rT(hOX ``@server``hX}rU(hZ]h[]h\]h]]h_]uhPjKhJ]rVhmX@serverrWrX}rY(hOUhPjSubahVj'ubhmX- is the IP address or hostname of the server.rZr[}r\(hOX- is the IP address or hostname of the server.hPjKubeubhq)r]}r^(hOX_In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``.r_hPj hQhThVhuhX}r`(hZ]h[]h\]h]]h_]uhaK?hbhhJ]ra(hmX-In server mode, you can set the bind address rbrc}rd(hOX-In server mode, you can set the bind address hPj]ubj)re}rf(hOX``-B ADDRESS``hX}rg(hZ]h[]h\]h]]h_]uhPj]hJ]rhhmX -B ADDRESSrirj}rk(hOUhPjeubahVj'ubhmX and listening TCP port rlrm}rn(hOX and listening TCP port hPj]ubj)ro}rp(hOX ``-p PORT``hX}rq(hZ]h[]h\]h]]h_]uhPj]hJ]rrhmX-p PORTrsrt}ru(hOUhPjoubahVj'ubhmX.rv}rw(hOX.hPj]ubeubhq)rx}ry(hOXCIn client mode, you can set the TCP port of the server ``-p PORT``.rzhPj hQhThVhuhX}r{(hZ]h[]h\]h]]h_]uhaKAhbhhJ]r|(hmX7In client mode, you can set the TCP port of the server r}r~}r(hOX7In client mode, you can set the TCP port of the server hPjxubj)r}r(hOX ``-p PORT``hX}r(hZ]h[]h\]h]]h_]uhPjxhJ]rhmX-p PORTrr}r(hOUhPjubahVj'ubhmX.r}r(hOX.hPjxubeubhq)r}r(hOXuDefault binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKChbhhJ]r(hmXDefault binding address is rr}r(hOXDefault binding address is hPjubj)r}r(hOX ``0.0.0.0``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX0.0.0.0rr}r(hOUhPjubahVj'ubhmXE (Glances will listen on all the network interfaces) and TCP port is rr}r(hOXE (Glances will listen on all the network interfaces) and TCP port is hPjubj)r}r(hOX ``61209``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX61209rr}r(hOUhPjubahVj'ubhmX.r}r(hOX.hPjubeubhq)r}r(hOX9In client/server mode, limits are set by the server side.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKEhbhhJ]rhmX9In client/server mode, limits are set by the server side.rr}r(hOjhPjubaubhq)r}r(hOXDYou can also set a password to access to the server ``-P password``.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKGhbhhJ]r(hmX4You can also set a password to access to the server rr}r(hOX4You can also set a password to access to the server hPjubj)r}r(hOX``-P password``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX -P passwordrr}r(hOUhPjubahVj'ubhmX.r}r(hOX.hPjubeubhq)r}r(hOX\Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to all IPv6 addresses.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKIhbhhJ]r(hmX Glances is rr}r(hOX Glances is hPjubj)r}r(hOX``IPv6``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXIPv6rr}r(hOUhPjubahVj'ubhmX compatible. Just use the rr}r(hOX compatible. Just use the hPjubj)r}r(hOX ``-B ::``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-B ::rr}r(hOUhPjubahVj'ubhmX& option to bind to all IPv6 addresses.rr}r(hOX& option to bind to all IPv6 addresses.hPjubeubeubeubhL)r}r(hOUhPhMhQhThVhWhX}r(hZ]h[]h\]h]]rh,ah_]rhauhaKLhbhhJ]r(hd)r}r(hOj-hPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjj(uhaKLhbhhJ]rhmXCommand referencerr}r(hOj-hPjubaubhL)r}r(hOUhPjhQhThVhWhX}r(hZ]h[]h\]h]]rh@ah_]rhauhaKOhbhhJ]r(hd)r}r(hOjChPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjj>uhaKOhbhhJ]rhmXCommand-line optionsrr}r(hOjChPjubaubcdocutils.nodes option_list r)r}r(hOUhPjhQhThVU option_listrhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(cdocutils.nodes option_list_item r)r}r(hOUhPjhQhThVUoption_list_itemrhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(cdocutils.nodes option_group r)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rcdocutils.nodes option r)r}r(hOX-brhX}r(hZ]h[]h\]h]]h_]uhPjhJ]r cdocutils.nodes option_string r )r }r (hOjhX}r (hZ]h[]h\]h]]h_]uhPjhJ]rhmX-brr}r(hOUhPj ubahVU option_stringrubahVUoptionrubahVU option_grouprubcdocutils.nodes description r)r}r(hOXADisplay network rate in Byte per second (default: bit per second)rhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKQhJ]rhmXADisplay network rate in Byte per second (default: bit per second)rr }r!(hOjhPjubaubahVU descriptionr"ubeubj)r#}r$(hOUhPjhQhThVjhX}r%(hZ]h[]h\]h]]h_]uhaNhbhhJ]r&(j)r'}r((hOUhX}r)(hZ]h[]h\]h]]h_]uhPj#hJ]r*j)r+}r,(hOX-B IPhX}r-(hZ]h[]h\]h]]h_]uhPj'hJ]r.(j )r/}r0(hOX-BhX}r1(hZ]h[]h\]h]]h_]uhPj+hJ]r2hmX-Br3r4}r5(hOUhPj/ubahVjubcdocutils.nodes option_argument r6)r7}r8(hOXIPhX}r9(h]]h\]hZ]U delimiterU h[]h_]uhPj+hJ]r:hmXIPr;r<}r=(hOUhPj7ubahVUoption_argumentr>ubehVjubahVjubj)r?}r@(hOX6Bind server to the given IPv4/IPv6 address or hostnamerAhX}rB(hZ]h[]h\]h]]h_]uhPj#hJ]rChq)rD}rE(hOjAhPj?hQhThVhuhX}rF(hZ]h[]h\]h]]h_]uhaKRhJ]rGhmX6Bind server to the given IPv4/IPv6 address or hostnamerHrI}rJ(hOjAhPjDubaubahVj"ubeubj)rK}rL(hOUhPjhQhThVjhX}rM(hZ]h[]h\]h]]h_]uhaNhbhhJ]rN(j)rO}rP(hOUhX}rQ(hZ]h[]h\]h]]h_]uhPjKhJ]rRj)rS}rT(hOX-c IPhX}rU(hZ]h[]h\]h]]h_]uhPjOhJ]rV(j )rW}rX(hOX-chX}rY(hZ]h[]h\]h]]h_]uhPjShJ]rZhmX-cr[r\}r](hOUhPjWubahVjubj6)r^}r_(hOXIPhX}r`(h]]h\]hZ]U delimiterU h[]h_]uhPjShJ]rahmXIPrbrc}rd(hOUhPj^ubahVj>ubehVjubahVjubj)re}rf(hOX<Connect to a Glances server by IPv4/IPv6 address or hostnamerghX}rh(hZ]h[]h\]h]]h_]uhPjKhJ]rihq)rj}rk(hOjghPjehQhThVhuhX}rl(hZ]h[]h\]h]]h_]uhaKShJ]rmhmX<Connect to a Glances server by IPv4/IPv6 address or hostnamernro}rp(hOjghPjjubaubahVj"ubeubj)rq}rr(hOUhPjhQhThVjhX}rs(hZ]h[]h\]h]]h_]uhaNhbhhJ]rt(j)ru}rv(hOUhX}rw(hZ]h[]h\]h]]h_]uhPjqhJ]rxj)ry}rz(hOX-C FILEhX}r{(hZ]h[]h\]h]]h_]uhPjuhJ]r|(j )r}}r~(hOX-ChX}r(hZ]h[]h\]h]]h_]uhPjyhJ]rhmX-Crr}r(hOUhPj}ubahVjubj6)r}r(hOXFILEhX}r(h]]h\]hZ]U delimiterU h[]h_]uhPjyhJ]rhmXFILErr}r(hOUhPjubahVj>ubehVjubahVjubj)r}r(hOXPath to the configuration filerhX}r(hZ]h[]h\]h]]h_]uhPjqhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKThJ]rhmXPath to the configuration filerr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-drhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-drr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOXDisable disk I/O modulerhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKUhJ]rhmXDisable disk I/O modulerr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-erhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-err}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOX6Enable sensors module (requires pysensors, Linux-only)rhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKVhJ]rhmX6Enable sensors module (requires pysensors, Linux-only)rr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-f FILEhX}r(hZ]h[]h\]h]]h_]uhPjhJ]r(j )r}r(hOX-fhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-frr}r(hOUhPjubahVjubj6)r}r(hOXFILEhX}r(h]]h\]hZ]U delimiterU h[]h_]uhPjhJ]rhmXFILErr}r(hOUhPjubahVj>ubehVjubahVjubj)r}r(hOX&Set the HTML output folder or CSV filerhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKWhJ]rhmX&Set the HTML output folder or CSV filerr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-hrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]r j )r }r (hOjhX}r (hZ]h[]h\]h]]h_]uhPjhJ]r hmX-hrr}r(hOUhPj ubahVjubahVjubahVjubj)r}r(hOXDisplay the help and exitrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKXhJ]rhmXDisplay the help and exitrr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r (j)r!}r"(hOUhX}r#(hZ]h[]h\]h]]h_]uhPjhJ]r$j)r%}r&(hOX-mr'hX}r((hZ]h[]h\]h]]h_]uhPj!hJ]r)j )r*}r+(hOj'hX}r,(hZ]h[]h\]h]]h_]uhPj%hJ]r-hmX-mr.r/}r0(hOUhPj*ubahVjubahVjubahVjubj)r1}r2(hOXDisable mount moduler3hX}r4(hZ]h[]h\]h]]h_]uhPjhJ]r5hq)r6}r7(hOj3hPj1hQhThVhuhX}r8(hZ]h[]h\]h]]h_]uhaKYhJ]r9hmXDisable mount moduler:r;}r<(hOj3hPj6ubaubahVj"ubeubj)r=}r>(hOUhPjhQhThVjhX}r?(hZ]h[]h\]h]]h_]uhaNhbhhJ]r@(j)rA}rB(hOUhX}rC(hZ]h[]h\]h]]h_]uhPj=hJ]rDj)rE}rF(hOX-nrGhX}rH(hZ]h[]h\]h]]h_]uhPjAhJ]rIj )rJ}rK(hOjGhX}rL(hZ]h[]h\]h]]h_]uhPjEhJ]rMhmX-nrNrO}rP(hOUhPjJubahVjubahVjubahVjubj)rQ}rR(hOXDisable network modulerShX}rT(hZ]h[]h\]h]]h_]uhPj=hJ]rUhq)rV}rW(hOjShPjQhQhThVhuhX}rX(hZ]h[]h\]h]]h_]uhaKZhJ]rYhmXDisable network modulerZr[}r\(hOjShPjVubaubahVj"ubeubj)r]}r^(hOUhPjhQhThVjhX}r_(hZ]h[]h\]h]]h_]uhaNhbhhJ]r`(j)ra}rb(hOUhX}rc(hZ]h[]h\]h]]h_]uhPj]hJ]rdj)re}rf(hOX -o OUTPUThX}rg(hZ]h[]h\]h]]h_]uhPjahJ]rh(j )ri}rj(hOX-ohX}rk(hZ]h[]h\]h]]h_]uhPjehJ]rlhmX-ormrn}ro(hOUhPjiubahVjubj6)rp}rq(hOXOUTPUThX}rr(h]]h\]hZ]U delimiterU h[]h_]uhPjehJ]rshmXOUTPUTrtru}rv(hOUhPjpubahVj>ubehVjubahVjubj)rw}rx(hOX1Define additional output (available: HTML or CSV)ryhX}rz(hZ]h[]h\]h]]h_]uhPj]hJ]r{hq)r|}r}(hOjyhPjwhQhThVhuhX}r~(hZ]h[]h\]h]]h_]uhaK[hJ]rhmX1Define additional output (available: HTML or CSV)rr}r(hOjyhPj|ubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-p PORThX}r(hZ]h[]h\]h]]h_]uhPjhJ]r(j )r}r(hOX-phX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-prr}r(hOUhPjubahVjubj6)r}r(hOXPORThX}r(h]]h\]hZ]U delimiterU h[]h_]uhPjhJ]rhmXPORTrr}r(hOUhPjubahVj>ubehVjubahVjubj)r}r(hOX2Define the client/server TCP port (default: 61209)rhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK\hJ]rhmX2Define the client/server TCP port (default: 61209)rr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX -P PASSWORDhX}r(hZ]h[]h\]h]]h_]uhPjhJ]r(j )r}r(hOX-PhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-Prr}r(hOUhPjubahVjubj6)r}r(hOXPASSWORDhX}r(h]]h\]hZ]U delimiterU h[]h_]uhPjhJ]rhmXPASSWORDrr}r(hOUhPjubahVj>ubehVjubahVjubj)r}r(hOXDefine a client/server passwordrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK]hJ]rhmXDefine a client/server passwordrr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX --passwordrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX --passwordrr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOX/Define a client/server password from the promptrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK^hJ]rhmX/Define a client/server password from the promptrr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-rrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-rrr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOX.Disable process list (for low CPU consumption)rhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r (hOjhPjhQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaK_hJ]r hmX.Disable process list (for low CPU consumption)r r }r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-srhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-sr r!}r"(hOUhPjubahVjubahVjubahVjubj)r#}r$(hOXRun Glances in server moder%hX}r&(hZ]h[]h\]h]]h_]uhPjhJ]r'hq)r(}r)(hOj%hPj#hQhThVhuhX}r*(hZ]h[]h\]h]]h_]uhaK`hJ]r+hmXRun Glances in server moder,r-}r.(hOj%hPj(ubaubahVj"ubeubj)r/}r0(hOUhPjhQhThVjhX}r1(hZ]h[]h\]h]]h_]uhaNhbhhJ]r2(j)r3}r4(hOUhX}r5(hZ]h[]h\]h]]h_]uhPj/hJ]r6j)r7}r8(hOX -t SECONDShX}r9(hZ]h[]h\]h]]h_]uhPj3hJ]r:(j )r;}r<(hOX-thX}r=(hZ]h[]h\]h]]h_]uhPj7hJ]r>hmX-tr?r@}rA(hOUhPj;ubahVjubj6)rB}rC(hOXSECONDShX}rD(h]]h\]hZ]U delimiterU h[]h_]uhPj7hJ]rEhmXSECONDSrFrG}rH(hOUhPjBubahVj>ubehVjubahVjubj)rI}rJ(hOX,Set refresh time in seconds (default: 3 sec)rKhX}rL(hZ]h[]h\]h]]h_]uhPj/hJ]rMhq)rN}rO(hOjKhPjIhQhThVhuhX}rP(hZ]h[]h\]h]]h_]uhaKahJ]rQhmX,Set refresh time in seconds (default: 3 sec)rRrS}rT(hOjKhPjNubaubahVj"ubeubj)rU}rV(hOUhPjhQhThVjhX}rW(hZ]h[]h\]h]]h_]uhaNhbhhJ]rX(j)rY}rZ(hOUhX}r[(hZ]h[]h\]h]]h_]uhPjUhJ]r\j)r]}r^(hOX-vr_hX}r`(hZ]h[]h\]h]]h_]uhPjYhJ]raj )rb}rc(hOj_hX}rd(hZ]h[]h\]h]]h_]uhPj]hJ]rehmX-vrfrg}rh(hOUhPjbubahVjubahVjubahVjubj)ri}rj(hOXDisplay the version and exitrkhX}rl(hZ]h[]h\]h]]h_]uhPjUhJ]rmhq)rn}ro(hOjkhPjihQhThVhuhX}rp(hZ]h[]h\]h]]h_]uhaKbhJ]rqhmXDisplay the version and exitrrrs}rt(hOjkhPjnubaubahVj"ubeubj)ru}rv(hOUhPjhQhThVjhX}rw(hZ]h[]h\]h]]h_]uhaNhbhhJ]rx(j)ry}rz(hOUhX}r{(hZ]h[]h\]h]]h_]uhPjuhJ]r|j)r}}r~(hOX-yrhX}r(hZ]h[]h\]h]]h_]uhPjyhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPj}hJ]rhmX-yrr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOX(Enable hddtemp module (requires hddtemp)rhX}r(hZ]h[]h\]h]]h_]uhPjuhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKchJ]rhmX(Enable hddtemp module (requires hddtemp)rr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-zrhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-zrr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOX#Do not use the bold color attributerhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKdhJ]rhmX#Do not use the bold color attributerr}r(hOjhPjubaubahVj"ubeubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj)r}r(hOX-1rhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rj )r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX-1rr}r(hOUhPjubahVjubahVjubahVjubj)r}r(hOXStart Glances in per-CPU mode hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXStart Glances in per-CPU moderhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKehJ]rhmXStart Glances in per-CPU moderr}r(hOjhPjubaubahVj"ubeubeubeubhL)r}r(hOUhPjhQhThVhWhX}r(hZ]h[]h\]h]]rh>ah_]rhauhaKhhbhhJ]r(hd)r}r(hOjUhPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjjPuhaKhhbhhJ]rhmXInteractive commandsrr}r(hOjUhPjubaubhq)r}r(hOXDThe following commands (key pressed) are supported while in Glances:rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKjhbhhJ]rhmXDThe following commands (key pressed) are supported while in Glances:rr}r(hOjhPjubaubcdocutils.nodes definition_list r)r}r(hOUhPjhQNhVUdefinition_listrhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(cdocutils.nodes definition_list_item r)r}r(hOX``a`` Sort process list automatically - If CPU iowait ``>60%``, sort processes by I/O read and write - If CPU ``>70%``, sort processes by CPU usage - If MEM ``>70%``, sort processes by memory usagehPjhQhThVUdefinition_list_itemrhX}r(hZ]h[]h\]h]]h_]uhaKqhJ]r(cdocutils.nodes term r)r}r(hOX``a``rhPjhQhThVUtermrhX}r(hZ]h[]h\]h]]h_]uhaKqhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXar}r(hOUhPjubahVj'ubaubcdocutils.nodes definition r)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]r(hq)r}r (hOXSort process list automaticallyr hPjhQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKnhJ]r hmXSort process list automaticallyr r}r(hOj hPjubaubh)r}r(hOUhX}r(UbulletrX-h]]h\]hZ]h[]h_]uhPjhJ]r(h)r}r(hOX<If CPU iowait ``>60%``, sort processes by I/O read and writerhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKphJ]r(hmXIf CPU iowait rr}r (hOXIf CPU iowait hPjubj)r!}r"(hOX``>60%``hX}r#(hZ]h[]h\]h]]h_]uhPjhJ]r$hmX>60%r%r&}r'(hOUhPj!ubahVj'ubhmX&, sort processes by I/O read and writer(r)}r*(hOX&, sort processes by I/O read and writehPjubeubahVhubh)r+}r,(hOX,If CPU ``>70%``, sort processes by CPU usager-hX}r.(hZ]h[]h\]h]]h_]uhPjhJ]r/hq)r0}r1(hOj-hPj+hQhThVhuhX}r2(hZ]h[]h\]h]]h_]uhaKqhJ]r3(hmXIf CPU r4r5}r6(hOXIf CPU hPj0ubj)r7}r8(hOX``>70%``hX}r9(hZ]h[]h\]h]]h_]uhPj0hJ]r:hmX>70%r;r<}r=(hOUhPj7ubahVj'ubhmX, sort processes by CPU usager>r?}r@(hOX, sort processes by CPU usagehPj0ubeubahVhubh)rA}rB(hOX/If MEM ``>70%``, sort processes by memory usagerChX}rD(hZ]h[]h\]h]]h_]uhPjhJ]rEhq)rF}rG(hOjChPjAhQhThVhuhX}rH(hZ]h[]h\]h]]h_]uhaKrhJ]rI(hmXIf MEM rJrK}rL(hOXIf MEM hPjFubj)rM}rN(hOX``>70%``hX}rO(hZ]h[]h\]h]]h_]uhPjFhJ]rPhmX>70%rQrR}rS(hOUhPjMubahVj'ubhmX , sort processes by memory usagerTrU}rV(hOX , sort processes by memory usagehPjFubeubahVhubehVhubehVU definitionrWubeubj)rX}rY(hOX4``b`` Switch between bit/s or Byte/s for network I/OhPjhQhThVjhX}rZ(hZ]h[]h\]h]]h_]uhaKshbhhJ]r[(j)r\}r](hOX``b``r^hPjXhQhThVjhX}r_(hZ]h[]h\]h]]h_]uhaKshJ]r`j)ra}rb(hOj^hX}rc(hZ]h[]h\]h]]h_]uhPj\hJ]rdhmXbre}rf(hOUhPjaubahVj'ubaubj)rg}rh(hOUhX}ri(hZ]h[]h\]h]]h_]uhPjXhJ]rjhq)rk}rl(hOX.Switch between bit/s or Byte/s for network I/OrmhPjghQhThVhuhX}rn(hZ]h[]h\]h]]h_]uhaKthJ]rohmX.Switch between bit/s or Byte/s for network I/Orprq}rr(hOjmhPjkubaubahVjWubeubj)rs}rt(hOX!``c`` Sort processes by CPU usagehPjhQhThVjhX}ru(hZ]h[]h\]h]]h_]uhaKuhbhhJ]rv(j)rw}rx(hOX``c``ryhPjshQhThVjhX}rz(hZ]h[]h\]h]]h_]uhaKuhJ]r{j)r|}r}(hOjyhX}r~(hZ]h[]h\]h]]h_]uhPjwhJ]rhmXcr}r(hOUhPj|ubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjshJ]rhq)r}r(hOXSort processes by CPU usagerhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKvhJ]rhmXSort processes by CPU usagerr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``d`` Show/hide disk I/O statshPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKwhbhhJ]r(j)r}r(hOX``d``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKwhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXdr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXShow/hide disk I/O statsrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKxhJ]rhmXShow/hide disk I/O statsrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX!``f`` Show/hide file system statshPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKyhbhhJ]r(j)r}r(hOX``f``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKyhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXfr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXShow/hide file system statsrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKzhJ]rhmXShow/hide file system statsrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``h`` Show/hide the help screenhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaK{hbhhJ]r(j)r}r(hOX``h``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaK{hJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXhr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXShow/hide the help screenrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK|hJ]rhmXShow/hide the help screenrr}r(hOjhPjubaubahVjWubeubj)r}r(hOXH``i`` Sort processes by I/O rate (may need root privileges on some OSes)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaK}hbhhJ]r(j)r}r(hOX``i``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaK}hJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXir}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXBSort processes by I/O rate (may need root privileges on some OSes)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaK~hJ]rhmXBSort processes by I/O rate (may need root privileges on some OSes)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``l`` Show/hide log messageshPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``l``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXlr}r(hOUhPjubahVj'ubaubj)r }r (hOUhX}r (hZ]h[]h\]h]]h_]uhPjhJ]r hq)r }r(hOXShow/hide log messagesrhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rhmXShow/hide log messagesrr}r(hOjhPj ubaubahVjWubeubj)r}r(hOX!``m`` Sort processes by MEM usagehPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``m``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r (hZ]h[]h\]h]]h_]uhPjhJ]r!hmXmr"}r#(hOUhPjubahVj'ubaubj)r$}r%(hOUhX}r&(hZ]h[]h\]h]]h_]uhPjhJ]r'hq)r(}r)(hOXSort processes by MEM usager*hPj$hQhThVhuhX}r+(hZ]h[]h\]h]]h_]uhaKhJ]r,hmXSort processes by MEM usager-r.}r/(hOj*hPj(ubaubahVjWubeubj)r0}r1(hOX``n`` Show/hide network statshPjhQhThVjhX}r2(hZ]h[]h\]h]]h_]uhaKhbhhJ]r3(j)r4}r5(hOX``n``r6hPj0hQhThVjhX}r7(hZ]h[]h\]h]]h_]uhaKhJ]r8j)r9}r:(hOj6hX}r;(hZ]h[]h\]h]]h_]uhPj4hJ]r<hmXnr=}r>(hOUhPj9ubahVj'ubaubj)r?}r@(hOUhX}rA(hZ]h[]h\]h]]h_]uhPj0hJ]rBhq)rC}rD(hOXShow/hide network statsrEhPj?hQhThVhuhX}rF(hZ]h[]h\]h]]h_]uhaKhJ]rGhmXShow/hide network statsrHrI}rJ(hOjEhPjCubaubahVjWubeubj)rK}rL(hOX``p`` Sort processes by namehPjhQhThVjhX}rM(hZ]h[]h\]h]]h_]uhaKhbhhJ]rN(j)rO}rP(hOX``p``rQhPjKhQhThVjhX}rR(hZ]h[]h\]h]]h_]uhaKhJ]rSj)rT}rU(hOjQhX}rV(hZ]h[]h\]h]]h_]uhPjOhJ]rWhmXprX}rY(hOUhPjTubahVj'ubaubj)rZ}r[(hOUhX}r\(hZ]h[]h\]h]]h_]uhPjKhJ]r]hq)r^}r_(hOXSort processes by namer`hPjZhQhThVhuhX}ra(hZ]h[]h\]h]]h_]uhaKhJ]rbhmXSort processes by namercrd}re(hOj`hPj^ubaubahVjWubeubj)rf}rg(hOX ``q`` QuithPjhQhThVjhX}rh(hZ]h[]h\]h]]h_]uhaKhbhhJ]ri(j)rj}rk(hOX``q``rlhPjfhQhThVjhX}rm(hZ]h[]h\]h]]h_]uhaKhJ]rnj)ro}rp(hOjlhX}rq(hZ]h[]h\]h]]h_]uhPjjhJ]rrhmXqrs}rt(hOUhPjoubahVj'ubaubj)ru}rv(hOUhX}rw(hZ]h[]h\]h]]h_]uhPjfhJ]rxhq)ry}rz(hOXQuitr{hPjuhQhThVhuhX}r|(hZ]h[]h\]h]]h_]uhaKhJ]r}hmXQuitr~r}r(hOj{hPjyubaubahVjWubeubj)r}r(hOX;``s`` Show/hide sensors stats (only available with -e flag)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``s``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXsr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX5Show/hide sensors stats (only available with -e flag)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rhmX5Show/hide sensors stats (only available with -e flag)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX%``t`` View network I/O as combinationhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``t``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXtr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXView network I/O as combinationrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rhmXView network I/O as combinationrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX!``u`` View cumulative network I/OhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``u``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXur}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXView cumulative network I/OrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rhmXView cumulative network I/Orr}r(hOjhPjubaubahVjWubeubj)r}r(hOX*``w`` Delete finished warning log messageshPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``w``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXwr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX$Delete finished warning log messagesrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rhmX$Delete finished warning log messagesrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX7``x`` Delete finished warning and critical log messageshPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhbhhJ]r(j)r}r(hOX``x``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaKhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXxr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r }r (hOX1Delete finished warning and critical log messagesr hPjhQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r hmX1Delete finished warning and critical log messagesr r }r (hOj hPj ubaubahVjWubeubj)r }r (hOX;``y`` Show/hide hddtemp stats (only available with -y flag)hPjhQhThVjhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (j)r }r (hOX``y``r hPj hQhThVjhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r j)r }r (hOj hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXyr }r (hOUhPj ubahVj'ubaubj)r }r (hOUhX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hq)r }r (hOX5Show/hide hddtemp stats (only available with -y flag)r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r hmX5Show/hide hddtemp stats (only available with -y flag)r r! }r" (hOj hPj ubaubahVjWubeubj)r# }r$ (hOX2``1`` Switch between global CPU and per-CPU stats hPjhQhThVjhX}r% (hZ]h[]h\]h]]h_]uhaKhbhhJ]r& (j)r' }r( (hOX``1``r) hPj# hQhThVjhX}r* (hZ]h[]h\]h]]h_]uhaKhJ]r+ j)r, }r- (hOj) hX}r. (hZ]h[]h\]h]]h_]uhPj' hJ]r/ hmX1r0 }r1 (hOUhPj, ubahVj'ubaubj)r2 }r3 (hOUhX}r4 (hZ]h[]h\]h]]h_]uhPj# hJ]r5 hq)r6 }r7 (hOX+Switch between global CPU and per-CPU statsr8 hPj2 hQhThVhuhX}r9 (hZ]h[]h\]h]]h_]uhaKhJ]r: hmX+Switch between global CPU and per-CPU statsr; r< }r= (hOj8 hPj6 ubaubahVjWubeubeubeubeubhL)r> }r? (hOUhPhMhQhThVhWhX}r@ (hZ]h[]h\]h]]rA hBah_]rB hauhaKhbhhJ]rC (hd)rD }rE (hOjghPj> hQhThVhhhX}rF (h]]h\]hZ]h[]h_]hjjbuhaKhbhhJ]rG hmX ConfigurationrH rI }rJ (hOjghPjD ubaubhq)rK }rL (hOX2No configuration file is mandatory to use Glances.rM hPj> hQhThVhuhX}rN (hZ]h[]h\]h]]h_]uhaKhbhhJ]rO hmX2No configuration file is mandatory to use Glances.rP rQ }rR (hOjM hPjK ubaubhq)rS }rT (hOX\Furthermore a configuration file is needed for setup limits and/or monitored processes list.rU hPj> hQhThVhuhX}rV (hZ]h[]h\]h]]h_]uhaKhbhhJ]rW hmX\Furthermore a configuration file is needed for setup limits and/or monitored processes list.rX rY }rZ (hOjU hPjS ubaubhq)r[ }r\ (hOX,By default, the configuration file is under:r] hPj> hQhThVhuhX}r^ (hZ]h[]h\]h]]h_]uhaKhbhhJ]r_ hmX,By default, the configuration file is under:r` ra }rb (hOj] hPj[ ubaubcdocutils.nodes field_list rc )rd }re (hOUhPj> hQhThVU field_listrf hX}rg (hZ]h[]h\]h]]h_]uhaKhbhhJ]rh (cdocutils.nodes field ri )rj }rk (hOUhPjd hQhThVUfieldrl hX}rm (hZ]h[]h\]h]]h_]uhaKhbhhJ]rn (cdocutils.nodes field_name ro )rp }rq (hOXLinuxrr hX}rs (hZ]h[]h\]h]]h_]uhPjj hJ]rt hmXLinuxru rv }rw (hOjr hPjp ubahVU field_namerx ubcdocutils.nodes field_body ry )rz }r{ (hOX``/etc/glances/glances.conf``r| hX}r} (hZ]h[]h\]h]]h_]uhPjj hJ]r~ hq)r }r (hOj| hPjz hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r j)r }r (hOj| hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX/etc/glances/glances.confr r }r (hOUhPj ubahVj'ubaubahVU field_bodyr ubeubji )r }r (hOUhPjd hQhThVjl hX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (jo )r }r (hOX\*BSD and OS XhX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX *BSD and OS Xr r }r (hOX\*BSD and OS XhPj ubahVjx ubjy )r }r (hOX'``/usr/local/etc/glances/glances.conf``r hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hq)r }r (hOj hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r j)r }r (hOj hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX#/usr/local/etc/glances/glances.confr r }r (hOUhPj ubahVj'ubaubahVj ubeubji )r }r (hOUhPjd hQhThVjl hX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (jo )r }r (hOXWindowsr hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXWindowsr r }r (hOj hPj ubahVjx ubjy )r }r (hOX#``%APPDATA%\glances\glances.conf`` hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hq)r }r (hOX"``%APPDATA%\glances\glances.conf``hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r j)r }r (hOX"``%APPDATA%\glances\glances.conf``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX%APPDATA%\glances\glances.confr r }r (hOUhPj ubahVj'ubaubahVj ubeubeubhq)r }r (hOX)On Windows XP, the ``%APPDATA%`` path is:r hPj> hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXOn Windows XP, the r r }r (hOXOn Windows XP, the hPj ubj)r }r (hOX ``%APPDATA%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX %APPDATA%r r }r (hOUhPj ubahVj'ubhmX path is:r r }r (hOX path is:hPj ubeubj)r }r (hOX1C:\Documents and Settings\\Application DatahPj> hQhThVjhX}r (jjXconsolejjh]]h\]hZ]h[]h_]uhaKhbhhJ]r hmX1C:\Documents and Settings\\Application Datar r }r (hOUhPj ubaubhq)r }r (hOX'Since Windows Vista and newer versions:r hPj> hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmX'Since Windows Vista and newer versions:r r }r (hOj hPj ubaubj)r }r (hOXC:\Users\\AppData\RoaminghPj> hQhThVjhX}r (jjXconsolejjh]]h\]hZ]h[]h_]uhaKhbhhJ]r hmXC:\Users\\AppData\Roamingr r }r (hOUhPj ubaubhq)r }r (hOXwYou can override the default configuration, located in one of the above directories on your system, except for Windows.r hPj> hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXwYou can override the default configuration, located in one of the above directories on your system, except for Windows.r r }r (hOj hPj ubaubhq)r }r (hOXWJust copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory, e.g. Linux:r hPj> hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXJust copy the r r }r (hOXJust copy the hPj ubj)r }r (hOX``glances.conf``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX glances.confr r }r (hOUhPj ubahVj'ubhmX file to your r r }r (hOX file to your hPj ubj)r }r (hOX``$XDG_CONFIG_HOME``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX$XDG_CONFIG_HOMEr r }r (hOUhPj ubahVj'ubhmX directory, e.g. Linux:r r }r (hOX directory, e.g. Linux:hPj ubeubj)r }r (hOXXmkdir -p $XDG_CONFIG_HOME/glances cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/hPj> hQhThVjhX}r (jjXconsolejjh]]h\]hZ]h[]h_]uhaKhbhhJ]r hmXXmkdir -p $XDG_CONFIG_HOME/glances cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/r r }r (hOUhPj ubaubhq)r }r (hOX^On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``.r hPj> hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmX3On OS X, you should copy the configuration file to r r }r (hOX3On OS X, you should copy the configuration file to hPj ubj)r }r (hOX*``~/Library/Application Support/glances/``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX&~/Library/Application Support/glances/r r! }r" (hOUhPj ubahVj'ubhmX.r# }r$ (hOX.hPj ubeubeubhL)r% }r& (hOUhPhMhQhThVhWhX}r' (hZ]h[]h\]h]]r( hIah_]r) h!auhaKhbhhJ]r* (hd)r+ }r, (hOjyhPj% hQhThVhhhX}r- (h]]h\]hZ]h[]h_]hjjtuhaKhbhhJ]r. hmXAnatomy of the applicationr/ r0 }r1 (hOjyhPj+ ubaubhL)r2 }r3 (hOUhPj% hQhThVhWhX}r4 (hZ]h[]h\]h]]r5 hCah_]r6 hauhaKhbhhJ]r7 (hd)r8 }r9 (hOjhPj2 hQhThVhhhX}r: (h]]h\]hZ]h[]h_]hjjuhaKhbhhJ]r; hmXLegendr< r= }r> (hOjhPj8 ubaubcdocutils.nodes line_block r? )r@ }rA (hOUhPj2 hQhThVU line_blockrB hX}rC (hZ]h[]h\]h]]h_]uhaKhbhhJ]rD (cdocutils.nodes line rE )rF }rG (hOX"``GREEN`` stat counter is ``"OK"``UindentrH KhPj@ hQhThVhahX}rI (hZ]h[]h\]h]]h_]uhaKhbhhJ]rJ (j)rK }rL (hOX ``GREEN``hX}rM (hZ]h[]h\]h]]h_]uhPjF hJ]rN hmXGREENrO rP }rQ (hOUhPjK ubahVj'ubhmX stat counter is rR rS }rT (hOX stat counter is hPjF ubj)rU }rV (hOX``"OK"``hX}rW (hZ]h[]h\]h]]h_]uhPjF hJ]rX hmX"OK"rY rZ }r[ (hOUhPjU ubahVj'ubeubjE )r\ }r] (hOX&``BLUE`` stat counter is ``"CAREFUL"``jH KhPj@ hQhThVhahX}r^ (hZ]h[]h\]h]]h_]uhaKhbhhJ]r_ (j)r` }ra (hOX``BLUE``hX}rb (hZ]h[]h\]h]]h_]uhPj\ hJ]rc hmXBLUErd re }rf (hOUhPj` ubahVj'ubhmX stat counter is rg rh }ri (hOX stat counter is hPj\ ubj)rj }rk (hOX ``"CAREFUL"``hX}rl (hZ]h[]h\]h]]h_]uhPj\ hJ]rm hmX "CAREFUL"rn ro }rp (hOUhPjj ubahVj'ubeubjE )rq }rr (hOX)``MAGENTA`` stat counter is ``"WARNING"``jH KhPj@ hQhThVhahX}rs (hZ]h[]h\]h]]h_]uhaKhbhhJ]rt (j)ru }rv (hOX ``MAGENTA``hX}rw (hZ]h[]h\]h]]h_]uhPjq hJ]rx hmXMAGENTAry rz }r{ (hOUhPju ubahVj'ubhmX stat counter is r| r} }r~ (hOX stat counter is hPjq ubj)r }r (hOX ``"WARNING"``hX}r (hZ]h[]h\]h]]h_]uhPjq hJ]r hmX "WARNING"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOX&``RED`` stat counter is ``"CRITICAL"``jH KhPj@ hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (j)r }r (hOX``RED``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXREDr r }r (hOUhPj ubahVj'ubhmX stat counter is r r }r (hOX stat counter is hPj ubj)r }r (hOX``"CRITICAL"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "CRITICAL"r r }r (hOUhPj ubahVj'ubeubeubeubhL)r }r (hOUhPj% hQhThVhWhX}r (hZ]h[]h\]h]]r h/ah_]r h auhaKhbhhJ]r (hd)r }r (hOjhPj hQhThVhhhX}r (h]]h\]hZ]h[]h_]hjjuhaKhbhhJ]r hmXHeaderr r }r (hOjhPj ubaubj)r }r (hOX.. image:: images/header.png hPj hQhThVjhX}r (UuriXimages/header.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaKhbhhJ]ubhq)r }r (hOXThe header shows the OS name, release version, platform architecture and the hostname. On Linux, it shows also the kernel version.r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXThe header shows the OS name, release version, platform architecture and the hostname. On Linux, it shows also the kernel version.r r }r (hOj hPj ubaubeubhL)r }r (hOUhPj% hQhThVhWhX}r (hZ]h[]h\]h]]r hHah_]r h auhaKhbhhJ]r (hd)r }r (hOjhPj hQhThVhhhX}r (h]]h\]hZ]h[]h_]hjjuhaKhbhhJ]r hmXCPUr r }r (hOjhPj ubaubhq)r }r (hOX Short view:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmX Short view:r r }r (hOj hPj ubaubj)r }r (hOX.. image:: images/cpu.png hPj hQhThVjhX}r (UuriXimages/cpu.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaKhbhhJ]ubhq)r }r (hOXQIf enough horizontal space is available, extended CPU informations are displayed.r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXQIf enough horizontal space is available, extended CPU informations are displayed.r r }r (hOj hPj ubaubhq)r }r (hOXExtended view:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXExtended view:r r }r (hOj hPj ubaubj)r }r (hOX.. image:: images/cpu-wide.png hPj hQhThVjhX}r (UuriXimages/cpu-wide.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaKhbhhJ]ubhq)r }r (hOX3To switch to per-CPU stats, just hit the ``1`` key:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmX)To switch to per-CPU stats, just hit the r r }r (hOX)To switch to per-CPU stats, just hit the hPj ubj)r }r (hOX``1``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX1r }r (hOUhPj ubahVj'ubhmX key:r r }r (hOX key:hPj ubeubj)r }r (hOX.. image:: images/per-cpu.png hPj hQhThVjhX}r (UuriXimages/per-cpu.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaKhbhhJ]ubhq)r }r (hOXThe CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line.r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXThe CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line.r r }r (hOj hPj ubaubj? )r }r (hOUhPj hQhThVjB hX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (jE )r }r (hOXCIf user|system|nice CPU is ``<50%``, then status is set to ``"OK"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXIf user|system|nice CPU is r r }r (hOXIf user|system|nice CPU is hPj ubj)r }r (hOX``<50%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX<50%r r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX``"OK"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX"OK"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOXHIf user|system|nice CPU is ``>50%``, then status is set to ``"CAREFUL"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r! (hmXIf user|system|nice CPU is r" r# }r$ (hOXIf user|system|nice CPU is hPj ubj)r% }r& (hOX``>50%``hX}r' (hZ]h[]h\]h]]h_]uhPj hJ]r( hmX>50%r) r* }r+ (hOUhPj% ubahVj'ubhmX, then status is set to r, r- }r. (hOX, then status is set to hPj ubj)r/ }r0 (hOX ``"CAREFUL"``hX}r1 (hZ]h[]h\]h]]h_]uhPj hJ]r2 hmX "CAREFUL"r3 r4 }r5 (hOUhPj/ ubahVj'ubeubjE )r6 }r7 (hOXHIf user|system|nice CPU is ``>70%``, then status is set to ``"WARNING"``jH KhPj hQhThVhahX}r8 (hZ]h[]h\]h]]h_]uhaKhbhhJ]r9 (hmXIf user|system|nice CPU is r: r; }r< (hOXIf user|system|nice CPU is hPj6 ubj)r= }r> (hOX``>70%``hX}r? (hZ]h[]h\]h]]h_]uhPj6 hJ]r@ hmX>70%rA rB }rC (hOUhPj= ubahVj'ubhmX, then status is set to rD rE }rF (hOX, then status is set to hPj6 ubj)rG }rH (hOX ``"WARNING"``hX}rI (hZ]h[]h\]h]]h_]uhPj6 hJ]rJ hmX "WARNING"rK rL }rM (hOUhPjG ubahVj'ubeubjE )rN }rO (hOXIIf user|system|nice CPU is ``>90%``, then status is set to ``"CRITICAL"``jH KhPj hQhThVhahX}rP (hZ]h[]h\]h]]h_]uhaKhbhhJ]rQ (hmXIf user|system|nice CPU is rR rS }rT (hOXIf user|system|nice CPU is hPjN ubj)rU }rV (hOX``>90%``hX}rW (hZ]h[]h\]h]]h_]uhPjN hJ]rX hmX>90%rY rZ }r[ (hOUhPjU ubahVj'ubhmX, then status is set to r\ r] }r^ (hOX, then status is set to hPjN ubj)r_ }r` (hOX``"CRITICAL"``hX}ra (hZ]h[]h\]h]]h_]uhPjN hJ]rb hmX "CRITICAL"rc rd }re (hOUhPj_ ubahVj'ubeubeubhq)rf }rg (hOX^*Note*: limit values can be overwritten in the configuration file under the ``[cpu]`` section.rh hPj hQhThVhuhX}ri (hZ]h[]h\]h]]h_]uhaKhbhhJ]rj (h{)rk }rl (hOX*Note*hX}rm (hZ]h[]h\]h]]h_]uhPjf hJ]rn hmXNotero rp }rq (hOUhPjk ubahVhubhmXF: limit values can be overwritten in the configuration file under the rr rs }rt (hOXF: limit values can be overwritten in the configuration file under the hPjf ubj)ru }rv (hOX ``[cpu]``hX}rw (hZ]h[]h\]h]]h_]uhPjf hJ]rx hmX[cpu]ry rz }r{ (hOUhPju ubahVj'ubhmX section.r| r} }r~ (hOX section.hPjf ubeubeubhL)r }r (hOUhPj% hQhThVhWhX}r (hZ]h[]h\]h]]r h+ah_]r hauhaKhbhhJ]r (hd)r }r (hOjhPj hQhThVhhhX}r (h]]h\]hZ]h[]h_]hjjuhaKhbhhJ]r hmXLoadr r }r (hOjhPj ubaubj)r }r (hOX.. image:: images/load.png hPj hQhThVjhX}r (UuriXimages/load.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaKhbhhJ]ubhq)r }r (hOXHOn the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXOn the r r }r (hOXOn the hPj ubh{)r }r (hOX *No Sheep*hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXNo Sheepr r }r (hOUhPj ubahVhubhmX blog, r r }r (hOX blog, hPj ubh{)r }r (hOX*Zachary Tirrell*hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXZachary Tirrellr r }r (hOUhPj ubahVhubhmX defines the average load r r }r (hOX defines the average load hPj ubcdocutils.nodes footnote_reference r )r }r (hOX[1]_jKhPj hVUfootnote_referencer hX}r (h]]r Uid1r ah\]hZ]h[]h_]hjh8uhJ]r hmX1r }r (hOUhPj ubaubhmX:r }r (hOX:hPj ubeubcdocutils.nodes block_quote r )r }r (hOUhPj hQhThVU block_quoter hX}r (hZ]h[]h\]h]]h_]uhaNhbhhJ]r hq)r }r (hOX"In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods."r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhJ]r hmX"In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods."r r }r (hOj hPj ubaubaubhq)r }r (hOXGlances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core.r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r hmXGlances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core.r r }r (hOj hPj ubaubj? )r }r (hOUhPj hQhThVjB hX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (jE )r }r (hOX@If average load is ``<0.7*core``, then status is set to ``"OK"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXIf average load is r r }r (hOXIf average load is hPj ubj)r }r (hOX ``<0.7*core``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX <0.7*corer r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX``"OK"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX"OK"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOXEIf average load is ``>0.7*core``, then status is set to ``"CAREFUL"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXIf average load is r r }r (hOXIf average load is hPj ubj)r }r (hOX ``>0.7*core``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX >0.7*corer r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX ``"CAREFUL"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "CAREFUL"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOXCIf average load is ``>1*core``, then status is set to ``"WARNING"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXIf average load is r r }r (hOXIf average load is hPj ubj)r }r (hOX ``>1*core``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX>1*corer r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX ``"WARNING"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "WARNING"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOXDIf average load is ``>5*core``, then status is set to ``"CRITICAL"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaKhbhhJ]r (hmXIf average load is r r }r! (hOXIf average load is hPj ubj)r" }r# (hOX ``>5*core``hX}r$ (hZ]h[]h\]h]]h_]uhPj hJ]r% hmX>5*corer& r' }r( (hOUhPj" ubahVj'ubhmX, then status is set to r) r* }r+ (hOX, then status is set to hPj ubj)r, }r- (hOX``"CRITICAL"``hX}r. (hZ]h[]h\]h]]h_]uhPj hJ]r/ hmX "CRITICAL"r0 r1 }r2 (hOUhPj, ubahVj'ubeubeubhq)r3 }r4 (hOX_*Note*: limit values can be overwritten in the configuration file under the ``[load]`` section.r5 hPj hQhThVhuhX}r6 (hZ]h[]h\]h]]h_]uhaKhbhhJ]r7 (h{)r8 }r9 (hOX*Note*hX}r: (hZ]h[]h\]h]]h_]uhPj3 hJ]r; hmXNoter< r= }r> (hOUhPj8 ubahVhubhmXF: limit values can be overwritten in the configuration file under the r? r@ }rA (hOXF: limit values can be overwritten in the configuration file under the hPj3 ubj)rB }rC (hOX ``[load]``hX}rD (hZ]h[]h\]h]]h_]uhPj3 hJ]rE hmX[load]rF rG }rH (hOUhPjB ubahVj'ubhmX section.rI rJ }rK (hOX section.hPj3 ubeubeubhL)rL }rM (hOUhPj% hQhThVhWhX}rN (hZ]h[]h\]h]]rO h50%``, then status is set to ``"CAREFUL"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r (hmX If memory is r r }r (hOX If memory is hPj ubj)r }r (hOX``>50%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX>50%r r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX ``"CAREFUL"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "CAREFUL"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOX:If memory is ``>70%``, then status is set to ``"WARNING"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r (hmX If memory is r r }r (hOX If memory is hPj ubj)r }r (hOX``>70%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX>70%r r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX ``"WARNING"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "WARNING"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOX;If memory is ``>90%``, then status is set to ``"CRITICAL"``jH KhPj hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r (hmX If memory is r r }r (hOX If memory is hPj ubj)r }r (hOX``>90%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX>90%r r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX``"CRITICAL"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "CRITICAL"r r }r (hOUhPj ubahVj'ubeubeubhq)r }r (hOXq*Note*: limit values can be overwritten in the configuration file under the ``[memory]`` and ``[swap]`` sections.r hPjL hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r (h{)r }r (hOX*Note*hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXNoter r }r (hOUhPj ubahVhubhmXF: limit values can be overwritten in the configuration file under the r r }r (hOXF: limit values can be overwritten in the configuration file under the hPj ubj)r }r (hOX ``[memory]``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX[memory]r r }r (hOUhPj ubahVj'ubhmX and r r }r (hOX and hPj ubj)r }r (hOX ``[swap]``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX[swap]r r }r (hOUhPj ubahVj'ubhmX sections.r r }r (hOX sections.hPj ubeubeubhL)r }r (hOUhPj% hQhThVhWhX}r (hZ]h[]h\]h]]r h3ah_]r hauhaMhbhhJ]r (hd)r }r (hOjhPj hQhThVhhhX}r (h]]h\]hZ]h[]h_]hjjuhaMhbhhJ]r hmXNetworkr r }r! (hOjhPj ubaubj)r" }r# (hOX.. image:: images/network.png hPj hQhThVjhX}r$ (UuriXimages/network.pngr% h]]h\]hZ]h[]j}r& U*j% sh_]uhaMhbhhJ]ubhq)r' }r( (hOXGlances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc).r) hPj hQhThVhuhX}r* (hZ]h[]h\]h]]h_]uhaMhbhhJ]r+ hmXGlances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc).r, r- }r. (hOj) hPj' ubaubhq)r/ }r0 (hOXHAlerts are only set if the network interface maximum speed is available.r1 hPj hQhThVhuhX}r2 (hZ]h[]h\]h]]h_]uhaMhbhhJ]r3 hmXHAlerts are only set if the network interface maximum speed is available.r4 r5 }r6 (hOj1 hPj/ ubaubhq)r7 }r8 (hOXpFor example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps.r9 hPj hQhThVhuhX}r: (hZ]h[]h\]h]]h_]uhaMhbhhJ]r; hmXpFor example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps.r< r= }r> (hOj9 hPj7 ubaubj? )r? }r@ (hOUhPj hQhThVjB hX}rA (hZ]h[]h\]h]]h_]uhaM"hbhhJ]rB (jE )rC }rD (hOX7If bit rate is ``<50%``, then status is set to ``"OK"``jH KhPj? hQhThVhahX}rE (hZ]h[]h\]h]]h_]uhaM"hbhhJ]rF (hmXIf bit rate is rG rH }rI (hOXIf bit rate is hPjC ubj)rJ }rK (hOX``<50%``hX}rL (hZ]h[]h\]h]]h_]uhPjC hJ]rM hmX<50%rN rO }rP (hOUhPjJ ubahVj'ubhmX, then status is set to rQ rR }rS (hOX, then status is set to hPjC ubj)rT }rU (hOX``"OK"``hX}rV (hZ]h[]h\]h]]h_]uhPjC hJ]rW hmX"OK"rX rY }rZ (hOUhPjT ubahVj'ubeubjE )r[ }r\ (hOX<If bit rate is ``>50%``, then status is set to ``"CAREFUL"``jH KhPj? hQhThVhahX}r] (hZ]h[]h\]h]]h_]uhaM#hbhhJ]r^ (hmXIf bit rate is r_ r` }ra (hOXIf bit rate is hPj[ ubj)rb }rc (hOX``>50%``hX}rd (hZ]h[]h\]h]]h_]uhPj[ hJ]re hmX>50%rf rg }rh (hOUhPjb ubahVj'ubhmX, then status is set to ri rj }rk (hOX, then status is set to hPj[ ubj)rl }rm (hOX ``"CAREFUL"``hX}rn (hZ]h[]h\]h]]h_]uhPj[ hJ]ro hmX "CAREFUL"rp rq }rr (hOUhPjl ubahVj'ubeubjE )rs }rt (hOX<If bit rate is ``>70%``, then status is set to ``"WARNING"``jH KhPj? hQhThVhahX}ru (hZ]h[]h\]h]]h_]uhaM$hbhhJ]rv (hmXIf bit rate is rw rx }ry (hOXIf bit rate is hPjs ubj)rz }r{ (hOX``>70%``hX}r| (hZ]h[]h\]h]]h_]uhPjs hJ]r} hmX>70%r~ r }r (hOUhPjz ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPjs ubj)r }r (hOX ``"WARNING"``hX}r (hZ]h[]h\]h]]h_]uhPjs hJ]r hmX "WARNING"r r }r (hOUhPj ubahVj'ubeubjE )r }r (hOX=If bit rate is ``>90%``, then status is set to ``"CRITICAL"``jH KhPj? hQhThVhahX}r (hZ]h[]h\]h]]h_]uhaM%hbhhJ]r (hmXIf bit rate is r r }r (hOXIf bit rate is hPj ubj)r }r (hOX``>90%``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX>90%r r }r (hOUhPj ubahVj'ubhmX, then status is set to r r }r (hOX, then status is set to hPj ubj)r }r (hOX``"CRITICAL"``hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX "CRITICAL"r r }r (hOUhPj ubahVj'ubeubeubeubhL)r }r (hOUhPj% hQhThVhWhX}r (hZ]h[]h\]h]]r hAah_]r hauhaM(hbhhJ]r (hd)r }r (hOjhPj hQhThVhhhX}r (h]]h\]hZ]h[]h_]hjjuhaM(hbhhJ]r hmXSensorsr r }r (hOjhPj ubaubhq)r }r (hOX\Glances can displays the sensors informations trough `lm-sensors` (only available on Linux).r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaM*hbhhJ]r (hmX5Glances can displays the sensors informations trough r r }r (hOX5Glances can displays the sensors informations trough hPj ubcdocutils.nodes title_reference r )r }r (hOX `lm-sensors`hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmX lm-sensorsr r }r (hOUhPj ubahVUtitle_referencer ubhmX (only available on Linux).r r }r (hOX (only available on Linux).hPj ubeubhq)r }r (hOXMAs of lm-sensors, a filter is processed in order to display temperature only:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaM,hbhhJ]r hmXMAs of lm-sensors, a filter is processed in order to display temperature only:r r }r (hOj hPj ubaubj)r }r (hOX.. image:: images/sensors.png hPj hQhThVjhX}r (UuriXimages/sensors.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaM0hbhhJ]ubhq)r }r (hOX{Glances can also grab hard disk temperature through the `hddtemp` daemon (see here [2]_ to install hddtemp on your system):r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaM1hbhhJ]r (hmX8Glances can also grab hard disk temperature through the r r }r (hOX8Glances can also grab hard disk temperature through the hPj ubj )r }r (hOX `hddtemp`hX}r (hZ]h[]h\]h]]h_]uhPj hJ]r hmXhddtempr r }r (hOUhPj ubahVj ubhmX daemon (see here r r }r (hOX daemon (see here hPj ubj )r }r (hOX[2]_jKhPj hVj hX}r (h]]r Uid2r ah\]hZ]h[]h_]hjh:uhJ]r hmX2r }r (hOUhPj ubaubhmX$ to install hddtemp on your system):r r }r (hOX$ to install hddtemp on your system):hPj ubeubj)r }r (hOX.. image:: images/hddtemp.png hPj hQhThVjhX}r (UuriXimages/hddtemp.pngr h]]h\]hZ]h[]j}r U*j sh_]uhaM4hbhhJ]ubhq)r }r (hOX To enable the lm-sensors module:r hPj hQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaM5hbhhJ]r hmX To enable the lm-sensors module:r r }r (hOj hPj ubaubj)r }r (hOX $ glances -ehPj hQhThVjhX}r (jjXconsolejjh]]h\]hZ]h[]h_]uhaM7hbhhJ]r hmX $ glances -er r}r(hOUhPj ubaubhq)r}r(hOXTo enable the hddtemp module:rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM;hbhhJ]rhmXTo enable the hddtemp module:rr}r (hOjhPjubaubj)r }r (hOX $ glances -yhPj hQhThVjhX}r (jjXconsolejjh]]h\]hZ]h[]h_]uhaM=hbhhJ]r hmX $ glances -yrr}r(hOUhPj ubaubhq)r}r(hOX&There is no alert on this information.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMAhbhhJ]rhmX&There is no alert on this information.rr}r(hOjhPjubaubhq)r}r(hOX*Note*: limit values can be overwritten in the configuration file under the ``[temperature]`` and ``[hddtemperature]`` sections.rhPj hQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMChbhhJ]r(h{)r}r(hOX*Note*hX}r (hZ]h[]h\]h]]h_]uhPjhJ]r!hmXNoter"r#}r$(hOUhPjubahVhubhmXF: limit values can be overwritten in the configuration file under the r%r&}r'(hOXF: limit values can be overwritten in the configuration file under the hPjubj)r(}r)(hOX``[temperature]``hX}r*(hZ]h[]h\]h]]h_]uhPjhJ]r+hmX [temperature]r,r-}r.(hOUhPj(ubahVj'ubhmX and r/r0}r1(hOX and hPjubj)r2}r3(hOX``[hddtemperature]``hX}r4(hZ]h[]h\]h]]h_]uhPjhJ]r5hmX[hddtemperature]r6r7}r8(hOUhPj2ubahVj'ubhmX sections.r9r:}r;(hOX sections.hPjubeubeubhL)r<}r=(hOUhPj% hQhThVhWhX}r>(hZ]h[]h\]h]]r?hGah_]r@hauhaMFhbhhJ]rA(hd)rB}rC(hOj hPj<hQhThVhhhX}rD(h]]h\]hZ]h[]h_]hjjuhaMFhbhhJ]rEhmXDisk I/OrFrG}rH(hOj hPjBubaubj)rI}rJ(hOX.. image:: images/diskio.png hPj<hQhThVjhX}rK(UuriXimages/diskio.pngrLh]]h\]hZ]h[]j}rMU*jLsh_]uhaMIhbhhJ]ubhq)rN}rO(hOXJGlances displays the disk I/O throughput. The unit is adapted dynamically.rPhPj<hQhThVhuhX}rQ(hZ]h[]h\]h]]h_]uhaMJhbhhJ]rRhmXJGlances displays the disk I/O throughput. The unit is adapted dynamically.rSrT}rU(hOjPhPjNubaubhq)rV}rW(hOX.*Note*: There is no alert on this information.rXhPj<hQhThVhuhX}rY(hZ]h[]h\]h]]h_]uhaMLhbhhJ]rZ(h{)r[}r\(hOX*Note*hX}r](hZ]h[]h\]h]]h_]uhPjVhJ]r^hmXNoter_r`}ra(hOUhPj[ubahVhubhmX(: There is no alert on this information.rbrc}rd(hOX(: There is no alert on this information.hPjVubeubeubhL)re}rf(hOUhPj% hQhThVhWhX}rg(hZ]h[]h\]h]]rhh9ah_]rihauhaMOhbhhJ]rj(hd)rk}rl(hOjhPjehQhThVhhhX}rm(h]]h\]hZ]h[]h_]hjjuhaMOhbhhJ]rnhmX File systemrorp}rq(hOjhPjkubaubj)rr}rs(hOX.. image:: images/fs.png hPjehQhThVjhX}rt(UuriX images/fs.pngruh]]h\]hZ]h[]j}rvU*jush_]uhaMRhbhhJ]ubhq)rw}rx(hOX\Glances displays the used and total file system disk space. The unit is adapted dynamically.ryhPjehQhThVhuhX}rz(hZ]h[]h\]h]]h_]uhaMShbhhJ]r{hmX\Glances displays the used and total file system disk space. The unit is adapted dynamically.r|r}}r~(hOjyhPjwubaubhq)r}r(hOX#Alerts are set for used disk space:rhPjehQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMVhbhhJ]rhmX#Alerts are set for used disk space:rr}r(hOjhPjubaubj? )r}r(hOUhPjehQhThVjB hX}r(hZ]h[]h\]h]]h_]uhaMXhbhhJ]r(jE )r}r(hOX8If disk used is ``<50%``, then status is set to ``"OK"``jH KhPjhQhThVhahX}r(hZ]h[]h\]h]]h_]uhaMXhbhhJ]r(hmXIf disk used is rr}r(hOXIf disk used is hPjubj)r}r(hOX``<50%``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX<50%rr}r(hOUhPjubahVj'ubhmX, then status is set to rr}r(hOX, then status is set to hPjubj)r}r(hOX``"OK"``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX"OK"rr}r(hOUhPjubahVj'ubeubjE )r}r(hOX=If disk used is ``>50%``, then status is set to ``"CAREFUL"``jH KhPjhQhThVhahX}r(hZ]h[]h\]h]]h_]uhaMYhbhhJ]r(hmXIf disk used is rr}r(hOXIf disk used is hPjubj)r}r(hOX``>50%``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX>50%rr}r(hOUhPjubahVj'ubhmX, then status is set to rr}r(hOX, then status is set to hPjubj)r}r(hOX ``"CAREFUL"``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX "CAREFUL"rr}r(hOUhPjubahVj'ubeubjE )r}r(hOX=If disk used is ``>70%``, then status is set to ``"WARNING"``jH KhPjhQhThVhahX}r(hZ]h[]h\]h]]h_]uhaMZhbhhJ]r(hmXIf disk used is rr}r(hOXIf disk used is hPjubj)r}r(hOX``>70%``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX>70%rr}r(hOUhPjubahVj'ubhmX, then status is set to rr}r(hOX, then status is set to hPjubj)r}r(hOX ``"WARNING"``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX "WARNING"rr}r(hOUhPjubahVj'ubeubjE )r}r(hOX>If disk used is ``>90%``, then status is set to ``"CRITICAL"``jH KhPjhQhThVhahX}r(hZ]h[]h\]h]]h_]uhaM[hbhhJ]r(hmXIf disk used is rr}r(hOXIf disk used is hPjubj)r}r(hOX``>90%``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX>90%rr}r(hOUhPjubahVj'ubhmX, then status is set to rr}r(hOX, then status is set to hPjubj)r}r(hOX``"CRITICAL"``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX "CRITICAL"rr}r(hOUhPjubahVj'ubeubeubhq)r}r(hOXa*Note*: limit values can be overwritten in the configuration file under ``[filesystem]`` section.rhPjehQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM]hbhhJ]r(h{)r}r(hOX*Note*hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXNoterr}r(hOUhPjubahVhubhmXB: limit values can be overwritten in the configuration file under rr}r(hOXB: limit values can be overwritten in the configuration file under hPjubj)r}r(hOX``[filesystem]``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX [filesystem]rr}r(hOUhPjubahVj'ubhmX section.rr}r(hOX section.hPjubeubeubhL)r}r(hOUhPj% hQhThVhWhX}r(hZ]h[]h\]h]]rh.ah_]rh auhaM`hbhhJ]r (hd)r }r (hOj1hPjhQhThVhhhX}r (h]]h\]hZ]h[]h_]hjj,uhaM`hbhhJ]r hmXProcesses listrr}r(hOj1hPj ubaubhq)r}r(hOX Compact view:rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMbhbhhJ]rhmX Compact view:rr}r(hOjhPjubaubj)r}r(hOX".. image:: images/processlist.png hPjhQhThVjhX}r(UuriXimages/processlist.pngrh]]h\]hZ]h[]j}rU*jsh_]uhaMehbhhJ]ubhq)r}r(hOX Full view:r hPjhQhThVhuhX}r!(hZ]h[]h\]h]]h_]uhaMfhbhhJ]r"hmX Full view:r#r$}r%(hOj hPjubaubj)r&}r'(hOX'.. image:: images/processlist-wide.png hPjhQhThVjhX}r((UuriXimages/processlist-wide.pngr)h]]h\]hZ]h[]j}r*U*j)sh_]uhaMihbhhJ]ubhq)r+}r,(hOX(Three views are available for processes:r-hPjhQhThVhuhX}r.(hZ]h[]h\]h]]h_]uhaMjhbhhJ]r/hmX(Three views are available for processes:r0r1}r2(hOj-hPj+ubaubh)r3}r4(hOUhPjhQhThVhhX}r5(jX*h]]h\]hZ]h[]h_]uhaMlhbhhJ]r6(h)r7}r8(hOXProcesses summaryr9hPj3hQhThVhhX}r:(hZ]h[]h\]h]]h_]uhaNhbhhJ]r;hq)r<}r=(hOj9hPj7hQhThVhuhX}r>(hZ]h[]h\]h]]h_]uhaMlhJ]r?hmXProcesses summaryr@rA}rB(hOj9hPj<ubaubaubh)rC}rD(hOX.Optional monitored processes list (new in 1.7)rEhPj3hQhThVhhX}rF(hZ]h[]h\]h]]h_]uhaNhbhhJ]rGhq)rH}rI(hOjEhPjChQhThVhuhX}rJ(hZ]h[]h\]h]]h_]uhaMmhJ]rKhmX.Optional monitored processes list (new in 1.7)rLrM}rN(hOjEhPjHubaubaubh)rO}rP(hOXProcesses list hPj3hQhThVhhX}rQ(hZ]h[]h\]h]]h_]uhaNhbhhJ]rRhq)rS}rT(hOXProcesses listrUhPjOhQhThVhuhX}rV(hZ]h[]h\]h]]h_]uhaMnhJ]rWhmXProcesses listrXrY}rZ(hOjUhPjSubaubaubeubhq)r[}r\(hOXkBy default, or if you hit the ``a`` key, the processes list is automatically sorted by CPU of memory usage.hPjhQhThVhuhX}r](hZ]h[]h\]h]]h_]uhaMphbhhJ]r^(hmXBy default, or if you hit the r_r`}ra(hOXBy default, or if you hit the hPj[ubj)rb}rc(hOX``a``hX}rd(hZ]h[]h\]h]]h_]uhPj[hJ]rehmXarf}rg(hOUhPjbubahVj'ubhmXH key, the processes list is automatically sorted by CPU of memory usage.rhri}rj(hOXH key, the processes list is automatically sorted by CPU of memory usage.hPj[ubeubhq)rk}rl(hOXb*Note*: limit values can be overwritten in the configuration file under the ``[process]`` section.rmhPjhQhThVhuhX}rn(hZ]h[]h\]h]]h_]uhaMshbhhJ]ro(h{)rp}rq(hOX*Note*hX}rr(hZ]h[]h\]h]]h_]uhPjkhJ]rshmXNotertru}rv(hOUhPjpubahVhubhmXF: limit values can be overwritten in the configuration file under the rwrx}ry(hOXF: limit values can be overwritten in the configuration file under the hPjkubj)rz}r{(hOX ``[process]``hX}r|(hZ]h[]h\]h]]h_]uhPjkhJ]r}hmX [process]r~r}r(hOUhPjzubahVj'ubhmX section.rr}r(hOX section.hPjkubeubhq)r}r(hOXBThe number of processes in the list is adapted to the screen size.rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMuhbhhJ]rhmXBThe number of processes in the list is adapted to the screen size.rr}r(hOjhPjubaubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOX!``VIRT`` Total program size (VMS)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMwhJ]r(j)r}r(hOX``VIRT``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMwhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXVIRTrr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXTotal program size (VMS)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMxhJ]rhmXTotal program size (VMS)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``RES`` Resident set size (RSS)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMyhbhhJ]r(j)r}r(hOX``RES``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMyhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXRESrr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXResident set size (RSS)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMzhJ]rhmXResident set size (RSS)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX%``CPU%`` % of CPU used by the processhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaM{hbhhJ]r(j)r}r(hOX``CPU%``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaM{hJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXCPU%rr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX% of CPU used by the processrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM|hJ]rhmX% of CPU used by the processrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX%``MEM%`` % of MEM used by the processhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaM}hbhhJ]r(j)r}r(hOX``MEM%``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaM}hJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXMEM%rr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX% of MEM used by the processrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM~hJ]rhmX% of MEM used by the processrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``PID`` Process IDhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(j)r}r(hOX``PID``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rj)r }r (hOjhX}r (hZ]h[]h\]h]]h_]uhPjhJ]r hmXPIDr r}r(hOUhPj ubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX Process IDrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX Process IDrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX``USER`` User ID per processhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(j)r }r!(hOX``USER``r"hPjhQhThVjhX}r#(hZ]h[]h\]h]]h_]uhaMhJ]r$j)r%}r&(hOj"hX}r'(hZ]h[]h\]h]]h_]uhPj hJ]r(hmXUSERr)r*}r+(hOUhPj%ubahVj'ubaubj)r,}r-(hOUhX}r.(hZ]h[]h\]h]]h_]uhPjhJ]r/hq)r0}r1(hOXUser ID per processr2hPj,hQhThVhuhX}r3(hZ]h[]h\]h]]h_]uhaMhJ]r4hmXUser ID per processr5r6}r7(hOj2hPj0ubaubahVjWubeubj)r8}r9(hOX ``NI`` Nice level of the processhPjhQhThVjhX}r:(hZ]h[]h\]h]]h_]uhaMhbhhJ]r;(j)r<}r=(hOX``NI``r>hPj8hQhThVjhX}r?(hZ]h[]h\]h]]h_]uhaMhJ]r@j)rA}rB(hOj>hX}rC(hZ]h[]h\]h]]h_]uhPj<hJ]rDhmXNIrErF}rG(hOUhPjAubahVj'ubaubj)rH}rI(hOUhX}rJ(hZ]h[]h\]h]]h_]uhPj8hJ]rKhq)rL}rM(hOXNice level of the processrNhPjHhQhThVhuhX}rO(hZ]h[]h\]h]]h_]uhaMhJ]rPhmXNice level of the processrQrR}rS(hOjNhPjLubaubahVjWubeubj)rT}rU(hOX``S`` Process statushPjhQhThVjhX}rV(hZ]h[]h\]h]]h_]uhaMhbhhJ]rW(j)rX}rY(hOX``S``rZhPjThQhThVjhX}r[(hZ]h[]h\]h]]h_]uhaMhJ]r\j)r]}r^(hOjZhX}r_(hZ]h[]h\]h]]h_]uhPjXhJ]r`hmXSra}rb(hOUhPj]ubahVj'ubaubj)rc}rd(hOUhX}re(hZ]h[]h\]h]]h_]uhPjThJ]rfhq)rg}rh(hOXProcess statusrihPjchQhThVhuhX}rj(hZ]h[]h\]h]]h_]uhaMhJ]rkhmXProcess statusrlrm}rn(hOjihPjgubaubahVjWubeubj)ro}rp(hOX"``TIME+`` Cumulative CPU time usedhPjhQhThVjhX}rq(hZ]h[]h\]h]]h_]uhaMhbhhJ]rr(j)rs}rt(hOX ``TIME+``ruhPjohQhThVjhX}rv(hZ]h[]h\]h]]h_]uhaMhJ]rwj)rx}ry(hOjuhX}rz(hZ]h[]h\]h]]h_]uhPjshJ]r{hmXTIME+r|r}}r~(hOUhPjxubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjohJ]rhq)r}r(hOXCumulative CPU time usedrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXCumulative CPU time usedrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX.``IOR/s`` Per process IO read rate (in Byte/s)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(j)r}r(hOX ``IOR/s``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXIOR/srr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX$Per process IO read rate (in Byte/s)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX$Per process IO read rate (in Byte/s)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX/``IOW/s`` Per process IO write rate (in Byte/s)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(j)r}r(hOX ``IOW/s``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXIOW/srr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOX%Per process IO write rate (in Byte/s)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX%Per process IO write rate (in Byte/s)rr}r(hOjhPjubaubahVjWubeubj)r}r(hOX&``NAME`` Process name or command line hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(j)r}r(hOX``NAME``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXNAMErr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXProcess name or command linerhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXProcess name or command linerr}r(hOjhPjubaubahVjWubeubeubhq)r}r(hOXProcess status legend:rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXProcess status legend:rr}r(hOjhPjubaubj)r}r(hOUhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]r(j)r}r(hOX ``R`` runninghPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX``R``rhPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rj)r}r(hOjhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXRr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXrunningrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXrunningrr}r(hOjhPjubaubahVjWubeubj)r}r(hOX#``S`` sleeping (may be interrupted)hPjhQhThVjhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r (j)r }r (hOX``S``r hPjhQhThVjhX}r (hZ]h[]h\]h]]h_]uhaMhJ]rj)r}r(hOj hX}r(hZ]h[]h\]h]]h_]uhPj hJ]rhmXSr}r(hOUhPjubahVj'ubaubj)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhq)r}r(hOXsleeping (may be interrupted)rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXsleeping (may be interrupted)rr}r (hOjhPjubaubahVjWubeubj)r!}r"(hOX)``D`` disk sleep (may not be interrupted)hPjhQhThVjhX}r#(hZ]h[]h\]h]]h_]uhaMhbhhJ]r$(j)r%}r&(hOX``D``r'hPj!hQhThVjhX}r((hZ]h[]h\]h]]h_]uhaMhJ]r)j)r*}r+(hOj'hX}r,(hZ]h[]h\]h]]h_]uhPj%hJ]r-hmXDr.}r/(hOUhPj*ubahVj'ubaubj)r0}r1(hOUhX}r2(hZ]h[]h\]h]]h_]uhPj!hJ]r3hq)r4}r5(hOX#disk sleep (may not be interrupted)r6hPj0hQhThVhuhX}r7(hZ]h[]h\]h]]h_]uhaMhJ]r8hmX#disk sleep (may not be interrupted)r9r:}r;(hOj6hPj4ubaubahVjWubeubj)r<}r=(hOX``T`` traced/stoppedhPjhQhThVjhX}r>(hZ]h[]h\]h]]h_]uhaMhbhhJ]r?(j)r@}rA(hOX``T``rBhPj<hQhThVjhX}rC(hZ]h[]h\]h]]h_]uhaMhJ]rDj)rE}rF(hOjBhX}rG(hZ]h[]h\]h]]h_]uhPj@hJ]rHhmXTrI}rJ(hOUhPjEubahVj'ubaubj)rK}rL(hOUhX}rM(hZ]h[]h\]h]]h_]uhPj<hJ]rNhq)rO}rP(hOXtraced/stoppedrQhPjKhQhThVhuhX}rR(hZ]h[]h\]h]]h_]uhaMhJ]rShmXtraced/stoppedrTrU}rV(hOjQhPjOubaubahVjWubeubj)rW}rX(hOX ``Z`` zombie hPjhQhThVjhX}rY(hZ]h[]h\]h]]h_]uhaMhbhhJ]rZ(j)r[}r\(hOX``Z``r]hPjWhQhThVjhX}r^(hZ]h[]h\]h]]h_]uhaMhJ]r_j)r`}ra(hOj]hX}rb(hZ]h[]h\]h]]h_]uhPj[hJ]rchmXZrd}re(hOUhPj`ubahVj'ubaubj)rf}rg(hOUhX}rh(hZ]h[]h\]h]]h_]uhPjWhJ]rihq)rj}rk(hOXzombierlhPjfhQhThVhuhX}rm(hZ]h[]h\]h]]h_]uhaMhJ]rnhmXzombierorp}rq(hOjlhPjjubaubahVjWubeubeubeubhL)rr}rs(hOUhPj% hQhThVhWhX}rt(hZ]h[]h\]h]]ruh;ah_]rvhauhaMhbhhJ]rw(hd)rx}ry(hOjChPjrhQhThVhhhX}rz(h]]h\]hZ]h[]h_]hjj>uhaMhbhhJ]r{hmXMonitored processes listr|r}}r~(hOjChPjxubaubhq)r}r(hOXNew in version 1.7. Optional.rhPjrhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXNew in version 1.7. Optional.rr}r(hOjhPjubaubhq)r}r(hOXThe monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good.rhPjrhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXThe monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good.rr}r(hOjhPjubaubj)r}r(hOX .. image:: images/monitored.png hPjrhQhThVjhX}r(UuriXimages/monitored.pngrh]]h\]hZ]h[]j}rU*jsh_]uhaMhbhhJ]ubhq)r}r(hOXEach item is defined by:rhPjrhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXEach item is defined by:rr}r(hOjhPjubaubh)r}r(hOUhPjrhQhThVhhX}r(jX*h]]h\]hZ]h[]h_]uhaMhbhhJ]r(h)r}r(hOX=``description``: description of the processes (max 16 chars).rhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX``description``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX descriptionrr}r(hOUhPjubahVj'ubhmX.: description of the processes (max 16 chars).rr}r(hOX.: description of the processes (max 16 chars).hPjubeubaubh)r}r(hOX:``regex``: regular expression of the processes to monitor.rhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX ``regex``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXregexrr}r(hOUhPjubahVj'ubhmX1: regular expression of the processes to monitor.rr}r(hOX1: regular expression of the processes to monitor.hPjubeubaubh)r}r(hOX``command`` (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.rhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX ``command``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXcommandrr}r(hOUhPjubahVj'ubhmXw (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.rr}r(hOXw (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.hPjubeubaubh)r}r(hOXq``countmin`` (optional): minimal number of processes. A warning will be displayed if number of processes < count.rhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX ``countmin``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXcountminrr}r(hOUhPjubahVj'ubhmXe (optional): minimal number of processes. A warning will be displayed if number of processes < count.rr}r(hOXe (optional): minimal number of processes. A warning will be displayed if number of processes < count.hPjubeubaubh)r}r(hOXr``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count. hPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOXq``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count.hPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(j)r}r(hOX ``countmax``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXcountmaxrr}r(hOUhPjubahVj'ubhmXe (optional): maximum number of processes. A warning will be displayed if number of processes > count.rr}r(hOXe (optional): maximum number of processes. A warning will be displayed if number of processes > count.hPjubeubaubeubhq)r}r(hOXUp to 10 items can be defined.rhPjrhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXUp to 10 items can be defined.rr}r(hOjhPjubaubhq)r}r(hOXtFor example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:rhPjrhQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r hmXtFor example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:r r }r (hOjhPjubaubj)r}r(hOX|[monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4hPjrhQhThVjhX}r(jjXconsolejjh]]h\]hZ]h[]h_]uhaMhbhhJ]rhmX|[monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4rr}r(hOUhPjubaubhq)r}r(hOXVIf you also want to monitor the PHP-FPM daemon processes, you should add another item:rhPjrhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXVIf you also want to monitor the PHP-FPM daemon processes, you should add another item:rr}r(hOjhPjubaubj)r}r(hOX[monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 list_1_description=PHP-FPM list_1_regex=.*php-fpm.* list_1_countmin=1 list_1_countmax=20hPjrhQhThVjhX}r(jjXconsolejjh]]h\]hZ]h[]h_]uhaMhbhhJ]r hmX[monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 list_1_description=PHP-FPM list_1_regex=.*php-fpm.* list_1_countmin=1 list_1_countmax=20r!r"}r#(hOUhPjubaubhq)r$}r%(hOXIn client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.r&hPjrhQhThVhuhX}r'(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(hmXIn client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.r)r*}r+(hOj&hPj$ubaubhq)r,}r-(hOXAlerts are set as following:r.hPjrhQhThVhuhX}r/(hZ]h[]h\]h]]h_]uhaMhbhhJ]r0hmXAlerts are set as following:r1r2}r3(hOj.hPj,ubaubj? )r4}r5(hOUhPjrhQhThVjB hX}r6(hZ]h[]h\]h]]h_]uhaMhbhhJ]r7(jE )r8}r9(hOXAIf number of processes is 0, then status is set to ``"CRITICAL"``jH KhPj4hQhThVhahX}r:(hZ]h[]h\]h]]h_]uhaMhbhhJ]r;(hmX3If number of processes is 0, then status is set to r<r=}r>(hOX3If number of processes is 0, then status is set to hPj8ubj)r?}r@(hOX``"CRITICAL"``hX}rA(hZ]h[]h\]h]]h_]uhPj8hJ]rBhmX "CRITICAL"rCrD}rE(hOUhPj?ubahVj'ubeubjE )rF}rG(hOXMIf number of processes is min < current < max, then status is set to ``"OK"``jH KhPj4hQhThVhahX}rH(hZ]h[]h\]h]]h_]uhaMhbhhJ]rI(hmXEIf number of processes is min < current < max, then status is set to rJrK}rL(hOXEIf number of processes is min < current < max, then status is set to hPjFubj)rM}rN(hOX``"OK"``hX}rO(hZ]h[]h\]h]]h_]uhPjFhJ]rPhmX"OK"rQrR}rS(hOUhPjMubahVj'ubeubjE )rT}rU(hOX#Else status is set to ``"WARNING"``jH KhPj4hQhThVhahX}rV(hZ]h[]h\]h]]h_]uhaMhbhhJ]rW(hmXElse status is set to rXrY}rZ(hOXElse status is set to hPjTubj)r[}r\(hOX ``"WARNING"``hX}r](hZ]h[]h\]h]]h_]uhPjThJ]r^hmX "WARNING"r_r`}ra(hOUhPj[ubahVj'ubeubeubeubhL)rb}rc(hOUhPj% hQhThVhWhX}rd(hZ]h[]h\]h]]reh-ah_]rfhauhaMhbhhJ]rg(hd)rh}ri(hOjUhPjbhQhThVhhhX}rj(h]]h\]hZ]h[]h_]hjjPuhaMhbhhJ]rkhmXLogsrlrm}rn(hOjUhPjhubaubj)ro}rp(hOX.. image:: images/logs.png hPjbhQhThVjhX}rq(UuriXimages/logs.pngrrh]]h\]hZ]h[]j}rsU*jrsh_]uhaMhbhhJ]ubhq)rt}ru(hOXNA log messages list is displayed in the bottom of the screen if (and only if):rvhPjbhQhThVhuhX}rw(hZ]h[]h\]h]]h_]uhaMhbhhJ]rxhmXNA log messages list is displayed in the bottom of the screen if (and only if):ryrz}r{(hOjvhPjtubaubh)r|}r}(hOUhPjbhQhThVhhX}r~(jX-h]]h\]hZ]h[]h_]uhaMhbhhJ]r(h)r}r(hOX;at least one ``WARNING`` or ``CRITICAL`` alert was occurredrhPj|hQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]r(hmX at least one rr}r(hOX at least one hPjubj)r}r(hOX ``WARNING``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXWARNINGrr}r(hOUhPjubahVj'ubhmX or rr}r(hOX or hPjubj)r}r(hOX ``CRITICAL``hX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmXCRITICALrr}r(hOUhPjubahVj'ubhmX alert was occurredrr}r(hOX alert was occurredhPjubeubaubh)r}r(hOX9space is available in the bottom of the console/terminal hPj|hQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOX8space is available in the bottom of the console/terminalrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX8space is available in the bottom of the console/terminalrr}r(hOjhPjubaubaubeubhq)r}r(hOX6Each alert message displays the following information:rhPjbhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmX6Each alert message displays the following information:rr}r(hOjhPjubaubcdocutils.nodes enumerated_list r)r}r(hOUhPjbhQhThVUenumerated_listrhX}r(UsuffixrU.h]]h\]hZ]UprefixrUh[]h_]UenumtyperUarabicruhaMhbhhJ]r(h)r}r(hOX start daterhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX start daterr}r(hOjhPjubaubaubh)r}r(hOXend daterhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXend daterr}r(hOjhPjubaubaubh)r}r(hOX alert namerhPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmX alert namerr}r(hOjhPjubaubaubh)r}r(hOXX{min/avg/max} values or number of running processes for monitored processes list alerts hPjhQhThVhhX}r(hZ]h[]h\]h]]h_]uhaNhbhhJ]rhq)r}r(hOXW{min/avg/max} values or number of running processes for monitored processes list alertsrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rhmXW{min/avg/max} values or number of running processes for monitored processes list alertsrr}r(hOjhPjubaubaubeubeubhL)r}r(hOUhPj% hQhThVhWhX}r(hZ]h[]h\]h]]rhDah_]rhauhaMhbhhJ]r(hd)r}r(hOjghPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjjbuhaMhbhhJ]rhmXFooterrr}r(hOjghPjubaubj)r}r(hOX.. image:: images/footer.png hPjhQhThVjhX}r(UuriXimages/footer.pngrh]]h\]hZ]h[]j}rU*jsh_]uhaMhbhhJ]ubhq)r}r(hOXPGlances displays the current date & time and access to the embedded help screen.rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]rhmXPGlances displays the current date & time and access to the embedded help screen.rr}r(hOjhPjubaubhq)r}r (hOXIf one or mode batteries were found on your machine and if the batinfo Python library [3]_ is installed on your system then Glances displays the available percent capacity in the middle on the footer.hPjhQhThVhuhX}r (hZ]h[]h\]h]]h_]uhaMhbhhJ]r (hmXVIf one or mode batteries were found on your machine and if the batinfo Python library r r }r(hOXVIf one or mode batteries were found on your machine and if the batinfo Python library hPjubj )r}r(hOX[3]_jKhPjhVj hX}r(h]]rUid3rah\]hZ]h[]h_]hjh7uhJ]rhmX3r}r(hOUhPjubaubhmXn is installed on your system then Glances displays the available percent capacity in the middle on the footer.rr}r(hOXn is installed on your system then Glances displays the available percent capacity in the middle on the footer.hPjubeubj)r}r(hOX.. image:: images/battery.png hPjhQhThVjhX}r(UuriXimages/battery.pngrh]]h\]hZ]h[]j}rU*jsh_]uhaMhbhhJ]ubhq)r}r (hOXiIf you have ran Glances in client mode ``-c``, you can also see if the client is connected to the server.r!hPjhQhThVhuhX}r"(hZ]h[]h\]h]]h_]uhaMhbhhJ]r#(hmX'If you have ran Glances in client mode r$r%}r&(hOX'If you have ran Glances in client mode hPjubj)r'}r((hOX``-c``hX}r)(hZ]h[]h\]h]]h_]uhPjhJ]r*hmX-cr+r,}r-(hOUhPj'ubahVj'ubhmX<, you can also see if the client is connected to the server.r.r/}r0(hOX<, you can also see if the client is connected to the server.hPjubeubhq)r1}r2(hOXIf client is connected:r3hPjhQhThVhuhX}r4(hZ]h[]h\]h]]h_]uhaMhbhhJ]r5hmXIf client is connected:r6r7}r8(hOj3hPj1ubaubj)r9}r:(hOX'.. image:: images/client-connected.png hPjhQhThVjhX}r;(UuriXimages/client-connected.pngr<h]]h\]hZ]h[]j}r=U*j<sh_]uhaMhbhhJ]ubhq)r>}r?(hOXelse:r@hPjhQhThVhuhX}rA(hZ]h[]h\]h]]h_]uhaMhbhhJ]rBhmXelse:rCrD}rE(hOj@hPj>ubaubj)rF}rG(hOX*.. image:: images/client-disconnected.png hPjhQhThVjhX}rH(UuriXimages/client-disconnected.pngrIh]]h\]hZ]h[]j}rJU*jIsh_]uhaMhbhhJ]ubhq)rK}rL(hOXIOn the left, you can easily see if you are connected to a Glances server.rMhPjhQhThVhuhX}rN(hZ]h[]h\]h]]h_]uhaMhbhhJ]rOhmXIOn the left, you can easily see if you are connected to a Glances server.rPrQ}rR(hOjMhPjKubaubeubeubhL)rS}rT(hOUhPhMhQhThVhWhX}rU(hZ]h[]h\]h]]rVh4ah_]rWhauhaMhbhhJ]rX(hd)rY}rZ(hOjyhPjShQhThVhhhX}r[(h]]h\]hZ]h[]h_]hjjtuhaMhbhhJ]r\hmXAPI documentationr]r^}r_(hOjyhPjYubaubhq)r`}ra(hOXLGlances uses a `XML-RPC server`_ and can be used by another client software.rbhPjShQhThVhuhX}rc(hZ]h[]h\]h]]h_]uhaMhbhhJ]rd(hmXGlances uses a rerf}rg(hOXGlances uses a hPj`ubh)rh}ri(hOX`XML-RPC server`_jKhPj`hVhhX}rj(UnameXXML-RPC serverjX8http://docs.python.org/2/library/simplexmlrpcserver.htmlrkh]]h\]hZ]h[]h_]uhJ]rlhmXXML-RPC serverrmrn}ro(hOUhPjhubaubhmX, and can be used by another client software.rprq}rr(hOX, and can be used by another client software.hPj`ubeubhq)rs}rt(hOXbAPI documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-ToruhPjShQhThVhuhX}rv(hZ]h[]h\]h]]h_]uhaMhbhhJ]rw(hmX"API documentation is available at rxry}rz(hOX"API documentation is available at hPjsubh)r{}r|(hOX@https://github.com/nicolargo/glances/wiki/The-Glances-API-How-Tor}hX}r~(Urefurij}h]]h\]hZ]h[]h_]uhPjshJ]rhmX@https://github.com/nicolargo/glances/wiki/The-Glances-API-How-Torr}r(hOUhPj{ubahVhubeubeubhL)r}r(hOUhPhMhQhThVhWhX}r(hZ]h[]h\]h]]rh6ah_]rhauhaMhbhhJ]r(hd)r}r(hOjhPjhQhThVhhhX}r(h]]h\]hZ]h[]h_]hjjuhaMhbhhJ]rhmXSupportrr}r(hOjhPjubaubhq)r}r(hOXoTo report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issuesrhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhbhhJ]r(hmXDTo report a bug or a feature request use the bug tracking system at rr}r(hOXDTo report a bug or a feature request use the bug tracking system at hPjubh)r}r(hOX+https://github.com/nicolargo/glances/issuesrhX}r(Urefurijh]]h\]hZ]h[]h_]uhPjhJ]rhmX+https://github.com/nicolargo/glances/issuesrr}r(hOUhPjubahVhubeubhq)r}r(hOXFeel free to contribute!rhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM hbhhJ]rhmXFeel free to contribute!rr}r(hOjhPjubaubcdocutils.nodes footnote r)r}r(hOX4http://nosheep.net/story/defining-unix-load-average/rjKhPjhQhThVUfootnoterhX}r(hZ]h[]h\]rj ah]]rh8ah_]rX1auhaM hbhhJ]r(cdocutils.nodes label r)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX1r}r(hOUhPjubahVUlabelrubhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM hJ]rh)r}r(hOjhX}r(Urefurijh]]h\]hZ]h[]h_]uhPjhJ]rhmX4http://nosheep.net/story/defining-unix-load-average/rr}r(hOUhPjubahVhubaubeubj)r}r(hOXGhttp://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.htmlrjKhPjhQhThVjhX}r(hZ]h[]h\]rj ah]]rh:ah_]rX2auhaM hbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX2r}r(hOUhPjubahVjubhq)r}r(hOjhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaM hJ]rh)r}r(hOjhX}r(Urefurijh]]h\]hZ]h[]h_]uhPjhJ]rhmXGhttp://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.htmlrr}r(hOUhPjubahVhubaubeubj)r}r(hOX%https://github.com/nicolargo/batinfo jKhPjhQhThVjhX}r(hZ]h[]h\]rjah]]rh7ah_]rX3auhaMhbhhJ]r(j)r}r(hOUhX}r(hZ]h[]h\]h]]h_]uhPjhJ]rhmX3r}r(hOUhPjubahVjubhq)r}r(hOX$https://github.com/nicolargo/batinforhPjhQhThVhuhX}r(hZ]h[]h\]h]]h_]uhaMhJ]rh)r}r(hOjhX}r(Urefurijh]]h\]hZ]h[]h_]uhPjhJ]rhmX$https://github.com/nicolargo/batinforr}r(hOUhPjubahVhubaubeubcdocutils.nodes target r)r}r(hOX-.. _psutil: https://code.google.com/p/psutil/U referencedrKhPjhQhThVUtargetrhX}r(jjh]]rhEah\]hZ]h[]h_]rhauhaMhbhhJ]ubj)r}r(hOXL.. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.htmljKhPjhQhThVjhX}r(jjkh]]rh?ah\]hZ]h[]h_]rhauhaMhbhhJ]ubeubeubahOUU transformerrNU footnote_refsr}r(X1]rj aX3]rjaX2]r j auUrefnamesr }r (X1]r j aj]r jaX3]rjaX2]rj aXxml-rpc server]rjhauUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhbhU current_linerNUtransform_messagesr]rUreporterrNUid_startrK U autofootnotesr]rU citation_refsr }r!Uindirect_targetsr"]r#Usettingsr$(cdocutils.frontend Values r%or&}r'(Ufootnote_backlinksr(KUrecord_dependenciesr)NU rfc_base_urlr*Uhttp://tools.ietf.org/html/r+U tracebackr,Upep_referencesr-NUstrip_commentsr.NU toc_backlinksr/Uentryr0U language_coder1Uenr2U datestampr3NU report_levelr4KU _destinationr5NU halt_levelr6KU strip_classesr7NhhNUerror_encoding_error_handlerr8Ubackslashreplacer9Udebugr:NUembed_stylesheetr;Uoutput_encoding_error_handlerr<Ustrictr=U sectnum_xformr>KUdump_transformsr?NU docinfo_xformr@KUwarning_streamrANUpep_file_url_templaterBUpep-%04drCUexit_status_levelrDKUconfigrENUstrict_visitorrFNUcloak_email_addressesrGUtrim_footnote_reference_spacerHUenvrINUdump_pseudo_xmlrJNUexpose_internalsrKNUsectsubtitle_xformrLU source_linkrMNUrfc_referencesrNNUoutput_encodingrOUutf-8rPU source_urlrQNUinput_encodingrRU utf-8-sigrSU_disable_configrTNU id_prefixrUUU tab_widthrVKUerror_encodingrWUUTF-8rXU_sourcerYU8/home/nicolargo/Dropbox/dev/glances/docs/glances-doc.rstrZUgettext_compactr[U generatorr\NUdump_internalsr]NU smart_quotesr^U pep_base_urlr_Uhttp://www.python.org/dev/peps/r`Usyntax_highlightraUlongrbUinput_encoding_error_handlerrcj=Uauto_id_prefixrdUidreUdoctitle_xformrfUstrip_elements_with_classesrgNU _config_filesrh]Ufile_insertion_enabledriKU raw_enabledrjKU dump_settingsrkNubUsymbol_footnote_startrlKUidsrm}rn(h+j h4jSh:jh-jbh/j hEjh1jh2hMh3j h?jh8jh5jhkhh;jrh6jj j jjhIj% j j jjjjj(j$j>j:jPjLjbj^jtjph hCj2 h@jjjhhh>jhDjhFhjjjbj^h7jhGj<jjjjjjh9jejjhHj j>j:h0j uUsubstitution_namesro}rphVhbhX}rq(hZ]h]]h\]UsourcehTh[]h_]uU footnotesrr]rs(jjjeUrefidsrt}ruub.glances-1.7.3/docs/_build/doctrees/index.doctree000066400000000000000000000160311225327237200216200ustar00rootroot00000000000000cdocutils.nodes document q)q}q(U nametypesq}q(X get the codeqNXsourceqXcontentsqNX#welcome to glances's documentation!q NXindices and tablesq NuUsubstitution_defsq }q Uparse_messagesq ]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hU get-the-codeqhUsourceqhUcontentsqh U"welcome-to-glances-s-documentationqh Uindices-and-tablesquUchildrenq]q(cdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceq cdocutils.nodes reprunicode q!X2/home/nicolargo/Dropbox/dev/glances/docs/index.rstq"q#}q$bUtagnameq%Usectionq&U attributesq'}q((Udupnamesq)]Uclassesq*]Ubackrefsq+]Uidsq,]q-haUnamesq.]q/h auUlineq0KUdocumentq1hh]q2(cdocutils.nodes title q3)q4}q5(hX#Welcome to Glances's documentation!q6hhh h#h%Utitleq7h'}q8(h)]h*]h+]h,]h.]uh0Kh1hh]q9cdocutils.nodes Text q:X#Welcome to Glances's documentation!q;q<}q=(hh6hh4ubaubcdocutils.nodes paragraph q>)q?}q@(hXO**Glances** is a cross-platform curses-based monitoring tool written in Python.qAhhh h#h%U paragraphqBh'}qC(h)]h*]h+]h,]h.]uh0Kh1hh]qD(cdocutils.nodes strong qE)qF}qG(hX **Glances**h'}qH(h)]h*]h+]h,]h.]uhh?h]qIh:XGlancesqJqK}qL(hUhhFubah%UstrongqMubh:XD is a cross-platform curses-based monitoring tool written in Python.qNqO}qP(hXD is a cross-platform curses-based monitoring tool written in Python.hh?ubeubh>)qQ}qR(hXVIt uses the psutil library and some internal code to get information from your system.qShhh h#h%hBh'}qT(h)]h*]h+]h,]h.]uh0Kh1hh]qUh:XVIt uses the psutil library and some internal code to get information from your system.qVqW}qX(hhShhQubaubcdocutils.nodes image qY)qZ}q[(hX[.. image:: https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png hhh h#h%Uimageq\h'}q](UuriXOhttps://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.pngq^h,]h+]h)]h*]U candidatesq_}q`U?h^sh.]uh0K h1hh]ubh)qa}qb(hUhhh h#h%h&h'}qc(h)]h*]h+]h,]qdhah.]qehauh0K h1hh]qf(h3)qg}qh(hX Get the codeqihhah h#h%h7h'}qj(h)]h*]h+]h,]h.]uh0K h1hh]qkh:X Get the codeqlqm}qn(hhihhgubaubh>)qo}qp(hXKThe `source `_ is available on GitHub.qqhhah h#h%hBh'}qr(h)]h*]h+]h,]h.]uh0K h1hh]qs(h:XThe qtqu}qv(hXThe hhoubcdocutils.nodes reference qw)qx}qy(hX/`source `_h'}qz(UnamehUrefuriq{X#http://github.com/nicolargo/glancesq|h,]h+]h)]h*]h.]uhhoh]q}h:Xsourceq~q}q(hUhhxubah%U referencequbcdocutils.nodes target q)q}q(hX& U referencedqKhhoh%Utargetqh'}q(Urefurih|h,]qhah+]h)]h*]h.]qhauh]ubh:X is available on GitHub.qq}q(hX is available on GitHub.hhoubeubeubh)q}q(hUhhh h#h%h&h'}q(h)]h*]h+]h,]qhah.]qhauh0Kh1hh]q(h3)q}q(hXContentsqhhh h#h%h7h'}q(h)]h*]h+]h,]h.]uh0Kh1hh]qh:XContentsqq}q(hhhhubaubcdocutils.nodes compound q)q}q(hUhhh h#h%Ucompoundqh'}q(h)]h*]qUtoctree-wrapperqah+]h,]h.]uh0Nh1hh]qcsphinx.addnodes toctree q)q}q(hUhhh h#h%Utoctreeqh'}q(UnumberedqKhUindexqU titlesonlyqUglobqh,]h+]h)]h*]h.]Uentriesq]qNX glances-docqqaUhiddenqU includefilesq]qhaUmaxdepthqKuh0Kh]ubaubeubeubh)q}q(hUhhh h#h%h&h'}q(h)]h*]h+]h,]qhah.]qh auh0Kh1hh]q(h3)q}q(hXIndices and tablesqhhh h#h%h7h'}q(h)]h*]h+]h,]h.]uh0Kh1hh]qh:XIndices and tablesqq}q(hhhhubaubcdocutils.nodes bullet_list q)q}q(hUhhh h#h%U bullet_listqh'}q(UbulletqX*h,]h+]h)]h*]h.]uh0Kh1hh]q(cdocutils.nodes list_item q)q}q(hX:ref:`genindex`qhhh h#h%U list_itemqh'}q(h)]h*]h+]h,]h.]uh0Nh1hh]qh>)q}q(hhhhh h#h%hBh'}q(h)]h*]h+]h,]h.]uh0Kh]qcsphinx.addnodes pending_xref q)q}q(hhhhh h#h%U pending_xrefqh'}q(UreftypeXrefUrefwarnqوU reftargetqXgenindexU refdomainXstdqh,]h+]U refexplicith)]h*]h.]Urefdocqhuh0Kh]qcdocutils.nodes emphasis q)q}q(hhh'}q(h)]h*]q(UxrefqhXstd-refqeh+]h,]h.]uhhh]qh:Xgenindexq慁q}q(hUhhubah%Uemphasisqubaubaubaubh)q}q(hX:ref:`modindex`qhhh h#h%hh'}q(h)]h*]h+]h,]h.]uh0Nh1hh]qh>)q}q(hhhhh h#h%hBh'}q(h)]h*]h+]h,]h.]uh0Kh]qh)q}q(hhhhh h#h%hh'}q(UreftypeXrefhوhXmodindexU refdomainXstdqh,]h+]U refexplicith)]h*]h.]hhuh0Kh]qh)q}q(hhh'}q(h)]h*]q(hhXstd-refqeh+]h,]h.]uhhh]qh:Xmodindexqq}r(hUhhubah%hubaubaubaubh)r}r(hX :ref:`search`rhhh h#h%hh'}r(h)]h*]h+]h,]h.]uh0Nh1hh]rh>)r}r(hjhjh h#h%hBh'}r(h)]h*]h+]h,]h.]uh0Kh]r h)r }r (hjhjh h#h%hh'}r (UreftypeXrefhوhXsearchU refdomainXstdr h,]h+]U refexplicith)]h*]h.]hhuh0Kh]rh)r}r(hjh'}r(h)]h*]r(hj Xstd-refreh+]h,]h.]uhj h]rh:Xsearchrr}r(hUhjubah%hubaubaubaubeubeubehUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]r Usymbol_footnote_refsr!]r"U citationsr#]r$h1hU current_liner%NUtransform_messagesr&]r'Ureporterr(NUid_startr)KU autofootnotesr*]r+U citation_refsr,}r-Uindirect_targetsr.]r/Usettingsr0(cdocutils.frontend Values r1or2}r3(Ufootnote_backlinksr4KUrecord_dependenciesr5NU rfc_base_urlr6Uhttp://tools.ietf.org/html/r7U tracebackr8Upep_referencesr9NUstrip_commentsr:NU toc_backlinksr;Uentryr<U language_coder=Uenr>U datestampr?NU report_levelr@KU _destinationrANU halt_levelrBKU strip_classesrCNh7NUerror_encoding_error_handlerrDUbackslashreplacerEUdebugrFNUembed_stylesheetrGUoutput_encoding_error_handlerrHUstrictrIU sectnum_xformrJKUdump_transformsrKNU docinfo_xformrLKUwarning_streamrMNUpep_file_url_templaterNUpep-%04drOUexit_status_levelrPKUconfigrQNUstrict_visitorrRNUcloak_email_addressesrSUtrim_footnote_reference_spacerTUenvrUNUdump_pseudo_xmlrVNUexpose_internalsrWNUsectsubtitle_xformrXU source_linkrYNUrfc_referencesrZNUoutput_encodingr[Uutf-8r\U source_urlr]NUinput_encodingr^U utf-8-sigr_U_disable_configr`NU id_prefixraUU tab_widthrbKUerror_encodingrcUUTF-8rdU_sourcereU2/home/nicolargo/Dropbox/dev/glances/docs/index.rstrfUgettext_compactrgU generatorrhNUdump_internalsriNU smart_quotesrjU pep_base_urlrkUhttp://www.python.org/dev/peps/rlUsyntax_highlightrmUlongrnUinput_encoding_error_handlerrojIUauto_id_prefixrpUidrqUdoctitle_xformrrUstrip_elements_with_classesrsNU _config_filesrt]Ufile_insertion_enabledruKU raw_enabledrvKU dump_settingsrwNubUsymbol_footnote_startrxKUidsry}rz(hhhhhhahhhhuUsubstitution_namesr{}r|h%h1h'}r}(h)]h,]h+]Usourceh#h*]h.]uU footnotesr~]rUrefidsr}rub.glances-1.7.3/docs/_build/html/000077500000000000000000000000001225327237200162755ustar00rootroot00000000000000glances-1.7.3/docs/_build/html/.buildinfo000066400000000000000000000003461225327237200202540ustar00rootroot00000000000000# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 88f9709ac94d939db26f5322044ea5df tags: fbb0d17656682115ca4d033fb2f83ba1 glances-1.7.3/docs/_build/html/_images/000077500000000000000000000000001225327237200177015ustar00rootroot00000000000000glances-1.7.3/docs/_build/html/_images/battery.png000066400000000000000000000154061225327237200220670ustar00rootroot00000000000000PNG  IHDRXZSsBITOtEXtSoftwareShutterc IDATxw\SWϽIaF,*➈VkUԪTuuϧuZ:EѪV;l7^lTF2@0A?hz}"Swzɡ $>R4ogjm-$'H<]uV P{X6;UƥokѢŃ[(SXb:|\Vvʬؓ{9]y(n''3S<,ؔ,Tԫwl;w4ac] Ȫ0:}ܣ҉c>bz_8+%AAŻ_8یԼH9( `¿1,4YP}?3fN6 8(WY6r0}C \mC׶GN{Xx=Jv/ljƳlOx 0cu>fG;L;ȱs~^.Q ?̩>"z^{OF& f,cH,-]IgQm/\흫>váMXFW KEb&Mu1ٿ̣gۿI~Lu5A-`E~"if F{w,|.=p'׎H4vm&1Kp~bӞ=:rnnnnN6 [Gtvw84L5&ث;M{-vQKxR͌~Sj3mO{InJ2|I:yijǨ؊diy/nQ[fyu=\ޭ/[ i* rf {gqQ^,Vܠ{mlDF/Qq}\qj?4{\%4 R?t`&bO^S ey1iҭ)|Kx(M8M磦7\o>VT6z'g7 IouJ.3nqF]y|Bm?+R_ =^{,YÓ{FGLjcʢ(-t7a9Pܮo}Cro츺qaQS(6tٺIc Bq[Yl?b֜}S@Tp͎F%"K@c=BHxK]@!&BB!B!B!B!Z0|ohu6ۿ[?c_m92˄v!aUݷ&헻03gGS/x.eyֻ}3[![v//0Ǝ~㧌k&ű[GԃTFM? ^g+K%7"&qx潗43Ovgw4cdɱ vՖ[ԲRڣqʘ;EŽYn4*5:i0̼H*.;pt.jtٷ6u+enFMF̟#cլi35yN8s87w~3MvLzh X1`L]? FrMI2,J(8Lkؼ+59 jMy)Wy%u`ȍs\Х_z5ky~-JϭDq7WH$dѦ[ s-Y۪(W%0:@<~הQ7gҾӦL_By r"4`^F=>lP[M;y:(yמׂyKފ{\K|PүV+KtӒsŷ.$haEfYEIw%>4~OAN-{qĘ OA.ol0o55wko׏_pt…V VZ_jc{^勜2Wd?!Wtd_ ȫ*wk4σR12Xq | |YsWNٸo? n"4`^@u`ğ-ELAmf*̫ `^=`^S)ATE ԕ&^UFQ0/=/ry'cL|wjgúZ[pᎲ͸:OKv _ e Φk^!-~0/~2z+Ǟ~iS0o%(yܞDnϤGWe(]KW"5]e/{i`j\60Wm2v~Hr =G!!EAuBR>@]>N!R0 <7Bk@G"eOF!ĠÁ @ڕe3BB1H, >@7 r* #ud_<2bφ!K^h UL[[SẀe_WZG&O°N=>oj$Fvm[]='Sꬼ&B X=u[߾]ㅼ&\={?OU3]ܠm^V~;T^Wc<3/?/w9QZ3~ҕÍ"vo}k,\߉8v+n=lO]wJ`)h~CW0`^e_b59[ P UOMr*C̫6}Vm4ʱowH=sJ^Q[Om e/u42u55o׫UG9jR0oμ @`^ W{>f~2vO]?%^㮢zjGp9X X͂22{Fֆڻiv+=,~0)Vd `^+v\RJd#f"^-y[L}'@>pX|Xg @(9>Bz^C yY6|ʹӰ_z ]1]vB|I)tAM2R0o GcVN&@`9p 7{]S@N PgiPyUp< !ay@}vcL癫>)DK!qN U}rKǜ\Ӛ`^BލL[Y|qKlMBj/ $- ˭yܚ; !7xq^r@Lyf[n&:3`hY=O?`X#ѓFOBt xT{zɷV@ou X7>#jlPR |8Գ[vKGBn@m(@01D{Bk}@!a-LӀ6pBW; m|r&8n Rx?_R=v!pF&`?Њ< !%Os:8PwBU'0K^Nj !OcGSF5Э#JE`3n'}EL{/a+φ|XFO*ghBu̖{;6no΃F8 0tЕ#ں8_NwIFN. 6f_˔v.MXBj'^V^jS{$s^}]2}vbR{?s|Tǁ-٬v7y2i !1,J(jN)S6w24>&] qIwga޵ckB~X=Uvm\afO۪#0 $そgI@R #{|9f- tZ,+2$NjclCY4m d_g;`oٕ#[_Sqe7 ,E,xO{DHX55wko׏_pt{cN!@5S!cFZ~gv. s3\'2_c{L49ۍx}fF Kj<{]5U$ Mu_-KYXHcLɫ_Ϡkm貙ݫy5|jٛCzXT=h \% -X;8OG__=x'._50S)GLU*8V1=qysU>m)CzMr큭kօT۷~MNq5f}\X|^D|}Bї;Z:E1b }NWY+!2_un>VKk|/5 W>*ݒ< /y,0pT1KK_jf HM dr֯MbT%@ɹM&xpÊm-zH߱vO3ǵu67&~TTI@Rc^)Óf ̭#.N~3C S[;]}`w@O+*@_ܵw.za$.~2 K>]f.s[/97b=~/.^IwG|]H.n.( >i.2x l38jW}`ȫ+;!ȗ+8]̒WjwYb_*CF,$n\tp \ g4mi?ޚ+*<=D~uA)Ts)gv$g'^3Km2X7 %I;lxw~ ``M6!WM/R׫ʰF~k?PVB ;)$/UcM6Pg+>HשJ+O M["&lIIm; $9q)gaM6tsIjM^jū Sy|=KbZJ5ɣ^Nx%$qغJ&DmjWS@7&AP-ՙoꕛq!1*OմȁD[.~y[QuLrJ~}kRxcujTxʐ_KVKYor>3mg~z{$TN)=&Cg:8m7ujtyA^`.`Ny\)ՠuj`=tVmO5ZϹƵDp'4VVR=&,c,eDk*O>g[J[}LK53R׊AooLmǷeֺ9#Z_M=`ɛÚE LY69ŕzkvr( _{^IHpt׭Bo^sޙ߳WH γֽTԬy DÞ+Cw^*ɋoW]u4 R E;{Hy{$(9\Re ]yf&jZ Z"aGB޲+#|NRszRkc3hZc7 >;cW(6#f.\=*}סaeO\rG:rw~_]n@'o~w1`YJ{#[dahQ9:!4ܴSZڨG:Rы..<_>eZc))rC~W\Si:mEeI/y$_/o_,m??2d͕{I8~Z}sJjЇ = jboX ֬}r8Ti.ȶ|>Oi* _AM@C)1Sݞ({YYtXJ|oTx6O:mEN/:s9i'fE/KY1\ImS&}i}Mu_~"` u}\Ζ Y3J{*:;>Uwzwf_vT/VYD9'2KBK9|Uktַϧ2T]R!)gN'T RbjٲcSjޫOS`5;m (( o_W }6dEi}0o3RC}\bѺ_;d-(!Tv,zl!5#2"B!Nw6d/&L*""4İ&l*!"b}|L7jM6_I7;d`p': ydM6\b¦{o5 kM6t$&l*~2EkE&ʋR#DG$ {&l*G~J$:K.E9Tb# 8l?ʏxd\lp)sp2ȭU)#2.;㇎ m'X'j[Ob䩝%gWv\{o"j8`ݠ`W'Jt5_WwoޏkyxS=".Cⴂ ~OT.K?6v+n spWOl;l6rRLb" cَ~>2'/}{14Z-۵f.w1zU}3L{-ߺ̝.\=+G o_ʌ{r'։L*|).)֊~u{r$wn1n\3hrW."-㠑}nD(8ْe#Ћ7~72CS*с^},nBD>d TCuQ1, !c{v͉QҀm;ʀisxYڐԱoخ '{05:cw9ZoK{4]Ueb':*#~|tQ涓+_*&U RE&9zQeϳgZ.0t֘vψDR2?(SJn2<巪-NG3ױoMtw k,P'[⚮,Ji佹ۏög@p_ +>l(mWBC=qL<{OV7'<0*,҇U=>'XV|~}=%WtƘj+<{Z>Y*Y>s:^\ u0ݔ+9xgw{3OBqc?-IGsyĕx[ҥw빧TlZN`=r$;n#и ilV^[Di DD(<d-12b(%y@EEDť\KĐ%a'ۧf׿z=[hRzP,"|9.i9}VW$] "=J's-nM[:Doo[,gIhS lA2En=;C`v"2hDR$q\gEs:MeK[sr۬wDl+y\g*s<qOW'#I]x I։8bfKÑ5VYu sI +*ԗX]6J=m_.{kV̑kW'si'1aq\櫔>k?;Y3'A*>BL˦ .t.)c)?]X V-Qn\tH E][Sݐ⽣̪q@Z8<`wHw;sa:46_O]7j?tĆBA'V0' N$oOiB6U.RߝYXqȃ`jgg.Ò/'>1~;>!SB2j~Fsվ6(b !&l*_xJ#"QL&lϲcM6 ?rJm&nRΟoAF)-#l2@"9;εl 󨳮BhR%z<&ԕe>„˩)УҬ(P2 olJq ! 8y7#*!Z-&Tܥa2wh")` 6RG8dbۚ>ojpz@$+rк 1-dٍ4vJ,'FC^r4"H1K1mg"=(],@F2FE ix~ Pבpe([P蘋Ә8XLNP`1ˈo: Eh$~q>'g EPcrU ĔQ1)XokmsϗF7[FEgyssT4$ybHVl\EkAlZ!S"3P>MpKEAdnU0Xx +h(P N5wBBnWXHXTBB4HU$qrLh#"c$qd-BIT'伆&q! HYKDCBhu} TGj ](V$ـz-יDú0(sNIиO9)IYvBZWկS(T*c$i3'0DH]T9w :=f Qr0c} ܮi"S/8yь, kP J"2H+zSخbЂ=S"K[Bu=#X#sއW\DU$I_&s@6;3&.璆"}eq:KXp ~KSgUy+ob0/A)mX5ńeAup3d$t\#tՑ41KWV7C[4:V)`hZ& M>c5=avH'@ɡ ,BW9t/ hI7K/"1(mNk@v!s5 T ٿ(&i[J.װ5x/z0amQ;"i|E#2Rd@b*Zg*aVHG͖DA׏4۰h> @ P\ U= QN?YCrVA4`6˄y6>()3/S awIENDB`glances-1.7.3/docs/_build/html/_images/client-disconnected.png000066400000000000000000000234451225327237200243350ustar00rootroot00000000000000PNG  IHDR@iļXsBITOtEXtSoftwareShutterc IDATx]w|UEy=K/$!! 6wl #""M+_g 3$(]束"\֤eDOSʙ3?8" җ7iܑy>BׯX=1fh X|NnCc}bֹi.<~nbn\~S.WJQ(7E⺎|hr|'ncs&m{e5cNWY\U)/􉥏xhgg% e+="M%cIܺrɵ8W935X\NG put_w7h{x\k⃫ƺQ^̜WJ?ٰf܉bes'7gT Km/cwRս_P,J{6^hkjmծvl=wd>R+˧$Irxv.rzrȡrָf\9VEԹ".hr!Hg51*UL)ۈ-p\9C֡qHu9@KrRNAC9㒛7yAJG)k\ 剅@˦h1Itk)9-JnZZ:f$&v88沈j?1T;Ԕqq(V#12dkSps1nN #tcN]&N}Len1jy#wM" 49coxs7!~o:dܲrPWCX^zFMx~Tކ%OV%1)߯nnK~",,(fN:=>ᦥC]>݃nj߹njߦFPϯX/uK&TͽsӞ6ECIGOI߽پݛ 9W읝a?{OCo7*ksYIɘꉑ<|فO_фd~o͠HmiYWLI_թ.~5U71\^Pde`]u-~j$殿zK%ɑ1"%"zI_]usZ˶mo*Tw, /{`}t+ug,^btܥSN6{C N>hG'O}DX䊍\?]M\e҉.\6sa)h};%?!nxc1*@zgR]`5w͠Txgw ذq8_Wu8bK۫3Nu@)s3M3m|yoY-yx#c# _ѸEOo挵?|p;:W (yfʬ[G kZKv*1vbEq>bʨ?z4 R4w:l/@gU{\ Niz]>e{G&_yʺmaD& |q+X4isp%po^-M:YS.rߟr.{aKl.b.|_)3\>泙oirdqԲo]u+v}tc9}~>}bG67])2=P{+Z偋[Z[M_7qx*JVc\5\Wg:{KĄm2ϼg( tL眃%ys/r[O}`C\V|x{\'7UX颩HeoΟigs8N˦v 7l~#ņ"u*hW=G%q6cGxcYDwʌ\P5|vw]onhM$qt2WL[TM1r5c/|6Jf$N1({~{63<>/;@| xfa<=MbFq;dKjnMNj=dx_KFVW/RҠf2]ٕ얷sp@_p[Xkw_;R97Hd͇>}vf伇|Cnԯc2b '{ȍ]XtvCK&b^7sEC/S\i| x8|w=db(9wb8Cd\ ȓ hfK H{rts(16;Cǝ|@|0e(yqi8:ɘJ}!~BjBCѯ?X/;!'R?(ur"!38 ƴ㎏$mt!~Tr] [M?DSx[f 981]9PPAfKxocꀽ6 h>18͓]Sq.9!6٠ 8p?~*/tQC6鿫G "P d@'j7yST_s Cdžw7u?Ƌ6থTX ,: s:&x6Rn *T[6q]`vJ<%G]#б!3`nOovӎ?,,vXtT~qpƝk:Z7уl~zO}"5:ZrdvJV;a9tpUtqVTyO zC ppaLCڭ(:<;;ʡq4 _X=wV객"$<砮e: b` 0n@1(QѯM,~~ZnG"))>,5?1c02uXUzewYFpq^gPA~QLG_C@$_/!r?.ф%Pe(Tֳ3@IK,ugL zڏCy As>, UBi:ܸY=*BPhk@ q0}1Gi=Kݙut/E˦ jLW9SZd=G&AV;Mq;m#˞~nt(}2'_U~͝|{ZMs@Etb7ՋkOb);2---6u!3 trrbO^;yw٧[ IXZ8˶91X+MM?Tӻi}@uz>m͛vᐗ_yC|­KX]p$4n3` j=ڒ_3(:US "H w6{]'' *hl< ߙP\sޒgZߛ4/'slͤsMRWg&1lrIهw 3SES$R O64ɩ+3*f>|r?.{Q[\19y mƙۓf>\Zl}_}nIj#ÂHKʒ^THYݟ Vӂ g9/yԬ?{9VnyJ7Pd}\g-)3l{/kגlnu1!4$&6$%'U<{؅}#:mO_k}ep+eu35%s6~Q#u4"zړ 3}gt-Ϛe/J?{mWK$4m/lN>4-q=sO~3*3N{eQ-EeSx4gFc>*58@y ɦrd[ߤ| }O2f1f7#rӪ<_*z:@{sWtvѢ1]= nS0fݓ/K9^K9 GWKakw3}ɭC\+W10߽ߗ0d3 .W-^zmױA1)"8eܘ5#-(F$E+KS 剻ȋ]eQ"[jB>SU>ZS6%tjk?inpAቫ >!,70%%aOGkyK8\d5,@Ӓ#᳒/Vdg8Gx뎦w<-zf{рw-]u.lʍ3r6Y,FM!TYMUUs2pL%w5鴠Yϱ6#.1^8rnJ<}u5ov~;F|y}U PnݓqY|S-I};j.T8t]Z U}N pp zp/6(zwla"Q oˋF3K͐Zj{7/HH/7y1~J w1>m;/QlN[3-~6Lɛ9'P 1DRW0ezNdC"?aez}}} *>sQk+ijrpTrdOy}^&g\15U u۷|_}AxWvKJS7~W\p'şrKLՋKȈ P~ @ۆ;cY_|Q:n#vkK@ wmORw柊/":w|_{qbA'ǑZ|}0r]#ozp۰IwRjLzUif_+/<%) UWΝ 33= @USpKddNLR_[^6+`]9C}㡫KcYO&K-W7IaC)Dy^[~cu/nڋ}m25Kk0X8V՝446qЯՇLpHSbXckO#Pj#ApBre-~Ҁ3Xݷ/,ٶ;n;~^6>= ~mKYtXz)XJ<ۆoruwV-#; r ?2OK~`80DSp@kpqDxJDU{w! P 9(~K'(Ԟ=f &ѷ x&#]ej'2@eRkhSxҋE`$h\7qa"oRLF/H}.p\T1637kK&>1T>XAㅖJ줡ʬnh57ѭS[n=Lmu8׆鏗ұZO \YS躎CW:e6ee K%R6'~[ ϰE1>Ց]f0QYzq"k::3G e5i&-}bvlm^!h ns~  ^S!l7`:^a&\ALvCE6fS7jacM$!=&T-B K,-45xb|Jf\. Z Zsq FBQk2x~lˬ}#=1[S-aAڳ*Y(<*"Ri]th۱宵lgs3lN}QЀsK6X+֊ uU-h)]Bu{F qQr7-$I21\E =c\Eƾh 2Ί#O'.-8pq+*,s1_&c%Ε6Y,beAup3b\!0͋F!61KS+>(%)jTC"jÙ'F4M 4#/EA8! J Eܘt⚎~KƳ:EO mE+Etr͂d/I-%jkX5x._r?$@f7-FϻUm^4YcG46p}*Zgj 02kr .͖ۮEuzg+#pfϡ~-H7JafBb'&}340+ H.feaX v@xH^SfdS'-!)|R)@IENDB`glances-1.7.3/docs/_build/html/_images/cpu-wide.png000066400000000000000000000151231225327237200221260ustar00rootroot00000000000000PNG  IHDRJDsBITOtEXtSoftwareShutterc IDATx]g\>@ b&" um(V\.E콡k!KEz&~X$w/KsϜ{8p8T-'cr1 j2ouT`t5$J@s 1P]aһ#4UoP먅CDƆDYeCѱglOܲ# #oȈg:\.擽3]Ԥu΃t#M6W/CFd=35IF no XHrKWOHx+i9vy9N;ڑWf[khPv64=8t}ߐ͌K9q^r4nM2+vܼ/aJi>zGƾ7~`R bY Pt<ϫxӭ2rzۀ>Btb=EiQ3f$|m+S5`tTR][G׹Lxkbw=V Y /rL(ᄄ׶vdd^}X$1oq𳄬{"VGA*`Ueqٳ jZy =?œl+f@ ,KiѦD!:&WUOҬ[+7.yWˑkNWI]\Yfs_$x5o뵟:T E$"V,mCVp3x|T=ոGӆ7WokS/Mu]w%RbVl-a՗fv#یCilD zi|fNウðܝYDl Ê:nk™y(F$b=Ȳ=fg?nUjlڇ-'B52n&0a3JF~{6 3S\Y箅![U* R~m}M.B;ېstу*2s[9t#tM-,-4MR?1# Ɇ޿۷aqSoT4^(&1FDb$*Ԑx@`jn|נ8=6ċ"!h *?9oOUqxTIA[7UW=DIᕐ]I^۷Ng|W| #&cSxN_O**8p8p|U;ÈUKsֻ*8Z<"HG$=uzWǍBuw?(m3 L0Z6sގxTc~{Ir}?7X}GS@sAVZHͻ;O>)U}uInݭM4+.@1e{;O>xvW~5/W,lPHi{mYL~n7b=!tz<2\b[îJ:x6 VktD!t<rŲs@6}fQDŐ9ǹ1I]A];>~:>Lur_3q ¥3P7U2/FzM׹b(<~i`饓nﱺ#I@茙KJOyv' ^mީU - k"./[e,}&n Bo p؆62&FQ_itQcHTV#n5U}^+:}z6+{3?2d]ݾ4搑WWtܦb{dS;׎![6L$X\k>*h bubs2o F-z!j䬲J ~@Gog,ޱN %P坣^H*bb akuX\I( LxS(FLMHɨXiy}aJ5:̶Բ/UݦSX}_R(?eD-R_Q㔝]PeWyQS5=zp/0oG딌W$1 ishZ#!|q5~Rn&>Ulf^T(zJz켻A $@d?vIjr^ŝ]^C :`97m[MutiTœ~PTSBm|+*y% qLh$@4XlrHP&KEQim+2]XCju+[ϓUs*x\^cݙQ6:1~+ν*uc՗cfUB{CjN4Өɞb>lX7;3}Eo7;rV|>\M תٟ6E;u{~|{ȖݗT $gΔ1fEMxcl"ԝ{V+Ĥ¦$ŀD&шdiǯlܛW2/ʐowyQ^ h:m8{W&~-qok"&g3X]SfkHX"ՇUDsEcfrlks5DF=+ ANr8>]$5bw}R/H#NgQJ*%SwmysƇ,AȌS~Is=ERx%dwwP-'^0zqY[|Sgv(G:1~8p8pڑ4&f8Opf 29KKfn?fOVU\?[_ [kOigzGG81_QY]I$M})m=p{c4&ʪ2uɔWI :;NhDڜ+mUA%ұf}Zt61˥qM|B<)}y$qa> y0og7ploΟ/3inFG@_E\0@hVmE3UvH=n4ny>Lߣ]ݻwď ,}K0q1 59v=)|eաi޺&zV{@e L~?jBm]F9*$ɪ+ ˏH: H%.S(8/KdtP $l z=#wͫwy>Bf@FGO8$:WF1%6,4Q(/! ܾ2n?^?am&0UݑYY:oՌ9 VމZ J"!AC͸̻:Š Ic?_|Ё"WKEa#8+ǃϥ,J]>$%Obp)6_fcw,qzLZ@"%9+Q٠|  !R9Fj jVKړ!4`g#'`Pye.'vpӐf#\;vV:5U]=e/bOJw ރl=1m& wdew4"vᮆTtG_)W iI CD@a $jc o:K\}w#୤H;UB/Ϊ&917o =m;4НPyA!sL Z3G:wjQoCO_ SC6rbەB>ژw(G;!/.iZ1%)+C=$S>ziYR"á߸_'ƀmGnǿ3w{ؠNZX u5gYHM_y:=L1C16Wͫ%|zXMV^_Ӕ؃ ߷AR|H*K0 hXiO(rAzIc- ^mIҍ݆*|T|uxɭΡk6e]6.?9yewn]ܒba%COwL[8RE8GKf\5-c-JC;&T%v 8pJ^!Qa# {&qO-4$LA4\7u8wTމy>o.ZD17NȧOd_ƻ[RC{YMjzR|*:v. ׍Q݉cB95̖zDؓG ^z8:lr1vwn$ k,sӣMYdO-_FDl̴ȵ'cB<61+4{LXjmWWlQP*ә}q?OU}[LJxZJ>i3'beTdDh$`TRA+Ͻ,F!^xtӈWUhBP7DM)>'-rC㳯hCG6wU#ZGyF}-hehmRYjh#Uj*KHe%,tHjsZƸB ~ZҶw(*+eZ&ږR1ACfbA%|rY*"Ƈ kڣ;}APC IC_x|I#'\KEaS?mz{i[;]VmʭTˈ>lB6pӗtӏ=MtXL *rS.cMdi``8z&ubk=m{ X>.C_(Rqu713f3 n\-;1uQP֪w(ozUO0[kX/Bg}_6Kz~hz8=_'. I17II?O$HQZO}o`/Q\|-lݲOr6e 19|[s= fwm3UhkSP)'Zw8p8pWIENDB`glances-1.7.3/docs/_build/html/_images/cpu.png000066400000000000000000000100471225327237200212000ustar00rootroot00000000000000PNG  IHDRzGGsBITOtEXtSoftwareShutterc IDATx\i@S׶^'s QPTD@q@q±:QhN Z>}REu#RP@'@ $9' jI'/aegדּ *. VT ܟ?gc!Ԑm:n˻gX_#?>tB[z8N]@t\|| ] ]aѣ䕻Wzɉn>?*iъ1[|ݾjWU&tQ3[e4 P@ղ!NrPfݥV?5`kMr\>+Ʊ_u.AՙsVXgIxxcI$پҩrF `&ʹW Aᕱo}=x_BxWLmO!B3'bͲYnB%K3G@C1_ds6ȍ:Xu7y[|=74r.%GO{B9YtǁM=jY'YZZZZ11rk4nMrAP,)$ "1PiL^nּgo̡_i)ҜvRX L;e۬>nl Fi?ytP~۷杉 ojͣudsE Tkkg[en ?xӆtqHL>z ) S}kw辚zgȱ`p-wvcHL _[$04,v2W BD~eB=&]JI' `kWNkzF2dlg&}Qq O=?< ^P5B1`l1=\Û2/H, X2{!˽T#~#ͣgѦ4>ްj%@ekkA~_JKVQgw _!k fѫ i,:Eؘ]G0Xp7zE~g7n{s78F\U6`_PCem#Es.]M;th&H$&*((L* ر=k,1޶+lx/^MjڧO ^gKV:~wP}24gËemnMȨZrj>C]jvBD^[1"P]Y)BFeOr߽Y%D@ӵ2f8lzӲ\ R{ҳg?a]֧̏I@*j`5%ro,"e2UbXy1Arstnա7^Qt52'c|^88_jSwOiJN==cUE#^I[%g1XRa! Eo'F]=I`=Ԃ ^,ՕԊe=XƐa 0?J <]4j]rkŊg~}207{3 iMq׺yc>3a栆ϫZyت7< $Jp-nŒS=Uz&h8LP$2kJI:X5G`6d"ר; a{%A@9,*@nqoWWBܳi}93h5%s@Hiw9~|@Pz'M/N4ńf:A'w @䘵Ɉ fWu]fwI|9`)z;.SQT*곤Tpw'4#n [?_)!/|3F.QKOD. I}Ŗ1koR\RR^RCWXR\R\R-h ^ ›Ȓ覾{\̪jQLmYi&_ FAPt<@%?%#rᇨjk_Ɛ(9B\@' |*)ijuWƼ郕:.dʇIUS<]z_J(ԬG:`Od7!j ='#<%=,$㛐9cniu -. ˇ#dpXokO:S[@iy#ɔJY6{(b|)α9e{GI"G>}RP@˫yq~-S۷r(= Mk&e 2Q{lwĸ/F{7w՞6r \#pQ+."lՇ#dr#oL* O=%兎l&SF 󦹛\{5@/=Y$S`;tEmݴJ\ 70ȼY"_/#H2t50vA$tfz![.h}yAz߸9E-:܌>O573aPXN 빚æ S 3urt: v9bRiN Mmv0xU8uܟL=T|DŽf>>>>>r]K&8>R>?$=t=<'-UÑ:ZCg^u E/pFrDPs|o#9TFps͊gp B:#d{Ln#u=S3{92aax+Z&Tp$celZJb܆] &rQڶw?2;2lumȞ @ވ({8\cզIƪDpv/P{'x)PrZ֭ȍwJl7X^aHrhW($DN"gW2YݽEB3xPZJHgBm=B&;.Qp$9'6Ѧźv$bc˃#^`{ 7}Lqbt5&ބD"jth> 5_i;/{귮# Ƨ7YC'1atT׷w +sy#Mt5\]]J\1$xO%k4e/#WpXۿG_qJc/U'0X<5mq镨VQ>] Xg˘B!LZ2sI ve H gbUkkE[e*UpLwϰՅ? oFIENDB`glances-1.7.3/docs/_build/html/_images/diskio.png000066400000000000000000000102771225327237200217000ustar00rootroot00000000000000PNG  IHDR&7`sBITOtEXtSoftwareShutterc [IDATx[w\l !tQDc 6 JD}Pދ%*6.n(5j4B5VDPA* }} ` dkwvv~sϜBҙ@/rʳYe*N@\i*~\\<|⏯>eMٿ"m`:n;tl=؞d:[ڳ1 6%!gs9ES&3!뽻୛* +Ϥ2YV *AǬTh&XBDSrZrό  >T"CA@؆IM sbO8{aF&Wn \iOܑ}k&6k :bbsN C,օCЕxq{7w`kSi{71Y{."b7R82h{i g$m7=Ƌ?~xh%GSrq[`2$57j $9 ߹ Sy{z[X5m;?F^-li(rV; ƘBy@'IBQo4BĶ߃r!Xus'e>iKR>|eH@a' 5gɶ4w4g(c2y 'cʢ *J q’%ON  ZRN;G^'ݍmT"7 pjbaɅ`f܊oVazx]kΆ~Sbt' 5WBcFKj) CK.U7_X Z ͿZ8f^W`X8R(U+|)]{̭1xܻQEژ7ӳJtiqn:Z VJѢjoxʎ1MQ4E0ET)l^;h b a%CtIr.q?J2<ߞTӦ OEC{ s-ؿJx}}Ȏ@W0R6 m4:/WCH0H+򪈶Fkm-91`9SW:>e^#8T Oy}z#},:r=Vu[ K|vy76䡪aC@fu0*F @ZzSކ2H,ʊ_ϤU ^>|T 9HZېegAVsۡfꆠqJkFttQInsR-jQjze^Dw g1|wGd$g v6 8[+vL3'\QT#W(YVCn.seރPU@ՄPTS-VIi`aHr 28 k.o :ͿZ,,4ۍDy1 dبnjMeTY-v\5΅MyiÎ q,(] ݸVAQ&G9dߝ_#4zNk 'T C3NI? ҳwtBĵwtt#|Н$H;kw/{".?1` ̱[ʗeR-fK6#':ܸ1gˑ I.X,:yu5d3$l9;͘SR∽7(<~ڃ g NTq֟H{r鿕?6"CSfIhQI3q1d jL ׮SWEY8qG pя\~s~JP~tne?PcjŮe^^u%qȊ.&gvfW>=9N2a,YuIyRm%/EN=Ⱥ:.SDcd<>m9w.'G*9qk'rOKR)E![(.o zuGڗ&w(Ga!Rޙ >=фPCԋ~nMeXb,5Ts)BèU4#A%!!BBnۧe@DBI"@n rG.ܦFwzz%|\ih43EQbv s7ϝZ- t-]#tAuMHh;dMnT?۹Qpl΢sE2 ?9_eMQitBe)q?c⻨MóV\Dcu#Qm/.^"ol]~*€Ҋ29+Nޚr%T{GevCBCmcG~Y"`92mqH=ʧ6 aK֍"EHZk- c[R)B2dUe&˺#zi܃*Uc1l^@kgDK|4IPsk!4Ӎy{zl4B\=|1I}gLA7d\SBRd9=*ů>_%Dvm}3ɖ?9Rz 0qG GGrZQ(Aiku{4n HC[STqDHc(2Wڑc?00د9-d!MفQ}D96-rQMe܄5RՅ崑1 !HTG93|}rB&/xzmښ7wޠkyӰqI3J$4M;q*+_V1瞉2b)dp8DxʥΏKƼAzڥlPCYO=S{I}P AM7ms$p|ӗtgKjJk+pYi9#gKؑs-~oj޺DB`#k־e wu4Ow-rȝG"Gˀ82~!~tWr) @U}׍?󯂪sk^೥wV5Bh]_Rj告Z>`ʨ3qݮVBS)N(W)gǡZuTTwg:; Ĥ"?)Wz))z.EMee#,{SS.H[[;պ!g<.ZTr茞hc9Qrn>W## ۜu_n9YIG_Z6Ss\4zYbG{~T[ܮzeWR\MWkiM [-TV Z, W/p5W/@YgZ򤬛r]AsWdO^ό$K8 u[D B^Yuj*-:Z`ƞ|ιU8ƪTjkơ}[>2v.(CO%9#y׮O޶c8~-}Ų~{;a~yOMiМRegCgpνu#_36dcQaE}S]uS绷uSg'&fyig~7Nf91yS],dU'{< ʺ"%T5rZOcB!41Ȯ-&1ぴEn:1q5ɛ3Cf>f $Nx,ˉnY$&gWf9ixZ772=gߣg&82vjoen:RZZYkal6`㱶ZC::-)nܺ|9AP Ydr  E]HmkD#UkyRMGPUKMWPִ^r0c@D!4L|No(赣C- Q8F&YNE=nӭ9w\,|́ѫsT ׹S ĥ~3 !-h//K~{Uj qS(v/wu)r [46L+NQšzc@yL{W~ UE屍; 'n+ ϤQMj}/PC=_=3DygΟ){ >KB=S>!B0!B!B!B!B!B!B!B!B bRlIENDB`glances-1.7.3/docs/_build/html/_images/fs.png000066400000000000000000000230501225327237200210170ustar00rootroot00000000000000PNG  IHDRjcsBITOtEXtSoftwareShutterc IDATxw@5ѫAPԠ+VD5cbKQcԨ1[b(5XbXHõݝw r꽿`nong훙7.t3Lg:ٛ`w80000pNz64v}D2 wX*W(WtM3{R<{O=U2G3RӉ]E$bӦ~Si#"qWS"Ȧ$EQ$ϘWx$AM%$EQM_mc WF^Rv?"+YJrK410e0DDSG$Ijg)0?S'@sIJ3vFBJ /Y lfv=)Yl\8qg*5{VExZ<Y{~NrԤsB͞۱kw!,ð aXaT.OPGYOo>ס )Yu=Í y) (~`Ws08܋ ?|V\jcelE<6*aC'CBdrk;D&&VRˠXD`K YeHda+HN+c0+2*>n)"!(~E?O66n݇wȋz[ ]M~q{8gLօW&K@]JܦGwtzS8nw_pڊ0%{E7.owC@L͢- 8mn羃W2#TE/wڱf탓=Ag]xssr"e~Z:Sm*1Vȍ۷{h49YrΕu`ɆVl]QJ7]@#WE;MC I ID$rPI1P~0f1 DP$Q7I5?T]ު)`BBrSH9o)c@Nq|r !i"!x5_ 7mD"(G$4 :Y/#u3ik\um#wټ?q~7E]<ؐWT ҙXHZq]Okdķ5I;Z *yq1^Q3&}}c2e糔z]/~Y3w{$7A=GRȊrtߟUY<˞>%;?O+=C'NyOS;Rv_eMlZ fQ≭uAH'ǧm;u*Bm|ny+NvĹ -Yu!K 婡gb:Lh^{,ygTƀ,&v""loWK'Rd49-pda@=X~IS똾ӯ ēwy_SMBhhJS/tqtTc~)i7u$L]Kˡ'>E*wӊgs$?DB(9wc "Y;.p_T4@ p7n1E'<.R}=^زk>;+4Geӂ튢\mͰm[cehą%D鲬Rp2$!Vd702/raeJvSqCsjf~3 AZ CWru(źO t'Ɂ*)ݱ:ڦpFLaR_Nț yqI¼G{êc=^g#%da2oomHbEfr֞y `ʲ~;}Ǹb[R8uNǛ9hEnbDT3Tbbrgϩ{`WU6j' IH؇DZ!UTTԚ6U}Dl{廅u3K10 ;hs+5 7SLA?_35" t~3Ev~7:_!ܨI{ MzǢ_|Ț?7Zzxct-Via'X/TCJgu7s#޸Y9[h%6%MN;D<9IM,F}UAh\L z^w̬zdo[mmמbٽEQ2[ KQg$]J~9!%їv~!L}<*}wxXlޯܤ𻍚&i`f8.{Zm|P8ٝD Aw[>tT%ڷQkbi/թzn_ zQVrNoQBf` J)(m7bㆦ8[em6VV@T)QH0h㚕5~n0VRgkt wO=?@,yxjR*Np^[g61qѥf#[ He`GPuMn*@Z"vHV-xCnr`lf_l)NʪdX,/؉)fgʲK`i"D[:l˚vlQT5UF֏묙}[={KȪ/ainHbF/`iJ/)⛻BqF) ^)VW ;I$$A''B'2mteu e_p`ϕ>6ݬVhTPB㘪mX?`a/o-Cv}{]a1[\Tֺ5,'Rh(KK};-\<Ԇ4/7Z`HX<*]Zs۪Tֹ۞ۘ͏pټг^%ߎ* Xԡ!@oq}1SrWIW}Qźְ4 7q?eVRwٻuooUؿ#wS\yboHT,IO9x*aH?[>ݴϐ .>p9C۫ui^{s0ngO"P KG~s<c++ WT]r4KNTd`dGWΰz/7K f-h{ۮ޳~'iEᱍKoX=!6<Ⱥ^<1u"{r;] 7ҥ6;P3,($M(j\SFL9ӊ;w'#9YZdq~ԸW?1v]]A7#S#/jN!yFJ}QH-,f"C7FYse * >[-&WD@W*^8N27#sX1[ģNvz8|$0>u3SB«\7$}n+, ti ^G&i134D4E N#;3|ۑ0/LL !dYg ,5tI7(yt/)bfi5"sOc,2ܯx9+훃 mbCΖJE5+SYۉ)obz.NVwtj>@HN:ȐW_7Sv|t~[S6El^ˏΏ}'U5Jal,e&3CϨ%$G(nj+i,z]Z#@;Ajr1ڳy蹸ǽN] 9,R pժ^e) oKˡKK7Zyjy&WY 忍e4uzW4qڲ|XZe5yz\UխGr4NVgڲұ:_ԙΚŸX].V:k%b>0qqm:l嬿v}XZnOd7&Y cjMElNB_"UjXU4cI魹o fBIJ+ R\jJ &DIVLRlTz[5m2͌&]Zd>z',Ib벴?1y9?Ar;Ӌ~^@c$./Iׯ_`?pޮ|"3¯N?N}=ҥz.^Rs{a쟧c~j݆Sɍ00]ZUo%VRhӫx18qJ+ r:)NUn{cۂ,m}]Zbg3^+|cijiyxOagti 0RNe7UG]_{ł/']; $nyio¶!LM4*m99]ZΔ,MJJyr`yɣ7"cC\LUO>y|?Xs~ڸ:K  iJViEzkQWNBa̩B 2067>լ&dlbicio(YZ\XXTv+ 7JlyD{hVƶXZ.[ux+}RQx3ir -oKdK$K“SS'8ӗ|5#c,k@ԺץE0bbiI -^E-W~VpjFƶYZMsxz]ښxybi1K5rԌN57 eqQK3-1sQ;|Qg-F== ͇NVg4Fb]dZ.7p88藺gM9YZRwOIDAT+8ƚXZ;fS|*ǔ [9 ^gKVߖp=-_qaC٧7y]Km7Lē*xٸ֜ËI#˵{!ZD \>h,AQ==̐-6rVA{_=D11/}9YZUZV )gXR+5p7 "?*N ≴{D $b1cY_:z_n{K\3OʌAU-^:Oz__F}z IRݤiEu1Q1QK nhZAfTҖ>:ឫɌ}r/FҜ,ޚ?sm;DlQ#ui9mj?6P\|U83@4p?q JSj(`NnLZu)fyp+ I^;~3Y1'K[l{KڍG՟E֥Uo۔{ȚXZDX˜G̪K5Q@ @r5pЪuabv IRluikEDPO|6.m5ƪ@H5QZXr نua͕`Пm.z~RAs}QK3-1.δ&nfuݯ3Lg.<ʮIENDB`glances-1.7.3/docs/_build/html/_images/hddtemp.png000066400000000000000000000043131225327237200220350ustar00rootroot00000000000000PNG  IHDR:usBITOtEXtSoftwareShutterc gIDATxyTSWe%@B()rpRjGij":*ATkR׊Zki]Ztl.*Be!yɻZ QW}/}B!B!B!BH\p{.) .Yb/IjYxw#㟈57ŝZCS{o!MFRXπ# :iϞUѡR~%^|mxtCWon?4kYm 0M2bB$Bn7wk@$<ܑs"L ~aX@!3031#3tkMػj-5Ezi{x(LѦϑp=$\h2d2<ude_-v2[-5Տg[q7;!ˠ?pPl>g`FDj(rF)[*Ngn_WhʾGf 3ut0OiZ_S rƆɵ(+Smf޶9wSOSPT<\,̿Y_폇VHWA>^=;c3qDNܦG u0n3cab؈%_߬>ȓ/* 7z :}٩HPvltK4Ĵ 6OG6_]cYbVa]߈])LV1o~WNE~cUA'Y| ZT隬e8lN`,ͼkL V޴q|sTFgOWJs@ZT(c:[_7VqQECf\W|.Ȭv%c+?jKFNOM q3l>Aڔerk}'<"ca)&L<%@ae'F u5~{_0`I]χ̍eYNܰӟ =Cze#&Lݭb??Ao7]|\h Z+%ՎߚRJCx^oOؘYx@,ݖɐw VhI@4u-)t捜D׉xAX'7q@ýBc=5MN&ƍسHsYƗؾn<8XWtF4ڷ͇TNt§kUCXh{oP1@y5%^@LŹ뾺o-ǩ|;WU8k!B!B!B!DIENDB`glances-1.7.3/docs/_build/html/_images/header.png000066400000000000000000000101021225327237200216310ustar00rootroot00000000000000PNG  IHDR sBITOtEXtSoftwareShutterc IDATxwXϛA ` ŭHZ5bş։A":PDōZgUuVAA!vBPl}_I{{ν}=ppppppppppppppppppppppppphsRwEWd1}o6WCB'u}붤-H]/N۬D&d2X'Bd2~.{${b%5G\~:z@uXqpyًEҎoH5x.@{.urT @9{so ,33O -MFfԾO9==7)Q.U8"*m3]Ԥum=V#k_ζOxhiըv"c͵ x{y8![Aek8?fҮI=o5[t:bz:3&,Ɖh9[x((EX"nt:R/d8̞mj9~yJAde"9Ձ:U4/RSz%="J%a":{`S6t _e4!NOK1kUJ Xfx |Wl-c0 ;pol7;=B]f79jrױn7ewz˳M|V n=iR^㣊az;88rIL@S8al:bА`V9mlgSF@uVeHD?*'Fb2k6J×,:\I-u9V_"0|嫧$aYQ{ ~,҆v*H2k<.6"**$;]Я;M=779NT".8ԇNd A>y5_k_5㝔*IˤO JY/9I_ІK2'5f[k/Hd K/kQ!D_BaǎVA@@lr4iC1m_SXTS㌉؎T߷'!t_d2 Ts†v%Igg^YDuTI'(/+)6EoV9+|8dN4vd=wՐCQ 9Џ%ݽmM1zX:Uћ΀oeO=/,-Jr=r,V'^c=*ŗ|qcԬj켩fmwO(®}fV{ r) Q5-,t\鱈\iM;TܼR $RԾ^  !]7V oµJDHT¯s5zoʀ\}(vbG NpnB{4ؑJQG^}'tu^xBvYaUdz!먢NP3)ё?mQfuU1G[r@ q$ȁ軘E:/*}bR/&"|;$+#YiZy\) d`kAwtsWuC?co_Õ(u^z 9ٕ嶧ZvSskHNW&n(_)? ƼD̕4ؗKj$;.2G`'3iEdKTQi?kJ}9|{]X }jCzܚt U>ζ}mc?6qeRd5|XEI- 5 ;g~(¾(̡yN=8EA&k:*k-I$>:M#r*m(+n(<\0ϵLAxbWQ@7 Ks+1:D";w#VOYJq'ՉN Qy^섭Wx==y1tQ% $DuJsw5 ,)P35naPqHT2@6RP@"~q{]-gh؄Grs&jh?5X9\WL$C^չ"{D]OŬ{wLD$: (K[|+3mb;(֞ZbwT G/X:{H}Ϙo'|X CF >;xY 7+ ]7V {к^FӇҌ-|*g^༄1}uSݰ) |( NWpl.u̠y.vƦV<|Xa7N3w|o.~~wr8o'ipr)۞Zɸ:1_tY%gbQAXθ{Ҧ3hڜ{=J@\|o[=<,(ɓ#`|zTe;ّ_k՛'՗Q[ʏw/?y듰k{ovE KWd}n[“OS_ ^t"=7 T5B!^(u3` @uSŌ3>}+84쁎~1ӝ\=Pzy1n:{>ksWE5uSx@\ɉ' 2a?W"DΝ0](OGo|TtDkrJ̶(˷5@\zg*֏ss[$2w]nsEzb{5zk޲u=Rߠ]-\E?ȍ{u_/=^z&;?o #8]dt8[+&꫁յοn5҃IENDB`glances-1.7.3/docs/_build/html/_images/load.png000066400000000000000000000071361225327237200213350ustar00rootroot00000000000000PNG  IHDRLcsBITOtEXtSoftwareShutterc IDATx[w\T{Q\D@).-&Q,X35OD"$1Q,[0cM^>O%*-w"w {g939 ,X`E5ÙYm T_[rUj*qvW2!"I$`k yW7ۥAs#=tןbd֯H3X&dpR`Ĉ&{S@~s]*b?oKBw)X(U fSe5τ l喙;LLszMzϳxI2]9燌w0&bJ?_Ls\4-my^15WlFiefeeeee=8;>ws23%W+%J}/ {ܐY-e]7;qVLJ5עIk*Oko|^ש+zwď|/ܔw<}kW|/(G\9wxyaaE#e\2-6끨o /9RVST.= QMGϔCIxgcM9opUꉃq\hc-rbo~ϧe}JĂV$ K\ :6;#^=pnPVT(1 `ϪN&f)qA_|qFguuWkc}&O mA2rBPsGfLx|ǡO[w8$˸7iW}?~!WV/蟳!}&@D@\iHC!0L.Vk9.d ȳ`W7$ M_fXQIZu;[3弱j_x;*E;Rk·Mpk} rҜM5 Hy4g1X[Uz]~7~]Њ\gEݼIFV^߭$kRz;l %/d+kk4!y.C?-W[-Muy*snw؋ G_þ^*&,K_'2 [}#Y:Pa*n`V@ ._\`qn.JU()yj xHFɛvhK]V=C¦D,Wy~FtZ6y+rkLu 餑b!`ζD SR`ƚFp-g7fcN\(4&7m4/:IOۈA]*_3^^4}HIOIq3 윛v&(PYIT> ?SSUNf[~6vΜW My.Ւ02M۴8yox=:Ayq%"iTel]&5QVqn&3WW'OăP@]kt^ڨkX޼> {MVaq#xj÷P-`ۻgLs\'nFt5INO#n6cEH *fo*థ[@U{K4FsktΖUs& e* ~mhfFHNG! :[|qa+Uqk!Y66v"!k4f$ &7{H&.?Ro fgPf7TߠY5F-:Yam 6,W4}/ֆ59ĭ9v\N9ĭ;>9ŭn2P[΍Xi_Mx0 3@b ,XFіyIENDB`glances-1.7.3/docs/_build/html/_images/logs.png000066400000000000000000000273071225327237200213640ustar00rootroot00000000000000PNG  IHDR-GD{0sBITOtEXtSoftwareShutterc IDATx]w\;hGP`AEk%K51D&-&^bQK^8:;{x6?y>; !B $B"qH"DTUB;e¨^| VhyZ|D]D;;ïjutN6`/o{Fi|_=huz^}Sς0ozò*^7Tm]68@/@Rm&r|$0K&;FhqSKVǁtE2ZwfiX@ >{("B֞ u' Wy Zu_L{ʐ;?F$EA77]2»&?w\eɑ,MApO!P;貏#!]NtBJ5yF] Oh3#oMghtz}ޙ іԛdS]>Sj(WR VWRgitz}زrN U?4?sj~Ef MW’ruz>'?ɧ7}_i\Z_DSoIHRE}Xպ8A:.hEHO#3qp=3fب\!o5@*.O3Z!?EG,eY&ݒ@3!Wwz>*IJ,Б:*"Q֯4"g7M4zcSM?RhiS.&=_g1ܜ< b2#B'Xeo<-K<}#Y44 -K OAȡmߣ5ڔ]]mHh4}\^Ɉ6rNqFO6̪XVotM~8R`~{FijueLz 7fǽܸ[ ju{4Yc|bvyʎ8huCf%\ҾYlȧ EQT94˹w A"B=~X7@r}G*I"Kp`K}sld_7+H4fvcTBNpط_{9)O~򹻱Eݝ Dz=Oz]( +,.^#ڷX k_ah']GԋY:#]:c]V1Xۂz!\:/խ;w ȯױ_O'߈|  M^{3<Rǜ;eaҥ>p{l>]ݥ%2&ҺI}_>Scџ|u)8#2 M3'=7l40VhR 1|_(!1#3vvT=ݳ`} ?jM/[طg*͢=\,{mĿ/gx.͢\qW^H aVȢ(Lz,z}k{)Ej$[^h҆6ig2SQ4Fha)o]/?6ԯS5 $I k+Aiُhdž27U/xC3˼͵/F\Ӭt{`HNa&Ӱ* ߤ4ܚ.)*T%M4n+<ޗK7wWM3lʾ9&x_kaQo~g؀G_炧zE)C~΁g\|K=>[JB;h&@ _۩+//tq]O7W9]ڋd9z:63/Rmӱr_ {zկI@G?=0 Ѕˍ@n''!eYdlz WoWwO䄞9kl'vD`:ޱo|o\ˋXepʲLnwz }F<]zy3jPyT.=tj񰔹5]15^z=)%&htGd XB#|nlݦyM6?+F [Lc U"B!CJ{J@g-8b5" -k%q;Aà]y~ :Hohp4_A彅=C0rIM^I 1~Ǚt9ŠF@J{V4rppnE,V\ *$o8BrʵIHey6dIխ) ;&Ie$j{O9E\ʞ8fؑck$=wcKEX;X0'x CEXd8vãֱR@j& '9 RT2x%dv<ʌC@S}E❐/ HLk$xǙ6>t7S{_j_?Oȶ}_/R^g^ga<% @VN[p2vt= nS&5!!n4hwq`i 4>&=#tg -!Б奕)ww 5YҽŪ46V[c5PtW_. B C4M3#"K{n2Y@2M',B>ն7AW#U{^߹qۡ9SUcҩ7sZ~z-JmCdrDpr|syh6-J8x!/?CM(jA .nK;gΜ94/Fک)ZAG/ |!:#2I˳'O<@4]~ VcrÚ̟YW㡢&6[6hJZ뷍դڰ$74G]9fhF݄̏ϼཧ2FOvBF[ir^q{̦.6gΣVI'B 6':2VbQ͘m? ;}w%tjUQb.Lר]G՘^yqתz0*Haj55^ g\$ٽ%_>O E2W>fzqpw|o ADj@5C57 ԯteKxZ$QDN3N7"`f~O׿s ]t#yADe$-B[7{3SЄ~6 O U:.-OxH:az7M<-)RwVv v^ʓ {vM//rS%7יSs:DVa𞂼XAՖCΩhV}f Ivs:#M޺8bY{F9к4=7Ё&eB,0L_m}9C@X7?8MOg_'aؐy ict|d.zus벃I k!Iq{Dz(7v 8Xԛ>P^gOYUu, Oo<ü8lN]{)Y6?1 }љZaĀ3|l~MyzT|J_;7ePR؍W_iYˌmRsEq ==eY6rEsKM&M3q3[S: >G9G 'fuWGj8 Ͱ!]V|ȵ_wt)q=cpycJfOlŤ!tw(fgR'8!!?ې>N̥YqzJpܡʹ݈HU3,͊}p>5$?`)/oyII7t!+A@($ )3nH$EQEQ+_2;ſ-i !OzBfHw:/}VggIK=X" \y +obI@# S6˧QzIɴRqK,Js'qPJUW⪁k+Kĝ,_Cr I@\v] C^>PHgO/Oy%sLUaHD~~>EQlI14^\S&ߋgc/i|&s\ثQ5 zrq⹿]LЊmBmʭm;nֲ߯ ~*ڗ '"zyKpݧ}w5+BXfY}0bDTV!@+BĻ {"DT)@DT k~"DTqL\n'o ڣ~ESk̭ ]#3{+OgK6/)$çOY "5m3iNލj*ȄI#~;qS}c_5RV:ѽG%i1^65%yIqw..j_fn~bVo7jʨnM\,B,Zj0P^Z7tecm< DŽu&$Qti߾4E@MK]j9Z1"]aGO&d݌Ձ*[oAIY}Њ].[zv͇N^\޿hP: %NGLѩI-{B{}o{f2~et3?zBĵ]տd"Nc&|-^z4VH^ ^ܾr=vsx6Q)|xH'hcᅵ\Z8kHY/Z+O/q;'L;?|"%ڳd!heEHg޿[Kn>r~<G"&xAKV᡽sd>$BY?rm9dʨ_+签Dob IBѥo[ uw˲!F.GݎV!$2%~~5L#@صgnn[>vdoJ˵4(JcC+?I8{d:]=^lF#_9S>b4 /ؼ4hMSqɠF>WB^]/"峣<z; D} y~zڑ)@;/ĭӎJ|n2Na E%b;}HFI[73,x.ktv|$gLmwµGy-z~;$/Ã`2<Bq)r-ב_!>oeJM6yh-&NޱK 9eӿ! Ү)c{7S]ڷXP("o`댼dv֣E-P^H{+%vhe(tl  ! @Ԡ4Q:6#=$׳_$vҋ+?NFϯXw8Z"ŒXE9aws=[~ PC! K>;M`ؙI uH֩a j&B&A}| Vn-zd<.6ĭrz]n+͛*).?|b@u~m[5{4%!ճ8Kq{l~lk_ٵo)'ڐJ+h%߫C v:inCH}(xބ}V^0gO/*l o9M!!k=_Xb+hSǻZ^d\.C&}|`ȥ0So+]6ɾrE>׏B[iIrm]au//po Ki2eݻ= ֈ_ش.C#:VE\T d4,[ӽ6Խ0{籈t!5j6~GZy.[Et"@YuI;M7_ޘS/̼^ĭ﴾fՕ|Cg<C5&Ʃג([72^hTRMM 5,>gag 븮 K  S>L22lIe`s݄Otoz%S+esyyZr =cͱkP~dG9 B//OMoln.*s3pGS2 22# A龻ABf9\~v!' > %A`C:7+&*`M(zm,cKk<bW,T}gT=gߎ=ZaGwxaavi_ډWڨ[}3sޙN{nkM_1G^gϨo猜[TxTU":KC@^|٘˫.W=㐰nhY@yY*ܗ c2 : HRpj|kXZZշ|WR_ v-Jf&U@n'̝LgP~q }e;qZ۞/RBF ͙[y#6Ѻ_/6̓wV /~Gg2LgIw*#O ?dǒaWK~ <7X03,[z5i 0aßf 2姖NQC ;ˌS2[+ ~Ynd>]{ݽ} *ް@|N5kc!{W|,5: Nc(~f#}սf-[4oq’A,\s%A->iAx>js505PһV]0 Pջ ʾ`oph3e[ĔWIDAT 2FK9x1~y .?0 =1yq:ڌd%lMl~F4 >@\ٝ~mO:w e/왹E穒MSQZDU+|̻mXUګ2SF%5#몐 aN_վۆE+T33wps7 "*[mͤ񇒱E OGծ$ѕSw߉H1B$lDT.;wj߹gL^r\L$=,5a_L8!tJq*ՈK!P6.d sb=q1pƅjˮ*bCԱ:ҙtZXZv΢VnSL(ﯸ#>~%YE !2 "TH1g/~jd:l@ )YP@{3)1Ya^]tf3>KF9</ss2Yğhs#AP^Vf'2':u,3r3Pth?~xĐLܭ 4!g^ihW]r&v؅_DX7o`ЃTfEA5J uLs+IC#mrx}vu^SZ_wh$ϺCŽ_\1iHЭhܽIvwwzS1 Q!q%{urH8s7{=v-t$l,1h9t=Wbn;٦\͠r~vbW48~@Km=E|Bذkd|He] {m]jŵ͘Dޘ3em `oz7gh?&ͳn>OJ F옔.-l~h aa$dF[,BǏgr/nxi.~"ɤX&tmPD%_şXcq}\6>g/-#1tM?]H}NT:yѣ rʄ'shPA"}d mZ~Zb*ʵGlzFס^WENQ6y?[EH-krO'^zژ/Yi^Zvz4ݯasj1R7 9HQ5 I(&?)!]oĆc)C옐D?>)"D $*b BUKr.ke[:%LY{OߺaB}yW#wzy\͉&Ǎ7b/4dJWRn]oC8K4"_0;/̆p;&JPظ M1XQLěq u5\l[lachbpGU.pna~p+<Φ597T9 }uDQW{Qh7JPp" O~b "JVI!o>Ϝ*AG,^L Dy&^!BD!!C{u8|$:xBc6==C|qu>>_8s/KD<_ڕ3'xA+[C'Bt*Wn>*XO;P]DYͿ@<#vyuDӯEZVEYȇwfL@ǯkW7Wb²Q%g!$`%Ұ,bN97bnqfDŽ J$X-Y1`k|xG|rvlB"G}3(eyX' @  J ೜X|𾭽Z?J]A\%=r7篺QO >ΙX|eK=F^|-A\WD7unULO!A.9,}T:x_=r'BƖۏ'BׯѦ*>=$:hϺqZI>'-^%QOo4ztۯWUb"6#Uv>ze݋4E<|ô$q.W:x:x< mfR)Uv>++QϠ#7n~s=JOM);+=R۴ivladE}w>yΕoG,.Q_~ç{V:=MkW}MeK.ɠ7YJL]k_ D>T>o5<rȰDSEF%&ń<}ɰi۹g1.;ʽ[ ee'> 3raKdБ7q6ѝVnVI2͎,rŇĢߧgz]ܥ />Eۭ_ҧ}k'^aw+DҘ^XD<|sy=WR:x#R%H]$LH|0WVvV"?\zt/u f.a#} Q^Yega*_D3JϘO#ѫ"Ur>h蕕E<#|?>=JM:x_TW/q0f0kh2W+\:x|GWYܼ17w"rkOb99uπ~߭&}iW#q !;8UF;Ңi6t0E<o QXLԅ~ xuD!A{uD!g:x!>q1$B"*lBq#IENDB`glances-1.7.3/docs/_build/html/_images/mem-wide.png000066400000000000000000000236151225327237200221220ustar00rootroot00000000000000PNG  IHDRtL_psBITOtEXtSoftwareShutterc IDATxg@YϤBMA+EņXuE*uE׶X޻b*"%JHGdpvKrw{2.\p… .\p… .\p"O}z&oZK>mM/c]Kkm6wu< 0I u&Ykɉs|M}gL~GN=-rC4a]'^DztrF_WA9gռFT7q[̑J+pK/kCUbATPuF Tӡ]zhSx"#d, B?op1 ݱl~ (F|Zg{D^ 'aE~D[Ňԫg;>7\)VL'<yl` M *_ '9 BI_}gMrVeXXMNrܕ %t d'+y"`!ťKO5w)ܜRlMYwD؆@VUX8ښ2BMwO7^7UjL3&4dKNm yR=5dd%(*,>lqkzcE(rOTD@ǚL>sgZTsrخ9\!} m?s!W oIfAd{C22kΣ5BiE>4@26 QG=/il[D6?pzu׈ӇgwV>{(bCBijQs^,+z}?ƑRcLnY|h9Q%JT`U=sڋ#mͪ( 1a4/P-ЫrEϷyEO Ly<pd9|k~{36K~; /pw/~ܵ ]|`}Tٛ'־!/nǚb77Q :U9j0"*qjE*!;>`–ȣk]ΜuG#PUDWˢGS}W) $_}OGq>~+T ҷ|\pO9|iAjSw[UD wgt Tk_eb}d4zrmC B%ZؖkX_,hj`6~D|w'ǥVO):6r孼: ^9q$r/~MkB+ڃ?F lqF$BɮD2?V2^>bZ-XԳYldAE_ę5s%=mPME{r/ؖc~%h8ͬCBvh{#t'k'Gn>wb>ן+xwYߟ+_ca[<>>托'ɟqWd[@xX fELFN3?H5sQA%kw n< Jvc^PZԹ=~$"ڛ[v %$U Bd"o&*4bF3Z/s**зjTU~o!yge۶[5@oæ$={GP,de|vEFHjcƚ(ZLgMcHJ([9£M݌H./z\hNOڗ'k(ƑoJDq'CmU5\ 8/v,TV5r+ <@NW pY7b2v3W(2g=_Ɖܻn5,6DyݳH tDf!H12uEX!ޖ,Pu..h)W~rkW<51w譪 wWz\9d+v%uĕi `E*{v =0\{Vf`J?ui3cf4>@¡E%y|"ir7FO$8 +L]R Dh68R.냁ؕc7?s[${[iF,~qfϱE-\]Pm§[)Fw͑92,J)Mf-xGaDyǂ;'SV;d]"dT *vI~!+.>/OXg3- FwaRd}~W"7`ǩC!;f[YML#")gqu5TԕJ~ubE0"N~sКI a;JlhcnɣƄfW4HvB$]%4 OB@'PNѰ}tsfN8@faA-s=FYL,y8JFKP1HX{onof#N~S/Yf̔08MW eJ_QF'+6b_?I[aUJA}?L=yqy ?)5=!y'iMNr7uT$j ?mV?ʹ>* $Cb@$@$Z\ĵ CM !~tܽIgr 7nںƽ=}5]*4E92ݷ=}'rRb?IhmGN&55rkE8Hz×%#3333SCM xy-#S3S}U2"eh& 812u`nhbQ(.ץׯe'2xrOX3{݀Ɍ/@͟47ӯ^($}ڇͶN$4HOLtڻoh x)[y﷍"ڵ-x1& K:~[at{Wy~^ܼ_}[;q%֟nhsoywLxSh_qg.vAKΔ7dOE`آK@,<^MX"etPt68r֖uC7"JExڰ"z%(^q DJ^WI맮2?jo Dd7g _1e1krYnǧqF$ F%|Qmq% >P \p… .\p… .\pajzJlީ}L; O8\ 9ذVO烨 ^pJ {)BRҡDlaY~/ᷘ" i:o^?:puXw{2b.)pN/^vD#/LRO>bC - O.%Jt@ДZ?3twQ2ohɩaMSnzr1nnEz2P~zK3tbq˔k$a>,=SٙZO\2 )uX!IJjL ZXhow$w~dА?{\:#m=~I~}:k24G:Yv$p)ʣCWQ *+(z_=VJ.u .>rҔ ۉA C+. e3/ҡD H.3+Sj>)⒫s2[@M\*S&B?4Y?8˙-[쯘G(0NLqpXBJT&O6sްǦMWWDqr2LF T!#.ybeo8B߂BPʱӊ$T8XYԼd1 ބ|h(FB S¥0D$ .z é>A޵Oh9z8%q!f)Cث]r˿j۲!IEk^N :Zt(j}g/`ߩKs?:ܳ<=]"|0=:R IBr2տ>aHkKJf4B 5"F[F^T[C0PnԷP!Ku\M5(0-bS0+ڊ!?3HqszMbIӳpX$w{Fa 5Ք?bj@JykRP"nyQaJk(#Ғ.ӽh}'LwSeM.o;njsк63nE:O֤dž$I7]tǗжIZz ybbp@>l+?w-^r `e>9l6t%g.\p… .\p… tݡ_QoF::Vu[_ |…MnɅ=z^4/D푿CG(c )v\=y.>?;94..Q,,Gzh {+jcǦ1( $ #lM(PWIṄQ#pȪ*^{a:Օi0lh U-> Mub!;/7=hJņ +,$ վd2|fdoW歋g/~hA1>FE<_jk NgVK9Uڃ'P/ ZڤE24nXyD@_1/J$_$iaekQWA5p9t J+D d%\=׬de?qI/rSnMwSp];-<Y>m=/yWsPQ>^Vݹ\ Ғc{'(5pʺ.eBϭ:e1*w{ 0`pw;/GZ@T4l*N REGm'+tkL|UǩhM˓2$|y`;"c}/˥( T**r#|LWG}?}_&qMýzh˓x켧phq+,}Z;b!ysާ,Q3qnBHDw3Jua dHn刍G.ZZs KNm yR=5d Jtp(L$;2]Dr1Il!1Ƌf, P ^uߺ^P^8yYJ}䵸?QwD؆@VUX8ښI.l(|H+„ArC2Az;KWm֣wRPtD} J(Y0n(jߩ82}ā=U"v ? @P9yqÛ=|l'aHP]ɆC . 1ډlTjEuecD-/g3'BteǷ~[ +j!,XYQr!CbPrV"]_AH4Rb_W,"ʼ\VIyA+ M@ptG9A|%JtNXƪRc]p2poE\)DZ.9턬+#E$ޞm l_Z_Nb!a9CL!CP3uýc UcƚK HxX f̒"!0o4dA>̫WFRr ɧ>@εa-I) fOTwOUk+KV])B᩹@Zu DXzI[V +T] '}2 zxpT!LXYQrC^T{v =0\{Vf`Tv3W^DrY^ɒv1LVTJ!%mIIw!ffY?M†KSY^u_4F{G%[o[-Em rYJhӈ?\arL]\*d]LQu5TԕJ~MUQm§[)Fw͑9߅Ơ ]sOFFvcfzъTJA[PXģNsr귣RI6/ns}WMuWb^Ԇ>*˃F7ִH:XYt!aG1 ا;ZabY6 CcAr1,{L +fo07YRz *#Xd6Cbb1X#t_Mj]=Yo.fS;@C r3= d w n`aXmJF# ukf9!mhy@Zٰ53#{z2#"4g`Xe_w|gI'`cm庺ը"b~[JB{P n:#ySg-Q"x_ML "!+pdYrTϸ U׏]zY!N:azLJ֝8V۟5Kt\˿v懓9)c<]L|e+ߙ L60rWP!Ń*#?nMkȣP 5)lH3_HC}CE{gNPjfzܳ !-a;On ˒$y%l4W!& -% m8`"?>;sנm!ѻV l-ve}ts2 nƀ>߇DjѮ}ܴ5umߙu#ՠ vbGe!Qҫ5Dlevٿۊu]WҘ~vCE\/vd,E"k#]ZqcֵY4wT6j ];ASmF{P|FhT܍/}w#b-At4+ 5䠥Cee$YXilcYVP,2J9 nc}pDyޜ 0 9*4ELdAפ28.س+pLzᏗ(6&[ڜp+ǯt| z#T5kGVO.~c-96KLnOuןS1ޕ+740/%O3uW*?|T8oyLWJޣL~`tЖ ڤSeY z;ۘZMvB2!`"m4E  b@(͕K*9 /^$7{t-_T3;% AК-hM*@.<6xkOwy|N曔VwN4RV504R !TUö9MDN@G4]PG l× 1O=ե?gϘ{M>N-ky˱.QCr 3n;| ?&c9J:-F/s 1"g/?͵ ˮmt+Ybv/]5/K/*V7u˴F'׏vѳQTlЙF:暵#g.^)b8}&Ec÷nw{K]H C ڜ6F%s M!/ F3}sXmNdrEtW_esz_6D|e?ji{B#S?\ivX y9cy\Ɨ`șs&yQ W##o`}ٗ U-kA~uֽ=҅DҐ}k%5-c%"Dw ҃QPѫ'>>n`eHoG^PU+iBw+-gm]%.=Q;p G=`z y呖G,hŤ'{̚?i$;~ۏߏ(MQQZr7.%."vKS%4-9QS9]Y;c,p:YM~:K̂>4]&)5y*vB6{N_!2=0H̉%6@j/[c-u gOȼݷen!L9tO@c~kPS?E kO\n'_Q̡`}Rr_.CȍctBNttszC5u:~ACL-u(`y}:Tq%l17CPxd\?B++A :p9"ΔNaT_[,o_u^? ܘ-1.3zC,kV6׭'DdܹFJw%ѷ’ذ؞vپ Γ.gxQAaľkU } ԅ4D_6>*__bՁgmf1g,㷑kB}'CZ"n,fx|B?>iFy.Eĩh& 9ťRҐĄ'oX7OΟ|8=ԥK$B vo4WT  ڦa(*oK*Jn]K*ib@R6T'!H%oojjʲ*>AIi-`AyJvzz肐d(H$YP^)Gtld $Za49Ӛt7+-T3W!B2F/W*x()w$Fav371 q#wҚ{1W}ct\Q[rtfV{ t1d0 &T}V#.]ݴ`7kɓmk=`0aufV9-Ѵ"Rsleϯ=i 5f[|6bg @# H*.IƀЇn~N=wul<{6}nCE)Q7 "1 jRuh7Zar17Dﷳ-GlijVYȏKr"w}^'c5)lI8dRҰ%+'~Z/l bYHm;}y9ai*F=Ӑ6qPy5c .r;rMDebM;ÿ'ճj%ڊmQIG7'J`4)U7.T7'j;cD|ICMhhQD|HK jýHH/I l]*$ $/9 F(ҙ4"Juf1yB@fb0 w70\VGQUhŢ]Tk2_wͫIB4%8Wy}0uDo3*e> 9A>8EV/f>nftHjX^dKǀ~Ɂo8ppF3 B[>c: Zn^x0XP ץ't  f<|}JPP=+-Eg h/tر߯-QgʾS4.]G/m~L$]\Hʄ\Z ViD+#nt?΀եH H|Cw8ztFik-i>veQƌ ;oV+H bh -H)w!U%'b.q%&Wyp]DZe"b{k =? n_= YJqR;{^E9IՀ;OAq7Ug=qѺҲS 2dK~qHa34;. dcU`Sw-),$CƀL$R,'™`i!3v/ӾOam@J9Qvą*4^BV߿t:Q_T~c&9;$`ߝwMV<7IENDB`glances-1.7.3/docs/_build/html/_images/monitored.png000066400000000000000000000276361225327237200224250ustar00rootroot00000000000000PNG  IHDRjr}sBITOtEXtSoftwareShutterc IDATxg@ڀߙ]`,*6jXr-1$I1zi檉Ĩ1`]4T/m-,wP]`q =/y; @ @ @ @ @ @ @ @ O>~1ݒy2ք @|3#qY" @bX=&ur)1ٛ 0>*.{;a 5uJem] lEj3t7;`!;:?6ݶOl"l9Lq1 \]Lo,}mS@wKɟԪ[XׁcFM2oæ)릯ҁy3m(-{)ɀUKu&j7?^OM()V{'u?9ݞ?9L% Om%sw\\2~Qk7M 3= /]s4zl~myN 5> i1/[?~GcvfkGӨ`nφ$4e~F\`ΐ$? ʌ C/˓R>t AZqaicDϱ貔b`;Eio4J-2j| pB_Xl -fqpSb@[n|;%Ifs+mHӟ~#։R_Usa,gSA~H?C+6܈tP{k)#'ɓEnL`Y%_-r̭._7efo0gٲpQ!g;*U|^H 1htjR)둱XNχN&ҳ~wޚZM@PR%y;9RxV QDVkjaz >_6(zp!Ϸ: hipx8D鉹]$MJL㳿/Un/ mߎ1g}"BkTS/橫`D˺aGf0SUuBSiZwnu7-󘙖^"u&` Ƃ/ d;'f.|7e[+#or:;, uv@iԘaP%D+wNOfts(rFOUn)L3fJRssW ӵxsk_kUf`ukE%UqoOqs0wx|p&Fu3 b܂e啄0: &OIbu4(AڕRlۧuޓ3|/!hvWd*ivn9J|O73Gm 1xzW;Γ X`_T|?gp=nQn nQ&,]g˅ -'7b'[Qx */_wpeC%^`x~HnȒ;͵oܿ:ϵ4tʆxeϋ$8qH/ m_' &.`xz^eA).-(WOad繫HNyAnxT[Cn~aݶ0&h5!ϸauArR I0ü^C4'|ZzΏcs}>tǽC\aA ܚ3{'N̄QSS 1^`߱/"9mٚVuI[Uh^=*x_w2HkݺO]8?z{ns|:IݙRz7)a)D,F7_%s^Ш#; x"Rhsbu'»xa@k.6$P9R}yVj leZpM5 (AQ,MN麉n;$jPդUiH8ceQ[2/!f(mʝy&A]24`A_\A4Kpc6N ozs߽ii2*PՈQ[t%(o5p`5Ͷםo~i\ D;ݲ6}Kmug oɬƣ.@(6{==PKu(OpsE%Kw@ꬪ:\Rhlk+.WݢιE4$ 5O4 [w(hC?Ŕz4T3r0Mkh43KRm1ŀI`[χ\r)LIpM/R_YR\(14^-6`8 gYQog]&s1ڠUqcXL0va?S.\Z%DNvצ7~Fk1j,VU5#zSM>j`ܐ1 ںbUMΓf|w[L?њ/Y-)_G}#6SAq8 Lv]*rS R6v0+]2X-lU2枎]ěW^ Ko6&S9|`0=&Tk[W< =l dV{cuft*۔qtSCc,-u~>th]+#/:8.48"sNjNd)1/NFG߈7|Ż^`SkĴ ryic|ROX=MXO EHf5$O.ʪFs0D~!H- ~Ň3tI ?W!zpħU6֝cFlfy3\`,wv:I`BI鲀 `O;0pA8VoХgg J |nlֽV@UjO|OyVߝIS^ȫɹԲ~#]Yܩl~I.:`h8m5o5I]kUuVY|mv跒2ىӊYkwg1PXRZlh:cGq\uo6 #ٸyW2M9=B{s_* ϟw1cr{ 秺nU\| < Z9aҷɵ8x]^8 a gI/Z@ @ @ @ wB6_lVGζ/10ce(KSε?ei6R_:S$s~Ib`"FZz(<[xMK\w ~E>n4$m֞yLA۷Ӳ9gRر]mW7g|U]nUјTM<>F*mIevg G KOR(w#֖':df.(sHrBSĀձQRfՓjgxN~2+A_{:B[]yQ]㊧ۘp֗-6]iQAɩ=5`WO->985'-݇>y+Ugn?: d#IcKxof~T^,\Sۨ#y2w6|NcV g@^; '-Zk 5[po=Y'־3ql  H~ӉwDz-%gdMH2hqе3K]!qK׬8 ]MZ&<8J+J PӏJ]ְ/ "o9+j(4ãEaXЮM zsHn͡ϟ 19`Pr?s,fpՇCoh4/i;}=!Ml-d3k6寖k'ԾOr^?i]G (pqGܽȮ+s Gy%Z9[}2Go-غ3/8ECpuӻͶdo^ 740s-nݙ((lERL4Sa`0S&PqYx}%JQ6EX)Xr;鲶 `<e> J? ȾXW=ݾo "7ySgSloIsw_mW ?䷴_PS#ʡcVG;nMh$6|H'۷x>XwfqY th4@HVI3EoPҁ9t6mG`Ŭ/o`n4#~Qҳ^YWBQ16'Ӿ@w-W,bz5rWkk]<#W\-Kj:[13 MW\I*SUJVٙ( Lٹ7W@_*uyoBCD65UV? ;J j{J(nSLkI! Ό j?9_~ޣ&,TLiU&~y^޿ը-87T,V_?&oh}}'@2l2kc'ᅰZC> +KM'}w>kwm߳C+0 gqYx]b+ʔ8s錤w޾i>0,:0aA}Ew}!+8Sjs*nlpO.CG:۩g:wvH}˗+ ږo[,iNؘm3ex 0v ɻJs8ȫ9{g\7 (<r)W .-<{$TRYD`rpt?:eߗ6PYMfSodhߏ ]'|:a}R.xq}b2enSeᎴƛ(vxA˭;aOO;r%q}@}@ @ ם1ݒy2ք @ho[cX'! Ea lEj3t7;`wY tǁ$9<ӪȾɳ^%jn6?}-5){sR/UòL,oee\ũ&n>v=>:O0|gHeF!xI}ꀥӗORA^Otdeu .c`@Ӟ ^7{d^ͩtP>ewG󏮛 zfwVRd;X][xrH'h>;#jqdgT}dmPC~ouO}'-L?Jj(Pp̔O컾Lk D>b ڡ.AXk4][]{`oK}vuT4/%=m@.5e7>m!Y˾7Kl;"`qDž6 Ĥ杏_~%$j<#A}La)̬Qr\{I7譲[.yI bǿg>rNwjɿF Yț * PvwCa34Lbgm} 20T:IBzaJ!kZ)瞯k߿֪kW9BnfAP[F)iVt\=xށl *-%D˝#;dyR ,Kxg pv<&u}oXbt4()#=^$g,1@) ?SxjՒu2,ou&UE.QP٦3Mꈤ4Y w]~Jվea>`} 1x @{Z_UopI?Pԯ4 Qhw>M55` ߽newq><]^[V դ-푝Q[ "~|+r`o?)qZ=M,tͫh¸7Q'3uwKWd#̹Ӌ5gI&#}>IU?V3'` $`-;B#[3ҞUynP(:ʾO4Kpc6N O}:>.9)?c(i[lcx\:-풝r} ;D6ƧogZխ;8UP.IDATS \Z I 2[qx#K >mP8cX6`zD57J qОzc,>oȣ( cYXLOXr`q`w: yʸg$0fʟ *8 vŤuw26OQ Ϭwޛ)b̶~|_om]neصg:ɔ~;V`=087ۏ+`zNHgUWRP Mme(ﻢA}ţO5>eo١JqޑE쓪UGNy%t)Tܬ!hp6>iB^lvM4s'>yT~go>S}tAUٙԞؿ;J:LWNZȲuֱ6E G )qi]z>e?>{ڒu1ݝMPgwҲo+ڳz>*ʷ!>! ~] gdG @ @ @ 6=yh),{ɢ%ӮwBg7:4g:cbAʚ|}'Av]e_KvA^|ܬ?]l.>+_J1Z}ow-Н¾V8(<ȹ-tdg?=/*yRm]7Ǒ}e}U}`&q緢7e~@),p80fzHQcbVeNao !D|0Wc-w|s6fn;>=w΄D IT-rr*K9Y ?gZ'&~.(sIBSĀձQRFU E4Խ0@VpXܮ96v|vnriJYpkB?*N[𘤮u$c`7um-Ym.M 뻬a# kDIBDi-> _uv|' `Ul4Pz% 88wd]qҾqG}'C'v7nO1dϬ<#4ZCT,ҕe1' kXO۲wQQJwo >,O}Me9dokd߿;Ⱦup<~x_LCϯ+r?uƜ1EZۂ^lfa&n*y(|Sz>)'7p76Tm:w=}Ⱦ}Ut}D;ݲ6}K1&Ռ7DvI*SU׎ix$E*'2ю8YtJpox0s:9;Rhlk+.Wݢιܫmn =<}߹~:8hgV5˛b`ǹ U8Yx H~hqz>%&tR~`J;^YR\(14^-¾/ ZԕcX`ӿ}}~w"'M k??#I5[5\jQ۷6>qC,^2j-W5s`,nS|:Uu P[[ȎO5S^"pXӕ7K,E7GTȾvѾ:o$Ʌ/v)P!m-/UYh0\{K ]VޞL@ poo ։;HZjTJ#UAűGhЛ\N HR.ںDAy@ @ @ +XMKar%[pݟ]0as m5_[}!cxB}L-7:->^;7طӲ9gRر]mW7g|U]nUh <#T9Oٞ5-{"7C6dkϼ_|&`׾;=|LD?F К R^'̛,B d<Z;?loRZM\^u ?̨WT1CǺIF̽՗.4/A"|z`د}ü1pëQG[;2 #}nkg;|҃Jͱ#5޷>&Hde@2`0XʛX<>K=zm)qI7v\5\ʪFc$7SSh;E|Zjo2eD==7ů&eޤ2"vѡǽǛ |C-'K}^P;?֌:zɧmM%HˇY2\F+#ŦV~'\W6Ii2+:3@}ǚ7=SCc,-ub: |I̪luJ~SDžG$IQԉ,%W (r}϶i^#NFN~8hOS|3Ud⯮7 e4!>vv.o3nc)K"EA4F˓ƖĈbݨhbѨQٰDzH4-b! "* R^~*Oe {~͜9sΙ !0QHqb?(Fi3,R-?3ΙD2GOsܐgHPFWAebX|`e37(n3ȬKdZ}&@Z4hL%0M4̸DWg@_]a}8 hEs!.s@I<5iGED 1{Wۓ,a &pֲ6آҊTji?Vl+>XHa2J81Ī}]TY39*uO}nJy*ZQqi״VtٟFFaV$10MӴM.>r!ǜ5bԛ{ħs ^Am4nj ĵ Qg-T29&oSBy?ƎV9}IY3<>YNoSj{NE?RƒB!!Em0wW}&cu 5L^&W3l"!,zm0ң(1ϼaXɲ@33cM Ò.\(ǧ( g;!oasM 'ӟT@l,&`X,c79yUX~]Ntצ)ELܴ;?6*e7`U0-{"EGԚ2Â⯃窩vt𣎦J,)'9PזeYծ&aYeK8vL0 Q*46_+)/̾rL? ~iQQėJ;zW7J|AvZEU”f* UqV)eڂP?|WNg54CSٷ3uނO*VMrl, ꜛe in(3z1QC\99V?~ŭߚh*SeYR5_w<96CI(9F'ڋW0Ua#<-i;t rp<0#ū,qonIYؼ.F" m.vp]^<=bo. qaN9j?\/gy഑֮Rw#c%rv={6GU(K@n+w+R[:YĿs.y&Mh~V)"iӪ*+J҅~9z$/y_+!` =[7i:i $pʧm^oh_P-ǓNC޲uwat{Q0N8r ^.]F N&m ޾u+|%*T>hzO/&:KԙۇbI>ts'I=ksv\Q{Y#/ݮ4w/iDѾ:4>6,uCg 3=56aem>M >#ڡ0Jsչ'ΰ!-ҹڭ  jys۰~qKuGT~z=#"37v0ǭY-!ΙukNtiL9}uN(PǝeC>]iR͗K^}axB"i:#U%F!f9) ,\@0=&H}\շ q),7eYQ5,a_`/FiB1_b?T[ A'~"l qh(@؈*kG4j^yC1pq5϶\qk#\~j%'ޢsr1LTSbL2􋛉JB"c|GX: 4v[3MW[#nǭ qݖy1ƨwT<; /z^͚sh9r7^0ݕ蹳 p"ª Y^,H _^ڭ ڬ$!pNoӑ.ܼ7kkNy+fjDSz)/i 6s` #޻?<*G|'Q}ч)a+Wך( s'@mEZw7kNT_;\!u ZjFe n%tjԟeR@XB7nj^wXu,t[1XAkp'KiBkksZ?of5m`o G8_@5uhېx/}2xP:?|?)&3fLd5wc2!ywˢ=q F  j:3r$z_1V<-R9m>4%\wt\-$̫Z{a,dh׾\ ##fU0s4ׇWK0 D;|oN5wx+[OHw(?64ðL-1%GNd ,(fDnyfwJeԦ/hPDVd媸u"Dq]D!A HLuB,ttaUNRVΏ<#,6Xx|yTm34"WG / Uz+h@7MicCa%r·TO>E><7c& !e9k1&{\ %}L/{\gєs%R![DkE*uifNBJߠv=NWrA )O3=&p'jƓJJJTb"7sVΓ&-M*cMviX8+ϕSe]c(/VUaY pΨ+^tZ;234%yjnB`*Q>j! i;VpALJr y1Pinͧb?:ˮAfIP8OMEz9 usCwIv @=x1G vXWt*VqzmʌCKW+p">~۾&͖\S[v ɏ[[/fzOhha2RgO JqFJWerp\Q.*ؾrt(ٔmeArg}SQ(KD#?vemcUٙ޴[3/Z't cwowmsڨqpb"VRySTEST'Vc|[x¨q.]l #賽)FK`BWb@[z6M ]Q/T=s( a 4zjHd\BX<}*c(Ǔc]^ݷNX ^ֹVpjP< /kai8FiR8FiG-_tmYx?珌+X" g Ͼ-P^7Ok*ޗ?W=?-6yl6<=ޗ?RdxXi( >Iꓶ`/ sO6M}eOjg}ɓ iEQDC1z6`/L1_<[6ސTC6ēm-/O&|Wf}-0eE99ái6Nnnn5Jx-68tr.l-T--ll fg~Ts'92bH5ϯ^>̓EF?k1-\ڻ]qYhi棝4 k#{kXy6[]u|3oQ2gJZ~b>v tJ1ĉ.m3q2]u>]?Gr>f9uuxӉRRƟ)y~5y"AV}񓵋Z~5ƭ~C#-6F'&^+X1> 8oo+ÊZEs,%<փWgz m3b8CT]~`-׽D4@|-XK*_'u6"N8AbX2QCD 58x@lIRۛK̐4|g4Eԇ%;01M {;yx!ody;g="Zel_6z8:x̦&\.@ .kGgm>nj/.`oa=rיcs8*8T7Zᯥ]o_sl8t }w=lhޔ.xxu +Ф뷒W%&u| J[ ^='{N^djo(pEWޞomĪ_7~MOR~뚇LVkQ5>?%J(QD%J(QD%J(QDNBPol~q1Xw@>̿>mf {,=2DO{;Nv"r'Hֈ5PC4~fuMPIss^F94N9މŘ(i:ȁOCDҤē;1oG-a[#f}ZND%ѕ)-0bj̠ rN:4c; Л ?8ɫY1&٭AO ppB%u}@ /ghg>.MD1HрG/Ȑu~aI2@fÖң"`t?g +['qT 8- ]z60Xiw܊/u FsY:ل`dNpoLG80 X؍_PÄ~:ͳDTnsf}U{t hfϻrvKeFq;-xʒտWTˤWmDT\cX ۼwziv.bk?OWϒɖdx,Z$|r*sqKqnsD^̯\ AO Q|xL]w@3"K>`ᅳYÍB2pA7<#4s^+c<}'&>+C5i Ĉv-)'5vUr.C>#i.4FΓF3'_!&dM%P.'rd(SL$AHpk%/] ݻn{ȱ /`U&RК |";oX\}5 ްj`rcNt\,ԃcv&?]inVJw\+Ռ-:wHIf `+` ^EBӺW[nIT(t<`1Rn= 9|&^1,ljR4k2J q肄9;hb 9E9߃y[륷 3c SчtU_ A4=;$<ͅr 7nP,0|rFy@mEY(h[{!%M9Ģ8/q͠۵C '7+6ԫo[=tHaʋ^ɤ&gAǧ~(Bqx|9 +I{EZH]N2Y_68Ǫ''9k|7i[AٽY W6&Ώ0PbZU,, q-lcV O<=9`_];U_˲2%?(QD%J(QD%J(QD:SygD nLj\/W51rU;$/|rYE9qEg_-TO_KJ7 k߽GXyIaYY)([xԚ#Nahe=nխbpsw@bn/#H|}Q${g"gQtyE~.v^rA_ 8fwе_W\ aCBb4x qTT=[j;'NQ\>0O8aU$1!S`@HY3ua1зGngcU?j±4H/M%I<)^}+H+7'!wy0,H:w#}('H: <]Lb"=Pd&!%8eD@Ҥl=7ffԮ~ E-߮?c@a6#hzZZͫO_Qo߼r<vʤ;s^MPO?H}@%r@rXNr)tV5{z떾3d&_Ls/zU@H~{}zIX[== \I:dW &Ű=7Y| ; ;\w/cݡK~dqďIx6XVZF[_m'o^)Qߵ@0= '|7OWtڒ7.g\x}Mr"%EH>ϗr ٧FӜϞ]s}_4w\n+eG_Ⱦl-r '|j7OW|V[IGgR}OE<^ԥn?>PS٣۷(5D噿gY.G}7?d3S DRk`khm~Ν4-JT͇m `^}vL9,J(QD%J(Q͓PIuy3Ҥ{Gw*,GJY{y +-{'ۧ.\u-<뭢Nz[4|H kZ Qٵפ0N-,zS4@=\˔ɶ񠟫 4[}Үs۽Mi$<5O@.|Q=\]=x9PuAO.uwbJWyydTčG?`02e0@~$5G5m`ddninM w X1—.\]||ËaEm U`2Jau bn-! 'PEPG7v@Sn]_$јNƣn9'?׽D11Q/.G{dR˨2_iaNZz>?=jsA+6\,mQ ?@>x.|r%䃲;_P\] :#[N%Cz|Ccq# \e`iƳRӮV:²ݼt) H4ODɴ8NcгgNހv9Rmס]y Ξy[m_]O_x"sa=R鵨w[e{pċbvCdPL@ѳMF[tN|[|;W94}~]O/T`&Pt 6(%Hy, EMX&].z|K lU"?.JFeFJ}U[14G @?c*m-C>xqZ,]yG]~ge_^QxMf$oT4nC,`Xw9y'ÕN5{^5J SQ!Fƣn9'? WEDeaIӻYDَZ⯭]D}T ײ&1f?~y*=~E=C.R^$uZ2$j:sRs st5(5amS Έ趟u s;EK&/=ƞ҆G? 8 %d^#=)Qgh,8XXEZ奉$F4 J!42K[; UδC/Uf`칷h-Zp@XXXѨ>\RZ ۱;3"YD|5 (Cɲ,鲪fKd,͖08,qɩN<$倦OH?m-hD]ό BY-~]F\LG1~m?XR!v~UD[uzbBG枣$+E xLw.oife茥Y.WC6oaxwhF>#zwlҾKz?ЌzΘ7qP;Ggĩ$q-lGoO;B.)k \a2 htk+x*]/x]e<Msfm2zj7VwJmn q~Fz2r儴8+3OՇO5uƊwf JvA~sCgI =5Tב[/]w@ykMOts&Nᡲ a/J\Z\;|\#6 On}\zk9왲qyA?=*lYmuLXӇ ΣF9'?4)bG0w{'dy1ž-זO5O%J(QD%J(QD%J(QDLO}IENDB`glances-1.7.3/docs/_build/html/_images/processlist-wide.png000066400000000000000000002636571225327237200237320ustar00rootroot00000000000000PNG  IHDR vCsBITOtEXtSoftwareShutterc IDATxw@K {Sꨫ(*jQU[jݳNpnqWDe#@!;ܹ@BP۾_w{@ @ @ @ @ ]@5&~ ccccccmACl,~1[GQQ !OggC\v#j'^u՚I{A#)맮IJ 8?OwWa%ݣI.Lz`o~/JX=}KXR6LČ{=_oz.rêG5("SmT4{{!I_["w^:˃ye AS,SϋΑ^w2nq0k8]_sdjq,5)*c$v Ga f@|U 8SC0AyFl{Tll=&ukmql) 7:M}60Y=PGm}̰2`bc߻.R}gg|ç~SSORiG9M?}chc֣lFkrfǽsbެq%3 V]S7<;ZwL_3WF1ۄ,Ҷ򰰥GrBL0@^p2,0p’+BܪBM~̻oEMSF Sv#3Ø/-g:C?>~~kѬ8".5qhGsd@Үq? lGOD)杆&]_zʭJ3W]3BT'/VJ\ͨ53A<.+d#,Tk]e'oXm[Zh275%rJxŬw_cIՕ}hwv]\u3xN]ldIz)&f/>2 tYrVaڬv]u+ \[hc:],1'1r~g"7.[{KMLVyG^q:8~$8Y{m}dbKO|1}גjNj̥WP$KZS9tkokG @ ,go@?=̳Μ?mJ}${/ Ql0{ {rB()ogByӣȒPHA~Ƞޞ7VSRuc?h$̨.QK`|kGǭZgc)tAavk#͕JS߇m|3miJ=Ϟ9i9-<J-]^%D}G20 c^eLjiVL !K8G\;7/996;cIp&ky{[b sǾ9mٝJ7C`/{Lgg&uDɍ < .yxz%'W|R4۟S+L#U6vM4ju=fmnw*PuD?W~‡;Sb3l¼u[m_Ը(PcwU~bBWEh1o1lFɨRU>Q֨Y\}b %?xEG,NW $3{O0)}7%|#PL?gvomx-Mu/$%A@ԪRH_.i|k(/IN$|4;S]|w7$9^S\-+yuqAܗ/J/7!KS?!gʪz=ړx&>Nt!y>Q%?a\Eդ ɒ4JOh=Y( Q]I8҉B?Dn܄C6l1a 77VWtgߵ^zL|ro :heGB3("KȔ9vqf}/4hu󱖱2.Rʅqv qg;vkMc{VS'DJpyN6""r ? M45U ܤDKW]$\:A2Nx%ڄ禛}]%ְ18 hMzWjȨ+Wz-,_5GVΪۘ--]ϴU&աl} r?MoŎ5ߝ7NxM E4jM;ZT%fp>ϳDQժ׭<٭~|rZ]*k#4Pgw~޹Rziz3G liӊ3͙ yBT)xʮ-l(ּwnEPǓqN>f Y~qwc9lfG6"/u0.Ϭo!y,z~Sik_IshBZ}9bFGy Lv:|F/^v(1CrnbehǕ{O`Fz.@? 4u9)Ig@Qx)'p^ qAq[ 9FĄ?W  Ii~M &u5Q6ıYaMAЙY˨T򛎖%7j#PV>ȝ?RoYWs٬l13"hX'Q9|'=/sh9g۶`wܳ[E\B6 BwukLX^ @)WA~)Rsv,q vG+ o[O 4S'H JdOP54+3Aj ~BP]LqqT9Ƀ cӕ#ǹ ~}QCh4C#/{e=/ɈEeCErSjnA{tTs7bvDHJ @?j7Y3i=&fǏX~ʅ$roOߝ5LU^Kυώ)(Nn ol_ U&[:И"yx򁚡Aɻe1@R?,}xq։X"'⥏obu-a~|WׄQ_Ut+*]۴TZY,#;R?U}ܤ o_5YI~,41y֕܋:7](R}dY{@1K#@CBBJEUAy΅r]!Uw;UDyI,|j@ @h}ST@bccy@ @|м@|Is3J?/@ @ @  n֘~ZoRh :66666v4Pn5p}f[?E#Y}8?OwWn}c{2^f|Ԯm N}Bg/zx>2+[sf'rfRiG{CFrSTs݁GJ6Cov͛ǖaqb+L&jo ,( +:SMNM{7PK][^nBx+9?h|Vui'4kߠYaW/9B+D oIzQJG)h3(eÄ@̸cmREdA 0)pv_=IWCR:O ý[{r$P-;1x>HJG:TURO4{HL~%YH3ʃGAxi)<M-WY8]_sdjq,X[Z4÷(z휇1{;f{ +.]%6u66"_ aʌb 1kQf/%eﰹØ)G8ps˯(4W$DA"f*_i?zs.t~>Y>)fm1=RIQm,(;ܯo!KvK_HC?9Xzi,pﳩ_gKJɪ rܾ] IDATrTQ,6a:9?Z?n)wS})WS{Ʌqv Q[}i͇޽4U ԧIyJRe˞avlS +|ҘdZȯ|)MmW/w'?o:'M?_ٕ")BXY>Q?Y\C8}ULID.IJ@'=~ \q>bެq%3 j7M~̻oEFMGQ}y/V=uaTvC:0M1 r譱;hlGOP zFxudM@V8%Bts9q"jS0bĞ*B|EO9rj#NU>3iŸ·/WhHAJN|I`^=Rn殞ywp[1q|_,IK_s 3*I'Od{! ʥb9Aȥ S]f~N*! 0rߜ6 ^l|Br)R,4TuHKU1˧463Ī+Cw r~QtjfL __7bV3pdvbjI)]7]-Ur) o[O 4c洞^*|7K^w=k6s3,/[KL]JZ_F ӌ^ga2MW&;K/K6ƸX e!mB$l]6@ cv^w_teDSWWѫ|[Ο;lۂQqnůVEuq~u1e}/l~n=ܗp{/$ceتFOr5+J#!նw@ Iap DYQ kѣc%u?wbtQY>iX> x+!VEށEWK?Gv̛KܥJ?A㟩VVO6+%U<_t(|'"3>_at'E\9SBX]Ahn\+ A $}w{()ʗ/* 2^R; (UUiWR(!\*0Jk=oAn/y2V&(mxR IR&-T#Lcq^T{wiqڹ*Cz'0֐TE}u?+ۤWp/*40މ37W:RwѳGwӿwdLoI#TJ_^;[-X38f/8CfPRm{L7"eڹ"*6 /ETL `d*/s,7z|3k7u-U73K"=noJ.muDA&Q^L_'m'u/2ðl q.\ZQ۔H1ы|_9jsaVIUrȎW~/! ;!`%mBmCs >> n;yUؤIV4e7$*auf԰Yw04}q͙ߛ7~O7gÓU+ Q?Rg3o"-\}=nZs,[:|EO4LNLC$P hS~uaG,+BF.g%_+fBIjiVL !K8G\T@^|!sԪ[)C5xgsgFA]?5ԛ?{J큋@ ? 3jEW# ߀{,3GqσT@|Q0f};:1[ eVgB jWtBxfܸysr:޴qt3NLsEYu՚I{A jy=mAR<>jч&l1w]h?] g?Vs]C<_U JssbY)\:(f'iiؽw9^2C =z(a-'z.rêG5@ 5bY=C`/{Lgg&uhnK% |Bi?_T+'`>e)}ED=xvT!@1[y-zoKeA{?t}qݓmƍ|/2ZZ4÷(z휇p6La#hey9Rܲwa̿t8k9M.UN'߶ V斒J_Jk Ku)~k8}v' DRMQ̸z/v5m ( =R^WK &8Ò!IP7EN (n$EB+$0_qy,F4a[ ѤbԺ[K^_ ;92flN#ͿZ_ x̠ݘඅPaF ľTsnl-=x77_IHsp\#z۟ʕ>%ɉOfg\Kg_Q\[^ppKVeJ]jI5<4 @Q9v6t= em8uny|iPw0 |j |cQ-6TnjyHAQ̛g\{ifRUګnlU4xbt\wfqL)Ui].R0Lأ&O۽rv vm`Ad,ӗj9ƤC{ʒ>mqp6I:VX~k)6$[}D15ܥ|R SS&TV5){[W7l-pyQVܾNuso[r#xTJۙKJsy{=@~GBRV B!㖭뾔GHtе mo LrSx1Lλmujb<_-|m)vʼ}% L5<%R ]X1L rKeI\#5y_4m>L3^VVFFn^ެA}|SxzŔx5_L`6!K-8<,l\%< 0vyɰ KTȞo \-0w I]c€OBҸu[;FJ1w4&U@44К]{oiMPK&; {v7Ct6k`ʵ=뾶Hqm&7.?`GiHR"/`LAH4h7d3@)|(1 f+i[c;'@tsWqd2HbWoN"(&GYgng҆|=oa S0E[R $\wwFޯ>Dm5p)NP{,1*ίK!,]zS_AKr5I ρ] ;|%n? t=pQ^HL{.BZz\̙8TI~JOMMB12iG|K#FjoM?gmʑp׭wy_Ü.Q4"ӯ꜇>?kN$ do:%j#gl;|΂]}{6ȹI!nWDݤcHxšj(&-A}|hgҴ?oy0 kM<50/Ma:d{rfWsf=h) eœTCo REMLZL dD+kgXzUfmu^vbEMnbhkO5E9vFxRuݠJN-S~(A;k9;n ;k4ґ<4]m|OjeǏjh=JJy T!LmʪԘSNb֡˄M- o[O 崦01Kfwؾ,66(f}WB:vߪ],=ibyp[V X,S.7=F:`ٙjSӠ}aYnd@*Cl_Q%PT gM&OݠT]_] ylp=ex ,p_=lqY}XE=ABL3zu6] ,@YOo:m Fy=Uڵ\LoZBvDwӊ;Zm~>x#z6ʻ_˗t"nʹ7 X:u1ْzQE\#_ImTJ%U< `z2 Oտ EQ #}K.M&hL}{ύJ%ǤaM-!QF* Akޚ zL {ε-ܜw{Yw僒t_YVéfNWi )(!<(4:RjѳvUkb1lM%Pv(Tߟ!;֚ʒ½Y~C>B+bzնI>g.֜zNg9^_Wozܜ 5BEt]'xU^JE=~2Ж5;.aeʫy9ƵRu+@"tm-lv&4n̨e _(m&u7Su|q_JV3M6ll@< /IIАQO'{2]O)ke⪧Ükf`lEZĐa]KN1e2 _'&J1y$K'3A/E@^;/©zvkoT&U,7"c߼0iXde`[_լefxL߷2AzW!ּɟ`2N9$fV(p|@k>xє3 }[t4GgySA#=RvYUz.fo{f~:_éoPH%WGF^yͫX*Q :u'ϗy߭h-G-[vCqDZsf-dmA+]-~]Cv|!rqgl͘Nj4[/)l{MLY & _t|Gvp彫n^F8[}7\N 'oMn4[pNN>eizKvΦW߬#d+y,( pKOo+W8R\?wLjreecGҵ9{q~xZR(A}b0c ŢmsOs3Νk+U{šv읱$3t2);Vͨщ<` Sghi v|Tki3);pu43fJJ\r#0lvRҜGxޞ\դC{ʒ>mqp6`U7Z 9ɧqg2RP/'Mm.I3U^rm;` '4gTǣ!/tw-;_8RF{f\0_9S3%ԪUń<@v۰GNqu_geaQܶ.ߌ Cz:YmJi(vGʻ94s[F:arAAʅϰ4+1Ӄz+3D_~'(0 7"R9nڎ}=ugW3 ˹ID]I\gPUeuߍ1w4&U) N}:g=^QT*S"j?K9RQ)fts(~}wo^9s S8u̬5h́ ۛ($TYwcw7-3;kt6S zFxudM@V8 ӽkqĉM{`:|RZtjn]g\>3顆: vE.VUW.*XvmZvW"b]슂(R!Z(* Š}wOɽg96ޣK?|))z,)C+=Ľ,.7AdD*ہ3a]; 87>r6٤7Ay IE"YM雄 ngX #_[\:d*$W=@\ZtHdi{bͩHQ~[ gKo>oFg Bd5igTTTT^?;R[g n5%JSggs`Q>H_eiߧebM)0ȭeYҩqE';x0ЖOxNTd=w+P;TUc]3},-} mmH.fދ<޴G^<j3O1 7^\y\jiא"Lq95>#h$^V$$21< ZX0Zrק<%PS?ݶuUr3y !en!VW䢊R6c a2?ƹKV}wCIa*?U2vtotlM-%_6̢[B_/yQkLJv@)HOs?R/\"0D*&*H!'T{(`owY>Vrj33w]&WFJ9fy]6R]!Lm]hoY ;T 夯EW/u[Tf5Q,:9s;{"{]a.ί.6t?klJ4*Jе<&Sq%7BW s0P(JMWeXMYr?5lI ]ZxR !~ϭ[C-T#1֓|o%3ǝmnFI+jhV\)@ \sh4$X kz5e'5B3ՉV$P;{AXT@&糒_dɮ=_/o+U_bu|9XKWW_7 >|nt7%BLW?6ǻ U*U8D#~4>lg!/7VeP$<sZ.0>֢cimeN楎% $XM9:[C#.EJx<6jKIx@]w^pb5Ȅ{ay<96&>+W .9rAԥɶkٸN1$jqˣT7 J8i$I;W| McU5bR͌wb3 @ƫDd*+yJ h@&+o&,ȩ@u jD]Q="$:m"J!Im'`59.oUVszvt$B3ӗ Ŕ2 #7I` $;& )QUʰ!5f{CB3mf3y^NLR KDÎ3󊅈6h\TU~ZT-:y9jQ4T_I _fΌfq__بU䀹c^޻?O[b!/vӾ]Z@_l'ߵSn/Ϣ|2c6\}MsCqmmggggkeHAq )cJnaHA03ka]:98 1p4Q۴.a> o6eLCsnHqiSPAOzk3qM }̕ <\^;*yPC=uZryk["TEss*[^4bGw25σ ңDDw;33۞Pml-Hʮ/iKʺusRЌ&6#!sn'r03,Ia׈g>ʐCFՅE2cND@(V7i*fMiel6nJ%Em;#gfmxQ|@Ms (k;v?)Z,? +%,1O1&zݧO2 /.bk{)`5oN[<{?} Ӟ\W\_ ޓk=t)pś ~`Wۮog 8p@ěz͛=AiN8p8p8p8pD ;Om2lnZȨSIx=zm9sfzQ)P@R{r2b90` &ȸbd_͖jҶISKp5tB3kju'mvEąݑ&ksyHmx PPK^SRʖNj9Di^ 7&SIe#4zۑZڈss"Q38ǘ1A.:+jB=gN\7E>H0 0\}Ӈ<+-{lHkDazl!JZ#&龈nxPGώ uickP!m_)>ȣ[wJKm+Kæ/ZyBx'RVCQx@"eF/TWpeƲI^_2u%Eyʶ629 )H/-ypF(+2%nw0"ta̻f*G ;'72@^r7^X|bILrp O,6YUAm+OM//(x[;# <*I9 %|sCw}Ft-O_ (3тg6WS8-JW:5u3skltrdG6d=Oϕ:^{rAa>^tR|ҠQ= 6{1rh?G<NZ5HE]7MDQ(o1B*STС[2xo5"f]ߢAifu+ȪjQQU&lsDy+Qףjfzvd^:cziA9@:ǠsTU(pD6wX=˩%K~u X=Y Q̘-^}$bڪY~/vִn1D}rCלV`jUGCInM 8Z7bp݋)ce5]/|t$};}*_!K\eʶK#.d >_d:ôC\Y%W߬~EI&菶~_q~b#LthS ǭΝO@br^[q.F$eh;~(>Yh$/?wdۖk~u+|X i&Vd "IiY ZP_4i2~t\N֫Y[Qh6yu_z >:UbksԠ.҄[DѣJN _rɶ u? x/-kT{oToAډ8%Ź1&W{BRHVS&!Buq6;' Q _a ^9+Q^ ͜b7drq]1A@ً+K-0ha zY7F)%VퟙeBvN-JDa:e^?VPB.aA)+^Ue%MYF'S^b-]QtL=^f-[w>W^\BƣW7|p#"rj-b@ ky{̌O[63!8YbCx-RFG{F]_H8Qr3y !eϋj"$%9cc˿OF$Q[ɃӬl m-@)dBlԎD~pgK Z2RזL펶QA JeyM^!fԔ"aaqsB%Qk%g%6~psA&{ d׏k s*;}:^PVszvu+PO@>*AޞƾO[ Àd`$\y9 3r0%~6!a"@Q91IDÎYͼV;!cMK20660g#JKV~.!^T)[XN+'hF/ ͨHc])堤[ٺ}Fx ,I =،G8DDw;33۞C7vm}YԓobBPjBϝM.[?U?.[ʐ~^|qȏ}o{=JYcN 1uQ6dqtAf% w>`%7<!V }2.,t2$B4}I}LUdwoO+c qS/)R_oAƾw9sL7kkQ3}8wR%\M!35K2~>e:p嘴[X*RwW]rwVn3bSva[otN&IYT ViI$Z|/?/W7EoM;e2xm<#LI4;ctT{sړ| ŚA i#sfie3?x LJ8ǑGQ*Hҋf@&\+L&j f3GaQ|"ܖj RRZY5f<C qJz>h Y:ժk$x.@tFk圌oVި[?0g9u'ʹ7l@fΜ[ 㽽i63oN-El>qx,c_;pSв04{ljª1]F*]Ypy(iXuW !\{AU[ Uٱi5?jB!˾]/r>T#މOeI濹cϓ&H"qiإE\\x'{Mp5G8pK@{rN8# z*lIUMN/MwBo?p Fm3,8}Ya1imq}my8p|ky 2H__ݶ7B7 zd6z)fɧY(8p8p8p8pA/VFu =Fǿͨ=xCᨷf;̚گkG+=BI0Mj5I:Un>R v_~)^+7[%G~ScO:a$Kæ/Zy0FDe9t5W8^:wGZ\Iw$=7V 1=@ٱN<-VMpH7K-Dg|y+Do 9r˞ޘ(l7Z*TU~*B=gN\7E>H0l{l ?`u /DwD)R&F@ROz]]vCæuGRlU9.Y8Tq], ᶸ^M% )ĒؕAۼ[_9#UwwR`=o Q4Z`'rAa[\|})| F\fJUFmW*癹56:92YEj,OslY0F ~%ɨ?wdyv1q6RQ~A ãT;ji;lѓ veKCdrE[CSُmwf/;O:}o7}-zv*MH(lS*%A(=zUHA((kS%B*'uyP^{XYyc E`be"$@$ B014}@r;_+͆&taL(-%ostfCЈ2>g4֤+^OFEEo_ۍ/$gG3iSC't)FZ7&ԆE' sYN,YkDcZ*2cv ZxTif9?Yf, /}y}o \skExj:JrKdrޛBR iިפk٬]-0y+QZH;(gUofu+ȪTUC4^4s~Evx)/ ^Г y%W߬~ߕؕS*?7`WdܧLxֺ!a z;]Fxl%jRǪ4!Kg Bd5igTTTT^?;-bI6~qmk[$Va ebDB]FE >_}S²~Bh  "fug Baczͻ̂d5t$>V-!8l.G^ȶ-kZqWh*U'\|/VJ d[mGۗDoSRYRVz{Y\nȈTM]κv"A;NIqn|l ǕT$ՔIHP:|~.>p>E5-WCKchBcdHEe@'v䓑F ?~#SMF ;.҄[ @U*ڂ>/ {u_z UC5RߗY鏮f}LQ/<`K0yi'5:"mO38+|m5᱑DPrЅXO.4.CQ rkw%Xi@gSԹӇ'?.U`GQ>w+^T[Qi׹}^i;G1(%qMxUR"Q6_!ѫa)bĂђ Ǟ-n_63ImwCX4Z+&ˁD##233>63!sjg0}%iCPqxSQQQQQG:Z~fTA41BʲjIIOz5krQEY)O olsOVښۃ s+i_S @U?4W_(ʟn[= f-񱥨U#e{Pd?KgMbJh<Ue~jh _( 5'!Iwx߃ QT@!dWRϭ[C-ϭDXPF>~+`9oXw7JU):F+}Xx'/{P*~g]`7oH!wJ 1VSV:9`Hb"PxJT ڄO+i^@QTj8yRݿEeֲ^3?׿'R7ZgqQV)D>.[g+vܔX {94Abj+@gPHv\IJh9tt'KvO~9ި֢v$}XThic߀T8rqnOjW_Ҙo5oWju$@:`᥽*?{z;er>Z%Jgg?)Q͛cJBP׃Nv"%̳Msil5GenP]&װQ w J5p5ԟaaM5LTT7qQ9t12$Z]~~ܞSlmk;mL/,Ie^-ǤR@(Go' `tﭗs!G [W 4wFF%ҭyz58vhtA30 ~ΒMYF!w+R!_ UVɌ]:))%X >ibԛh` ætA) c߻=~昌cJW3?aj66Ҝ.\,-HHiQLޭt}e7:r줱rݗ)Aq_P1_/A_k7EGi\1(dxUS =ō21HDI􃹑Mo0ȿ9P*L_ nf) eR~I{u~ʭ7M2*:O8H(vS7#7ΙTލ,ͽyi¦d׷[y-3oʋ?7՚MŰ48>[D p׼dmo\~}ߩK4q,8p8p8p8pńxz7[pdTTTTT)v8U {ujASjOk˩,4t9">JA=l]~k*AhdL_ -9-{l>R$5{cb i};@Z~ԡG j2VE~fˁh5i[$SΩ%A1\ -œn36@߮y℔jؒ(=6<.0UtzP+!ZƆ(Hb1j@髥99~+-}_xQ IDATPGώ uiL@49ewW HJcO;cb"Vc+i$=n1s=FYj!R>M'x+3}`7&ƞ>tzUJ;>FyCnkppZCM\ibj5I:Un>B`p5tV o\/6`eg!!9m AX[CUՖnY4VrT TKxJD5[U(/h1:xɠ迂.3T<ϖ#h_ol]~{AEkn$FxE5}\⣸q(t7KeÍCF$37gG/)MY,򽴥rNOQ)ra-X2nm٨^9{t otJ8lPG}*5|\cHُInTH^Tܺ=m9X9i[W8Ȇs׻u3>~HATYYP/'B;QeFVFoUIE0ƏZRm7Y Ӥ_`m9*m21lGԝ.y̦,G;}*d]J 4-Dy+QiO̺WUwQB} !!J4Xi(ȋ$69Bj0^oFuTb]CD@meJchBcdHEe@'#&H:)ֈsNn]r IꄋJ)7!lP'%x/-kT{oTork'$\Φ::4>(=r!H$)}^uM,\|^+|ziq&y!ddѴ?f߈ԯHVC_LRsJ9[l'ۧZL,ܑm[֮}׵WcA@u)w̍cUhx |^4)aHۋ@˅O-_[K/?`u?:76 ɻ~+ݟroSÖyXyBͪaLO(؞}N3nƔжL.(+I=z=G{|4sΊܐO T,y{̌ϮGL4Nl&⾯$X^*3/#~ǣ=.>RBkP){^T璒ªujU˄$Ɩq6]8r軛WJvGn Oi}#g D}~$eݾĪ.:tŵ\=tWNw.37_}wl~FM{P:~Ii/>L.jsR[ST AOkʤ˗W'̯@{X3DIUq ruNNy%bS16Xus'{"{][MuP!]HM(;5U-Tú !+= ,)TeI|֙N6u7|~CB cZ3Z瀕q;WnJ,= ;s kz5e}5bg%g%ݿrɒ]{D_E:N^%coQVv>>huIQV)DʚJ(i> l >L}R C48s*;`5'Ur"|5ioҪ r*P's]«QD;ZhDo#?d5E1&|罼ލ{xnW| aWc@67^l\c ͨ2xJ\Qxi.j>~3lj0%DB# 9<0#!T#+ڿ> G߻7k$1qj9& J>ɜ2wK{v]<3 2c~\O03ka]:98 1p4QHqiSPAOzkѦ4vih]ג+#Һv5ѡ`ɼbb,*3]#O/XXRU< EI>Wܱ_,o&5 c߻b9>fػRzT^ngffs=^Rrl)wIA38ظ6ʆ ι r?~$ጄg>ʐCFՅE2cND@(VoRo&|{Z[ҽ~IzjҘ9]d^Nu?QLpDӡOՏֶ2 gTل4ښ7s'յSqrn=[M=m~iߟE#껍< Vy[iݚ]GzYIn7B?'CcV_[Vi=lM,]|y]ԘuM5r߇ǰKNikjbkԬi&=[(כֿ8UnfZd4Yy# i#sfiQ,/ebF?Uygư4k qᮕs2V@Jk̸y>4dqC*hPm{u}fD1ꫴjE K/Qs v mY Eݡʂ(]QZ T^xsnK7j8Wi8s)HUv?ciL ˋ޸:w->d2x&?H~;SIysNsolـ̜9}A{{7"^ ӎm>>gƝZ b?|,cEƾvbea^;T4{ljª1]F*]Ypy(iXuW Z/Rũ&.gHC8wqM]_lAAĭX*EPu+EVWq!-N, RB$`={{ ;a(P4bd˓;(Do(\F_\kTa/_/̾@mo_*oi<|}y+Gn^9ڧ~axhkB@wzT}lO(v~WyB1Ҍ\wuwCD6?;S?v mr^SR]UK17v@TWB+?=SH9)1=-s|Y0`j@ C^bqc1WUcv71`P)Z%& Uu"0`P=jjǮH *6v0`(o 0` 0` 0` 0`2L&9K!}B#ŀAzm9g +Y{~ruH!Z sf v3·#$ |m#Is7刀ٓ' 8o\F-9o[ daNfCNj8IR*DxI#\m hSQWc 4+OX"D ;wL<c"KIg#3-&ֶI8}rVv#TK?5uD̼WJGED2Ԍl\ 4ЉHAAI|%n 1/Ȗ b.K G 7,x8?^+Zx/qyHyxu=~`<Fܬd;i^[Vm9ZPtιW"(HM}zNnnd3}"aľLc ^ЋB }0bvz*߽EGSكY?_bGĞG'z>-zla>|[vxQa a/ Ň<_"TM}`H殲n/$ڼwB,Qmu jJ _OEmC~q7v_\*G u@x) ˻`08p$^&DI]㋇^ےZu͌Qڸ߮Z~'$m5Dr42>ʢZhbCca~D A4<-yV']"O֦QҎ=+v\K @Y|Eг11]\%6zyn6T&w(NaO?+a>e-:>Tڞ31o mp^{jy_[ 9E0pۘ!wǦq_s0}g?$t d/o-iWOdHT:?1[we刦hx~e @2[2-z p mNӄx2 jgR\{yiJMLacLJ ٨@fjx{t i_fY5{}]X}-sd!ӎqx!wh~c~z4Bβ>1EϚ'7,YxHWgPz*<8Bk䩉jJ#ׇ,YH9NwCxd&v_֓]M *ɏt/Tؚ,q=LHW%8x b ,U*^bwCGi|%dfRl6!+cm =ܹjͮ{!W< $~<$%9oftiò[p +]J0tkK+L@0^2˾8f풅K켔kj.oY4xCmq8S+6[v_&ԕՉfSR"V1+zD{X+6tt u&5 iM 4H67BT(*h*iIѤvXS$dW뚈Iw>枍yZ5hCڅMR!+A ҆.#Hc b zC@P{wkl Uøz"~[&05!N:r>/jM{Q#tqԢrFڹD*t59zatA5thxYظL=Q—kLANك|%nqU#; eՊSֆx(PnFDwcΞHP'7̓rT ;hHe,)q~y];gr k Xu3xyE-uzM5"QӤSY'Ӥ# 5žI[+ik;9>5;ǢjYH6:p))k"HJ\_6VQD&5]EX V ,uP#_ljzZ7`u d ϨSmN/h£!ȇ$BB4:!t xd:F=Fƽ˗ ^5ڥr;e VDjDm,&xlc|Iwll:6CC0ƀEDr?9iʚ ?md';[xk|GIpr5Nq2271p'#J,'م~(/h#U9ӝ|LXA?7p(rǒAyiFqnn c'v0շt^WX)@/mp]lr?nf %.fl0X Fn C/v[DaZ~ljt-$fO{(DFgL>R)hЬ35p"NbPt؇ȥ#[~_'|ڮ;խ:3=O[IKw״Flj.0nQF(FT3@^d^mDL+<~%kvEvÖvu˟Y:esg(f]߲ [ /⼺*@y9~;>oA=j/y۱ QCzպ䐹O˳n$#cjS|;K%&1͝$RhOnB̼mβ5ۧ#o"&=dHT]H?eD]*+rDn/v.+YvfCGL"ri=rUŶQV[)2-$qt:_&Om=(MS<٦PQ#7z/SHP~jꈘyyr &Z[Faat- M۲>L zp NSKq~32^|TCl7ÒnJol tc|FZ2%t6fnh88 DπFґ7I{O%tI?!ºܔKcrN ˕K#K6y[_eI7}A!/bzR)՞n~3>/|IkB~OɟV"J ؈h3 )drSsY3f}P!O8.C斬>WNsŒ0Y.Rl*͇t>8ӕ6~3 H&S,6n_/8GDrn:1Sx J}pu{Bd2 ڗ7YRC \[XˎT'ZR3zƚ@|mUIg#IMCQ<14VigUQ&5#[7W <ȉdreЧM7,x8?^+Zx/qyHlI45O?2?;Toc )ʺ@v[A.K)DTux]?OH6 `Kǿ.sˊ-ᓚ5} Ym-5t6Px!t`[`>|(R4uWF$4ێ =޳6n쾸T7s ꮁSF]y<{h%u/>zmˁET5QN1VWuT/x:’?&:_RXf,*&f0DYϚ'7,YxHWgPz*<8Bk)K\d#&k8~&NwCxd&v_֓]I|Eaff+(l Ĝ|bWt\؈=hmw7UşBfjf)A&nRK'NoкE="7dr;*^4kq{;C|#%c.YtKn~5\!8t)]?ܭ8^#eWhs  m×>Fs<9/_qv#"cZд[S`x߁B#qU#; eՊSֆk~RFp;BrzG!EFyoFjrlӗ<M,onr)46KU2!kyZ'͞[\;jxX77//׮dVp%I D*I"T y/>spFfs6 j &| Aoqԕ߇p~a =Iy';#1\ڭ_SU  [X8u61l;EepQ$,K8/)Bq!W H~1zk'6ՀA? Ӗ))nvqmq ͜Nz򈅻v{:&/^K3TKzHՓ asJMHns1|؈ljzZ7`ujd>dstuFsuU^\vXT <+Tו CM<4u>R U NI^@R/{ĐrhhbU sEAP!GQCEqC嗀9z^ٕD +/׮d~lL~Fh'lsz)WD5A>DhWU4F4Z@=B1212](xo.+gvFTŸ8O“g_ ; 8] YB$=3q\m՝!8| x\[ ژ:/Yq$EGݬX9\?mC.J%|"Hѯ1(#vfFhAX.mZi};!s8uB'jٳ$ՙII* Iz^]Ϭ0մ4@pv\~)--&ofEou6:H< Tҧ HyG![x 7d}P*Xyv3%ez Uˊjd-fq%i82mmM-gZ WQʀ(#Ռ*TϦ9 z; F<k׃V󺸣ߢM BQ'-o YK'BqJFD ((Uܹ]׵6jK2NIPQk5?5F/?ohiIs0%ݜ?)*Oe08RmSmBKL[~^AUFhS̊1*eU%P-,ME̪/!. ]>?b$dg0`o hW߶0.nS݃tlScymeEOsGV2}$?\p{0Û8 p7{:nY0aa# zq_,qڮWL 5X )VafpnCi_'`rtGҵ5H\Klo 雸N޷uI|]Q q}1 Oߡyw!cyB6oȗK4ٰwkeGe"pr5Nq2271p'#J{@ߜ;x9H}fxZv3s82)VݜN>^&7Ƀ, u-;V Іw\,ϲm1sBmɲT\> h4hv^IUAIG V36nC7ˤRѠY3fjD{ŦסW+\F_\+ };kZSeg9Lޜ>O{o V@ԭ:歄Gi+' kM\KŁM֋ jG۲+A سu\fyh9O̺e#4s^yu'&Urv|ނM{Ԁ_8c. Yëu/у!sw՗gH=F~pTzh1FX(1i$B{raWYftMRD * I,KAcEΝMNr }.յ_jST)2-$qt:_ ='^9}zRN̺BהT{eGR_9r>Ռ C??;)*j:UCE)1 6Ʈ4V?Jr]*Oeȕ֤e<gԴJ|>Qbÿ Dˀ<4 #~rXC<&``Z FXЩdC& Uu/_b AUG^ .@X1` 0` 0` 0` 0``2y-^ލ@9ݜ5( 0{FB(f~:N$/oGJz/v2$ERSO*E28ñG'\P"ԝ;vc 1!daNfCNj8IR*D/BnSSG ̳?Wg07X4 oihRޖ%FyTA(QlXkՎv7Dߝ$NPwΌNvfZoel+d>wS:si8ۘm9(+ <eKG$E=WtI?!ºܔKcryS켝M}oU$Za2xO1Ȳs:FKJcf8p)a =YqCp4],]-Y}AGJ6b=qz9-">wөhH部Q]j/Qݧ[WnY\L0!r!Te 6O!7<>ozzTD$I@b6W9Q|/L.)<#aD#WGG/UI YZ2@(>fi҆U)j'0b#P?׺>z68F~7Fp-by6C79(wvt`C>L!0oHo0SևG'z>-zla>|[[Ym*n42/@PsϏȨȗH+okQ;u콨d۴upu'M`sˊq5} K8]{'^25V6JmUxwqLvL=wcťr$P-oPw Wp0z`08p$^&DI]㋇^r`eM↨ofgGv%r ^<$lNW&QB3"`<|'eшE3 = m ?-llTmmkk%詠FF Fb$sWY{ 2呍/[(GLiޙf7*<KA;3ٺۇTlې}3@[4BsK3u! 6?ɐ,νubcH˪G᧿\ga @,=W>u~}Bfjf)A&nRK?r ըZ/_6<-u03pGSʿHp x-7v>8}6@i}!^hL dxhl^qQ8!+_6p8jurVk_'~f'uhx~eCCY3CNq|@~z4Bβ>yϚ'7,YxHWgPz*<8Bk[jJ#ׇ,YH9q»n%;n7}Z,l]oLZ+ U _EbNn>_\`1+`BEOh<6_'zvN> :EO$US,VbJkL+uMDtUˇPnFDwcΞHPz=j[Ϝس­V!-˄F |2Y{k@nɹw>8 xA Ǵ>5e_$!ڎ&‚,Dsf֚*=t?LRٹe]/{V6l\/N俉N1i7;pz4ڐv~qTJ{PB˓,ZvE?xd}5b",֛q1oz'ge+ S/:>#3ܴ5RMoHGM-*g{ښSXJW~@{Ț~FTAM&3,@qz[/ ט(O;gGhh4l:iGxsc\;'Ҕ|!^֠QҜ7u]Q;~%T\zQ(GMiVd9/jN;NN|p%qg qoq6zOk75AW?eIC~[:~&RD_ Ã^Zj HcyI?W>8 +N_NM4 =0^N4zG]*yV j?LE&\O;Mm{T5yGqtכ ŝJ .2{S7bP6x놔|ܓp+T$"$gF=^V}ԍ Iu9l;gM43jуޒ+#%<":zHՓ挫ϑuNrV̯^aA- S,:vt6n¢22D% ѳvB0hOq@t 9NeI+>ox/$l~Dv"/0)nvqmq ͜NZ!򈅻v{:&/^^TiϿ>S Xl)|JZ?ձRW ùM$mރ QvȟGiE$=3q\mժ9;e8| I"y8 X;~*A@RttYJ'v=h;bWoj(4k4 ՁW͗ DZaThDHp\Y(U~,V^U!ԲjYP25 '㵭%7L+P XrQt#5A]|va"W!ww0 tzj^w[SC($2z!+ZKV}Z/{y?sbfOk$x/EQAQ\׹sUxU?O;EڨS,Z8%֘w^%@yÔtsRWhy=/ WM;Ȳ9u18peC8Ub9 g|3 r)^w^v}. x)-շ-.[7!T } ]w>Ԙ~^@w~џ(dJɌ9Tc\e971(>h ?md';[xk|;A(zV&ZDgfWKR{8/VdWL 5X )VafpnCi_N#`rtGҵ5H\Klo codgo:qz%vD%wo3 |17wkLS,gq~xzw21/5d\?%lؿ?bi'Ճ6U1K[hZVY%_"gvN6j)1WKͭ,tHGm|s&渫0:RNϙf:1p eRv @>6p` C]}KuB!&fhf̜[۬Ge9@GXxKNj*;z09dAy7C;./_1GILs'ړۅ3lۣ,hHȭrUdOYK#Fj$7d mەl3'p0:^M=R!\ubÝ-uȢ+?[AdKl[?7% [#s{O;I^u[rZY$# hRO/Id F"aC(T#۪;yJiKU5=a|q7^r{x?G;ɾៗ=, ONNVCǺEwҋ_2Hpg>(9AA]1辣 7kXh?ϭt?(/ˮd D鿮Vs~֨u6Sz~i<wzzٷ~n=Qa\}Ц¯;XH ,*&f0D-&jqCI73Fj곣ΒP-oPw Wp0z>);v@ht<ۃuI#Ѵ󴨿~[!0st\Q+io-iWȐTՇ6Z^]X0=6m;t6Px!t`[`>|(R"KO9Y$ _WSDNWP-sr:j*;LJ ٨@fj ~Xӆ4K+a_KwtB dfRl6!+SÓI}e`k{m޵گCIOf.?kɎM(BvCb mg rTCd< FŶ~~~~~kQ'BJ5{:PK4q݃&|8"qsӄz5t{z?u_S} 9,{f\<;bbO:FKfǬ]p隝ry&}iȍ'G癞%I7[Y3CNq|@L~W[#GF=dc? CSI]NDjsy1-x. R HTb%&էs+9gcwRn9^~J5ݥ)BF ԳGvnYޫ= gB舅W'9Q5V榽P=^ĝzs?.&mC ͌-|iKȕYvQhy?d!h3 Mzɷ6LKynR}PqeG56Z]T0^<|N_\]PWX5UVِNB;ڐv~qTJ{PBwJ;|/aW/~.6*TUkv>Yk@0C+=n>M3x*G ZM܉\ẇ[j_npi^5 weStV dܺh_ޛ*\=h_wqFfsv j &,iϟ_JoYb׹İqcE*WT/#۳OєwroqHPrr*繊s4.Yf 5VqMqus#- P+dܽ_p9y/~ ueƀ Cq;o<*QMb %@ d&p+T$"x/>0wc#ic htJC{U7t>R U NI^@RߑC*}XTg nHQ>}:6dW7Np}r-Dn/#ks+Avc&'":NqqG{C%tݬ=M57M4i+J="PhDoؚc?k&X!zCYiBeղrYie\g(# g~6q*xES\rzZ 9:!nYQ#sթkqkZ5%XV}b7k񴤾 Fixn)?(~ D%wo3 |17wkLS-]/r\}uNuw5Voam^9Nznh&u*}pr5Nq2271p'#J nVnsDL7plL\⭕of1f=4 Qvu-\̬A1R#uIQ:6CC0ƀEDr>n-2JV=u?ĥ]aGl%lmѓGZb}H}fxZ h"gR wAE.*..Eeukd,kbv JDJPR(h&Lϝ痛}s{ޙ{ ͜' UʈMA`agZס/滬rљ vnt6;6lǍ. B|E{-hWIaQ9;nqygBe|d^ֱ0?fKe۽@zzdj}bMW> Yv5ʦ'^⎸夝vfb-T[2bd XY/;p{_ּ)Mlei¶D;!1NJ+)$agR#X ][PZ+)C=cn,`ymP)Λ,=}TT!*\)NSvf;MG"!3AHq ]Ƨ=YORo]ҹz IDATg3V#ݓ J~hE+E;lI`Q,Q64BCYj/:!ʥ'Jx]|aVb V__|=MU~M'"BKs9v4Okn 9i.Inuu}QYP[j<&w)HC2ghm"*CybO+LtAltR,YW;3;^^zc Yrڶ*I^*剉]pNsɏ S>;YXdf6h X*y#D6uyj4S}iGqEOU/zoJ׿+ jjuI跞5Q?~EWDZ}:;~>Д$Qm#X9{Vy3hMρK> E纍3-r·.=$Q% 49;] -"v*Te|&3w}>ᜫϜ|xƫ}!kh"s_)s7lz*v7=$Vov57EFGGݷƧVcg$$t6 `"v-W O[G;_91A^z)5nX#%,4"ݱ_ Iapv_]wK%@v6}ՊM1LeAL <϶/X|Ɋu{4WLZJk'U(R~S.[=Q-~_P+ufrQf;_7U)A.zwư욎JXŠܴ)ZJUGo7#'d=k8|! iiLV=t> 2ǗNn"}C;'؛pkٔ*-@ B Si352>;ߗjdTh\B%$'5[s&fy^k55O "n^E$m ]Ui9,Y »ۗ[8s2y񏶭 Fڮ0'5z?+4n=Hµ)6<-s ,- y+%"pGRF]6;.F%3^ßi+}_3P'AeҫKq<3꼺񢐸 "Na2,uTlv:Z_s~jåU#F>p+._;-+RΒ.9+D/UR@yf-D"qwCOAT;_%aXl_, ~N~FW>:55ǹoSROn\#Nz_Adp4nrXMX%׷|qv\T,AWpA_-b6P)VZ=I5$6I4qCCWgpK2%5h)kuAiE͠"AkQӡ'^WɽjU[{*+)kX42P4byN )ۉ{K,d P k[铥J^*5C*pV*:JֺVLœQ}/(c I@8\Q[vQIzՖ~Oiy( ˿q6yZNSd !+!2tRE$"FyUkgIKjvP1Hv.'|뾄UtXTQHZfMҫ6;Y5yzsÛ'~zGRP!]s>z1b1W ^4ƩY^TZ#'&EE:!ʯ.). '>@z桅9@UfAGa*i:ͱG4{wkZ^%ٸz_vޫ#c27&#,fGZu_2N=mlF?ז|qW=f:ZjJTS۬1m 73q<_IoWq?<㢐~ݼ鿌gM-/tuF*Jd2 iQH]NڃtʐHh`F^췮+]8V3B7ؠ-cqqeеb,2n:?wHmvl؎ l$=gRжydqm~7jMF _(ړn9GE ,ʸ]fBrvuT6fȭU~uʄɋtTfǟ|6BTɉLhI'FP CEhx-}д£4*,=;w& ("ArNo;p*-|txAcW{E.SG?7S[rFVqů:؞+3_XyojW_,5Oieu/K{%:v'  w]-~,R~[{7/9??8p8p8p8p7ɔ緻tkjdܡ8pB>y,D}?}oY٣mسϽgV__|=MU~M'"ߙnHEk vfĦ;~d?([ xϚd,(OupjŇh}W ٖ6cho:/#~@{\NJ+KC3EKCۤ_:G ԍ[N6\TX>xѵB04XFу WXA.\JO&O*PcMZcވ"l1\+I+YG:!5\nrLtӶbێdcWeܾLJCeO?pݦ]2$jk+z+ְ \){DUI%!s|P[}ΠDUkh&Kt7|sAY_̯8%slܐJ+~d#`cp7Vluid_2{CiDA ;['U;j#1} 1%g5Eg xTIThA̤t@k%0ptg0Tsz[lK%$*Me2ǻbݥ/-̧P5Qwm?5 :,tiqDf,#F`]n*wU#)5(u{ﻗṘQ&4'#zpRѮxX\h.By'Ogs&Ig?<BqaNA|9ι%-D,{yĩ6$].<m5 gC-k8,K_Tɽ Q"s 0smQ~'oue~\FQ }r>s^}Mt14VWF?aH*qsNx/|{@d嘅KPC[]P})ʇ$}% d=?2%䏥'hc]0'1o%,"I:@uZslj^=-ڵ3F ЀJRL;Rz /ZCKw':Ue3% iGoeQGd :vL  ɵM)l2ب.%e?w!8{}k|h?)ܒYΧ|v̻418l@4!TQ5jϭFejTCУh1Q1.3@f/mCSEMV<*4IjuϨCb1P_Ht!P?Ď~bY؃t7iO>?^."y8"|hr3IU"B~Cх"l笟먂H ?uQ֍W?j2s|4 ~ιa/h@́W{irf 2+W3;^^zYrڶRrb&ԯ熥@6?'fWQ:cz5ĊFz;T޿!\$# "/_bZ/~_2Wm%w#J/YOn{{BQ0S4BRXy1ܳWRI*W ;R/(I-"fRIr1ݬnn_"`S eYSRGҎe z˗#Qoo?TAEO]Yo]^ԟ6M3^9RبpKDz/G<&$Љ^C!1AQcGts~u;9"T,8QM5.읤C50S@X+/v_/4Ko\/~]`LNdkx+&EzuW4% ,m͓*Yxf;,,;t>cJzԹKJFERyH;O}.i,/lAؓ) %W<{9!x%usܮ,T[Fj*M#bCrdTgwϘAntNZŏi 4y9[8\^|(6<3>nK&Zdӟ|@o9y~d/ 7/~)Su'/e$޼KWnK_aEZjnnZVe}̔ e-$_`})\zK)!z,Z<֌ c{:Tr"ngGN>L/,+zu)pO~oocMɔGa܅kQ V_KD῏86vx_`S{ = fUTTb,5 sxo'YFg@U־'xuuѴ" =O9]|T)9NTiDAu9MBC77MD27Lոf]VgT jk($״F IDATdF|a8،7kPwb' qX- i["Ja:֮|]ȭ(N;^K-9rtvGֆaXL c}bdzN,~ΙQe\;h:k OK7/ٷMZV?Ϟ%xݾ4=a6H? *cIS]X7yh+]?dBE DQ!_$eRbˎM' f\yAl??s7mƢ;LFM(ZND]P%evKۮ$hLBzz).@x5t@W꫹ 6-kJjRGll_-95M?:^ ɊEDueueSvGOqk_OP01ĊT mψ!W?/{k8I 8`J(RQFxW>?XצE]K?:#]P@[lF:ڭIElHBi)D Tʫ8@Ӣ%[@DNe[ ͓84%JBETn,C et?jK~^%'>$`w!t@"qwCOAHj~icsG c$uEяLگ-)UR@y,lG;WRFcib׋@lӸVտ ?~Xr'~o/mFLhqbQ(`N^@R7PN%WM iZ]'d-fF5O$@3B S@9y~jR qQ HX-b6_utfinAjg& eЏ6y5n%}f.ղx՛ZW~8Z^;Oq]I_ʄՠP4bvbH'jZ[S /- k[^`ct@Y*pˆSRON cםVC* fJ٨bFsDmmp++9?u~P\Zpb{ver|PlƏˌjޅ SJlU8w bI}PV'}>me@A PPҳVld=X:`$kbK'BH?2v%N8{b尲"'+WU{Dj~SZY7B&B'O̦.r OjPQFYW+y3t?vic4gy SGh^<0,h`D4Wo\cզ$=5wplߒl\tMf/Oqp'wX G:j|UGDg3rfʡ2o<ÊO#l ,zgА 0z#/^;hi)!RSO fnƴQs 73q<_+EU=Ncn8n#QB~aCwnç2N6RiC7ƞ<EDPtͬ?2ڑ4O{씱4 m@|Mg˫׻zFf@s Bn,LJMqu0ѳtquP+w>FJR? 40uA|ZmCOdtӟD?_̠1/zSP6ÅVER=s^?qg*w/Xl ,bXYOl~_.nL<#]7,WתLKJAevg,@dG[Q"2.o9DiU@ͼY!TmBCWYȋC@TɉL(z# =cAzȤUdK;&4}襅M; KnEΝC(`e>H,\ p _Fl;i@Px՞71ѸԖܻktͪN8e}#a[$U [h]{:RM}eyJ.C%@}Yڣ-yRC([cŕA׊#IEUr.}5Y ['zֳypD_iz4Ώ}%bC9M 3Sɺ?sLD\:@Y߰RJ_ub&F6H_]] f.CAMaWDw 8:dKÑ!+p7@(<"U- !] }k7Au_q@f$L$F |GF*s~[:y$&Y8p8p8p8p8%L8]ß1PEEGGGGGM7'Łz;2"*Hpw-{n?4ǢO $k?sDG=gPDt%GhwGD;JcVS(ٴ{2Q"O X|b?+Oy,D}?}oÆ~&jT~"2)TtD^G9 e/l#~d[)|%_WX<;QωF^wx|ZG__z^X_B_s`5l6U l>\z:?\"θDye{ԵKDm |R;=pv+ k2VXFȀ_'^}'WlbRX*PcMZcވ}"l1\+I+YG:!5\nrLtӶbHQn}~%~ GI8]]'xA"٫ ^v|ǒgIOl2h&Kt7|sAY_dllHp 0VE1GƸŊO92 AzNsxǪ'% EW4pT]n*?T#)5(kcgی`E|_Ex߽TŌ:4y \!3)0Z &$1]w >$]c=?b`ݽgKe)Me2ǻbݥ/-̧uF}ݵ%jY`iL#M6.`N|"u -my'QrD 0l6ڢNЍ7t0Nt>>\փ򮦘vƳE@sp&;~>CTm͝3qHwMb=3q䡨 릆p c͑v8Io&dQMk'Nд5eu9?mIM=nX'`٤^¸ZMtUЍەX(u!B.=zN+KjjҀ[]]4-ѐq24o79ѻ+-nS^-_@zUu#ZNqzpU1 |l"P-,\:u"d%:/% $}% d=?2z"?`܎! (wZD6ٳsAg6h[>ptoOWsώ7+Y?tDz~Z@YTQ//˴; ogԵը[?ʌ"@$KP_HaBC Aff *[>#!V)AM\ե$5v"h&EyLT̬PKPJ,B|z{SE4p$*Y?ߡBH@oysu,.ʺ1p'SMf~ιa/h@́W{irf/ܮ_ep0"ll<~ѣN2fQJV>?KǧT`Aet~C2PyV[<϶/X|Ɋu{kXE~IO2pp}nzDi'zLS.[r-J^<)51Ȱ1i6?8!ق+>>߫IU{;u7+Mo_Oj7kc@WtY4$,A߸^YNu"y숎t.y7Gd5YlctI׸V4ͦ9naiB" 5~/G~,$_!)QutZQ H:T3%*a1ϊ'neݧ_;FH7UKUd0Ks}@uQA6T)vb&`0n\Ϧ:==כR]bzXqL˳KW^7+B6?Ȩdݙ;Ά Y;1v[O9޷!VCJm3>))ɇb3S?j3%&Zdӟ|@o9y~9)>sO9=ܝ8aBHMi!'\~:"CmU/e$޼KWnlW>Ȥ{߳%ngGN>L/,+zu)pO /yZGԷ\zwu97^5d?x80(x}3 M3 bV {?%!h_v2Q؆`6wᚥ%_u T\o{7]WM >Nnb6T'r/@T۞C,~^p!5'kuq}9:@ '_ě4-J]ұ5IA4TQ($j?gu[ZrohW^? ͓84%JET~Z)#bI+I|irC2m_y z|L>+2ha\美}8䯛W䢭KO0#bs#DB"?r} 3KC}_OSc܉(bg=ElfPYE@|z>jY>nToj觩JE?~䃐iʄ^ň(˨0UGvln:"bJV&̒Hh*i nh$t..'_)b)ws'tӪpW89ժu%e| 7,Y5O D@| ' jZ[S /-@mO*MJzkcxuhWF_gUA(JyKTViƆP,֮<zuz%4ұYn?ȅfXCPAcjTj_;OmXR;`meиgJu[Z |s?[}X1ǹ Q@jGtUWK𧐕:YY0wވj1LڋOu1/|^k-?@^uU)f \f@_ɋG$H;o'#Fh&W(~É9/y=p*i\e4䅨R@}ɲ*f~ jb%+: d2i1I對Aٌ@{+uG:EHjAF(fVVT.w ;FH~FN33N {ϝq:Iˈ=|eܿYY'fTMܦ7*ZaU6; w60ZT͂ DfnrUA[ʠ5+Ng%=< FAh;& ,{654L&,>0;ba4}J8pA=aԞ#B\ߙ}7\E~z,K2o> M8Ayo2KEüGf⠸[p'@TQ)Nbba4meٽf?8HqQQa$>{ч1oD2}o^ݩ08p8p8p8p2d2 ONS[#]1{R{e] T&KOUDȸʸ{y)W em?t 2*]GZ}fyrѧRc/_|Y&Dt%GhwG[lǞVgaPjv*ȘD޿z: wOD1Xf?õi&q?}G IDAToeF+l0{7'KmeAyVp>]#^_eҷ6B'E2>zW`/.A|l|fXu$֨*ICBkqY\HY']GFΎwO ݸ5"E3m%C._+ִ3s;R,h86/Fk4ޞټ&hS4}5bg#25ܐJVu/Qwd^\tɯ_Ƭ ߕsbo^#zr^4t(6= 2=)v@qG?Z:}hE~MJ/O).; 쇚!.;ӭUM":\vkaA:>o)NGlB׾O%q-Ȧ^X:yщ˻<%<@. Wy_|2d Zzyrtt+=Ӛn;tꦅyZn.kvTMM*;J_3e%.#4g++~F>-ּND~E'άCmƊS(kzf}Xd15?؞ Ыv-bfKg w9\m[s.KnE!L4j󘨘YF3՗f_,B|z{SE;?KV>[JVpDH7 BnɦK~d]8F۴Ӿ%܇sn?s= Pf?g| !EY?Q]Xt%g{U]s|||||?~f9/XWnFds)|FBr@gS ( 6KI(]Dy{m !Kͧ-glu[L-J׈пU+60]M0%hC[7Bx-߭T-V4;uZJ.hӺlZ|jJ6G6@@To0LJa)@(Ƿd1M`6zz߆ojP22z:fqhsX5vi#2_oJwU" sߗd?H `_Se'GF%q6|W ߱)Hgue z˗#Qoo?T "d1?iڑ6{ʥzRǢc@1׮NϯS_Dّ JG]5>ЀԆ8O}gKqX BnUE9p߈W[nGӂ4ϋ0D1eqo 9Y"9hD+2~jJqmWԵT*~ck*8begkև.sE >tó*T,m .Ě;'7On^;`TO*QuO^\& ! _<:iΫ.-Eʉ{ψre k/x)e1&v=mՙOx@]}@_{\~;$|~]Ay,r7H:viyEutq-t"(c44hPX FLT-H];$X^hJS+waqiy39ܙ{g*u[\c$c-@>5:zj^SO2PGqs 3hң!WrQ W-f8C/|S Wn$(_>]~ NlG_MOmÒʈ_Ο|_B^ iiT.od$T_Y;$`P;:W$ =_YNTYq3eWwMrҫLO{/EcA5_[Vۗ22Sg-ezf74q"on[7r=|?ke4דׁ͍6[%`x^wZ{ :4ɝξF} ̚|li8~[6n!ɼg%xGQ\)Hk6dEeecccñ4l9iT} X9..,4-⪢2}%f]O8Ξj6$J񬞸q^[YfjP.=_НOdcwnFX8( +OۥylܻwӤWF3puҦᗌT{iml)sF&w}{oUk;yWwMI\jϬ ?1u(H/৭ץUԁSKA毚e;D5ys=Mq\jEt2}#)0}?u;f`5.wW#/ؙÙ#I cB6 aGJUӣt}Z}|b'%57r {ܙIޓ{7HR 5*}'(Ҏn=kaLGn=@΋@ = GB}:@ ;%[~j4@ @ @ @ @ |jةqm7dTTTTTT +*ćD N| tj'}?_" =6\w|#BUסN0M1cGĞd\.:>nӄTa>+掷ê3c#DB6S5@b/LX#8XOMT vβɋXg  \6rpyWd w! 7k6eOnG.LL\$¡Jo>F[_E< p1QYz_O[֑;PMy͞ה%_>7Qk!=Cw emߎKі~iEnD6-hɰ[V7cՊkkfp8|pim1cZS@y V >!Cu:z4Mዻ9]aVWdbLMӬ=(&C(*JkX3ǘ>$>XeXY!{96wh4}(ϣ*a/c.-E~Gl'+G.#|N^ 1Q9{4mgC\!L:? E8_l+7 l.dhCndI|m~@_ 8F6sƕBn⛕uqj$Cblʬqb|/ٝ,.f7EjJ,ߦn(j97"`Ļj*W ǣ2eIMA΋olJto]gŇkXK'I ` w0zl `tgNfIk />+V_f+bW^KVuɛ d0ᅍ~kBcI\Ȋ7O&ww}4e\"q %*53Aķa ǹq4'vtuh~IQjzBAbtf>[/-FR㧵Fܝ {DF';+tC{(>m}] JkԺ#G'SAnLFa$ᐘԈjԽ\VF=$m q}b hpM,5$*?m[ mۇ -9m[Tad!|{j`~{1ߊ+C?8ZF˧(u1wrqQ_;=EnmKwG[Z?N+ٺ a<~YQQ杓!nvtvĹ[ZpB&5ÿ?,H˞$Wu>+8SMt*Y' gm8=x{3'1t4Fy9dqݦ4ceG1krsNC#tRM'En ~ [4Jn;g7dt,<-E)$7빯goLi :];_;A3ԙ{YjOi/^eT=z4\DO ;סui4^O Fp[%hfsrr%EN}a:j~om}#aƩ=V:_Wfa7m\,g4~ CTPY^|iXGw}sEOjtW>yFƷvپ$("M=YRZ{P~wIm~óؗU m]A^{|[u ny^˛#Rޘi\ۺȬV̩jKjeX(*]ctoKbhTq pAы*6@F8bWC5>UR_P ;Z}kCfdmkWymQ%qN{; ě[>Uڮ$?;51 (|E2x~˨ֹE|8pq,W;pQ wwڥE?SѱoΗ=10i*=˥U] νuxӒݻF>Lx_%}EU0#!.{΃Vz(7o 4v+ra#.(dR1T,T,&M>GdG{Czg7=_ǟ>eJhR%4Y*!_9M^ٮj{5R^r*xo:zZX]>r[#LT aCy}%zkh0_2K o=X  T".=m9d/']/'MV,-rqS@VӚ;\^u#/mL,U'GO"禅T-;K,"=}';Uؐ/8L_qwQPr";TnVwHtնqG?46.,hKRA10" {= %:UPDnTvۗ.'`ڀG+pKT_UaE51`5IgaC{*=sqd^)䈤ebH[$H=ƫWŵ]uoItDпZ߶Dq />bv=?ejG|۠_TRc[{]ޫYNQ,_е2y ~irQ W-f8C/|S c[CF8??јڰНQ,*ccU%H_Ptas-΂K\c$c-@ijbj,%LjLv b ɤ6B5A E=D5̗`4gкGCݯ|BдjRtLfUi2|yA^WT"ֵi|mXZYӴDYK̯@շ1*XҊrδa_Ӹq¨mᯅ>F ]2SHIn>/Ȫ$4Ԥhcm(aT&鵨/1 CׇcE¡rFn[]^ҵFZ7rnݖv86'_mL5l S!%|cb9g4GUrbDYTg[h:(_R83yrL0 >h\:cjbi?hU5䴸1wlm 'qL*F;^x6gRa~vj2c÷]̗*wԴq$6ʀ5W?(NT;3t8z$ia \h&qD7 p(sC C%{ -?= $TdW)`tޗ'+6}Xf˟L}03DB{LP9>a>oaѾw] |}got%KxOoF&p~ѭ}9 ȭG_MgHs՚㚾}pd߽U ~>˯)Nz1U祕˾9A\XUZjW4 IIjƤi˦IP_v3|sTXguYv"KRME`DqL9xƊPO 2L:ͨM 3 =3W^fu×]>|ߖܤw&@ĺg|a 9q;_b %7eL Ԭ 7OPm6ЕoD׳-uPN? W%DxRlqJPAON|]`ֲm TS)kK_D;B=a6.sz$dљ!ѡ`cFvë#gXuԭ\!1@fucKӯ~Z-C_)i޷?qɣˇNBq@ @ @ @ @ lөݞlψ(SN3xƔvسsX;cIX{7$ZxsM^?KdOs,׬Η];0bz_7Q=dg16n rD{\qkY.D{~Dp1%'Ug\9D 6 A VH왜b1~>p:e76]e4[hވKNՔeMsFK>>ѽ|K!8MC2b jKqyilm1 z?u}9aw^׼ Nm?o (={JIyrØ솣@{%зb)Vќ]M89h:c8n3b>PEz(1^.7Fa-+/r%+ZUqÄ6 %s5"6MrչwV>r;{ڡ_rd(jWi;ʍ'oȌמ_j8!O SzH4v7@!> BuFxE $eO+e4[!o=+*ʼs226͎@TE"֨uG~;FOT!>L<|dmqoFڣըg…cM0~t(߽t=Քᩳq/1ι!Ę;yB(| EAm@;&t "]RPݗN~^sHIÇ: 5zKg;j'j[;W ;Zߒ&/ sE\LT\*,/[+K;1%睋=&jWL:wu^7KNJLޅ`,Xﯝ.νuv]VΟA%e7#.{}YmI  @k` mD}^0}JEe4nO_,l3Cۘ  6 \*Oj21T-wU {Wkkvf:^q"`ѽ. Y?i՛4-7͵;y/q<֍-=McVju㴺;x;nd֐6ɱ@6iĨ9/ԤG^.V+k9pjjZm`?l~9ˮmXZo|(,ir4JbНQ(>\+cZ$J%3 h|wHA}\ ߊCeW5zhvݍ|w]KZ߭n]IXK0zIYƄadk jU;},qkjk6dEeecccñ4s IqqUQaY>oT;|~\yi k+Ҽ0-`_3-5;@EcǠ{G;L\`hV.Z4Rڊ0zqW;h'Qg1[YfjP.(ɿu#VVN|=؛y >΢;- Vzp1QzLR<6ݻiw +w+eC;lVYeAUX.^ñֵ4M3ugHG첗_C8&ΞsF3xT%W]#h赜t >Yƒd:ٿؼU*ؙÙ#I cBĪn=$-[U㶡>Ցi33dH&lv}iG[0&#M@T E,_Wʽ=LwݎXMflvh!@ tbucKӯ~Z-(E @ @ @ @ @ @1vfV~D2z*lyF6r~j'rDxϊ؈=) CԬ\6r1S7[. GzZR;yEzHkg2E:4jiGHvq=rd{["SXn]{D7m,Xsi;wy " o_`:ìkn\ Yi]2b^>~aF[rqPEzH̞3Wur~G5qǸ+pۤQ_rd(wV^ ]cte[PDבe\ ~Z7߉/fv q3k? *G}[1AP)bZwcD`3:e6u!iksxTYGSU]MmOx/a+b1 *bX /{^)ٺ a<~YQQ杓!nvt-"(xmɆEǽ kv+kG{h!zOh`H-^n ~ [:FF>y]И#ǷL}32/]Q]J7K2nn j13_8b\*Uh^@fV>  6 \՗פ VW)Ͻ/S:WzڛR;ɪGnY|JB- 8;a 9tL 㼠9qaA[ j%a p\.meֈ][S8Wy[`1HZZAAi}LWktSVzzڒ8AƖ 9t7)y]QXƜ`t KZZX+#*9c$G.1I풙FFLrK4,D5<^0AN=UΊC+%VYq3eWw׆ɕ:hCf/1VUƸjie.Oβ`5P,#PnHo5_O67fuuD NkoX[Tǔ5}iѝ}Ye_q&+.|-+fzYڱMmG8o<'.oVbCT*KO0)t?ݪ[Q3N0=J]ƽ{7Mz.6a}esҨ~=r8G]*|1`Ou"uѢJ=x̓u'/uoչ|7u ~ЄfkXbӀLD]O 4ȈQ#j+.GtU3r/o]cVb~nn=򂝙Q: L=0{.N%uޗ'+6}XRs3xف e߉iG[0&#M@T E,_W_YfkLl%i77Ge+kS#ΜM޻DR+-^5"46$NjEHؽzWbЙ,Q~''.\0k6oH^Ⱦ{|ܗ_SrbF ^nkŻ"xd@ @ @ @ @ @ @ @t(S`U1M sS Ta}]l2\kkTa>+掷ê3c#c7 QNsfjaRn weU(Io\Y#̴ .{r;ɻ\Q;2aUx!ATP/zxX01qu N+]s̑},u'W,G/_(Ki$~[xsM^?Ke0^QMy͞ה%_>7Q ysPh=g΁UW% -/.MG*Rs !=Cw J;}ѹ|bk}O2k~ԭd{&ԉxrMi_^(0ykG_nj]-Zq2pֶۃW7aI''^-eFKkEޯwxJg…:ÑjуѻO^4fxYIDAT:l^W~\1@q!Sg*t1V|4xtbnQvIo/&x?U( aQS( *x|i'փ+}{ ~tPv75-\lu{rfaSɼ_Nݻ^ޢM )Uw dUWUzď#^_>%! ^q"`ѽ. Y?i՛J ƺrxY}g":~g49S(:խG^.VXp1VPPhb=5FU}^0FU~Jĺ6 mXZQ3#Q>Y \+c4- %3Mq&E*x{m;U E6_#diV$ =_!$EEzdI{|Δ^5_˹su>bw[n Љ++*tc7K55j0&Y,J,%DwWi>$n{~i'{3_W>?.J@uLi^G^h֚]P _2ӡ=|k/N-Tސ0zqW;h'Qg1[YfjP.=_НOdcwnFX8(Bvf4w1džcKh6 EٹˋHt[vpa9nIW d.^5lVYN2ZTyp| ّFst610 U]&x^Wu#Q{6}'5NN6iGx ~5>Y.^ñ7:BC{o$^n &36|ŎAz;3t8z$ia \́QR= $TdWنUvtE_lc ?>rd>Dr^\!~Žuo IIjƤi˦IP_v3|sT=QffƑLp3+Jvt:P&B!u) te8{rĠ3yn_1HxmN\bE0zOض7X"W;67R#~:|סcIeI`2wE,%$8V3W^f @ }`9^w F#@̢kGLkr#@ Kˀ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ PR:ڠmG%_-tQ#ƱK%RӞ. M>Q;ی[Kzo~{eC0n$pkk7 ="Dž`F.W8n@-Kv?8^ߖ @2[x WxY܅e}6llR㸤4TqgK8sc3{8ԇ;ZN#аW_c6\Ad4NBs;eSgdJd>lD6va 1]^DLg?7gtǮ>x:<ĶyvmJn&?|N5}lWGlb5P+`ؙǶ/nE_:=ׇ}E5:a垐S&wgQMo=o%; ;vޏO Cg mp9cgÏo]՚|ԮOW=~ǭ8p*<-~)A5]ټhg\,jN!NOxl ߂9nğ_7f|CU8a|&s}|&,Y&~gv`>lRR7U3'~EMM8 zq 5q`W-v^4mC*-$+'YB^nf]xĴޣ~ڟ3Ĩ,{+2@+ϛ4ĉkOU.1+:<7"dyp{QԭD(nһGϿ- Q˔ *(?ƶէ(OWL񧎲g"3 ΅4>M{TyKq!JT/M/f|v ELqD_G'=ޢ (]+~!.)T`?Qu EnC0DF7O[F?DzIr#..~S?#~(ƥ+(F$ ?qXm(|% Hvh`͖ 6|@Ru5EZ5^Hr5gѬN^/K~bB阎48: ]j(eSq"ozI\Ic7+ +FT SB9+#E|hq)ff_+z eXn֎o_?z]8LCiZd Eq:HʲK厐g\,)P.nejBq^NdM~W2K9r?j*xuMzFDtx U(y1 dʭĹQRⱿ9 ɳ%|@0=W+xͶc/gexo8ڲe}q~Ԉdİۖ͂5NX/6l.fzTFd )d'zL\s .*4[ş$j+@DjI??(*wN yo>HYXȔ*\&cw_SD@ֳ%g$V$)n-į.#Aʉ]Y"hW!AQ!A3.wl8SWj9[{~E8(n$Σ$W^-iݠ^na@  *@6"$)*۶(Y MJPC>>YٰNJE2_|}F䬽،ۅUrΓJ=;Yk.o8Q<ژj`U8X6FK?Ղ*Pkm2x8` Sk=IQ^e]32#QՔ ok?&XVļx;Հچb wuK xw7G'>zhNyy_K*'O|训(H,QqGښmaHLjaS?χҚߕիJ8&Zj`d^ffWތ&ubal<|lgFb5%9VIpQy~^Z!#L .ZO \Nz4 xy.&v]O oG'Lqn}{OeaȒm6ӥbFsפݎ;Lkk¦ĉ¨;ɂ9 TFR8~CGW' N?|=K NS_- F n7g}AI=t$ T,V=:20?o]-{J 0mAi!_V]+lB^&ћ7{f8CһIPw1NOSD4NGve߶ <|7ײT4]T]t;]<ژI+3#Nl=[1 mH?l2xkض!&dOB4egټnxTٺO?'+}]U||Y Q~+ѧգF71&RO@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @4XQ-l2i"y/;|d~hKб&uՓJh-O^ =v1rRX W [&LClM7}r4׉^暘It$II;.Y\žr%ūs 9rMLm5Fi:kF_T x/Ҧl2=g-<ˑbm[JM/~Xs_{t@b*h *ˈ~x!|T`~W*S ~/ڼ*;t+RZ/IA~y7M?+h0EPM\Mو iR ;UDqqLk}ɡAU X&l{/Ks{?p)@o;u5,`@&(PcoTP.(膓iBy6ג@odhڹ8ДpBf_rv3!CpểkOJ-:9n"[Bn)5Y>`]A"ݺ>^җ~i)OS= ,&WPbthE۞T_~KЯdҳ印 ]ϕfP,AN@[=NJ~mז5!TdSjD@R]éNI˾.CL 2U21ZQP/W HOdrͪުӏSEl=?L9b)d$}|hN6Zc28$ܕtmRDXR*b>v#_A~5ڣ/s_Td$e$'Y5"TXQ_{uYE|2 6ͼ[GZ\Xd%=.IrA >&&3"Aljаʖ%?KoTug7m (WR])i`6 m'2 S܎/o>=dhi؂?/͢4$IAT$¢+U Q=L4f]1S]5ݿWV"0΃Z^3մf4:QhuT9uҹ 5Lr5.;<=Òoլ^ 0F5'ze+?82:$4z?dļzvۼ$!]RVTdw6ڞTp!sswowY׮Ϫ펢g>˨nҞ 2  @!_!Jq~P5ϑVWK %Y+kw$;g!{thgz+S]s&UVʞepiq*#S>REp01"s'5UQ'nBC;pCNfikWCo5 #=_\T+!YV;wtt{~z^+1g6lډa~uڣ7U jDZy=ghbر;I| FsT?Jd_LvkO*i-IU'+&ӴC[ I&z|%>r݋G}Tx"㗔 ),-'BS"nL&$2 4;} E]nM{vrM$_MڡųfAj (|v_-#M*${~BYxNc{Zujb]`pp4zjձyś*lo_J5?Q rx Т_"UbѳYLAvV'XU2^[ƤJUb_@q6Mƈ9iiݻѥ&mўiܪiݽ ]pWj #Zk]ݮɎ% .\pOx=uHM?:i,W^GqW>NI-,MLS&[rQ_ao|W+{_ dlk>sg֯~' wCF~`7½1]Myq%8fJ_A'lbj c<|y]}&:w[#"M^C,t9_O1a~zm($s?̺Ҩ I)\U֦XUtH-'c[McCD/+έjR?&Λ4N BDLUǗ8~x#Qnθ&󳢞M zLcEc歽^ȕ4sxs W?vS3F&qMm5j,Ѝ/:Nc-,9d`W'v+l:֣TQ#ƱK%RӞ. MI젙O_S )=yL&H^_6 TBﶏ8u1^D_S(.NR'lP)d 4NIp:Zmِ 8Ji"8b~E$ՑG7_.i٫c+ !^&%_>#?1gp؆ ٨1"Ƚ~{1A=x,1dj5Gk~!ֹ\ܤ3/|7sT&Hd٫̐Z8m@G56/<631ФaxP5VQ"[kfxE~o Ӥ2]EwZi*EV_~%ܿi"~+r2FHw˸c>rxI. w*bZv'Z,(z?doh$W =p,숳HSTr>­Ux~ȱkpӲsU7NTjӍ|98OŗUen=?^3e{;8>y 1` Ogr$9Ww%RbDa>k^VGvDqO^@P>IpriyZ{fŋ]1:Zո=;Х Ho@vb }.\D!L\{.IFm̘ͬK{⨨<:LgP%R4ٝY |O۱ħY= krE/+??Z%45rny>f#Ey|%\7g4iDW NBQ~v\HPRSzam 77lWd=!;t'7e:`҄ݧw`պ1>j(^֌J tP 1Ou9j'2OvTj>#MgMyˏƚ_6Ց1?I//:~mkpLuo޺/v::n]z@Pzj|s'gX>wּe/%|:~eSLҸנNFT~kk<j1zWxxxx_Lj1`S͓ oy84uƽF}ٺ8  [=~QjGJAM*TVՙR3@nɋEgt_gw۸~Pײc/,僦܄UyͫW}K6x0F&ʏzġmf9ĦGE鯯%а>)COjte()GuSs 3"/_JѰs4ԻJ=/'D/8Q rїh;9ICOjBiapҢȢm)z']nF%2`~PʓbsO'ۛS,E^HN~#HW7Ta@_K!q^+׹L=2Aꀩ5YjyXsHVM]=FLN4fψB봭.#IӷZp "fn_̒R{݀fN*ՊVQpQ lekOM$ixqm&^NdM~ǗlMݭ~\G8JIzUP GXƕZ4^ͮF?Xn֎o_?z]P+-_M+_Dũ\bOQSFT?g8&j$8.IB l4;h^E@}{yÕMR)j*8AÀ|NͲ+bVM=U+Ixйb^~v+Φ4ێYSI"AZ)m^~ 5P&QhO]T BOѩ?8pBR,9tWoq#cKo9NUۻh[ߪo8dۣfY@ 剘mu`ࢼլY_0 e :bI+#ԑ[B1Ѫ?l}aχL3BfhS(Ԗm(;jdP kFWάN,=/E/v/ɇ7՜$. @1lۚY]1Ʋ1* *l /\*/Z>mz:H\&E{cc'S)Ɓj`͢*$Y%m |cڐ܈zU2(\,0mU2_߿m[76  M40!p3K%겟o)J[tV(&xI_)O7LȒm6ӥbF_Zoߺ?>!:{˩]ێ}/^?-ߟ=8N-Z֙E JLqGښmaHDZ6)눉x8=j\9,}j?΃@q:8O ^X=E8ZS7btl:ٰe]w)ͯ6Nc,/^K{NfjC[?v\qy3s sNkЎ'{޽-R֯c}gߵC[;xzVrQ֭z۵46r?؊Pv;0i ': |$ , i*@lܩ!0E ?4*boFt06s>s^U7z`/| r \\-50~/[jHw+Cc/XԄeu?ļoofw2uO7MxW^_<dv  +_)LWnvѭuA7 S _$|(='Ms[o^+7l)TYEf}T4Zuﭚs(I(8i˶'coHJdY . 0<ż{OV +{^x=@IR5 5ٛ;Wl1ث4՝un籋G3IxefĉgEM)$^0G+%xП jBȚ-5Ç b'2eP/LAһ@ n_nj`q*wz(h.l`}9Y3:z譕 Z}{dM[G5W~ Z'F.@ ~;Qo64ztr)r @ @ @ Id)̯F*e(F]`Ba!O(p9_].ft2ɴ2sϮ+S{"R[34ײ|40I3+ O,VYnKC2|϶- *Nx~8q'h/Tf3eO_^e9j?n\p  /1;5B]pQOn%,ƀ ~>oUIrUUP'%h1z^+Xlg¡/w6{Ϙ?-"7= ',ni| ŚJ?cpu|8M-[E1e5e{r[la<+R`<_[֭Z33g[TGXtҥK.Y*Dq-q:Ԋi~%uY2YbB#5U@$E6mI :D73}m(wlVNw2M+i7ҸL- `j=ˌf?ŲRJpbr[x m v%?G,"'),By%m}L`qp8@+[>qIg U(Krf?XR߅`5~y^Ԟ\2_ׇT{Փፗɿl=qLv_Ƶ_Un8#{clk2_{k4=i_:8Be-U޵%кI5  䞈d-W#!F}]Z2_YI }u3'jX78iDFz1jm"vtƽ=/^{l7rۃ[Q-wwⲲ7ɯ~BܖjHKm-pfӕ(ۑIO~۬a12J(̴Dw;մK7Sv]ٵ ]brUhE|_?Q&KEOKvBV2̍"D!@֩A\ _iv{79Tw$e-*E5E.9~RҊʆQIn 028amx^DTYPhE{٤/vbڰۋ҄ ^ 2_$"6\jaT&TOVE&a4Gciz]Xݬ2xRI ?\H,lJ~N"-; HT *t,"p(ʵ ٰ_Z%Jyׁ-)I*W@aTAΈ$C!=4Sd&.#&[je/l Ѳżh`Qo{މ.$MǴp If HwMrUf (/|sw:GGʮWj"f4yc;3 ̑@&Ka}AZg7ј1vfoIo8&V{ ]lZ02bw"c2 '9Ru؃}4I g6W)WRInKsBsކ KS" (P$E(KLJƍ8q]U/ cZϲr_^\w|7{ި&ϥ\@  N= DW:H A @O3ͬھ/ mv!@ @ l䮰M~%qqhxxxxxHvlD= m!nFT,EfymgU?4i^U+̯>,bZ뷍z9>IR]~#{7a1(#8s(4: sPq<5ԫag⯣{5I+2teL531[YQOH&$244WD.1Wil%%8';Nی[Kz'ʟ.r8rUu2Y2K='N X)+\.4fx`y_z cm$' ))Y Yƴsv3pqnDPnԁֈN ȿǹ& $ݮfھ?}<tL G\>ycoeV~[PVN+~8UWhhnQ8?&ɪˬ4;ycx8Q|uUdIj~'m> &_7|S,E,gH.O0CfB,Lz8—$5Ўd",BY6͜e\1ngo0:50# ;GzMce&Ep] ;$uF4Zv @RT*~SB7ѧ5!5۰~Xƣ>IEYq\vsAThioP> '%qE¬8/ws Noc^/ls))lW[׿ɬn^6U'/)"m gHR_N&k\&b6hϸ2׿NtC4;oN)'9StmoKJ~M$ⷾ^He֬w,"V0Ͽ̗BνVksc=`w%w>kP~:.lp-[U%vش\f*Nfw|)zvД)Zyyyԏ/ŲT/RY4^ծKRRŲc_ړKDQ%")PMy_kؓO=}ڳfAM+oSR%"Uӄ-M*UEbeXn֎o_?z] āb`ci}Dz+rpR,jޞe _MrU_d͝mt=k]Fa}jfRYNDU5%8HE bFb*ӮԚ,ŦU_ҕ ˒+mI2 w|VcO/x`j?c-صt㫜J1˪1hY?_Bdꖲgq>Ϭw{-r%&/̋)d6k^t̾]b;9B\xNN=&.хn4[21?);A& rׁwLʣIG9U٤鱤N&kE=,~y}Vͳa띔jtR?٣")LWBC#YMxS, S#,̲8=T+(RwꜴ2CKcե|)Q;6N>9$K+doDI̭7(3ÿeb)P4GֳapnũP YTHOiV ߶F,zTc=bZpD&(Ql`mqpnDUqq{q7WFܹ'IzteUħWԆ /oDڻʍ͸]XMɕzvֺ]\^~V ^Nv3~<釙"ֳ~gWG:qeimmmͶ0cהԒ[X%Ey|)Q7qTSr*Ɇ-F" ҧkGiV|Z+_[G4_Xڝaf8&1,ҎJAScilx8ZɝSn*{?־i<EJol&OS,&;)U"bε,Q:lcLꊂV~{R)W_L0T8ћ7{f8Cһ]ZRxsT :/=RCl)ȗQ"c6f̈[Ϧ$R3m?| q^(@P Y*fh>,_B ~xd@ @ @|gYI E5|!DJLUǗ8~xRn8qClb`@*)zRr{U^LCV&: Ɔ$2/_^W[&k^>Z$BF #n sB I$=۶&8AǹBP XMa;6V$ ͔=AG zGC%"#R3g)P^IRyt,1|=浇BɬhVLVH .(&8d8f&Uƿ zk;- IDAT5CKywFIl}ѡJȕFYMl]S$JUV0YyTc,Q笆|cB",t"Y6db#A3g7++r2?~AK0HI 'xE~o Ӥ2]EwZijC_Lx.3rrKUa k -}}lID2Y2heٔ# ?vzeͶvkoO~pR϶??mEI^<8wk}q-H=0cAn IV@ sm{Ky ޱħI1}֋uXŶ ^/Q4iF!ID{VL3="\VT4g)jDuJ!1L;[\YȲ)kG G$%q7}}V[0Mg ZB^Ӷ',Jqι>>,"-ev*?2GR>qHJ"ݾy|!Ă @X-iitFu& y[>H4 mtZ.<0e@WUH=ly~] ]2;ٓOJTMi;Q$%y!GK#/=p@Rq7͔ iGNj`@nK*_"9VY_FeݾU R{݀f| {qHzZN9y{VffufhّrDgmಲ7!9zJ>h˒ƍ-]ZloIں]GM\cT&e,e 8$U{ەee@R]Frԧ@$N/C{xM?Gm 5*_'Jd|VS$=MtP>ybt'mXfq SgJ䣻kLd"I?)cx i1`ƛ7mMi]DžJXҪBL@S#F>~.U7*NW$˦AY8AY%u6`dR]RG4^)šͮdd .'bׁsHƲ1* 4=$=,2dnd52PlWB?|Jmsu,jDJx~~T6, HT LVP=,%ule#lǯ_ ʵ>h}]/aTYJ'Y%m ",ET.!GcS.[):=yd/^*H([Nuu"ƽ)8wԛ#q޾uwK$dC!=4Sd&.#&[IiY0>+1ܜ ıoryR}|=uB![^3Ѯh:Ʌu÷dc3-L/d6n=`ia95j2:"\<}۱N](ʮ{K{/T-_8{Ju7a?KλNng'ݕQQloGZ rB2A:P'v,Ya;sSԁ&q܈/;l쵬QU|FNtFmL>O{ɕj^|֝b\>K,Uތ&-[do#gd܈uO`' 'h,aۆ(n 7MEG|H> ^Y$E#مwpĨ_zAϢٰciY?oIP+ @ @ g}bt{Ã4P?mF$R >ݻMZqЦc/e1&pogLrS^\ K,Xr^MH mdL N?JmGPhnt1xkYL뷍z䳾?IJZĴ:N.PbIM xD,BH]gʹ}zx.A6~*Չ+i,()M8]=?rX{N}.΍jӍ:К;YG3-)KU"Lfx`yr| ?I&[jr 'e &}yKw_̞T9`3ց{nYbL{yb{~09/(t IեI82 x6kxUj~'m'JAYM0?M=JTD_ݵbHV (棶) I2x`5LziƊe6EVA?:QqV*O-50VRYŏ)Qndt[\.uQW H Zf\]ժ(}pvrX. _zoaInŃE"$jӵj0%&e[-$޼DnKVl9 Kj̈k@1c'ʑg ?ؗfZpsS?y3_+E1.^֌?7nD \\*Ъx g-?xV>tJ~%=`9N_z]=zjOƑA>sQ jtUN7;>-qUv׸ե{s{]b@EE^BDĊ󏱡h`1I5ǎ7RDA)Kҷ.HpqP~.3gΜ33ww=箟7+mϷ ID'ihcL& so"x9jiE&a>tAׂۇ~ {CV@]Yhݩ,Eqoq^ '`L_S&@eB3y> w; yr6ϗlxcH02j調nI=kܶ!q?K@qHQ8Xh|?(qX8,'+TЋ:(YW"c_&9usiPV#g%CY0]yOXxxxx!l^W5YMޮveyӾ˚ uZf&,ՋYl׶iD.KQQTtձLU NfzL(:[P*ee+5zq^tpXJ+Is_H;KɊ|ِL MG7!$z.kb#zfC=v\C'P(uX-I"g ѻg'IF훿JuX-mLۅNzzի,#afkeherɛe:[j):ZV}\Y\ ccNi 4wf1`9y| Yjq[]@*2_%;A鵋?,V c0>Tک~Xwש@j]:]X|:!tTNvFCm;d]kFW;HҮͰ|n&u&ވP˯M~;[2lW(  ƩȠ>F§U8;}ڮc ;ڇa\rsI;q)qU>SlK+o88xVRڞ{b^q[T]t}gggg'2?3C̜R))zW.G ¨stͣ!FIϲ2c!:rTx(A\m]L)Љofbl!Y, J|,V{)cJ`WȱzͰѽ<,Ui |VM<ۅfׇmmj~Fi!lK rkN~>i9d)5?Gof2m(1Y(r&KS.)mY =PV6NL οM@s/eiˉ4Wc85D5o1\Mg5XV:ϒ޲^ຌ[ĸbSbҥ8&hL]Bt4c{*Yq #ϲĽ_fi4YGd!xj0>yI=|M^@ycDYLsJLj@e|[5]AY햞f>KN\Kx|(ُLԘ,dIKagi 07Te]ſOpqɿW^?? ?c$ =wgKI%>+Jk,&V $ˎ$}}(_Q_)SBN~nQNΒ?fgh6_wِafV6]-&k?,hltK&3>)iʶm';oĐ%=lq5_9U',ǤА?31VW̝@۔eS=ԙg =gپX Kyhðe6aMӪY, ^qLE7v ڼhA؉c<>˷=1QgQY <:xAs4~IVlf^ʼnFĎX6{ƜOPݢO趛jn³̙xnY ~:av^uY_mbfZ8&h&|ok2@-K4>KcQd5% c|]-qtؑۯғ^pkr=丄g1\+N" H?72aд\'4^`On0 :ESKIj9}s:lc'Zo?Ӳ{ꭰeW/z7dioM*¶ Y??<{;ޙu1SZ},;2i _-BhøO%HZH&}A\rzHkc Gde´{п WxUb*{Mj᤼ ௿j$z >AM|ik2&ҕ,Ee基vI ebIRF2XܦL/r zoWݩZʅI0Ik!tu0aA˗Iֺi?ׇQpOmrJؚ[6zl1 ,S;|[vq> ۶C]UOkPB☴jb;Ern?elM&i;1YkMkVO( ʛjY ( )$PśhQarʞ\0_R,DtM_&&]Wc@ O3x*:쪋ϪYe]Qunm|VERc>K(b^!yN Y&>Kc3/J0\K*> .KcH+.cX7#*hNf^EYilY0@F~4Ȣnܭ1nŊEp]L*SnOVv'9PW[.x#R~՛0N- 9R]$ݬ[_'-^Ez;[2ySYT0̼饽UXu5z'W3,]Yd5N{<^U*;ٗ\HotʠXR8&hldOMEa ̝P|.>=tZ#in%io|7Dԝ?ND0 տUk^ $\>!{/{>?~^Pt%|Ġ~9'Iѓ/z' KcO]+ .x"NȱCO?;84N4Y`yZJg)0Y(Ӿf'.U(s)@1rM#+nM׼-Ty>|͝g1hٯf:CHjBۥ}l,nm&=,M;RuEJir_r{2t+J8u-⌘,\&R,c+(JY_+0@HEqw-VR3⳰4'j YX0> 䓏 *Y̓8S9 >ZHlWIz5`$?3PdiKSj!z,c?eky<5|zf :&/lKIs&r3!D:˼;XqA݇4YM} }Xިϱp:7Sg&~(?|}G/-~-}]k⒓$,7f>:氇"~.,.g!VV_nh m%vԟj0S~YcH'MͰd Epp[K5t(d%Uw>j*=~;3qs#H*ts#$$u?J2#}|o^N')9^mNb޾l3~z[cUX'M6C{E\ww+}&JR[vX65#xw V:*42숩J n{c8e5>E-?=ώl=z#dߖWkѮ ۼgCZ817šs%f b xGZ(J_o <%ޯ1GڅԬ IDATghY-ll%eϚ U"|Àeo^2"i6=X&!V C ]=(/^_ AϔD#Yug78v }(w^5S2ޝP0H;C}CQS H]u"m>iE,RQ8%Rp627BFjߞ⁔A~duvHv~xf֢wբ0> R?΁fp:Z"0G?ejZ vqiNZi&Cߦ}\Հj-,E{+tyqFlƏ`ٝo[MكUхe3)}G:y59(a _փУ_Gكc|0P,gU}D4k1S4) ʔúKc/E3zL ʷ9sͰѽ<,IԦUJ`(V5Rf!Ff5+1Sdmw6tZ7.x?݉pFgK!)*>3]H ^{{ 7#tSM 0do<^c?:`*}՘6r}L24xҍcWWwr&]G_Cg98 &ؽHRx> BJJ!wTY`1f ńYXaքYXoXX$`|V ga}P"C éOWسLWsR-\hW40qToWK2'?ϩf᳚P>i0ʼnITHR'y5 SF5BwigΑ\~l8 ZF kEǗy*PI{f|ծoYDzm~}Ra$>0%ƿOFeKH&r\쭦ΪqOS,\$UVt}O @JĠWU=y%iWŶy}өr AP/ݞVϢ_>a0iV]RyLl5Q4%,Qį1 ? ƴX7)~CIr=k^s]H)ٷpՏS9Uwq}݉Ly[?''qw=ө\#n'.~ۂMwEj5N`Y2r/gZk(,-HMNdjK62~_h);ZMV޿2|Y.Mte$K!Pw'5,1[NRטV}EKR>~ToT 㳪6u~?Mz\~)Hu{GKV^ uaž.Kޤ$'[[swą}=ׁ Zd$&$5ܱb??*RF>0oG(М2ZgLに߲8Iݛ9Tո*.),NReGE>>dd6#L.K^e!+3%.*e Rc?[>assȕ}ㆴ.ԃո”' =ΖE/}o8-;3GTw{Mr1),4dvpߏfjUs.?6eTO=Bm gv =gپX Ky>06wٿ+M<{j|փ-WuNУ]/ѨuM\5k ]}<ˬY4l>ݭ\xW7im֣T+k࡛^ݸwt:ر)N.Zz5bha\n;«K ː1600p2 ⭥w'cN+C,["tKWUUUᒖ?)\FDm͖uV2aTy{S*i\W-;[\"3 9zNyr p/%X]_kF-rwnaȵp?-8}֢yy?W7u]ςGbʑVϚf r'+w.ZCzw;M"8@wӯObŤHqJl ETF>器 H=q|gѨ1*\WH@}v:_gc}mΆt T ^;F\y;>_cOӢs7s %%iXIN{ן4 L㚺Nۆ]SJxo}͠>vW_Xs *Q)F1έSJ{hnij|*Y>F]bRw-@?N>̒{{k;۔EGCڃYx+9r?Q{ڞ:߶IJޝ<ݳ@瓁3;RR)Y9$m>E8V,=Ӡ! _nvQKf”5qvbʐ ja]4gUzZ6+~ ʁزسjE|EL Y$/НkഥlK,b(*yY[-X=ΰt}g}R*z!=.\z0|rDŽed*r$+w\MrL4R_>=N}gudiO@kIoJC\.S$۔2Bǜoc[_-fIҮo*?;7qD#IoDp&L_ĶiyAeҕ圈'FOG;E%2QTqXqhF[/llg]PpYQo]hE؝4c~wv%Ҵ_Y(1/,Fu.&( 4urB0̭"qsLJr/(W;)Kމ0t6bb_ӥ`zgJVN@&&m{KY":Ӿ U,JQKI_G]Y3($[ʠօϢ_"c˫miO<;?? ڙL&I9.n^ؼ\9>5o> Y>5ފkWbĝ#oыYR}.bEWN=;h_@H0Ks~ҢgW6/=Yq煥J?$;sVYZ+iٺ]m30> 5H,msz:^B,,VOn,ak)>M,,,,,,,,,,,,,,,,,,,,,TDYJ˼;XqA݇I%qUH}Մ)zp{9Rf3أ]\}Y1Bz&̦̚FYXX@:A`}λ G9 ^q9(1JIu\B6_.uh]a!s/>FhWe{=Nc x %HS?6cK5A_ےc|{NP#-C~qZ/.)1JIqU;t^r)6Ssd_3˵mqUZ,.9iN\r]akcl#JhJ5-j>i5CWӜ}['^}ѧEr t>v旾$#ܶ-V OT9h)'*jdEɳߤe#_s%b#I]ـ̈́uj]]J̑r}R9"<.ƫbBApxlަ6FI^}jtAsmbP$A͓ R(qU`odI0,)pU}BGZ;T"=@_ƜW%kmt4Wi8ĊHNacE%f>/z'Acڏ@`Й>vH 7v=$PbV-RR9yDT5hWm{6L4\G&\n܆q[2j򲬈{ksD/my@Tby1<Yz@b4Q¢4bZ i{Kk,, m㭰.j%D,,,,,,,,,,,,,,,,,,,,,,,,Y4>Qam;iAn&<*(_%{BdiZZ*6NL οM@/e[ a|ևw_,K.ݰsU߰0J5yA𢢴%́Bgֆb{*Yq #ϲĽ_fI[J|ʙ"I B xk0>֙N`=d}j/AjY S#Ca ɦ^BR&$!I*e$)ȁeq[23|UwD$p[rGXNYI3N9PbT VaLtJ{wTfg_ڶ)**n~f=ٚHM"[O_ eM}&G}$IB@ʞ\0_R,5.rMfv5e_ sTKE'm<,Ûv ʴBF m{ƺ|'&CusEee٣|i_o *'4URTgfddddddUԌ خϫۅ sDyQSH)(&6Ii}BW2(d+8:, 9dKCut&&QP x\|,d(ѬBzhb< E]x+ҜDQb@ymSnK3RhA5K8/z*y^IuCnmVZJ|VSjEu㍦>6||v^]NC-T9Q#ON>Diլc}w`ai\XZf5V+'ga<V=Lma~pGym6Wv|#LNGv1*sb)gQV ,':~1ع-Gc*44> euwA {~L!wNqYtV&:>nyS?OmzN&E΂CR,jS`|z{aԥ-T(@qYLs]dd[p{ˢU7s]- bxAJͣz~F-eV3c{cb6jltR/4^[-&gR.>ǔDb|z{@2nt9Ooih|Ֆ!8-_‹R\Ys%oRKTJ+g6z!fwKbZ e4gV:~ziϨyCbo2nVv=zRay^YLujތGNes IDATr\eGE}2;1G5K:1pLO`e{j/SgoI.EW0 tzGWM|V!+3%qj0g h.ω"9H2#}|o^N')9QkJz6Ǘ64-} Vۗm/_OxkL IJiCCfU~nB]ݳbKE-?=ώl%ziړqbn :9J\Uo~+յvhW@wsKfn29wYi~]@E+MUs^_ ~T𬅢fD;ud =׳Gn'3d<^D%$äGDlYg7$x-+L'|۩O},U1i۞#Yd?֝axرtϯQq͸bv^uщjpU'oIY^;< w7:~ChefXazn:W^ OG R=Hv5WNSb[?j5͌R15=;>K[GD]]2R+oC.hjӲ{s r( +J+dtq0aAAY/oԸ-G . n`P"=u4mOMels"AWrNewP\yT]]Ǵ=W|,-b0|zzK1B1{pQu=۶C]Ya|VPJ*`2a8b~7nD{EÅGI{_z9цתI*Uq+>4pE8,Y?нk^I\Pm^|V]0> agld 8\ǁWK?P|V ` RVbbCp,]A^$k¼^ !p[tqajۅjK= }]S`5(3&4@@z|cTpc#IʡIx K:ɏ EG!wTYn(Ȳ"Fn8uϥy+jn Odi-(Js䭴2voq;}Qyr'ҶCjưMì؟l]خNۭ;V?=~1r^O~dN,,V2aOͰ[Fp {'zֆP;Gö4g 7B,>4!dZ߰mDŠ$^UB.i{Y_8 4nK(7MpN?{Ʌ&>N5ߛO> _>&o~t-ۯQr -94BiBYӯ\P^b.|Y4G%%DpX n* >x^Swژ/y1)~CIr=k^s]os:Aap~Ayy*B_gmRM᪐x% agvuyfhvNw|mj"EawȥYջL <=75 ^*T^:m\_sו$u{H{ Z)ļ$+H b_Ke6͞Vcp=~;3q\)L"AeGE>>ddT#bKo{*JJU"4KQ+gz Dy*e Rsr$w;rrh{`& Eú\Uy 4"do;y'.0JCeJ|cRXhпI+]~ mʲzfX2{β}vN}am|WN0yi[8&jG^`?{{ځegY %@uzuꔸ+ϕo# mY8w,U⭺]`sZ8ܞ1 uy۞wm/u?ioȜfkPDMzt sOs'.T(}43FgS ]=(O^s bSeGFQ[eݚvYugn<5l+1-~ɢsC8I̿DR&[vݷ*uS]|VciѨ_T85~L<~%ǖ?)\+*|dEL8ՄSQ*|73e{>Yp|?E$d:w1ϐ$T9jDO+VLj._Da?LXsЭjVg/bY >&BljtQ9oy^;F.r2>AY_jW0B(0MbvIv1kzl)Ԃw|fp[ Ena mtCQP~c!1PEe$IHdJI$r`qYVG. oB=ѵ漄(?ݳ@瓁3hog)* ˀgSŏtܻ󠬠z 3aT[Im2o>w;/_mw|fq[~A?lb#zfC=v\ySjP(o(T{x+]:HzK4^rIw^B#+N$U ҷtX?ix'%YdYzÒ_7=L4B}g1S_!UZAd^hb}ygjCQថ% 0PVd{i`ogjaaWÛ=:vҞj$צl74{_X:Щ6WKhlZDᕐq=dūETv4 &y'jeqXʪH)7y<0YjP'(T{Qx+4^M P;om޵kj~$Ϗ:O FtPY_O]q,Q_ΤKAs?"JGmZW>˦ŖE9zYtGgQ=}d,+*#1PH< o4^BNs~CNT;56/sQ+:F߬:1/waaa*a{)|g Vk=a,,VO0 Y]\{պ-"xmա߈Y׾c0W>tO,y{gW/+5N ,rS۲ {4:&a>2 z՚ íLu"}8r ߬CB ; $}YM,rS),{Zg3ui  }%Yqob|%_P:%1lطiޡږKȌx#ڟ9\)|V$-HMNV@2nt9Oo:a ` ?VC:Dp5ٷNy߷}Z$WgE Nfʀ0[pPc~@׋s!KSx1, U%Fc LuE\"cU]|Vb>&ڴ}g MY 1g;T,&]EBcPB&|D-:PԘs0eE^le~0gPC~# *ٲ,?ؾWqO\dxՈզ=5S2"Y3]+>G]|VT:%j U%IVt= e͗ɏ Tas-1+ՍCbu)G"8ѯ3ssR"Ϝ~iŪ1riEދ C;*?-:qa vTyFES>Ӱ %yg|VlڸB$OR@3l 1\(LzExVs!J@)pLj#^5-Rb ;djEm|0ZKs$XڶG7t$Atkvr!XD"Whx{$j|VDmoY/3kbRD$=|T8\uA>9՚s1EU/s*3"9Ӌd@J+զ3 ,6uۥVZk#g\{%L*S%֜^Y@eô/z'd~g>7%,Di߅7}g1]tMfys)@1H{ksD/my@Ҵs.^HQĭYQ]  BbP"\Ҡ>4iŴ1l0+&.քj j)|ƄYXX$> >z|lmX(1-7mIjDQc `qw~p:7O;s8ڞ|X-b-hW@a(,YqX4q[j X2zW8Z;8/$+|?/$;x\9è\c mLk-P&@hⶐP.V Ka?tR{oj_|K)A˹`'[d)NɤnK˸*N&|l,8,ڸ-r'4ZLj:]$cFt4gSr*{t>G?ŝԩn N$ge{ Q.e#Jw(!Mm\bs׳x5 ;z/%;n3HqBOu٠cnZ< Ç];풑:Xy# Mv̬E[=ɇYrx}o?oox6OnK˸* 쒌ΛaOgi~ u\/$a0>ix(D_j)*Kd-ԵeO)H$2I6ezEccw/NݟraR0LZ]LX/c?exnZaS[y\)m\ Fd._R 8G/|\(*yY|B&*'3=&׎5g*Ϫ]C Z᳚:_(zX-b Dv$I]T=۹@ ]"Bt M_&&]WƅîF7e(BApxl,H*d*'f>ˣwWiɎeuz:W .-ۣU%U ujlRƺ|'Wj]Qo?/XkZ qP(YnZo1Mʥ> |TaԞIsWkK*|U.1{aǩ̼8JX0@F~4Ȣnܭ1nŪJdNúN2L>fA6%ȅqOr z}lcudP#|HҮͰ|n&u&ވdeUgddmiUL3i3}SW7ョIboTN;^psqgmUX2A7;j\kt V=Kxg{OC#KwivV i0wOu;ag{⢕Y5a5ӗkT/? Yf?_Bz!AVNݍiua^_ t `L7NZnp8íV YCe&n<,RE n͞Ok d'q,>]22!N" *(gl@iyIDATv@%tggty}ը[QҶ~E "Q- WsD@}Kj, 0 fxԋkJW!+?=Z`Ӣ]uU#Ĵ:{ٜnsl@Ev زaX1˨\2q E5/ ΈF?墎gb4?BtԻ$1{W?:B!$W "a7İ_ܷO$s +\,RY9u;OL}t PNΈHT9Ygi6~$Lb8]) QEvzjq!a7&wCUePKcF_:B@le?p8`k|jDch㖏JV pgMlBh1Bee2z+w#RgW{MtFjR9}x@8w$;sup_鰚 i)!q딚nnjfd{^E"_Uz+b~{/cypuD/ ^wLVo?yr:!NDs戮]E:g5,o~8r{n$[FKtXM1D5ek]?#(AتT@xh96(~V۫[O^ۥ'ҿW75Gg _K!(3/(텧"_e*V$۫[O^'餹!|JQ^?8g![$neBGHZߤeՈ1?:!>xdE}Jo&jFITƯ|EsWʯUz+'L›]D:TD9jo}x@d̯':+Dݒ)Փ]6Y-`QRc\E|HZU>B2 1z+XuFg:Vv@\7iu!0BՀym %Ȓ!G"J|Z8{bȔf|B|LKSM.H-!>늕q4_l` @w>Awi372xTǏ smLXL̠;ٙUS[7{kγ9| '!MSN/GDOeFgΛh_HMwd 5`ŒߍrNɯ^3xyJF]͸Y!9߭j~A]XD$Xŋisk9nz*B)tO%5 {SӍչt\c%_9O?_n\$lEϜ6rOUzV/a#I+J"L*4Hu?SlafG% `גt3"UjTaٗU6^l9.^0Z@ݫL ޫřTtiըS'$_4juUk>x(G|ݓ@KRi1VĚ, W(|v ^wFv\48jIdߢ^@NǩM,4R>9ݖf*-qBMM V*4YjZQzgH'LƗɓ*?mHʼnJ9]Uǔ\IDҴJ6S4YR[% ʹܰ@d1l'|/8w=wq8ڰ&JqS<ʺ$*֘NtTB?u[yw]ܸbqJګnr:fګs-v!r3@饆[j^AԷr1wjϡ7lj(~]U蒈ƨNAѭ/0!(~˗F|c O-S~YyJi2 :%MmtOxs$6IGub,B^{U%Shbڤ:բ֮u]`}>3ed5ǐ8'[ANAX&,-wI9x7=VG;>gޣ7}f!w}}8c ;9;5蹜lMéKW>+glA\Za7 kcd2tl֬OWps vw2pnO{?s`'+;π6iηlUtqX_F/4ZqVZg=Ïp9`)Һ*!ۢ\=3_B-*]Igt M+Κ | 2:J?ګl7@x;H?+° }zD~f>fK vy]b¶!〶v&resƺq0~ṟ=*uhP2/}CQ~&xH<~GyZiu/b~;ta={#xܹ\+vΰ_WӪx;4,Y>x~պ6Ptug"soQ;GYTC6@4C0ۏwn<`_ݧ0$S̴4mYKJ_<󩇅"! 5aJi/zڻjBfwڊœݻ=9DH'vN i/ E!$.yRfo;湤:&*i՛4dĶIɞq竉M:m\7tlg8W7ݟPg<ΰ)D3=57}ʗ">}a!Ȱ3Dž?ޓ] 55垯m6a`U4$3yzNc ] {ބ3lɿ&G\]d#G^0q6p2وG nxt]ͺf4Y!ӵkFIy{Y)qe7X)ק#З_f%Ş:j=c+BŒ+y. ? <3!~xl\F^3'#:Uk4x*@0u=VE4bYM4Y)j:KBܩ+ʹ]ޒ..*"R kROF7[c1#$1t0~G\& 18ݱ !$O. Np֖U#6Ǡ*x fҎ{VGYک"Ԡ/> !$|u7V,_٣5gReH*%faH~$t͍g]`+Ebd2^%HJ#:fWZTnD!y첷gGBv&NGWai/z ZРϒ57tZ$ɏ|,~gK\#t6RJt3VeUdRٺ,Djfg&28\_DH'xb3,Mko1q^MṊLaU>xH/5AzQ.}P~_b dmu4qʙnHZ/m@>w'VA$|i0t ƴ8Xq619:oXErޭ:WTǣ,!tm]NO|󛥁qkNptO~Kx|*/vW]pb҇UY`N"})(y(H8xgw/񎅺Q[ƘkwnN}Z 3pNzӑmޡSwsL N?rrNmj2(n(M>爵o> Y:0iGm |/4rYahՍV*_]]#hn$eQξVk`g<3:d),gI g'պơW5>K)g=K1' 2Wf?{ !Q= YBg@~W{{}!R-^S"U.^<+E RjZi؃eR-g P2}44(l7-}YdMYa3~>鿬ۖXŲvkx0AZ&8nmkkqo̰ ˇ!a3[t_~;^ZɩFŰ^zck6fEc@Fxgf@M'ZApYt3Yq’w/"nм]zN:}?%/럋'b/S2pg|lX+H'T"Uh>b}@J "n?s,pjg'&,K[c:ӹSWLUH%̈xg 󴖿y֫Hϓ_WTNk5j5If^ñ];@:,uU<=,*iNU|]PUAfwO>0QYD{FK?sڤrX7V]vBŰا֍3N>}7o04`Šjӟ^8cÏk]:G*#+8ȯ˴pRe?F63NYjvgs܄/Ց/Y }How#~Z"4P?u)quΜ1ڮپ ZW0]6t %Lyk:d}+=#w䩎GVѓe/=ujS9T_ qѢ wxH09dD=->x;G04FkQQ*џϝ0ڝ*7 riB̘Է8&6NgtI)c7O{v'o8|)S>ӇޓEjь{}wVjm ?N0f;aN'9^SN:ޭU2v)|$r2u|{17k_dOXo_9)7d [tBV08"ܞ*~7Љpo *K `@+y7^+#)t>>I9IENDB`glances-1.7.3/docs/_build/html/_images/screenshot-wide.png000066400000000000000000006273111225327237200235240ustar00rootroot00000000000000PNG  IHDR,ZtsBITOtEXtSoftwareShutterc IDATxg@Ik6sFA$fPE=SCgD & N0,sD %mX@TQ~C]NMWO4@ @ ۆzDdaOۣ\5-tFOp SC6s{ԺϏ. d2'v5&#A  Si57%fg~Ԭ%ʛ,);C-e:wGK#bvo AaW/K}%"0E <{xL`BgUL"].4"ߣZjR$Ywy;_49ӬY1s6 MIa nu (NbSc~]̵~ᛛG{R(.ݶ&RNffj6eJCyō8S?itԦ!qq0YcՈ"VQu$! fHL7NN&I^Bv 2j{@~T1‹+4qo`YVlQm>k]mvLWezTȐƵZMQo0ƕM /I۸,_a|u}rlFD4%…Qi/9{5֥Kz5P & #?jSXA'E@6Lo>eY @$-Hڽgmҧ {S<g|l˜6M_`)Y^; I}P,/~։<]ePoZht!p|1WnQmA 9sMI\ɼ"D +W=&k'! o9)Ch}Eg;i7ʪvTl= Qf?t݅%dncfxuԡJJHDM53)gNվhq,T o"O@ O7{I0E!'ѣ*Wt;2<K~1i<{U8Yc컒jg! y3˴m_IF6mL=3aPoӐ'd7} B.勁rm _TTeT֘4qwB9$Mۮ%^}+ܛGblx.23r`\t9ܫL:ﲩzC ZG@,kٕ nh}v&?Z}5@sslQI匤suvR}cLRC$vYɩ\u c:u5u4:L:k%s{q4EvO)HoOn\ϿOͿf7afD53J~|;'븸2o zGӉԳ*!*ndY㴞xY7@,B۱! è]U%<~~ J'I*J8/Y4vbj3z<Dy5/` +):{0CR.qV6AoN" ZY`F҆WVJp!_ d:MIJmYbm䤩~+Ncm=.K#5gZ%jcΉa@}KC],g|zgIޥ \tY6]J/݋/ɸ\]ke٥B)R7|,wkV5EA#hv../Qi+[cuJP0pqMħsGv*w_zm4iL-Tnf@S*SsIYZkge]p3RX蟮Nq\NT!'rqG HvJׂzX fgt ,6 ʾ hB= $%G$GvOVgv| \e|7F*lw7nFy=MVfUBFj6X:ŭo*Kyl0hUq{Ь)Jt0 ?wMIQw^~5PR^$4 0P R Qny A&6›ץV-|{8H-|z{3e̴&9#lF=ԺAzr;@CֽC;j<"yiVyoLrL<;1Sx=SjY%qAkş?x#*ogyk+=4@Ī ߯ۦӠ=u &_関ͨ+TZlIe5E-j{PE G*!9'?hYr,eE*1NY̭MuhELXbE<hdL6Rl\cO=Nf0F9 ZZ 6aَ~;W)Ϯ \&h+j&)(+iT+XTÑxAűg7튷iQ(|F+\ uSjs#3:T*( 2TTg(%999999żZc4`C?vS44u)@j!k!WT#/^~jb{+MJ E*& Y&D5UU6y0`=$ 3KXeҹzpHR+oړf7ׯJnimh߹**XH{qNN ڦZod vt! 4jgo6m,zkGLͪ6tdccB_ƻˤrߕwu4aD͈s٘Qw;= Ldփ4MLM TMTQYvܢ_-oN{Wa+ۢ72'362C/,!q_NNna70(̺shԴLvX7\O=l.f~֕XMaеMkiF&*?2?h ,i$ėEJ'r43q1 U|FGVoTG^V4655551Ҡb_g N;6OyxbIFZ]\Deۜ.3}t016d</B_Kא6yicy6'm~=mjgq=Lt Г|Mz8qE.˫ɥ4T(XCzp;]ש|a6j֭GGv^ ğ<,ҩ֛$[ @4h9HYmԚ1iZ`: __شv[OBvQS.my%QWm|Ffݸ.ۘ<>rwCmr=Tq!+{+5!ؼe FР@TЈ܋N4pss}auzo"\޲ַ$ϞdUsx>mX ssYl@eHh'd F-Y7gUErz@m7w֪8c¯;bQT er&Af'mX0 X)ww9*h>c'M:qkU g?ۻ9 7<fd@ DK)N^OdF\<ޘ$@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ DwݖӉd į aH.jo 59dT8A@i.^ 1ft!WE8^uU @X9Kozؼ~+c f/u)M^W^Gg.Z7W>u1MvںUO҈&]Zm)0Y|cCQ v׫Jx#l3$s}xcyh"H+]gfZv֌meBtntX*Gb#\ 2_{-<>DIj߰:31tE ~$i ϳMq٫g1>^'UFWS.['K\PPgob=A͝ zyPq-K(j귆j9yA dmmرǚ@t?ÖPykK7n^9]#bICTއtkCz W8\ڨ6nC͊bF{[T˙BBR?܍:fN+Jo8+'&#]v]r;xnG .c]^n7{~7"xZ{ ڝZ}}v$7{Kv ^jsĿ69q"rqxS7_f^:s7cnQasg?,luHsU:[)c `?B'MBTā-a˗qݨŋ|X{3q޾=&#Z5`Y,ã'>+l/=0 e᩷eEqǖ{c .IL*;}N!/دثt2λŠ'dS-#uiO-”MJf@t4N@3 @Px%rx".K#n&ԃэ{BCl0(M%fFXxvjՉYy WMGwsϤ2u"ʎf^?)1c׾f<6?^?|)1 Q&jq?-H z!dlSBUb\$h[(հJc}8p^/OV k8 >@q7ZZxٸg &~:/ɽrk3RS}=Z/Q:iY7qq%Э&M0{=hm\Nlf K~b 6}1Q&dyvow.cԼ H^6"V=#ޭeұ')Ousv2#ScVmA{ɧ$ HmgP54.f_?ͦ&! *gj;3c}+tc(։x9#*I-02^Q ?*NaQYk2E@Ұl`8^#*3[Zʑ4Tt 0P j5gBuW]6U8o /I:o{gR!}0:Xk\qYF*bg#l8CT53g_]) jP)H| Xq0Vd%ߖkNÏm #(إߥhTPd߯#-Tq4M 6YoO<+<#0u gfb^#{_/? ܰ!Pfޢ+Niv5F}Qm1'3LzvoVGKtg_ξrMT|_U^.|{Z1y'cse?w,5?4MLM TMTov,c$ėEJ'r43q1 U|횧bJ{"ހ+ǩ>hljjjjbA>,휽?yXCxJWȧY O|)w~K$^΍'nd97U2%6rwmv^uȋf[}2^/<䍃\$6ǐ *xyVENɈY6cODK|Yc+_ڶÓ9 Wϥ iPԅ'9|3c6{aLs|:@vo '"<:~gB?V'zvt nxsIR^+D;VDƕ⋚9WuщUOv93e_K=ʖ>)ڙ@ @ ;21O @ JB@ @ @ q?_"e!@ r@˱@ JB~%0hϕ 檁|kA b2L&sVfCH?3ݐ~oͭm5@?x Sk7J}ROU~hpEAT#`.y[L:NX$_xZ,l^|;,YjX;?*5<Š~u߉v)w=Hi'_ݏDmImoRsR_;}QsvljiVܠͽl<6wy^r=c~=*ьR"HϺˤMyOٻU|Dgԡ|x7/ΐt_ Ռ~ٔ+ LmPq'+tC4`9~:O5\(b%ߌ:#TjƬQT\=#1ȘK!{Kl|pJG$>J-Ne]v䎃?vJ ^HR 0L.T!{SQk%q b6J:M\Xt"+۔ Quvdոq%j-'~l`ȂaҲ]>g9|/MAgbY/eO *f4O:{[(WDjٶ$mT#t mK6,ew_\SMF)K~젓" ?3['! ׵;=\p*W Rн^E >{T6J2'g2dncfxuԡJJHT 7BP&bٺ+b"]Uܲ2ޏ-FWʌפtc'P׽d= p[;D2MB&JAC #Sa`E4%A*S0:Jp]cx-!޾{Ku@ Z|iXLbIhJ%ݎ zƒ4V{ˀ6ŗνA]3>8Uؔaǥ8Av $Pf^pbP4F i^tݙ39kf a~Q[_ʼj)t0N(e8SsJ:ϼk 5{ٴ2}f#if GmLq&V d=ٳJ*_{=:(%O?xQmS^yN_.̠gd yJ6wU֑sgo9\|[_>oeLQ9 ?=S!(w^nůGd{nVi(*c`T aGQ'/b\3zO Qe(*O2--1gVǤuGE`?";!k?oxݧxY6ƅDKǸj?7PHC-xK,5IaU0VVQqN4",޹GJu[e^_V|GdvDYčX ?l;^_{[ո ^g*oߗIg dNl✓~_e6N\|` IZ]HŤœm0@W۹o 2y~jc &˒=o8}p"O;U"P lccYSu(nDZ&6*VΦ20CK AFuSy?K`{<^/ ylK=e^|-Lsd[L~S ٽik$HEbY\"4 жvvF ?mBTSKߤ 3)Lv 7 SnGOCTg^pE$vkͻn c.:JD-> vPPT1$bF9WEQ?54\r{Qi&з]7;?>pUf{sҔ6nC͊bF{[T˙o]Mlj.qVrAAAlby ΅Sgmx8|ٖ%C^\sUحu$IKKL)e~.F ClR1-嶞<~xIW W8\#L3ssRH:|}~QGМ 0ᘻs ӟ;fa"EYOy2UH:#9k ybL&mڼczu(nǟ&#yWel`f3Ljt5 >xpDаb#x^/r_(2on#FGg?ڷ?]v4I})CF ~[i8 3o-uKW)o_ܻ_ nf@S*SɊ\E"l'ᦧLz]({x>L8A=r)|W2HP\^ܩHd PtVOg4s>3gVms- ~|R b btvU)oK>77a.)ct#^cz)P2[}q|1 QIQݬFL#)}eaqyd8.1<{ԒG,)PdꤨC)O87?@+oS0K(~V'-?xWr&'4Aփܥ?Z8 [7".DqtoWe~ Mhz::/H+#5IxY#/jsx);%?(60ء.}(ߎm%;#IB0y)u^/ IAߠkGb| ҼK(`b̠'] spJpZX'1Tl^Y$"1HʄS@"ݢBiv΍Rڂ{KMľ]>"7 9PU]@rbTT^y͏v_lJ{tt; x~N}݌K4jZUUU`gv1S`~2£/n5)hAkr*E ecXkR^$n 0P +2 "Qy~Vw}:ly 2;[(&Z^obS(}܌JK\_~m 4Qa޿[B_ڧ;@EB'*A%++@ Zl'뮌g}&bҵwx=Lbև\n'S&2Dla@ 8MS2H-`KAP`l6R @ yuTU¶hk& )$ RlXRQP^ٗ?d&UPZzZ奖)ZXi~B~/?rNaQZkHYN9ܤ[N(&]7}ʒ S&sd-/jWrDM;/a2LnN|ʁkw;U"!w؄>F'g5SR>Ai(RMO<`q;Z=S"z  ByGZk鴱w҆- ʾ}#S}0;cc!=rooX {aEH("wh&&*did*YE7w륖uW|u^Fϩ ީE'|'[O/ͩ&J )\6fNOB&0~X .zf}m7䖗V:u F5r?Hqp~2KݱRUM)0BQӆv436ۉnb9ܤ)cg ΨSgm"qF?r%'t{e>l8&~wW S0΍,8>C7֧0K5V]qN|Sk"Mܞ<?K ĵ~tRɥb}ȭ>,휽?yX$dݽ[d\Ncg*&DY\]^w~o,Hylh-x|dSLp^r䊍i^s{2@T4[N(~ws4a`֩|O$nQvv_aCϐJrى%qYuzhzȞS(hMVm{OrK%,;#} 는@ @ȁL@ @ P@ @ P@ @ ջ}MӅ?'ˣQu?O+3_$@ @$WÚmYۣ\5Z'-]n淴/Qk-zǮmc6CãL&3ך㈟: iR' I^#l<虮6hAw,iT[ u%ÇgkYdI\ Kْs͌}@.L*ˆf:ݶ2& IDAT22:#ZFe&9ǡ3%V6 8J@RQgohwLѨܑaqco`ID7]askx؇׳ץ@!{Gt|tHQx֊* L{ph7~l(of(=HigO> 0d$|S/3p UBśeKyW&؟Ts)~QG$;Q yqs2Ew˦GsEq{zY4gt]mE OS社=iޫ9Ey᪁oUI"/F8`AC[Ќ1Bnt' G ?'!$=,;'xdlNn_']Y0 {s=S^sslQIqn9~|1E] ͼ!EV#q#lfR ={V7$7{%ͬCN3cER4g e0K9"A}: EգsS>%2 )JQH1YbK)fۣqt? rK .d^;Wh=G䋁D$ ܘBdUYnZ epo^WpN֊$?aBNBDP[ՏipxoKF-PMQF^sDA^c" m~N ₯/kHlpUX bp߁+5:HO`2kH[ZF^e02,΍- ̏NV-_BOs7.ػClRgϢry8 #07V؅.,Ev'W6_=7;}N+c8*! " QkiK: fwQK|?5GpFL|pmN:o N)eUo99i%$kmY<11dA˴8PtYdW-QƝ|`gtX3US?8~XMPRp`ڷ1$uMY$by^W L`?bӗCպ5Ӭq>g$>%k Tqsʎ~}2tT2,eG!QT7y|*7Pu Rz_ !=~jP6I"өp"vjnrW~'6S$A!|u"'㏮#yWC+Bl8""V $2?nd%#m)KY2D2UO>?/PT?gO?Kб}*Xzz:& LSV^o>)f4[@ :bs羰ݲ{) \~@~w?mʸ~:$:Y"w|6_ Y׺J[K= EV=ޜQblOQR&2c]nrᳯ֍ZG@ԂجV\,̦N5zwKdV{Z DK^]uD\blVM.I|aSod = pՅӯ0;-U'HZQ!.M\@qqp1L/A,!YӸgbQ"1'S~ubfVK/Yˣ_/кtľo[)I;J1Ъ~i9)^Yqq+1TEѕ43;:Tqj)`=x1R~hR_vm|S'=?ŰcS~eBf:;Lhˢ_vZz ߃ҌwÂvklo@XE/qZs ),L+6O> 1z 8"~bJI\fI\fI|nt7*[-\hT];}~5"6Z/jWoh r^WޖE4ŶZY|Z`dDcs3Y.d֢ɢG_ToB#dqUo2S(߭__Gf6]4ֈ '¼gmh}'&Šh,6C|v$ Vm~X:)$J 1$ YZHh%AU#8kݧ:]MMElI =ݔehBږ/qEv@պ m F=`b60\G83S*/)?uc=L2f}H`:L>5ma')i_I[S&H+AzW7 c北15',]|ˉF | )9c_l߯jAa6 B^zWn#1x߄gbIcsc%\BAڹ Yy|ccΞu:bc/w%(=&ڱo1L@OSMT }A]ji}EMعՃV6Apy8u~OX J3vMRq) >VҿQ?GBӹ6Q՛~}TL5 .dd^x*W ¢6?X`N:t>5^!혥t"ݘhٿckNH{:;?90sÍyHįM iE] >a @ w;e{'iGO @ @ DȺz @ @; A a!  @  BHx`BTgM";$44444$=22bѴ`T>ΆyK!{qtHm~J_<@ ~Pq#!ܨ\&OY2m"V0O4}4O~/t.γ&;t3Օ'~ S+-2r_m/ꗩw1]tב!1ͬn/v1E!"Svde; fu?);hYr5JªgLJw9PDe鏏m=Djy3Ւ% I,.10)]Ry77IDJ^/iafb;"kܮqΫMV`TLhH y' i~`NΥ/1@֛{^ˮ紩d'F'zp~$aԎ9#H:G=xjQޞK;#DӖ{d^n _)U3#}|͢pTkF JQҞ_6RALY?8‘MlT*k2 0qIo2 +1.Z9'yҁ>g,3VǖPԌzX*R*ѡ茘e m sB,}Ö>ibrervvaL&aGG!IVW:Z!^DT~SO?q_Z<?{!^NX`v|lq]j5ks%aֿboc'L7eX7u(!\@NI WԾMu_pXp4HT~k߼b8BN*,oI?EVu-G;qyY ׌Rӧ;7ُ"댘?('hQ&]T,{>O g. :0v\a~d[<<2I[*N?^rjӻҘuF%~-տ<;VF#ѥ"x&3Ebr.l$>m0DnsC}#jvÚe`4Sol[så^G Ykƀ.LZTW톅T4ֺ?s` w}o5nj_ʫfM[^f-u?{a9ʠc_0@Ppwbs ܉tBAf Z0JNV7e\yn6_aUZz$(,<ˊD"LHd@Zސ&8U,LK}]]'{X0uzLR~_¤ z$p:wޕV -@ip!_\"Nm!]&&i[烈zbSe"hr/]dU`,K:D~ ;:џпFt?.3bP1_#)~ծ1b:'. I*F-۶oBD}]]u6vb$W׉3$Ouֿ9QlwV--wǣW_{%$ۂ^-@ :M 09![.E0y!@_ͦ',]6>H@~ȅ٪buhI);4BD(&?|xpÃ@7v%ͥ#>Ks= !WI(Y:cZ3R~ IDAT/fFF,n#NX_ZS*ƤjLBE M+">ͬCN3cER4͛If:>Α< /(Hj픏a&HRhZlv@i.0YF%U.i:[e-g@qx3IUrP]* Nص{&@M_֎(F_Z%i55̸}Q'tn/R8v.cpcER4ָYG~JpxoK d+hخV򗯹+&: 2D|(CpGg}yBPr6.?{a[rFJį^ڌ@H IwԆm>4$UH韢7a [z#_*!)`oxUnJ΃d-h)sZK 0/y^8 9ŅP)Mn~7C֜J(1ĮXFKR Df_ jmI) 6}CDyBB~Dž|M畋p~4 K9%?x/D&.}>YRI}J8F0X@qXeH0 ȿu|:wg5,?)nb笨=+dl\tX9'!~0{O~ 'Y")vI9ٮblxi6D~0rNQ04ُtEp$ʚbخ?*w}tuG@/ ja^DaxҊq@AX׸H7@q^#?[\ tEȣ+#PY2Xj_ԗ-ws[zh!1sN>ax^C49 8+@kgEN}L&.M ɸyi8t\qg2)]H?N?/%U2kVT Ks@YZ⛽!dE^fEd24`.T5TS=4HP,df9hf}%2\@\y}_S Zُ`tz)t5:t~NmCvVK.Z\}vr2XEǑ? ^ X>^ ﳅ4aIO/O1h[q 1509)*l'I\\))K)K)gqem)hWf䪯@SiT7s} d)2Ab:?]|MsSKdLT^`dDcs3Y.dV%oG~:tY TBε+p8 ob^]ʗ6M*}.(èv?DNaZLPӿl/?Q-ɳ,A3킗.ֻ@ :LޏcJȚ\6o^N[vpw]eEY WĄ=9c\o u]P&ĴFl8|x0-`>~P1cΚ2)!?.UDaBH$ H"ApUꃈ* 5tLqTlο1)=Cmy2&kX&c꼉msa~_ (YYzetRSeWRC 詀̓,iK}_q V^{MSJ??/3<?{T7]M)v䧱Z0yh&1ÄMX:m~n#) ZwU&FutCOWxU!+ !/.E^RWkrO1w5«/w ^KHGl8|;|4_VN$? ק ߜ%_ ^*ʸ˗konG `k pa.@ي_٫9oO;9<@d`(yծKv;`~glE] (eƾZnܯ1o$,י_t14w_Aӈo/0Iz q~ "Nkٿd 0{p`VõO4^Έ8Woَ"@ 5#q!]NFuhOb7nDAA̝=G51HKʤG9YFAQʫS^ ̾mh[ge_g|K+̹1}0yL'^,ʲ'Yl*/n@nv]bfie v“#Kqx8G9?Xۤ09z׿njB|DG呶?>#} 愴׭#O##h2@ @A@ mANTw Gf@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  q4 2߀=nmNʿ}YyGF^*NM[!5u׶#I69j4Ag]VF%mS;?eeiIdMby-J7׹Q)ݽaQŢv xs%lc}O.5*SOT~١ayҪʋykOvePOc5:*/_ $TzO?uX7u* 9@ІQ~ϵVZbr_m/̈́s/9< A4~ZD$< = Ftwm [ٳ%ӆ(b)7[L1y_7p[/ F3l GGŕߣONNwWLî-JG 3q"gsi{BRE^ [܂?25B=1IJ^}ǗN0|h,@/;f>T2 ?buYԧ'e4Mt8oyH_R:QeVI[ki{6,2W)3j?ymLZу'>E)G̻x{渇~TJv,iF+>4O cdmrsNu+GKX "ge1uNϱ(su"]+tol# ;۷лϣ{LK?Țb4?.o/ ˳n+s3hbV& 1hracFZ5)"@3W_sdEɏVZy)h\8`¶;:APD[{ V||q|>zZ^HcIJ'kwe}t* B@P4EVٟ"x!f疇ܮMu^mv݋'+uӕԭ%j>|{g_ 㤳ψ@>BI5zp^tȡ;}id7{H]̋L>l4U;c+h&VZxE.]z n\?C/.qֻLɀ k\ʴΜ'r~IA} DD)NHDe""VxTmOgv>aYm6!N+-YuH_[͊-6T¡d5{SZ\akt{n_4Gr:'rDW;z:O6t6) |3Mc%M٭Nڶ3l=!2*q%0JKjgÎtׁG;Xޟ{,Ww+je,x_ O<H&՞˗kNw\x#WsI;l8/On8PxeCvzNUW}gKxĐٵiD9M06&-v#kC2 %SkC:ϳ@2]߸~>*\3MMIV3'Ĝ߶z[dH4%_uZ4)M8废33qodN /Y*FNʗlfaBNBDA7*1Dd$Rdqf͋gaIf1" JkO .H).,fDTƲgqNNZ Z[D0 *5e-nx)K sF |4z$h37dU->YB9T=(|SUy)"ЌϜlY KV!+8*!.E@$޷34–=7L}9yT? lA+(AT% L[Oim@x=Vm&`EH cJ`݀ ޼u66p|КU67 .S4;`ɾ{R "e2R}ݶM}pfH3B\@zKpnRV=[v;e՘6oMwPyz82$e=۾^4u_gh\qxt*/kB/$:k=<Scm &\X%hZ0:a`ͥKi+~zWeVAF*Lfrkoķ!lG (ܩt F b5F`ϯs+(Uyte$*(X8_^@~KL ph5W__B9)bQm}EfF7;~-YkfqsΖi Owws/ɂn{"#`>|;^]MY\ J/////z"M,Ynpt/ĉwC4!#<:@a tӑ);}w\XM&h}R*=qF?ӥ/jd]Ns0WWV5`.S^ | IDAToZ/Q?ۛ gOަ4J-Qgh0Y<HJou$4,0YՙL=CCCC]e*&1]Ď}/0uA?g[@Pt =ݘ{L7qM7S>.^:L>37sY%Jl0bN?e1DLwI=-O+녨wւCXw56?&M&/'d;,+bW1YKLkcd{ ݞNKS=%!`>~P1cΚ2p(U#8S55LbɋxPVX*tXiJS&#"&q$*PW=̥kꑛv?kQ[N)Uo$77.,c/mxixZ16$ץl3=VEvPպ2 0@?ivbRO[=)d9a;<}.JdOqVhw6R"j(7H~;j2/ 7pBįs+ Լ8g?J2_< fRbF[&[9Oу[G*3d _g2EJwq=zw-&\۴hjKO-}8cVF;Q"kwI{B"!ҡ7xLx2$IbVtoe)b|IT<ՙ]qOǯ\~-tp+=׬Auy0 F~R8u4y?}(@$:a0x5)e.:D˸ԼIK9S@NzzdԺPJs˿yqk:h q;yA,<(bD>x.M!Lٿ}J/s.`{̗2Khb^%eңL#(թAz廝&Y5mvW:J/p œ6С&we)Yp[;+y5 +Kyxp&?WS6Gս8_ XG#z %ۭu]Az ]]xV'>ZN:Wsޞ9rݣԉȞDK[-! D,ͤs3?`_Ca0z灃+Ҩr I|T7@4:ڡH+ڍ)2Ջ)RVKQ%#tϭ<s$s;H @ @ @ @ OCPvvv8m2EU8Yʏ@ @|O4b4-Y~cCC/p ORQe׎Х`.c}|hhĦ@ m_fGy{:r/YO[S{9 Rݓ2 E^F<$y.9M/ώ_zچ]w&}յ ˷=$ pTm MK/?@ 7 B0KG#y9IC.iUof7)ԈwTcEh));ꁊ"H++YwȤU/~(Ł *GUbƠXu5rL!ꢬؔ҆ ^xp.N֊qW(?@ 7 BHJFRNCCCCCC/XbJQi:x0rNQ^xBNqaREt­A8`I/Νz#:B恱ԋr-f\b"vjn/%=>KLB2G @.0 D'=|[>qŕ@W<2@̎E_l/&m:qu5I@-ဨYR$Ҝ20P&ʞ"㽶cv(K0W!^F@ SX" kCwob#Z d&$e_iI8 bQsem@S px׏.9{vEKD%Cu) j 쌢v{3T G @A^|q 4uMlFZfRa)c)M!IM20?`1JOr gMG_$!7LVxu6SF@W3<?{T7]M)v䧱+r9AU9lkn u'>X" OIh˓1)]ZP/@ !hBUmwj{1ՙ0;EOy481[;+y5 +Kyxp_#! թ K6I){vѱ$?2v1wy// lW͛ip @ }A]ji}n78HpÁu;,zG @ @ @ @ @ @ @ @ @ @ ;$44444$=2BT^gM"*?@ $nNwWLƀic{Opg%K~A“!Y<f?eɴ!&XiàQcc.>]\ׯQqv͎{UFUq6QOs sb_>/ l /߹ sh焢ՋJ<)Iuܾ4k~0#sl/VͳCc e1.B*¬nˋwA'ǧ6~8Gw_Ի%ٚisϟjY8JY91W=x[|b4nv/ Fɤ4ޟ-ȍZ6ml 0vfIϟdtvbVӫm5[4 ɸB}pCNKQ2=. @dȸvLI76Q`5hKfޏxi)|!ew>ٵK!Gbuۯڲd~qEoLj(3]3j^rhlOQ!7^ԏcٻM2}ڿXΑG,[i~4);af֜6P'xĒVʓfOZzXrܾt[OȪ Qӭ\IVSPww_|ϛco}@yIG]Q~c=_TߖK f6K&,EdѾw24ǵ.˺6_XDWz% ^Oqc \teשaޭ]gB2woY| 8Fw $yUNz_ѪM?=q)668@[(1`jd޷JL\ևfi?/:|io2+?q~h@}z}+rHc_њ8|S,sX6±a#}sv4~e'4F6(DGנ)i'5UsGEn,=:s.}޹}]k^l%fc9+?P.p4*Jx.SP f=ēҶ ]bt!`׿v1;Iɜ\km5ArR !8ʼnN-]EUfnc?9IϰcG\r$짏"tʢBV%mx9uĶ񫯿Zd(SaZyPdB. Bu֬qsZznﲬG8NYP$ \{?[/ iRZz6q@eg߼EVҫlz6;G>bCqāNڬ,."Y3Eb+b(kX ۆYz3b"@g_U7MY-2&qFW}sC*"g* UoŜy)N֭Y߇5KE9ԋB&!44 Yrjʺr`uk=JHz{z\A ʱ2ߍ-n힮Ҋs4mo+^! Ah)dI xOK+51DpAY7-qZ?3_ÁNN^m춾}:]?\X8b4m1UsHztmآ_`dwU*7q مK|fXCgk(g*H>cS_@h^ ͊ QA_$EImG,+Te!K@ZsGҭF![tbہoȠŻ6U>iI76oܼEl)"0 ]Œ}ƂO~+m5X^! -Oi]nU7ɗl|Jבc_!+10 g8PZIБ@ */13%&D_4(׉0@ PF7 R#0yt{$>B*L;w~_B2t`5?7۽jz!ͱ=PvƤLB=0\C}l) D{4vM\\d۸ _pi:W-Wv`X2Ck,g/ټSO:XtK 6Zq : ŝ,? d-jz~KɳGjV-墠 Όr|ךW\ᔻSN\<%̗զ|ۭ}7:8^ִUeAT!1?Qn۱K˪V]b iuG$= ddccd-hvm kQy}F^f,\ V^ c6+{LW~\\tdVI^}Ny=sAf67m;ۉ!j^@[=Bna~xj̉92#ɉ =}}]G;nu={v~W0Ps/CE??b UH{lfW1ߑͦF}k?s'\Ih`UiMgwؘ7]CAUG6u.2 (͓W4> V6aդmѭʯjVh{!͆=|}9:yN~ õ5s;zI q?]N:~Í#|z7n@Cs{Xls፼šy$ ,'.'?'$0TCaӫq%)O6ɥE]p{yJzմw= hې&:=WW?rz| %=9 R߰^DrLG^q֮g3oUvWej2=N+J0жOk$Rzz̐!-:wvK96VOڹ@(so>?A*S*y=c9:},;f=?_&tXcL|8W8li1t .NdcuR~gS9+z+'{h0|`VKnSZ(V;lv<9{`yNʯW(9<# |0nK=.%19Pc5w7KۡW" A!RrʹGkHAAA  ]׸i @vi25            8-Wg7@A7B#|臁 ٥CjnȾpX'0ؐ˸򟟮YGx'6=Zw97e?0WiJf ɔgBlZˮegQ*/܍:.%$&yp_NGKh}_|PdRspBOxT~83VHCM"2r* w} ԆԣV}ƎkC3+۰|.!SK3P܇z䡂u - IDAT'v雖eE-_@7?b`G.n>ˁҪ?䁱=:8C=Rqn'F}Bd\ݵ{ͥ:ܝ7Xn=ݩF3밄砵? r7s)c6hFJm򲤶~x֔?_ˏ`ㇵkag~>G' ^ڳqB3A!RkdYv [%-g譵$i>HM*yCٶz7 w{4Y.)T.#|& kV77Ǚ\PwRm\31WNdH1mQk2UAEasp]!!,AK'/X5 m.A.楻S s?[=z*%1;2,.mGNkR:{o+m¾XyӃ}&m0qاau7oDkQv@^N^ͯr".%p _eL۾ߟV$^ZB JGDH02Lc 776Ԯ:F=ӜWsf/83 5s!)ϵۚ g=l7g1GE3`. }K_]~W.(K&ɉeCei"Fssw ۯԋ,ҿ ZX&p+$Asl@P*r;/z)1#ri箘INYgی-K4n8h{S?(8V5pӫirL=x0_e]8D53Lxl`m\o@E#5 >K$sm_LHf!A.ڇqL3~2؈D|Frg:0iuik{@Z}QuXi4)5 kYEl$?=c')~);gThGV#1$wnS/|<è1A/:$/#=P> d1*xAiJmV@A.\lv 72~-AÀ&@c_tŹ~7[g6ݨ' (>K*PQn|,&2{;:%wo;W+>rUΉ0?=o^毚S9ᴎw3ضy9?Yaz6ÉlkP`l,G !^yrK\^-qm|o Yٍ]L ;VMi@Ak4Ƣ\1VÃ[:T6TwۡazAZ @ʂhȐ|\Bh&FRp|Ӧ>vgԪ4n).ZiJԵ?:z U}.wgSgvf'.6T?\" S&!7mS+~\cx;X.'s]'_ρڵ ]АDlWOxDzim2(\tj\<ۤ)WwїτpJe3)hrO}p rIIn p.{%ژ~4 z{U)N%ۼ&?(jUhˊ {v]L1EA]A!R}IR?Er`NWB <:Ȏ(j1eKH`.qÓg *7ʂ¢՗密B')$  KI_%dI٠$(2}@,pz}4(rmNS$40:eS܏N7I>Sxi< f5}[Aκc I}ɡ)s|~piKlΎU ήE1qp_ڔЧa?\ثA6U3T7̒3Չj|̼wW` ;| ΍W*!mOzgF``-*kRI?(LeR44:Sk>5nGQI /oZ6xv;iVX  BMV1\+L'}[ksƚLV[,#k5Hp 0Ɗ iVKW^/}43(^eeTV:eI_lCcx_SA%uJ1|Y?zm?k eTK6-`\JUu{PM]C]|$y $I«&GdS]"C+skVoQ tٖcl:QH]HwpR-ZL%(HC$:\/xȢ͞m$]ez,Z u~1coJ޲Dj?1pZ9Fd% K¨`6q&7rbR}Zՠy_}$] R Mm+mgdgeI/ް@ua'2i<[[[>,,۱leb96'M۹ KSB'>h:Btۼyk@Q~+'g**bX bj EܥKq ETtT(cpYx)$1&탕k" 7;!i{MDLCr(C\Xv޶Dݸ< i~.^Yדp@)@[ vty|c[o)E46"{.=0[kVW`2 h6l<"Uc}W6⪗Hqp,֬|C}:u$}C t'D)M[B:i_]!rGʬ7o \3(} 7o jA$-aρ$k/2f?HC+Mwڔ3kk~y Hw6{0ѝ_I|ʬˑ)+嘲^~>ٻK\:`%JPS@I- 4:n}=& FKhW_}YSQ&enu/icZӧykm"0p/G'S{oCȟ>,{ԧ^ɦ; _+"(m  AAaNԐ`*?1D>ٟp,ʼn &I II^z<";_p|\דHqT&U9'+ǣm׬0A"0ϻ*{ VO,Pߕg[T}].~"lFÁVsgL&n=?Pϲ1ƔCyϐzhw#}CܭbŸ__1QO!|w L_ޥ,⩿[ ~qtoiN3>9veYY0]imۉtN(OzWa&\nEN̟{ wزxs=_;n)ؓN_՟ fyҵM+kL}MAAw<+ӎ:plf\yۢ"Z L ruVps;t2[v/n'FkAНw4֧3[;bpF55夙i6"bjt4/Jt'A!^1vb 21Ck4]1K3 k8RGQ3              ? ㆌx#KGQE|U/0OaΝ[VORӸAU[~_5_mY B! o{'Wؑ8)CB8.$(}y\pgOZH2$]8 0O[b2$-Zcc^ vq!߳0$$ם۹)CBNpkZOS tī/<@t/P";d>k  UVcJ;O<倹rQ?61 l&xiAK uO;r:G: iޝИ͙9YT`7^vN#!Zez`lL0^ !HB]m\2'&S(}1dJ1-Tuob% )܃c1C}SdєiVlN5uTU]/vapR3;ڊY  HAӳkoZ4kc+ hU|7ii+P˺qLC)_| EdWJ(ʤHSk;x9IQ2ŽeCZR7Z( >D0a4((ia\R|ZF~ۓ2Wg5OMm<-kĮg!!ʐ_( ,O;P󵠐"~tƝ n׶(;ԋq`1+BB!~^+*'EV4z|hC$Fݔްhܙni!!ʐ'^Οp 0_[_eHHsٝFʐ,Vk]&T,*wC@i&{]"÷ sۧe䝧(ʹjs56*FgeItnm}SuisQfJzj8z~@Lϓ$d ][A RRߏ YiF`F&'K?? ;W e9~ fvrI?_)kcX :pK'_l7eCM&LZ9H%;h٦MzXC"WMxFYl`Kf1v ʐF9 z3a3G1wB5ǿxx_x2MOq~1+Fݙ~{_ ys7c{OR̎ hOjU:fV홐]9~1krs]@Qz Li`bPJ鼎`d ^QUM0{V:/dr\0ӐeHy1sg`>YO Třu;GnBQwuSސI/Rչ>gؼH.7kIУ R||7yz|X#؂a@>?|Usn²CTN8G="?ٳɿߡ&0iTHuE #Chr WuݞgMy<0k:TĠ\F4^BSpE˒E-Vyv'l˻2}}*IJ)Ub\ `t~HeٺO=rPxuJiS]zM Lr':#/J{ <3y2  UᎌX$3] +N~Xc~?s̙3g~h݁EV Fgľ<]/^AЧۈ7wgG UrĐ}/h|tY:ukgp pكK0ǘH H`4!Lӡ\#uQ$QJi~@U蘟y *ɧ 3?Y,bA S-2BtT\Q|@XHBCKf :e{b6w漲Q ln Fc隩qŢ@)83aRp&4pV7`ɴPSmz t`ͫ" RE Cܓ}/ڹT??OuFDytF^Oqx?7=ϥf0>߹ fߌw/W`CmAJ`qtiд'}8_(10x?pb4~Q=}{6,z.# K\7)={پ @d@tr6Fj*\Kϐ f!wYCCXMF *M6ײ>#O)_=AKkHxfvA7UE5zů>d*>C0lyOc%Gc}>V1֗~|zb/wYI `}rݹ( AA!S߭:@& hϺӯ)0&QyݿgG:"ng̞>#~M2ӷ :H',ϐbZ/C˾;4U7ySP4Pݗr'9F-ӒI%((|PZtAU~2A3lm' YC@aKZ)O==jaY˩s["3f<- Syb6ȓ^~g}7 o_JêOGAABpP4d?d=Ǖk{w?aGKێ>*ЙO$N]|*']{0ݹ}(ySEnUGQ-CM,ew]y{^  U(|':!tOWћ huwL,$9Q,[7ٷ{J+*NYTZݻ[)!OnSAA BH]Hwp㠯p3:z0_bX2XpXWlnBBxoLZc7fͷBG;+AAzmھKM6n\ Y^ Zk$Y t`?29[gJ۱,(2VAA>(} 7o jA$-aρ$Cڅh:I<>"Z)͓W4> V6aդmѭVYrbVc>C6%Ԛlj>G]r$2~K4R8tb  H(A(Ow8>]#17X̅ O5^]>3,( .n)J-(!:ݼϰhNtNDkuqYg9h~mY{(D?Ƶ v覔'){rEEYOH:!  o zf}urQ  -5   (AAA!   (AAA!   (AAA_263vT_Y~؆sz7a{${f;U>C>#P.G^%R{} u\8"dp'NY$ZnkvM gL+}0?7?joQeۿ .7y7K]<ٯ4ŢΊ=w87BR&uUY_\m+ۮO/7I__WQ4qG ua&$_[ܔDR܇z䡂u 'v雖MNljQEWw㞼ͩ < ϞuXBc5sE9ih_I;,yJ/ W2SyX0AdeJw/#=Lʌk.0Y9v +?VMsGs1^{̷sWf=ϩ֛Σwamo^OM/ ^QI&}s_F35? r7s)c6vܩ&/޲JT҆ITSbh{hnq =EݦjݵΟ,wXh+M׼oՓ|Нz03k'-fUؕQC-Н HAwВ%K;VnM3C[ iYG f?D̅/zqA){d`x9]81Kc*6idGK˷Mܠ}q|t2om0q(ez2>ܴtoܬDɧ-q. t c߲ zR/+ߎJ{UNe4ci6R/-ks[o2\Z: hPS)楻S s?[=JG 6aO-2oވq??02D.B]TuhZ 6|w\fw?^s[QϨVu+'6V=:{ۗQGk۞ )=طԽH/baDqsk*n0nE[f]0I؅cre/( ߻cޫlg*a],=9QO)yvٺK>jiʉ~2Hx2_Is5<+1 3bE 2ӵ $9=;ЉqYAf:FCRWU%ە,%y?^ŗj{u]rb e }j@'P$EE^g XD֓,>|<è1v/ChY*>J (B#HNH~.nX-!FIh`DIN2S}~˖Y6t:^~8oBW!Y4W}JM_YnM vFd%5u `{E2$7W\qY4aQQ_hlcޫ(. 7㇏|8#DR\5{zòSuFwn@ޮn1ؕhD`T=i^?v}2$}2̇L^iq! s4g={u.-! 8oY;O+nh&Fr(uvm]Hau9STxGD8u?}O\eTl.]ڝc@ڟu?T~g(cū oqy!<ýE}`j Ydz_Waõ /Ǵ w/6eµ%j>2Kve(JfEze̼xt Nxv;$܍O/AʦmpP4o{DnJ۶GǺҶ ]bt!`׿v1;Iɜ\tNkf!+O9}/ cn| OHRA?Xznz]߉֥IǴtg&QCɚ- nm_ZYB_v18mn"Jfd%ܾ|Qmi<-_/C5 Yk9(aΥ @ ۧ"P ծFTUǽ~wϜwo>^ !Jޭ׌`n{N yrcO\u^k׶ Z wTP%ds5sd .%Ve|Yl&5]LyO k}m 1eR(9j-5jr}.\Q..7bwtRb=">>_LTI܏ ó &v[_Et@ PV~RtlྭԹp_":Nn3OFV'[G9E?gԾֺyIlbX}8 Q^TQ^Snq@ԑ-W9?4Y1\bv" K3wͦ7o3rQf{AjK2T^ 2 YܮE0b:C$EEz3=>0hb{rm 0dK%<6}}Ij&_7.V:+"dy yJŹ/Ca|;{6`1[Ȃ"3AS t607^,Eq1 ƍ݋>łxSRm|=Zo2ȥZg+iYi $yE/GؔY!hVنp&A4fRtۼyk@Q~+'gHq[΢t)Nac~ceoO`\@qJ;Sou.Qij룰GIM $/3====3Ge2s33rյ^jVf64\ 6I^.feitҧW^f,^qڇS(J}H]A)Y\5p!eʪP& n륾nYf͚5b x]c:|t捡\M3<%9dH[0f<'OmFo{/1룩~p%9N"/*D#fVV:u Ӡs~c]Isɗ38ӉubWJT%t=\ĕ >ƢL\%9Uw&dhY>(??vSkGƘ &ܮJ6ahSZlPci@a8b1@c:J)7iAD+ʂ+kYZT\ ZW앵 TvRB B( ϧ.9sgy朙3H#Mv`)}-XӢhWA1?龛vo)igMg}aX `h= T<>  sn%v}Z!`}B._eR -%'VIbi>m  w@}v}bYw0`: =Ѵ~ᤜ'PA扭'g͙y6Om=&Pဨ(+z3'L)%wm'l yvqh| f7qi $'={̛:~3/bX dܪSS}8HR̿!dQ89dGeXokpӮ zp 7 +V,>]\Q5bQF2o[ЦM6-2(i2{̍#w*fe-#W|spvXɷi-@gVV+bʺ(kg~GZlgk {s %n䏝f^V(՘i~tտB5-OXta]J˓O[q2Szͩ-ǵB~}d=z2SBuS:Jj\Rݑ}kUvET*:>t  EGĩf}@VS\&Fq",\UT-Fx4)#4;v!0† tŒގԷm/ 0hG&1"RKSE]  ?gYexs2G _-0|[*zǀ Tқ'~+V 0|`+!?> 0` pX` 0`KB0` 0`%!0` 0`%!0`m`9fm~FmZJИmXbd|\M2^/?M>o4i@/'S*,#Le_.40uչ^I: gbIZNeDMxm6~$O1scSYq˖1d@+b9  !Y:w|'}(Q"dXK^SpO;^;?v^>z͎k u/xjF@$XfFvE-hvZDPpo`S/g:*hI Onj +.0X[1/1ϯ` 5)O0rƄ>]+jڱDM틢毺V.qsw6#uR3O*T'W?Ch=-@d\+JsR0B?M}'/uIC3lzOҟߌ9Ƒn'Zm9ю qP~Cr/جOX[gkg!qEыV6>4gOf-??fB~}"ֿji|hxI˝{?rޓg.Y([e!]@+p^\xo>E}cG'ʫwxK5ބ){B 2.E<>=i\~Il?v\Ҙ-Ki,XcNGȆ9N 4 Ú NX?; 4Z)kO}yIRU$ڈM s oxE(šχE ok@AG.ɸFY-s @ Y^#ΗhLdRm &=V7hp˯+l,_pr9)Ƕӥxu]+6)#0iah(nGhe WTRΨ.dLLwv`Jw[%D({qcW틯 ;Iy&۾bN֕N I,8:VOjc1&"( x. IDATHF1J ߌJRϠG(u.o0 @XafN~._CsƜ\Npϋ*~ h1. iMqa~5pF~[,n5!0Gn9\!ju'WtB ?rF2'9F%!#~#&!d۞WfunG~^:wⅇ9zJ\mGwZLZ#+j۲*j ra[Ex ȱNYǨe[DZ\;OzvmIb+UyM BsWѺϜdT>M9$pKdxTjZ%]7,fыi :mAH}Oڴq86' H!SsKTh(Q^|ѣ:;tN]LS ]8>@qMA9P:wt^KfJZ Բ[O ~z|qCĩ=BkQ8r[UQ }c,#5ۧOL~'] |`嘈ݛҮE`;G6Ȫ&Y{Pͷ-&N.e7x° Azww22%lNmb$.x]7M%cg m< iW0pTJO(AU#RvVh\z,m9_,]AEyU3g)l㠪>Cl?WëS̝XqaQۄ>jx&d9Rd֮EՕzm]4hdN[6|{cF$< !;hλҜ{12>NF[tKP*J}Q踏@XkFYis}Zуh=xgm\/T*ͣs8sG=jH\oj@:?OE4%r ?h:2rKΟ5ruۑg5(*S۵mM9]j%Ayv$~{E Ii}*ӲX;[f9+3OǐЯw/-Y^VOٽ~4(GO)dS/<?R A ;~*!hR>bcϟ>3*<^ބhzBoA<*0'^ls{k侍xOѿ;eϿ$R"3#]FV-GPvS4zC<9* _'3Vh3cƃgn|:iNqݖD/ΆἢxPu@_!s# Jg ^g;FTyQ <se@0@j/gEݽ"0mʐ{V%[:J}zUA+PI -1Bi~S)So[ ɝOq0?3[B+}϶HV]".c˭ۦW 2!)@/n1X(nap\K5 !Cŗ[zP,Fp)sl1 O}T۞_#hϹ{7`(UbDD5JU7+ԈfmW/xMlKA($qDTp#ԈH ht!'ܪZT+U+m.zpQYxQ"#j8 EM3. t>Gan@ V A.`oqKkH2ypJr Kgf\Ֆ8|@$J4qQ1ʒm+1:NH^V-DA./#6Ij@_WokxZy9utU=ޅ-fڦ㝲_*̎ݳ}-tS/R<#+8(xFImu`R2݈=WjV8|#x\K psUYzwh/3,h1-z+ 0)궂_Z&ѳ P,e%<>%c0:*jZ;V ,?_O~_8#c->V(XRJIH:nY`bC3ɿd74~qyUZR?s)5l1 :;SJ.PTR_N`( .L8t3g~PBJwS{.\@k(]!#Ct.52=|Z#b)ɭś*RȬs+)R娲o=iԍZvk&nޙS4* {BhQFd-SGc2n;HVPGh2);,QVR2Jfq+jJ?=˴Jus%zy73Wco^5~Ll='ߊK؆ރ< u%5hDd=`OHњiS[Xzߵ5y^c2$M bc>tZ3vQk5䕩WGz q7Ao Fz,0ŠDެA~jy|c{+):{SZnn6){}h6eL7[3#;>n܂&gݳHP(/3xFYj[W>⍺'ڙ[{ҋu;**y5!#xC?K6 {Vo|޾GyMybZޭXMɷR#:.Yp/Kf{~#!PSr$y#JMHbt+@}d+5\8-lx&'i5.@iWREkY=8_ L6]RAm6ޡRz߯VT*:>t  EG}س'|t*gἽ'~XT$QV*qxYi#꘍YWJc7;-XE@ @nh%+6Ǯ`aۏlLjH-Muyv$ ?vl} m;[Jw0`ա@O[ ־~:of  0|$k 0`͙9@ $e: 0|Q kv, 0` X0` 0` 0` 0`I 0`P1{Oo3j3RoC 0 l:lڔ>zx)'ɥGn2?8.ۥ.$Ywc#c0q-_,40uչ^vyXd7"䤸oan;0ն#yڎvb͊[4!]̙-O( ɪԹ;쬤C1Z ![۸~.Z;GZ߱wDCkv\c{lV 7"26+jFC[v"}cEBE!W]`"c^b_Sjk-_My!hƄ>]7o4;*hSD`})H x}̓ Rw_; ܜ}?,k;Bzj2&JsR0B?8Avt.͘im`\U-Oڴs=jA5UZ6[\QuvK0 ܺ)v>$­Tv+YSܲ_h{=yϣ6ٓYϏǭ_H:ZZ{/_+>{ 77OQ)@LΚJUe!]*5'1y{oxU^{[2&M qi=}, Ij6ublYMdJcpz=B6qz}Ц7lY4gpuG( y] тNY{K-]'FlH$vn x+B)M~>,. dUȔg˜'/f+Hcm׈v5w怺]?x z{|bK~QcR@eR,6QDrN.\"|W;@o qKf6阮nC.Y~5J yfJ` +6/hʳ>.dLLwv`Jw[%D({qcW틯 ;Iy&۾bHyq>H άӟqIA!J41(-;>QR7#kk$L&g=V<gjP[AyJ-G?B ,9%±ጝןU*}FA'crhh=`mŵЄt)0O\oeE8#-F\J#Iۺ+:!ppq:m_}1)l m"LL5ڷ%(<\*~V/7 Q- M(U[5۹.()g3jQ|f@anfĻlu#-m*HxIBɉ"5֋SAX]-7/o?yyF-Sd45jt<ҹ_qY~A(v? kxiWKcwF[@hT,@㛼aG 7#jxU~$l۳,ESWp8veҹ/sRSX?o4&GB*sT.;XRBԮiuwހ.QG/54N!>k kIxja2=WMDe)ȎV%gRq&TK}⚂rT-;)Ln*pF;$̔oo/7eb -mb$.x]7}"cg m<M}]kc>}b=B᳍?,Dޔv-O$9@V5Lljm6irJyZv, Q`P)?{Yww,![XmiW0pTJO(AU#RvVh\z,m9_,]AEyU3g4Sz9>Cl?WëS̝XqaQۄ>jx&d9Rd֮EՕzm]4hdN[ Y76 L!ȋm}[pTc#So}_}]iiνSd'JJ:v%K(Ud(tG ?t,54N̹|fCěo=ޥ n<@<:'O3w߳ʳ6C=~uBguh'IF?X)kDP/HMaiv7-Ϥo1!w:OMh$] bi6z&%ř9ܶҨ4[,]wEu ^:t;'y.Q1ۅ"u:~B+-_s!ZΟzU4h{%SGBȳb BXo7W AېWHKj -;'Ue?̱36#(/mz[R!> TzCS;I{V?kۺ]-sr%`jXiq3u3k4a%#~ (#:Z <6E}xVUw-ճ1zEA/`Ko_'3Vh3cƃ4ʼL߾X(ot*O8U`"A2ffޗnI衁Prr= _TgNz]3΃)=Mw$"h'n~لMv6 PebE Uz{༨yGVs}!V ujufY+CJWyU_ʄ .xrTR+"EKE P9TۖBrӃ| ??1?#OXua<-n^ډ:팊_xNv[7#|b[^IQถk,B/yVY#wqSS-wPqѝ{eef隣Zq,\X_d& eK\q7;߆mx-=G(zwynU9[y>mHu?s+n0 Q+Sej619ynVHeE2(c#;\ٝ|!H3&Gm$Ows@ސ&߂خMՃMWYxQ"#j8 EM3. t>Gan@ V A.`oqKkH2ypJr Kgf\Ֆ& <(@ƩF Z*K&8Y#yY- tQPFC5U^Ggkx2@Lσ!]Gl8V @?{ҭφFOnZ/#gdW*>%NZש8>ڻj˳b}m,QϚҫ);e|WKgm/՝m8D ) ^-9m%v}~ Cg%wt5ypc6*  / 8QR~_X*f7䨟 T;P"E%(1Jlׁ md=KAr+2܊fg:.vP(-*A[/TfzR 8P94CUx2e[T!LH)KeDC{S"R*~W̵WHF6ƚῴ?&t\(PAq#D#JxmCC*F?(7TI9vӖxKC~_q )|~Fk|( "8B+6I9LeUW2[qu4獺@т0(h8Q-T$}O]/){Vjs+StSGcEm?` r0}A흺g2@mޭTۤ),M.NM||g{Y8s3Lt&)1w=p$A Ӽy=Ӗ87' ^4x]R<:O:,W|oAqmP nyѥK{ʬ®>w2O k6۠ 6~ku;Ίs[uTovWVHAQV5[.!n#r9o~4iFtWQt}e Ry_sͣ|!Y}/Y\f_JKK*r9;En)c-,캏O2R;tiûظdL]+ϹgġZ[qi{&L6Zq# sjpwkKQ6|&k 啩WGz q7Ao Fz,0ŠDެA~jy|c{+):{SZNݶoGQmݟCz<}>~>ZMΫ6⽸YbE$T ;eҫ o]37Nkgn5rJ/b . -ۆ ,U|žDY_ z]yP.n=G[O˻u ~<R{~i'OI9O.<[OΚ3y^m2z"M*ʊ^g̉SAed{Ii IuQs(8V<:1Guʗaf7qi $'={̛ N[v^tJŗ-*0I'eg=.Y]!)aҊk.ޛs{=G'Y;}%wqlb:Ѿk HkgiiճN{Pp][b948Y%m|ꖯv}H6<84DI&-ۼ<{mAZ eg;lXiȘWkpZHMN mh7yg:|n@Պ6 ӦM KooJ$JW\dY_Á'/iVNCUOuʑˋ-*)7!iYy^cOrӮ zpH7ջzؑK*->dE| k7Kg߯TT*:>t  EG}س'|t*gἽ'~XT$QV*qxYi#꘍YWJc7;-XE@/v} CASn>v ~< X.ϒ`=C6=Xk`݂`>tR` 0Bu?րB;ۻ_0X 0`;ƚ d!v~sf1I٫+b_1`W&m€ 0`Mێ 0`,  0`$g1p`9fm~FmN|(]Bcbccccc!jH/$ӻ,1`AZ 0|$b0`ѹuOPō.qo+mۢ?'#Ew_; ܜ}?,~40uչ^I: gbIZNeD9:xm6~$O1scSYq˖1d@+b9 2id RvVRGOm\?c-yM[?Ḟ;"{wb!x@5;1ꆣf#Zx0]Q @7ݲܧ+/* u F/Q|uFΘЧ捦j)b}QU@0>~f$WN>tITY)vRU{UGf;{:f4s<:hΉvau <&dJՖe$<-|c}Շ8}_ձY ր΍Whej{=yϣ6ٓfC&!ՑS2ys&\]Ffu9Ny%X ]4@#4U벅+V]`HV .vVD|q.th<7ۇʾtUɻW%HoBܽ\!P" 4fo!&joi̖%O4K1V^`H#dmzaMs'Y,}@-蔵$BuLQm&@9h7"@VLy)x bd9vzhg+T|'j\Hw0 퇔|pOqEKS\~-_a`%ko˕Fy8'6˪E%USEa6_Th8)-˝{?rޓg.]Q<}v.*|y;㍚E&H9-.T+c'!3(:J::W8]qHμtˑ 9:8bGϻC2jESߖRfEd+{w%@N4a@tN:A/*}'@L [N03ehߎ4[8st28.?/;PVJ&B^ҥscC;c?/T)NƄr*o)2۲odt} y?rˑ n̹"Gq# U xEG 0YWvR{y#;J˰޲ЄRjlU}^5 SgltfFV72Ѳ?ئڊt)< bPcx>"y#l$B>ͱ o.8\ߵɹQTr>7TwQ8h=vgDF4ɛvp3m^*#ydf$yU֭<.*+_s͡%@̇nHO*dFvdϹrm32@h6O UsS u|Kr26KBPIMqa~>|HBXnh6zl׊sC.>1taûQ|wX@udxCWɧ;w|?l1;7Uo~"Α I^>f:x`q<;aR9 f/؟ކae8^MXapQ;Sk[ ^KdDCgV\0SjdzZ%/u.>2_'=unG~^:wⅇҕOI/}Dvt7E}9˃^qe:dbKΰի!?j;"D=LrYZ5+eguWrƝcKҥ ['Z>{Oݝrx m}[C /(&P]&_mYz!˹՗eD%q ڵ7T-ٚi*Ozol=BkQ۸÷K"$\q@vlr#/u:ɀ c=J*6kA@uFnx>Z_.~p'l9펺Y~5$Ke$Cvv7ܵ}q҂碟}"Q A ;~*!hR/Q6 fW͠ H_f|ӫ>8îC;IRo6YJI^#zAj Kd7oy&}<AaT}2mB#RGƨL+73D%ř9ܶҨ4[,]wEu ^:t;'y.Q1ۅ"u:~B+-_s!ZΟzU4h{%SGBȳTOtV!)MЪIuy:;JKsŜ ;QT'qPtKP*J}Qxu>EOTT/^ Ix~*60#UMx6Zx+6KC~6L)s@~/Z+*Z#n/F ?t,54s}oփ~0%@1Ĩ<k;ȟߎH+S۵mM9 [9]>E(֟UgϕO̐jF@QDD/{?Wae;Aݠxkݻ~4Xo*e 5Nӧ8ԟ-!j0a1RLֲr* 3dBNed?L+ʟ~O\# X9x܎ɺ KJ\ k]#{˾8[݄7 t?:'j*RRq nKYjOKh$@|z9AʯD^|Z*3'؉vAMiNqݖD/ΆἢxPu@_!s# ToB5bϔߪY2 d 5.Z5|{{E`3`ڬ!+<*/C+PI yR=Xiq3u+4a%+ U\Xn`hkT>aՅ-<ܺmz5k'**~yt:oo=܌9Moz%Eq Zi&O *![d/}_CG#W6GP瞟j}+k}_ ђl)CL۠3AT1&W$Tu[M@A8+Z'mu_'u*ʎݳ#z[VCu)'v_9 (+T;BՀvd3U`]P"OH79LVOz­IkzRr]? hJnQI(jOqf9 p+ Zr~C[ZvFx@̓3W _Xzo>7䪶57o0A2N5u0WY21T=m>Fjٮ$+/GdꁘC3%Z~}Pa8de>|/nV4'k%A/ՁeKbv#S\Y q-94|͕١J{Vm]2$MB@g=LQfδ_ڻS77w=׎rL,**ɫp5&e6ƍ2xr))o4a*Ll)ي>V UF6͔NŁyU$?kٵble IDATHU@PO@q{T!" ػb)g/ "v< g]A,A@J$.˺3ov3>]3R>/ټ{Os(}L %, Qs۞}1EEY)8;#]W,I(ntkƌq;^+ 4Q.@ Y (I* R!J4jM j22DCmߕZ +sJCrej,2~V>轋CKA#ks2 !шZ"Z|Maޓ4,iHjh).=< ~[dV&mA3^eܽyؤ*ZUK.Q۶\<]K5w~CүO5|.Eҧ&1wq*C dl݂R˕+//d5IuU!ᔣ@ҵnfdJ )~Y)s@ҳҁR원b$0z xe d1kL;s}m]VvjT"-HWmPsʳsźm ML\7$p\9j35IEҸ)#u ѰꍱQ{l=i;nȹ ? G<hʾ!3xSk'Qi%xeeb*̌/rml;仨 {/eQ#m!A-$c֍0!֩_SAUW. Mn;K&j ffiii2&#!y}j!N=I)gڵ!D$ j, 9 tf8x YAm@)FZ\Gω,S^݈ by(ٟxZN.fe?b S6_H~[Du5 F'5o烖}#txPHq4ZԎTY>rVYWIrnmYL69`^TвwG-䴊ܘW 3u8x⥁=.-~y g3ܤ)Ź}i~;& n;RJ>%ֵ*JI/;l ‚#aog+zJHD O8Y'&<ڿ6$*]ܼ_m$IxqA͝K_wY/\UpNz]/feBv=7d dˉz`!9ru[S̓ OIk/ *z~>ǬTmA+^Ey#+<=ֈzmkSͻu"{}Gxv߉?*zO8$$0=iS,ƎE !n̘4 ļ̸痊 W$W5&!@@s%m=&$^@ľ~NN=M~}(:x5w yv㑛ٿqb9Xw]kaόHj,fO ~}YֳBmx]b`}/]q=۬CcHtiqcXyab֪w_Gs&̰9ڧGX ~Tݬd8lc3nc0`BX̘$(_0`5+a&m€ 0`S 0` X 0`,  J`1mDǟ^f7PGn6t# "Qz'|=@@ ~jYu8]ǭکC$*<' RXnt5D¹9 }C$ˌ V̗A9^AX~ȁ3 Kg:OZ?s쫼ّp9f۷2zd}}ߍzS0^{NP`gVg<;G/GK[ZnvLbOxU[~YQt'c+/rÜ]q__~-}V 092k} 9ͨl?οθТIHƋ 酘'`F/U\PYh5L; /=hn4"lIYO\ M=2*1v1 ]2x=h1v\לM_s{(\q!S 8 yX:z%Pjs5;wLZu`3 >|}To:LYpyI |GBSt[]W&ud)[wDYu)~;A_$G\f ?/o4ݟUC%!;= D٫D]='K*_LuXq[-Ҫ-{/[Y7t.7 Kv~̓ν/e1J{, P^ v֍&7~YUS&)N/Vh zr8Q=lUȘ:;rݎ刀sdx}z\ IpⅭsjLevk.&W*.Nfh^3JS#ڌ5 H)Ӻ(5ë_htW2ꠄW2y(\ h6oN)V5ӱ6±n(4w/k|h@d]|i"Ntϥr䥲8Lc2ptYh_;οˈiSGW|/4+8cGw u"ex[)|B5kkcQK{u[/:_~tl4q'7ʑi{NKXQ/\UE;}-αk}vkvd"Ts2uƬOavG\e#if7_}Ck}ՖjjҀ_RR)U?k}vԪ|[5&oڣz**JOM),KPYgjHʲMԺɛw‹=vIC b0tKPq^]ެXv#m%/ Q|2,oX+<.0\"ɺqXv> ',)p//OEm[~ںIom\睊XW>'^0lY4?cgY?5Ԗ5j)"XtxE3*mOf27snDCr3'Indd ]L߂ q.YI#@&޾JENkc:$]AGsK#FiZYu*YD8'" $D-!I %ƹx:iדf: Ҍ5JQSh&zrT%BYSVk璈]dN&jܩay, KIJ ڲfGA0s]5tsuJȦN]N]5.oxve-<#>A!M\rN5`BY{cj=Z;=G˜e`1!qD7}H )|3:"B Lzb|I3Ԓ+&TkU.xc˗eOo>mձer? d7O]f*kC4`JUʩ6@ymBߎZg2^KYۗ'WQx]~ht3?cgI TύWZ8I>'0\AO}H bSS*3>$?r~ǙBTRqye *X$HaT ,wtI:3XT@e][O܏8Cۉ"ԺY FwȈ\ƒp?CDiRp8.smZ_~O^nUhtY<@_k.SxY"|-IJ^]QI ;N''fo`Pt7[lUt:uC1 x: yCΟzÓ]h{hUv:>dƖQ((꯯z&8 ]zk$C#/=D9O2I,k$AìÃNK}ۼeaM]q-k7칑jߊƄǦWn)+M?>vI#p(xQo7ks\A}' [ *@+"+m7+R? ,dZVÆ_J9jx@%B ""H AQH rUS⌢q!)(u2c۽SBca>}ŀ Vfs>}gݩ ^8nx.nV/OO Ks%U+OxzUž@k L,Q@ orqkc<|Z>i3l{mN/țAeFE?P,@QׇׅR{f *Fhc1!mVV4 h>yÄWʀ\'Œ }\b'Osp,^g)ZuQor]-nYžk;*G4ʓFQs2cLyTڟ40.,p%! M?p坂:1աfH(@̹ 5 8F aBAT+6 @9S ))] 5Lvܽk\YԻyrys9y˕+//d5IuU׸K&+_(gWMHYI)Fzv`Y(I-|ݜcdgH4w s+ >^Hby( SCXPtL--|nV6Ob#sn[Ib9$mfS^k&.*IZ̸";&xma2NuW۟K ;cXƩ2þ]I'x(֚F/sstNCpۍ7P *,@s+ 2v[2LNJIMFuk yGRQ80K-!J{B**^ fDILޥr(p6 ·dZd {9k3P^^4 % _K&jw:SR 󲳸BHľsɋpߊ/!8u7~-H'B!W.-·7 C(|7 \"VvGⷥ4G ֜ v FJ\󼿎>$axor6=7_KJ9Ÿ,ÊoDUw|2rp(ZbvNwAПDԸ¶9 q_e~92!oRc낒{/ic1!j r⺀tqp.򽜍$@%c{Z%Ǥn O>L kܚ):+< QBO (+`}817!QU[aEi7W[0/p^\{sR]֋?e?^(gU/feBv=7d_ҥ+PiΕ˲t&N}s~KHqzƽ@M||`5n^߯!e IDATNT6 '=J2 0`h0`BX̘$(_bb7+a&m€ 0` 0` 0` 0` 0 }zKfBw3( ^]ca&cvn@{~~ nWeTi?acԄ᧙$Gu֣y:*Oс=ۚjo` smtBnk'NNVA@D ,3N,Xy3_*metIxv3Yv5G5'*ɝ6h@*Vx?;c7} TNR.P}*)AWC$Kk r/8f) 'u5Rǃ QءЧ! x jOa!μ.+#raeې'zzO`DxO9BxWhbs^:$iiÿ7}S"߭O05hxZCIB?v3SɛrMZ@m=_Xq]%U#~Goht_&M~#=&GfKB0<=W =g,^#['<,H}z!ĉ:.0]/Ԯq%$=,5 *։&n#&k˙`إ+ZZ!{aNdNm0d\a ƚIEŜBuN{Jgc"ʅ\x;?Z}?J's;kZYx4Id8֎e7Se惼-ZNT_5݀S7R0e%+/ȿob֡{M''=u<(|3ey˚3Y @By޺9V[}妮.}P?lȲåWlnrP%>ʑ|ϕr Pi?%!~⏬1Md5T+hY1@=VHm1{wuS>F=oN)VK"Pg9FDU*嗻(@gG,u4@I_2 @TLHzW%{en6NlGO^;1ҺF;&>)cmczQ(i^:;R9~%7iȴK1&zhɡMHib/f3t4 JΘBx|V _!z=fvmc Jyi.>zs>ߡNW 8FW{DR߫9JU23l1p]볳_k'SdռEN{ItcmS55i/)hT[jl5ѱ$oD+ mk#$nNY)?A|Z_Ll;ȱ<;^Dqtwx5Q^n5#:hK9O ?aEZZU[ڧ˗ 'N~}g D]='K*_,W.^ c!hʡy'?k凑-o ?|kg9La#$Y/kڰ> n rcϰtmO'<т#}hOs /]!\w}?+ȑ-`ȼ]-E_^?"TYƺ#뻃.EDӱ;= D7׷nFO,SO$-h6w zM+FF.]LM^ސIG/D,Eo6fUʟ5h6VV:le] *$.X 4-JP!CyQjرOG)]dBAq1Yhgʺ1Ɏ=|N=W$9< ;%V SWM:TUQQī{\{ՑXI~i_YqiIS˜e/?sX9^iB7} $܄21iI![|`Hbm&\;-:>]>qѠ4?4rjXl?lxiHit?:fSe2;\Qmw'}%C~;=V5Nz=<wO^  ?}:_۲' <ӼeMZKΔuVQ{LZ-?5rl"?;dP)6VF Y{ K@.^$f$1 :'?737"ՠ.'&$?=K2Țџ9yiW$Sl sʂȏ2W'G#/ "?2/j;zluot-^ztHhΤ'mшY 痛3U6,!k(ݡ2Ⱥ=GۦDhEuhC'G4,/%TBFTM7|ˏ>}YrfʛnLՠ.?}*R¸Դ"~ƇĘB݇{3r>fåkHM5?yIPdZ}l ?\Li]Pn]~h7.~6h :I{u>$~HE+"/>+m3@iﯞ|oρ?Z̾>^Ly|򃢵o 5eq<ǧE_nXNqѸ'b\,ɽe9({9 C ^<+kR,B9Z&BasAqO85 TM]i[ME(eWmw%n; 8γV<ػw$\q\ZW&@E $PZi'u>ʩsRKzxEknޛ>vtq["Nj6)?-[KA\)Lέ)\i3O$nEF0֖3}yrW,G1qS|QFBg&P%9㽡B@3;㯥}1iÇ$C%Nj|{/絛:Uc0;."$.,HeBH%!W3'Ҿnj AQPRD$2H 2eeL!ĺmj:jxr)`J<>?(г)p[~HD-s5Ј܆iD /n:Y_r%U^F1N۬:pSrN4~悖"ܾ't_ ܺHSo2>γs:/efbmǯZwMXbKx9рAbt;Jվ3kJ VA~pP1˖۷dy>sP4@S6L"rAN! Ri~TFV&p(_+Q>eb@ZQ)`<}dAF^;}]u#]_jf|:JզĴf!H^ F[BhLJyQ]hPQė66?v߱?<*B3~:o.PL4[H|R6%|VdV–攂6;\?T%g?c7v2mkgE2{vRQmwW"L+E|$ߝr??9+ϒ2idRZo5}EpgAWF'hb1˛. _.7 ;Y'G{nYnTyu%!~ r_7oV<]KFeQ/".^R6qǽ Y帾+E^_4L'M*@4i& jLsM-@K+3Tb|bn 00a\- >fGqid\e2B[> G+SJ>vPYyNHҘP@jgGeb)(kZYQ3oY& jY|E{gm@UP @kUXn "3Kv#ư@жmE+ԃQ71U#> h#1*u}5(Kr]?D_( H|3xQ4DTjƶHs/o`)).̑ tT[9%*Z WO9@дdQ~ ~Эr7ܢq]zt65v5cͶnr[̇znӆw03:ݐsA55lZY9aP=Eʏ/aτ43$c53FD?rLXgێ0|375d9BJzC%܏ _pg/CtaوUKI ;͘lNРA ̎KQMʜ*SFVɞ7-i1Y6C/dCV^\^O)M(Ү\~=Q~ݎȯ _QǻԮ#u Ѩ_=' LFzu#&|wm*E/?X K߸2{wl<"TW &ڲ6mr )ZwlYs<7?թǢg8x⥁k-{w4NN(͍}5PQFIk/ *z~>ǬTmAH8׷Z8o4ޭW3Rq^li8̋{wcXZ36P {v"4JS/nޯ`_$ fЁRiZ=? T?hy'.fDZAe{ný2m-Ǣ+PɭOs`Ƥ[=h e=T,U^.sז:V_(nֳfe# ?T[h`ԾUyeE/ybY hNTQGν1x w{^$ZQ=xMn)xcާ\)4HGQH^?ǽ](gyGT,8w. z]}|#z[Hb%` Mː`{f=B~QK0#t0}<淿ݰX0`_Bkջ9JfXKӣy$5ѿv\Qi{:+[jqg ~K&;AA٠Crjzh;l.xqqK{toᙎGu֣y:*Ol9^ض^KgJ`:ng8ieWs-' ޞ3!IK2ݖևFԵ]W9Wp9fV4-H% gǰU2B8\= a"'|duGf{hF {m<8U?<;G/GKzrLO7':"e&r8Y:pSNnkQA£CO9BTn\Н90gW@vW'Bl-m21(Nʝ3KW  0\h󥥨뤍7Z qTN9HPVV~NI+? Y~i\J‚F- da+|Ս?57*jd#zs:m{gnNUS-m7Sg ӶVjO074?YhN :<IL_}plX#C 5{aaaw,rkE^Mo`2vwX]l .TҞ8~nKh1Î/hKgٿY}nǷNA_jjkkRkU;=Ӛpi_Զ-}G,'8&cv;Ш\ G;4Ü`UqV{j4'=x.,TA[j?ZZ-pMoIlnM(o"`kn%3{=Yұ(6j?cWxպZ'Jneǝ ^n/rb޵51\;“iiaYԥi4"2W=D謎z% |%O9}4hG͚)ErR 8< *[ʤӣ"Y7r*U)4cMҴ|T_) @f(}?"0c@MHk٘=+.>iʂ;j]էlfOGK.xxL^uXqTUkO@Lzbv|@RQ&c3*M8aE I%z}:j)'[|`H:k fA+<:0߶P Wql2WRպi胖~8s$ !j޸ ߝw2(t]uy[0`P9j+R~KO+gu}C5\r)ÊagXiP,idAs%jA]|C!7Twy|@.{"z@JʢCBNzb;.&&ŃG$iAOg@QDSoʋ#7qa#w?gN^V‘m@rQ\dcs?T& =M9_ćVMJYSF׊z)IuՌӧέ=p(E4{ }|Dz%_ }o 0` QzEʕ+X`8 G2%(g@4%BQ@\)UHtREۨ\ Ȋ^e,,5Sj8N]>w=DL9rInD$+.2ރԗ @C|f'>;sMv ;C 9/ݓ46т6y4U*+~WVشoZ^#G# [ޒj ITNշ9(?'gWj \vնf2w3ӑ֣V eWmw%,7vk2z>.Qľ{nDw+ee\$&6ܾ\}i:N\$l Ka.Z;7] /.7[kIu/Q\ spJ0`P} ܂ ˩@.IiOj$DI4Xl@dh@/,tpP_ t9]XjeAءbx-!.z*K Ȭa!KmB#+M ady>sP4@STDPN=#2Gӈ|EeqИ+(mРhJz ˋS[HeOIyn&;Ee~pw!jKx]gN)Niy^Fyd?F+S 0/3bE+B﷨C^!,@37;s렀ѫtqŀCKjLK NJ&7ie4].NoŢE-ZxUٛo a;͞2k`3>;[P1?KLwүouK_^5yE߿]$^zY)8m#F }:e#X?rNpҡme#ku̚TSV&dԑ9%& ;&ϻ^hGGQE`+FłFQƮ@h,Jb]AhݠTG98qWQ:ݙٝ}[1@ m%OCzcf&uE3M(r$ƕRKȕ=.^cҿ?OIFuP3+yBF!4V0@ >'2JZo R?̧VJ;핕̧WYΊ^vu<9,$Sh#f߁ /ɓj?ٝ,}S6کzV:h4c@ M %"SJ7zPwBati#ҡ?Na\eTiʃtM4ƚdkjiIKp W^yg7'ݧ{qܑьS+R"cEkMv8vrP@V-j*@Ie?OyAWӗuymOsT~?~<'emfA9ոL[qҞ ϫ c'`W4{xOx-:>L#%!W|')϶AyNF2y7 n<܈r] {{O蠇5" $J .tl' IC/MzVmWY&#~m mKǻiq 'd7t9q_;]7T|>S HR+,tc0d!UOJ]x$ܤNjJN$jJ'y.O,F<S3^a΢R 5vJy7 Zr"kLJp H/& ˾ĽTb ӂP-lX߯r;#{nRe$}{m%>'czY$¤[O͙yDOCL9re=|<4wͿTxIµCL'QLX8NN򼤻6)W,9z<:Om .Rrxc 86-&L`OEGm5fj]iKr"0^%VGf1a=}]P w2.K1RJAF{Br83Pe  PBֺ@ j,:Uâfd!ں@()@ :Qmy, H^^u@=@ @ >GUgQJKeuu'@  @ vFl;]؃@ d<~ϙ 7fOлlFF@| nAaD+v yGu5/]׸21L ˗mxTqs aW.]dmɁ? F}g/Y"DL0rQ"kihԊGp>hiV$ZUI>Q,xkѰl>WMDlK"g2+9I 9Ccm#s[_'B21_A5`ciJ+lUVW*ۡEg#wS"T_یK3~Wy/.~~h}XicE7\Ir3U['e˜A9Re gU)sܰli۷E VB0:{\1 +ڞ]9 hvt{mY_גs>$~xv2 KҞ^>vGt78mBȽ435 %m+oJkӁ wF7oyL%U9MUi띺dpٵ@Յcb9`SIx˕drSheyR/R mw::kJ2Ee{}Q^̍a[R$LW/*ʰO M7^W[۫izU:tܶv~}xtr`\wʿ G篎1\lGjE,罾?,/~|0#:ћ)B1~=²gOjE(M ^fBw.ڒ&Zs|JNm頡7H{ꠝnͮNQɄ7SL5˿G '1fDDyO]sz\R(Hz~U!ȼ9a!~VmoU pd.wNTkûϿ(S̼\iLG+~/# áy?/{ĮU^]wPւ7[J]8ǖΘ쬠S 8er =)g6,[déxctz}ٵkBlgq`<~KfMh rC.%k/z{m){1U~RMiۚ5`̲K_yÓ5\JoSʵ;~.b4<<̤mX!|(k^Į︼ԿЬ0_>'ÃD0(J&@a/rEû*_IWw6: "V' d Ef40>$<™#D:W{VgUג|J/-p|gк^ϳjM/ӯJ?& CJ]x^|)e?Ttrs@4Ո ux%9CfJܟ79T  n5̅Tm/gBΟE!q3)Z%{q^$%Ä\1$.V,OW~(Uw6#~ŊU5[TMF~H|O1[wn=qx .gl~G6#h~7'`u2lϜU rwU(g{m~UCQ?aDX+sJ#gO9ypo<$JGY>\#kCIGZ;b~$']زy{X<5o|4J5rA@K*d@ST\VYځAȀRĭ\rRI݌Չ/ErCrU~X.JK(m<˭#+eD&**aN\Ƴz|g|Y$#bWD=_p"/s*&,ڳm )kuѸ1bH+~zzGVQX貒"҂;SFp ')Ռ 5%7XR\(K^7ZyޱzAPrUUgL0k$//mR}#h.t D($"ލ/ lJ9֕,wλNCMZۛ}[“kce=yɻ_U@^Y\"$tį!?!e||CxQꖆ-f ԈRT:ߤo)RbBLlڟ5qYor[^`Zu8N@fGVIIwj g͸U^^$ĚPnezӋ烚*8Yk\xxx4 3nj.qj[j(V7W.rkwU7RDU)Lطly !ͫŕƽo;cmD(zֺ,(/o3bqRk:=\cR#rObh% @Ũٛ{W+I˗Iicz0Q_՝evT['`TAӆz!2'-yie IDAT 2u‘)G[t- P9VfogK##wH(pSCgYZZZMu_%hflK&ZVIyfr45bvTFnOJ3iيn61w\]p厑'Wfr4Tn+"^۶G{OX釨}^ixIµCL]hYjҬ@uLxc 86z8~vFM#˹q =*>o"_cՎc!],sjI#zռ:QsRY]#A@|޻7Clz&@'Ŀ ȠXu-cެ];D t@Vw7gѩ=fp2u0"}t:>& P # a͛=EIk;D)P #;ڼsQQneP} WBU-B @ @ @ @ C2LNw 7ٌ*h?췰FJN'o[Pƍp̨ooʞ#evn=fMhgIQAuz'aQâ*=3=uң] b8=~sw'U(h0}Ms#V,Ȕt g|W^iK0:i=݋ɸ~U} FkTǚM%i*Z&C2ZvXֳPw;liTˌE7xrzRj>M4n<4fd}W3ڲQ{O?y;01II?>5}qS۷2B}W}KMyӇ9PA:*gRU#Ҏ!u[V]^7R!>ihmmӼ0;x59!Dk͡Ш~yFLmY}ū~ϔ{MCvI*[bE l~T&9t#\&+'pYFo˙`[ )T(T ?o_~@LݝpKB:UבBj;yp4TyE:mD UD6qeKW?WWC^p<2zzQ~#~wbqFz&qs aW.M]w'W ^YHw94?@kˏ@ 4pPu<'7u{ȕ 4F5ٞ߁k)myYY驩9+c^Άsgׂ0^Tѕao*t<57oc2\΢`xɣ*8VP[mC aCysBҫ++eۖc.2Vn98_Nwbj#}fq"^ ×Fg?{W_ uLq!>ӵY^7?V}w<SjJnt]8$񟉖r[jli:hy +/8R:h`SDyݵ}'%Y<]u:b5ۗHb\^[O6:x b:p)d:hUYǦ~޺6Ft'W[j`Z=_@uۼ{Tܪ24l3o͏6wѭCqGpE?zѾyH2"xE4A~10vwߺ`6gU*Kj`uJ)׫{6ߵߋ7?|[c\^ˎT/V~+|CO3 $~~SrUՌ 5:7Xe8Id I@4nB>y W P;w\uI3 % ')CQYk԰"I%FRaA"$'#_h=ĹDiTwOwO-2r! ԈR*n@^|hPVS\{#Z-h΋w߄/o /m}? 47߉8O[&}E!M})NK0P9:uw{h+6EUQWB+e~q7jqXeN^_.WrBQWU#Xo"S[OOY3B\HvqIozo rKJԙ&DE%@-0`c}5;6@ū]4l0ВUghFdo+y*9wS^-[^EgBc޸.xQڎ<;XͶnmUI4-v'`t#K-/[P/B*y\AԲg36S ŁmOV9r p]CJeȦoClD.LS-$;+FWM.}viWGd>ռJ~C 惑TBa)P`ko~&[[gBZ.dB$u=5b6{wrƕj i[TZ?y/-gի_[YNTɮ -d*ZUvT1(feeeeeqͪ7T?G hy0ےmIh>M ?p`F:NcwduT}i@:dIsw2Cxi>wҐ^v-Z6L3CT۩=$-_֟epc$I1Г^7ǝ՛?^t+Xmc?ۯ2S#c˻T4o8Uv .:[2;mMUi@ܷ:5[r,D;j9e~Lyp-tc! 1e:A{@}#h|̱~[$+JcidbC1s;~Rz :Y;>kGz1YY%2>Wf<Ͽ<'[܆@@%ÿ^)yPWM誳:?JDY͠ ϴ4R!1r\tr97a(i֓ '|_lOzl>W$w: )9҅+wd=5s+r[ڶ=K|OJ?Dyi1ӡ߆xP[V!*xT^AduɄIJ2Fq,1OT} {Ld T%F=zi^c. zl> ^xvRy&gΟ<ІEF U#/j&la!ujd7[p}R oɩzӊ22. '!Qƨ2Hfvg-q᫃ FO'm8$,+kf3]0vޫ$ܥi}_S~ ":O[1Aׂ l^? 4K*.+bt93\zk|R*g+C0Ya5 ebj<H"g2+9I 9Ccm#sm$i[wr _O䅏w!S|\\F^p1;<7Xy+g:*ͣq*F=Չ"Qd#'Ǜ'H/l"oeXjCnd9nX*w%@ ]s¶,{>y"Af26j~}MAͮ]6lyg Q9>ӟ̪t߼Ob*{bЉms3@Z;i#,w;RsS817=5jꓠeشKLã[?ί`=-;J? Nu=nwۖW\S?fLر>~F+.{k5 D^N%{/Wv< c^Άsg5Bz$< @teۧ O&m/X$}y_יöԥ2H6~+7=uЯ?2Av<3= IDATăJpUM (5?#>'mT>頡7H{ꠝnͮNQi0 ;Wһk?(NJҳFooxSuĶ/=OLki1@T\\."gUyQ_R:-V"Wܨ{4&U[A18Ԍw O]}viw GrDeXv18b9k{}?˕-tݿqx?~F~1:ZcŒCGop m ў3(?޻-ݻ09N;yQqԐsK^=kl0ȍh(~$]ȑ6&]'(MA+\7ڄԈ|NG'ߦm͘D&(4:+"N?)ƣ6:i v2(DAEwKDTV.H6 LYm.&v:vߦkwT.Qɫ O_&ЕEIN<.&´ "_ $zyyU$I'}e>v1;\=>Z_5!i3}!g}ڥ!9P Fj 3{Ɂegs"sAk՝_j޴#fv_9h2P2 0 iœ\=#]/ B!ɉ}Ia۰ji6#]]="jiI<~-f@yqyUp'//.,_Y&(SO.- <#6B1} 6 lEyqC֟D@Po`@ҡR3d-cdI+{E3LzC7g0'~ʗ9;3rO5l@j_bH?5YB0J $%N5趵G@:E1sܽ*tM ĕ4z/IoޕMGY0heD:Ĭ'N%i]ڥ<0L1.񤢓ܧQ\FdLGūw Uoܟ79T  n5̅v΄$ҝЫO*{Ihv@ Mǫײm+.IbC_g _'XqwOb[V~k;_J2"xMZ|S=F2`ɿ/ ϫ֫sKg^)p;x٣;$<Η㸊۸]FK;GVQiw +("蘱H;:}v cLw7_ZmOKT32 qE8.M-&ױ;E{;}ENд`T)ux%ݝ.ka'=z̅jM8[o(CNHRŕK@!U0 A@SU]òϮd4гsUkTP9:uw{>Ǘok)9E"kU%ҵ *)zAcח(ʋE f˫:R`0P?e=ygȎm+g+ˣH*@Xp,6䥍YסP?{pb7uKC,=ocyF 3+|t ]\=9(zFS Hބld/]4.&|'ίm5UEB`heW:0@X(jJ8/s^߽ܿ~zF߬I*i7)pi7ֆ'Tf@3qdOOfu9p}bm*) ~IQYk԰"i%4aQ،H}nzڥɃXcDB GMkr[߿},o_@ O0(>tO33,H[~k+eXM'7#nX zfxw7,lFЫsg;~rƕMo"e3*4,5u $#@\ $ ^+p@"MY)E4 )  E֒GQ h1@ Uڀ 7Z\n&VZ>Ű0EEEB5wdsaVʞ+s=;}8ZcbO+*rnjHf&d}Fc+yBFi2T;X\Q]$2?M0a߲U{&?6WrSڟJͧ<ĥ|~i;ؑ<W?v6O5jCoIQj=.3+*/o3bqR+IJ<&j7F7Ԓg t!k v=KD tYȑ;}Gh({ֹ򼫁[1bw4w)(#N'$?؃^96*HXY!'9%%Ya# -<O#0 -,--ƨT0-'>KwS,FM@GݳZIZ~Kn( ݻZLDx'/+lFÈ,Gw7c [jĤ$-W585c[5MԲH2?30{ \iBP.`xD:cnPrQ}FӡzJ4՝$G.km<>o+yDy>I)nR#O #a?@֗Wݳ=f/xӇj]iE,2yK6405rֲof޻wa7n;];iH/{+3'4RʠR,:hE^T3d|^AG1v_`16ܬ*d qqNvHxfz5ۅg{"ǘ;u8u>'<̏e޿aP.3= wUK{+i>w/NVcDNJ>qJE752˴l LvD3?~+eʒ9=h7p~3i@{q6`dI$-;,g?d0ӳ0ch2g/K&֚DБYPysr[WcLU_V8헠 ^A oJpDdz .Hڒ> r`Қ ofuj˩$!ҌkouY%ؽQl@ 8~te% Z6_Ea9e~FmsK.gK.n=hjDi~⍝VU_-ӠUdddٗT\|A}nRuލuY@PkUtB-+`#)1uNT\A6^l=:3vΡs2CkLQ%ٵ|gll=u^ d&=T-Mʸ׶^}2V!j߯WT^ KLpyIwmOSX:g[Y`ާ+!7ԻI7U~qjmI4dwƔi)Ɨ˛*YeoWRf#˹q =|/}J܍v#/?8f,K:Ԝyޛ0A4$d|(oxwv΀iѐXou p _@~Kil2(=k;;f黅{vd>y#Hm.?@ @ajt0"t:@ h)} !xpd[@ @ @ @ @ ? QoĶ3;=*9C]M6C oʧM ]#[!md1:z̚T5d}W3ڲQ{O'E7Buy,8ww+ȃiN^L5LƽĽs~HER{nevcj@.=.\Ӓg5M_sAQǿu3<쮄jv6JW(A _? t ʪ ?趫L1^X.BLb̲D@W e G$G[Kpj^ $M3Մ"ğ#]k>;ͽWHmǬ;t5&;ǮeK^FV"B%ɖt.* -9'6/+5i_"=`Tsw$ě{v_emc $9L&WL^]8 (v$l5˦vXo 9tүz0ٷ#0#*_>HI{ސSvs eMRcv5c =sd:ϕjU0r2?|CiOy*3ZzJW_|pn,HF2 ؏98AAt (3nrKC-{̸X¶H NwC7S0-3Ƹw#VzD,[ 1l|1~VCaw*Tav [Xv?l,)N֬PztOhCnRweZvio^-=ya#WwkhQW̒o ]zIi=*b cl4w~:~YǹVj_#R˰]l{\]M5%)Q'D<-DYA4Ӛ<:_4s֩Ջ/u-O~ WюRvUMTi},[x$)!inh(x-wS ;%]``MǐbLZjbEϾbsDUag^Ib>nVVn}ظ|IIi=g۽ү^6]ӑWu'~ =c@NYF!.+,M4Q_2)a]1lE7T ӣBsәW\d)V>$jm8#d:,#D *IZV̯EM?ZuZ: 3: M}[U9VCjWM{ 0 O?]gU_TJ߷La?I0:A~Ɖ~S~ߕ>%83SOk,MZx1QMQgHv r^bܮ<9N%ƶ_,`h˯3׈oxB1Ë> ߈bqr<=y1]ɋ߳ 2b_Ktp6EcjOG7 5%ЈH༄-׉q…ӻQom# F.zm|I~lb7XGxcFl O6 ^:Ș Gwm[i﭂W]dKѦh?.&vIɐjjE@/,ʒZS4,.v]㧽5iq-j]yU)=ʦ0UCQvw?z*Lp7눓=86ܞj֮2$|(%5GC7 ̸Kϫjm8OG$M5(C4$wHHN}ѣ|!$}k#YO+WM؏9ǭb>%PcֹfJ"Kf%yoߺY`=8`y[f6b(5e$q|If^0›aIsGČʔIM+ۻkŭ -G_2eHBWJJ>Ln)3#L~+i8bё\zyxfToܥ^X}藑^f,P2NzpT܅ xR\T)2UU*Qu+O}S\۵Zn2K }(%Xh_ J׈Ua #]+~/ODŽlUVf6?ƹKcWuo몰^S7O%cK.֣S,N<0 qu5W?|[KF5['kTY_Z~B%8$J .@ 5i+Ge K;w?Ud ;=_]KT =IP,RG,mhhg3jva`%wj'e.0ÂO@˦ӞusYZDo5A|"tМ'\;wzL?o*IqIWCK-"ÐNN͠,W7!BeK*@X|Ys,Hd 4mke㭢 IDATh _HP=KqZVXzzz4_^_ꕯݿu kmb8TøRV3.33k %MqbnoF~EZcuRƍ2hиj|J=8dJ~=/p [z__&KO$'mRLV;+v<ƒ sՊ**CF4;p154fpfךcz0y߾U|K'C`V`Z#Y3ldLV58]wn#|YDHCA_Ǵ}lNNH,Ŭr .*-H[m<,?{TW+sFo_7w8c܉C{wutp;vѲ?b}1BOʻ6+YU{0-KqvZ!ZM{}Kr.k{~WYAYkVKu 6WDJljR|3 7ߛLX6}C;cSSFP*ӣNS 77,¼Aݭ )8\nVW" ^Vc'zCݯ'PN۩u&4҄uIo_o}51OZS&1L-]LHM~E0݆[$d4ޓʒ?_3tp+@^|yKbZ99k @ v,HǤ 4ˌ981w.6Hy;dO_u=*aFmsK涵{ 옄Ezo8)ɼyIP@N}xpt+U1-U̸֢)!;EIwW(L" 6dnj;GoJ <)ٙG'Hr.l+WquY o+,W>NnٷV{q*Ln ъw9t~ӊ;6`S%o[O̙yOOm=qW}+-Y_qXI2TK9RhuW qARec (HosdFcMnT .8T0{NUj9tJfq[| ?Wƕx VvߊIn}䡼_l;ǁΐ h{Fa7֞}RY{i\3Ư+O灸 /+gOY pg@|&dܴ|h%;-: F~@Rh7@ Z gh#) *xysׁz @ @ @ @ @ F ~f95@4Ÿ=gy6% nA&YQ"_ -ByD'bgāVO.Ik's[,_LjoB#T$E ;@&ەlx>M{oZG?F3kGWG+] & t4H2zy 0*c _NBvڳ" zTg)YV.Qfq%@k3֙eUu=ۏIXWX TtFϭ!4#H%OBs_1ed͏3l; y>*+WW8C5}ɔ *Jy%ĕLrЌ#b @4޶MMfo75p3 !OPU$nxhbD?{Z17;%ڑO %_,|6`/](/Bv5Jgzl{r%~5R; xrV|vF qZ@ qT?L~u=ka7szˣs6>48e&!dsWgw],l`yQkUQA+.'u|Ipi֪K [M?QSK:OlԈ 6̳}7l17('Dafğ}Mr)ĮG[=R_\zT{'[.u3 n}u &k@-Ӱo3bz$m¼dņf2lEvB,SGY0Y雿]L\Y{'Tv~y[=ctlJ^K'j."Co%Dʉ?G<|v!{ ۸YI7wjM&LBȖf4Ȗs0ɰaF(]u~mWb%X~R ā_֞~ƨ,nIx97Aĥ8HrLZ!xLB,fh OBHF=[C(or2?|~ b5˺}Nch^ϑs\q%Lƃ{tXi@rqmS֮@6}Mn#cKs.`MU ynSoܨ_?l,[.w|Bl{\]M5%)Q'D<-7B|_ *tbDm k֎f(e=:,G昍߱#O;4ors/_$d>|ΙVoO.9tP ~ WѾ;nv$2UGz}<5oIȬ^վl5$iY1_ m nh(x-VvJpYu2z3/'J)Ћ势|-c]W{$?.$7=߻9'!c@NYF!.k{_dRLvf ]ǂBV<ߔSќJ@>COq@51nI»R12DJT$!ua'rכ>ݑhΜHv֫v5e?6O)հru3"[FOɂQ]v ?ڥXڸc .6y6M\@X~0ZQ $Ѻ$y䞟{fx*߼bDHz]Fi@F01(F|W/0R&ʋ{MaK@>ʮGoY^:{)дFq4݆SUԣ:$|(%5GC7 ̸Kϫ.jm8OG$M5tꢯzC\7?ʦ7]~-%q鬃a]|.xleqFZ^U^xh֏oNTv\VLK:ZX9Gqɡb~X!8ܺl3^Le%b%jp  n\'po_>(QoJ+8|L vzuہ<0ƛ㒃?oĨ]3!63Z9Cm4=v};:a}dGo*W %cbcD$X`Egۍm=UA&S kڋ_!5{WwޝApl}+/5?yb&Oc U!C o8Q "~v*[ d؁yǑσH7066?I ȏtL_"r_aB#Hܷg=C޵{}\ON,iv X: ` r f1]lm0կy=(|Ld_ꍠ͢1q0YLhLXfsE4!]eV?ma94fR-F<@kkAgTs[=Ia.OqzL,&OE?}/aFft0$6gJvԢԷS.бVn8ïǯW׍WaHW͚MxeV9l MڍaTgkL\!v!VnyP)Ԯd`k*%H13vfIִohg٥1;%3sR+'4TG\csiOB(GMdcjh(eQ56&ad}.bcN$4Ojy-_?Y/ԭl-k[[[[FliqLݬGeFdF [.4^^1w<,?{TW+sFo_7w8^_j21x.wqaBI7Sף}bVVA}D>?&R@r^y{0X%OaG2]2< aUtI 8IXsQgf͟Ǡ3ɲs7i2=_YrvE0F + Um-%>qM5 n^WXܜ6Aˎj`]yifӣ$μGcH%$- 0%pɼS bvʃNW=ߎi;CO?[sH2ϯvs'/%ywmK;+Ƿ3:z<ク8W:-[ӳꅿҋhi;o,]bHQ?ףY]2hgI15 ޾͑MI9Tլs˂ǫ:x$B݀iCQ1y̸sm=ugoCۉ*ѿ,]Œ8C2NHfIgYipSo-VN)ݍ۸גMg?%2e{) ϕr IDATIݶTWǜdKjM/@  ׹i= Za'C= Y$;"v2%G|$hd$͗d*G͂ yǑ~}@ D[НطzR7="j @ @ @ @  ~f9ڐ@ ;d2 rܞr%ui.YA%S;&(AdXcM~lx>M{1~wC\Mhʂa*`V0ш"-˸xr&7ΑODZ@xp jShyϏW^Yzy8Qؖ?IUUz˓Y+>27"B2hzS_Z _;(pݥr6o:~YhISBf9j}y@51nɛwmsPP a 5$iY1_ ä4Eg^X[<6._Қ:[ZfSQ fh,M*bT𯬛5egUճrΆ90cu3Pr\s)o8g3 ㌄ϓttbiP+fWthb1j㡃~$7Pz۾ mCn7з3;滊כL=+_|[4kD~Ɖ~S~/I_G摥ӧ|7`M]멷8R8dy|@$c''}(d0_?,yzb3/ª1o0= #4MgSh<'3SmMtpzB_3H_X">d+I+\I@hüɦKf!qoO?m9HM-M>neq]LDmz\,->z9!_ (J{͑j w8y]^^ÈSInʎ82FS~ DvM#D>pB[3HOԀ]eծx1^}E{^_qUm'+(r3c2|(8E_NuY2QGٔ$vXv&!"vwZta.fI+~_ +ӊkދ>ylYg2NV]+Wo-iVC6-.p| \U`_͝q0 fOΞx&41's'/q+{B(Lo]O#dk-Aܔ C)B8 !̾mOAus7}O튲..Sܸʎ aTūs'IWǫ_}^_LoxzjK?,3;=gu)'*%@R0vT6{^z:hΓnݝ_=џ7Fˤ"Ie_3VMٳjK|OL6iyAVydgY?v; Up@,ceE!o7'aK6t@հKT/f(-n=2>+C0Wu/C9¨-QUyNڷ%Moͅ`=|+uDs\=A{ua[9zFvty- &O>ĜyA|cN]u[pω%+zՍ3₤ ʘ R PQ|oȌ qN-e oD'?ԎW+hN^K:ÊX_mmZۧX}b-vb*Ζ(\,1q:eƜ)sppqgZjpSo-0womtOd\gQ]?ھnz:?dzNYӚP29',1-^[ @ hmh>CF"2hk!@ "mo&y÷\闶k.}׃/m@ @ @ @ @ @ ð,ķx3|ѣ@f%0S [svHF*D#m } @YozZ9^mV3:(p,UwW}{)nEWnhۗP?Y0Fro})nKq2{3\)$is|;Y营܌W꓿dKyC"NIg۵F%[ )t=)wyq2]I-Fw\Tf੍˛G]*Fuȡzn?T-S-,;6APN6{_?+⡰;\o?=Ns9G|_LW/0Gw{3=YRyYCw iHӧSZ!.Y_yU?گqޫ G^/nXKui}ZCOQOA{eIrӮ0SaWNI0.bƃ6hYNPRN=%)Mky=ojӱUi-=oCw5ЦqeK~~−5 l:h񮕫HD߯wq/87-_tå"A-IEyneq]LDmz>פO$p $|(%5Gi7܍:wyyi#N%i (;Jy#=t44FT}:.;f]pCk_))ŧ OkQ}0Ï!SvK 'i^㄀kL`ңG.LdGS"/zJݸٔ.^nE\2H#^^/[iqS\| ҏ=_;P2u=MȒu%7$Tv%hR,.r>\,d)hP/w͏qŹ+G-$,7qS\]Q?iNq~.p>f%:G =DK0.! ~Z^ qj_K+8|׿1zZu衪G(% Ɔ]d2%_cH2]T{iJ꼈+ןGx=Fp|qjε[Tػ3-ӳԓOTHV_D=;;j_e8 lMOT -Y}wmsem͵p~v*[ d؁yǑȊRK F0rd91]lm0oTOOSf U!C o8KVW ҵ?.Qm$1 #]uqt2$a5xUbVVA=w&Y[; 1gE!mUKc"4(wmW ^-iQ]h,QbNֲeXj4EezTifvqwU(?X bq028C{;0NmN|]En® 3ֽv)0teߏfSF=6]GmƊLȚa۾.@5eX1y#FwQsUէzۧR9w3E!2Y[2ڱY˦8h/6ʋM΋Pv(Fd]U6|A@o~ǎLHC~?$_8^QK=mu+Yd~3{ g{/*m"L]װۻ'W_EΏ`};f=N^^jY;6ۊt~C=={˓s=jxUO!jwf42?g'%a2GZۿ|{Y T!#:FGdiX\W2_į25?aWwbu"Gw^%wIDQwSeUQwSѮ,@ @ @ @ w\GǟU4Eh(`E hD5jT$*`%+h0-AE JQA)G#w|s=yfٝE @ @ @ @ aXw:{k߂@&D ]gN&@ /%)l.>~JHYos&iuOQ{O^w .6z3FINi5-n!>h)wQPud{=Q9ఇa"ыL_^6+-D9DFXkC /!ٻ^ygDHzӶk}zbהnZy"sٍ;ode\5Z0/ z}`?EyփѨ921a K i/z$z#u/yu7ęy> IDATO~C?#a\Tmf,vwѥcW" Z筜Ї Uot6)ӷֈ}FHR?$M4Kq]mkoڊwSlԃ)}5<U M錂ƒ[l(N\vC;3}Α>>W_gZ$0 [@VQ}^S M{o9x8~sbCG5(\)Z-\XR0ǛCfT\14 0KᅢagO<9`xS5-A3̽!"M\|0C%LXځ}W| X~0kd9OW,|tdͷMoFTfedH[XUIG9oAR7!#n>.CͿ27S'ECe'^W v$x/A-8*Z߭1rfw{nM ƕo?ްukp5$/za HW|imm7˺Rkoza68GmWc栵~ru;9}TI!nL~7idWOlK{#bq;+R_D,MmǕ ,Cׯo%XWoKv:MM4eQj䡟X>0Iw"+zc["""NqfI $@x=?ɋjMAzT Sl}Ҙj̔bU:WW= . :׾Pibe/zOiۨL8#$(vEs]ct ,smch\{}_]w2.0LT*ݸrK]:? C\X ?;y߶M#\,_zlRy?JP8~q0"]fr[ .)CTp۸zPmu&ߏk"_6 D~96^1,8El.?9nnnRA{m*ɻ<6kSNn?](>?Q{ybwqa5oÔW&5KDϾu}=Ţ7`mZ;E$տ^fR~\T*C=^pb{$ݡ.Op,oa$O6HܩBӪWkrTdmLX V7aʹPUABnvt` De%e]O j8rǷwf.-=++yR!:1R΄Ĥw&4jhFhK;4r.ۉ EDo5Fu^[c l^po~buDXy#? .UgK^ܭfc@xSV<-,K~4t> ?*k8Ue)I yΟ|;zІx<Lx$ew.7h&hN/y~54iJ(R хfyW#43g'W  5.*bn~ޑ ɩ/ݿe>.oJEM̜.fgj<[TO&} $M)ucKDimlhz]G签^Bshl0\⳼`V_|*~%}|2 AI<¡CWx~7"q2 m\ȭ(- у+N#x{^HkRT X=-Km1q3S˚.AQ[RpnAF%i1Qzs FYEI ޙ Xkhe3>'H"z9.8U3ɼbqLNF$4j9|pwmx[sG*=DYz[x+yWC֢=ƥ_yoZ!f{ֳ+l~l @X.3 KijJϸdUcMr+AL4Uj 6  b~F"2T54T.gbdyXQd'^DG(8Ïź?~Ywi58#k-^s^F=l9Z,F5 b n #+ R2J/=sDX㏔{0Q0ٻ)^P#E<>6eq_TT[PWM#kj48T*]@34QV!UJg4R0Lyxq.oL*0 LK&hkCï&yL^\Ьnv7rbg)]8~]-ϓEB8OJلǝw͢@o<fKML_m4;~Ur ː<<2n=Z̝oGGl{贺& Lo.N؋5=7e~Zo&SUɷ^RNA&PtF4]аkC{O+K{W"2k :C<9ՅEp:揝Iaǝ_|)M1%K'[FzؓNY9D]:+`er>kJm/]8վǕ)KwmU~gcoyzĹ{D(MreyɆGBjeh=tl+Ԓe~9nΣ/88U . bjŁS ̻*ߝnX;Lԙ˧PW|nFovӺ~0eCaq͎; mҩ۶./ҧKxճ'%/<[Wq[3)s)xmrp%ܷkǀS/]H?켖"6=l4o_d۹r¼}5iD0mk XǯThMzLf8kVO*=F+'7cT1f:ETs|G/adaªD>OFٕ .]XRN{Y#!ANX;`n]?=b~wO 'Y6]2ӠaEwΟ8qS[9ߡ 0.H63;1~UΫGa** msQ|LLg#c}| g\oJfi<P0Y[?/BjGNT,_fSuȶMV-"[;y=~{5ۯՏ\n>rOfsuZ,Å)i/z&______MgС?m+kaIL݌)dkVڹn#: SNm]E\{:""""b=K6PԿ ܺ;g)G icAq0(|5x#BݱAPdӓ9r9+%ҘLC{ wFU.ofǃXZm^T~ <Y5vgϟMjտ i`hxx#[YW.]{/45|ŚJzoTk6(5?Z;oadY;ϝ j j̔bU:WCL=AeVgיJt=Me]O 2EDDj4FP(͋.X'*Y!4zO+F0*)<\]]]]߭lr$*HR =s5^b`&,^n\BNX.FRt'o=۶z%]~z<'=DE vߒ<~_fH,#rAb>a"ի7eYz˛{xDsUbn\~5`ͪJ-_;E ?d1.Qs| 9)heBTfIeEWo)[> .|}=o2DJƨgt֌uh|yn9/(x U:2 -*JXw˺>7`mZ;E7<:BU\JjhH9VPޙ$ ryYgPǻ {x% <(r.ۉ EDo5Fu5۫kڲTwt> ?*e'3Q1eNdX*_fRM'SΆ6ٰdmx$ew.7V`JV.G_=5VԾ9;ir^BCwLRC+Aj\T+#S_>E!@+}\ ߔ9-\8΄ո'F_;=wjШc+ټ΁ %"H'Ѓ+N#x{^H} cRG^?^X73Y(Uy\dT*ŭ?tC_ݏCK]l'2m]XT.V ^̀屆V6[ 3yRL߉^ڮsbg%ߍ~z|%)z#q9'_\GuXhEnU$f(f6YD:`kȸVչDa;~2bw6lyz4wzS֭0D)/B:!x]j% 8|zp\,xHf;4M'` "NNeC HA/i Yc>T ;:pe'@eK_ғ4UIj/z´|2@*^R++kއ~~Soڐ*8@cQk,;*v]vݫ{X3sw%*ۖ>k"uzx/CnyZ7<PXLh՟ȢNI_{< u0fyF;=ƥ_yoV@ 22xUqAHf{ֳ+l~l @X.3 KijJϸdUc͆;qNnzAMG!IYKQ䤖)l+fnBHHKyzFAS[SQo8ӿ1SA4Uj ?qmA_X.Wm׈*o.b#du4/777777].FO/:5m(-ガfnB$.ˋ8UBoqD*ؑy+Y#,qGJӽf(Jz-5$!/3ŢH0;_P&O5XQS 4Io[ -B('ϟ9PKMhHKŪ>^|+:l F1cR5P1 0}{ZwZ<+}m!3)KAs9j4;|Kz8}-+ۆUk)xjz;8k/z$SmܐZuYJz.>V}v/Ynյ]x2(j͠$dBϳn*)`hkCï&yL^\Ьnv7rbg)咯ۯanmȏߐ㏕a/y&[;&d>8XPq)b|>:fE0ixMҕ6KWXE?n2 ]i! 4, #Κ:eE T IDAT>7)KqELDKK"fGN/J-TsD{ ѣ;̪xV&U=/V>s _|%zJ'GEyy8P%+d]x<:<-~IZqsMkAxq@MH1뺇75&?eN #,T9%pm!:{Ѹ{$O5/Sz0u#gW"&̻wacI!;e]D5{6/عxΧb~wO 'Y6]2ӠaEwΟ8qS[9ߡ 0.H63;1~UΫGa]iemsQ|LLg#c}| }HS~7%u׉4(,]!5t$k;׮~~uɨ-}~CuCWVKҝep";e]d[ρ//+pm onںeGXiF7c YoUŷv[z₤nS|׭58&ԥۦ&_z.~YWZ}0wl?[q i/BEF3rt!""\^w9m_XHNIDַoXr#(2x=j޸Ԙo_\ɻo4 ^H&?+"KS<Īޘ< ьv]8{ {7~\Nқu ",Yreݡ>Ky>YW.]{/|0vEs] }s5^fJ@X*׀6AeKAȭ,ŵ3zXw˺uVNyZyY!4zO+F0*)<\]]]]߭lr$*HR =s5^b`&,^n\BNX.FRt'o=۶z%]~z<'=DE vߒ<~_fH,#rAb>a"ի7eYz˛{x]J ^˯YRɠk:ᇬ=Ţ'ETSG;Fʙ7΄&Qhm:?m@+ U8h,έ1GsN\/&}|l&yN6:4^88ޡϧd_FN]Qp.;O.s'UǂU2j:r6!φ%Sm#/tY\Sr'=820وLZIWt_HxxxxxxIjh%>"ώW}{G&$|vBA.f [91ŭ(-˩w>HlVx=c/z$ilZ^)I*9܂J]%b\zC_ݏCK|i`twW0܊3q˹dU]ꀭ![U*kpٰc$G~g 7e C!sץ]z@筟:<ǭDﲧzAy^\W:Z'jaGN<AYo_kH,=qNLspQu۩uF;?-|8OfJ%>?'*8yN9bjC'E?@T\ w wF}`-lHZo["<~z ej @}~b1}nV"~:%}~<׭@U"~Qmm0UyY<P*8Z B=Y̕{6n[g6̨8''Le]W$5szEZ6G)˖q)7@OH#h*psc* g2fu^tC{]}bp+F6f kDm7 1HU\WWR.#Ќ6qAV37IEH!x^"CUSCAS?}8#^3LdTk|=ԖavbQx$|/('`()٤l @1bɠ ebZPzO?sU%v$ȉtbm``5sv^l>jLyi_p8<[V> .g6IS ԰Tywpl^t Vv?]ߎR~+k>Lyxq.o<WfPd\\2!iGa7r ML0~NL4[sW<ʋi/.hVK7ybijhd9mFrз_/EySۦ=x!+O[9D_MvM}q0-e.S}tF=-5IW,]5kc^涓0Bk0xtV,.u [8@!LJQ/^dņ]u@uXCFwQ GM$W ̿w!ߝGr0%K'[Fzؓ $8dټ_0(tG mbCz-ز,ᰯcWm,yT0<|waon\2)Sg.F#@]Q/fԋw,lmq{X|ͫ,FbN=,s߶!NGq;?Uؖ. U9_yy+~:.ʣ|S?XE%ة,Ap+{F @ _&~Kl"@|"@|Kw/aJԽU>@ @ @ @ @ @ ð/^@ Dk&Aza~mӾkQ$ҥug?As:?MH rYs<7ѧS$g=:h+C]λ۝GiQ;~#|D1]x_?;/ N)Z筜Ї Uot$Uݝlt*գžM{`> !;†"1m p-uۖH~)=b.;!VWf(.=p]s80/H~FG>aZ=#̪ǥIy rۏ7,62-{\ I˩:c7#Gh}[MGIQL,T e7ʜ6LU^KwbE퉳 seNoq@D3{0Nvţ'nsqZ+'ڳ׵kq7EAuW~ϸ₠wAU G%Ҙ,p**Dۃd `6WO\vf&z9꥘YgҏGnղ/ox[3oZka'o.kӉ̯\W-f}=xս5" D@w|EsB6,Q9Ɍa:JdQU?ndY| f{t{8U/F7v\ᆊ'ѥc Q3/'9 yN8C`ڸ ؝b)/Bs r7We eҹ} !huՙŸu&]O.{Y#1'/5mQ1LAwP' CŹy+Dec"s7fXi(^vu A.O7777  0x/aUz]q 95b>tփRt'o=۶z%—%$<< оY'Z;ϹgǸXG]OB "ei s_P1,^9t!(Q͎qu&HⷻCCΧ]8_bс'ru%R*DTSG;Fʙ7΄&Qhmqs+yQ~G3\xj۹k zqqC{IɅ?oߡE3|d_P4%)#39.y;5LAE;^v'r>z%YqW#RXiuh)gC恳aTw&z1\Jo3V343g'W N&@'[QZW[F Qz ΡeS"nfjY%(jkQ8-Ȩ$ U"&[/}yQ.V ^̀屆V6[ 3yRL߉[\vY{} cRѺϱ/R8|Dž|LuHPZ'$L2Z5s1ܠ*,\b/-ry0dD|QMq L{"5ۊ%@EKE\W:Z'jaGNzZ_ғ4UIj/z$^OFz5}Hjo:|S[)Du|h a;.;ȿ9xۖÅVћLRH"o5r?C6_GH`hjqk{C~Qiu_d\9䤖)$Mi\^KyzFZAK[tUQo8ӿ1SG̀LW 4ێ#1 ,q!-(tC6f kDm7 1H/-Nj&4I⢾Q)PPe;OEDj E/2GP.zQ0MbbJ͍S#jIj>7b#v&~E-‡@&MTK @ė '6[s$iywÉЧEY24\h)L6SSMG댽QYJ#ϲ56ehosOǵtootyVium*j@ ?'&9ISzEǴ4 454YyJ:o9|۴FU7461U!hF*d Smܐby[ {[*Dׯ 4Mw,'P>#P :j*0-ⷵz.S}tFNk7]c r܊%m@Hڎ?yvP]{6V&Я9y#&Bh+E_λPN{Y#1/Kg{L,ޑ_Χ$swZl/y#eWl "#zAwmAU;ݰ7чw^m7.EI3OW(3^/8 {Ix?`o"a]d9~ wBnxӿ8h޾ 6v;0okOzO\ӷOqZ ^oбX0)*sey-DlzD/zkN/Ym_<pou]GIw!@  -t^[zmOrSX{ݭ$r YgzZ6b;y=~{纵ۯՏ\n>Y~2sPjH Stt{ø׷өjaX[I'T!M^jukw\A\t׭pj46?))V<y$$@ m-BDѓ;Q?@P‹RX,.O}&@ieX̹`V3E-.L{6<([-l5J(b QxXZoQM)gBb ;Ds4>z%YqWxCk%wh,p+xQ~Aưx\`҉򪇠D7;2`K ]GRe/_hrA!Y'M63 Wq)Q8c<(r.ۉ EDo5FD88ޡˏ!ew.7GP00ɤ 3]?^ .f$D9 `58Źorҟy3[J1>սzZٍT=ЌT>TSTL{ӾWE|Tqh4Wap4[c&0 'ehBnEI1p_\\ou3ԧ=za{(aq'.HeŽ1Q,i1XC\ ^̀屆V6[ 3yRL߉[\vY{w#fGh&*i/K' 2 q~2l"A+sNN- ]^@Mo=" /W.$8.Pr 8^nCA~* QV*ߨ#Exc#?asHYx7==>F@zӉ%p7t6o<Žϗq '3Ήi. n;5^tT'ݼ2KYuԩ#pa\<{V@TWڻYv*.U섻섻W#>f=Zo["<~_OO+ؙC(u!<X` ,֫S |Qu2#X)0FIc5rqab*̵:bT AZ B"MM:YȭmDŽUYb޳i:aF4aٛ_ qAvvg׭%7uՕ=*kvұ*c9&Z.g{D)y=)HZcS€Cֳҁ`0TAql12_ӧfd϶ )gD?>]3c ̼9z`֙W~vMv>#&(MO١i]}6Tc3%Bs0lbfۮ_٪*0>dv/$t?к ;D3ɹ[+#U6IU&k\ES}*'ũڮݝt i,"M 9e@+ss~S&M4^}'AKn_H(*S嶞:EǨ|0~#Gi:.vqjn}ܢysfF$10 ^[ #*ˮ^a|<0sŽG?7u۱ɂW"<+uo|b- YY;&/4(+Ƭ5Z3ϑ|MRr1ƢJhHM͊bv8z)w|1*G%Ѿ K|}.9vgUv!M8l`. {6Թ\jS~>2 Kq1eʸս4숻> I~ĿGĿ x#jJY7|N;<ʖ*Ѡ `0 `0 `0 `0 `0o~`0L,^{? EH|l1. `0 `0 `0Rj4V0b~ܗJ^&k>H/jpqCnT6~CGjϏ~,g.QSDUק0t{l1,fu!0FIU`ڸŋ/%pw=uX Q"u5T w b1ٚiG{nJj7c`&j O|r(ͼo] -Avsy^Bu~ ^zh:p۬ۄC;%9]=~(Az9]>㲦H*!K|vEf.7t}lMӹ#gki~ڽk_A La Cl#$Oxe*Y^~8}0̷p{DKRwcfDTo!u 칒x KFqbck]_d/|{Pa~!R Um;]l3|AХ#e ;M *}oߴ8Hz҂9^H҆3 z-^?U+BV-,4QX!MXlJxO-klRB1_]_#Wl}va5fz*4Fkᜮs4߫rfy.^4@v|C[g=5d|[=r0Uez28*3Z+*Y^>tXQ vW(SH,7t!Nē^R?biRN ٷw:U\@@heQ|Yq~b^vXtw9$qKS.^/vˎwpaJغqiLz4ϼʛx)$걭G7'M8~h ^@\thPKH;T^ҝlٖEuC * >{8V:CG~]}q)A=l4+*65mȎ檄0nE Յ3Mo:EG4٦=2n.&^ )GylIu[7Ug~@|tȳziAR|l"AnH^0w0X E:_.WroR/9-;sӂ{hOx+U]ɓYh0D|>b‹2 ;7y>lg¤w7v_MPk1ZjSpQ:rގlyN|fHzܙ쵤IOn` BCr|AIU)iӐ|]4*xH 9j jl&NOLciP|q{1"D9{^*\ K BNG!YvxpAՇ'm|"U0MS!+Z>X 6QTQD,5Po|"ۍri!|+GbD'/anY˧$, F]qc|;qlXGF(*g$R6Ƽ8!mc͉LuwmN\^nWZ (?q٥$q/43׈{ cS?R` L C>YnRnf! K{.)zT&j Н|OW[.˴hG# Z|5,>򛻖8G|m.a)2~gϞ=gi|5V}H56z_5G4!0Ո^EBN7iB(3<(4Wαݞ{"Cjj}ߓ9{[sgWyb.˼wՔQ;S:c7=iׄF/l#Ҭgm\7--[:a/SYuS/Ue=r=y~vxƙ[_P3ԠCfdLJ>v4#~_\Z G’2>;u.֠ToQ䅠اg}^q ӈ{ My+V rovb֐;{,^p{ #u- nJw[5oolBt%5&/J^xpd$ff@VepYK]օlpZ*WcQ >0&~Cח\]!6jhI^HjL#>P?DI9gڔ8O[pl3xI~zS$?#?fi\ۣ% IH_;soC"^=x.M/Kʑȋ ňeҶ4h^whI .d=K,yPx+V%Ņ!c&p2f%J _o9z [ SD_N-ns}?oͷ|^+Ets(QxZط G(Ppn΄\4?5!)A KX %:s>߫XAT.\p˙Prǿ+ݹpXo|MSGeBG}u.܄oO5X'AhHhƣV.NN/Ȃu*8dqG.Ϭ|e7l3%vKv,uzx+T֣ooݤA@.H 10`c=eiE26ӭGs] !8-]-/w9#AbdJS}SΒ!A%) Xy& @ծ@0)4}BCZakXh*~翪/(5]aa#,#PN^&B\,;K2\. 8l<&[R >u!|m}=m>k<:_Y^>Hjkك䔜fdq/߶rb+f\ ͉JP ͋Ϧ4LJN0L54ZJ72#tӏl0{O{3.[W@/MĂ9*43^ϓLvTZW֊E1_ʑ@ԛ[t7qk@Nw&=dϩ$5sK5$KNK:e@رWT mMM$Mtg@(46R}'.y @WKSAS%>F\c 5 S몾o Wq1 (At%\[+/$rDxA%Lvr0I@Eu[ޓ!Bxe(=COh8Om&<Ҳ=zeJIptJ5 RK߫C/Wro`߈9nޤlYB߈#]\.%s[nLk鰛eT׼??(S } _WfƜalj2 sǎ4w*2?vgvWw=4M 2pOh)3zt,#؄-=(61Vb˳3^olCW-.x(@EA.߼W]Ez)w]^~YPNTه 5o±ymMЭ{Gw# e˰sŏnifHhy1F @~&Q^2]B0qC[eݽWh.U.Eӭ~rV1qqo`Ϟ][h;lpv>ӣ=oD>Sw˞Oՠ'fSz=Z=QHU\ˡKӇeة[ѣ**~Zl}C<ݛs?z$BT`>ۙgG+74pذޜ|ETA\n}mnR@s̾Op\"{uD>{('S2yὝBHsw",L|ơ+;k(0 `07 ͦEq`0 `0 `0 iDwEb0 25)P.`0 `0 `0 h!jsA&̷ƛ{ `(9>Q͝ߩ*Sw ~Y*R;W[}g]o(]-YܯMuT3&S7 :m?>Mca du!N]p-].^|)<o>x ًa_*r\4W%dɗϮL'tgd%F!)/s skȶc }ύ'Ut]wR@O5JD}^ɠ[Y$e 0iDӴ OtĶ#$Jjy}KI=m4wx.mд:˳4u#Xt IDATLvD9V?^k/at6킩уH͐,_ݭD0l咽LzoZ$o=iy K?C>*~Cׇ[Q)yx!~ڄ+T'fwXMNP&*3QJb;: CH *wJZ{?UVgv<ܲBNN^אI|9Pwf,Rǟg ~ ?~hPA%YcwF '>@s*}|$0-xD4*+L)!6] '8Ce@'g9q> dfTs O9jڄl=ѠF!,S7\y|T؍WYG>ೇ}{.F W@u~6??yZJ'Ն3Mo;{-â~~~~~{h5]lSf7^}|4nTu3<~ahl|tȳ']׽\WSWW˨1Cq-'o,lŭd-{9pZߩ2v^fw O۵jNi j-FT~COs7C֧<>~dS?l9f3~~7{wg۷HM!ɥX} !LC9?*;vc.6~Vb.'?]8^C* T,Uozn7t}/O<˧:$^5oފOq4Ფ F?SF5jorJ7džeH YNxH] Rq076n˧i+eP2YJTc'vXj8ROf*tk,RS$W]qe^s~;b5,^US#@|Nx^:qo!B_iQE.vt. ^>H܄CLzϘה#{и"$qƒ̌W>rl OT{Lă䌴W7܊ywQTbkTZk1ToQ䅠اg}^qz煞:Yb|B8@JĹqiA}_|>Wɵq^i S'T0ABeh'_b"Ff׶*/L/ I X\v#*uXܳVѥqI=M0"2{Z=9]Պ#Ob8ozyQ`_|qœDD/Ҟ[Gi d ~}lJo|s>;?$d#1[1 AE&]omѹu 6q١7NJuҿ?k:OZ4Dp~vz4'"Zݾ /E/.D΍q73@xN2BUf~ T khQ!, PX\6L-3]z.@QY& & leBֳa83:[nRq2#޵lˤB)ʃӾE(sF(9;R XC/o }nŪx")09%jzgE5eSY<fij P yz@Bw*=< R$} J\/ukMy'Bw/(egH%^Nyλw9 !AbdJS}SΒ!Q> ծk͇mbUOlY.Ѱ(=}Ep -4e)rB!d,*KΒ] *k 6QS|ek1hc_|cC?5aaąus<|ڡ~AXL԰$_J,"`k[3+>F%Cdɹ[+#U6٨L$z} hen޲Mqʹs2oe4O췡_0IX.s͞=kLl:LÞW|s3I¢JY {uLx*kpRdųZ6Mz6I6ܤ ))iRuX1۠O%LZV;qh&u5os\?sQaX$ۨ7/D1_Ǖ->'l?id[3}? #\t+[`0u.c}j7V}U4?^*a˧=!\-<:*Z: $QԚykg7\b@J}r }})448q85R~jռBmUVwj{M^iQuw_Wۗk}懔Eb̚՝} ŗSdtf>$93Ưaⳓ}'@@@e?9yk# fh/Ȓ%_߲K{N]tU]HDz=XK(= c%u.B@ZW2ynVRpw/"}vhLyëzOqRp r{ .qz:uɂW"Bt}LWj `0L# (#<'U|FEQҮHz$xn(ܛhDlRTN|I*u3>>|[n(Jq{8K2EQyQVUՓFfS7T[h[BrݙDQ>6=TSz_Wm`ƕN[Թ>Wµ~(Jpߤ漺|%+=" 1d`/`0 B$:tXe uC ̨ wqWm껠WY&ﺺ|ڗA)aRHDtl2b#ڨR5>0ǜzvj~o Bϵ5É(ENfdR5Se*}%zfY{M:<~kVMX~B`0 g=(>(k>'X`0  =F(]dwm37?3TD!AB8lUBY@h= YhL/^hb, C(hZB78mCɞp HU#Zrn"=ʕ#4%tJ2X\25@i=ynJޖG\*5ja/;.K?7*<׽;~PO}KwO ̱fwfYJ۱8. `0  ):4M luA+F.@t!0" Koҥ{/ g} /<"$q!THn@'5N}!>)ֳܾV6pT z0;WYV/i-rէa۸y\ܳu4j{_"QNח8r]r%7>v$!9JXy=oTd2ڣ;o,6>޶>>f ϮA󬣁{{igvIdKX0UrU6 @CGN=̫\E<5u `0pBWݛ$"Tpy촇%hBo BZ|h!YR BQ1 +N9oV+!UsK&×ٲxm_ѣGlQޥ|%DcB0ѓNiMJ㺏U 9J8oI@mql__/VArkjj *XfuzQu-]i Pmg @t8 (ن,3;Ut H ,nZ[۱%+#H.+-2U`0 B8%* *~wӼ' FrӨǗf~c'sn~*ZkYu/4󫡓ܔdDV U gB:&/9Ԉ&5ȋ2#k҇nF:&$I(/WlSww(LpvN]s@sTą};عHPN)%h%k :5PPgeɱ`0 !t]+Gߏ"t 3*C6@zΝ;w\Y^Ҁg-*%oݨb?k**Ǘܿ6d,g5kQ䵇Mgg# R~tz*ԧ~d5iXnm!@,(i,fj$oޯ>@"QJhV\eܵe8\\lʲB [Ԡ7w@ZyDm"J&M~E9=bU'C`:9hSCH髽ϟ?+v|_k'e֐_&oӤQa0 ih%A/ݦ^4cO}Vz@1׿4UxF^Zrces60<#T+eѱr2b#s斝 cΣBBz4ZsWe%A2 !ҳ l=I}Jz>~urt,;rK 6Ju~g #DIjnOB^w,|-^=6) 9~cBnU,W(cld.~M!^BW+:?|K9$o>|$A攽pmUSyj=τDVQ=B<9xp߆l:0Ay" `0ͶO3f[b^飡=tW+}ͤ(Q&+#) YlRo/wz "V4g#o\VXM| v|,(*}B oL'rxEQTJ.+^ .PuI@Q? Bj\5r'J/+Hښ3|./V]N炳)rC/W^uD%'lFx"6WBQ%I{^]:/"|}HN˯~((J}"]56&SFQEIk6B(AlQ5\0y(J̊}P2ͭ\U`Y-|OQTxAxZP.wU_J7 IDATr$1A0 `{`h RO6Bԣ_~! e5`mw`0 Kmc_DdtOr''z-r3eEDs u bԾyտB `0 0^㕐pZ,YLQEF8 a`0 `%zQ=]M8 `0 a@%mp a0 `0:y`K`0 dB־ZO|e:u YK<m߻Y3פֿoqZ6Au2y|⛶K%nQ# -Avsy^$~ ^zh:8] f1[ڙj0},& N3* Ҭ{>L+|SS{;AL*&gv$e9>|+J&_ G|1u]muXTa\?ȣhGtI'S uS&hL>L㏃!”:iL,F~Cϼ1k}uq̮~feڸŋ/%˾\?7w"Wq׷\.Kz9Av׷f\3ӆwa bm]{Nohs.! gZ`0? 8{]Xߡ[5.b S7]y/W=fvD= l++t9./;2Vd[-ڙ2M֫, o;h.aINN6zفy,;'w3䊂g&MGVjj AnH8_r#]-w Pde_]%ѓ'cnN(+& 4یhulрL9~xS@ 2!1 mToW2}Rdž]^,^p1YZu}X1'V Y鳇;_ڍ1>[q^ߧ%VuZvCF$ CNVLȭvߑeХ~~pډx\M/WyHGxe.ul}od $m`w+> +C"?(?nx+Er]F8_V\T8IsDcظPFTbb!x\$~.ͯ.`0x .S^%aj# ͐A,;Ъan3MI/Xs5M9_|H)Iv;];E2\j u{TL]\UM[*Di{]ڞYF~<4*wՇ۸-Éˋ\n]]:Ҥ sG]ߎU5u? KCX&jY9֍! ӄmQ߳L{v*~tM>aX2#ks1zo;}l6ן,ԙt6}TІ+9sbD^ ӑeEuZMZo| *OIJ t|=u.Cb}_xTןf aj,7R0o=x=.: uCMiTUǡ%e}w/IW'}MP*  UtCA hg@LTZ}{>[vL<1Y9b* *ƀ$( r22%JFնQz&"}xѩÄ;z_w;qG,Ϭ6XZ. U\P **$@y Lv~C˷brWɕ'?K@1]1;["C5ȕ򄨂܂hZ_U6ƣU_a0X 5įʪ);2,YT;_6nф+=ET?i2?n sd hcw N )i6hnG~Q #U::v w>aeOҬ䤤Ү]BVX~(`J۔H| Ϯ[Kn8ї<-26|>HKdV}TBwco<问1Ϟ/2l-?( >L;fT;MKOLBRaU)my$ǒ  T$f 9CM?Y~ܫǷpOdݡ@,oBNrbZUU Lv~9}ڊrKޣ+yeVK(ͭ,WV.Q_K6[UjȋR%<Zh2R Kaj[r VX+%E:__m^ok˥n8p`T̻Ք;7]3׊՞TzQi3eK}Sv~SHn$s}^;@~r׿_:}^vvSFҁ({nyx]ϒ7mg֣_'eqyr%YEQ߮*Jt:U|G %Zv,F;. 6Ʈ_t$+Ⱥw3vx`vYrɆ a+AV2Keť#āw2 W秝Șhh:D|*.UqUx&&XJffr2}xTY8od {ݩ7)/G#l=eӄE? D_6m9s5_|&۩;wØ{wuX׎xW1R%y‰SΦag M`$Ru@~uW{KY5gHځ&ۙk/݆\`8;~5=&.vvzn*L`nA*j{(9j~U7n!&Nl3oj^ě;仚 '&5n>Czk|E !pr97ofΜ?Dg' }&Sj98 >O{m?9)t2KɩK}/w"^m]!ĿL#ѿSy̎sZ礉z2;=(<YjMm;bWخm(S~@4@!*"kYEY9'D"&EY9Q.t5>FD+C{;!L@  qVG% _^0?Y'4"G D@BЌx1SjEt^Vٛ(@I@ ׁ΄ `0@ ?L'K4QrRHN+VKPfj8YM-G淗\Rf^sD6]eή*`,>o6;Z&z7eʿހ)}W|j/7 7X-Uq%TRm5 B,>N^uЀ/wBdK5m_ߋYa2}s{ NV&.Sg`M~Bn|~歫;'p-Wi@K߾3ˍ f/[+[UK\y.6}Oq߹L>T\ͤI:k`W3 +0=sȯ$Oq^|ƮUL.^tYhIڍuSže2 e׋> zY~ ڜ5}&cu@Ńr'bNlkZ;{#5 d =mwy|Wx,jW0=|&uD X(!hM4#"^Ωśٱ@r䛦SH6IawsIw\=nӗ/Q.rp{98y}C.V\\FOj^\2kIth*uo]VȰYxޱTԠ3&}Q[-R=-dCI_I"_zCuqLekE6J ˡ[DYK٧fdREi774COS~i V{F4Qi\(ЄƳ u6il Y҉!׀g8D¬Q~Ғc _xdTTT=cM@3?BR.KNZ[ #O5/***̙3gDEEEEEmqWkШӇ7Gf7ߐ>sҨ{τnhh4S?iՇ4XbhޤÚlb76JMa>5L\}A 5+.jභ.Egozwiv\ʩրSP@ Nt*,-llM J-+wbFatwNTLvF*]^o{c&3z/ k't0daeMAAchMl]c}'BUCj2oAB"#NU~T}gNkZ+>qe#kmnjb>0 p>~jP.My '\QW._@`0vJ;LNDyzRz{ @I;v/)!gj*CeWcur*AY%;t{dH=p*`ފ|ѭ)wGDƼRBa9vbRnt8M, ZL\YWMIuj5 m}:[&{DQ!ۖ<}Xל'm^8i󞋠xI9 tE"Y#6f kⷺQ5„|v^WnOb pЧ`V?u!J*'H󓩧bBt<&[~)mnCAadNUOIJm4G4MM4[zi E۳,ƯeH SW 񤫕S\n1Wc q*%].unlA IDATŻrĤ2r]G058EWcR¶ f*qE&nV[]ƚF]ww\n;~mKpȃTCY2{V%r1k[T.j GvHnX>sXƝ@{`2s}9BT'↓t(|ya9g]qV࿑>_;zE>ijwyrP/ *P;U+'h/Zrÿ Q @OuEclgӛW ,|~;}~# ; B^~6N!CۦJT(@x^ ,T6qUXQi_3Ь1}_ o\5{q>0 q1*$(_? V^}hxIaC>"(aEdG$̴)P$PH96ԹZG<(xăbrD.UWOF'xn Rů+` .d@$ɩ3Q3aW{;[;5-t+O d5ͤA/w|l´~bv) :e[Tpa(]NT@kFwJwvDDI*)_.Sric;r\wа ^\IHUiN)M*t.~@ po 0s[=0Ħ?^tDEf2[]'=Jmk Vѧa4G.۷o߲ $C2C]1"$g ȩ:.ᱬvafN"Z>5Pk)CT|ZksRڨ7C:S/ä8c f-G#]?T<ȗӈꌧ_jQdNs33 +$W (L%p:&,7a7AIګ؋m[e`&9.⼉8|0ؔ!"0*9KضJ 8)yBMSV ]V+~u[G'EYKO\\a:u[Wv~V >18>ɩNK@ $D&i<9uό:sTWSS3bdă0s 3Cu107TamY' ۭcnΓgZq?H}Bv|Ui{[;m:ͻBr(nuK?X>~jNMyW njrdZ^_όl-:t?IV r+p3^|NY9JIy!z z9ujVGϼS'Ԃ$J?9O}v/t~da}(T cyiĪ׈Y˦X)$*Re(S; !7L?bmթEˆWXX܅-Qa=Y|teN>sTWS.#fj+.״qekӱ˔K̻t鸢6,LNMeez@4@+iv,F;. 6Ʈ_t$+Ⱥw3vx`vYw%I)V e>ʊKG;Z9d@"yIn dXu4{A["r8s*gw?ePf.٧v 1>,s2_=7:,[lRBXXxhJN#Dm\5s!j8(8aMsԝ;}aL潻p|nr. 'N:[w QV<كy"S{/^8ykUC7쬞=y ,d~x|QMa)gGMZcDĻ2 @ ` Gd!js~Q|=WV(@ h@ @ -mB @ h@  FF 2 $~Ҽd\N%7_!䴒hza( -_\M[?|1m~ ;Ŝ.Z lJs+4ǽͫ"ۍf3pAe4A D -'i6}.濏9}4".O;h`_b<6kSkcuJf\!s~*8 9 +l@9oP[=: cBN?-+.S2r1ӹ.$ń=ɓ'^r죘>,u'}mKs[SiFng/3^;0ve+m,-ȶ/E#G>jșF1SũO/hl92v7C8#-svWf! Eo>+>iϣQ:I_纭۝l}Y[W vNviZ.@ -;38~)Pka)<\ĥnWxgPJ)L#n&*N>q5ӳ?gz>Z9%GnZgtKz&fȡ7!'ll5;e}2}{7zGA}ώmBPm7rӌ\²[U(S<lg!2hs"JG^F|(Ķ?Vw0R@N}vw7wEh!a}R.7JPAd Oq hW5s$!^$!RIT(rk9kH.rp=It~fn]ft\8y2ɚvz*vKSQ)3DQNj@ 1Bg5̦90ɔ&uhԻ>{T[,9r?H+Y?c.il:FIa9}uڃjirUOɤ4Y/`ٯ ?%CvFrm}AoDtՓce%iBiI4x⁢?zwq4c>M Aq]x Dc.[BtbH5`3Nƀ-Q+0k*dԶw~ڃ>NlL1 l#kZ%MԵQQQoW+Lա;ptTTuXhzoI[~re'C|{bx<4/քgg'/ :Z!&\qTr):;}ˌTAӛ5T[v2ا]րSP@ 8NQbRBa `Zee.` (,.ىvI󲞽+moqQϾTD|x,S31)((`zP4m:wbWMD#9ӌ\ao/Qyĺ; ? COL٬^JN;xPnJӾh߲?wp"P[]Tdu5{.}Ti=IϢ+Wz/x6UZ+.Ϟ:cjw)V&kf;F'C{'NOUM'oZdW6rT, è8ӛӭ#J,2>QTekކ@ ֘Ќ{U? E\Y˩e-;t{dH=p*`|ѭ)wGDƼRBa9vbRnt8M, Zm!YԱ=o=bQuMӌ\ /: nm~>,kΎ6/۴yEP<}+)wN ۼ& 8RzO'fl>tE"Y#6f ky]*HQ Ry\L݅v?xLOw#S݆Zצqb[ɯ*CMD+͖ >3ytrCbXpK-zI7(rpݤw%9IeN5庎0`j0p>'1Lqz3ݵ-ꚧ0֤~@ 3!u]v3|k[F *͒!<޳*YUݤYKϥrTn8#Dr\Guqs2s|{*(:9|e+@˫ ̉V?2Ku1]gB0~:O&Gv, Frϯ}!0%L2llr*$?J~p>sI+ڋ#D ="G_Nv`gػE<9V/d`LG`(|}jL>VKqޞNo_=.KU!CۦrfPUV&]+ʠ'1âqm_תŃ|a',5or=a˭J@\C3BxEFz^Rv8h zC@ $SXkb3ɕX^0lSYay^Fy}Ct}5T=r.+1Ɓtc$.@zNN~z#_4>|sj*Xy%ֲͳ7SѯYFjg f{pEaC;彾zʃ!k<jR0V@bE",pz*8T5<{wtSؗ*~']! c ;}0Uɡ>svsZ3M@v/@${vUo\QT]Z J*J8@  5<8V{ \PIj[y Kˇnq=L*t.~@ -` 37ONjDEf2[W'=Z|:|`8Akz¬o $1-uňD"Β) R60]ӪֲO e-me`s$g7^{,AjHC9d+.f-6eϥ$Ô { |q|@УdvS:!dFy]%Q7yͮoc3~,U+&PxҘ.X_Y.0$,\N*>P%+Uz;%ib^x6:3歼 ,n* J/'%O8T ^d:ȥMI㡱a9rnRXVoY;ܻd]0ՕKe-mTp0E/փoH4vZTh$v 4jj @#gJfaedꃩwz1Di3lPjFrq\@s HWq5k&x'_@{yWO !Ӈ/$r3U1eLXnƋ/DaϮrHTe%kmz!#u!v#=K^WɲvR@[q8Ǚ5~“-ïgJuYz43.>ΑJ#a%G@Y NR@1vqPN9v.,ƲO#“F73 h$Ρ `ࢍ%)I ]k X;]T^|~@ +rϥRcf|;H޳z[s=mM>;^Ж\!;N󜢊}Y"ÔYd4;8uNU̎sz;ϽGګS^َ@  a5l,}"yw>MQV 4]k^,@H@B@ UAOB@ w Qc~%d#@ ъ'!_@k'!Oi+VVqK+@4#~2Ruʃs6&Hm0Qqb􉫙9 COʑȧ8/Y>ucת?SDC\,{]4pDx9a[?ey.[[{N=nEje7=k B s&f˔= ä.ܓKW^GW#/H}%HtY:.v$DXI_hޙ%je}+jvH?$rda@KbTZ_CNBmJ!gw}WȔ,ei.IC։+.{ 4GGR!ųS,ldIDJ#Xgn(Ti:TI4.=tٱ{oA퐳u6J:Z'}$SXEQQP~x)ȼ9a}76CbEhNԘ?c_gۍqN. ˏW A/KY-u>+g SutxʧKBSڃz!hPZX[?,NĪa)G築ao ϏN\pL'MGޛroŪ9dAOi3}1};1>8/M^7rL!Ot4U*3:zkdvb5b})UwC=c htּ *XEFܹ5~ht&7s7{+}#SNӴ94aIKǎRAZZeё|RAO6m`VN2Qƾ\]ę]|*&b$򋳞+L°G_x Iǩ8't0da%Dاf d0r U"r#f:2FSr)V/Qyl;T}?c^g &vvBr{[jB4uer)_틯$O|A5{Gf4z[~w\!Rs91pGZ%ۗ.Xaꅱlf{ k_AUuÛ|,V2Flzn:{/\U7U6i~ݙPlkհ1P*֝ *Dj:R*Eu-۹%ȷcj<]c:NYkbD $ ,1VڦPv\?6ZmKf,(wzMQ[=ے LbFK'Gng .F~) o7x0;6q[zPK_>@P٩~t V9iƃ=^xSBT"FǎTDg0t{dH=p*`FRDٛ[/S& =y}ᗥrĤ2ûqf#XtU>Ruv.^uEKeSz!ۖ<}Xל'm^8 Zpb[ɯ*CܧmD 2E3fT luG=KM~.EUs|v^&IY)3 ~oG߻ A&$?sXƝ@{`2s}9BT'↓t(|ya_y >̳KsI+ڋ$ߨ@4aej2[eyeBW-OW@UT+|+q󿲅M#( (({hR/^~zIBxQRLfJy[4(ON,oV{CfM!?եfPxr6۳MBr߉N)D}mZ G$gR >fؾmnm{9"voʈ!hZ -YscmgzcfK2pz~EmsSJ] U)ʦ:P?_B#yT:Μ9 l.nxW@JTr@ ?$=:(c̪^]jW}MyQ*ĉ)[{Y51pݙdq,*&a >,T61peAL>4kLk{W@+W00 2qcO7F>LGqLo7  J>:x^RX!jeۇ 2}:[Y[ Ӊ3O=p"B1{FU5s2lsgW\yPf րT sMftBONY (x=92X1´~ Uɡ>svsZ3M@LoǩG9_Vuy}Io^h+8.P00_"[U2'HٚHp#9N}Z<޿zoe|^̮| -@`A٫'qPf⻛.fn~)dRNzt>P-XEo3*taNcyaַ:|LC]1"hrj-esS؅}>%KO2S l>uMoousFrڳ” { |q|@Уd6!Y TKQN;B'˶UJz(^e@kbg:<7g ZF%msph7s[}ګشW7?y+$9r|>/pFg3U`F*t@JD`j3L|imdFdďX~#^G>7([g|v70?m:Br(#3>pH|/=MVJ6#Qi('ч_U. x9Oɡh;SzjNMO4YbM/d12uKŰ=s r^kJ119=3ݽ&9ej9Os'}/gR[+M#˖|*G_2x?n~,vw4pzzey~)P3((sɀ'Ev 秝Șhh:D|*.UqUx&^%^KS6ڭ^x8U_GfO%,m},i lY9Gg\;v's_UC7쬞=y ,d~x|Hnr. 'N:+t$Fri%yS-ġ*/΁gSk g})ү  NJ?n%£:K\dcLk܆}~?(G'ݦhoĪDl>O.g*K~歫;'p-'@ }gƗ/ y^V",TÑT\m o s| C:xItDʼn'fV`z,\9?_3H"d(֍]L]r\u39v;m]floYL9E"9]²- ky"6'AM_Uox |2 %j}_>}Jn#$xǶTTWF/W] vPIvf4pQZīꄜ{}J'RقAųc/p%!>^ڷ6׾{gs i0,GI #߮M?cɬ>L5r}tVYK)vFjLL5$:4:pMBmJ!gw}WȔ,ei.IC։+.{ 4GGR3!ųS,ldIDE#Xgn(Ti:TA'4.=tٱ{oA퐳u6,#}$C1 SCS(*ʯO270'pO#ކr% h_roo (gr!7˓/AgDm/@^ijNֵN+NMIzEEn~v.,?^1sP ,!dݶ9n/^Cm¢!T=is TiҴ8~K/huʺ\wǜ,;L2Q֞x_B(~T\i3ѳܪ1',> }X6=;[D}#vWgM.X}푑O[#HcZ]eonL38""d4_ tKiG4`i0ֲT7Zo hF EzQ"A_uՔt[m^g.[nm~>,kΎ6/Tl_Ϟh7GxLzN1#k84Â.?ܶsJ~UD*.Ac~Ҷ6T^f=r3ʶMK]ihb27(ZGt=n=+(|ulv_ϳo!%%}QQQQ zIb>晏[-GVD@i}u.mEk'[ׇn<أ[Ëb}-GP]ƚ]K8n7%8^j%TCEFB=UMzϘ-\*@K;@$T7hk,W9o,N 0q9wAϾr__ Ȝhu3.8+cP#>RkI90 /rIkvV[$r *P;U+'h/j`1^<Ȱ%~A pvEgB^Q4d6T nB~K+R-[os 8Ki-bT Vz^3}}6#@c: =,Lr% *&a >,T6q@XQi_3Ь1}_ o\5{q>0 q1*$(_? V^}hxIaC>J-Ԭ-ϮH<dMR0V@@LyȰΝ^_=rA" ΉE:[@T4>"?y9ӎ{EԷ9 izoe|VuGjPRQXf0` 4nkF9%9нojQm8Ѿ>)r,'>Y;ȉkݠf냫tڻΒzM8C%"@ p1V?/jn"3ԫ->Tmk Vیf?0 1jV4EUY RyEqu ..H/ҕ"]X%*XXb%b{Tj *eXX`|agay^2;s33s^W*5rP?'SAN? x" 4;mɸTB5*4 =} )~,_Pk>j\;T9vI#[j1^ZƚʒNBݴ/ _,OBa<A?]dwaa0nEz~)]6Au:[מXzF,"50\OȒcBԭgy&kր(@*Z8KGsu6 ; q:+=M=L%p 2 ; V?e~.!9YG=(g =,fzDAwEiG<}2MJIR$cW&׶E Sm6`XpEZGY+Q7>^Gb)^2^l!G>t/2=6λ\rNC{h|ʖwԃz2ɥ**zH!ePP/s8?3#x+])g 1ehJЋ?]Άruӓ< _~Ӷhbܦ_S"~ꛨKkf,?8Ue٦gXYbؾAXNu cHW IDATEU3Q > C&5=zyЊfϸKFhhĀ(l*3<ݢ݀:)ԱGm%_ʫK 2ٓ!:ܞ S&Nޞ~;^H a7sn;gM#sNJ׷7w݀߯͞o>n=z@EA~ CMICuǞ){N#_tn}{ ?{?p}HHu9@ə&={mBJxY@@. So5גC. hd$'wiYN+1 A򕩪<@͔m*ȹ(Lʵ>P!h)cfmIAǗd@>G' #CĴrQRbK[~H88kyO9՝nNӫy"܅L$Ćw"ʤ0EonPfشF6aXrA=W%LSWG~lOei=Ci {^ML].Q`. 졀fǪ=wW9) :K**DxI?AB6Wജ~Ċ^g-?PkcS*A?. k(aHG ahhd9<_5z`:| yWsAG'   AAA3Ö~y=AAAF߄  On, !:A(i~P|SFv]U=x ÿ/F& PB4qa3xc?}]85`Xk4jzA; B߾}Rjb,+-j`! E0t;dg!Eّa<*[Ɲe=wB: .خ㏳$@p[Oݫ6#5ZĤn >c{:h ɍw@teOAg1RqntXP੿r$!]&r!'Y\x]6:؜%7얧r4xPOr:iݚkĿ. M꺮?Ӷ|׷͗mӶFqU3,D4搯}yKQ|=mţ Uɳz7a㳁CKxY$8#2V@5/F}v]K`[xO^%/L ߿|uZqԿ QGu3vFڭaik~~?m `YD6w { xMH D9wSIk9[Ƹ7A"j0qj͎yrR̤ʳ'i6t<גsOX㗟|V/Mxx>qhѡG #fLEJe*0pGͭo$ȭ];ϊPFو%337,k\TqS|]Qўʔmz?"C7KZ#Wrx0Tҥ@[}"Nmch>+CEVˆ@\kE K(ljMˢd?et}B nlHT|^s?:UUO p7;<)UUMEjwfӁE@DO v١M%@I 3븒m78&^G;c/vmG/Oޏ+^4}]ffu l|^KJ85~hH|2 ]|ضfj܅NOon%Lo(ArJ.}ؾjv V97_y,#W]kyx*8s0l=%g2KM,볾.#/|ΔL>{UJx7o%3`'4rv2.;=1#-9:0/D)猾'dSlk.3>sL :Hߍ:*iO ˑ@7eRHMu?G ۑv(rSsRBB#uN=uNM rpFw&gm}W7= s:`ڄ%$uqB VYܚ "e{3Gl6GNSoƯ!,zcv`TpvɮiRbb$Dzѓx˲ 3 hnKEFPUs43)ܒZWAtlW\oE 2538H6eM} r֫\9o&4ζ> ?=Nlv:1 A0aB >[j4d:8kѵ6/c>}K+_$杺E~Gӭ%iъzcIm oC(P} fcJ<tp[]Y&.Kjԁz{;,Af 9ِE"]9$6ԭiQj)USN WOA"DcA^J]|S@Հt;tJܿDli76\ar,$?7{)T#EPd2&?UP5re6kp/ Ϧhg|EP7e(.6]4xPOUۅKU#6j?l#]|Qcmq$\$(nKs628}` M'Q?{Ol6F1Y ڄ%RPKݰCbo2u1d4qھive3bْͪ϶fs1<R硱B To_F/[w5ع 6t^^GVY 9Hp6.>kkۃ1l=r|8΍WOA*( ]&  #_տ&y(;(iq^N6 !?޾8e':(h}ߖ$PWj+oѕL,S%B3@>j.KʋslIi=˖ 4{WkVYmTjX*Qd_?pE NukZoUɷ/%)Wg}<\q6F-`ͶɉCI/2erԩjNզb< 24s$g:z/Oˮ@,+d!`Rkp\.:`b @^'.%/؎ݸ 3@VRIwwDE P"^Rna̿֜~#H9ڪךa]-SI%8ry-]M(Og\C=-llvR(L 8}iv!M,; 4ХVk>̑a<㡮?Tlyq._44$SwǕHlPJ!8Tr&++`pt8PW, "9ݖ;4ͱʾ&%mt˴B Ajy5IYE{LZ>sPZ) ȓ5}C4b-f3% X}ZI)z?״_)fL\.Wʹjz͜lljg٫hⓡޝl홲VVWܧ$[S J J8N#`R-`7w_o_U>Ի2bE$K`{"lKbW<䦧whz\urB[L9\$з-'B- ?yt XP/5b՝[|P[N# n}@fd/'0П*Ki_qY=酅9S#KI zyˑj\HߤR-kmFl &t)RJsWNG {t1D' [[NkS e,=k#]JN$pdP`%L#[j1^ZƚIJ^+75 *}6 ; ԭgy&i}炐_o'2 &T,`[jya^acugC`VO rBSK<+'qA&+0_zΓ5W'$w&ʪ͐I&awSeIMs3m66f gн}]LE>L,K#_Ƌzݤ]mLM;G]TU9 }'zwhebӳS̽OŃKջwb{rҳ8?3#f]9ruƔ[Oދxw?U*-~C-yh{6q9Cf=Fxc$HMA J֣W Znw0_1t9$H]wIw4%I{HxׇċTic&UA/  뒀?uiV#z-9"d9` xǃ\LO4J&Z6@%0 :{?sÂO#Q]n2q)DŽ?R&溔G}ݶ),lƳۦ SKٻSֿ*{Z8t5"] .u]mf!oK^rUA0qߴS?ҿA8'9Ez6nRX2>K&H ?ȋ|9l 3<]luH /nW蕤޾eqA,Br 츛/'LzzO~)KΧJl҄#G6LzZj0r1mJ9QYB y ~ܺFjE?Oh䰚X293xÂxZ/L?l7EL9ݦ#2R54=sT A_њ拵ݼWU5e֚vO-= @iH톺˔mzZj l|?S 3WO:SSZgtڰO+s+awРD  XS}hmtW;3餑߶!/|ǭt19~.W4Eiyf yy%2%.O9g >!g[+ì- 3eb؍)E2/IyF{w[*20BVN?~:s$,Gߔ RK!5e?i-4oGڡȅ[LQI d8-M:72H@ /Lfiƴ7v ]j2D$GK{%`>E]:MYs\9v٬4[y[&yzzzz. X5(T(?;/y48vQtCLVKF.L\;C۬QALGnK0IJ̯K%赱SAQXТWGP@rt58O{]tEb2d7>};[Zcp"|́ Wc 9m$F퇍t$?/j \=.䗔˓WSmi&Xl^"Js"3r_mƘ=&KRd&0R7۲uǢ=|] E$m7(bxӻ)z9vn c.+(;>!xu_b ?:РW^!+d.AIҫfzku+zB iA,B*`7sn;gM#sNJ׷7w݀߯͞/n=z@EA~ CMICuǞ){N#_tn}{ ?{?p}HHu9@ə&={mBJxY@. So5 h;'oΣ!eG:4l# [c?Βm>ytڌ , 1#鰍{=.%fx^Ű[4O>6wa('np}*I}-gW?F! XT &Nq7_Nʕ2Wy10͆.ZrnsY }SO0 G8mPUIzh=*g6]J%-,;2k 恖Quo%~D!r#Wrx0Tҥ@[}"Nmch>+CE_Fë#~~UjC O'fnwyRȫJ?]RYvbzӠDNln12\a?@&]ffu l|?S g36,x;}f1x O!L[ p <ͭ-C%8P#`RNiOw_tB:a*+o%~~}-SgFAQեs&Y^F>a`gJ&*%W0N9Im;w܊LCb~EHs]t] BW"S~]b# -91QT=bTpvɮiRb&Z >sL :H/dF)~N<|=uNc2tHX ?); fBj~=ZhގT44mֈ(=;.%Ym~oKeq۳oΦgPt>|m#M X|4v@gv=,/=O%j&8rc/]bra͚q_vwK[0#B4ڻRi ɩvGē_m,qQNN=yrANvF!=Ujfɦ,O r֫\9o&4ζ> ?=Nlv:1 A0aB >[? ״kGm^|V8;QW' I;u7)x&VYA2IKeC0%K-̸Dc260p0sV}ץ?u䔩gnNQ&yG v :T;򢄷}}޻n.VL,sxNFMqݚ=)О9_v{<-<====ˣøU:]ݴw͹Nh`pɗkOf;T|?^ؼ&m ?%*[FhކF}{4r&.?(s}7hS`ࠃ,?꾐HsCNF6dAQaW'sI:ukZ}J%赱SAQXТWGP@rt58O{]tEb2@7>};[Z#"|́ Wc 9mx)@N{^:ۢoٛmΧlغ ]T$(B,J)J*S.`Y K nnEONė|]XTm*8W$KH?^|)NWH]XP{2i¬924s$gƟNa뤩~2Ӳ;@,+d!`Rkp\.:`b @^'.%/؎ݸ Y(+( Saa-,݋ DBINÜ9(FrU5úu3[JqrZDQByc~O>̡zk1@^_ 2aj&iAk0 O,jbe.^_a N6Z6NNH'gyjOq._44$SwǕHlPJ! ʕU%A~sЦzZv @{u;bW|$dI}԰ӾB=EPU*E^*(uMuBi{D_'+4qpLƹ~hYA)fexK~蒏*" 䊊Bb8 W(Wod`P#>^E ='gkϔh^ݫO5ՠT4 !Նuvs%KfY~E^+aj,OK+#VD6ܼ) @bȊL,7=VB#㪓PF.jg*ȩ"Ofm9JOૡB|~V? Dր(Ȁ瑭LKdL-cMen}@fd/'0x(~~Pk>j\;T9Ey<4ܞ:'ճ^XXn9%9z]LI zyˑj\$ Oz~+sng&Ӥ15s=ߘPZ@)dVM$}J loy;G@}u)'d[1ւ V\3?w6ijiecտǤ Rm[z~ñS7%qxo/Z9:N=Dye?ҡu~5R2U u;K5V-ۻ]4ϙzzqF|fdI)QT3Wʏzݤg޽xo"S='yqAބ9eoA9cE[Л;qfOBnWWzUO `Тu |˅æ!AcO{/I:>=sΆ@‹>$^L6!% zY|Tx]tLdjPB\jɑ(^ޮ!QSxaclÐDؾ.}2- }e8ÿ.jgu?BaSҸ3k+4k-RSrރ[ OfDYmt2%kw\4KRIOOl=Wi Uv)↜/=9qY;3*-zK16䂤 Ke*^9՝nNӫ"܅u*[ (4up؄.Ιt@UQ](@9Î2`o]RK/PrIϊޞU)nj'۰NWݧL=Ž Ac^A䟄a8`=㚳55| NN嶜^/5ڱש ~ ݂K#/4,yVؽφu0tpɷBG=h3Gs2tb!|G' L3-=M"Bl_( |gE ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA->X 9IDATAAABD $]v  oN7UH~N'\jgΜ9sԧΚp-:sٳg,Y `jJd_)@]j=LBu@Qgtk>uv}|B8I,/sZn's^OsA C} 9DiVݐ!O$f{~-t ]gIpp5Sv Px]K40eVDqs{܌/.i4~ =!tKKʈ]澝˰wBA以4'I컯tB:i278ru}-SgEU- _]:WwlR]uh&Dʹ[Rr8[&}B#'٠M'{;B#Őv|]\̯%f4Ea^~Luɍ{ni4)P5vבCO;$r`0+"-jʸsRaܪynZ\vً4gd )'ϝlŠRr(i!W(k?v#{2!-{2MxphOOIޗ\lj&J;MjQ5V #Ϟ0a~pa_κ$vN `s2AP(1:[AHK-5 ״KG-~G%riҟE :sHm֩[ӢibJRR2iŒK4*J kfΪf bJ<tpv:jTm9S" m~HG"~ء o>KJr><'lzx8,:-{'O'4՘ 2ѡryY^]r'-;_Ԓw'C}J~fzs;]f=v`7?ff~|"mjAIM.OQҜgWؿ  ,{/ytM$GW*^zв>:b~1p 7>}_bKk5O=cc!!Ƿ}K ?:Рj$Kkl,T@ET7= C-u/[wž. Z9Se*3`c1g ڻӠ(%ve AT*tڱUEQp/ֱ֡,vNMU+u`jJAU\A1*$@ Y_yӱ~dfޜ{s{dc绶ie|qG&#]viGgtI,ܫԵ{2BC~4 Tf%ib ^ON816`rFW+Vo͓nj$mq@X)Mp3F5ޕB!4m/<~Q8F.#e}ȴ {6l&_r}Dy2%7|?6zG/>v*-lŚ-D FQO?!׹z\ {}dvˇ  k.:{GmunCUMBHÃi'^(ԲZ=MU9hOzqAcCrxS-@NJMpLX*]+q s`#[6_0qv=i֪KFcv̂P?gGP?˦:ô^-[NtX+ng9Yu2c^q 3$ ӋB˄E7_Z{yq#fJS1sƹZ>ǹ*'R@0ܹ^64.Ɣd{xE}[U_f`ٞ"^Ԙ^..܉Y?87 lIfvA.7x]ʩQ _z wgW;<{?w4AGxʮQv|h&s-jM`da4m-G#=8GRV|dGDZKֱGv`IY7P .8aӮ/ۚ#Ј0o8>ޜB!4tCRH2 _I;# ΎL@̄fBթ[~mnZ̙f@F7$(t362.=j1jfRqԙp,ZbESKM>QҲ>m'$dQue\TҮ(rMzѩ(?jܼEwdl':!B ! B!NBP8C!B!B!B!BWзuLIENDB`glances-1.7.3/docs/_build/html/_images/screenshot.png000066400000000000000000003424101225327237200225700ustar00rootroot00000000000000PNG  IHDR$8EsBITOtEXtSoftwareShutterc IDATxu@Tǟ;=Cw H&( X]躺vb(R""13}Zw?x9=yι^io!5uwy; 8y]k#Q~<}*s}qo* u_rxmHe;=6Cw[*u Wrsǽ M[lpaUV3W]5QaS;F{$Ayز}P9CNq }\"5$MǝG'e^O5H#O<U* hN;pU |\y"E$)3L7~f v D-Q:}ne Gh>έ( XkDCε?#la*1묎ꁠh{!L3]*O$-Q%}oem# 5|~vfm7i8sW乹Qw'X{P@T8cS_<!oKxWtq;4+לe5HH ڲA!y}4z? Fϛ8,],xH4]|E\J!̜7'O?HgmCT>?LzqִM;t $Z험ziŞ}k4W== |.¤ Ee=LB~ąG'k D:m~=r\{sךQ^J?NTlʹW]͔ϻ:{ ^yO?VZ?~2埿1 -cNf(),y#m nB^6~14C$)W>t1uƉzZ'+6`6j:f7nabAHt#@T_DDG˃~ㆋ Z=8MjBIHPlһUhWU65)B0H&!:ۆ58YuSӎ'2 *c ZʾtyJDluywk7C 4[+n^-d z;yAEvn<1y}B+>ʩE3\VGV7PU+$m y]B6UJF{y ]^5KϪ(+&Ac=sm|M]+k 70~EkY%;k|t*5l^dluAN]WsAK#;3JG􀓱^~2-/r@au_} *ʚm;”Kb4i*Nj\咵CQwE"pJMEr{ccu; ,+VV*Sz|\oj*DFR> y(`!inȩז#@e'F@i˞(3ȃH+%8~{!.Gc'pU@oB~%":jD[iZE[N񹢦8sIJ+@ĞZ @1% o ?K;2ǖwJu{|Fa)Hby.{vNAB1m7ФztɋݕP9?餅 ފ& 0i0/KLOQx@v4Zt|j (tH[iTJ;8pAC;g{T|/պŕoykyt<zh_=:ێӦ=t z閤>IntU(I@Y|@yl(DD?$۵7 QG7;qgiZG=WR7ɺDq/Z&ʊ?ju돽cBGߋݚEy8uiQiI`mӚ=;j7{Y %6ԤQ $!>gT X='xNسyd}rW!ȸ&IP(DH4""^?ytN~ ƽi9L.+/e7蹬s(76zxehJm+R5GOZKshyb3${(o$),iDUU__ZP)z j K蹕N\l='hIҙbtĞ)<떢3Ayd^!Ngp%F|bm Z&3\ 6S!sai2ǎɧJ!/l)^F{b_h P D:ZBQӐ!"E-}/fdFė K4'&j6`}$[y mmq]#pyy5|[YXPFvyXkڢ}Nq%}@ۮ{vnbcvlOYNhy?܎@?؝Uo@WM ߉Bz.^S%1>#D66l;=c԰9l'ϱ72՝8D?OrTc&*u!rLnm!W% ېǨ鑇)-(`,8ş?T~wiǴȌ{ sC3AٱO^fs7nz-?rΫ!C֟m1/Y]Y%1aR*xiohkwDkHUZı=:(7ڮ+y>ћiZ'QȞ uO->yy1@ yZPP*cr846K0J9!:^T1mi 2nDlnҪȽ&{M>~ EkۼXnB ze8FY2s x;.uL? *#=FOOwv;ъSn\8nޫ[Z!j-J#76n~py{S$<̟?{ GBt[Iw׹KwV ⳭzOЦ$1R9ޞF=FӯnνSZsᑹI5s_uzVևQDd -=83~6tR8=zoBs?qa TzMuUI=l@43f쀁_HwHXXXXȱ 3ߐ10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bp8EwsUq105 娀 ;Nf٨EQƷ%F`a@5W$.1PTt;dߗBOBl\v_ 笌o"Mǂ‚OlkDƈ{τھV-|Ec7WLՉ(p(9$ϭv`jšsi +:o CXӾc!JLe+{KqrVS<v9T@P ,ʑZaaWu 9/Y( 9힥ODW7@+bҌ Zw?SGw[5B^Nc ۇD_gF\.m5suWsy Gzޫ'_{?Cv"-z/LaA,yl#UT;߂2hS$[F<\jɬY Q|PpS,9Xb+i<[fS炊Sx+3+2<*!7|{pfV@mkCrWIڪETmI3]:aJ 2-|z_){d!/epgTh>3<@Յ`R}Cqȍh$R'7k@^o W'G^%K RQaIlt!a_X? >>>x*EQ",E퉼0tmX]hEu?{%I)&EUPEy%CqY>EK^+Pמx]/?u(FzN{^ ;s/Ұa|sÂ/]9yJ9NLFnX{V11ۭ/(~8TRͩ(W%BV??Ԡ Sz@hu•o=O,nWde,&mx]s /g = 9Fdve 1`h9vɆ)"BF1UY(%1`mJ DcKrn'i;:ih~V-MILoʲ 6?DEO-CQ8j*"-[W'̜Z~qvRY'7~e |R|wV@cY1#@: |bo lAt^6~147?:J٦&A$Dq1Axw2,bgդ{Sԇ}ͥǤSM'iHѴq7ϟGbi{e#ӱ xNN~w T'AoNz^by xf2oBӼ7^4ayc?3oY6wŁG9(B5ۺ5K,gP8E#]ro_}&7lٹ灣Es571jhהx=ՎJD||zhy uJ Roۺj3n#A=rzoxXM7u(36`+fML g~BkMtBp2p$Mb:lbhb)3$F\#T)ecE1`cikFu]P]T?i>2xVy06;& Z [De=ddr÷4\RޡfاZk/3 Aq[pXXXСureݮ]!OT4P9%o#>7ԧ|ߘ_g kllٸ0pcl|+); p( E!7ڈc19]xLE6f8 r3_NhWZl-bZɫ]Z$ydO7۝WUG $%᫃"Pr/C27pH B. dx.> -8s-J)Djb3OR9PrTy]EoP-:hk?\>}ӾeI pPĈQTĭ*n?R&Q;H(y,!c+rJP;ntu5nVr~QP  $=x?2Cmj[|G@Q(AcxεB +X/^?ؖ90:BïUvیR_l:R3?X˽g% l %xǥsF7R"IE?PLXtl. I~n^٠ͅtv'w ñ "RQHF{;@7Р7 h 7'5'cXq^Ӆ.l8QrA߭LAJAE~qL n44|m1o6|mՉK<=scХeEg&;ZȠ#올Z6?ClIosAOW_U47T2[G;{y 8S;[8XkS; IDATpwVIE.d! ~UU ^Dj*Ne1d2} _ܼ!Nxlh8_Ⱦtt$jKM~uyxn_U7 ^_rny_z_%x1z򙝨n]DS 9d9oW͓|.NmNGz{#d17~VmgW'톢@x =?ߤAwuq9a\l=("am#t:2m&5lhiLZS%4rҭ} gfV P6*Y PiO!,?.H4Q$|i;&),kАL UM__RP-6NKނ;M~,[U^u{R8t˄:*O"ZЖ:S*d (9V HDDtEK=ԫE"8B;oZ~0gx|h:cn)f 2 *3 =~%n}EV #"sE#ׯD@`"O"Y1وaO[p:Jb8MF[ZŢ>縲'I4FQ)a@R6P&-./ &N&ߴ`Ч7$8ٶBpk |T>+7#+Wkt o]J  +w8ܪ!6Uڲ:k(%hX8o;q"`bm5zas諩YOc'C/|h 8y<4oE$0~9w%tD%{fĮN@/]6uWk>=`nɻ'/94{Q7+X9!Ԧ?aΞ`j`nΉyUКj/je4pUnFnW#Q0ݛ_Vf]MBG(zz2D/%i\NBw:Wt.)(+YQ BֲwӐcrMWN*5BMD$~xJvOK9o"I71ꄤq=v]RP\rDOOX*g&I?ŗ6jͶYoJji)3/3;]1#'۸o7Z7,1jjyOF?UVVj\:5&-pu;zՑ)I);y|CM_W]67gɌ|tȆ}./=aPisߙqQۣw~NmF˜Kۗ{SԆΝ5[ ǣ˷de뻤JNOq:~@`ܾ|4.ǀ{8vy/@zܫzwجYt*1gos_^̤w[} `徽nB)[.r[Ǖ?YUVs ZӃ(!({sᆭ#M;t _|b@s)+en(ŷetnf8srt *#=FutˊnNv5Ɩ5ٯYEYYG߲9·W9;&>l׿M~\\sVuՁw˺2JRZͻ&3b*:;Ҏ3 ~j$<s‚64=hvԎ 3i֤}7w`%`Ԏn4 ,_ 'D)c3c= Qsꑐ]=_u^ 1{*?yC, Ny.2^~h^TvCxՁ wieQÂS]faea}d^'w; ʎr~:/`wϹFZD>*xA2Xp_̟Y]]o+"=4䌟i!^yy:M .xyet;cE*߻ξB>oʰ>Jd=iN I̎ym:$,8M߽qOދw)#*pʼnO_zw_:jϟ.ϊ7p炼c̏X dMyfy7cSσZ:r :}{0cxisc]uJ;(E/ċJMV<Owiмљ7?w+rm˫ &f)teSg:/xov^5^9BPu WZgDy@ɗ|k9*}/TpxcR%I٠,!oQ3E&Zsʷgof Ԇ/ZQX6$ Df:jW RmHz/\s;U+|s_NVv&ww͵|> RCN}7fǴ:R:/C7D3;U! S?DQ5Cg2U%m@Jym#oOG9AW}\y UoeCufΛP ,24Q|{㟳8oYu K410.+Ws[(=JLSUwyIJ XC# !Fϛ8,],xHtٿuh%0 \mG >#>uh\l0m^Y\A[Y(]iُ.{+.n;9Bt&eW}/bX{{P.¤6OP4X|.G\qtLTuk0uɪbI jFum{MB9lrFi?=eaC\Dn3APdn?eƗO^;wmRVE˒3J/o?"i>ŁxIrnqa곐mTuGWKSbۚU_󪁦GvQ淚 W= Jzv3-ћ7kF=o%%fd$s>}PFVk{?"V-%~hpT9 `Updw4 Drg_ ^\H:R1-834Jw'o7Qj;/6/P&+ b_@PߕJx ȨI jO?v帻~$~_$]4JoȺ*?%(ý;UԷ3F)#{v, RfS-r0$mǙVW7(r(#7ٍ:B6=ɖT T迉\ V8ac-Ay>Ms~(`١R?/@7РYnvl,Y/͛Vf*Jޓ#ۯGxqP<{oUG&AhZ1S%wV|E.[GQ>W|YP],l*ʭژ~7VEY)0<} /ZuŒJ؏!c,p%Wާqm j\Hgw< %wO_{_(oi&cݾiu+1t(lÖvC+ 8K粟uymnF>Rok? 4(hoܜ8Y>S;>Qu/FRMDEΏ?s *6νPУWJ5:tfb~~jGV`Q̭o8ŀ :Q\niH/6s. _c? 7Ժl5LCKd4Rꝇ&ԪMSK&;I(Bw$@#^ &(5PLli,g h{I3d9oWͣYo>;$9i<\y!fn݇*SUOU<0'^߼jMfv|.[mNGz{#d17~Vm]gߺYZ3VZ|>9,U4y LQz /ᗮQӡ>I<V%n^xUZN SU I_UX _hJE  x)%ɦ{|Fևg7lm8X T-%;9|$OSѠ8- ?1@yȽ,Md@%.s(7_U/ܭ{%mPAOKyQfn*kL (U|aw(#4+AC,Z <^NLn52iZ=O0~dGgy]y^SP$HH%|TدuM50ۍh7]ΐmHhڜ۳_-L /3آ ۴|aE+ =~%KutNT0EHaY)),5_U__چkO\rtWhD_J,6*dW/UsL/l)^FILf7`$# $xVTk=U-r3"xĉ=uBX5|avwG]¯K]>gٞ- TOGEF h #2T  dB"]"Em=}= "BQ!u>{<.jOsw)|F~5BMD$1,s T 91OŖ,(!k9H+-9Y&7FtTCr9 c+9_kM[4)/(ï*]2Ʋm?e<s"~z|7]evFJ*:VntoWW엟suxGnV\P^P8ye2G7tAqVI\-QGUN7wPψr/K)a^nE-YTMeAOOVV'**Yx}SC7픞 mx yBS؞ĮiIP޴\.m5s WžmO:RF6{_%mkv#7Q$$?B4;H:L2Pw/Ӛƅ EB/ONUobiu~u^#ndsZzF>Zکi~0wXW,(Oy|Dr)OL ˦ IDATg+f_V7ABMum-7n1tw~k|@uL("@M9^+4+לe5HH ڲA@NDM# C.˞zυ #N׼)vn.Ȫ Ԓ.¤ ~Il Xۨ(htlPb韙iwzڣ$R@^}je*5&bqG(Z(s'*3'{zj'9kurþhR)|hky|HK$xr5 z^meCm{MB9lrFu:7m̃0IQ}|>.u~6+@Hl E,\zhjGKC;OwP8z{JK%-xX /ٓ0Õ1^떑Gyqg6YpBߺbIK`F})3= s͏NZڑ-J+͖^܋]B5\ErC(ϓR g/ouB~St!EݿWIS^Ɵ36؜pG6 ;6ۼrd햮[=Tl"ֻF]{Óϊ9Zc-#w'=wOoYĐ00WEj_[k? 'Ot^6~qcbF8uߟpEC 2Dls x~QLLZ\4Kvjn/oHQN+jjPѸ *Ɦ_f /9svyjhYRbF 8;Ǣ_&"On0[^%ͧ8#ttN̍ &(7#-NDl3UHw(=̵"]\!qSǘ MMac-Ay>M;ƙq?Jc; 2eDqvgDl9^W~ido"$_+O -'J2ëvnECdd|AY̓?& UqsA܁̶ʋ9Er{c㱪|I<ϭ(+~(rý\keVq[_E|$5^c'*csa&[Ըُod~ eqbm[V>Ljrk@6&m]F樵Եif^ʫ.HSaHS}u9+Eie]5:JUPY5tAei}عPH@Jr(>=Ht[PET@"(#_ ꘀJo6qr(Ǹ9?Xq^Ӆ}vj[|G@Qz ^o/7~qL n44|m1ou?/N+6L9&4mPD2? *۟[r\JԎS}GY2a3 3ܧ|ьʋIdZYZ EyH6@Vl#6d۽U撱)^[*OؗYw+΋:v />H(uhmM)?c:Nfg-8\j"'+c)v8E(A 7gw yZsO$ D$4[RSk?ne \>$mdK'"Ԧ'{/0IN1?\/c=>yoή~_~'":v_>tsr^dꓢbèRu%˿v =yb4m76pxEV?kl6n_~L?pf:@NE?I#M0vv_G^?S< zSхEgT7GFX1%ғgcwf7xqҿ4+ Iw/ew2MJ-Y teJYIVѳYΙv-C,Jv:›0)}Dc*'=YRe];z}PkbCՊcu̔NBkhsΜ/U}|"\K5Gmd-fS HZϳKdoxK-"h;Ee 3=)r &MZ/J7,%%鸏>̭*YxrHwk*v#)ͻw}ѳ8C.Iz|ڗE~ޏMY|e>ⱵWO+\IQ\,tw:1qEz^;QssUetC:dyz;W|Ȭ1GGo Y_d ,fS #Gۖ_߂XvMupWt2hF]ߑ}eӂykuhǿ! \{C~Du5!;80H%\ '6x覐N: k{@wW"'(vh_^]/<(r26YG&?UyX;:4c?J&,Iw=Ҧqnqt~Z,)`%"J#)팩UƊ\3?1gzp (Q =] % p~яFST5Y| + )NF؂]KK"/ >&ɳ7<˓71ֶM%_8hZZ&aǶga?*!EU{Kl8Ň3]z,WEW燾oj3u!$Pt}\uDV5EWN;^!s=~A2גIJ }suҽk^\ΆvDg oт(5]dBf+Ζ8H bb!`7@BK. qV]Wu_Ks?Q>Ai@[)tb1Nb2r7O3&ZXªsLi%RC;IP.CHP8}P=fǤKf/I6-N1;+>[U)|7ykkf /@&(e9"Bi Jusd|ci%C(Rm}W+ȳSy^Xӏ;w[V΃궈yQXv- )/?~yMt;o]dzMR'睹|Fm&yvq&Zʤ'@f ~xW]U"XqfԲ7{VDp>C{=UbN~v.KмN\:r+Č+NOs0d~gyXƟb被J<Zi2R.љJql]-լIyQ e^/^_7h`E1e\`_^X]ۑZ_N?'{%dqY,:z o^U9X $Z[R$<2&/q^(XhaTSOL{i`ϢcAG.^3u铗_ ҙEwGqDTBUv*@ȗ$e=JUNZk @v{Mg4 TJ * aD&FS NdND긴M$8??leU RWcs*8P4u妹Yiyz,Ʊ(:ZPQP.7/M؏*ssSXTS;2YӦ5),-/{_/Oo dC'?^~xӱ}lj/O6ERwXBחT:LOec/X IDAT۷vF?cT/v6vΝ稜~^X~=Izessss3cM*DX5k0$bT,DhS21373T#cJZUjߛoG{"(hu/jf0RW LI){Zzm0{mq&2UrxP˳軅#lgo2l+5n(eʬ1}:;v?I֢3 e%(Rq?Yǡ㻫^ƗHt|Ψ3:6nֵp0ֵtݑ't65u?v) $ڎm4IQ{zHt[9I:W1.1a5\\sTo-2ǡ\)98rog4ľDoKr/Gl7-tUώzqi_̛d-L!&?[cv[6 @6AoWM?pf:@R؏0=d[,5=˹~b y~|uz`9AI|x--NȊ=lԪ ^Gs(&#H9Qϐ ggv<*mхj>&h;-ZN,{w_X0jc%_}TerƠ35i=>61[ <~Ҍ6yS@Jt!H>it!6N&3c쿜5sIɇI|xŬQ'c>pԝ'&q b_ϫ_ϲX*_Ź׶u4Vw1|kHy'o6MJն_'zzhLv_ź*I^3`>a⇀@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ >i_>O'2d6zjNOwXqvh2Bs! P-H@|(tɽ =O~ Z-O٤stC?l5/.cC:{UB^h]Cz~3,R<[H޴ŋ/I~D1Am;0cy4R!QV}mCwXOgK:AP:O $gjKaqRdSOj-J=MF"-ϸshc2V/~_MSvoOE q&fbȐ'~9S-&^cttg<4|74oS> _X.e9zRܵѬ<%ˁu߆EK~T͹ /6SL$LEY篹6m<^{Y^ݍ3K]MBV HA[^f5oa7U!젙Ig{U}rO&);.`엀…KCZ\ {m^+u`ޢ9b@|PC88ВLZKueQs%RyYOc`*/rHn 4%C5>G]F$d8/&VD_n{~O y"~C!7wg~AƳ*Ut8>ז Ì'zd*V{ᙶ4~[FDD ޾d)xlWsT0!8gFg ~hN+q\Rrkpc2ȳ[q'8.*}ww]BySivαC֒SmfMkKmժm;Ux =:cç#"YOT'vYo*AwFD^_Vk'_OP捜#|>[vαۿ엦&Gu] y=MCV$' zz߼)Kv ?fϣZP}3Ɣ\5yf֔5osو[c@6+g{0vg#"jK>^=^2?YֵBZD1WHc:shȹg\%}ر39Y1@4nG5BVLlŨ-#UŦn2ϲIiNReʔO7h߿[Pxc`#3;舳IL{_c\/2I1O&fWzZ* '͝5/p}!cbջo`+\ؓ<_ط}ةʛZNU*$-/JEy1:0jء~eBLn 1Y{dBNXޘ@NPu_7USNfWlu$`*:OkGW(ƭ3Ɣ1;\tbg9.}!k#Q:7hatW6-\Q ˫&?~~XEO9nU @FST$V& LN\6.J'3'Ng` 93nٿlQ▉>>>>>=j$zxo_#Э] T{1Z9|3.|!]`D2AJVsϟs2`]1JA e 1P0x%RI{mY?^[Mͯ*:uކP&%*Jя~Sz԰q4~\=lVo??x+%&ckJx}zMqh4WA˵y4&5i{\  ”;ʛ/ڪTma6Wy\sƜuQ҆G/,cZ/Ud^{k7h'/φ}uYqcSi;̃to)B( ?}NW*΍p7GCQyګ>_p}yn{'BW-Ak :r:˕xĝT'@6іd>FkΞNjjzu0RL ו8^S`RӴ-ƭ笸T10Z%,\EFk;i~\{{yz ,`úb/}J+-c)8Q?c,:8SolMPM]-!҄ҔdD ] Y'Mc,2M/AgSsxڶ=𹜠qҡJQ{V-ZjO{l7fLbPtgR:TҦg[XHa5v+B  $@Q0&C0Ղ ,Ng}㼟4a0/f߹[hX?"kX*ix 6gCUR&ʓ]Z 'M4a~> 1]R6hADe}]2'#WEe$mC .˩҃TP!īۥ@o e6ޞU; e:s>=f^͢D[*%%Ieǵ{VOJ[ylŴj!ַS聋 =wIeANV +g~MzZMae [i:lқKRkm)?ppvw2n.GX{nU/卷1bn~N̙3WK:k+|@V<or9A68ٳ""+yVu{АNOo4>:RnNzH/3MUT%1hP ^[ro"Og3*0͞_KSO )# IF:D1_$DZ)賞LʸKhtMzFpd Foj;}9C/( . lHpD d%2i=uc:r9mDo}Ȍ?PwV̀:91i Ŏ/WbiHlaňoNdмmA7ԜZ+=ۋw.l[!ofF+_ce㇘S6$vQxqAu4T 4M/GAR2^سXБgߦWT|LQ@Ud2H_qnn:iZS$U]B9/Ru h+KJ@˲zSUf6A?U(:~i\ZڏVn#\&~T^UXiy2=Gs*.O^{JU!JB X9eOy¢Ua#kڴӲrÿ2PffHizҏ1Po?uwH/{qw 7ſ}te^_SZQ `2ęniIwϽ$V~Gॼ, v_ $<}xHcvJ4bWx%pkg/f w$ZNy W}7)[T< b\=~Vw36n(ok?CyכwwϻĖ*nFn忿训R(x[(ya{1O^Q6177773֤brRV"#:u:e|IM&06ZeG-41u`;c}3a\w9M_o9ΝL0}?OÖqQoZͼlܾ+]UjozէC! u."XH,[hQ{Ȉta=z:2iTVú3R|\)7bEE Fw*R~,vt`7`V \ƷW>@ @ @ Z ] IHBYOBG D#ixtXLd|tZгƼTNq7oBok&I }Q}*Z!a޼Á=ۛ-pMػIgBz_B Ԫ2j8vTiižIF#mE!X^+;hJpAMYte]ʉtoSXW2㌂˵t>@ Bq]'yy2@RLP!4ʧ%j׵FA`v7 D q۸yz[31NZd @ys 0+Wl)@*0A>&Z_I" QeÁ~DKEߴ=S>Y+ސ{3Y{#sb/{Szpd?u…CpZL޽x?.{v6jP%WTq}9/x'RA- deon۲vuA9|-$Á=ۛ-pMոeF ;D d+t`JEf#,-+*ds˅4;CFm}ʘ1V f ^֚q!CaY9>Urm5|&sydv<(CUfīyWVgծ`:˧k+܁7yI!U;%o}5Z@0mZϢ/ĐwvϞ&WNd~TUwZq!_>kˀnJGvƶ~:"+bD*/ױjL7덛 1p<_c4ζDޛ)mLncJvX]}}{ҢrƮ4L\Ey'{9[pS._V&l<2y{+I<F=MSpp/{_dI8uk6 q#0e &_E,~{Vۂ<5]_^zu9Ɩ+?)بsZvtyorIœ\[p ՞(ɻd:iѫ>x%CKG/uTF3;}7SLRm׎KY"|#B"O;0sE4S9ù}V'p^x#_Bv5cW;]4։}aOW  g$Rsp(=z,1|8~ck&WNM5|jn;qS+̰l=OޣZ2)` cD4[ IDATMaFR@JNiX(~ҪV {NW|$]O7kl$&7Lȩf^Vt pчwbI[/= Iѳ/K}2($QVښH?yW0=w% 0 ~[&߼(EgCC8'6)Sİ>ٹ_|VNQ+ۚ8il5cHGMvӤ$^_rbhf.ˌ}+)iϨU/B"xrb_׮.w8sa Z'i`LEnT8.;ԧٿ '͝5/p\_(qDQ˫jWu_7USNf6;lZ0͹2"-_,ad)̬WbVr:_1Ԫ]˕tĝTa'qW#"=ݭlxsԣ\\r'=Vn%o#=ᕗK 6$9fT;7t2,4>MXًx8)$QNV/C_Y:F 6%ax8h@ۧkw ε3Tm7\ad gOhj H;WǮ) ƍ[ǓΚ=o2Hv5i.UV "rBoW! _^|V!]EsoihkzjPQ,ZxLlE+$W pD}uYqE8 7YG/,cSuA!{X'+y6U4&2@]q5D`'ih'(R8yU)xhB|7)HKm_f2l3 %̾{v3iZׄ>e *~ǂ&LPKf>.}z;w鱰ɑgeU=.]8jKTJwhidžS_}, DʾOeA~}iL+]nV\<3\CRC*i z#%l0g*hUGvJjěT$ȤD*ȤlWbnqyRVߠY)_Bijq`YYEjV*7/2.HfZ. 2̑3ܼWvxUȣXJ#T9℄b!֑ PW& h/oA;V(~ @\rJϲyZ2AwVXDxkưu3ڴn`hRj#,66Hy׵F0`^ynKJ"Q9^9ILy~j-W<X,طm>grɰx2u8oJa]/'y֞ݹ"*_J9R x6v γn-)c;;'ĖdxE;ܠ~e%jvQ? y>Mz9BeEI8e%r^i +M/qs`qnxwR%ˆg.,le(4zT_|ª5%ќvѢP\lXhGMr_ihWj=rjoY䱍G݌T'\`w^a3,Vs deonStGLS';+wfT븩e K]&QlrE^7C4uR¢NqILSgUΧqQҫ,V*oD% cF7xv?ol]{׼WX}~ЎW\K;nBojN]Z/\I {qY0mϦv%5 gR@n?xj$O4W]gXTG^إ-c15c,%h{c+"H_²,w~.Ed8 s=3s̙3}|6[K;t9.B#7'^زMx] z9ϓnLO9H}\ᜑw5Ô:?aNUsXN7{8[|gSr üeC' o͸q8o ֪'9dH*E On+<[XS\3V:T<$D0Bܦ]rsq(rmmp)m˘B/V-_ג$XƷN`3Qk'k;u է)} i.?:چHŶ:9uИ˶W\vNJ Ғ7|@Z%ҁ(s+ -.Wa66<j+ 8Rsb.OmIf>/Y!8r~0C D!D!V|w-`JmS¦IprˍޏO]N!/m+sRSueWG?Om{@ iF> 3 z t`ļ~J[QZ~Rp>/ iЍ {xZQG)݅S^U6  v=l(N㳋:*el;DhH{vyibxMal^m^a42SG-G+v&ͳywOkhݷ{4hn6z} j֯MKf9߻ Ul`zMκrSL%6A@NmIt&f\m*V.@*JVCu¾Cs{( /T(^\ ǕjI:VX=mSjH6iTXTXp1eդ"v)vmM)&}zJ;ʧLv}.BR(&VLC觊+'&ÑClf1Ywc>F^C?y 120恗G3u#_Y\"glG /d{^r E6ym9P6l.LbNM#BΤ.Kym9,찔"FmA7?azn 7R-^>Y͟#ʔC$O~0b;2<<0[ߕݚ6?=7ߛAgOL&y67r-W HE>̿]v\;: *+$y ; sIZ{}>ύ/Rzˡ۱ ȵ4=#P+RܭlP0s%؎{G  1NUX^6!$~ƕ@5ouC#o+*qwwL{3Xҫ7@Z jVd羟Wm)=ںԜ+w]/Bj1'4F|JT<\')f=$vңrY72Eŷ{q%(G@ڒP!HCbziH$*1fsb 2GY^Cʪ*ND(@He`0_5LyWrknYW} dyy2@*?dON^\\kPL]=豿j)DX7~Bp"B<%2M%Ȥ#U-Z=#Q`բz/8VRͦɰ}3w=)g\ψ>8 *-mM/X~ ٨/ʮ#<vWW?ժ+OsueWc'Z{T#`׎H1*~+Y%}奒ϝZxUXLew h4[NeS|oɛ尚z Viswa6J S8nΪx ˨e β3U/FƤu%R MD,NK7OZz~&yEAdz]Xtkdrun.lo5Bg-b؃? ^MP:I_g88Y@V"}֟&kLM" (*B"cL*IJ)Yqd3kZs=_?pa6᧯\6-h߾ڿnlK4Lv}CefWvqc߷a*^k}F_]t =@,nsu\ z] Ɋܤ>2ELTٕ36.|.'%VS&,VP{Ui\D6ڳ,,YWKUi+}c9GG$,iVskGN fݔuR= /Ip?qHSU?) Z4'g6 jvCkw!^H:)+s)SGz7S,ͧCx,:g &VavI%K"FE9xLRz}9ohǧWS hL*(=EKFVHl{tcDРKǎ{H5=9$V [MqW5 C0ylZ=(cBg:ɔ=E6,Ce"SHf`{RKdr1._;dM񼼁z$Hմi$a8{?5k:=Ȑ=uj:UOQ+ʺcdw ̵g6ɾz5E/ FA@Ne{2@}&0 |-m0M+ù\dz6?jJn tjꁐyeݷMٓ ')Ry : YҼvY`$ٰt5V>P^y&ר{\֤ Q2e]4XNqJ{|f>? 4L塜:ߵ/-Y;bȠ]4<;&T+ ǧWmW-XΟvݶkޭ¸tnQR_-C3~5w[Oa*4;?c X,|pGғf^z Z \ e}\vdzθ-,MKٹPe`u IDAT0u˴8xyqߵ( 8.G4_W5Sq["W=Fot?#|ٺs;^˶8|-˾^j`cd' }塡9iSq]BC B2FwM rmf%CCoٱ̵D6O|ph4k+,{<4O͜< weE,-H|?H* ?lK`TޑEE_l̞Viz9Aqbbbr. @?7 m0ĬѣgXPbx~rhY?<G9 uTFcz?>v֣n흇f LY:ݿo9>^K;4@'t:f @ / dGA`B VDZԌVy*NGҍ%' zY*MvݮNC&%Φ(-헿ph'r}$$$3ZÅBBB ܗe;}$.߄dqx}>yH?RJdTL+pB(O#Bunt: L {ܹ+ORҒ]?aOBs8)M$'7IXCDY Yh<4䥟d.Dtd+_my>le&L`$9W(Z"rۦ\D۴)iF!} `Օl:үLi}B-2g@A^$"y6]{K ))~W{\"uoBz`M>suiFSGϿm3~~ii}UwRCuv,$~sl58hQ|pӦ]Gx\|";2)Xf@0 gE:&[ñdVGp"]$PktD>F0{x-F-D6HW7ȋb)f8fy,.,ׁPIHlHkm*O 6< .(S) $ `8TdW&|$mӿuy\U$Ut@]%-VOY-oc90L@rIz*JJ||=*אR)ήVWn؄i-mz򳍹8hzG{ I߭{}ʄKfv7zPQ׌ lx3w1o1|qMʥ:n؋CJE`?U45O!OV)鷉%[9bYg|#X-5sZ*йv-\1GЃhGq΀JlGy.逸yȊc;K mn/$Ѕ&j!&L/X 2<(l~Gs4$@$@80h5 0l?}{Afa9c屜^rt=:5s<}'c>kO^؀CY-"Tt }Ph]D"T&0BFޠ5◎@x>~68&WkIzR qHpr@}l9BZQFApY\oF 5$9 UF<]NB*\%ơZQ! @p]C/26 Ƌr ?+a0@baQ:2Fo۫0 m/ǨA5rZoGx<~sÌ@Y t7'sҫ ^|1tlm̎-0ETG0Xt:^4z uy_ڙx[`3:blRUL@mIZgP3۞ۅ,ywP@*8e(ک"K՚LRk'KqWxV|XXdo?[Ic0x* {͖^3HTD"@&x]MŁ2aln`#Ϯyh2R Mk]drB0+WE3H#l`fߗ'GVWx@!=х,Dz(z'=V"Y@۸gP4r9jgL_dIt[]W\&Ǜ"M@WvV#@_xڈ|0;u4h$jȱ,:rᆡRLbPoΎʼP±jDWA\nB4e$5P)eˉb0*ޖh nΩ 9$hC Žuslj ӏ j7_am3(mksHUG 547 9?˾>Y`#@{wuYS3{>v_š 4H͇i "GA橮$g)ԋ:|!s~ŎtS@|*Ք60i6(օZUj ~eE7Β@0|D*9y̦^ܻ@VbnToVps혏ɵCh,Js- *M2u/ϵe"Sپi|Hzkg0oO>#.[8z'|eݟt#TcWP#+sA^6gDe%wM#z Oū2 ;BJW4+ ٬ppN$Pj~V?9H>3c~V~*j@qE%j Sۣ4寞<J~$9s@)A)2Gá|h=mvHOKh3DXʂ<͝aҋfs)4o#4:2\/ș207(=wC8+ɲ*s@ cnFUԍʰ lie Lg v NCgZ{0w Q `0^VVmuj`>r G];ݱۊ}{c]1 :6Mt sfss?Jnm΄1 dxG6fsc-?LEҜՄ`0usNp}?;_KoA*DhaUߎ̺u&6Cm.diwNlq>Y'uu Ӄ=v!9^V%uLr~'Pa`0]V/}+U\0nj^kf^s>i#\)/s,.L3*O4ع1(b8l؆ʧېn }bL>X4mv S];]j㟦J $b†]wB=v-+C?2JJe:3>w&C.2Xk㳅Ӱ0 .vCƵċƯYQ|7nĉ^D]/M%v9wmR"W$FIbI\{S[?24^<GCb a0L]!#m➙cם~ZhɐW}Ź7(*S&'n᳇$=j+gaV&rQXp`4_ϡta'`k ص%׵-}lqZ=J`0ubg9$ڦ^_zѫũ_o:)<J#6:6,ͣ{v3g0cU9:6Z5ߚH~䙎i_|8 ˣC|#׎`0uɵ#y4L{TPxOz,)&6 wl9u?FO.LlkAƈ[G:i@gdm?x_(`0uI`0x_;`0صc0 `0 `0 `0 `07GsUΙ3 ;WkW;k wL )7iy7o_bRd,le|ؕOݦn{Ͻm?fWd]k+3L t =2c LVw7ei}۟7a*?~ZRux-kae J\?Ǜju'A=b-}^{>kUZ\}"5q^+ڽeW}5n[Cѓ#2>=ǫ7fPޅZ!M .{jdٷn<=G`Z0ox-բeS(D}Vtog͛9 P?~oK>ZzM?޼`w2siA+&xQ_`޺/8y):zq>\ d0"HDG _=*O-F)g;cAR _'zb իv5wQi"w|Bj/uƪ[s">u~[_rZ#rV܇  v:!+SrU` 7"= D'cZ%ҁ(kW=;3?pUb_T\IKMՕ5!-;w2R0f|p/;'~%iI^ިR2m*ӊK!Z'24M*՞/I 1@1_9z`*RXplAV% 8=(J(a`W.'[u 89="o9rXK/v|z`j*|,o'xTҭ*Mmpd 'c󚅹kJ՞K0;8ޑALǕI:LF]'_,۵6>)j2'ű1bbd#uT*OdR~I:Y,Gq/_7Q:fhKV Q;z`SgѤN o~ܚ1%,# ~ vo V\n[f+87gҮeܞq?eWό'OߺzQqVMʥ* aظOz4sCzѕ3upǨy}+M]Xҫ7@Z ٢ed羟W]qڔzc;6ݿaA?1$C>eAƜlf,yul&L hr U])pg v혺 R؉L6h(̹P8?ڲhǿ1-/@{k 6^t~ 6nа?yu쭏ju̐?ؽ3{FJS7l'layz`HRٝZMa05b`>"Lq \6(z K&u~Y"L&8Vw=]dҳu"ͩęW~ 5*e<1IHim^} ]:vܾ"mk9SAܕ+qG!SOբ!| 4.QQR8lO!7̚6mڴifYٲ0]ft$xhQ =f3%ØQm2Gaԝ:@&}q h@Fh0A#Jϵ("{M ƴr%~-z}ݞvŪuohVsEY M)imBlS1d}NvmÈٙ{5sj4ay"__VzdM9;׻߇2? ޼@Y:w2zʾ,4V~@+~uɇ1dܮBQz #Jvc qG/镛ɯKn::0L1gw-| h?|t,ʞ{oKJNcv2oPG^].TfvjECw|POӎH`x_K3NIdͩG)tBkHەs 4L?b'-zB(lo(Af>4/O1s\^sw*T{^<-㙞Z97cwsIMo+ZɳJەt խm̚Q+I3bQMG[uazц*]^ YTlZ^|c@/Ȋ&nCq(MֳT# P^z<3|ȟ]ܜ6cg@wǕ54jmo%~Nk@"ѳyzc ]9^T~(N`/^ ~LěBu}Ro *Xp~Ƿݻd]RfiO^;7д 㥺6O 1ۗ0"z""FD dBw⯶\d̾ Xf0 vߖA\8ؤ.Ϋ5hAQl#ڕ T& HoK3Oge2Ÿ IDAT\# 5}lg"Xah|߬oGv7Gw׏ʖ_,$ow(/qɋ[6I䟿CF, v*6ҭ-}){}/۱blo)wO0Tvpƥ+Z1f y3kӥC >=!؇~~XXEmMY7.G7诎 li=u9&l6V]Z>w^O']AK6,{M&nrM gc'k- HeVܙ_לȨ07[k> -7;֮uߋ~,BjI?L#rju+u yӸ$ɡmO`w`宝Шښ O }#=izQˎp&)bk_VcQVzjrykH"D.@1mBjO咪?;%NChe2r%;z9|Ԛk[FiNvM&R2Dt/٪g+y;o:m=ӿ\bEor K#iqrOZfiҷ5)Gt΋7kƱlaEJ7eOB5ej>Ow+?f4S+z(o['Vf~n@^):/ղ+W>ͺa}D7O?'sl9Zu#O ^YJ8q"Š-:Ctl1`ܐ٦Kl{Gj817.M7zjo:Ivs݊XhԽ{mǶ].2F6me |ŠV}:1׫4rnei(gDC>@_OZ4ȱSW_OD~j&/8"m>aܡ3s\-];HOS]h`H?{I7zt͝ݰM|ۮO-ӆ=zdN%X^H& 4@+ (XV(=W2|me=;8~-bӅ6(?iT&xK:x-,Ӥ-ϖW2XZ˞P:؁I0l֮BP(Hg_>|!~/̏9}Ŀ?wgO1ЪWVShBpinH}bdxl ZN(2  8 XРM&4@ *wt/Vl:>3({BԦw-wwL<}Q gѐc6/!d|ã}oEN&Sc[rR{%v  ;V|ºga;Ť3b^?%k\c~ԴM'l'[!hз헟$Lsį4q|)Jw|'Ж//,zɧdMx9w.Ӓ}O^׻m(L~&y'*#Ȥ، :\Zfoq/kVyqbG{{Sݕ_oI37v{ny)&),esjLeCƥ?&̷YK;3,CcbiÑbQm 74a ЌYu,<5ˣ>]6{JKQ`?,Jb]trkdܻM?-w\V=V ۦ h浿$fI(#X>)K 2heˀ|C+_>KLʡ[:34BFT|B4HD0 ];ǮO{:n3l+: \uj=P -G,X(*0tJ=brY0-t4k_N2BQߓߙ8&g]#͊됸tw37}ꤚ`wx#@ \'7!/WA.7BÊoП>N PpG/=TKtoKݏSQr>?b4GЀ)M۞ ߐwhWƠI?+ʯH[KGy}r^/Dꌨ嗘ڱ_I9 B蕄DFȴ\{[ǿM!emǂPTyy, l[N}f~`Y[kY8O\{Pe`_?\3c*Ok4Zf08R4ݓAwtXsB0'g7DzWiEk'vaum`K_n- 3uB?kzq'֐O2j0o.U 4/M߀d /c#nt-2BBEZ@T @JC]U_.t-ͯ7l_ `1(5مB_'d dIS95v4># uJr\~~jD6Yf",/cL~X mSJq/6In)Gs8 rPO/46E]pcF;LȖm#\(xG~ 8x LȲrs[N̜z zgRhwV#5h9bH8 aM jmEn:d``lɶgCZ칑m4+{_?o9z > H=J.QŠx;h%%r3p9m|/joE}Xl,m@q\Y'#ky6\D=ߩPttY")}anN]Y3iܲL:zDwە`|+[!m ]pc鼆^r_ibtu;D}蓆GY{.ӁM lR/j}=s吆{K,25o&}I'nԺ?%eVOo'طjaҠV( ,2@9೸vƚ٣K4QŦ;^1| fݯx-Q?دQŧޙ4_2b=2ۦ-4gǖ~3nv-N~ Kz#kkϭCzg%khn:pfG )o^y$6]#<߽dk€ˆ:%;g_h0iɮ/F+3 }"b_wNzI~ A ) 'nKBõA_ hFY ?_|snӰ}f.ɤcl8Q{C@R%̈=s"V(IeyyP-ʧR>;;-7,ܨ9:#P;sbVYзGߖF>r4gis|S]SOfҩ7q~i2wo7Tviv~d8bضgU%\@J[ޓH/zt즃ce7tՓ/t?c?(gٰ{^]72׫M:zG;Wم/Yu\~ G>׏}㑸B< `0 `0 `0 >tn+JǪ`0 v"xAG j(Ӛ.3)rwúWvĈthۤ};6 ttWo=pGbn:ݹC=GO;"".&8kzrl?dLv!,SQڵ-KwS:oyxV<[v;@kH?{rQ^ SS|֐+u2U-n}&f |G2Xyyb 7˱͗vsǜ';ZɳJ2.KnzF46Wa< ?sغԿ~Oks3ѵۓ|<ڬ!' /ĦjH02•p*"'Ь[LXMS?͛dg߫<ۤ~~Hlb _}EȾV4QVZLp=2ڊe1:CnFa8upz#O2WL7w3-}٭LG~ D }du14SoGf:\]Sc u2M;'8FHж' ;ΎTg.yf|aOuXݹש?R X~o_gifW/= cPpܗ r"vQg;!2$x"屎$)& 6CGiO4[.S4@|~(6 ɮ wÄ^V4gqw}<@E%hٛtCpaSI3YxIE|a:d#Mmw[MڲNZ{1,G@3oٴ|Jhk2gD}Ou )q\ʺa}D7O?ѵ];õo~E^2m5qF/53/w4ٍ] ДxrJoo&'|A,3^Lj e )`/>RGN#8䧳 SQ['WR?0<6u*Lдk0][oyܔWF|ڼ_$yoa}2Ȭ3R&kP8ܺ] v}ǎ)+˽{<gTeLt٧|"+Xk[èIRjp[?vU|"W͟2OK. !,W`\U\)2ґRεj&Gu:KKq;5H51{ϲ"99Ѹ.&sej Ǝdܱ7|dl͜ @2qiG1\/,b) ;oDWݼQR 5$OL0bbB G@r(e{so)ޜ%#}؏ZcȪSZS٦ndTTf*xU6L9B0w%)yF4[Qg# hkk~ mDOlžN&.hfhkǢ_\?r:d7V$MuYڐc#4KG#Tϫ+`lۼO1kg!?v=!z[qvӗT0iFs߈f$àѭ.<;EGԎȱ6$#TS[GWשjECCsݼUo E%F_9:::rlM(.9Uwێ:-=0ؗs7Cѳ=O`9̻o6GRjjb_55g.κ:ӗm'g<1V = }i䜠~{z.ŽVg}Ȩ =9ۏʥk; k8~޺dCW֫(;FlHsog8D5u|v]^,;/#nhA_G|;,=P{ib|AD! `(ഽ5tl(k|Nj01p9P['~%ϝ4 ތy/cL2o9B L߻!3oEh1|[~ܢq\Hc"[f1]ݿPm4FZp{C)2/DۓJKiabF Q cyqkEm{꽚34++k= dFUWuwJp1aK_WzIǝmN[NӦԗW FC}k͌.{֭\aC0oԞкD,0Ѷ^nH\DpF>EA5JQ5zKiѧy1W3K=3#ME4{K0'kJΗ?kGhogoK;`1vnh?2^K22-Я5}x4.ᩘWL.'(/H:W.魉ߠq^=|})h,(J>RV*aL'$ ?l>}:&2vyӟ '%C=#&lfLY@cFʰ\2t'&]kZWkٱk[kH&Nl*gd "n.ū/ {km7V50@jk.MuYڐc΄,ЊR]e׮0,4ͻyXhDOCF8ٜn߇5=MPM8kC2B5u]} 慠-=uxg[6{`/%n' uoR}nv?Djjbg;qZ۲S憠&hﶫ剱J@ K$gXB sw}gmwv}^ν j ګBEϟT0_LѿiBHly;F<ޏci=2'9ֳXճY~c:&-T6\TlLjNC;-N vMS88YU]ƅ10Yab|hʼn{هMI)IJp0ٓC{,h\Ov>0:!0pځuKo/[*ʻy[!ܛ~;UxQ~u@-ʾg<%qս0$|,KǗ nC΄gW"hN4c!RFx LBUEĝWΫ4іl͍er1X,oժVeD]bC+2P>dצ2߶ JN.X_Z^p2O ``$Viގe7ѓd]ڱŤ JON7c01:wG58ȴw0@}p͏,m9eE vO.U=ʡOp]|竅h6l"8888-LSMǶ74|zTnMbe@UE֝_ds๓u`!ܛQ;So>`ޝ]l ܘyK.[:r iL_S=R8'hFQr]vӽWYĵӷg͇n=پaEM橛7 -ZEd;&rKD1|FI@SFǥ4:u#g?ԘT@4-lGhT՜A }^Yo:c,щඵy":ų01p9P['?M%boqYD(f̞cj Y ݸqD6>U)<ӏ;W6EѪrD[yEP{6{;zzxxXI-*^v ORjIw?޴5aYkf8??g]lcW-YnyjUzN]:9rmy<"5`L ۖMݗ `×۷Sۥ FChD`*2zt~݁tEA)Pi)clY5R]$鎟#DEUtN}y_B W+勏޶?VBYءeSzf۰5n%23\q &};T/ѵ#4ηf7@PYIڥT@0;7cK$њIH 8tM*5}׻u`s_id+Z #]8oL~@:9kk'Z . ;iADgT¼m/ZZRF؊J eu3 {']9*HMºXƗOw,)Uۥ-eevA^SYno2=hJʵ3~Ag=Lg%ۍ6R £Bݵp{ ћLk3ɬ~^.fyhCSXw4^.4uj*3 x7|L8{8i37Ե)  Ƭywo߆?Thh~𔥋P@=!g[ <*j٬;[P4Y G8PEWľ˿?A,jƫex_k'ϙZw4u7# nl Qa=t^W4&Se2=Π"ݕ ?ҿaӜ/°u1Q<=d(+O0\6ż*KpSMy}gӪ4z:1*'~eAdP_6$"}YNB>,{ۺvx]0Z r1֣)kRKLr+-`ZE9m̑-fF%N1$a㣲B#iBOuac(G$huc1 %:[ӑn14 Kl^tUlߟ~0r)oj3,7U]&iQz%SY%J8>!a8G~daŒgJ DE wᆸ(>ӳ2]GZ+wDw Rzf71⤽k>%X P+DLYqRN&K 3&)_OIg//ܐI ێٲu 1mQa /1˗w]uR%~z'%hoB(FM;@ y42@ ΅h P"|Zqyi;&^{ *ym+e{g¡*<#*$kX'eJql\pmCv\\Z4[g)R]#?x#[ PRLt٧|@\;ѵn寝-ӌXvQJ71 5 mǪ;YRJ{5'rq]S 9S:CbaQ\5mGgS4>?ļ6- -SYB\εZ_>QT9}:U'F5 d1vnތ%F}~zwQanô'R9i>ʜ 8)d&"GUyOc5wZgS.<4t$ dP߾[Mū*MLiz-G8ldM5\%<}"( Eڱi<ܽz/µ aZ /ih8%X!Dw[pjˋˡ0 .{li۳l殭ˁ΢V4Ko6o4.Y[Jʤ1aQIX2I V%e%ڏXUϩzY0UG -uxV/OGK0m|VQx F4RYK3c)RF؈Vf7?%r4)g,}Zn?oϷRYl[ql,Qa?;h]BmCC P?4D@ E\6תEjQIQ[pُC@E"Qxmɉƽv1+Sc@6v4o4G6 2%l͜ @2qiG9Yff k9K+ĴyB*})7|OgdWbߢ5i7oU~ 1~KG֫.͖C=mk ^ c]82EkJTosOs>dZ4 X_px5FZT$t>)|j?yٝwDZq wjuRרDYM> !U򴖞4>ks>[85w/IP`Ҍ/ʬW`VfMn*'~k d7+Xw AlGW]ͽ}hx`wS^!lŭ*\V!-I6$#TS[GGBTR*=VCWoC_pn[U|n/NRr2$hǝ=x#מW1<9Yhv {œhX߆ 6̋ǫw4X|$8(B}nڢu٧O 5b !- JVϑ$&)oЭZFHp$g5Z"9Ԉi3Hd-.؃o8WQSKJKDG+ x(h->P;}˨dgӱsM ٢Bk<1wvzPEw5R2o̘7J{bоsF9iĵcjaqcLV%._Zqma#~Rr+4L n?*ӯ4 @2~F #kگWQޥw 2/+g8~ ~No2k?L:xv%r-+Vk&MGVZtEmw2` LV|׃WED ܆0b*>䜠D3cQs9M,ӳ;ʹ=Zͻ,J lHD[57`ҳӿU7,z#D?h!; s[yJkiӒؽ&h@PKLjn<:ćq|~l&Q]:xӼ QC+Ro/@4abt;k[劬_~:aoAtPKk+h6l"8888mnbM7>ʚw"M,"*?$ϝ4 ތyr5.KX&͛ʀ;)& 8ٜN-vDw-@u%xeW?h}% IDATʼ~"W(G̽GO Q6Wd;C 5^S-_t0Tˎrۃ)4'}6yFCh:י`9h<"-zҚ-7c߷~RLq&o *O:)H *+S-~u+Zs篺.АmUg_Ab];B|;mh?{]ڱ-HCgp3FKxyi~daCW_֟1N:c@ٱh%N_im~ix/`wh Y4ꮳ jw"^Um5u Tz0;U$e|tǒRm >.'ϙZ|̹eew$z^< q[xت3վS}~/ ]~)tޱFtx90l]LjT0`@p[4v] +3sҺWD uiI -?<\TVTL꫐WUthݴYymXt:ϥTW_:+\Vr()#_ږ߬^! {f96[P[I)J {&O#+S>Qx =hm}Qx r[CYS=-D zA|ԃJSGz1ytF,G^?UH:B$@%*|P01T7i1my?ǰw!J .||j+8rHmcD ekM4rrq]L4dcGs2"Eڮ :kcү;&f(Ej -c#@ B, 8@;,5i7oC> MLAt;?_ *xU`i#| @(ko>nyީ;,CLklEd*Q?ĥe'8=3'SqP/C26ec~B 5\mȱ# ZQ*÷!uߍ@%sk>u}g5Ԕ,-剱Ji> @rNP\vT7>b@ 5Sf TS[6feH&Lmi QI<Ι4'Ѱ\ ̋S*z"xX'nc6}2E7҄(wn7K[-?Kx?b!=Ym]b.c"|Tz`' UZTL䚕C: vMِSS6i׎U]ƅ10Yab|hʼn{هMI)IJp0ٓC{,h\Ov>0'.x^hĖq4Y~*)gM<6*Q̛WCOXW"r?<}']}dJ156-ٚ bh9MmYߚo}7=׬!`%',KĬ EC%\J) jQݽN)@]ܲe7ѓd]ڱzŤ JON701:wG5eL~܇ћ1|՚a[mn: vOk:8888ź1XG9ߺfiN ppppx|͆~<2MĻEiQyCfԎcM|K4|cBi[{<5koϨrEWtBm'|XnM3sfբ1{%h#Wٟ@~eh7_*?ύ!SbkH[rQ'L2o9BЈ:8jβ+MEyW-?n8. $1[X->_f'!T~?b޷PJqWy{5ghCAyx+H&N"R*?>~C+[d&n>zdJEזri38&li>n6`ݖ WCʋ&)/q>kTtpS|0TV:vzB+xꂟ勎嫚,wl_ٱ ^]*.=mh(CkD*6tM[_璟h/lw[_xz>t?Rn0Tˎrۃ)ip~~jϺL0RMO,rOjHKmffN}A rf`05/Q4v#}.jAtZA@)εmPv,Z3uS  R>eKJviĢo$vx Q~AYۍ1RZI Y4ىІ`QS3ho7Yyd3 C#%@z۵Mq8b&::= oW}TF4:^[hIð#ko>$@ncVg܈ȿ2X=g/a- >sL4'zq-0\'/VrbeX؊#BFHݵoQ+v<58Եc&,<]JT;ܙ__-t0hf_VB`0>ˉC.K+U;e/a6-:NulX>ȵl#L,_ */z~BB  wѸ䢲bR_METEM{$+݂0MVy˾BGl;hWsO%X(̬OS2B24l#݈JЙ^a YhJ2r%/~? ?l>}:&2vyӟRLgg N:@IsD@Ohb'Хدk2,gFl^?<zTc{=W6D@d4J L=`enOWl:1ZsV%K*ASg2H幏U4G# ,-=!3^uvqۢ /RTAv\n^ūEgkHD7}Wk*5v}ǎ)+˽{<g3 @-x_](78;]H1g}@hG>wz'?UQQr"dg %ʪ,ƈl#m;~ǠS`ҽ=o<疗e>~?dA^Ut.mfdg>w/ĀIJ3EUX-?WaǵC~1. *J/ҕd v/m)`5yI j;[-3)T8Пzo'|q'v{]]iKg-rȬʳ+iP~R2a[G8?: KϦi#}~ЉyQ?] 'R9xP\ zPB>ya''B瑇?du{RϴFUHCf SoV^?^'xYѿտ#nbVd  UJVȴT(5>ۂ,)0Lϯ"yXs0TbBU(EU Q>5 \ 9}ST-ث/EՎE}fS tq;}ӿRy~jG+MŷwNTcu1~ڱi<ܽz/µ aZ V7ZMUe!N;mH-V)9X/ &re~V`͗kWN9d#bUy{Hr-K XTg?~Y'#=Zs %@#n׌1ytɰ?לX?f'nnu-uxuښ*h*]Jʤ1aA6['4@#mͅV*LF#T/I< @ eylv$7 U"ܲqwE?-=cgoL & "9um oZ[w`jODG AޮX;^5=V_[^c]Iuֵ#nSw;h]B9 "W|/2]g .||j+8rHmcD ekM4rrq]L4dcGs2"xe=s'SD!ҵ#TN+5-hR}ig k00 PsׯSXg!)C"zt2H۵@gu8A+XF%ïLym<= nVL iJ%Xh ^X09_)JPBSP>`lͩlSe-܍ UbEL߅ mVphdVI߈+oBO^j }75ey}WS 0T 9t@Bt4B+Je`k@v= [I[#4 -=S'ݬDW~ -|.1C84gwsiVT߹4s:#itO}LICFv01t/)P`ҌTH+ATfMHPlO֢2}]:~΂y);rТ/s9&r xţ߄=a͛}7j4Ň9!TS;#ڐPMmuWM_#x"02Ǒt>ij:x(*+PhrSwesRrfHϦryb䜠~5ѧyXLmMY% .A@eEnX%  c@ 5Zms7 .F(Zg+C2jIiy5U鉲]]x}쫗s/CoQ&\ʳ`RVf^C' {~OH413ҩ`ڔ95{֔{Q呠t0֗ca9"/-|ߔ"`ے%ZJ=;޽u~G[=cިnK ݇MY0p>dA^22.| @+Nܳ>lzdOJQNRrɞ`GCR~ٝ0%f'd((|Q ==h v`e(WbZפ jQ֝?VŤc0y橽|O{ֶG 5{3`H!;9?<^}\ N7wSEw?|Z}{ٍϙuQ]J[ 'JD[57`sӛ%rO8 wɞT\^XVhYyT~clK+Kfoָc%',o(m{n [M|^ݴ z!Q-zq+:Ijv.:#fair Ms ޾黺>=5 0>Kw!jheQhFekQ(#5l);vonMݮԼ@K/be-jҹ:{g}g/l VYѾ*^ү}V-Q7鶧սv0XY3DE龟?q{<=C63u:xQW/NC^'=n 8$Ims1v#wۃ#j -ȒǶ(/Hb>:K7.9i=B7j(&~195E;e ?%mt( (xxyFdcGu'hlA^ Ȍ'\;gѦ/n=AD1ރ+/XO+Zu%v**镸.Sh5&s6b85ݷ[ޯ+? I'Z7eϹ*=ܖy,^y%01ON/<;Uxwp"L`<փL@+O6UZ_)1DJ %әtOwfZF ` P)ڿ98 A%+aLh=y% ڃ޽Vx w9TF2kP~>%Y]ED~vKI(z. AsDZї_C0|rdļE+#Ⲝw7 uqn$ԜId:L7og},DOtV 5Ja|#duཎCM(AXY\8 iNtjDxu1k;,xǺ?S*[1*? ZzisC0 @y >XKEkZT0e}](ϤZ93vRtsZey?%S- |81}](#'>ôEMnP&ڐqh9⹒W?'eTܥ:!M4od~U(;wykr.=KVYȆqnEAwFEU\!̎+t~yqwTێFH6{KHEV#o1#J:ӓ"vg@@ا* L[yídIQs8WMr<_֟I|ݘdqM:$ɻ8 {&  ? =*ƀkC%X6+7:Q;5dEL0uGt܅_=]ŬE;eI?/Vmg.׮vu5`Sا* 2ʯ)r 'Ƿ3#{OBdz5Kz{-z㔣zoRn7]H"m\sxg[@&=%p>hJj7!BS.;&TF'#ҶraQǸCߕI[n(H,t`Qٱ1-nY;A?$,,̾.kKAj9L)L7`6TߤDݥ?cML/6s*%lN4z%&H1ʘ6T+hߓUB "nbjFdž/n`}~^Cy}~ӯJb[dX:crS-0,msaN3Vϴ%O/\t?f7CwW+nRkъ U狼HF׷x-tfX"rxN[{XkX𙮮kV psu e5 1;eXV7!}H~[\|_FE>c+$N8kmPU04mjet$9 )*?˴"!DǘըܗBqN 6<0&o>x35b-U&S3?bJAECI&MǐLCAdͮjZdve67'UVwqe)ꕯD6`ɠԄhj%gBc2ؙ{Q{$-{qqVTI:f=هyy)SmD i IE̷YIq:U0ȩ9v:ZԾV&-/ϕ&&> zs|mlqV0^x|A8P`7CZG&-~]L5*vcڀvuG0p̨zmtg$eU>vx%]j<%І'Y`4x\Ey+S `ikwUy&64BAA*Wb%AY~VD##@P!X| xʄdL,c" bL*JH!4:S5%@(` sy:C?~Iq/Q}|T/4,_Du#-S %C㨙3ٚd_$PPlvvVT.oMv2)w^TwV=y{aRIRTˌU̢2LD<VAR]"b^^)h2PF\++N-ytKj;z=>p#*㵾Ys*? 4WTԕbaG##yBŹN/׹bR`@;믣B#-VD)qHJ1JKGuV6E2R H5EO|HY;AɞQy鴥;%|V*+ hGW}b(]Ґ:S7Aޫ|‡&VWp/tm@WO~ڧߩ)gðzrJ\eNg9Hv[+sR9 33{m}Tiׄ .J dn(ffF˾Wlv)S=VZjS-]UtڞKk]ĥdd Ymj0 @xfָm^QF J\n1-u$E"#Gfi!eZ{DZJ*0P1a"(SéTn2ITͫ ME @ZUztB#ȺJk3"BB!)h7`R)B Uj_EZqJWTYi &|g&)DT w<\}<{o\efoBF:CDB8ڧVSQD%\s5LDnRUP.&rAh(6L`imR^ JGOW[<-ҶIb8}Nzd֣fgg%q￷/~x?9jFFVg:"d "edbjJBZc{pcb $&2:l3+Jqw"n;d=S [{p;Ŭhx\ )M<#"ǞxA1߁#}ťzïKL?\:vY}=oEᘔweTM|txCK?sEk7`ڐI4؋;y+Wz9{RTLF0QqUVHIAٻG*}hZD"Mέ Bq-dF0Z MPk]*,)eI(%3Ra-<;AMz|dT֫}z%ʩ~pŊct=9GD $R Xy©m-rgO@GXeb9Sow/='lU5g4LN;&IatpK9"V8cڲwc!&wqd濽/0XN[rׇഘ@A} qx"ܦG'?QgzwߐаЃnF${?#1zxNID9x|n_>?F?B4{C7 CUBv_OE pr8ƜIG#/L 1ѡ6EMy~̙;)-Q.9j3kI휳={C ٗ}_yg]yyuBra(!bUV6¥f2đD̉*>7.SڬIo2ҹqzazfڑb.wbȆvnys-NBBW+vY1 (\[٬'bR~fl'w<\]Y\;Q;}c%}JV]Ɲb@T=eF?ln](l4\:m|mB iֳ13 )Q~P̦> &gg /U@ |]P\R'*"xQ%KA'ĻFy!Ait0*)КaL69o(+[*eMy-Mvx2vDAE Xƫ'ᵃ?Oe@ I!& =_XPErdļE+#Ⲝw7 ߯G+~2ZfHa|#duཎCMöm+ =d3͉npUNn }MwKi,R7K72E>U&.(7(À 漌m,%Kgu#'>j-zfl4]Iו˚cLL(t";SGH|i-66ܠL!h9;"ۡv:s͉Xm׮id]*P Ewfs7" vӯ8'*MkN$?v2 Z[yrş,1 *O^4$Gg=κ # =.ƀkC%X6𢆂EMG]8H 弻ypxf[DȦDKw ^d}@ N_nV0 -49"171ɈQ=mi QRZX!~ﮌLXo~(gm Qm@Ni:r?( TtfvNe )FXf pa79+&TƀT^vq9B 2N,b̩t"qڠWͶ+6(犷봵w f},;eO(UiROsך}"ӹvVgz^ E'|* cc4ujVZ;H]P[Sn6nd8̭GU7< z*H{wFF]wk%fBqN 6y=;d*T`GO"| |$O&MǐLCAdͮZo jfr G5*;X"ŋgwn8SҲ'YURaދ'9Df $.5{=Ώ<$*徏OoԔ /O@&!ë'Oޱ?~z B[ۧGU{r&n,f2hh+^L`ڍ2+N#%& }?.M& H1Tm@YNd8dfT@=13p" X7\Z+(6>3-["LAxCKΒ2OLX%q̙lMHrI(;MI{8{cK;}<4z) *[ /ebƫގY&{ zNRX2Iq" jZtU'044/*ӪC8֞xQs]0Շ}z2/g~qN'9_N3 5P1a"l @?#//DUirM-N+MViBVD  2= 鑹~n ݡ2/@6qYS.#D:yTi$U52 YÔID8RQTYej~IEP~ѝ7Oo޵ۏ6XGSۤ/03fndd5z+Ay/cj諒짚(ÇԼ4'|3[P_t?ºav=&4ճ"kQEEEttj}c#UNVu(Ѭgjl$$Pkړ[Ev]Ҽ`g0 tV~0(Gf=Svg=@":j2Pbc, '6՗bU9bLP[ꕱi}UJW⢄&vhδ*7qbEM5"-ҲIBPuj&Ϭ%6F4mP9Xň}w=% \cٻnz[\h IDAT /ghC- ue2PӤWK7y?kDB՞nt+ˈ}9"n:5sn74%Ў|Sdb:eFn K}s0TR`cIq3nEf\<*9@-G2RCbZu/4gOJh:*ν ^@{b݇@$b)g*f]e\@: 0 PM&5^̟j:e `Ċe~r3.o:uqdqn*EኞyX?AG^6{-G" nȢWO>|s B7ǾcA0 ;{ ;;/]{(@EkpDB՞+&W{}kW_[ 88888MS[$1&ƥ_y{90vUuD:)8ކ?imn8 3UGn CAȐ D5E;e ?%Qa\%vٞ=xi>/ghw.fl;:͞P:aj8c@ -4mA/ʴǴ@hTQ. %D̺ ]W7ЗRzm3H@A"D[ٜ"tj/΍à 0;B0#"/"U0>gN$IiO(./4+{eMy͊IAd :R}ٔǟ@<{;lгW5w'KRҞ^2eJ{Q>6-0)p.i]H A |]P\R'*"x^)ȋAŻư P51wv@Y ZIʴ/1*݌+ /l3K _]JYyվ]{ײѴ[{|oI{x/cˑ ƬBb=}_I֪+;f>z$>σ ꩙cuǒIX7QDZW_")Hk#<_&S~L.N8kiCsvvhfWYR޾4\x#(z~Y')|Nd,7=X;aq< bnxb^r,S(Vz"fjv@^ت27$ Cgu#'>j-zfl4]Iķ<՟PyLL(t";SGH|i-66ܐW7)Ѣ{iQyYMB3gՇKj8kNjvM3=$WYR(s7c.`8шsLkCMmZ zb)b?Yb@T~iHȹ ')!Ⲝw7߯J*9vTEKn~$怅;G9QxwNJkC%X6+~5G `==hTcO2{. .aP}:@fںsn$K{)0o!OI z̺)S:q1M dż+eP^<.&NzZ!NKGTFw?T_*f`vvXL,UsG&=%p>hJjկA[RMW)M`RNteR n *_Sz 01z¼TWG(+}d>V]Թ{jۿbJmm h(Je[#a`)H JNFFp& Хo:g\f_Db1ǭ sgxU5>Qg]5;^^ /\}B_YĴqb fN+/ʹ:mba®kc o_tӕEc 'А.p8?͡M߯w8m wF{w]:{`ycIu.*C5z*z:1;&s1ehPLH?gt&-Mhq=2 kS*pEDMӀLE@/(K]3X=T&uLv6"?Sڹ-k6}3ooOl3/NR P:>yr@5aoF35Rcoi'(J9OY{bAW߰ʂ57֟ͅtvO wҲ'YURaދ'9&G& &>=r*C|Xi IEYo3z77w8m2j = ;\WCޣJٻo?Zv2)vʣ#SkOX__<"?_|Lp*h+ůK_ X&Mg:n`zH{:R#w˿yOIQOH,tUQAPsW:Q"mC8 L/.((hli6Aϋ劗 2>` KgfKQHƖ녅n ()I0aHIg/]tҥw(i~9X 0P,1L,:q>iH* ļR0d-GZ&%Bቴ R59J%QQou+"Xsa O]H_)c䠃U%DRYjٿ4k2P\w&h8bBeiK'[w*+N-ytK*xK4sU㫿H*B|Guaգ|Kj`kr徸tib%^uA@A9僛1ֺR*"d: DITRMͥ;{$uwZ"'l"Ut/mi=B>@ńL% 2~UUx&]S*Д" j=:z@츮)'vB{# L*E4Ud'q)-$EZqrVENf>zRQTY &(3jyٻ~*3{72W_D S*YLE߷&(}L!b-颢DT .nki_x 6P{]oQJ~/ҫjճTeBW%!T-CSSf=z?b1YezC<(gx+*6N`duUNVYz>TO+`5톎r-%RU }Mo FzZ ֣L}C6 )m5@.ihCIIsd(nKN>deNJBi˫(5}ԴɯO> z Pޏ+0ad 3~8 1V,a N6³]uJ n##Ǹ^LɯwoF=~w+:cciAA@|w/ⱊz/BH(ưG&I/-V5WIhHMӉv6(Cn۝ &=r1U@.)eI(%thy([eĴM#}ť?VZ2uQA8iq9Ҝ=)a*&]8*+tȱZ]Suo9Hss{#Pzju%`ЧR(x JK~_w ־#9锍3+7X]͸|%[Kn>5cNW4%Nj7xB碻Xfs˩E"Ȳ=]WL֦XYFt+ia5.} L~CtQ\ c1]s_ +H?|s BUs.L/;գA_UhNցyQ<}nCU}'i!q{stZy_]:鵡i}υr3"Ezf;髩鷴wo9|9]Is5ܦ0>"(x ð4P0,i}grs>-aR~ھNmАCQx6T'( @٬c7n Jv9$9LP1sg.Z?^fP  <z䎹P vِ@4t>Wl =kG vfX{V)#tj7ڑn񛬧鷴&8sBC/ۤ"3d?1Dόz'h^tO1u4dCo浶F Hؕ@:ގ' [EG(go:P :lR?Q(1g:iϹ4!}mZ`R>pAEOT}T³A^':3[^jc2e?xVinr![73614*2镸.S4e>z$ǵGLuҚ7uDZW_" t_}8]\mA|]~Փ4;@ʿ׆L:=*6Qt,p[2Dَc<2]eߛ uX_@ro7xmLdļE+#Ⲝw7 H:cx7(qDvw]p8 f]ВV3hRHK9 ]WF*/9~; &g>Q1Fd:L7og},DO?_ۭp2N6ݵ/0.6Ue%ɺes^`}lu`tf[Zׅ Zml4iSz~Ki,.dP5'bMrZ zgt܅썔qYλ @I wr0˕׆ _KH=hm$W AqˁW wێF9~65z & KԜF6@j34qS3o*BL_}J%El*r~j` 'Z a$f:v Lvԩ AQo],YzĊjGjѻw>95 {ÕrZ8_eƚٖ9{{ N4cL++..kQ1(MEqh%kNO]=ۊW#PhDIiaIOfI"gΟ ڷҥZکb1lzPm@Nizq?( HsozZsyiЄ.EwoVߞFji3z.Z/"X3ԮPG/{+^zFbw8lv3Zznө7(犷봵w fzsbvCNE%QOrdKLd`ekۭO@[>ߊ4?:cD&vT|<|\O~s'T!+T԰„47?2(YMLzx.!"*Vì^Kv)ekbfϝ}\p>]ou?K 7gq̫,6IVTIykٿzw+`+SgH|}+?XVcL<_|\ Ii8MvbD\>Ff>|XoÛr,'^.'>HU1o"zc˙r *97"O.nHWj|).~ZcՃI_&a-iRW(̇O7-ػm~CVilٵO\eN.q$J $i=ʢO~ }dzS*4U$Ҷj#i,*B|EuaգǚqN. Uw 0L*DڊhZ;ujYU[_攉sAkZ8.,I6xVAR]"_啂&zl"}px1P-GZ.D8$e[7YOϥiM\twUrӰʤ~}~A>h봺j={Ũ5G+88]IuիL{0tC1)&PUiѸ;+1X$;Dr1F%Ib~zx0̞u[U5),9grjjaQPuyBUS}rg&IjJCPb<533ZbD4L$@I 8Z=sjӉ5Gb9Ũf;Y*:JPQįfIEF+h-GZg  @?#MƓ6險7*UUߢػ~*3{cD S*YLE}n3`#ֆ]W>T>QqϟE5I̾c UP< d`P}+)IM/0<{{XR>c^|..ƝMvNHͪr1&9XhjrT6 &61geS;Q+Mw\m"B?^Wދ[Olk6J{f0/汊Cz 2DD@Zi[w$B1> MհPS]MuOQddjjjjbIAYN3Iv ٿK{9#i  $=|(VrĐL]Å"^vW%}+&HLZg١"Զxl9~mer8UuБesYQʎutϾyje>{K=y MCm߷`ȒMC+ K% n;U' o=#w߶vu,iq=Ҝ=)a*&j8OV莺¿X?ڙYWYa;wom=M/I)7g#Vo..pfLj7xB碻*\t]1sEo`c70n#+ x>FKs_  e>?<(ϖkR) IDATvo88888;A<-B}j{]?$4 Miͳ= /bi-3u_-G)'55~[5$I.CPR?IUN"2G:Ip_kAi5k52t:%﷎R @4`kEMR^s9Bb6tNFj8?7ꏻn 1gu"3;xdح'A!64Tp|]N$f_:!"<7,¢Oϯ9s' gU_TBd2ҙYWY өz~Kij;>a6 Oxps;j:Y N xV-T1t>?ARaԎ"‡z]h܂̤* ic<CZ NUj7x󤉖$TxUB !(wu^nl7 I[F6{>ąanU.܇[1ɒqDDôyZS&Ixϯ ]E9ѷ>#WQ8ίډz&Z][~9B.uTJPs8KUp G(Te de2l kT='2^!E"[=/ ()-jh)Hwd@Ұó5{we<՚Q3idԟT!KAj٥&-FLS9,ۺWxQ#ڜR$Y5O +ޮW,ȓt ]yI7/S^폫=ǭ_'6I1̬UBzՇb0_7qZL*2)OΛgn04EDU=$CBCCC0%: _TL>fh1HAEim]Ͽl8պ2* [ _r`ީMǞq9.\JN},J{sϓ,>U$ƾ/*[ML|zT;t["0f'qttu= ,4䥠zP8ί>kGlˋ@\|kT ',Y뷙ŋw(w}-S~DI{floN_V=fMDol9Wk⃉rܦ(@̾}eʠemj+ůK|—Z[}{`8k9\V\S$T 0Պ~FVgC:~ҫAlX^?hL5BQQ,"/}mo?vQʾ]켙;;Ͱ,9F-VcXQ@{, Y$0 mL qgm8;wLsAZY⨠ ۻYO<XS#/(qj[.3fr #5gOcHw ʳ`0?aEǗkaS͎0rB/KשK bih.= AGؓd};p&ZZ.NY!S[1F4 ]6P{ep5@IgӼ̇W$E~+G<k 4HzzrAEZ1_ܔ"pScxjB^f xNߩ<%‡'ESx>M;!!@씊.DSKTu +A~vJ/Ѹwbćv%)LOԷTǛ<^ )=~*$b>wdكcRM۷3;0=Sb8,'a=G=F*͙пͅ M; ԅlP];{PP{2`ȧ5ׅ2m&]dgGC Sf?/II[I6f yiý'UqOS]fYj_sk2kUEHƊKNs8QwcS%W֯pDU~|dɷ"Cm;g{)M??GI7(m@Jg'LЦmvtc}wؠˆ#7ϛ90|IH< UېS JeoWn,>/檢7O*G~Kߕ~~ߺ>ϵA;O8qⰯ+UQAw5<81zmcP|=WL>7v~xYw0a6v{'& ҧ#O=UCp9+z!Ks2K?7[Qq`ӆ.y[ ìm*7D٫?'}&$&LЀńz%b|lmrdl3O-*U L롛7 |7 ˬXݜ aG}%!Vz V?8Vj_cy4LߖG3HglC8'}Aw/ 8lpĽ(H47U~dZ ώz 8߷/zqۻ^LЭ i"B}6ATScx#S&8"e9EeWiۢvF{󅤗!+L%KX Ooncۈy~ũ~?²=+^m"ig[s`S1-.]v^\?<_ 8Q~Ʒ(XUh>` C]LfC~ 2|'n5{X^-.CYTJU2@(&V "il"TױO/R`Y]8s???n_eάZmo9gnKvߚ=!!/e$u%Sl&hX;iSOYhHHMߔ6Q+^ߨv vaZ{Fm虜`0F>> ?{$_h+-NOJ'äY+S͐^^?z*żc%#dL;0Ϟ6mГgߔogY{w͹rˇ.dXņ#|Ϩ S 'm|ϡ\Ѽqϣbc_;ta--Cm֣[&'!!!A7.hˮǁ!!!ہGgHH1lɻuj֐z] ːnxHHȉu&ynKv5{CB[˜ @8,mwOp`0 ZZױgv1g5<-g~m&ʡ /S"i?m_i55/RH6: Ϯz^p8aÇM9HN>|ܯ䋣6L>|ޖ/|z1 Nd*1zmFt(9| #BE#meCM)+ 3yegJ}xe{FO kL;H3C>!ɷفjCiȠӒ2啂ʣqw CB2=qߚrp_C>[:ױw/Әs~jA%@W }aԹvd|41VP[.+* qX\wәCTw"Q.Ǔ$ D1_6=Y K+f cnpg=,^ˑ!5ybj4I8پyKZ-Jy4 Yރ͋~mcY3ؑSV ory򹓆woQ_c&+`43ij]4fg%gϑw@6&%O\fV&?x y}ව|S3ͽ5 {WV&KyʟT{pTtQܮ@VTn`IIo,˲&o(2xz:DIi_ sɠC3aG9=ơ}<]jm|! 9%?4na^{GQ?!SߺI7ټlv\YIFX^ۅHӋյ3D!S++50@L*69K oCkJ\>=M>N׬,cgھ0\;a>=lx啬S`ÖK2 jL3٭k<+ lLB(|xR mwlvJ }\ SdT3vŹEsۣG'gJH\%7'دm>}a7R߯<%‡'E@|B.fkP m1c<>˃ky4a~=[4vrv;I^bymEEϏ}3K ն]څ9b(KqN掝njiRNV[I!?lnf1oሊTSpi먑̭[¨kmLY$ۢ@Oݏ}`;xt_ K65_s[f}&_/Ro&y~JWͯ%)ۡ^yaw$>E־kqZ+LkЀ6ŝԵ=LۀX/.~ }1==ɑU3ۏ1Z޵"Y!Rޤi6# 'n-)]W[%g)~D./-ҋ ߘK$/5G @F # 0,G?I(+:;M[U18lx"}\VN q111qR*#.&&ET>_z%T޽ sZu>M݀Ui0nԯWwP͔F3=I65Qƃ箽Z׍}Ֆ68=B`0̧?*U/}y_ =f h a6BA^hz3mZ+{p'?8Q;ЛŎ, z(DE-ly͒W":XN~Pt+EHt"6>$R}q;ɇC y°"PIN\H,Y IDATF6!䤓Gp| z;!^Q&ל'M:.:)BQg63OĔ"T8%e?l$!Bڧڱ ~K$7j4yN\ !$ٯNu0Pi QUrr,72d*ZV,8kɩW2PiؕܲF !]Ir.Bv!Tpg# ȩZeB^yK\)Gb'1v$LzN--ZZX聈/FN8|߾`ۊU}AʇE"0> sI-~W*Z}즞 shSݤ'9^?4aXMk34豹 gvnqA};W3zz7HP2nj6d5ڴSS!9xI",翊͗_1K Ys%Ns.T+ :N?tsWw=:e}26сE/d*@XI-]ˋގpo`0n-BoVڕeܨwJڊ b"5r !Xsè 6!D%W>q/llܿVA%Xk.ݽw޽6u֧.ElT`4r~Q;M@5jj=B(yS[x-CllܘJMEQ6`A0\{XBFU+3,M9,Sk'K"BoqVbSkuSrOc>f*m5 !dk&A:w#$6؄PVjaK/Q;zYL0X6:|ՕpMF SQ;seP`Ҭq|NMcŠ|Pd?|n-7mղ1u1KV\D1Sk¬$-HLӖ:СCsV].4r'Oط({u Ҙ7=u-, ]|#D┰_P ?8('ک 2A;sFH8;9.uM@.C|"'vԡ:OWv!BQK EQglM+fT2fAR$(`qkU^KL"8_u啉ʥZ:ZxԎ`4uP fz5,u⣂}-AO*qu0DtshWBlϕ-pma=k'C`f-GpM5Emke Zo"bA2DEݝӲ/>ͷj;JrJg#ɣ[/],վ7cw$yui/~s" 9{k6 ϫHFi], |ՔcȰ`0vq,i^G8BN\mӵ@ٛׯ_~;KJ_I6n3TnnEeVuqU Y54$݁%K%e4z$HF(ɩRYI|| 4ج.++(Ƭe  :kK.}>+)K `خ#`Yv!;AYDК> ,+v}qU+͍z[`RK<)?}#QR8lIvp6m|ZLRkϟ`֐+*29kWO*AjY({2S W(b rc*.V *<sMuk\xOPŎKbe!De'Yݒ[^3>0,G]@!*+E!Tvd /\J!PX#fIȣ:}|e2ƬXkG \P;B+GݱXoS<~_%y4ϑ ؒB! #l\E. Lאޫ=MSE3#|[b~߸bLa4˅w%ERn8GQ{|.S_H)(Ih_}TNyմ䥣L ΋QE_ՌQ~]{P~շ_SNVÅ)z[ŵ3,'8Hp6]*˰pWJ/=;?h Ҡ[!(⺭C#|g09BI[<.0`=k=lħ19=;᱇yu?Նski͊_Գ[uɼڧB cڟRs0MZ6GS36sw{#<Bk^ Hi^LXY) h$OHgͦ)Gf_ɖ`T؈z1&%h߅ mGlZҥ_Tir="CD67m\ҡŷV#n+RƝ6Of.X#۸:v{Nʕw;yR*kAP}.;pY f/.H?*`plahA&K?>M&$fL7/eu>0ҔN?Ak`Md%VT8i]2d7Zw5%1)b|$\ݾG3{RU{L6!LytzϾmޙ% O>|5ڭ}-<×~Q LL6 lUNF=rd n"W?0\V ffq5޿e3*=~[z'{qJ@F[2Z}&i(~s+hW m1lʘMزv=ʖO{y`OBZ*?%&TL jl˒&>/_2^sZlrvˑz0K4,*=uqy|k}|/:5UO x^֢ݻ b+jHGw ,FGJÕ咄]fo8ך0%]]޲N%wmK&6N=|ܥINLlfD'ZJ8FIM;xIۉ?\<\lcymda0L=,_m9~b93ˢ6WHH@\F/mwasWqXgsIw_[(36ՖI4}gz0rr3v>ا{鑥_Îy=Ѹ\ep@ٳf""w$[%][^B}.}TbߺQ?~t8{!ӑ cM;ja&YMp>SY?jb)zSzU|"i! w>ӗEL_av Ic{6ޖ&8滌Q\6 n<"TR6Mʙ!8ܝrJN!SuzMz4=:zIRfreQ;"$ AKOQ.Zhvuz;1̄ǯ&m:ЛyCaiٙnLѣkO ޼Nd%{bH^;G]KaGز@|9 scHr߼NH+Ky.96Ref&4'u(%xpѫEZ}Jvng tuiFS4>!O2:Ѕ5ZZxޝ܍P[wxyiȒ.IKsAX=6۴4aE+u!GX3}R;VNSfd, Oa:ϛ]r]ce)*#I=5g)%FC$e}Eg>CQDڄIb{&mĢ#4,|]j~W`XQ|3*L(d6e,U]MdIg\ ,.@445Ǚr3-ʉȬ#O͓? -L'm P QZ.ZqKEVUcbџ>0D7dySǗQw!Wʽ {cj \v$O{, Y܆bX$EH*SIMCu([{# G J}_OٷŹwSMlջvn:r9QၹSl(v;4,_^r/F|kU<_͖i* ^>Q/vW\!U7mSh-+w=gAcŽ]3(WN>\Sͫ{^M_{n?6TQ&tXKKK1edT.kR3>C _L0*+)_4М6,6p{ݚ_ V_˒ WAIM{\k繎`uҊ%m\e+j]r1@G[W%eҀkE)D\K3uhOgޗI_k.^ /𝃹w֦r|t>&Ԑ05VՌ,/e HEV\~Z0F<->fCQMөx\T$֥7LRY]gJ7md BAbz%锾1]ݰenW$в4§G23kvߏHD@˜+E+:Yb}{KXHӋ5xLL2t;ڏ$?9uqϾSq-e54D @J?h*K/i؄ï$//^Z)-Lqi;~^*QN;a5 9iSel#{3&rF]r1M:Li{hkxLYҋI}?qTϮ \D:-$3w[rÀiZ$d5mg9?bCREpL-Yø#{pqjk쉍D&hӗ gv7¾q/^J5MaӿssыGNWrG1f{ΝF#HJH\S* z]ő&/|+uLI6r՗kOKday̘&a4Oc =l$ӨY,oSLvA'l;~Xk3+[rkۘmmNJZŌ6~DɡM߹YnGe*~}VI˩7ogҼэݠ]m뛘ٵ]#.2azĤ1 96ޣ{Sh߻f" Ǎw?`mmJAu}Oj'Gtf+3IJJo"!PUX1 v `Z;+kxSt_SꠟJN F&O ZU<ןoeϮU֠աU;)Pv,vhMR 괍a3fPwGS.)~vlGY,vc}ws2 އ~AN<'I#;6sg^|Q~/)izuH:/._"(eӤiz45c87:,p9!&LЀńz%QiK~4Qffh#dh`j]N۷)OxrnP=* y2fϤS7FA3ȣR#X(E+Lی:{S36ro)IvDSݎf1ަAҗ~^LX%ŀ_JpOЀbn}?{!dE7?]6ˣqy%.l]ͥk|=U6UQ~ϴ=ur,s&W+30vTւ10-.]v^\:Uh'=xHʝ- :\!a>d1;fhgx͙ IDATwu+ m߅se^F_;]:CZ7@m<_TӪP^.Zh(p콧v%%j`jad?\AKOK=e_Y^ʫrдY~yQ(%|XÖ? zUX&`zׇ͞{eӢ mse&, ͖U&oG#ՖIwo_L͑Z#!/اYL )n4uF̝UaWNiubo37*RY|iKy$L&40s~oJ"w-ZΓVgU@eW[QP:uQ)W/YymˣV&Qs{sӐ>a6ʢ/%?t{s.6ƋQqnhsKr3fے 2zo ΞtE>RH6#:]>yRUR׮q""Sw+.Ir,[_I'M{עKPOB/'& H&N_Eo#m;gCE}5];cugr(ON}~*unξ(D@r 4_diɁzJAۈPCB:U5U\~֝gpq/iTSlکW S62lҧ=πI~*U*S(*B?5ϐgYѫDOXD;G˃myfk0xZ҂oNrZ Bdb1t)׉ق7w/^YtfPXtZv['uHpoU< m Sܨ69~1+}V) ]Eתuu4-ű)bw{dhiv(!h/k7p\/Oh̗.a-?y?a77edxpTOI!iN]5S5mZ8dzN ?;3!bYy>!O2:Ѕ5ZZxޝ܍P]mA䥵G"+ΐ4?';G`X]}6&L㓴t@s徹.$SWܯ4S#}R;VNSfd, Oa:ϛ]r]ce)-Z~$ ?(~ô5҇yP\4Wv$ywO=6b‘ Rs? TFگ8N~JnDdr%߼jM_FFGܹ*Se`1jOc0MGV+!c!>A|v6^<#OaOӬm/eU9?N@Yl 폥8@Y}!wKu$V|V^$ˀU z+*v̎+j^VNz(|*f&2[2^ @'”|Ɛ * Tį^h-;藼v))}}V^kvn:r9QၹSmcXy!|! 9%?4na^!+J)ɂTpkK[^΅KƑHP2}ҰՀvǫBňvj2@E'3!JNU+~hgUF?Jвrwsv-:uλ+IT}R%/Կ-TQd #i4{w\!%c"0U'-( ȯ!Wnץ@rtP^X^ZRn1*=7MTJ뿌]jvr/r`c㿤K_?xM05VՌ,/eJ[ dqXdUQ>a"++("p >X;8[qIGvlԨר^Uu5M2Alݎx8XXط8ū\0}wrsqn5z{JEEr?nG~jsi Y%R$.H)I3a^Y:mb_g_txOMZtF)Oe 8<]2~L d5eEd7;npGW&fv:j&PsJZN=y}g>nU•$ԲrEm@s᚞"7 ɋ{txW/Ѥ/I:vgYA"{xǍKJooZL WZsEt`NmS.!Vʿ)SG,~bڲcG]'<>Hkj@JpgFө&QˋR#Nt0C#&H;)veK-/b#QqÀMX>y߇@Ruǹ14D\ob/8ԺUɺ=؏\-[ю DolË R~@PӼCkEϬ߭3kQ I+[Yiȡ$_9  +w5&n퍒G {U_=*:ȔiclцGWH3j.|{iۮS_+͸~51qA̍'2ӆ }Ch7ݳm sҎ_*_ ̈-{~_2o=ƿ_`~h0*$ vz衣_*_D_ս/Ձ*`0?6{vr]<_?$jr>[zuݭwH&II)M#$:j+`0 Fu(UQ U8`0/iu}wqMYpD ޲xa= zk`+V[,Zx`-vbUʥ"V\kU}RQA9B@dtv3yоMHH8}^f!;X0oӶz|'[޾qBU4ΣUk-|B=7/>BwOctǘy e9Ң;9tcŪV{fM9%Q|`J ؎|5߽ !O\k|qFII#|&XeW]FxzذU/FӴl)_`B(wjlMO3uhT74G!Пp6=,*jmM&,F.]9Р 5#&7=ʹq="ߐџlEk;>&ߢ FG{Ι":~ckO/G 7_nMX6|5=rVD]io|BXڡ{f.SOxXr&w$&R(d%)7y,>aoQխbREEƳJqӗefԑiX{[wY4iM/N?y;rDB?&LK Nlk,{Z^˧,WRXnG$ `YLlYMZӗU3؛ҳHTAL!(HR!SÀmoiњoBP|0x Ԑ ^QeiαO23SoL+ihMUTdY茏BeJ{ Ÿh5/e@-FT7%'՚nkgihMOJr>#BnMӍ-ml,oV}o.j`JKT7 rʮCL M⦕YQSz- }:+>*ڙS#Bjigv922lfё~M^4}s|x$Jy54K1ugIׄK5hlMOEӚ6N:hmMҒ,IC-97j!z4? ߾耬~ۧʊO; R#4 Yqt۱/5l;VO޿I5vɒZ?nMO9!|hck1;Zkr/> PdJ8B!tq).cBw@FG0q{F7yq=ۦ B^!O9N_a4허}4B!B!B!o$ B?½k\hVОܠՑ  ;omϳ9U O#BԷ{ClMzYCgg: 8{ߢǿ:R? ['"gK& (8.ZHwoTכ07nyB:gجs&&$zWQOظ"`yI2!i\u)OA߼pLg㇡KGdž< ^*䅞(e~ELTKʳ2~OF5\ZC{ׂ&̈ްRe KYjer ؎S 7P/ޕĕGd*y |r.Ь< %'}%_wiBx:x)Wݯ*Γ"o@iq*7i8O=V6 !7IL Fo6˩<>O>+:WF AdLMjh] 3~~T[&E|Uo;0 Tz` Nk2ܺ2'ǜgͧܲR/htꫪJK;?"n~ N<(@v rF|<% }r$n z+$ _jFw0켖 ,Yu@ڈsY ;㺑 @ T4_2m=uш9rծA32xGi֑2O^+DY)@ݑRjGڞ/,Ȋ2  b\7YnڵFi'o %0E ]׃aoQE_{YC븘1n^}?iσn)fPMWxßo$?OJCMOEJywyTQU*pmBu bߪBTU^Nַo *a\σfl:/0@/oPŧYE,佛ng_( nR8Gn;/1;"oTGƽUbuiwi'ei^efGIDz8P \seٱov2wL!aWJ@Rw *Uva*e'uẗFoz̀~!1[Q1{#(#yV֕֕BAn|vߋIiRPg|a _H959"cMj~/Pc$WRD~Qsw4%SMV%0i赚Z(SFX| .,'|<O#ǰ dŽ"ӞLIR%).Hekis>y,;+µBah͜moΤ{89E:3ExO3ʞױx\p#g&^7uqrvEnwtȴh6S7G$9ɕ]W~Z!̇?*UqzN6ˍŗ]w[=Db7o,8`GF =TR.3r^#),#Q@Ǧy/z@gvK[w fѴ&;a5y?; 8d$Cn;&#Tb=P{ 2|DHo̖*w \o6'9+ l4HSVϘ?ӊMyeνc[u/+H 4^>rASRb؍S\u}ߦGm,sBh6.>B;?(dsBn\*Vym9ݖ@!n-iBK;"B!B!B!B!B!B!/K13\IENDB`glances-1.7.3/docs/_build/html/_images/sensors.png000066400000000000000000000106101225327237200221010ustar00rootroot00000000000000PNG  IHDRY"&JsBITOtEXtSoftwareShutterc $IDATxgXIO@z&Ai6(**kCYEe]W]eX Kՠr- 5QZP X=/p23|_Nw`0 tZ!$+9ޏUCѲ1g8wl/3鶅B5d"$2R+q]]y&F^ "CNe1qdS~HDIČܖ"'A9Bਗ.Q߸='6tץզywvjZ$;vF BHzs A"DgDI{84?ːҲ"J -&u3L5Fϝ_m@eL_1B'<\KhShl6 +3B=4 ฮ~⇻dvΗҩdДPZ^v˟ȅ{/f"PşDOB:184ǔ"T{fwWXEfb:Z$CHOe0?N̆ |Y=L0=!bwQfo#4{Zq^qrQQI-H-43&v7R̼XΫ3B7n~CAZ?/6F m}"G*G$0We r»OB R34>q< Zru°]!$'ߺ@Bő0;-'G9kQzgiҸs\?5|[*PR;XnRNn04 Ɏi)Xo>a@Gn{٪{fI9B BU88M,a1I oӈ/{nN!$/3UPG*MMxc,$? :#78Vk=oR`) ZǵC`0 `0z-ad)Z& զJYNmop;RЍzϞud 1aߕkRS.3'$2vG `UO0yVy~ "vCtn9+ .nNs|}'.Ph____ߥ Iyr(w؏Vt$d <=̓7նowcpESTM}\4e((}J^-F G;>S*,|SORs(l]  ku.9x(nm48i6[lն3/;YxY}m^ycG%{ȴUL;TI1@1V!Q~V)٬ _"e_YtWEy\I*?7iy@Z)BX*"$ˀTT/QlRҥ. JoƥzՁ"aQ!TYHYg8BBnHgAJ@VϦimu5e*~Ik$HAIR\P+!(6ak^japtYw,  Z%/ Qoc-*@V_r2n:ޜ!U?,մ7hbmPt&\i ֔?:s5AQ߹<|EڄE0 8CʐZvң^oW*/A :pWM34h%#4ڀxQ.{!(t]bPz3Ogkjhl2t%&Ba$k.W~eJJAZ5=5xm%2pw2`4ӪIRNX8z)[^]k44`Sv>&KůVЦCWܹrg:!]'M7[g;[3_HkLΝll`+Na]'?.K*)~Wmzxhf٪k=jbU? X=qJX'F& z8NMS:+3޲FIdM~!^Z0։ҋ޸U/(`IxoUZdwҀlPEnRgKqi3|5Ѝ15(EitD^y|n*bd;i>StЦE-  \,D$ûiٝT&ډd{??\2˕,BzGg(_2c@~tDžue;:WT||20G; [mPbI?B l__YGrgw*eؘ ddEUdxkVNO6(kq,$)_n>!#ES+rm>*Wِ՞ XJv_Sد6T(\F]=YHZiLWH%vWr-j2jBlo@{p!z=i +e-/ 5;C؝dgQjz9s5/sZ ==JJ꤉YQ\Tsϟ<1xrstsަ J)?/^ٝ;b4q5⦟ D_w'"\*"U6#h<_mٹw/bM_?zz1R)We`a6Ӧ, .-*~LMKIX+`(vo#XP&ӵvvfU$ۯd|ݩV [G,X3qs$},$a媂63/|+uĻ\UB5\Zlb˵W+|X|?/ĖaU-ׯrqBb;j$`d!\1 `0'~?KIENDB`glances-1.7.3/docs/_build/html/_sources/000077500000000000000000000000001225327237200201175ustar00rootroot00000000000000glances-1.7.3/docs/_build/html/_sources/glances-doc.txt000066400000000000000000000345131225327237200230450ustar00rootroot00000000000000======= Glances ======= This manual describes *Glances* version 1.7.3. Copyright © 2012-2013 Nicolas Hennion November 2013 .. contents:: Table of Contents Introduction ============ Glances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information. Glances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring. Glances is written in Python and uses the `psutil`_ library to get information from your system. Console (80x24) .. image:: images/screenshot.png Full view (>80x24) .. image:: images/screenshot-wide.png Usage ===== Standalone mode --------------- Simply run: .. code-block:: console $ glances Client/Server mode ------------------ If you want to remotely monitor a machine, called ``server``, from another one, called ``client``, just run on the server: .. code-block:: console server$ glances -s and on the client: .. code-block:: console client$ glances -c @server where ``@server`` is the IP address or hostname of the server. In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``. In client mode, you can set the TCP port of the server ``-p PORT``. Default binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``. In client/server mode, limits are set by the server side. You can also set a password to access to the server ``-P password``. Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to all IPv6 addresses. Command reference ================= Command-line options -------------------- -b Display network rate in Byte per second (default: bit per second) -B IP Bind server to the given IPv4/IPv6 address or hostname -c IP Connect to a Glances server by IPv4/IPv6 address or hostname -C FILE Path to the configuration file -d Disable disk I/O module -e Enable sensors module (requires pysensors, Linux-only) -f FILE Set the HTML output folder or CSV file -h Display the help and exit -m Disable mount module -n Disable network module -o OUTPUT Define additional output (available: HTML or CSV) -p PORT Define the client/server TCP port (default: 61209) -P PASSWORD Define a client/server password --password Define a client/server password from the prompt -r Disable process list (for low CPU consumption) -s Run Glances in server mode -t SECONDS Set refresh time in seconds (default: 3 sec) -v Display the version and exit -y Enable hddtemp module (requires hddtemp) -z Do not use the bold color attribute -1 Start Glances in per-CPU mode Interactive commands -------------------- The following commands (key pressed) are supported while in Glances: ``a`` Sort process list automatically - If CPU iowait ``>60%``, sort processes by I/O read and write - If CPU ``>70%``, sort processes by CPU usage - If MEM ``>70%``, sort processes by memory usage ``b`` Switch between bit/s or Byte/s for network I/O ``c`` Sort processes by CPU usage ``d`` Show/hide disk I/O stats ``f`` Show/hide file system stats ``h`` Show/hide the help screen ``i`` Sort processes by I/O rate (may need root privileges on some OSes) ``l`` Show/hide log messages ``m`` Sort processes by MEM usage ``n`` Show/hide network stats ``p`` Sort processes by name ``q`` Quit ``s`` Show/hide sensors stats (only available with -e flag) ``t`` View network I/O as combination ``u`` View cumulative network I/O ``w`` Delete finished warning log messages ``x`` Delete finished warning and critical log messages ``y`` Show/hide hddtemp stats (only available with -y flag) ``1`` Switch between global CPU and per-CPU stats Configuration ============= No configuration file is mandatory to use Glances. Furthermore a configuration file is needed for setup limits and/or monitored processes list. By default, the configuration file is under: :Linux: ``/etc/glances/glances.conf`` :\*BSD and OS X: ``/usr/local/etc/glances/glances.conf`` :Windows: ``%APPDATA%\glances\glances.conf`` On Windows XP, the ``%APPDATA%`` path is: .. code-block:: console C:\Documents and Settings\\Application Data Since Windows Vista and newer versions: .. code-block:: console C:\Users\\AppData\Roaming You can override the default configuration, located in one of the above directories on your system, except for Windows. Just copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory, e.g. Linux: .. code-block:: console mkdir -p $XDG_CONFIG_HOME/glances cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/ On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``. Anatomy of the application ========================== Legend ------ | ``GREEN`` stat counter is ``"OK"`` | ``BLUE`` stat counter is ``"CAREFUL"`` | ``MAGENTA`` stat counter is ``"WARNING"`` | ``RED`` stat counter is ``"CRITICAL"`` Header ------ .. image:: images/header.png The header shows the OS name, release version, platform architecture and the hostname. On Linux, it shows also the kernel version. CPU --- Short view: .. image:: images/cpu.png If enough horizontal space is available, extended CPU informations are displayed. Extended view: .. image:: images/cpu-wide.png To switch to per-CPU stats, just hit the ``1`` key: .. image:: images/per-cpu.png The CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line. | If user|system|nice CPU is ``<50%``, then status is set to ``"OK"`` | If user|system|nice CPU is ``>50%``, then status is set to ``"CAREFUL"`` | If user|system|nice CPU is ``>70%``, then status is set to ``"WARNING"`` | If user|system|nice CPU is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[cpu]`` section. Load ---- .. image:: images/load.png On the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_: "In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods." Glances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core. | If average load is ``<0.7*core``, then status is set to ``"OK"`` | If average load is ``>0.7*core``, then status is set to ``"CAREFUL"`` | If average load is ``>1*core``, then status is set to ``"WARNING"`` | If average load is ``>5*core``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[load]`` section. Memory ------ Glances uses two columns: one for the ``RAM`` and another one for the ``Swap``. .. image:: images/mem.png If enough space is available, Glances displays extended informations: .. image:: images/mem-wide.png With Glances, alerts are only set for on used memory and used swap. | If memory is ``<50%``, then status is set to ``"OK"`` | If memory is ``>50%``, then status is set to ``"CAREFUL"`` | If memory is ``>70%``, then status is set to ``"WARNING"`` | If memory is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[memory]`` and ``[swap]`` sections. Network ------- .. image:: images/network.png Glances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc). Alerts are only set if the network interface maximum speed is available. For example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps. | If bit rate is ``<50%``, then status is set to ``"OK"`` | If bit rate is ``>50%``, then status is set to ``"CAREFUL"`` | If bit rate is ``>70%``, then status is set to ``"WARNING"`` | If bit rate is ``>90%``, then status is set to ``"CRITICAL"`` Sensors ------- Glances can displays the sensors informations trough `lm-sensors` (only available on Linux). As of lm-sensors, a filter is processed in order to display temperature only: .. image:: images/sensors.png Glances can also grab hard disk temperature through the `hddtemp` daemon (see here [2]_ to install hddtemp on your system): .. image:: images/hddtemp.png To enable the lm-sensors module: .. code-block:: console $ glances -e To enable the hddtemp module: .. code-block:: console $ glances -y There is no alert on this information. *Note*: limit values can be overwritten in the configuration file under the ``[temperature]`` and ``[hddtemperature]`` sections. Disk I/O -------- .. image:: images/diskio.png Glances displays the disk I/O throughput. The unit is adapted dynamically. *Note*: There is no alert on this information. File system ----------- .. image:: images/fs.png Glances displays the used and total file system disk space. The unit is adapted dynamically. Alerts are set for used disk space: | If disk used is ``<50%``, then status is set to ``"OK"`` | If disk used is ``>50%``, then status is set to ``"CAREFUL"`` | If disk used is ``>70%``, then status is set to ``"WARNING"`` | If disk used is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under ``[filesystem]`` section. Processes list -------------- Compact view: .. image:: images/processlist.png Full view: .. image:: images/processlist-wide.png Three views are available for processes: * Processes summary * Optional monitored processes list (new in 1.7) * Processes list By default, or if you hit the ``a`` key, the processes list is automatically sorted by CPU of memory usage. *Note*: limit values can be overwritten in the configuration file under the ``[process]`` section. The number of processes in the list is adapted to the screen size. ``VIRT`` Total program size (VMS) ``RES`` Resident set size (RSS) ``CPU%`` % of CPU used by the process ``MEM%`` % of MEM used by the process ``PID`` Process ID ``USER`` User ID per process ``NI`` Nice level of the process ``S`` Process status ``TIME+`` Cumulative CPU time used ``IOR/s`` Per process IO read rate (in Byte/s) ``IOW/s`` Per process IO write rate (in Byte/s) ``NAME`` Process name or command line Process status legend: ``R`` running ``S`` sleeping (may be interrupted) ``D`` disk sleep (may not be interrupted) ``T`` traced/stopped ``Z`` zombie Monitored processes list ------------------------ New in version 1.7. Optional. The monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good. .. image:: images/monitored.png Each item is defined by: * ``description``: description of the processes (max 16 chars). * ``regex``: regular expression of the processes to monitor. * ``command`` (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution. * ``countmin`` (optional): minimal number of processes. A warning will be displayed if number of processes < count. * ``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count. Up to 10 items can be defined. For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job: .. code-block:: console [monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 If you also want to monitor the PHP-FPM daemon processes, you should add another item: .. code-block:: console [monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 list_1_description=PHP-FPM list_1_regex=.*php-fpm.* list_1_countmin=1 list_1_countmax=20 In client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list. Alerts are set as following: | If number of processes is 0, then status is set to ``"CRITICAL"`` | If number of processes is min < current < max, then status is set to ``"OK"`` | Else status is set to ``"WARNING"`` Logs ---- .. image:: images/logs.png A log messages list is displayed in the bottom of the screen if (and only if): - at least one ``WARNING`` or ``CRITICAL`` alert was occurred - space is available in the bottom of the console/terminal Each alert message displays the following information: 1. start date 2. end date 3. alert name 4. {min/avg/max} values or number of running processes for monitored processes list alerts Footer ------ .. image:: images/footer.png Glances displays the current date & time and access to the embedded help screen. If one or mode batteries were found on your machine and if the batinfo Python library [3]_ is installed on your system then Glances displays the available percent capacity in the middle on the footer. .. image:: images/battery.png If you have ran Glances in client mode ``-c``, you can also see if the client is connected to the server. If client is connected: .. image:: images/client-connected.png else: .. image:: images/client-disconnected.png On the left, you can easily see if you are connected to a Glances server. API documentation ================= Glances uses a `XML-RPC server`_ and can be used by another client software. API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To Support ======= To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues Feel free to contribute! .. [1] http://nosheep.net/story/defining-unix-load-average/ .. [2] http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html .. [3] https://github.com/nicolargo/batinfo .. _psutil: https://code.google.com/p/psutil/ .. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.html glances-1.7.3/docs/_build/html/_sources/index.txt000066400000000000000000000011221225327237200217630ustar00rootroot00000000000000Welcome to Glances's documentation! =================================== **Glances** is a cross-platform curses-based monitoring tool written in Python. It uses the psutil library and some internal code to get information from your system. .. image:: https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png Get the code ------------ The `source `_ is available on GitHub. Contents -------- .. toctree:: :maxdepth: 2 glances-doc Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` glances-1.7.3/docs/_build/html/_static/000077500000000000000000000000001225327237200177235ustar00rootroot00000000000000glances-1.7.3/docs/_build/html/_static/ajax-loader.gif000066400000000000000000000012411225327237200225770ustar00rootroot00000000000000GIF89aU|NU|l!Created with ajaxload.info! ! NETSCAPE2.0,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;glances-1.7.3/docs/_build/html/_static/basic.css000066400000000000000000000204171225327237200215220ustar00rootroot00000000000000/* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox input[type="text"] { width: 170px; } div.sphinxsidebar #searchbox input[type="submit"] { width: 30px; } img { border: 0; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- general body styles --------------------------------------------------- */ a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlighted { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .refcount { color: #060; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }glances-1.7.3/docs/_build/html/_static/comment-bright.png000066400000000000000000000066541225327237200233630ustar00rootroot00000000000000PNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 6 B\<IDAT8˅Kh]es1mA`jh[-E(FEaA!bIȐ*BX"؁4)NURZ!Mhjssm؋^-\gg ]o|Ҭ[346>zd ]#8Oݺt{5uIXN!I=@Vf=v1}e>;fvnvxaHrʪJF`D¹WZ]S%S)WAb |0K=So7D~\~q-˟\aMZ,S'*} F`Nnz674U H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME!,IDAT8e_Hu?}s3y˕U2MvQ֊FE.łĊbE$DDZF5b@Q":2{n.s<_ y?mwV@tR`}Z _# _=_@ w^R%6gC-έ(K>| ${} H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 1;VIDAT8ukU?sg4h`G1 RQܸp%Bn"bЍXJ .4V iZ##T;m!4bP~7r>ιbwc;m;oӍAΆ ζZ^/|s{;yR=9(rtVoG1w#_ө{*E&!(LVuoᲵ‘D PG4 :&~*ݳreu: S-,U^E&JY[P!RB ŖޞʖR@_ȐdBfNvHf"2T]R j'B1ddAak/DIJD D2H&L`&L $Ex,6|~_\P $MH`I=@Z||ttvgcЕWTZ'3rje"ܵx9W> mb|byfFRx{w%DZC$wdցHmWnta(M<~;9]C/_;Տ#}o`zSڷ_>:;x컓?yݩ|}~wam-/7=0S5RP"*֯ IENDB`glances-1.7.3/docs/_build/html/_static/default.css000066400000000000000000000077101225327237200220660ustar00rootroot00000000000000/* * default.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- default theme. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #1c4e63; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #133f52; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #ffffff; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #ffffff; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #ffffff; } div.sphinxsidebar a { color: #98dbcc; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } /* -- hyperlink styles ------------------------------------------------------ */ a { color: #355f7c; text-decoration: none; } a:visited { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #f2f2f2; font-weight: normal; color: #20435c; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #ede; } .warning tt { background: #efc2c2; } .note tt { background: #d6d6d6; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }glances-1.7.3/docs/_build/html/_static/doctools.js000066400000000000000000000152701225327237200221140ustar00rootroot00000000000000/* * doctools.js * ~~~~~~~~~~~ * * Sphinx JavaScript utilities for all documentation. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * select a different prefix for underscore */ $u = _.noConflict(); /** * make the code below compatible with browsers without * an installed firebug like debugger if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}; } */ /** * small helper function to urldecode strings */ jQuery.urldecode = function(x) { return decodeURIComponent(x).replace(/\+/g, ' '); } /** * small helper function to urlencode strings */ jQuery.urlencode = encodeURIComponent; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s == 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; /** * small function to check if an array contains * a given item. */ jQuery.contains = function(arr, item) { for (var i = 0; i < arr.length; i++) { if (arr[i] == item) return true; } return false; }; /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node) { if (node.nodeType == 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); glances-1.7.3/docs/_build/html/_static/down-pressed.png000066400000000000000000000005601225327237200230440ustar00rootroot00000000000000PNG  IHDRasRGBbKGDC pHYs B(xtIME -vF#IDAT8!OAJ, ++@I vbÿ@W7F HN#48646TMvv޼7Dsax1U q;< E-f)j%po4xF78G>)- EYm4%7YTk-Qa"NWAo-yeq,) Ypt\hqmszG]Nar߶s^l vh\2%0EeRvIENDB`glances-1.7.3/docs/_build/html/_static/down.png000066400000000000000000000005531225327237200214030ustar00rootroot00000000000000PNG  IHDRasRGBbKGDC pHYs B(xtIME"U{IDAT8ҡNCAJ, ++@4>/U^,~T&3M^^^PM6ٹs*RJa)eG*W<"F Fg78G>q OIp:sAj5GنyD^+yU:p_%G@D|aOs(yM,"msx:.b@D|`Vٟ۲иeKſ/G!IENDB`glances-1.7.3/docs/_build/html/_static/file.png000066400000000000000000000006101225327237200213450ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`glances-1.7.3/docs/_build/html/_static/jquery.js000066400000000000000000007557171225327237200216260ustar00rootroot00000000000000/*! * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Fri Jul 5 14:07:58 UTC 2013 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
" + "" + "
"; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
t
"; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
"; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

"; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
"; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
", "
" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], col: [ 2, "", "
" ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and

Index

glances-1.7.3/docs/_build/html/glances-doc.html000066400000000000000000001215241225327237200213470ustar00rootroot00000000000000 Glances — Glances 1.7.3 documentation

Glances

This manual describes Glances version 1.7.3.

Copyright © 2012-2013 Nicolas Hennion <nicolas@nicolargo.com>

November 2013

Introduction

Glances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information.

Glances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring.

Glances is written in Python and uses the psutil library to get information from your system.

Console (80x24)

_images/screenshot.png

Full view (>80x24)

_images/screenshot-wide.png

Usage

Standalone mode

Simply run:

$ glances

Client/Server mode

If you want to remotely monitor a machine, called server, from another one, called client, just run on the server:

server$ glances -s

and on the client:

client$ glances -c @server

where @server is the IP address or hostname of the server.

In server mode, you can set the bind address -B ADDRESS and listening TCP port -p PORT.

In client mode, you can set the TCP port of the server -p PORT.

Default binding address is 0.0.0.0 (Glances will listen on all the network interfaces) and TCP port is 61209.

In client/server mode, limits are set by the server side.

You can also set a password to access to the server -P password.

Glances is IPv6 compatible. Just use the -B :: option to bind to all IPv6 addresses.

Command reference

Command-line options

-b Display network rate in Byte per second (default: bit per second)
-B IP Bind server to the given IPv4/IPv6 address or hostname
-c IP Connect to a Glances server by IPv4/IPv6 address or hostname
-C FILE Path to the configuration file
-d Disable disk I/O module
-e Enable sensors module (requires pysensors, Linux-only)
-f FILE Set the HTML output folder or CSV file
-h Display the help and exit
-m Disable mount module
-n Disable network module
-o OUTPUT Define additional output (available: HTML or CSV)
-p PORT Define the client/server TCP port (default: 61209)
-P PASSWORD Define a client/server password
--password Define a client/server password from the prompt
-r Disable process list (for low CPU consumption)
-s Run Glances in server mode
-t SECONDS Set refresh time in seconds (default: 3 sec)
-v Display the version and exit
-y Enable hddtemp module (requires hddtemp)
-z Do not use the bold color attribute
-1 Start Glances in per-CPU mode

Interactive commands

The following commands (key pressed) are supported while in Glances:

a

Sort process list automatically

  • If CPU iowait >60%, sort processes by I/O read and write
  • If CPU >70%, sort processes by CPU usage
  • If MEM >70%, sort processes by memory usage
b
Switch between bit/s or Byte/s for network I/O
c
Sort processes by CPU usage
d
Show/hide disk I/O stats
f
Show/hide file system stats
h
Show/hide the help screen
i
Sort processes by I/O rate (may need root privileges on some OSes)
l
Show/hide log messages
m
Sort processes by MEM usage
n
Show/hide network stats
p
Sort processes by name
q
Quit
s
Show/hide sensors stats (only available with -e flag)
t
View network I/O as combination
u
View cumulative network I/O
w
Delete finished warning log messages
x
Delete finished warning and critical log messages
y
Show/hide hddtemp stats (only available with -y flag)
1
Switch between global CPU and per-CPU stats

Configuration

No configuration file is mandatory to use Glances.

Furthermore a configuration file is needed for setup limits and/or monitored processes list.

By default, the configuration file is under:

Linux:/etc/glances/glances.conf
*BSD and OS X:/usr/local/etc/glances/glances.conf
Windows:%APPDATA%\glances\glances.conf

On Windows XP, the %APPDATA% path is:

C:\Documents and Settings\<User>\Application Data

Since Windows Vista and newer versions:

C:\Users\<User>\AppData\Roaming

You can override the default configuration, located in one of the above directories on your system, except for Windows.

Just copy the glances.conf file to your $XDG_CONFIG_HOME directory, e.g. Linux:

mkdir -p $XDG_CONFIG_HOME/glances
cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/

On OS X, you should copy the configuration file to ~/Library/Application Support/glances/.

Anatomy of the application

Legend

GREEN stat counter is "OK"
BLUE stat counter is "CAREFUL"
MAGENTA stat counter is "WARNING"
RED stat counter is "CRITICAL"

CPU

Short view:

_images/cpu.png

If enough horizontal space is available, extended CPU informations are displayed.

Extended view:

_images/cpu-wide.png

To switch to per-CPU stats, just hit the 1 key:

_images/per-cpu.png

The CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line.

If user|system|nice CPU is <50%, then status is set to "OK"
If user|system|nice CPU is >50%, then status is set to "CAREFUL"
If user|system|nice CPU is >70%, then status is set to "WARNING"
If user|system|nice CPU is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [cpu] section.

Load

_images/load.png

On the No Sheep blog, Zachary Tirrell defines the average load [1]:

“In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods.”

Glances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core.

If average load is <0.7*core, then status is set to "OK"
If average load is >0.7*core, then status is set to "CAREFUL"
If average load is >1*core, then status is set to "WARNING"
If average load is >5*core, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [load] section.

Memory

Glances uses two columns: one for the RAM and another one for the Swap.

_images/mem.png

If enough space is available, Glances displays extended informations:

_images/mem-wide.png

With Glances, alerts are only set for on used memory and used swap.

If memory is <50%, then status is set to "OK"
If memory is >50%, then status is set to "CAREFUL"
If memory is >70%, then status is set to "WARNING"
If memory is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [memory] and [swap] sections.

Network

_images/network.png

Glances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc).

Alerts are only set if the network interface maximum speed is available.

For example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps.

If bit rate is <50%, then status is set to "OK"
If bit rate is >50%, then status is set to "CAREFUL"
If bit rate is >70%, then status is set to "WARNING"
If bit rate is >90%, then status is set to "CRITICAL"

Sensors

Glances can displays the sensors informations trough lm-sensors (only available on Linux).

As of lm-sensors, a filter is processed in order to display temperature only:

_images/sensors.png

Glances can also grab hard disk temperature through the hddtemp daemon (see here [2] to install hddtemp on your system):

_images/hddtemp.png

To enable the lm-sensors module:

$ glances -e

To enable the hddtemp module:

$ glances -y

There is no alert on this information.

Note: limit values can be overwritten in the configuration file under the [temperature] and [hddtemperature] sections.

Disk I/O

_images/diskio.png

Glances displays the disk I/O throughput. The unit is adapted dynamically.

Note: There is no alert on this information.

File system

_images/fs.png

Glances displays the used and total file system disk space. The unit is adapted dynamically.

Alerts are set for used disk space:

If disk used is <50%, then status is set to "OK"
If disk used is >50%, then status is set to "CAREFUL"
If disk used is >70%, then status is set to "WARNING"
If disk used is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under [filesystem] section.

Processes list

Compact view:

_images/processlist.png

Full view:

_images/processlist-wide.png

Three views are available for processes:

  • Processes summary
  • Optional monitored processes list (new in 1.7)
  • Processes list

By default, or if you hit the a key, the processes list is automatically sorted by CPU of memory usage.

Note: limit values can be overwritten in the configuration file under the [process] section.

The number of processes in the list is adapted to the screen size.

VIRT
Total program size (VMS)
RES
Resident set size (RSS)
CPU%
% of CPU used by the process
MEM%
% of MEM used by the process
PID
Process ID
USER
User ID per process
NI
Nice level of the process
S
Process status
TIME+
Cumulative CPU time used
IOR/s
Per process IO read rate (in Byte/s)
IOW/s
Per process IO write rate (in Byte/s)
NAME
Process name or command line

Process status legend:

R
running
S
sleeping (may be interrupted)
D
disk sleep (may not be interrupted)
T
traced/stopped
Z
zombie

Monitored processes list

New in version 1.7. Optional.

The monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good.

_images/monitored.png

Each item is defined by:

  • description: description of the processes (max 16 chars).
  • regex: regular expression of the processes to monitor.
  • command (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.
  • countmin (optional): minimal number of processes. A warning will be displayed if number of processes < count.
  • countmax (optional): maximum number of processes. A warning will be displayed if number of processes > count.

Up to 10 items can be defined.

For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:

[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4

If you also want to monitor the PHP-FPM daemon processes, you should add another item:

[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
list_1_description=PHP-FPM
list_1_regex=.*php-fpm.*
list_1_countmin=1
list_1_countmax=20

In client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.

Alerts are set as following:

If number of processes is 0, then status is set to "CRITICAL"
If number of processes is min < current < max, then status is set to "OK"
Else status is set to "WARNING"

Logs

_images/logs.png

A log messages list is displayed in the bottom of the screen if (and only if):

  • at least one WARNING or CRITICAL alert was occurred
  • space is available in the bottom of the console/terminal

Each alert message displays the following information:

  1. start date
  2. end date
  3. alert name
  4. {min/avg/max} values or number of running processes for monitored processes list alerts

API documentation

Glances uses a XML-RPC server and can be used by another client software.

API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To

glances-1.7.3/docs/_build/html/index.html000066400000000000000000000137371225327237200203050ustar00rootroot00000000000000 Welcome to Glances’s documentation! — Glances 1.7.3 documentation

Welcome to Glances’s documentation!

Glances is a cross-platform curses-based monitoring tool written in Python.

It uses the psutil library and some internal code to get information from your system.

https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png

Get the code

The source is available on GitHub.

Indices and tables

Table Of Contents

Next topic

Glances

This Page

glances-1.7.3/docs/_build/html/objects.inv000066400000000000000000000003151225327237200204430ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: Glances # Version: 1.7.3 # The remainder of this file is compressed using zlib. xOKIP(.IILJQ5T(ͅJe(+槔*xShBu@&%g*AC$r1glances-1.7.3/docs/_build/html/search.html000066400000000000000000000061531225327237200204350ustar00rootroot00000000000000 Search — Glances 1.7.3 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

glances-1.7.3/docs/_build/html/searchindex.js000066400000000000000000000067111225327237200211350ustar00rootroot00000000000000Search.setIndex({objects:{},terms:{represent:0,all:0,code:1,appdata:0,global:0,sleep:0,follow:0,disk:0,compact:0,middl:0,depend:0,program:0,swap:0,under:0,list_1_command:0,sourc:1,string:0,iowait:0,trough:0,pocess:[],level:0,list:0,item:0,rate:0,port:0,compat:0,index:1,hide:0,sum:0,access:0,delet:0,version:0,"new":0,net:0,method:0,full:0,mem:0,batinfo:0,here:0,address:0,path:0,legend:0,valu:0,wait:0,search:1,queue:0,throughput:0,list_1_countmax:0,modul:[0,1],unix:0,api:[0,1],xdg_config_hom:0,instal:0,total:0,unit:0,regex:0,from:[0,1],describ:0,memori:0,two:0,call:0,usr:0,sort:0,warn:0,flag:0,setup:0,work:0,can:0,root:0,overrid:0,prompt:0,process:0,indic:1,critic:0,minimum:0,caution:0,want:0,magenta:0,occur:0,end:0,fpm:0,anoth:0,write:0,how:0,low:0,csv:0,max:0,mai:0,data:0,averag:0,"short":0,footer:0,bind:0,counter:0,issu:0,inform:[0,1],"switch":0,curent:[],combin:0,allow:0,ethernet:0,order:0,hennion:0,cyberc:0,help:0,over:0,privileg:0,dynam:0,group:0,monitor:[0,1],fit:0,platform:[0,1],window:0,good:0,"return":0,python:[0,1],interrupt:0,introduct:[0,1],name:0,refresh:0,psutil:[0,1],mode:0,each:0,found:0,side:0,hard:0,connect:0,tirrel:0,shown:0,network:0,space:0,content:[0,1],adapt:0,sensor:0,red:0,free:0,standalon:0,base:[0,1],zombi:0,releas:0,"byte":0,care:0,mbit:0,filter:0,view:0,first:0,softwar:0,feel:0,number:0,system:[0,1],date:0,messag:0,size:0,sheep:0,given:0,script:0,interact:0,mkdir:0,capac:0,least:0,stori:0,cumul:0,termin:0,listen:0,shell:0,consol:0,option:0,tool:[0,1],copi:0,github:[0,1],hddtemp:0,list_1_regex:0,than:0,rss:0,remot:0,second:0,horizont:0,were:0,consumpt:0,minut:0,zachari:0,countmin:0,ran:0,ram:0,have:0,tabl:[0,1],need:0,min:0,note:0,also:0,ideal:0,client:0,which:0,green:0,singl:0,anatomi:[0,1],blue:0,trace:0,track:0,regular:0,"80x24":0,bsd:0,request:0,drive:0,section:0,show:0,xml:0,current:0,onli:0,locat:0,execut:0,copyright:0,configur:[0,1],written:[0,1],should:0,folder:0,local:0,overwritten:0,hit:0,contribut:0,get:[0,1],express:0,stop:0,report:0,requir:0,enabl:0,through:0,grab:0,septemb:[],where:0,summari:0,wiki:0,kernel:0,set:0,maximum:0,see:0,sec:0,statu:0,kei:0,list_1_descript:0,enough:0,between:0,attribut:0,hddtemperatur:0,august:[],extend:0,screen:0,job:0,addit:0,etc:0,com:0,load:0,simpli:0,color:0,period:0,header:0,rpc:0,linux:0,batteri:0,nicola:0,quit:0,three:0,sinc:0,json:0,quickli:0,present:0,mount:0,aim:0,defin:0,"while":0,abov:0,mandatori:0,glanc:[0,1],list_1_countmin:0,virt:0,conf:0,nicolargo:0,avg:0,welcom:1,minim:0,cross:[0,1],html:0,nosheep:0,document:[0,1],higher:0,finish:0,http:0,hostnam:0,iow:0,ior:0,alert:0,user:0,php:0,exampl:0,command:[0,1],thi:0,filesystem:0,left:0,just:0,percent:0,tcp:0,speed:0,web:0,except:0,blog:0,add:0,els:0,applic:[0,1],read:0,howto:0,nginx:0,temperatur:0,biz:0,press:0,bit:0,password:0,daemon:0,resid:0,manual:0,server:0,kbit:0,output:0,nice:0,page:1,www:0,some:[0,1],percentag:0,intern:1,librari:[0,1],bottom:0,definit:0,per:0,pysensor:0,exit:0,refer:[0,1],machin:0,core:0,plu:0,run:0,bold:0,usag:[0,1],column:0,roam:0,disabl:0,countmax:0,automat:0,mbp:0,your:[0,1],log:0,support:[0,1],avail:[0,1],start:0,interfac:0,ipv4:0,ipv6:0,newer:0,line:0,bug:0,count:0,"default":0,displai:0,limit:0,embed:0,featur:0,curs:[0,1],classic:0,pid:0,"char":0,novemb:0,file:0,vista:0,tip:0,virtual:[],you:0,architectur:0,stat:0,easili:0,furthermor:0,directori:0,descript:0,getallmonitor:0,time:0,cpu:0},objtypes:{},titles:["Glances","Welcome to Glances’s documentation!"],objnames:{},filenames:["glances-doc","index"]})glances-1.7.3/docs/conf.py000066400000000000000000000170721225327237200154010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Glances documentation build configuration file, created by # sphinx-quickstart on Tue Aug 20 13:33:45 2013. # # 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 = [] # 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 = u'Glances' copyright = u'2013, Nicolas Hennion' # 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 = '1.7.3' # The full version, including alpha/beta/rc tags. release = '1.7.3' # 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 = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # 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 = 'Glancesdoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # 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', 'Glances.tex', u'Glances Documentation', u'Nicolas Hennion', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # 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 = [ ('index', 'glances', u'Glances Documentation', [u'Nicolas Hennion'], 1) ] # 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', 'Glances', u'Glances Documentation', u'Nicolas Hennion', 'Glances', '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' glances-1.7.3/docs/glances-doc.html000066400000000000000000000770621225327237200171540ustar00rootroot00000000000000 Glances

Glances

This manual describes Glances version 1.7.3.

Copyright © 2012-2013 Nicolas Hennion <nicolas@nicolargo.com>

November 2013

Introduction

Glances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information.

Glances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring.

Glances is written in Python and uses the psutil library to get information from your system.

Console (80x24)

images/screenshot.png

Full view (>80x24)

images/screenshot-wide.png

Usage

Standalone mode

Simply run:

$ glances

Client/Server mode

If you want to remotely monitor a machine, called server, from another one, called client, just run on the server:

server$ glances -s

and on the client:

client$ glances -c @server

where @server is the IP address or hostname of the server.

In server mode, you can set the bind address -B ADDRESS and listening TCP port -p PORT.

In client mode, you can set the TCP port of the server -p PORT.

Default binding address is 0.0.0.0 (Glances will listen on all the network interfaces) and TCP port is 61209.

In client/server mode, limits are set by the server side.

You can also set a password to access to the server -P password.

Glances is IPv6 compatible. Just use the -B :: option to bind to all IPv6 addresses.

Command reference

Command-line options

-b Display network rate in Byte per second (default: bit per second)
-B IP Bind server to the given IPv4/IPv6 address or hostname
-c IP Connect to a Glances server by IPv4/IPv6 address or hostname
-C FILE Path to the configuration file
-d Disable disk I/O module
-e Enable sensors module (requires pysensors, Linux-only)
-f FILE Set the HTML output folder or CSV file
-h Display the help and exit
-m Disable mount module
-n Disable network module
-o OUTPUT Define additional output (available: HTML or CSV)
-p PORT Define the client/server TCP port (default: 61209)
-P PASSWORD Define a client/server password
--password Define a client/server password from the prompt
-r Disable process list (for low CPU consumption)
-s Run Glances in server mode
-t SECONDS Set refresh time in seconds (default: 3 sec)
-v Display the version and exit
-y Enable hddtemp module (requires hddtemp)
-z Do not use the bold color attribute
-1 Start Glances in per-CPU mode

Interactive commands

The following commands (key pressed) are supported while in Glances:

a

Sort process list automatically

  • If CPU iowait >60%, sort processes by I/O read and write
  • If CPU >70%, sort processes by CPU usage
  • If MEM >70%, sort processes by memory usage
b
Switch between bit/s or Byte/s for network I/O
c
Sort processes by CPU usage
d
Show/hide disk I/O stats
f
Show/hide file system stats
h
Show/hide the help screen
i
Sort processes by I/O rate (may need root privileges on some OSes)
l
Show/hide log messages
m
Sort processes by MEM usage
n
Show/hide network stats
p
Sort processes by name
q
Quit
s
Show/hide sensors stats (only available with -e flag)
t
View network I/O as combination
u
View cumulative network I/O
w
Delete finished warning log messages
x
Delete finished warning and critical log messages
y
Show/hide hddtemp stats (only available with -y flag)
1
Switch between global CPU and per-CPU stats

Configuration

No configuration file is mandatory to use Glances.

Furthermore a configuration file is needed for setup limits and/or monitored processes list.

By default, the configuration file is under:

Linux:/etc/glances/glances.conf
*BSD and OS X:/usr/local/etc/glances/glances.conf
Windows:%APPDATA%\glances\glances.conf

On Windows XP, the %APPDATA% path is:

C:\Documents and Settings\<User>\Application Data

Since Windows Vista and newer versions:

C:\Users\<User>\AppData\Roaming

You can override the default configuration, located in one of the above directories on your system, except for Windows.

Just copy the glances.conf file to your $XDG_CONFIG_HOME directory, e.g. Linux:

mkdir -p $XDG_CONFIG_HOME/glances
cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/

On OS X, you should copy the configuration file to ~/Library/Application Support/glances/.

Anatomy of the application

Legend

GREEN stat counter is "OK"
BLUE stat counter is "CAREFUL"
MAGENTA stat counter is "WARNING"
RED stat counter is "CRITICAL"

CPU

Short view:

images/cpu.png

If enough horizontal space is available, extended CPU informations are displayed.

Extended view:

images/cpu-wide.png

To switch to per-CPU stats, just hit the 1 key:

images/per-cpu.png

The CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line.

If user|system|nice CPU is <50%, then status is set to "OK"
If user|system|nice CPU is >50%, then status is set to "CAREFUL"
If user|system|nice CPU is >70%, then status is set to "WARNING"
If user|system|nice CPU is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [cpu] section.

Load

images/load.png

On the No Sheep blog, Zachary Tirrell defines the average load [1]:

"In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods."

Glances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core.

If average load is <0.7*core, then status is set to "OK"
If average load is >0.7*core, then status is set to "CAREFUL"
If average load is >1*core, then status is set to "WARNING"
If average load is >5*core, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [load] section.

Memory

Glances uses two columns: one for the RAM and another one for the Swap.

images/mem.png

If enough space is available, Glances displays extended informations:

images/mem-wide.png

With Glances, alerts are only set for on used memory and used swap.

If memory is <50%, then status is set to "OK"
If memory is >50%, then status is set to "CAREFUL"
If memory is >70%, then status is set to "WARNING"
If memory is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under the [memory] and [swap] sections.

Network

images/network.png

Glances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc).

Alerts are only set if the network interface maximum speed is available.

For example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps.

If bit rate is <50%, then status is set to "OK"
If bit rate is >50%, then status is set to "CAREFUL"
If bit rate is >70%, then status is set to "WARNING"
If bit rate is >90%, then status is set to "CRITICAL"

Sensors

Glances can displays the sensors informations trough lm-sensors (only available on Linux).

As of lm-sensors, a filter is processed in order to display temperature only:

images/sensors.png

Glances can also grab hard disk temperature through the hddtemp daemon (see here [2] to install hddtemp on your system):

images/hddtemp.png

To enable the lm-sensors module:

$ glances -e

To enable the hddtemp module:

$ glances -y

There is no alert on this information.

Note: limit values can be overwritten in the configuration file under the [temperature] and [hddtemperature] sections.

Disk I/O

images/diskio.png

Glances displays the disk I/O throughput. The unit is adapted dynamically.

Note: There is no alert on this information.

File system

images/fs.png

Glances displays the used and total file system disk space. The unit is adapted dynamically.

Alerts are set for used disk space:

If disk used is <50%, then status is set to "OK"
If disk used is >50%, then status is set to "CAREFUL"
If disk used is >70%, then status is set to "WARNING"
If disk used is >90%, then status is set to "CRITICAL"

Note: limit values can be overwritten in the configuration file under [filesystem] section.

Processes list

Compact view:

images/processlist.png

Full view:

images/processlist-wide.png

Three views are available for processes:

  • Processes summary
  • Optional monitored processes list (new in 1.7)
  • Processes list

By default, or if you hit the a key, the processes list is automatically sorted by CPU of memory usage.

Note: limit values can be overwritten in the configuration file under the [process] section.

The number of processes in the list is adapted to the screen size.

VIRT
Total program size (VMS)
RES
Resident set size (RSS)
CPU%
% of CPU used by the process
MEM%
% of MEM used by the process
PID
Process ID
USER
User ID per process
NI
Nice level of the process
S
Process status
TIME+
Cumulative CPU time used
IOR/s
Per process IO read rate (in Byte/s)
IOW/s
Per process IO write rate (in Byte/s)
NAME
Process name or command line

Process status legend:

R
running
S
sleeping (may be interrupted)
D
disk sleep (may not be interrupted)
T
traced/stopped
Z
zombie

Monitored processes list

New in version 1.7. Optional.

The monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good.

images/monitored.png

Each item is defined by:

  • description: description of the processes (max 16 chars).
  • regex: regular expression of the processes to monitor.
  • command (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.
  • countmin (optional): minimal number of processes. A warning will be displayed if number of processes < count.
  • countmax (optional): maximum number of processes. A warning will be displayed if number of processes > count.

Up to 10 items can be defined.

For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:

[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4

If you also want to monitor the PHP-FPM daemon processes, you should add another item:

[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
list_1_description=PHP-FPM
list_1_regex=.*php-fpm.*
list_1_countmin=1
list_1_countmax=20

In client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.

Alerts are set as following:

If number of processes is 0, then status is set to "CRITICAL"
If number of processes is min < current < max, then status is set to "OK"
Else status is set to "WARNING"

Logs

images/logs.png

A log messages list is displayed in the bottom of the screen if (and only if):

  • at least one WARNING or CRITICAL alert was occurred
  • space is available in the bottom of the console/terminal

Each alert message displays the following information:

  1. start date
  2. end date
  3. alert name
  4. {min/avg/max} values or number of running processes for monitored processes list alerts

API documentation

Glances uses a XML-RPC server and can be used by another client software.

API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To

glances-1.7.3/docs/glances-doc.rst000066400000000000000000000345131225327237200170120ustar00rootroot00000000000000======= Glances ======= This manual describes *Glances* version 1.7.3. Copyright © 2012-2013 Nicolas Hennion November 2013 .. contents:: Table of Contents Introduction ============ Glances is a cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additional information. Glances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring. Glances is written in Python and uses the `psutil`_ library to get information from your system. Console (80x24) .. image:: images/screenshot.png Full view (>80x24) .. image:: images/screenshot-wide.png Usage ===== Standalone mode --------------- Simply run: .. code-block:: console $ glances Client/Server mode ------------------ If you want to remotely monitor a machine, called ``server``, from another one, called ``client``, just run on the server: .. code-block:: console server$ glances -s and on the client: .. code-block:: console client$ glances -c @server where ``@server`` is the IP address or hostname of the server. In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``. In client mode, you can set the TCP port of the server ``-p PORT``. Default binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``. In client/server mode, limits are set by the server side. You can also set a password to access to the server ``-P password``. Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to all IPv6 addresses. Command reference ================= Command-line options -------------------- -b Display network rate in Byte per second (default: bit per second) -B IP Bind server to the given IPv4/IPv6 address or hostname -c IP Connect to a Glances server by IPv4/IPv6 address or hostname -C FILE Path to the configuration file -d Disable disk I/O module -e Enable sensors module (requires pysensors, Linux-only) -f FILE Set the HTML output folder or CSV file -h Display the help and exit -m Disable mount module -n Disable network module -o OUTPUT Define additional output (available: HTML or CSV) -p PORT Define the client/server TCP port (default: 61209) -P PASSWORD Define a client/server password --password Define a client/server password from the prompt -r Disable process list (for low CPU consumption) -s Run Glances in server mode -t SECONDS Set refresh time in seconds (default: 3 sec) -v Display the version and exit -y Enable hddtemp module (requires hddtemp) -z Do not use the bold color attribute -1 Start Glances in per-CPU mode Interactive commands -------------------- The following commands (key pressed) are supported while in Glances: ``a`` Sort process list automatically - If CPU iowait ``>60%``, sort processes by I/O read and write - If CPU ``>70%``, sort processes by CPU usage - If MEM ``>70%``, sort processes by memory usage ``b`` Switch between bit/s or Byte/s for network I/O ``c`` Sort processes by CPU usage ``d`` Show/hide disk I/O stats ``f`` Show/hide file system stats ``h`` Show/hide the help screen ``i`` Sort processes by I/O rate (may need root privileges on some OSes) ``l`` Show/hide log messages ``m`` Sort processes by MEM usage ``n`` Show/hide network stats ``p`` Sort processes by name ``q`` Quit ``s`` Show/hide sensors stats (only available with -e flag) ``t`` View network I/O as combination ``u`` View cumulative network I/O ``w`` Delete finished warning log messages ``x`` Delete finished warning and critical log messages ``y`` Show/hide hddtemp stats (only available with -y flag) ``1`` Switch between global CPU and per-CPU stats Configuration ============= No configuration file is mandatory to use Glances. Furthermore a configuration file is needed for setup limits and/or monitored processes list. By default, the configuration file is under: :Linux: ``/etc/glances/glances.conf`` :\*BSD and OS X: ``/usr/local/etc/glances/glances.conf`` :Windows: ``%APPDATA%\glances\glances.conf`` On Windows XP, the ``%APPDATA%`` path is: .. code-block:: console C:\Documents and Settings\\Application Data Since Windows Vista and newer versions: .. code-block:: console C:\Users\\AppData\Roaming You can override the default configuration, located in one of the above directories on your system, except for Windows. Just copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory, e.g. Linux: .. code-block:: console mkdir -p $XDG_CONFIG_HOME/glances cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/ On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``. Anatomy of the application ========================== Legend ------ | ``GREEN`` stat counter is ``"OK"`` | ``BLUE`` stat counter is ``"CAREFUL"`` | ``MAGENTA`` stat counter is ``"WARNING"`` | ``RED`` stat counter is ``"CRITICAL"`` Header ------ .. image:: images/header.png The header shows the OS name, release version, platform architecture and the hostname. On Linux, it shows also the kernel version. CPU --- Short view: .. image:: images/cpu.png If enough horizontal space is available, extended CPU informations are displayed. Extended view: .. image:: images/cpu-wide.png To switch to per-CPU stats, just hit the ``1`` key: .. image:: images/per-cpu.png The CPU stats are shown as a percentage and for the configured refresh time. The total CPU usage is displayed on the first line. | If user|system|nice CPU is ``<50%``, then status is set to ``"OK"`` | If user|system|nice CPU is ``>50%``, then status is set to ``"CAREFUL"`` | If user|system|nice CPU is ``>70%``, then status is set to ``"WARNING"`` | If user|system|nice CPU is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[cpu]`` section. Load ---- .. image:: images/load.png On the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_: "In short it is the average sum of the number of processes waiting in the run-queue plus the number currently executing over 1, 5, and 15 minute time periods." Glances gets the number of CPU core to adapt the alerts. Alerts on average load are only set on 5 and 15 min. The first line also display the number of CPU core. | If average load is ``<0.7*core``, then status is set to ``"OK"`` | If average load is ``>0.7*core``, then status is set to ``"CAREFUL"`` | If average load is ``>1*core``, then status is set to ``"WARNING"`` | If average load is ``>5*core``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[load]`` section. Memory ------ Glances uses two columns: one for the ``RAM`` and another one for the ``Swap``. .. image:: images/mem.png If enough space is available, Glances displays extended informations: .. image:: images/mem-wide.png With Glances, alerts are only set for on used memory and used swap. | If memory is ``<50%``, then status is set to ``"OK"`` | If memory is ``>50%``, then status is set to ``"CAREFUL"`` | If memory is ``>70%``, then status is set to ``"WARNING"`` | If memory is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under the ``[memory]`` and ``[swap]`` sections. Network ------- .. image:: images/network.png Glances displays the network interface bit rate. The unit is adapted dynamically (bits per second, kbits per second, Mbits per second, etc). Alerts are only set if the network interface maximum speed is available. For example, on a 100 Mbps ethernet interface, the warning status is set if the bit rate is higher than 70 Mbps. | If bit rate is ``<50%``, then status is set to ``"OK"`` | If bit rate is ``>50%``, then status is set to ``"CAREFUL"`` | If bit rate is ``>70%``, then status is set to ``"WARNING"`` | If bit rate is ``>90%``, then status is set to ``"CRITICAL"`` Sensors ------- Glances can displays the sensors informations trough `lm-sensors` (only available on Linux). As of lm-sensors, a filter is processed in order to display temperature only: .. image:: images/sensors.png Glances can also grab hard disk temperature through the `hddtemp` daemon (see here [2]_ to install hddtemp on your system): .. image:: images/hddtemp.png To enable the lm-sensors module: .. code-block:: console $ glances -e To enable the hddtemp module: .. code-block:: console $ glances -y There is no alert on this information. *Note*: limit values can be overwritten in the configuration file under the ``[temperature]`` and ``[hddtemperature]`` sections. Disk I/O -------- .. image:: images/diskio.png Glances displays the disk I/O throughput. The unit is adapted dynamically. *Note*: There is no alert on this information. File system ----------- .. image:: images/fs.png Glances displays the used and total file system disk space. The unit is adapted dynamically. Alerts are set for used disk space: | If disk used is ``<50%``, then status is set to ``"OK"`` | If disk used is ``>50%``, then status is set to ``"CAREFUL"`` | If disk used is ``>70%``, then status is set to ``"WARNING"`` | If disk used is ``>90%``, then status is set to ``"CRITICAL"`` *Note*: limit values can be overwritten in the configuration file under ``[filesystem]`` section. Processes list -------------- Compact view: .. image:: images/processlist.png Full view: .. image:: images/processlist-wide.png Three views are available for processes: * Processes summary * Optional monitored processes list (new in 1.7) * Processes list By default, or if you hit the ``a`` key, the processes list is automatically sorted by CPU of memory usage. *Note*: limit values can be overwritten in the configuration file under the ``[process]`` section. The number of processes in the list is adapted to the screen size. ``VIRT`` Total program size (VMS) ``RES`` Resident set size (RSS) ``CPU%`` % of CPU used by the process ``MEM%`` % of MEM used by the process ``PID`` Process ID ``USER`` User ID per process ``NI`` Nice level of the process ``S`` Process status ``TIME+`` Cumulative CPU time used ``IOR/s`` Per process IO read rate (in Byte/s) ``IOW/s`` Per process IO write rate (in Byte/s) ``NAME`` Process name or command line Process status legend: ``R`` running ``S`` sleeping (may be interrupted) ``D`` disk sleep (may not be interrupted) ``T`` traced/stopped ``Z`` zombie Monitored processes list ------------------------ New in version 1.7. Optional. The monitored processes list allows user, through the configuration file, to group processes and quickly show if the number of running process is not good. .. image:: images/monitored.png Each item is defined by: * ``description``: description of the processes (max 16 chars). * ``regex``: regular expression of the processes to monitor. * ``command`` (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution. * ``countmin`` (optional): minimal number of processes. A warning will be displayed if number of processes < count. * ``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count. Up to 10 items can be defined. For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job: .. code-block:: console [monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 If you also want to monitor the PHP-FPM daemon processes, you should add another item: .. code-block:: console [monitor] list_1_description=Nginx server list_1_regex=.*nginx.* list_1_command=nginx -v list_1_countmin=1 list_1_countmax=4 list_1_description=PHP-FPM list_1_regex=.*php-fpm.* list_1_countmin=1 list_1_countmax=20 In client/server mode, the list is defined on the server side. A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list. Alerts are set as following: | If number of processes is 0, then status is set to ``"CRITICAL"`` | If number of processes is min < current < max, then status is set to ``"OK"`` | Else status is set to ``"WARNING"`` Logs ---- .. image:: images/logs.png A log messages list is displayed in the bottom of the screen if (and only if): - at least one ``WARNING`` or ``CRITICAL`` alert was occurred - space is available in the bottom of the console/terminal Each alert message displays the following information: 1. start date 2. end date 3. alert name 4. {min/avg/max} values or number of running processes for monitored processes list alerts Footer ------ .. image:: images/footer.png Glances displays the current date & time and access to the embedded help screen. If one or mode batteries were found on your machine and if the batinfo Python library [3]_ is installed on your system then Glances displays the available percent capacity in the middle on the footer. .. image:: images/battery.png If you have ran Glances in client mode ``-c``, you can also see if the client is connected to the server. If client is connected: .. image:: images/client-connected.png else: .. image:: images/client-disconnected.png On the left, you can easily see if you are connected to a Glances server. API documentation ================= Glances uses a `XML-RPC server`_ and can be used by another client software. API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To Support ======= To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues Feel free to contribute! .. [1] http://nosheep.net/story/defining-unix-load-average/ .. [2] http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html .. [3] https://github.com/nicolargo/batinfo .. _psutil: https://code.google.com/p/psutil/ .. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.html glances-1.7.3/docs/images/000077500000000000000000000000001225327237200153405ustar00rootroot00000000000000glances-1.7.3/docs/images/battery.png000066400000000000000000000154061225327237200175260ustar00rootroot00000000000000PNG  IHDRXZSsBITOtEXtSoftwareShutterc IDATxw\SWϽIaF,*➈VkUԪTuuϧuZ:EѪV;l7^lTF2@0A?hz}"Swzɡ $>R4ogjm-$'H<]uV P{X6;UƥokѢŃ[(SXb:|\Vvʬؓ{9]y(n''3S<,ؔ,Tԫwl;w4ac] Ȫ0:}ܣ҉c>bz_8+%AAŻ_8یԼH9( `¿1,4YP}?3fN6 8(WY6r0}C \mC׶GN{Xx=Jv/ljƳlOx 0cu>fG;L;ȱs~^.Q ?̩>"z^{OF& f,cH,-]IgQm/\흫>váMXFW KEb&Mu1ٿ̣gۿI~Lu5A-`E~"if F{w,|.=p'׎H4vm&1Kp~bӞ=:rnnnnN6 [Gtvw84L5&ث;M{-vQKxR͌~Sj3mO{InJ2|I:yijǨ؊diy/nQ[fyu=\ޭ/[ i* rf {gqQ^,Vܠ{mlDF/Qq}\qj?4{\%4 R?t`&bO^S ey1iҭ)|Kx(M8M磦7\o>VT6z'g7 IouJ.3nqF]y|Bm?+R_ =^{,YÓ{FGLjcʢ(-t7a9Pܮo}Cro츺qaQS(6tٺIc Bq[Yl?b֜}S@Tp͎F%"K@c=BHxK]@!&BB!B!B!B!Z0|ohu6ۿ[?c_m92˄v!aUݷ&헻03gGS/x.eyֻ}3[![v//0Ǝ~㧌k&ű[GԃTFM? ^g+K%7"&qx潗43Ovgw4cdɱ vՖ[ԲRڣqʘ;EŽYn4*5:i0̼H*.;pt.jtٷ6u+enFMF̟#cլi35yN8s87w~3MvLzh X1`L]? FrMI2,J(8Lkؼ+59 jMy)Wy%u`ȍs\Х_z5ky~-JϭDq7WH$dѦ[ s-Y۪(W%0:@<~הQ7gҾӦL_By r"4`^F=>lP[M;y:(yמׂyKފ{\K|PүV+KtӒsŷ.$haEfYEIw%>4~OAN-{qĘ OA.ol0o55wko׏_pt…V VZ_jc{^勜2Wd?!Wtd_ ȫ*wk4σR12Xq | |YsWNٸo? n"4`^@u`ğ-ELAmf*̫ `^=`^S)ATE ԕ&^UFQ0/=/ry'cL|wjgúZ[pᎲ͸:OKv _ e Φk^!-~0/~2z+Ǟ~iS0o%(yܞDnϤGWe(]KW"5]e/{i`j\60Wm2v~Hr =G!!EAuBR>@]>N!R0 <7Bk@G"eOF!ĠÁ @ڕe3BB1H, >@7 r* #ud_<2bφ!K^h UL[[SẀe_WZG&O°N=>oj$Fvm[]='Sꬼ&B X=u[߾]ㅼ&\={?OU3]ܠm^V~;T^Wc<3/?/w9QZ3~ҕÍ"vo}k,\߉8v+n=lO]wJ`)h~CW0`^e_b59[ P UOMr*C̫6}Vm4ʱowH=sJ^Q[Om e/u42u55o׫UG9jR0oμ @`^ W{>f~2vO]?%^㮢zjGp9X X͂22{Fֆڻiv+=,~0)Vd `^+v\RJd#f"^-y[L}'@>pX|Xg @(9>Bz^C yY6|ʹӰ_z ]1]vB|I)tAM2R0o GcVN&@`9p 7{]S@N PgiPyUp< !ay@}vcL癫>)DK!qN U}rKǜ\Ӛ`^BލL[Y|qKlMBj/ $- ˭yܚ; !7xq^r@Lyf[n&:3`hY=O?`X#ѓFOBt xT{zɷV@ou X7>#jlPR |8Գ[vKGBn@m(@01D{Bk}@!a-LӀ6pBW; m|r&8n Rx?_R=v!pF&`?Њ< !%Os:8PwBU'0K^Nj !OcGSF5Э#JE`3n'}EL{/a+φ|XFO*ghBu̖{;6no΃F8 0tЕ#ں8_NwIFN. 6f_˔v.MXBj'^V^jS{$s^}]2}vbR{?s|Tǁ-٬v7y2i !1,J(jN)S6w24>&] qIwga޵ckB~X=Uvm\afO۪#0 $そgI@R #{|9f- tZ,+2$NjclCY4m d_g;`oٕ#[_Sqe7 ,E,xO{DHX55wko׏_pt{cN!@5S!cFZ~gv. s3\'2_c{L49ۍx}fF Kj<{]5U$ Mu_-KYXHcLɫ_Ϡkm貙ݫy5|jٛCzXT=h \% -X;8OG__=x'._50S)GLU*8V1=qysU>m)CzMr큭kօT۷~MNq5f}\X|^D|}Bї;Z:E1b }NWY+!2_un>VKk|/5 W>*ݒ< /y,0pT1KK_jf HM dr֯MbT%@ɹM&xpÊm-zH߱vO3ǵu67&~TTI@Rc^)Óf ̭#.N~3C S[;]}`w@O+*@_ܵw.za$.~2 K>]f.s[/97b=~/.^IwG|]H.n.( >i.2x l38jW}`ȫ+;!ȗ+8]̒WjwYb_*CF,$n\tp \ g4mi?ޚ+*<=D~uA)Ts)gv$g'^3Km2X7 %I;lxw~ ``M6!WM/R׫ʰF~k?PVB ;)$/UcM6Pg+>HשJ+O M["&lIIm; $9q)gaM6tsIjM^jū Sy|=KbZJ5ɣ^Nx%$qغJ&DmjWS@7&AP-ՙoꕛq!1*OմȁD[.~y[QuLrJ~}kRxcujTxʐ_KVKYor>3mg~z{$TN)=&Cg:8m7ujtyA^`.`Ny\)ՠuj`=tVmO5ZϹƵDp'4VVR=&,c,eDk*O>g[J[}LK53R׊AooLmǷeֺ9#Z_M=`ɛÚE LY69ŕzkvr( _{^IHpt׭Bo^sޙ߳WH γֽTԬy DÞ+Cw^*ɋoW]u4 R E;{Hy{$(9\Re ]yf&jZ Z"aGB޲+#|NRszRkc3hZc7 >;cW(6#f.\=*}סaeO\rG:rw~_]n@'o~w1`YJ{#[dahQ9:!4ܴSZڨG:Rы..<_>eZc))rC~W\Si:mEeI/y$_/o_,m??2d͕{I8~Z}sJjЇ = jboX ֬}r8Ti.ȶ|>Oi* _AM@C)1Sݞ({YYtXJ|oTx6O:mEN/:s9i'fE/KY1\ImS&}i}Mu_~"` u}\Ζ Y3J{*:;>Uwzwf_vT/VYD9'2KBK9|Uktַϧ2T]R!)gN'T RbjٲcSjޫOS`5;m (( o_W }6dEi}0o3RC}\bѺ_;d-(!Tv,zl!5#2"B!Nw6d/&L*""4İ&l*!"b}|L7jM6_I7;d`p': ydM6\b¦{o5 kM6t$&l*~2EkE&ʋR#DG$ {&l*G~J$:K.E9Tb# 8l?ʏxd\lp)sp2ȭU)#2.;㇎ m'X'j[Ob䩝%gWv\{o"j8`ݠ`W'Jt5_WwoޏkyxS=".Cⴂ ~OT.K?6v+n spWOl;l6rRLb" cَ~>2'/}{14Z-۵f.w1zU}3L{-ߺ̝.\=+G o_ʌ{r'։L*|).)֊~u{r$wn1n\3hrW."-㠑}nD(8ْe#Ћ7~72CS*с^},nBD>d TCuQ1, !c{v͉QҀm;ʀisxYڐԱoخ '{05:cw9ZoK{4]Ueb':*#~|tQ涓+_*&U RE&9zQeϳgZ.0t֘vψDR2?(SJn2<巪-NG3ױoMtw k,P'[⚮,Ji佹ۏög@p_ +>l(mWBC=qL<{OV7'<0*,҇U=>'XV|~}=%WtƘj+<{Z>Y*Y>s:^\ u0ݔ+9xgw{3OBqc?-IGsyĕx[ҥw빧TlZN`=r$;n#и ilV^[Di DD(<d-12b(%y@EEDť\KĐ%a'ۧf׿z=[hRzP,"|9.i9}VW$] "=J's-nM[:Doo[,gIhS lA2En=;C`v"2hDR$q\gEs:MeK[sr۬wDl+y\g*s<qOW'#I]x I։8bfKÑ5VYu sI +*ԗX]6J=m_.{kV̑kW'si'1aq\櫔>k?;Y3'A*>BL˦ .t.)c)?]X V-Qn\tH E][Sݐ⽣̪q@Z8<`wHw;sa:46_O]7j?tĆBA'V0' N$oOiB6U.RߝYXqȃ`jgg.Ò/'>1~;>!SB2j~Fsվ6(b !&l*_xJ#"QL&lϲcM6 ?rJm&nRΟoAF)-#l2@"9;εl 󨳮BhR%z<&ԕe>„˩)УҬ(P2 olJq ! 8y7#*!Z-&Tܥa2wh")` 6RG8dbۚ>ojpz@$+rк 1-dٍ4vJ,'FC^r4"H1K1mg"=(],@F2FE ix~ Pבpe([P蘋Ә8XLNP`1ˈo: Eh$~q>'g EPcrU ĔQ1)XokmsϗF7[FEgyssT4$ybHVl\EkAlZ!S"3P>MpKEAdnU0Xx +h(P N5wBBnWXHXTBB4HU$qrLh#"c$qd-BIT'伆&q! HYKDCBhu} TGj ](V$ـz-יDú0(sNIиO9)IYvBZWկS(T*c$i3'0DH]T9w :=f Qr0c} ܮi"S/8yь, kP J"2H+zSخbЂ=S"K[Bu=#X#sއW\DU$I_&s@6;3&.璆"}eq:KXp ~KSgUy+ob0/A)mX5ńeAup3d$t\#tՑ41KWV7C[4:V)`hZ& M>c5=avH'@ɡ ,BW9t/ hI7K/"1(mNk@v!s5 T ٿ(&i[J.װ5x/z0amQ;"i|E#2Rd@b*Zg*aVHG͖DA׏4۰h> @ P\ U= QN?YCrVA4`6˄y6>()3/S awIENDB`glances-1.7.3/docs/images/client-disconnected.png000066400000000000000000000234451225327237200217740ustar00rootroot00000000000000PNG  IHDR@iļXsBITOtEXtSoftwareShutterc IDATx]w|UEy=K/$!! 6wl #""M+_g 3$(]束"\֤eDOSʙ3?8" җ7iܑy>BׯX=1fh X|NnCc}bֹi.<~nbn\~S.WJQ(7E⺎|hr|'ncs&m{e5cNWY\U)/􉥏xhgg% e+="M%cIܺrɵ8W935X\NG put_w7h{x\k⃫ƺQ^̜WJ?ٰf܉bes'7gT Km/cwRս_P,J{6^hkjmծvl=wd>R+˧$Irxv.rzrȡrָf\9VEԹ".hr!Hg51*UL)ۈ-p\9C֡qHu9@KrRNAC9㒛7yAJG)k\ 剅@˦h1Itk)9-JnZZ:f$&v88沈j?1T;Ԕqq(V#12dkSps1nN #tcN]&N}Len1jy#wM" 49coxs7!~o:dܲrPWCX^zFMx~Tކ%OV%1)߯nnK~",,(fN:=>ᦥC]>݃nj߹njߦFPϯX/uK&TͽsӞ6ECIGOI߽پݛ 9W읝a?{OCo7*ksYIɘꉑ<|فO_фd~o͠HmiYWLI_թ.~5U71\^Pde`]u-~j$殿zK%ɑ1"%"zI_]usZ˶mo*Tw, /{`}t+ug,^btܥSN6{C N>hG'O}DX䊍\?]M\e҉.\6sa)h};%?!nxc1*@zgR]`5w͠Txgw ذq8_Wu8bK۫3Nu@)s3M3m|yoY-yx#c# _ѸEOo挵?|p;:W (yfʬ[G kZKv*1vbEq>bʨ?z4 R4w:l/@gU{\ Niz]>e{G&_yʺmaD& |q+X4isp%po^-M:YS.rߟr.{aKl.b.|_)3\>泙oirdqԲo]u+v}tc9}~>}bG67])2=P{+Z偋[Z[M_7qx*JVc\5\Wg:{KĄm2ϼg( tL眃%ys/r[O}`C\V|x{\'7UX颩HeoΟigs8N˦v 7l~#ņ"u*hW=G%q6cGxcYDwʌ\P5|vw]onhM$qt2WL[TM1r5c/|6Jf$N1({~{63<>/;@| xfa<=MbFq;dKjnMNj=dx_KFVW/RҠf2]ٕ얷sp@_p[Xkw_;R97Hd͇>}vf伇|Cnԯc2b '{ȍ]XtvCK&b^7sEC/S\i| x8|w=db(9wb8Cd\ ȓ hfK H{rts(16;Cǝ|@|0e(yqi8:ɘJ}!~BjBCѯ?X/;!'R?(ur"!38 ƴ㎏$mt!~Tr] [M?DSx[f 981]9PPAfKxocꀽ6 h>18͓]Sq.9!6٠ 8p?~*/tQC6鿫G "P d@'j7yST_s Cdžw7u?Ƌ6থTX ,: s:&x6Rn *T[6q]`vJ<%G]#б!3`nOovӎ?,,vXtT~qpƝk:Z7уl~zO}"5:ZrdvJV;a9tpUtqVTyO zC ppaLCڭ(:<;;ʡq4 _X=wV객"$<砮e: b` 0n@1(QѯM,~~ZnG"))>,5?1c02uXUzewYFpq^gPA~QLG_C@$_/!r?.ф%Pe(Tֳ3@IK,ugL zڏCy As>, UBi:ܸY=*BPhk@ q0}1Gi=Kݙut/E˦ jLW9SZd=G&AV;Mq;m#˞~nt(}2'_U~͝|{ZMs@Etb7ՋkOb);2---6u!3 trrbO^;yw٧[ IXZ8˶91X+MM?Tӻi}@uz>m͛vᐗ_yC|­KX]p$4n3` j=ڒ_3(:US "H w6{]'' *hl< ߙP\sޒgZߛ4/'slͤsMRWg&1lrIهw 3SES$R O64ɩ+3*f>|r?.{Q[\19y mƙۓf>\Zl}_}nIj#ÂHKʒ^THYݟ Vӂ g9/yԬ?{9VnyJ7Pd}\g-)3l{/kגlnu1!4$&6$%'U<{؅}#:mO_k}ep+eu35%s6~Q#u4"zړ 3}gt-Ϛe/J?{mWK$4m/lN>4-q=sO~3*3N{eQ-EeSx4gFc>*58@y ɦrd[ߤ| }O2f1f7#rӪ<_*z:@{sWtvѢ1]= nS0fݓ/K9^K9 GWKakw3}ɭC\+W10߽ߗ0d3 .W-^zmױA1)"8eܘ5#-(F$E+KS 剻ȋ]eQ"[jB>SU>ZS6%tjk?inpAቫ >!,70%%aOGkyK8\d5,@Ӓ#᳒/Vdg8Gx뎦w<-zf{рw-]u.lʍ3r6Y,FM!TYMUUs2pL%w5鴠Yϱ6#.1^8rnJ<}u5ov~;F|y}U PnݓqY|S-I};j.T8t]Z U}N pp zp/6(zwla"Q oˋF3K͐Zj{7/HH/7y1~J w1>m;/QlN[3-~6Lɛ9'P 1DRW0ezNdC"?aez}}} *>sQk+ijrpTrdOy}^&g\15U u۷|_}AxWvKJS7~W\p'şrKLՋKȈ P~ @ۆ;cY_|Q:n#vkK@ wmORw柊/":w|_{qbA'ǑZ|}0r]#ozp۰IwRjLzUif_+/<%) UWΝ 33= @USpKddNLR_[^6+`]9C}㡫KcYO&K-W7IaC)Dy^[~cu/nڋ}m25Kk0X8V՝446qЯՇLpHSbXckO#Pj#ApBre-~Ҁ3Xݷ/,ٶ;n;~^6>= ~mKYtXz)XJ<ۆoruwV-#; r ?2OK~`80DSp@kpqDxJDU{w! P 9(~K'(Ԟ=f &ѷ x&#]ej'2@eRkhSxҋE`$h\7qa"oRLF/H}.p\T1637kK&>1T>XAㅖJ줡ʬnh57ѭS[n=Lmu8׆鏗ұZO \YS躎CW:e6ee K%R6'~[ ϰE1>Ց]f0QYzq"k::3G e5i&-}bvlm^!h ns~  ^S!l7`:^a&\ALvCE6fS7jacM$!=&T-B K,-45xb|Jf\. Z Zsq FBQk2x~lˬ}#=1[S-aAڳ*Y(<*"Ri]th۱宵lgs3lN}QЀsK6X+֊ uU-h)]Bu{F qQr7-$I21\E =c\Eƾh 2Ί#O'.-8pq+*,s1_&c%Ε6Y,beAup3b\!0͋F!61KS+>(%)jTC"jÙ'F4M 4#/EA8! J Eܘt⚎~KƳ:EO mE+Etr͂d/I-%jkX5x._r?$@f7-FϻUm^4YcG46p}*Zgj 02kr .͖ۮEuzg+#pfϡ~-H7JafBb'&}340+ H.feaX v@xH^SfdS'-!)|R)@IENDB`glances-1.7.3/docs/images/cpu-wide.png000066400000000000000000000151231225327237200175650ustar00rootroot00000000000000PNG  IHDRJDsBITOtEXtSoftwareShutterc IDATx]g\>@ b&" um(V\.E콡k!KEz&~X$w/KsϜ{8p8T-'cr1 j2ouT`t5$J@s 1P]aһ#4UoP먅CDƆDYeCѱglOܲ# #oȈg:\.擽3]Ԥu΃t#M6W/CFd=35IF no XHrKWOHx+i9vy9N;ڑWf[khPv64=8t}ߐ͌K9q^r4nM2+vܼ/aJi>zGƾ7~`R bY Pt<ϫxӭ2rzۀ>Btb=EiQ3f$|m+S5`tTR][G׹Lxkbw=V Y /rL(ᄄ׶vdd^}X$1oq𳄬{"VGA*`Ueqٳ jZy =?œl+f@ ,KiѦD!:&WUOҬ[+7.yWˑkNWI]\Yfs_$x5o뵟:T E$"V,mCVp3x|T=ոGӆ7WokS/Mu]w%RbVl-a՗fv#یCilD zi|fNウðܝYDl Ê:nk™y(F$b=Ȳ=fg?nUjlڇ-'B52n&0a3JF~{6 3S\Y箅![U* R~m}M.B;ېstу*2s[9t#tM-,-4MR?1# Ɇ޿۷aqSoT4^(&1FDb$*Ԑx@`jn|נ8=6ċ"!h *?9oOUqxTIA[7UW=DIᕐ]I^۷Ng|W| #&cSxN_O**8p8p|U;ÈUKsֻ*8Z<"HG$=uzWǍBuw?(m3 L0Z6sގxTc~{Ir}?7X}GS@sAVZHͻ;O>)U}uInݭM4+.@1e{;O>xvW~5/W,lPHi{mYL~n7b=!tz<2\b[îJ:x6 VktD!t<rŲs@6}fQDŐ9ǹ1I]A];>~:>Lur_3q ¥3P7U2/FzM׹b(<~i`饓nﱺ#I@茙KJOyv' ^mީU - k"./[e,}&n Bo p؆62&FQ_itQcHTV#n5U}^+:}z6+{3?2d]ݾ4搑WWtܦb{dS;׎![6L$X\k>*h bubs2o F-z!j䬲J ~@Gog,ޱN %P坣^H*bb akuX\I( LxS(FLMHɨXiy}aJ5:̶Բ/UݦSX}_R(?eD-R_Q㔝]PeWyQS5=zp/0oG딌W$1 ishZ#!|q5~Rn&>Ulf^T(zJz켻A $@d?vIjr^ŝ]^C :`97m[MutiTœ~PTSBm|+*y% qLh$@4XlrHP&KEQim+2]XCju+[ϓUs*x\^cݙQ6:1~+ν*uc՗cfUB{CjN4Өɞb>lX7;3}Eo7;rV|>\M תٟ6E;u{~|{ȖݗT $gΔ1fEMxcl"ԝ{V+Ĥ¦$ŀD&шdiǯlܛW2/ʐowyQ^ h:m8{W&~-qok"&g3X]SfkHX"ՇUDsEcfrlks5DF=+ ANr8>]$5bw}R/H#NgQJ*%SwmysƇ,AȌS~Is=ERx%dwwP-'^0zqY[|Sgv(G:1~8p8pڑ4&f8Opf 29KKfn?fOVU\?[_ [kOigzGG81_QY]I$M})m=p{c4&ʪ2uɔWI :;NhDڜ+mUA%ұf}Zt61˥qM|B<)}y$qa> y0og7ploΟ/3inFG@_E\0@hVmE3UvH=n4ny>Lߣ]ݻwď ,}K0q1 59v=)|eաi޺&zV{@e L~?jBm]F9*$ɪ+ ˏH: H%.S(8/KdtP $l z=#wͫwy>Bf@FGO8$:WF1%6,4Q(/! ܾ2n?^?am&0UݑYY:oՌ9 VމZ J"!AC͸̻:Š Ic?_|Ё"WKEa#8+ǃϥ,J]>$%Obp)6_fcw,qzLZ@"%9+Q٠|  !R9Fj jVKړ!4`g#'`Pye.'vpӐf#\;vV:5U]=e/bOJw ރl=1m& wdew4"vᮆTtG_)W iI CD@a $jc o:K\}w#୤H;UB/Ϊ&917o =m;4НPyA!sL Z3G:wjQoCO_ SC6rbەB>ژw(G;!/.iZ1%)+C=$S>ziYR"á߸_'ƀmGnǿ3w{ؠNZX u5gYHM_y:=L1C16Wͫ%|zXMV^_Ӕ؃ ߷AR|H*K0 hXiO(rAzIc- ^mIҍ݆*|T|uxɭΡk6e]6.?9yewn]ܒba%COwL[8RE8GKf\5-c-JC;&T%v 8pJ^!Qa# {&qO-4$LA4\7u8wTމy>o.ZD17NȧOd_ƻ[RC{YMjzR|*:v. ׍Q݉cB95̖zDؓG ^z8:lr1vwn$ k,sӣMYdO-_FDl̴ȵ'cB<61+4{LXjmWWlQP*ә}q?OU}[LJxZJ>i3'beTdDh$`TRA+Ͻ,F!^xtӈWUhBP7DM)>'-rC㳯hCG6wU#ZGyF}-hehmRYjh#Uj*KHe%,tHjsZƸB ~ZҶw(*+eZ&ږR1ACfbA%|rY*"Ƈ kڣ;}APC IC_x|I#'\KEaS?mz{i[;]VmʭTˈ>lB6pӗtӏ=MtXL *rS.cMdi``8z&ubk=m{ X>.C_(Rqu713f3 n\-;1uQP֪w(ozUO0[kX/Bg}_6Kz~hz8=_'. I17II?O$HQZO}o`/Q\|-lݲOr6e 19|[s= fwm3UhkSP)'Zw8p8pWIENDB`glances-1.7.3/docs/images/cpu.png000066400000000000000000000100471225327237200166370ustar00rootroot00000000000000PNG  IHDRzGGsBITOtEXtSoftwareShutterc IDATx\i@S׶^'s QPTD@q@q±:QhN Z>}REu#RP@'@ $9' jI'/aegדּ *. VT ܟ?gc!Ԑm:n˻gX_#?>tB[z8N]@t\|| ] ]aѣ䕻Wzɉn>?*iъ1[|ݾjWU&tQ3[e4 P@ղ!NrPfݥV?5`kMr\>+Ʊ_u.AՙsVXgIxxcI$پҩrF `&ʹW Aᕱo}=x_BxWLmO!B3'bͲYnB%K3G@C1_ds6ȍ:Xu7y[|=74r.%GO{B9YtǁM=jY'YZZZZ11rk4nMrAP,)$ "1PiL^nּgo̡_i)ҜvRX L;e۬>nl Fi?ytP~۷杉 ojͣudsE Tkkg[en ?xӆtqHL>z ) S}kw辚zgȱ`p-wvcHL _[$04,v2W BD~eB=&]JI' `kWNkzF2dlg&}Qq O=?< ^P5B1`l1=\Û2/H, X2{!˽T#~#ͣgѦ4>ްj%@ekkA~_JKVQgw _!k fѫ i,:Eؘ]G0Xp7zE~g7n{s78F\U6`_PCem#Es.]M;th&H$&*((L* ر=k,1޶+lx/^MjڧO ^gKV:~wP}24gËemnMȨZrj>C]jvBD^[1"P]Y)BFeOr߽Y%D@ӵ2f8lzӲ\ R{ҳg?a]֧̏I@*j`5%ro,"e2UbXy1Arstnա7^Qt52'c|^88_jSwOiJN==cUE#^I[%g1XRa! Eo'F]=I`=Ԃ ^,ՕԊe=XƐa 0?J <]4j]rkŊg~}207{3 iMq׺yc>3a栆ϫZyت7< $Jp-nŒS=Uz&h8LP$2kJI:X5G`6d"ר; a{%A@9,*@nqoWWBܳi}93h5%s@Hiw9~|@Pz'M/N4ńf:A'w @䘵Ɉ fWu]fwI|9`)z;.SQT*곤Tpw'4#n [?_)!/|3F.QKOD. I}Ŗ1koR\RR^RCWXR\R\R-h ^ ›Ȓ覾{\̪jQLmYi&_ FAPt<@%?%#rᇨjk_Ɛ(9B\@' |*)ijuWƼ郕:.dʇIUS<]z_J(ԬG:`Od7!j ='#<%=,$㛐9cniu -. ˇ#dpXokO:S[@iy#ɔJY6{(b|)α9e{GI"G>}RP@˫yq~-S۷r(= Mk&e 2Q{lwĸ/F{7w՞6r \#pQ+."lՇ#dr#oL* O=%兎l&SF 󦹛\{5@/=Y$S`;tEmݴJ\ 70ȼY"_/#H2t50vA$tfz![.h}yAz߸9E-:܌>O573aPXN 빚æ S 3urt: v9bRiN Mmv0xU8uܟL=T|DŽf>>>>>r]K&8>R>?$=t=<'-UÑ:ZCg^u E/pFrDPs|o#9TFps͊gp B:#d{Ln#u=S3{92aax+Z&Tp$celZJb܆] &rQڶw?2;2lumȞ @ވ({8\cզIƪDpv/P{'x)PrZ֭ȍwJl7X^aHrhW($DN"gW2YݽEB3xPZJHgBm=B&;.Qp$9'6Ѧźv$bc˃#^`{ 7}Lqbt5&ބD"jth> 5_i;/{귮# Ƨ7YC'1atT׷w +sy#Mt5\]]J\1$xO%k4e/#WpXۿG_qJc/U'0X<5mq镨VQ>] Xg˘B!LZ2sI ve H gbUkkE[e*UpLwϰՅ? oFIENDB`glances-1.7.3/docs/images/diskio.png000066400000000000000000000102771225327237200173370ustar00rootroot00000000000000PNG  IHDR&7`sBITOtEXtSoftwareShutterc [IDATx[w\l !tQDc 6 JD}Pދ%*6.n(5j4B5VDPA* }} ` dkwvv~sϜBҙ@/rʳYe*N@\i*~\\<|⏯>eMٿ"m`:n;tl=؞d:[ڳ1 6%!gs9ES&3!뽻୛* +Ϥ2YV *AǬTh&XBDSrZrό  >T"CA@؆IM sbO8{aF&Wn \iOܑ}k&6k :bbsN C,օCЕxq{7w`kSi{71Y{."b7R82h{i g$m7=Ƌ?~xh%GSrq[`2$57j $9 ߹ Sy{z[X5m;?F^-li(rV; ƘBy@'IBQo4BĶ߃r!Xus'e>iKR>|eH@a' 5gɶ4w4g(c2y 'cʢ *J q’%ON  ZRN;G^'ݍmT"7 pjbaɅ`f܊oVazx]kΆ~Sbt' 5WBcFKj) CK.U7_X Z ͿZ8f^W`X8R(U+|)]{̭1xܻQEژ7ӳJtiqn:Z VJѢjoxʎ1MQ4E0ET)l^;h b a%CtIr.q?J2<ߞTӦ OEC{ s-ؿJx}}Ȏ@W0R6 m4:/WCH0H+򪈶Fkm-91`9SW:>e^#8T Oy}z#},:r=Vu[ K|vy76䡪aC@fu0*F @ZzSކ2H,ʊ_ϤU ^>|T 9HZېegAVsۡfꆠqJkFttQInsR-jQjze^Dw g1|wGd$g v6 8[+vL3'\QT#W(YVCn.seރPU@ՄPTS-VIi`aHr 28 k.o :ͿZ,,4ۍDy1 dبnjMeTY-v\5΅MyiÎ q,(] ݸVAQ&G9dߝ_#4zNk 'T C3NI? ҳwtBĵwtt#|Н$H;kw/{".?1` ̱[ʗeR-fK6#':ܸ1gˑ I.X,:yu5d3$l9;͘SR∽7(<~ڃ g NTq֟H{r鿕?6"CSfIhQI3q1d jL ׮SWEY8qG pя\~s~JP~tne?PcjŮe^^u%qȊ.&gvfW>=9N2a,YuIyRm%/EN=Ⱥ:.SDcd<>m9w.'G*9qk'rOKR)E![(.o zuGڗ&w(Ga!Rޙ >=фPCԋ~nMeXb,5Ts)BèU4#A%!!BBnۧe@DBI"@n rG.ܦFwzz%|\ih43EQbv s7ϝZ- t-]#tAuMHh;dMnT?۹Qpl΢sE2 ?9_eMQitBe)q?c⻨MóV\Dcu#Qm/.^"ol]~*€Ҋ29+Nޚr%T{GevCBCmcG~Y"`92mqH=ʧ6 aK֍"EHZk- c[R)B2dUe&˺#zi܃*Uc1l^@kgDK|4IPsk!4Ӎy{zl4B\=|1I}gLA7d\SBRd9=*ů>_%Dvm}3ɖ?9Rz 0qG GGrZQ(Aiku{4n HC[STqDHc(2Wڑc?00د9-d!MفQ}D96-rQMe܄5RՅ崑1 !HTG93|}rB&/xzmښ7wޠkyӰqI3J$4M;q*+_V1瞉2b)dp8DxʥΏKƼAzڥlPCYO=S{I}P AM7ms$p|ӗtgKjJk+pYi9#gKؑs-~oj޺DB`#k־e wu4Ow-rȝG"Gˀ82~!~tWr) @U}׍?󯂪sk^೥wV5Bh]_Rj告Z>`ʨ3qݮVBS)N(W)gǡZuTTwg:; Ĥ"?)Wz))z.EMee#,{SS.H[[;պ!g<.ZTr茞hc9Qrn>W## ۜu_n9YIG_Z6Ss\4zYbG{~T[ܮzeWR\MWkiM [-TV Z, W/p5W/@YgZ򤬛r]AsWdO^ό$K8 u[D B^Yuj*-:Z`ƞ|ιU8ƪTjkơ}[>2v.(CO%9#y׮O޶c8~-}Ų~{;a~yOMiМRegCgpνu#_36dcQaE}S]uS绷uSg'&fyig~7Nf91yS],dU'{< ʺ"%T5rZOcB!41Ȯ-&1ぴEn:1q5ɛ3Cf>f $Nx,ˉnY$&gWf9ixZ772=gߣg&82vjoen:RZZYkal6`㱶ZC::-)nܺ|9AP Ydr  E]HmkD#UkyRMGPUKMWPִ^r0c@D!4L|No(赣C- Q8F&YNE=nӭ9w\,|́ѫsT ׹S ĥ~3 !-h//K~{Uj qS(v/wu)r [46L+NQšzc@yL{W~ UE屍; 'n+ ϤQMj}/PC=_=3DygΟ){ >KB=S>!B0!B!B!B!B!B!B!B!B bRlIENDB`glances-1.7.3/docs/images/fs.png000066400000000000000000000230501225327237200164560ustar00rootroot00000000000000PNG  IHDRjcsBITOtEXtSoftwareShutterc IDATxw@5ѫAPԠ+VD5cbKQcԨ1[b(5XbXHõݝw r꽿`nong훙7.t3Lg:ٛ`w80000pNz64v}D2 wX*W(WtM3{R<{O=U2G3RӉ]E$bӦ~Si#"qWS"Ȧ$EQ$ϘWx$AM%$EQM_mc WF^Rv?"+YJrK410e0DDSG$Ijg)0?S'@sIJ3vFBJ /Y lfv=)Yl\8qg*5{VExZ<Y{~NrԤsB͞۱kw!,ð aXaT.OPGYOo>ס )Yu=Í y) (~`Ws08܋ ?|V\jcelE<6*aC'CBdrk;D&&VRˠXD`K YeHda+HN+c0+2*>n)"!(~E?O66n݇wȋz[ ]M~q{8gLօW&K@]JܦGwtzS8nw_pڊ0%{E7.owC@L͢- 8mn羃W2#TE/wڱf탓=Ag]xssr"e~Z:Sm*1Vȍ۷{h49YrΕu`ɆVl]QJ7]@#WE;MC I ID$rPI1P~0f1 DP$Q7I5?T]ު)`BBrSH9o)c@Nq|r !i"!x5_ 7mD"(G$4 :Y/#u3ik\um#wټ?q~7E]<ؐWT ҙXHZq]Okdķ5I;Z *yq1^Q3&}}c2e糔z]/~Y3w{$7A=GRȊrtߟUY<˞>%;?O+=C'NyOS;Rv_eMlZ fQ≭uAH'ǧm;u*Bm|ny+NvĹ -Yu!K 婡gb:Lh^{,ygTƀ,&v""loWK'Rd49-pda@=X~IS똾ӯ ēwy_SMBhhJS/tqtTc~)i7u$L]Kˡ'>E*wӊgs$?DB(9wc "Y;.p_T4@ p7n1E'<.R}=^زk>;+4Geӂ튢\mͰm[cehą%D鲬Rp2$!Vd702/raeJvSqCsjf~3 AZ CWru(źO t'Ɂ*)ݱ:ڦpFLaR_Nț yqI¼G{êc=^g#%da2oomHbEfr֞y `ʲ~;}Ǹb[R8uNǛ9hEnbDT3Tbbrgϩ{`WU6j' IH؇DZ!UTTԚ6U}Dl{廅u3K10 ;hs+5 7SLA?_35" t~3Ev~7:_!ܨI{ MzǢ_|Ț?7Zzxct-Via'X/TCJgu7s#޸Y9[h%6%MN;D<9IM,F}UAh\L z^w̬zdo[mmמbٽEQ2[ KQg$]J~9!%їv~!L}<*}wxXlޯܤ𻍚&i`f8.{Zm|P8ٝD Aw[>tT%ڷQkbi/թzn_ zQVrNoQBf` J)(m7bㆦ8[em6VV@T)QH0h㚕5~n0VRgkt wO=?@,yxjR*Np^[g61qѥf#[ He`GPuMn*@Z"vHV-xCnr`lf_l)NʪdX,/؉)fgʲK`i"D[:l˚vlQT5UF֏묙}[={KȪ/ainHbF/`iJ/)⛻BqF) ^)VW ;I$$A''B'2mteu e_p`ϕ>6ݬVhTPB㘪mX?`a/o-Cv}{]a1[\Tֺ5,'Rh(KK};-\<Ԇ4/7Z`HX<*]Zs۪Tֹ۞ۘ͏pټг^%ߎ* Xԡ!@oq}1SrWIW}Qźְ4 7q?eVRwٻuooUؿ#wS\yboHT,IO9x*aH?[>ݴϐ .>p9C۫ui^{s0ngO"P KG~s<c++ WT]r4KNTd`dGWΰz/7K f-h{ۮ޳~'iEᱍKoX=!6<Ⱥ^<1u"{r;] 7ҥ6;P3,($M(j\SFL9ӊ;w'#9YZdq~ԸW?1v]]A7#S#/jN!yFJ}QH-,f"C7FYse * >[-&WD@W*^8N27#sX1[ģNvz8|$0>u3SB«\7$}n+, ti ^G&i134D4E N#;3|ۑ0/LL !dYg ,5tI7(yt/)bfi5"sOc,2ܯx9+훃 mbCΖJE5+SYۉ)obz.NVwtj>@HN:ȐW_7Sv|t~[S6El^ˏΏ}'U5Jal,e&3CϨ%$G(nj+i,z]Z#@;Ajr1ڳy蹸ǽN] 9,R pժ^e) oKˡKK7Zyjy&WY 忍e4uzW4qڲ|XZe5yz\UխGr4NVgڲұ:_ԙΚŸX].V:k%b>0qqm:l嬿v}XZnOd7&Y cjMElNB_"UjXU4cI魹o fBIJ+ R\jJ &DIVLRlTz[5m2͌&]Zd>z',Ib벴?1y9?Ar;Ӌ~^@c$./Iׯ_`?pޮ|"3¯N?N}=ҥz.^Rs{a쟧c~j݆Sɍ00]ZUo%VRhӫx18qJ+ r:)NUn{cۂ,m}]Zbg3^+|cijiyxOagti 0RNe7UG]_{ł/']; $nyio¶!LM4*m99]ZΔ,MJJyr`yɣ7"cC\LUO>y|?Xs~ڸ:K  iJViEzkQWNBa̩B 2067>լ&dlbicio(YZ\XXTv+ 7JlyD{hVƶXZ.[ux+}RQx3ir -oKdK$K“SS'8ӗ|5#c,k@ԺץE0bbiI -^E-W~VpjFƶYZMsxz]ښxybi1K5rԌN57 eqQK3-1sQ;|Qg-F== ͇NVg4Fb]dZ.7p88藺gM9YZRwOIDAT+8ƚXZ;fS|*ǔ [9 ^gKVߖp=-_qaC٧7y]Km7Lē*xٸ֜ËI#˵{!ZD \>h,AQ==̐-6rVA{_=D11/}9YZUZV )gXR+5p7 "?*N ≴{D $b1cY_:z_n{K\3OʌAU-^:Oz__F}z IRݤiEu1Q1QK nhZAfTҖ>:ឫɌ}r/FҜ,ޚ?sm;DlQ#ui9mj?6P\|U83@4p?q JSj(`NnLZu)fyp+ I^;~3Y1'K[l{KڍG՟E֥Uo۔{ȚXZDX˜G̪K5Q@ @r5pЪuabv IRluikEDPO|6.m5ƪ@H5QZXr نua͕`Пm.z~RAs}QK3-1.δ&nfuݯ3Lg.<ʮIENDB`glances-1.7.3/docs/images/glances-white-256.png000066400000000000000000000525211225327237200211170ustar00rootroot00000000000000PNG  IHDR\rfgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs\F\FCATFIDATxwTMRTAD`ر0j4vKbbFM4VCE-FQ)Jgiwv{y첳.g>s=sâ2]SO=Fi\.j8ݛ7m ~9իX4eС}6Mϧ…[9zŴ[ݿKfΞG5WYSQ{f~mjXv-6wҜ>}zE">ݥ /XdIinv+.v%P}}`syy7{wQZkBat|.Vh4Z[i|MUu5e6ssswvZjA|_[[k.\x拯k7x#qZajkkP~{A>} E݊w v 1 O5% f.~F)eYLBj˵rEaAҚ+V|_*b3O<)Sd3#=gf4j|>o^^.]t)*Da\^4&  u,T[ZfeY +"-ZWW.\K8D.]%{u\ý(=PPb0 #hM˲6LseYG/V^=?e3tQwGt2֜}9[RTX[zsݻz=adDX}4" }DFrLE8S<`[֭?!0|~y{-ko?rHkeYјib_\>߻e-WJELY8=ryW^tѐ@@g~oa%.˕XZ`z.Xj>LIA85kwOZпo^祿q^rlBWZR}q57|s!Cv (r\.C("$(.*v),x~|{Ù;*ρ'W3ә5f*ذiQy|\٦Gc1Lӌ+^3/NS^~Jzuʁ{eAVu`0HaAy^?G3]RʟXZkFC{sm]]E X Ñ]T.YKnR?@W)]U]߰i+0 C*۸o ֥p+/`˲p®Cyow sBӷr6r+<#JJF}>߉^wrW9,ˊik,Zv7l] ]voC,ZT~nv:5Zk=XuUWQڧ?ܹƏ9і6lp}7}=p$z<].PG)0  sh +Ƞp@;air_2hn99y{QjVJ[)T_D"+*+}k֯_{T}i=7mFLpİa7oҧ_i 7V\4B`@nNN f]=FVXZtĉ-^ܮ嗀aͥ{xAyCǎ,ˢ nRSՃ/?Srփ~Q999# x fUx =nv}#ڈÇs-`K>mu4h$YRsL LEnBkbذa(0.ܜݺ vq\#\S)V%bƧ>gII/ngggtp^~V^6xAJk oɲ,4Ͳh,aن o߸q憍zM`0uN'E(smw<4a>yy#}>߮.r"R3 =zt>;ӕLL%i@N0⢢S ωDht^Uu[**RX$D~1nEk͵7߿ׂ99FQIaR[5]n̯'OSy{rfZhte8~{,/nܙgtxX{饗}߹eh}XA~^wOݣFkE"@p4y󨮪 orBq.yfbp鵵⫯Vtn^wՙzO({`~ﴂ.Ϗfe~^TXNj׺;vݺ7'M0 ,M!;83Yh_~ְ!CɈpvâ%K8S4Mk<5W;Tgg!~9`x(Z?FBq"6B0dƍ,X`H],*,|hGֺ:T_ƪkd֬JKK{J)3]e&cƌZռSQYHKaIݻvۑEcH$iYׇB3n\)w:~.Fxֺ ?ڵ> ES/Ι_zjZߴhUu̵=ҥo>_2tnN1|?ni}Kp$,Z)o8we7wI997y-_օB,].˲۫\a {}%n.1c.5 ^HdkzlˆEڴ00 Ck Mt#2XbBUn)ڳ+/3EG`kq0 C6`; /pIL}|{NNαnEmF7m)/^)I'd`>H$F?+~ H<3 I>fuDёJJs\%-RU;ܲe7\sMc]t衜u{׮G֒X ޯcfd9)D<ڲ tuvuXxmœɳYyqO3zBeGr7yG>Zk~Y2x]nu\"MzSyE1˚Z^YqY s/Ê@݁R"Hn  x]"DiV@w6v3JkœKP"TW{[eiy+2S<u!|5c/ﮮŇ, G"7cY3>Ֆg'̝ "X4w6IE%b%-^n~h` - Q ~nWnYƛoнkZrH$zGk:tj  2fϟзO[sh,r~xߴ{CZj'Ι&nW+5xJCڂƫ'|u{(\h8 /͠tAs#JwEs˄/._,\5k /ޘLꚚ':wqR^0W>U[Ww=>ѮSoM;qdiC0$[l@v-ӖZ=7K%W84oSܪ 7 wVM_An@TTVN=裧~2 )I'2slϝr.0nͽ4ͺh,ؚu^[Wf͊tMmZމs&%U^hJ P\z nɄ#aP47X:ebisZ'tOZkݻ?{'Rzu-N: f̜M7]ܷOlK,1T_>.è 7K5T7mIF1Ŋf>ӷ3Yh4ɭQJ`>3iRjz#p17H6P|0KˁaiY_o./N&nNܞ=z@ڪC~~1sZv)/'rYu՗ߢ-=61 Cw$5Ѝ 6/u\şh!?ߣX.qX~ e@i?djiY5-[/pC{ڛh I(γ\7/z?e"(4 4r9nm0aΥ}<FYM5N ={2l]yO,>/IX' ۮehBk}(p\EtJck*4-ӺaL{*u]B4L]z9555sxIeYeМ?0iV$Y3z 4V_k*f$fzH/mZk͹cرx䑞 6}8?Uk2Zm.'J,.7WfY^] e*/X8c ו PJһ5'"m~a`f$:NR;/Eڕ?LB4srsJ`YUQYsύC_ߍn) xfҥ٣| ◓AkC]m߱?T~{8Y`˪OHXhtaZk+ѻ>q=#;pҤI_cfz,bؖ4C\~J)=yn X ܍DkY݅R ZNz>hg\q5E7t555v+LW@ࣙ3Yn]Ɉ]w{a~&~K|qXUd֠u\V.ra2!1WJkڴEC[l~L4.Vpp~ f}m(ǟ|b=tݙA1~cݮ|M9,.(eƱ?Y.z6hᥑY3>Fo z 2bz1cӸ ø;h{7 v{M,nYe6d?G3f0vX4\XTXxIq )g@}"wi=u~8W)uay36] .sF:He(̰i"@:ss\eiۂfvn֚/lt~"5`0a޵Շß#k>=<2kڊjRkMCLZ fYO=Z$_/tGi'B䔺\fLvgtOdX|9aۻ_Ro}sUŁ@~p:]s{EzB1]-zNtlAlE:ٝP5j=vUY4!@0v#oRFu8蠃2]棵N=/"?SHoU$M˃~͙.n-[u PmcFZKB/Cxxa~}4OKaSu-νpwoҟˀ|^k.c 8Ezke PkC6EZo ԯ~f,k\bȶ'4`0H4 T22$f]VBh))%mx֚`0RHL~yOϞU##OIVH4ֺ{qQ\.Woe]?D"y v]uZt_J.W>Zٜ`Xs,/8dXe(u:$O_a$9VAQDZp[kQ\ KQ**Ȧ͛ٸiӠX,CUi֮_i_g荒5)SKc֗&sСD4:m<ެye SMKIJUK<Ϟal7={$Uq|u^zLQ7Me~\Gn{޸lĵwt/]#N3^gELb3$ioC4k{qG4c/F:s„͓/0Eo )W_/N9}ZAQJM:(kn|eO \*P.xs{\xC4l75t8rUAɸ8yaQ~Xv-<3nskڈS($-JQ޹ZJi^pdp$RҥVVTTV &dt  RQU+wg Pfݺv: HGkziKɢ3g̛3z(U(Cf<ۚ'}ܹG<8F65i^ރYƊM6:eYI&/`eYM7mx2(nn>5+?Lr ø:SQ? B zhKwVLԸ|n7t}\-`a4 #sPAN?T=v7`EkMuMsgN|jڴLd W_q{n84mڲ/EEcI'tC X֜.KJLҌn  AN׮~랁@`|c յ߭Xjo%Jl #?td^ne(5K]=$Pp(yi.iQ>; `ܢd  ÄZnwX, ⋗OL;-hR+MRa\۵x塧ot{9 Z*CΡkg7uk3v>)CH#bXkhb#fo-Ztڒc{eiѮ@z?^m./)?PFsScVlX1 ǥu3˴:πCc$YSq㭻KOtYӦݗmZ啕/=ży;ѯi{MxJOAh' CDky&`2|fxX[V扙i4Vݲ,j駜oEi=ev-+3¡P3& H ;V |x\ʣ[=8w}OvOlV y.)rj_nݣϽ"O=P"U ߟg++o9t'NqIەG2AAʋf<YѼ`ZKRS&[n{?qGb8ElQ2qdR,zM:{a>̚v/펼/4/] c.YӴՕYUSsgɓY嗙.riW9 ZQVTh%GDžeZ1Y$OsQh&"=i-`◓Qn#|a k2O]\FM,75oTVW?W^gA! {7E1= E~{L;3jMd4/94id ;f ~X,9^4ۻwG}"0 {O ip+RsDM|B4rF2- 1 ͵GO-os:7/7^7vrGn^k8YpgDTr\Ms@Rj%+z$  -˺ZE4Pklgq@>R,*B+7<,B^:$g:ĢViE~7/q_, cƌ',2p\u,>3/Țc;lQq@'B)b;Hh+?@v _(l6. fЮ,J)eYHdښ̉W?e 1lmMK\L3gj5lȐ=rssI)|h,.qμy7á^x>,:$ If O˻ݲX](a8gi&t}m#:`~! ZسGcEZ˲~ w[r98KR=ve+}uE8yqŪUWzɯj 3{,Z !Y~}?z`~'}cRa(ZFkkCOճ;,E8!눯ЇTԜx|?hˢ[UU|,CLCl:d Zk|A?r8`d~^^b uFׄ-]i2WIIO?wH !\tU`^FYW\~yСqC?s[^nQivB)iV}8nz4}ziEe)S2]N#ڍ.kz.] NzGkv3͘i_mش/]把thP(T.nyy#JZBCR?3M3L\gn+5T{azGe; ph>}^F=Xw~u:v(JB0R' h˪?FcY5^n Vs١]tUwZ/ڵkzrs RXؿjxQAAh,6vT_)^oٵ,p?̛Wegryܱf8`#̹w҅ /-헛jjJsA>oaкayZk71M3ZZSQY9oJwn6mt38$ (-n*.JqϛZ~kͺuP~lMnw=?Mn)6TTطoʮ99޸ysŽ.X,e= PZkRʓNie5Msa8D^_V6=#n_7B?(DkBmp/з#F2p`RjO)ex=@$ D"|SF +_%ΥZkss ց‚\٣G|qi*eYiuu XX }kZʪ|KVN>ᄌ7p@ v!C)6xr0hCyk}YG]\ڲ|ea++ZYY{Qaҵuuʾ%=z h,xXe(RJǿ BaUx~MӴ@ P Teuʖ|K/_g\)gw}4n+zO33Tϋz\.N>~H.7z=x#vݵaHQ Uzz=pr˲֚՘3-K)ӯN}^K/['|F86$l "ࡤ?msf:B^x)~Jv`#I.ਧj`|?8I} ȱ˟X ]dY$4 C# lRFNB,[Hlx?b//Y'Y_kcYS5 a+p2sE@' ДnV FDCvz#6>&lY f5=u}Ո/PJρ3]gl!+wۑٻ`0ѾIĘx)cq}2l 9$ d/"R){ Z>p뢙C1`^Rp zvpg~ F|d lK`9@%b\Di&hXn7"is NT1h$oΞnO-B@9Ylc-iz#Jw܂ؐbO ;Zbg|/PॺYL댜H D@8 `ߣ'y! aw"j*EGt`)itY dG1E:g| 8n=AA{q|,4-g0AÁ ;micKk?3O]j?mDY>,İ)S KSv  < ڟ\dL u K_!+IxPd 9 J0i;˕ \jϹ@4Ĉ{! Ǜ0`2p:"R?vx7C?on.EP>~xDeV=ޚ&ݑcx ["w`62B:m@~Bg!g%x{< tK ވ {iɄ~14΂8.d&}"4I*d)12)F"N2+eAGATߛ` [7r[u‡tہ< H#V߫59e_H(SHj91ݭF~SYfԷ'p7m ~fu6lkK Y'% ᯃX ۘ+͠9rұ[=<.-!T!Ț?J=$8Y +rf"Y\LՈ醨{{e^s@l,#!y bGYwGHI~FƚzP2 ~ys7~"}:٪d` T|}S6q :Cm#o3S 0 Lad&j.d;1MލEq_YEE& G=p7BOை?%'mo?Ih3^#kd z5p V5R7]4 ~c'E@V>oQdӣJ'4Ҧf0 XKP M l۷~D4o҈E?z,)ILgz~Z+.Fqr|HU҈:MDԌls2e(`[u\sd1xlmO {رi1#J@%#!E#AA*TUe[×S`$[0rA1 R &%%=Hc_=KݙDTd0ť+w' `0&.խMiZ3h){> LDF¬AiMC.02UEk(Cb*pϽ1"1|Eou e-< |Al ȮM! 1}/ad);d"S F`^Dj-\H.^N8 RXC:ooDmAȾmMH^6qMIrkRϠ;J/~ ,m}TKFG"W¶I5`0ۏc2%Hm싟X$XG t#ssDikym=6?9aބeÇȎ-l+ D.wJH+ȔQEfK1_#+}Z!5lL1iOEH9كDDOB}Yv q7ns2%B'X2ndP8 * Mf\ɎY?e򱭀mmZs m[DͅC 23illm81u> /g;h٣ C:Krt-Blk_mmR-34n&(`kƃ0M ]঄+.P Vdqd[cAf qUUo8 $ٹ8"ӕI.FEㆴ!K:Zm "["o⯐ <ȁjVvd@e ~$#i Sm!PO:Re={=[]nF=nTIʀA~b<ԧ-, D3`5t2Ў(5P"F'a=IfwZ-c[- qQB]"=#FL ]o̿4I:,' :ߦ~4z(?Ejbz$Ť~;3H}d9\MB`{sBճygB<;iR@md S It%CoRkÁ`oHE㡭T.1e }FBMDDvgѤEݯ:I1i^?9-gWhW!PǶB IrlH]/D&MX1}ؖ܊~!d1dPG`e4,mA:"6x1+ nj؂Xg|r4nY '{9_K:FߥFl%:A)dfk#! B6!oS9 I\j@q)1u>>OH=9 k$#< /= x D- %c;%u\td$d? W DMa]Ò; MTpmRw$"A:L?0 U; ~>J e: }nRz"Bd;`0nx^]ppdNTÐ^X3R|!n E|DREU$̸c4dWlw- kb{{9R@.[$r#?*dVöp"GEƅ4*@:orLA»|݃VDۡ9AV5y"8qaHYB̾G#ﳗaSܞ=؟-W#+"Tڅy-v|0 t3J +m!'ę?=;Iu<Y&X1ڶE3u{-9Y4؟)"DC&vƃ TU~$ M!K!"ҡ > dz'^TJ dfP9@z$)J}m?α v;TF"0S̄wIv;;hMnv2$dxp*ZT$:v,~ib 27>I-1jdm:"R0d-v;2!vŤMF4=)u1d}nn1?C7I1'`!;3u?f"˄gCѺ&%)P;@XSBCxxb݈42-aج RDTtCsUI[Uį}~\-,T Hg\:Y}y֑4., IztB:_0 Yob}"-4DFZ~c4sA#v!-{i~Dptdqv!?y3^KDdg'Y+IDEڱQ_h+[KR|>4dUh jd8Kԓp :ӝ-HOhx@k3 ?1]wy-# f~-0ǁI8"?#d0NGewpl,B"s:A @+E2$EٻG@@B(H"(h")Ӑ>D`ye$ GF?DgVqdcgҡ Dn@rC ;^C!!x$|qe$: /"$֤1GҨtdn;qZ;/} 9%V' C"7'fOo;Y; i !}H6QHu?"}"k *n 8~Dz/DJ_ӊ(WA`p$ğam4س HP 5WHN )o@d Q!A6CIe ;0 Ė X=ڤNJzg#X!u_F@^ݎ+U݀:ni+@b- lHQG/ [JP&$O?C6HHd&ÂaWHxĈvis .`$h}MH6O'4DJnDHaIG>W `6 $xʳFT_'KGµC?M>B:M7G7#&0 ݈4ΪgO`0=K$D|m>{"PJ&lS#;'.S=twKr2 H72 7!qDh a6"v_dp!Zm4̖ ѯ![;g6Gb7Am`3X؉@u?CQwMJ_ H^P _x0}$?0>HB$ɻW?6ؕ!ujt}>{!*vCgDi7N%  0MY}!Ⱥ*"dzmT5zDcO{Hn~vY!Ua~D2lFjهc Mfdx5)F4t2P00Cf8`b{O:LpK{>S4i8(G!o;^>]h](-1zFtD2U,dޕ}^Ii{ bhu) dԈu[2MgE Gƞb*x]lF #\3d"3g=" *oz "Ro 1ڿ}&w$ɶ 4D9 >@)#Zb5ż={Hߍ%g dm&`08Ye8n".5\Sm8\"S}nSkHȀr~H]tZ& O㽉veюDԿW4OS4-Txv ΋J .p^[-` q !ˤ.k~4,oO& #kW}=" E%CҭF #Zd<4ňnGfOn4hhsCX4 BEjCOk臨^D,D#9+ޖ Hdy0 tÐs { kR{:nGݑ>ER}LvEl0W`O;QB R[(UM/"8ߥy6'eya/ak#Fd(AfWi+ 0?$MwG:IXD~qx0"G>]#Z4A 'B»^˸}hl e ; F #kݮE=,!iSCUl{p>gOiXSc!)s/4iks{ %#Ƨ=`01 @fJ,2!*8aW`[[v}FvMGO|!zK!:MkG-&a)uL@ c B5QwOwh;/~JR 7!ˌK`E#1K*爑q1 V';^nhF$]#"F4iR E@`0,2Y3þMi0Ԉ?1ܼX5 QUdPk&MWH+0Pδq0H^需ZG< B?I?#*`о&SoQ -=x>l^l mD {"6(CN@O`k8AO׿-LEk}> [,DoEE N%"T7Glhٟd SQgNB $,G$Vgv眅=\߷G^gc.u#^DTT72cm 뼣U}M]lNX{ Ċ< 1BvކKxsغXϣ6FQ_49t]^vf#S%Xc_3ٖf_Wh r'݂#JĩxdI3gkUd&Em #ywDCIsUu;GINW뀿#a\L"eȄvR9V FoSqTm_Eh۱-bJ$K\eNٕ{l}+3=v"ˑ4ۈgﹽcm /2ob)m:5 j:*9) vde!&l$.D@mf%{ɵ緟Uk3Kp:7"xAFCPY[ɿob$4u.fN>o)\*:@hd,vCKHPc;v{#F^ACf)ت*!|"CG.rb8"K1̃ZkDtCW+#U[G&"COd|1f:#jSqe z-(g1=L>QFKN)` { YoY3,wClՈ:ڸ3-B&M;Y;8888888888888888888888888888888trQv%tEXtdate:create2012-09-07T13:29:17+02:00P+%tEXtdate:modify2012-07-06T18:16:44+02:00KIENDB`glances-1.7.3/docs/images/hddtemp.png000066400000000000000000000043131225327237200174740ustar00rootroot00000000000000PNG  IHDR:usBITOtEXtSoftwareShutterc gIDATxyTSWe%@B()rpRjGij":*ATkR׊Zki]Ztl.*Be!yɻZ QW}/}B!B!B!BH\p{.) .Yb/IjYxw#㟈57ŝZCS{o!MFRXπ# :iϞUѡR~%^|mxtCWon?4kYm 0M2bB$Bn7wk@$<ܑs"L ~aX@!3031#3tkMػj-5Ezi{x(LѦϑp=$\h2d2<ude_-v2[-5Տg[q7;!ˠ?pPl>g`FDj(rF)[*Ngn_WhʾGf 3ut0OiZ_S rƆɵ(+Smf޶9wSOSPT<\,̿Y_폇VHWA>^=;c3qDNܦG u0n3cab؈%_߬>ȓ/* 7z :}٩HPvltK4Ĵ 6OG6_]cYbVa]߈])LV1o~WNE~cUA'Y| ZT隬e8lN`,ͼkL V޴q|sTFgOWJs@ZT(c:[_7VqQECf\W|.Ȭv%c+?jKFNOM q3l>Aڔerk}'<"ca)&L<%@ae'F u5~{_0`I]χ̍eYNܰӟ =Cze#&Lݭb??Ao7]|\h Z+%ՎߚRJCx^oOؘYx@,ݖɐw VhI@4u-)t捜D׉xAX'7q@ýBc=5MN&ƍسHsYƗؾn<8XWtF4ڷ͇TNt§kUCXh{oP1@y5%^@LŹ뾺o-ǩ|;WU8k!B!B!B!DIENDB`glances-1.7.3/docs/images/header.png000066400000000000000000000101021225327237200172700ustar00rootroot00000000000000PNG  IHDR sBITOtEXtSoftwareShutterc IDATxwXϛA ` ŭHZ5bş։A":PDōZgUuVAA!vBPl}_I{{ν}=ppppppppppppppppppppppppphsRwEWd1}o6WCB'u}붤-H]/N۬D&d2X'Bd2~.{${b%5G\~:z@uXqpyًEҎoH5x.@{.urT @9{so ,33O -MFfԾO9==7)Q.U8"*m3]Ԥum=V#k_ζOxhiըv"c͵ x{y8![Aek8?fҮI=o5[t:bz:3&,Ɖh9[x((EX"nt:R/d8̞mj9~yJAde"9Ձ:U4/RSz%="J%a":{`S6t _e4!NOK1kUJ Xfx |Wl-c0 ;pol7;=B]f79jrױn7ewz˳M|V n=iR^㣊az;88rIL@S8al:bА`V9mlgSF@uVeHD?*'Fb2k6J×,:\I-u9V_"0|嫧$aYQ{ ~,҆v*H2k<.6"**$;]Я;M=779NT".8ԇNd A>y5_k_5㝔*IˤO JY/9I_ІK2'5f[k/Hd K/kQ!D_BaǎVA@@lr4iC1m_SXTS㌉؎T߷'!t_d2 Ts†v%Igg^YDuTI'(/+)6EoV9+|8dN4vd=wՐCQ 9Џ%ݽmM1zX:Uћ΀oeO=/,-Jr=r,V'^c=*ŗ|qcԬj켩fmwO(®}fV{ r) Q5-,t\鱈\iM;TܼR $RԾ^  !]7V oµJDHT¯s5zoʀ\}(vbG NpnB{4ؑJQG^}'tu^xBvYaUdz!먢NP3)ё?mQfuU1G[r@ q$ȁ軘E:/*}bR/&"|;$+#YiZy\) d`kAwtsWuC?co_Õ(u^z 9ٕ嶧ZvSskHNW&n(_)? ƼD̕4ؗKj$;.2G`'3iEdKTQi?kJ}9|{]X }jCzܚt U>ζ}mc?6qeRd5|XEI- 5 ;g~(¾(̡yN=8EA&k:*k-I$>:M#r*m(+n(<\0ϵLAxbWQ@7 Ks+1:D";w#VOYJq'ՉN Qy^섭Wx==y1tQ% $DuJsw5 ,)P35naPqHT2@6RP@"~q{]-gh؄Grs&jh?5X9\WL$C^չ"{D]OŬ{wLD$: (K[|+3mb;(֞ZbwT G/X:{H}Ϙo'|X CF >;xY 7+ ]7V {к^FӇҌ-|*g^༄1}uSݰ) |( NWpl.u̠y.vƦV<|Xa7N3w|o.~~wr8o'ipr)۞Zɸ:1_tY%gbQAXθ{Ҧ3hڜ{=J@\|o[=<,(ɓ#`|zTe;ّ_k՛'՗Q[ʏw/?y듰k{ovE KWd}n[“OS_ ^t"=7 T5B!^(u3` @uSŌ3>}+84쁎~1ӝ\=Pzy1n:{>ksWE5uSx@\ɉ' 2a?W"DΝ0](OGo|TtDkrJ̶(˷5@\zg*֏ss[$2w]nsEzb{5zk޲u=Rߠ]-\E?ȍ{u_/=^z&;?o #8]dt8[+&꫁յοn5҃IENDB`glances-1.7.3/docs/images/load.png000066400000000000000000000071361225327237200167740ustar00rootroot00000000000000PNG  IHDRLcsBITOtEXtSoftwareShutterc IDATx[w\T{Q\D@).-&Q,X35OD"$1Q,[0cM^>O%*-w"w {g939 ,X`E5ÙYm T_[rUj*qvW2!"I$`k yW7ۥAs#=tןbd֯H3X&dpR`Ĉ&{S@~s]*b?oKBw)X(U fSe5τ l喙;LLszMzϳxI2]9燌w0&bJ?_Ls\4-my^15WlFiefeeeee=8;>ws23%W+%J}/ {ܐY-e]7;qVLJ5עIk*Oko|^ש+zwď|/ܔw<}kW|/(G\9wxyaaE#e\2-6끨o /9RVST.= QMGϔCIxgcM9opUꉃq\hc-rbo~ϧe}JĂV$ K\ :6;#^=pnPVT(1 `ϪN&f)qA_|qFguuWkc}&O mA2rBPsGfLx|ǡO[w8$˸7iW}?~!WV/蟳!}&@D@\iHC!0L.Vk9.d ȳ`W7$ M_fXQIZu;[3弱j_x;*E;Rk·Mpk} rҜM5 Hy4g1X[Uz]~7~]Њ\gEݼIFV^߭$kRz;l %/d+kk4!y.C?-W[-Muy*snw؋ G_þ^*&,K_'2 [}#Y:Pa*n`V@ ._\`qn.JU()yj xHFɛvhK]V=C¦D,Wy~FtZ6y+rkLu 餑b!`ζD SR`ƚFp-g7fcN\(4&7m4/:IOۈA]*_3^^4}HIOIq3 윛v&(PYIT> ?SSUNf[~6vΜW My.Ւ02M۴8yox=:Ayq%"iTel]&5QVqn&3WW'OăP@]kt^ڨkX޼> {MVaq#xj÷P-`ۻgLs\'nFt5INO#n6cEH *fo*థ[@U{K4FsktΖUs& e* ~mhfFHNG! :[|qa+Uqk!Y66v"!k4f$ &7{H&.?Ro fgPf7TߠY5F-:Yam 6,W4}/ֆ59ĭ9v\N9ĭ;>9ŭn2P[΍Xi_Mx0 3@b ,XFіyIENDB`glances-1.7.3/docs/images/logs.png000066400000000000000000000273071225327237200170230ustar00rootroot00000000000000PNG  IHDR-GD{0sBITOtEXtSoftwareShutterc IDATx]w\;hGP`AEk%K51D&-&^bQK^8:;{x6?y>; !B $B"qH"DTUB;e¨^| VhyZ|D]D;;ïjutN6`/o{Fi|_=huz^}Sς0ozò*^7Tm]68@/@Rm&r|$0K&;FhqSKVǁtE2ZwfiX@ >{("B֞ u' Wy Zu_L{ʐ;?F$EA77]2»&?w\eɑ,MApO!P;貏#!]NtBJ5yF] Oh3#oMghtz}ޙ іԛdS]>Sj(WR VWRgitz}زrN U?4?sj~Ef MW’ruz>'?ɧ7}_i\Z_DSoIHRE}Xպ8A:.hEHO#3qp=3fب\!o5@*.O3Z!?EG,eY&ݒ@3!Wwz>*IJ,Б:*"Q֯4"g7M4zcSM?RhiS.&=_g1ܜ< b2#B'Xeo<-K<}#Y44 -K OAȡmߣ5ڔ]]mHh4}\^Ɉ6rNqFO6̪XVotM~8R`~{FijueLz 7fǽܸ[ ju{4Yc|bvyʎ8huCf%\ҾYlȧ EQT94˹w A"B=~X7@r}G*I"Kp`K}sld_7+H4fvcTBNpط_{9)O~򹻱Eݝ Dz=Oz]( +,.^#ڷX k_ah']GԋY:#]:c]V1Xۂz!\:/խ;w ȯױ_O'߈|  M^{3<Rǜ;eaҥ>p{l>]ݥ%2&ҺI}_>Scџ|u)8#2 M3'=7l40VhR 1|_(!1#3vvT=ݳ`} ?jM/[طg*͢=\,{mĿ/gx.͢\qW^H aVȢ(Lz,z}k{)Ej$[^h҆6ig2SQ4Fha)o]/?6ԯS5 $I k+Aiُhdž27U/xC3˼͵/F\Ӭt{`HNa&Ӱ* ߤ4ܚ.)*T%M4n+<ޗK7wWM3lʾ9&x_kaQo~g؀G_炧zE)C~΁g\|K=>[JB;h&@ _۩+//tq]O7W9]ڋd9z:63/Rmӱr_ {zկI@G?=0 Ѕˍ@n''!eYdlz WoWwO䄞9kl'vD`:ޱo|o\ˋXepʲLnwz }F<]zy3jPyT.=tj񰔹5]15^z=)%&htGd XB#|nlݦyM6?+F [Lc U"B!CJ{J@g-8b5" -k%q;Aà]y~ :Hohp4_A彅=C0rIM^I 1~Ǚt9ŠF@J{V4rppnE,V\ *$o8BrʵIHey6dIխ) ;&Ie$j{O9E\ʞ8fؑck$=wcKEX;X0'x CEXd8vãֱR@j& '9 RT2x%dv<ʌC@S}E❐/ HLk$xǙ6>t7S{_j_?Oȶ}_/R^g^ga<% @VN[p2vt= nS&5!!n4hwq`i 4>&=#tg -!Б奕)ww 5YҽŪ46V[c5PtW_. B C4M3#"K{n2Y@2M',B>ն7AW#U{^߹qۡ9SUcҩ7sZ~z-JmCdrDpr|syh6-J8x!/?CM(jA .nK;gΜ94/Fک)ZAG/ |!:#2I˳'O<@4]~ VcrÚ̟YW㡢&6[6hJZ뷍դڰ$74G]9fhF݄̏ϼཧ2FOvBF[ir^q{̦.6gΣVI'B 6':2VbQ͘m? ;}w%tjUQb.Lר]G՘^yqתz0*Haj55^ g\$ٽ%_>O E2W>fzqpw|o ADj@5C57 ԯteKxZ$QDN3N7"`f~O׿s ]t#yADe$-B[7{3SЄ~6 O U:.-OxH:az7M<-)RwVv v^ʓ {vM//rS%7יSs:DVa𞂼XAՖCΩhV}f Ivs:#M޺8bY{F9к4=7Ё&eB,0L_m}9C@X7?8MOg_'aؐy ict|d.zus벃I k!Iq{Dz(7v 8Xԛ>P^gOYUu, Oo<ü8lN]{)Y6?1 }љZaĀ3|l~MyzT|J_;7ePR؍W_iYˌmRsEq ==eY6rEsKM&M3q3[S: >G9G 'fuWGj8 Ͱ!]V|ȵ_wt)q=cpycJfOlŤ!tw(fgR'8!!?ې>N̥YqzJpܡʹ݈HU3,͊}p>5$?`)/oyII7t!+A@($ )3nH$EQEQ+_2;ſ-i !OzBfHw:/}VggIK=X" \y +obI@# S6˧QzIɴRqK,Js'qPJUW⪁k+Kĝ,_Cr I@\v] C^>PHgO/Oy%sLUaHD~~>EQlI14^\S&ߋgc/i|&s\ثQ5 zrq⹿]LЊmBmʭm;nֲ߯ ~*ڗ '"zyKpݧ}w5+BXfY}0bDTV!@+BĻ {"DT)@DT k~"DTqL\n'o ڣ~ESk̭ ]#3{+OgK6/)$çOY "5m3iNލj*ȄI#~;qS}c_5RV:ѽG%i1^65%yIqw..j_fn~bVo7jʨnM\,B,Zj0P^Z7tecm< DŽu&$Qti߾4E@MK]j9Z1"]aGO&d݌Ձ*[oAIY}Њ].[zv͇N^\޿hP: %NGLѩI-{B{}o{f2~et3?zBĵ]տd"Nc&|-^z4VH^ ^ܾr=vsx6Q)|xH'hcᅵ\Z8kHY/Z+O/q;'L;?|"%ڳd!heEHg޿[Kn>r~<G"&xAKV᡽sd>$BY?rm9dʨ_+签Dob IBѥo[ uw˲!F.GݎV!$2%~~5L#@صgnn[>vdoJ˵4(JcC+?I8{d:]=^lF#_9S>b4 /ؼ4hMSqɠF>WB^]/"峣<z; D} y~zڑ)@;/ĭӎJ|n2Na E%b;}HFI[73,x.ktv|$gLmwµGy-z~;$/Ã`2<Bq)r-ב_!>oeJM6yh-&NޱK 9eӿ! Ү)c{7S]ڷXP("o`댼dv֣E-P^H{+%vhe(tl  ! @Ԡ4Q:6#=$׳_$vҋ+?NFϯXw8Z"ŒXE9aws=[~ PC! K>;M`ؙI uH֩a j&B&A}| Vn-zd<.6ĭrz]n+͛*).?|b@u~m[5{4%!ճ8Kq{l~lk_ٵo)'ڐJ+h%߫C v:inCH}(xބ}V^0gO/*l o9M!!k=_Xb+hSǻZ^d\.C&}|`ȥ0So+]6ɾrE>׏B[iIrm]au//po Ki2eݻ= ֈ_ش.C#:VE\T d4,[ӽ6Խ0{籈t!5j6~GZy.[Et"@YuI;M7_ޘS/̼^ĭ﴾fՕ|Cg<C5&Ʃג([72^hTRMM 5,>gag 븮 K  S>L22lIe`s݄Otoz%S+esyyZr =cͱkP~dG9 B//OMoln.*s3pGS2 22# A龻ABf9\~v!' > %A`C:7+&*`M(zm,cKk<bW,T}gT=gߎ=ZaGwxaavi_ډWڨ[}3sޙN{nkM_1G^gϨo猜[TxTU":KC@^|٘˫.W=㐰nhY@yY*ܗ c2 : HRpj|kXZZշ|WR_ v-Jf&U@n'̝LgP~q }e;qZ۞/RBF ͙[y#6Ѻ_/6̓wV /~Gg2LgIw*#O ?dǒaWK~ <7X03,[z5i 0aßf 2姖NQC ;ˌS2[+ ~Ynd>]{ݽ} *ް@|N5kc!{W|,5: Nc(~f#}սf-[4oq’A,\s%A->iAx>js505PһV]0 Pջ ʾ`oph3e[ĔWIDAT 2FK9x1~y .?0 =1yq:ڌd%lMl~F4 >@\ٝ~mO:w e/왹E穒MSQZDU+|̻mXUګ2SF%5#몐 aN_վۆE+T33wps7 "*[mͤ񇒱E OGծ$ѕSw߉H1B$lDT.;wj߹gL^r\L$=,5a_L8!tJq*ՈK!P6.d sb=q1pƅjˮ*bCԱ:ҙtZXZv΢VnSL(ﯸ#>~%YE !2 "TH1g/~jd:l@ )YP@{3)1Ya^]tf3>KF9</ss2Yğhs#AP^Vf'2':u,3r3Pth?~xĐLܭ 4!g^ihW]r&v؅_DX7o`ЃTfEA5J uLs+IC#mrx}vu^SZ_wh$ϺCŽ_\1iHЭhܽIvwwzS1 Q!q%{urH8s7{=v-t$l,1h9t=Wbn;٦\͠r~vbW48~@Km=E|Bذkd|He] {m]jŵ͘Dޘ3em `oz7gh?&ͳn>OJ F옔.-l~h aa$dF[,BǏgr/nxi.~"ɤX&tmPD%_şXcq}\6>g/-#1tM?]H}NT:yѣ rʄ'shPA"}d mZ~Zb*ʵGlzFס^WENQ6y?[EH-krO'^zژ/Yi^Zvz4ݯasj1R7 9HQ5 I(&?)!]oĆc)C옐D?>)"D $*b BUKr.ke[:%LY{OߺaB}yW#wzy\͉&Ǎ7b/4dJWRn]oC8K4"_0;/̆p;&JPظ M1XQLěq u5\l[lachbpGU.pna~p+<Φ597T9 }uDQW{Qh7JPp" O~b "JVI!o>Ϝ*AG,^L Dy&^!BD!!C{u8|$:xBc6==C|qu>>_8s/KD<_ڕ3'xA+[C'Bt*Wn>*XO;P]DYͿ@<#vyuDӯEZVEYȇwfL@ǯkW7Wb²Q%g!$`%Ұ,bN97bnqfDŽ J$X-Y1`k|xG|rvlB"G}3(eyX' @  J ೜X|𾭽Z?J]A\%=r7篺QO >ΙX|eK=F^|-A\WD7unULO!A.9,}T:x_=r'BƖۏ'BׯѦ*>=$:hϺqZI>'-^%QOo4ztۯWUb"6#Uv>ze݋4E<|ô$q.W:x:x< mfR)Uv>++QϠ#7n~s=JOM);+=R۴ivladE}w>yΕoG,.Q_~ç{V:=MkW}MeK.ɠ7YJL]k_ D>T>o5<rȰDSEF%&ń<}ɰi۹g1.;ʽ[ ee'> 3raKdБ7q6ѝVnVI2͎,rŇĢߧgz]ܥ />Eۭ_ҧ}k'^aw+DҘ^XD<|sy=WR:x#R%H]$LH|0WVvV"?\zt/u f.a#} Q^Yega*_D3JϘO#ѫ"Ur>h蕕E<#|?>=JM:x_TW/q0f0kh2W+\:x|GWYܼ17w"rkOb99uπ~߭&}iW#q !;8UF;Ңi6t0E<o QXLԅ~ xuD!A{uD!g:x!>q1$B"*lBq#IENDB`glances-1.7.3/docs/images/mem-wide.png000066400000000000000000000236151225327237200175610ustar00rootroot00000000000000PNG  IHDRtL_psBITOtEXtSoftwareShutterc IDATxg@YϤBMA+EņXuE*uE׶X޻b*"%JHGdpvKrw{2.\p… .\p… .\p"O}z&oZK>mM/c]Kkm6wu< 0I u&Ykɉs|M}gL~GN=-rC4a]'^DztrF_WA9gռFT7q[̑J+pK/kCUbATPuF Tӡ]zhSx"#d, B?op1 ݱl~ (F|Zg{D^ 'aE~D[Ňԫg;>7\)VL'<yl` M *_ '9 BI_}gMrVeXXMNrܕ %t d'+y"`!ťKO5w)ܜRlMYwD؆@VUX8ښ2BMwO7^7UjL3&4dKNm yR=5dd%(*,>lqkzcE(rOTD@ǚL>sgZTsrخ9\!} m?s!W oIfAd{C22kΣ5BiE>4@26 QG=/il[D6?pzu׈ӇgwV>{(bCBijQs^,+z}?ƑRcLnY|h9Q%JT`U=sڋ#mͪ( 1a4/P-ЫrEϷyEO Ly<pd9|k~{36K~; /pw/~ܵ ]|`}Tٛ'־!/nǚb77Q :U9j0"*qjE*!;>`–ȣk]ΜuG#PUDWˢGS}W) $_}OGq>~+T ҷ|\pO9|iAjSw[UD wgt Tk_eb}d4zrmC B%ZؖkX_,hj`6~D|w'ǥVO):6r孼: ^9q$r/~MkB+ڃ?F lqF$BɮD2?V2^>bZ-XԳYldAE_ę5s%=mPME{r/ؖc~%h8ͬCBvh{#t'k'Gn>wb>ן+xwYߟ+_ca[<>>托'ɟqWd[@xX fELFN3?H5sQA%kw n< Jvc^PZԹ=~$"ڛ[v %$U Bd"o&*4bF3Z/s**зjTU~o!yge۶[5@oæ$={GP,de|vEFHjcƚ(ZLgMcHJ([9£M݌H./z\hNOڗ'k(ƑoJDq'CmU5\ 8/v,TV5r+ <@NW pY7b2v3W(2g=_Ɖܻn5,6DyݳH tDf!H12uEX!ޖ,Pu..h)W~rkW<51w譪 wWz\9d+v%uĕi `E*{v =0\{Vf`J?ui3cf4>@¡E%y|"ir7FO$8 +L]R Dh68R.냁ؕc7?s[${[iF,~qfϱE-\]Pm§[)Fw͑92,J)Mf-xGaDyǂ;'SV;d]"dT *vI~!+.>/OXg3- FwaRd}~W"7`ǩC!;f[YML#")gqu5TԕJ~ubE0"N~sКI a;JlhcnɣƄfW4HvB$]%4 OB@'PNѰ}tsfN8@faA-s=FYL,y8JFKP1HX{onof#N~S/Yf̔08MW eJ_QF'+6b_?I[aUJA}?L=yqy ?)5=!y'iMNr7uT$j ?mV?ʹ>* $Cb@$@$Z\ĵ CM !~tܽIgr 7nںƽ=}5]*4E92ݷ=}'rRb?IhmGN&55rkE8Hz×%#3333SCM xy-#S3S}U2"eh& 812u`nhbQ(.ץׯe'2xrOX3{݀Ɍ/@͟47ӯ^($}ڇͶN$4HOLtڻoh x)[y﷍"ڵ-x1& K:~[at{Wy~^ܼ_}[;q%֟nhsoywLxSh_qg.vAKΔ7dOE`آK@,<^MX"etPt68r֖uC7"JExڰ"z%(^q DJ^WI맮2?jo Dd7g _1e1krYnǧqF$ F%|Qmq% >P \p… .\p… .\pajzJlީ}L; O8\ 9ذVO烨 ^pJ {)BRҡDlaY~/ᷘ" i:o^?:puXw{2b.)pN/^vD#/LRO>bC - O.%Jt@ДZ?3twQ2ohɩaMSnzr1nnEz2P~zK3tbq˔k$a>,=SٙZO\2 )uX!IJjL ZXhow$w~dА?{\:#m=~I~}:k24G:Yv$p)ʣCWQ *+(z_=VJ.u .>rҔ ۉA C+. e3/ҡD H.3+Sj>)⒫s2[@M\*S&B?4Y?8˙-[쯘G(0NLqpXBJT&O6sްǦMWWDqr2LF T!#.ybeo8B߂BPʱӊ$T8XYԼd1 ބ|h(FB S¥0D$ .z é>A޵Oh9z8%q!f)Cث]r˿j۲!IEk^N :Zt(j}g/`ߩKs?:ܳ<=]"|0=:R IBr2տ>aHkKJf4B 5"F[F^T[C0PnԷP!Ku\M5(0-bS0+ڊ!?3HqszMbIӳpX$w{Fa 5Ք?bj@JykRP"nyQaJk(#Ғ.ӽh}'LwSeM.o;njsк63nE:O֤dž$I7]tǗжIZz ybbp@>l+?w-^r `e>9l6t%g.\p… .\p… tݡ_QoF::Vu[_ |…MnɅ=z^4/D푿CG(c )v\=y.>?;94..Q,,Gzh {+jcǦ1( $ #lM(PWIṄQ#pȪ*^{a:Օi0lh U-> Mub!;/7=hJņ +,$ վd2|fdoW歋g/~hA1>FE<_jk NgVK9Uڃ'P/ ZڤE24nXyD@_1/J$_$iaekQWA5p9t J+D d%\=׬de?qI/rSnMwSp];-<Y>m=/yWsPQ>^Vݹ\ Ғc{'(5pʺ.eBϭ:e1*w{ 0`pw;/GZ@T4l*N REGm'+tkL|UǩhM˓2$|y`;"c}/˥( T**r#|LWG}?}_&qMýzh˓x켧phq+,}Z;b!ysާ,Q3qnBHDw3Jua dHn刍G.ZZs KNm yR=5d Jtp(L$;2]Dr1Il!1Ƌf, P ^uߺ^P^8yYJ}䵸?QwD؆@VUX8ښI.l(|H+„ArC2Az;KWm֣wRPtD} J(Y0n(jߩ82}ā=U"v ? @P9yqÛ=|l'aHP]ɆC . 1ډlTjEuecD-/g3'BteǷ~[ +j!,XYQr!CbPrV"]_AH4Rb_W,"ʼ\VIyA+ M@ptG9A|%JtNXƪRc]p2poE\)DZ.9턬+#E$ޞm l_Z_Nb!a9CL!CP3uýc UcƚK HxX f̒"!0o4dA>̫WFRr ɧ>@εa-I) fOTwOUk+KV])B᩹@Zu DXzI[V +T] '}2 zxpT!LXYQrC^T{v =0\{Vf`Tv3W^DrY^ɒv1LVTJ!%mIIw!ffY?M†KSY^u_4F{G%[o[-Em rYJhӈ?\arL]\*d]LQu5TԕJ~MUQm§[)Fw͑9߅Ơ ]sOFFvcfzъTJA[PXģNsr귣RI6/ns}WMuWb^Ԇ>*˃F7ִH:XYt!aG1 ا;ZabY6 CcAr1,{L +fo07YRz *#Xd6Cbb1X#t_Mj]=Yo.fS;@C r3= d w n`aXmJF# ukf9!mhy@Zٰ53#{z2#"4g`Xe_w|gI'`cm庺ը"b~[JB{P n:#ySg-Q"x_ML "!+pdYrTϸ U׏]zY!N:azLJ֝8V۟5Kt\˿v懓9)c<]L|e+ߙ L60rWP!Ń*#?nMkȣP 5)lH3_HC}CE{gNPjfzܳ !-a;On ˒$y%l4W!& -% m8`"?>;sנm!ѻV l-ve}ts2 nƀ>߇DjѮ}ܴ5umߙu#ՠ vbGe!Qҫ5Dlevٿۊu]WҘ~vCE\/vd,E"k#]ZqcֵY4wT6j ];ASmF{P|FhT܍/}w#b-At4+ 5䠥Cee$YXilcYVP,2J9 nc}pDyޜ 0 9*4ELdAפ28.س+pLzᏗ(6&[ڜp+ǯt| z#T5kGVO.~c-96KLnOuןS1ޕ+740/%O3uW*?|T8oyLWJޣL~`tЖ ڤSeY z;ۘZMvB2!`"m4E  b@(͕K*9 /^$7{t-_T3;% AК-hM*@.<6xkOwy|N曔VwN4RV504R !TUö9MDN@G4]PG l× 1O=ե?gϘ{M>N-ky˱.QCr 3n;| ?&c9J:-F/s 1"g/?͵ ˮmt+Ybv/]5/K/*V7u˴F'׏vѳQTlЙF:暵#g.^)b8}&Ec÷nw{K]H C ڜ6F%s M!/ F3}sXmNdrEtW_esz_6D|e?ji{B#S?\ivX y9cy\Ɨ`șs&yQ W##o`}ٗ U-kA~uֽ=҅DҐ}k%5-c%"Dw ҃QPѫ'>>n`eHoG^PU+iBw+-gm]%.=Q;p G=`z y呖G,hŤ'{̚?i$;~ۏߏ(MQQZr7.%."vKS%4-9QS9]Y;c,p:YM~:K̂>4]&)5y*vB6{N_!2=0H̉%6@j/[c-u gOȼݷen!L9tO@c~kPS?E kO\n'_Q̡`}Rr_.CȍctBNttszC5u:~ACL-u(`y}:Tq%l17CPxd\?B++A :p9"ΔNaT_[,o_u^? ܘ-1.3zC,kV6׭'DdܹFJw%ѷ’ذ؞vپ Γ.gxQAaľkU } ԅ4D_6>*__bՁgmf1g,㷑kB}'CZ"n,fx|B?>iFy.Eĩh& 9ťRҐĄ'oX7OΟ|8=ԥK$B vo4WT  ڦa(*oK*Jn]K*ib@R6T'!H%oojjʲ*>AIi-`AyJvzz肐d(H$YP^)Gtld $Za49Ӛt7+-T3W!B2F/W*x()w$Fav371 q#wҚ{1W}ct\Q[rtfV{ t1d0 &T}V#.]ݴ`7kɓmk=`0aufV9-Ѵ"Rsleϯ=i 5f[|6bg @# H*.IƀЇn~N=wul<{6}nCE)Q7 "1 jRuh7Zar17Dﷳ-GlijVYȏKr"w}^'c5)lI8dRҰ%+'~Z/l bYHm;}y9ai*F=Ӑ6qPy5c .r;rMDebM;ÿ'ճj%ڊmQIG7'J`4)U7.T7'j;cD|ICMhhQD|HK jýHH/I l]*$ $/9 F(ҙ4"Juf1yB@fb0 w70\VGQUhŢ]Tk2_wͫIB4%8Wy}0uDo3*e> 9A>8EV/f>nftHjX^dKǀ~Ɂo8ppF3 B[>c: Zn^x0XP ץ't  f<|}JPP=+-Eg h/tر߯-QgʾS4.]G/m~L$]\Hʄ\Z ViD+#nt?΀եH H|Cw8ztFik-i>veQƌ ;oV+H bh -H)w!U%'b.q%&Wyp]DZe"b{k =? n_= YJqR;{^E9IՀ;OAq7Ug=qѺҲS 2dK~qHa34;. dcU`Sw-),$CƀL$R,'™`i!3v/ӾOam@J9Qvą*4^BV߿t:Q_T~c&9;$`ߝwMV<7IENDB`glances-1.7.3/docs/images/monitored.png000066400000000000000000000276361225327237200200640ustar00rootroot00000000000000PNG  IHDRjr}sBITOtEXtSoftwareShutterc IDATxg@ڀߙ]`,*6jXr-1$I1zi檉Ĩ1`]4T/m-,wP]`q =/y; @ @ @ @ @ @ @ @ O>~1ݒy2ք @|3#qY" @bX=&ur)1ٛ 0>*.{;a 5uJem] lEj3t7;`!;:?6ݶOl"l9Lq1 \]Lo,}mS@wKɟԪ[XׁcFM2oæ)릯ҁy3m(-{)ɀUKu&j7?^OM()V{'u?9ݞ?9L% Om%sw\\2~Qk7M 3= /]s4zl~myN 5> i1/[?~GcvfkGӨ`nφ$4e~F\`ΐ$? ʌ C/˓R>t AZqaicDϱ貔b`;Eio4J-2j| pB_Xl -fqpSb@[n|;%Ifs+mHӟ~#։R_Usa,gSA~H?C+6܈tP{k)#'ɓEnL`Y%_-r̭._7efo0gٲpQ!g;*U|^H 1htjR)둱XNχN&ҳ~wޚZM@PR%y;9RxV QDVkjaz >_6(zp!Ϸ: hipx8D鉹]$MJL㳿/Un/ mߎ1g}"BkTS/橫`D˺aGf0SUuBSiZwnu7-󘙖^"u&` Ƃ/ d;'f.|7e[+#or:;, uv@iԘaP%D+wNOfts(rFOUn)L3fJRssW ӵxsk_kUf`ukE%UqoOqs0wx|p&Fu3 b܂e啄0: &OIbu4(AڕRlۧuޓ3|/!hvWd*ivn9J|O73Gm 1xzW;Γ X`_T|?gp=nQn nQ&,]g˅ -'7b'[Qx */_wpeC%^`x~HnȒ;͵oܿ:ϵ4tʆxeϋ$8qH/ m_' &.`xz^eA).-(WOad繫HNyAnxT[Cn~aݶ0&h5!ϸauArR I0ü^C4'|ZzΏcs}>tǽC\aA ܚ3{'N̄QSS 1^`߱/"9mٚVuI[Uh^=*x_w2HkݺO]8?z{ns|:IݙRz7)a)D,F7_%s^Ш#; x"Rhsbu'»xa@k.6$P9R}yVj leZpM5 (AQ,MN麉n;$jPդUiH8ceQ[2/!f(mʝy&A]24`A_\A4Kpc6N ozs߽ii2*PՈQ[t%(o5p`5Ͷםo~i\ D;ݲ6}Kmug oɬƣ.@(6{==PKu(OpsE%Kw@ꬪ:\Rhlk+.WݢιE4$ 5O4 [w(hC?Ŕz4T3r0Mkh43KRm1ŀI`[χ\r)LIpM/R_YR\(14^-6`8 gYQog]&s1ڠUqcXL0va?S.\Z%DNvצ7~Fk1j,VU5#zSM>j`ܐ1 ںbUMΓf|w[L?њ/Y-)_G}#6SAq8 Lv]*rS R6v0+]2X-lU2枎]ěW^ Ko6&S9|`0=&Tk[W< =l dV{cuft*۔qtSCc,-u~>th]+#/:8.48"sNjNd)1/NFG߈7|Ż^`SkĴ ryic|ROX=MXO EHf5$O.ʪFs0D~!H- ~Ň3tI ?W!zpħU6֝cFlfy3\`,wv:I`BI鲀 `O;0pA8VoХgg J |nlֽV@UjO|OyVߝIS^ȫɹԲ~#]Yܩl~I.:`h8m5o5I]kUuVY|mv跒2ىӊYkwg1PXRZlh:cGq\uo6 #ٸyW2M9=B{s_* ϟw1cr{ 秺nU\| < Z9aҷɵ8x]^8 a gI/Z@ @ @ @ wB6_lVGζ/10ce(KSε?ei6R_:S$s~Ib`"FZz(<[xMK\w ~E>n4$m֞yLA۷Ӳ9gRر]mW7g|U]nUјTM<>F*mIevg G KOR(w#֖':df.(sHrBSĀձQRfՓjgxN~2+A_{:B[]yQ]㊧ۘp֗-6]iQAɩ=5`WO->985'-݇>y+Ugn?: d#IcKxof~T^,\Sۨ#y2w6|NcV g@^; '-Zk 5[po=Y'־3ql  H~ӉwDz-%gdMH2hqе3K]!qK׬8 ]MZ&<8J+J PӏJ]ְ/ "o9+j(4ãEaXЮM zsHn͡ϟ 19`Pr?s,fpՇCoh4/i;}=!Ml-d3k6寖k'ԾOr^?i]G (pqGܽȮ+s Gy%Z9[}2Go-غ3/8ECpuӻͶdo^ 740s-nݙ((lERL4Sa`0S&PqYx}%JQ6EX)Xr;鲶 `<e> J? ȾXW=ݾo "7ySgSloIsw_mW ?䷴_PS#ʡcVG;nMh$6|H'۷x>XwfqY th4@HVI3EoPҁ9t6mG`Ŭ/o`n4#~Qҳ^YWBQ16'Ӿ@w-W,bz5rWkk]<#W\-Kj:[13 MW\I*SUJVٙ( Lٹ7W@_*uyoBCD65UV? ;J j{J(nSLkI! Ό j?9_~ޣ&,TLiU&~y^޿ը-87T,V_?&oh}}'@2l2kc'ᅰZC> +KM'}w>kwm߳C+0 gqYx]b+ʔ8s錤w޾i>0,:0aA}Ew}!+8Sjs*nlpO.CG:۩g:wvH}˗+ ږo[,iNؘm3ex 0v ɻJs8ȫ9{g\7 (<r)W .-<{$TRYD`rpt?:eߗ6PYMfSodhߏ ]'|:a}R.xq}b2enSeᎴƛ(vxA˭;aOO;r%q}@}@ @ ם1ݒy2ք @ho[cX'! Ea lEj3t7;`wY tǁ$9<ӪȾɳ^%jn6?}-5){sR/UòL,oee\ũ&n>v=>:O0|gHeF!xI}ꀥӗORA^Otdeu .c`@Ӟ ^7{d^ͩtP>ewG󏮛 zfwVRd;X][xrH'h>;#jqdgT}dmPC~ouO}'-L?Jj(Pp̔O컾Lk D>b ڡ.AXk4][]{`oK}vuT4/%=m@.5e7>m!Y˾7Kl;"`qDž6 Ĥ杏_~%$j<#A}La)̬Qr\{I7譲[.yI bǿg>rNwjɿF Yț * PvwCa34Lbgm} 20T:IBzaJ!kZ)瞯k߿֪kW9BnfAP[F)iVt\=xށl *-%D˝#;dyR ,Kxg pv<&u}oXbt4()#=^$g,1@) ?SxjՒu2,ou&UE.QP٦3Mꈤ4Y w]~Jվea>`} 1x @{Z_UopI?Pԯ4 Qhw>M55` ߽newq><]^[V դ-푝Q[ "~|+r`o?)qZ=M,tͫh¸7Q'3uwKWd#̹Ӌ5gI&#}>IU?V3'` $`-;B#[3ҞUynP(:ʾO4Kpc6N O}:>.9)?c(i[lcx\:-풝r} ;D6ƧogZխ;8UP.IDATS \Z I 2[qx#K >mP8cX6`zD57J qОzc,>oȣ( cYXLOXr`q`w: yʸg$0fʟ *8 vŤuw26OQ Ϭwޛ)b̶~|_om]neصg:ɔ~;V`=087ۏ+`zNHgUWRP Mme(ﻢA}ţO5>eo١JqޑE쓪UGNy%t)Tܬ!hp6>iB^lvM4s'>yT~go>S}tAUٙԞؿ;J:LWNZȲuֱ6E G )qi]z>e?>{ڒu1ݝMPgwҲo+ڳz>*ʷ!>! ~] gdG @ @ @ 6=yh),{ɢ%ӮwBg7:4g:cbAʚ|}'Av]e_KvA^|ܬ?]l.>+_J1Z}ow-Н¾V8(<ȹ-tdg?=/*yRm]7Ǒ}e}U}`&q緢7e~@),p80fzHQcbVeNao !D|0Wc-w|s6fn;>=w΄D IT-rr*K9Y ?gZ'&~.(sIBSĀձQRFU E4Խ0@VpXܮ96v|vnriJYpkB?*N[𘤮u$c`7um-Ym.M 뻬a# kDIBDi-> _uv|' `Ul4Pz% 88wd]qҾqG}'C'v7nO1dϬ<#4ZCT,ҕe1' kXO۲wQQJwo >,O}Me9dokd߿;Ⱦup<~x_LCϯ+r?uƜ1EZۂ^lfa&n*y(|Sz>)'7p76Tm:w=}Ⱦ}Ut}D;ݲ6}K1&Ռ7DvI*SU׎ix$E*'2ю8YtJpox0s:9;Rhlk+.Wݢιܫmn =<}߹~:8hgV5˛b`ǹ U8Yx H~hqz>%&tR~`J;^YR\(14^-¾/ ZԕcX`ӿ}}~w"'M k??#I5[5\jQ۷6>qC,^2j-W5s`,nS|:Uu P[[ȎO5S^"pXӕ7K,E7GTȾvѾ:o$Ʌ/v)P!m-/UYh0\{K ]VޞL@ poo ։;HZjTJ#UAűGhЛ\N HR.ںDAy@ @ @ +XMKar%[pݟ]0as m5_[}!cxB}L-7:->^;7طӲ9gRر]mW7g|U]nUh <#T9Oٞ5-{"7C6dkϼ_|&`׾;=|LD?F К R^'̛,B d<Z;?loRZM\^u ?̨WT1CǺIF̽՗.4/A"|z`د}ü1pëQG[;2 #}nkg;|҃Jͱ#5޷>&Hde@2`0XʛX<>K=zm)qI7v\5\ʪFc$7SSh;E|Zjo2eD==7ů&eޤ2"vѡǽǛ |C-'K}^P;?֌:zɧmM%HˇY2\F+#ŦV~'\W6Ii2+:3@}ǚ7=SCc,-ub: |I̪luJ~SDžG$IQԉ,%W (r}϶i^#NFN~8hOS|3Ud⯮7 e4!>vv.o3nc)K"EA4F˓ƖĈbݨhbѨQٰDzH4-b! "* R^~*Oe {~͜9sΙ !0QHqb?(Fi3,R-?3ΙD2GOsܐgHPFWAebX|`e37(n3ȬKdZ}&@Z4hL%0M4̸DWg@_]a}8 hEs!.s@I<5iGED 1{Wۓ,a &pֲ6آҊTji?Vl+>XHa2J81Ī}]TY39*uO}nJy*ZQqi״VtٟFFaV$10MӴM.>r!ǜ5bԛ{ħs ^Am4nj ĵ Qg-T29&oSBy?ƎV9}IY3<>YNoSj{NE?RƒB!!Em0wW}&cu 5L^&W3l"!,zm0ң(1ϼaXɲ@33cM Ò.\(ǧ( g;!oasM 'ӟT@l,&`X,c79yUX~]Ntצ)ELܴ;?6*e7`U0-{"EGԚ2Â⯃窩vt𣎦J,)'9PזeYծ&aYeK8vL0 Q*46_+)/̾rL? ~iQQėJ;zW7J|AvZEU”f* UqV)eڂP?|WNg54CSٷ3uނO*VMrl, ꜛe in(3z1QC\99V?~ŭߚh*SeYR5_w<96CI(9F'ڋW0Ua#<-i;t rp<0#ū,qonIYؼ.F" m.vp]^<=bo. qaN9j?\/gy഑֮Rw#c%rv={6GU(K@n+w+R[:YĿs.y&Mh~V)"iӪ*+J҅~9z$/y_+!` =[7i:i $pʧm^oh_P-ǓNC޲uwat{Q0N8r ^.]F N&m ޾u+|%*T>hzO/&:KԙۇbI>ts'I=ksv\Q{Y#/ݮ4w/iDѾ:4>6,uCg 3=56aem>M >#ڡ0Jsչ'ΰ!-ҹڭ  jys۰~qKuGT~z=#"37v0ǭY-!ΙukNtiL9}uN(PǝeC>]iR͗K^}axB"i:#U%F!f9) ,\@0=&H}\շ q),7eYQ5,a_`/FiB1_b?T[ A'~"l qh(@؈*kG4j^yC1pq5϶\qk#\~j%'ޢsr1LTSbL2􋛉JB"c|GX: 4v[3MW[#nǭ qݖy1ƨwT<; /z^͚sh9r7^0ݕ蹳 p"ª Y^,H _^ڭ ڬ$!pNoӑ.ܼ7kkNy+fjDSz)/i 6s` #޻?<*G|'Q}ч)a+Wך( s'@mEZw7kNT_;\!u ZjFe n%tjԟeR@XB7nj^wXu,t[1XAkp'KiBkksZ?of5m`o G8_@5uhېx/}2xP:?|?)&3fLd5wc2!ywˢ=q F  j:3r$z_1V<-R9m>4%\wt\-$̫Z{a,dh׾\ ##fU0s4ׇWK0 D;|oN5wx+[OHw(?64ðL-1%GNd ,(fDnyfwJeԦ/hPDVd媸u"Dq]D!A HLuB,ttaUNRVΏ<#,6Xx|yTm34"WG / Uz+h@7MicCa%r·TO>E><7c& !e9k1&{\ %}L/{\gєs%R![DkE*uifNBJߠv=NWrA )O3=&p'jƓJJJTb"7sVΓ&-M*cMviX8+ϕSe]c(/VUaY pΨ+^tZ;234%yjnB`*Q>j! i;VpALJr y1Pinͧb?:ˮAfIP8OMEz9 usCwIv @=x1G vXWt*VqzmʌCKW+p">~۾&͖\S[v ɏ[[/fzOhha2RgO JqFJWerp\Q.*ؾrt(ٔmeArg}SQ(KD#?vemcUٙ޴[3/Z't cwowmsڨqpb"VRySTEST'Vc|[x¨q.]l #賽)FK`BWb@[z6M ]Q/T=s( a 4zjHd\BX<}*c(Ǔc]^ݷNX ^ֹVpjP< /kai8FiR8FiG-_tmYx?珌+X" g Ͼ-P^7Ok*ޗ?W=?-6yl6<=ޗ?RdxXi( >Iꓶ`/ sO6M}eOjg}ɓ iEQDC1z6`/L1_<[6ސTC6ēm-/O&|Wf}-0eE99ái6Nnnn5Jx-68tr.l-T--ll fg~Ts'92bH5ϯ^>̓EF?k1-\ڻ]qYhi棝4 k#{kXy6[]u|3oQ2gJZ~b>v tJ1ĉ.m3q2]u>]?Gr>f9uuxӉRRƟ)y~5y"AV}񓵋Z~5ƭ~C#-6F'&^+X1> 8oo+ÊZEs,%<փWgz m3b8CT]~`-׽D4@|-XK*_'u6"N8AbX2QCD 58x@lIRۛK̐4|g4Eԇ%;01M {;yx!ody;g="Zel_6z8:x̦&\.@ .kGgm>nj/.`oa=rיcs8*8T7Zᯥ]o_sl8t }w=lhޔ.xxu +Ф뷒W%&u| J[ ^='{N^djo(pEWޞomĪ_7~MOR~뚇LVkQ5>?%J(QD%J(QD%J(QDNBPol~q1Xw@>̿>mf {,=2DO{;Nv"r'Hֈ5PC4~fuMPIss^F94N9މŘ(i:ȁOCDҤē;1oG-a[#f}ZND%ѕ)-0bj̠ rN:4c; Л ?8ɫY1&٭AO ppB%u}@ /ghg>.MD1HрG/Ȑu~aI2@fÖң"`t?g +['qT 8- ]z60Xiw܊/u FsY:ل`dNpoLG80 X؍_PÄ~:ͳDTnsf}U{t hfϻrvKeFq;-xʒտWTˤWmDT\cX ۼwziv.bk?OWϒɖdx,Z$|r*sqKqnsD^̯\ AO Q|xL]w@3"K>`ᅳYÍB2pA7<#4s^+c<}'&>+C5i Ĉv-)'5vUr.C>#i.4FΓF3'_!&dM%P.'rd(SL$AHpk%/] ݻn{ȱ /`U&RК |";oX\}5 ްj`rcNt\,ԃcv&?]inVJw\+Ռ-:wHIf `+` ^EBӺW[nIT(t<`1Rn= 9|&^1,ljR4k2J q肄9;hb 9E9߃y[륷 3c SчtU_ A4=;$<ͅr 7nP,0|rFy@mEY(h[{!%M9Ģ8/q͠۵C '7+6ԫo[=tHaʋ^ɤ&gAǧ~(Bqx|9 +I{EZH]N2Y_68Ǫ''9k|7i[AٽY W6&Ώ0PbZU,, q-lcV O<=9`_];U_˲2%?(QD%J(QD%J(QD:SygD nLj\/W51rU;$/|rYE9qEg_-TO_KJ7 k߽GXyIaYY)([xԚ#Nahe=nխbpsw@bn/#H|}Q${g"gQtyE~.v^rA_ 8fwе_W\ aCBb4x qTT=[j;'NQ\>0O8aU$1!S`@HY3ua1зGngcU?j±4H/M%I<)^}+H+7'!wy0,H:w#}('H: <]Lb"=Pd&!%8eD@Ҥl=7ffԮ~ E-߮?c@a6#hzZZͫO_Qo߼r<vʤ;s^MPO?H}@%r@rXNr)tV5{z떾3d&_Ls/zU@H~{}zIX[== \I:dW &Ű=7Y| ; ;\w/cݡK~dqďIx6XVZF[_m'o^)Qߵ@0= '|7OWtڒ7.g\x}Mr"%EH>ϗr ٧FӜϞ]s}_4w\n+eG_Ⱦl-r '|j7OW|V[IGgR}OE<^ԥn?>PS٣۷(5D噿gY.G}7?d3S DRk`khm~Ν4-JT͇m `^}vL9,J(QD%J(Q͓PIuy3Ҥ{Gw*,GJY{y +-{'ۧ.\u-<뭢Nz[4|H kZ Qٵפ0N-,zS4@=\˔ɶ񠟫 4[}Үs۽Mi$<5O@.|Q=\]=x9PuAO.uwbJWyydTčG?`02e0@~$5G5m`ddninM w X1—.\]||ËaEm U`2Jau bn-! 'PEPG7v@Sn]_$јNƣn9'?׽D11Q/.G{dR˨2_iaNZz>?=jsA+6\,mQ ?@>x.|r%䃲;_P\] :#[N%Cz|Ccq# \e`iƳRӮV:²ݼt) H4ODɴ8NcгgNހv9Rmס]y Ξy[m_]O_x"sa=R鵨w[e{pċbvCdPL@ѳMF[tN|[|;W94}~]O/T`&Pt 6(%Hy, EMX&].z|K lU"?.JFeFJ}U[14G @?c*m-C>xqZ,]yG]~ge_^QxMf$oT4nC,`Xw9y'ÕN5{^5J SQ!Fƣn9'? WEDeaIӻYDَZ⯭]D}T ײ&1f?~y*=~E=C.R^$uZ2$j:sRs st5(5amS Έ趟u s;EK&/=ƞ҆G? 8 %d^#=)Qgh,8XXEZ奉$F4 J!42K[; UδC/Uf`칷h-Zp@XXXѨ>\RZ ۱;3"YD|5 (Cɲ,鲪fKd,͖08,qɩN<$倦OH?m-hD]ό BY-~]F\LG1~m?XR!v~UD[uzbBG枣$+E xLw.oife茥Y.WC6oaxwhF>#zwlҾKz?ЌzΘ7qP;Ggĩ$q-lGoO;B.)k \a2 htk+x*]/x]e<Msfm2zj7VwJmn q~Fz2r儴8+3OՇO5uƊwf JvA~sCgI =5Tב[/]w@ykMOts&Nᡲ a/J\Z\;|\#6 On}\zk9왲qyA?=*lYmuLXӇ ΣF9'?4)bG0w{'dy1ž-זO5O%J(QD%J(QD%J(QDLO}IENDB`glances-1.7.3/docs/images/processlist-wide.png000066400000000000000000002636571225327237200213710ustar00rootroot00000000000000PNG  IHDR vCsBITOtEXtSoftwareShutterc IDATxw@K {Sꨫ(*jQU[jݳNpnqWDe#@!;ܹ@BP۾_w{@ @ @ @ @ ]@5&~ ccccccmACl,~1[GQQ !OggC\v#j'^u՚I{A#)맮IJ 8?OwWa%ݣI.Lz`o~/JX=}KXR6LČ{=_oz.rêG5("SmT4{{!I_["w^:˃ye AS,SϋΑ^w2nq0k8]_sdjq,5)*c$v Ga f@|U 8SC0AyFl{Tll=&ukmql) 7:M}60Y=PGm}̰2`bc߻.R}gg|ç~SSORiG9M?}chc֣lFkrfǽsbެq%3 V]S7<;ZwL_3WF1ۄ,Ҷ򰰥GrBL0@^p2,0p’+BܪBM~̻oEMSF Sv#3Ø/-g:C?>~~kѬ8".5qhGsd@Үq? lGOD)杆&]_zʭJ3W]3BT'/VJ\ͨ53A<.+d#,Tk]e'oXm[Zh275%rJxŬw_cIՕ}hwv]\u3xN]ldIz)&f/>2 tYrVaڬv]u+ \[hc:],1'1r~g"7.[{KMLVyG^q:8~$8Y{m}dbKO|1}גjNj̥WP$KZS9tkokG @ ,go@?=̳Μ?mJ}${/ Ql0{ {rB()ogByӣȒPHA~Ƞޞ7VSRuc?h$̨.QK`|kGǭZgc)tAavk#͕JS߇m|3miJ=Ϟ9i9-<J-]^%D}G20 c^eLjiVL !K8G\;7/996;cIp&ky{[b sǾ9mٝJ7C`/{Lgg&uDɍ < .yxz%'W|R4۟S+L#U6vM4ju=fmnw*PuD?W~‡;Sb3l¼u[m_Ը(PcwU~bBWEh1o1lFɨRU>Q֨Y\}b %?xEG,NW $3{O0)}7%|#PL?gvomx-Mu/$%A@ԪRH_.i|k(/IN$|4;S]|w7$9^S\-+yuqAܗ/J/7!KS?!gʪz=ړx&>Nt!y>Q%?a\Eդ ɒ4JOh=Y( Q]I8҉B?Dn܄C6l1a 77VWtgߵ^zL|ro :heGB3("KȔ9vqf}/4hu󱖱2.Rʅqv qg;vkMc{VS'DJpyN6""r ? M45U ܤDKW]$\:A2Nx%ڄ禛}]%ְ18 hMzWjȨ+Wz-,_5GVΪۘ--]ϴU&աl} r?MoŎ5ߝ7NxM E4jM;ZT%fp>ϳDQժ׭<٭~|rZ]*k#4Pgw~޹Rziz3G liӊ3͙ yBT)xʮ-l(ּwnEPǓqN>f Y~qwc9lfG6"/u0.Ϭo!y,z~Sik_IshBZ}9bFGy Lv:|F/^v(1CrnbehǕ{O`Fz.@? 4u9)Ig@Qx)'p^ qAq[ 9FĄ?W  Ii~M &u5Q6ıYaMAЙY˨T򛎖%7j#PV>ȝ?RoYWs٬l13"hX'Q9|'=/sh9g۶`wܳ[E\B6 BwukLX^ @)WA~)Rsv,q vG+ o[O 4S'H JdOP54+3Aj ~BP]LqqT9Ƀ cӕ#ǹ ~}QCh4C#/{e=/ɈEeCErSjnA{tTs7bvDHJ @?j7Y3i=&fǏX~ʅ$roOߝ5LU^Kυώ)(Nn ol_ U&[:И"yx򁚡Aɻe1@R?,}xq։X"'⥏obu-a~|WׄQ_Ut+*]۴TZY,#;R?U}ܤ o_5YI~,41y֕܋:7](R}dY{@1K#@CBBJEUAy΅r]!Uw;UDyI,|j@ @h}ST@bccy@ @|м@|Is3J?/@ @ @  n֘~ZoRh :66666v4Pn5p}f[?E#Y}8?OwWn}c{2^f|Ԯm N}Bg/zx>2+[sf'rfRiG{CFrSTs݁GJ6Cov͛ǖaqb+L&jo ,( +:SMNM{7PK][^nBx+9?h|Vui'4kߠYaW/9B+D oIzQJG)h3(eÄ@̸cmREdA 0)pv_=IWCR:O ý[{r$P-;1x>HJG:TURO4{HL~%YH3ʃGAxi)<M-WY8]_sdjq,X[Z4÷(z휇1{;f{ +.]%6u66"_ aʌb 1kQf/%eﰹØ)G8ps˯(4W$DA"f*_i?zs.t~>Y>)fm1=RIQm,(;ܯo!KvK_HC?9Xzi,pﳩ_gKJɪ rܾ] IDATrTQ,6a:9?Z?n)wS})WS{Ʌqv Q[}i͇޽4U ԧIyJRe˞avlS +|ҘdZȯ|)MmW/w'?o:'M?_ٕ")BXY>Q?Y\C8}ULID.IJ@'=~ \q>bެq%3 j7M~̻oEFMGQ}y/V=uaTvC:0M1 r譱;hlGOP zFxudM@V8%Bts9q"jS0bĞ*B|EO9rj#NU>3iŸ·/WhHAJN|I`^=Rn殞ywp[1q|_,IK_s 3*I'Od{! ʥb9Aȥ S]f~N*! 0rߜ6 ^l|Br)R,4TuHKU1˧463Ī+Cw r~QtjfL __7bV3pdvbjI)]7]-Ur) o[O 4c洞^*|7K^w=k6s3,/[KL]JZ_F ӌ^ga2MW&;K/K6ƸX e!mB$l]6@ cv^w_teDSWWѫ|[Ο;lۂQqnůVEuq~u1e}/l~n=ܗp{/$ceتFOr5+J#!նw@ Iap DYQ kѣc%u?wbtQY>iX> x+!VEށEWK?Gv̛KܥJ?A㟩VVO6+%U<_t(|'"3>_at'E\9SBX]Ahn\+ A $}w{()ʗ/* 2^R; (UUiWR(!\*0Jk=oAn/y2V&(mxR IR&-T#Lcq^T{wiqڹ*Cz'0֐TE}u?+ۤWp/*40މ37W:RwѳGwӿwdLoI#TJ_^;[-X38f/8CfPRm{L7"eڹ"*6 /ETL `d*/s,7z|3k7u-U73K"=noJ.muDA&Q^L_'m'u/2ðl q.\ZQ۔H1ы|_9jsaVIUrȎW~/! ;!`%mBmCs >> n;yUؤIV4e7$*auf԰Yw04}q͙ߛ7~O7gÓU+ Q?Rg3o"-\}=nZs,[:|EO4LNLC$P hS~uaG,+BF.g%_+fBIjiVL !K8G\T@^|!sԪ[)C5xgsgFA]?5ԛ?{J큋@ ? 3jEW# ߀{,3GqσT@|Q0f};:1[ eVgB jWtBxfܸysr:޴qt3NLsEYu՚I{A jy=mAR<>jч&l1w]h?] g?Vs]C<_U JssbY)\:(f'iiؽw9^2C =z(a-'z.rêG5@ 5bY=C`/{Lgg&uhnK% |Bi?_T+'`>e)}ED=xvT!@1[y-zoKeA{?t}qݓmƍ|/2ZZ4÷(z휇p6La#hey9Rܲwa̿t8k9M.UN'߶ V斒J_Jk Ku)~k8}v' DRMQ̸z/v5m ( =R^WK &8Ò!IP7EN (n$EB+$0_qy,F4a[ ѤbԺ[K^_ ;92flN#ͿZ_ x̠ݘඅPaF ľTsnl-=x77_IHsp\#z۟ʕ>%ɉOfg\Kg_Q\[^ppKVeJ]jI5<4 @Q9v6t= em8uny|iPw0 |j |cQ-6TnjyHAQ̛g\{ifRUګnlU4xbt\wfqL)Ui].R0Lأ&O۽rv vm`Ad,ӗj9ƤC{ʒ>mqp6I:VX~k)6$[}D15ܥ|R SS&TV5){[W7l-pyQVܾNuso[r#xTJۙKJsy{=@~GBRV B!㖭뾔GHtе mo LrSx1Lλmujb<_-|m)vʼ}% L5<%R ]X1L rKeI\#5y_4m>L3^VVFFn^ެA}|SxzŔx5_L`6!K-8<,l\%< 0vyɰ KTȞo \-0w I]c€OBҸu[;FJ1w4&U@44К]{oiMPK&; {v7Ct6k`ʵ=뾶Hqm&7.?`GiHR"/`LAH4h7d3@)|(1 f+i[c;'@tsWqd2HbWoN"(&GYgng҆|=oa S0E[R $\wwFޯ>Dm5p)NP{,1*ίK!,]zS_AKr5I ρ] ;|%n? t=pQ^HL{.BZz\̙8TI~JOMMB12iG|K#FjoM?gmʑp׭wy_Ü.Q4"ӯ꜇>?kN$ do:%j#gl;|΂]}{6ȹI!nWDݤcHxšj(&-A}|hgҴ?oy0 kM<50/Ma:d{rfWsf=h) eœTCo REMLZL dD+kgXzUfmu^vbEMnbhkO5E9vFxRuݠJN-S~(A;k9;n ;k4ґ<4]m|OjeǏjh=JJy T!LmʪԘSNb֡˄M- o[O 崦01Kfwؾ,66(f}WB:vߪ],=ibyp[V X,S.7=F:`ٙjSӠ}aYnd@*Cl_Q%PT gM&OݠT]_] ylp=ex ,p_=lqY}XE=ABL3zu6] ,@YOo:m Fy=Uڵ\LoZBvDwӊ;Zm~>x#z6ʻ_˗t"nʹ7 X:u1ْzQE\#_ImTJ%U< `z2 Oտ EQ #}K.M&hL}{ύJ%ǤaM-!QF* Akޚ zL {ε-ܜw{Yw僒t_YVéfNWi )(!<(4:RjѳvUkb1lM%Pv(Tߟ!;֚ʒ½Y~C>B+bzնI>g.֜zNg9^_Wozܜ 5BEt]'xU^JE=~2Ж5;.aeʫy9ƵRu+@"tm-lv&4n̨e _(m&u7Su|q_JV3M6ll@< /IIАQO'{2]O)ke⪧Ükf`lEZĐa]KN1e2 _'&J1y$K'3A/E@^;/©zvkoT&U,7"c߼0iXde`[_լefxL߷2AzW!ּɟ`2N9$fV(p|@k>xє3 }[t4GgySA#=RvYUz.fo{f~:_éoPH%WGF^yͫX*Q :u'ϗy߭h-G-[vCqDZsf-dmA+]-~]Cv|!rqgl͘Nj4[/)l{MLY & _t|Gvp彫n^F8[}7\N 'oMn4[pNN>eizKvΦW߬#d+y,( pKOo+W8R\?wLjreecGҵ9{q~xZR(A}b0c ŢmsOs3Νk+U{šv읱$3t2);Vͨщ<` Sghi v|Tki3);pu43fJJ\r#0lvRҜGxޞ\դC{ʒ>mqp6`U7Z 9ɧqg2RP/'Mm.I3U^rm;` '4gTǣ!/tw-;_8RF{f\0_9S3%ԪUń<@v۰GNqu_geaQܶ.ߌ Cz:YmJi(vGʻ94s[F:arAAʅϰ4+1Ӄz+3D_~'(0 7"R9nڎ}=ugW3 ˹ID]I\gPUeuߍ1w4&U) N}:g=^QT*S"j?K9RQ)fts(~}wo^9s S8u̬5h́ ۛ($TYwcw7-3;kt6S zFxudM@V8 ӽkqĉM{`:|RZtjn]g\>3顆: vE.VUW.*XvmZvW"b]슂(R!Z(* Š}wOɽg96ޣK?|))z,)C+=Ľ,.7AdD*ہ3a]; 87>r6٤7Ay IE"YM雄 ngX #_[\:d*$W=@\ZtHdi{bͩHQ~[ gKo>oFg Bd5igTTTT^?;R[g n5%JSggs`Q>H_eiߧebM)0ȭeYҩqE';x0ЖOxNTd=w+P;TUc]3},-} mmH.fދ<޴G^<j3O1 7^\y\jiא"Lq95>#h$^V$$21< ZX0Zrק<%PS?ݶuUr3y !en!VW䢊R6c a2?ƹKV}wCIa*?U2vtotlM-%_6̢[B_/yQkLJv@)HOs?R/\"0D*&*H!'T{(`owY>Vrj33w]&WFJ9fy]6R]!Lm]hoY ;T 夯EW/u[Tf5Q,:9s;{"{]a.ί.6t?klJ4*Jе<&Sq%7BW s0P(JMWeXMYr?5lI ]ZxR !~ϭ[C-T#1֓|o%3ǝmnFI+jhV\)@ \sh4$X kz5e'5B3ՉV$P;{AXT@&糒_dɮ=_/o+U_bu|9XKWW_7 >|nt7%BLW?6ǻ U*U8D#~4>lg!/7VeP$<sZ.0>֢cimeN楎% $XM9:[C#.EJx<6jKIx@]w^pb5Ȅ{ay<96&>+W .9rAԥɶkٸN1$jqˣT7 J8i$I;W| McU5bR͌wb3 @ƫDd*+yJ h@&+o&,ȩ@u jD]Q="$:m"J!Im'`59.oUVszvt$B3ӗ Ŕ2 #7I` $;& )QUʰ!5f{CB3mf3y^NLR KDÎ3󊅈6h\TU~ZT-:y9jQ4T_I _fΌfq__بU䀹c^޻?O[b!/vӾ]Z@_l'ߵSn/Ϣ|2c6\}MsCqmmggggkeHAq )cJnaHA03ka]:98 1p4Q۴.a> o6eLCsnHqiSPAOzk3qM }̕ <\^;*yPC=uZryk["TEss*[^4bGw25σ ңDDw;33۞Pml-Hʮ/iKʺusRЌ&6#!sn'r03,Ia׈g>ʐCFՅE2cND@(V7i*fMiel6nJ%Em;#gfmxQ|@Ms (k;v?)Z,? +%,1O1&zݧO2 /.bk{)`5oN[<{?} Ӟ\W\_ ޓk=t)pś ~`Wۮog 8p@ěz͛=AiN8p8p8p8pD ;Om2lnZȨSIx=zm9sfzQ)P@R{r2b90` &ȸbd_͖jҶISKp5tB3kju'mvEąݑ&ksyHmx PPK^SRʖNj9Di^ 7&SIe#4zۑZڈss"Q38ǘ1A.:+jB=gN\7E>H0 0\}Ӈ<+-{lHkDazl!JZ#&龈nxPGώ uickP!m_)>ȣ[wJKm+Kæ/ZyBx'RVCQx@"eF/TWpeƲI^_2u%Eyʶ629 )H/-ypF(+2%nw0"ta̻f*G ;'72@^r7^X|bILrp O,6YUAm+OM//(x[;# <*I9 %|sCw}Ft-O_ (3тg6WS8-JW:5u3skltrdG6d=Oϕ:^{rAa>^tR|ҠQ= 6{1rh?G<NZ5HE]7MDQ(o1B*STС[2xo5"f]ߢAifu+ȪjQQU&lsDy+Qףjfzvd^:cziA9@:ǠsTU(pD6wX=˩%K~u X=Y Q̘-^}$bڪY~/vִn1D}rCלV`jUGCInM 8Z7bp݋)ce5]/|t$};}*_!K\eʶK#.d >_d:ôC\Y%W߬~EI&菶~_q~b#LthS ǭΝO@br^[q.F$eh;~(>Yh$/?wdۖk~u+|X i&Vd "IiY ZP_4i2~t\N֫Y[Qh6yu_z >:UbksԠ.҄[DѣJN _rɶ u? x/-kT{oToAډ8%Ź1&W{BRHVS&!Buq6;' Q _a ^9+Q^ ͜b7drq]1A@ً+K-0ha zY7F)%VퟙeBvN-JDa:e^?VPB.aA)+^Ue%MYF'S^b-]QtL=^f-[w>W^\BƣW7|p#"rj-b@ ky{̌O[63!8YbCx-RFG{F]_H8Qr3y !eϋj"$%9cc˿OF$Q[ɃӬl m-@)dBlԎD~pgK Z2RזL펶QA JeyM^!fԔ"aaqsB%Qk%g%6~psA&{ d׏k s*;}:^PVszvu+PO@>*AޞƾO[ Àd`$\y9 3r0%~6!a"@Q91IDÎYͼV;!cMK20660g#JKV~.!^T)[XN+'hF/ ͨHc])堤[ٺ}Fx ,I =،G8DDw;33۞C7vm}YԓobBPjBϝM.[?U?.[ʐ~^|qȏ}o{=JYcN 1uQ6dqtAf% w>`%7<!V }2.,t2$B4}I}LUdwoO+c qS/)R_oAƾw9sL7kkQ3}8wR%\M!35K2~>e:p嘴[X*RwW]rwVn3bSva[otN&IYT ViI$Z|/?/W7EoM;e2xm<#LI4;ctT{sړ| ŚA i#sfie3?x LJ8ǑGQ*Hҋf@&\+L&j f3GaQ|"ܖj RRZY5f<C qJz>h Y:ժk$x.@tFk圌oVި[?0g9u'ʹ7l@fΜ[ 㽽i63oN-El>qx,c_;pSв04{ljª1]F*]Ypy(iXuW !\{AU[ Uٱi5?jB!˾]/r>T#މOeI濹cϓ&H"qiإE\\x'{Mp5G8pK@{rN8# z*lIUMN/MwBo?p Fm3,8}Ya1imq}my8p|ky 2H__ݶ7B7 zd6z)fɧY(8p8p8p8pA/VFu =Fǿͨ=xCᨷf;̚گkG+=BI0Mj5I:Un>R v_~)^+7[%G~ScO:a$Kæ/Zy0FDe9t5W8^:wGZ\Iw$=7V 1=@ٱN<-VMpH7K-Dg|y+Do 9r˞ޘ(l7Z*TU~*B=gN\7E>H0l{l ?`u /DwD)R&F@ROz]]vCæuGRlU9.Y8Tq], ᶸ^M% )ĒؕAۼ[_9#UwwR`=o Q4Z`'rAa[\|})| F\fJUFmW*癹56:92YEj,OslY0F ~%ɨ?wdyv1q6RQ~A ãT;ji;lѓ veKCdrE[CSُmwf/;O:}o7}-zv*MH(lS*%A(=zUHA((kS%B*'uyP^{XYyc E`be"$@$ B014}@r;_+͆&taL(-%ostfCЈ2>g4֤+^OFEEo_ۍ/$gG3iSC't)FZ7&ԆE' sYN,YkDcZ*2cv ZxTif9?Yf, /}y}o \skExj:JrKdrޛBR iިפk٬]-0y+QZH;(gUofu+ȪTUC4^4s~Evx)/ ^Г y%W߬~ߕؕS*?7`WdܧLxֺ!a z;]Fxl%jRǪ4!Kg Bd5igTTTT^?;-bI6~qmk[$Va ebDB]FE >_}S²~Bh  "fug Baczͻ̂d5t$>V-!8l.G^ȶ-kZqWh*U'\|/VJ d[mGۗDoSRYRVz{Y\nȈTM]κv"A;NIqn|l ǕT$ՔIHP:|~.>p>E5-WCKchBcdHEe@'v䓑F ?~#SMF ;.҄[ @U*ڂ>/ {u_z UC5RߗY鏮f}LQ/<`K0yi'5:"mO38+|m5᱑DPrЅXO.4.CQ rkw%Xi@gSԹӇ'?.U`GQ>w+^T[Qi׹}^i;G1(%qMxUR"Q6_!ѫa)bĂђ Ǟ-n_63ImwCX4Z+&ˁD##233>63!sjg0}%iCPqxSQQQQQG:Z~fTA41BʲjIIOz5krQEY)O olsOVښۃ s+i_S @U?4W_(ʟn[= f-񱥨U#e{Pd?KgMbJh<Ue~jh _( 5'!Iwx߃ QT@!dWRϭ[C-ϭDXPF>~+`9oXw7JU):F+}Xx'/{P*~g]`7oH!wJ 1VSV:9`Hb"PxJT ڄO+i^@QTj8yRݿEeֲ^3?׿'R7ZgqQV)D>.[g+vܔX {94Abj+@gPHv\IJh9tt'KvO~9ި֢v$}XThic߀T8rqnOjW_Ҙo5oWju$@:`᥽*?{z;er>Z%Jgg?)Q͛cJBP׃Nv"%̳Msil5GenP]&װQ w J5p5ԟaaM5LTT7qQ9t12$Z]~~ܞSlmk;mL/,Ie^-ǤR@(Go' `tﭗs!G [W 4wFF%ҭyz58vhtA30 ~ΒMYF!w+R!_ UVɌ]:))%X >ibԛh` ætA) c߻=~昌cJW3?aj66Ҝ.\,-HHiQLޭt}e7:r줱rݗ)Aq_P1_/A_k7EGi\1(dxUS =ō21HDI􃹑Mo0ȿ9P*L_ nf) eR~I{u~ʭ7M2*:O8H(vS7#7ΙTލ,ͽyi¦d׷[y-3oʋ?7՚MŰ48>[D p׼dmo\~}ߩK4q,8p8p8p8pńxz7[pdTTTTT)v8U {ujASjOk˩,4t9">JA=l]~k*AhdL_ -9-{l>R$5{cb i};@Z~ԡG j2VE~fˁh5i[$SΩ%A1\ -œn36@߮y℔jؒ(=6<.0UtzP+!ZƆ(Hb1j@髥99~+-}_xQ IDATPGώ uiL@49ewW HJcO;cb"Vc+i$=n1s=FYj!R>M'x+3}`7&ƞ>tzUJ;>FyCnkppZCM\ibj5I:Un>B`p5tV o\/6`eg!!9m AX[CUՖnY4VrT TKxJD5[U(/h1:xɠ迂.3T<ϖ#h_ol]~{AEkn$FxE5}\⣸q(t7KeÍCF$37gG/)MY,򽴥rNOQ)ra-X2nm٨^9{t otJ8lPG}*5|\cHُInTH^Tܺ=m9X9i[W8Ȇs׻u3>~HATYYP/'B;QeFVFoUIE0ƏZRm7Y Ӥ_`m9*m21lGԝ.y̦,G;}*d]J 4-Dy+QiO̺WUwQB} !!J4Xi(ȋ$69Bj0^oFuTb]CD@meJchBcdHEe@'#&H:)ֈsNn]r IꄋJ)7!lP'%x/-kT{oTork'$\Φ::4>(=r!H$)}^uM,\|^+|ziq&y!ddѴ?f߈ԯHVC_LRsJ9[l'ۧZL,ܑm[֮}׵WcA@u)w̍cUhx |^4)aHۋ@˅O-_[K/?`u?:76 ɻ~+ݟroSÖyXyBͪaLO(؞}N3nƔжL.(+I=z=G{|4sΊܐO T,y{̌ϮGL4Nl&⾯$X^*3/#~ǣ=.>RBkP){^T璒ªujU˄$Ɩq6]8r軛WJvGn Oi}#g D}~$eݾĪ.:tŵ\=tWNw.37_}wl~FM{P:~Ii/>L.jsR[ST AOkʤ˗W'̯@{X3DIUq ruNNy%bS16Xus'{"{][MuP!]HM(;5U-Tú !+= ,)TeI|֙N6u7|~CB cZ3Z瀕q;WnJ,= ;s kz5e}5bg%g%ݿrɒ]{D_E:N^%coQVv>>huIQV)DʚJ(i> l >L}R C48s*;`5'Ur"|5ioҪ r*P's]«QD;ZhDo#?d5E1&|罼ލ{xnW| aWc@67^l\c ͨ2xJ\Qxi.j>~3lj0%DB# 9<0#!T#+ڿ> G߻7k$1qj9& J>ɜ2wK{v]<3 2c~\O03ka]:98 1p4QHqiSPAOzkѦ4vih]ג+#Һv5ѡ`ɼbb,*3]#O/XXRU< EI>Wܱ_,o&5 c߻b9>fػRzT^ngffs=^Rrl)wIA38ظ6ʆ ι r?~$ጄg>ʐCFՅE2cND@(VoRo&|{Z[ҽ~IzjҘ9]d^Nu?QLpDӡOՏֶ2 gTل4ښ7s'յSqrn=[M=m~iߟE#껍< Vy[iݚ]GzYIn7B?'CcV_[Vi=lM,]|y]ԘuM5r߇ǰKNikjbkԬi&=[(כֿ8UnfZd4Yy# i#sfiQ,/ebF?Uygư4k qᮕs2V@Jk̸y>4dqC*hPm{u}fD1ꫴjE K/Qs v mY Eݡʂ(]QZ T^xsnK7j8Wi8s)HUv?ciL ˋ޸:w->d2x&?H~;SIysNsolـ̜9}A{{7"^ ӎm>>gƝZ b?|,cEƾvbea^;T4{ljª1]F*]Ypy(iXuW Z/Rũ&.gHC8wqM]_lAAĭX*EPu+EVWq!-N, RB$`={{ ;a(P4bd˓;(Do(\F_\kTa/_/̾@mo_*oi<|}y+Gn^9ڧ~axhkB@wzT}lO(v~WyB1Ҍ\wuwCD6?;S?v mr^SR]UK17v@TWB+?=SH9)1=-s|Y0`j@ C^bqc1WUcv71`P)Z%& Uu"0`P=jjǮH *6v0`(o 0` 0` 0` 0`2L&9K!}B#ŀAzm9g +Y{~ruH!Z sf v3·#$ |m#Is7刀ٓ' 8o\F-9o[ daNfCNj8IR*DxI#\m hSQWc 4+OX"D ;wL<c"KIg#3-&ֶI8}rVv#TK?5uD̼WJGED2Ԍl\ 4ЉHAAI|%n 1/Ȗ b.K G 7,x8?^+Zx/qyHyxu=~`<Fܬd;i^[Vm9ZPtιW"(HM}zNnnd3}"aľLc ^ЋB }0bvz*߽EGSكY?_bGĞG'z>-zla>|[vxQa a/ Ň<_"TM}`H殲n/$ڼwB,Qmu jJ _OEmC~q7v_\*G u@x) ˻`08p$^&DI]㋇^ےZu͌Qڸ߮Z~'$m5Dr42>ʢZhbCca~D A4<-yV']"O֦QҎ=+v\K @Y|Eг11]\%6zyn6T&w(NaO?+a>e-:>Tڞ31o mp^{jy_[ 9E0pۘ!wǦq_s0}g?$t d/o-iWOdHT:?1[we刦hx~e @2[2-z p mNӄx2 jgR\{yiJMLacLJ ٨@fjx{t i_fY5{}]X}-sd!ӎqx!wh~c~z4Bβ>1EϚ'7,YxHWgPz*<8Bk䩉jJ#ׇ,YH9NwCxd&v_֓]M *ɏt/Tؚ,q=LHW%8x b ,U*^bwCGi|%dfRl6!+cm =ܹjͮ{!W< $~<$%9oftiò[p +]J0tkK+L@0^2˾8f풅K켔kj.oY4xCmq8S+6[v_&ԕՉfSR"V1+zD{X+6tt u&5 iM 4H67BT(*h*iIѤvXS$dW뚈Iw>枍yZ5hCڅMR!+A ҆.#Hc b zC@P{wkl Uøz"~[&05!N:r>/jM{Q#tqԢrFڹD*t59zatA5thxYظL=Q—kLANك|%nqU#; eՊSֆx(PnFDwcΞHP'7̓rT ;hHe,)q~y];gr k Xu3xyE-uzM5"QӤSY'Ӥ# 5žI[+ik;9>5;ǢjYH6:p))k"HJ\_6VQD&5]EX V ,uP#_ljzZ7`u d ϨSmN/h£!ȇ$BB4:!t xd:F=Fƽ˗ ^5ڥr;e VDjDm,&xlc|Iwll:6CC0ƀEDr?9iʚ ?md';[xk|GIpr5Nq2271p'#J,'م~(/h#U9ӝ|LXA?7p(rǒAyiFqnn c'v0շt^WX)@/mp]lr?nf %.fl0X Fn C/v[DaZ~ljt-$fO{(DFgL>R)hЬ35p"NbPt؇ȥ#[~_'|ڮ;խ:3=O[IKw״Flj.0nQF(FT3@^d^mDL+<~%kvEvÖvu˟Y:esg(f]߲ [ /⼺*@y9~;>oA=j/y۱ QCzպ䐹O˳n$#cjS|;K%&1͝$RhOnB̼mβ5ۧ#o"&=dHT]H?eD]*+rDn/v.+YvfCGL"ri=rUŶQV[)2-$qt:_&Om=(MS<٦PQ#7z/SHP~jꈘyyr &Z[Faat- M۲>L zp NSKq~32^|TCl7ÒnJol tc|FZ2%t6fnh88 DπFґ7I{O%tI?!ºܔKcrN ˕K#K6y[_eI7}A!/bzR)՞n~3>/|IkB~OɟV"J ؈h3 )drSsY3f}P!O8.C斬>WNsŒ0Y.Rl*͇t>8ӕ6~3 H&S,6n_/8GDrn:1Sx J}pu{Bd2 ڗ7YRC \[XˎT'ZR3zƚ@|mUIg#IMCQ<14VigUQ&5#[7W <ȉdreЧM7,x8?^+Zx/qyHlI45O?2?;Toc )ʺ@v[A.K)DTux]?OH6 `Kǿ.sˊ-ᓚ5} Ym-5t6Px!t`[`>|(R4uWF$4ێ =޳6n쾸T7s ꮁSF]y<{h%u/>zmˁET5QN1VWuT/x:’?&:_RXf,*&f0DYϚ'7,YxHWgPz*<8Bk)K\d#&k8~&NwCxd&v_֓]I|Eaff+(l Ĝ|bWt\؈=hmw7UşBfjf)A&nRK'NoкE="7dr;*^4kq{;C|#%c.YtKn~5\!8t)]?ܭ8^#eWhs  m×>Fs<9/_qv#"cZд[S`x߁B#qU#; eՊSֆk~RFp;BrzG!EFyoFjrlӗ<M,onr)46KU2!kyZ'͞[\;jxX77//׮dVp%I D*I"T y/>spFfs6 j &| Aoqԕ߇p~a =Iy';#1\ڭ_SU  [X8u61l;EepQ$,K8/)Bq!W H~1zk'6ՀA? Ӗ))nvqmq ͜Nz򈅻v{:&/^K3TKzHՓ asJMHns1|؈ljzZ7`ujd>dstuFsuU^\vXT <+Tו CM<4u>R U NI^@R/{ĐrhhbU sEAP!GQCEqC嗀9z^ٕD +/׮d~lL~Fh'lsz)WD5A>DhWU4F4Z@=B1212](xo.+gvFTŸ8O“g_ ; 8] YB$=3q\m՝!8| x\[ ژ:/Yq$EGݬX9\?mC.J%|"Hѯ1(#vfFhAX.mZi};!s8uB'jٳ$ՙII* Iz^]Ϭ0մ4@pv\~)--&ofEou6:H< Tҧ HyG![x 7d}P*Xyv3%ez Uˊjd-fq%i82mmM-gZ WQʀ(#Ռ*TϦ9 z; F<k׃V󺸣ߢM BQ'-o YK'BqJFD ((Uܹ]׵6jK2NIPQk5?5F/?ohiIs0%ݜ?)*Oe08RmSmBKL[~^AUFhS̊1*eU%P-,ME̪/!. ]>?b$dg0`o hW߶0.nS݃tlScymeEOsGV2}$?\p{0Û8 p7{:nY0aa# zq_,qڮWL 5X )VafpnCi_'`rtGҵ5H\Klo 雸N޷uI|]Q q}1 Oߡyw!cyB6oȗK4ٰwkeGe"pr5Nq2271p'#J{@ߜ;x9H}fxZv3s82)VݜN>^&7Ƀ, u-;V Іw\,ϲm1sBmɲT\> h4hv^IUAIG V36nC7ˤRѠY3fjD{ŦסW+\F_\+ };kZSeg9Lޜ>O{o V@ԭ:歄Gi+' kM\KŁM֋ jG۲+A سu\fyh9O̺e#4s^yu'&Urv|ނM{Ԁ_8c. Yëu/у!sw՗gH=F~pTzh1FX(1i$B{raWYftMRD * I,KAcEΝMNr }.յ_jST)2-$qt:_ ='^9}zRN̺BהT{eGR_9r>Ռ C??;)*j:UCE)1 6Ʈ4V?Jr]*Oeȕ֤e<gԴJ|>Qbÿ Dˀ<4 #~rXC<&``Z FXЩdC& Uu/_b AUG^ .@X1` 0` 0` 0` 0``2y-^ލ@9ݜ5( 0{FB(f~:N$/oGJz/v2$ERSO*E28ñG'\P"ԝ;vc 1!daNfCNj8IR*D/BnSSG ̳?Wg07X4 oihRޖ%FyTA(QlXkՎv7Dߝ$NPwΌNvfZoel+d>wS:si8ۘm9(+ <eKG$E=WtI?!ºܔKcryS켝M}oU$Za2xO1Ȳs:FKJcf8p)a =YqCp4],]-Y}AGJ6b=qz9-">wөhH部Q]j/Qݧ[WnY\L0!r!Te 6O!7<>ozzTD$I@b6W9Q|/L.)<#aD#WGG/UI YZ2@(>fi҆U)j'0b#P?׺>z68F~7Fp-by6C79(wvt`C>L!0oHo0SևG'z>-zla>|[[Ym*n42/@PsϏȨȗH+okQ;u콨d۴upu'M`sˊq5} K8]{'^25V6JmUxwqLvL=wcťr$P-oPw Wp0z`08p$^&DI]㋇^r`eM↨ofgGv%r ^<$lNW&QB3"`<|'eшE3 = m ?-llTmmkk%詠FF Fb$sWY{ 2呍/[(GLiޙf7*<KA;3ٺۇTlې}3@[4BsK3u! 6?ɐ,νubcH˪G᧿\ga @,=W>u~}Bfjf)A&nRK?r ըZ/_6<-u03pGSʿHp x-7v>8}6@i}!^hL dxhl^qQ8!+_6p8jurVk_'~f'uhx~eCCY3CNq|@~z4Bβ>yϚ'7,YxHWgPz*<8Bk[jJ#ׇ,YH9q»n%;n7}Z,l]oLZ+ U _EbNn>_\`1+`BEOh<6_'zvN> :EO$US,VbJkL+uMDtUˇPnFDwcΞHPz=j[Ϝس­V!-˄F |2Y{k@nɹw>8 xA Ǵ>5e_$!ڎ&‚,Dsf֚*=t?LRٹe]/{V6l\/N俉N1i7;pz4ڐv~qTJ{PB˓,ZvE?xd}5b",֛q1oz'ge+ S/:>#3ܴ5RMoHGM-*g{ښSXJW~@{Ț~FTAM&3,@qz[/ ט(O;gGhh4l:iGxsc\;'Ҕ|!^֠QҜ7u]Q;~%T\zQ(GMiVd9/jN;NN|p%qg qoq6zOk75AW?eIC~[:~&RD_ Ã^Zj HcyI?W>8 +N_NM4 =0^N4zG]*yV j?LE&\O;Mm{T5yGqtכ ŝJ .2{S7bP6x놔|ܓp+T$"$gF=^V}ԍ Iu9l;gM43jуޒ+#%<":zHՓ挫ϑuNrV̯^aA- S,:vt6n¢22D% ѳvB0hOq@t 9NeI+>ox/$l~Dv"/0)nvqmq ͜NZ!򈅻v{:&/^^TiϿ>S Xl)|JZ?ձRW ùM$mރ QvȟGiE$=3q\mժ9;e8| I"y8 X;~*A@RttYJ'v=h;bWoj(4k4 ՁW͗ DZaThDHp\Y(U~,V^U!ԲjYP25 '㵭%7L+P XrQt#5A]|va"W!ww0 tzj^w[SC($2z!+ZKV}Z/{y?sbfOk$x/EQAQ\׹sUxU?O;EڨS,Z8%֘w^%@yÔtsRWhy=/ WM;Ȳ9u18peC8Ub9 g|3 r)^w^v}. x)-շ-.[7!T } ]w>Ԙ~^@w~џ(dJɌ9Tc\e971(>h ?md';[xk|;A(zV&ZDgfWKR{8/VdWL 5X )VafpnCi_N#`rtGҵ5H\Klo codgo:qz%vD%wo3 |17wkLS,gq~xzw21/5d\?%lؿ?bi'Ճ6U1K[hZVY%_"gvN6j)1WKͭ,tHGm|s&渫0:RNϙf:1p eRv @>6p` C]}KuB!&fhf̜[۬Ge9@GXxKNj*;z09dAy7C;./_1GILs'ړۅ3lۣ,hHȭrUdOYK#Fj$7d mەl3'p0:^M=R!\ubÝ-uȢ+?[AdKl[?7% [#s{O;I^u[rZY$# hRO/Id F"aC(T#۪;yJiKU5=a|q7^r{x?G;ɾៗ=, ONNVCǺEwҋ_2Hpg>(9AA]1辣 7kXh?ϭt?(/ˮd D鿮Vs~֨u6Sz~i<wzzٷ~n=Qa\}Ц¯;XH ,*&f0D-&jqCI73Fj곣ΒP-oPw Wp0z>);v@ht<ۃuI#Ѵ󴨿~[!0st\Q+io-iWȐTՇ6Z^]X0=6m;t6Px!t`[`>|(R"KO9Y$ _WSDNWP-sr:j*;LJ ٨@fj ~Xӆ4K+a_KwtB dfRl6!+SÓI}e`k{m޵گCIOf.?kɎM(BvCb mg rTCd< FŶ~~~~~kQ'BJ5{:PK4q݃&|8"qsӄz5t{z?u_S} 9,{f\<;bbO:FKfǬ]p隝ry&}iȍ'G癞%I7[Y3CNq|@L~W[#GF=dc? CSI]NDjsy1-x. R HTb%&էs+9gcwRn9^~J5ݥ)BF ԳGvnYޫ= gB舅W'9Q5V榽P=^ĝzs?.&mC ͌-|iKȕYvQhy?d!h3 Mzɷ6LKynR}PqeG56Z]T0^<|N_\]PWX5UVِNB;ڐv~qTJ{PBwJ;|/aW/~.6*TUkv>Yk@0C+=n>M3x*G ZM܉\ẇ[j_npi^5 weStV dܺh_ޛ*\=h_wqFfsv j &,iϟ_JoYb׹İqcE*WT/#۳OєwroqHPrr*繊s4.Yf 5VqMqus#- P+dܽ_p9y/~ ueƀ Cq;o<*QMb %@ d&p+T$"x/>0wc#ic htJC{U7t>R U NI^@RߑC*}XTg nHQ>}:6dW7Np}r-Dn/#ks+Avc&'":NqqG{C%tݬ=M57M4i+J="PhDoؚc?k&X!zCYiBeղrYie\g(# g~6q*xES\rzZ 9:!nYQ#sթkqkZ5%XV}b7k񴤾 Fixn)?(~ D%wo3 |17wkLS-]/r\}uNuw5Voam^9Nznh&u*}pr5Nq2271p'#J nVnsDL7plL\⭕of1f=4 Qvu-\̬A1R#uIQ:6CC0ƀEDr>n-2JV=u?ĥ]aGl%lmѓGZb}H}fxZ h"gR wAE.*..Eeukd,kbv JDJPR(h&Lϝ痛}s{ޙ{ ͜' UʈMA`agZס/滬rљ vnt6;6lǍ. B|E{-hWIaQ9;nqygBe|d^ֱ0?fKe۽@zzdj}bMW> Yv5ʦ'^⎸夝vfb-T[2bd XY/;p{_ּ)Mlei¶D;!1NJ+)$agR#X ][PZ+)C=cn,`ymP)Λ,=}TT!*\)NSvf;MG"!3AHq ]Ƨ=YORo]ҹz IDATg3V#ݓ J~hE+E;lI`Q,Q64BCYj/:!ʥ'Jx]|aVb V__|=MU~M'"BKs9v4Okn 9i.Inuu}QYP[j<&w)HC2ghm"*CybO+LtAltR,YW;3;^^zc Yrڶ*I^*剉]pNsɏ S>;YXdf6h X*y#D6uyj4S}iGqEOU/zoJ׿+ jjuI跞5Q?~EWDZ}:;~>Д$Qm#X9{Vy3hMρK> E纍3-r·.=$Q% 49;] -"v*Te|&3w}>ᜫϜ|xƫ}!kh"s_)s7lz*v7=$Vov57EFGGݷƧVcg$$t6 `"v-W O[G;_91A^z)5nX#%,4"ݱ_ Iapv_]wK%@v6}ՊM1LeAL <϶/X|Ɋu{4WLZJk'U(R~S.[=Q-~_P+ufrQf;_7U)A.zwư욎JXŠܴ)ZJUGo7#'d=k8|! iiLV=t> 2ǗNn"}C;'؛pkٔ*-@ B Si352>;ߗjdTh\B%$'5[s&fy^k55O "n^E$m ]Ui9,Y »ۗ[8s2y񏶭 Fڮ0'5z?+4n=Hµ)6<-s ,- y+%"pGRF]6;.F%3^ßi+}_3P'AeҫKq<3꼺񢐸 "Na2,uTlv:Z_s~jåU#F>p+._;-+RΒ.9+D/UR@yf-D"qwCOAT;_%aXl_, ~N~FW>:55ǹoSROn\#Nz_Adp4nrXMX%׷|qv\T,AWpA_-b6P)VZ=I5$6I4qCCWgpK2%5h)kuAiE͠"AkQӡ'^WɽjU[{*+)kX42P4byN )ۉ{K,d P k[铥J^*5C*pV*:JֺVLœQ}/(c I@8\Q[vQIzՖ~Oiy( ˿q6yZNSd !+!2tRE$"FyUkgIKjvP1Hv.'|뾄UtXTQHZfMҫ6;Y5yzsÛ'~zGRP!]s>z1b1W ^4ƩY^TZ#'&EE:!ʯ.). '>@z桅9@UfAGa*i:ͱG4{wkZ^%ٸz_vޫ#c27&#,fGZu_2N=mlF?ז|qW=f:ZjJTS۬1m 73q<_IoWq?<㢐~ݼ鿌gM-/tuF*Jd2 iQH]NڃtʐHh`F^췮+]8V3B7ؠ-cqqeеb,2n:?wHmvl؎ l$=gRжydqm~7jMF _(ړn9GE ,ʸ]fBrvuT6fȭU~uʄɋtTfǟ|6BTɉLhI'FP CEhx-}д£4*,=;w& ("ArNo;p*-|txAcW{E.SG?7S[rFVqů:؞+3_XyojW_,5Oieu/K{%:v'  w]-~,R~[{7/9??8p8p8p8p7ɔ緻tkjdܡ8pB>y,D}?}oY٣mسϽgV__|=MU~M'"ߙnHEk vfĦ;~d?([ xϚd,(OupjŇh}W ٖ6cho:/#~@{\NJ+KC3EKCۤ_:G ԍ[N6\TX>xѵB04XFу WXA.\JO&O*PcMZcވ"l1\+I+YG:!5\nrLtӶbێdcWeܾLJCeO?pݦ]2$jk+z+ְ \){DUI%!s|P[}ΠDUkh&Kt7|sAY_̯8%slܐJ+~d#`cp7Vluid_2{CiDA ;['U;j#1} 1%g5Eg xTIThA̤t@k%0ptg0Tsz[lK%$*Me2ǻbݥ/-̧P5Qwm?5 :,tiqDf,#F`]n*wU#)5(u{ﻗṘQ&4'#zpRѮxX\h.By'Ogs&Ig?<BqaNA|9ι%-D,{yĩ6$].<m5 gC-k8,K_Tɽ Q"s 0smQ~'oue~\FQ }r>s^}Mt14VWF?aH*qsNx/|{@d嘅KPC[]P})ʇ$}% d=?2%䏥'hc]0'1o%,"I:@uZslj^=-ڵ3F ЀJRL;Rz /ZCKw':Ue3% iGoeQGd :vL  ɵM)l2ب.%e?w!8{}k|h?)ܒYΧ|v̻418l@4!TQ5jϭFejTCУh1Q1.3@f/mCSEMV<*4IjuϨCb1P_Ht!P?Ď~bY؃t7iO>?^."y8"|hr3IU"B~Cх"l笟먂H ?uQ֍W?j2s|4 ~ιa/h@́W{irf 2+W3;^^zYrڶRrb&ԯ熥@6?'fWQ:cz5ĊFz;T޿!\$# "/_bZ/~_2Wm%w#J/YOn{{BQ0S4BRXy1ܳWRI*W ;R/(I-"fRIr1ݬnn_"`S eYSRGҎe z˗#Qoo?TAEO]Yo]^ԟ6M3^9RبpKDz/G<&$Љ^C!1AQcGts~u;9"T,8QM5.읤C50S@X+/v_/4Ko\/~]`LNdkx+&EzuW4% ,m͓*Yxf;,,;t>cJzԹKJFERyH;O}.i,/lAؓ) %W<{9!x%usܮ,T[Fj*M#bCrdTgwϘAntNZŏi 4y9[8\^|(6<3>nK&Zdӟ|@o9y~d/ 7/~)Su'/e$޼KWnK_aEZjnnZVe}̔ e-$_`})\zK)!z,Z<֌ c{:Tr"ngGN>L/,+zu)pO~oocMɔGa܅kQ V_KD῏86vx_`S{ = fUTTb,5 sxo'YFg@U־'xuuѴ" =O9]|T)9NTiDAu9MBC77MD27Lոf]VgT jk($״F IDATdF|a8،7kPwb' qX- i["Ja:֮|]ȭ(N;^K-9rtvGֆaXL c}bdzN,~ΙQe\;h:k OK7/ٷMZV?Ϟ%xݾ4=a6H? *cIS]X7yh+]?dBE DQ!_$eRbˎM' f\yAl??s7mƢ;LFM(ZND]P%evKۮ$hLBzz).@x5t@W꫹ 6-kJjRGll_-95M?:^ ɊEDueueSvGOqk_OP01ĊT mψ!W?/{k8I 8`J(RQFxW>?XצE]K?:#]P@[lF:ڭIElHBi)D Tʫ8@Ӣ%[@DNe[ ͓84%JBETn,C et?jK~^%'>$`w!t@"qwCOAHj~icsG c$uEяLگ-)UR@y,lG;WRFcib׋@lӸVտ ?~Xr'~o/mFLhqbQ(`N^@R7PN%WM iZ]'d-fF5O$@3B S@9y~jR qQ HX-b6_utfinAjg& eЏ6y5n%}f.ղx՛ZW~8Z^;Oq]I_ʄՠP4bvbH'jZ[S /- k[^`ct@Y*pˆSRON cםVC* fJ٨bFsDmmp++9?u~P\Zpb{ver|PlƏˌjޅ SJlU8w bI}PV'}>me@A PPҳVld=X:`$kbK'BH?2v%N8{b尲"'+WU{Dj~SZY7B&B'O̦.r OjPQFYW+y3t?vic4gy SGh^<0,h`D4Wo\cզ$=5wplߒl\tMf/Oqp'wX G:j|UGDg3rfʡ2o<ÊO#l ,zgА 0z#/^;hi)!RSO fnƴQs 73q<_+EU=Ncn8n#QB~aCwnç2N6RiC7ƞ<EDPtͬ?2ڑ4O{씱4 m@|Mg˫׻zFf@s Bn,LJMqu0ѳtquP+w>FJR? 40uA|ZmCOdtӟD?_̠1/zSP6ÅVER=s^?qg*w/Xl ,bXYOl~_.nL<#]7,WתLKJAevg,@dG[Q"2.o9DiU@ͼY!TmBCWYȋC@TɉL(z# =cAzȤUdK;&4}襅M; KnEΝC(`e>H,\ p _Fl;i@Px՞71ѸԖܻktͪN8e}#a[$U [h]{:RM}eyJ.C%@}Yڣ-yRC([cŕA׊#IEUr.}5Y ['zֳypD_iz4Ώ}%bC9M 3Sɺ?sLD\:@Y߰RJ_ub&F6H_]] f.CAMaWDw 8:dKÑ!+p7@(<"U- !] }k7Au_q@f$L$F |GF*s~[:y$&Y8p8p8p8p8%L8]ß1PEEGGGGGM7'Łz;2"*Hpw-{n?4ǢO $k?sDG=gPDt%GhwGD;JcVS(ٴ{2Q"O X|b?+Oy,D}?}oÆ~&jT~"2)TtD^G9 e/l#~d[)|%_WX<;QωF^wx|ZG__z^X_B_s`5l6U l>\z:?\"θDye{ԵKDm |R;=pv+ k2VXFȀ_'^}'WlbRX*PcMZcވ}"l1\+I+YG:!5\nrLtӶbHQn}~%~ GI8]]'xA"٫ ^v|ǒgIOl2h&Kt7|sAY_dllHp 0VE1GƸŊO92 AzNsxǪ'% EW4pT]n*?T#)5(kcgی`E|_Ex߽TŌ:4y \!3)0Z &$1]w >$]c=?b`ݽgKe)Me2ǻbݥ/-̧uF}ݵ%jY`iL#M6.`N|"u -my'QrD 0l6ڢNЍ7t0Nt>>\փ򮦘vƳE@sp&;~>CTm͝3qHwMb=3q䡨 릆p c͑v8Io&dQMk'Nд5eu9?mIM=nX'`٤^¸ZMtUЍەX(u!B.=zN+KjjҀ[]]4-ѐq24o79ѻ+-nS^-_@zUu#ZNqzpU1 |l"P-,\:u"d%:/% $}% d=?2z"?`܎! (wZD6ٳsAg6h[>ptoOWsώ7+Y?tDz~Z@YTQ//˴; ogԵը[?ʌ"@$KP_HaBC Aff *[>#!V)AM\ե$5v"h&EyLT̬PKPJ,B|z{SE4p$*Y?ߡBH@oysu,.ʺ1p'SMf~ιa/h@́W{irf/ܮ_ep0"ll<~ѣN2fQJV>?KǧT`Aet~C2PyV[<϶/X|Ɋu{kXE~IO2pp}nzDi'zLS.[r-J^<)51Ȱ1i6?8!ق+>>߫IU{;u7+Mo_Oj7kc@WtY4$,A߸^YNu"y숎t.y7Gd5YlctI׸V4ͦ9naiB" 5~/G~,$_!)QutZQ H:T3%*a1ϊ'neݧ_;FH7UKUd0Ks}@uQA6T)vb&`0n\Ϧ:==כR]bzXqL˳KW^7+B6?Ȩdݙ;Ά Y;1v[O9޷!VCJm3>))ɇb3S?j3%&Zdӟ|@o9y~9)>sO9=ܝ8aBHMi!'\~:"CmU/e$޼KWnlW>Ȥ{߳%ngGN>L/,+zu)pO /yZGԷ\zwu97^5d?x80(x}3 M3 bV {?%!h_v2Q؆`6wᚥ%_u T\o{7]WM >Nnb6T'r/@T۞C,~^p!5'kuq}9:@ '_ě4-J]ұ5IA4TQ($j?gu[ZrohW^? ͓84%JET~Z)#bI+I|irC2m_y z|L>+2ha\美}8䯛W䢭KO0#bs#DB"?r} 3KC}_OSc܉(bg=ElfPYE@|z>jY>nToj觩JE?~䃐iʄ^ň(˨0UGvln:"bJV&̒Hh*i nh$t..'_)b)ws'tӪpW89ժu%e| 7,Y5O D@| ' jZ[S /-@mO*MJzkcxuhWF_gUA(JyKTViƆP,֮<zuz%4ұYn?ȅfXCPAcjTj_;OmXR;`meиgJu[Z |s?[}X1ǹ Q@jGtUWK𧐕:YY0wވj1LڋOu1/|^k-?@^uU)f \f@_ɋG$H;o'#Fh&W(~É9/y=p*i\e4䅨R@}ɲ*f~ jb%+: d2i1I對Aٌ@{+uG:EHjAF(fVVT.w ;FH~FN33N {ϝq:Iˈ=|eܿYY'fTMܦ7*ZaU6; w60ZT͂ DfnrUA[ʠ5+Ng%=< FAh;& ,{654L&,>0;ba4}J8pA=aԞ#B\ߙ}7\E~z,K2o> M8Ayo2KEüGf⠸[p'@TQ)Nbba4meٽf?8HqQQa$>{ч1oD2}o^ݩ08p8p8p8p2d2 ONS[#]1{R{e] T&KOUDȸʸ{y)W em?t 2*]GZ}fyrѧRc/_|Y&Dt%GhwG[lǞVgaPjv*ȘD޿z: wOD1Xf?õi&q?}G IDAToeF+l0{7'KmeAyVp>]#^_eҷ6B'E2>zW`/.A|l|fXu$֨*ICBkqY\HY']GFΎwO ݸ5"E3m%C._+ִ3s;R,h86/Fk4ޞټ&hS4}5bg#25ܐJVu/Qwd^\tɯ_Ƭ ߕsbo^#zr^4t(6= 2=)v@qG?Z:}hE~MJ/O).; 쇚!.;ӭUM":\vkaA:>o)NGlB׾O%q-Ȧ^X:yщ˻<%<@. Wy_|2d Zzyrtt+=Ӛn;tꦅyZn.kvTMM*;J_3e%.#4g++~F>-ּND~E'άCmƊS(kzf}Xd15?؞ Ыv-bfKg w9\m[s.KnE!L4j󘨘YF3՗f_,B|z{SE;?KV>[JVpDH7 BnɦK~d]8F۴Ӿ%܇sn?s= Pf?g| !EY?Q]Xt%g{U]s|||||?~f9/XWnFds)|FBr@gS ( 6KI(]Dy{m !Kͧ-glu[L-J׈пU+60]M0%hC[7Bx-߭T-V4;uZJ.hӺlZ|jJ6G6@@To0LJa)@(Ƿd1M`6zz߆ojP22z:fqhsX5vi#2_oJwU" sߗd?H `_Se'GF%q6|W ߱)Hgue z˗#Qoo?T "d1?iڑ6{ʥzRǢc@1׮NϯS_Dّ JG]5>ЀԆ8O}gKqX BnUE9p߈W[nGӂ4ϋ0D1eqo 9Y"9hD+2~jJqmWԵT*~ck*8begkև.sE >tó*T,m .Ě;'7On^;`TO*QuO^\& ! _<:iΫ.-Eʉ{ψre k/x)e1&v=mՙOx@]}@_{\~;$|~]Ay,r7H:viyEutq-t"(c44hPX FLT-H];$X^hJS+waqiy39ܙ{g*u[\c$c-@>5:zj^SO2PGqs 3hң!WrQ W-f8C/|S Wn$(_>]~ NlG_MOmÒʈ_Ο|_B^ iiT.od$T_Y;$`P;:W$ =_YNTYq3eWwMrҫLO{/EcA5_[Vۗ22Sg-ezf74q"on[7r=|?ke4דׁ͍6[%`x^wZ{ :4ɝξF} ̚|li8~[6n!ɼg%xGQ\)Hk6dEeecccñ4l9iT} X9..,4-⪢2}%f]O8Ξj6$J񬞸q^[YfjP.=_НOdcwnFX8( +OۥylܻwӤWF3puҦᗌT{iml)sF&w}{oUk;yWwMI\jϬ ?1u(H/৭ץUԁSKA毚e;D5ys=Mq\jEt2}#)0}?u;f`5.wW#/ؙÙ#I cB6 aGJUӣt}Z}|b'%57r {ܙIޓ{7HR 5*}'(Ҏn=kaLGn=@΋@ = GB}:@ ;%[~j4@ @ @ @ @ |jةqm7dTTTTTT +*ćD N| tj'}?_" =6\w|#BUסN0M1cGĞd\.:>nӄTa>+掷ê3c#DB6S5@b/LX#8XOMT vβɋXg  \6rpyWd w! 7k6eOnG.LL\$¡Jo>F[_E< p1QYz_O[֑;PMy͞ה%_>7Qk!=Cw emߎKі~iEnD6-hɰ[V7cՊkkfp8|pim1cZS@y V >!Cu:z4Mዻ9]aVWdbLMӬ=(&C(*JkX3ǘ>$>XeXY!{96wh4}(ϣ*a/c.-E~Gl'+G.#|N^ 1Q9{4mgC\!L:? E8_l+7 l.dhCndI|m~@_ 8F6sƕBn⛕uqj$Cblʬqb|/ٝ,.f7EjJ,ߦn(j97"`Ļj*W ǣ2eIMA΋olJto]gŇkXK'I ` w0zl `tgNfIk />+V_f+bW^KVuɛ d0ᅍ~kBcI\Ȋ7O&ww}4e\"q %*53Aķa ǹq4'vtuh~IQjzBAbtf>[/-FR㧵Fܝ {DF';+tC{(>m}] JkԺ#G'SAnLFa$ᐘԈjԽ\VF=$m q}b hpM,5$*?m[ mۇ -9m[Tad!|{j`~{1ߊ+C?8ZF˧(u1wrqQ_;=EnmKwG[Z?N+ٺ a<~YQQ杓!nvtvĹ[ZpB&5ÿ?,H˞$Wu>+8SMt*Y' gm8=x{3'1t4Fy9dqݦ4ceG1krsNC#tRM'En ~ [4Jn;g7dt,<-E)$7빯goLi :];_;A3ԙ{YjOi/^eT=z4\DO ;סui4^O Fp[%hfsrr%EN}a:j~om}#aƩ=V:_Wfa7m\,g4~ CTPY^|iXGw}sEOjtW>yFƷvپ$("M=YRZ{P~wIm~óؗU m]A^{|[u ny^˛#Rޘi\ۺȬV̩jKjeX(*]ctoKbhTq pAы*6@F8bWC5>UR_P ;Z}kCfdmkWymQ%qN{; ě[>Uڮ$?;51 (|E2x~˨ֹE|8pq,W;pQ wwڥE?SѱoΗ=10i*=˥U] νuxӒݻF>Lx_%}EU0#!.{΃Vz(7o 4v+ra#.(dR1T,T,&M>GdG{Czg7=_ǟ>eJhR%4Y*!_9M^ٮj{5R^r*xo:zZX]>r[#LT aCy}%zkh0_2K o=X  T".=m9d/']/'MV,-rqS@VӚ;\^u#/mL,U'GO"禅T-;K,"=}';Uؐ/8L_qwQPr";TnVwHtնqG?46.,hKRA10" {= %:UPDnTvۗ.'`ڀG+pKT_UaE51`5IgaC{*=sqd^)䈤ebH[$H=ƫWŵ]uoItDпZ߶Dq />bv=?ejG|۠_TRc[{]ޫYNQ,_е2y ~irQ W-f8C/|S c[CF8??јڰНQ,*ccU%H_Ptas-΂K\c$c-@ijbj,%LjLv b ɤ6B5A E=D5̗`4gкGCݯ|BдjRtLfUi2|yA^WT"ֵi|mXZYӴDYK̯@շ1*XҊrδa_Ӹq¨mᯅ>F ]2SHIn>/Ȫ$4Ԥhcm(aT&鵨/1 CׇcE¡rFn[]^ҵFZ7rnݖv86'_mL5l S!%|cb9g4GUrbDYTg[h:(_R83yrL0 >h\:cjbi?hU5䴸1wlm 'qL*F;^x6gRa~vj2c÷]̗*wԴq$6ʀ5W?(NT;3t8z$ia \h&qD7 p(sC C%{ -?= $TdW)`tޗ'+6}Xf˟L}03DB{LP9>a>oaѾw] |}got%KxOoF&p~ѭ}9 ȭG_MgHs՚㚾}pd߽U ~>˯)Nz1U祕˾9A\XUZjW4 IIjƤi˦IP_v3|sTXguYv"KRME`DqL9xƊPO 2L:ͨM 3 =3W^fu×]>|ߖܤw&@ĺg|a 9q;_b %7eL Ԭ 7OPm6ЕoD׳-uPN? W%DxRlqJPAON|]`ֲm TS)kK_D;B=a6.sz$dљ!ѡ`cFvë#gXuԭ\!1@fucKӯ~Z-C_)i޷?qɣˇNBq@ @ @ @ @ lөݞlψ(SN3xƔvسsX;cIX{7$ZxsM^?KdOs,׬Η];0bz_7Q=dg16n rD{\qkY.D{~Dp1%'Ug\9D 6 A VH왜b1~>p:e76]e4[hވKNՔeMsFK>>ѽ|K!8MC2b jKqyilm1 z?u}9aw^׼ Nm?o (={JIyrØ솣@{%зb)Vќ]M89h:c8n3b>PEz(1^.7Fa-+/r%+ZUqÄ6 %s5"6MrչwV>r;{ڡ_rd(jWi;ʍ'oȌמ_j8!O SzH4v7@!> BuFxE $eO+e4[!o=+*ʼs226͎@TE"֨uG~;FOT!>L<|dmqoFڣըg…cM0~t(߽t=Քᩳq/1ι!Ę;yB(| EAm@;&t "]RPݗN~^sHIÇ: 5zKg;j'j[;W ;Zߒ&/ sE\LT\*,/[+K;1%睋=&jWL:wu^7KNJLޅ`,Xﯝ.νuv]VΟA%e7#.{}YmI  @k` mD}^0}JEe4nO_,l3Cۘ  6 \*Oj21T-wU {Wkkvf:^q"`ѽ. Y?i՛4-7͵;y/q<֍-=McVju㴺;x;nd֐6ɱ@6iĨ9/ԤG^.V+k9pjjZm`?l~9ˮmXZo|(,ir4JbНQ(>\+cZ$J%3 h|wHA}\ ߊCeW5zhvݍ|w]KZ߭n]IXK0zIYƄadk jU;},qkjk6dEeecccñ4s IqqUQaY>oT;|~\yi k+Ҽ0-`_3-5;@EcǠ{G;L\`hV.Z4Rڊ0zqW;h'Qg1[YfjP.(ɿu#VVN|=؛y >΢;- Vzp1QzLR<6ݻiw +w+eC;lVYeAUX.^ñֵ4M3ugHG첗_C8&ΞsF3xT%W]#h赜t >Yƒd:ٿؼU*ؙÙ#I cBĪn=$-[U㶡>Ցi33dH&lv}iG[0&#M@T E,_Wʽ=LwݎXMflvh!@ tbucKӯ~Z-(E @ @ @ @ @ @1vfV~D2z*lyF6r~j'rDxϊ؈=) CԬ\6r1S7[. GzZR;yEzHkg2E:4jiGHvq=rd{["SXn]{D7m,Xsi;wy " o_`:ìkn\ Yi]2b^>~aF[rqPEzH̞3Wur~G5qǸ+pۤQ_rd(wV^ ]cte[PDבe\ ~Z7߉/fv q3k? *G}[1AP)bZwcD`3:e6u!iksxTYGSU]MmOx/a+b1 *bX /{^)ٺ a<~YQQ杓!nvt-"(xmɆEǽ kv+kG{h!zOh`H-^n ~ [:FF>y]И#ǷL}32/]Q]J7K2nn j13_8b\*Uh^@fV>  6 \՗פ VW)Ͻ/S:WzڛR;ɪGnY|JB- 8;a 9tL 㼠9qaA[ j%a p\.meֈ][S8Wy[`1HZZAAi}LWktSVzzڒ8AƖ 9t7)y]QXƜ`t KZZX+#*9c$G.1I풙FFLrK4,D5<^0AN=UΊC+%VYq3eWw׆ɕ:hCf/1VUƸjie.Oβ`5P,#PnHo5_O67fuuD NkoX[Tǔ5}iѝ}Ye_q&+.|-+fzYڱMmG8o<'.oVbCT*KO0)t?ݪ[Q3N0=J]ƽ{7Mz.6a}esҨ~=r8G]*|1`Ou"uѢJ=x̓u'/uoչ|7u ~ЄfkXbӀLD]O 4ȈQ#j+.GtU3r/o]cVb~nn=򂝙Q: L=0{.N%uޗ'+6}XRs3xف e߉iG[0&#M@T E,_W_YfkLl%i77Ge+kS#ΜM޻DR+-^5"46$NjEHؽzWbЙ,Q~''.\0k6oH^Ⱦ{|ܗ_SrbF ^nkŻ"xd@ @ @ @ @ @ @ @t(S`U1M sS Ta}]l2\kkTa>+掷ê3c#c7 QNsfjaRn weU(Io\Y#̴ .{r;ɻ\Q;2aUx!ATP/zxX01qu N+]s̑},u'W,G/_(Ki$~[xsM^?Ke0^QMy͞ה%_>7Q ysPh=g΁UW% -/.MG*Rs !=Cw J;}ѹ|bk}O2k~ԭd{&ԉxrMi_^(0ykG_nj]-Zq2pֶۃW7aI''^-eFKkEޯwxJg…:ÑjуѻO^4fxYIDAT:l^W~\1@q!Sg*t1V|4xtbnQvIo/&x?U( aQS( *x|i'փ+}{ ~tPv75-\lu{rfaSɼ_Nݻ^ޢM )Uw dUWUzď#^_>%! ^q"`ѽ. Y?i՛J ƺrxY}g":~g49S(:խG^.VXp1VPPhb=5FU}^0FU~Jĺ6 mXZQ3#Q>Y \+c4- %3Mq&E*x{m;U E6_#diV$ =_!$EEzdI{|Δ^5_˹su>bw[n Љ++*tc7K55j0&Y,J,%DwWi>$n{~i'{3_W>?.J@uLi^G^h֚]P _2ӡ=|k/N-Tސ0zqW;h'Qg1[YfjP.=_НOdcwnFX8(Bvf4w1džcKh6 EٹˋHt[vpa9nIW d.^5lVYN2ZTyp| ّFst610 U]&x^Wu#Q{6}'5NN6iGx ~5>Y.^ñ7:BC{o$^n &36|ŎAz;3t8z$ia \́QR= $TdWنUvtE_lc ?>rd>Dr^\!~Žuo IIjƤi˦IP_v3|sT=QffƑLp3+Jvt:P&B!u) te8{rĠ3yn_1HxmN\bE0zOض7X"W;67R#~:|סcIeI`2wE,%$8V3W^f @ }`9^w F#@̢kGLkr#@ Kˀ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ PR:ڠmG%_-tQ#ƱK%RӞ. M>Q;ی[Kzo~{eC0n$pkk7 ="Dž`F.W8n@-Kv?8^ߖ @2[x WxY܅e}6llR㸤4TqgK8sc3{8ԇ;ZN#аW_c6\Ad4NBs;eSgdJd>lD6va 1]^DLg?7gtǮ>x:<ĶyvmJn&?|N5}lWGlb5P+`ؙǶ/nE_:=ׇ}E5:a垐S&wgQMo=o%; ;vޏO Cg mp9cgÏo]՚|ԮOW=~ǭ8p*<-~)A5]ټhg\,jN!NOxl ߂9nğ_7f|CU8a|&s}|&,Y&~gv`>lRR7U3'~EMM8 zq 5q`W-v^4mC*-$+'YB^nf]xĴޣ~ڟ3Ĩ,{+2@+ϛ4ĉkOU.1+:<7"dyp{QԭD(nһGϿ- Q˔ *(?ƶէ(OWL񧎲g"3 ΅4>M{TyKq!JT/M/f|v ELqD_G'=ޢ (]+~!.)T`?Qu EnC0DF7O[F?DzIr#..~S?#~(ƥ+(F$ ?qXm(|% Hvh`͖ 6|@Ru5EZ5^Hr5gѬN^/K~bB阎48: ]j(eSq"ozI\Ic7+ +FT SB9+#E|hq)ff_+z eXn֎o_?z]8LCiZd Eq:HʲK厐g\,)P.nejBq^NdM~W2K9r?j*xuMzFDtx U(y1 dʭĹQRⱿ9 ɳ%|@0=W+xͶc/gexo8ڲe}q~Ԉdİۖ͂5NX/6l.fzTFd )d'zL\s .*4[ş$j+@DjI??(*wN yo>HYXȔ*\&cw_SD@ֳ%g$V$)n-į.#Aʉ]Y"hW!AQ!A3.wl8SWj9[{~E8(n$Σ$W^-iݠ^na@  *@6"$)*۶(Y MJPC>>YٰNJE2_|}F䬽،ۅUrΓJ=;Yk.o8Q<ژj`U8X6FK?Ղ*Pkm2x8` Sk=IQ^e]32#QՔ ok?&XVļx;Հچb wuK xw7G'>zhNyy_K*'O|训(H,QqGښmaHLjaS?χҚߕիJ8&Zj`d^ffWތ&ubal<|lgFb5%9VIpQy~^Z!#L .ZO \Nz4 xy.&v]O oG'Lqn}{OeaȒm6ӥbFsפݎ;Lkk¦ĉ¨;ɂ9 TFR8~CGW' N?|=K NS_- F n7g}AI=t$ T,V=:20?o]-{J 0mAi!_V]+lB^&ћ7{f8CһIPw1NOSD4NGve߶ <|7ײT4]T]t;]<ژI+3#Nl=[1 mH?l2xkض!&dOB4egټnxTٺO?'+}]U||Y Q~+ѧգF71&RO@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @4XQ-l2i"y/;|d~hKб&uՓJh-O^ =v1rRX W [&LClM7}r4׉^暘It$II;.Y\žr%ūs 9rMLm5Fi:kF_T x/Ҧl2=g-<ˑbm[JM/~Xs_{t@b*h *ˈ~x!|T`~W*S ~/ڼ*;t+RZ/IA~y7M?+h0EPM\Mو iR ;UDqqLk}ɡAU X&l{/Ks{?p)@o;u5,`@&(PcoTP.(膓iBy6ג@odhڹ8ДpBf_rv3!CpểkOJ-:9n"[Bn)5Y>`]A"ݺ>^җ~i)OS= ,&WPbthE۞T_~KЯdҳ印 ]ϕfP,AN@[=NJ~mז5!TdSjD@R]éNI˾.CL 2U21ZQP/W HOdrͪުӏSEl=?L9b)d$}|hN6Zc28$ܕtmRDXR*b>v#_A~5ڣ/s_Td$e$'Y5"TXQ_{uYE|2 6ͼ[GZ\Xd%=.IrA >&&3"Aljаʖ%?KoTug7m (WR])i`6 m'2 S܎/o>=dhi؂?/͢4$IAT$¢+U Q=L4f]1S]5ݿWV"0΃Z^3մf4:QhuT9uҹ 5Lr5.;<=Òoլ^ 0F5'ze+?82:$4z?dļzvۼ$!]RVTdw6ڞTp!sswowY׮Ϫ펢g>˨nҞ 2  @!_!Jq~P5ϑVWK %Y+kw$;g!{thgz+S]s&UVʞepiq*#S>REp01"s'5UQ'nBC;pCNfikWCo5 #=_\T+!YV;wtt{~z^+1g6lډa~uڣ7U jDZy=ghbر;I| FsT?Jd_LvkO*i-IU'+&ӴC[ I&z|%>r݋G}Tx"㗔 ),-'BS"nL&$2 4;} E]nM{vrM$_MڡųfAj (|v_-#M*${~BYxNc{Zujb]`pp4zjձyś*lo_J5?Q rx Т_"UbѳYLAvV'XU2^[ƤJUb_@q6Mƈ9iiݻѥ&mўiܪiݽ ]pWj #Zk]ݮɎ% .\pOx=uHM?:i,W^GqW>NI-,MLS&[rQ_ao|W+{_ dlk>sg֯~' wCF~`7½1]Myq%8fJ_A'lbj c<|y]}&:w[#"M^C,t9_O1a~zm($s?̺Ҩ I)\U֦XUtH-'c[McCD/+έjR?&Λ4N BDLUǗ8~x#Qnθ&󳢞M zLcEc歽^ȕ4sxs W?vS3F&qMm5j,Ѝ/:Nc-,9d`W'v+l:֣TQ#ƱK%RӞ. MI젙O_S )=yL&H^_6 TBﶏ8u1^D_S(.NR'lP)d 4NIp:Zmِ 8Ji"8b~E$ՑG7_.i٫c+ !^&%_>#?1gp؆ ٨1"Ƚ~{1A=x,1dj5Gk~!ֹ\ܤ3/|7sT&Hd٫̐Z8m@G56/<631ФaxP5VQ"[kfxE~o Ӥ2]EwZi*EV_~%ܿi"~+r2FHw˸c>rxI. w*bZv'Z,(z?doh$W =p,숳HSTr>­Ux~ȱkpӲsU7NTjӍ|98OŗUen=?^3e{;8>y 1` Ogr$9Ww%RbDa>k^VGvDqO^@P>IpriyZ{fŋ]1:Zո=;Х Ho@vb }.\D!L\{.IFm̘ͬK{⨨<:LgP%R4ٝY |O۱ħY= krE/+??Z%45rny>f#Ey|%\7g4iDW NBQ~v\HPRSzam 77lWd=!;t'7e:`҄ݧw`պ1>j(^֌J tP 1Ou9j'2OvTj>#MgMyˏƚ_6Ց1?I//:~mkpLuo޺/v::n]z@Pzj|s'gX>wּe/%|:~eSLҸנNFT~kk<j1zWxxxx_Lj1`S͓ oy84uƽF}ٺ8  [=~QjGJAM*TVՙR3@nɋEgt_gw۸~Pײc/,僦܄UyͫW}K6x0F&ʏzġmf9ĦGE鯯%а>)COjte()GuSs 3"/_JѰs4ԻJ=/'D/8Q rїh;9ICOjBiapҢȢm)z']nF%2`~PʓbsO'ۛS,E^HN~#HW7Ta@_K!q^+׹L=2Aꀩ5YjyXsHVM]=FLN4fψB봭.#IӷZp "fn_̒R{݀fN*ՊVQpQ lekOM$ixqm&^NdM~ǗlMݭ~\G8JIzUP GXƕZ4^ͮF?Xn֎o_?z]P+-_M+_Dũ\bOQSFT?g8&j$8.IB l4;h^E@}{yÕMR)j*8AÀ|NͲ+bVM=U+Ixйb^~v+Φ4ێYSI"AZ)m^~ 5P&QhO]T BOѩ?8pBR,9tWoq#cKo9NUۻh[ߪo8dۣfY@ 剘mu`ࢼլY_0 e :bI+#ԑ[B1Ѫ?l}aχL3BfhS(Ԗm(;jdP kFWάN,=/E/v/ɇ7՜$. @1lۚY]1Ʋ1* *l /\*/Z>mz:H\&E{cc'S)Ɓj`͢*$Y%m |cڐ܈zU2(\,0mU2_߿m[76  M40!p3K%겟o)J[tV(&xI_)O7LȒm6ӥbF_Zoߺ?>!:{˩]ێ}/^?-ߟ=8N-Z֙E JLqGښmaHDZ6)눉x8=j\9,}j?΃@q:8O ^X=E8ZS7btl:ٰe]w)ͯ6Nc,/^K{NfjC[?v\qy3s sNkЎ'{޽-R֯c}gߵC[;xzVrQ֭z۵46r?؊Pv;0i ': |$ , i*@lܩ!0E ?4*boFt06s>s^U7z`/| r \\-50~/[jHw+Cc/XԄeu?ļoofw2uO7MxW^_<dv  +_)LWnvѭuA7 S _$|(='Ms[o^+7l)TYEf}T4Zuﭚs(I(8i˶'coHJdY . 0<ż{OV +{^x=@IR5 5ٛ;Wl1ث4՝un籋G3IxefĉgEM)$^0G+%xП jBȚ-5Ç b'2eP/LAһ@ n_nj`q*wz(h.l`}9Y3:z譕 Z}{dM[G5W~ Z'F.@ ~;Qo64ztr)r @ @ @ Id)̯F*e(F]`Ba!O(p9_].ft2ɴ2sϮ+S{"R[34ײ|40I3+ O,VYnKC2|϶- *Nx~8q'h/Tf3eO_^e9j?n\p  /1;5B]pQOn%,ƀ ~>oUIrUUP'%h1z^+Xlg¡/w6{Ϙ?-"7= ',ni| ŚJ?cpu|8M-[E1e5e{r[la<+R`<_[֭Z33g[TGXtҥK.Y*Dq-q:Ԋi~%uY2YbB#5U@$E6mI :D73}m(wlVNw2M+i7ҸL- `j=ˌf?ŲRJpbr[x m v%?G,"'),By%m}L`qp8@+[>qIg U(Krf?XR߅`5~y^Ԟ\2_ׇT{Փፗɿl=qLv_Ƶ_Un8#{clk2_{k4=i_:8Be-U޵%кI5  䞈d-W#!F}]Z2_YI }u3'jX78iDFz1jm"vtƽ=/^{l7rۃ[Q-wwⲲ7ɯ~BܖjHKm-pfӕ(ۑIO~۬a12J(̴Dw;մK7Sv]ٵ ]brUhE|_?Q&KEOKvBV2̍"D!@֩A\ _iv{79Tw$e-*E5E.9~RҊʆQIn 028amx^DTYPhE{٤/vbڰۋ҄ ^ 2_$"6\jaT&TOVE&a4Gciz]Xݬ2xRI ?\H,lJ~N"-; HT *t,"p(ʵ ٰ_Z%Jyׁ-)I*W@aTAΈ$C!=4Sd&.#&[je/l Ѳżh`Qo{މ.$MǴp If HwMrUf (/|sw:GGʮWj"f4yc;3 ̑@&Ka}AZg7ј1vfoIo8&V{ ]lZ02bw"c2 '9Ru؃}4I g6W)WRInKsBsކ KS" (P$E(KLJƍ8q]U/ cZϲr_^\w|7{ި&ϥ\@  N= DW:H A @O3ͬھ/ mv!@ @ l䮰M~%qqhxxxxxHvlD= m!nFT,EfymgU?4i^U+̯>,bZ뷍z9>IR]~#{7a1(#8s(4: sPq<5ԫag⯣{5I+2teL531[YQOH&$244WD.1Wil%%8';Nی[Kz'ʟ.r8rUu2Y2K='N X)+\.4fx`y_z cm$' ))Y Yƴsv3pqnDPnԁֈN ȿǹ& $ݮfھ?}<tL G\>ycoeV~[PVN+~8UWhhnQ8?&ɪˬ4;ycx8Q|uUdIj~'m> &_7|S,E,gH.O0CfB,Lz8—$5Ўd",BY6͜e\1ngo0:50# ;GzMce&Ep] ;$uF4Zv @RT*~SB7ѧ5!5۰~Xƣ>IEYq\vsAThioP> '%qE¬8/ws Noc^/ls))lW[׿ɬn^6U'/)"m gHR_N&k\&b6hϸ2׿NtC4;oN)'9StmoKJ~M$ⷾ^He֬w,"V0Ͽ̗BνVksc=`w%w>kP~:.lp-[U%vش\f*Nfw|)zvД)Zyyyԏ/ŲT/RY4^ծKRRŲc_ړKDQ%")PMy_kؓO=}ڳfAM+oSR%"Uӄ-M*UEbeXn֎o_?z] āb`ci}Dz+rpR,jޞe _MrU_d͝mt=k]Fa}jfRYNDU5%8HE bFb*ӮԚ,ŦU_ҕ ˒+mI2 w|VcO/x`j?c-صt㫜J1˪1hY?_Bdꖲgq>Ϭw{-r%&/̋)d6k^t̾]b;9B\xNN=&.хn4[21?);A& rׁwLʣIG9U٤鱤N&kE=,~y}Vͳa띔jtR?٣")LWBC#YMxS, S#,̲8=T+(RwꜴ2CKcե|)Q;6N>9$K+doDI̭7(3ÿeb)P4GֳapnũP YTHOiV ߶F,zTc=bZpD&(Ql`mqpnDUqq{q7WFܹ'IzteUħWԆ /oDڻʍ͸]XMɕzvֺ]\^~V ^Nv3~<釙"ֳ~gWG:qeimmmͶ0cהԒ[X%Ey|)Q7qTSr*Ɇ-F" ҧkGiV|Z+_[G4_Xڝaf8&1,ҎJAScilx8ZɝSn*{?־i<EJol&OS,&;)U"bε,Q:lcLꊂV~{R)W_L0T8ћ7{f8Cһ]ZRxsT :/=RCl)ȗQ"c6f̈[Ϧ$R3m?| q^(@P Y*fh>,_B ~xd@ @ @|gYI E5|!DJLUǗ8~xRn8qClb`@*)zRr{U^LCV&: Ɔ$2/_^W[&k^>Z$BF #n sB I$=۶&8AǹBP XMa;6V$ ͔=AG zGC%"#R3g)P^IRyt,1|=浇BɬhVLVH .(&8d8f&Uƿ zk;- IDAT5CKywFIl}ѡJȕFYMl]S$JUV0YyTc,Q笆|cB",t"Y6db#A3g7++r2?~AK0HI 'xE~o Ӥ2]EwZijC_Lx.3rrKUa k -}}lID2Y2heٔ# ?vzeͶvkoO~pR϶??mEI^<8wk}q-H=0cAn IV@ sm{Ky ޱħI1}֋uXŶ ^/Q4iF!ID{VL3="\VT4g)jDuJ!1L;[\YȲ)kG G$%q7}}V[0Mg ZB^Ӷ',Jqι>>,"-ev*?2GR>qHJ"ݾy|!Ă @X-iitFu& y[>H4 mtZ.<0e@WUH=ly~] ]2;ٓOJTMi;Q$%y!GK#/=p@Rq7͔ iGNj`@nK*_"9VY_FeݾU R{݀f| {qHzZN9y{VffufhّrDgmಲ7!9zJ>h˒ƍ-]ZloIں]GM\cT&e,e 8$U{ەee@R]Frԧ@$N/C{xM?Gm 5*_'Jd|VS$=MtP>ybt'mXfq SgJ䣻kLd"I?)cx i1`ƛ7mMi]DžJXҪBL@S#F>~.U7*NW$˦AY8AY%u6`dR]RG4^)šͮdd .'bׁsHƲ1* 4=$=,2dnd52PlWB?|Jmsu,jDJx~~T6, HT LVP=,%ule#lǯ_ ʵ>h}]/aTYJ'Y%m ",ET.!GcS.[):=yd/^*H([Nuu"ƽ)8wԛ#q޾uwK$dC!=4Sd&.#&[IiY0>+1ܜ ıoryR}|=uB![^3Ѯh:Ʌu÷dc3-L/d6n=`ia95j2:"\<}۱N](ʮ{K{/T-_8{Ju7a?KλNng'ݕQQloGZ rB2A:P'v,Ya;sSԁ&q܈/;l쵬QU|FNtFmL>O{ɕj^|֝b\>K,Uތ&-[do#gd܈uO`' 'h,aۆ(n 7MEG|H> ^Y$E#مwpĨ_zAϢٰciY?oIP+ @ @ g}bt{Ã4P?mF$R >ݻMZqЦc/e1&pogLrS^\ K,Xr^MH mdL N?JmGPhnt1xkYL뷍z䳾?IJZĴ:N.PbIM xD,BH]gʹ}zx.A6~*Չ+i,()M8]=?rX{N}.΍jӍ:К;YG3-)KU"Lfx`yr| ?I&[jr 'e &}yKw_̞T9`3ց{nYbL{yb{~09/(t IեI82 x6kxUj~'m'JAYM0?M=JTD_ݵbHV (棶) I2x`5LziƊe6EVA?:QqV*O-50VRYŏ)Qndt[\.uQW H Zf\]ժ(}pvrX. _zoaInŃE"$jӵj0%&e[-$޼DnKVl9 Kj̈k@1c'ʑg ?ؗfZpsS?y3_+E1.^֌?7nD \\*Ъx g-?xV>tJ~%=`9N_z]=zjOƑA>sQ jtUN7;>-qUv׸ե{s{]b@EE^BDĊ󏱡h`1I5ǎ7RDA)Kҷ.HpqP~.3gΜ33ww=箟7+mϷ ID'ihcL& so"x9jiE&a>tAׂۇ~ {CV@]Yhݩ,Eqoq^ '`L_S&@eB3y> w; yr6ϗlxcH02j調nI=kܶ!q?K@qHQ8Xh|?(qX8,'+TЋ:(YW"c_&9usiPV#g%CY0]yOXxxxx!l^W5YMޮveyӾ˚ uZf&,ՋYl׶iD.KQQTtձLU NfzL(:[P*ee+5zq^tpXJ+Is_H;KɊ|ِL MG7!$z.kb#zfC=v\C'P(uX-I"g ѻg'IF훿JuX-mLۅNzzի,#afkeherɛe:[j):ZV}\Y\ ccNi 4wf1`9y| Yjq[]@*2_%;A鵋?,V c0>Tک~Xwש@j]:]X|:!tTNvFCm;d]kFW;HҮͰ|n&u&ވP˯M~;[2lW(  ƩȠ>F§U8;}ڮc ;ڇa\rsI;q)qU>SlK+o88xVRڞ{b^q[T]t}gggg'2?3C̜R))zW.G ¨stͣ!FIϲ2c!:rTx(A\m]L)Љofbl!Y, J|,V{)cJ`WȱzͰѽ<,Ui |VM<ۅfׇmmj~Fi!lK rkN~>i9d)5?Gof2m(1Y(r&KS.)mY =PV6NL οM@s/eiˉ4Wc85D5o1\Mg5XV:ϒ޲^ຌ[ĸbSbҥ8&hL]Bt4c{*Yq #ϲĽ_fi4YGd!xj0>yI=|M^@ycDYLsJLj@e|[5]AY햞f>KN\Kx|(ُLԘ,dIKagi 07Te]ſOpqɿW^?? ?c$ =wgKI%>+Jk,&V $ˎ$}}(_Q_)SBN~nQNΒ?fgh6_wِafV6]-&k?,hltK&3>)iʶm';oĐ%=lq5_9U',ǤА?31VW̝@۔eS=ԙg =gپX Kyhðe6aMӪY, ^qLE7v ڼhA؉c<>˷=1QgQY <:xAs4~IVlf^ʼnFĎX6{ƜOPݢO趛jn³̙xnY ~:av^uY_mbfZ8&h&|ok2@-K4>KcQd5% c|]-qtؑۯғ^pkr=丄g1\+N" H?72aд\'4^`On0 :ESKIj9}s:lc'Zo?Ӳ{ꭰeW/z7dioM*¶ Y??<{;ޙu1SZ},;2i _-BhøO%HZH&}A\rzHkc Gde´{п WxUb*{Mj᤼ ௿j$z >AM|ik2&ҕ,Ee基vI ebIRF2XܦL/r zoWݩZʅI0Ik!tu0aA˗Iֺi?ׇQpOmrJؚ[6zl1 ,S;|[vq> ۶C]UOkPB☴jb;Ern?elM&i;1YkMkVO( ʛjY ( )$PśhQarʞ\0_R,DtM_&&]Wc@ O3x*:쪋ϪYe]Qunm|VERc>K(b^!yN Y&>Kc3/J0\K*> .KcH+.cX7#*hNf^EYilY0@F~4Ȣnܭ1nŊEp]L*SnOVv'9PW[.x#R~՛0N- 9R]$ݬ[_'-^Ez;[2ySYT0̼饽UXu5z'W3,]Yd5N{<^U*;ٗ\HotʠXR8&hldOMEa ̝P|.>=tZ#in%io|7Dԝ?ND0 տUk^ $\>!{/{>?~^Pt%|Ġ~9'Iѓ/z' KcO]+ .x"NȱCO?;84N4Y`yZJg)0Y(Ӿf'.U(s)@1rM#+nM׼-Ty>|͝g1hٯf:CHjBۥ}l,nm&=,M;RuEJir_r{2t+J8u-⌘,\&R,c+(JY_+0@HEqw-VR3⳰4'j YX0> 䓏 *Y̓8S9 >ZHlWIz5`$?3PdiKSj!z,c?eky<5|zf :&/lKIs&r3!D:˼;XqA݇4YM} }Xިϱp:7Sg&~(?|}G/-~-}]k⒓$,7f>:氇"~.,.g!VV_nh m%vԟj0S~YcH'MͰd Epp[K5t(d%Uw>j*=~;3qs#H*ts#$$u?J2#}|o^N')9^mNb޾l3~z[cUX'M6C{E\ww+}&JR[vX65#xw V:*42숩J n{c8e5>E-?=ώl=z#dߖWkѮ ۼgCZ817šs%f b xGZ(J_o <%ޯ1GڅԬ IDATghY-ll%eϚ U"|Àeo^2"i6=X&!V C ]=(/^_ AϔD#Yug78v }(w^5S2ޝP0H;C}CQS H]u"m>iE,RQ8%Rp627BFjߞ⁔A~duvHv~xf֢wբ0> R?΁fp:Z"0G?ejZ vqiNZi&Cߦ}\Հj-,E{+tyqFlƏ`ٝo[MكUхe3)}G:y59(a _փУ_Gكc|0P,gU}D4k1S4) ʔúKc/E3zL ʷ9sͰѽ<,IԦUJ`(V5Rf!Ff5+1Sdmw6tZ7.x?݉pFgK!)*>3]H ^{{ 7#tSM 0do<^c?:`*}՘6r}L24xҍcWWwr&]G_Cg98 &ؽHRx> BJJ!wTY`1f ńYXaքYXoXX$`|V ga}P"C éOWسLWsR-\hW40qToWK2'?ϩf᳚P>i0ʼnITHR'y5 SF5BwigΑ\~l8 ZF kEǗy*PI{f|ծoYDzm~}Ra$>0%ƿOFeKH&r\쭦ΪqOS,\$UVt}O @JĠWU=y%iWŶy}өr AP/ݞVϢ_>a0iV]RyLl5Q4%,Qį1 ? ƴX7)~CIr=k^s]H)ٷpՏS9Uwq}݉Ly[?''qw=ө\#n'.~ۂMwEj5N`Y2r/gZk(,-HMNdjK62~_h);ZMV޿2|Y.Mte$K!Pw'5,1[NRטV}EKR>~ToT 㳪6u~?Mz\~)Hu{GKV^ uaž.Kޤ$'[[swą}=ׁ Zd$&$5ܱb??*RF>0oG(М2ZgLに߲8Iݛ9Tո*.),NReGE>>dd6#L.K^e!+3%.*e Rc?[>assȕ}ㆴ.ԃո”' =ΖE/}o8-;3GTw{Mr1),4dvpߏfjUs.?6eTO=Bm gv =gپX Ky>06wٿ+M<{j|փ-WuNУ]/ѨuM\5k ]}<ˬY4l>ݭ\xW7im֣T+k࡛^ݸwt:ر)N.Zz5bha\n;«K ː1600p2 ⭥w'cN+C,["tKWUUUᒖ?)\FDm͖uV2aTy{S*i\W-;[\"3 9zNyr p/%X]_kF-rwnaȵp?-8}֢yy?W7u]ςGbʑVϚf r'+w.ZCzw;M"8@wӯObŤHqJl ETF>器 H=q|gѨ1*\WH@}v:_gc}mΆt T ^;F\y;>_cOӢs7s %%iXIN{ן4 L㚺Nۆ]SJxo}͠>vW_Xs *Q)F1έSJ{hnij|*Y>F]bRw-@?N>̒{{k;۔EGCڃYx+9r?Q{ڞ:߶IJޝ<ݳ@瓁3;RR)Y9$m>E8V,=Ӡ! _nvQKf”5qvbʐ ja]4gUzZ6+~ ʁزسjE|EL Y$/НkഥlK,b(*yY[-X=ΰt}g}R*z!=.\z0|rDŽed*r$+w\MrL4R_>=N}gudiO@kIoJC\.S$۔2Bǜoc[_-fIҮo*?;7qD#IoDp&L_ĶiyAeҕ圈'FOG;E%2QTqXqhF[/llg]PpYQo]hE؝4c~wv%Ҵ_Y(1/,Fu.&( 4urB0̭"qsLJr/(W;)Kމ0t6bb_ӥ`zgJVN@&&m{KY":Ӿ U,JQKI_G]Y3($[ʠօϢ_"c˫miO<;?? ڙL&I9.n^ؼ\9>5o> Y>5ފkWbĝ#oыYR}.bEWN=;h_@H0Ks~ҢgW6/=Yq煥J?$;sVYZ+iٺ]m30> 5H,msz:^B,,VOn,ak)>M,,,,,,,,,,,,,,,,,,,,,TDYJ˼;XqA݇I%qUH}Մ)zp{9Rf3أ]\}Y1Bz&̦̚FYXX@:A`}λ G9 ^q9(1JIu\B6_.uh]a!s/>FhWe{=Nc x %HS?6cK5A_ےc|{NP#-C~qZ/.)1JIqU;t^r)6Ssd_3˵mqUZ,.9iN\r]akcl#JhJ5-j>i5CWӜ}['^}ѧEr t>v旾$#ܶ-V OT9h)'*jdEɳߤe#_s%b#I]ـ̈́uj]]J̑r}R9"<.ƫbBApxlަ6FI^}jtAsmbP$A͓ R(qU`odI0,)pU}BGZ;T"=@_ƜW%kmt4Wi8ĊHNacE%f>/z'Acڏ@`Й>vH 7v=$PbV-RR9yDT5hWm{6L4\G&\n܆q[2j򲬈{ksD/my@Tby1<Yz@b4Q¢4bZ i{Kk,, m㭰.j%D,,,,,,,,,,,,,,,,,,,,,,,,Y4>Qam;iAn&<*(_%{BdiZZ*6NL οM@/e[ a|ևw_,K.ݰsU߰0J5yA𢢴%́Bgֆb{*Yq #ϲĽ_fI[J|ʙ"I B xk0>֙N`=d}j/AjY S#Ca ɦ^BR&$!I*e$)ȁeq[23|UwD$p[rGXNYI3N9PbT VaLtJ{wTfg_ڶ)**n~f=ٚHM"[O_ eM}&G}$IB@ʞ\0_R,5.rMfv5e_ sTKE'm<,Ûv ʴBF m{ƺ|'&CusEee٣|i_o *'4URTgfddddddUԌ خϫۅ sDyQSH)(&6Ii}BW2(d+8:, 9dKCut&&QP x\|,d(ѬBzhb< E]x+ҜDQb@ymSnK3RhA5K8/z*y^IuCnmVZJ|VSjEu㍦>6||v^]NC-T9Q#ON>Diլc}w`ai\XZf5V+'ga<V=Lma~pGym6Wv|#LNGv1*sb)gQV ,':~1ع-Gc*44> euwA {~L!wNqYtV&:>nyS?OmzN&E΂CR,jS`|z{aԥ-T(@qYLs]dd[p{ˢU7s]- bxAJͣz~F-eV3c{cb6jltR/4^[-&gR.>ǔDb|z{@2nt9Ooih|Ֆ!8-_‹R\Ys%oRKTJ+g6z!fwKbZ e4gV:~ziϨyCbo2nVv=zRay^YLujތGNes IDATr\eGE}2;1G5K:1pLO`e{j/SgoI.EW0 tzGWM|V!+3%qj0g h.ω"9H2#}|o^N')9QkJz6Ǘ64-} Vۗm/_OxkL IJiCCfU~nB]ݳbKE-?=ώl%ziړqbn :9J\Uo~+յvhW@wsKfn29wYi~]@E+MUs^_ ~T𬅢fD;ud =׳Gn'3d<^D%$äGDlYg7$x-+L'|۩O},U1i۞#Yd?֝axرtϯQq͸bv^uщjpU'oIY^;< w7:~ChefXazn:W^ OG R=Hv5WNSb[?j5͌R15=;>K[GD]]2R+oC.hjӲ{s r( +J+dtq0aAAY/oԸ-G . n`P"=u4mOMels"AWrNewP\yT]]Ǵ=W|,-b0|zzK1B1{pQu=۶C]Ya|VPJ*`2a8b~7nD{EÅGI{_z9цתI*Uq+>4pE8,Y?нk^I\Pm^|V]0> agld 8\ǁWK?P|V ` RVbbCp,]A^$k¼^ !p[tqajۅjK= }]S`5(3&4@@z|cTpc#IʡIx K:ɏ EG!wTYn(Ȳ"Fn8uϥy+jn Odi-(Js䭴2voq;}Qyr'ҶCjưMì؟l]خNۭ;V?=~1r^O~dN,,V2aOͰ[Fp {'zֆP;Gö4g 7B,>4!dZ߰mDŠ$^UB.i{Y_8 4nK(7MpN?{Ʌ&>N5ߛO> _>&o~t-ۯQr -94BiBYӯ\P^b.|Y4G%%DpX n* >x^Swژ/y1)~CIr=k^s]os:Aap~Ayy*B_gmRM᪐x% agvuyfhvNw|mj"EawȥYջL <=75 ^*T^:m\_sו$u{H{ Z)ļ$+H b_Ke6͞Vcp=~;3q\)L"AeGE>>ddT#bKo{*JJU"4KQ+gz Dy*e Rsr$w;rrh{`& Eú\Uy 4"do;y'.0JCeJ|cRXhпI+]~ mʲzfX2{β}vN}am|WN0yi[8&jG^`?{{ځegY %@uzuꔸ+ϕo# mY8w,U⭺]`sZ8ܞ1 uy۞wm/u?ioȜfkPDMzt sOs'.T(}43FgS ]=(O^s bSeGFQ[eݚvYugn<5l+1-~ɢsC8I̿DR&[vݷ*uS]|VciѨ_T85~L<~%ǖ?)\+*|dEL8ՄSQ*|73e{>Yp|?E$d:w1ϐ$T9jDO+VLj._Da?LXsЭjVg/bY >&BljtQ9oy^;F.r2>AY_jW0B(0MbvIv1kzl)Ԃw|fp[ Ena mtCQP~c!1PEe$IHdJI$r`qYVG. oB=ѵ漄(?ݳ@瓁3hog)* ˀgSŏtܻ󠬠z 3aT[Im2o>w;/_mw|fq[~A?lb#zfC=v\ySjP(o(T{x+]:HzK4^rIw^B#+N$U ҷtX?ix'%YdYzÒ_7=L4B}g1S_!UZAd^hb}ygjCQថ% 0PVd{i`ogjaaWÛ=:vҞj$צl74{_X:Щ6WKhlZDᕐq=dūETv4 &y'jeqXʪH)7y<0YjP'(T{Qx+4^M P;om޵kj~$Ϗ:O FtPY_O]q,Q_ΤKAs?"JGmZW>˦ŖE9zYtGgQ=}d,+*#1PH< o4^BNs~CNT;56/sQ+:F߬:1/waaa*a{)|g Vk=a,,VO0 Y]\{պ-"xmա߈Y׾c0W>tO,y{gW/+5N ,rS۲ {4:&a>2 z՚ íLu"}8r ߬CB ; $}YM,rS),{Zg3ui  }%Yqob|%_P:%1lطiޡږKȌx#ڟ9\)|V$-HMNV@2nt9Oo:a ` ?VC:Dp5ٷNy߷}Z$WgE Nfʀ0[pPc~@׋s!KSx1, U%Fc LuE\"cU]|Vb>&ڴ}g MY 1g;T,&]EBcPB&|D-:PԘs0eE^le~0gPC~# *ٲ,?ؾWqO\dxՈզ=5S2"Y3]+>G]|VT:%j U%IVt= e͗ɏ Tas-1+ՍCbu)G"8ѯ3ssR"Ϝ~iŪ1riEދ C;*?-:qa vTyFES>Ӱ %yg|VlڸB$OR@3l 1\(LzExVs!J@)pLj#^5-Rb ;djEm|0ZKs$XڶG7t$Atkvr!XD"Whx{$j|VDmoY/3kbRD$=|T8\uA>9՚s1EU/s*3"9Ӌd@J+զ3 ,6uۥVZk#g\{%L*S%֜^Y@eô/z'd~g>7%,Di߅7}g1]tMfys)@1H{ksD/my@Ҵs.^HQĭYQ]  BbP"\Ҡ>4iŴ1l0+&.քj j)|ƄYXX$> >z|lmX(1-7mIjDQc `qw~p:7O;s8ڞ|X-b-hW@a(,YqX4q[j X2zW8Z;8/$+|?/$;x\9è\c mLk-P&@hⶐP.V Ka?tR{oj_|K)A˹`'[d)NɤnK˸*N&|l,8,ڸ-r'4ZLj:]$cFt4gSr*{t>G?ŝԩn N$ge{ Q.e#Jw(!Mm\bs׳x5 ;z/%;n3HqBOu٠cnZ< Ç];풑:Xy# Mv̬E[=ɇYrx}o?oox6OnK˸* 쒌ΛaOgi~ u\/$a0>ix(D_j)*Kd-ԵeO)H$2I6ezEccw/NݟraR0LZ]LX/c?exnZaS[y\)m\ Fd._R 8G/|\(*yY|B&*'3=&׎5g*Ϫ]C Z᳚:_(zX-b Dv$I]T=۹@ ]"Bt M_&&]WƅîF7e(BApxl,H*d*'f>ˣwWiɎeuz:W .-ۣU%U ujlRƺ|'Wj]Qo?/XkZ qP(YnZo1Mʥ> |TaԞIsWkK*|U.1{aǩ̼8JX0@F~4Ȣnܭ1nŪJdNúN2L>fA6%ȅqOr z}lcudP#|HҮͰ|n&u&ވdeUgddmiUL3i3}SW7ョIboTN;^psqgmUX2A7;j\kt V=Kxg{OC#KwivV i0wOu;ag{⢕Y5a5ӗkT/? Yf?_Bz!AVNݍiua^_ t `L7NZnp8íV YCe&n<,RE n͞Ok d'q,>]22!N" *(gl@iyIDATv@%tggty}ը[QҶ~E "Q- WsD@}Kj, 0 fxԋkJW!+?=Z`Ӣ]uU#Ĵ:{ٜnsl@Ev زaX1˨\2q E5/ ΈF?墎gb4?BtԻ$1{W?:B!$W "a7İ_ܷO$s +\,RY9u;OL}t PNΈHT9Ygi6~$Lb8]) QEvzjq!a7&wCUePKcF_:B@le?p8`k|jDch㖏JV pgMlBh1Bee2z+w#RgW{MtFjR9}x@8w$;sup_鰚 i)!q딚nnjfd{^E"_Uz+b~{/cypuD/ ^wLVo?yr:!NDs戮]E:g5,o~8r{n$[FKtXM1D5ek]?#(AتT@xh96(~V۫[O^ۥ'ҿW75Gg _K!(3/(텧"_e*V$۫[O^'餹!|JQ^?8g![$neBGHZߤeՈ1?:!>xdE}Jo&jFITƯ|EsWʯUz+'L›]D:TD9jo}x@d̯':+Dݒ)Փ]6Y-`QRc\E|HZU>B2 1z+XuFg:Vv@\7iu!0BՀym %Ȓ!G"J|Z8{bȔf|B|LKSM.H-!>늕q4_l` @w>Awi372xTǏ smLXL̠;ٙUS[7{kγ9| '!MSN/GDOeFgΛh_HMwd 5`ŒߍrNɯ^3xyJF]͸Y!9߭j~A]XD$Xŋisk9nz*B)tO%5 {SӍչt\c%_9O?_n\$lEϜ6rOUzV/a#I+J"L*4Hu?SlafG% `גt3"UjTaٗU6^l9.^0Z@ݫL ޫřTtiըS'$_4juUk>x(G|ݓ@KRi1VĚ, W(|v ^wFv\48jIdߢ^@NǩM,4R>9ݖf*-qBMM V*4YjZQzgH'LƗɓ*?mHʼnJ9]Uǔ\IDҴJ6S4YR[% ʹܰ@d1l'|/8w=wq8ڰ&JqS<ʺ$*֘NtTB?u[yw]ܸbqJګnr:fګs-v!r3@饆[j^AԷr1wjϡ7lj(~]U蒈ƨNAѭ/0!(~˗F|c O-S~YyJi2 :%MmtOxs$6IGub,B^{U%Shbڤ:բ֮u]`}>3ed5ǐ8'[ANAX&,-wI9x7=VG;>gޣ7}f!w}}8c ;9;5蹜lMéKW>+glA\Za7 kcd2tl֬OWps vw2pnO{?s`'+;π6iηlUtqX_F/4ZqVZg=Ïp9`)Һ*!ۢ\=3_B-*]Igt M+Κ | 2:J?ګl7@x;H?+° }zD~f>fK vy]b¶!〶v&resƺq0~ṟ=*uhP2/}CQ~&xH<~GyZiu/b~;ta={#xܹ\+vΰ_WӪx;4,Y>x~պ6Ptug"soQ;GYTC6@4C0ۏwn<`_ݧ0$S̴4mYKJ_<󩇅"! 5aJi/zڻjBfwڊœݻ=9DH'vN i/ E!$.yRfo;湤:&*i՛4dĶIɞq竉M:m\7tlg8W7ݟPg<ΰ)D3=57}ʗ">}a!Ȱ3Dž?ޓ] 55垯m6a`U4$3yzNc ] {ބ3lɿ&G\]d#G^0q6p2وG nxt]ͺf4Y!ӵkFIy{Y)qe7X)ק#З_f%Ş:j=c+BŒ+y. ? <3!~xl\F^3'#:Uk4x*@0u=VE4bYM4Y)j:KBܩ+ʹ]ޒ..*"R kROF7[c1#$1t0~G\& 18ݱ !$O. Np֖U#6Ǡ*x fҎ{VGYک"Ԡ/> !$|u7V,_٣5gReH*%faH~$t͍g]`+Ebd2^%HJ#:fWZTnD!y첷gGBv&NGWai/z ZРϒ57tZ$ɏ|,~gK\#t6RJt3VeUdRٺ,Djfg&28\_DH'xb3,Mko1q^MṊLaU>xH/5AzQ.}P~_b dmu4qʙnHZ/m@>w'VA$|i0t ƴ8Xq619:oXErޭ:WTǣ,!tm]NO|󛥁qkNptO~Kx|*/vW]pb҇UY`N"})(y(H8xgw/񎅺Q[ƘkwnN}Z 3pNzӑmޡSwsL N?rrNmj2(n(M>爵o> Y:0iGm |/4rYahՍV*_]]#hn$eQξVk`g<3:d),gI g'պơW5>K)g=K1' 2Wf?{ !Q= YBg@~W{{}!R-^S"U.^<+E RjZi؃eR-g P2}44(l7-}YdMYa3~>鿬ۖXŲvkx0AZ&8nmkkqo̰ ˇ!a3[t_~;^ZɩFŰ^zck6fEc@Fxgf@M'ZApYt3Yq’w/"nм]zN:}?%/럋'b/S2pg|lX+H'T"Uh>b}@J "n?s,pjg'&,K[c:ӹSWLUH%̈xg 󴖿y֫Hϓ_WTNk5j5If^ñ];@:,uU<=,*iNU|]PUAfwO>0QYD{FK?sڤrX7V]vBŰا֍3N>}7o04`Šjӟ^8cÏk]:G*#+8ȯ˴pRe?F63NYjvgs܄/Ց/Y }How#~Z"4P?u)quΜ1ڮپ ZW0]6t %Lyk:d}+=#w䩎GVѓe/=ujS9T_ qѢ wxH09dD=->x;G04FkQQ*џϝ0ڝ*7 riB̘Է8&6NgtI)c7O{v'o8|)S>ӇޓEjь{}wVjm ?N0f;aN'9^SN:ޭU2v)|$r2u|{17k_dOXo_9)7d [tBV08"ܞ*~7Љpo *K `@+y7^+#)t>>I9IENDB`glances-1.7.3/docs/images/screenshot-wide.png000066400000000000000000006273111225327237200211630ustar00rootroot00000000000000PNG  IHDR,ZtsBITOtEXtSoftwareShutterc IDATxg@Ik6sFA$fPE=SCgD & N0,sD %mX@TQ~C]NMWO4@ @ ۆzDdaOۣ\5-tFOp SC6s{ԺϏ. d2'v5&#A  Si57%fg~Ԭ%ʛ,);C-e:wGK#bvo AaW/K}%"0E <{xL`BgUL"].4"ߣZjR$Ywy;_49ӬY1s6 MIa nu (NbSc~]̵~ᛛG{R(.ݶ&RNffj6eJCyō8S?itԦ!qq0YcՈ"VQu$! fHL7NN&I^Bv 2j{@~T1‹+4qo`YVlQm>k]mvLWezTȐƵZMQo0ƕM /I۸,_a|u}rlFD4%…Qi/9{5֥Kz5P & #?jSXA'E@6Lo>eY @$-Hڽgmҧ {S<g|l˜6M_`)Y^; I}P,/~։<]ePoZht!p|1WnQmA 9sMI\ɼ"D +W=&k'! o9)Ch}Eg;i7ʪvTl= Qf?t݅%dncfxuԡJJHDM53)gNվhq,T o"O@ O7{I0E!'ѣ*Wt;2<K~1i<{U8Yc컒jg! y3˴m_IF6mL=3aPoӐ'd7} B.勁rm _TTeT֘4qwB9$Mۮ%^}+ܛGblx.23r`\t9ܫL:ﲩzC ZG@,kٕ nh}v&?Z}5@sslQI匤suvR}cLRC$vYɩ\u c:u5u4:L:k%s{q4EvO)HoOn\ϿOͿf7afD53J~|;'븸2o zGӉԳ*!*ndY㴞xY7@,B۱! è]U%<~~ J'I*J8/Y4vbj3z<Dy5/` +):{0CR.qV6AoN" ZY`F҆WVJp!_ d:MIJmYbm䤩~+Ncm=.K#5gZ%jcΉa@}KC],g|zgIޥ \tY6]J/݋/ɸ\]ke٥B)R7|,wkV5EA#hv../Qi+[cuJP0pqMħsGv*w_zm4iL-Tnf@S*SsIYZkge]p3RX蟮Nq\NT!'rqG HvJׂzX fgt ,6 ʾ hB= $%G$GvOVgv| \e|7F*lw7nFy=MVfUBFj6X:ŭo*Kyl0hUq{Ь)Jt0 ?wMIQw^~5PR^$4 0P R Qny A&6›ץV-|{8H-|z{3e̴&9#lF=ԺAzr;@CֽC;j<"yiVyoLrL<;1Sx=SjY%qAkş?x#*ogyk+=4@Ī ߯ۦӠ=u &_関ͨ+TZlIe5E-j{PE G*!9'?hYr,eE*1NY̭MuhELXbE<hdL6Rl\cO=Nf0F9 ZZ 6aَ~;W)Ϯ \&h+j&)(+iT+XTÑxAűg7튷iQ(|F+\ uSjs#3:T*( 2TTg(%999999żZc4`C?vS44u)@j!k!WT#/^~jb{+MJ E*& Y&D5UU6y0`=$ 3KXeҹzpHR+oړf7ׯJnimh߹**XH{qNN ڦZod vt! 4jgo6m,zkGLͪ6tdccB_ƻˤrߕwu4aD͈s٘Qw;= Ldփ4MLM TMTQYvܢ_-oN{Wa+ۢ72'362C/,!q_NNna70(̺shԴLvX7\O=l.f~֕XMaеMkiF&*?2?h ,i$ėEJ'r43q1 U|FGVoTG^V4655551Ҡb_g N;6OyxbIFZ]\Deۜ.3}t016d</B_Kא6yicy6'm~=mjgq=Lt Г|Mz8qE.˫ɥ4T(XCzp;]ש|a6j֭GGv^ ğ<,ҩ֛$[ @4h9HYmԚ1iZ`: __شv[OBvQS.my%QWm|Ffݸ.ۘ<>rwCmr=Tq!+{+5!ؼe FР@TЈ܋N4pss}auzo"\޲ַ$ϞdUsx>mX ssYl@eHh'd F-Y7gUErz@m7w֪8c¯;bQT er&Af'mX0 X)ww9*h>c'M:qkU g?ۻ9 7<fd@ DK)N^OdF\<ޘ$@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ DwݖӉd į aH.jo 59dT8A@i.^ 1ft!WE8^uU @X9Kozؼ~+c f/u)M^W^Gg.Z7W>u1MvںUO҈&]Zm)0Y|cCQ v׫Jx#l3$s}xcyh"H+]gfZv֌meBtntX*Gb#\ 2_{-<>DIj߰:31tE ~$i ϳMq٫g1>^'UFWS.['K\PPgob=A͝ zyPq-K(j귆j9yA dmmرǚ@t?ÖPykK7n^9]#bICTއtkCz W8\ڨ6nC͊bF{[T˙BBR?܍:fN+Jo8+'&#]v]r;xnG .c]^n7{~7"xZ{ ڝZ}}v$7{Kv ^jsĿ69q"rqxS7_f^:s7cnQasg?,luHsU:[)c `?B'MBTā-a˗qݨŋ|X{3q޾=&#Z5`Y,ã'>+l/=0 e᩷eEqǖ{c .IL*;}N!/دثt2λŠ'dS-#uiO-”MJf@t4N@3 @Px%rx".K#n&ԃэ{BCl0(M%fFXxvjՉYy WMGwsϤ2u"ʎf^?)1c׾f<6?^?|)1 Q&jq?-H z!dlSBUb\$h[(հJc}8p^/OV k8 >@q7ZZxٸg &~:/ɽrk3RS}=Z/Q:iY7qq%Э&M0{=hm\Nlf K~b 6}1Q&dyvow.cԼ H^6"V=#ޭeұ')Ousv2#ScVmA{ɧ$ HmgP54.f_?ͦ&! *gj;3c}+tc(։x9#*I-02^Q ?*NaQYk2E@Ұl`8^#*3[Zʑ4Tt 0P j5gBuW]6U8o /I:o{gR!}0:Xk\qYF*bg#l8CT53g_]) jP)H| Xq0Vd%ߖkNÏm #(إߥhTPd߯#-Tq4M 6YoO<+<#0u gfb^#{_/? ܰ!Pfޢ+Niv5F}Qm1'3LzvoVGKtg_ξrMT|_U^.|{Z1y'cse?w,5?4MLM TMTov,c$ėEJ'r43q1 U|횧bJ{"ހ+ǩ>hljjjjbA>,휽?yXCxJWȧY O|)w~K$^΍'nd97U2%6rwmv^uȋf[}2^/<䍃\$6ǐ *xyVENɈY6cODK|Yc+_ڶÓ9 Wϥ iPԅ'9|3c6{aLs|:@vo '"<:~gB?V'zvt nxsIR^+D;VDƕ⋚9WuщUOv93e_K=ʖ>)ڙ@ @ ;21O @ JB@ @ @ q?_"e!@ r@˱@ JB~%0hϕ 檁|kA b2L&sVfCH?3ݐ~oͭm5@?x Sk7J}ROU~hpEAT#`.y[L:NX$_xZ,l^|;,YjX;?*5<Š~u߉v)w=Hi'_ݏDmImoRsR_;}QsvljiVܠͽl<6wy^r=c~=*ьR"HϺˤMyOٻU|Dgԡ|x7/ΐt_ Ռ~ٔ+ LmPq'+tC4`9~:O5\(b%ߌ:#TjƬQT\=#1ȘK!{Kl|pJG$>J-Ne]v䎃?vJ ^HR 0L.T!{SQk%q b6J:M\Xt"+۔ Quvdոq%j-'~l`ȂaҲ]>g9|/MAgbY/eO *f4O:{[(WDjٶ$mT#t mK6,ew_\SMF)K~젓" ?3['! ׵;=\p*W Rн^E >{T6J2'g2dncfxuԡJJHT 7BP&bٺ+b"]Uܲ2ޏ-FWʌפtc'P׽d= p[;D2MB&JAC #Sa`E4%A*S0:Jp]cx-!޾{Ku@ Z|iXLbIhJ%ݎ zƒ4V{ˀ6ŗνA]3>8Uؔaǥ8Av $Pf^pbP4F i^tݙ39kf a~Q[_ʼj)t0N(e8SsJ:ϼk 5{ٴ2}f#if GmLq&V d=ٳJ*_{=:(%O?xQmS^yN_.̠gd yJ6wU֑sgo9\|[_>oeLQ9 ?=S!(w^nůGd{nVi(*c`T aGQ'/b\3zO Qe(*O2--1gVǤuGE`?";!k?oxݧxY6ƅDKǸj?7PHC-xK,5IaU0VVQqN4",޹GJu[e^_V|GdvDYčX ?l;^_{[ո ^g*oߗIg dNl✓~_e6N\|` IZ]HŤœm0@W۹o 2y~jc &˒=o8}p"O;U"P lccYSu(nDZ&6*VΦ20CK AFuSy?K`{<^/ ylK=e^|-Lsd[L~S ٽik$HEbY\"4 жvvF ?mBTSKߤ 3)Lv 7 SnGOCTg^pE$vkͻn c.:JD-> vPPT1$bF9WEQ?54\r{Qi&з]7;?>pUf{sҔ6nC͊bF{[T˙o]Mlj.qVrAAAlby ΅Sgmx8|ٖ%C^\sUحu$IKKL)e~.F ClR1-嶞<~xIW W8\#L3ssRH:|}~QGМ 0ᘻs ӟ;fa"EYOy2UH:#9k ybL&mڼczu(nǟ&#yWel`f3Ljt5 >xpDаb#x^/r_(2on#FGg?ڷ?]v4I})CF ~[i8 3o-uKW)o_ܻ_ nf@S*SɊ\E"l'ᦧLz]({x>L8A=r)|W2HP\^ܩHd PtVOg4s>3gVms- ~|R b btvU)oK>77a.)ct#^cz)P2[}q|1 QIQݬFL#)}eaqyd8.1<{ԒG,)PdꤨC)O87?@+oS0K(~V'-?xWr&'4Aփܥ?Z8 [7".DqtoWe~ Mhz::/H+#5IxY#/jsx);%?(60ء.}(ߎm%;#IB0y)u^/ IAߠkGb| ҼK(`b̠'] spJpZX'1Tl^Y$"1HʄS@"ݢBiv΍Rڂ{KMľ]>"7 9PU]@rbTT^y͏v_lJ{tt; x~N}݌K4jZUUU`gv1S`~2£/n5)hAkr*E ecXkR^$n 0P +2 "Qy~Vw}:ly 2;[(&Z^obS(}܌JK\_~m 4Qa޿[B_ڧ;@EB'*A%++@ Zl'뮌g}&bҵwx=Lbև\n'S&2Dla@ 8MS2H-`KAP`l6R @ yuTU¶hk& )$ RlXRQP^ٗ?d&UPZzZ奖)ZXi~B~/?rNaQZkHYN9ܤ[N(&]7}ʒ S&sd-/jWrDM;/a2LnN|ʁkw;U"!w؄>F'g5SR>Ai(RMO<`q;Z=S"z  ByGZk鴱w҆- ʾ}#S}0;cc!=rooX {aEH("wh&&*did*YE7w륖uW|u^Fϩ ީE'|'[O/ͩ&J )\6fNOB&0~X .zf}m7䖗V:u F5r?Hqp~2KݱRUM)0BQӆv436ۉnb9ܤ)cg ΨSgm"qF?r%'t{e>l8&~wW S0΍,8>C7֧0K5V]qN|Sk"Mܞ<?K ĵ~tRɥb}ȭ>,휽?yX$dݽ[d\Ncg*&DY\]^w~o,Hylh-x|dSLp^r䊍i^s{2@T4[N(~ws4a`֩|O$nQvv_aCϐJrى%qYuzhzȞS(hMVm{OrK%,;#} 는@ @ȁL@ @ P@ @ P@ @ ջ}MӅ?'ˣQu?O+3_$@ @$WÚmYۣ\5Z'-]n淴/Qk-zǮmc6CãL&3ך㈟: iR' I^#l<虮6hAw,iT[ u%ÇgkYdI\ Kْs͌}@.L*ˆf:ݶ2& IDAT22:#ZFe&9ǡ3%V6 8J@RQgohwLѨܑaqco`ID7]askx؇׳ץ@!{Gt|tHQx֊* L{ph7~l(of(=HigO> 0d$|S/3p UBśeKyW&؟Ts)~QG$;Q yqs2Ew˦GsEq{zY4gt]mE OS社=iޫ9Ey᪁oUI"/F8`AC[Ќ1Bnt' G ?'!$=,;'xdlNn_']Y0 {s=S^sslQIqn9~|1E] ͼ!EV#q#lfR ={V7$7{%ͬCN3cER4g e0K9"A}: EգsS>%2 )JQH1YbK)fۣqt? rK .d^;Wh=G䋁D$ ܘBdUYnZ epo^WpN֊$?aBNBDP[ՏipxoKF-PMQF^sDA^c" m~N ₯/kHlpUX bp߁+5:HO`2kH[ZF^e02,΍- ̏NV-_BOs7.ػClRgϢry8 #07V؅.,Ev'W6_=7;}N+c8*! " QkiK: fwQK|?5GpFL|pmN:o N)eUo99i%$kmY<11dA˴8PtYdW-QƝ|`gtX3US?8~XMPRp`ڷ1$uMY$by^W L`?bӗCպ5Ӭq>g$>%k Tqsʎ~}2tT2,eG!QT7y|*7Pu Rz_ !=~jP6I"өp"vjnrW~'6S$A!|u"'㏮#yWC+Bl8""V $2?nd%#m)KY2D2UO>?/PT?gO?Kб}*Xzz:& LSV^o>)f4[@ :bs羰ݲ{) \~@~w?mʸ~:$:Y"w|6_ Y׺J[K= EV=ޜQblOQR&2c]nrᳯ֍ZG@ԂجV\,̦N5zwKdV{Z DK^]uD\blVM.I|aSod = pՅӯ0;-U'HZQ!.M\@qqp1L/A,!YӸgbQ"1'S~ubfVK/Yˣ_/кtľo[)I;J1Ъ~i9)^Yqq+1TEѕ43;:Tqj)`=x1R~hR_vm|S'=?ŰcS~eBf:;Lhˢ_vZz ߃ҌwÂvklo@XE/qZs ),L+6O> 1z 8"~bJI\fI\fI|nt7*[-\hT];}~5"6Z/jWoh r^WޖE4ŶZY|Z`dDcs3Y.d֢ɢG_ToB#dqUo2S(߭__Gf6]4ֈ '¼gmh}'&Šh,6C|v$ Vm~X:)$J 1$ YZHh%AU#8kݧ:]MMElI =ݔehBږ/qEv@պ m F=`b60\G83S*/)?uc=L2f}H`:L>5ma')i_I[S&H+AzW7 c北15',]|ˉF | )9c_l߯jAa6 B^zWn#1x߄gbIcsc%\BAڹ Yy|ccΞu:bc/w%(=&ڱo1L@OSMT }A]ji}EMعՃV6Apy8u~OX J3vMRq) >VҿQ?GBӹ6Q՛~}TL5 .dd^x*W ¢6?X`N:t>5^!혥t"ݘhٿckNH{:;?90sÍyHįM iE] >a @ w;e{'iGO @ @ DȺz @ @; A a!  @  BHx`BTgM";$44444$=22bѴ`T>ΆyK!{qtHm~J_<@ ~Pq#!ܨ\&OY2m"V0O4}4O~/t.γ&;t3Օ'~ S+-2r_m/ꗩw1]tב!1ͬn/v1E!"Svde; fu?);hYr5JªgLJw9PDe鏏m=Djy3Ւ% I,.10)]Ry77IDJ^/iafb;"kܮqΫMV`TLhH y' i~`NΥ/1@֛{^ˮ紩d'F'zp~$aԎ9#H:G=xjQޞK;#DӖ{d^n _)U3#}|͢pTkF JQҞ_6RALY?8‘MlT*k2 0qIo2 +1.Z9'yҁ>g,3VǖPԌzX*R*ѡ茘e m sB,}Ö>ibrervvaL&aGG!IVW:Z!^DT~SO?q_Z<?{!^NX`v|lq]j5ks%aֿboc'L7eX7u(!\@NI WԾMu_pXp4HT~k߼b8BN*,oI?EVu-G;qyY ׌Rӧ;7ُ"댘?('hQ&]T,{>O g. :0v\a~d[<<2I[*N?^rjӻҘuF%~-տ<;VF#ѥ"x&3Ebr.l$>m0DnsC}#jvÚe`4Sol[så^G Ykƀ.LZTW톅T4ֺ?s` w}o5nj_ʫfM[^f-u?{a9ʠc_0@Ppwbs ܉tBAf Z0JNV7e\yn6_aUZz$(,<ˊD"LHd@Zސ&8U,LK}]]'{X0uzLR~_¤ z$p:wޕV -@ip!_\"Nm!]&&i[烈zbSe"hr/]dU`,K:D~ ;:џпFt?.3bP1_#)~ծ1b:'. I*F-۶oBD}]]u6vb$W׉3$Ouֿ9QlwV--wǣW_{%$ۂ^-@ :M 09![.E0y!@_ͦ',]6>H@~ȅ٪buhI);4BD(&?|xpÃ@7v%ͥ#>Ks= !WI(Y:cZ3R~ IDAT/fFF,n#NX_ZS*ƤjLBE M+">ͬCN3cER4͛If:>Α< /(Hj픏a&HRhZlv@i.0YF%U.i:[e-g@qx3IUrP]* Nص{&@M_֎(F_Z%i55̸}Q'tn/R8v.cpcER4ָYG~JpxoK d+hخV򗯹+&: 2D|(CpGg}yBPr6.?{a[rFJį^ڌ@H IwԆm>4$UH韢7a [z#_*!)`oxUnJ΃d-h)sZK 0/y^8 9ŅP)Mn~7C֜J(1ĮXFKR Df_ jmI) 6}CDyBB~Dž|M畋p~4 K9%?x/D&.}>YRI}J8F0X@qXeH0 ȿu|:wg5,?)nb笨=+dl\tX9'!~0{O~ 'Y")vI9ٮblxi6D~0rNQ04ُtEp$ʚbخ?*w}tuG@/ ja^DaxҊq@AX׸H7@q^#?[\ tEȣ+#PY2Xj_ԗ-ws[zh!1sN>ax^C49 8+@kgEN}L&.M ɸyi8t\qg2)]H?N?/%U2kVT Ks@YZ⛽!dE^fEd24`.T5TS=4HP,df9hf}%2\@\y}_S Zُ`tz)t5:t~NmCvVK.Z\}vr2XEǑ? ^ X>^ ﳅ4aIO/O1h[q 1509)*l'I\\))K)K)gqem)hWf䪯@SiT7s} d)2Ab:?]|MsSKdLT^`dDcs3Y.dV%oG~:tY TBε+p8 ob^]ʗ6M*}.(èv?DNaZLPӿl/?Q-ɳ,A3킗.ֻ@ :LޏcJȚ\6o^N[vpw]eEY WĄ=9c\o u]P&ĴFl8|x0-`>~P1cΚ2)!?.UDaBH$ H"ApUꃈ* 5tLqTlο1)=Cmy2&kX&c꼉msa~_ (YYzetRSeWRC 詀̓,iK}_q V^{MSJ??/3<?{T7]M)v䧱Z0yh&1ÄMX:m~n#) ZwU&FutCOWxU!+ !/.E^RWkrO1w5«/w ^KHGl8|;|4_VN$? ק ߜ%_ ^*ʸ˗konG `k pa.@ي_٫9oO;9<@d`(yծKv;`~glE] (eƾZnܯ1o$,י_t14w_Aӈo/0Iz q~ "Nkٿd 0{p`VõO4^Έ8Woَ"@ 5#q!]NFuhOb7nDAA̝=G51HKʤG9YFAQʫS^ ̾mh[ge_g|K+̹1}0yL'^,ʲ'Yl*/n@nv]bfie v“#Kqx8G9?Xۤ09z׿njB|DG呶?>#} 愴׭#O##h2@ @A@ mANTw Gf@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  q4 2߀=nmNʿ}YyGF^*NM[!5u׶#I69j4Ag]VF%mS;?eeiIdMby-J7׹Q)ݽaQŢv xs%lc}O.5*SOT~١ayҪʋykOvePOc5:*/_ $TzO?uX7u* 9@ІQ~ϵVZbr_m/̈́s/9< A4~ZD$< = Ftwm [ٳ%ӆ(b)7[L1y_7p[/ F3l GGŕߣONNwWLî-JG 3q"gsi{BRE^ [܂?25B=1IJ^}ǗN0|h,@/;f>T2 ?buYԧ'e4Mt8oyH_R:QeVI[ki{6,2W)3j?ymLZу'>E)G̻x{渇~TJv,iF+>4O cdmrsNu+GKX "ge1uNϱ(su"]+tol# ;۷лϣ{LK?Țb4?.o/ ˳n+s3hbV& 1hracFZ5)"@3W_sdEɏVZy)h\8`¶;:APD[{ V||q|>zZ^HcIJ'kwe}t* B@P4EVٟ"x!f疇ܮMu^mv݋'+uӕԭ%j>|{g_ 㤳ψ@>BI5zp^tȡ;}id7{H]̋L>l4U;c+h&VZxE.]z n\?C/.qֻLɀ k\ʴΜ'r~IA} DD)NHDe""VxTmOgv>aYm6!N+-YuH_[͊-6T¡d5{SZ\akt{n_4Gr:'rDW;z:O6t6) |3Mc%M٭Nڶ3l=!2*q%0JKjgÎtׁG;Xޟ{,Ww+je,x_ O<H&՞˗kNw\x#WsI;l8/On8PxeCvzNUW}gKxĐٵiD9M06&-v#kC2 %SkC:ϳ@2]߸~>*\3MMIV3'Ĝ߶z[dH4%_uZ4)M8废33qodN /Y*FNʗlfaBNBDA7*1Dd$Rdqf͋gaIf1" JkO .H).,fDTƲgqNNZ Z[D0 *5e-nx)K sF |4z$h37dU->YB9T=(|SUy)"ЌϜlY KV!+8*!.E@$޷34–=7L}9yT? lA+(AT% L[Oim@x=Vm&`EH cJ`݀ ޼u66p|КU67 .S4;`ɾ{R "e2R}ݶM}pfH3B\@zKpnRV=[v;e՘6oMwPyz82$e=۾^4u_gh\qxt*/kB/$:k=<Scm &\X%hZ0:a`ͥKi+~zWeVAF*Lfrkoķ!lG (ܩt F b5F`ϯs+(Uyte$*(X8_^@~KL ph5W__B9)bQm}EfF7;~-YkfqsΖi Owws/ɂn{"#`>|;^]MY\ J/////z"M,Ynpt/ĉwC4!#<:@a tӑ);}w\XM&h}R*=qF?ӥ/jd]Ns0WWV5`.S^ | IDAToZ/Q?ۛ gOަ4J-Qgh0Y<HJou$4,0YՙL=CCCC]e*&1]Ď}/0uA?g[@Pt =ݘ{L7qM7S>.^:L>37sY%Jl0bN?e1DLwI=-O+녨wւCXw56?&M&/'d;,+bW1YKLkcd{ ݞNKS=%!`>~P1cΚ2p(U#8S55LbɋxPVX*tXiJS&#"&q$*PW=̥kꑛv?kQ[N)Uo$77.,c/mxixZ16$ץl3=VEvPպ2 0@?ivbRO[=)d9a;<}.JdOqVhw6R"j(7H~;j2/ 7pBįs+ Լ8g?J2_< fRbF[&[9Oу[G*3d _g2EJwq=zw-&\۴hjKO-}8cVF;Q"kwI{B"!ҡ7xLx2$IbVtoe)b|IT<ՙ]qOǯ\~-tp+=׬Auy0 F~R8u4y?}(@$:a0x5)e.:D˸ԼIK9S@NzzdԺPJs˿yqk:h q;yA,<(bD>x.M!Lٿ}J/s.`{̗2Khb^%eңL#(թAz廝&Y5mvW:J/p œ6С&we)Yp[;+y5 +Kyxp&?WS6Gս8_ XG#z %ۭu]Az ]]xV'>ZN:Wsޞ9rݣԉȞDK[-! D,ͤs3?`_Ca0z灃+Ҩr I|T7@4:ڡH+ڍ)2Ջ)RVKQ%#tϭ<s$s;H @ @ @ @ OCPvvv8m2EU8Yʏ@ @|O4b4-Y~cCC/p ORQe׎Х`.c}|hhĦ@ m_fGy{:r/YO[S{9 Rݓ2 E^F<$y.9M/ώ_zچ]w&}յ ˷=$ pTm MK/?@ 7 B0KG#y9IC.iUof7)ԈwTcEh));ꁊ"H++YwȤU/~(Ł *GUbƠXu5rL!ꢬؔ҆ ^xp.N֊qW(?@ 7 BHJFRNCCCCCC/XbJQi:x0rNQ^xBNqaREt­A8`I/Νz#:B恱ԋr-f\b"vjn/%=>KLB2G @.0 D'=|[>qŕ@W<2@̎E_l/&m:qu5I@-ဨYR$Ҝ20P&ʞ"㽶cv(K0W!^F@ SX" kCwob#Z d&$e_iI8 bQsem@S px׏.9{vEKD%Cu) j 쌢v{3T G @A^|q 4uMlFZfRa)c)M!IM20?`1JOr gMG_$!7LVxu6SF@W3<?{T7]M)v䧱+r9AU9lkn u'>X" OIh˓1)]ZP/@ !hBUmwj{1ՙ0;EOy481[;+y5 +Kyxp_#! թ K6I){vѱ$?2v1wy// lW͛ip @ }A]ji}n78HpÁu;,zG @ @ @ @ @ @ @ @ @ @ ;$44444$=2BT^gM"*?@ $nNwWLƀic{Opg%K~A“!Y<f?eɴ!&XiàQcc.>]\ׯQqv͎{UFUq6QOs sb_>/ l /߹ sh焢ՋJ<)Iuܾ4k~0#sl/VͳCc e1.B*¬nˋwA'ǧ6~8Gw_Ի%ٚisϟjY8JY91W=x[|b4nv/ Fɤ4ޟ-ȍZ6ml 0vfIϟdtvbVӫm5[4 ɸB}pCNKQ2=. @dȸvLI76Q`5hKfޏxi)|!ew>ٵK!Gbuۯڲd~qEoLj(3]3j^rhlOQ!7^ԏcٻM2}ڿXΑG,[i~4);af֜6P'xĒVʓfOZzXrܾt[OȪ Qӭ\IVSPww_|ϛco}@yIG]Q~c=_TߖK f6K&,EdѾw24ǵ.˺6_XDWz% ^Oqc \teשaޭ]gB2woY| 8Fw $yUNz_ѪM?=q)668@[(1`jd޷JL\ևfi?/:|io2+?q~h@}z}+rHc_њ8|S,sX6±a#}sv4~e'4F6(DGנ)i'5UsGEn,=:s.}޹}]k^l%fc9+?P.p4*Jx.SP f=ēҶ ]bt!`׿v1;Iɜ\km5ArR !8ʼnN-]EUfnc?9IϰcG\r$짏"tʢBV%mx9uĶ񫯿Zd(SaZyPdB. Bu֬qsZznﲬG8NYP$ \{?[/ iRZz6q@eg߼EVҫlz6;G>bCqāNڬ,."Y3Eb+b(kX ۆYz3b"@g_U7MY-2&qFW}sC*"g* UoŜy)N֭Y߇5KE9ԋB&!44 Yrjʺr`uk=JHz{z\A ʱ2ߍ-n힮Ҋs4mo+^! Ah)dI xOK+51DpAY7-qZ?3_ÁNN^m춾}:]?\X8b4m1UsHztmآ_`dwU*7q مK|fXCgk(g*H>cS_@h^ ͊ QA_$EImG,+Te!K@ZsGҭF![tbہoȠŻ6U>iI76oܼEl)"0 ]Œ}ƂO~+m5X^! -Oi]nU7ɗl|Jבc_!+10 g8PZIБ@ */13%&D_4(׉0@ PF7 R#0yt{$>B*L;w~_B2t`5?7۽jz!ͱ=PvƤLB=0\C}l) D{4vM\\d۸ _pi:W-Wv`X2Ck,g/ټSO:XtK 6Zq : ŝ,? d-jz~KɳGjV-墠 Όr|ךW\ᔻSN\<%̗զ|ۭ}7:8^ִUeAT!1?Qn۱K˪V]b iuG$= ddccd-hvm kQy}F^f,\ V^ c6+{LW~\\tdVI^}Ny=sAf67m;ۉ!j^@[=Bna~xj̉92#ɉ =}}]G;nu={v~W0Ps/CE??b UH{lfW1ߑͦF}k?s'\Ih`UiMgwؘ7]CAUG6u.2 (͓W4> V6aդmѭʯjVh{!͆=|}9:yN~ õ5s;zI q?]N:~Í#|z7n@Cs{Xls፼šy$ ,'.'?'$0TCaӫq%)O6ɥE]p{yJzմw= hې&:=WW?rz| %=9 R߰^DrLG^q֮g3oUvWej2=N+J0жOk$Rzz̐!-:wvK96VOڹ@(so>?A*S*y=c9:},;f=?_&tXcL|8W8li1t .NdcuR~gS9+z+'{h0|`VKnSZ(V;lv<9{`yNʯW(9<# |0nK=.%19Pc5w7KۡW" A!RrʹGkHAAA  ]׸i @vi25            8-Wg7@A7B#|臁 ٥CjnȾpX'0ؐ˸򟟮YGx'6=Zw97e?0WiJf ɔgBlZˮegQ*/܍:.%$&yp_NGKh}_|PdRspBOxT~83VHCM"2r* w} ԆԣV}ƎkC3+۰|.!SK3P܇z䡂u - IDAT'v雖eE-_@7?b`G.n>ˁҪ?䁱=:8C=Rqn'F}Bd\ݵ{ͥ:ܝ7Xn=ݩF3밄砵? r7s)c6hFJm򲤶~x֔?_ˏ`ㇵkag~>G' ^ڳqB3A!RkdYv [%-g譵$i>HM*yCٶz7 w{4Y.)T.#|& kV77Ǚ\PwRm\31WNdH1mQk2UAEasp]!!,AK'/X5 m.A.楻S s?[=z*%1;2,.mGNkR:{o+m¾XyӃ}&m0qاau7oDkQv@^N^ͯr".%p _eL۾ߟV$^ZB JGDH02Lc 776Ԯ:F=ӜWsf/83 5s!)ϵۚ g=l7g1GE3`. }K_]~W.(K&ɉeCei"Fssw ۯԋ,ҿ ZX&p+$Asl@P*r;/z)1#ri箘INYgی-K4n8h{S?(8V5pӫirL=x0_e]8D53Lxl`m\o@E#5 >K$sm_LHf!A.ڇqL3~2؈D|Frg:0iuik{@Z}QuXi4)5 kYEl$?=c')~);gThGV#1$wnS/|<è1A/:$/#=P> d1*xAiJmV@A.\lv 72~-AÀ&@c_tŹ~7[g6ݨ' (>K*PQn|,&2{;:%wo;W+>rUΉ0?=o^毚S9ᴎw3ضy9?Yaz6ÉlkP`l,G !^yrK\^-qm|o Yٍ]L ;VMi@Ak4Ƣ\1VÃ[:T6TwۡazAZ @ʂhȐ|\Bh&FRp|Ӧ>vgԪ4n).ZiJԵ?:z U}.wgSgvf'.6T?\" S&!7mS+~\cx;X.'s]'_ρڵ ]АDlWOxDzim2(\tj\<ۤ)WwїτpJe3)hrO}p rIIn p.{%ژ~4 z{U)N%ۼ&?(jUhˊ {v]L1EA]A!R}IR?Er`NWB <:Ȏ(j1eKH`.qÓg *7ʂ¢՗密B')$  KI_%dI٠$(2}@,pz}4(rmNS$40:eS܏N7I>Sxi< f5}[Aκc I}ɡ)s|~piKlΎU ήE1qp_ڔЧa?\ثA6U3T7̒3Չj|̼wW` ;| ΍W*!mOzgF``-*kRI?(LeR44:Sk>5nGQI /oZ6xv;iVX  BMV1\+L'}[ksƚLV[,#k5Hp 0Ɗ iVKW^/}43(^eeTV:eI_lCcx_SA%uJ1|Y?zm?k eTK6-`\JUu{PM]C]|$y $I«&GdS]"C+skVoQ tٖcl:QH]HwpR-ZL%(HC$:\/xȢ͞m$]ez,Z u~1coJ޲Dj?1pZ9Fd% K¨`6q&7rbR}Zՠy_}$] R Mm+mgdgeI/ް@ua'2i<[[[>,,۱leb96'M۹ KSB'>h:Btۼyk@Q~+'g**bX bj EܥKq ETtT(cpYx)$1&탕k" 7;!i{MDLCr(C\Xv޶Dݸ< i~.^Yדp@)@[ vty|c[o)E46"{.=0[kVW`2 h6l<"Uc}W6⪗Hqp,֬|C}:u$}C t'D)M[B:i_]!rGʬ7o \3(} 7o jA$-aρ$k/2f?HC+Mwڔ3kk~y Hw6{0ѝ_I|ʬˑ)+嘲^~>ٻK\:`%JPS@I- 4:n}=& FKhW_}YSQ&enu/icZӧykm"0p/G'S{oCȟ>,{ԧ^ɦ; _+"(m  AAaNԐ`*?1D>ٟp,ʼn &I II^z<";_p|\דHqT&U9'+ǣm׬0A"0ϻ*{ VO,Pߕg[T}].~"lFÁVsgL&n=?Pϲ1ƔCyϐzhw#}CܭbŸ__1QO!|w L_ޥ,⩿[ ~qtoiN3>9veYY0]imۉtN(OzWa&\nEN̟{ wزxs=_;n)ؓN_՟ fyҵM+kL}MAAw<+ӎ:plf\yۢ"Z L ruVps;t2[v/n'FkAНw4֧3[;bpF55夙i6"bjt4/Jt'A!^1vb 21Ck4]1K3 k8RGQ3              ? ㆌx#KGQE|U/0OaΝ[VORӸAU[~_5_mY B! o{'Wؑ8)CB8.$(}y\pgOZH2$]8 0O[b2$-Zcc^ vq!߳0$$ם۹)CBNpkZOS tī/<@t/P";d>k  UVcJ;O<倹rQ?61 l&xiAK uO;r:G: iޝИ͙9YT`7^vN#!Zez`lL0^ !HB]m\2'&S(}1dJ1-Tuob% )܃c1C}SdєiVlN5uTU]/vapR3;ڊY  HAӳkoZ4kc+ hU|7ii+P˺qLC)_| EdWJ(ʤHSk;x9IQ2ŽeCZR7Z( >D0a4((ia\R|ZF~ۓ2Wg5OMm<-kĮg!!ʐ_( ,O;P󵠐"~tƝ n׶(;ԋq`1+BB!~^+*'EV4z|hC$Fݔްhܙni!!ʐ'^Οp 0_[_eHHsٝFʐ,Vk]&T,*wC@i&{]"÷ sۧe䝧(ʹjs56*FgeItnm}SuisQfJzj8z~@Lϓ$d ][A RRߏ YiF`F&'K?? ;W e9~ fvrI?_)kcX :pK'_l7eCM&LZ9H%;h٦MzXC"WMxFYl`Kf1v ʐF9 z3a3G1wB5ǿxx_x2MOq~1+Fݙ~{_ ys7c{OR̎ hOjU:fV홐]9~1krs]@Qz Li`bPJ鼎`d ^QUM0{V:/dr\0ӐeHy1sg`>YO Třu;GnBQwuSސI/Rչ>gؼH.7kIУ R||7yz|X#؂a@>?|Usn²CTN8G="?ٳɿߡ&0iTHuE #Chr WuݞgMy<0k:TĠ\F4^BSpE˒E-Vyv'l˻2}}*IJ)Ub\ `t~HeٺO=rPxuJiS]zM Lr':#/J{ <3y2  UᎌX$3] +N~Xc~?s̙3g~h݁EV Fgľ<]/^AЧۈ7wgG UrĐ}/h|tY:ukgp pكK0ǘH H`4!Lӡ\#uQ$QJi~@U蘟y *ɧ 3?Y,bA S-2BtT\Q|@XHBCKf :e{b6w漲Q ln Fc隩qŢ@)83aRp&4pV7`ɴPSmz t`ͫ" RE Cܓ}/ڹT??OuFDytF^Oqx?7=ϥf0>߹ fߌw/W`CmAJ`qtiд'}8_(10x?pb4~Q=}{6,z.# K\7)={پ @d@tr6Fj*\Kϐ f!wYCCXMF *M6ײ>#O)_=AKkHxfvA7UE5zů>d*>C0lyOc%Gc}>V1֗~|zb/wYI `}rݹ( AA!S߭:@& hϺӯ)0&QyݿgG:"ng̞>#~M2ӷ :H',ϐbZ/C˾;4U7ySP4Pݗr'9F-ӒI%((|PZtAU~2A3lm' YC@aKZ)O==jaY˩s["3f<- Syb6ȓ^~g}7 o_JêOGAABpP4d?d=Ǖk{w?aGKێ>*ЙO$N]|*']{0ݹ}(ySEnUGQ-CM,ew]y{^  U(|':!tOWћ huwL,$9Q,[7ٷ{J+*NYTZݻ[)!OnSAA BH]Hwp㠯p3:z0_bX2XpXWlnBBxoLZc7fͷBG;+AAzmھKM6n\ Y^ Zk$Y t`?29[gJ۱,(2VAA>(} 7o jA$-aρ$Cڅh:I<>"Z)͓W4> V6aդmѭVYrbVc>C6%Ԛlj>G]r$2~K4R8tb  H(A(Ow8>]#17X̅ O5^]>3,( .n)J-(!:ݼϰhNtNDkuqYg9h~mY{(D?Ƶ v覔'){rEEYOH:!  o zf}urQ  -5   (AAA!   (AAA!   (AAA_263vT_Y~؆sz7a{${f;U>C>#P.G^%R{} u\8"dp'NY$ZnkvM gL+}0?7?joQeۿ .7y7K]<ٯ4ŢΊ=w87BR&uUY_\m+ۮO/7I__WQ4qG ua&$_[ܔDR܇z䡂u 'v雖MNljQEWw㞼ͩ < ϞuXBc5sE9ih_I;,yJ/ W2SyX0AdeJw/#=Lʌk.0Y9v +?VMsGs1^{̷sWf=ϩ֛Σwamo^OM/ ^QI&}s_F35? r7s)c6vܩ&/޲JT҆ITSbh{hnq =EݦjݵΟ,wXh+M׼oՓ|Нz03k'-fUؕQC-Н HAwВ%K;VnM3C[ iYG f?D̅/zqA){d`x9]81Kc*6idGK˷Mܠ}q|t2om0q(ez2>ܴtoܬDɧ-q. t c߲ zR/+ߎJ{UNe4ci6R/-ks[o2\Z: hPS)楻S s?[=JG 6aO-2oވq??02D.B]TuhZ 6|w\fw?^s[QϨVu+'6V=:{ۗQGk۞ )=طԽH/baDqsk*n0nE[f]0I؅cre/( ߻cޫlg*a],=9QO)yvٺK>jiʉ~2Hx2_Is5<+1 3bE 2ӵ $9=;ЉqYAf:FCRWU%ە,%y?^ŗj{u]rb e }j@'P$EE^g XD֓,>|<è1v/ChY*>J (B#HNH~.nX-!FIh`DIN2S}~˖Y6t:^~8oBW!Y4W}JM_YnM vFd%5u `{E2$7W\qY4aQQ_hlcޫ(. 7㇏|8#DR\5{zòSuFwn@ޮn1ؕhD`T=i^?v}2$}2̇L^iq! s4g={u.-! 8oY;O+nh&Fr(uvm]Hau9STxGD8u?}O\eTl.]ڝc@ڟu?T~g(cū oqy!<ýE}`j Ydz_Waõ /Ǵ w/6eµ%j>2Kve(JfEze̼xt Nxv;$܍O/AʦmpP4o{DnJ۶GǺҶ ]bt!`׿v1;Iɜ\tNkf!+O9}/ cn| OHRA?Xznz]߉֥IǴtg&QCɚ- nm_ZYB_v18mn"Jfd%ܾ|Qmi<-_/C5 Yk9(aΥ @ ۧ"P ծFTUǽ~wϜwo>^ !Jޭ׌`n{N yrcO\u^k׶ Z wTP%ds5sd .%Ve|Yl&5]LyO k}m 1eR(9j-5jr}.\Q..7bwtRb=">>_LTI܏ ó &v[_Et@ PV~RtlྭԹp_":Nn3OFV'[G9E?gԾֺyIlbX}8 Q^TQ^Snq@ԑ-W9?4Y1\bv" K3wͦ7o3rQf{AjK2T^ 2 YܮE0b:C$EEz3=>0hb{rm 0dK%<6}}Ij&_7.V:+"dy yJŹ/Ca|;{6`1[Ȃ"3AS t607^,Eq1 ƍ݋>łxSRm|=Zo2ȥZg+iYi $yE/GؔY!hVنp&A4fRtۼyk@Q~+'gHq[΢t)Nac~ceoO`\@qJ;Sou.Qij룰GIM $/3====3Ge2s33rյ^jVf64\ 6I^.feitҧW^f,^qڇS(J}H]A)Y\5p!eʪP& n륾nYf͚5b x]c:|t捡\M3<%9dH[0f<'OmFo{/1룩~p%9N"/*D#fVV:u Ӡs~c]Isɗ38ӉubWJT%t=\ĕ >ƢL\%9Uw&dhY>(??vSkGƘ &ܮJ6ahSZlPci@a8b1@c:J)7iAD+ʂ+kYZT\ ZW앵 TvRB B( ϧ.9sgy朙3H#Mv`)}-XӢhWA1?龛vo)igMg}aX `h= T<>  sn%v}Z!`}B._eR -%'VIbi>m  w@}v}bYw0`: =Ѵ~ᤜ'PA扭'g͙y6Om=&Pဨ(+z3'L)%wm'l yvqh| f7qi $'={̛:~3/bX dܪSS}8HR̿!dQ89dGeXokpӮ zp 7 +V,>]\Q5bQF2o[ЦM6-2(i2{̍#w*fe-#W|spvXɷi-@gVV+bʺ(kg~GZlgk {s %n䏝f^V(՘i~tտB5-OXta]J˓O[q2Szͩ-ǵB~}d=z2SBuS:Jj\Rݑ}kUvET*:>t  EGĩf}@VS\&Fq",\UT-Fx4)#4;v!0† tŒގԷm/ 0hG&1"RKSE]  ?gYexs2G _-0|[*zǀ Tқ'~+V 0|`+!?> 0` pX` 0`KB0` 0`%!0` 0`%!0`m`9fm~FmZJИmXbd|\M2^/?M>o4i@/'S*,#Le_.40uչ^I: gbIZNeDMxm6~$O1scSYq˖1d@+b9  !Y:w|'}(Q"dXK^SpO;^;?v^>z͎k u/xjF@$XfFvE-hvZDPpo`S/g:*hI Onj +.0X[1/1ϯ` 5)O0rƄ>]+jڱDM틢毺V.qsw6#uR3O*T'W?Ch=-@d\+JsR0B?M}'/uIC3lzOҟߌ9Ƒn'Zm9ю qP~Cr/جOX[gkg!qEыV6>4gOf-??fB~}"ֿji|hxI˝{?rޓg.Y([e!]@+p^\xo>E}cG'ʫwxK5ބ){B 2.E<>=i\~Il?v\Ҙ-Ki,XcNGȆ9N 4 Ú NX?; 4Z)kO}yIRU$ڈM s oxE(šχE ok@AG.ɸFY-s @ Y^#ΗhLdRm &=V7hp˯+l,_pr9)Ƕӥxu]+6)#0iah(nGhe WTRΨ.dLLwv`Jw[%D({qcW틯 ;Iy&۾bN֕N I,8:VOjc1&"( x. IDATHF1J ߌJRϠG(u.o0 @XafN~._CsƜ\Npϋ*~ h1. iMqa~5pF~[,n5!0Gn9\!ju'WtB ?rF2'9F%!#~#&!d۞WfunG~^:wⅇ9zJ\mGwZLZ#+j۲*j ra[Ex ȱNYǨe[DZ\;OzvmIb+UyM BsWѺϜdT>M9$pKdxTjZ%]7,fыi :mAH}Oڴq86' H!SsKTh(Q^|ѣ:;tN]LS ]8>@qMA9P:wt^KfJZ Բ[O ~z|qCĩ=BkQ8r[UQ }c,#5ۧOL~'] |`嘈ݛҮE`;G6Ȫ&Y{Pͷ-&N.e7x° Azww22%lNmb$.x]7M%cg m< iW0pTJO(AU#RvVh\z,m9_,]AEyU3g)l㠪>Cl?WëS̝XqaQۄ>jx&d9Rd֮EՕzm]4hdN[6|{cF$< !;hλҜ{12>NF[tKP*J}Q踏@XkFYis}Zуh=xgm\/T*ͣs8sG=jH\oj@:?OE4%r ?h:2rKΟ5ruۑg5(*S۵mM9]j%Ayv$~{E Ii}*ӲX;[f9+3OǐЯw/-Y^VOٽ~4(GO)dS/<?R A ;~*!hR>bcϟ>3*<^ބhzBoA<*0'^ls{k侍xOѿ;eϿ$R"3#]FV-GPvS4zC<9* _'3Vh3cƃgn|:iNqݖD/ΆἢxPu@_!s# Jg ^g;FTyQ <se@0@j/gEݽ"0mʐ{V%[:J}zUA+PI -1Bi~S)So[ ɝOq0?3[B+}϶HV]".c˭ۦW 2!)@/n1X(nap\K5 !Cŗ[zP,Fp)sl1 O}T۞_#hϹ{7`(UbDD5JU7+ԈfmW/xMlKA($qDTp#ԈH ht!'ܪZT+U+m.zpQYxQ"#j8 EM3. t>Gan@ V A.`oqKkH2ypJr Kgf\Ֆ8|@$J4qQ1ʒm+1:NH^V-DA./#6Ij@_WokxZy9utU=ޅ-fڦ㝲_*̎ݳ}-tS/R<#+8(xFImu`R2݈=WjV8|#x\K psUYzwh/3,h1-z+ 0)궂_Z&ѳ P,e%<>%c0:*jZ;V ,?_O~_8#c->V(XRJIH:nY`bC3ɿd74~qyUZR?s)5l1 :;SJ.PTR_N`( .L8t3g~PBJwS{.\@k(]!#Ct.52=|Z#b)ɭś*RȬs+)R娲o=iԍZvk&nޙS4* {BhQFd-SGc2n;HVPGh2);,QVR2Jfq+jJ?=˴Jus%zy73Wco^5~Ll='ߊK؆ރ< u%5hDd=`OHњiS[Xzߵ5y^c2$M bc>tZ3vQk5䕩WGz q7Ao Fz,0ŠDެA~jy|c{+):{SZnn6){}h6eL7[3#;>n܂&gݳHP(/3xFYj[W>⍺'ڙ[{ҋu;**y5!#xC?K6 {Vo|޾GyMybZޭXMɷR#:.Yp/Kf{~#!PSr$y#JMHbt+@}d+5\8-lx&'i5.@iWREkY=8_ L6]RAm6ޡRz߯VT*:>t  EG}س'|t*gἽ'~XT$QV*qxYi#꘍YWJc7;-XE@ @nh%+6Ǯ`aۏlLjH-Muyv$ ?vl} m;[Jw0`ա@O[ ־~:of  0|$k 0`͙9@ $e: 0|Q kv, 0` X0` 0` 0` 0`I 0`P1{Oo3j3RoC 0 l:lڔ>zx)'ɥGn2?8.ۥ.$Ywc#c0q-_,40uչ^vyXd7"䤸oan;0ն#yڎvb͊[4!]̙-O( ɪԹ;쬤C1Z ![۸~.Z;GZ߱wDCkv\c{lV 7"26+jFC[v"}cEBE!W]`"c^b_Sjk-_My!hƄ>]7o4;*hSD`})H x}̓ Rw_; ܜ}?,k;Bzj2&JsR0B?8Avt.͘im`\U-Oڴs=jA5UZ6[\QuvK0 ܺ)v>$­Tv+YSܲ_h{=yϣ6ٓYϏǭ_H:ZZ{/_+>{ 77OQ)@LΚJUe!]*5'1y{oxU^{[2&M qi=}, Ij6ublYMdJcpz=B6qz}Ц7lY4gpuG( y] тNY{K-]'FlH$vn x+B)M~>,. dUȔg˜'/f+Hcm׈v5w怺]?x z{|bK~QcR@eR,6QDrN.\"|W;@o qKf6阮nC.Y~5J yfJ` +6/hʳ>.dLLwv`Jw[%D({qcW틯 ;Iy&۾bHyq>H άӟqIA!J41(-;>QR7#kk$L&g=V<gjP[AyJ-G?B ,9%±ጝןU*}FA'crhh=`mŵЄt)0O\oeE8#-F\J#Iۺ+:!ppq:m_}1)l m"LL5ڷ%(<\*~V/7 Q- M(U[5۹.()g3jQ|f@anfĻlu#-m*HxIBɉ"5֋SAX]-7/o?yyF-Sd45jt<ҹ_qY~A(v? kxiWKcwF[@hT,@㛼aG 7#jxU~$l۳,ESWp8veҹ/sRSX?o4&GB*sT.;XRBԮiuwހ.QG/54N!>k kIxja2=WMDe)ȎV%gRq&TK}⚂rT-;)Ln*pF;$̔oo/7eb -mb$.x]7}"cg m<M}]kc>}b=B᳍?,Dޔv-O$9@V5Lljm6irJyZv, Q`P)?{Yww,![XmiW0pTJO(AU#RvVh\z,m9_,]AEyU3g4Sz9>Cl?WëS̝XqaQۄ>jx&d9Rd֮EՕzm]4hdN[ Y76 L!ȋm}[pTc#So}_}]iiνSd'JJ:v%K(Ud(tG ?t,54N̹|fCěo=ޥ n<@<:'O3w߳ʳ6C=~uBguh'IF?X)kDP/HMaiv7-Ϥo1!w:OMh$] bi6z&%ř9ܶҨ4[,]wEu ^:t;'y.Q1ۅ"u:~B+-_s!ZΟzU4h{%SGBȳb BXo7W AېWHKj -;'Ue?̱36#(/mz[R!> TzCS;I{V?kۺ]-sr%`jXiq3u3k4a%#~ (#:Z <6E}xVUw-ճ1zEA/`Ko_'3Vh3cƃ4ʼL߾X(ot*O8U`"A2ffޗnI衁Prr= _TgNz]3΃)=Mw$"h'n~لMv6 PebE Uz{༨yGVs}!V ujufY+CJWyU_ʄ .xrTR+"EKE P9TۖBrӃ| ??1?#OXua<-n^ډ:팊_xNv[7#|b[^IQถk,B/yVY#wqSS-wPqѝ{eef隣Zq,\X_d& eK\q7;߆mx-=G(zwynU9[y>mHu?s+n0 Q+Sej619ynVHeE2(c#;\ٝ|!H3&Gm$Ows@ސ&߂خMՃMWYxQ"#j8 EM3. t>Gan@ V A.`oqKkH2ypJr Kgf\Ֆ& <(@ƩF Z*K&8Y#yY- tQPFC5U^Ggkx2@Lσ!]Gl8V @?{ҭφFOnZ/#gdW*>%NZש8>ڻj˳b}m,QϚҫ);e|WKgm/՝m8D ) ^-9m%v}~ Cg%wt5ypc6*  / 8QR~_X*f7䨟 T;P"E%(1Jlׁ md=KAr+2܊fg:.vP(-*A[/TfzR 8P94CUx2e[T!LH)KeDC{S"R*~W̵WHF6ƚῴ?&t\(PAq#D#JxmCC*F?(7TI9vӖxKC~_q )|~Fk|( "8B+6I9LeUW2[qu4獺@т0(h8Q-T$}O]/){Vjs+StSGcEm?` r0}A흺g2@mޭTۤ),M.NM||g{Y8s3Lt&)1w=p$A Ӽy=Ӗ87' ^4x]R<:O:,W|oAqmP nyѥK{ʬ®>w2O k6۠ 6~ku;Ίs[uTovWVHAQV5[.!n#r9o~4iFtWQt}e Ry_sͣ|!Y}/Y\f_JKK*r9;En)c-,캏O2R;tiûظdL]+ϹgġZ[qi{&L6Zq# sjpwkKQ6|&k 啩WGz q7Ao Fz,0ŠDެA~jy|c{+):{SZNݶoGQmݟCz<}>~>ZMΫ6⽸YbE$T ;eҫ o]37Nkgn5rJ/b . -ۆ ,U|žDY_ z]yP.n=G[O˻u ~<R{~i'OI9O.<[OΚ3y^m2z"M*ʊ^g̉SAed{Ii IuQs(8V<:1Guʗaf7qi $'={̛ N[v^tJŗ-*0I'eg=.Y]!)aҊk.ޛs{=G'Y;}%wqlb:Ѿk HkgiiճN{Pp][b948Y%m|ꖯv}H6<84DI&-ۼ<{mAZ eg;lXiȘWkpZHMN mh7yg:|n@Պ6 ӦM KooJ$JW\dY_Á'/iVNCUOuʑˋ-*)7!iYy^cOrӮ zpH7ջzؑK*->dE| k7Kg߯TT*:>t  EG}س'|t*gἽ'~XT$QV*qxYi#꘍YWJc7;-XE@/v} CASn>v ~< X.ϒ`=C6=Xk`݂`>tR` 0Bu?րB;ۻ_0X 0`;ƚ d!v~sf1I٫+b_1`W&m€ 0`Mێ 0`,  0`$g1p`9fm~FmN|(]Bcbccccc!jH/$ӻ,1`AZ 0|$b0`ѹuOPō.qo+mۢ?'#Ew_; ܜ}?,~40uչ^I: gbIZNeD9:xm6~$O1scSYq˖1d@+b9 2id RvVRGOm\?c-yM[?Ḟ;"{wb!x@5;1ꆣf#Zx0]Q @7ݲܧ+/* u F/Q|uFΘЧ捦j)b}QU@0>~f$WN>tITY)vRU{UGf;{:f4s<:hΉvau <&dJՖe$<-|c}Շ8}_ձY ր΍Whej{=yϣ6ٓfC&!ՑS2ys&\]Ffu9Ny%X ]4@#4U벅+V]`HV .vVD|q.th<7ۇʾtUɻW%HoBܽ\!P" 4fo!&joi̖%O4K1V^`H#dmzaMs'Y,}@-蔵$BuLQm&@9h7"@VLy)x bd9vzhg+T|'j\Hw0 퇔|pOqEKS\~-_a`%ko˕Fy8'6˪E%USEa6_Th8)-˝{?rޓg.]Q<}v.*|y;㍚E&H9-.T+c'!3(:J::W8]qHμtˑ 9:8bGϻC2jESߖRfEd+{w%@N4a@tN:A/*}'@L [N03ehߎ4[8st28.?/;PVJ&B^ҥscC;c?/T)NƄr*o)2۲odt} y?rˑ n̹"Gq# U xEG 0YWvR{y#;J˰޲ЄRjlU}^5 SgltfFV72Ѳ?ئڊt)< bPcx>"y#l$B>ͱ o.8\ߵɹQTr>7TwQ8h=vgDF4ɛvp3m^*#ydf$yU֭<.*+_s͡%@̇nHO*dFvdϹrm32@h6O UsS u|Kr26KBPIMqa~>|HBXnh6zl׊sC.>1taûQ|wX@udxCWɧ;w|?l1;7Uo~"Α I^>f:x`q<;aR9 f/؟ކae8^MXapQ;Sk[ ^KdDCgV\0SjdzZ%/u.>2_'=unG~^:wⅇҕOI/}Dvt7E}9˃^qe:dbKΰի!?j;"D=LrYZ5+eguWrƝcKҥ ['Z>{Oݝrx m}[C /(&P]&_mYz!˹՗eD%q ڵ7T-ٚi*Ozol=BkQ۸÷K"$\q@vlr#/u:ɀ c=J*6kA@uFnx>Z_.~p'l9펺Y~5$Ke$Cvv7ܵ}q҂碟}"Q A ;~*!hR/Q6 fW͠ H_f|ӫ>8îC;IRo6YJI^#zAj Kd7oy&}<AaT}2mB#RGƨL+73D%ř9ܶҨ4[,]wEu ^:t;'y.Q1ۅ"u:~B+-_s!ZΟzU4h{%SGBȳTOtV!)MЪIuy:;JKsŜ ;QT'qPtKP*J}Qxu>EOTT/^ Ix~*60#UMx6Zx+6KC~6L)s@~/Z+*Z#n/F ?t,54s}oփ~0%@1Ĩ<k;ȟߎH+S۵mM9 [9]>E(֟UgϕO̐jF@QDD/{?Wae;Aݠxkݻ~4Xo*e 5Nӧ8ԟ-!j0a1RLֲr* 3dBNed?L+ʟ~O\# X9x܎ɺ KJ\ k]#{˾8[݄7 t?:'j*RRq nKYjOKh$@|z9AʯD^|Z*3'؉vAMiNqݖD/ΆἢxPu@_!s# ToB5bϔߪY2 d 5.Z5|{{E`3`ڬ!+<*/C+PI yR=Xiq3u+4a%+ U\Xn`hkT>aՅ-<ܺmz5k'**~yt:oo=܌9Moz%Eq Zi&O *![d/}_CG#W6GP瞟j}+k}_ ђl)CL۠3AT1&W$Tu[M@A8+Z'mu_'u*ʎݳ#z[VCu)'v_9 (+T;BՀvd3U`]P"OH79LVOz­IkzRr]? hJnQI(jOqf9 p+ Zr~C[ZvFx@̓3W _Xzo>7䪶57o0A2N5u0WY21T=m>Fjٮ$+/GdꁘC3%Z~}Pa8de>|/nV4'k%A/ՁeKbv#S\Y q-94|͕١J{Vm]2$MB@g=LQfδ_ڻS77w=׎rL,**ɫp5&e6ƍ2xr))o4a*Ll)ي>V UF6͔NŁyU$?kٵble IDATHU@PO@q{T!" ػb)g/ "v< g]A,A@J$.˺3ov3>]3R>/ټ{Os(}L %, Qs۞}1EEY)8;#]W,I(ntkƌq;^+ 4Q.@ Y (I* R!J4jM j22DCmߕZ +sJCrej,2~V>轋CKA#ks2 !шZ"Z|Maޓ4,iHjh).=< ~[dV&mA3^eܽyؤ*ZUK.Q۶\<]K5w~CүO5|.Eҧ&1wq*C dl݂R˕+//d5IuU!ᔣ@ҵnfdJ )~Y)s@ҳҁR원b$0z xe d1kL;s}m]VvjT"-HWmPsʳsźm ML\7$p\9j35IEҸ)#u ѰꍱQ{l=i;nȹ ? G<hʾ!3xSk'Qi%xeeb*̌/rml;仨 {/eQ#m!A-$c֍0!֩_SAUW. Mn;K&j ffiii2&#!y}j!N=I)gڵ!D$ j, 9 tf8x YAm@)FZ\Gω,S^݈ by(ٟxZN.fe?b S6_H~[Du5 F'5o烖}#txPHq4ZԎTY>rVYWIrnmYL69`^TвwG-䴊ܘW 3u8x⥁=.-~y g3ܤ)Ź}i~;& n;RJ>%ֵ*JI/;l ‚#aog+zJHD O8Y'&<ڿ6$*]ܼ_m$IxqA͝K_wY/\UpNz]/feBv=7d dˉz`!9ru[S̓ OIk/ *z~>ǬTmA+^Ey#+<=ֈzmkSͻu"{}Gxv߉?*zO8$$0=iS,ƎE !n̘4 ļ̸痊 W$W5&!@@s%m=&$^@ľ~NN=M~}(:x5w yv㑛ٿqb9Xw]kaόHj,fO ~}YֳBmx]b`}/]q=۬CcHtiqcXyab֪w_Gs&̰9ڧGX ~Tݬd8lc3nc0`BX̘$(_0`5+a&m€ 0`S 0` X 0`,  J`1mDǟ^f7PGn6t# "Qz'|=@@ ~jYu8]ǭکC$*<' RXnt5D¹9 }C$ˌ V̗A9^AX~ȁ3 Kg:OZ?s쫼ّp9f۷2zd}}ߍzS0^{NP`gVg<;G/GK[ZnvLbOxU[~YQt'c+/rÜ]q__~-}V 092k} 9ͨl?οθТIHƋ 酘'`F/U\PYh5L; /=hn4"lIYO\ M=2*1v1 ]2x=h1v\לM_s{(\q!S 8 yX:z%Pjs5;wLZu`3 >|}To:LYpyI |GBSt[]W&ud)[wDYu)~;A_$G\f ?/o4ݟUC%!;= D٫D]='K*_LuXq[-Ҫ-{/[Y7t.7 Kv~̓ν/e1J{, P^ v֍&7~YUS&)N/Vh zr8Q=lUȘ:;rݎ刀sdx}z\ IpⅭsjLevk.&W*.Nfh^3JS#ڌ5 H)Ӻ(5ë_htW2ꠄW2y(\ h6oN)V5ӱ6±n(4w/k|h@d]|i"Ntϥr䥲8Lc2ptYh_;οˈiSGW|/4+8cGw u"ex[)|B5kkcQK{u[/:_~tl4q'7ʑi{NKXQ/\UE;}-αk}vkvd"Ts2uƬOavG\e#if7_}Ck}ՖjjҀ_RR)U?k}vԪ|[5&oڣz**JOM),KPYgjHʲMԺɛw‹=vIC b0tKPq^]ެXv#m%/ Q|2,oX+<.0\"ɺqXv> ',)p//OEm[~ںIom\睊XW>'^0lY4?cgY?5Ԗ5j)"XtxE3*mOf27snDCr3'Indd ]L߂ q.YI#@&޾JENkc:$]AGsK#FiZYu*YD8'" $D-!I %ƹx:iדf: Ҍ5JQSh&zrT%BYSVk璈]dN&jܩay, KIJ ڲfGA0s]5tsuJȦN]N]5.oxve-<#>A!M\rN5`BY{cj=Z;=G˜e`1!qD7}H )|3:"B Lzb|I3Ԓ+&TkU.xc˗eOo>mձer? d7O]f*kC4`JUʩ6@ymBߎZg2^KYۗ'WQx]~ht3?cgI TύWZ8I>'0\AO}H bSS*3>$?r~ǙBTRqye *X$HaT ,wtI:3XT@e][O܏8Cۉ"ԺY FwȈ\ƒp?CDiRp8.smZ_~O^nUhtY<@_k.SxY"|-IJ^]QI ;N''fo`Pt7[lUt:uC1 x: yCΟzÓ]h{hUv:>dƖQ((꯯z&8 ]zk$C#/=D9O2I,k$AìÃNK}ۼeaM]q-k7칑jߊƄǦWn)+M?>vI#p(xQo7ks\A}' [ *@+"+m7+R? ,dZVÆ_J9jx@%B ""H AQH rUS⌢q!)(u2c۽SBca>}ŀ Vfs>}gݩ ^8nx.nV/OO Ks%U+OxzUž@k L,Q@ orqkc<|Z>i3l{mN/țAeFE?P,@QׇׅR{f *Fhc1!mVV4 h>yÄWʀ\'Œ }\b'Osp,^g)ZuQor]-nYžk;*G4ʓFQs2cLyTڟ40.,p%! M?p坂:1աfH(@̹ 5 8F aBAT+6 @9S ))] 5Lvܽk\YԻyrys9y˕+//d5IuU׸K&+_(gWMHYI)Fzv`Y(I-|ݜcdgH4w s+ >^Hby( SCXPtL--|nV6Ob#sn[Ib9$mfS^k&.*IZ̸";&xma2NuW۟K ;cXƩ2þ]I'x(֚F/sstNCpۍ7P *,@s+ 2v[2LNJIMFuk yGRQ80K-!J{B**^ fDILޥr(p6 ·dZd {9k3P^^4 % _K&jw:SR 󲳸BHľsɋpߊ/!8u7~-H'B!W.-·7 C(|7 \"VvGⷥ4G ֜ v FJ\󼿎>$axor6=7_KJ9Ÿ,ÊoDUw|2rp(ZbvNwAПDԸ¶9 q_e~92!oRc낒{/ic1!j r⺀tqp.򽜍$@%c{Z%Ǥn O>L kܚ):+< QBO (+`}817!QU[aEi7W[0/p^\{sR]֋?e?^(gU/feBv=7d_ҥ+PiΕ˲t&N}s~KHqzƽ@M||`5n^߯!e IDATNT6 '=J2 0`h0`BX̘$(_bb7+a&m€ 0` 0` 0` 0` 0 }zKfBw3( ^]ca&cvn@{~~ nWeTi?acԄ᧙$Gu֣y:*Oс=ۚjo` smtBnk'NNVA@D ,3N,Xy3_*metIxv3Yv5G5'*ɝ6h@*Vx?;c7} TNR.P}*)AWC$Kk r/8f) 'u5Rǃ QءЧ! x jOa!μ.+#raeې'zzO`DxO9BxWhbs^:$iiÿ7}S"߭O05hxZCIB?v3SɛrMZ@m=_Xq]%U#~Goht_&M~#=&GfKB0<=W =g,^#['<,H}z!ĉ:.0]/Ԯq%$=,5 *։&n#&k˙`إ+ZZ!{aNdNm0d\a ƚIEŜBuN{Jgc"ʅ\x;?Z}?J's;kZYx4Id8֎e7Se惼-ZNT_5݀S7R0e%+/ȿob֡{M''=u<(|3ey˚3Y @By޺9V[}妮.}P?lȲåWlnrP%>ʑ|ϕr Pi?%!~⏬1Md5T+hY1@=VHm1{wuS>F=oN)VK"Pg9FDU*嗻(@gG,u4@I_2 @TLHzW%{en6NlGO^;1ҺF;&>)cmczQ(i^:;R9~%7iȴK1&zhɡMHib/f3t4 JΘBx|V _!z=fvmc Jyi.>zs>ߡNW 8FW{DR߫9JU23l1p]볳_k'SdռEN{ItcmS55i/)hT[jl5ѱ$oD+ mk#$nNY)?A|Z_Ll;ȱ<;^Dqtwx5Q^n5#:hK9O ?aEZZU[ڧ˗ 'N~}g D]='K*_,W.^ c!hʡy'?k凑-o ?|kg9La#$Y/kڰ> n rcϰtmO'<т#}hOs /]!\w}?+ȑ-`ȼ]-E_^?"TYƺ#뻃.EDӱ;= D7׷nFO,SO$-h6w zM+FF.]LM^ސIG/D,Eo6fUʟ5h6VV:le] *$.X 4-JP!CyQjرOG)]dBAq1Yhgʺ1Ɏ=|N=W$9< ;%V SWM:TUQQī{\{ՑXI~i_YqiIS˜e/?sX9^iB7} $܄21iI![|`Hbm&\;-:>]>qѠ4?4rjXl?lxiHit?:fSe2;\Qmw'}%C~;=V5Nz=<wO^  ?}:_۲' <ӼeMZKΔuVQ{LZ-?5rl"?;dP)6VF Y{ K@.^$f$1 :'?737"ՠ.'&$?=K2Țџ9yiW$Sl sʂȏ2W'G#/ "?2/j;zluot-^ztHhΤ'mшY 痛3U6,!k(ݡ2Ⱥ=GۦDhEuhC'G4,/%TBFTM7|ˏ>}YrfʛnLՠ.?}*R¸Դ"~ƇĘB݇{3r>fåkHM5?yIPdZ}l ?\Li]Pn]~h7.~6h :I{u>$~HE+"/>+m3@iﯞ|oρ?Z̾>^Ly|򃢵o 5eq<ǧE_nXNqѸ'b\,ɽe9({9 C ^<+kR,B9Z&BasAqO85 TM]i[ME(eWmw%n; 8γV<ػw$\q\ZW&@E $PZi'u>ʩsRKzxEknޛ>vtq["Nj6)?-[KA\)Lέ)\i3O$nEF0֖3}yrW,G1qS|QFBg&P%9㽡B@3;㯥}1iÇ$C%Nj|{/絛:Uc0;."$.,HeBH%!W3'Ҿnj AQPRD$2H 2eeL!ĺmj:jxr)`J<>?(г)p[~HD-s5Ј܆iD /n:Y_r%U^F1N۬:pSrN4~悖"ܾ't_ ܺHSo2>γs:/efbmǯZwMXbKx9рAbt;Jվ3kJ VA~pP1˖۷dy>sP4@S6L"rAN! Ri~TFV&p(_+Q>eb@ZQ)`<}dAF^;}]u#]_jf|:JզĴf!H^ F[BhLJyQ]hPQė66?v߱?<*B3~:o.PL4[H|R6%|VdV–攂6;\?T%g?c7v2mkgE2{vRQmwW"L+E|$ߝr??9+ϒ2idRZo5}EpgAWF'hb1˛. _.7 ;Y'G{nYnTyu%!~ r_7oV<]KFeQ/".^R6qǽ Y帾+E^_4L'M*@4i& jLsM-@K+3Tb|bn 00a\- >fGqid\e2B[> G+SJ>vPYyNHҘP@jgGeb)(kZYQ3oY& jY|E{gm@UP @kUXn "3Kv#ư@жmE+ԃQ71U#> h#1*u}5(Kr]?D_( H|3xQ4DTjƶHs/o`)).̑ tT[9%*Z WO9@дdQ~ ~Эr7ܢq]zt65v5cͶnr[̇znӆw03:ݐsA55lZY9aP=Eʏ/aτ43$c53FD?rLXgێ0|375d9BJzC%܏ _pg/CtaوUKI ;͘lNРA ̎KQMʜ*SFVɞ7-i1Y6C/dCV^\^O)M(Ү\~=Q~ݎȯ _QǻԮ#u Ѩ_=' LFzu#&|wm*E/?X K߸2{wl<"TW &ڲ6mr )ZwlYs<7?թǢg8x⥁k-{w4NN(͍}5PQFIk/ *z~>ǬTmAH8׷Z8o4ޭW3Rq^li8̋{wcXZ36P {v"4JS/nޯ`_$ fЁRiZ=? T?hy'.fDZAe{ný2m-Ǣ+PɭOs`Ƥ[=h e=T,U^.sז:V_(nֳfe# ?T[h`ԾUyeE/ybY hNTQGν1x w{^$ZQ=xMn)xcާ\)4HGQH^?ǽ](gyGT,8w. z]}|#z[Hb%` Mː`{f=B~QK0#t0}<淿ݰX0`_Bkջ9JfXKӣy$5ѿv\Qi{:+[jqg ~K&;AA٠Crjzh;l.xqqK{toᙎGu֣y:*Ol9^ض^KgJ`:ng8ieWs-' ޞ3!IK2ݖևFԵ]W9Wp9fV4-H% gǰU2B8\= a"'|duGf{hF {m<8U?<;G/GKzrLO7':"e&r8Y:pSNnkQA£CO9BTn\Н90gW@vW'Bl-m21(Nʝ3KW  0\h󥥨뤍7Z qTN9HPVV~NI+? Y~i\J‚F- da+|Ս?57*jd#zs:m{gnNUS-m7Sg ӶVjO074?YhN :<IL_}plX#C 5{aaaw,rkE^Mo`2vwX]l .TҞ8~nKh1Î/hKgٿY}nǷNA_jjkkRkU;=Ӛpi_Զ-}G,'8&cv;Ш\ G;4Ü`UqV{j4'=x.,TA[j?ZZ-pMoIlnM(o"`kn%3{=Yұ(6j?cWxպZ'Jneǝ ^n/rb޵51\;“iiaYԥi4"2W=D謎z% |%O9}4hG͚)ErR 8< *[ʤӣ"Y7r*U)4cMҴ|T_) @f(}?"0c@MHk٘=+.>iʂ;j]էlfOGK.xxL^uXqTUkO@Lzbv|@RQ&c3*M8aE I%z}:j)'[|`H:k fA+<:0߶P Wql2WRպi胖~8s$ !j޸ ߝw2(t]uy[0`P9j+R~KO+gu}C5\r)ÊagXiP,idAs%jA]|C!7Twy|@.{"z@JʢCBNzb;.&&ŃG$iAOg@QDSoʋ#7qa#w?gN^V‘m@rQ\dcs?T& =M9_ćVMJYSF׊z)IuՌӧέ=p(E4{ }|Dz%_ }o 0` QzEʕ+X`8 G2%(g@4%BQ@\)UHtREۨ\ Ȋ^e,,5Sj8N]>w=DL9rInD$+.2ރԗ @C|f'>;sMv ;C 9/ݓ46т6y4U*+~WVشoZ^#G# [ޒj ITNշ9(?'gWj \vնf2w3ӑ֣V eWmw%,7vk2z>.Qľ{nDw+ee\$&6ܾ\}i:N\$l Ka.Z;7] /.7[kIu/Q\ spJ0`P} ܂ ˩@.IiOj$DI4Xl@dh@/,tpP_ t9]XjeAءbx-!.z*K Ȭa!KmB#+M ady>sP4@STDPN=#2Gӈ|EeqИ+(mРhJz ˋS[HeOIyn&;Ee~pw!jKx]gN)Niy^Fyd?F+S 0/3bE+B﷨C^!,@37;s렀ѫtqŀCKjLK NJ&7ie4].NoŢE-ZxUٛo a;͞2k`3>;[P1?KLwүouK_^5yE߿]$^zY)8m#F }:e#X?rNpҡme#ku̚TSV&dԑ9%& ;&ϻ^hGGQE`+FłFQƮ@h,Jb]AhݠTG98qWQ:ݙٝ}[1@ m%OCzcf&uE3M(r$ƕRKȕ=.^cҿ?OIFuP3+yBF!4V0@ >'2JZo R?̧VJ;핕̧WYΊ^vu<9,$Sh#f߁ /ɓj?ٝ,}S6کzV:h4c@ M %"SJ7zPwBati#ҡ?Na\eTiʃtM4ƚdkjiIKp W^yg7'ݧ{qܑьS+R"cEkMv8vrP@V-j*@Ie?OyAWӗuymOsT~?~<'emfA9ոL[qҞ ϫ c'`W4{xOx-:>L#%!W|')϶AyNF2y7 n<܈r] {{O蠇5" $J .tl' IC/MzVmWY&#~m mKǻiq 'd7t9q_;]7T|>S HR+,tc0d!UOJ]x$ܤNjJN$jJ'y.O,F<S3^a΢R 5vJy7 Zr"kLJp H/& ˾ĽTb ӂP-lX߯r;#{nRe$}{m%>'czY$¤[O͙yDOCL9re=|<4wͿTxIµCL'QLX8NN򼤻6)W,9z<:Om .Rrxc 86-&L`OEGm5fj]iKr"0^%VGf1a=}]P w2.K1RJAF{Br83Pe  PBֺ@ j,:Uâfd!ں@()@ :Qmy, H^^u@=@ @ >GUgQJKeuu'@  @ vFl;]؃@ d<~ϙ 7fOлlFF@| nAaD+v yGu5/]׸21L ˗mxTqs aW.]dmɁ? F}g/Y"DL0rQ"kihԊGp>hiV$ZUI>Q,xkѰl>WMDlK"g2+9I 9Ccm#s[_'B21_A5`ciJ+lUVW*ۡEg#wS"T_یK3~Wy/.~~h}XicE7\Ir3U['e˜A9Re gU)sܰli۷E VB0:{\1 +ڞ]9 hvt{mY_גs>$~xv2 KҞ^>vGt78mBȽ435 %m+oJkӁ wF7oyL%U9MUi띺dpٵ@Յcb9`SIx˕drSheyR/R mw::kJ2Ee{}Q^̍a[R$LW/*ʰO M7^W[۫izU:tܶv~}xtr`\wʿ G篎1\lGjE,罾?,/~|0#:ћ)B1~=²gOjE(M ^fBw.ڒ&Zs|JNm頡7H{ꠝnͮNQɄ7SL5˿G '1fDDyO]sz\R(Hz~U!ȼ9a!~VmoU pd.wNTkûϿ(S̼\iLG+~/# áy?/{ĮU^]wPւ7[J]8ǖΘ쬠S 8er =)g6,[déxctz}ٵkBlgq`<~KfMh rC.%k/z{m){1U~RMiۚ5`̲K_yÓ5\JoSʵ;~.b4<<̤mX!|(k^Į︼ԿЬ0_>'ÃD0(J&@a/rEû*_IWw6: "V' d Ef40>$<™#D:W{VgUג|J/-p|gк^ϳjM/ӯJ?& CJ]x^|)e?Ttrs@4Ո ux%9CfJܟ79T  n5̅Tm/gBΟE!q3)Z%{q^$%Ä\1$.V,OW~(Uw6#~ŊU5[TMF~H|O1[wn=qx .gl~G6#h~7'`u2lϜU rwU(g{m~UCQ?aDX+sJ#gO9ypo<$JGY>\#kCIGZ;b~$']زy{X<5o|4J5rA@K*d@ST\VYځAȀRĭ\rRI݌Չ/ErCrU~X.JK(m<˭#+eD&**aN\Ƴz|g|Y$#bWD=_p"/s*&,ڳm )kuѸ1bH+~zzGVQX貒"҂;SFp ')Ռ 5%7XR\(K^7ZyޱzAPrUUgL0k$//mR}#h.t D($"ލ/ lJ9֕,wλNCMZۛ}[“kce=yɻ_U@^Y\"$tį!?!e||CxQꖆ-f ԈRT:ߤo)RbBLlڟ5qYor[^`Zu8N@fGVIIwj g͸U^^$ĚPnezӋ烚*8Yk\xxx4 3nj.qj[j(V7W.rkwU7RDU)Lطly !ͫŕƽo;cmD(zֺ,(/o3bqRk:=\cR#rObh% @Ũٛ{W+I˗Iicz0Q_՝evT['`TAӆz!2'-yie IDAT 2u‘)G[t- P9VfogK##wH(pSCgYZZZMu_%hflK&ZVIyfr45bvTFnOJ3iيn61w\]p厑'Wfr4Tn+"^۶G{OX釨}^ixIµCL]hYjҬ@uLxc 86z8~vFM#˹q =*>o"_cՎc!],sjI#zռ:QsRY]#A@|޻7Clz&@'Ŀ ȠXu-cެ];D t@Vw7gѩ=fp2u0"}t:>& P # a͛=EIk;D)P #;ڼsQQneP} WBU-B @ @ @ @ C2LNw 7ٌ*h?췰FJN'o[Pƍp̨ooʞ#evn=fMhgIQAuz'aQâ*=3=uң] b8=~sw'U(h0}Ms#V,Ȕt g|W^iK0:i=݋ɸ~U} FkTǚM%i*Z&C2ZvXֳPw;liTˌE7xrzRj>M4n<4fd}W3ڲQ{O?y;01II?>5}qS۷2B}W}KMyӇ9PA:*gRU#Ҏ!u[V]^7R!>ihmmӼ0;x59!Dk͡Ш~yFLmY}ū~ϔ{MCvI*[bE l~T&9t#\&+'pYFo˙`[ )T(T ?o_~@LݝpKB:UבBj;yp4TyE:mD UD6qeKW?WWC^p<2zzQ~#~wbqFz&qs aW.M]w'W ^YHw94?@kˏ@ 4pPu<'7u{ȕ 4F5ٞ߁k)myYY驩9+c^Άsgׂ0^Tѕao*t<57oc2\΢`xɣ*8VP[mC aCysBҫ++eۖc.2Vn98_Nwbj#}fq"^ ×Fg?{W_ uLq!>ӵY^7?V}w<SjJnt]8$񟉖r[jli:hy +/8R:h`SDyݵ}'%Y<]u:b5ۗHb\^[O6:x b:p)d:hUYǦ~޺6Ft'W[j`Z=_@uۼ{Tܪ24l3o͏6wѭCqGpE?zѾyH2"xE4A~10vwߺ`6gU*Kj`uJ)׫{6ߵߋ7?|[c\^ˎT/V~+|CO3 $~~SrUՌ 5:7Xe8Id I@4nB>y W P;w\uI3 % ')CQYk԰"I%FRaA"$'#_h=ĹDiTwOwO-2r! ԈR*n@^|hPVS\{#Z-h΋w߄/o /m}? 47߉8O[&}E!M})NK0P9:uw{h+6EUQWB+e~q7jqXeN^_.WrBQWU#Xo"S[OOY3B\HvqIozo rKJԙ&DE%@-0`c}5;6@ū]4l0ВUghFdo+y*9wS^-[^EgBc޸.xQڎ<;XͶnmUI4-v'`t#K-/[P/B*y\AԲg36S ŁmOV9r p]CJeȦoClD.LS-$;+FWM.}viWGd>ռJ~C 惑TBa)P`ko~&[[gBZ.dB$u=5b6{wrƕj i[TZ?y/-gի_[YNTɮ -d*ZUvT1(feeeeeqͪ7T?G hy0ےmIh>M ?p`F:NcwduT}i@:dIsw2Cxi>wҐ^v-Z6L3CT۩=$-_֟epc$I1Г^7ǝ՛?^t+Xmc?ۯ2S#c˻T4o8Uv .:[2;mMUi@ܷ:5[r,D;j9e~Lyp-tc! 1e:A{@}#h|̱~[$+JcidbC1s;~Rz :Y;>kGz1YY%2>Wf<Ͽ<'[܆@@%ÿ^)yPWM誳:?JDY͠ ϴ4R!1r\tr97a(i֓ '|_lOzl>W$w: )9҅+wd=5s+r[ڶ=K|OJ?Dyi1ӡ߆xP[V!*xT^AduɄIJ2Fq,1OT} {Ld T%F=zi^c. zl> ^xvRy&gΟ<ІEF U#/j&la!ujd7[p}R oɩzӊ22. '!Qƨ2Hfvg-q᫃ FO'm8$,+kf3]0vޫ$ܥi}_S~ ":O[1Aׂ l^? 4K*.+bt93\zk|R*g+C0Ya5 ebj<H"g2+9I 9Ccm#sm$i[wr _O䅏w!S|\\F^p1;<7Xy+g:*ͣq*F=Չ"Qd#'Ǜ'H/l"oeXjCnd9nX*w%@ ]s¶,{>y"Af26j~}MAͮ]6lyg Q9>ӟ̪t߼Ob*{bЉms3@Z;i#,w;RsS817=5jꓠeشKLã[?ί`=-;J? Nu=nwۖW\S?fLر>~F+.{k5 D^N%{/Wv< c^Άsg5Bz$< @teۧ O&m/X$}y_יöԥ2H6~+7=uЯ?2Av<3= IDATăJpUM (5?#>'mT>頡7H{ꠝnͮNQi0 ;Wһk?(NJҳFooxSuĶ/=OLki1@T\\."gUyQ_R:-V"Wܨ{4&U[A18Ԍw O]}viw GrDeXv18b9k{}?˕-tݿqx?~F~1:ZcŒCGop m ў3(?޻-ݻ09N;yQqԐsK^=kl0ȍh(~$]ȑ6&]'(MA+\7ڄԈ|NG'ߦm͘D&(4:+"N?)ƣ6:i v2(DAEwKDTV.H6 LYm.&v:vߦkwT.Qɫ O_&ЕEIN<.&´ "_ $zyyU$I'}e>v1;\=>Z_5!i3}!g}ڥ!9P Fj 3{Ɂegs"sAk՝_j޴#fv_9h2P2 0 iœ\=#]/ B!ɉ}Ia۰ji6#]]="jiI<~-f@yqyUp'//.,_Y&(SO.- <#6B1} 6 lEyqC֟D@Po`@ҡR3d-cdI+{E3LzC7g0'~ʗ9;3rO5l@j_bH?5YB0J $%N5趵G@:E1sܽ*tM ĕ4z/IoޕMGY0heD:Ĭ'N%i]ڥ<0L1.񤢓ܧQ\FdLGūw Uoܟ79T  n5̅v΄$ҝЫO*{Ihv@ Mǫײm+.IbC_g _'XqwOb[V~k;_J2"xMZ|S=F2`ɿ/ ϫ֫sKg^)p;x٣;$<Η㸊۸]FK;GVQiw +("蘱H;:}v cLw7_ZmOKT32 qE8.M-&ױ;E{;}ENд`T)ux%ݝ.ka'=z̅jM8[o(CNHRŕK@!U0 A@SU]òϮd4гsUkTP9:uw{>Ǘok)9E"kU%ҵ *)zAcח(ʋE f˫:R`0P?e=ygȎm+g+ˣH*@Xp,6䥍YסP?{pb7uKC,=ocyF 3+|t ]\=9(zFS Hބld/]4.&|'ίm5UEB`heW:0@X(jJ8/s^߽ܿ~zF߬I*i7)pi7ֆ'Tf@3qdOOfu9p}bm*) ~IQYk԰"i%4aQ،H}nzڥɃXcDB GMkr[߿},o_@ O0(>tO33,H[~k+eXM'7#nX zfxw7,lFЫsg;~rƕMo"e3*4,5u $#@\ $ ^+p@"MY)E4 )  E֒GQ h1@ Uڀ 7Z\n&VZ>Ű0EEEB5wdsaVʞ+s=;}8ZcbO+*rnjHf&d}Fc+yBFi2T;X\Q]$2?M0a߲U{&?6WrSڟJͧ<ĥ|~i;ؑ<W?v6O5jCoIQj=.3+*/o3bqR+IJ<&j7F7Ԓg t!k v=KD tYȑ;}Gh({ֹ򼫁[1bw4w)(#N'$?؃^96*HXY!'9%%Ya# -<O#0 -,--ƨT0-'>KwS,FM@GݳZIZ~Kn( ݻZLDx'/+lFÈ,Gw7c [jĤ$-W585c[5MԲH2?30{ \iBP.`xD:cnPrQ}FӡzJ4՝$G.km<>o+yDy>I)nR#O #a?@֗Wݳ=f/xӇj]iE,2yK6405rֲof޻wa7n;];iH/{+3'4RʠR,:hE^T3d|^AG1v_`16ܬ*d qqNvHxfz5ۅg{"ǘ;u8u>'<̏e޿aP.3= wUK{+i>w/NVcDNJ>qJE752˴l LvD3?~+eʒ9=h7p~3i@{q6`dI$-;,g?d0ӳ0ch2g/K&֚DБYPysr[WcLU_V8헠 ^A oJpDdz .Hڒ> r`Қ ofuj˩$!ҌkouY%ؽQl@ 8~te% Z6_Ea9e~FmsK.gK.n=hjDi~⍝VU_-ӠUdddٗT\|A}nRuލuY@PkUtB-+`#)1uNT\A6^l=:3vΡs2CkLQ%ٵ|gll=u^ d&=T-Mʸ׶^}2V!j߯WT^ KLpyIwmOSX:g[Y`ާ+!7ԻI7U~qjmI4dwƔi)Ɨ˛*YeoWRf#˹q =|/}J܍v#/?8f,K:Ԝyޛ0A4$d|(oxwv΀iѐXou p _@~Kil2(=k;;f黅{vd>y#Hm.?@ @ajt0"t:@ h)} !xpd[@ @ @ @ @ ? QoĶ3;=*9C]M6C oʧM ]#[!md1:z̚T5d}W3ڲQ{O'E7Buy,8ww+ȃiN^L5LƽĽs~HER{nevcj@.=.\Ӓg5M_sAQǿu3<쮄jv6JW(A _? t ʪ ?趫L1^X.BLb̲D@W e G$G[Kpj^ $M3Մ"ğ#]k>;ͽWHmǬ;t5&;ǮeK^FV"B%ɖt.* -9'6/+5i_"=`Tsw$ě{v_emc $9L&WL^]8 (v$l5˦vXo 9tүz0ٷ#0#*_>HI{ސSvs eMRcv5c =sd:ϕjU0r2?|CiOy*3ZzJW_|pn,HF2 ؏98AAt (3nrKC-{̸X¶H NwC7S0-3Ƹw#VzD,[ 1l|1~VCaw*Tav [Xv?l,)N֬PztOhCnRweZvio^-=ya#WwkhQW̒o ]zIi=*b cl4w~:~YǹVj_#R˰]l{\]M5%)Q'D<-DYA4Ӛ<:_4s֩Ջ/u-O~ WюRvUMTi},[x$)!inh(x-wS ;%]``MǐbLZjbEϾbsDUag^Ib>nVVn}ظ|IIi=g۽ү^6]ӑWu'~ =c@NYF!.+,M4Q_2)a]1lE7T ӣBsәW\d)V>$jm8#d:,#D *IZV̯EM?ZuZ: 3: M}[U9VCjWM{ 0 O?]gU_TJ߷La?I0:A~Ɖ~S~ߕ>%83SOk,MZx1QMQgHv r^bܮ<9N%ƶ_,`h˯3׈oxB1Ë> ߈bqr<=y1]ɋ߳ 2b_Ktp6EcjOG7 5%ЈH༄-׉q…ӻQom# F.zm|I~lb7XGxcFl O6 ^:Ș Gwm[i﭂W]dKѦh?.&vIɐjjE@/,ʒZS4,.v]㧽5iq-j]yU)=ʦ0UCQvw?z*Lp7눓=86ܞj֮2$|(%5GC7 ̸Kϫjm8OG$M5(C4$wHHN}ѣ|!$}k#YO+WM؏9ǭb>%PcֹfJ"Kf%yoߺY`=8`y[f6b(5e$q|If^0›aIsGČʔIM+ۻkŭ -G_2eHBWJJ>Ln)3#L~+i8bё\zyxfToܥ^X}藑^f,P2NzpT܅ xR\T)2UU*Qu+O}S\۵Zn2K }(%Xh_ J׈Ua #]+~/ODŽlUVf6?ƹKcWuo몰^S7O%cK.֣S,N<0 qu5W?|[KF5['kTY_Z~B%8$J .@ 5i+Ge K;w?Ud ;=_]KT =IP,RG,mhhg3jva`%wj'e.0ÂO@˦ӞusYZDo5A|"tМ'\;wzL?o*IqIWCK-"ÐNN͠,W7!BeK*@X|Ys,Hd 4mke㭢 IDATh _HP=KqZVXzzz4_^_ꕯݿu kmb8TøRV3.33k %MqbnoF~EZcuRƍ2hиj|J=8dJ~=/p [z__&KO$'mRLV;+v<ƒ sՊ**CF4;p154fpfךcz0y߾U|K'C`V`Z#Y3ldLV58]wn#|YDHCA_Ǵ}lNNH,Ŭr .*-H[m<,?{TW+sFo_7w8c܉C{wutp;vѲ?b}1BOʻ6+YU{0-KqvZ!ZM{}Kr.k{~WYAYkVKu 6WDJljR|3 7ߛLX6}C;cSSFP*ӣNS 77,¼Aݭ )8\nVW" ^Vc'zCݯ'PN۩u&4҄uIo_o}51OZS&1L-]LHM~E0݆[$d4ޓʒ?_3tp+@^|yKbZ99k @ v,HǤ 4ˌ981w.6Hy;dO_u=*aFmsK涵{ 옄Ezo8)ɼyIP@N}xpt+U1-U̸֢)!;EIwW(L" 6dnj;GoJ <)ٙG'Hr.l+WquY o+,W>NnٷV{q*Ln ъw9t~ӊ;6`S%o[O̙yOOm=qW}+-Y_qXI2TK9RhuW qARec (HosdFcMnT .8T0{NUj9tJfq[| ?Wƕx VvߊIn}䡼_l;ǁΐ h{Fa7֞}RY{i\3Ư+O灸 /+gOY pg@|&dܴ|h%;-: F~@Rh7@ Z gh#) *xysׁz @ @ @ @ @ F ~f95@4Ÿ=gy6% nA&YQ"_ -ByD'bgāVO.Ik's[,_LjoB#T$E ;@&ەlx>M{oZG?F3kGWG+] & t4H2zy 0*c _NBvڳ" zTg)YV.Qfq%@k3֙eUu=ۏIXWX TtFϭ!4#H%OBs_1ed͏3l; y>*+WW8C5}ɔ *Jy%ĕLrЌ#b @4޶MMfo75p3 !OPU$nxhbD?{Z17;%ڑO %_,|6`/](/Bv5Jgzl{r%~5R; xrV|vF qZ@ qT?L~u=ka7szˣs6>48e&!dsWgw],l`yQkUQA+.'u|Ipi֪K [M?QSK:OlԈ 6̳}7l17('Dafğ}Mr)ĮG[=R_\zT{'[.u3 n}u &k@-Ӱo3bz$m¼dņf2lEvB,SGY0Y雿]L\Y{'Tv~y[=ctlJ^K'j."Co%Dʉ?G<|v!{ ۸YI7wjM&LBȖf4Ȗs0ɰaF(]u~mWb%X~R ā_֞~ƨ,nIx97Aĥ8HrLZ!xLB,fh OBHF=[C(or2?|~ b5˺}Nch^ϑs\q%Lƃ{tXi@rqmS֮@6}Mn#cKs.`MU ynSoܨ_?l,[.w|Bl{\]M5%)Q'D<-7B|_ *tbDm k֎f(e=:,G昍߱#O;4ors/_$d>|ΙVoO.9tP ~ WѾ;nv$2UGz}<5oIȬ^վl5$iY1_ m nh(x-VvJpYu2z3/'J)Ћ势|-c]W{$?.$7=߻9'!c@NYF!.k{_dRLvf ]ǂBV<ߔSќJ@>COq@51nI»R12DJT$!ua'rכ>ݑhΜHv֫v5e?6O)հru3"[FOɂQ]v ?ڥXڸc .6y6M\@X~0ZQ $Ѻ$y䞟{fx*߼bDHz]Fi@F01(F|W/0R&ʋ{MaK@>ʮGoY^:{)дFq4݆SUԣ:$|(%5GC7 ̸Kϫ.jm8OG$M5tꢯzC\7?ʦ7]~-%q鬃a]|.xleqFZ^U^xh֏oNTv\VLK:ZX9Gqɡb~X!8ܺl3^Le%b%jp  n\'po_>(QoJ+8|L vzuہ<0ƛ㒃?oĨ]3!63Z9Cm4=v};:a}dGo*W %cbcD$X`Egۍm=UA&S kڋ_!5{WwޝApl}+/5?yb&Oc U!C o8Q "~v*[ d؁yǑσH7066?I ȏtL_"r_aB#Hܷg=C޵{}\ON,iv X: ` r f1]lm0կy=(|Ld_ꍠ͢1q0YLhLXfsE4!]eV?ma94fR-F<@kkAgTs[=Ia.OqzL,&OE?}/aFft0$6gJvԢԷS.бVn8ïǯW׍WaHW͚MxeV9l MڍaTgkL\!v!VnyP)Ԯd`k*%H13vfIִohg٥1;%3sR+'4TG\csiOB(GMdcjh(eQ56&ad}.bcN$4Ojy-_?Y/ԭl-k[[[[FliqLݬGeFdF [.4^^1w<,?{TW+sFo_7w8^_j21x.wqaBI7Sף}bVVA}D>?&R@r^y{0X%OaG2]2< aUtI 8IXsQgf͟Ǡ3ɲs7i2=_YrvE0F + Um-%>qM5 n^WXܜ6Aˎj`]yifӣ$μGcH%$- 0%pɼS bvʃNW=ߎi;CO?[sH2ϯvs'/%ywmK;+Ƿ3:z<ク8W:-[ӳꅿҋhi;o,]bHQ?ףY]2hgI15 ޾͑MI9Tլs˂ǫ:x$B݀iCQ1y̸sm=ugoCۉ*ѿ,]Œ8C2NHfIgYipSo-VN)ݍ۸גMg?%2e{) ϕr IDATIݶTWǜdKjM/@  ׹i= Za'C= Y$;"v2%G|$hd$͗d*G͂ yǑ~}@ D[НطzR7="j @ @ @ @  ~f9ڐ@ ;d2 rܞr%ui.YA%S;&(AdXcM~lx>M{1~wC\Mhʂa*`V0ш"-˸xr&7ΑODZ@xp jShyϏW^Yzy8Qؖ?IUUz˓Y+>27"B2hzS_Z _;(pݥr6o:~YhISBf9j}y@51nɛwmsPP a 5$iY1_ ä4Eg^X[<6._Қ:[ZfSQ fh,M*bT𯬛5egUճrΆ90cu3Pr\s)o8g3 ㌄ϓttbiP+fWthb1j㡃~$7Pz۾ mCn7з3;滊כL=+_|[4kD~Ɖ~S~/I_G摥ӧ|7`M]멷8R8dy|@$c''}(d0_?,yzb3/ª1o0= #4MgSh<'3SmMtpzB_3H_X">d+I+\I@hüɦKf!qoO?m9HM-M>neq]LDmz\,->z9!_ (J{͑j w8y]^^ÈSInʎ82FS~ DvM#D>pB[3HOԀ]eծx1^}E{^_qUm'+(r3c2|(8E_NuY2QGٔ$vXv&!"vwZta.fI+~_ +ӊkދ>ylYg2NV]+Wo-iVC6-.p| \U`_͝q0 fOΞx&41's'/q+{B(Lo]O#dk-Aܔ C)B8 !̾mOAus7}O튲..Sܸʎ aTūs'IWǫ_}^_LoxzjK?,3;=gu)'*%@R0vT6{^z:hΓnݝ_=џ7Fˤ"Ie_3VMٳjK|OL6iyAVydgY?v; Up@,ceE!o7'aK6t@հKT/f(-n=2>+C0Wu/C9¨-QUyNڷ%Moͅ`=|+uDs\=A{ua[9zFvty- &O>ĜyA|cN]u[pω%+zՍ3₤ ʘ R PQ|oȌ qN-e oD'?ԎW+hN^K:ÊX_mmZۧX}b-vb*Ζ(\,1q:eƜ)sppqgZjpSo-0womtOd\gQ]?ھnz:?dzNYӚP29',1-^[ @ hmh>CF"2hk!@ "mo&y÷\闶k.}׃/m@ @ @ @ @ @ ð,ķx3|ѣ@f%0S [svHF*D#m } @YozZ9^mV3:(p,UwW}{)nEWnhۗP?Y0Fro})nKq2{3\)$is|;Y营܌W꓿dKyC"NIg۵F%[ )t=)wyq2]I-Fw\Tf੍˛G]*Fuȡzn?T-S-,;6APN6{_?+⡰;\o?=Ns9G|_LW/0Gw{3=YRyYCw iHӧSZ!.Y_yU?گqޫ G^/nXKui}ZCOQOA{eIrӮ0SaWNI0.bƃ6hYNPRN=%)Mky=ojӱUi-=oCw5ЦqeK~~−5 l:h񮕫HD߯wq/87-_tå"A-IEyneq]LDmz>פO$p $|(%5Gi7܍:wyyi#N%i (;Jy#=t44FT}:.;f]pCk_))ŧ OkQ}0Ï!SvK 'i^㄀kL`ңG.LdGS"/zJݸٔ.^nE\2H#^^/[iqS\| ҏ=_;P2u=MȒu%7$Tv%hR,.r>\,d)hP/w͏qŹ+G-$,7qS\]Q?iNq~.p>f%:G =DK0.! ~Z^ qj_K+8|׿1zZu衪G(% Ɔ]d2%_cH2]T{iJ꼈+ןGx=Fp|qjε[Tػ3-ӳԓOTHV_D=;;j_e8 lMOT -Y}wmsem͵p~v*[ d؁yǑȊRK F0rd91]lm0oTOOSf U!C o8KVW ҵ?.Qm$1 #]uqt2$a5xUbVVA=w&Y[; 1gE!mUKc"4(wmW ^-iQ]h,QbNֲeXj4EezTifvqwU(?X bq028C{;0NmN|]En® 3ֽv)0teߏfSF=6]GmƊLȚa۾.@5eX1y#FwQsUէzۧR9w3E!2Y[2ڱY˦8h/6ʋM΋Pv(Fd]U6|A@o~ǎLHC~?$_8^QK=mu+Yd~3{ g{/*m"L]װۻ'W_EΏ`};f=N^^jY;6ۊt~C=={˓s=jxUO!jwf42?g'%a2GZۿ|{Y T!#:FGdiX\W2_į25?aWwbu"Gw^%wIDQwSeUQwSѮ,@ @ @ @ w\GǟU4Eh(`E hD5jT$*`%+h0-AE JQA)G#w|s=yfٝE @ @ @ @ aXw:{k߂@&D ]gN&@ /%)l.>~JHYos&iuOQ{O^w .6z3FINi5-n!>h)wQPud{=Q9ఇa"ыL_^6+-D9DFXkC /!ٻ^ygDHzӶk}zbהnZy"sٍ;ode\5Z0/ z}`?EyփѨ921a K i/z$z#u/yu7ęy> IDATO~C?#a\Tmf,vwѥcW" Z筜Ї Uot6)ӷֈ}FHR?$M4Kq]mkoڊwSlԃ)}5<U M錂ƒ[l(N\vC;3}Α>>W_gZ$0 [@VQ}^S M{o9x8~sbCG5(\)Z-\XR0ǛCfT\14 0KᅢagO<9`xS5-A3̽!"M\|0C%LXځ}W| X~0kd9OW,|tdͷMoFTfedH[XUIG9oAR7!#n>.CͿ27S'ECe'^W v$x/A-8*Z߭1rfw{nM ƕo?ްukp5$/za HW|imm7˺Rkoza68GmWc栵~ru;9}TI!nL~7idWOlK{#bq;+R_D,MmǕ ,Cׯo%XWoKv:MM4eQj䡟X>0Iw"+zc["""NqfI $@x=?ɋjMAzT Sl}Ҙj̔bU:WW= . :׾Pibe/zOiۨL8#$(vEs]ct ,smch\{}_]w2.0LT*ݸrK]:? C\X ?;y߶M#\,_zlRy?JP8~q0"]fr[ .)CTp۸zPmu&ߏk"_6 D~96^1,8El.?9nnnRA{m*ɻ<6kSNn?](>?Q{ybwqa5oÔW&5KDϾu}=Ţ7`mZ;E$տ^fR~\T*C=^pb{$ݡ.Op,oa$O6HܩBӪWkrTdmLX V7aʹPUABnvt` De%e]O j8rǷwf.-=++yR!:1R΄Ĥw&4jhFhK;4r.ۉ EDo5Fu^[c l^po~buDXy#? .UgK^ܭfc@xSV<-,K~4t> ?*k8Ue)I yΟ|;zІx<Lx$ew.7h&hN/y~54iJ(R хfyW#43g'W  5.*bn~ޑ ɩ/ݿe>.oJEM̜.fgj<[TO&} $M)ucKDimlhz]G签^Bshl0\⳼`V_|*~%}|2 AI<¡CWx~7"q2 m\ȭ(- у+N#x{^HkRT X=-Km1q3S˚.AQ[RpnAF%i1Qzs FYEI ޙ Xkhe3>'H"z9.8U3ɼbqLNF$4j9|pwmx[sG*=DYz[x+yWC֢=ƥ_yoZ!f{ֳ+l~l @X.3 KijJϸdUcMr+AL4Uj 6  b~F"2T54T.gbdyXQd'^DG(8Ïź?~Ywi58#k-^s^F=l9Z,F5 b n #+ R2J/=sDX㏔{0Q0ٻ)^P#E<>6eq_TT[PWM#kj48T*]@34QV!UJg4R0Lyxq.oL*0 LK&hkCï&yL^\Ьnv7rbg)]8~]-ϓEB8OJلǝw͢@o<fKML_m4;~Ur ː<<2n=Z̝oGGl{贺& Lo.N؋5=7e~Zo&SUɷ^RNA&PtF4]аkC{O+K{W"2k :C<9ՅEp:揝Iaǝ_|)M1%K'[FzؓNY9D]:+`er>kJm/]8վǕ)KwmU~gcoyzĹ{D(MreyɆGBjeh=tl+Ԓe~9nΣ/88U . bjŁS ̻*ߝnX;Lԙ˧PW|nFovӺ~0eCaq͎; mҩ۶./ҧKxճ'%/<[Wq[3)s)xmrp%ܷkǀS/]H?켖"6=l4o_d۹r¼}5iD0mk XǯThMzLf8kVO*=F+'7cT1f:ETs|G/adaªD>OFٕ .]XRN{Y#!ANX;`n]?=b~wO 'Y6]2ӠaEwΟ8qS[9ߡ 0.H63;1~UΫGa** msQ|LLg#c}| g\oJfi<P0Y[?/BjGNT,_fSuȶMV-"[;y=~{5ۯՏ\n>rOfsuZ,Å)i/z&______MgС?m+kaIL݌)dkVڹn#: SNm]E\{:""""b=K6PԿ ܺ;g)G icAq0(|5x#BݱAPdӓ9r9+%ҘLC{ wFU.ofǃXZm^T~ <Y5vgϟMjտ i`hxx#[YW.]{/45|ŚJzoTk6(5?Z;oadY;ϝ j j̔bU:WCL=AeVgיJt=Me]O 2EDDj4FP(͋.X'*Y!4zO+F0*)<\]]]]߭lr$*HR =s5^b`&,^n\BNX.FRt'o=۶z%]~z<'=DE vߒ<~_fH,#rAb>a"ի7eYz˛{xDsUbn\~5`ͪJ-_;E ?d1.Qs| 9)heBTfIeEWo)[> .|}=o2DJƨgt֌uh|yn9/(x U:2 -*JXw˺>7`mZ;E7<:BU\JjhH9VPޙ$ ryYgPǻ {x% <(r.ۉ EDo5Fu5۫kڲTwt> ?*e'3Q1eNdX*_fRM'SΆ6ٰdmx$ew.7V`JV.G_=5VԾ9;ir^BCwLRC+Aj\T+#S_>E!@+}\ ߔ9-\8΄ո'F_;=wjШc+ټ΁ %"H'Ѓ+N#x{^H} cRG^?^X73Y(Uy\dT*ŭ?tC_ݏCK]l'2m]XT.V ^̀屆V6[ 3yRL߉^ڮsbg%ߍ~z|%)z#q9'_\GuXhEnU$f(f6YD:`kȸVչDa;~2bw6lyz4wzS֭0D)/B:!x]j% 8|zp\,xHf;4M'` "NNeC HA/i Yc>T ;:pe'@eK_ғ4UIj/z´|2@*^R++kއ~~Soڐ*8@cQk,;*v]vݫ{X3sw%*ۖ>k"uzx/CnyZ7<PXLh՟ȢNI_{< u0fyF;=ƥ_yoV@ 22xUqAHf{ֳ+l~l @X.3 KijJϸdUc͆;qNnzAMG!IYKQ䤖)l+fnBHHKyzFAS[SQo8ӿ1SA4Uj ?qmA_X.Wm׈*o.b#du4/777777].FO/:5m(-ガfnB$.ˋ8UBoqD*ؑy+Y#,qGJӽf(Jz-5$!/3ŢH0;_P&O5XQS 4Io[ -B('ϟ9PKMhHKŪ>^|+:l F1cR5P1 0}{ZwZ<+}m!3)KAs9j4;|Kz8}-+ۆUk)xjz;8k/z$SmܐZuYJz.>V}v/Ynյ]x2(j͠$dBϳn*)`hkCï&yL^\Ьnv7rbg)咯ۯanmȏߐ㏕a/y&[;&d>8XPq)b|>:fE0ixMҕ6KWXE?n2 ]i! 4, #Κ:eE T IDAT>7)KqELDKK"fGN/J-TsD{ ѣ;̪xV&U=/V>s _|%zJ'GEyy8P%+d]x<:<-~IZqsMkAxq@MH1뺇75&?eN #,T9%pm!:{Ѹ{$O5/Sz0u#gW"&̻wacI!;e]D5{6/عxΧb~wO 'Y6]2ӠaEwΟ8qS[9ߡ 0.H63;1~UΫGa]iemsQ|LLg#c}| }HS~7%u׉4(,]!5t$k;׮~~uɨ-}~CuCWVKҝep";e]d[ρ//+pm onںeGXiF7c YoUŷv[z₤nS|׭58&ԥۦ&_z.~YWZ}0wl?[q i/BEF3rt!""\^w9m_XHNIDַoXr#(2x=j޸Ԙo_\ɻo4 ^H&?+"KS<Īޘ< ьv]8{ {7~\Nқu ",Yreݡ>Ky>YW.]{/|0vEs] }s5^fJ@X*׀6AeKAȭ,ŵ3zXw˺uVNyZyY!4zO+F0*)<\]]]]߭lr$*HR =s5^b`&,^n\BNX.FRt'o=۶z%]~z<'=DE vߒ<~_fH,#rAb>a"ի7eYz˛{x]J ^˯YRɠk:ᇬ=Ţ'ETSG;Fʙ7΄&Qhm:?m@+ U8h,έ1GsN\/&}|l&yN6:4^88ޡϧd_FN]Qp.;O.s'UǂU2j:r6!φ%Sm#/tY\Sr'=820وLZIWt_HxxxxxxIjh%>"ώW}{G&$|vBA.f [91ŭ(-˩w>HlVx=c/z$ilZ^)I*9܂J]%b\zC_ݏCK|i`twW0܊3q˹dU]ꀭ![U*kpٰc$G~g 7e C!sץ]z@筟:<ǭDﲧzAy^\W:Z'jaGN<AYo_kH,=qNLspQu۩uF;?-|8OfJ%>?'*8yN9bjC'E?@T\ w wF}`-lHZo["<~z ej @}~b1}nV"~:%}~<׭@U"~Qmm0UyY<P*8Z B=Y̕{6n[g6̨8''Le]W$5szEZ6G)˖q)7@OH#h*psc* g2fu^tC{]}bp+F6f kDm7 1HU\WWR.#Ќ6qAV37IEH!x^"CUSCAS?}8#^3LdTk|=ԖavbQx$|/('`()٤l @1bɠ ebZPzO?sU%v$ȉtbm``5sv^l>jLyi_p8<[V> .g6IS ԰Tywpl^t Vv?]ߎR~+k>Lyxq.o<WfPd\\2!iGa7r ML0~NL4[sW<ʋi/.hVK7ybijhd9mFrз_/EySۦ=x!+O[9D_MvM}q0-e.S}tF=-5IW,]5kc^涓0Bk0xtV,.u [8@!LJQ/^dņ]u@uXCFwQ GM$W ̿w!ߝGr0%K'[Fzؓ $8dټ_0(tG mbCz-ز,ᰯcWm,yT0<|waon\2)Sg.F#@]Q/fԋw,lmq{X|ͫ,FbN=,s߶!NGq;?Uؖ. U9_yy+~:.ʣ|S?XE%ة,Ap+{F @ _&~Kl"@|"@|Kw/aJԽU>@ @ @ @ @ @ ð/^@ Dk&Aza~mӾkQ$ҥug?As:?MH rYs<7ѧS$g=:h+C]λ۝GiQ;~#|D1]x_?;/ N)Z筜Ї Uot$Uݝlt*գžM{`> !;†"1m p-uۖH~)=b.;!VWf(.=p]s80/H~FG>aZ=#̪ǥIy rۏ7,62-{\ I˩:c7#Gh}[MGIQL,T e7ʜ6LU^KwbE퉳 seNoq@D3{0Nvţ'nsqZ+'ڳ׵kq7EAuW~ϸ₠wAU G%Ҙ,p**Dۃd `6WO\vf&z9꥘YgҏGnղ/ox[3oZka'o.kӉ̯\W-f}=xս5" D@w|EsB6,Q9Ɍa:JdQU?ndY| f{t{8U/F7v\ᆊ'ѥc Q3/'9 yN8C`ڸ ؝b)/Bs r7We eҹ} !huՙŸu&]O.{Y#1'/5mQ1LAwP' CŹy+Dec"s7fXi(^vu A.O7777  0x/aUz]q 95b>tփRt'o=۶z%—%$<< оY'Z;ϹgǸXG]OB "ei s_P1,^9t!(Q͎qu&HⷻCCΧ]8_bс'ru%R*DTSG;Fʙ7΄&Qhmqs+yQ~G3\xj۹k zqqC{IɅ?oߡE3|d_P4%)#39.y;5LAE;^v'r>z%YqW#RXiuh)gC恳aTw&z1\Jo3V343g'W N&@'[QZW[F Qz ΡeS"nfjY%(jkQ8-Ȩ$ U"&[/}yQ.V ^̀屆V6[ 3yRL߉[\vY{} cRѺϱ/R8|Dž|LuHPZ'$L2Z5s1ܠ*,\b/-ry0dD|QMq L{"5ۊ%@EKE\W:Z'jaGNzZ_ғ4UIj/z$^OFz5}Hjo:|S[)Du|h a;.;ȿ9xۖÅVћLRH"o5r?C6_GH`hjqk{C~Qiu_d\9䤖)$Mi\^KyzFZAK[tUQo8ӿ1SG̀LW 4ێ#1 ,q!-(tC6f kDm7 1H/-Nj&4I⢾Q)PPe;OEDj E/2GP.zQ0MbbJ͍S#jIj>7b#v&~E-‡@&MTK @ė '6[s$iywÉЧEY24\h)L6SSMG댽QYJ#ϲ56ehosOǵtootyVium*j@ ?'&9ISzEǴ4 454YyJ:o9|۴FU7461U!hF*d Smܐby[ {[*Dׯ 4Mw,'P>#P :j*0-ⷵz.S}tFNk7]c r܊%m@Hڎ?yvP]{6V&Я9y#&Bh+E_λPN{Y#1/Kg{L,ޑ_Χ$swZl/y#eWl "#zAwmAU;ݰ7чw^m7.EI3OW(3^/8 {Ix?`o"a]d9~ wBnxӿ8h޾ 6v;0okOzO\ӷOqZ ^oбX0)*sey-DlzD/zkN/Ym_<pou]GIw!@  -t^[zmOrSX{ݭ$r YgzZ6b;y=~{纵ۯՏ\n>Y~2sPjH Stt{ø׷өjaX[I'T!M^jukw\A\t׭pj46?))V<y$$@ m-BDѓ;Q?@P‹RX,.O}&@ieX̹`V3E-.L{6<([-l5J(b QxXZoQM)gBb ;Ds4>z%YqWxCk%wh,p+xQ~Aưx\`҉򪇠D7;2`K ]GRe/_hrA!Y'M63 Wq)Q8c<(r.ۉ EDo5FD88ޡˏ!ew.7GP00ɤ 3]?^ .f$D9 `58Źorҟy3[J1>սzZٍT=ЌT>TSTL{ӾWE|Tqh4Wap4[c&0 'ehBnEI1p_\\ou3ԧ=za{(aq'.HeŽ1Q,i1XC\ ^̀屆V6[ 3yRL߉[\vY{w#fGh&*i/K' 2 q~2l"A+sNN- ]^@Mo=" /W.$8.Pr 8^nCA~* QV*ߨ#Exc#?asHYx7==>F@zӉ%p7t6o<Žϗq '3Ήi. n;5^tT'ݼ2KYuԩ#pa\<{V@TWڻYv*.U섻섻W#>f=Zo["<~_OO+ؙC(u!<X` ,֫S |Qu2#X)0FIc5rqab*̵:bT AZ B"MM:YȭmDŽUYb޳i:aF4aٛ_ qAvvg׭%7uՕ=*kvұ*c9&Z.g{D)y=)HZcS€Cֳҁ`0TAql12_ӧfd϶ )gD?>]3c ̼9z`֙W~vMv>#&(MO١i]}6Tc3%Bs0lbfۮ_٪*0>dv/$t?к ;D3ɹ[+#U6IU&k\ES}*'ũڮݝt i,"M 9e@+ss~S&M4^}'AKn_H(*S嶞:EǨ|0~#Gi:.vqjn}ܢysfF$10 ^[ #*ˮ^a|<0sŽG?7u۱ɂW"<+uo|b- YY;&/4(+Ƭ5Z3ϑ|MRr1ƢJhHM͊bv8z)w|1*G%Ѿ K|}.9vgUv!M8l`. {6Թ\jS~>2 Kq1eʸս4숻> I~ĿGĿ x#jJY7|N;<ʖ*Ѡ `0 `0 `0 `0 `0o~`0L,^{? EH|l1. `0 `0 `0Rj4V0b~ܗJ^&k>H/jpqCnT6~CGjϏ~,g.QSDUק0t{l1,fu!0FIU`ڸŋ/%pw=uX Q"u5T w b1ٚiG{nJj7c`&j O|r(ͼo] -Avsy^Bu~ ^zh:p۬ۄC;%9]=~(Az9]>㲦H*!K|vEf.7t}lMӹ#gki~ڽk_A La Cl#$Oxe*Y^~8}0̷p{DKRwcfDTo!u 칒x KFqbck]_d/|{Pa~!R Um;]l3|AХ#e ;M *}oߴ8Hz҂9^H҆3 z-^?U+BV-,4QX!MXlJxO-klRB1_]_#Wl}va5fz*4Fkᜮs4߫rfy.^4@v|C[g=5d|[=r0Uez28*3Z+*Y^>tXQ vW(SH,7t!Nē^R?biRN ٷw:U\@@heQ|Yq~b^vXtw9$qKS.^/vˎwpaJغqiLz4ϼʛx)$걭G7'M8~h ^@\thPKH;T^ҝlٖEuC * >{8V:CG~]}q)A=l4+*65mȎ檄0nE Յ3Mo:EG4٦=2n.&^ )GylIu[7Ug~@|tȳziAR|l"AnH^0w0X E:_.WroR/9-;sӂ{hOx+U]ɓYh0D|>b‹2 ;7y>lg¤w7v_MPk1ZjSpQ:rގlyN|fHzܙ쵤IOn` BCr|AIU)iӐ|]4*xH 9j jl&NOLciP|q{1"D9{^*\ K BNG!YvxpAՇ'm|"U0MS!+Z>X 6QTQD,5Po|"ۍri!|+GbD'/anY˧$, F]qc|;qlXGF(*g$R6Ƽ8!mc͉LuwmN\^nWZ (?q٥$q/43׈{ cS?R` L C>YnRnf! K{.)zT&j Н|OW[.˴hG# Z|5,>򛻖8G|m.a)2~gϞ=gi|5V}H56z_5G4!0Ո^EBN7iB(3<(4Wαݞ{"Cjj}ߓ9{[sgWyb.˼wՔQ;S:c7=iׄF/l#Ҭgm\7--[:a/SYuS/Ue=r=y~vxƙ[_P3ԠCfdLJ>v4#~_\Z G’2>;u.֠ToQ䅠اg}^q ӈ{ My+V rovb֐;{,^p{ #u- nJw[5oolBt%5&/J^xpd$ff@VepYK]օlpZ*WcQ >0&~Cח\]!6jhI^HjL#>P?DI9gڔ8O[pl3xI~zS$?#?fi\ۣ% IH_;soC"^=x.M/Kʑȋ ňeҶ4h^whI .d=K,yPx+V%Ņ!c&p2f%J _o9z [ SD_N-ns}?oͷ|^+Ets(QxZط G(Ppn΄\4?5!)A KX %:s>߫XAT.\p˙Prǿ+ݹpXo|MSGeBG}u.܄oO5X'AhHhƣV.NN/Ȃu*8dqG.Ϭ|e7l3%vKv,uzx+T֣ooݤA@.H 10`c=eiE26ӭGs] !8-]-/w9#AbdJS}SΒ!A%) Xy& @ծ@0)4}BCZakXh*~翪/(5]aa#,#PN^&B\,;K2\. 8l<&[R >u!|m}=m>k<:_Y^>Hjkك䔜fdq/߶rb+f\ ͉JP ͋Ϧ4LJN0L54ZJ72#tӏl0{O{3.[W@/MĂ9*43^ϓLvTZW֊E1_ʑ@ԛ[t7qk@Nw&=dϩ$5sK5$KNK:e@رWT mMM$Mtg@(46R}'.y @WKSAS%>F\c 5 S몾o Wq1 (At%\[+/$rDxA%Lvr0I@Eu[ޓ!Bxe(=COh8Om&<Ҳ=zeJIptJ5 RK߫C/Wro`߈9nޤlYB߈#]\.%s[nLk鰛eT׼??(S } _WfƜalj2 sǎ4w*2?vgvWw=4M 2pOh)3zt,#؄-=(61Vb˳3^olCW-.x(@EA.߼W]Ez)w]^~YPNTه 5o±ymMЭ{Gw# e˰sŏnifHhy1F @~&Q^2]B0qC[eݽWh.U.Eӭ~rV1qqo`Ϟ][h;lpv>ӣ=oD>Sw˞Oՠ'fSz=Z=QHU\ˡKӇeة[ѣ**~Zl}C<ݛs?z$BT`>ۙgG+74pذޜ|ETA\n}mnR@s̾Op\"{uD>{('S2yὝBHsw",L|ơ+;k(0 `07 ͦEq`0 `0 `0 iDwEb0 25)P.`0 `0 `0 h!jsA&̷ƛ{ `(9>Q͝ߩ*Sw ~Y*R;W[}g]o(]-YܯMuT3&S7 :m?>Mca du!N]p-].^|)<o>x ًa_*r\4W%dɗϮL'tgd%F!)/s skȶc }ύ'Ut]wR@O5JD}^ɠ[Y$e 0iDӴ OtĶ#$Jjy}KI=m4wx.mд:˳4u#Xt IDATLvD9V?^k/at6킩уH͐,_ݭD0l咽LzoZ$o=iy K?C>*~Cׇ[Q)yx!~ڄ+T'fwXMNP&*3QJb;: CH *wJZ{?UVgv<ܲBNN^אI|9Pwf,Rǟg ~ ?~hPA%YcwF '>@s*}|$0-xD4*+L)!6] '8Ce@'g9q> dfTs O9jڄl=ѠF!,S7\y|T؍WYG>ೇ}{.F W@u~6??yZJ'Ն3Mo;{-â~~~~~{h5]lSf7^}|4nTu3<~ahl|tȳ']׽\WSWW˨1Cq-'o,lŭd-{9pZߩ2v^fw O۵jNi j-FT~COs7C֧<>~dS?l9f3~~7{wg۷HM!ɥX} !LC9?*;vc.6~Vb.'?]8^C* T,Uozn7t}/O<˧:$^5oފOq4Ფ F?SF5jorJ7džeH YNxH] Rq076n˧i+eP2YJTc'vXj8ROf*tk,RS$W]qe^s~;b5,^US#@|Nx^:qo!B_iQE.vt. ^>H܄CLzϘה#{и"$qƒ̌W>rl OT{Lă䌴W7܊ywQTbkTZk1ToQ䅠اg}^qz煞:Yb|B8@JĹqiA}_|>Wɵq^i S'T0ABeh'_b"Ff׶*/L/ I X\v#*uXܳVѥqI=M0"2{Z=9]Պ#Ob8ozyQ`_|qœDD/Ҟ[Gi d ~}lJo|s>;?$d#1[1 AE&]omѹu 6q١7NJuҿ?k:OZ4Dp~vz4'"Zݾ /E/.D΍q73@xN2BUf~ T khQ!, PX\6L-3]z.@QY& & leBֳa83:[nRq2#޵lˤB)ʃӾE(sF(9;R XC/o }nŪx")09%jzgE5eSY<fij P yz@Bw*=< R$} J\/ukMy'Bw/(egH%^Nyλw9 !AbdJS}SΒ!Q> ծk͇mbUOlY.Ѱ(=}Ep -4e)rB!d,*KΒ] *k 6QS|ek1hc_|cC?5aaąus<|ڡ~AXL԰$_J,"`k[3+>F%Cdɹ[+#U6٨L$z} hen޲Mqʹs2oe4O췡_0IX.s͞=kLl:LÞW|s3I¢JY {uLx*kpRdųZ6Mz6I6ܤ ))iRuX1۠O%LZV;qh&u5os\?sQaX$ۨ7/D1_Ǖ->'l?id[3}? #\t+[`0u.c}j7V}U4?^*a˧=!\-<:*Z: $QԚykg7\b@J}r }})448q85R~jռBmUVwj{M^iQuw_Wۗk}懔Eb̚՝} ŗSdtf>$93Ưaⳓ}'@@@e?9yk# fh/Ȓ%_߲K{N]tU]HDz=XK(= c%u.B@ZW2ynVRpw/"}vhLyëzOqRp r{ .qz:uɂW"Bt}LWj `0L# (#<'U|FEQҮHz$xn(ܛhDlRTN|I*u3>>|[n(Jq{8K2EQyQVUՓFfS7T[h[BrݙDQ>6=TSz_Wm`ƕN[Թ>Wµ~(Jpߤ漺|%+=" 1d`/`0 B$:tXe uC ̨ wqWm껠WY&ﺺ|ڗA)aRHDtl2b#ڨR5>0ǜzvj~o Bϵ5É(ENfdR5Se*}%zfY{M:<~kVMX~B`0 g=(>(k>'X`0  =F(]dwm37?3TD!AB8lUBY@h= YhL/^hb, C(hZB78mCɞp HU#Zrn"=ʕ#4%tJ2X\25@i=ynJޖG\*5ja/;.K?7*<׽;~PO}KwO ̱fwfYJ۱8. `0  ):4M luA+F.@t!0" Koҥ{/ g} /<"$q!THn@'5N}!>)ֳܾV6pT z0;WYV/i-rէa۸y\ܳu4j{_"QNח8r]r%7>v$!9JXy=oTd2ڣ;o,6>޶>>f ϮA󬣁{{igvIdKX0UrU6 @CGN=̫\E<5u `0pBWݛ$"Tpy촇%hBo BZ|h!YR BQ1 +N9oV+!UsK&×ٲxm_ѣGlQޥ|%DcB0ѓNiMJ㺏U 9J8oI@mql__/VArkjj *XfuzQu-]i Pmg @t8 (ن,3;Ut H ,nZ[۱%+#H.+-2U`0 B8%* *~wӼ' FrӨǗf~c'sn~*ZkYu/4󫡓ܔdDV U gB:&/9Ԉ&5ȋ2#k҇nF:&$I(/WlSww(LpvN]s@sTą};عHPN)%h%k :5PPgeɱ`0 !t]+Gߏ"t 3*C6@zΝ;w\Y^Ҁg-*%oݨb?k**Ǘܿ6d,g5kQ䵇Mgg# R~tz*ԧ~d5iXnm!@,(i,fj$oޯ>@"QJhV\eܵe8\\lʲB [Ԡ7w@ZyDm"J&M~E9=bU'C`:9hSCH髽ϟ?+v|_k'e֐_&oӤQa0 ih%A/ݦ^4cO}Vz@1׿4UxF^Zrces60<#T+eѱr2b#s斝 cΣBBz4ZsWe%A2 !ҳ l=I}Jz>~urt,;rK 6Ju~g #DIjnOB^w,|-^=6) 9~cBnU,W(cld.~M!^BW+:?|K9$o>|$A攽pmUSyj=τDVQ=B<9xp߆l:0Ay" `0ͶO3f[b^飡=tW+}ͤ(Q&+#) YlRo/wz "V4g#o\VXM| v|,(*}B oL'rxEQTJ.+^ .PuI@Q? Bj\5r'J/+Hښ3|./V]N炳)rC/W^uD%'lFx"6WBQ%I{^]:/"|}HN˯~((J}"]56&SFQEIk6B(AlQ5\0y(J̊}P2ͭ\U`Y-|OQTxAxZP.wU_J7 IDATr$1A0 `{`h RO6Bԣ_~! e5`mw`0 Kmc_DdtOr''z-r3eEDs u bԾyտB `0 0^㕐pZ,YLQEF8 a`0 `%zQ=]M8 `0 a@%mp a0 `0:y`K`0 dB־ZO|e:u YK<m߻Y3פֿoqZ6Au2y|⛶K%nQ# -Avsy^$~ ^zh:8] f1[ڙj0},& N3* Ҭ{>L+|SS{;AL*&gv$e9>|+J&_ G|1u]muXTa\?ȣhGtI'S uS&hL>L㏃!”:iL,F~Cϼ1k}uq̮~feڸŋ/%˾\?7w"Wq׷\.Kz9Av׷f\3ӆwa bm]{Nohs.! gZ`0? 8{]Xߡ[5.b S7]y/W=fvD= l++t9./;2Vd[-ڙ2M֫, o;h.aINN6zفy,;'w3䊂g&MGVjj AnH8_r#]-w Pde_]%ѓ'cnN(+& 4یhulрL9~xS@ 2!1 mToW2}Rdž]^,^p1YZu}X1'V Y鳇;_ڍ1>[q^ߧ%VuZvCF$ CNVLȭvߑeХ~~pډx\M/WyHGxe.ul}od $m`w+> +C"?(?nx+Er]F8_V\T8IsDcظPFTbb!x\$~.ͯ.`0x .S^%aj# ͐A,;Ъan3MI/Xs5M9_|H)Iv;];E2\j u{TL]\UM[*Di{]ڞYF~<4*wՇ۸-Éˋ\n]]:Ҥ sG]ߎU5u? KCX&jY9֍! ӄmQ߳L{v*~tM>aX2#ks1zo;}l6ן,ԙt6}TІ+9sbD^ ӑeEuZMZo| *OIJ t|=u.Cb}_xTןf aj,7R0o=x=.: uCMiTUǡ%e}w/IW'}MP*  UtCA hg@LTZ}{>[vL<1Y9b* *ƀ$( r22%JFնQz&"}xѩÄ;z_w;qG,Ϭ6XZ. U\P **$@y Lv~C˷brWɕ'?K@1]1;["C5ȕ򄨂܂hZ_U6ƣU_a0X 5įʪ);2,YT;_6nф+=ET?i2?n sd hcw N )i6hnG~Q #U::v w>aeOҬ䤤Ү]BVX~(`J۔H| Ϯ[Kn8ї<-26|>HKdV}TBwco<问1Ϟ/2l-?( >L;fT;MKOLBRaU)my$ǒ  T$f 9CM?Y~ܫǷpOdݡ@,oBNrbZUU Lv~9}ڊrKޣ+yeVK(ͭ,WV.Q_K6[UjȋR%<Zh2R Kaj[r VX+%E:__m^ok˥n8p`T̻Ք;7]3׊՞TzQi3eK}Sv~SHn$s}^;@~r׿_:}^vvSFҁ({nyx]ϒ7mg֣_'eqyr%YEQ߮*Jt:U|G %Zv,F;. 6Ʈ_t$+Ⱥw3vx`vYrɆ a+AV2Keť#āw2 W秝Șhh:D|*.UqUx&&XJffr2}xTY8od {ݩ7)/G#l=eӄE? D_6m9s5_|&۩;wØ{wuX׎xW1R%y‰SΦag M`$Ru@~uW{KY5gHځ&ۙk/݆\`8;~5=&.vvzn*L`nA*j{(9j~U7n!&Nl3oj^ě;仚 '&5n>Czk|E !pr97ofΜ?Dg' }&Sj98 >O{m?9)t2KɩK}/w"^m]!ĿL#ѿSy̎sZ礉z2;=(<YjMm;bWخm(S~@4@!*"kYEY9'D"&EY9Q.t5>FD+C{;!L@  qVG% _^0?Y'4"G D@BЌx1SjEt^Vٛ(@I@ ׁ΄ `0@ ?L'K4QrRHN+VKPfj8YM-G淗\Rf^sD6]eή*`,>o6;Z&z7eʿހ)}W|j/7 7X-Uq%TRm5 B,>N^uЀ/wBdK5m_ߋYa2}s{ NV&.Sg`M~Bn|~歫;'p-Wi@K߾3ˍ f/[+[UK\y.6}Oq߹L>T\ͤI:k`W3 +0=sȯ$Oq^|ƮUL.^tYhIڍuSže2 e׋> zY~ ڜ5}&cu@Ńr'bNlkZ;{#5 d =mwy|Wx,jW0=|&uD X(!hM4#"^Ωśٱ@r䛦SH6IawsIw\=nӗ/Q.rp{98y}C.V\\FOj^\2kIth*uo]VȰYxޱTԠ3&}Q[-R=-dCI_I"_zCuqLekE6J ˡ[DYK٧fdREi774COS~i V{F4Qi\(ЄƳ u6il Y҉!׀g8D¬Q~Ғc _xdTTT=cM@3?BR.KNZ[ #O5/***̙3gDEEEEEmqWkШӇ7Gf7ߐ>sҨ{τnhh4S?iՇ4XbhޤÚlb76JMa>5L\}A 5+.jභ.Egozwiv\ʩրSP@ Nt*,-llM J-+wbFatwNTLvF*]^o{c&3z/ k't0daeMAAchMl]c}'BUCj2oAB"#NU~T}gNkZ+>qe#kmnjb>0 p>~jP.My '\QW._@`0vJ;LNDyzRz{ @I;v/)!gj*CeWcur*AY%;t{dH=p*`ފ|ѭ)wGDƼRBa9vbRnt8M, ZL\YWMIuj5 m}:[&{DQ!ۖ<}Xל'm^8i󞋠xI9 tE"Y#6f kⷺQ5„|v^WnOb pЧ`V?u!J*'H󓩧bBt<&[~)mnCAadNUOIJm4G4MM4[zi E۳,ƯeH SW 񤫕S\n1Wc q*%].unlA IDATŻrĤ2r]G058EWcR¶ f*qE&nV[]ƚF]ww\n;~mKpȃTCY2{V%r1k[T.j GvHnX>sXƝ@{`2s}9BT'↓t(|ya9g]qV࿑>_;zE>ijwyrP/ *P;U+'h/Zrÿ Q @OuEclgӛW ,|~;}~# ; B^~6N!CۦJT(@x^ ,T6qUXQi_3Ь1}_ o\5{q>0 q1*$(_? V^}hxIaC>"(aEdG$̴)P$PH96ԹZG<(xăbrD.UWOF'xn Rů+` .d@$ɩ3Q3aW{;[;5-t+O d5ͤA/w|l´~bv) :e[Tpa(]NT@kFwJwvDDI*)_.Sric;r\wа ^\IHUiN)M*t.~@ po 0s[=0Ħ?^tDEf2[]'=Jmk Vѧa4G.۷o߲ $C2C]1"$g ȩ:.ᱬvafN"Z>5Pk)CT|ZksRڨ7C:S/ä8c f-G#]?T<ȗӈꌧ_jQdNs33 +$W (L%p:&,7a7AIګ؋m[e`&9.⼉8|0ؔ!"0*9KضJ 8)yBMSV ]V+~u[G'EYKO\\a:u[Wv~V >18>ɩNK@ $D&i<9uό:sTWSS3bdă0s 3Cu107TamY' ۭcnΓgZq?H}Bv|Ui{[;m:ͻBr(nuK?X>~jNMyW njrdZ^_όl-:t?IV r+p3^|NY9JIy!z z9ujVGϼS'Ԃ$J?9O}v/t~da}(T cyiĪ׈Y˦X)$*Re(S; !7L?bmթEˆWXX܅-Qa=Y|teN>sTWS.#fj+.״qekӱ˔K̻t鸢6,LNMeez@4@+iv,F;. 6Ʈ_t$+Ⱥw3vx`vYw%I)V e>ʊKG;Z9d@"yIn dXu4{A["r8s*gw?ePf.٧v 1>,s2_=7:,[lRBXXxhJN#Dm\5s!j8(8aMsԝ;}aL潻p|nr. 'N:[w QV<كy"S{/^8ykUC7쬞=y ,d~x|QMa)gGMZcDĻ2 @ ` Gd!js~Q|=WV(@ h@ @ -mB @ h@  FF 2 $~Ҽd\N%7_!䴒hza( -_\M[?|1m~ ;Ŝ.Z lJs+4ǽͫ"ۍf3pAe4A D -'i6}.濏9}4".O;h`_b<6kSkcuJf\!s~*8 9 +l@9oP[=: cBN?-+.S2r1ӹ.$ń=ɓ'^r죘>,u'}mKs[SiFng/3^;0ve+m,-ȶ/E#G>jșF1SũO/hl92v7C8#-svWf! Eo>+>iϣQ:I_纭۝l}Y[W vNviZ.@ -;38~)Pka)<\ĥnWxgPJ)L#n&*N>q5ӳ?gz>Z9%GnZgtKz&fȡ7!'ll5;e}2}{7zGA}ώmBPm7rӌ\²[U(S<lg!2hs"JG^F|(Ķ?Vw0R@N}vw7wEh!a}R.7JPAd Oq hW5s$!^$!RIT(rk9kH.rp=It~fn]ft\8y2ɚvz*vKSQ)3DQNj@ 1Bg5̦90ɔ&uhԻ>{T[,9r?H+Y?c.il:FIa9}uڃjirUOɤ4Y/`ٯ ?%CvFrm}AoDtՓce%iBiI4x⁢?zwq4c>M Aq]x Dc.[BtbH5`3Nƀ-Q+0k*dԶw~ڃ>NlL1 l#kZ%MԵQQQoW+Lա;ptTTuXhzoI[~re'C|{bx<4/քgg'/ :Z!&\qTr):;}ˌTAӛ5T[v2ا]րSP@ 8NQbRBa `Zee.` (,.ىvI󲞽+moqQϾTD|x,S31)((`zP4m:wbWMD#9ӌ\ao/Qyĺ; ? COL٬^JN;xPnJӾh߲?wp"P[]Tdu5{.}Ti=IϢ+Wz/x6UZ+.Ϟ:cjw)V&kf;F'C{'NOUM'oZdW6rT, è8ӛӭ#J,2>QTekކ@ ֘Ќ{U? E\Y˩e-;t{dH=p*`|ѭ)wGDƼRBa9vbRnt8M, Zm!YԱ=o=bQuMӌ\ /: nm~>,kΎ6/۴yEP<}+)wN ۼ& 8RzO'fl>tE"Y#6f ky]*HQ Ry\L݅v?xLOw#S݆Zצqb[ɯ*CMD+͖ >3ytrCbXpK-zI7(rpݤw%9IeN5庎0`j0p>'1Lqz3ݵ-ꚧ0֤~@ 3!u]v3|k[F *͒!<޳*YUݤYKϥrTn8#Dr\Guqs2s|{*(:9|e+@˫ ̉V?2Ku1]gB0~:O&Gv, Frϯ}!0%L2llr*$?J~p>sI+ڋ#D ="G_Nv`gػE<9V/d`LG`(|}jL>VKqޞNo_=.KU!CۦrfPUV&]+ʠ'1âqm_תŃ|a',5or=a˭J@\C3BxEFz^Rv8h zC@ $SXkb3ɕX^0lSYay^Fy}Ct}5T=r.+1Ɓtc$.@zNN~z#_4>|sj*Xy%ֲͳ7SѯYFjg f{pEaC;彾zʃ!k<jR0V@bE",pz*8T5<{wtSؗ*~']! c ;}0Uɡ>svsZ3M@v/@${vUo\QT]Z J*J8@  5<8V{ \PIj[y Kˇnq=L*t.~@ -` 37ONjDEf2[W'=Z|:|`8Akz¬o $1-uňD"Β) R60]ӪֲO e-me`s$g7^{,AjHC9d+.f-6eϥ$Ô { |q|@УdvS:!dFy]%Q7yͮoc3~,U+&PxҘ.X_Y.0$,\N*>P%+Uz;%ib^x6:3歼 ,n* J/'%O8T ^d:ȥMI㡱a9rnRXVoY;ܻd]0ՕKe-mTp0E/փoH4vZTh$v 4jj @#gJfaedꃩwz1Di3lPjFrq\@s HWq5k&x'_@{yWO !Ӈ/$r3U1eLXnƋ/DaϮrHTe%kmz!#u!v#=K^WɲvR@[q8Ǚ5~“-ïgJuYz43.>ΑJ#a%G@Y NR@1vqPN9v.,ƲO#“F73 h$Ρ `ࢍ%)I ]k X;]T^|~@ +rϥRcf|;H޳z[s=mM>;^Ж\!;N󜢊}Y"ÔYd4;8uNU̎sz;ϽGګS^َ@  a5l,}"yw>MQV 4]k^,@H@B@ UAOB@ w Qc~%d#@ ъ'!_@k'!Oi+VVqK+@4#~2Ruʃs6&Hm0Qqb􉫙9 COʑȧ8/Y>ucת?SDC\,{]4pDx9a[?ey.[[{N=nEje7=k B s&f˔= ä.ܓKW^GW#/H}%HtY:.v$DXI_hޙ%je}+jvH?$rda@KbTZ_CNBmJ!gw}WȔ,ei.IC։+.{ 4GGR!ųS,ldIDJ#Xgn(Ti:TI4.=tٱ{oA퐳u6J:Z'}$SXEQQP~x)ȼ9a}76CbEhNԘ?c_gۍqN. ˏW A/KY-u>+g SutxʧKBSڃz!hPZX[?,NĪa)G築ao ϏN\pL'MGޛroŪ9dAOi3}1};1>8/M^7rL!Ot4U*3:zkdvb5b})UwC=c htּ *XEFܹ5~ht&7s7{+}#SNӴ94aIKǎRAZZeё|RAO6m`VN2Qƾ\]ę]|*&b$򋳞+L°G_x Iǩ8't0da%Dاf d0r U"r#f:2FSr)V/Qyl;T}?c^g &vvBr{[jB4uer)_틯$O|A5{Gf4z[~w\!Rs91pGZ%ۗ.Xaꅱlf{ k_AUuÛ|,V2Flzn:{/\U7U6i~ݙPlkհ1P*֝ *Dj:R*Eu-۹%ȷcj<]c:NYkbD $ ,1VڦPv\?6ZmKf,(wzMQ[=ے LbFK'Gng .F~) o7x0;6q[zPK_>@P٩~t V9iƃ=^xSBT"FǎTDg0t{dH=p*`FRDٛ[/S& =y}ᗥrĤ2ûqf#XtU>Ruv.^uEKeSz!ۖ<}Xל'm^8 Zpb[ɯ*CܧmD 2E3fT luG=KM~.EUs|v^&IY)3 ~oG߻ A&$?sXƝ@{`2s}9BT'↓t(|ya_y >̳KsI+ڋ$ߨ@4aej2[eyeBW-OW@UT+|+q󿲅M#( (({hR/^~zIBxQRLfJy[4(ON,oV{CfM!?եfPxr6۳MBr߉N)D}mZ G$gR >fؾmnm{9"voʈ!hZ -YscmgzcfK2pz~EmsSJ] U)ʦ:P?_B#yT:Μ9 l.nxW@JTr@ ?$=:(c̪^]jW}MyQ*ĉ)[{Y51pݙdq,*&a >,T61peAL>4kLk{W@+W00 2qcO7F>LGqLo7  J>:x^RX!jeۇ 2}:[Y[ Ӊ3O=p"B1{FU5s2lsgW\yPf րT sMftBONY (x=92X1´~ Uɡ>svsZ3M@LoǩG9_Vuy}Io^h+8.P00_"[U2'HٚHp#9N}Z<޿zoe|^̮| -@`A٫'qPf⻛.fn~)dRNzt>P-XEo3*taNcyaַ:|LC]1"hrj-esS؅}>%KO2S l>uMoousFrڳ” { |q|@Уd6!Y TKQN;B'˶UJz(^e@kbg:<7g ZF%msph7s[}ګشW7?y+$9r|>/pFg3U`F*t@JD`j3L|imdFdďX~#^G>7([g|v70?m:Br(#3>pH|/=MVJ6#Qi('ч_U. x9Oɡh;SzjNMO4YbM/d12uKŰ=s r^kJ119=3ݽ&9ej9Os'}/gR[+M#˖|*G_2x?n~,vw4pzzey~)P3((sɀ'Ev 秝Șhh:D|*.UqUx&^%^KS6ڭ^x8U_GfO%,m},i lY9Gg\;v's_UC7쬞=y ,d~x|Hnr. 'N:+t$Fri%yS-ġ*/΁gSk g})ү  NJ?n%£:K\dcLk܆}~?(G'ݦhoĪDl>O.g*K~歫;'p-'@ }gƗ/ y^V",TÑT\m o s| C:xItDʼn'fV`z,\9?_3H"d(֍]L]r\u39v;m]floYL9E"9]²- ky"6'AM_Uox |2 %j}_>}Jn#$xǶTTWF/W] vPIvf4pQZīꄜ{}J'RقAųc/p%!>^ڷ6׾{gs i0,GI #߮M?cɬ>L5r}tVYK)vFjLL5$:4:pMBmJ!gw}WȔ,ei.IC։+.{ 4GGR3!ųS,ldIDE#Xgn(Ti:TA'4.=tٱ{oA퐳u6,#}$C1 SCS(*ʯO270'pO#ކr% h_roo (gr!7˓/AgDm/@^ijNֵN+NMIzEEn~v.,?^1sP ,!dݶ9n/^Cm¢!T=is TiҴ8~K/huʺ\wǜ,;L2Q֞x_B(~T\i3ѳܪ1',> }X6=;[D}#vWgM.X}푑O[#HcZ]eonL38""d4_ tKiG4`i0ֲT7Zo hF EzQ"A_uՔt[m^g.[nm~>,kΎ6/Tl_Ϟh7GxLzN1#k84Â.?ܶsJ~UD*.Ac~Ҷ6T^f=r3ʶMK]ihb27(ZGt=n=+(|ulv_ϳo!%%}QQQQ zIb>晏[-GVD@i}u.mEk'[ׇn<أ[Ëb}-GP]ƚ]K8n7%8^j%TCEFB=UMzϘ-\*@K;@$T7hk,W9o,N 0q9wAϾr__ Ȝhu3.8+cP#>RkI90 /rIkvV[$r *P;U+'h/j`1^<Ȱ%~A pvEgB^Q4d6T nB~K+R-[os 8Ki-bT Vz^3}}6#@c: =,Lr% *&a >,T6q@XQi_3Ь1}_ o\5{q>0 q1*$(_? V^}hxIaC>J-Ԭ-ϮH<dMR0V@@LyȰΝ^_=rA" ΉE:[@T4>"?y9ӎ{EԷ9 izoe|VuGjPRQXf0` 4nkF9%9нojQm8Ѿ>)r,'>Y;ȉkݠf냫tڻΒzM8C%"@ p1V?/jn"3ԫ->Tmk Vیf?0 1jV4EUY RyEqu ..H/ҕ"]X%*XXb%b{Tj *eXX`|agay^2;s33s^W*5rP?'SAN? x" 4;mɸTB5*4 =} )~,_Pk>j\;T9vI#[j1^ZƚʒNBݴ/ _,OBa<A?]dwaa0nEz~)]6Au:[מXzF,"50\OȒcBԭgy&kր(@*Z8KGsu6 ; q:+=M=L%p 2 ; V?e~.!9YG=(g =,fzDAwEiG<}2MJIR$cW&׶E Sm6`XpEZGY+Q7>^Gb)^2^l!G>t/2=6λ\rNC{h|ʖwԃz2ɥ**zH!ePP/s8?3#x+])g 1ehJЋ?]Άruӓ< _~Ӷhbܦ_S"~ꛨKkf,?8Ue٦gXYbؾAXNu cHW IDATEU3Q > C&5=zyЊfϸKFhhĀ(l*3<ݢ݀:)ԱGm%_ʫK 2ٓ!:ܞ S&Nޞ~;^H a7sn;gM#sNJ׷7w݀߯͞o>n=z@EA~ CMICuǞ){N#_tn}{ ?{?p}HHu9@ə&={mBJxY@@. So5גC. hd$'wiYN+1 A򕩪<@͔m*ȹ(Lʵ>P!h)cfmIAǗd@>G' #CĴrQRbK[~H88kyO9՝nNӫy"܅L$Ćw"ʤ0EonPfشF6aXrA=W%LSWG~lOei=Ci {^ML].Q`. 졀fǪ=wW9) :K**DxI?AB6Wജ~Ċ^g-?PkcS*A?. k(aHG ahhd9<_5z`:| yWsAG'   AAA3Ö~y=AAAF߄  On, !:A(i~P|SFv]U=x ÿ/F& PB4qa3xc?}]85`Xk4jzA; B߾}Rjb,+-j`! E0t;dg!Eّa<*[Ɲe=wB: .خ㏳$@p[Oݫ6#5ZĤn >c{:h ɍw@teOAg1RqntXP੿r$!]&r!'Y\x]6:؜%7얧r4xPOr:iݚkĿ. M꺮?Ӷ|׷͗mӶFqU3,D4搯}yKQ|=mţ Uɳz7a㳁CKxY$8#2V@5/F}v]K`[xO^%/L ߿|uZqԿ QGu3vFڭaik~~?m `YD6w { xMH D9wSIk9[Ƹ7A"j0qj͎yrR̤ʳ'i6t<גsOX㗟|V/Mxx>qhѡG #fLEJe*0pGͭo$ȭ];ϊPFو%337,k\TqS|]Qўʔmz?"C7KZ#Wrx0Tҥ@[}"Nmch>+CEVˆ@\kE K(ljMˢd?et}B nlHT|^s?:UUO p7;<)UUMEjwfӁE@DO v١M%@I 3븒m78&^G;c/vmG/Oޏ+^4}]ffu l|^KJ85~hH|2 ]|ضfj܅NOon%Lo(ArJ.}ؾjv V97_y,#W]kyx*8s0l=%g2KM,볾.#/|ΔL>{UJx7o%3`'4rv2.;=1#-9:0/D)猾'dSlk.3>sL :Hߍ:*iO ˑ@7eRHMu?G ۑv(rSsRBB#uN=uNM rpFw&gm}W7= s:`ڄ%$uqB VYܚ "e{3Gl6GNSoƯ!,zcv`TpvɮiRbb$Dzѓx˲ 3 hnKEFPUs43)ܒZWAtlW\oE 2538H6eM} r֫\9o&4ζ> ?=Nlv:1 A0aB >[j4d:8kѵ6/c>}K+_$杺E~Gӭ%iъzcIm oC(P} fcJ<tp[]Y&.Kjԁz{;,Af 9ِE"]9$6ԭiQj)USN WOA"DcA^J]|S@Հt;tJܿDli76\ar,$?7{)T#EPd2&?UP5re6kp/ Ϧhg|EP7e(.6]4xPOUۅKU#6j?l#]|Qcmq$\$(nKs628}` M'Q?{Ol6F1Y ڄ%RPKݰCbo2u1d4qھive3bْͪ϶fs1<R硱B To_F/[w5ع 6t^^GVY 9Hp6.>kkۃ1l=r|8΍WOA*( ]&  #_տ&y(;(iq^N6 !?޾8e':(h}ߖ$PWj+oѕL,S%B3@>j.KʋslIi=˖ 4{WkVYmTjX*Qd_?pE NukZoUɷ/%)Wg}<\q6F-`ͶɉCI/2erԩjNզb< 24s$g:z/Oˮ@,+d!`Rkp\.:`b @^'.%/؎ݸ 3@VRIwwDE P"^Rna̿֜~#H9ڪךa]-SI%8ry-]M(Og\C=-llvR(L 8}iv!M,; 4ХVk>̑a<㡮?Tlyq._44$SwǕHlPJ!8Tr&++`pt8PW, "9ݖ;4ͱʾ&%mt˴B Ajy5IYE{LZ>sPZ) ȓ5}C4b-f3% X}ZI)z?״_)fL\.Wʹjz͜lljg٫hⓡޝl홲VVWܧ$[S J J8N#`R-`7w_o_U>Ի2bE$K`{"lKbW<䦧whz\urB[L9\$з-'B- ?yt XP/5b՝[|P[N# n}@fd/'0П*Ki_qY=酅9S#KI zyˑj\HߤR-kmFl &t)RJsWNG {t1D' [[NkS e,=k#]JN$pdP`%L#[j1^ZƚIJ^+75 *}6 ; ԭgy&i}炐_o'2 &T,`[jya^acugC`VO rBSK<+'qA&+0_zΓ5W'$w&ʪ͐I&awSeIMs3m66f gн}]LE>L,K#_Ƌzݤ]mLM;G]TU9 }'zwhebӳS̽OŃKջwb{rҳ8?3#f]9ruƔ[Oދxw?U*-~C-yh{6q9Cf=Fxc$HMA J֣W Znw0_1t9$H]wIw4%I{HxׇċTic&UA/  뒀?uiV#z-9"d9` xǃ\LO4J&Z6@%0 :{?sÂO#Q]n2q)DŽ?R&溔G}ݶ),lƳۦ SKٻSֿ*{Z8t5"] .u]mf!oK^rUA0qߴS?ҿA8'9Ez6nRX2>K&H ?ȋ|9l 3<]luH /nW蕤޾eqA,Br 츛/'LzzO~)KΧJl҄#G6LzZj0r1mJ9QYB y ~ܺFjE?Oh䰚X293xÂxZ/L?l7EL9ݦ#2R54=sT A_њ拵ݼWU5e֚vO-= @iH톺˔mzZj l|?S 3WO:SSZgtڰO+s+awРD  XS}hmtW;3餑߶!/|ǭt19~.W4Eiyf yy%2%.O9g >!g[+ì- 3eb؍)E2/IyF{w[*20BVN?~:s$,Gߔ RK!5e?i-4oGڡȅ[LQI d8-M:72H@ /Lfiƴ7v ]j2D$GK{%`>E]:MYs\9v٬4[y[&yzzzz. X5(T(?;/y48vQtCLVKF.L\;C۬QALGnK0IJ̯K%赱SAQXТWGP@rt58O{]tEb2d7>};[Zcp"|́ Wc 9m$F퇍t$?/j \=.䗔˓WSmi&Xl^"Js"3r_mƘ=&KRd&0R7۲uǢ=|] E$m7(bxӻ)z9vn c.+(;>!xu_b ?:РW^!+d.AIҫfzku+zB iA,B*`7sn;gM#sNJ׷7w݀߯͞/n=z@EA~ CMICuǞ){N#_tn}{ ?{?p}HHu9@ə&={mBJxY@. So5 h;'oΣ!eG:4l# [c?Βm>ytڌ , 1#鰍{=.%fx^Ű[4O>6wa('np}*I}-gW?F! XT &Nq7_Nʕ2Wy10͆.ZrnsY }SO0 G8mPUIzh=*g6]J%-,;2k 恖Quo%~D!r#Wrx0Tҥ@[}"Nmch>+CE_Fë#~~UjC O'fnwyRȫJ?]RYvbzӠDNln12\a?@&]ffu l|?S g36,x;}f1x O!L[ p <ͭ-C%8P#`RNiOw_tB:a*+o%~~}-SgFAQեs&Y^F>a`gJ&*%W0N9Im;w܊LCb~EHs]t] BW"S~]b# -91QT=bTpvɮiRb&Z >sL :H/dF)~N<|=uNc2tHX ?); fBj~=ZhގT44mֈ(=;.%Ym~oKeq۳oΦgPt>|m#M X|4v@gv=,/=O%j&8rc/]bra͚q_vwK[0#B4ڻRi ɩvGē_m,qQNN=yrANvF!=Ujfɦ,O r֫\9o&4ζ> ?=Nlv:1 A0aB >[? ״kGm^|V8;QW' I;u7)x&VYA2IKeC0%K-̸Dc260p0sV}ץ?u䔩gnNQ&yG v :T;򢄷}}޻n.VL,sxNFMqݚ=)О9_v{<-<====ˣøU:]ݴw͹Nh`pɗkOf;T|?^ؼ&m ?%*[FhކF}{4r&.?(s}7hS`ࠃ,?꾐HsCNF6dAQaW'sI:ukZ}J%赱SAQXТWGP@rt58O{]tEb2@7>};[Z#"|́ Wc 9mx)@N{^:ۢoٛmΧlغ ]T$(B,J)J*S.`Y K nnEONė|]XTm*8W$KH?^|)NWH]XP{2i¬924s$gƟNa뤩~2Ӳ;@,+d!`Rkp\.:`b @^'.%/؎ݸ Y(+( Saa-,݋ DBINÜ9(FrU5úu3[JqrZDQByc~O>̡zk1@^_ 2aj&iAk0 O,jbe.^_a N6Z6NNH'gyjOq._44$SwǕHlPJ! ʕU%A~sЦzZv @{u;bW|$dI}԰ӾB=EPU*E^*(uMuBi{D_'+4qpLƹ~hYA)fexK~蒏*" 䊊Bb8 W(Wod`P#>^E ='gkϔh^ݫO5ՠT4 !Նuvs%KfY~E^+aj,OK+#VD6ܼ) @bȊL,7=VB#㪓PF.jg*ȩ"Ofm9JOૡB|~V? Dր(Ȁ瑭LKdL-cMen}@fd/'0x(~~Pk>j\;T9Ey<4ܞ:'ճ^XXn9%9z]LI zyˑj\$ Oz~+sng&Ӥ15s=ߘPZ@)dVM$}J loy;G@}u)'d[1ւ V\3?w6ijiecտǤ Rm[z~ñS7%qxo/Z9:N=Dye?ҡu~5R2U u;K5V-ۻ]4ϙzzqF|fdI)QT3Wʏzݤg޽xo"S='yqAބ9eoA9cE[Л;qfOBnWWzUO `Тu |˅æ!AcO{/I:>=sΆ@‹>$^L6!% zY|Tx]tLdjPB\jɑ(^ޮ!QSxaclÐDؾ.}2- }e8ÿ.jgu?BaSҸ3k+4k-RSrރ[ OfDYmt2%kw\4KRIOOl=Wi Uv)↜/=9qY;3*-zK16䂤 Ke*^9՝nNӫ"܅u*[ (4up؄.Ιt@UQ](@9Î2`o]RK/PrIϊޞU)nj'۰NWݧL=Ž Ac^A䟄a8`=㚳55| NN嶜^/5ڱש ~ ݂K#/4,yVؽφu0tpɷBG=h3Gs2tb!|G' L3-=M"Bl_( |gE ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA->X 9IDATAAABD $]v  oN7UH~N'\jgΜ9sԧΚp-:sٳg,Y `jJd_)@]j=LBu@Qgtk>uv}|B8I,/sZn's^OsA C} 9DiVݐ!O$f{~-t ]gIpp5Sv Px]K40eVDqs{܌/.i4~ =!tKKʈ]澝˰wBA以4'I컯tB:i278ru}-SgEU- _]:WwlR]uh&Dʹ[Rr8[&}B#'٠M'{;B#Őv|]\̯%f4Ea^~Luɍ{ni4)P5vבCO;$r`0+"-jʸsRaܪynZ\vً4gd )'ϝlŠRr(i!W(k?v#{2!-{2MxphOOIޗ\lj&J;MjQ5V #Ϟ0a~pa_κ$vN `s2AP(1:[AHK-5 ״KG-~G%riҟE :sHm֩[ӢibJRR2iŒK4*J kfΪf bJ<tpv:jTm9S" m~HG"~ء o>KJr><'lzx8,:-{'O'4՘ 2ѡryY^]r'-;_Ԓw'C}J~fzs;]f=v`7?ff~|"mjAIM.OQҜgWؿ  ,{/ytM$GW*^zв>:b~1p 7>}_bKk5O=cc!!Ƿ}K ?:Рj$Kkl,T@ET7= C-u/[wž. Z9Se*3`c1g ڻӠ(%ve AT*tڱUEQp/ֱ֡,vNMU+u`jJAU\A1*$@ Y_yӱ~dfޜ{s{dc绶ie|qG&#]viGgtI,ܫԵ{2BC~4 Tf%ib ^ON816`rFW+Vo͓nj$mq@X)Mp3F5ޕB!4m/<~Q8F.#e}ȴ {6l&_r}Dy2%7|?6zG/>v*-lŚ-D FQO?!׹z\ {}dvˇ  k.:{GmunCUMBHÃi'^(ԲZ=MU9hOzqAcCrxS-@NJMpLX*]+q s`#[6_0qv=i֪KFcv̂P?gGP?˦:ô^-[NtX+ng9Yu2c^q 3$ ӋB˄E7_Z{yq#fJS1sƹZ>ǹ*'R@0ܹ^64.Ɣd{xE}[U_f`ٞ"^Ԙ^..܉Y?87 lIfvA.7x]ʩQ _z wgW;<{?w4AGxʮQv|h&s-jM`da4m-G#=8GRV|dGDZKֱGv`IY7P .8aӮ/ۚ#Ј0o8>ޜB!4tCRH2 _I;# ΎL@̄fBթ[~mnZ̙f@F7$(t362.=j1jfRqԙp,ZbESKM>QҲ>m'$dQue\TҮ(rMzѩ(?jܼEwdl':!B ! B!NBP8C!B!B!B!BWзuLIENDB`glances-1.7.3/docs/images/screenshot.png000066400000000000000000003424101225327237200202270ustar00rootroot00000000000000PNG  IHDR$8EsBITOtEXtSoftwareShutterc IDATxu@Tǟ;=Cw H&( X]躺vb(R""13}Zw?x9=yι^io!5uwy; 8y]k#Q~<}*s}qo* u_rxmHe;=6Cw[*u Wrsǽ M[lpaUV3W]5QaS;F{$Ayز}P9CNq }\"5$MǝG'e^O5H#O<U* hN;pU |\y"E$)3L7~f v D-Q:}ne Gh>έ( XkDCε?#la*1묎ꁠh{!L3]*O$-Q%}oem# 5|~vfm7i8sW乹Qw'X{P@T8cS_<!oKxWtq;4+לe5HH ڲA!y}4z? Fϛ8,],xH4]|E\J!̜7'O?HgmCT>?LzqִM;t $Z험ziŞ}k4W== |.¤ Ee=LB~ąG'k D:m~=r\{sךQ^J?NTlʹW]͔ϻ:{ ^yO?VZ?~2埿1 -cNf(),y#m nB^6~14C$)W>t1uƉzZ'+6`6j:f7nabAHt#@T_DDG˃~ㆋ Z=8MjBIHPlһUhWU65)B0H&!:ۆ58YuSӎ'2 *c ZʾtyJDluywk7C 4[+n^-d z;yAEvn<1y}B+>ʩE3\VGV7PU+$m y]B6UJF{y ]^5KϪ(+&Ac=sm|M]+k 70~EkY%;k|t*5l^dluAN]WsAK#;3JG􀓱^~2-/r@au_} *ʚm;”Kb4i*Nj\咵CQwE"pJMEr{ccu; ,+VV*Sz|\oj*DFR> y(`!inȩז#@e'F@i˞(3ȃH+%8~{!.Gc'pU@oB~%":jD[iZE[N񹢦8sIJ+@ĞZ @1% o ?K;2ǖwJu{|Fa)Hby.{vNAB1m7ФztɋݕP9?餅 ފ& 0i0/KLOQx@v4Zt|j (tH[iTJ;8pAC;g{T|/պŕoykyt<zh_=:ێӦ=t z閤>IntU(I@Y|@yl(DD?$۵7 QG7;qgiZG=WR7ɺDq/Z&ʊ?ju돽cBGߋݚEy8uiQiI`mӚ=;j7{Y %6ԤQ $!>gT X='xNسyd}rW!ȸ&IP(DH4""^?ytN~ ƽi9L.+/e7蹬s(76zxehJm+R5GOZKshyb3${(o$),iDUU__ZP)z j K蹕N\l='hIҙbtĞ)<떢3Ayd^!Ngp%F|bm Z&3\ 6S!sai2ǎɧJ!/l)^F{b_h P D:ZBQӐ!"E-}/fdFė K4'&j6`}$[y mmq]#pyy5|[YXPFvyXkڢ}Nq%}@ۮ{vnbcvlOYNhy?܎@?؝Uo@WM ߉Bz.^S%1>#D66l;=c԰9l'ϱ72՝8D?OrTc&*u!rLnm!W% ېǨ鑇)-(`,8ş?T~wiǴȌ{ sC3AٱO^fs7nz-?rΫ!C֟m1/Y]Y%1aR*xiohkwDkHUZı=:(7ڮ+y>ћiZ'QȞ uO->yy1@ yZPP*cr846K0J9!:^T1mi 2nDlnҪȽ&{M>~ EkۼXnB ze8FY2s x;.uL? *#=FOOwv;ъSn\8nޫ[Z!j-J#76n~py{S$<̟?{ GBt[Iw׹KwV ⳭzOЦ$1R9ޞF=FӯnνSZsᑹI5s_uzVևQDd -=83~6tR8=zoBs?qa TzMuUI=l@43f쀁_HwHXXXXȱ 3ߐ10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bp8EwsUq105 娀 ;Nf٨EQƷ%F`a@5W$.1PTt;dߗBOBl\v_ 笌o"Mǂ‚OlkDƈ{τھV-|Ec7WLՉ(p(9$ϭv`jšsi +:o CXӾc!JLe+{KqrVS<v9T@P ,ʑZaaWu 9/Y( 9힥ODW7@+bҌ Zw?SGw[5B^Nc ۇD_gF\.m5suWsy Gzޫ'_{?Cv"-z/LaA,yl#UT;߂2hS$[F<\jɬY Q|PpS,9Xb+i<[fS炊Sx+3+2<*!7|{pfV@mkCrWIڪETmI3]:aJ 2-|z_){d!/epgTh>3<@Յ`R}Cqȍh$R'7k@^o W'G^%K RQaIlt!a_X? >>>x*EQ",E퉼0tmX]hEu?{%I)&EUPEy%CqY>EK^+Pמx]/?u(FzN{^ ;s/Ұa|sÂ/]9yJ9NLFnX{V11ۭ/(~8TRͩ(W%BV??Ԡ Sz@hu•o=O,nWde,&mx]s /g = 9Fdve 1`h9vɆ)"BF1UY(%1`mJ DcKrn'i;:ih~V-MILoʲ 6?DEO-CQ8j*"-[W'̜Z~qvRY'7~e |R|wV@cY1#@: |bo lAt^6~147?:J٦&A$Dq1Axw2,bgդ{Sԇ}ͥǤSM'iHѴq7ϟGbi{e#ӱ xNN~w T'AoNz^by xf2oBӼ7^4ayc?3oY6wŁG9(B5ۺ5K,gP8E#]ro_}&7lٹ灣Es571jhהx=ՎJD||zhy uJ Roۺj3n#A=rzoxXM7u(36`+fML g~BkMtBp2p$Mb:lbhb)3$F\#T)ecE1`cikFu]P]T?i>2xVy06;& Z [De=ddr÷4\RޡfاZk/3 Aq[pXXXСureݮ]!OT4P9%o#>7ԧ|ߘ_g kllٸ0pcl|+); p( E!7ڈc19]xLE6f8 r3_NhWZl-bZɫ]Z$ydO7۝WUG $%᫃"Pr/C27pH B. dx.> -8s-J)Djb3OR9PrTy]EoP-:hk?\>}ӾeI pPĈQTĭ*n?R&Q;H(y,!c+rJP;ntu5nVr~QP  $=x?2Cmj[|G@Q(AcxεB +X/^?ؖ90:BïUvیR_l:R3?X˽g% l %xǥsF7R"IE?PLXtl. I~n^٠ͅtv'w ñ "RQHF{;@7Р7 h 7'5'cXq^Ӆ.l8QrA߭LAJAE~qL n44|m1o6|mՉK<=scХeEg&;ZȠ#올Z6?ClIosAOW_U47T2[G;{y 8S;[8XkS; IDATpwVIE.d! ~UU ^Dj*Ne1d2} _ܼ!Nxlh8_Ⱦtt$jKM~uyxn_U7 ^_rny_z_%x1z򙝨n]DS 9d9oW͓|.NmNGz{#d17~VmgW'톢@x =?ߤAwuq9a\l=("am#t:2m&5lhiLZS%4rҭ} gfV P6*Y PiO!,?.H4Q$|i;&),kАL UM__RP-6NKނ;M~,[U^u{R8t˄:*O"ZЖ:S*d (9V HDDtEK=ԫE"8B;oZ~0gx|h:cn)f 2 *3 =~%n}EV #"sE#ׯD@`"O"Y1وaO[p:Jb8MF[ZŢ>縲'I4FQ)a@R6P&-./ &N&ߴ`Ч7$8ٶBpk |T>+7#+Wkt o]J  +w8ܪ!6Uڲ:k(%hX8o;q"`bm5zas諩YOc'C/|h 8y<4oE$0~9w%tD%{fĮN@/]6uWk>=`nɻ'/94{Q7+X9!Ԧ?aΞ`j`nΉyUКj/je4pUnFnW#Q0ݛ_Vf]MBG(zz2D/%i\NBw:Wt.)(+YQ BֲwӐcrMWN*5BMD$~xJvOK9o"I71ꄤq=v]RP\rDOOX*g&I?ŗ6jͶYoJji)3/3;]1#'۸o7Z7,1jjyOF?UVVj\:5&-pu;zՑ)I);y|CM_W]67gɌ|tȆ}./=aPisߙqQۣw~NmF˜Kۗ{SԆΝ5[ ǣ˷de뻤JNOq:~@`ܾ|4.ǀ{8vy/@zܫzwجYt*1gos_^̤w[} `徽nB)[.r[Ǖ?YUVs ZӃ(!({sᆭ#M;t _|b@s)+en(ŷetnf8srt *#=FutˊnNv5Ɩ5ٯYEYYG߲9·W9;&>l׿M~\\sVuՁw˺2JRZͻ&3b*:;Ҏ3 ~j$<s‚64=hvԎ 3i֤}7w`%`Ԏn4 ,_ 'D)c3c= Qsꑐ]=_u^ 1{*?yC, Ny.2^~h^TvCxՁ wieQÂS]faea}d^'w; ʎr~:/`wϹFZD>*xA2Xp_̟Y]]o+"=4䌟i!^yy:M .xyet;cE*߻ξB>oʰ>Jd=iN I̎ym:$,8M߽qOދw)#*pʼnO_zw_:jϟ.ϊ7p炼c̏X dMyfy7cSσZ:r :}{0cxisc]uJ;(E/ċJMV<Owiмљ7?w+rm˫ &f)teSg:/xov^5^9BPu WZgDy@ɗ|k9*}/TpxcR%I٠,!oQ3E&Zsʷgof Ԇ/ZQX6$ Df:jW RmHz/\s;U+|s_NVv&ww͵|> RCN}7fǴ:R:/C7D3;U! S?DQ5Cg2U%m@Jym#oOG9AW}\y UoeCufΛP ,24Q|{㟳8oYu K410.+Ws[(=JLSUwyIJ XC# !Fϛ8,],xHtٿuh%0 \mG >#>uh\l0m^Y\A[Y(]iُ.{+.n;9Bt&eW}/bX{{P.¤6OP4X|.G\qtLTuk0uɪbI jFum{MB9lrFi?=eaC\Dn3APdn?eƗO^;wmRVE˒3J/o?"i>ŁxIrnqa곐mTuGWKSbۚU_󪁦GvQ淚 W= Jzv3-ћ7kF=o%%fd$s>}PFVk{?"V-%~hpT9 `Updw4 Drg_ ^\H:R1-834Jw'o7Qj;/6/P&+ b_@PߕJx ȨI jO?v帻~$~_$]4JoȺ*?%(ý;UԷ3F)#{v, RfS-r0$mǙVW7(r(#7ٍ:B6=ɖT T迉\ V8ac-Ay>Ms~(`١R?/@7РYnvl,Y/͛Vf*Jޓ#ۯGxqP<{oUG&AhZ1S%wV|E.[GQ>W|YP],l*ʭژ~7VEY)0<} /ZuŒJ؏!c,p%Wާqm j\Hgw< %wO_{_(oi&cݾiu+1t(lÖvC+ 8K粟uymnF>Rok? 4(hoܜ8Y>S;>Qu/FRMDEΏ?s *6νPУWJ5:tfb~~jGV`Q̭o8ŀ :Q\niH/6s. _c? 7Ժl5LCKd4Rꝇ&ԪMSK&;I(Bw$@#^ &(5PLli,g h{I3d9oWͣYo>;$9i<\y!fn݇*SUOU<0'^߼jMfv|.[mNGz{#d17~Vm]gߺYZ3VZ|>9,U4y LQz /ᗮQӡ>I<V%n^xUZN SU I_UX _hJE  x)%ɦ{|Fևg7lm8X T-%;9|$OSѠ8- ?1@yȽ,Md@%.s(7_U/ܭ{%mPAOKyQfn*kL (U|aw(#4+AC,Z <^NLn52iZ=O0~dGgy]y^SP$HH%|TدuM50ۍh7]ΐmHhڜ۳_-L /3آ ۴|aE+ =~%KutNT0EHaY)),5_U__چkO\rtWhD_J,6*dW/UsL/l)^FILf7`$# $xVTk=U-r3"xĉ=uBX5|avwG]¯K]>gٞ- TOGEF h #2T  dB"]"Em=}= "BQ!u>{<.jOsw)|F~5BMD$1,s T 91OŖ,(!k9H+-9Y&7FtTCr9 c+9_kM[4)/(ï*]2Ʋm?e<s"~z|7]evFJ*:VntoWW엟suxGnV\P^P8ye2G7tAqVI\-QGUN7wPψr/K)a^nE-YTMeAOOVV'**Yx}SC7픞 mx yBS؞ĮiIP޴\.m5s WžmO:RF6{_%mkv#7Q$$?B4;H:L2Pw/Ӛƅ EB/ONUobiu~u^#ndsZzF>Zکi~0wXW,(Oy|Dr)OL ˦ IDATg+f_V7ABMum-7n1tw~k|@uL("@M9^+4+לe5HH ڲA@NDM# C.˞zυ #N׼)vn.Ȫ Ԓ.¤ ~Il Xۨ(htlPb韙iwzڣ$R@^}je*5&bqG(Z(s'*3'{zj'9kurþhR)|hky|HK$xr5 z^meCm{MB9lrFu:7m̃0IQ}|>.u~6+@Hl E,\zhjGKC;OwP8z{JK%-xX /ٓ0Õ1^떑Gyqg6YpBߺbIK`F})3= s͏NZڑ-J+͖^܋]B5\ErC(ϓR g/ouB~St!EݿWIS^Ɵ36؜pG6 ;6ۼrd햮[=Tl"ֻF]{Óϊ9Zc-#w'=wOoYĐ00WEj_[k? 'Ot^6~qcbF8uߟpEC 2Dls x~QLLZ\4Kvjn/oHQN+jjPѸ *Ɦ_f /9svyjhYRbF 8;Ǣ_&"On0[^%ͧ8#ttN̍ &(7#-NDl3UHw(=̵"]\!qSǘ MMac-Ay>M;ƙq?Jc; 2eDqvgDl9^W~ido"$_+O -'J2ëvnECdd|AY̓?& UqsA܁̶ʋ9Er{c㱪|I<ϭ(+~(rý\keVq[_E|$5^c'*csa&[Ըُod~ eqbm[V>Ljrk@6&m]F樵Եif^ʫ.HSaHS}u9+Eie]5:JUPY5tAei}عPH@Jr(>=Ht[PET@"(#_ ꘀJo6qr(Ǹ9?Xq^Ӆ}vj[|G@Qz ^o/7~qL n44|m1ou?/N+6L9&4mPD2? *۟[r\JԎS}GY2a3 3ܧ|ьʋIdZYZ EyH6@Vl#6d۽U撱)^[*OؗYw+΋:v />H(uhmM)?c:Nfg-8\j"'+c)v8E(A 7gw yZsO$ D$4[RSk?ne \>$mdK'"Ԧ'{/0IN1?\/c=>yoή~_~'":v_>tsr^dꓢbèRu%˿v =yb4m76pxEV?kl6n_~L?pf:@NE?I#M0vv_G^?S< zSхEgT7GFX1%ғgcwf7xqҿ4+ Iw/ew2MJ-Y teJYIVѳYΙv-C,Jv:›0)}Dc*'=YRe];z}PkbCՊcu̔NBkhsΜ/U}|"\K5Gmd-fS HZϳKdoxK-"h;Ee 3=)r &MZ/J7,%%鸏>̭*YxrHwk*v#)ͻw}ѳ8C.Iz|ڗE~ޏMY|e>ⱵWO+\IQ\,tw:1qEz^;QssUetC:dyz;W|Ȭ1GGo Y_d ,fS #Gۖ_߂XvMupWt2hF]ߑ}eӂykuhǿ! \{C~Du5!;80H%\ '6x覐N: k{@wW"'(vh_^]/<(r26YG&?UyX;:4c?J&,Iw=Ҧqnqt~Z,)`%"J#)팩UƊ\3?1gzp (Q =] % p~яFST5Y| + )NF؂]KK"/ >&ɳ7<˓71ֶM%_8hZZ&aǶga?*!EU{Kl8Ň3]z,WEW燾oj3u!$Pt}\uDV5EWN;^!s=~A2גIJ }suҽk^\ΆvDg oт(5]dBf+Ζ8H bb!`7@BK. qV]Wu_Ks?Q>Ai@[)tb1Nb2r7O3&ZXªsLi%RC;IP.CHP8}P=fǤKf/I6-N1;+>[U)|7ykkf /@&(e9"Bi Jusd|ci%C(Rm}W+ȳSy^Xӏ;w[V΃궈yQXv- )/?~yMt;o]dzMR'睹|Fm&yvq&Zʤ'@f ~xW]U"XqfԲ7{VDp>C{=UbN~v.KмN\:r+Č+NOs0d~gyXƟb被J<Zi2R.љJql]-լIyQ e^/^_7h`E1e\`_^X]ۑZ_N?'{%dqY,:z o^U9X $Z[R$<2&/q^(XhaTSOL{i`ϢcAG.^3u铗_ ҙEwGqDTBUv*@ȗ$e=JUNZk @v{Mg4 TJ * aD&FS NdND긴M$8??leU RWcs*8P4u妹Yiyz,Ʊ(:ZPQP.7/M؏*ssSXTS;2YӦ5),-/{_/Oo dC'?^~xӱ}lj/O6ERwXBחT:LOec/X IDAT۷vF?cT/v6vΝ稜~^X~=Izessss3cM*DX5k0$bT,DhS21373T#cJZUjߛoG{"(hu/jf0RW LI){Zzm0{mq&2UrxP˳軅#lgo2l+5n(eʬ1}:;v?I֢3 e%(Rq?Yǡ㻫^ƗHt|Ψ3:6nֵp0ֵtݑ't65u?v) $ڎm4IQ{zHt[9I:W1.1a5\\sTo-2ǡ\)98rog4ľDoKr/Gl7-tUώzqi_̛d-L!&?[cv[6 @6AoWM?pf:@R؏0=d[,5=˹~b y~|uz`9AI|x--NȊ=lԪ ^Gs(&#H9Qϐ ggv<*mхj>&h;-ZN,{w_X0jc%_}TerƠ35i=>61[ <~Ҍ6yS@Jt!H>it!6N&3c쿜5sIɇI|xŬQ'c>pԝ'&q b_ϫ_ϲX*_Ź׶u4Vw1|kHy'o6MJն_'zzhLv_ź*I^3`>a⇀@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ >i_>O'2d6zjNOwXqvh2Bs! P-H@|(tɽ =O~ Z-O٤stC?l5/.cC:{UB^h]Cz~3,R<[H޴ŋ/I~D1Am;0cy4R!QV}mCwXOgK:AP:O $gjKaqRdSOj-J=MF"-ϸshc2V/~_MSvoOE q&fbȐ'~9S-&^cttg<4|74oS> _X.e9zRܵѬ<%ˁu߆EK~T͹ /6SL$LEY篹6m<^{Y^ݍ3K]MBV HA[^f5oa7U!젙Ig{U}rO&);.`엀…KCZ\ {m^+u`ޢ9b@|PC88ВLZKueQs%RyYOc`*/rHn 4%C5>G]F$d8/&VD_n{~O y"~C!7wg~AƳ*Ut8>ז Ì'zd*V{ᙶ4~[FDD ޾d)xlWsT0!8gFg ~hN+q\Rrkpc2ȳ[q'8.*}ww]BySivαC֒SmfMkKmժm;Ux =:cç#"YOT'vYo*AwFD^_Vk'_OP捜#|>[vαۿ엦&Gu] y=MCV$' zz߼)Kv ?fϣZP}3Ɣ\5yf֔5osو[c@6+g{0vg#"jK>^=^2?YֵBZD1WHc:shȹg\%}ر39Y1@4nG5BVLlŨ-#UŦn2ϲIiNReʔO7h߿[Pxc`#3;舳IL{_c\/2I1O&fWzZ* '͝5/p}!cbջo`+\ؓ<_ط}ةʛZNU*$-/JEy1:0jء~eBLn 1Y{dBNXޘ@NPu_7USNfWlu$`*:OkGW(ƭ3Ɣ1;\tbg9.}!k#Q:7hatW6-\Q ˫&?~~XEO9nU @FST$V& LN\6.J'3'Ng` 93nٿlQ▉>>>>>=j$zxo_#Э] T{1Z9|3.|!]`D2AJVsϟs2`]1JA e 1P0x%RI{mY?^[Mͯ*:uކP&%*Jя~Sz԰q4~\=lVo??x+%&ckJx}zMqh4WA˵y4&5i{\  ”;ʛ/ڪTma6Wy\sƜuQ҆G/,cZ/Ud^{k7h'/φ}uYqcSi;̃to)B( ?}NW*΍p7GCQyګ>_p}yn{'BW-Ak :r:˕xĝT'@6іd>FkΞNjjzu0RL ו8^S`RӴ-ƭ笸T10Z%,\EFk;i~\{{yz ,`úb/}J+-c)8Q?c,:8SolMPM]-!҄ҔdD ] Y'Mc,2M/AgSsxڶ=𹜠qҡJQ{V-ZjO{l7fLbPtgR:TҦg[XHa5v+B  $@Q0&C0Ղ ,Ng}㼟4a0/f߹[hX?"kX*ix 6gCUR&ʓ]Z 'M4a~> 1]R6hADe}]2'#WEe$mC .˩҃TP!īۥ@o e6ޞU; e:s>=f^͢D[*%%Ieǵ{VOJ[ylŴj!ַS聋 =wIeANV +g~MzZMae [i:lқKRkm)?ppvw2n.GX{nU/卷1bn~N̙3WK:k+|@V<or9A68ٳ""+yVu{АNOo4>:RnNzH/3MUT%1hP ^[ro"Og3*0͞_KSO )# IF:D1_$DZ)賞LʸKhtMzFpd Foj;}9C/( . lHpD d%2i=uc:r9mDo}Ȍ?PwV̀:91i Ŏ/WbiHlaňoNdмmA7ԜZ+=ۋw.l[!ofF+_ce㇘S6$vQxqAu4T 4M/GAR2^سXБgߦWT|LQ@Ud2H_qnn:iZS$U]B9/Ru h+KJ@˲zSUf6A?U(:~i\ZڏVn#\&~T^UXiy2=Gs*.O^{JU!JB X9eOy¢Ua#kڴӲrÿ2PffHizҏ1Po?uwH/{qw 7ſ}te^_SZQ `2ęniIwϽ$V~Gॼ, v_ $<}xHcvJ4bWx%pkg/f w$ZNy W}7)[T< b\=~Vw36n(ok?CyכwwϻĖ*nFn忿训R(x[(ya{1O^Q6177773֤brRV"#:u:e|IM&06ZeG-41u`;c}3a\w9M_o9ΝL0}?OÖqQoZͼlܾ+]UjozէC! u."XH,[hQ{Ȉta=z:2iTVú3R|\)7bEE Fw*R~,vt`7`V \ƷW>@ @ @ Z ] IHBYOBG D#ixtXLd|tZгƼTNq7oBok&I }Q}*Z!a޼Á=ۛ-pMػIgBz_B Ԫ2j8vTiižIF#mE!X^+;hJpAMYte]ʉtoSXW2㌂˵t>@ Bq]'yy2@RLP!4ʧ%j׵FA`v7 D q۸yz[31NZd @ys 0+Wl)@*0A>&Z_I" QeÁ~DKEߴ=S>Y+ސ{3Y{#sb/{Szpd?u…CpZL޽x?.{v6jP%WTq}9/x'RA- deon۲vuA9|-$Á=ۛ-pMոeF ;D d+t`JEf#,-+*ds˅4;CFm}ʘ1V f ^֚q!CaY9>Urm5|&sydv<(CUfīyWVgծ`:˧k+܁7yI!U;%o}5Z@0mZϢ/ĐwvϞ&WNd~TUwZq!_>kˀnJGvƶ~:"+bD*/ױjL7덛 1p<_c4ζDޛ)mLncJvX]}}{ҢrƮ4L\Ey'{9[pS._V&l<2y{+I<F=MSpp/{_dI8uk6 q#0e &_E,~{Vۂ<5]_^zu9Ɩ+?)بsZvtyorIœ\[p ՞(ɻd:iѫ>x%CKG/uTF3;}7SLRm׎KY"|#B"O;0sE4S9ù}V'p^x#_Bv5cW;]4։}aOW  g$Rsp(=z,1|8~ck&WNM5|jn;qS+̰l=OޣZ2)` cD4[ IDATMaFR@JNiX(~ҪV {NW|$]O7kl$&7Lȩf^Vt pчwbI[/= Iѳ/K}2($QVښH?yW0=w% 0 ~[&߼(EgCC8'6)Sİ>ٹ_|VNQ+ۚ8il5cHGMvӤ$^_rbhf.ˌ}+)iϨU/B"xrb_׮.w8sa Z'i`LEnT8.;ԧٿ '͝5/p\_(qDQ˫jWu_7USNf6;lZ0͹2"-_,ad)̬WbVr:_1Ԫ]˕tĝTa'qW#"=ݭlxsԣ\\r'=Vn%o#=ᕗK 6$9fT;7t2,4>MXًx8)$QNV/C_Y:F 6%ax8h@ۧkw ε3Tm7\ad gOhj H;WǮ) ƍ[ǓΚ=o2Hv5i.UV "rBoW! _^|V!]EsoihkzjPQ,ZxLlE+$W pD}uYqE8 7YG/,cSuA!{X'+y6U4&2@]q5D`'ih'(R8yU)xhB|7)HKm_f2l3 %̾{v3iZׄ>e *~ǂ&LPKf>.}z;w鱰ɑgeU=.]8jKTJwhidžS_}, DʾOeA~}iL+]nV\<3\CRC*i z#%l0g*hUGvJjěT$ȤD*ȤlWbnqyRVߠY)_Bijq`YYEjV*7/2.HfZ. 2̑3ܼWvxUȣXJ#T9℄b!֑ PW& h/oA;V(~ @\rJϲyZ2AwVXDxkưu3ڴn`hRj#,66Hy׵F0`^ynKJ"Q9^9ILy~j-W<X,طm>grɰx2u8oJa]/'y֞ݹ"*_J9R x6v γn-)c;;'ĖdxE;ܠ~e%jvQ? y>Mz9BeEI8e%r^i +M/qs`qnxwR%ˆg.,le(4zT_|ª5%ќvѢP\lXhGMr_ihWj=rjoY䱍G݌T'\`w^a3,Vs deonStGLS';+wfT븩e K]&QlrE^7C4uR¢NqILSgUΧqQҫ,V*oD% cF7xv?ol]{׼WX}~ЎW\K;nBojN]Z/\I {qY0mϦv%5 gR@n?xj$O4W]gXTG^إ-c15c,%h{c+"H_²,w~.Ed8 s=3s̙3}|6[K;t9.B#7'^زMx] z9ϓnLO9H}\ᜑw5Ô:?aNUsXN7{8[|gSr üeC' o͸q8o ֪'9dH*E On+<[XS\3V:T<$D0Bܦ]rsq(rmmp)m˘B/V-_ג$XƷN`3Qk'k;u է)} i.?:چHŶ:9uИ˶W\vNJ Ғ7|@Z%ҁ(s+ -.Wa66<j+ 8Rsb.OmIf>/Y!8r~0C D!D!V|w-`JmS¦IprˍޏO]N!/m+sRSueWG?Om{@ iF> 3 z t`ļ~J[QZ~Rp>/ iЍ {xZQG)݅S^U6  v=l(N㳋:*el;DhH{vyibxMal^m^a42SG-G+v&ͳywOkhݷ{4hn6z} j֯MKf9߻ Ul`zMκrSL%6A@NmIt&f\m*V.@*JVCu¾Cs{( /T(^\ ǕjI:VX=mSjH6iTXTXp1eդ"v)vmM)&}zJ;ʧLv}.BR(&VLC觊+'&ÑClf1Ywc>F^C?y 120恗G3u#_Y\"glG /d{^r E6ym9P6l.LbNM#BΤ.Kym9,찔"FmA7?azn 7R-^>Y͟#ʔC$O~0b;2<<0[ߕݚ6?=7ߛAgOL&y67r-W HE>̿]v\;: *+$y ; sIZ{}>ύ/Rzˡ۱ ȵ4=#P+RܭlP0s%؎{G  1NUX^6!$~ƕ@5ouC#o+*qwwL{3Xҫ7@Z jVd羟Wm)=ںԜ+w]/Bj1'4F|JT<\')f=$vңrY72Eŷ{q%(G@ڒP!HCbziH$*1fsb 2GY^Cʪ*ND(@He`0_5LyWrknYW} dyy2@*?dON^\\kPL]=豿j)DX7~Bp"B<%2M%Ȥ#U-Z=#Q`բz/8VRͦɰ}3w=)g\ψ>8 *-mM/X~ ٨/ʮ#<vWW?ժ+OsueWc'Z{T#`׎H1*~+Y%}奒ϝZxUXLew h4[NeS|oɛ尚z Viswa6J S8nΪx ˨e β3U/FƤu%R MD,NK7OZz~&yEAdz]Xtkdrun.lo5Bg-b؃? ^MP:I_g88Y@V"}֟&kLM" (*B"cL*IJ)Yqd3kZs=_?pa6᧯\6-h߾ڿnlK4Lv}CefWvqc߷a*^k}F_]t =@,nsu\ z] Ɋܤ>2ELTٕ36.|.'%VS&,VP{Ui\D6ڳ,,YWKUi+}c9GG$,iVskGN fݔuR= /Ip?qHSU?) Z4'g6 jvCkw!^H:)+s)SGz7S,ͧCx,:g &VavI%K"FE9xLRz}9ohǧWS hL*(=EKFVHl{tcDРKǎ{H5=9$V [MqW5 C0ylZ=(cBg:ɔ=E6,Ce"SHf`{RKdr1._;dM񼼁z$Hմi$a8{?5k:=Ȑ=uj:UOQ+ʺcdw ̵g6ɾz5E/ FA@Ne{2@}&0 |-m0M+ù\dz6?jJn tjꁐyeݷMٓ ')Ry : YҼvY`$ٰt5V>P^y&ר{\֤ Q2e]4XNqJ{|f>? 4L塜:ߵ/-Y;bȠ]4<;&T+ ǧWmW-XΟvݶkޭ¸tnQR_-C3~5w[Oa*4;?c X,|pGғf^z Z \ e}\vdzθ-,MKٹPe`u IDAT0u˴8xyqߵ( 8.G4_W5Sq["W=Fot?#|ٺs;^˶8|-˾^j`cd' }塡9iSq]BC B2FwM rmf%CCoٱ̵D6O|ph4k+,{<4O͜< weE,-H|?H* ?lK`TޑEE_l̞Viz9Aqbbbr. @?7 m0ĬѣgXPbx~rhY?<G9 uTFcz?>v֣n흇f LY:ݿo9>^K;4@'t:f @ / dGA`B VDZԌVy*NGҍ%' zY*MvݮNC&%Φ(-헿ph'r}$$$3ZÅBBB ܗe;}$.߄dqx}>yH?RJdTL+pB(O#Bunt: L {ܹ+ORҒ]?aOBs8)M$'7IXCDY Yh<4䥟d.Dtd+_my>le&L`$9W(Z"rۦ\D۴)iF!} `Օl:үLi}B-2g@A^$"y6]{K ))~W{\"uoBz`M>suiFSGϿm3~~ii}UwRCuv,$~sl58hQ|pӦ]Gx\|";2)Xf@0 gE:&[ñdVGp"]$PktD>F0{x-F-D6HW7ȋb)f8fy,.,ׁPIHlHkm*O 6< .(S) $ `8TdW&|$mӿuy\U$Ut@]%-VOY-oc90L@rIz*JJ||=*אR)ήVWn؄i-mz򳍹8hzG{ I߭{}ʄKfv7zPQ׌ lx3w1o1|qMʥ:n؋CJE`?U45O!OV)鷉%[9bYg|#X-5sZ*йv-\1GЃhGq΀JlGy.逸yȊc;K mn/$Ѕ&j!&L/X 2<(l~Gs4$@$@80h5 0l?}{Afa9c屜^rt=:5s<}'c>kO^؀CY-"Tt }Ph]D"T&0BFޠ5◎@x>~68&WkIzR qHpr@}l9BZQFApY\oF 5$9 UF<]NB*\%ơZQ! @p]C/26 Ƌr ?+a0@baQ:2Fo۫0 m/ǨA5rZoGx<~sÌ@Y t7'sҫ ^|1tlm̎-0ETG0Xt:^4z uy_ڙx[`3:blRUL@mIZgP3۞ۅ,ywP@*8e(ک"K՚LRk'KqWxV|XXdo?[Ic0x* {͖^3HTD"@&x]MŁ2aln`#Ϯyh2R Mk]drB0+WE3H#l`fߗ'GVWx@!=х,Dz(z'=V"Y@۸gP4r9jgL_dIt[]W\&Ǜ"M@WvV#@_xڈ|0;u4h$jȱ,:rᆡRLbPoΎʼP±jDWA\nB4e$5P)eˉb0*ޖh nΩ 9$hC Žuslj ӏ j7_am3(mksHUG 547 9?˾>Y`#@{wuYS3{>v_š 4H͇i "GA橮$g)ԋ:|!s~ŎtS@|*Ք60i6(օZUj ~eE7Β@0|D*9y̦^ܻ@VbnToVps혏ɵCh,Js- *M2u/ϵe"Sپi|Hzkg0oO>#.[8z'|eݟt#TcWP#+sA^6gDe%wM#z Oū2 ;BJW4+ ٬ppN$Pj~V?9H>3c~V~*j@qE%j Sۣ4寞<J~$9s@)A)2Gá|h=mvHOKh3DXʂ<͝aҋfs)4o#4:2\/ș207(=wC8+ɲ*s@ cnFUԍʰ lie Lg v NCgZ{0w Q `0^VVmuj`>r G];ݱۊ}{c]1 :6Mt sfss?Jnm΄1 dxG6fsc-?LEҜՄ`0usNp}?;_KoA*DhaUߎ̺u&6Cm.diwNlq>Y'uu Ӄ=v!9^V%uLr~'Pa`0]V/}+U\0nj^kf^s>i#\)/s,.L3*O4ع1(b8l؆ʧېn }bL>X4mv S];]j㟦J $b†]wB=v-+C?2JJe:3>w&C.2Xk㳅Ӱ0 .vCƵċƯYQ|7nĉ^D]/M%v9wmR"W$FIbI\{S[?24^<GCb a0L]!#m➙cם~ZhɐW}Ź7(*S&'n᳇$=j+gaV&rQXp`4_ϡta'`k ص%׵-}lqZ=J`0ubg9$ڦ^_zѫũ_o:)<J#6:6,ͣ{v3g0cU9:6Z5ߚH~䙎i_|8 ˣC|#׎`0uɵ#y4L{TPxOz,)&6 wl9u?FO.LlkAƈ[G:i@gdm?x_(`0uI`0x_;`0صc0 `0 `0 `0 `07GsUΙ3 ;WkW;k wL )7iy7o_bRd,le|ؕOݦn{Ͻm?fWd]k+3L t =2c LVw7ei}۟7a*?~ZRux-kae J\?Ǜju'A=b-}^{>kUZ\}"5q^+ڽeW}5n[Cѓ#2>=ǫ7fPޅZ!M .{jdٷn<=G`Z0ox-բeS(D}Vtog͛9 P?~oK>ZzM?޼`w2siA+&xQ_`޺/8y):zq>\ d0"HDG _=*O-F)g;cAR _'zb իv5wQi"w|Bj/uƪ[s">u~[_rZ#rV܇  v:!+SrU` 7"= D'cZ%ҁ(kW=;3?pUb_T\IKMՕ5!-;w2R0f|p/;'~%iI^ިR2m*ӊK!Z'24M*՞/I 1@1_9z`*RXplAV% 8=(J(a`W.'[u 89="o9rXK/v|z`j*|,o'xTҭ*Mmpd 'c󚅹kJ՞K0;8ޑALǕI:LF]'_,۵6>)j2'ű1bbd#uT*OdR~I:Y,Gq/_7Q:fhKV Q;z`SgѤN o~ܚ1%,# ~ vo V\n[f+87gҮeܞq?eWό'OߺzQqVMʥ* aظOz4sCzѕ3upǨy}+M]Xҫ7@Z ٢ed羟W]qڔzc;6ݿaA?1$C>eAƜlf,yul&L hr U])pg v혺 R؉L6h(̹P8?ڲhǿ1-/@{k 6^t~ 6nа?yu쭏ju̐?ؽ3{FJS7l'layz`HRٝZMa05b`>"Lq \6(z K&u~Y"L&8Vw=]dҳu"ͩęW~ 5*e<1IHim^} ]:vܾ"mk9SAܕ+qG!SOբ!| 4.QQR8lO!7̚6mڴifYٲ0]ft$xhQ =f3%ØQm2Gaԝ:@&}q h@Fh0A#Jϵ("{M ƴr%~-z}ݞvŪuohVsEY M)imBlS1d}NvmÈٙ{5sj4ay"__VzdM9;׻߇2? ޼@Y:w2zʾ,4V~@+~uɇ1dܮBQz #Jvc qG/镛ɯKn::0L1gw-| h?|t,ʞ{oKJNcv2oPG^].TfvjECw|POӎH`x_K3NIdͩG)tBkHەs 4L?b'-zB(lo(Af>4/O1s\^sw*T{^<-㙞Z97cwsIMo+ZɳJەt խm̚Q+I3bQMG[uazц*]^ YTlZ^|c@/Ȋ&nCq(MֳT# P^z<3|ȟ]ܜ6cg@wǕ54jmo%~Nk@"ѳyzc ]9^T~(N`/^ ~LěBu}Ro *Xp~Ƿݻd]RfiO^;7д 㥺6O 1ۗ0"z""FD dBw⯶\d̾ Xf0 vߖA\8ؤ.Ϋ5hAQl#ڕ T& HoK3Oge2Ÿ IDAT\# 5}lg"Xah|߬oGv7Gw׏ʖ_,$ow(/qɋ[6I䟿CF, v*6ҭ-}){}/۱blo)wO0Tvpƥ+Z1f y3kӥC >=!؇~~XXEmMY7.G7诎 li=u9&l6V]Z>w^O']AK6,{M&nrM gc'k- HeVܙ_לȨ07[k> -7;֮uߋ~,BjI?L#rju+u yӸ$ɡmO`w`宝Шښ O }#=izQˎp&)bk_VcQVzjrykH"D.@1mBjO咪?;%NChe2r%;z9|Ԛk[FiNvM&R2Dt/٪g+y;o:m=ӿ\bEor K#iqrOZfiҷ5)Gt΋7kƱlaEJ7eOB5ej>Ow+?f4S+z(o['Vf~n@^):/ղ+W>ͺa}D7O?'sl9Zu#O ^YJ8q"Š-:Ctl1`ܐ٦Kl{Gj817.M7zjo:Ivs݊XhԽ{mǶ].2F6me |ŠV}:1׫4rnei(gDC>@_OZ4ȱSW_OD~j&/8"m>aܡ3s\-];HOS]h`H?{I7zt͝ݰM|ۮO-ӆ=zdN%X^H& 4@+ (XV(=W2|me=;8~-bӅ6(?iT&xK:x-,Ӥ-ϖW2XZ˞P:؁I0l֮BP(Hg_>|!~/̏9}Ŀ?wgO1ЪWVShBpinH}bdxl ZN(2  8 XРM&4@ *wt/Vl:>3({BԦw-wwL<}Q gѐc6/!d|ã}oEN&Sc[rR{%v  ;V|ºga;Ť3b^?%k\c~ԴM'l'[!hз헟$Lsį4q|)Jw|'Ж//,zɧdMx9w.Ӓ}O^׻m(L~&y'*#Ȥ، :\Zfoq/kVyqbG{{Sݕ_oI37v{ny)&),esjLeCƥ?&̷YK;3,CcbiÑbQm 74a ЌYu,<5ˣ>]6{JKQ`?,Jb]trkdܻM?-w\V=V ۦ h浿$fI(#X>)K 2heˀ|C+_>KLʡ[:34BFT|B4HD0 ];ǮO{:n3l+: \uj=P -G,X(*0tJ=brY0-t4k_N2BQߓߙ8&g]#͊됸tw37}ꤚ`wx#@ \'7!/WA.7BÊoП>N PpG/=TKtoKݏSQr>?b4GЀ)M۞ ߐwhWƠI?+ʯH[KGy}r^/Dꌨ嗘ڱ_I9 B蕄DFȴ\{[ǿM!emǂPTyy, l[N}f~`Y[kY8O\{Pe`_?\3c*Ok4Zf08R4ݓAwtXsB0'g7DzWiEk'vaum`K_n- 3uB?kzq'֐O2j0o.U 4/M߀d /c#nt-2BBEZ@T @JC]U_.t-ͯ7l_ `1(5مB_'d dIS95v4># uJr\~~jD6Yf",/cL~X mSJq/6In)Gs8 rPO/46E]pcF;LȖm#\(xG~ 8x LȲrs[N̜z zgRhwV#5h9bH8 aM jmEn:d``lɶgCZ칑m4+{_?o9z > H=J.QŠx;h%%r3p9m|/joE}Xl,m@q\Y'#ky6\D=ߩPttY")}anN]Y3iܲL:zDwە`|+[!m ]pc鼆^r_ibtu;D}蓆GY{.ӁM lR/j}=s吆{K,25o&}I'nԺ?%eVOo'طjaҠV( ,2@9೸vƚ٣K4QŦ;^1| fݯx-Q?دQŧޙ4_2b=2ۦ-4gǖ~3nv-N~ Kz#kkϭCzg%khn:pfG )o^y$6]#<߽dk€ˆ:%;g_h0iɮ/F+3 }"b_wNzI~ A ) 'nKBõA_ hFY ?_|snӰ}f.ɤcl8Q{C@R%̈=s"V(IeyyP-ʧR>;;-7,ܨ9:#P;sbVYзGߖF>r4gis|S]SOfҩ7q~i2wo7Tviv~d8bضgU%\@J[ޓH/zt즃ce7tՓ/t?c?(gٰ{^]72׫M:zG;Wم/Yu\~ G>׏}㑸B< `0 `0 `0 >tn+JǪ`0 v"xAG j(Ӛ.3)rwúWvĈthۤ};6 ttWo=pGbn:ݹC=GO;"".&8kzrl?dLv!,SQڵ-KwS:oyxV<[v;@kH?{rQ^ SS|֐+u2U-n}&f |G2Xyyb 7˱͗vsǜ';ZɳJ2.KnzF46Wa< ?sغԿ~Oks3ѵۓ|<ڬ!' /ĦjH02•p*"'Ь[LXMS?͛dg߫<ۤ~~Hlb _}EȾV4QVZLp=2ڊe1:CnFa8upz#O2WL7w3-}٭LG~ D }du14SoGf:\]Sc u2M;'8FHж' ;ΎTg.yf|aOuXݹש?R X~o_gifW/= cPpܗ r"vQg;!2$x"屎$)& 6CGiO4[.S4@|~(6 ɮ wÄ^V4gqw}<@E%hٛtCpaSI3YxIE|a:d#Mmw[MڲNZ{1,G@3oٴ|Jhk2gD}Ou )q\ʺa}D7O?ѵ];õo~E^2m5qF/53/w4ٍ] ДxrJoo&'|A,3^Lj e )`/>RGN#8䧳 SQ['WR?0<6u*Lдk0][oyܔWF|ڼ_$yoa}2Ȭ3R&kP8ܺ] v}ǎ)+˽{<gTeLt٧|"+Xk[èIRjp[?vU|"W͟2OK. !,W`\U\)2ґRεj&Gu:KKq;5H51{ϲ"99Ѹ.&sej Ǝdܱ7|dl͜ @2qiG1\/,b) ;oDWݼQR 5$OL0bbB G@r(e{so)ޜ%#}؏ZcȪSZS٦ndTTf*xU6L9B0w%)yF4[Qg# hkk~ mDOlžN&.hfhkǢ_\?r:d7V$MuYڐc#4KG#Tϫ+`lۼO1kg!?v=!z[qvӗT0iFs߈f$àѭ.<;EGԎȱ6$#TS[GWשjECCsݼUo E%F_9:::rlM(.9Uwێ:-=0ؗs7Cѳ=O`9̻o6GRjjb_55g.κ:ӗm'g<1V = }i䜠~{z.ŽVg}Ȩ =9ۏʥk; k8~޺dCW֫(;FlHsog8D5u|v]^,;/#nhA_G|;,=P{ib|AD! `(ഽ5tl(k|Nj01p9P['~%ϝ4 ތy/cL2o9B L߻!3oEh1|[~ܢq\Hc"[f1]ݿPm4FZp{C)2/DۓJKiabF Q cyqkEm{꽚34++k= dFUWuwJp1aK_WzIǝmN[NӦԗW FC}k͌.{֭\aC0oԞкD,0Ѷ^nH\DpF>EA5JQ5zKiѧy1W3K=3#ME4{K0'kJΗ?kGhogoK;`1vnh?2^K22-Я5}x4.ᩘWL.'(/H:W.魉ߠq^=|})h,(J>RV*aL'$ ?l>}:&2vyӟ '%C=#&lfLY@cFʰ\2t'&]kZWkٱk[kH&Nl*gd "n.ū/ {km7V50@jk.MuYڐc΄,ЊR]e׮0,4ͻyXhDOCF8ٜn߇5=MPM8kC2B5u]} 慠-=uxg[6{`/%n' uoR}nv?Djjbg;qZ۲S憠&hﶫ剱J@ K$gXB sw}gmwv}^ν j ګBEϟT0_LѿiBHly;F<ޏci=2'9ֳXճY~c:&-T6\TlLjNC;-N vMS88YU]ƅ10Yab|hʼn{هMI)IJp0ٓC{,h\Ov>0:!0pځuKo/[*ʻy[!ܛ~;UxQ~u@-ʾg<%qս0$|,KǗ nC΄gW"hN4c!RFx LBUEĝWΫ4іl͍er1X,oժVeD]bC+2P>dצ2߶ JN.X_Z^p2O ``$Viގe7ѓd]ڱŤ JON7c01:wG58ȴw0@}p͏,m9eE vO.U=ʡOp]|竅h6l"8888-LSMǶ74|zTnMbe@UE֝_ds๓u`!ܛQ;So>`ޝ]l ܘyK.[:r iL_S=R8'hFQr]vӽWYĵӷg͇n=پaEM橛7 -ZEd;&rKD1|FI@SFǥ4:u#g?ԘT@4-lGhT՜A }^Yo:c,щඵy":ų01p9P['?M%boqYD(f̞cj Y ݸqD6>U)<ӏ;W6EѪrD[yEP{6{;zzxxXI-*^v ORjIw?޴5aYkf8??g]lcW-YnyjUzN]:9rmy<"5`L ۖMݗ `×۷Sۥ FChD`*2zt~݁tEA)Pi)clY5R]$鎟#DEUtN}y_B W+勏޶?VBYءeSzf۰5n%23\q &};T/ѵ#4ηf7@PYIڥT@0;7cK$њIH 8tM*5}׻u`s_id+Z #]8oL~@:9kk'Z . ;iADgT¼m/ZZRF؊J eu3 {']9*HMºXƗOw,)Uۥ-eevA^SYno2=hJʵ3~Ag=Lg%ۍ6R £Bݵp{ ћLk3ɬ~^.fyhCSXw4^.4uj*3 x7|L8{8i37Ե)  Ƭywo߆?Thh~𔥋P@=!g[ <*j٬;[P4Y G8PEWľ˿?A,jƫex_k'ϙZw4u7# nl Qa=t^W4&Se2=Π"ݕ ?ҿaӜ/°u1Q<=d(+O0\6ż*KpSMy}gӪ4z:1*'~eAdP_6$"}YNB>,{ۺvx]0Z r1֣)kRKLr+-`ZE9m̑-fF%N1$a㣲B#iBOuac(G$huc1 %:[ӑn14 Kl^tUlߟ~0r)oj3,7U]&iQz%SY%J8>!a8G~daŒgJ DE wᆸ(>ӳ2]GZ+wDw Rzf71⤽k>%X P+DLYqRN&K 3&)_OIg//ܐI ێٲu 1mQa /1˗w]uR%~z'%hoB(FM;@ y42@ ΅h P"|Zqyi;&^{ *ym+e{g¡*<#*$kX'eJql\pmCv\\Z4[g)R]#?x#[ PRLt٧|@\;ѵn寝-ӌXvQJ71 5 mǪ;YRJ{5'rq]S 9S:CbaQ\5mGgS4>?ļ6- -SYB\εZ_>QT9}:U'F5 d1vnތ%F}~zwQanô'R9i>ʜ 8)d&"GUyOc5wZgS.<4t$ dP߾[Mū*MLiz-G8ldM5\%<}"( Eڱi<ܽz/µ aZ /ih8%X!Dw[pjˋˡ0 .{li۳l殭ˁ΢V4Ko6o4.Y[Jʤ1aQIX2I V%e%ڏXUϩzY0UG -uxV/OGK0m|VQx F4RYK3c)RF؈Vf7?%r4)g,}Zn?oϷRYl[ql,Qa?;h]BmCC P?4D@ E\6תEjQIQ[pُC@E"Qxmɉƽv1+Sc@6v4o4G6 2%l͜ @2qiG9Yff k9K+ĴyB*})7|OgdWbߢ5i7oU~ 1~KG֫.͖C=mk ^ c]82EkJTosOs>dZ4 X_px5FZT$t>)|j?yٝwDZq wjuRרDYM> !U򴖞4>ks>[85w/IP`Ҍ/ʬW`VfMn*'~k d7+Xw AlGW]ͽ}hx`wS^!lŭ*\V!-I6$#TS[GGBTR*=VCWoC_pn[U|n/NRr2$hǝ=x#מW1<9Yhv {œhX߆ 6̋ǫw4X|$8(B}nڢu٧O 5b !- JVϑ$&)oЭZFHp$g5Z"9Ԉi3Hd-.؃o8WQSKJKDG+ x(h->P;}˨dgӱsM ٢Bk<1wvzPEw5R2o̘7J{bоsF9iĵcjaqcLV%._Zqma#~Rr+4L n?*ӯ4 @2~F #kگWQޥw 2/+g8~ ~No2k?L:xv%r-+Vk&MGVZtEmw2` LV|׃WED ܆0b*>䜠D3cQs9M,ӳ;ʹ=Zͻ,J lHD[57`ҳӿU7,z#D?h!; s[yJkiӒؽ&h@PKLjn<:ćq|~l&Q]:xӼ QC+Ro/@4abt;k[劬_~:aoAtPKk+h6l"8888mnbM7>ʚw"M,"*?$ϝ4 ތyr5.KX&͛ʀ;)& 8ٜN-vDw-@u%xeW?h}% IDATʼ~"W(G̽GO Q6Wd;C 5^S-_t0Tˎrۃ)4'}6yFCh:י`9h<"-zҚ-7c߷~RLq&o *O:)H *+S-~u+Zs篺.АmUg_Ab];B|;mh?{]ڱ-HCgp3FKxyi~daCW_֟1N:c@ٱh%N_im~ix/`wh Y4ꮳ jw"^Um5u Tz0;U$e|tǒRm >.'ϙZ|̹eew$z^< q[xت3վS}~/ ]~)tޱFtx90l]LjT0`@p[4v] +3sҺWD uiI -?<\TVTL꫐WUthݴYymXt:ϥTW_:+\Vr()#_ږ߬^! {f96[P[I)J {&O#+S>Qx =hm}Qx r[CYS=-D zA|ԃJSGz1ytF,G^?UH:B$@%*|P01T7i1my?ǰw!J .||j+8rHmcD ekM4rrq]L4dcGs2"Eڮ :kcү;&f(Ej -c#@ B, 8@;,5i7oC> MLAt;?_ *xU`i#| @(ko>nyީ;,CLklEd*Q?ĥe'8=3'SqP/C26ec~B 5\mȱ# ZQ*÷!uߍ@%sk>u}g5Ԕ,-剱Ji> @rNP\vT7>b@ 5Sf TS[6feH&Lmi QI<Ι4'Ѱ\ ̋S*z"xX'nc6}2E7҄(wn7K[-?Kx?b!=Ym]b.c"|Tz`' UZTL䚕C: vMِSS6i׎U]ƅ10Yab|hʼn{هMI)IJp0ٓC{,h\Ov>0'.x^hĖq4Y~*)gM<6*Q̛WCOXW"r?<}']}dJ156-ٚ bh9MmYߚo}7=׬!`%',KĬ EC%\J) jQݽN)@]ܲe7ѓd]ڱzŤ JON701:wG5eL~܇ћ1|՚a[mn: vOk:8888ź1XG9ߺfiN ppppx|͆~<2MĻEiQyCfԎcM|K4|cBi[{<5koϨrEWtBm'|XnM3sfբ1{%h#Wٟ@~eh7_*?ύ!SbkH[rQ'L2o9BЈ:8jβ+MEyW-?n8. $1[X->_f'!T~?b޷PJqWy{5ghCAyx+H&N"R*?>~C+[d&n>zdJEזri38&li>n6`ݖ WCʋ&)/q>kTtpS|0TV:vzB+xꂟ勎嫚,wl_ٱ ^]*.=mh(CkD*6tM[_璟h/lw[_xz>t?Rn0Tˎrۃ)ip~~jϺL0RMO,rOjHKmffN}A rf`05/Q4v#}.jAtZA@)εmPv,Z3uS  R>eKJviĢo$vx Q~AYۍ1RZI Y4ىІ`QS3ho7Yyd3 C#%@z۵Mq8b&::= oW}TF4:^[hIð#ko>$@ncVg܈ȿ2X=g/a- >sL4'zq-0\'/VrbeX؊#BFHݵoQ+v<58Եc&,<]JT;ܙ__-t0hf_VB`0>ˉC.K+U;e/a6-:NulX>ȵl#L,_ */z~BB  wѸ䢲bR_METEM{$+݂0MVy˾BGl;hWsO%X(̬OS2B24l#݈JЙ^a YhJ2r%/~? ?l>}:&2vyӟRLgg N:@IsD@Ohb'Хدk2,gFl^?<zTc{=W6D@d4J L=`enOWl:1ZsV%K*ASg2H幏U4G# ,-=!3^uvqۢ /RTAv\n^ūEgkHD7}Wk*5v}ǎ)+˽{<g3 @-x_](78;]H1g}@hG>wz'?UQQr"dg %ʪ,ƈl#m;~ǠS`ҽ=o<疗e>~?dA^Ut.mfdg>w/ĀIJ3EUX-?WaǵC~1. *J/ҕd v/m)`5yI j;[-3)T8Пzo'|q'v{]]iKg-rȬʳ+iP~R2a[G8?: KϦi#}~ЉyQ?] 'R9xP\ zPB>ya''B瑇?du{RϴFUHCf SoV^?^'xYѿտ#nbVd  UJVȴT(5>ۂ,)0Lϯ"yXs0TbBU(EU Q>5 \ 9}ST-ث/EՎE}fS tq;}ӿRy~jG+MŷwNTcu1~ڱi<ܽz/µ aZ V7ZMUe!N;mH-V)9X/ &re~V`͗kWN9d#bUy{Hr-K XTg?~Y'#=Zs %@#n׌1ytɰ?לX?f'nnu-uxuښ*h*]Jʤ1aA6['4@#mͅV*LF#T/I< @ eylv$7 U"ܲqwE?-=cgoL & "9um oZ[w`jODG AޮX;^5=V_[^c]Iuֵ#nSw;h]B9 "W|/2]g .||j+8rHmcD ekM4rrq]L4dcGs2"xe=s'SD!ҵ#TN+5-hR}ig k00 PsׯSXg!)C"zt2H۵@gu8A+XF%ïLym<= nVL iJ%Xh ^X09_)JPBSP>`lͩlSe-܍ UbEL߅ mVphdVI߈+oBO^j }75ey}WS 0T 9t@Bt4B+Je`k@v= [I[#4 -=S'ݬDW~ -|.1C84gwsiVT߹4s:#itO}LICFv01t/)P`ҌTH+ATfMHPlO֢2}]:~΂y);rТ/s9&r xţ߄=a͛}7j4Ň9!TS;#ڐPMmuWM_#x"02Ǒt>ij:x(*+PhrSwesRrfHϦryb䜠~5ѧyXLmMY% .A@eEnX%  c@ 5Zms7 .F(Zg+C2jIiy5U鉲]]x}쫗s/CoQ&\ʳ`RVf^C' {~OH413ҩ`ڔ95{֔{Q呠t0֗ca9"/-|ߔ"`ے%ZJ=;޽u~G[=cިnK ݇MY0p>dA^22.| @+Nܳ>lzdOJQNRrɞ`GCR~ٝ0%f'd((|Q ==h v`e(WbZפ jQ֝?VŤc0y橽|O{ֶG 5{3`H!;9?<^}\ N7wSEw?|Z}{ٍϙuQ]J[ 'JD[57`sӛ%rO8 wɞT\^XVhYyT~clK+Kfoָc%',o(m{n [M|^ݴ z!Q-zq+:Ijv.:#fair Ms ޾黺>=5 0>Kw!jheQhFekQ(#5l);vonMݮԼ@K/be-jҹ:{g}g/l VYѾ*^ү}V-Q7鶧սv0XY3DE龟?q{<=C63u:xQW/NC^'=n 8$Ims1v#wۃ#j -ȒǶ(/Hb>:K7.9i=B7j(&~195E;e ?%mt( (xxyFdcGu'hlA^ Ȍ'\;gѦ/n=AD1ރ+/XO+Zu%v**镸.Sh5&s6b85ݷ[ޯ+? I'Z7eϹ*=ܖy,^y%01ON/<;Uxwp"L`<փL@+O6UZ_)1DJ %әtOwfZF ` P)ڿ98 A%+aLh=y% ڃ޽Vx w9TF2kP~>%Y]ED~vKI(z. AsDZї_C0|rdļE+#Ⲝw7 uqn$ԜId:L7og},DOtV 5Ja|#duཎCM(AXY\8 iNtjDxu1k;,xǺ?S*[1*? ZzisC0 @y >XKEkZT0e}](ϤZ93vRtsZey?%S- |81}](#'>ôEMnP&ڐqh9⹒W?'eTܥ:!M4od~U(;wykr.=KVYȆqnEAwFEU\!̎+t~yqwTێFH6{KHEV#o1#J:ӓ"vg@@ا* L[yídIQs8WMr<_֟I|ݘdqM:$ɻ8 {&  ? =*ƀkC%X6+7:Q;5dEL0uGt܅_=]ŬE;eI?/Vmg.׮vu5`Sا* 2ʯ)r 'Ƿ3#{OBdz5Kz{-z㔣zoRn7]H"m\sxg[@&=%p>hJj7!BS.;&TF'#ҶraQǸCߕI[n(H,t`Qٱ1-nY;A?$,,̾.kKAj9L)L7`6TߤDݥ?cML/6s*%lN4z%&H1ʘ6T+hߓUB "nbjFdž/n`}~^Cy}~ӯJb[dX:crS-0,msaN3Vϴ%O/\t?f7CwW+nRkъ U狼HF׷x-tfX"rxN[{XkX𙮮kV psu e5 1;eXV7!}H~[\|_FE>c+$N8kmPU04mjet$9 )*?˴"!DǘըܗBqN 6<0&o>x35b-U&S3?bJAECI&MǐLCAdͮjZdve67'UVwqe)ꕯD6`ɠԄhj%gBc2ؙ{Q{$-{qqVTI:f=هyy)SmD i IE̷YIq:U0ȩ9v:ZԾV&-/ϕ&&> zs|mlqV0^x|A8P`7CZG&-~]L5*vcڀvuG0p̨zmtg$eU>vx%]j<%І'Y`4x\Ey+S `ikwUy&64BAA*Wb%AY~VD##@P!X| xʄdL,c" bL*JH!4:S5%@(` sy:C?~Iq/Q}|T/4,_Du#-S %C㨙3ٚd_$PPlvvVT.oMv2)w^TwV=y{aRIRTˌU̢2LD<VAR]"b^^)h2PF\++N-ytKj;z=>p#*㵾Ys*? 4WTԕbaG##yBŹN/׹bR`@;믣B#-VD)qHJ1JKGuV6E2R H5EO|HY;AɞQy鴥;%|V*+ hGW}b(]Ґ:S7Aޫ|‡&VWp/tm@WO~ڧߩ)gðzrJ\eNg9Hv[+sR9 33{m}Tiׄ .J dn(ffF˾Wlv)S=VZjS-]UtڞKk]ĥdd Ymj0 @xfָm^QF J\n1-u$E"#Gfi!eZ{DZJ*0P1a"(SéTn2ITͫ ME @ZUztB#ȺJk3"BB!)h7`R)B Uj_EZqJWTYi &|g&)DT w<\}<{o\efoBF:CDB8ڧVSQD%\s5LDnRUP.&rAh(6L`imR^ JGOW[<-ҶIb8}Nzd֣fgg%q￷/~x?9jFFVg:"d "edbjJBZc{pcb $&2:l3+Jqw"n;d=S [{p;Ŭhx\ )M<#"ǞxA1߁#}ťzïKL?\:vY}=oEᘔweTM|txCK?sEk7`ڐI4؋;y+Wz9{RTLF0QqUVHIAٻG*}hZD"Mέ Bq-dF0Z MPk]*,)eI(%3Ra-<;AMz|dT֫}z%ʩ~pŊct=9GD $R Xy©m-rgO@GXeb9Sow/='lU5g4LN;&IatpK9"V8cڲwc!&wqd濽/0XN[rׇഘ@A} qx"ܦG'?QgzwߐаЃnF${?#1zxNID9x|n_>?F?B4{C7 CUBv_OE pr8ƜIG#/L 1ѡ6EMy~̙;)-Q.9j3kI휳={C ٗ}_yg]yyuBra(!bUV6¥f2đD̉*>7.SڬIo2ҹqzazfڑb.wbȆvnys-NBBW+vY1 (\[٬'bR~fl'w<\]Y\;Q;}c%}JV]Ɲb@T=eF?ln](l4\:m|mB iֳ13 )Q~P̦> &gg /U@ |]P\R'*"xQ%KA'ĻFy!Ait0*)КaL69o(+[*eMy-Mvx2vDAE Xƫ'ᵃ?Oe@ I!& =_XPErdļE+#Ⲝw7 ߯G+~2ZfHa|#duཎCMöm+ =d3͉npUNn }MwKi,R7K72E>U&.(7(À 漌m,%Kgu#'>j-zfl4]Iו˚cLL(t";SGH|i-66ܠL!h9;"ۡv:s͉Xm׮id]*P Ewfs7" vӯ8'*MkN$?v2 Z[yrş,1 *O^4$Gg=κ # =.ƀkC%X6𢆂EMG]8H 弻ypxf[DȦDKw ^d}@ N_nV0 -49"171ɈQ=mi QRZX!~ﮌLXo~(gm Qm@Ni:r?( TtfvNe )FXf pa79+&TƀT^vq9B 2N,b̩t"qڠWͶ+6(犷봵w f},;eO(UiROsך}"ӹvVgz^ E'|* cc4ujVZ;H]P[Sn6nd8̭GU7< z*H{wFF]wk%fBqN 6y=;d*T`GO"| |$O&MǐLCAdͮZo jfr G5*;X"ŋgwn8SҲ'YURaދ'9Df $.5{=Ώ<$*徏OoԔ /O@&!ë'Oޱ?~z B[ۧGU{r&n,f2hh+^L`ڍ2+N#%& }?.M& H1Tm@YNd8dfT@=13p" X7\Z+(6>3-["LAxCKΒ2OLX%q̙lMHrI(;MI{8{cK;}<4z) *[ /ebƫގY&{ zNRX2Iq" jZtU'044/*ӪC8֞xQs]0Շ}z2/g~qN'9_N3 5P1a"l @?#//DUirM-N+MViBVD  2= 鑹~n ݡ2/@6qYS.#D:yTi$U52 YÔID8RQTYej~IEP~ѝ7Oo޵ۏ6XGSۤ/03fndd5z+Ay/cj諒짚(ÇԼ4'|3[P_t?ºav=&4ճ"kQEEEttj}c#UNVu(Ѭgjl$$Pkړ[Ev]Ҽ`g0 tV~0(Gf=Svg=@":j2Pbc, '6՗bU9bLP[ꕱi}UJW⢄&vhδ*7qbEM5"-ҲIBPuj&Ϭ%6F4mP9Xň}w=% \cٻnz[\h IDAT /ghC- ue2PӤWK7y?kDB՞nt+ˈ}9"n:5sn74%Ў|Sdb:eFn K}s0TR`cIq3nEf\<*9@-G2RCbZu/4gOJh:*ν ^@{b݇@$b)g*f]e\@: 0 PM&5^̟j:e `Ċe~r3.o:uqdqn*EኞyX?AG^6{-G" nȢWO>|s B7ǾcA0 ;{ ;;/]{(@EkpDB՞+&W{}kW_[ 88888MS[$1&ƥ_y{90vUuD:)8ކ?imn8 3UGn CAȐ D5E;e ?%Qa\%vٞ=xi>/ghw.fl;:͞P:aj8c@ -4mA/ʴǴ@hTQ. %D̺ ]W7ЗRzm3H@A"D[ٜ"tj/΍à 0;B0#"/"U0>gN$IiO(./4+{eMy͊IAd :R}ٔǟ@<{;lгW5w'KRҞ^2eJ{Q>6-0)p.i]H A |]P\R'*"x^)ȋAŻư P51wv@Y ZIʴ/1*݌+ /l3K _]JYyվ]{ײѴ[{|oI{x/cˑ ƬBb=}_I֪+;f>z$>σ ꩙cuǒIX7QDZW_")Hk#<_&S~L.N8kiCsvvhfWYR޾4\x#(z~Y')|Nd,7=X;aq< bnxb^r,S(Vz"fjv@^ت27$ Cgu#'>j-zfl4]Iķ<՟PyLL(t";SGH|i-66ܐW7)Ѣ{iQyYMB3gՇKj8kNjvM3=$WYR(s7c.`8шsLkCMmZ zb)b?Yb@T~iHȹ ')!Ⲝw7߯J*9vTEKn~$怅;G9QxwNJkC%X6+~5G `==hTcO2{. .aP}:@fںsn$K{)0o!OI z̺)S:q1M dż+eP^<.&NzZ!NKGTFw?T_*f`vvXL,UsG&=%p>hJjկA[RMW)M`RNteR n *_Sz 01z¼TWG(+}d>V]Թ{jۿbJmm h(Je[#a`)H JNFFp& Хo:g\f_Db1ǭ sgxU5>Qg]5;^^ /\}B_YĴqb fN+/ʹ:mba®kc o_tӕEc 'А.p8?͡M߯w8m wF{w]:{`ycIu.*C5z*z:1;&s1ehPLH?gt&-Mhq=2 kS*pEDMӀLE@/(K]3X=T&uLv6"?Sڹ-k6}3ooOl3/NR P:>yr@5aoF35Rcoi'(J9OY{bAW߰ʂ57֟ͅtvO wҲ'YURaދ'9&G& &>=r*C|Xi IEYo3z77w8m2j = ;\WCޣJٻo?Zv2)vʣ#SkOX__<"?_|Lp*h+ůK_ X&Mg:n`zH{:R#w˿yOIQOH,tUQAPsW:Q"mC8 L/.((hli6Aϋ劗 2>` KgfKQHƖ녅n ()I0aHIg/]tҥw(i~9X 0P,1L,:q>iH* ļR0d-GZ&%Bቴ R59J%QQou+"Xsa O]H_)c䠃U%DRYjٿ4k2P\w&h8bBeiK'[w*+N-ytK*xK4sU㫿H*B|Guaգ|Kj`kr徸tib%^uA@A9僛1ֺR*"d: DITRMͥ;{$uwZ"'l"Ut/mi=B>@ńL% 2~UUx&]S*Д" j=:z@츮)'vB{# L*E4Ud'q)-$EZqrVENf>zRQTY &(3jyٻ~*3{72W_D S*YLE߷&(}L!b-颢DT .nki_x 6P{]oQJ~/ҫjճTeBW%!T-CSSf=z?b1YezC<(gx+*6N`duUNVYz>TO+`5톎r-%RU }Mo FzZ ֣L}C6 )m5@.ihCIIsd(nKN>deNJBi˫(5}ԴɯO> z Pޏ+0ad 3~8 1V,a N6³]uJ n##Ǹ^LɯwoF=~w+:cciAA@|w/ⱊz/BH(ưG&I/-V5WIhHMӉv6(Cn۝ &=r1U@.)eI(%thy([eĴM#}ť?VZ2uQA8iq9Ҝ=)a*&]8*+tȱZ]Suo9Hss{#Pzju%`ЧR(x JK~_w ־#9锍3+7X]͸|%[Kn>5cNW4%Nj7xB碻Xfs˩E"Ȳ=]WL֦XYFt+ia5.} L~CtQ\ c1]s_ +H?|s BUs.L/;գA_UhNցyQ<}nCU}'i!q{stZy_]:鵡i}υr3"Ezf;髩鷴wo9|9]Is5ܦ0>"(x ð4P0,i}grs>-aR~ھNmАCQx6T'( @٬c7n Jv9$9LP1sg.Z?^fP  <z䎹P vِ@4t>Wl =kG vfX{V)#tj7ڑn񛬧鷴&8sBC/ۤ"3d?1Dόz'h^tO1u4dCo浶F Hؕ@:ގ' [EG(go:P :lR?Q(1g:iϹ4!}mZ`R>pAEOT}T³A^':3[^jc2e?xVinr![73614*2镸.S4e>z$ǵGLuҚ7uDZW_" t_}8]\mA|]~Փ4;@ʿ׆L:=*6Qt,p[2Dَc<2]eߛ uX_@ro7xmLdļE+#Ⲝw7 H:cx7(qDvw]p8 f]ВV3hRHK9 ]WF*/9~; &g>Q1Fd:L7og},DO?_ۭp2N6ݵ/0.6Ue%ɺes^`}lu`tf[Zׅ Zml4iSz~Ki,.dP5'bMrZ zgt܅썔qYλ @I wr0˕׆ _KH=hm$W AqˁW wێF9~65z & KԜF6@j34qS3o*BL_}J%El*r~j` 'Z a$f:v Lvԩ AQo],YzĊjGjѻw>95 {ÕrZ8_eƚٖ9{{ N4cL++..kQ1(MEqh%kNO]=ۊW#PhDIiaIOfI"gΟ ڷҥZکb1lzPm@Nizq?( HsozZsyiЄ.EwoVߞFji3z.Z/"X3ԮPG/{+^zFbw8lv3Zznө7(犷봵w fzsbvCNE%QOrdKLd`ekۭO@[>ߊ4?:cD&vT|<|\O~s'T!+T԰„47?2(YMLzx.!"*Vì^Kv)ekbfϝ}\p>]ou?K 7gq̫,6IVTIykٿzw+`+SgH|}+?XVcL<_|\ Ii8MvbD\>Ff>|XoÛr,'^.'>HU1o"zc˙r *97"O.nHWj|).~ZcՃI_&a-iRW(̇O7-ػm~CVilٵO\eN.q$J $i=ʢO~ }dzS*4U$Ҷj#i,*B|EuaգǚqN. Uw 0L*DڊhZ;ujYU[_攉sAkZ8.,I6xVAR]"_啂&zl"}px1P-GZ.D8$e[7YOϥiM\twUrӰʤ~}~A>h봺j={Ũ5G+88]IuիL{0tC1)&PUiѸ;+1X$;Dr1F%Ib~zx0̞u[U5),9grjjaQPuyBUS}rg&IjJCPb<533ZbD4L$@I 8Z=sjӉ5Gb9Ũf;Y*:JPQįfIEF+h-GZg  @?#MƓ6險7*UUߢػ~*3{cD S*YLE}n3`#ֆ]W>T>QqϟE5I̾c UP< d`P}+)IM/0<{{XR>c^|..ƝMvNHͪr1&9XhjrT6 &61geS;Q+Mw\m"B?^Wދ[Olk6J{f0/汊Cz 2DD@Zi[w$B1> MհPS]MuOQddjjjjbIAYN3Iv ٿK{9#i  $=|(VrĐL]Å"^vW%}+&HLZg١"Զxl9~mer8UuБesYQʎutϾyje>{K=y MCm߷`ȒMC+ K% n;U' o=#w߶vu,iq=Ҝ=)a*&j8OV莺¿X?ڙYWYa;wom=M/I)7g#Vo..pfLj7xB碻*\t]1sEo`c70n#+ x>FKs_  e>?<(ϖkR) IDATvo88888;A<-B}j{]?$4 Miͳ= /bi-3u_-G)'55~[5$I.CPR?IUN"2G:Ip_kAi5k52t:%﷎R @4`kEMR^s9Bb6tNFj8?7ꏻn 1gu"3;xdح'A!64Tp|]N$f_:!"<7,¢Oϯ9s' gU_TBd2ҙYWY өz~Kij;>a6 Oxps;j:Y N xV-T1t>?ARaԎ"‡z]h܂̤* ic<CZ NUj7x󤉖$TxUB !(wu^nl7 I[F6{>ąanU.܇[1ɒqDDôyZS&Ixϯ ]E9ѷ>#WQ8ίډz&Z][~9B.uTJPs8KUp G(Te de2l kT='2^!E"[=/ ()-jh)Hwd@Ұó5{we<՚Q3idԟT!KAj٥&-FLS9,ۺWxQ#ڜR$Y5O +ޮW,ȓt ]yI7/S^폫=ǭ_'6I1̬UBzՇb0_7qZL*2)OΛgn04EDU=$CBCCC0%: _TL>fh1HAEim]Ͽl8պ2* [ _r`ީMǞq9.\JN},J{sϓ,>U$ƾ/*[ML|zT;t["0f'qttu= ,4䥠zP8ί>kGlˋ@\|kT ',Y뷙ŋw(w}-S~DI{floN_V=fMDol9Wk⃉rܦ(@̾}eʠemj+ůK|—Z[}{`8k9\V\S$T 0Պ~FVgC:~ҫAlX^?hL5BQQ,"/}mo?vQʾ]켙;;Ͱ,9F-VcXQ@{, Y$0 mL qgm8;wLsAZY⨠ ۻYO<XS#/(qj[.3fr #5gOcHw ʳ`0?aEǗkaS͎0rB/KשK bih.= AGؓd};p&ZZ.NY!S[1F4 ]6P{ep5@IgӼ̇W$E~+G<k 4HzzrAEZ1_ܔ"pScxjB^f xNߩ<%‡'ESx>M;!!@씊.DSKTu +A~vJ/Ѹwbćv%)LOԷTǛ<^ )=~*$b>wdكcRM۷3;0=Sb8,'a=G=F*͙пͅ M; ԅlP];{PP{2`ȧ5ׅ2m&]dgGC Sf?/II[I6f yiý'UqOS]fYj_sk2kUEHƊKNs8QwcS%W֯pDU~|dɷ"Cm;g{)M??GI7(m@Jg'LЦmvtc}wؠˆ#7ϛ90|IH< UېS JeoWn,>/檢7O*G~Kߕ~~ߺ>ϵA;O8qⰯ+UQAw5<81zmcP|=WL>7v~xYw0a6v{'& ҧ#O=UCp9+z!Ks2K?7[Qq`ӆ.y[ ìm*7D٫?'}&$&LЀńz%b|lmrdl3O-*U L롛7 |7 ˬXݜ aG}%!Vz V?8Vj_cy4LߖG3HglC8'}Aw/ 8lpĽ(H47U~dZ ώz 8߷/zqۻ^LЭ i"B}6ATScx#S&8"e9EeWiۢvF{󅤗!+L%KX Ooncۈy~ũ~?²=+^m"ig[s`S1-.]v^\?<_ 8Q~Ʒ(XUh>` C]LfC~ 2|'n5{X^-.CYTJU2@(&V "il"TױO/R`Y]8s???n_eάZmo9gnKvߚ=!!/e$u%Sl&hX;iSOYhHHMߔ6Q+^ߨv vaZ{Fm虜`0F>> ?{$_h+-NOJ'äY+S͐^^?z*żc%#dL;0Ϟ6mГgߔogY{w͹rˇ.dXņ#|Ϩ S 'm|ϡ\Ѽqϣbc_;ta--Cm֣[&'!!!A7.hˮǁ!!!ہGgHH1lɻuj֐z] ːnxHHȉu&ynKv5{CB[˜ @8,mwOp`0 ZZױgv1g5<-g~m&ʡ /S"i?m_i55/RH6: Ϯz^p8aÇM9HN>|ܯ䋣6L>|ޖ/|z1 Nd*1zmFt(9| #BE#meCM)+ 3yegJ}xe{FO kL;H3C>!ɷفjCiȠӒ2啂ʣqw CB2=qߚrp_C>[:ױw/Әs~jA%@W }aԹvd|41VP[.+* qX\wәCTw"Q.Ǔ$ D1_6=Y K+f cnpg=,^ˑ!5ybj4I8پyKZ-Jy4 Yރ͋~mcY3ؑSV ory򹓆woQ_c&+`43ij]4fg%gϑw@6&%O\fV&?x y}ව|S3ͽ5 {WV&KyʟT{pTtQܮ@VTn`IIo,˲&o(2xz:DIi_ sɠC3aG9=ơ}<]jm|! 9%?4na^{GQ?!SߺI7ټlv\YIFX^ۅHӋյ3D!S++50@L*69K oCkJ\>=M>N׬,cgھ0\;a>=lx啬S`ÖK2 jL3٭k<+ lLB(|xR mwlvJ }\ SdT3vŹEsۣG'gJH\%7'دm>}a7R߯<%‡'E@|B.fkP m1c<>˃ky4a~=[4vrv;I^bymEEϏ}3K ն]څ9b(KqN掝njiRNV[I!?lnf1oሊTSpi먑̭[¨kmLY$ۢ@Oݏ}`;xt_ K65_s[f}&_/Ro&y~JWͯ%)ۡ^yaw$>E־kqZ+LkЀ6ŝԵ=LۀX/.~ }1==ɑU3ۏ1Z޵"Y!Rޤi6# 'n-)]W[%g)~D./-ҋ ߘK$/5G @F # 0,G?I(+:;M[U18lx"}\VN q111qR*#.&&ET>_z%T޽ sZu>M݀Ui0nԯWwP͔F3=I65Qƃ箽Z׍}Ֆ68=B`0̧?*U/}y_ =f h a6BA^hz3mZ+{p'?8Q;ЛŎ, z(DE-ly͒W":XN~Pt+EHt"6>$R}q;ɇC y°"PIN\H,Y IDATF6!䤓Gp| z;!^Q&ל'M:.:)BQg63OĔ"T8%e?l$!Bڧڱ ~K$7j4yN\ !$ٯNu0Pi QUrr,72d*ZV,8kɩW2PiؕܲF !]Ir.Bv!Tpg# ȩZeB^yK\)Gb'1v$LzN--ZZX聈/FN8|߾`ۊU}AʇE"0> sI-~W*Z}즞 shSݤ'9^?4aXMk34豹 gvnqA};W3zz7HP2nj6d5ڴSS!9xI",翊͗_1K Ys%Ns.T+ :N?tsWw=:e}26сE/d*@XI-]ˋގpo`0n-BoVڕeܨwJڊ b"5r !Xsè 6!D%W>q/llܿVA%Xk.ݽw޽6u֧.ElT`4r~Q;M@5jj=B(yS[x-CllܘJMEQ6`A0\{XBFU+3,M9,Sk'K"BoqVbSkuSrOc>f*m5 !dk&A:w#$6؄PVjaK/Q;zYL0X6:|ՕpMF SQ;seP`Ҭq|NMcŠ|Pd?|n-7mղ1u1KV\D1Sk¬$-HLӖ:СCsV].4r'Oط({u Ҙ7=u-, ]|#D┰_P ?8('ک 2A;sFH8;9.uM@.C|"'vԡ:OWv!BQK EQglM+fT2fAR$(`qkU^KL"8_u啉ʥZ:ZxԎ`4uP fz5,u⣂}-AO*qu0DtshWBlϕ-pma=k'C`f-GpM5Emke Zo"bA2DEݝӲ/>ͷj;JrJg#ɣ[/],վ7cw$yui/~s" 9{k6 ϫHFi], |ՔcȰ`0vq,i^G8BN\mӵ@ٛׯ_~;KJ_I6n3TnnEeVuqU Y54$݁%K%e4z$HF(ɩRYI|| 4ج.++(Ƭe  :kK.}>+)K `خ#`Yv!;AYDК> ,+v}qU+͍z[`RK<)?}#QR8lIvp6m|ZLRkϟ`֐+*29kWO*AjY({2S W(b rc*.V *<sMuk\xOPŎKbe!De'Yݒ[^3>0,G]@!*+E!Tvd /\J!PX#fIȣ:}|e2ƬXkG \P;B+GݱXoS<~_%y4ϑ ؒB! #l\E. Lאޫ=MSE3#|[b~߸bLa4˅w%ERn8GQ{|.S_H)(Ih_}TNyմ䥣L ΋QE_ՌQ~]{P~շ_SNVÅ)z[ŵ3,'8Hp6]*˰pWJ/=;?h Ҡ[!(⺭C#|g09BI[<.0`=k=lħ19=;᱇yu?Նski͊_Գ[uɼڧB cڟRs0MZ6GS36sw{#<Bk^ Hi^LXY) h$OHgͦ)Gf_ɖ`T؈z1&%h߅ mGlZҥ_Tir="CD67m\ҡŷV#n+RƝ6Of.X#۸:v{Nʕw;yR*kAP}.;pY f/.H?*`plahA&K?>M&$fL7/eu>0ҔN?Ak`Md%VT8i]2d7Zw5%1)b|$\ݾG3{RU{L6!LytzϾmޙ% O>|5ڭ}-<×~Q LL6 lUNF=rd n"W?0\V ffq5޿e3*=~[z'{qJ@F[2Z}&i(~s+hW m1lʘMزv=ʖO{y`OBZ*?%&TL jl˒&>/_2^sZlrvˑz0K4,*=uqy|k}|/:5UO x^֢ݻ b+jHGw ,FGJÕ咄]fo8ך0%]]޲N%wmK&6N=|ܥINLlfD'ZJ8FIM;xIۉ?\<\lcymda0L=,_m9~b93ˢ6WHH@\F/mwasWqXgsIw_[(36ՖI4}gz0rr3v>ا{鑥_Îy=Ѹ\ep@ٳf""w$[%][^B}.}TbߺQ?~t8{!ӑ cM;ja&YMp>SY?jb)zSzU|"i! w>ӗEL_av Ic{6ޖ&8滌Q\6 n<"TR6Mʙ!8ܝrJN!SuzMz4=:zIRfreQ;"$ AKOQ.Zhvuz;1̄ǯ&m:ЛyCaiٙnLѣkO ޼Nd%{bH^;G]KaGز@|9 scHr߼NH+Ky.96Ref&4'u(%xpѫEZ}Jvng tuiFS4>!O2:Ѕ5ZZxޝ܍P[wxyiȒ.IKsAX=6۴4aE+u!GX3}R;VNSfd, Oa:ϛ]r]ce)*#I=5g)%FC$e}Eg>CQDڄIb{&mĢ#4,|]j~W`XQ|3*L(d6e,U]MdIg\ ,.@445Ǚr3-ʉȬ#O͓? -L'm P QZ.ZqKEVUcbџ>0D7dySǗQw!Wʽ {cj \v$O{, Y܆bX$EH*SIMCu([{# G J}_OٷŹwSMlջvn:r9QၹSl(v;4,_^r/F|kU<_͖i* ^>Q/vW\!U7mSh-+w=gAcŽ]3(WN>\Sͫ{^M_{n?6TQ&tXKKK1edT.kR3>C _L0*+)_4М6,6p{ݚ_ V_˒ WAIM{\k繎`uҊ%m\e+j]r1@G[W%eҀkE)D\K3uhOgޗI_k.^ /𝃹w֦r|t>&Ԑ05VՌ,/e HEV\~Z0F<->fCQMөx\T$֥7LRY]gJ7md BAbz%锾1]ݰenW$в4§G23kvߏHD@˜+E+:Yb}{KXHӋ5xLL2t;ڏ$?9uqϾSq-e54D @J?h*K/i؄ï$//^Z)-Lqi;~^*QN;a5 9iSel#{3&rF]r1M:Li{hkxLYҋI}?qTϮ \D:-$3w[rÀiZ$d5mg9?bCREpL-Yø#{pqjk쉍D&hӗ gv7¾q/^J5MaӿssыGNWrG1f{ΝF#HJH\S* z]ő&/|+uLI6r՗kOKday̘&a4Oc =l$ӨY,oSLvA'l;~Xk3+[rkۘmmNJZŌ6~DɡM߹YnGe*~}VI˩7ogҼэݠ]m뛘ٵ]#.2azĤ1 96ޣ{Sh߻f" Ǎw?`mmJAu}Oj'Gtf+3IJJo"!PUX1 v `Z;+kxSt_SꠟJN F&O ZU<ןoeϮU֠աU;)Pv,vhMR 괍a3fPwGS.)~vlGY,vc}ws2 އ~AN<'I#;6sg^|Q~/)izuH:/._"(eӤiz45c87:,p9!&LЀńz%QiK~4Qffh#dh`j]N۷)OxrnP=* y2fϤS7FA3ȣR#X(E+Lی:{S36ro)IvDSݎf1ަAҗ~^LX%ŀ_JpOЀbn}?{!dE7?]6ˣqy%.l]ͥk|=U6UQ~ϴ=ur,s&W+30vTւ10-.]v^\:Uh'=xHʝ- :\!a>d1;fhgx͙ IDATwu+ m߅se^F_;]:CZ7@m<_TӪP^.Zh(p콧v%%j`jad?\AKOK=e_Y^ʫrдY~yQ(%|XÖ? zUX&`zׇ͞{eӢ mse&, ͖U&oG#ՖIwo_L͑Z#!/اYL )n4uF̝UaWNiubo37*RY|iKy$L&40s~oJ"w-ZΓVgU@eW[QP:uQ)W/YymˣV&Qs{sӐ>a6ʢ/%?t{s.6ƋQqnhsKr3fے 2zo ΞtE>RH6#:]>yRUR׮q""Sw+.Ir,[_I'M{עKPOB/'& H&N_Eo#m;gCE}5];cugr(ON}~*unξ(D@r 4_diɁzJAۈPCB:U5U\~֝gpq/iTSlکW S62lҧ=πI~*U*S(*B?5ϐgYѫDOXD;G˃myfk0xZ҂oNrZ Bdb1t)׉ق7w/^YtfPXtZv['uHpoU< m Sܨ69~1+}V) ]Eתuu4-ű)bw{dhiv(!h/k7p\/Oh̗.a-?y?a77edxpTOI!iN]5S5mZ8dzN ?;3!bYy>!O2:Ѕ5ZZxޝ܍P]mA䥵G"+ΐ4?';G`X]}6&L㓴t@s徹.$SWܯ4S#}R;VNSfd, Oa:ϛ]r]ce)-Z~$ ?(~ô5҇yP\4Wv$ywO=6b‘ Rs? TFگ8N~JnDdr%߼jM_FFGܹ*Se`1jOc0MGV+!c!>A|v6^<#OaOӬm/eU9?N@Yl 폥8@Y}!wKu$V|V^$ˀU z+*v̎+j^VNz(|*f&2[2^ @'”|Ɛ * Tį^h-;藼v))}}V^kvn:r9QၹSmcXy!|! 9%?4na^!+J)ɂTpkK[^΅KƑHP2}ҰՀvǫBňvj2@E'3!JNU+~hgUF?Jвrwsv-:uλ+IT}R%/Կ-TQd #i4{w\!%c"0U'-( ȯ!Wnץ@rtP^X^ZRn1*=7MTJ뿌]jvr/r`c㿤K_?xM05VՌ,/eJ[ dqXdUQ>a"++("p >X;8[qIGvlԨר^Uu5M2Alݎx8XXط8ū\0}wrsqn5z{JEEr?nG~jsi Y%R$.H)I3a^Y:mb_g_txOMZtF)Oe 8<]2~L d5eEd7;npGW&fv:j&PsJZN=y}g>nU•$ԲrEm@s᚞"7 ɋ{txW/Ѥ/I:vgYA"{xǍKJooZL WZsEt`NmS.!Vʿ)SG,~bڲcG]'<>Hkj@JpgFө&QˋR#Nt0C#&H;)veK-/b#QqÀMX>y߇@Ruǹ14D\ob/8ԺUɺ=؏\-[ю DolË R~@PӼCkEϬ߭3kQ I+[Yiȡ$_9  +w5&n퍒G {U_=*:ȔiclцGWH3j.|{iۮS_+͸~51qA̍'2ӆ }Ch7ݳm sҎ_*_ ̈-{~_2o=ƿ_`~h0*$ vz衣_*_D_ս/Ձ*`0?6{vr]<_?$jr>[zuݭwH&II)M#$:j+`0 Fu(UQ U8`0/iu}wqMYpD ޲xa= zk`+V[,Zx`-vbUʥ"V\kU}RQA9B@dtv3yоMHH8}^f!;X0oӶz|'[޾qBU4ΣUk-|B=7/>BwOctǘy e9Ң;9tcŪV{fM9%Q|`J ؎|5߽ !O\k|qFII#|&XeW]FxzذU/FӴl)_`B(wjlMO3uhT74G!Пp6=,*jmM&,F.]9Р 5#&7=ʹq="ߐџlEk;>&ߢ FG{Ι":~ckO/G 7_nMX6|5=rVD]io|BXڡ{f.SOxXr&w$&R(d%)7y,>aoQխbREEƳJqӗefԑiX{[wY4iM/N?y;rDB?&LK Nlk,{Z^˧,WRXnG$ `YLlYMZӗU3؛ҳHTAL!(HR!SÀmoiњoBP|0x Ԑ ^QeiαO23SoL+ihMUTdY茏BeJ{ Ÿh5/e@-FT7%'՚nkgihMOJr>#BnMӍ-ml,oV}o.j`JKT7 rʮCL M⦕YQSz- }:+>*ڙS#Bjigv922lfё~M^4}s|x$Jy54K1ugIׄK5hlMOEӚ6N:hmMҒ,IC-97j!z4? ߾耬~ۧʊO; R#4 Yqt۱/5l;VO޿I5vɒZ?nMO9!|hck1;Zkr/> PdJ8B!tq).cBw@FG0q{F7yq=ۦ B^!O9N_a4허}4B!B!B!o$ B?½k\hVОܠՑ  ;omϳ9U O#BԷ{ClMzYCgg: 8{ߢǿ:R? ['"gK& (8.ZHwoTכ07nyB:gجs&&$zWQOظ"`yI2!i\u)OA߼pLg㇡KGdž< ^*䅞(e~ELTKʳ2~OF5\ZC{ׂ&̈ްRe KYjer ؎S 7P/ޕĕGd*y |r.Ь< %'}%_wiBx:x)Wݯ*Γ"o@iq*7i8O=V6 !7IL Fo6˩<>O>+:WF AdLMjh] 3~~T[&E|Uo;0 Tz` Nk2ܺ2'ǜgͧܲR/htꫪJK;?"n~ N<(@v rF|<% }r$n z+$ _jFw0켖 ,Yu@ڈsY ;㺑 @ T4_2m=uш9rծA32xGi֑2O^+DY)@ݑRjGڞ/,Ȋ2  b\7YnڵFi'o %0E ]׃aoQE_{YC븘1n^}?iσn)fPMWxßo$?OJCMOEJywyTQU*pmBu bߪBTU^Nַo *a\σfl:/0@/oPŧYE,佛ng_( nR8Gn;/1;"oTGƽUbuiwi'ei^efGIDz8P \seٱov2wL!aWJ@Rw *Uva*e'uẗFoz̀~!1[Q1{#(#yV֕֕BAn|vߋIiRPg|a _H959"cMj~/Pc$WRD~Qsw4%SMV%0i赚Z(SFX| .,'|<O#ǰ dŽ"ӞLIR%).Hekis>y,;+µBah͜moΤ{89E:3ExO3ʞױx\p#g&^7uqrvEnwtȴh6S7G$9ɕ]W~Z!̇?*UqzN6ˍŗ]w[=Db7o,8`GF =TR.3r^#),#Q@Ǧy/z@gvK[w fѴ&;a5y?; 8d$Cn;&#Tb=P{ 2|DHo̖*w \o6'9+ l4HSVϘ?ӊMyeνc[u/+H 4^>rASRb؍S\u}ߦGm,sBh6.>B;?(dsBn\*Vym9ݖ@!n-iBK;"B!B!B!B!B!B!/K13\IENDB`glances-1.7.3/docs/images/sensors.png000066400000000000000000000106101225327237200175400ustar00rootroot00000000000000PNG  IHDRY"&JsBITOtEXtSoftwareShutterc $IDATxgXIO@z&Ai6(**kCYEe]W]eX Kՠr- 5QZP X=/p23|_Nw`0 tZ!$+9ޏUCѲ1g8wl/3鶅B5d"$2R+q]]y&F^ "CNe1qdS~HDIČܖ"'A9Bਗ.Q߸='6tץզywvjZ$;vF BHzs A"DgDI{84?ːҲ"J -&u3L5Fϝ_m@eL_1B'<\KhShl6 +3B=4 ฮ~⇻dvΗҩdДPZ^v˟ȅ{/f"PşDOB:184ǔ"T{fwWXEfb:Z$CHOe0?N̆ |Y=L0=!bwQfo#4{Zq^qrQQI-H-43&v7R̼XΫ3B7n~CAZ?/6F m}"G*G$0We r»OB R34>q< Zru°]!$'ߺ@Bő0;-'G9kQzgiҸs\?5|[*PR;XnRNn04 Ɏi)Xo>a@Gn{٪{fI9B BU88M,a1I oӈ/{nN!$/3UPG*MMxc,$? :#78Vk=oR`) ZǵC`0 `0z-ad)Z& զJYNmop;RЍzϞud 1aߕkRS.3'$2vG `UO0yVy~ "vCtn9+ .nNs|}'.Ph____ߥ Iyr(w؏Vt$d <=̓7նowcpESTM}\4e((}J^-F G;>S*,|SORs(l]  ku.9x(nm48i6[lն3/;YxY}m^ycG%{ȴUL;TI1@1V!Q~V)٬ _"e_YtWEy\I*?7iy@Z)BX*"$ˀTT/QlRҥ. JoƥzՁ"aQ!TYHYg8BBnHgAJ@VϦimu5e*~Ik$HAIR\P+!(6ak^japtYw,  Z%/ Qoc-*@V_r2n:ޜ!U?,մ7hbmPt&\i ֔?:s5AQ߹<|EڄE0 8CʐZvң^oW*/A :pWM34h%#4ڀxQ.{!(t]bPz3Ogkjhl2t%&Ba$k.W~eJJAZ5=5xm%2pw2`4ӪIRNX8z)[^]k44`Sv>&KůVЦCWܹrg:!]'M7[g;[3_HkLΝll`+Na]'?.K*)~Wmzxhf٪k=jbU? X=qJX'F& z8NMS:+3޲FIdM~!^Z0։ҋ޸U/(`IxoUZdwҀlPEnRgKqi3|5Ѝ15(EitD^y|n*bd;i>StЦE-  \,D$ûiٝT&ډd{??\2˕,BzGg(_2c@~tDžue;:WT||20G; [mPbI?B l__YGrgw*eؘ ddEUdxkVNO6(kq,$)_n>!#ES+rm>*Wِ՞ XJv_Sد6T(\F]=YHZiLWH%vWr-j2jBlo@{p!z=i +e-/ 5;C؝dgQjz9s5/sZ ==JJ꤉YQ\Tsϟ<1xrstsަ J)?/^ٝ;b4q5⦟ D_w'"\*"U6#h<_mٹw/bM_?zz1R)We`a6Ӧ, .-*~LMKIX+`(vo#XP&ӵvvfU$ۯd|ݩV [G,X3qs$},$a媂63/|+uĻ\UB5\Zlb˵W+|X|?/ĖaU-ׯrqBb;j$`d!\1 `0'~?KIENDB`glances-1.7.3/docs/index.rst000066400000000000000000000011221225327237200157300ustar00rootroot00000000000000Welcome to Glances's documentation! =================================== **Glances** is a cross-platform curses-based monitoring tool written in Python. It uses the psutil library and some internal code to get information from your system. .. image:: https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png Get the code ------------ The `source `_ is available on GitHub. Contents -------- .. toctree:: :maxdepth: 2 glances-doc Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` glances-1.7.3/docs/init_script000066400000000000000000000063251225327237200163530ustar00rootroot00000000000000#! /bin/sh ### BEGIN INIT INFO # Provides: glances # Required-Start: $remote_fs $local_fs $network # Required-Stop: $remote_fs $local_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts and daemonize Glances server # Description: Starts and daemonize Glances server ### END INIT INFO # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Glances server" NAME=glances USER=$NAME DAEMON="/usr/bin/$NAME" PIDFILE="/run/$NAME/$NAME.pid" CONF="/etc/glances/glances.conf" DAEMON_ARGS="-C $CONF -s" # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # Ensure /run/glances is there, cf. Debian policy 9.4.1 # http://www.debian.org/doc/debian-policy/ch-opersys.html#s-fhs-run if [ ! -d "$(dirname $PIDFILE)" ]; then mkdir "$(dirname $PIDFILE)" chown $USER:$USER "$(dirname $PIDFILE)" chmod 755 "$(dirname $PIDFILE)" fi # # Function that starts the daemon/service # do_start() { log_daemon_msg "Starting $DESC" "$NAME " # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started [ -e $PIDFILE ] && PID=$(cat "$PIDFILE") if ( [ -e $PIDFILE ] && ps -p $PID 1>&2 > /dev/null ) then log_action_end_msg 1 "already running, PID's $PID" exit 0 elif ( [ -w $PIDFILE ] ) then log_warning_msg "PID file found while ${NAME} is not running, removing file." rm $PIDFILE fi if [ "$RUN" != "true" ]; then log_action_msg "Not starting glances: disabled by /etc/default/$NAME". exit 0 fi start-stop-daemon --start --chuid $USER --pidfile=$PIDFILE --quiet -m -b --exec $DAEMON -- $DAEMON_ARGS || return 2 [ -e "$PIDFILE" ] && chown $USER $PIDFILE return 0 } # # Function that stops the daemon/service # do_stop() { log_daemon_msg "Stopping $DESC" "$NAME " if [ ! -w $PIDFILE ] then log_warning_msg "PID file not found" return 4 fi start-stop-daemon --stop --oknodo --chuid $USER --pidfile=$PID --user=$USER --pidfile="$PIDFILE" --retry=30 || return 1 /bin/rm -f $PIDFILE return 0 } case "$1" in start) do_start case "$?" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac ;; stop) do_stop case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; esac ;; status) status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" ;; restart|force-reload) do_stop case "$?" in 0) log_end_msg 0 do_start case "$?" in 0) log_end_msg 0 ;; *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: invoke-rc.d $NAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esacglances-1.7.3/docs/style.css000066400000000000000000000026451225327237200157540ustar00rootroot00000000000000/* :Author: Alessio Sergi :Contact: al3hex at gmail dot com Stylesheet for use with Docutils. This file is the CSS for the Glances documentation. */ body { margin-top: 1em; margin-left: 1em; max-width: 80em; font-family: serif; font-size: 16px; } h1 { font-size: 20px; } h1.title { font-size: 22px; } h2, h3, p.topic-title { font-size: 18px; } .first { /* override p.topic-title margin styles */ margin-top: 0 ! important; } a { color: #0055df; text-decoration: none; } a:hover { color: #339999; text-decoration: underline; } a:visited { color: #800080; } a.toc-backref { text-decoration: none; color: black; } blockquote { padding-left: 1ex; border-left: 1px solid #008000; max-width: 30em; } p.topic-title { font-weight: bold; } pre.code { margin-left: 2em; margin-right: 2em; } .console { background-color: #eeeeee; border: 1px solid #cccccc; max-width: 60em; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px 3px 3px 3px; } span.option, tt.docutils { white-space: nowrap; border: 1px dotted #008000; padding: 1px; background-color: #eeeeee; } .literal, .literal-block, .option, .var { font-family: monospace; font-size: 10pt; } dl.docutils { margin-left: 2em; } dl.docutils dd { margin-bottom: 0.5em; } ol.simple { margin-left: 0.5em; } table.docutils { margin-left: 2em; } td.option-group { padding-right: 1em; } glances-1.7.3/glances/000077500000000000000000000000001225327237200145575ustar00rootroot00000000000000glances-1.7.3/glances/__init__.py000066400000000000000000000000001225327237200166560ustar00rootroot00000000000000glances-1.7.3/glances/data/000077500000000000000000000000001225327237200154705ustar00rootroot00000000000000glances-1.7.3/glances/data/css/000077500000000000000000000000001225327237200162605ustar00rootroot00000000000000glances-1.7.3/glances/data/css/default.css000066400000000000000000000065061225327237200204250ustar00rootroot00000000000000/* Reset the sheet */ * { margin: 0; padding: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } [hidden] { display: none; } /* Colors table * bg: background color * fg: foreground color */ .bgmain { background: transparent; } .fgmain { color: #FFFFFF; } .bghost { background: transparent; } .fghost { color: #E3D7BF; font-size: 50px; text-shadow: 1px 1px 1px #e88860, 2px 2px 1px #e88860, 3px 3px 1px #e88860, 3px 3px 1px #0c0d0d, 4px 4px 3px #0c0d0d;} .bgsystem { background: transparent; } .fgsystem { color: #E88860; text-shadow: 1px 1px 1px #000; } .bgcpu { background: transparent; } .fgcpu { color: #3C8AAD; } .bgload { background: transparent; } .fgload { color: #3C8AAD; } .bgmem { background: transparent; } .fgmem { color: #3C8AAD; } .bgnet { background: transparent; } .fgnet { color: #3C8AAD; } .bgdiskio { background: transparent; } .fgdiskio { color: #3C8AAD; } .bgfs { background: transparent; } .fgfs { color: #3C8AAD; } .bgproc { background: transparent; } .fgproc { color: #3C8AAD; } .bgcdefault { background: transparent; } .fgcdefault { color: #FFFFFF; } .bgcok { background: #60AC39; } .fgcok { color: #FFFFFF; } .bgccareful { background: #6039AC; } .fgccareful { color: #FFFFFF; } .bgcwarning { background: #FFAA00; } .fgcwarning { color: #FFFFFF; } .bgcritical { background: #D92626; } .fgcritical { color: #FFFFFF; } /* Main */ html { background-image: url('../img/bg.png'); font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } html, button, input, select, textarea { font-family: sans-serif; } body { margin: 0; font-size: 1em; line-height: 1.4; } ::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; } ::selection { background: #fe57a1; color: #fff; text-shadow: none; } /* Tables */ table{ font-family: 'Trebuchet MS', sans-serif; font-size: 14px; font-weight: bold; font-style: normal; border-collapse: separate; } thead th{ padding:5px; border:1px solid #3C8AAD; -webkit-border-top-left-radius:5px; -webkit-border-top-right-radius:5px; -moz-border-radius:5px 5px 0px 0px; border-top-left-radius:5px; border-top-right-radius:5px; } thead th:empty{ background:transparent; border:none; } tfoot td{ font-size:16px; text-align:center; padding:10px 0px; } tfoot th{ } tbody td{ width:80px; padding:5px; text-align:center; border:1px solid #3C8AAD; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } #item{ width:60px; border:none; text-align:right; color: #8cf; } #command{ width:240px; font-size:11px; text-align:left; color: #8cf; } /* Header */ header { text-align: center; margin-bottom: 25px; } /* Main */ #main { text-align: center; } #firstline, #secondline { margin: 0 auto; } #secondline { display: inline-block; vertical-align: top; margin-top: 20px; } #sideleft { width: 310px; float: left; margin-right: 25px; } #sideright { width: 550px; float: left; } #cpu, #load, #mem, #net, #diskio, #fs { display: inline-block; vertical-align: middle; } #cpu, #load { margin-right: 50px; } #diskio, #fs { margin-top: 25px; } #proclist { margin-top: 50px; } /* Footer */ footer { clear: both; margin: 20px 0px 10px 0px; text-align: center; } footer a { color: white; } glances-1.7.3/glances/data/html/000077500000000000000000000000001225327237200164345ustar00rootroot00000000000000glances-1.7.3/glances/data/html/base.html000066400000000000000000000024161225327237200202370ustar00rootroot00000000000000 {% block head %} {% block title %}Glances{% endblock %} {% endblock %}
{% block header %}{% endblock %}
{% block cpu %}{% endblock %}
{% block load %}{% endblock %}
{% block mem %}{% endblock %}
{% block net %}{% endblock %}
{% block diskio %}{% endblock %}
{% block fs %}{% endblock %}
{% block proccount %}{% endblock %}
{% block proclist %}{% endblock %}
{% block footer %}{% endblock %}
glances-1.7.3/glances/data/html/default.html000066400000000000000000000142611225327237200207520ustar00rootroot00000000000000{% extends "base.html" %} {% block css %}css/default.css{% endblock %} {% block header %}

Glances running on {{ host.hostname }}

{{ system.os_name }} {{ system.platform }} {{ system.os_version }}

{% endblock %} {% block cpu %} {% if cpu is defined %}
Cpu {{ (cpu.user + cpu.system + cpu.nice)|round(1) }}%
User {{ cpu.user|round(1) }}
System {{ cpu.system|round(1) }}
Nice {{ cpu.nice|round(1) }}
{% endif %} {% endblock %} {% block load %} {% if (load is defined) and (core is defined) %}
Load {{ core }}-Core
1 min {{ load.min1|round(2) }}
5 mins {{ load.min5|round(2) }}
15 mins {{ load.min15|round(2) }}
{% endif %} {% endblock %} {% block mem %} {% if (mem is defined) and (memswap is defined) %}
Mem Swap Real
Total {{ mem.total|filesizeformat(binary = true) }} {{ memswap.total|filesizeformat(binary = true) }}
Used {{ mem.used|filesizeformat(binary = true) }} {{ memswap.used|filesizeformat(binary = true) }} {{ mem.used|filesizeformat(binary = true) }}
Free {{ mem.free|filesizeformat(binary = true) }} {{ memswap.free|filesizeformat(binary = true) }} {{ mem.free|filesizeformat(binary = true) }}
{% endif %} {% endblock %} {% block net %} {% if net is defined %} {% for interface in net %} {% if interface.rx == 0 %} {% else %} {% endif %} {% if interface.tx == 0 %} {% else %} {% endif %} {% endfor %}
Net Rx ↓ Net TX ↑
{{ interface.interface_name }}0{{ (interface.rx*8)|filesizeformat(binary = true)|replace("Bytes", "bps")|replace("Byte", "bps")|replace("iB", "bps") }}0{{ (interface.tx*8)|filesizeformat(binary = true)|replace("Bytes", "bps")|replace("Byte", "bps")|replace("iB", "bps") }}
{% endif %} {% endblock %} {% block diskio %} {% if diskio is defined %} {% for disk in diskio %} {% endfor %}
Disk Write ↓ Disk Read ↑
{{ disk.disk_name }} {{ disk.write_bytes|filesizeformat(binary = true) }} {{ disk.read_bytes|filesizeformat(binary = true) }}
{% endif %} {% endblock %} {% block fs %} {% if fs is defined %} {% for mount in fs %} {% endfor %}
FS Size FS Used
{{ mount.mnt_point }} {{ mount.size|filesizeformat(binary = true) }} {{ mount.used|filesizeformat(binary = true) }}
{% endif %} {% endblock %} {% block proccount %} {% if (proccount is defined) %}
Total Running Sleep Other
Process {{ proccount.total }} {{ proccount.running }} {{ proccount.sleeping }} {{ proccount.total-proccount.running-proccount.sleeping }}
{% endif %} {% endblock %} {% block proclist %} {% if proclist is defined %} {% for proc in proclist %} {% if loop.index > 10 %} {% break %} {% endif %} {% endfor %}
CPU % Mem virt. Mem resi. Command
{{ proc.cpu_percent }} {{ proc.memory_info.vms|filesizeformat(binary = true) }} {{ proc.memory_info.rss|filesizeformat(binary = true) }} {{ proc.name|truncate(40, killwords=True) }}
{% endif %} {% endblock %} {% block footer %}
{% endblock %} glances-1.7.3/glances/data/img/000077500000000000000000000000001225327237200162445ustar00rootroot00000000000000glances-1.7.3/glances/data/img/bg.png000066400000000000000000000502171225327237200173470ustar00rootroot00000000000000PNG  IHDR]PVIDATxT݇vGziY$@1GZBeF9v?.=<<:;y۷\叫777G7ÿooo?~zz{wtqW߿puuu|{O6Eopݫ]c/.5`7soC5q<|OCu4=}욛'w_~mۧFn>6}nm>]v^%n֝ٛNj7O=v@7{汝j=};OM:ȋ7Ƿ_ӫן=zE<:::".>|hy]ܬdw3h͹E Tkcv$ HfuFnV|~ԯCZ`l7zEϯO >F/'oǗvvghܽ鿞g׏JOA}=??e;.ƻnlzvOl$v$݈:.>t0?t¨şCziM'{qz..6姣~PZr|~⵼ɵMs;O6n[ƫ52Z~U-Q:Eqg="abvP-ᷳ3j/X ٷn.q97ړxMT6-EE.=Y!stK[A4;ȶН"%O9თןl}@-zqRmj&"ց5cjgp??`/A ܶrt-Խqs vidSMdWBS .aIhmEM-F%O߬ÎқF"l۸׏Mc? ;.t#_vBӺލ"6 DF}}k·yu޸JrhN ScKs)yҽĴպm}9郆og{=Kmv\q$dtd^Z2#IN.mYdtzz6H/rӧOv4kM*6&b#92z&߆|wNMﮔG3OSiG7kzjZ4Fi|{j'Ζgӻ%ԁwMp-&rN9Z1MjT4Za-`"^N <u`6:H )4VD7frA_yYgkڍN6ï9wM[oƊhH˗/mz->FN'Qtq:>|: Ȩhkoh[-/|(I4%{@FӭIفuqג' M{[Cbq@_Ʋz,AdNuq{Pɢt"jٝr_Mc8_}vjלlk4i6mazh)pAm)R&y]>cniGt!Kz;֋EMi.6.&(>Zde4~ew$};JKŻhYu hyI0-flƭqti5t-Dd:KcU&V^?t^i=/͡6kDiP-V,OMc-[p)&-Nb4 BK-/mns&[QbH]kJktASP~%2Jް#*C?ۂkxwi5 N]lͩ`Mqv_ٵx#1NVNq$StCmI-#:!|Z#lv48@]ݬݕ=CIF a-!]Lc. y-XIE&X^O;'s]# ڋ覯 NYERfKM2q_ ZvK`tM_cgiVM^e%JI] 6Cu$/j·N`6mC;Ammj "oZ'C[ 3o~H;?!C6̷9M%2tq3+>Xv6%'m@ ojLk R2EFLCnwMޜaPdFcx-#'yS\V* ./@/!ت:TI9@[=<#7ܬOv iGyŖ O>'ϱ\B`k^hb>bF#ZBC=jP/[oǤy{pFRk9Z?FF9 L8'V&7ʊV&y S|z?me(~ 3:Z{=:aCEHF}m\*FCu/bT bP`\Mc H}TRi0&0siCv)tqѻں,KSy|NBӃ{sMIМvuo!?vOSE=NWt[Mܨ8D%mk]H06۬'i ǘfM#@rB,˨r%?M2FbtQ2dw N0iѸN_Qky&ms4:~LiNh>_'( \xsCx8G2Y$42{-?/xݲ[Rb鰍'+&ev%g:V"jDﲧ7.8%51. .G]`>HD07_b v:mTg,b㺆]ԬHަlVP:lox{bZJumX-#?orE3pB\2 &_1:֑F]s. .<@0aMB/fRmֽԡ c+|H$]]ǻ, ̊?44)]脺4!Koєx%FЍI(PFN[e3{磱`.ӼH'v~/ߤ@9V˝}$&2a: ƈŽmͻ9`==daؿ52|w2%ptdqE|CjԺ`dB_qZỎYnע?;{:tt/=j(vD‰Ԓk38^ !9*WKwԗ=kdv|7ijeXC X\ ]WGs"?[U#4TiiJl v4_]hJ8|4g 1?_cgqaGd,ӂ&F;SfB&z~٘,݆?Gˍ=.jOy@z:9=t=M . Z,ϦE뎳}hi2=7aۃݶ.E4߾iwc6t9xB[eJ|lX=!m+ D((y ]4`Ӱwج&9?3\cFɝn#ctX EYeXP|E̙h;} }N`.!H@m)GȄܲUT4M :8a`JL7Tۜ:9ʣ06Ыߋ Fb6]. ŎhrJX0!#~ީER-=BJ_XY\Wjjx3z"XXE>/i$#F  .fa.9_i[]*"-M5 y[w'VD p2 \m 4`XM_(;!Dlh"qrhȨS`-\e2+Hve~%6qo)Xo`mMbZ94L#E&;3c }b G PN-=G(xcI-#e"!{`]쨆Gy\),ܫ]j*VM͒r#Tʃ+3w3ce F [~g.K}kd0y6u1f%ozLpz =dW%4nH۳=bvt1[|QI }`m&7.ii Aqk6M;usN5rC%y`' 8 F"m[[ͷ`փ̊"\ridJz_/_ںx)CSTq~}ӼZ]v%җpm"5mOb\nČӺL~6r# n),. \K;p1aPw9~4✶*E62<-Mc->}X^tưz[ xX{kRmBȐFf5!P{PaSbA$$lr!.ǹḓNwY2QNj ~(p=Bԧ_3,v; m]kg$%L?v̴וe%J8bA:yސ|FcjDV!ֽ_}u`8@8M`A>1e/>}Hldۚoodl+zק4%@f[js$;yFK:o++u>Kj見]n </ݟ 'eQ eW&V*Nœ ՜5r$A&Y\Tt0ctY̷+&Ⱥ'7w~BLEd`A&;P'AD !aΰ_nt%^C-WqkkERɛC{x-D!"( a2Ԧ_Gyi~Ԧ738vE_m&ؠ KQ"^ǃM#zWacQ:BI/MQ+GCgdaD:T'VJXFo'h \rL3z=݂Tg9`́L[_OП(R]w9y'*`3ffRjv- &QٕZ r(t-X #l%h-aV648tR.>P&N~vW_Cf5Z;ÏvxY8A-:aϗ3yqA "~C&ɘ^壢53ɢ$`^m bq'PR=(P䦗Ո #5KH.ftP,.yU]_ćV"C l E5U(0u e]L$͞#{ $qS)W(Mjwk_e0u8[kA-8G z}؉w,;кT]ldghV$s]1O3GӶkh[kˬvC!pgOUB1pɤMXgh-@^Z Ax(Dƛ`6MEVl(Vnӻ ܽl9k.Qw7^ n_M3<ᓥm2c:l4ر%ņ[ ӽᇾlcqD϶VKк BI~%=%.J:IYZ ק9=χZ/V'z &2}DSobݛZa5'-hʣV0 ) K`tz>hrBOutQ[Et`Ը]ipFq'.#ljb) ǟuRgQ a#[{"? M-m0ddD'ĉ&0]- +2c.K`rvD _ȨhJ:d"gqqĹ.A ,q G8"vtɢDdN=O BG*ѲyPd^h{ڢVY`tK]LJᘸ=rr'\$OEpEU @ k76ru8qXcu1h]Ĕ~hFWpPhp_$1lp.#H,!$ Wðyk+p5bUq3W}}`dNJr}RbkPna>d6=y]& %Tܫ w|#hS%bKP x*9&CLCώ-E-*xtH=i@m'mh &ԀYMo8ݫsS0pWda[*@8tR8-@hTiPI aW_QO|VB~``V _wB&=FT DGĪ`&A"ѡ/I\G*S<"2@ K& ~jMo҂Լ$0Q撠Tc+ .4' 6xh*cXX_;Pܷ.'4ѩfZu2[r1zMc + cfqi' NlW\CL@RɔG+SmU- WI$Od'ql.+0T>=LCo |suPKIKl_f-t6AzzL4kX kZv(ZQ:aZwGyO &I`5*`'׊4{|0]X>hVS<"m j3Z.r|FIF E&8`VWP0<SuDcML~F}|@&QU:ml9Ȗ[^U!e9o;,B} eGͩeJ lo[+&?2.zQut2`C.4Q9{&IѮ~K -_nS-tWD"q + k0f),-æ!H]Nvg؝{B 4'JkaS%2TL'|U֌Lh )&$uM"eMNi+&"q"46HփOBv1 !hy>AkU 62jӍ=0 ""0%3:|6(BY<3)VqUոf&>yN^zں)ZӐrhJ vNRM`P!{^M@;l NAsa3P±~u`$)r'\Lްz{.[g =S!DtzEAn7ͻNvXYAQ d7eDDRt>0aS&rciGiR\!+\E4vhEhdKB4rZ<񖴎"MMR_~)aZS ̡KN=t~Bu-BWUA@Pް $_OAi"Zo&cJVBd(x!;fD!$Հ{ rwe):ږd98LM즒*m_T6@E4*d1LA2}yW| )PYoI["^8sͯќ30G;qtbm&߹KO2v.d {\!nz&U|pvTT]׈UpiRh[ʜRB/=״7QxEJ4HF$Ԭ gT-rh\رk4B@⧡;X'aX"e+`|F E&t`f|+y^ ev"%-Cl2} jD5uCn&A*1ݽ.n&N'ԽBS;G0&2߾sJp`iBᒋg@4QWa!mƂ(|ozn%=Q+bNV]>˾i4ǯ4 ql ]ܽz_C𮝢ϻx$3'1M$II*D7=32MRvԥ&1dɸ[뼒k ZRt=L66ƼH%e h `um+A= M4S ͩn:VWpoYkEoףFѡrs5<䙀L&\_O-P8[Mr;30cJqH:qY/aBis ⷟At E1ZT0oiN>WpH9o1 (9.lٚ6pRqnl#;l%6!O> BjZ$@BL>;2sUu>[nȄ7+aJK͢*~7 vڞ < } q`@ DbInZ"BwIwًHJ"vA#Y80%2Ĥa*`[<>-mEOOA @&yYQj0VԺLFmV;;$Bn('ͤK4=c%6h$ȄMܢƖq~;^\n;RSʈR`"[TC/=b3 \L,o_R F`/%SZ%5P4DS!Zn)eI ->l9@e9UʃSqĸR>p7Yc7"\g)ƤQkR vyRyl|"B2 %#@t'!2=:h<]84kG@6=Y5rD|%Uѥu\7d~Nt9 5݂F3\t?oI~yH kޭ.v~ef^4N8}l|MZj,#gR3rnZϫwBR&R>1z'2 Hzs-)x T 5zDڻ:Iݒ4O> %1r (*{%_Xz1R{Q¶zWIz1LNL/VpS@Xz׎,>ˮZG:Vxf-bRY\.s^9#IlTު=nٛv17 [ 7HA:l`WRKMW.;;._y|aMb OL0g:?].($hڜ%!BM¯?%[ C&M 9N72RfE#S9u4$'v]d$%Z¦АiS9II#k/40 NOsĸҬW _ .8 x#PK}?$.Ukޥ+Fr sշRs]. b*.($S BRL~%KYׂ1Њ(dmza.BEyqyCl¶Y8qL p_BMۂ+:9b;cDE5^qԒVchH~b5?$T@!o}O,?Vԃ2{gnv5c)z=KWfHqk\Ei-c q&t)7hzֈ.a<^$4*(y[\\Tbz$d&n8 ;L;0i46]}v TdNfô |z~3ފt\GEmmxK"EɢJKWhGk*-藓'x-P*3[R j~8}'@&EeN_ yt܁Č顭![p}Se:@0E!>6nW$8/Ɂ^ƒ2m%Q"u5cR[7GضaR[Xzmy0ݙ ,ui;E /PztPD$sՕ|`qNUU Qh:`ɅdL۳MєV :8ju~ .& \bbɚ|4mMRz<=Fi8!&r鰉S?_+X1. %KK/V"(J]=*sCAYJH q.(|3맪Z"L(js-DC[r0O#?Wv]68&Jɂoӗ+#/SAn^BP[ɯ|hJ?1V[1΃\z 08rME+W>==xLCRg%#p]ҡ Mi*F\ ))4Ox\11+'Yd%U F݁3|eqxSjkQo1㠮E,j!Hr:!bX/L'7bcc[+ExPM4aj w Ԍ.z .M B6ִ{$雼XA @^گ7k"ϐQGBcO)l N(;d~+LU&Cd1fvb Q* ĜlLJ\l*s4SX̹ Y!DC}}niKQu`v+Ŧ \P.?@]6JکXS&$ߥ}tLehdIRK9 ݍ󾿚+xnrRgCǠrOP$-2>}49<"AԽ]\InVoqPhn8l7g+)W_x>A2h$_~a*9˷GlmvT Țha"+tx9<8C8hh lމ]ބ>9<6h8:.40*;kuM ) jA2ɇ)b[NQ uOȔz AVzy`/k1BL+o:h逬J:*=9ׯ=Y^IuЕ,$[\oɾozQ{Rvvr(0QR  dd4D$Rd희l_X__zuvHD ϒu&P6HMfG:Zi0O1\ ;VV!}#=teifo >nzC)jpQ ,{)[˼L>+^*I/pv3\ Q s؝; J1Kja\cLg.k+В rk%{9XØ)`j8&!N KatK@O%i6P>BITf2 +O2zq\V]0ۗDdR8c6S·v9C(V6C  \nUs1[${pJE_N*$^ K 3A E3z0c(c֪Hkj%k!/mR"h*2nّ2MH\ۛb߹2$[쵊~*nKb9WnJOXx;Zl㫟FU@:,PNK57AO?ړѠ#T9/gLc'$˓-<̤bPŶkuE\ZRIhL<|EmQ\3G ,U4;3Hu0JJLHG=*Fڏ@*68RK+\j5}x+3 Fu\~MPȚ!9 lϑj8CDַF|rVw4iW^凯x*4ցټ3\RH\Z;$;٬|%L[0RxUٽp=ˁ";4Hy/JBN&8o#t;h2T%M ͙`Dfۼڂۀl%Yg`djBkuҎTJ8iJ]Y7gj&`-+E\-|AW; R,һ`oc67]Z5y?M,BTE[W>9Frd9>Ӈ6THSa7x˶b>kHwy@&2 Ìw4u,*=YMhKӤ6h0x*u9-g }'^hEU='-=kD'X5y0sß{T@H#"H@glR1o-^7rӪ(pPO݉AL|kz5Pc51vX qvv)[]+% u<ϵT> lﺿo*3HO,I&<$&tk)c.w% 5H'LҡR;VNNlXCnR˅&W?" Wsկ(^d0my2` "9vpF㈬ӗUIU2$4!]Yг 3K}3jatxl_D&-v ѥc㓇[EC| 0%+E@XEKٽ0ъV=vT(cits)A캶>Vh3:Z ߫a.ezHSql+S^i=`ҧ.im9c]oNFC!<1 +)2y;N[r9 ݆f'N4Q>$"ߣ E.+ ӟF3d僷WPNcD7K4^]O+;p<<'\g#ٹnOn83 `ltQ$jIHSjO~Z@k bmh Y ܄FDRDžܾYj!kTVw_ E9M_\\""2@&ҥތe~V4NZ)[[~qDblOyx<.ܛt']q(]TyD-xS}Q/jR* t6DR !7\KBi?i&i_N*CЏ) G0z@VaE.lZ<0[[ť1lPlILGE zZ{L>yw)fQ/+X]Wxkh@F0,<^+1XPن]آG p/2|F1΃tpy"42ώaNg?7J62eԁ͚!iFl)yXY%vOwK];V%Yzb2Qz0ܒZa, jJeKjS&T.2N6CN1Z'< PBWFn # # Glances is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Glances 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . __appname__ = 'glances' __version__ = "1.7.3" __author__ = "Nicolas Hennion " __licence__ = "LGPL" # Libraries #========== # Standards libs import os import sys import platform import getopt import signal import time from datetime import datetime, timedelta import re import subprocess import locale import gettext import socket # Specifics libs import json import collections # For client/server authentication from base64 import b64decode from hashlib import md5 # Somes libs depends of OS is_BSD = sys.platform.find('bsd') != -1 is_Linux = sys.platform.startswith('linux') is_Mac = sys.platform.startswith('darwin') is_Windows = sys.platform.startswith('win') try: # Python 2 from ConfigParser import RawConfigParser from ConfigParser import NoOptionError except ImportError: # Python 3 from configparser import RawConfigParser from configparser import NoOptionError try: # Python 2 from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler from SimpleXMLRPCServer import SimpleXMLRPCServer except ImportError: # Python 3 from xmlrpc.server import SimpleXMLRPCRequestHandler from xmlrpc.server import SimpleXMLRPCServer try: # Python 2 from xmlrpclib import ServerProxy, ProtocolError except ImportError: # Python 3 from xmlrpc.client import ServerProxy, ProtocolError if not is_Windows: # curses did not exist on Windows (shame on it) try: import curses import curses.panel except ImportError: print('Curses module not found. Glances cannot start.') sys.exit(1) if is_Windows: try: import colorconsole import colorconsole.terminal except ImportError: is_colorConsole = False else: is_colorConsole = True try: # psutil is the main library used to grab stats import psutil except ImportError: print('PsUtil module not found. Glances cannot start.') sys.exit(1) psutil_version = tuple([int(num) for num in psutil.__version__.split('.')]) # this is not a mistake: psutil 0.5.1 is detected as 0.5.0 if psutil_version < (0, 5, 0): print('PsUtil version %s detected.' % psutil.__version__) print('PsUtil 0.5.1 or higher is needed. Glances cannot start.') sys.exit(1) try: # psutil.virtual_memory() only available from psutil >= 0.6 psutil.virtual_memory() except Exception: psutil_mem_vm = False else: psutil_mem_vm = True try: # psutil.net_io_counters() only available from psutil >= 1.0.0 psutil.net_io_counters() except Exception: psutil_net_io_counters = False else: psutil_net_io_counters = True if not is_Mac: psutil_get_io_counter_tag = True else: # get_io_counters() not available on OS X psutil_get_io_counter_tag = False # sensors library (optional; Linux-only) if is_Linux: try: import sensors except ImportError: sensors_lib_tag = False else: sensors_lib_tag = True else: sensors_lib_tag = False # batinfo library (optional; Linux-only) if is_Linux: try: import batinfo except ImportError: batinfo_lib_tag = False else: batinfo_lib_tag = True else: batinfo_lib_tag = False try: # HTML output (optional) import jinja2 except ImportError: html_lib_tag = False else: html_lib_tag = True try: # CSV output (optional) import csv except ImportError: cvs_lib_tag = False else: csv_lib_tag = True # path definitions work_path = os.path.realpath(os.path.dirname(__file__)) appname_path = os.path.split(sys.argv[0])[0] sys_prefix = os.path.realpath(os.path.dirname(appname_path)) # i18n locale.setlocale(locale.LC_ALL, '') gettext_domain = __appname__ # get locale directory i18n_path = os.path.realpath(os.path.join(work_path, '..', 'i18n')) sys_i18n_path = os.path.join(sys_prefix, 'share', 'locale') if os.path.exists(i18n_path): locale_dir = i18n_path elif os.path.exists(sys_i18n_path): locale_dir = sys_i18n_path else: locale_dir = None gettext.install(gettext_domain, locale_dir) # Default tag sensors_tag = False hddtemp_tag = False network_tag = True diskio_tag = True fs_tag = True process_tag = True # Global moved outside main for unit tests last_update_times = {} # Classes #======== if is_Windows and is_colorConsole: import msvcrt import threading try: import Queue as queue except ImportError: import queue class ListenGetch(threading.Thread): def __init__(self, nom=''): threading.Thread.__init__(self) self.Terminated = False self.q = queue.Queue() def run(self): while not self.Terminated: char = msvcrt.getch() self.q.put(char) def stop(self): self.Terminated = True while not self.q.empty(): self.q.get() def get(self, default=None): try: return ord(self.q.get_nowait()) except Exception: return default class Screen(): COLOR_DEFAULT_WIN = '0F' # 07'#'0F' COLOR_BK_DEFAULT = colorconsole.terminal.colors["BLACK"] COLOR_FG_DEFAULT = colorconsole.terminal.colors["WHITE"] def __init__(self, nc): self.nc = nc self.term = colorconsole.terminal.get_terminal() # os.system('color %s' % self.COLOR_DEFAULT_WIN) self.listen = ListenGetch() self.listen.start() self.term.clear() def subwin(self, x, y): return self def keypad(self, id): return None def nodelay(self, id): return None def getch(self): return self.listen.get(27) def erase(self): self.reset() return None def addnstr(self, y, x, msg, ln, typo=0): try: fgs, bks = self.nc.colors[typo] except Exception: fgs, bks = self.COLOR_FG_DEFAULT, self.COLOR_BK_DEFAULT self.term.set_color(fg=fgs, bk=bks) self.term.print_at(x, y, msg.ljust(ln)) self.term.set_color(fg=self.COLOR_FG_DEFAULT, bk=self.COLOR_BK_DEFAULT) def getmaxyx(self): x = (self.term._Terminal__get_console_info().srWindow.Right - self.term._Terminal__get_console_info().srWindow.Left + 1) y = (self.term._Terminal__get_console_info().srWindow.Bottom - self.term._Terminal__get_console_info().srWindow.Top + 1) return [y, x] def reset(self): self.term.clear() self.term.reset() return None def restore_buffered_mode(self): self.term.restore_buffered_mode() return None class WCurseLight(): COLOR_WHITE = colorconsole.terminal.colors["WHITE"] COLOR_RED = colorconsole.terminal.colors["RED"] COLOR_GREEN = colorconsole.terminal.colors["GREEN"] COLOR_BLUE = colorconsole.terminal.colors["LBLUE"] COLOR_MAGENTA = colorconsole.terminal.colors["LPURPLE"] COLOR_BLACK = colorconsole.terminal.colors["BLACK"] A_UNDERLINE = 0 A_BOLD = 0 COLOR_PAIRS = 9 colors = {} def __init__(self): self.term = Screen(self) def initscr(self): return self.term def start_color(self): return None def use_default_colors(self): return None def noecho(self): return None def cbreak(self): return None def curs_set(self, y): return None def has_colors(self): return True def echo(self): return None def nocbreak(self): return None def endwin(self): self.term.reset() self.term.restore_buffered_mode() self.term.listen.stop() def napms(self, t): time.sleep(t / 1000 if t > 1000 else 1) def init_pair(self, id, fg, bk): self.colors[id] = [max(fg, 0), max(bk, 0)] def color_pair(self, id): return id curses = WCurseLight() class Timer: """ The timer class """ def __init__(self, duration): self.started(duration) def started(self, duration): self.target = time.time() + duration def finished(self): return time.time() > self.target class Config: """ This class is used to access/read config file, if it exists :param location: the custom path to search for config file :type location: str or None """ def __init__(self, location=None): self.location = location self.filename = 'glances.conf' self.parser = RawConfigParser() self.load() def load(self): """ Load a config file from the list of paths, if it exists """ for path in self.get_paths_list(): if os.path.isfile(path) and os.path.getsize(path) > 0: try: if sys.version_info >= (3, 2): self.parser.read(path, encoding='utf-8') else: self.parser.read(path) except UnicodeDecodeError as e: print(_("Error decoding config file '%s': %s") % (path, e)) sys.exit(1) break def get_paths_list(self): """ Get a list of config file paths, taking into account of the OS, priority and location. * running from source: /path/to/glances/conf * Linux: ~/.config/glances, /etc/glances * BSD: ~/.config/glances, /usr/local/etc/glances * Mac: ~/Library/Application Support/glances, /usr/local/etc/glances * Windows: %APPDATA%\glances The config file will be searched in the following order of priority: * /path/to/file (via -C flag) * /path/to/glances/conf * user's home directory (per-user settings) * {/usr/local,}/etc directory (system-wide settings) """ paths = [] conf_path = os.path.realpath(os.path.join(work_path, '..', 'conf')) if self.location is not None: paths.append(self.location) if os.path.exists(conf_path): paths.append(os.path.join(conf_path, self.filename)) if is_Linux or is_BSD: paths.append(os.path.join( os.environ.get('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'), __appname__, self.filename)) elif is_Mac: paths.append(os.path.join( os.path.expanduser('~/Library/Application Support/'), __appname__, self.filename)) elif is_Windows: paths.append(os.path.join( os.environ.get('APPDATA'), __appname__, self.filename)) if is_Linux: paths.append(os.path.join('/etc', __appname__, self.filename)) elif is_BSD: paths.append(os.path.join( sys.prefix, 'etc', __appname__, self.filename)) elif is_Mac: paths.append(os.path.join( sys_prefix, 'etc', __appname__, self.filename)) return paths def has_section(self, section): """ Return info about the existence of a section """ return self.parser.has_section(section) def get_option(self, section, option): """ Get the float value of an option, if it exists """ try: value = self.parser.getfloat(section, option) except NoOptionError: return else: return value def get_raw_option(self, section, option): """ Get the raw value of an option, if it exists """ try: value = self.parser.get(section, option) except NoOptionError: return else: return value class monitorList: """ This class describes the optionnal monitored processes list A list of 'important' processes to monitor. The list (Python list) is composed of items (Python dict) An item is defined (Dict keys'): * description: Description of the processes (max 16 chars) * regex: regular expression of the processes to monitor * command: (optional) shell command for extended stat * countmin: (optional) minimal number of processes * countmax: (optional) maximum number of processes """ # Maximum number of items in the list __monitor_list_max_size = 10 # The list __monitor_list = [] def __init__(self): if config.has_section('monitor'): # Process monitoring list self.__setMonitorList('monitor', 'list') def __setMonitorList(self, section, key): """ Init the monitored processes list The list is defined in the Glances configuration file """ for l in range(1, self.__monitor_list_max_size + 1): value = {} key = "list_" + str(l) + "_" try: description = config.get_raw_option(section, key + "description") regex = config.get_raw_option(section, key + "regex") command = config.get_raw_option(section, key + "command") countmin = config.get_raw_option(section, key + "countmin") countmax = config.get_raw_option(section, key + "countmax") except Exception: pass else: if description is not None and regex is not None: # Build the new item value["description"] = description value["regex"] = regex value["command"] = command value["countmin"] = countmin value["countmax"] = countmax # Add the item to the list self.__monitor_list.append(value) def __str__(self): return str(self.__monitor_list) def __repr__(self): return self.__monitor_list def __getitem__(self, item): return self.__monitor_list[item] def __len__(self): return len(self.__monitor_list) def __get__(self, item, key): """ Meta function to return key value of item None if not defined or item > len(list) """ if item < len(self.__monitor_list): try: return self.__monitor_list[item][key] except Exception: return None else: return None def getAll(self): return self.__monitor_list def setAll(self, newlist): self.__monitor_list = newlist def description(self, item): """ Return the description of the item number (item) """ return self.__get__(item, "description") def regex(self, item): """ Return the regular expression of the item number (item) """ return self.__get__(item, "regex") def command(self, item): """ Return the stats command of the item number (item) """ return self.__get__(item, "command") def countmin(self, item): """ Return the minimum number of processes of the item number (item) """ return self.__get__(item, "countmin") def countmax(self, item): """ Return the maximum number of processes of the item number (item) """ return self.__get__(item, "countmax") class glancesLimits: """ Manage the limit OK, CAREFUL, WARNING, CRITICAL for each stats The limit list is stored in an hash table: __limits_list[STAT] = [CAREFUL, WARNING, CRITICAL] STD is for defaults limits (CPU/MEM/SWAP/FS) CPU_IOWAIT limits (iowait in %) LOAD is for LOAD limits (5 min/15 min) TEMP is for sensors limits (temperature in °C) HDDTEMP is for hddtemp limits (temperature in °C) """ __limits_list = {'STD': [50, 70, 90], 'CPU_USER': [50, 70, 90], 'CPU_SYSTEM': [50, 70, 90], 'CPU_IOWAIT': [40, 60, 80], 'LOAD': [0.7, 1.0, 5.0], 'MEM': [50, 70, 90], 'SWAP': [50, 70, 90], 'TEMP': [60, 70, 80], 'HDDTEMP': [45, 52, 60], 'FS': [50, 70, 90], 'PROCESS_CPU': [50, 70, 90], 'PROCESS_MEM': [50, 70, 90]} def __init__(self): # Test if the configuration file has a limits section if config.has_section('global'): # Read STD limits self.__setLimits('STD', 'global', 'careful') self.__setLimits('STD', 'global', 'warning') self.__setLimits('STD', 'global', 'critical') if config.has_section('cpu'): # Read CPU limits self.__setLimits('CPU_USER', 'cpu', 'user_careful') self.__setLimits('CPU_USER', 'cpu', 'user_warning') self.__setLimits('CPU_USER', 'cpu', 'user_critical') self.__setLimits('CPU_SYSTEM', 'cpu', 'system_careful') self.__setLimits('CPU_SYSTEM', 'cpu', 'system_warning') self.__setLimits('CPU_SYSTEM', 'cpu', 'system_critical') self.__setLimits('CPU_IOWAIT', 'cpu', 'iowait_careful') self.__setLimits('CPU_IOWAIT', 'cpu', 'iowait_warning') self.__setLimits('CPU_IOWAIT', 'cpu', 'iowait_critical') if config.has_section('load'): # Read LOAD limits self.__setLimits('LOAD', 'load', 'careful') self.__setLimits('LOAD', 'load', 'warning') self.__setLimits('LOAD', 'load', 'critical') if config.has_section('memory'): # Read MEM limits self.__setLimits('MEM', 'memory', 'careful') self.__setLimits('MEM', 'memory', 'warning') self.__setLimits('MEM', 'memory', 'critical') if config.has_section('swap'): # Read MEM limits self.__setLimits('SWAP', 'swap', 'careful') self.__setLimits('SWAP', 'swap', 'warning') self.__setLimits('SWAP', 'swap', 'critical') if config.has_section('temperature'): # Read TEMP limits self.__setLimits('TEMP', 'temperature', 'careful') self.__setLimits('TEMP', 'temperature', 'warning') self.__setLimits('TEMP', 'temperature', 'critical') if config.has_section('hddtemperature'): # Read HDDTEMP limits self.__setLimits('HDDTEMP', 'hddtemperature', 'careful') self.__setLimits('HDDTEMP', 'hddtemperature', 'warning') self.__setLimits('HDDTEMP', 'hddtemperature', 'critical') if config.has_section('filesystem'): # Read FS limits self.__setLimits('FS', 'filesystem', 'careful') self.__setLimits('FS', 'filesystem', 'warning') self.__setLimits('FS', 'filesystem', 'critical') if config.has_section('process'): # Process limits self.__setLimits('PROCESS_CPU', 'process', 'cpu_careful') self.__setLimits('PROCESS_CPU', 'process', 'cpu_warning') self.__setLimits('PROCESS_CPU', 'process', 'cpu_critical') self.__setLimits('PROCESS_MEM', 'process', 'mem_careful') self.__setLimits('PROCESS_MEM', 'process', 'mem_warning') self.__setLimits('PROCESS_MEM', 'process', 'mem_critical') def __setLimits(self, stat, section, alert): """ stat: 'CPU', 'LOAD', 'MEM', 'SWAP', 'TEMP', etc. section: 'cpu', 'load', 'memory', 'swap', 'temperature', etc. alert: 'careful', 'warning', 'critical' """ value = config.get_option(section, alert) #~ print("%s / %s = %s -> %s" % (section, alert, value, stat)) if alert.endswith('careful'): self.__limits_list[stat][0] = value elif alert.endswith('warning'): self.__limits_list[stat][1] = value elif alert.endswith('critical'): self.__limits_list[stat][2] = value def setAll(self, newlimits): self.__limits_list = newlimits return True def getAll(self): return self.__limits_list def getCareful(self, stat): return self.__limits_list[stat][0] def getWarning(self, stat): return self.__limits_list[stat][1] def getCritical(self, stat): return self.__limits_list[stat][2] # TO BE DELETED AFTER THE HTML output refactoring def getSTDCareful(self): return self.getCareful('STD') def getSTDWarning(self): return self.getWarning('STD') def getSTDCritical(self): return self.getCritical('STD') # /TO BE DELETED AFTER THE HTML output refactoring def getCPUCareful(self, stat): return self.getCareful('CPU_' + stat.upper()) def getCPUWarning(self, stat): return self.getWarning('CPU_' + stat.upper()) def getCPUCritical(self, stat): return self.getCritical('CPU_' + stat.upper()) def getLOADCareful(self, core=1): return self.getCareful('LOAD') * core def getLOADWarning(self, core=1): return self.getWarning('LOAD') * core def getLOADCritical(self, core=1): return self.getCritical('LOAD') * core def getMEMCareful(self): return self.getCareful('MEM') def getMEMWarning(self): return self.getWarning('MEM') def getMEMCritical(self): return self.getCritical('MEM') def getSWAPCareful(self): return self.getCareful('SWAP') def getSWAPWarning(self): return self.getWarning('SWAP') def getSWAPCritical(self): return self.getCritical('SWAP') def getTEMPCareful(self): return self.getCareful('TEMP') def getTEMPWarning(self): return self.getWarning('TEMP') def getTEMPCritical(self): return self.getCritical('TEMP') def getHDDTEMPCareful(self): return self.getCareful('HDDTEMP') def getHDDTEMPWarning(self): return self.getWarning('HDDTEMP') def getHDDTEMPCritical(self): return self.getCritical('HDDTEMP') def getFSCareful(self): return self.getCareful('FS') def getFSWarning(self): return self.getWarning('FS') def getFSCritical(self): return self.getCritical('FS') def getProcessCareful(self, stat='', core=1): if stat.upper() != 'CPU': # Use core only for CPU core = 1 return self.getCareful('PROCESS_' + stat.upper()) * core def getProcessWarning(self, stat='', core=1): if stat.upper() != 'CPU': # Use core only for CPU core = 1 return self.getWarning('PROCESS_' + stat.upper()) * core def getProcessCritical(self, stat='', core=1): if stat.upper() != 'CPU': # Use core only for CPU core = 1 return self.getCritical('PROCESS_' + stat.upper()) * core class glancesLogs: """ The main class to manage logs inside the Glances software Logs is a list of list (stored in the self.logs_list var) See item description in the add function """ def __init__(self): """ Init the logs classe """ # Maximum size of the logs list self.logs_max = 10 # Init the logs list self.logs_list = [] def get(self): """ Return the logs list (RAW) """ return self.logs_list def len(self): """ Return the number of item in the log list """ return self.logs_list.__len__() def __itemexist__(self, item_type): """ An item exist in the list if: * end is < 0 * item_type is matching """ for i in range(self.len()): if self.logs_list[i][1] < 0 and self.logs_list[i][3] == item_type: return i return -1 def add(self, item_state, item_type, item_value, proc_list=[], proc_desc=""): """ item_state = "OK|CAREFUL|WARNING|CRITICAL" item_type = "CPU*|LOAD|MEM|MON" item_value = value Item is defined by: ["begin", "end", "WARNING|CRITICAL", "CPU|LOAD|MEM", MAX, AVG, MIN, SUM, COUNT, [top3 process list], "Processes description"] If item is a 'new one': Add the new item at the beginning of the logs list Else: Update the existing item """ # Add Top process sort depending on alert type sortby = 'none' if item_type.startswith("MEM"): # Sort TOP process by memory_percent sortby = 'memory_percent' elif item_type.startswith("CPU IO") and is_Linux: # Sort TOP process by io_counters (only for Linux OS) sortby = 'io_counters' elif item_type.startswith("MON"): # Do no sort process for monitored prcesses list sortby = 'none' else: # Default TOP process sort is cpu_percent sortby = 'cpu_percent' # Sort processes if sortby != 'none': topprocess = sorted(proc_list, key=lambda process: process[sortby], reverse=True) else: topprocess = proc_list # Add or update the log item_index = self.__itemexist__(item_type) if item_index < 0: # Item did not exist, add if WARNING or CRITICAL if item_state == "WARNING" or item_state == "CRITICAL": # Time is stored in Epoch format # Epoch -> DMYHMS = datetime.fromtimestamp(epoch) item = [] # START DATE item.append(time.mktime(datetime.now().timetuple())) # END DATE item.append(-1) item.append(item_state) # STATE: WARNING|CRITICAL item.append(item_type) # TYPE: CPU, LOAD, MEM... item.append(item_value) # MAX item.append(item_value) # AVG item.append(item_value) # MIN item.append(item_value) # SUM item.append(1) # COUNT item.append(topprocess[0:3]) # TOP 3 PROCESS LIST item.append(proc_desc) # MONITORED PROCESSES DESC self.logs_list.insert(0, item) if self.len() > self.logs_max: self.logs_list.pop() else: # Item exist, update if item_state == "OK" or item_state == "CAREFUL": # Close the item self.logs_list[item_index][1] = time.mktime( datetime.now().timetuple()) # TOP PROCESS LIST self.logs_list[item_index][9] = [] else: # Update the item # State if item_state == "CRITICAL": self.logs_list[item_index][2] = item_state # Value if item_value > self.logs_list[item_index][4]: # MAX self.logs_list[item_index][4] = item_value elif item_value < self.logs_list[item_index][6]: # MIN self.logs_list[item_index][6] = item_value # AVG self.logs_list[item_index][7] += item_value self.logs_list[item_index][8] += 1 self.logs_list[item_index][5] = (self.logs_list[item_index][7] / self.logs_list[item_index][8]) # TOP PROCESS LIST self.logs_list[item_index][9] = topprocess[0:3] # MONITORED PROCESSES DESC self.logs_list[item_index][10] = proc_desc return self.len() def clean(self, critical=False): """ Clean the log list by deleting finished item By default, only delete WARNING message If critical = True, also delete CRITICAL message """ # Create a new clean list clean_logs_list = [] while self.len() > 0: item = self.logs_list.pop() if item[1] < 0 or (not critical and item[2] == "CRITICAL"): clean_logs_list.insert(0, item) # The list is now the clean one self.logs_list = clean_logs_list return self.len() class glancesGrabFs: """ Get FS stats """ def __init__(self): """ Init FS stats """ # Ignore the following FS name self.ignore_fsname = ('', 'cgroup', 'fusectl', 'gvfs-fuse-daemon', 'gvfsd-fuse', 'none') # Ignore the following FS type self.ignore_fstype = ('autofs', 'binfmt_misc', 'configfs', 'debugfs', 'devfs', 'devpts', 'devtmpfs', 'hugetlbfs', 'iso9660', 'linprocfs', 'mqueue', 'none', 'proc', 'procfs', 'pstore', 'rootfs', 'securityfs', 'sysfs', 'usbfs') # ignore FS by mount point self.ignore_mntpoint = ('', '/dev/shm', '/lib/init/rw', '/sys/fs/cgroup') def __update__(self): """ Update the stats """ # Reset the list self.fs_list = [] # Open the current mounted FS fs_stat = psutil.disk_partitions(all=True) for fs in range(len(fs_stat)): fs_current = {} fs_current['device_name'] = fs_stat[fs].device if fs_current['device_name'] in self.ignore_fsname: continue fs_current['fs_type'] = fs_stat[fs].fstype if fs_current['fs_type'] in self.ignore_fstype: continue fs_current['mnt_point'] = fs_stat[fs].mountpoint if fs_current['mnt_point'] in self.ignore_mntpoint: continue try: fs_usage = psutil.disk_usage(fs_current['mnt_point']) except Exception: continue fs_current['size'] = fs_usage.total fs_current['used'] = fs_usage.used fs_current['avail'] = fs_usage.free self.fs_list.append(fs_current) def get(self): self.__update__() return self.fs_list class glancesGrabSensors: """ Get sensors stats using the PySensors library """ def __init__(self): """ Init sensors stats """ try: sensors.init() except Exception: self.initok = False else: self.initok = True def __update__(self): """ Update the stats """ # Reset the list self.sensors_list = [] # grab only temperature stats if self.initok: for chip in sensors.iter_detected_chips(): for feature in chip: sensors_current = {} if feature.name.startswith('temp'): sensors_current['label'] = feature.label[:20] sensors_current['value'] = int(feature.get_value()) self.sensors_list.append(sensors_current) def get(self): self.__update__() return self.sensors_list def quit(self): if self.initok: sensors.cleanup() class glancesGrabHDDTemp: """ Get hddtemp stats using a socket connection """ cache = "" address = "127.0.0.1" port = 7634 def __init__(self): """ Init hddtemp stats """ try: sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sck.connect((self.address, self.port)) sck.close() except Exception: self.initok = False else: self.initok = True def __update__(self): """ Update the stats """ # Reset the list self.hddtemp_list = [] if self.initok: data = "" # Taking care of sudden deaths/stops of hddtemp daemon try: sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sck.connect((self.address, self.port)) data = sck.recv(4096) sck.close() except Exception: hddtemp_current = {} hddtemp_current['label'] = "hddtemp is gone" hddtemp_current['value'] = 0 self.hddtemp_list.append(hddtemp_current) return else: # Considering the size of "|/dev/sda||0||" as the minimum if len(data) < 14: if len(self.cache) == 0: data = "|hddtemp error||0||" else: data = self.cache self.cache = data fields = data.decode('utf-8').split("|") devices = (len(fields) - 1) // 5 for i in range(0, devices): offset = i * 5 hddtemp_current = {} temperature = fields[offset + 3] if temperature == "ERR": hddtemp_current['label'] = _("hddtemp error") hddtemp_current['value'] = 0 elif temperature == "SLP": hddtemp_current['label'] = fields[offset + 1].split("/")[-1] + " is sleeping" hddtemp_current['value'] = 0 elif temperature == "UNK": hddtemp_current['label'] = fields[offset + 1].split("/")[-1] + " is unknown" hddtemp_current['value'] = 0 else: hddtemp_current['label'] = fields[offset + 1].split("/")[-1] try: hddtemp_current['value'] = int(temperature) except TypeError: hddtemp_current['label'] = fields[offset + 1].split("/")[-1] + " is unknown" hddtemp_current['value'] = 0 self.hddtemp_list.append(hddtemp_current) def get(self): self.__update__() return self.hddtemp_list class GlancesGrabProcesses: """ Get processed stats using the PsUtil lib """ def __init__(self): """ Init the io dict key = pid value = [ read_bytes_old, write_bytes_old ] """ self.io_old = {} def __get_process_stats(self, proc): """ Get process statistics """ procstat = {} procstat['name'] = proc.name procstat['pid'] = proc.pid try: procstat['username'] = proc.username except KeyError: try: procstat['username'] = proc.uids.real except KeyError: procstat['username'] = "?" procstat['cmdline'] = ' '.join(proc.cmdline) procstat['memory_info'] = proc.get_memory_info() procstat['memory_percent'] = proc.get_memory_percent() procstat['status'] = str(proc.status)[:1].upper() procstat['cpu_times'] = proc.get_cpu_times() procstat['cpu_percent'] = proc.get_cpu_percent(interval=0) procstat['nice'] = proc.get_nice() # try: # # !!! High CPU consumption # procstat['tcp'] = len(proc.get_connections(kind="tcp")) # procstat['udp'] = len(proc.get_connections(kind="udp")) # except: # procstat['tcp'] = 0 # procstat['udp'] = 0 # procstat['io_counters'] is a list: # [read_bytes, write_bytes, read_bytes_old, write_bytes_old, io_tag] # If io_tag = 0 > Access denied (display "?") # If io_tag = 1 > No access denied (display the IO rate) if psutil_get_io_counter_tag: try: # Get the process IO counters proc_io = proc.get_io_counters() io_new = [proc_io.read_bytes, proc_io.write_bytes] except psutil.AccessDenied: # Access denied to process IO (no root account) # Put 0 in all values (for sort) and io_tag = 0 (for display) procstat['io_counters'] = [0, 0] + [0, 0] io_tag = 0 else: # For IO rate computation # Append saved IO r/w bytes try: procstat['io_counters'] = io_new + self.io_old[procstat['pid']] except KeyError: procstat['io_counters'] = io_new + [0, 0] # then save the IO r/w bytes self.io_old[procstat['pid']] = io_new io_tag = 1 # Append the IO tag (for display) procstat['io_counters'] += [io_tag] return procstat def update(self): self.processlist = [] self.processcount = {'total': 0, 'running': 0, 'sleeping': 0} time_since_update = getTimeSinceLastUpdate('process_disk') # For each existing process... for proc in psutil.process_iter(): try: procstat = self.__get_process_stats(proc) procstat['time_since_update'] = time_since_update # ignore the 'idle' process on Windows and *BSD # ignore the 'kernel_task' process on OS X # waiting for upstream patch from psutil if (is_BSD and procstat['name'] == 'idle' or is_Windows and procstat['name'] == 'System Idle Process' or is_Mac and procstat['name'] == 'kernel_task'): continue # Update processcount (global stattistics) try: self.processcount[str(proc.status)] += 1 except KeyError: # Key did not exist, create it self.processcount[str(proc.status)] = 1 else: self.processcount['total'] += 1 except (psutil.NoSuchProcess, psutil.AccessDenied): continue else: # Update processlist self.processlist.append(procstat) def getcount(self): return self.processcount def getlist(self): return self.processlist class glancesGrabBat: """ Get batteries stats using the Batinfo librairie """ def __init__(self): """ Init batteries stats """ if batinfo_lib_tag: try: self.bat = batinfo.batteries() self.initok = True self.__update__() except Exception: self.initok = False else: self.initok = False def __update__(self): """ Update the stats """ if self.initok: try: self.bat.update() except Exception: self.bat_list = [] else: self.bat_list = self.bat.stat else: self.bat_list = [] def get(self): # Update the stats self.__update__() return self.bat_list def getcapacitypercent(self): if not self.initok or self.bat_list == []: return [] # Init the bsum (sum of percent) and bcpt (number of batteries) # and Loop over batteries (yes a computer could have more than 1 battery) bsum = 0 for bcpt in range(len(self.get())): try: bsum = bsum + int(self.bat_list[bcpt].capacity) except ValueError: return [] bcpt = bcpt + 1 # Return the global percent return int(bsum / bcpt) class GlancesStats: """ This class store, update and give stats """ def __init__(self): """ Init the stats """ self._init_host() # Init the grab error tags # for managing error during stats grab # By default, we *hope* that there is no error self.network_error_tag = False self.diskio_error_tag = False # Init the fs stats try: self.glancesgrabfs = glancesGrabFs() except Exception: self.glancesgrabfs = {} # Init the sensors stats (optional) if sensors_tag: try: self.glancesgrabsensors = glancesGrabSensors() except Exception: self.sensors_tag = False # Init the hddtemp stats (optional) if hddtemp_tag: try: self.glancesgrabhddtemp = glancesGrabHDDTemp() except Exception: self.hddtemp_tag = False if batinfo_lib_tag: self.glancesgrabbat = glancesGrabBat() # Init the process list self.process_list_refresh = True self.process_list_sortedby = '' self.glancesgrabprocesses = GlancesGrabProcesses() def _init_host(self): self.host = {} self.host['os_name'] = platform.system() self.host['hostname'] = platform.node() # More precise but not user friendly #~ if platform.uname()[4]: #~ self.host['platform'] = platform.uname()[4] #~ else: #~ self.host['platform'] = platform.architecture()[0] # This one is better self.host['platform'] = platform.architecture()[0] is_archlinux = os.path.exists(os.path.join("/", "etc", "arch-release")) if self.host['os_name'] == "Linux": if is_archlinux: self.host['linux_distro'] = "Arch Linux" else: linux_distro = platform.linux_distribution() self.host['linux_distro'] = ' '.join(linux_distro[:2]) self.host['os_version'] = platform.release() elif self.host['os_name'] == "FreeBSD": self.host['os_version'] = platform.release() elif self.host['os_name'] == "Darwin": self.host['os_version'] = platform.mac_ver()[0] elif self.host['os_name'] == "Windows": os_version = platform.win32_ver() self.host['os_version'] = ' '.join(os_version[::2]) else: self.host['os_version'] = "" def __update__(self, input_stats): """ Update the stats """ # CPU cputime = psutil.cpu_times(percpu=False) cputime_total = cputime.user + cputime.system + cputime.idle # Only available on some OS if hasattr(cputime, 'nice'): cputime_total += cputime.nice if hasattr(cputime, 'iowait'): cputime_total += cputime.iowait if hasattr(cputime, 'irq'): cputime_total += cputime.irq if hasattr(cputime, 'softirq'): cputime_total += cputime.softirq if not hasattr(self, 'cputime_old'): self.cputime_old = cputime self.cputime_total_old = cputime_total self.cpu = {} else: self.cputime_new = cputime self.cputime_total_new = cputime_total try: percent = 100 / (self.cputime_total_new - self.cputime_total_old) self.cpu = {'user': (self.cputime_new.user - self.cputime_old.user) * percent, 'system': (self.cputime_new.system - self.cputime_old.system) * percent, 'idle': (self.cputime_new.idle - self.cputime_old.idle) * percent} if hasattr(self.cputime_new, 'nice'): self.cpu['nice'] = (self.cputime_new.nice - self.cputime_old.nice) * percent if hasattr(self.cputime_new, 'iowait'): self.cpu['iowait'] = (self.cputime_new.iowait - self.cputime_old.iowait) * percent if hasattr(self.cputime_new, 'irq'): self.cpu['irq'] = (self.cputime_new.irq - self.cputime_old.irq) * percent self.cputime_old = self.cputime_new self.cputime_total_old = self.cputime_total_new except Exception: self.cpu = {} # Per-CPU percputime = psutil.cpu_times(percpu=True) percputime_total = [] for i in range(len(percputime)): percputime_total.append(percputime[i].user + percputime[i].system + percputime[i].idle) # Only available on some OS for i in range(len(percputime)): if hasattr(percputime[i], 'nice'): percputime_total[i] += percputime[i].nice for i in range(len(percputime)): if hasattr(percputime[i], 'iowait'): percputime_total[i] += percputime[i].iowait for i in range(len(percputime)): if hasattr(percputime[i], 'irq'): percputime_total[i] += percputime[i].irq for i in range(len(percputime)): if hasattr(percputime[i], 'softirq'): percputime_total[i] += percputime[i].softirq if not hasattr(self, 'percputime_old'): self.percputime_old = percputime self.percputime_total_old = percputime_total self.percpu = [] else: self.percputime_new = percputime self.percputime_total_new = percputime_total perpercent = [] self.percpu = [] try: for i in range(len(self.percputime_new)): perpercent.append(100 / (self.percputime_total_new[i] - self.percputime_total_old[i])) cpu = {'user': (self.percputime_new[i].user - self.percputime_old[i].user) * perpercent[i], 'system': (self.percputime_new[i].system - self.percputime_old[i].system) * perpercent[i], 'idle': (self.percputime_new[i].idle - self.percputime_old[i].idle) * perpercent[i]} if hasattr(self.percputime_new[i], 'nice'): cpu['nice'] = (self.percputime_new[i].nice - self.percputime_old[i].nice) * perpercent[i] if hasattr(self.percputime_new[i], 'iowait'): cpu['iowait'] = (self.percputime_new[i].iowait - self.percputime_old[i].iowait) * perpercent[i] if hasattr(self.percputime_new[i], 'irq'): cpu['irq'] = (self.percputime_new[i].irq - self.percputime_old[i].irq) * perpercent[i] if hasattr(self.percputime_new[i], 'softirq'): cpu['softirq'] = (self.percputime_new[i].softirq - self.percputime_old[i].softirq) * perpercent[i] self.percpu.append(cpu) self.percputime_old = self.percputime_new self.percputime_total_old = self.percputime_total_new except Exception: self.percpu = [] # LOAD if hasattr(os, 'getloadavg'): getload = os.getloadavg() self.load = {'min1': getload[0], 'min5': getload[1], 'min15': getload[2]} else: self.load = {} # MEM # psutil >= 0.6 if psutil_mem_vm: # RAM phymem = psutil.virtual_memory() # buffers and cached (Linux, BSD) buffers = getattr(phymem, 'buffers', 0) cached = getattr(phymem, 'cached', 0) # active and inactive not available on Windows active = getattr(phymem, 'active', 0) inactive = getattr(phymem, 'inactive', 0) # phymem free and usage total = phymem.total free = phymem.available # phymem.free + buffers + cached used = total - free self.mem = {'total': total, 'percent': phymem.percent, 'used': used, 'free': free, 'active': active, 'inactive': inactive, 'buffers': buffers, 'cached': cached} # Swap # try... is an hack for issue #152 try: virtmem = psutil.swap_memory() except Exception: self.memswap = {} else: self.memswap = {'total': virtmem.total, 'used': virtmem.used, 'free': virtmem.free, 'percent': virtmem.percent} else: # psutil < 0.6 # RAM if hasattr(psutil, 'phymem_usage'): phymem = psutil.phymem_usage() # buffers and cached (Linux, BSD) buffers = getattr(psutil, 'phymem_buffers', 0)() cached = getattr(psutil, 'cached_phymem', 0)() # phymem free and usage total = phymem.total free = phymem.free + buffers + cached used = total - free # active and inactive not available for psutil < 0.6 self.mem = {'total': total, 'percent': phymem.percent, 'used': used, 'free': free, 'buffers': buffers, 'cached': cached} else: self.mem = {} # Swap if hasattr(psutil, 'virtmem_usage'): virtmem = psutil.virtmem_usage() self.memswap = {'total': virtmem.total, 'used': virtmem.used, 'free': virtmem.free, 'percent': virtmem.percent} else: self.memswap = {} # NET if network_tag and not self.network_error_tag: self.network = [] # By storing time data we enable Rx/s and Tx/s calculations in the # XML/RPC API, which would otherwise be overly difficult work # for users of the API time_since_update = getTimeSinceLastUpdate('net') if psutil_net_io_counters: # psutil >= 1.0.0 try: get_net_io_counters = psutil.net_io_counters(pernic=True) except IOError: self.network_error_tag = True else: # psutil < 1.0.0 try: get_net_io_counters = psutil.network_io_counters(pernic=True) except IOError: self.network_error_tag = True if not hasattr(self, 'network_old'): try: self.network_old = get_net_io_counters except (IOError, UnboundLocalError): self.network_error_tag = True else: self.network_new = get_net_io_counters for net in self.network_new: try: # Try necessary to manage dynamic network interface netstat = {} netstat['time_since_update'] = time_since_update netstat['interface_name'] = net netstat['cumulative_rx'] = self.network_new[net].bytes_recv netstat['rx'] = (self.network_new[net].bytes_recv - self.network_old[net].bytes_recv) netstat['cumulative_tx'] = self.network_new[net].bytes_sent netstat['tx'] = (self.network_new[net].bytes_sent - self.network_old[net].bytes_sent) netstat['cumulative_cx'] = (netstat['cumulative_rx'] + netstat['cumulative_tx']) netstat['cx'] = netstat['rx'] + netstat['tx'] except Exception: continue else: self.network.append(netstat) self.network_old = self.network_new # SENSORS if sensors_tag: self.sensors = self.glancesgrabsensors.get() # HDDTEMP if hddtemp_tag: self.hddtemp = self.glancesgrabhddtemp.get() # BATERRIES INFORMATION if batinfo_lib_tag: self.batpercent = self.glancesgrabbat.getcapacitypercent() # DISK I/O if diskio_tag and not self.diskio_error_tag: time_since_update = getTimeSinceLastUpdate('disk') self.diskio = [] if not hasattr(self, 'diskio_old'): try: self.diskio_old = psutil.disk_io_counters(perdisk=True) except IOError: self.diskio_error_tag = True else: self.diskio_new = psutil.disk_io_counters(perdisk=True) for disk in self.diskio_new: try: # Try necessary to manage dynamic disk creation/del diskstat = {} diskstat['time_since_update'] = time_since_update diskstat['disk_name'] = disk diskstat['read_bytes'] = ( self.diskio_new[disk].read_bytes - self.diskio_old[disk].read_bytes) diskstat['write_bytes'] = ( self.diskio_new[disk].write_bytes - self.diskio_old[disk].write_bytes) except Exception: continue else: self.diskio.append(diskstat) self.diskio_old = self.diskio_new # FILE SYSTEM if fs_tag: self.fs = self.glancesgrabfs.get() # PROCESS if process_tag: self.glancesgrabprocesses.update() processcount = self.glancesgrabprocesses.getcount() process = self.glancesgrabprocesses.getlist() if not hasattr(self, 'process'): self.processcount = {} self.process = [] else: self.processcount = processcount self.process = process # Get the current date/time self.now = datetime.now() # Get the number of core (CPU) (Used to display load alerts) self.core_number = psutil.NUM_CPUS # get psutil version self.psutil_version = psutil.__version__ def update(self, input_stats={}): # Update the stats self.__update__(input_stats) def getSortedBy(self): return self.process_list_sortedby def getAll(self): return self.all_stats def getHost(self): return self.host def getSystem(self): return self.host def getCpu(self): return self.cpu def getPerCpu(self): return self.percpu def getCore(self): return self.core_number def getLoad(self): return self.load def getMem(self): return self.mem def getMemSwap(self): return self.memswap def getNetwork(self): if network_tag: return sorted(self.network, key=lambda network: network['interface_name']) else: return [] def getSensors(self): if sensors_tag: return sorted(self.sensors, key=lambda sensors: sensors['label']) else: return [] def getHDDTemp(self): if hddtemp_tag: return sorted(self.hddtemp, key=lambda hddtemp: hddtemp['label']) else: return [] def getBatPercent(self): if batinfo_lib_tag: return self.batpercent else: return [] def getDiskIO(self): if diskio_tag: return sorted(self.diskio, key=lambda diskio: diskio['disk_name']) else: return [] def getFs(self): if fs_tag: return sorted(self.fs, key=lambda fs: fs['mnt_point']) else: return [] def getProcessCount(self): if process_tag: return self.processcount else: return 0 def getProcessList(self, sortedby='auto'): """ Return the sorted process list """ if not process_tag: return [] if self.process == {} or 'limits' not in globals(): return self.process sortedReverse = True if sortedby == 'auto': # Auto selection (default: sort by CPU%) sortedby = 'cpu_percent' # Dynamic choice if ('iowait' in self.cpu and self.cpu['iowait'] > limits.getCPUWarning(stat='iowait')): # If CPU IOWait > 70% sort by IORATE usage sortedby = 'io_counters' elif (self.mem['total'] != 0 and self.mem['used'] * 100 / self.mem['total'] > limits.getMEMWarning()): # If global MEM > 70% sort by MEM usage sortedby = 'memory_percent' elif sortedby == 'name': sortedReverse = False if sortedby == 'io_counters': try: # Sort process by IO rate (sum IO read + IO write) listsorted = sorted(self.process, key=lambda process: process[sortedby][0] - process[sortedby][2] + process[sortedby][1] - process[sortedby][3], reverse=sortedReverse) except Exception: listsorted = sorted(self.process, key=lambda process: process['cpu_percent'], reverse=sortedReverse) else: # Others sorts listsorted = sorted(self.process, key=lambda process: process[sortedby], reverse=sortedReverse) # Save the latest sort type in a global var self.process_list_sortedby = sortedby # Return the sorted list return listsorted def getPsutilVersion(self): return self.psutil_version def getNow(self): return self.now class GlancesStatsServer(GlancesStats): def __init__(self): GlancesStats.__init__(self) # Init the all_stats used by the server # all_stats is a dict of dicts filled by the server self.all_stats = collections.defaultdict(dict) self._init_host() self.all_stats["host"] = self.host def __update__(self, input_stats): """ Update the stats """ GlancesStats.__update__(self, input_stats) self.all_stats["cpu"] = self.cpu self.all_stats["percpu"] = self.percpu self.all_stats["load"] = self.load self.all_stats["mem"] = self.mem self.all_stats["memswap"] = self.memswap self.all_stats["network"] = self.network if network_tag else [] self.all_stats["sensors"] = self.sensors if sensors_tag else [] self.all_stats["hddtemp"] = self.hddtemp if hddtemp_tag else [] self.all_stats["batpercent"] = self.batpercent if batinfo_lib_tag else [] self.all_stats["diskio"] = self.diskio if diskio_tag else [] self.all_stats["fs"] = self.fs if fs_tag else [] self.all_stats["processcount"] = self.processcount if process_tag else 0 self.all_stats["process"] = self.process if process_tag else [] self.all_stats["core_number"] = self.core_number self.all_stats["psutil_version"] = self.psutil_version # Get the current date/time self.now = datetime.now() def getAll(self): return self.all_stats class GlancesStatsClient(GlancesStats): def __init__(self): GlancesStats.__init__(self) def __update__(self, input_stats): """ Update the stats """ if input_stats != {}: self.host = input_stats["host"] self.cpu = input_stats["cpu"] self.percpu = input_stats["percpu"] self.load = input_stats["load"] self.mem = input_stats["mem"] self.memswap = input_stats["memswap"] try: self.network = input_stats["network"] except Exception: self.network = [] try: self.sensors = input_stats["sensors"] except Exception: self.sensors = [] try: self.hddtemp = input_stats["hddtemp"] except Exception: self.hddtemp = [] try: self.batpercent = input_stats["batpercent"] except Exception: self.batpercent = [] try: self.diskio = input_stats["diskio"] except Exception: self.diskio = [] try: self.fs = input_stats["fs"] except Exception: self.fs = [] self.processcount = input_stats["processcount"] self.process = input_stats["process"] self.core_number = input_stats["core_number"] self.psutil_version = input_stats["psutil_version"] # Get the current date/time self.now = datetime.now() class glancesScreen: """ This class manage the screen (display and key pressed) """ # By default the process list is automatically sorted # If global CPU > WANRING => Sorted by CPU usage # If global used MEM > WARINING => Sorted by MEM usage __process_sortedby = 'auto' def __init__(self, refresh_time=1, use_bold=1): # Global information to display self.__version = __version__ # Init windows positions self.term_w = 80 self.term_h = 24 self.system_x = 0 self.system_y = 0 self.cpu_x = 0 self.cpu_y = 2 self.load_x = 17 self.load_y = 2 self.mem_x = 33 self.mem_y = 2 self.network_x = 0 self.network_y = 7 self.sensors_x = 0 self.sensors_y = -1 self.hddtemp_x = 0 self.hddtemp_y = -1 self.diskio_x = 0 self.diskio_y = -1 self.fs_x = 0 self.fs_y = -1 self.process_x = 26 self.process_y = 7 self.log_x = 0 self.log_y = -1 self.help_x = 0 self.help_y = 0 self.now_x = 79 self.now_y = 3 self.bat_x = 0 self.bat_y = 3 self.caption_x = 0 self.caption_y = 3 # Init the curses screen self.screen = curses.initscr() if not self.screen: print(_("Error: Cannot init the curses library.\n")) # Set curses options if hasattr(curses, 'start_color'): curses.start_color() if hasattr(curses, 'use_default_colors'): curses.use_default_colors() if hasattr(curses, 'noecho'): curses.noecho() if hasattr(curses, 'cbreak'): curses.cbreak() if hasattr(curses, 'curs_set'): try: curses.curs_set(0) except Exception: pass # Init colors self.hascolors = False if curses.has_colors() and curses.COLOR_PAIRS > 8: self.hascolors = True # FG color, BG color curses.init_pair(1, curses.COLOR_WHITE, -1) curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_RED) curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_GREEN) curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_MAGENTA) curses.init_pair(6, curses.COLOR_RED, -1) curses.init_pair(7, curses.COLOR_GREEN, -1) curses.init_pair(8, curses.COLOR_BLUE, -1) curses.init_pair(9, curses.COLOR_MAGENTA, -1) else: self.hascolors = False if use_bold: A_BOLD = curses.A_BOLD else: A_BOLD = 0 self.title_color = A_BOLD self.title_underline_color = A_BOLD | curses.A_UNDERLINE self.help_color = A_BOLD if self.hascolors: # Colors text styles self.no_color = curses.color_pair(1) self.default_color = curses.color_pair(3) | A_BOLD self.ifCAREFUL_color = curses.color_pair(4) | A_BOLD self.ifWARNING_color = curses.color_pair(5) | A_BOLD self.ifCRITICAL_color = curses.color_pair(2) | A_BOLD self.default_color2 = curses.color_pair(7) | A_BOLD self.ifCAREFUL_color2 = curses.color_pair(8) | A_BOLD self.ifWARNING_color2 = curses.color_pair(9) | A_BOLD self.ifCRITICAL_color2 = curses.color_pair(6) | A_BOLD else: # B&W text styles self.no_color = curses.A_NORMAL self.default_color = curses.A_NORMAL self.ifCAREFUL_color = curses.A_UNDERLINE self.ifWARNING_color = A_BOLD self.ifCRITICAL_color = curses.A_REVERSE self.default_color2 = curses.A_NORMAL self.ifCAREFUL_color2 = curses.A_UNDERLINE self.ifWARNING_color2 = A_BOLD self.ifCRITICAL_color2 = curses.A_REVERSE # Define the colors list (hash table) for logged stats self.__colors_list = { 'DEFAULT': self.no_color, 'OK': self.default_color, 'CAREFUL': self.ifCAREFUL_color, 'WARNING': self.ifWARNING_color, 'CRITICAL': self.ifCRITICAL_color } # Define the colors list (hash table) for non logged stats self.__colors_list2 = { 'DEFAULT': self.no_color, 'OK': self.default_color2, 'CAREFUL': self.ifCAREFUL_color2, 'WARNING': self.ifWARNING_color2, 'CRITICAL': self.ifCRITICAL_color2 } # What are we going to display self.network_tag = network_tag self.sensors_tag = sensors_tag self.hddtemp_tag = hddtemp_tag self.diskio_tag = diskio_tag self.fs_tag = fs_tag self.log_tag = True self.help_tag = False self.percpu_tag = percpu_tag self.process_tag = process_tag self.net_byteps_tag = network_bytepersec_tag self.network_stats_combined = False self.network_stats_cumulative = False # Init main window self.term_window = self.screen.subwin(0, 0) # Init refresh time self.__refresh_time = refresh_time # Catch key pressed with non blocking mode self.term_window.keypad(1) self.term_window.nodelay(1) self.pressedkey = -1 def setProcessSortedBy(self, sorted): self.__process_sortedautoflag = False self.__process_sortedby = sorted def getProcessSortedBy(self): return self.__process_sortedby def __autoUnit(self, val, low_precision=False): """ Make a nice human readable string out of val Number of decimal places increases as quantity approaches 1 examples: CASE: 613421788 RESULT: 585M low_precision: 585M CASE: 5307033647 RESULT: 4.94G low_precision: 4.9G CASE: 44968414685 RESULT: 41.9G low_precision: 41.9G CASE: 838471403472 RESULT: 781G low_precision: 781G CASE: 9683209690677 RESULT: 8.81T low_precision: 8.8T CASE: 1073741824 RESULT: 1024M low_precision: 1024M CASE: 1181116006 RESULT: 1.10G low_precision: 1.1G parameter 'low_precision=True' returns less decimal places. potentially sacrificing precision for more readability """ symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') prefix = { 'Y': 1208925819614629174706176, 'Z': 1180591620717411303424, 'E': 1152921504606846976, 'P': 1125899906842624, 'T': 1099511627776, 'G': 1073741824, 'M': 1048576, 'K': 1024 } for key in reversed(symbols): value = float(val) / prefix[key] if value > 1: fixed_decimal_places = 0 if value < 10: fixed_decimal_places = 2 elif value < 100: fixed_decimal_places = 1 if low_precision: if key in 'MK': fixed_decimal_places = 0 else: fixed_decimal_places = min(1, fixed_decimal_places) elif key in 'K': fixed_decimal_places = 0 formatter = "{0:.%df}{1}" % fixed_decimal_places return formatter.format(value, key) return "{0!s}".format(val) def __getCpuAlert(self, current=0, max=100, stat=''): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL # stat is USER, SYSTEM or IOWAIT try: variable = (current * 100) / max except ZeroDivisionError: return 'DEFAULT' if variable > limits.getCPUCritical(stat=stat): return 'CRITICAL' elif variable > limits.getCPUWarning(stat=stat): return 'WARNING' elif variable > limits.getCPUCareful(stat=stat): return 'CAREFUL' return 'OK' def __getCpuColor(self, current=0, max=100, stat=''): return self.__colors_list[self.__getCpuAlert(current, max, stat)] def __getCpuColor2(self, current=0, max=100, stat=''): return self.__colors_list2[self.__getCpuAlert(current, max, stat)] def __getLoadAlert(self, current=0, core=1): # If current < CAREFUL*core of max then alert = OK # If current > CAREFUL*core of max then alert = CAREFUL # If current > WARNING*core of max then alert = WARNING # If current > CRITICAL*core of max then alert = CRITICAL if current > limits.getLOADCritical(core): return 'CRITICAL' elif current > limits.getLOADWarning(core): return 'WARNING' elif current > limits.getLOADCareful(core): return 'CAREFUL' return 'OK' def __getLoadColor(self, current=0, core=1): return self.__colors_list[self.__getLoadAlert(current, core)] def __getLoadColor2(self, current=0, core=1): return self.__colors_list2[self.__getLoadAlert(current, core)] def __getMemAlert(self, current=0, max=100): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL try: variable = (current * 100) / max except ZeroDivisionError: return 'DEFAULT' if variable > limits.getMEMCritical(): return 'CRITICAL' elif variable > limits.getMEMWarning(): return 'WARNING' elif variable > limits.getMEMCareful(): return 'CAREFUL' return 'OK' def __getMemColor(self, current=0, max=100): return self.__colors_list[self.__getMemAlert(current, max)] def __getMemColor2(self, current=0, max=100): return self.__colors_list2[self.__getMemAlert(current, max)] def __getSwapAlert(self, current=0, max=100): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL try: variable = (current * 100) / max except ZeroDivisionError: return 'DEFAULT' if variable > limits.getSWAPCritical(): return 'CRITICAL' elif variable > limits.getSWAPWarning(): return 'WARNING' elif variable > limits.getSWAPCareful(): return 'CAREFUL' return 'OK' def __getSwapColor(self, current=0, max=100): return self.__colors_list[self.__getSwapAlert(current, max)] def __getSwapColor2(self, current=0, max=100): return self.__colors_list2[self.__getSwapAlert(current, max)] def __getFsAlert(self, current=0, max=100): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL try: variable = (current * 100) / max except ZeroDivisionError: return 'DEFAULT' if variable > limits.getSWAPCritical(): return 'CRITICAL' elif variable > limits.getSWAPWarning(): return 'WARNING' elif variable > limits.getSWAPCareful(): return 'CAREFUL' return 'OK' def __getFsColor(self, current=0, max=100): return self.__colors_list[self.__getFsAlert(current, max)] def __getFsColor2(self, current=0, max=100): return self.__colors_list2[self.__getFsAlert(current, max)] def __getSensorsAlert(self, current=0): # Alert for Sensors (temperature in degre) # If current < CAREFUL then alert = OK # If current > CAREFUL then alert = CAREFUL # If current > WARNING then alert = WARNING # If current > CRITICALthen alert = CRITICAL if current > limits.getTEMPCritical(): return 'CRITICAL' elif current > limits.getTEMPWarning(): return 'WARNING' elif current > limits.getTEMPCareful(): return 'CAREFUL' return 'OK' def __getSensorsColor(self, current=0): """ Return color for Sensors temperature """ return self.__colors_list[self.__getSensorsAlert(current)] def __getSensorsColor2(self, current=0): """ Return color for Sensors temperature """ return self.__colors_list2[self.__getSensorsAlert(current)] def __getHDDTempAlert(self, current=0): # Alert for HDDTemp (temperature in degre) # If current < CAREFUL then alert = OK # If current > CAREFUL then alert = CAREFUL # If current > WARNING then alert = WARNING # If current > CRITICALthen alert = CRITICAL if current > limits.getHDDTEMPCritical(): return 'CRITICAL' elif current > limits.getHDDTEMPWarning(): return 'WARNING' elif current > limits.getHDDTEMPCareful(): return 'CAREFUL' return 'OK' def __getHDDTempColor(self, current=0): """ Return color for HDDTemp temperature """ return self.__colors_list[self.__getHDDTempAlert(current)] def __getHDDTempColor2(self, current=0): """ Return color for HDDTemp temperature """ return self.__colors_list2[self.__getHDDTempAlert(current)] def __getProcessAlert(self, current=0, max=100, stat='', core=1): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL # If stat == 'CPU', get core into account... try: variable = (current * 100) / max except ZeroDivisionError: return 'DEFAULT' if variable > limits.getProcessCritical(stat=stat, core=core): return 'CRITICAL' elif variable > limits.getProcessWarning(stat=stat, core=core): return 'WARNING' elif variable > limits.getProcessCareful(stat=stat, core=core): return 'CAREFUL' return 'OK' def __getProcessCpuColor(self, current=0, max=100, core=1): return self.__colors_list[self.__getProcessAlert(current, max, 'CPU', core)] def __getProcessCpuColor2(self, current=0, max=100, core=1): return self.__colors_list2[self.__getProcessAlert(current, max, 'CPU', core)] def __getProcessMemColor(self, current=0, max=100): return self.__colors_list[self.__getProcessAlert(current, max, 'MEM')] def __getProcessMemColor2(self, current=0, max=100): return self.__colors_list2[self.__getProcessAlert(current, max, 'MEM')] def __getMonitoredAlert(self, nbprocess=0, countmin=None, countmax=None): # If count is not defined, not monitoring the number of processes if countmin is None: countmin = nbprocess if countmax is None: countmax = nbprocess if nbprocess > 0: if int(countmin) <= int(nbprocess) <= int(countmax): return 'OK' else: return 'WARNING' else: if int(countmin) == 0: return 'OK' else: return 'CRITICAL' def __getMonitoredColor(self, nbprocess=0, countmin=1, countmax=1): return self.__colors_list2[self.__getMonitoredAlert(nbprocess, countmin, countmax)] def __getkey(self, window): """ A getKey function to catch ESC key AND Numlock key (issue #163) """ keycode = [0, 0] keycode[0] = window.getch() keycode[1] = window.getch() if keycode[0] == 27 and keycode[1] != -1: # Do not escape on specials keys return -1 else: return keycode[0] def __catchKey(self): # Get key #~ self.pressedkey = self.term_window.getch() self.pressedkey = self.__getkey(self.term_window) # Actions... if self.pressedkey == ord('\x1b') or self.pressedkey == ord('q'): # 'ESC'|'q' > Quit end() elif self.pressedkey == ord('1'): # '1' > Switch between CPU and PerCPU information self.percpu_tag = not self.percpu_tag elif self.pressedkey == ord('a'): # 'a' > Sort processes automatically self.setProcessSortedBy('auto') elif self.pressedkey == ord('b'): # 'b' > Switch between bit/s and Byte/s for network IO self.net_byteps_tag = not self.net_byteps_tag elif self.pressedkey == ord('c'): # 'c' > Sort processes by CPU usage self.setProcessSortedBy('cpu_percent') elif self.pressedkey == ord('d') and diskio_tag: # 'd' > Show/hide disk I/O stats self.diskio_tag = not self.diskio_tag elif self.pressedkey == ord('f') and fs_tag: # 'f' > Show/hide fs stats self.fs_tag = not self.fs_tag elif self.pressedkey == ord('h'): # 'h' > Show/hide help self.help_tag = not self.help_tag elif self.pressedkey == ord('i') and psutil_get_io_counter_tag: # 'i' > Sort processes by IO rate (not available on OS X) self.setProcessSortedBy('io_counters') elif self.pressedkey == ord('l'): # 'l' > Show/hide log messages self.log_tag = not self.log_tag elif self.pressedkey == ord('m'): # 'm' > Sort processes by MEM usage self.setProcessSortedBy('memory_percent') elif self.pressedkey == ord('n') and network_tag: # 'n' > Show/hide network stats self.network_tag = not self.network_tag elif self.pressedkey == ord('p'): # 'p' > Sort processes by name self.setProcessSortedBy('name') elif self.pressedkey == ord('s'): # 's' > Show/hide sensors stats (Linux-only) self.sensors_tag = not self.sensors_tag elif self.pressedkey == ord('t'): # 't' > View network traffic as combination self.network_stats_combined = not self.network_stats_combined elif self.pressedkey == ord('u'): # 'u' > View cumulative network IO self.network_stats_cumulative = not self.network_stats_cumulative elif self.pressedkey == ord('w'): # 'w' > Delete finished warning logs logs.clean() elif self.pressedkey == ord('x'): # 'x' > Delete finished warning and critical logs logs.clean(critical=True) elif self.pressedkey == ord('y'): # 'y' > Show/hide hddtemp stats self.hddtemp_tag = not self.hddtemp_tag # Return the key code return self.pressedkey def end(self): # Shutdown the curses window curses.echo() curses.nocbreak() curses.curs_set(1) curses.endwin() def display(self, stats, cs_status="None"): """ Display stats on the screen cs_status: "None": standalone or server mode "Connected": Client is connected to the server "Disconnected": Client is disconnected from the server """ # Get stats for processes (used in another functions for logs) processcount = stats.getProcessCount() processlist = stats.getProcessList(screen.getProcessSortedBy()) if not self.help_tag: # Display stats self.displaySystem(stats.getHost(), stats.getSystem()) cpu_offset = self.displayCpu(stats.getCpu(), stats.getPerCpu(), processlist) self.displayLoad(stats.getLoad(), stats.getCore(), processlist, cpu_offset) self.displayMem(stats.getMem(), stats.getMemSwap(), processlist, cpu_offset) network_count = self.displayNetwork(stats.getNetwork(), error=stats.network_error_tag) sensors_count = self.displaySensors(stats.getSensors(), self.network_y + network_count) hddtemp_count = self.displayHDDTemp(stats.getHDDTemp(), self.network_y + network_count + sensors_count) diskio_count = self.displayDiskIO(stats.getDiskIO(), offset_y=self.network_y + sensors_count + network_count + hddtemp_count, error=stats.diskio_error_tag) fs_count = self.displayFs(stats.getFs(), self.network_y + sensors_count + network_count + diskio_count + hddtemp_count) log_count = self.displayLog(self.network_y + sensors_count + network_count + diskio_count + fs_count + hddtemp_count) self.displayProcess(processcount, processlist, stats.getSortedBy(), log_count=log_count, core=stats.getCore(), cs_status=cs_status) self.displayCaption(cs_status=cs_status) self.displayHelp(core=stats.getCore()) self.displayBat(stats.getBatPercent()) self.displayNow(stats.getNow()) def erase(self): # Erase the content of the screen self.term_window.erase() def flush(self, stats, cs_status="None"): """ Clear and update screen cs_status: "None": standalone or server mode "Connected": Client is connected to the server "Disconnected": Client is disconnected from the server """ self.erase() self.display(stats, cs_status=cs_status) def update(self, stats, cs_status="None"): """ Update the screen and wait __refresh_time sec / catch key every 100 ms cs_status: "None": standalone or server mode "Connected": Client is connected to the server "Disconnected": Client is disconnected from the server """ # Flush display self.flush(stats, cs_status=cs_status) # Wait countdown = Timer(self.__refresh_time) while not countdown.finished(): # Getkey if self.__catchKey() > -1: # flush display self.flush(stats, cs_status=cs_status) # Wait 100ms... curses.napms(100) def displaySystem(self, host, system): # System information if not host or not system: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] if host['os_name'] == "Linux": system_msg = _("{0} {1} with {2} {3} on {4}").format( system['linux_distro'], system['platform'], system['os_name'], system['os_version'], host['hostname']) else: system_msg = _("{0} {1} {2} on {3}").format( system['os_name'], system['os_version'], system['platform'], host['hostname']) if (screen_y > self.system_y and screen_x > self.system_x + len(system_msg)): center = (screen_x // 2) - len(system_msg) // 2 self.term_window.addnstr(self.system_y, self.system_x + center, system_msg, 80, curses.A_UNDERLINE) def displayCpu(self, cpu, percpu, proclist): # Get screen size screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] # Is it possible to display extended stats ? # If yes then tag_extendedcpu = True tag_extendedcpu = screen_x > self.cpu_x + 79 + 14 # Is it possible to display per-CPU stats ? Do you want it ? # If yes then tag_percpu = True if self.percpu_tag: tag_percpu = screen_x > self.cpu_x + 79 + (len(percpu) - 1) * 10 else: tag_percpu = False # compute x offset if tag_percpu: offset_x = (len(percpu) - 1) * 8 elif tag_extendedcpu: offset_x = 16 else: offset_x = 0 # Log if cpu: logs.add(self.__getCpuAlert(cpu['user'], stat="USER"), "CPU user", cpu['user'], proclist) logs.add(self.__getCpuAlert(cpu['system'], stat="SYSTEM"), "CPU system", cpu['system'], proclist) if 'iowait' in cpu: logs.add(self.__getCpuAlert(cpu['iowait'], stat="IOWAIT"), "CPU IOwait", cpu['iowait'], proclist) # Display per-CPU stats if screen_y > self.cpu_y + 5 and tag_percpu: self.term_window.addnstr(self.cpu_y, self.cpu_x, _("PerCPU"), 6, self.title_color if self.hascolors else curses.A_UNDERLINE) if not percpu: self.term_window.addnstr(self.cpu_y + 1, self.cpu_x, _("Compute data..."), 15) return 0 self.term_window.addnstr(self.cpu_y + 1, self.cpu_x, _("user:"), 7) self.term_window.addnstr(self.cpu_y + 2, self.cpu_x, _("system:"), 7) if 'iowait' in percpu[0]: self.term_window.addnstr(self.cpu_y + 3, self.cpu_x, _("iowait:"), 7) else: self.term_window.addnstr(self.cpu_y + 3, self.cpu_x, _("idle:"), 7) for i in range(len(percpu)): # percentage of usage self.term_window.addnstr( self.cpu_y, self.cpu_x + 8 + i * 8, format((100 - percpu[i]['idle']) / 100, '>6.1%'), 6) # user self.term_window.addnstr( self.cpu_y + 1, self.cpu_x + 8 + i * 8, format(percpu[i]['user'] / 100, '>6.1%'), 6, self.__getCpuColor2(percpu[i]['user'], stat='user')) # system self.term_window.addnstr( self.cpu_y + 2, self.cpu_x + 8 + i * 8, format(percpu[i]['system'] / 100, '>6.1%'), 6, self.__getCpuColor2(percpu[i]['system'], stat='system')) # If the IOWait stat is available then display it # else display the IDLE stat if 'iowait' in percpu[i]: # iowait self.term_window.addnstr( self.cpu_y + 3, self.cpu_x + 8 + i * 8, format(percpu[i]['iowait'] / 100, '>6.1%'), 6, self.__getCpuColor2(percpu[i]['iowait'], stat='iowait')) else: # idle self.term_window.addnstr( self.cpu_y + 3, self.cpu_x + 8 + i * 8, format(percpu[i]['idle'] / 100, '>6.1%'), 6) # display CPU summary information elif screen_y > self.cpu_y + 5 and screen_x > self.cpu_x + 18: self.term_window.addnstr(self.cpu_y, self.cpu_x, _("CPU"), 3, self.title_color if self.hascolors else curses.A_UNDERLINE) if not cpu: self.term_window.addnstr(self.cpu_y + 1, self.cpu_x, _("Compute data..."), 15) return 0 # percentage of usage cpu_percent = (100 - cpu['idle']) / 100 self.term_window.addnstr(self.cpu_y, self.cpu_x + 8, format(cpu_percent, '>6.1%'), 6) y = 1 # user self.term_window.addnstr(self.cpu_y + y, self.cpu_x, _("user:"), 5) self.term_window.addnstr(self.cpu_y + y, self.cpu_x + 8, format(cpu['user'] / 100, '>6.1%'), 6, self.__getCpuColor(cpu['user'], stat='user')) y += 1 # system if 'system' in cpu: self.term_window.addnstr(self.cpu_y + y, self.cpu_x, _("system:"), 7) self.term_window.addnstr(self.cpu_y + y, self.cpu_x + 8, format(cpu['system'] / 100, '>6.1%'), 6, self.__getCpuColor(cpu['system'], stat='system')) y += 1 # idle self.term_window.addnstr(self.cpu_y + y, self.cpu_x, _("idle:"), 5) self.term_window.addnstr(self.cpu_y + y, self.cpu_x + 8, format(cpu['idle'] / 100, '>6.1%'), 6) y += 1 # display extended CPU stats when space is available if screen_y > self.cpu_y + 5 and tag_extendedcpu: y = 1 if 'nice' in cpu: # nice self.term_window.addnstr(self.cpu_y + y, self.cpu_x + 16, _("nice:"), 5) self.term_window.addnstr( self.cpu_y + y, self.cpu_x + 24, format(cpu['nice'] / 100, '>6.1%'), 6) y += 1 if 'iowait' in cpu: # iowait (Linux) self.term_window.addnstr(self.cpu_y + y, self.cpu_x + 16, _("iowait:"), 7) self.term_window.addnstr( self.cpu_y + y, self.cpu_x + 24, format(cpu['iowait'] / 100, '>6.1%'), 6, self.__getCpuColor(cpu['iowait'], stat='iowait')) y += 1 if 'irq' in cpu: # irq (Linux, FreeBSD) self.term_window.addnstr(self.cpu_y + 3, self.cpu_x + 16, _("irq:"), 4) self.term_window.addnstr( self.cpu_y + 3, self.cpu_x + 24, format(cpu['irq'] / 100, '>6.1%'), 6) y += 1 # return the x offset to display load return offset_x def displayLoad(self, load, core, proclist, offset_x=0): # Load % if not load: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] loadblocksize = 15 if (screen_y > self.load_y + 5 and screen_x > self.load_x + offset_x + loadblocksize): self.term_window.addnstr(self.load_y, self.load_x + offset_x, _("Load"), 4, self.title_color if self.hascolors else curses.A_UNDERLINE) self.term_window.addnstr(self.load_y, self.load_x + offset_x + 7, str(core) + _("-core"), 7) # 1 min self.term_window.addnstr(self.load_y + 1, self.load_x + offset_x, _("1 min:"), 6) self.term_window.addnstr(self.load_y + 1, self.load_x + offset_x + 8, format(load['min1'], '>5.2f'), 5) # 5 min self.term_window.addnstr(self.load_y + 2, self.load_x + offset_x, _("5 min:"), 6) alert = self.__getLoadAlert(load['min5'], core) logs.add(alert, "LOAD 5-min", load['min5'], proclist) self.term_window.addnstr(self.load_y + 2, self.load_x + offset_x + 8, format(load['min5'], '>5.2f'), 5, self.__getLoadColor(load['min5'], core)) # 15 min self.term_window.addnstr(self.load_y + 3, self.load_x + offset_x, _("15 min:"), 7) alert = self.__getLoadAlert(load['min15'], core) logs.add(alert, "LOAD 15-min", load['min15'], proclist) self.term_window.addnstr(self.load_y + 3, self.load_x + offset_x + 8, format(load['min15'], '>5.2f'), 5, self.__getLoadColor(load['min15'], core)) # return the x offset to display mem return offset_x def displayMem(self, mem, memswap, proclist, offset_x=0): # Memory if not mem: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] memblocksize = 45 extblocksize = 15 # get the psutil version installed on the server, if in client mode if client_tag: server_psutil_version = stats.getPsutilVersion() else: server_psutil_version = "" if (screen_y > self.mem_y + 5 and screen_x > self.mem_x + offset_x + memblocksize - extblocksize): # RAM self.term_window.addnstr(self.mem_y, self.mem_x + offset_x, _("Mem"), 8, self.title_color if self.hascolors else curses.A_UNDERLINE) # percentage of usage self.term_window.addnstr(self.mem_y, self.mem_x + offset_x + 6, format(mem['percent'] / 100, '>6.1%'), 6) # total self.term_window.addnstr(self.mem_y + 1, self.mem_x + offset_x, _("total:"), 6) self.term_window.addnstr( self.mem_y + 1, self.mem_x + offset_x + 7, format(self.__autoUnit(mem['total']), '>5'), 5) # used alert = self.__getMemAlert(mem['used'], mem['total']) logs.add(alert, "MEM real", mem['used'], proclist) self.term_window.addnstr(self.mem_y + 2, self.mem_x + offset_x, _("used:"), 5) self.term_window.addnstr( self.mem_y + 2, self.mem_x + offset_x + 7, format(self.__autoUnit(mem['used']), '>5'), 5, self.__getMemColor(mem['used'], mem['total'])) # free self.term_window.addnstr(self.mem_y + 3, self.mem_x + offset_x, _("free:"), 5) self.term_window.addnstr( self.mem_y + 3, self.mem_x + offset_x + 7, format(self.__autoUnit(mem['free']), '>5'), 5) # Display extended informations if space is available y = 0 if screen_x > self.mem_x + offset_x + memblocksize: # active and inactive (UNIX; only available for psutil >= 0.6) if not is_Windows: if server_psutil_version >= '0.6.0' or psutil_mem_vm: self.term_window.addnstr(self.mem_y + y, self.mem_x + offset_x + 14, _("active:"), 7) self.term_window.addnstr( self.mem_y + y, self.mem_x + offset_x + 24, format(self.__autoUnit(mem['active']), '>5'), 5) y += 1 self.term_window.addnstr(self.mem_y + y, self.mem_x + offset_x + 14, _("inactive:"), 9) self.term_window.addnstr( self.mem_y + y, self.mem_x + offset_x + 24, format(self.__autoUnit(mem['inactive']), '>5'), 5) y += 1 # buffers & cached (Linux, BSD) if is_Linux or is_BSD: self.term_window.addnstr(self.mem_y + y, self.mem_x + offset_x + 14, _("buffers:"), 8) self.term_window.addnstr( self.mem_y + y, self.mem_x + offset_x + 24, format(self.__autoUnit(mem['buffers']), '>5'), 5) y += 1 self.term_window.addnstr(self.mem_y + y, self.mem_x + offset_x + 14, _("cached:"), 7) self.term_window.addnstr( self.mem_y + y, self.mem_x + offset_x + 24, format(self.__autoUnit(mem['cached']), '>5'), 5) y += 1 else: # If space is NOT available then mind the gap... offset_x -= extblocksize if not memswap: # If there is no swap stat, then do not display it return 0 if memswap['total'] == 0: # If swap is null, then do not display it return 0 # Swap self.term_window.addnstr(self.mem_y, self.mem_x + offset_x + 32, _("Swap"), 4, self.title_color if self.hascolors else curses.A_UNDERLINE) # percentage of usage self.term_window.addnstr( self.mem_y, self.mem_x + offset_x + 38, format(memswap['percent'] / 100, '>6.1%'), 6) # total self.term_window.addnstr(self.mem_y + 1, self.mem_x + offset_x + 32, _("total:"), 6) self.term_window.addnstr( self.mem_y + 1, self.mem_x + offset_x + 39, format(self.__autoUnit(memswap['total']), '>5'), 8) # used alert = self.__getSwapAlert(memswap['used'], memswap['total']) logs.add(alert, "MEM swap", memswap['used'], proclist) self.term_window.addnstr(self.mem_y + 2, self.mem_x + offset_x + 32, _("used:"), 5) self.term_window.addnstr( self.mem_y + 2, self.mem_x + offset_x + 39, format(self.__autoUnit(memswap['used']), '>5'), 8, self.__getSwapColor(memswap['used'], memswap['total'])) # free self.term_window.addnstr(self.mem_y + 3, self.mem_x + offset_x + 32, _("free:"), 5) self.term_window.addnstr( self.mem_y + 3, self.mem_x + offset_x + 39, format(self.__autoUnit(memswap['free']), '>5'), 8) def displayNetwork(self, network, error=False): """ Display the network interface bitrate If error = True, then display a grab error message Return the number of interfaces """ if not self.network_tag: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] if screen_y > self.network_y + 3 and screen_x > self.network_x + 28: self.term_window.addnstr(self.network_y, self.network_x, _("Network"), 7, self.title_color if self.hascolors else curses.A_UNDERLINE) if self.network_stats_combined: column_name = "Rx+Tx" if not self.network_stats_cumulative: column_name += "/s" self.term_window.addnstr(self.network_y, self.network_x + 10, format(_(column_name), '>13'), 13) else: rx_column_name = "Rx" tx_column_name = "Tx" if not self.network_stats_cumulative: rx_column_name += "/s" tx_column_name += "/s" self.term_window.addnstr(self.network_y, self.network_x + 10, format(_(rx_column_name), '>5'), 5) self.term_window.addnstr(self.network_y, self.network_x + 18, format(_(tx_column_name), '>5'), 5) if error: # If there is a grab error self.term_window.addnstr(self.network_y + 1, self.network_x, _("Cannot grab data..."), 20) return 3 elif not network: # or no data to display... self.term_window.addnstr(self.network_y + 1, self.network_x, _("Compute data..."), 15) return 3 # Adapt the maximum interface to the screen ret = 2 net_num = min(screen_y - self.network_y - 3, len(network)) for i in range(0, net_num): elapsed_time = max(1, self.__refresh_time) # network interface name #~ ifname = network[i]['interface_name'].encode('ascii', 'ignore').split(':')[0] ifname = network[i]['interface_name'].split(':')[0] if len(ifname) > 8: ifname = '_' + ifname[-8:] self.term_window.addnstr(self.network_y + 1 + i, self.network_x, ifname, 8) # Byte/s or bit/s if self.net_byteps_tag: rx_per_sec = self.__autoUnit(network[i]['rx'] // elapsed_time) tx_per_sec = self.__autoUnit(network[i]['tx'] // elapsed_time) # Combined, or total network traffic # cx is combined rx + tx cx_per_sec = self.__autoUnit(network[i]['cx'] // elapsed_time) cumulative_rx = self.__autoUnit(network[i]['cumulative_rx']) cumulative_tx = self.__autoUnit(network[i]['cumulative_tx']) cumulative_cx = self.__autoUnit(network[i]['cumulative_cx']) else: rx_per_sec = self.__autoUnit( network[i]['rx'] // elapsed_time * 8) + "b" tx_per_sec = self.__autoUnit( network[i]['tx'] // elapsed_time * 8) + "b" # cx is combined rx + tx cx_per_sec = self.__autoUnit( network[i]['cx'] // elapsed_time * 8) + "b" cumulative_rx = self.__autoUnit( network[i]['cumulative_rx'] * 8) + "b" cumulative_tx = self.__autoUnit( network[i]['cumulative_tx'] * 8) + "b" cumulative_cx = self.__autoUnit( network[i]['cumulative_cx'] * 8) + "b" if self.network_stats_cumulative: rx = cumulative_rx tx = cumulative_tx cx = cumulative_cx else: rx = rx_per_sec tx = tx_per_sec cx = cx_per_sec if not self.network_stats_combined: # rx/s self.term_window.addnstr(self.network_y + 1 + i, self.network_x + 8, format(rx, '>7'), 7) # tx/s self.term_window.addnstr(self.network_y + 1 + i, self.network_x + 16, format(tx, '>7'), 7) else: # cx/s (Combined, or total) self.term_window.addnstr(self.network_y + 1 + i, self.network_x + 16, format(cx, '>7'), 7) ret = ret + 1 return ret return 0 def displaySensors(self, sensors, offset_y=0): """ Display the sensors stats (Linux-only) Return the number of sensors stats """ if not self.sensors_tag or not sensors: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] self.sensors_y = offset_y if screen_y > self.sensors_y + 3 and screen_x > self.sensors_x + 28: # Sensors header self.term_window.addnstr(self.sensors_y, self.sensors_x, _("Sensors"), 7, self.title_color if self.hascolors else curses.A_UNDERLINE) self.term_window.addnstr(self.sensors_y, self.sensors_x + 21, format(_("°C"), '>3'), 3) # Adapt the maximum interface to the screen ret = 2 sensors_num = min(screen_y - self.sensors_y - 3, len(sensors)) for i in range(0, sensors_num): self.term_window.addnstr( self.sensors_y + 1 + i, self.sensors_x, sensors[i]['label'], 21) self.term_window.addnstr( self.sensors_y + 1 + i, self.sensors_x + 20, format(sensors[i]['value'], '>3'), 3, self.__getSensorsColor(sensors[i]['value'])) ret = ret + 1 return ret return 0 def displayHDDTemp(self, hddtemp, offset_y=0): """ Display the hddtemp stats Return the number of hddtemp stats """ if not self.hddtemp_tag or not hddtemp: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] self.hddtemp_y = offset_y if screen_y > self.hddtemp_y + 3 and screen_x > self.hddtemp_x + 28: # hddtemp header self.term_window.addnstr(self.hddtemp_y, self.hddtemp_x, _("HDD Temp"), 8, self.title_color if self.hascolors else curses.A_UNDERLINE) self.term_window.addnstr(self.hddtemp_y, self.hddtemp_x + 21, format(_("°C"), '>3'), 3) # Adapt the maximum interface to the screen ret = 2 hddtemp_num = min(screen_y - self.hddtemp_y - 3, len(hddtemp)) for i in range(0, hddtemp_num): self.term_window.addnstr( self.hddtemp_y + 1 + i, self.hddtemp_x, hddtemp[i]['label'], 21) self.term_window.addnstr( self.hddtemp_y + 1 + i, self.hddtemp_x + 20, format(hddtemp[i]['value'], '>3'), 3, self.__getHDDTempColor(hddtemp[i]['value'])) ret = ret + 1 return ret return 0 def displayDiskIO(self, diskio, offset_y=0, error=False): # Disk input/output rate if not self.diskio_tag: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] self.diskio_y = offset_y if screen_y > self.diskio_y + 3 and screen_x > self.diskio_x + 28: self.term_window.addnstr(self.diskio_y, self.diskio_x, _("Disk I/O"), 8, self.title_color if self.hascolors else curses.A_UNDERLINE) self.term_window.addnstr(self.diskio_y, self.diskio_x + 10, format(_("In/s"), '>5'), 5) self.term_window.addnstr(self.diskio_y, self.diskio_x + 18, format(_("Out/s"), '>5'), 5) if error: # If there is a grab error self.term_window.addnstr(self.diskio_y + 1, self.diskio_x, _("Cannot grab data..."), 20) return 3 elif not diskio: # or no data to display... self.term_window.addnstr(self.diskio_y + 1, self.diskio_x, _("Compute data..."), 15) return 3 # Adapt the maximum disk to the screen disk = 0 disk_num = min(screen_y - self.diskio_y - 3, len(diskio)) for disk in range(0, disk_num): elapsed_time = max(1, self.__refresh_time) # partition name self.term_window.addnstr( self.diskio_y + 1 + disk, self.diskio_x, diskio[disk]['disk_name'], 8) # in/s ins = diskio[disk]['write_bytes'] // elapsed_time self.term_window.addnstr( self.diskio_y + 1 + disk, self.diskio_x + 10, format(self.__autoUnit(ins), '>5'), 5) # out/s outs = diskio[disk]['read_bytes'] // elapsed_time self.term_window.addnstr( self.diskio_y + 1 + disk, self.diskio_x + 18, format(self.__autoUnit(outs), '>5'), 5) return disk + 3 return 0 def displayFs(self, fs, offset_y=0): # Filesystem stats if not fs or not self.fs_tag: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] self.fs_y = offset_y if screen_y > self.fs_y + 3 and screen_x > self.fs_x + 28: self.term_window.addnstr(self.fs_y, self.fs_x, _("Mount"), 5, self.title_color if self.hascolors else curses.A_UNDERLINE) self.term_window.addnstr(self.fs_y, self.fs_x + 9, format(_("Used"), '>6'), 6) self.term_window.addnstr(self.fs_y, self.fs_x + 17, format(_("Total"), '>6'), 6) # Adapt the maximum disk to the screen mounted = 0 fs_num = min(screen_y - self.fs_y - 3, len(fs)) for mounted in range(0, fs_num): # mount point if len(fs[mounted]['mnt_point']) > 8: self.term_window.addnstr( self.fs_y + 1 + mounted, self.fs_x, '_' + fs[mounted]['mnt_point'][-7:], 8) else: self.term_window.addnstr( self.fs_y + 1 + mounted, self.fs_x, fs[mounted]['mnt_point'], 8) # used self.term_window.addnstr( self.fs_y + 1 + mounted, self.fs_x + 9, format(self.__autoUnit(fs[mounted]['used']), '>6'), 6, self.__getFsColor2(fs[mounted]['used'], fs[mounted]['size'])) # total self.term_window.addnstr( self.fs_y + 1 + mounted, self.fs_x + 17, format(self.__autoUnit(fs[mounted]['size']), '>6'), 6) return mounted + 3 return 0 def displayLog(self, offset_y=0): # Logs if logs.len() == 0 or not self.log_tag: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] self.log_y = offset_y if screen_y > self.log_y + 3 and screen_x > self.log_x + 79: self.log_y = max(offset_y, screen_y - 3 - min(offset_y - 3, screen_y - self.log_y, logs.len())) logtodisplay_count = min(screen_y - self.log_y - 3, logs.len()) logmsg = _("WARNING|CRITICAL logs") if logtodisplay_count > 1: logmsg += (_(" (lasts ") + str(logtodisplay_count) + _(" entries)")) else: logmsg += _(" (one entry)") self.term_window.addnstr(self.log_y, self.log_x, logmsg, 79, self.title_color if self.hascolors else curses.A_UNDERLINE) # Adapt the maximum log to the screen logcount = 0 log = logs.get() for logcount in range(0, logtodisplay_count): logmsg = " " + str(datetime.fromtimestamp(log[logcount][0])) if log[logcount][1] > 0: logmark = ' ' logmsg += (" > " + str(datetime.fromtimestamp(log[logcount][1]))) else: logmark = '~' logmsg += " > " + "%19s" % "___________________" if log[logcount][3][:3] == "MEM": # Special display for MEMORY logmsg += " {0} ({1}/{2}/{3})".format( log[logcount][3], self.__autoUnit(log[logcount][6]), self.__autoUnit(log[logcount][5]), self.__autoUnit(log[logcount][4])) elif log[logcount][3][:3] == "MON": # Special display for monitored pocesses list if (log[logcount][5] == 0): logmsg += " No running process" elif (log[logcount][5] == 1): logmsg += " One running process" else: logmsg += " {0} running processes".format( self.__autoUnit(log[logcount][5])) else: logmsg += " {0} ({1:.1f}/{2:.1f}/{3:.1f})".format( log[logcount][3], log[logcount][6], log[logcount][5], log[logcount][4]) # Add the monitored process description if log[logcount][10] != "": logmsg += " - {0}".format(log[logcount][10]) elif log[logcount][9] != []: # Add top processes log_proc_name = log[logcount][9][0]['name'] logmsg += " - Top process: {0}".format(log_proc_name) # Display the log self.term_window.addnstr(self.log_y + 1 + logcount, self.log_x, logmsg, len(logmsg)) self.term_window.addnstr(self.log_y + 1 + logcount, self.log_x, logmark, 1, self.__colors_list[log[logcount][2]]) return logcount + 3 return 0 def getProcessColumnColor(self, column, sortedby): """ Return the Process title colr depending of: self.getProcessSortedBy() -> User sort choice sortedby -> System last sort """ if self.getProcessSortedBy() == 'auto' and sortedby == column: return curses.A_UNDERLINE elif self.getProcessSortedBy() == column: return self.title_color if self.hascolors else curses.A_UNDERLINE else: return 0 def displayProcess(self, processcount, processlist, sortedby='', log_count=0, core=1, cs_status="None"): """ Display the processese: * summary * monitored processes list (optionnal) * processes detailed list cs_status: "None": standalone or server mode "Connected": Client is connected to the server "Disconnected": Client is disconnected from the server """ # Process if not processcount: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] # If there is no network & diskio & fs & sensors stats & hddtemp stats # then increase process window if (not self.network_tag and not self.diskio_tag and not self.fs_tag and not self.sensors_tag and not self.hddtemp_tag): process_x = 0 else: process_x = self.process_x #****************** # Processes summary #****************** if not self.process_tag: self.term_window.addnstr(self.process_y, process_x, _("Processes (disabled)"), 20, self.title_color if self.hascolors else curses.A_UNDERLINE) return 0 if screen_y > self.process_y + 4 and screen_x > process_x + 48: self.term_window.addnstr(self.process_y, process_x, _("Processes"), 9, self.title_color if self.hascolors else curses.A_UNDERLINE) other = (processcount['total'] - stats.getProcessCount()['running'] - stats.getProcessCount()['sleeping']) self.term_window.addnstr( self.process_y, process_x + 10, '{0:>3}, {1:>2} {2}, {3:>3} {4}, {5:>2} {6}'.format( str(processcount['total']), str(processcount['running']), _("running"), str(processcount['sleeping']), _("sleeping"), str(other), _("other")), 42) # Sort info # self.getProcessSortedBy() -> User sort choice # sortedby -> System last sort if self.getProcessSortedBy() == 'auto': sortmsg = _("sorted automatically") else: sortmsg = _("sorted by ") + sortedby if (screen_y > self.process_y + 4 and screen_x > process_x + 49 + len(sortmsg)): self.term_window.addnstr(self.process_y, 76, sortmsg, len(sortmsg)) #************************* # Monitored processes list #************************* monitor_y = self.process_y if (len(monitors) > 0 and screen_y > self.process_y + 5 + len(monitors) and screen_x > process_x + 49): # Add space between process summary and monitored processes list monitor_y += 1 item = 0 for processes in monitors: # Display the monitored processes list (one line per monitored processes) monitor_y += 1 # Search monitored processes by a regular expression monitoredlist = [p for p in processlist if re.search(monitors.regex(item), p['cmdline']) is not None] # Build and print non optional message monitormsg1 = "{0:>16} {1:3} {2:13}".format( monitors.description(item)[0:15], len(monitoredlist) if len(monitoredlist) > 1 else "", _("RUNNING") if len(monitoredlist) > 0 else _("NOT RUNNING")) self.term_window.addnstr(monitor_y, self.process_x, monitormsg1, screen_x - process_x, self.__getMonitoredColor(len(monitoredlist), monitors.countmin(item), monitors.countmax(item))) # Build and print optional message if len(monitoredlist) > 0: if (cs_status.lower() == "none" and monitors.command(item) is not None): # Execute the user command line try: cmdret = subprocess.check_output(monitors.command(item), shell=True) except subprocess.CalledProcessError: cmdret = _("Error: ") + monitors.command(item) except Exception: cmdret = _("Cannot execute command") else: # By default display CPU and MEM % cmdret = "CPU: {0:.1f}% / MEM: {1:.1f}%".format( sum([p['cpu_percent'] for p in monitoredlist]), sum([p['memory_percent'] for p in monitoredlist])) else: cmdret = "" # cmdret = "{0} / {1} / {2}".format(len(monitoredlist), # monitors.countmin(item), # monitors.countmax(item)) monitormsg2 = "{0}".format(cmdret) self.term_window.addnstr(monitor_y, self.process_x + 35, monitormsg2, screen_x - process_x - 35) # Generate log logs.add(self.__getMonitoredAlert(len(monitoredlist), monitors.countmin(item), monitors.countmax(item)), "MON_" + str(item + 1), len(monitoredlist), proc_list=monitoredlist, proc_desc=monitors.description(item)) # Next... item += 1 #***************** # Processes detail #***************** if screen_y > monitor_y + 4 and screen_x > process_x + 49: tag_pid = False tag_uid = False tag_nice = False tag_status = False tag_proc_time = False tag_io = False # tag_tcpudp = False if screen_x > process_x + 55: tag_pid = True if screen_x > process_x + 64: tag_uid = True if screen_x > process_x + 70: tag_nice = True if screen_x > process_x + 74: tag_status = True if screen_x > process_x + 77: tag_proc_time = True if screen_x > process_x + 92: tag_io = True if not psutil_get_io_counter_tag: tag_io = False # if screen_x > process_x + 107: # tag_tcpudp = True # VMS self.term_window.addnstr( monitor_y + 2, process_x, format(_("VIRT"), '>5'), 5) # RSS self.term_window.addnstr( monitor_y + 2, process_x + 6, format(_("RES"), '>5'), 5) # CPU% self.term_window.addnstr( monitor_y + 2, process_x + 12, format(_("CPU%"), '>5'), 5, self.getProcessColumnColor('cpu_percent', sortedby)) # MEM% self.term_window.addnstr( monitor_y + 2, process_x + 18, format(_("MEM%"), '>5'), 5, self.getProcessColumnColor('memory_percent', sortedby)) process_name_x = 24 # If screen space (X) is available then: # PID if tag_pid: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, format(_("PID"), '>5'), 5) process_name_x += 6 # UID if tag_uid: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, _("USER"), 4) process_name_x += 11 # NICE if tag_nice: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, format(_("NI"), '>3'), 3) process_name_x += 4 # STATUS if tag_status: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, _("S"), 1) process_name_x += 2 # TIME+ if tag_proc_time: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, format(_("TIME+"), '>8'), 8) process_name_x += 9 # IO if tag_io: self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, format(_("IOR/s"), '>5'), 5, self.getProcessColumnColor('io_counters', sortedby)) process_name_x += 6 self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, format(_("IOW/s"), '>5'), 5, self.getProcessColumnColor('io_counters', sortedby)) process_name_x += 6 # TCP/UDP # if tag_tcpudp: # self.term_window.addnstr( # monitor_y + 2, process_x + process_name_x, # format(_("TCP"), '>5'), 5, # self.getProcessColumnColor('tcp', sortedby)) # process_name_x += 6 # self.term_window.addnstr( # monitor_y + 2, process_x + process_name_x, # format(_("UDP"), '>5'), 5, # self.getProcessColumnColor('udp', sortedby)) # process_name_x += 6 # PROCESS NAME self.term_window.addnstr( monitor_y + 2, process_x + process_name_x, _("NAME"), 12, curses.A_UNDERLINE if sortedby == 'name' else 0) # If there is no data to display... if not processlist: self.term_window.addnstr(monitor_y + 3, self.process_x, _("Compute data..."), 15) return 6 # Display the processes list # How many processes are going to be displayed ? proc_num = min(screen_y - monitor_y - log_count - 5, len(processlist)) # Loop to display processes for processes in range(0, proc_num): # VMS process_size = processlist[processes]['memory_info'][1] self.term_window.addnstr( monitor_y + 3 + processes, process_x, format(self.__autoUnit(process_size, low_precision=True), '>5'), 5) # RSS process_resident = processlist[processes]['memory_info'][0] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 6, format(self.__autoUnit(process_resident, low_precision=True), '>5'), 5) # CPU% cpu_percent = processlist[processes]['cpu_percent'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 12, format(cpu_percent, '>5.1f'), 5, self.__getProcessCpuColor2(cpu_percent, core=core)) # MEM% memory_percent = processlist[processes]['memory_percent'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 18, format(memory_percent, '>5.1f'), 5, self.__getProcessMemColor2(memory_percent)) # If screen space (X) is available then: # PID if tag_pid: pid = processlist[processes]['pid'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 24, format(str(pid), '>5'), 5) # UID if tag_uid: uid = processlist[processes]['username'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 30, str(uid), 9) # NICE if tag_nice: nice = processlist[processes]['nice'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 41, format(str(nice), '>3'), 3) # STATUS if tag_status: status = processlist[processes]['status'] self.term_window.addnstr( monitor_y + 3 + processes, process_x + 45, str(status), 1) # TIME+ if tag_proc_time: process_time = processlist[processes]['cpu_times'] try: dtime = timedelta(seconds=sum(process_time)) except Exception: # Catched on some Amazon EC2 server # See https://github.com/nicolargo/glances/issues/87 tag_proc_time = False else: dtime = "{0}:{1}.{2}".format( str(dtime.seconds // 60 % 60), str(dtime.seconds % 60).zfill(2), str(dtime.microseconds)[:2].zfill(2)) self.term_window.addnstr( monitor_y + 3 + processes, process_x + 47, format(dtime, '>8'), 8) # IO # Hack to allow client 1.6 to connect to server 1.5.2 process_tag_io = True try: if processlist[processes]['io_counters'][4] == 0: process_tag_io = True except Exception: process_tag_io = False if tag_io: if not process_tag_io: # If io_tag == 0 (['io_counters'][4]) # then do not diplay IO rate self.term_window.addnstr( monitor_y + 3 + processes, process_x + 56, format("?", '>5'), 5) self.term_window.addnstr( monitor_y + 3 + processes, process_x + 62, format("?", '>5'), 5) else: # If io_tag == 1 (['io_counters'][4]) # then diplay IO rate io_read = processlist[processes]['io_counters'][0] io_read_old = processlist[processes]['io_counters'][2] io_write = processlist[processes]['io_counters'][1] io_write_old = processlist[processes]['io_counters'][3] elapsed_time = max(1, self.__refresh_time) io_rs = (io_read - io_read_old) / elapsed_time io_ws = (io_write - io_write_old) / elapsed_time self.term_window.addnstr( monitor_y + 3 + processes, process_x + 56, format(self.__autoUnit(io_rs, low_precision=True), '>5'), 5) self.term_window.addnstr( monitor_y + 3 + processes, process_x + 62, format(self.__autoUnit(io_ws, low_precision=True), '>5'), 5) # TCP/UDP connexion number # if tag_tcpudp: # try: # processlist[processes]['tcp'] # processlist[processes]['udp'] # except: # pass # else: # self.term_window.addnstr( # monitor_y + 3 + processes, process_x + 68, # format(processlist[processes]['tcp'], '>5'), 5) # self.term_window.addnstr( # monitor_y + 3 + processes, process_x + 74, # format(processlist[processes]['udp'], '>5'), 5) # Display process command line max_process_name = screen_x - process_x - process_name_x process_name = processlist[processes]['name'] process_cmdline = processlist[processes]['cmdline'] if (len(process_cmdline) > max_process_name or len(process_cmdline) == 0): command = process_name else: command = process_cmdline self.term_window.addnstr(monitor_y + 3 + processes, process_x + process_name_x, command, max_process_name) def displayCaption(self, cs_status="None"): """ Display the caption (bottom left) cs_status: "None": standalone or server mode "Connected": Client is connected to the server "Disconnected": Client is disconnected from the server """ screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] if client_tag: if cs_status.lower() == "connected": msg_client = _("Connected to ") + format(server_ip) msg_client_style = self.default_color2 if self.hascolors else curses.A_UNDERLINE elif cs_status.lower() == "disconnected": msg_client = _("Disconnected from ") + format(server_ip) msg_client_style = self.ifCRITICAL_color2 if self.hascolors else curses.A_UNDERLINE msg_help = _("Press 'h' for help") if client_tag: if (screen_y > self.caption_y and screen_x > self.caption_x + len(msg_client)): self.term_window.addnstr(max(self.caption_y, screen_y - 1), self.caption_x, msg_client, len(msg_client), msg_client_style) if screen_x > self.caption_x + len(msg_client) + 3 + len(msg_help): self.term_window.addnstr(max(self.caption_y, screen_y - 1), self.caption_x + len(msg_client), ' | ' + msg_help, 3 + len(msg_help)) else: if (screen_y > self.caption_y and screen_x > self.caption_x + len(msg_help)): self.term_window.addnstr(max(self.caption_y, screen_y - 1), self.caption_x, msg_help, len(msg_help)) def displayHelp(self, core): """ Show the help panel """ if not self.help_tag: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] if screen_y > self.help_y + 23 and screen_x > self.help_x + 79: # Console 80x24 is mandatory to display the help message self.erase() try: self.term_window.addnstr( self.help_y, self.help_x, _("Glances {0} with PsUtil {1}").format( self.__version, psutil.__version__), 79, self.title_color if self.hascolors else 0) except Exception: self.term_window.addnstr( self.help_y, self.help_x, _("Glances {0}").format(self.__version), 79, self.title_color if self.hascolors else 0) # display the limits table limits_table_x = self.help_x limits_table_y = self.help_y + 1 self.term_window.addnstr(limits_table_y, limits_table_x + 18, format(_("OK"), '^8'), 8, self.default_color) self.term_window.addnstr(limits_table_y, limits_table_x + 26, format(_("CAREFUL"), '^8'), 8, self.ifCAREFUL_color), self.term_window.addnstr(limits_table_y, limits_table_x + 34, format(_("WARNING"), '^8'), 8, self.ifWARNING_color), self.term_window.addnstr(limits_table_y, limits_table_x + 42, format(_("CRITICAL"), '^8'), 8, self.ifCRITICAL_color), # display the stat labels stat_labels = [_("CPU user %"), _("CPU system %"), _("CPU iowait %"), _("Load"), _("RAM memory %"), _("Swap memory %"), _("Temp °C"), _("HDD Temp °C"), _("Filesystem %"), _("CPU process %"), _("MEM process %")] width = 8 limits_table_x = self.help_x + 2 limits_table_y = self.help_y + 2 for label in stat_labels: self.term_window.addnstr(limits_table_y, limits_table_x, format(label, '<14'), 14) limits_table_y += 1 # display the limit values limit_values = [[0, limits.getCPUCareful(stat='user'), limits.getCPUWarning(stat='user'), limits.getCPUCritical(stat='user')], [0, limits.getCPUCareful(stat='system'), limits.getCPUWarning(stat='system'), limits.getCPUCritical(stat='system')], [0, limits.getCPUCareful(stat='iowait'), limits.getCPUWarning(stat='iowait'), limits.getCPUCritical(stat='iowait')], [0, limits.getLOADCareful() * core, limits.getLOADWarning() * core, limits.getLOADCritical() * core], [0, limits.getMEMCareful(), limits.getMEMWarning(), limits.getMEMCritical()], [0, limits.getSWAPCareful(), limits.getSWAPWarning(), limits.getSWAPCritical()], [0, limits.getTEMPCareful(), limits.getTEMPWarning(), limits.getTEMPCritical()], [0, limits.getHDDTEMPCareful(), limits.getHDDTEMPWarning(), limits.getHDDTEMPCritical()], [0, limits.getFSCareful(), limits.getFSWarning(), limits.getFSCritical()], [0, limits.getProcessCareful(stat='CPU', core=core), limits.getProcessWarning(stat='CPU', core=core), limits.getProcessCritical(stat='CPU', core=core)], [0, limits.getProcessCareful(stat='MEM'), limits.getProcessWarning(stat='MEM'), limits.getProcessCritical(stat='MEM')]] limits_table_x = self.help_x + 15 limits_table_y = self.help_y + 2 for value in limit_values: self.term_window.addnstr( limits_table_y, limits_table_x, '{0:>{width}}{1:>{width}}{2:>{width}}{3:>{width}}'.format( *value, width=width), 32) limits_table_y += 1 # key table (left column) key_col_left = [[_("a"), _("Sort processes automatically")], [_("c"), _("Sort processes by CPU%")], [_("m"), _("Sort processes by MEM%")], [_("p"), _("Sort processes by name")], [_("i"), _("Sort processes by I/O rate")], [_("d"), _("Show/hide disk I/O stats")], [_("f"), _("Show/hide file system stats")], [_("n"), _("Show/hide network stats")], [_("s"), _("Show/hide sensors stats")], [_("y"), _("Show/hide hddtemp stats")]] width = 3 key_table_x = self.help_x + 2 key_table_y = limits_table_y + 1 for key in key_col_left: self.term_window.addnstr( key_table_y, key_table_x, '{0:{width}}{1}'.format(*key, width=width), 38) key_table_y += 1 # key table (right column) key_col_right = [[_("l"), _("Show/hide logs")], [_("b"), _("Bytes or bits for network I/O")], [_("w"), _("Delete warning logs")], [_("x"), _("Delete warning and critical logs")], [_("1"), _("Global CPU or per-CPU stats")], [_("h"), _("Show/hide this help screen")], [_("t"), _("View network I/O as combination")], [_("u"), _("View cumulative network I/O")], [_("q"), _("Quit (Esc and Ctrl-C also work)")]] key_table_x = self.help_x + 38 key_table_y = limits_table_y + 1 for key in key_col_right: self.term_window.addnstr( key_table_y, key_table_x, '{0:{width}}{1}'.format(*key, width=width), 38) key_table_y += 1 def displayBat(self, batpercent): # Display the current batteries capacities % - Center if not batinfo_lib_tag or batpercent == []: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] # Build the message to display bat_msg = "%d%%" % batpercent # Display the message (if possible) if (screen_y > self.bat_y and screen_x > self.bat_x + len(bat_msg)): center = (screen_x // 2) - len(bat_msg) // 2 self.term_window.addnstr( max(self.bat_y, screen_y - 1), self.bat_x + center, bat_msg, len(bat_msg)) def displayNow(self, now): # Display the current date and time (now...) - Right if not now: return 0 screen_x = self.screen.getmaxyx()[1] screen_y = self.screen.getmaxyx()[0] if screen_y > self.now_y and screen_x > self.now_x: now_msg = now.strftime(_("%Y-%m-%d %H:%M:%S")) self.term_window.addnstr( max(self.now_y, screen_y - 1), max(self.now_x, screen_x - 1) - len(now_msg), now_msg, len(now_msg)) class glancesHtml: """ This class manages the HTML output """ def __init__(self, html_path, refresh_time=1): html_filename = 'glances.html' html_template = 'default.html' self.__refresh_time = refresh_time # Set the HTML output file self.html_file = os.path.join(html_path, html_filename) # Get data path data_path = os.path.join(work_path, 'data') # Set the template path template_path = os.path.join(data_path, 'html') environment = jinja2.Environment( loader=jinja2.FileSystemLoader(template_path), extensions=['jinja2.ext.loopcontrols']) # Open the template self.template = environment.get_template(html_template) # Define the colors list (hash table) for logged stats self.__colors_list = { 'DEFAULT': "bgcdefault fgdefault", 'OK': "bgcok fgok", 'CAREFUL': "bgccareful fgcareful", 'WARNING': "bgcwarning fgcwarning", 'CRITICAL': "bgcritical fgcritical" } def __getAlert(self, current=0, max=100): # If current < CAREFUL of max then alert = OK # If current > CAREFUL of max then alert = CAREFUL # If current > WARNING of max then alert = WARNING # If current > CRITICAL of max then alert = CRITICAL if max != 0: (current * 100) / max else: return 'DEFAULT' variable = (current * 100) / max if variable > limits.getSTDCritical(): return 'CRITICAL' elif variable > limits.getSTDWarning(): return 'WARNING' elif variable > limits.getSTDCareful(): return 'CAREFUL' return 'OK' def __getColor(self, current=0, max=100): """ Return colors for logged stats """ return self.__colors_list[self.__getAlert(current, max)] def __getCpuColor(self, cpu, max=100): cpu['user_color'] = self.__getColor(cpu['user'], max) cpu['system_color'] = self.__getColor(cpu['system'], max) cpu['nice_color'] = self.__getColor(cpu['nice'], max) return cpu def __getLoadAlert(self, current=0, core=1): # If current < CAREFUL*core of max then alert = OK # If current > CAREFUL*core of max then alert = CAREFUL # If current > WARNING*core of max then alert = WARNING # If current > CRITICAL*core of max then alert = CRITICAL if current > limits.getLOADCritical(core): return 'CRITICAL' elif current > limits.getLOADWarning(core): return 'WARNING' elif current > limits.getLOADCareful(core): return 'CAREFUL' return 'OK' def __getLoadColor(self, load, core=1): load['min1_color'] = ( self.__colors_list[self.__getLoadAlert(load['min1'], core)]) load['min5_color'] = ( self.__colors_list[self.__getLoadAlert(load['min5'], core)]) load['min15_color'] = ( self.__colors_list[self.__getLoadAlert(load['min15'], core)]) return load def __getMemColor(self, mem): mem['used_color'] = self.__getColor(mem['used'], mem['total']) return mem def __getMemSwapColor(self, memswap): memswap['used_color'] = self.__getColor(memswap['used'], memswap['total']) return memswap def __getFsColor(self, fs): mounted = 0 for mounted in range(0, len(fs)): fs[mounted]['used_color'] = self.__getColor(fs[mounted]['used'], fs[mounted]['size']) return fs def update(self, stats): if stats.getCpu(): # Open the output file with open(self.html_file, 'w') as f: # HTML refresh is set to 1.5 * refresh_time # to avoid display while page rendering data = self.template.render( refresh=int(self.__refresh_time * 1.5), host=stats.getHost(), system=stats.getSystem(), cpu=self.__getCpuColor(stats.getCpu()), load=self.__getLoadColor(stats.getLoad(), stats.getCore()), core=stats.getCore(), mem=self.__getMemColor(stats.getMem()), memswap=self.__getMemSwapColor(stats.getMemSwap()), net=stats.getNetwork(), diskio=stats.getDiskIO(), fs=self.__getFsColor(stats.getFs()), proccount=stats.getProcessCount(), proclist=stats.getProcessList()) # Write data into the file f.write(data) class glancesCsv: """ This class manages the CSV output """ def __init__(self, cvsfile="./glances.csv", refresh_time=1): # Init refresh time self.__refresh_time = refresh_time # Set the ouput (CSV) path try: self.__cvsfile_fd = open("%s" % cvsfile, "wb") self.__csvfile = csv.writer(self.__cvsfile_fd) except IOError as error: print("Cannot create the output CSV file: ", error[1]) sys.exit(0) def exit(self): self.__cvsfile_fd.close() def update(self, stats): if stats.getCpu(): # Update CSV with the CPU stats cpu = stats.getCpu() self.__csvfile.writerow(["cpu", cpu['user'], cpu['system'], cpu['nice']]) if stats.getLoad(): # Update CSV with the LOAD stats load = stats.getLoad() self.__csvfile.writerow(["load", load['min1'], load['min5'], load['min15']]) if stats.getMem() and stats.getMemSwap(): # Update CSV with the MEM stats mem = stats.getMem() self.__csvfile.writerow(["mem", mem['total'], mem['used'], mem['free']]) memswap = stats.getMemSwap() self.__csvfile.writerow(["swap", memswap['total'], memswap['used'], memswap['free']]) self.__cvsfile_fd.flush() class GlancesXMLRPCHandler(SimpleXMLRPCRequestHandler): """ Main XMLRPC handler """ rpc_paths = ('/RPC2', ) def end_headers(self): # Hack to add a specific header # Thk to: https://gist.github.com/rca/4063325 self.send_my_headers() SimpleXMLRPCRequestHandler.end_headers(self) def send_my_headers(self): # Specific header is here (solved the issue #227) self.send_header("Access-Control-Allow-Origin", "*") def authenticate(self, headers): # auth = headers.get('Authorization') try: (basic, _, encoded) = headers.get('Authorization').partition(' ') except Exception: # Client did not ask for authentidaction # If server need it then exit return not self.server.isAuth else: # Client authentication (basic, _, encoded) = headers.get('Authorization').partition(' ') assert basic == 'Basic', 'Only basic authentication supported' # Encoded portion of the header is a string # Need to convert to bytestring encodedByteString = encoded.encode() # Decode Base64 byte String to a decoded Byte String decodedBytes = b64decode(encodedByteString) # Convert from byte string to a regular String decodedString = decodedBytes.decode() # Get the username and password from the string (username, _, password) = decodedString.partition(':') # Check that username and password match internal global dictionary return self.check_user(username, password) def check_user(self, username, password): # Check username and password in the dictionnary if username in self.server.user_dict: if self.server.user_dict[username] == md5(password).hexdigest(): return True return False def parse_request(self): if SimpleXMLRPCRequestHandler.parse_request(self): # Next we authenticate if self.authenticate(self.headers): return True else: # if authentication fails, tell the client self.send_error(401, 'Authentication failed') return False def log_message(self, format, *args): # No message displayed on the server side pass class GlancesXMLRPCServer(SimpleXMLRPCServer): """ Init a SimpleXMLRPCServer instance (IPv6-ready) """ def __init__(self, bind_address, bind_port=61209, requestHandler=GlancesXMLRPCHandler): try: self.address_family = socket.getaddrinfo(bind_address, bind_port)[0][0] except socket.error as e: print(_("Couldn't open socket: %s") % e) sys.exit(1) SimpleXMLRPCServer.__init__(self, (bind_address, bind_port), requestHandler) class GlancesInstance(): """ All the methods of this class are published as XML RPC methods """ def __init__(self, cached_time=1): # cached_time is the minimum time interval between stats updates # i.e. XML/RPC calls will not retrieve updated info until the time # since last update is passed (will retrieve old cached info instead) self.timer = Timer(0) self.cached_time = cached_time def __update__(self): # Never update more than 1 time per cached_time if self.timer.finished(): stats.update() self.timer = Timer(self.cached_time) def init(self): # Return the Glances version return __version__ def getAll(self): # Update and return all the stats self.__update__() return json.dumps(stats.getAll()) def getAllLimits(self): # Return all the limits return json.dumps(limits.getAll()) def getAllMonitored(self): # Return the processes monitored list return json.dumps(monitors.getAll()) def getSystem(self): # Return operating system info # No need to update... #~ self.__update__() return json.dumps(stats.getSystem()) def getCore(self): # Update and return number of Core self.__update__() return json.dumps(stats.getCore()) def getCpu(self): # Update and return CPU stats self.__update__() return json.dumps(stats.getCpu()) def getLoad(self): # Update and return LOAD stats self.__update__() return json.dumps(stats.getLoad()) def getMem(self): # Update and return MEM stats self.__update__() return json.dumps(stats.getMem()) def getMemSwap(self): # Update and return MEMSWAP stats self.__update__() return json.dumps(stats.getMemSwap()) def getSensors(self): # Update and return SENSORS stats self.__update__() return json.dumps(stats.getSensors()) def getHDDTemp(self): # Update and return HDDTEMP stats self.__update__() return json.dumps(stats.getHDDTemp()) def getNetwork(self): # Update and return NET stats self.__update__() return json.dumps(stats.getNetwork()) def getDiskIO(self): # Update and return DISK IO stats self.__update__() return json.dumps(stats.getDiskIO()) def getFs(self): # Update and return FS stats self.__update__() return json.dumps(stats.getFs()) def getProcessCount(self): # Update and return ProcessCount stats self.__update__() return json.dumps(stats.getProcessCount()) def getProcessList(self): # Update and return ProcessList stats self.__update__() return json.dumps(stats.getProcessList()) def getBatPercent(self): # Update and return total batteries percent stats self.__update__() return json.dumps(stats.getBatPercent()) def getNow(self): # Update and return current date/hour self.__update__() return json.dumps(stats.getNow().strftime(_("%Y-%m-%d %H:%M:%S"))) def __getTimeSinceLastUpdate(self, IOType): assert(IOType in ['net', 'disk', 'process_disk']) return getTimeSinceLastUpdate(IOType) def getNetTimeSinceLastUpdate(self): return getTimeSinceLastUpdate('net') def getDiskTimeSinceLastUpdate(self): return getTimeSinceLastUpdate('net') def getProcessDiskTimeSinceLastUpdate(self): return getTimeSinceLastUpdate('process_disk') class GlancesServer(): """ This class creates and manages the TCP client """ def __init__(self, bind_address, bind_port=61209, requestHandler=GlancesXMLRPCHandler, cached_time=1): self.server = GlancesXMLRPCServer(bind_address, bind_port, requestHandler) # The users dict # username / MD5 password couple # By default, no auth is needed self.server.user_dict = {} self.server.isAuth = False # Register functions self.server.register_introspection_functions() self.server.register_instance(GlancesInstance(cached_time)) def add_user(self, username, password): """ Add an user to the dictionnary """ self.server.user_dict[username] = md5(password).hexdigest() self.server.isAuth = True def serve_forever(self): self.server.serve_forever() def server_close(self): self.server.server_close() class GlancesClient(): """ This class creates and manages the TCP client """ def __init__(self, server_address, server_port=61209, username="glances", password=""): # Build the URI if password != "": uri = 'http://%s:%s@%s:%d' % (username, password, server_address, server_port) else: uri = 'http://%s:%d' % (server_address, server_port) # Try to connect to the URI try: self.client = ServerProxy(uri) except Exception: print(_("Error: creating client socket") + " %s" % uri) pass return def client_init(self): try: client_version = self.client.init() except ProtocolError as err: if str(err).find(" 401 ") > 0: print(_("Error: Connection to server failed. Bad password.")) sys.exit(-1) else: print(_("Error: Connection to server failed. Unknown error.")) sys.exit(-1) return __version__[:3] == client_version[:3] def client_get_limits(self): try: serverlimits = json.loads(self.client.getAllLimits()) except Exception: return {} else: return serverlimits def client_get_monitored(self): try: servermonitored = json.loads(self.client.getAllMonitored()) except Exception: return [] else: return servermonitored def client_get(self): try: stats = json.loads(self.client.getAll()) except Exception: return {} else: return stats # Global def #=========== def printVersion(): print(_("Glances version ") + __version__ + _(" with PsUtil ") + psutil.__version__) def printSyntax(): printVersion() print(_("Usage: glances [options]")) print(_("\nOptions:")) print(_("\t-b\t\tDisplay network rate in Byte per second")) print(_("\t-B @IP|HOST\tBind server to the given IPv4/IPv6 address or hostname")) print(_("\t-c @IP|HOST\tConnect to a Glances server by IPv4/IPv6 address or hostname")) print(_("\t-C FILE\t\tPath to the configuration file")) print(_("\t-d\t\tDisable disk I/O module")) print(_("\t-e\t\tEnable sensors module")) print(_("\t-f FILE\t\tSet the HTML output folder or CSV file")) print(_("\t-h\t\tDisplay the help and exit")) print(_("\t-m\t\tDisable mount module")) print(_("\t-n\t\tDisable network module")) print(_("\t-o OUTPUT\tDefine additional output (available: HTML or CSV)")) print(_("\t-p PORT\t\tDefine the client/server TCP port (default: %d)" % server_port)) print(_("\t-P PASSWORD\tDefine a client/server password")) print(_("\t--password\tDefine a client/server password from the prompt")) print(_("\t-r\t\tDisable process list")) print(_("\t-s\t\tRun Glances in server mode")) print(_("\t-t SECONDS\tSet refresh time in seconds (default: %d sec)" % refresh_time)) print(_("\t-v\t\tDisplay the version and exit")) print(_("\t-y\t\tEnable hddtemp module")) print(_("\t-z\t\tDo not use the bold color attribute")) print(_("\t-1\t\tStart Glances in per CPU mode")) def end(): if server_tag: # Stop the server loop server.server_close() else: if client_tag: # Stop the client loop #~ client.client_quit() pass # Stop the classical CLI loop screen.end() if csv_tag: csvoutput.exit() sys.exit(0) def signal_handler(signal, frame): end() def getpassword(description='', confirm=False): """ Read a password from the command line (with confirmation if confirm = True) """ import getpass if description != '': sys.stdout.write("%s\n" % description) password1 = getpass.getpass(_("Password: ")) if confirm: password2 = getpass.getpass(_("Password (confirm): ")) else: return password1 if password1 == password2: return password1 else: sys.stdout.write(_("[Warning] Passwords did not match, please try again...\n")) return getpassword(description=description, confirm=confirm) def main(): # Glances - Init stuff ###################### global config, limits, monitors, logs, stats, screen global htmloutput, csvoutput global html_tag, csv_tag, server_tag, client_tag global psutil_get_io_counter_tag, psutil_mem_vm global percpu_tag, fs_tag, diskio_tag, network_tag, network_bytepersec_tag global sensors_tag, hddtemp_tag, process_tag global refresh_time, client, server, server_port, server_ip global last_update_times # create update times dict last_update_times = {} # Set default tags percpu_tag = False fs_tag = True diskio_tag = True network_tag = True network_bytepersec_tag = False sensors_tag = False hddtemp_tag = False process_tag = True html_tag = False csv_tag = False client_tag = False if is_Windows and not is_colorConsole: # Force server mode for Windows OS without colorconsole server_tag = True else: server_tag = False # Configuration file stuff conf_file = "" conf_file_tag = False # Set the default refresh time refresh_time = 3 # Set the default cache lifetime (for server) cached_time = 1 # Use curses.A_BOLD by default use_bold = True # Set the default TCP port for client and server server_port = 61209 bind_ip = "0.0.0.0" # Default username/password username = "glances" password = "" # Manage args try: opts, args = getopt.getopt(sys.argv[1:], "B:bdeymnho:f:t:vsc:p:C:P:zr1", ["bind", "bytepersec", "diskio", "mount", "sensors", "hddtemp", "netrate", "help", "output", "file", "time", "version", "server", "client", "port", "config", "password", "nobold", "noproc", "percpu"]) except getopt.GetoptError as err: # Print help information and exit: print(str(err)) printSyntax() sys.exit(2) for opt, arg in opts: if opt in ("-v", "--version"): printVersion() sys.exit(0) elif opt in ("-s", "--server"): server_tag = True elif opt in ("-P", "--password"): try: arg except NameError: print(_("Error: -P flag need an argument (password)")) sys.exit(2) password = arg elif opt in ("-B", "--bind"): try: arg except NameError: print(_("Error: -B flag need an argument (bind IP address)")) sys.exit(2) bind_ip = arg elif opt in ("-c", "--client"): client_tag = True try: arg except NameError: print(_("Error: -c flag need an argument (server IP address/name)")) sys.exit(2) server_ip = arg elif opt in ("-p", "--port"): try: port_number = int(arg) except: print("invalid port number argument: %s" % arg) sys.exit(2) server_port = arg elif opt in ("-o", "--output"): if arg.lower() == "html": html_tag = True elif arg.lower() == "csv": csv_tag = True else: print(_("Error: Unknown output %s" % arg)) printSyntax() sys.exit(2) elif opt in ("-e", "--sensors"): if is_Linux: if not sensors_lib_tag: print(_("Error: PySensors library not found")) sys.exit(2) else: sensors_tag = True else: print(_("Error: Sensors module is only available on Linux")) elif opt in ("-y", "--hddtemp"): hddtemp_tag = True elif opt in ("-f", "--file"): output_file = arg output_folder = arg elif opt in ("-t", "--time"): if int(arg) >= 1: refresh_time = int(arg) else: print(_("Error: Refresh time should be a positive integer")) sys.exit(2) elif opt in ("-d", "--diskio"): diskio_tag = False elif opt in ("-m", "--mount"): fs_tag = False elif opt in ("-n", "--netrate"): network_tag = False elif opt in ("-b", "--bytepersec"): network_bytepersec_tag = True elif opt in ("-C", "--config"): conf_file = arg conf_file_tag = True elif opt in ("-z", "--nobold"): use_bold = False elif opt in ("-r", "--noproc"): process_tag = False elif opt in ("-1", "--percpu"): percpu_tag = True else: printSyntax() sys.exit(0) # Check options if server_tag: if client_tag: print(_("Error: Cannot use both -s and -c flag")) sys.exit(2) if html_tag or csv_tag: print(_("Error: Cannot use both -s and -o flag")) sys.exit(2) if password == '': password = getpassword(description=_("Define the password for the Glances server"), confirm=True) if client_tag: if html_tag or csv_tag: print(_("Error: Cannot use both -c and -o flag")) sys.exit(2) if conf_file_tag: print(_("Error: Cannot use both -c and -C flag")) print(_(" Limits are set based on the server ones")) sys.exit(2) if password == '': password = getpassword(description=_("Enter the Glances server password"), confirm=False) if html_tag: if not html_lib_tag: print(_("Error: Need Jinja2 library to export into HTML")) print(_("Try to install the python-jinja2 package")) sys.exit(2) try: output_folder except UnboundLocalError: print(_("Error: HTML export (-o html) need " "output folder definition (-f )")) sys.exit(2) if csv_tag: if not csv_lib_tag: print(_("Error: Need CSV library to export into CSV")) sys.exit(2) try: output_file except UnboundLocalError: print(_("Error: CSV export (-o csv) need " "output file definition (-f )")) sys.exit(2) # Catch CTRL-C signal.signal(signal.SIGINT, signal_handler) if conf_file_tag: config = Config(conf_file) else: config = Config() if client_tag: psutil_get_io_counter_tag = True psutil_mem_vm = False fs_tag = True diskio_tag = True network_tag = True sensors_tag = True hddtemp_tag = True elif server_tag: sensors_tag = True hddtemp_tag = True # Init Glances depending of the mode (standalone, client, server) if server_tag: # Init the server print(_("Glances server is running on") + " %s:%s" % (bind_ip, server_port)) server = GlancesServer(bind_ip, int(server_port), GlancesXMLRPCHandler, cached_time) # Set the server login/password (if -P tag) if password != "": server.add_user(username, password) # Init Limits limits = glancesLimits() # Init monitor list monitors = monitorList() # Init stats stats = GlancesStatsServer() stats.update({}) elif client_tag: # Init the client (displaying server stat in the CLI) client = GlancesClient(server_ip, int(server_port), username, password) # Test if client and server are in the same major version if not client.client_init(): print(_("Error: The server version is not compatible")) sys.exit(2) # Init Limits limits = glancesLimits() # Init monitor list monitors = monitorList() # Init Logs logs = glancesLogs() # Init stats stats = GlancesStatsClient() # Init screen screen = glancesScreen(refresh_time=refresh_time, use_bold=use_bold) else: # Init the classical CLI # Init Limits limits = glancesLimits() # Init monitor list monitors = monitorList() # Init Logs logs = glancesLogs() # Init stats stats = GlancesStats() # Init HTML output if html_tag: htmloutput = glancesHtml(html_path=output_folder, refresh_time=refresh_time) # Init CSV output if csv_tag: csvoutput = glancesCsv(cvsfile=output_file, refresh_time=refresh_time) # Init screen screen = glancesScreen(refresh_time=refresh_time, use_bold=use_bold) # Glances - Main loop ##################### if server_tag: # Start the server loop server.serve_forever() elif client_tag: # Set the limits to the server ones server_limits = client.client_get_limits() if server_limits != {}: limits.setAll(server_limits) # Set the monitored pocesses list to the server one server_monitored = client.client_get_monitored() if server_monitored != []: monitors.setAll(server_monitored) # Start the client (CLI) loop while True: # Get server system informations server_stats = client.client_get() if server_stats == {}: server_status = "Disconnected" else: server_status = "Connected" stats.update(server_stats) # Update the screen screen.update(stats, cs_status=server_status) else: # Start the standalone (CLI) loop while True: # Get system informations stats.update() # Update the screen screen.update(stats) # Update the HTML output if html_tag: htmloutput.update(stats) # Update the CSV output if csv_tag: csvoutput.update(stats) def getTimeSinceLastUpdate(IOType): global last_update_times assert(IOType in ['net', 'disk', 'process_disk']) current_time = time.time() last_time = last_update_times.get(IOType) if not last_time: time_since_update = 1 else: time_since_update = current_time - last_time last_update_times[IOType] = current_time return time_since_update # Main #===== if __name__ == "__main__": main() # The end... glances-1.7.3/glances/tests/000077500000000000000000000000001225327237200157215ustar00rootroot00000000000000glances-1.7.3/glances/tests/__init__.py000066400000000000000000000000001225327237200200200ustar00rootroot00000000000000glances-1.7.3/glances/tests/test_glances.py000066400000000000000000000100201225327237200207370ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # Glances unitary test # # Copyright (C) 2012 Nicolargo # # Glances is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Glances 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # import os # import time # import signal import unittest import multiprocessing from glances import glances class TestGlancesStat(unittest.TestCase): def setUp(self): self.stats = glances.GlancesStats() self.stats.update() def test_Glances_getSystem(self): self.stats.update() system = self.stats.getSystem() #~ print("System info: %s" % system) self.assertTrue(type(system) == dict) self.assertTrue(len(system) > 1) def test_Glances_getCore(self): self.stats.update() core = self.stats.getCore() #~ print("CPU Core number: %s" % core) self.assertTrue(type(core) == int) self.assertEqual(core, multiprocessing.cpu_count()) def test_Glances_getCpu(self): self.stats.update() cpu = self.stats.getCpu() #~ print("CPU stat %s:" % cpu) self.assertTrue(type(cpu) == dict) self.assertTrue(len(cpu) > 1) def test_Glances_getPerCpu(self): self.stats.update() percpu = self.stats.getPerCpu() #~ print("PerCPU stat %s:" % percpu) self.assertTrue(type(percpu) == list) self.assertEqual(len(percpu), multiprocessing.cpu_count()) def test_Glances_getMem(self): self.stats.update() mem = self.stats.getMem() #~ print("Mem stat %s:" % mem) self.assertTrue(type(mem) == dict) self.assertTrue(len(mem) > 2) def test_Glances_getMemSwap(self): self.stats.update() memswap = self.stats.getMemSwap() #~ print("MemSwap stat %s:" % memswap) self.assertTrue(type(memswap) == dict) self.assertTrue(len(memswap) > 2) def test_Glances_getNetwork(self): self.stats.update() net = self.stats.getNetwork() #~ print("Network stat %s:" % net) self.assertTrue(type(net) == list) self.assertTrue(len(net) > 0) def test_Glances_getDiskIO(self): self.stats.update() diskio = self.stats.getDiskIO() #~ print("DiskIO stat %s:" % diskio) self.assertTrue(type(diskio) == list) self.assertTrue(len(diskio) > 0) def test_Glances_getFs(self): self.stats.update() fs = self.stats.getFs() #~ print("File system stat %s:" % fs) self.assertTrue(type(fs) == list) self.assertTrue(len(fs) > 0) def test_Glances_getProcess(self): self.stats.update() pc = self.stats.getProcessCount() pl = self.stats.getProcessList() #~ print("Processes stat %s:" % pc) #~ print("Processes list %s:" % pl) self.assertTrue(type(pc) == dict) self.assertTrue(len(pc) > 2) self.assertTrue(type(pl) == list) self.assertTrue(len(pl) > 0) def test_Glances_getSensors(self): self.stats.update() sensors = self.stats.getSensors() #~ print("Optionnal sensors stat %s:" % sensors) self.assertTrue(type(sensors) == list) #~ self.assertTrue(len(sensors) > 0) def test_Glances_getHDDTemp(self): self.stats.update() hddtemp = self.stats.getHDDTemp() #~ print("Optionnal hddtemp stat %s:" % hddtemp) self.assertTrue(type(hddtemp) == list) #~ self.assertTrue(len(hddtemp) > 0) if __name__ == '__main__': unittest.main() glances-1.7.3/i18n-gen.sh000066400000000000000000000012311225327237200150220ustar00rootroot00000000000000#!/bin/sh # # To create a new language pack XX # > mkdir -p ./i18n/XX/LC_MESSAGES/ # > msginit --input=./i18n/glances.pot --output=./i18n/XX/LC_MESSAGES/glances.po # Translate using the ./i18n/XX/LC_MESSAGES/glances.po file # Then add XX to the LANG_LIST # Run this script # LANG_LIST='es fr it pt_BR zh_CN' xgettext --language=Python --keyword=_ --output=./i18n/glances.pot ./glances/glances.py for i in $LANG_LIST; do echo "Generate language pack for: $i" msgmerge --update --no-fuzzy-matching --backup=off ./i18n/$i/LC_MESSAGES/glances.po ./i18n/glances.pot msgfmt ./i18n/$i/LC_MESSAGES/glances.po --output-file ./i18n/$i/LC_MESSAGES/glances.mo done glances-1.7.3/i18n/000077500000000000000000000000001225327237200137225ustar00rootroot00000000000000glances-1.7.3/i18n/es/000077500000000000000000000000001225327237200143315ustar00rootroot00000000000000glances-1.7.3/i18n/es/LC_MESSAGES/000077500000000000000000000000001225327237200161165ustar00rootroot00000000000000glances-1.7.3/i18n/es/LC_MESSAGES/glances.mo000066400000000000000000000014641225327237200200740ustar00rootroot00000000000000 t#*3<AEKPVn[    (.   %Y-%m-%d %H:%M:%S1 min:CRITICALDisk I/OLoadMemMountSwapTotalUsedProject-Id-Version: GLANCES 1.3.5 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-08-16 15:15+0200 PO-Revision-Date: 2012-01-12 19:07+0100 Last-Translator: Sebastián Moreno Language-Team: Spanish Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); %d.%m.%Y %H:%M:%S1 minuto:CRÍTICA Lectura/Escritura a discoCargaMemMontajeIntercambioTotalUsadoglances-1.7.3/i18n/es/LC_MESSAGES/glances.po000066400000000000000000000407751225327237200201070ustar00rootroot00000000000000# Spanish translations for GLANCES package. # Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GLANCES package. # Peter Fontaine , 2012. # msgid "" msgstr "" "Project-Id-Version: GLANCES 1.3.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: 2012-01-12 19:07+0100\n" "Last-Translator: Sebastián Moreno \n" "Language-Team: Spanish\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "" #: glances/glances.py:2378 msgid "PerCPU" msgstr "" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "" #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "Carga" #: glances/glances.py:2521 msgid "-core" msgstr "" #: glances/glances.py:2525 msgid "1 min:" msgstr "1 minuto:" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "Mem" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "" #: glances/glances.py:2608 msgid "active:" msgstr "" #: glances/glances.py:2616 msgid "inactive:" msgstr "" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "" #: glances/glances.py:2652 msgid "Swap" msgstr "Intercambio" #: glances/glances.py:2700 msgid "Network" msgstr "" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "" #: glances/glances.py:2811 msgid "Sensors" msgstr "" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "Lectura/Escritura a disco" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "Montaje" #: glances/glances.py:2929 msgid "Used" msgstr "Usado" #: glances/glances.py:2931 msgid "Total" msgstr "Total" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr "" #: glances/glances.py:2976 msgid " entries)" msgstr "" #: glances/glances.py:2978 msgid " (one entry)" msgstr "" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "" #: glances/glances.py:3083 msgid "Processes" msgstr "" #: glances/glances.py:3094 msgid "running" msgstr "" #: glances/glances.py:3096 msgid "sleeping" msgstr "" #: glances/glances.py:3098 msgid "other" msgstr "" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "" #: glances/glances.py:3106 msgid "sorted by " msgstr "" #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "" #: glances/glances.py:3412 msgid "Connected to" msgstr "" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "" #: glances/glances.py:3463 msgid "OK" msgstr "" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "" #: glances/glances.py:3469 msgid "WARNING" msgstr "" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "CRÍTICA " #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d.%m.%Y %H:%M:%S" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "" #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "" #: glances/glances.py:4104 msgid "Glances version" msgstr "" #: glances/glances.py:4104 msgid " with PsUtil " msgstr "" #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr "" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "" #~ msgid " OK " #~ msgstr " BUENO " #~ msgid "CAREFUL " #~ msgstr " CUIDADO " #~ msgid "WARNING " #~ msgstr " ATENCIÓN " #~ msgid "User:" #~ msgstr "Usuario:" #~ msgid "Kernel:" #~ msgstr "Núcleo:" #~ msgid "-Core" #~ msgstr "Núcleo" #~ msgid "Total:" #~ msgstr "Total:" #~ msgid "Used:" #~ msgstr "Usado:" #~ msgid "Free:" #~ msgstr "Libre:" #~ msgid "Textmode GUI initialization failed, Glances cannot start." #~ msgstr "" #~ "Imposible inizializar la interfaz gráfica de usuario en modo texto. " #~ "Glances no se puede iniciar." #~ msgid "Error: Can not init the libstatgrab library.\n" #~ msgstr "Error: No se puede iniciar la biblioteca libstatgrab.\n" #~ msgid "Error: Can not init the curses library.\n" #~ msgstr "Error: No se puede iniciar la biblioteca curses.\n" #~ msgid "Glances help (press 'h' to hide)" #~ msgstr "Ayuda de Glances (presiona 'h' para ocultar)" #~ msgid "'h'\tto display|hide this help message" #~ msgstr "'h'\tpara mostrar/ocultar la ayuda" #~ msgid "'a'\tto sort processes automatically" #~ msgstr "'a'\tpara ordenar los procesos automáticamente" #~ msgid "'c'\tto sort processes by CPU consumption" #~ msgstr "'c'\tpara ordenar los procesos por consumo del CPU" #~ msgid "'d'\tto disable|enable the disk IO stats" #~ msgstr "" #~ "'d'\tpara (des)activar las estadisticas de lectura/escritura a disco" #~ msgid "'f'\tto disable|enable the file system stats" #~ msgstr "'f'\tpara (des)activar estadisticas del sistema de archivos" #~ msgid "'m'\tto sort processes by process size" #~ msgstr "'m'\tpara ordenar los procesos para tamaño de proceso " #~ msgid "'n'\tto disable|enable the network interfaces stats" #~ msgstr "'n'\tpara (des)activar el estado de las interfaces de red." #~ msgid "'q'\tto exit Glances" #~ msgstr "'q'\tpara salir Glances" #~ msgid "Glances v" #~ msgstr "Glances v" #~ msgid " running on " #~ msgstr " que se ejecutan en " #~ msgid "Cpu" #~ msgstr "Cpu" #~ msgid "Idle:" #~ msgstr "Ocioso:" #~ msgid "5 mins:" #~ msgstr "5 minutos:" #~ msgid "15 mins:" #~ msgstr "15 minutos:" #~ msgid "Mem MB" #~ msgstr "Mem Mb" #~ msgid "Real" #~ msgstr "Real" #~ msgid "Net rate" #~ msgstr "Red ratio" #~ msgid "In/ps" #~ msgstr "Ent/ps" #~ msgid "Out/ps" #~ msgstr "Sal/ps" #~ msgid "Process" #~ msgstr "Proceso" #~ msgid "Running" #~ msgstr "Funcionando" #~ msgid "Sleeping" #~ msgstr "Durmiendo" #~ msgid "Other" #~ msgstr "Otro" #~ msgid "Number:" #~ msgstr "Número:" #~ msgid "Size MB" #~ msgstr "Tamaño en Mb" #~ msgid "Res MB" #~ msgstr "Res Mb" #~ msgid "Name" #~ msgstr "Designación" #~ msgid "Glances version " #~ msgstr "Versión de Glances" #~ msgid "Usage: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgstr "Utilización: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgid "\t-h:\tDisplay the syntax and exit" #~ msgstr "\t-h:\tMostrar la sintaxis y salir" #~ msgid "\t-t sec:\tSet the refresh time in second default is 1" #~ msgstr "\t-t sec:\tEstablecer el tiempo de actualización en segundos" #~ msgid "\t-v:\tDisplay the version and exit" #~ msgstr "\t-v:\tMostrar la versión y salir" #~ msgid "When Glances is running, you can press:" #~ msgstr "Cuando Glances se esté ejecutando, puede pulsar:" #~ msgid "" #~ "'a' to set the automatic mode. The processes are sorted automatically" #~ msgstr "" #~ "'a' para establecer el modo automático. Los procesos se ordenan " #~ "automáticamente" #~ msgid "'c' to sort the processes list by CPU consumption" #~ msgstr "'c' para ordenar la lista de procesos por el consumo de CPU" #~ msgid "'d' to disable or enable the disk IO stats" #~ msgstr "" #~ "'d' para (des)activar las estadísticas del Lectura/Escritura a disco" #~ msgid "'f' to disable or enable the file system stats" #~ msgstr "'f' para (des)activar las estadísticas del sistemas de archivos" #~ msgid "'h' to hide or show the help message" #~ msgstr "'h' para ocultar o mostrar el mensaje de ayuda" #~ msgid "'m' to sort the processes list by process size" #~ msgstr "'m' para ordenar la lista de procesos por tamaño de proceso" #~ msgid "'n' to disable or enable the network interfaces stats" #~ msgstr "'n' para (des)activar las estadísticas del interfaces de red" #~ msgid "'q' to exit" #~ msgstr "'q' para salir" #~ msgid "Error: Refresh time should be a positive non-null integer" #~ msgstr "Error: tiempo de actualización debe ser un entero positivo no nulo" glances-1.7.3/i18n/fr/000077500000000000000000000000001225327237200143315ustar00rootroot00000000000000glances-1.7.3/i18n/fr/LC_MESSAGES/000077500000000000000000000000001225327237200161165ustar00rootroot00000000000000glances-1.7.3/i18n/fr/LC_MESSAGES/glances.mo000066400000000000000000000116101225327237200200660ustar00rootroot00000000000000<S(,)Vs<!( 1 > HVh x 1*82Bk'*."00S0+ 5 Q V ^ e x        + B (Y          d 7f # & " C #P "t    $D S<]8C[0s(+'3!AU:..0Mimt| /0'%Ag,,  %. EQWt34# %"+-08'/ ( ;12<$65, ):7.*  !9& -b Display network rate in Byte per second -d Disable disk I/O module -m Disable mount module -n Disable network module -o output Define additional output (available: HTML or CSV) -s Run Glances in server mode -v Display the version and exit (lasts (one entry) entries) with PsUtil %Y-%m-%d %H:%M:%SCompute data...Connected toDelete warning and critical logsDelete warning logsDisconnected fromDisk I/OError: -B flag need an argument (bind IP address)Error: -P flag need an argument (password)Error: -c flag need an argument (server IP address/name)Error: CSV export (-o csv) need output file definition (-f )Error: Cannot init the curses library. Error: Need CSV library to export into CSVError: Need Jinja2 library to export into HTMLError: PySensors library not foundError: Refresh time should be a positive integerError: Sensors module is only available on LinuxError: The server version is not compatibleError: Unknown output %sError: creating client socketGlances server is running onGlances {0} with PsUtil {1}NAMENetworkPerCPUPress 'h' for helpProcessesQuit (Esc and Ctrl-C also work)SensorsShow/hide disk I/O statsShow/hide file system statsShow/hide network statsSort processes automaticallySort processes by CPU%Sort processes by MEM%Sort processes by nameTry to install the python-jinja2 packageUSERUsedactive:cached:free:inactive:sorted automaticallysorted by used:{0} {1} with {2} {3} on {4}{0} {1} {2} on {3}Project-Id-Version: GLANCES 1.6.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-08-16 15:15+0200 PO-Revision-Date: 2012-01-06 15:23+0100 Last-Translator: Peter Fontaine Language-Team: French Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); -b Affichage des débits réseau en Octet par seconde -d Déscativer le module disk I/O -m Désactiver le module file system -n Déscativer le module réseau -o output Définir le mode de sortie supplémentaire (HTML ou CSV) -s Lancer Glances en mode serveur -v Afficher la version et sortir (dernières (une entrée) entrées) avec PsUtil %d/%m/%Y %H:%M:%SCalcul des données...Connecté àSupression de toutes les alertesSuppression des alertes warningDeconnecté deIO DisqueErreur: L'option -B nécessite un argument (bind IP address)Erreur: Le flag -P doit avoir un argument (mot de passe)Erreur: L'option -c nécessite un argument (server IP address/name)Erreur: L'export CVS (-o cvs) nécessite la configuration du fichier de sortie (-f )Erreur d'initialisation de la librairie Curses. Erreur: La librairie CSV est introuvableErreur: La librairie Jinja2 est introuvableErreur: Librairie PySensors introuvableErreur: Le temps de rafraichissement doit être > 0Erreur: Le module Sensors est seulement disponible sous GNU/LinuxErreur: La version du serveur Glances n'est pas compatibleErreur: Mode de sortie demandée inconnue (%s)Erreur: Impossible de créer la socket clienteLe serveur Glances est lanceGlances {0} avec PsUtil {1}NOMReseauPar CPU'h' pour l'aide en ligneProcessusQuitter Glances (ESC ou Ctrl-C marche aussi...)CapteursMontrer/cacher les IO disquesMontrer/cacher les statistiques sur les montagesMontrer/cacher IO réseauClasser automatiquement les processusClasser les processus par CPU%Classer les processus par MEM%Classer les processus par ordre alphabetiqueEssayer d'installer le package python-jinja2UTILISATEURUtilactif:cache:libre:inactif:triés automatiquementtriés par util:{0} {1} avec {2} {3} sur {4}{0} {1} {2} sur {3}glances-1.7.3/i18n/fr/LC_MESSAGES/glances.po000066400000000000000000000541341225327237200201010ustar00rootroot00000000000000# French translations for GLANCES package # Traductions françaises du paquet GLANCES. # Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GLANCES package. # Peter Fontaine , 2012. # msgid "" msgstr "" "Project-Id-Version: GLANCES 1.6.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: 2012-01-06 15:23+0100\n" "Last-Translator: Peter Fontaine \n" "Language-Team: French\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "Erreur d'initialisation de la librairie Curses.\n" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "{0} {1} avec {2} {3} sur {4}" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "{0} {1} {2} sur {3}" #: glances/glances.py:2378 msgid "PerCPU" msgstr "Par CPU" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "Calcul des données..." #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "" #: glances/glances.py:2521 msgid "-core" msgstr "" #: glances/glances.py:2525 msgid "1 min:" msgstr "" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "util:" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "libre:" #: glances/glances.py:2608 msgid "active:" msgstr "actif:" #: glances/glances.py:2616 msgid "inactive:" msgstr "inactif:" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "cache:" #: glances/glances.py:2652 msgid "Swap" msgstr "" #: glances/glances.py:2700 msgid "Network" msgstr "Reseau" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "" #: glances/glances.py:2811 msgid "Sensors" msgstr "Capteurs" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "IO Disque" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "" #: glances/glances.py:2929 msgid "Used" msgstr "Util" #: glances/glances.py:2931 msgid "Total" msgstr "" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr " (dernières " #: glances/glances.py:2976 msgid " entries)" msgstr " entrées)" #: glances/glances.py:2978 msgid " (one entry)" msgstr " (une entrée)" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "" #: glances/glances.py:3083 msgid "Processes" msgstr "Processus" #: glances/glances.py:3094 msgid "running" msgstr "" #: glances/glances.py:3096 msgid "sleeping" msgstr "" #: glances/glances.py:3098 msgid "other" msgstr "" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "triés automatiquement" #: glances/glances.py:3106 msgid "sorted by " msgstr "triés par " #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "UTILISATEUR" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "NOM" #: glances/glances.py:3412 msgid "Connected to" msgstr "Connecté à" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "Deconnecté de" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "'h' pour l'aide en ligne" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "Glances {0} avec PsUtil {1}" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "" #: glances/glances.py:3463 msgid "OK" msgstr "" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "" #: glances/glances.py:3469 msgid "WARNING" msgstr "" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "" #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "Classer automatiquement les processus" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "Classer les processus par CPU%" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "Classer les processus par MEM%" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "Classer les processus par ordre alphabetique" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "Montrer/cacher les IO disques" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "Montrer/cacher les statistiques sur les montages" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "Montrer/cacher IO réseau" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "Suppression des alertes warning" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "Supression de toutes les alertes" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "Quitter Glances (ESC ou Ctrl-C marche aussi...)" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "Erreur: Impossible de créer la socket cliente" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "" #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "" #: glances/glances.py:4104 msgid "Glances version" msgstr "" #: glances/glances.py:4104 msgid " with PsUtil " msgstr " avec PsUtil " #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "\t-b\t\tAffichage des débits réseau en Octet par seconde" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "\t-d\t\tDéscativer le module disk I/O" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "\t-m\t\tDésactiver le module file system" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "\t-n\t\tDéscativer le module réseau" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "\t-o output\tDéfinir le mode de sortie supplémentaire (HTML ou CSV)" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "\t-s\t\tLancer Glances en mode serveur" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "\t-v\t\tAfficher la version et sortir" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "Erreur: Le flag -P doit avoir un argument (mot de passe)" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "Erreur: L'option -B nécessite un argument (bind IP address)" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "Erreur: L'option -c nécessite un argument (server IP address/name)" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "Erreur: Mode de sortie demandée inconnue (%s)" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "Erreur: Librairie PySensors introuvable" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "Erreur: Le module Sensors est seulement disponible sous GNU/Linux" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "Erreur: Le temps de rafraichissement doit être > 0" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr "" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "Erreur: La librairie Jinja2 est introuvable" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "Essayer d'installer le package python-jinja2" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "Erreur: La librairie CSV est introuvable" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "" "Erreur: L'export CVS (-o cvs) nécessite la configuration du fichier de " "sortie (-f )" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "Le serveur Glances est lance" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "Erreur: La version du serveur Glances n'est pas compatible" #~ msgid "Curses module not found. Glances cannot start." #~ msgstr "Le module Curses n'a pas été trouvé. Glances ne peut pas démarrer" #~ msgid "PsUtil module not found. Glances cannot start." #~ msgstr "Le module PsUtil n'a pas été trouvé. Glances ne peut pas démarrer" #~ msgid "PsUtil version %s detected." #~ msgstr "PsUtil version %s détecté" #~ msgid "PsUtil 0.4.1 or higher is needed. Glances cannot start." #~ msgstr "PsUtil 0.4.1 ou supérieur nécessaire. Glances ne peut pas démarrer" #~ msgid "WARNING|CRITICAL logs for CPU|LOAD|MEM" #~ msgstr "Alertes WARNING|CRITICAL pour CPU|CHARGE|MEM" #~ msgid "Show/hide log messages" #~ msgstr "Montrer ou cacher les logs" #~ msgid "Show/hide this help message" #~ msgstr "Afficher l'aide en ligne" #~ msgid "Usage: glances [opt]" #~ msgstr "Usage: glances [options]" #~ msgid " with opt:" #~ msgstr " avec les options:" #~ msgid "\t-B @IP|host\tBind server to the given IP or host NAME" #~ msgstr "" #~ "\t-B @IP|host\tMettre le serveur en écoute sur une adresse IP ou hostname" #~ msgid "\t-c @IP|host\tConnect to a Glances server" #~ msgstr "" #~ "\t-c @IP|host\tLancer Glances en mode client (adresse IP du serveur)" #~ msgid "\t-e\t\tEnable the sensors module (Linux-only)" #~ msgstr "\t-e\t\tActiver le module capteur (seulement sous Linux)" #~ msgid "\t-f file\t\tSet the output folder (HTML) or file (CSV)" #~ msgstr "" #~ "\t-f file\t\tConfigurer le répertoire (HTML) ou le fichier (CSV) de sortie" #~ msgid "\t-h\t\tDisplay the syntax and exit" #~ msgstr "\t-h\t\tAfficher la syntaxe puis sortir" #~ msgid "\t-p PORT\t\tDefine the client or server TCP port (default: %d)" #~ msgstr "" #~ "\t-p PORT\t\tDéfinir le port TCP utilisé pour le mode client/serveur " #~ "(defaut: %d)" #~ msgid "\t-P password\tClient/server password" #~ msgstr "\t-P motdepasse\tMot de passe pour le mode client/serveur" #~ msgid "\t-t sec\t\tSet the refresh time in seconds (default: %d)" #~ msgstr "\t-t sec\t\tDéfinir le temps de rafraichissement (defaut: %d)" #~ msgid "Bit/s or Byte/s for network IO" #~ msgstr "Bit/s ou Octet/s pour le réseau" #~ msgid "Error: Can not use both -s and -c flag" #~ msgstr "Erreur: Impossible d'utiliser en même temps les options -s et -c" #~ msgid "Error: Can not use both -s and -o flag" #~ msgstr "Erreur: Impossible d'utiliser en même temps les options -s et -o" #~ msgid "Error: Can not use both -c and -o flag" #~ msgstr "Erreur: Impossible d'utiliser en même temps les options -c et -o" #~ msgid "Error: Can not use both -c and -C flag" #~ msgstr "Erreur: Impossible d'utiliser en même temps les options -c et -C" #~ msgid "" #~ "Error: HTML export (-o html) needoutput folder definition (-f )" #~ msgstr "" #~ "Erreur: L'export HTML (-o html) nécessite la configuration du répertoire " #~ "de sortie (-f )" #~ msgid "Sort processes by IO Rate" #~ msgstr "Classer les processus par débit IO" #~ msgid "Global CPU or Per Core stats" #~ msgstr "CPU globale ou par CPU" #~ msgid "\t-C file\t\tPath to the configuration file (default: %s)" #~ msgstr "\t-C file\t\tChemin vers le fichier de conf (par défaut %s)" #~ msgid "Error: Connection to server failed" #~ msgstr "Erreur: Impossible de se connecter au serveur" #~ msgid "Captions: " #~ msgstr "Alertes: " #~ msgid "Key" #~ msgstr "Touches" #~ msgid "Function" #~ msgstr "Fonction" #~ msgid "Delete finished warning logs messages" #~ msgstr "Supprimer les alertes WARNING finies" #~ msgid "Delete finished warning and critical logs" #~ msgstr "Supprimer toutes les alertes finies" #~ msgid "Switch between global CPU and per core stats" #~ msgstr "Afficher le détail par CPU" #~ msgid "On Ubuntu 12.04 or higher:" #~ msgstr "Sur Ubuntu 12.04 ou supérieur" #~ msgid "To install PsUtil using pip (as root):" #~ msgstr "Pour installer PsUtil en utilisant pip (en root)" #~ msgid "PsUtil > 0.4.0 is needed. Glances cannot start." #~ msgstr "" #~ "Une version de PSUtil > 0.4.0 est nécessaire. Glances ne peut pas démarrer" #~ msgid "User:" #~ msgstr "Utilisateur:" #~ msgid "Kernel:" #~ msgstr "Noyau:" #~ msgid "Nice:" #~ msgstr "Nice:" #~ msgid "-Core" #~ msgstr "-Coeurs" #~ msgid "Used:" #~ msgstr "Utilisé:" #~ msgid "Free:" #~ msgstr "Libre:" #~ msgid "Switch between bit/s or byte/s for network IO" #~ msgstr "Passer de bit/s à byte/s pour les IO réseau" #~ msgid "Textmode GUI initialization failed, Glances cannot start." #~ msgstr "" #~ "Initialisation de l'interface utilisateur textuel impossible, Glances ne " #~ "peut être démaré" #~ msgid "Error: Can not init the libstatgrab library.\n" #~ msgstr "Erreur: Impossible d'initialiser la bibliothèque libstatgrab.\n" #~ msgid "Error: Can not init the curses library.\n" #~ msgstr "Erreur: Impossible d'initialiser la bibliothèque curses.\n" #~ msgid "Glances help (press 'h' to hide)" #~ msgstr "Aide Glances (appuyer sur 'h' pour cacher)" #~ msgid "'h'\tto display|hide this help message" #~ msgstr "'h'\tpour afficher|cacher ce message d'aide" #~ msgid "'a'\tto sort processes automatically" #~ msgstr "'a'\tpour trier les processus automatiquement" #~ msgid "'c'\tto sort processes by CPU consumption" #~ msgstr "'c'\tpour trier les processus par consomation du CPU" #~ msgid "'d'\tto disable|enable the disk IO stats" #~ msgstr "'d'\t(dés)activer les stats E/S disque " #~ msgid "'f'\tto disable|enable the file system stats" #~ msgstr "'f'\t(dés)activer les stats du sys de fichiers " #~ msgid "'m'\tto sort processes by process size" #~ msgstr "'m'\tpour trier les processus pas taille" #~ msgid "'n'\tto disable|enable the network interfaces stats" #~ msgstr "'n'\t(dés)activer les stats réseaux " #~ msgid "'q'\tto exit Glances" #~ msgstr "'q'\tpour quitter Glances" #~ msgid "Glances v" #~ msgstr "Glances v" #~ msgid " running on " #~ msgstr " en fonction sur " #~ msgid "Cpu" #~ msgstr "Cpu" #~ msgid "Idle:" #~ msgstr "Repos:" #~ msgid "5 mins:" #~ msgstr "5 mins:" #~ msgid "15 mins:" #~ msgstr "15 mins" #~ msgid "Mem MB" #~ msgstr "Mem Mo" #~ msgid "Real" #~ msgstr "Réel" #~ msgid "Net rate" #~ msgstr "Réseau" #~ msgid "Rx/ps" #~ msgstr "Rx/ps" #~ msgid "Tx/ps" #~ msgstr "Tx/ps" #~ msgid "In/ps" #~ msgstr "In/ps" #~ msgid "Out/ps" #~ msgstr "Out/ps" #~ msgid "Process" #~ msgstr "Process" #~ msgid "Running" #~ msgstr "En cours" #~ msgid "Sleeping" #~ msgstr "Sommeil" #~ msgid "Other" #~ msgstr "Autre" #~ msgid "Number:" #~ msgstr "Nombre:" #~ msgid "Size MB" #~ msgstr "Taille Mo" #~ msgid "Res MB" #~ msgstr "Res Mo" #~ msgid "Name" #~ msgstr "Nom" #~ msgid "Glances version " #~ msgstr "Version Glances" #~ msgid "Usage: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgstr "Utilisation : glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgid "\t-h:\tDisplay the syntax and exit" #~ msgstr "\t-h:\tAffiche la syntaxe et quitte" #~ msgid "\t-t sec:\tSet the refresh time in second default is 1" #~ msgstr "" #~ "\t-t sec:\tFixe le temps de raffraichissement en seconde, 1 seconde par " #~ "défaut" #~ msgid "\t-v:\tDisplay the version and exit" #~ msgstr "\t-v:\tAffiche la version et quitte" #~ msgid "When Glances is running, you can press:" #~ msgstr "Quand Glances fonctionne, vous pouvez appuyer sur:" #~ msgid "" #~ "'a' to set the automatic mode. The processes are sorted automatically" #~ msgstr "" #~ "'a' pour activer le mode auto. Les processus sont trié automatiquement" #~ msgid "'c' to sort the processes list by CPU consumption" #~ msgstr "'c' pour trier les processus par consomation CPU" #~ msgid "'d' to disable or enable the disk IO stats" #~ msgstr "'d' pour désactiver ou activer les statistiques E/S disque" #~ msgid "'f' to disable or enable the file system stats" #~ msgstr "" #~ "'f' pour désactiver ou activer les statistiques du système de fichier" #~ msgid "'h' to hide or show the help message" #~ msgstr "'h' pour cacher ou afficher le message d'aide" #~ msgid "'m' to sort the processes list by process size" #~ msgstr "'m' pour trier les processus par taille" #~ msgid "'n' to disable or enable the network interfaces stats" #~ msgstr "'n' pour désactiver ou activer les statistiques réseaux" #~ msgid "'q' to exit" #~ msgstr "'q' pour quitter" #~ msgid "Error: Refresh time should be a positive non-null integer" #~ msgstr "" #~ "Erreur: Le temps de raffraichissement doit être un entier positif non nul" glances-1.7.3/i18n/glances.pot000066400000000000000000000300041225327237200160570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "" #: glances/glances.py:2378 msgid "PerCPU" msgstr "" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "" #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "" #: glances/glances.py:2521 msgid "-core" msgstr "" #: glances/glances.py:2525 msgid "1 min:" msgstr "" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "" #: glances/glances.py:2608 msgid "active:" msgstr "" #: glances/glances.py:2616 msgid "inactive:" msgstr "" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "" #: glances/glances.py:2652 msgid "Swap" msgstr "" #: glances/glances.py:2700 msgid "Network" msgstr "" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "" #: glances/glances.py:2811 msgid "Sensors" msgstr "" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "" #: glances/glances.py:2929 msgid "Used" msgstr "" #: glances/glances.py:2931 msgid "Total" msgstr "" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr "" #: glances/glances.py:2976 msgid " entries)" msgstr "" #: glances/glances.py:2978 msgid " (one entry)" msgstr "" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "" #: glances/glances.py:3083 msgid "Processes" msgstr "" #: glances/glances.py:3094 msgid "running" msgstr "" #: glances/glances.py:3096 msgid "sleeping" msgstr "" #: glances/glances.py:3098 msgid "other" msgstr "" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "" #: glances/glances.py:3106 msgid "sorted by " msgstr "" #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "" #: glances/glances.py:3412 msgid "Connected to" msgstr "" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "" #: glances/glances.py:3463 msgid "OK" msgstr "" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "" #: glances/glances.py:3469 msgid "WARNING" msgstr "" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "" #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "" #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "" #: glances/glances.py:4104 msgid "Glances version" msgstr "" #: glances/glances.py:4104 msgid " with PsUtil " msgstr "" #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr "" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "" glances-1.7.3/i18n/it/000077500000000000000000000000001225327237200143365ustar00rootroot00000000000000glances-1.7.3/i18n/it/LC_MESSAGES/000077500000000000000000000000001225327237200161235ustar00rootroot00000000000000glances-1.7.3/i18n/it/LC_MESSAGES/glances.mo000066400000000000000000000137521225327237200201040ustar00rootroot00000000000000Kte`(a,< G!g(.  ) 6Wk}1*8B '_ 1 2 * . "F 0i 0 +   . K [ g            6 N f     (       " * 3 H S Z ` | { 0 3<'p!#D'#K$k>     $"G _ mMw;DdF6<9;Y?&c;`1##"9 JV"q-&'.#V'z .CIRY`i o } 4 ;=>'#(", - 7<.$DE?5F0 9 26%A H1BI38/@&CK+*J)G!: -C file Path to the configuration file -b Display network rate in Byte per second -d Disable disk I/O module -m Disable mount module -n Disable network module -o output Define additional output (available: HTML or CSV) -s Run Glances in server mode -v Display the version and exit -z Do not use the bold color attribute Limits are set based on the server ones with PsUtil %Y-%m-%d %H:%M:%S1 min:CAREFULCRITICALCompute data...Connected toDelete warning and critical logsDelete warning logsDisconnected fromDisk I/OError: -B flag need an argument (bind IP address)Error: -P flag need an argument (password)Error: -c flag need an argument (server IP address/name)Error: CSV export (-o csv) need output file definition (-f )Error: Cannot init the curses library. Error: Connection to server failed. Bad password.Error: Connection to server failed. Unknown error.Error: Need CSV library to export into CSVError: Need Jinja2 library to export into HTMLError: PySensors library not foundError: Refresh time should be a positive integerError: Sensors module is only available on LinuxError: The server version is not compatibleError: Unknown output %sError: creating client socketGlances server is running onGlances versionGlances {0}Glances {0} with PsUtil {1}Global CPU or per-CPU statsLoadMountNetworkOKPerCPUPress 'h' for helpProcessesQuit (Esc and Ctrl-C also work)SensorsShow/hide disk I/O statsShow/hide file system statsShow/hide network statsShow/hide sensors statsSort processes automaticallySort processes by CPU%Sort processes by MEM%Sort processes by nameTotalTry to install the python-jinja2 packageUsedWARNINGactive:free:inactive:otherrunningsleepingsorted automaticallysorted by total:used:{0} {1} with {2} {3} on {4}{0} {1} {2} on {3}Project-Id-Version: GLANCES 1.4.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-08-16 15:15+0200 PO-Revision-Date: 2013-04-07 15:39+0100 Last-Translator: idn Language-Team: Italian Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 1.5.5 -C file Percorso per il file di configurazione -b Mostra la velocità di rete in Byte per second -d Disattiva il modulo I/O dei dischi -m Disattiva il modulo di mount -n Disattiva il modulo della rete -o output Imposta destinazione aggiuntiva (disponibile: HTML o CSV) -s Esegui Glances in modalità server -v Mostra la versione ed esci -z Non utilizzare l'attributo bold I limiti sono impostati sulla base di quelle di servercon PsUtil%d.%m.%Y %H:%M:%S1 minuto:ATTEZZIONECRITICO Calcolo datiConnesso aCancella avvisi e criticità del logCancella avvisi del logDisconesso daI/O DiscoErrore: -B paramentro ha bisogno di un argomento (Indirizzo IP da assocciare)Errore: -P paramentro ha bisogno di un argomento (password)Errore: -P paramentro ha bisogno di un argomento (Indirizzo IP/nome)Errore: L'esportazione in CSV (-o csv) necessita la definizione del file di destinazione (-f )Errore: Non si può inizializzare la libreria Curses. Errore: connessione al server fallita. Password non correttaErrore: connessione al server fallita. errore sconosciutoErrore: Ho bisogno della libreria CSV per esportare in CSVErrore: Ho bisogno della libreria Jinja2 per esportare in HTMLErrore: Libreria PySensors non trovataErrore: Il valore per esprimere il tempo di aggiornamento dovrebbe essere un numero intero positivoErrore: Il modulo dei sensori è disponibile solo per LinuxErrore: La versione del server non è compatibileErrore: Destinazione sconosciuta %sErrore: creazione socket del clientIl server Glances è in esecuzioneGlances versioneGlances {0}Glances {0} con PsUtil {1}Statistiche CPU globali o per coreCaricaMontaReteOKPer CorePremi 'h' per l'aiutoProcessiEsci (esc e Ctrl-C funzionano in alternativa)SensoriMostra/nascondi statistiche dischi I/OMostra/nascondi statistiche file systemMostra/nascondi statistiche di reteMostra/nascondi statistiche dei sensoriOrdina processi automaticamenteOrdina processi per CPU%Ordina processi per MEM%Ordina processi per nomeTotaleProvo ad installare il pacchetto python-jinja2UsatoPERICOLOattivoliberoinattivoaltriin esecuzionedormientiordinati automaticamenteordinati pertotale:usato:{0} {1} con {2} {3} su {4}{0} {1} {2} su {3}glances-1.7.3/i18n/it/LC_MESSAGES/glances.po000066400000000000000000000531401225327237200201020ustar00rootroot00000000000000# Italian translations for GLANCES package. # Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GLANCES package. # Domenico Luciani , 2012. # msgid "" msgstr "" "Project-Id-Version: GLANCES 1.4.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: 2013-04-07 15:39+0100\n" "Last-Translator: idn \n" "Language-Team: Italian\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.5\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "Errore: Non si può inizializzare la libreria Curses.\n" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "{0} {1} con {2} {3} su {4}" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "{0} {1} {2} su {3}" #: glances/glances.py:2378 msgid "PerCPU" msgstr "Per Core" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "Calcolo dati" #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "Carica" #: glances/glances.py:2521 msgid "-core" msgstr "" #: glances/glances.py:2525 msgid "1 min:" msgstr "1 minuto:" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "totale:" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "usato:" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "libero" #: glances/glances.py:2608 msgid "active:" msgstr "attivo" #: glances/glances.py:2616 msgid "inactive:" msgstr "inattivo" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "" #: glances/glances.py:2652 msgid "Swap" msgstr "" #: glances/glances.py:2700 msgid "Network" msgstr "Rete" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "" #: glances/glances.py:2811 msgid "Sensors" msgstr "Sensori" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "I/O Disco" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "Monta" #: glances/glances.py:2929 msgid "Used" msgstr "Usato" #: glances/glances.py:2931 msgid "Total" msgstr "Totale" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr "" #: glances/glances.py:2976 msgid " entries)" msgstr "" #: glances/glances.py:2978 msgid " (one entry)" msgstr "" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "" #: glances/glances.py:3083 msgid "Processes" msgstr "Processi" #: glances/glances.py:3094 msgid "running" msgstr "in esecuzione" #: glances/glances.py:3096 msgid "sleeping" msgstr "dormienti" #: glances/glances.py:3098 msgid "other" msgstr "altri" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "ordinati automaticamente" #: glances/glances.py:3106 msgid "sorted by " msgstr "ordinati per" #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "" #: glances/glances.py:3412 msgid "Connected to" msgstr "Connesso a" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "Disconesso da" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "Premi 'h' per l'aiuto" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "Glances {0} con PsUtil {1}" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "Glances {0}" #: glances/glances.py:3463 msgid "OK" msgstr "OK" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "ATTEZZIONE" #: glances/glances.py:3469 msgid "WARNING" msgstr "PERICOLO" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "CRITICO " #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "Ordina processi automaticamente" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "Ordina processi per CPU%" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "Ordina processi per MEM%" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "Ordina processi per nome" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "Mostra/nascondi statistiche dischi I/O" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "Mostra/nascondi statistiche file system" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "Mostra/nascondi statistiche di rete" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "Mostra/nascondi statistiche dei sensori" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "Cancella avvisi del log" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "Cancella avvisi e criticità del log" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "Statistiche CPU globali o per core" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "Esci (esc e Ctrl-C funzionano in alternativa)" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d.%m.%Y %H:%M:%S" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "Errore: creazione socket del client" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "Errore: connessione al server fallita. Password non corretta" #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "Errore: connessione al server fallita. errore sconosciuto" #: glances/glances.py:4104 msgid "Glances version" msgstr "Glances versione" #: glances/glances.py:4104 msgid " with PsUtil " msgstr "con PsUtil" #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "\t-b\t\tMostra la velocità di rete in Byte per second" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "\t-C file\t\tPercorso per il file di configurazione" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "\t-d\t\tDisattiva il modulo I/O dei dischi" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "\t-m\t\tDisattiva il modulo di mount" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "\t-n\t\tDisattiva il modulo della rete" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "\t-o output\tImposta destinazione aggiuntiva (disponibile: HTML o CSV)" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "\t-s\t\tEsegui Glances in modalità server" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "\t-v\t\tMostra la versione ed esci" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "\t-z\t\tNon utilizzare l'attributo bold" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "Errore: -P paramentro ha bisogno di un argomento (password)" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "" "Errore: -B paramentro ha bisogno di un argomento (Indirizzo IP da assocciare)" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "Errore: -P paramentro ha bisogno di un argomento (Indirizzo IP/nome)" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "Errore: Destinazione sconosciuta %s" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "Errore: Libreria PySensors non trovata" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "Errore: Il modulo dei sensori è disponibile solo per Linux" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "" "Errore: Il valore per esprimere il tempo di aggiornamento dovrebbe essere un " "numero intero positivo" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr " I limiti sono impostati sulla base di quelle di server" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "Errore: Ho bisogno della libreria Jinja2 per esportare in HTML" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "Provo ad installare il pacchetto python-jinja2" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "Errore: Ho bisogno della libreria CSV per esportare in CSV" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "" "Errore: L'esportazione in CSV (-o csv) necessita la definizione del file di " "destinazione (-f )" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "Il server Glances è in esecuzione" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "Errore: La versione del server non è compatibile" #~ msgid "Curses module not found. Glances cannot start." #~ msgstr "Il modulo Curses non è stato trovato. Glances non può partire." #~ msgid "PsUtil module not found. Glances cannot start." #~ msgstr "Il modulo PsUtil non è stato trovato. Glances non può partire." #~ msgid "PsUtil version %s detected." #~ msgstr "PsUtil versione %s presente. " #~ msgid "PsUtil 0.4.1 or higher is needed. Glances cannot start." #~ msgstr "" #~ "Neccessaria la versione di PsUtil 0.4.1 o più recente. Glances non può " #~ "partire." #~ msgid "WARNING|CRITICAL logs for CPU|LOAD|MEM" #~ msgstr "AVVISI|CRITICI logs per CPU|LOAD|MEM" #~ msgid "Sort processes by IO rate" #~ msgstr "Ordina processi per velocità IO" #~ msgid "Show/hide log messages" #~ msgstr "Mostra/nascondi messaggi di log" #~ msgid "Show/hide this help message" #~ msgstr "Mostra/nascondi messaggi di aiuto" #~ msgid "Error: Connection to server failed. Can not get the server version." #~ msgstr "" #~ "Errore: connessione al server fallita. Impossibile avere la versione del " #~ "server" #~ msgid "Usage: glances [opt]" #~ msgstr "Uso: glances [opt]" #~ msgid " with opt:" #~ msgstr "con opt:" #~ msgid "\t-B @IP|host\tBind server to the given IP or host NAME" #~ msgstr "\t-B @IP|host\tAssociare server per IP o host NAME" #~ msgid "\t-c @IP|host\tConnect to a Glances server" #~ msgstr "\t-c @IP|host\tConnesso al server Glances" #~ msgid "\t-e\t\tEnable the sensors module (Linux-only)" #~ msgstr "\t-e\t\tAbilita il modulo dei sensori (solo per Linux)" #~ msgid "\t-f file\t\tSet the output folder (HTML) or file (CSV)" #~ msgstr "" #~ "\t-f file\t\tImposta cartella di destinazione (HTML) o il file (CSV)" #~ msgid "\t-h\t\tDisplay the syntax and exit" #~ msgstr "\t-h\t\tMostra la sintassi ed esci" #~ msgid "\t-p PORT\t\tDefine the client or server TCP port (default: %d)" #~ msgstr "" #~ "\t-p PORT\t\tImposta la porta TCP del client o del server (default: %d)" #~ msgid "\t-P password\tClient/server password" #~ msgstr "\t-P password\tClient/server password" #~ msgid "\t-t sec\t\tSet the refresh time in seconds (default: %d)" #~ msgstr "" #~ "\t-t sec\t\tImposta il tempo di aggiornamento in secondi (default: %d)" #~ msgid "Bit/s or Byte/s for network IO" #~ msgstr "Bit/s o Byte/s per rete IO" #~ msgid "Error: Can not use both -s and -c flag" #~ msgstr "Errore: Non si possono usare insieme questi parametri -s e -c" #~ msgid "Error: Can not use both -s and -o flag" #~ msgstr "Errore: Non si possono usare insieme questi parametri -s e -o" #~ msgid "Error: Can not use both -c and -o flag" #~ msgstr "Errore: Non si possono usare insieme questi parametri -c e -o" #~ msgid "Error: Can not use both -c and -C flag" #~ msgstr "Errore: Non si possono usare insieme questi parametri -c e -C" #~ msgid "" #~ "Error: HTML export (-o html) needoutput folder definition (-f )" #~ msgstr "" #~ "Errore: L'esportazione in HTML (-o html) necessita la definizione della " #~ "cartella di destinazione (-f )" #~ msgid " OK " #~ msgstr " OK " #~ msgid "CAREFUL " #~ msgstr " ATTENZIONE " #~ msgid "WARNING " #~ msgstr " ALLARME " #~ msgid "User:" #~ msgstr "Utente:" #~ msgid "Kernel:" #~ msgstr "Kernel:" #~ msgid "Nice:" #~ msgstr "Priorità" #~ msgid "-Core" #~ msgstr "Nucleo" #~ msgid "Total:" #~ msgstr "Totale:" #~ msgid "Used:" #~ msgstr "Usata:" #~ msgid "Free:" #~ msgstr "Libera:" #~ msgid "Textmode GUI initialization failed, Glances cannot start." #~ msgstr "" #~ "Iniziallizzazione GUI modalità testuale fallita. Glances non può essere " #~ "avviato" #~ msgid "Error: Can not init the libstatgrab library.\n" #~ msgstr "Error: Impossibile inizializzare le librerie libstatgrab\n" #~ msgid "Error: Can not init the curses library.\n" #~ msgstr "Error: Impossibile inizializzare le librerie Curses\n" #~ msgid "Glances help (press 'h' to hide)" #~ msgstr "Aiuto di Glances (premi 'h' per nascondere)" #~ msgid "'h'\tto display|hide this help message" #~ msgstr "'h'\tper mostrare|nascondere questo messaggio di aiuto" #~ msgid "'a'\tto sort processes automatically" #~ msgstr "'a'\tper ordinare i processi automaticamente" #~ msgid "'c'\tto sort processes by CPU consumption" #~ msgstr "'c'\tper ordinare i processi secondo il consumo di CPU" #~ msgid "'d'\tto disable|enable the disk IO stats" #~ msgstr "'d'\tper disabilitare|abilitare le statistiche IO del disco" #~ msgid "'f'\tto disable|enable the file system stats" #~ msgstr "'f'\tper disabilitare|abilitare le statistiche del file system" #~ msgid "'m'\tto sort processes by process size" #~ msgstr "'m'\tper ordinare i processi secondo la dimensione del processo" #~ msgid "'n'\tto disable|enable the network interfaces stats" #~ msgstr "" #~ "'n'\tper disabilitare|abilitare le statistiche dell'interfaccia di rete" #~ msgid "'q'\tto exit Glances" #~ msgstr "'q'\tper uscire da Glances" #~ msgid "Glances v" #~ msgstr "Glances v" #~ msgid " running on " #~ msgstr " eseguito su " #~ msgid "Cpu" #~ msgstr "Cpu" #~ msgid "Idle:" #~ msgstr "Ozioso:" #~ msgid "5 mins:" #~ msgstr "5 minuti:" #~ msgid "15 mins:" #~ msgstr "15 minuti:" #~ msgid "Mem MB" #~ msgstr "Mem Mb" #~ msgid "Real" #~ msgstr "Reale" #~ msgid "Net rate" #~ msgstr "Velocità di rete" #~ msgid "Process" #~ msgstr "Processo" #~ msgid "Running" #~ msgstr "Avviato" #~ msgid "Sleeping" #~ msgstr "Dormendo" #~ msgid "Other" #~ msgstr "Altro" #~ msgid "Number:" #~ msgstr "Numero:" #~ msgid "Size MB" #~ msgstr "Dimensione Mb" #~ msgid "Res MB" #~ msgstr "Res Mb" #~ msgid "Name" #~ msgstr "Nome" #~ msgid "Glances version " #~ msgstr "Versione di Glances" #~ msgid "Usage: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgstr "Uso: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgid "\t-h:\tDisplay the syntax and exit" #~ msgstr "\t-h:\tMostra la sintassi ed esce" #~ msgid "\t-t sec:\tSet the refresh time in second default is 1" #~ msgstr "" #~ "\t-t sec:\tStabilisce il tempo di controllo in secondi, di base è 1 " #~ "secondo" #~ msgid "\t-v:\tDisplay the version and exit" #~ msgstr "\t-v:\tMostra la versione ed esce" #~ msgid "When Glances is running, you can press:" #~ msgstr "Quando GLances è avviato, tu puoi premere:" #~ msgid "" #~ "'a' to set the automatic mode. The processes are sorted automatically" #~ msgstr "" #~ "'a' per stabilire la modalità automatica. I processi verranno ordinati " #~ "automaticamente" #~ msgid "'c' to sort the processes list by CPU consumption" #~ msgstr "'c' per ordinare la lista dei processi secondo il consumo di CPU" #~ msgid "'d' to disable or enable the disk IO stats" #~ msgstr "'d' per disabilitare o abilitare le statistiche IO del disco" #~ msgid "'f' to disable or enable the file system stats" #~ msgstr "'f' per disabilitare o abilitare le statistiche del file system" #~ msgid "'h' to hide or show the help message" #~ msgstr "'h' per nascondere o mostrare il messaggio di aiuto" #~ msgid "'m' to sort the processes list by process size" #~ msgstr "" #~ "'m' per ordinare la lista dei processi secondo la dimensione del processo" #~ msgid "'n' to disable or enable the network interfaces stats" #~ msgstr "" #~ "'n' per disabilitare o abilitare le statistiche dell'interfaccia di rete" #~ msgid "'q' to exit" #~ msgstr "'q' per uscire" #~ msgid "Error: Refresh time should be a positive non-null integer" #~ msgstr "" #~ "Error: Il tempo di controllo dev'essere un intero positivo non nullo" glances-1.7.3/i18n/pt_BR/000077500000000000000000000000001225327237200147305ustar00rootroot00000000000000glances-1.7.3/i18n/pt_BR/LC_MESSAGES/000077500000000000000000000000001225327237200165155ustar00rootroot00000000000000glances-1.7.3/i18n/pt_BR/LC_MESSAGES/glances.mo000066400000000000000000000014611225327237200204700ustar00rootroot00000000000000 t#*3<AEKPV[    %+   %Y-%m-%d %H:%M:%S1 min:CRITICALDisk I/OLoadMemMountSwapTotalUsedProject-Id-Version: Glances 1.4.1.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-08-16 15:15+0200 PO-Revision-Date: 2012-09-20 01:53-0300 Last-Translator: Rafael Beraldo Language-Team: Brazilian Portuguese Language: pt_br MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); %d-%m-%Y %H:%M:%S1 min:CRÍTICOI/O do DiscoCargaMemPartiçõesSwapTotalUsadoglances-1.7.3/i18n/pt_BR/LC_MESSAGES/glances.po000066400000000000000000000412261225327237200204760ustar00rootroot00000000000000# Brazilian Portuguese translations for GLANCES package. # Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GLANCES package. # Rafael Beraldo , 2012. # msgid "" msgstr "" "Project-Id-Version: Glances 1.4.1.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: 2012-09-20 01:53-0300\n" "Last-Translator: Rafael Beraldo \n" "Language-Team: Brazilian Portuguese\n" "Language: pt_br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "" #: glances/glances.py:2378 msgid "PerCPU" msgstr "" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "" #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "Carga" #: glances/glances.py:2521 msgid "-core" msgstr "" #: glances/glances.py:2525 msgid "1 min:" msgstr "1 min:" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "Mem" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "" #: glances/glances.py:2608 msgid "active:" msgstr "" #: glances/glances.py:2616 msgid "inactive:" msgstr "" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "" #: glances/glances.py:2652 msgid "Swap" msgstr "Swap" #: glances/glances.py:2700 msgid "Network" msgstr "" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "" #: glances/glances.py:2811 msgid "Sensors" msgstr "" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "I/O do Disco" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "Partições" #: glances/glances.py:2929 msgid "Used" msgstr "Usado" #: glances/glances.py:2931 msgid "Total" msgstr "Total" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr "" #: glances/glances.py:2976 msgid " entries)" msgstr "" #: glances/glances.py:2978 msgid " (one entry)" msgstr "" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "" #: glances/glances.py:3083 msgid "Processes" msgstr "" #: glances/glances.py:3094 msgid "running" msgstr "" #: glances/glances.py:3096 msgid "sleeping" msgstr "" #: glances/glances.py:3098 msgid "other" msgstr "" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "" #: glances/glances.py:3106 msgid "sorted by " msgstr "" #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "" #: glances/glances.py:3412 msgid "Connected to" msgstr "" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "" #: glances/glances.py:3463 msgid "OK" msgstr "" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "" #: glances/glances.py:3469 msgid "WARNING" msgstr "" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "CRÍTICO" #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d-%m-%Y %H:%M:%S" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "" #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "" #: glances/glances.py:4104 msgid "Glances version" msgstr "" #: glances/glances.py:4104 msgid " with PsUtil " msgstr "" #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr "" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "" #~ msgid " OK " #~ msgstr " OK " #~ msgid "CAREFUL " #~ msgstr "CUIDADO " #~ msgid "WARNING " #~ msgstr "AVISO" #~ msgid "User:" #~ msgstr "Usuário:" #~ msgid "Kernel:" #~ msgstr "Kernel:" #~ msgid "Nice:" #~ msgstr "Nice:" #~ msgid "-Core" #~ msgstr "-Núcleo(s)" #~ msgid "Total:" #~ msgstr "Total:" #~ msgid "Used:" #~ msgstr "Usado:" #~ msgid "Free:" #~ msgstr "Livre:" #~ msgid "Textmode GUI initialization failed, Glances cannot start." #~ msgstr "" #~ "A inicialização da interface gráfica em modo texto falhou, o Glances não " #~ "pode iniciar." #~ msgid "Error: Can not init the libstatgrab library.\n" #~ msgstr "Erro: Não foi possível iniciar a biblioteca libstatgrab.\n" #~ msgid "Error: Can not init the curses library.\n" #~ msgstr "Erro: Não foi possível iniciar a biblioteca curses.\n" #~ msgid "Glances help (press 'h' to hide)" #~ msgstr "Ajuda do Glances (pressione 'h' para ocultar)" #~ msgid "'h'\tto display|hide this help message" #~ msgstr "'h'\tpara mostrar|ocultar esta mensagem de ajuda" #~ msgid "'a'\tto sort processes automatically" #~ msgstr "'a'\tpara ordenar os processos automaticamente" #~ msgid "'c'\tto sort processes by CPU consumption" #~ msgstr "'c'\tpara ordenar os processos por consumo de CPU" #~ msgid "'d'\tto disable|enable the disk IO stats" #~ msgstr "'d'\tpara desabilitar|habilitar as estatísticas de IO do disco" #~ msgid "'f'\tto disable|enable the file system stats" #~ msgstr "" #~ "'f'\tpara desabilitar|habilitar as estatísticas do sistema de arquivos" #~ msgid "'m'\tto sort processes by process size" #~ msgstr "'m'\tpara ordenar os processos pelo tamanho do processo" #~ msgid "'n'\tto disable|enable the network interfaces stats" #~ msgstr "" #~ "'n'\tpara desabilitar|habilitar as estatísticas das interfaces de rede" #~ msgid "'q'\tto exit Glances" #~ msgstr "'q'\tpara sair do Glances" #~ msgid "Glances v" #~ msgstr "Glances v" #~ msgid " running on " #~ msgstr " rodando em " #~ msgid "Cpu" #~ msgstr "Cpu" #~ msgid "Idle:" #~ msgstr "Ocioso:" #~ msgid "5 mins:" #~ msgstr "5 mins:" #~ msgid "15 mins:" #~ msgstr "15 mins:" #~ msgid "Mem MB" #~ msgstr "Mem MB" #~ msgid "Real" #~ msgstr "Real" #~ msgid "Net rate" #~ msgstr "Taxa da rede" #~ msgid "Rx/ps" #~ msgstr "Rx/ps" #~ msgid "Tx/ps" #~ msgstr "Tx/ps" #~ msgid "In/ps" #~ msgstr "In/ps" #~ msgid "Out/ps" #~ msgstr "Out/ps" #~ msgid "Process" #~ msgstr "Processo" #~ msgid "Running" #~ msgstr "Rodando" #~ msgid "Sleeping" #~ msgstr "Dormindo" #~ msgid "Other" #~ msgstr "Outro" #~ msgid "Number:" #~ msgstr "Número" #~ msgid "Size MB" #~ msgstr "Tamanho MB" #~ msgid "Res MB" #~ msgstr "Rec MB" #~ msgid "Name" #~ msgstr "Nome" #~ msgid "Glances version " #~ msgstr "Glances versão " #~ msgid "Usage: glances.py [-t|--time sec] [-h|--help] [-v|--version]" #~ msgstr "Uso: glances.py [-t|--time seg] [-h|--help] [-v|--version]" #~ msgid "\t-h:\tDisplay the syntax and exit" #~ msgstr "\t-h:\tMostra a sintaxe e sai" #~ msgid "\t-t sec:\tSet the refresh time in second default is 1" #~ msgstr "\t-t seg:\tAjusta o tempo de atualização em segundos, o padrão é 1" #~ msgid "\t-v:\tDisplay the version and exit" #~ msgstr "\t-v:\tMostra a versão e sai" #~ msgid "When Glances is running, you can press:" #~ msgstr "Quando o Glances estiver rodando, você pode pressionar:" #~ msgid "" #~ "'a' to set the automatic mode. The processes are sorted automatically" #~ msgstr "" #~ "'a' para ativar o modo automático. Os processos são ordenados " #~ "automaticamente" #~ msgid "'c' to sort the processes list by CPU consumption" #~ msgstr "'c' para ordenar a lista de processos pelo consumo de CPU" #~ msgid "'d' to disable or enable the disk IO stats" #~ msgstr "'d' para desabilitar ou habilitar as estatísticas de IO do disco" #~ msgid "'f' to disable or enable the file system stats" #~ msgstr "" #~ "'f' para desabilitar ou habilitar as estatísticas do sistema de arquivos" #~ msgid "'h' to hide or show the help message" #~ msgstr "'h' para ocultar ou mostrar a mensagem de ajuda" #~ msgid "'m' to sort the processes list by process size" #~ msgstr "'m' para ordenar a lista de processos pelo tamanho do processo" #~ msgid "'n' to disable or enable the network interfaces stats" #~ msgstr "" #~ "'n' para desabilitar ou habilitar as estatísticas das interfaces de rede" #~ msgid "'q' to exit" #~ msgstr "'q' para sair" #~ msgid "Error: Refresh time should be a positive non-null integer" #~ msgstr "Erro: O tempo de atualização deve ser um número inteiro não-nulo" glances-1.7.3/i18n/zh_CN/000077500000000000000000000000001225327237200147235ustar00rootroot00000000000000glances-1.7.3/i18n/zh_CN/LC_MESSAGES/000077500000000000000000000000001225327237200165105ustar00rootroot00000000000000glances-1.7.3/i18n/zh_CN/LC_MESSAGES/glances.mo000066400000000000000000000126051225327237200204650ustar00rootroot00000000000000B,Y<(,.<J!(.!'+@ P ]~1*8B:'}%%%% 1= 2o H * . "E 0h 0 +   - : W g         ' ? W t    (      S t+: !Fh(  $, ?1J2|@B"3$V${$$,,@D! &&#5Yq! +2B_  +6 Q [ er 92<&(7.,$#? 6)+3B!=:"- @ 4 A;8*5'/1 0%> -C file Path to the configuration file -b Display network rate in Byte per second -d Disable disk I/O module -m Disable mount module -n Disable network module -o output Define additional output (available: HTML or CSV) -s Run Glances in server mode -v Display the version and exit -z Do not use the bold color attribute Limits are set based on the server ones-coreCPUCan not grab data...Compute data...Connected toDelete warning and critical logsDelete warning logsDisconnected fromError: -B flag need an argument (bind IP address)Error: -P flag need an argument (password)Error: -c flag need an argument (server IP address/name)Error: CSV export (-o csv) need output file definition (-f )Error: Cannot init the curses library. Error: Cannot use both -c and -C flagError: Cannot use both -c and -o flagError: Cannot use both -s and -c flagError: Cannot use both -s and -o flagError: Connection to server failed. Bad password.Error: Connection to server failed. Unknown error.Error: HTML export (-o html) need output folder definition (-f )Error: Need CSV library to export into CSVError: Need Jinja2 library to export into HTMLError: PySensors library not foundError: Refresh time should be a positive integerError: Sensors module is only available on LinuxError: The server version is not compatibleError: Unknown output %sError: creating client socketFilesystem %Glances server is running onGlances versionGlobal CPU or per-CPU statsHDD TempHDD Temp °CNetworkPerCPUPress 'h' for helpProcessesProcesses (disabled)Show/hide disk I/O statsShow/hide file system statsShow/hide hddtemp statsShow/hide network statsShow/hide sensors statsSort processes automaticallySort processes by CPU%Sort processes by MEM%Sort processes by nameTemp °CTry to install the python-jinja2 packagerunningsleepingsorted automaticallysorted by °CProject-Id-Version: Glances 1.7 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-08-16 15:15+0200 PO-Revision-Date: 2013-07-28 13:20+0800 Last-Translator: dongweiming Language-Team: Chinese (simplified) Language: zh_CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Plural-Forms: nplurals=2; plural=(n != 1); -C file 配置文件的路径 -b 显示每秒网络速率, 单位字节 -d 禁用硬盘 I/O模块 -m 禁用mount模块 -n 禁用网络模块 -o output 定义额外的输出 (可选: HTML 或者 CSV) -s 使用Glances服务端模式 -v 显示版本然后退出 -z 不使用粗体颜色 基于服务端的限制被设置核CPU使用Can not grab data...计算数据...连接到删除警告和严重级别的日志删除警告日志断开 从错误: -B 需要一个参数 (绑定的IP地址)错误: -P 需要一个参数 (你设置的密码)错误: -c 需要一个参数 (服务器IP地址或者主机名)错误: 导出CSV (-o csv) 需要定义输出的文件 (-f )错误: 不能初始化curses库. 错误: 不能同时使用 -c 和 -C错误: 不能同时使用 -c 和 -o错误: 不能同时使用 -s 和 -c错误: 不能同时使用 -s 和 -o错误: 连接服务端失败. 密码错误.错误: 连接服务端失败. 未知错误.错误: 导出HTML (-o html) 需要定义文件夹 (-f )错误: 导出CSV 需要CSV库错误: 导出HTML需要jinja2库错误: PySensors库没有找到错误: 刷新时间必须是正整数错误: Sensors模块只可用在linux错误: 服务端的版本不兼容错误: 未知输出 %s错误: creating client socket文件系统 %Glances服务器启动了Glances 版本全局CPU或者每个CPU的状态硬盘温度硬盘温度 °C网络每CPU按 'h' 获取帮助进程进程 (禁用)显示/隐藏硬盘I/O状态显示/隐藏文件系统状态显示/隐藏hddtemp状态显示/隐藏network状态显示/隐藏sensors状态自动排序根据CPU使用率排序根据内存占用比排序根据进程名字排序温度 °C尝试安装 python-jinja2运行中休眠中自动排序排序方法: 度glances-1.7.3/i18n/zh_CN/LC_MESSAGES/glances.po000066400000000000000000000401741225327237200204720ustar00rootroot00000000000000# Chinese translations for PACKAGE package. # Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # dongweiming , 2013. # msgid "" msgstr "" "Project-Id-Version: Glances 1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-16 15:15+0200\n" "PO-Revision-Date: 2013-07-28 13:20+0800\n" "Last-Translator: dongweiming \n" "Language-Team: Chinese (simplified)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: glances/glances.py:946 msgid "hddtemp error" msgstr "" #: glances/glances.py:1760 msgid "Error: Cannot init the curses library.\n" msgstr "错误: 不能初始化curses库.\n" #: glances/glances.py:2327 #, python-brace-format msgid "{0} {1} with {2} {3} on {4}" msgstr "" #: glances/glances.py:2332 #, python-brace-format msgid "{0} {1} {2} on {3}" msgstr "" #: glances/glances.py:2378 msgid "PerCPU" msgstr "每CPU" #: glances/glances.py:2384 glances/glances.py:2438 glances/glances.py:2728 #: glances/glances.py:2889 glances/glances.py:3272 msgid "Compute data..." msgstr "计算数据..." #: glances/glances.py:2388 glances/glances.py:2448 msgid "user:" msgstr "" #: glances/glances.py:2390 glances/glances.py:2457 msgid "system:" msgstr "" #: glances/glances.py:2393 glances/glances.py:2485 msgid "iowait:" msgstr "" #: glances/glances.py:2396 glances/glances.py:2464 msgid "idle:" msgstr "" #: glances/glances.py:2432 msgid "CPU" msgstr "CPU使用" #: glances/glances.py:2476 msgid "nice:" msgstr "" #: glances/glances.py:2495 msgid "irq:" msgstr "" #: glances/glances.py:2517 glances/glances.py:3477 msgid "Load" msgstr "" #: glances/glances.py:2521 msgid "-core" msgstr "核" #: glances/glances.py:2525 msgid "1 min:" msgstr "" #: glances/glances.py:2532 msgid "5 min:" msgstr "" #: glances/glances.py:2542 msgid "15 min:" msgstr "" #: glances/glances.py:2568 msgid "Mem" msgstr "" #: glances/glances.py:2578 glances/glances.py:2664 msgid "total:" msgstr "" #: glances/glances.py:2587 glances/glances.py:2674 msgid "used:" msgstr "" #: glances/glances.py:2595 glances/glances.py:2683 msgid "free:" msgstr "" #: glances/glances.py:2608 msgid "active:" msgstr "" #: glances/glances.py:2616 msgid "inactive:" msgstr "" #: glances/glances.py:2626 msgid "buffers:" msgstr "" #: glances/glances.py:2634 msgid "cached:" msgstr "" #: glances/glances.py:2652 msgid "Swap" msgstr "" #: glances/glances.py:2700 msgid "Network" msgstr "网络" #: glances/glances.py:2723 glances/glances.py:2884 msgid "Can not grab data..." msgstr "Can not grab data..." #: glances/glances.py:2811 msgid "Sensors" msgstr "" #: glances/glances.py:2814 glances/glances.py:2847 msgid "°C" msgstr "度" #: glances/glances.py:2844 msgid "HDD Temp" msgstr "硬盘温度" #: glances/glances.py:2873 msgid "Disk I/O" msgstr "" #: glances/glances.py:2877 msgid "In/s" msgstr "" #: glances/glances.py:2879 msgid "Out/s" msgstr "" #: glances/glances.py:2925 msgid "Mount" msgstr "" #: glances/glances.py:2929 msgid "Used" msgstr "" #: glances/glances.py:2931 msgid "Total" msgstr "" #: glances/glances.py:2973 msgid "WARNING|CRITICAL logs" msgstr "" #: glances/glances.py:2975 msgid " (lasts " msgstr "" #: glances/glances.py:2976 msgid " entries)" msgstr "" #: glances/glances.py:2978 msgid " (one entry)" msgstr "" #: glances/glances.py:3078 msgid "Processes (disabled)" msgstr "进程 (禁用)" #: glances/glances.py:3083 msgid "Processes" msgstr "进程" #: glances/glances.py:3094 msgid "running" msgstr "运行中" #: glances/glances.py:3096 msgid "sleeping" msgstr "休眠中" #: glances/glances.py:3098 msgid "other" msgstr "" #: glances/glances.py:3104 msgid "sorted automatically" msgstr "自动排序" #: glances/glances.py:3106 msgid "sorted by " msgstr "排序方法: " #: glances/glances.py:3130 msgid "RUNNING" msgstr "" #: glances/glances.py:3130 msgid "NOT RUNNING" msgstr "" #: glances/glances.py:3144 msgid "Error: " msgstr "" #: glances/glances.py:3146 msgid "Can not execute command" msgstr "" #: glances/glances.py:3204 msgid "VIRT" msgstr "" #: glances/glances.py:3208 msgid "RES" msgstr "" #: glances/glances.py:3212 msgid "CPU%" msgstr "" #: glances/glances.py:3217 msgid "MEM%" msgstr "" #: glances/glances.py:3225 msgid "PID" msgstr "" #: glances/glances.py:3231 msgid "USER" msgstr "" #: glances/glances.py:3237 msgid "NI" msgstr "" #: glances/glances.py:3243 msgid "S" msgstr "" #: glances/glances.py:3249 msgid "TIME+" msgstr "" #: glances/glances.py:3255 msgid "IOR/s" msgstr "" #: glances/glances.py:3260 msgid "IOW/s" msgstr "" #: glances/glances.py:3266 msgid "NAME" msgstr "" #: glances/glances.py:3412 msgid "Connected to" msgstr "连接到" #: glances/glances.py:3415 msgid "Disconnected from" msgstr "断开 从" #: glances/glances.py:3417 msgid "Press 'h' for help" msgstr "按 'h' 获取帮助" #: glances/glances.py:3450 #, python-brace-format msgid "Glances {0} with PsUtil {1}" msgstr "" #: glances/glances.py:3456 #, python-brace-format msgid "Glances {0}" msgstr "" #: glances/glances.py:3463 msgid "OK" msgstr "" #: glances/glances.py:3466 msgid "CAREFUL" msgstr "" #: glances/glances.py:3469 msgid "WARNING" msgstr "" #: glances/glances.py:3472 msgid "CRITICAL" msgstr "" #: glances/glances.py:3476 msgid "CPU user %" msgstr "" #: glances/glances.py:3476 msgid "CPU system %" msgstr "" #: glances/glances.py:3477 msgid "CPU iowait %" msgstr "" #: glances/glances.py:3478 msgid "RAM memory %" msgstr "" #: glances/glances.py:3478 msgid "Swap memory %" msgstr "" #: glances/glances.py:3479 msgid "Temp °C" msgstr "温度 °C" #: glances/glances.py:3479 msgid "HDD Temp °C" msgstr "硬盘温度 °C" #: glances/glances.py:3480 msgid "Filesystem %" msgstr "文件系统 %" #: glances/glances.py:3480 msgid "CPU process %" msgstr "" #: glances/glances.py:3481 msgid "MEM process %" msgstr "" #: glances/glances.py:3536 msgid "a" msgstr "" #: glances/glances.py:3536 msgid "Sort processes automatically" msgstr "自动排序" #: glances/glances.py:3537 msgid "c" msgstr "" #: glances/glances.py:3537 msgid "Sort processes by CPU%" msgstr "根据CPU使用率排序" #: glances/glances.py:3538 msgid "m" msgstr "" #: glances/glances.py:3538 msgid "Sort processes by MEM%" msgstr "根据内存占用比排序" #: glances/glances.py:3539 msgid "p" msgstr "" #: glances/glances.py:3539 msgid "Sort processes by name" msgstr "根据进程名字排序" #: glances/glances.py:3540 msgid "i" msgstr "" #: glances/glances.py:3540 msgid "Sort processes by I/O rate" msgstr "" #: glances/glances.py:3541 msgid "d" msgstr "" #: glances/glances.py:3541 msgid "Show/hide disk I/O stats" msgstr "显示/隐藏硬盘I/O状态" #: glances/glances.py:3542 msgid "f" msgstr "" #: glances/glances.py:3542 msgid "Show/hide file system stats" msgstr "显示/隐藏文件系统状态" #: glances/glances.py:3543 msgid "n" msgstr "" #: glances/glances.py:3543 msgid "Show/hide network stats" msgstr "显示/隐藏network状态" #: glances/glances.py:3544 msgid "s" msgstr "" #: glances/glances.py:3544 msgid "Show/hide sensors stats" msgstr "显示/隐藏sensors状态" #: glances/glances.py:3545 msgid "y" msgstr "" #: glances/glances.py:3545 msgid "Show/hide hddtemp stats" msgstr "显示/隐藏hddtemp状态" #: glances/glances.py:3557 msgid "l" msgstr "" #: glances/glances.py:3557 msgid "Show/hide logs" msgstr "" #: glances/glances.py:3558 msgid "b" msgstr "" #: glances/glances.py:3558 msgid "Bytes or bits for network I/O" msgstr "" #: glances/glances.py:3559 msgid "w" msgstr "" #: glances/glances.py:3559 msgid "Delete warning logs" msgstr "删除警告日志" #: glances/glances.py:3560 msgid "x" msgstr "" #: glances/glances.py:3560 msgid "Delete warning and critical logs" msgstr "删除警告和严重级别的日志" #: glances/glances.py:3561 msgid "1" msgstr "" #: glances/glances.py:3561 msgid "Global CPU or per-CPU stats" msgstr "全局CPU或者每个CPU的状态" #: glances/glances.py:3562 msgid "h" msgstr "" #: glances/glances.py:3562 msgid "Show/hide this help screen" msgstr "" #: glances/glances.py:3563 msgid "t" msgstr "" #: glances/glances.py:3563 msgid "View network I/O as combination" msgstr "" #: glances/glances.py:3564 msgid "u" msgstr "" #: glances/glances.py:3564 msgid "View cumulative network I/O" msgstr "" #: glances/glances.py:3565 msgid "q" msgstr "" #: glances/glances.py:3565 msgid "Quit (Esc and Ctrl-C also work)" msgstr "" #: glances/glances.py:3599 glances/glances.py:3993 msgid "%Y-%m-%d %H:%M:%S" msgstr "" #: glances/glances.py:3877 #, python-format msgid "Couldn't open socket: %s" msgstr "" #: glances/glances.py:4058 msgid "Error: creating client socket" msgstr "错误: creating client socket" #: glances/glances.py:4067 msgid "Error: Connection to server failed. Bad password." msgstr "错误: 连接服务端失败. 密码错误." #: glances/glances.py:4070 msgid "Error: Connection to server failed. Unknown error." msgstr "错误: 连接服务端失败. 未知错误." #: glances/glances.py:4104 msgid "Glances version" msgstr "Glances 版本" #: glances/glances.py:4104 msgid " with PsUtil " msgstr "" #: glances/glances.py:4109 msgid "Usage: glances [options]" msgstr "" #: glances/glances.py:4110 msgid "" "\n" "Options:" msgstr "" #: glances/glances.py:4111 msgid "\t-b\t\tDisplay network rate in Byte per second" msgstr "\t-b\t\t显示每秒网络速率, 单位字节" #: glances/glances.py:4112 msgid "\t-B @IP|host\tBind server to the given IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4113 msgid "" "\t-c @IP|host\tConnect to a Glances server by IPv4/IPv6 address or hostname" msgstr "" #: glances/glances.py:4114 msgid "\t-C file\t\tPath to the configuration file" msgstr "\t-C file\t\t配置文件的路径" #: glances/glances.py:4115 msgid "\t-d\t\tDisable disk I/O module" msgstr "\t-d\t\t禁用硬盘 I/O模块" #: glances/glances.py:4116 msgid "\t-e\t\tEnable sensors module" msgstr "" #: glances/glances.py:4117 msgid "\t-f file\t\tSet the HTML output folder or CSV file" msgstr "" #: glances/glances.py:4118 msgid "\t-h\t\tDisplay the help and exit" msgstr "" #: glances/glances.py:4119 msgid "\t-m\t\tDisable mount module" msgstr "\t-m\t\t禁用mount模块" #: glances/glances.py:4120 msgid "\t-n\t\tDisable network module" msgstr "\t-n\t\t禁用网络模块" #: glances/glances.py:4121 msgid "\t-o output\tDefine additional output (available: HTML or CSV)" msgstr "\t-o output\t定义额外的输出 (可选: HTML 或者 CSV)" #: glances/glances.py:4122 #, python-format msgid "\t-p PORT\t\tDefine the client/server TCP port (default: %d)" msgstr "" #: glances/glances.py:4124 msgid "\t-P password\tDefine a client/server password" msgstr "" #: glances/glances.py:4125 msgid "\t-r\t\tDisable process list" msgstr "" #: glances/glances.py:4126 msgid "\t-s\t\tRun Glances in server mode" msgstr "\t-s\t\t使用Glances服务端模式" #: glances/glances.py:4127 #, python-format msgid "\t-t seconds\tSet refresh time in seconds (default: %d sec)" msgstr "" #: glances/glances.py:4129 msgid "\t-v\t\tDisplay the version and exit" msgstr "\t-v\t\t显示版本然后退出" #: glances/glances.py:4130 msgid "\t-y\t\tEnable hddtemp module" msgstr "" #: glances/glances.py:4131 msgid "\t-z\t\tDo not use the bold color attribute" msgstr "\t-z\t\t不使用粗体颜色" #: glances/glances.py:4132 msgid "\t-1\t\tStart Glances in per CPU mode" msgstr "" #: glances/glances.py:4236 msgid "Error: -P flag need an argument (password)" msgstr "错误: -P 需要一个参数 (你设置的密码)" #: glances/glances.py:4243 msgid "Error: -B flag need an argument (bind IP address)" msgstr "错误: -B 需要一个参数 (绑定的IP地址)" #: glances/glances.py:4251 msgid "Error: -c flag need an argument (server IP address/name)" msgstr "错误: -c 需要一个参数 (服务器IP地址或者主机名)" #: glances/glances.py:4262 #, python-format msgid "Error: Unknown output %s" msgstr "错误: 未知输出 %s" #: glances/glances.py:4268 msgid "Error: PySensors library not found" msgstr "错误: PySensors库没有找到" #: glances/glances.py:4273 msgid "Error: Sensors module is only available on Linux" msgstr "错误: Sensors模块只可用在linux" #: glances/glances.py:4283 msgid "Error: Refresh time should be a positive integer" msgstr "错误: 刷新时间必须是正整数" #: glances/glances.py:4309 msgid "Error: Cannot use both -s and -c flag" msgstr "错误: 不能同时使用 -s 和 -c" #: glances/glances.py:4312 msgid "Error: Cannot use both -s and -o flag" msgstr "错误: 不能同时使用 -s 和 -o" #: glances/glances.py:4317 msgid "Error: Cannot use both -c and -o flag" msgstr "错误: 不能同时使用 -c 和 -o" #: glances/glances.py:4320 msgid "Error: Cannot use both -c and -C flag" msgstr "错误: 不能同时使用 -c 和 -C" #: glances/glances.py:4321 msgid " Limits are set based on the server ones" msgstr " 基于服务端的限制被设置" #: glances/glances.py:4326 msgid "Error: Need Jinja2 library to export into HTML" msgstr "错误: 导出HTML需要jinja2库" #: glances/glances.py:4327 msgid "Try to install the python-jinja2 package" msgstr "尝试安装 python-jinja2" #: glances/glances.py:4332 msgid "" "Error: HTML export (-o html) need output folder definition (-f )" msgstr "错误: 导出HTML (-o html) 需要定义文件夹 (-f )" #: glances/glances.py:4338 msgid "Error: Need CSV library to export into CSV" msgstr "错误: 导出CSV 需要CSV库" #: glances/glances.py:4343 msgid "Error: CSV export (-o csv) need output file definition (-f )" msgstr "错误: 导出CSV (-o csv) 需要定义输出的文件 (-f )" #: glances/glances.py:4370 msgid "Glances server is running on" msgstr "Glances服务器启动了" #: glances/glances.py:4392 msgid "Error: The server version is not compatible" msgstr "错误: 服务端的版本不兼容" #~ msgid "Curses module not found. Glances cannot start." #~ msgstr "Curses 模块没有找到. Glances 不能开始." #~ msgid "PsUtil module not found. Glances cannot start." #~ msgstr "PsUtil 模块没有找到. Glances 不能开始." #~ msgid "PsUtil version %s detected." #~ msgstr "PsUtil 版本 %s 被检测到." #~ msgid "PsUtil 0.4.1 or higher is needed. Glances cannot start." #~ msgstr "需要0.4.1或者更高版本的PsUtil. Glances 不能开始." #~ msgid "Sort processes by IO rate" #~ msgstr "根据IO速率排序" #~ msgid "Show/hide log messages" #~ msgstr "显示/隐藏日志消息" #~ msgid "Show/hide this help message" #~ msgstr "显示/隐藏帮助信息" #~ msgid "View network IO as combination" #~ msgstr "查看网络IO组合 (进/出)" #~ msgid "View cumulative network IO" #~ msgstr "查看累积的网络IO信息" #~ msgid "Error: Connection to server failed. Can not get the server version." #~ msgstr "错误: 连接服务端失败. 无法获取服务端版本." #~ msgid "Usage: glances [opt]" #~ msgstr "用法: glances [opt]" #~ msgid " with opt:" #~ msgstr " 可供选项:" #~ msgid "\t-B @IP|host\tBind server to the given IP or host NAME" #~ msgstr "\t-B @IP|host\t通过IP或者主机名绑定服务端" #~ msgid "\t-c @IP|host\tConnect to a Glances server" #~ msgstr "\t-c @IP|host\t连接到Glances服务端" #~ msgid "\t-e\t\tEnable the sensors module (Linux-only)" #~ msgstr "\t-e\t\t启用sensors模块 (只可用于linux)" #~ msgid "\t-f file\t\tSet the output folder (HTML) or file (CSV)" #~ msgstr "\t-f file\t\t设置输出的目录 (HTML) 或者文件 (CSV)" #~ msgid "\t-h\t\tDisplay the syntax and exit" #~ msgstr "\t-h\t\t显示语法然后退出" #~ msgid "\t-p PORT\t\tDefine the client or server TCP port (default: %d)" #~ msgstr "\t-p PORT\t\t 定义客户端/服务端的tcp端口(默认: %d)" #~ msgid "\t-P password\tClient/server password" #~ msgstr "\t-P password\t客户端/服务端密码" #~ msgid "\t-r\t\tDo not list processes (significant CPU use reduction)" #~ msgstr "\t-r\t\t不显示处理器 (significant CPU use reduction)" #~ msgid "\t-t sec\t\tSet the refresh time in seconds (default: %d)" #~ msgstr "\t-t sec\t\t设置刷新时间,单位秒 (默认: %d)" #~ msgid "\t-y\t\tEnable the hddtemp module (needs running hddtemp daemon)" #~ msgstr "\t-y\t\t启动硬盘温度模块 (需要启动hddtemp的守护进程)" glances-1.7.3/man/000077500000000000000000000000001225327237200137165ustar00rootroot00000000000000glances-1.7.3/man/glances.1000066400000000000000000000063111225327237200154150ustar00rootroot00000000000000.TH glances 1 "December, 2013" "version 1.7.3" "USER COMMANDS" .SH NAME glances \- A cross-platform curses-based monitoring tool .SH SYNOPSIS .B glances [\-bdehmnrsvyz1] [\-B bind] [\-c server] [\-C conffile] [\-f file] [\-o output] [\-p port] [\-P password] [\-t refresh] .SH DESCRIPTION Glances is a free (LGPL) cross-platform curses-based monitoring tool which aims to present a maximum of information in a minimum of space, ideally to fit in a classical 80x24 terminal or higher to have additionnal information. .PP Glances can adapt dynamically the displayed information depending on the terminal size. It can also work in a client/server mode for remote monitoring. .PP This tool is written in Python and uses the psutil library to fetch the statistical values from key elements, like CPU, load average, memory, network, disks, file systems, processes, etc. .SH COMMAND-LINE OPTIONS The command-line options are the following: .TP .B \-b Display network rate in Byte per second (default: bit per second) .TP .B \-B @IP|HOST Bind server to the given IPv4/IPv6 address or hostname .TP .B \-c @IP|HOST Connect to a Glances server by IPv4/IPv6 address or hostname .TP .B \-C FILE Path to the configuration file .TP .B \-d Disable disk I/O module .TP .B \-e Enable sensors module (requires pysensors, Linux-only) .TP .B \-f FILE Set the HTML output folder or CSV file .TP .B \-h Display the help and exit .TP .B \-m Disable mount module .TP .B \-n Disable network module .TP .B \-o OUTPUT Define additional output (available: HTML or CSV) .TP .B \-p PORT Define the client/server TCP port (default: 61209) .TP .B \-P PASSWORD Define a client/server password .TP .B\---password Define a client/server password from the prompt .TP .B \-r Disable process list (for low CPU consumption) .TP .B \-s Run Glances in server mode .TP .B \-t SECONDS Set refresh time in seconds (default: 3 sec) .TP .B \-v Display the version and exit .TP .B \-y Enable hddtemp module (requires hddtemp) .TP .B \-z Do not use the bold color attribute .TP .B \-1 Start Glances in per-CPU mode .SH INTERACTIVE COMMANDS You can use the following keys while in Glances: .TP .B a Sort process list automatically .TP .B b Switch between bit/s or Byte/s for network I/O .TP .B c Sort processes by CPU usage .TP .B d Show/hide disk I/O stats .TP .B f Show/hide file system stats .TP .B h Show/hide the help screen .TP .B i Sort processes by I/O rate .TP .B l Show/hide log messages .TP .B m Sort processes by MEM usage .TP .B n Show/hide network stats .TP .B p Sort processes by name .TP .B q Quit .TP .B s Show/hide sensors stats (only available with -e flag) .TP .B t View network I/O as combination .TP .B u View cumulative network I/O .TP .B w Delete finished warning log messages .TP .B x Delete finished warning and critical log messages .TP .B y Show/hide hddtemp stats (only available with -y flag) .TP .B 1 Switch between global CPU and per-CPU stats .SH EXAMPLES .TP Refresh information every 5 seconds: .B glances \-t 5 .PP .SH EXIT STATUS Glances returns a zero exit status if it succeeds to print/grab information. .PP It returns 2 if it fails to parse its options (missing arguments, invalid value, etc). .SH AUTHOR Glances is written by Nicolas Hennion aka Nicolargo (contact@nicolargo.com) glances-1.7.3/requirements.txt000066400000000000000000000000161225327237200164240ustar00rootroot00000000000000psutil==1.2.1 glances-1.7.3/setup.py000077500000000000000000000047651225327237200146740ustar00rootroot00000000000000#!/usr/bin/env python import os import sys import glob from setuptools import setup data_files = [ ('share/doc/glances', ['AUTHORS', 'COPYING', 'NEWS', 'README.rst', 'conf/glances.conf', 'docs/glances-doc.html']), ('share/doc/glances/images', glob.glob('docs/images/*.png')), ('share/man/man1', ['man/glances.1']) ] if hasattr(sys, 'real_prefix') or 'bsd' in sys.platform: conf_path = os.path.join(sys.prefix, 'etc', 'glances') elif not hasattr(sys, 'real_prefix') and 'linux' in sys.platform: conf_path = os.path.join('/etc', 'glances') elif 'darwin' in sys.platform: conf_path = os.path.join('/usr/local', 'etc', 'glances') elif 'win32' in sys.platform: conf_path = os.path.join(os.environ.get('APPDATA'), 'glances') data_files.append((conf_path, ['conf/glances.conf'])) for mo in glob.glob('i18n/*/LC_MESSAGES/*.mo'): data_files.append((os.path.dirname(mo).replace('i18n/', 'share/locale/'), [mo])) if sys.platform.startswith('win'): requires = ['psutil>=0.5.1', 'colorconsole==0.6'] else: requires = ['psutil>=0.5.1'] setup( name='Glances', version='1.7.3', description="A cross-platform curses-based monitoring tool", long_description=open('README.rst').read(), author='Nicolas Hennion', author_email='nicolas@nicolargo.com', url='https://github.com/nicolargo/glances', # download_url='https://s3.amazonaws.com/glances/glances-1.7.3.tar.gz', license="LGPL", keywords="cli curses monitoring system", install_requires=requires, extras_require={ 'HTML': ['jinja2'], 'SENSORS': ['pysensors'], 'BATINFO': ['batinfo'] }, packages=['glances'], include_package_data=True, data_files=data_files, test_suite="glances.tests", entry_points={"console_scripts": ["glances=glances.glances:main"]}, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console :: Curses', 'Intended Audience :: Developers', 'Intended Audience :: End Users/Desktop', 'Intended Audience :: System Administrators', 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', 'Operating System :: OS Independent', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3' ] ) glances-1.7.3/uninstall.sh000077500000000000000000000006151225327237200155150ustar00rootroot00000000000000#!/bin/sh if [ $(id -u) -ne 0 ]; then echo -e "* ERROR: User $(whoami) is not root, and does not have sudo privileges" exit 1 fi if [ ! -f "setup.py" ]; then echo -e "* ERROR: Setup file doesn't exist" exit 1 fi python setup.py install --record install.record for i in $(cat install.record); do rm $i done echo -e "\n\n* SUCCESS: Uninstall complete." rm install.record

Powered by Glances